From a2b32234533820b8b1792ace39bec92acc7de248 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 15 Feb 2002 16:43:23 +0400 Subject: post-commit: Move to 4.1 README: It is just test, ignore. My first attempt to push into bk README: It is just test, ignore. My first attempt to push into bk BitKeeper/triggers/post-commit: Move to 4.1 BitKeeper/etc/logging_ok: Logging to logging@openlogging.org accepted --- BitKeeper/etc/logging_ok | 1 + BitKeeper/triggers/post-commit | 14 +++++++------- README | 1 + 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index 75f06d03cb1..67c269fed25 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -43,3 +43,4 @@ tonu@volk.internalnet tonu@x153.internalnet tonu@x3.internalnet venu@work.mysql.com +bar@gw.udmsearch.izhnet.ru diff --git a/BitKeeper/triggers/post-commit b/BitKeeper/triggers/post-commit index 275c278f29d..bde60e84b3d 100755 --- a/BitKeeper/triggers/post-commit +++ b/BitKeeper/triggers/post-commit @@ -25,10 +25,10 @@ then echo "Commit successful, notifying developers at $TO" ( cat < +List-ID: From: $FROM To: $TO -Subject: bk commit - 4.0 tree +Subject: bk commit - 4.1 tree EOF bk changes -v -r+ @@ -41,13 +41,13 @@ EOF echo "Notifying internals list at $INTERNALS" ( cat < +List-ID: From: $FROM To: $INTERNALS -Subject: bk commit into 4.0 tree +Subject: bk commit into 4.1 tree Below is the list of changes that have just been committed into a -4.0 repository of $USER. When $USER does a push, they will be propogated to +4.1 repository of $USER. When $USER does a push, they will be propogated to the main repository and within 24 hours after the push to the public repository. For information on how to access the public repository see http://www.mysql.com/doc/I/n/Installing_source_tree.html @@ -66,10 +66,10 @@ EOF echo "Notifying docs list at $DOCS" ( cat < +List-ID: From: $FROM To: $DOCS -Subject: bk commit - 4.0 tree (Manual) +Subject: bk commit - 4.1 tree (Manual) EOF bk changes -v -r+ diff --git a/README b/README index b1f4ab52369..0c536de2ed5 100644 --- a/README +++ b/README @@ -52,3 +52,4 @@ work for me. Why?' is not consider a valid bug report. The mysqlbug script can be found in the 'scripts' directory in the distribution, that is 'there-you-installed-mysql/scripts'. + -- cgit v1.2.1 From e07c92cd95e7a1613d28a6f1cc0926fc451d184e Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 19 Feb 2002 15:32:11 +0200 Subject: small bug fix for 2.95.4 --- sql/sql_yacc.yy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 91cf0ae5fc9..742c39ce901 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -776,7 +776,7 @@ opt_table_options: table_options: table_option { $$=$1; } - | table_option table_options { $$= $1 | $2 } + | table_option table_options { $$= $1 | $2; } table_option: TEMPORARY { $$=HA_LEX_CREATE_TMP_TABLE; } -- cgit v1.2.1 From b87d6ee9d730fb2df74a3981b552b0da2e09570c Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 19 Feb 2002 20:27:03 +0400 Subject: RTREE related fixes include/myisam.h: These two new fields are initialized to either rtree or btree routines --- include/myisam.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/myisam.h b/include/myisam.h index 35953496a47..5325f06ec71 100644 --- a/include/myisam.h +++ b/include/myisam.h @@ -147,6 +147,8 @@ typedef struct st_mi_keydef /* Key definition with open & info */ struct st_mi_s_param *s_temp); void (*store_key)(struct st_mi_keydef *keyinfo, uchar *key_pos, struct st_mi_s_param *s_temp); + int (*ck_insert)(struct st_myisam_info *inf, uint k_nr, uchar *k, uint klen); + int (*ck_delete)(struct st_myisam_info *inf, uint k_nr, uchar *k, uint klen); } MI_KEYDEF; -- cgit v1.2.1 From 3d5dc65dfd72083ed159220d03bea942094e8662 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 20 Feb 2002 14:11:21 +0400 Subject: This ChangeSet adds RTREE support into myisam library. RTREEs will be used for GIS extension in MySQL myisam/.cvsignore: Added sp_test and rt_test myisam/Makefile.am: Added RTREE files myisam/mi_create.c: Added RTREE/SPATIAL initialization myisam/mi_delete.c: Switched to use virual function, instead of mi_ck_delete() direct call myisam/mi_key.c: Added sp_make_key() call in the case of SPATIAL index type myisam/mi_open.c: Added some new initialization actions which depend on key_alg being used: RTREE or BTREE myisam/mi_range.c: Rtree estimation myisam/mi_rkey.c: rtree myisam/mi_rnext.c: rtree myisam/mi_rnext_same.c: rtree myisam/mi_static.c: New search flags for bounding rectungles myisam/mi_test1.c: one now should always specify key_alg during keyinfo initializing: BTREE or RTREE myisam/mi_test2.c: Added key_alg initializing myisam/mi_test3.c: Added key_alg initialization myisam/mi_update.c: Switched to virtual functions, instead of mi_ck_delete/mi_ck_write direct call myisam/mi_write.c: Virtual function instead of mi_ck_write() direct call myisam/myisamdef.h: Rtree additions --- myisam/.cvsignore | 2 + myisam/Makefile.am | 11 +- myisam/mi_create.c | 55 ++- myisam/mi_delete.c | 8 +- myisam/mi_key.c | 9 + myisam/mi_open.c | 35 +- myisam/mi_range.c | 36 +- myisam/mi_rkey.c | 36 +- myisam/mi_rnext.c | 58 +++- myisam/mi_rnext_same.c | 42 ++- myisam/mi_static.c | 3 +- myisam/mi_test1.c | 1 + myisam/mi_test2.c | 6 + myisam/mi_test3.c | 2 + myisam/mi_update.c | 7 +- myisam/mi_write.c | 20 +- myisam/myisamdef.h | 3 + myisam/rt_index.c | 914 +++++++++++++++++++++++++++++++++++++++++++++++++ myisam/rt_index.h | 44 +++ myisam/rt_key.c | 154 +++++++++ myisam/rt_key.h | 31 ++ myisam/rt_mbr.c | 758 ++++++++++++++++++++++++++++++++++++++++ myisam/rt_mbr.h | 33 ++ myisam/rt_split.c | 343 +++++++++++++++++++ myisam/rt_test.c | 417 ++++++++++++++++++++++ myisam/sp_defs.h | 45 +++ myisam/sp_key.c | 256 ++++++++++++++ myisam/sp_test.c | 565 ++++++++++++++++++++++++++++++ 28 files changed, 3819 insertions(+), 75 deletions(-) create mode 100644 myisam/rt_index.c create mode 100644 myisam/rt_index.h create mode 100644 myisam/rt_key.c create mode 100644 myisam/rt_key.h create mode 100644 myisam/rt_mbr.c create mode 100644 myisam/rt_mbr.h create mode 100644 myisam/rt_split.c create mode 100644 myisam/rt_test.c create mode 100644 myisam/sp_defs.h create mode 100644 myisam/sp_key.c create mode 100644 myisam/sp_test.c diff --git a/myisam/.cvsignore b/myisam/.cvsignore index d9adcedd308..ef6d92c6e18 100644 --- a/myisam/.cvsignore +++ b/myisam/.cvsignore @@ -7,6 +7,8 @@ ft_test1 mi_test1 mi_test2 mi_test3 +rt_test +sp_test myisamchk myisamlog myisampack diff --git a/myisam/Makefile.am b/myisam/Makefile.am index 6802bcb115f..ee13d0b1fad 100644 --- a/myisam/Makefile.am +++ b/myisam/Makefile.am @@ -25,14 +25,16 @@ bin_PROGRAMS = myisamchk myisamlog myisampack myisamchk_DEPENDENCIES= $(LIBRARIES) myisamlog_DEPENDENCIES= $(LIBRARIES) myisampack_DEPENDENCIES=$(LIBRARIES) -noinst_PROGRAMS = mi_test1 mi_test2 mi_test3 ft_dump #ft_test1 ft_eval -noinst_HEADERS = myisamdef.h fulltext.h ftdefs.h ft_test1.h ft_eval.h +noinst_PROGRAMS = mi_test1 mi_test2 mi_test3 rt_test sp_test ft_dump #ft_test1 ft_eval +noinst_HEADERS = myisamdef.h rt_index.h rt_key.h rt_mbr.h sp_defs.h fulltext.h ftdefs.h ft_test1.h ft_eval.h mi_test1_DEPENDENCIES= $(LIBRARIES) mi_test2_DEPENDENCIES= $(LIBRARIES) mi_test3_DEPENDENCIES= $(LIBRARIES) #ft_test1_DEPENDENCIES= $(LIBRARIES) #ft_eval_DEPENDENCIES= $(LIBRARIES) ft_dump_DEPENDENCIES= $(LIBRARIES) +rt_test_DEPENDENCIES= $(LIBRARIES) +sp_test_DEPENDENCIES= $(LIBRARIES) libmyisam_a_SOURCES = mi_open.c mi_extra.c mi_info.c mi_rkey.c \ mi_rnext.c mi_rnext_same.c \ mi_search.c mi_page.c mi_key.c mi_locking.c \ @@ -46,8 +48,9 @@ libmyisam_a_SOURCES = mi_open.c mi_extra.c mi_info.c mi_rkey.c \ mi_changed.c mi_static.c mi_delete_all.c \ mi_delete_table.c mi_rename.c mi_check.c \ ft_parser.c ft_stopwords.c ft_static.c \ - ft_update.c ft_boolean_search.c ft_nlq_search.c sort.c -CLEANFILES = test?.MY? FT?.MY? isam.log mi_test_all + ft_update.c ft_boolean_search.c ft_nlq_search.c sort.c \ + rt_index.c rt_key.c rt_mbr.c rt_split.c sp_key.c +CLEANFILES = test?.MY? FT?.MY? isam.log mi_test_all rt_test.MY? sp_test.MY? DEFS = -DMAP_TO_USE_RAID # Omit dependency for ../mit-pthreads/include/sys that only exits if # mit-pthreads are used diff --git a/myisam/mi_create.c b/myisam/mi_create.c index 91c2c64c3cf..8f4a44a52a4 100644 --- a/myisam/mi_create.c +++ b/myisam/mi_create.c @@ -17,6 +17,8 @@ /* Create a MyISAM table */ #include "fulltext.h" +#include "sp_defs.h" + #if defined(MSDOS) || defined(__WIN__) #ifdef __WIN__ #include @@ -233,11 +235,42 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs, for (i=0, keydef=keydefs ; i < keys ; i++ , keydef++) { - share.state.key_root[i]= HA_OFFSET_ERROR; + share.state.key_root[i]= HA_OFFSET_ERROR; min_key_length_skipp=length=0; key_length=pointer; + if (keydef->flag & HA_SPATIAL) + { + /* BAR TODO to support 3D and more dimensions in the future */ + uint sp_segs=SPDIMS*2; + keydef->flag=HA_SPATIAL; + if (flags & HA_DONT_TOUCH_DATA) + { + /* + called by myisamchk - i.e. table structure was taken from + MYI file and SPATIAL key *do has* additional sp_segs keysegs. + We'd better delete them now + */ + keydef->keysegs-=sp_segs; + } + + for (j=0, keyseg=keydef->seg ; (int) j < keydef->keysegs ; + j++, keyseg++) + { + if (keyseg->type != HA_KEYTYPE_BINARY && + keyseg->type != HA_KEYTYPE_VARBINARY) + { + my_errno=HA_WRONG_CREATE_OPTION; + goto err; + } + } + keydef->keysegs+=sp_segs; + key_length+=SPLEN*sp_segs; + length++; /* At least one length byte */ + min_key_length_skipp+=SPLEN*2*SPDIMS; + } + else if (keydef->flag & HA_FULLTEXT) /* SerG */ { keydef->flag=HA_FULLTEXT | HA_PACK_KEY | HA_VAR_LENGTH_KEY; @@ -554,12 +587,13 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs, for (i=0 ; i < share.base.keys - uniques; i++) { uint ft_segs=(keydefs[i].flag & HA_FULLTEXT) ? FT_SEGS : 0; + uint sp_segs=(keydefs[i].flag & HA_SPATIAL) ? 2*SPDIMS : 0; if (mi_keydef_write(file, &keydefs[i])) goto err; - for (j=0 ; j < keydefs[i].keysegs-ft_segs ; j++) + for (j=0 ; j < keydefs[i].keysegs-ft_segs-sp_segs ; j++) if (mi_keyseg_write(file, &keydefs[i].seg[j])) - goto err; + goto err; for (j=0 ; j < ft_segs ; j++) { MI_KEYSEG seg=ft_keysegs[j]; @@ -567,6 +601,21 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs, if (mi_keyseg_write(file, &seg)) goto err; } + for (j=0 ; j < sp_segs ; j++) + { + MI_KEYSEG sseg; + sseg.type=SPTYPE; + sseg.language= 7; + sseg.null_bit=0; + sseg.bit_start=0; + sseg.bit_end=0; + sseg.length=SPLEN; + sseg.null_pos=0; + sseg.start=j*SPLEN; + sseg.flag= HA_SWAP_KEY; + if (mi_keyseg_write(file, &sseg)) + goto err; + } } /* Create extra keys for unique definitions */ offset=reclength-uniques*MI_UNIQUE_HASH_LENGTH; diff --git a/myisam/mi_delete.c b/myisam/mi_delete.c index 6f94e3c4256..ff723303228 100644 --- a/myisam/mi_delete.c +++ b/myisam/mi_delete.c @@ -17,6 +17,8 @@ /* Remove a row from a MyISAM table */ #include "fulltext.h" +#include "rt_index.h" + #ifdef __WIN__ #include #endif @@ -79,9 +81,9 @@ int mi_delete(MI_INFO *info,const byte *record) } else { - uint key_length=_mi_make_key(info,i,old_key,record,info->lastpos); - if (_mi_ck_delete(info,i,old_key,key_length)) - goto err; + if (info->s->keyinfo[i].ck_delete(info,i,old_key, + _mi_make_key(info,i,old_key,record,info->lastpos))) + goto err; } } } diff --git a/myisam/mi_key.c b/myisam/mi_key.c index 6ec8668ab61..055b18284de 100644 --- a/myisam/mi_key.c +++ b/myisam/mi_key.c @@ -18,6 +18,7 @@ #include "myisamdef.h" #include "m_ctype.h" +#include "sp_defs.h" #ifdef HAVE_IEEEFP_H #include #endif @@ -39,6 +40,14 @@ uint _mi_make_key(register MI_INFO *info, uint keynr, uchar *key, reg1 MI_KEYSEG *keyseg; DBUG_ENTER("_mi_make_key"); + if(info->s->keyinfo[keynr].flag & HA_SPATIAL) + { + /* + TODO: nulls processing + */ + return sp_make_key(info,keynr,key,record,filepos); + } + start=key; for (keyseg=info->s->keyinfo[keynr].seg ; keyseg->type ;keyseg++) { diff --git a/myisam/mi_open.c b/myisam/mi_open.c index bcf8369b439..3dc6c9bf61f 100644 --- a/myisam/mi_open.c +++ b/myisam/mi_open.c @@ -17,6 +17,8 @@ /* open a isam-database */ #include "fulltext.h" +#include "sp_defs.h" +#include "rt_index.h" #include #if defined(MSDOS) || defined(__WIN__) @@ -65,7 +67,7 @@ static MI_INFO *test_if_reopen(char *filename) MI_INFO *mi_open(const char *name, int mode, uint open_flags) { - int lock_error,kfile,open_mode,save_errno; + int lock_error,kfile,open_mode,save_errno,have_rtree=0; uint i,j,len,errpos,head_length,base_pos,offset,info_length,extra,keys, key_parts,unique_key_parts,tmp_length,uniques; char name_buff[FN_REFLEN], org_name [FN_REFLEN], index_name[FN_REFLEN], @@ -293,6 +295,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags) for (j=0 ; j < share->keyinfo[i].keysegs; j++,pos++) { disk_pos=mi_keyseg_read(disk_pos, pos); + if (pos->type == HA_KEYTYPE_TEXT || pos->type == HA_KEYTYPE_VARTEXT) { if (!pos->language) @@ -304,7 +307,12 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags) } } } - if (share->keyinfo[i].flag & HA_FULLTEXT) + if (share->keyinfo[i].flag & HA_SPATIAL) + { + uint sp_segs=SPDIMS*2; + share->keyinfo[i].seg=pos-sp_segs; + share->keyinfo[i].keysegs--; + } else if (share->keyinfo[i].flag & HA_FULLTEXT) { share->keyinfo[i].seg=pos-FT_SEGS; share->fulltext_index=1; @@ -342,7 +350,11 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags) } } for (i=0 ; i < keys ; i++) + { + if (share->keyinfo[i].key_alg == HA_KEY_ALG_RTREE) + have_rtree=1; setup_key_functions(share->keyinfo+i); + } for (i=j=offset=0 ; i < share->base.fields ; i++) { @@ -421,7 +433,8 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags) ((share->options & (HA_OPTION_READ_ONLY_DATA | HA_OPTION_TMP_TABLE | HA_OPTION_COMPRESS_RECORD | HA_OPTION_TEMP_COMPRESS_RECORD)) || - (open_flags & HA_OPEN_TMP_TABLE)) ? 0 : 1; + (open_flags & HA_OPEN_TMP_TABLE) || + have_rtree) ? 0 : 1; if (share->concurrent_insert) { share->lock.get_status=mi_get_status; @@ -451,6 +464,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags) &info.blobs,sizeof(MI_BLOB)*share->base.blobs, &info.buff,(share->base.max_key_block_length*2+ share->base.max_key_length), + &info.rtree_recursion_state,have_rtree ? 1024 : 0, &info.lastkey,share->base.max_key_length*3+1, &info.filename,strlen(org_name)+1, NullS)) @@ -631,6 +645,16 @@ void mi_setup_functions(register MYISAM_SHARE *share) static void setup_key_functions(register MI_KEYDEF *keyinfo) { + if (keyinfo->key_alg == HA_KEY_ALG_RTREE) + { + keyinfo->ck_insert = rtree_insert; + keyinfo->ck_delete = rtree_delete; + } + else + { + keyinfo->ck_insert = _mi_ck_write; + keyinfo->ck_delete = _mi_ck_delete; + } if (keyinfo->flag & HA_BINARY_PACK_KEY) { /* Simple prefix compression */ keyinfo->bin_search=_mi_seq_search; @@ -896,7 +920,7 @@ uint mi_keydef_write(File file, MI_KEYDEF *keydef) uchar *ptr=buff; *ptr++ = (uchar) keydef->keysegs; - *ptr++ = 0; /* not used */ + *ptr++ = keydef->key_alg; /* +BAR Rtree or Btree */ mi_int2store(ptr,keydef->flag); ptr +=2; mi_int2store(ptr,keydef->block_length); ptr +=2; mi_int2store(ptr,keydef->keylength); ptr +=2; @@ -908,7 +932,8 @@ uint mi_keydef_write(File file, MI_KEYDEF *keydef) char *mi_keydef_read(char *ptr, MI_KEYDEF *keydef) { keydef->keysegs = (uint) *ptr++; - ptr++; + keydef->key_alg = *ptr++; /* +BAR Rtree or Btree */ + keydef->flag = mi_uint2korr(ptr); ptr +=2; keydef->block_length = mi_uint2korr(ptr); ptr +=2; keydef->keylength = mi_uint2korr(ptr); ptr +=2; diff --git a/myisam/mi_range.c b/myisam/mi_range.c index 70694bf4620..4b98b48199a 100644 --- a/myisam/mi_range.c +++ b/myisam/mi_range.c @@ -20,6 +20,7 @@ */ #include "myisamdef.h" +#include "rt_index.h" static ha_rows _mi_record_pos(MI_INFO *info,const byte *key,uint key_len, enum ha_rkey_function search_flag); @@ -39,7 +40,7 @@ ha_rows mi_records_in_range(MI_INFO *info, int inx, const byte *start_key, const byte *end_key, uint end_key_len, enum ha_rkey_function end_search_flag) { - ha_rows start_pos,end_pos; + ha_rows start_pos,end_pos,res; DBUG_ENTER("mi_records_in_range"); if ((inx = _mi_check_index(info,inx)) < 0) @@ -50,20 +51,39 @@ ha_rows mi_records_in_range(MI_INFO *info, int inx, const byte *start_key, info->update&= (HA_STATE_CHANGED+HA_STATE_ROW_CHANGED); if (info->s->concurrent_insert) rw_rdlock(&info->s->key_root_lock[inx]); - start_pos= (start_key ? + + switch(info->s->keyinfo[inx].key_alg){ + case HA_KEY_ALG_RTREE: + { + uchar * key_buff; + if (start_key_len == 0) + start_key_len=USE_WHOLE_KEY; + key_buff=info->lastkey+info->s->base.max_key_length; + start_key_len=_mi_pack_key(info,inx,key_buff,(uchar*) start_key,start_key_len); + res=rtree_estimate(info, inx, key_buff, start_key_len, myisam_read_vec[start_search_flag]); + res=res?res:1; + break; + } + case HA_KEY_ALG_BTREE: + default: + start_pos= (start_key ? _mi_record_pos(info,start_key,start_key_len,start_search_flag) : (ha_rows) 0); - end_pos= (end_key ? + end_pos= (end_key ? _mi_record_pos(info,end_key,end_key_len,end_search_flag) : info->state->records+ (ha_rows) 1); + res=end_pos < start_pos ? (ha_rows) 0 : + (end_pos == start_pos ? (ha_rows) 1 : end_pos-start_pos); + if (start_pos == HA_POS_ERROR || end_pos == HA_POS_ERROR) + res=HA_POS_ERROR; + } + if (info->s->concurrent_insert) rw_unlock(&info->s->key_root_lock[inx]); fast_mi_writeinfo(info); - if (start_pos == HA_POS_ERROR || end_pos == HA_POS_ERROR) - DBUG_RETURN(HA_POS_ERROR); - DBUG_PRINT("info",("records: %ld",(ulong) (end_pos-start_pos))); - DBUG_RETURN(end_pos < start_pos ? (ha_rows) 0 : - (end_pos == start_pos ? (ha_rows) 1 : end_pos-start_pos)); + + DBUG_PRINT("info",("records: %ld",(ulong) (res))); + DBUG_RETURN(res); } diff --git a/myisam/mi_rkey.c b/myisam/mi_rkey.c index 86547d3ef04..cefb7a74dd1 100644 --- a/myisam/mi_rkey.c +++ b/myisam/mi_rkey.c @@ -17,7 +17,7 @@ /* Read record based on a key */ #include "myisamdef.h" - +#include "rt_index.h" /* Read a record using key */ /* Ordinary search_flag is 0 ; Give error if no record with key */ @@ -36,6 +36,7 @@ int mi_rkey(MI_INFO *info, byte *buf, int inx, const byte *key, uint key_len, DBUG_RETURN(my_errno); info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED); + info->last_key_func=search_flag; if (!info->use_packed_key) { @@ -65,22 +66,33 @@ int mi_rkey(MI_INFO *info, byte *buf, int inx, const byte *key, uint key_len, if (!(nextflag & (SEARCH_FIND | SEARCH_NO_FIND | SEARCH_LAST))) use_key_length=USE_WHOLE_KEY; - if (!_mi_search(info,info->s->keyinfo+inx,key_buff,use_key_length, + switch(info->s->keyinfo[inx].key_alg){ + case HA_KEY_ALG_RTREE: + if(rtree_find_first(info,inx,key_buff,use_key_length,nextflag)<0) + { + my_errno=HA_ERR_CRASHED; + goto err; + } + break; + case HA_KEY_ALG_BTREE: + default: + if (!_mi_search(info,info->s->keyinfo+inx,key_buff,use_key_length, myisam_read_vec[search_flag],info->s->state.key_root[inx])) - { - while (info->lastpos >= info->state->data_file_length) { - /* - Skip rows that are inserted by other threads since we got a lock - Note that this can only happen if we are not searching after an - exact key, because the keys are sorted according to position - */ - - if (_mi_search_next(info,info->s->keyinfo+inx,info->lastkey, + while (info->lastpos >= info->state->data_file_length) + { + /* + Skip rows that are inserted by other threads since we got a lock + Note that this can only happen if we are not searching after an + exact key, because the keys are sorted according to position + */ + + if (_mi_search_next(info,info->s->keyinfo+inx,info->lastkey, info->lastkey_length, myisam_readnext_vec[search_flag], info->s->state.key_root[inx])) - break; + break; + } } } if (share->concurrent_insert) diff --git a/myisam/mi_rnext.c b/myisam/mi_rnext.c index 6d135462f96..daab7c5f085 100644 --- a/myisam/mi_rnext.c +++ b/myisam/mi_rnext.c @@ -16,6 +16,8 @@ #include "myisamdef.h" +#include "rt_index.h" + /* Read next row with the same key as previous read One may have done a write, update or delete of the previous row. @@ -42,27 +44,55 @@ int mi_rnext(MI_INFO *info, byte *buf, int inx) changed=_mi_test_if_changed(info); if (!flag) { - error=_mi_search_first(info,info->s->keyinfo+inx, - info->s->state.key_root[inx]); + switch(info->s->keyinfo[inx].key_alg){ + case HA_KEY_ALG_RTREE: + error=rtree_get_first(info,inx,info->lastkey_length); + break; + case HA_KEY_ALG_BTREE: + default: + error=_mi_search_first(info,info->s->keyinfo+inx, + info->s->state.key_root[inx]); + break; + } } - else if (!changed) - error=_mi_search_next(info,info->s->keyinfo+inx,info->lastkey, - info->lastkey_length,flag, - info->s->state.key_root[inx]); else - error=_mi_search(info,info->s->keyinfo+inx,info->lastkey, - USE_WHOLE_KEY,flag, info->s->state.key_root[inx]); - - if (!error) { - while (info->lastpos >= info->state->data_file_length) + switch(info->s->keyinfo[inx].key_alg) { - /* Skip rows that are inserted by other threads since we got a lock */ - if ((error=_mi_search_next(info,info->s->keyinfo+inx,info->lastkey, + case HA_KEY_ALG_RTREE: + /* + Note that rtree doesn't support that the table + may be changed since last call, so we do need + to skip rows inserted by other threads like in btree + */ + error=rtree_get_next(info,inx,info->lastkey_length); + break; + + case HA_KEY_ALG_BTREE: + default: + if (!changed) + { + error=_mi_search_next(info,info->s->keyinfo+inx,info->lastkey, + info->lastkey_length,flag, + info->s->state.key_root[inx]); + } + else + { + error=_mi_search(info,info->s->keyinfo+inx,info->lastkey, + USE_WHOLE_KEY,flag, info->s->state.key_root[inx]); + } + if (!error) + { + while (info->lastpos >= info->state->data_file_length) + { + /* Skip rows that are inserted by other threads since we got a lock */ + if ((error=_mi_search_next(info,info->s->keyinfo+inx,info->lastkey, info->lastkey_length, SEARCH_BIGGER, info->s->state.key_root[inx]))) - break; + break; + } + } } } diff --git a/myisam/mi_rnext_same.c b/myisam/mi_rnext_same.c index 662bdb154b3..88ff24842d4 100644 --- a/myisam/mi_rnext_same.c +++ b/myisam/mi_rnext_same.c @@ -15,6 +15,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "myisamdef.h" +#include "rt_index.h" /* Read next row with the same key as previous read, but abort if @@ -38,26 +39,39 @@ int mi_rnext_same(MI_INFO *info, byte *buf) if (fast_mi_readinfo(info)) DBUG_RETURN(my_errno); - memcpy(info->lastkey2,info->lastkey,info->last_rkey_length); if (info->s->concurrent_insert) rw_rdlock(&info->s->key_root_lock[inx]); - for (;;) + + switch(keyinfo->key_alg) { - if ((error=_mi_search_next(info,keyinfo,info->lastkey, + case HA_KEY_ALG_RTREE: + if((error=rtree_find_next(info,inx,myisam_read_vec[info->last_key_func]))) + { + /* FIXME: What to do?*/ + } + break; + case HA_KEY_ALG_BTREE: + default: + + memcpy(info->lastkey2,info->lastkey,info->last_rkey_length); + for (;;) + { + if ((error=_mi_search_next(info,keyinfo,info->lastkey, info->lastkey_length,flag, info->s->state.key_root[inx]))) - break; - if (_mi_key_cmp(keyinfo->seg,info->lastkey2,info->lastkey, + break; + if (_mi_key_cmp(keyinfo->seg,info->lastkey2,info->lastkey, info->last_rkey_length, SEARCH_FIND, ¬_used)) - { - error=1; - my_errno=HA_ERR_END_OF_FILE; - info->lastpos= HA_OFFSET_ERROR; - break; - } - /* Skip rows that are inserted by other threads since we got a lock */ - if (info->lastpos < info->state->data_file_length) - break; + { + error=1; + my_errno=HA_ERR_END_OF_FILE; + info->lastpos= HA_OFFSET_ERROR; + break; + } + /* Skip rows that are inserted by other threads since we got a lock */ + if (info->lastpos < info->state->data_file_length) + break; + } } if (info->s->concurrent_insert) rw_unlock(&info->s->key_root_lock[inx]); diff --git a/myisam/mi_static.c b/myisam/mi_static.c index 86d7fc38f25..660898f4b91 100644 --- a/myisam/mi_static.c +++ b/myisam/mi_static.c @@ -49,7 +49,8 @@ uint NEAR myisam_read_vec[]= { SEARCH_FIND, SEARCH_FIND | SEARCH_BIGGER, SEARCH_FIND | SEARCH_SMALLER, SEARCH_NO_FIND | SEARCH_BIGGER, SEARCH_NO_FIND | SEARCH_SMALLER, - SEARCH_FIND | SEARCH_PREFIX, SEARCH_LAST + SEARCH_FIND | SEARCH_PREFIX, SEARCH_LAST, + MBR_CONTAIN, MBR_INTERSECT, MBR_WITHIN, MBR_DISJOINT, MBR_EQUAL }; uint NEAR myisam_readnext_vec[]= diff --git a/myisam/mi_test1.c b/myisam/mi_test1.c index bb32860b575..135589bb53c 100644 --- a/myisam/mi_test1.c +++ b/myisam/mi_test1.c @@ -89,6 +89,7 @@ int run_test(const char *filename) /* Define a key over the first column */ keyinfo[0].seg=keyseg; keyinfo[0].keysegs=1; + keyinfo[0].key_alg=HA_KEY_ALG_BTREE; keyinfo[0].seg[0].type= key_type; keyinfo[0].seg[0].flag= pack_seg; keyinfo[0].seg[0].start=1; diff --git a/myisam/mi_test2.c b/myisam/mi_test2.c index 81d00893d27..54752b43fbd 100644 --- a/myisam/mi_test2.c +++ b/myisam/mi_test2.c @@ -91,6 +91,7 @@ int main(int argc, char *argv[]) keyinfo[0].seg[0].flag=(uint8) pack_seg; keyinfo[0].seg[0].null_bit=0; keyinfo[0].seg[0].null_pos=0; + keyinfo[0].key_alg=HA_KEY_ALG_BTREE; keyinfo[0].keysegs=1; keyinfo[0].flag = pack_type; keyinfo[1].seg= &glob_keyseg[1][0]; @@ -106,6 +107,7 @@ int main(int argc, char *argv[]) keyinfo[1].seg[1].flag=HA_REVERSE_SORT; keyinfo[1].seg[1].null_bit=0; keyinfo[1].seg[1].null_pos=0; + keyinfo[1].key_alg=HA_KEY_ALG_BTREE; keyinfo[1].keysegs=2; keyinfo[1].flag =0; keyinfo[2].seg= &glob_keyseg[2][0]; @@ -115,6 +117,7 @@ int main(int argc, char *argv[]) keyinfo[2].seg[0].flag=HA_REVERSE_SORT; keyinfo[2].seg[0].null_bit=0; keyinfo[2].seg[0].null_pos=0; + keyinfo[2].key_alg=HA_KEY_ALG_BTREE; keyinfo[2].keysegs=1; keyinfo[2].flag =HA_NOSAME; keyinfo[3].seg= &glob_keyseg[3][0]; @@ -125,6 +128,7 @@ int main(int argc, char *argv[]) keyinfo[3].seg[0].flag=(uint8) pack_seg; keyinfo[3].seg[0].null_bit=0; keyinfo[3].seg[0].null_pos=0; + keyinfo[3].key_alg=HA_KEY_ALG_BTREE; keyinfo[3].keysegs=1; keyinfo[3].flag = pack_type; keyinfo[4].seg= &glob_keyseg[4][0]; @@ -135,6 +139,7 @@ int main(int argc, char *argv[]) keyinfo[4].seg[0].flag=0; keyinfo[4].seg[0].null_bit=0; keyinfo[4].seg[0].null_pos=0; + keyinfo[4].key_alg=HA_KEY_ALG_BTREE; keyinfo[4].keysegs=1; keyinfo[4].flag = pack_type; keyinfo[5].seg= &glob_keyseg[5][0]; @@ -145,6 +150,7 @@ int main(int argc, char *argv[]) keyinfo[5].seg[0].flag=pack_seg; keyinfo[5].seg[0].null_bit=0; keyinfo[5].seg[0].null_pos=0; + keyinfo[5].key_alg=HA_KEY_ALG_BTREE; keyinfo[5].keysegs=1; keyinfo[5].flag = pack_type; diff --git a/myisam/mi_test3.c b/myisam/mi_test3.c index 36222c3edbc..17c4e92d2ba 100644 --- a/myisam/mi_test3.c +++ b/myisam/mi_test3.c @@ -70,6 +70,7 @@ int main(int argc,char **argv) keyinfo[0].seg[0].length=8; keyinfo[0].seg[0].type=HA_KEYTYPE_TEXT; keyinfo[0].seg[0].flag=HA_SPACE_PACK; + keyinfo[0].key_alg=HA_KEY_ALG_BTREE; keyinfo[0].keysegs=1; keyinfo[0].flag = (uint8) HA_PACK_KEY; keyinfo[1].seg= &keyseg[1][0]; @@ -77,6 +78,7 @@ int main(int argc,char **argv) keyinfo[1].seg[0].length=4; /* Long is always 4 in myisam */ keyinfo[1].seg[0].type=HA_KEYTYPE_LONG_INT; keyinfo[1].seg[0].flag=0; + keyinfo[1].key_alg=HA_KEY_ALG_BTREE; keyinfo[1].keysegs=1; keyinfo[1].flag =HA_NOSAME; diff --git a/myisam/mi_update.c b/myisam/mi_update.c index 2c6bc42bbdb..ebf45316eb6 100644 --- a/myisam/mi_update.c +++ b/myisam/mi_update.c @@ -17,6 +17,8 @@ /* Update an old row in a MyISAM table */ #include "fulltext.h" +#include "rt_index.h" + #ifdef __WIN__ #include #endif @@ -61,6 +63,7 @@ int mi_update(register MI_INFO *info, const byte *oldrec, byte *newrec) goto err_end; /* Record has changed */ } + /* Calculate and check all unique constraints */ key_changed=0; for (i=0 ; i < share->state.header.uniques ; i++) @@ -113,8 +116,8 @@ int mi_update(register MI_INFO *info, const byte *oldrec, byte *newrec) key_changed|=HA_STATE_WRITTEN; /* Mark that keyfile changed */ changed|=((ulonglong) 1 << i); share->keyinfo[i].version++; - if (_mi_ck_delete(info,i,old_key,old_length)) goto err; - if (_mi_ck_write(info,i,new_key,new_length)) goto err; + if (share->keyinfo[i].ck_delete(info,i,old_key,old_length)) goto err; + if (share->keyinfo[i].ck_insert(info,i,new_key,new_length)) goto err; if (share->base.auto_key == i+1) auto_key_changed=1; } diff --git a/myisam/mi_write.c b/myisam/mi_write.c index 1f43a5defcc..1fb79b38103 100644 --- a/myisam/mi_write.c +++ b/myisam/mi_write.c @@ -17,6 +17,8 @@ /* Write a row to a MyISAM table */ #include "fulltext.h" +#include "rt_index.h" + #ifdef __WIN__ #include #endif @@ -121,17 +123,17 @@ int mi_write(MI_INFO *info, byte *record) } else { - uint key_length=_mi_make_key(info,i,buff,record,filepos); - if (_mi_ck_write(info,i,buff,key_length)) - { - if (local_lock_tree) - rw_unlock(&share->key_root_lock[i]); - DBUG_PRINT("error",("Got error: %d on write",my_errno)); - goto err; - } + if (share->keyinfo[i].ck_insert(info,i,buff, + _mi_make_key(info,i,buff,record,filepos))) + { + if (local_lock_tree) + rw_unlock(&share->key_root_lock[i]); + DBUG_PRINT("error",("Got error: %d on write",my_errno)); + goto err; + } } if (local_lock_tree) - rw_unlock(&share->key_root_lock[i]); + rw_unlock(&share->key_root_lock[i]); } } if (share->calc_checksum) diff --git a/myisam/myisamdef.h b/myisam/myisamdef.h index e9d3461fe9a..e5da4752429 100644 --- a/myisam/myisamdef.h +++ b/myisam/myisamdef.h @@ -253,6 +253,7 @@ struct st_myisam_info { int lastinx; /* Last used index */ uint lastkey_length; /* Length of key in lastkey */ uint last_rkey_length; /* Last length in mi_rkey() */ + enum ha_rkey_function last_key_func; /* CONTAIN, OVERLAP, etc */ uint save_lastkey_length; int errkey; /* Got last error on this key */ int lock_type; /* How database was locked */ @@ -272,6 +273,8 @@ struct st_myisam_info { #ifdef THREAD THR_LOCK_DATA lock; #endif + uchar * rtree_recursion_state; /* For RTREE */ + int rtree_recursion_depth; }; diff --git a/myisam/rt_index.c b/myisam/rt_index.c new file mode 100644 index 00000000000..d55d01fa4a3 --- /dev/null +++ b/myisam/rt_index.c @@ -0,0 +1,914 @@ +/* Copyright (C) 2000 MySQL AB & Ramil Kalimullin & MySQL Finland AB + & TCX DataKonsult AB + + 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; either version 2 of the License, or + (at your option) any later version. + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#include "myisamdef.h" + +#include "rt_index.h" +#include "rt_key.h" +#include "rt_mbr.h" + +#define REINSERT_BUFFER_INC 10 + +typedef struct st_page_level +{ + uint level; + my_off_t offs; +} stPageLevel; + +typedef struct st_page_list +{ + ulong n_pages; + ulong m_pages; + stPageLevel *pages; +} stPageList; + +/* +Find next key in r-tree according to search_flag recursively +Used in rtree_find_first() and rtree_find_next() +Result values: +-1 - error + 0 - found + 1 - not found +*/ +static int rtree_find_req(MI_INFO *info, MI_KEYDEF *keyinfo, uint search_flag, uint nod_cmp_flag, + my_off_t page, int level) +{ + uchar *k; + uchar *last; + uint nod_flag; + int res; + uchar *page_buf; + int k_len; + int *saved_key = (int*)(info->rtree_recursion_state + level * sizeof(int)); + + if (!(page_buf = (uchar*)my_alloca((uint)keyinfo->block_length))) + { + my_errno = HA_ERR_OUT_OF_MEM; + return -1; + } + if (!_mi_fetch_keypage(info, keyinfo, page, page_buf, 0)) + goto err1; + nod_flag = mi_test_if_nod(page_buf); + + k_len = keyinfo->keylength - info->s->base.rec_reflength; + + if(info->rtree_recursion_depth >= level) + { + k = page_buf + *saved_key; + if (!nod_flag) + { + /* Only leaf pages contain data references. */ + /* Need to check next key with data reference. */ + k = rt_PAGE_NEXT_KEY(k, k_len, nod_flag); + } + } + else + { + k = rt_PAGE_FIRST_KEY(page_buf, nod_flag); + } + last = rt_PAGE_END(page_buf); + + for (; k < last; k = rt_PAGE_NEXT_KEY(k, k_len, nod_flag)) + { + if (nod_flag) + { + /* this is an internal node in the tree */ + if (!(res = rtree_key_cmp(keyinfo->seg, info->lastkey2, k, + info->last_rkey_length, nod_cmp_flag))) + { + switch ((res = rtree_find_req(info, keyinfo, search_flag, nod_cmp_flag, + _mi_kpos(nod_flag, k), level + 1))) + { + case 0: /* found - exit from recursion */ + *saved_key = k - page_buf; + goto ok; + case 1: /* not found - continue searching */ + info->rtree_recursion_depth = level; + break; + default: /* error */ + case -1: + goto err1; + } + } + } + else + { + /* this is a leaf */ + if (!rtree_key_cmp(keyinfo->seg, info->lastkey2, k, + info->last_rkey_length, search_flag)) + { + uchar *after_key = rt_PAGE_NEXT_KEY(k, k_len, nod_flag); + info->lastpos = _mi_dpos(info, 0, after_key); + info->lastkey_length = k_len + info->s->base.rec_reflength; + memcpy(info->lastkey, k, k_len + info->s->base.rec_reflength); + + info->rtree_recursion_depth = level; + *saved_key = k - page_buf; + + if (after_key < last) + { + info->int_keypos = (uchar*)saved_key; + memcpy(info->buff, page_buf, keyinfo->block_length); + info->int_maxpos = rt_PAGE_END(info->buff); + info->buff_used = 0; + } + + res = 0; + goto ok; + } + } + } + info->lastpos = HA_OFFSET_ERROR; + my_errno = HA_ERR_KEY_NOT_FOUND; + res = 1; + +ok: + my_afree((byte*)page_buf); + return res; + +err1: + my_afree((byte*)page_buf); + info->lastpos = HA_OFFSET_ERROR; + return -1; +} + +/* +Find first key in r-tree according to search_flag condition +Result values: +-1 - error + 0 - found + 1 - not found +*/ +int rtree_find_first(MI_INFO *info, uint keynr, uchar *key, uint key_length, + uint search_flag) +{ + my_off_t root; + uint nod_cmp_flag; + MI_KEYDEF *keyinfo = info->s->keyinfo + keynr; + + if ((root = info->s->state.key_root[keynr]) == HA_OFFSET_ERROR) + return -1; + + /* Save searched key */ + memcpy(info->lastkey2, key, keyinfo->keylength - info->s->base.rec_reflength); + info->last_rkey_length = key_length; + + info->rtree_recursion_depth = -1; + info->buff_used = 1; + + nod_cmp_flag = ((search_flag & (MBR_EQUAL | MBR_WITHIN)) ? + MBR_WITHIN : MBR_INTERSECT); + return rtree_find_req(info, keyinfo, search_flag, nod_cmp_flag, root, 0); +} + +/* +Find next key in r-tree according to search_flag condition +Result values: +-1 - error + 0 - found + 1 - not found +*/ +int rtree_find_next(MI_INFO *info, uint keynr, uint search_flag) +{ + my_off_t root; + uint nod_cmp_flag; + MI_KEYDEF *keyinfo = info->s->keyinfo + keynr; + + if (!info->buff_used) + { + uint k_len = keyinfo->keylength - info->s->base.rec_reflength; + /* rt_PAGE_NEXT_KEY(info->int_keypos) */ + uchar *key = info->buff + *(int*)info->int_keypos + k_len + + info->s->base.rec_reflength; + + while (key < info->int_maxpos) + { + if (!rtree_key_cmp(keyinfo->seg, info->lastkey2, key, + info->last_rkey_length, search_flag)) + { + /* rt_PAGE_NEXT_KEY(key) */ + uchar *after_key = key + k_len + info->s->base.rec_reflength; + + info->lastpos = _mi_dpos(info, 0, after_key); + info->lastkey_length = k_len + info->s->base.rec_reflength; + memcpy(info->lastkey, key, k_len + info->s->base.rec_reflength); + + *(int*)info->int_keypos = key - info->buff; + if (after_key >= info->int_maxpos) + { + info->buff_used = 1; + } + + return 0; + } + else + { + key += k_len + info->s->base.rec_reflength; + } + } + } + if ((root = info->s->state.key_root[keynr]) == HA_OFFSET_ERROR) + return -1; + + nod_cmp_flag = ((search_flag & (MBR_EQUAL | MBR_WITHIN)) ? + MBR_WITHIN : MBR_INTERSECT); + return rtree_find_req(info, keyinfo, search_flag, nod_cmp_flag, root, 0); +} + +/* +Get next key in r-tree recursively +Used in rtree_get_first() and rtree_get_next() +Result values: +-1 - error + 0 - found + 1 - not found +*/ +static int rtree_get_req(MI_INFO *info, MI_KEYDEF *keyinfo, uint key_length, + my_off_t page, int level) +{ + uchar *k; + uchar *last; + uint nod_flag; + int res; + uchar *page_buf; + uint k_len; + int *saved_key = (int*)(info->rtree_recursion_state + level*sizeof(int)); + + if (!(page_buf = (uchar*)my_alloca((uint)keyinfo->block_length))) + return -1; + if (!_mi_fetch_keypage(info, keyinfo, page, page_buf, 0)) + goto err1; + nod_flag = mi_test_if_nod(page_buf); + + k_len = keyinfo->keylength - info->s->base.rec_reflength; + + if(info->rtree_recursion_depth >= level) + { + k = page_buf + *saved_key; + if (!nod_flag) + { + /* Only leaf pages contain data references. */ + /* Need to check next key with data reference. */ + k = rt_PAGE_NEXT_KEY(k, k_len, nod_flag); + } + } + else + { + k = rt_PAGE_FIRST_KEY(page_buf, nod_flag); + } + last = rt_PAGE_END(page_buf); + + for (; k < last; k = rt_PAGE_NEXT_KEY(k, k_len, nod_flag)) + { + if (nod_flag) + { + /* this is an internal node in the tree */ + switch ((res = rtree_get_req(info, keyinfo, key_length, + _mi_kpos(nod_flag, k), level + 1))) + { + case 0: /* found - exit from recursion */ + *saved_key = k - page_buf; + goto ok; + case 1: /* not found - continue searching */ + info->rtree_recursion_depth = level; + break; + default: + case -1: /* error */ + goto err1; + } + } + else + { + /* this is a leaf */ + uchar *after_key = rt_PAGE_NEXT_KEY(k, k_len, nod_flag); + info->lastpos = _mi_dpos(info, 0, after_key); + info->lastkey_length = k_len + info->s->base.rec_reflength; + memcpy(info->lastkey, k, k_len + info->s->base.rec_reflength); + + info->rtree_recursion_depth = level; + *saved_key = k - page_buf; + + if (after_key < last) + { + info->int_keypos = (uchar*)saved_key; + memcpy(info->buff, page_buf, keyinfo->block_length); + info->int_maxpos = rt_PAGE_END(info->buff); + info->buff_used = 0; + } + + res = 0; + goto ok; + } + } + info->lastpos = HA_OFFSET_ERROR; + my_errno = HA_ERR_KEY_NOT_FOUND; + res = 1; + +ok: + my_afree((byte*)page_buf); + return res; + +err1: + my_afree((byte*)page_buf); + info->lastpos = HA_OFFSET_ERROR; + return -1; +} + +/* +Get first key in r-tree +Result values: +-1 - error + 0 - found + 1 - not found +*/ +int rtree_get_first(MI_INFO *info, uint keynr, uint key_length) +{ + my_off_t root; + MI_KEYDEF *keyinfo = info->s->keyinfo + keynr; + + if ((root = info->s->state.key_root[keynr]) == HA_OFFSET_ERROR) + return -1; + + info->rtree_recursion_depth = -1; + info->buff_used = 1; + + return rtree_get_req(info, &keyinfo[keynr], key_length, root, 0); +} + +/* Get next key in r-tree +Result values: +-1 - error + 0 - found + 1 - not found +*/ +int rtree_get_next(MI_INFO *info, uint keynr, uint key_length) +{ + my_off_t root; + MI_KEYDEF *keyinfo = info->s->keyinfo + keynr; + + if (!info->buff_used) + { + uint k_len = keyinfo->keylength - info->s->base.rec_reflength; + /* rt_PAGE_NEXT_KEY(info->int_keypos) */ + uchar *key = info->buff + *(int*)info->int_keypos + k_len + + info->s->base.rec_reflength; + /* rt_PAGE_NEXT_KEY(key) */ + uchar *after_key = key + k_len + info->s->base.rec_reflength; + + info->lastpos = _mi_dpos(info, 0, after_key); + info->lastkey_length = k_len + info->s->base.rec_reflength; + memcpy(info->lastkey, key, k_len + info->s->base.rec_reflength); + + *(int*)info->int_keypos = key - info->buff; + if (after_key >= info->int_maxpos) + { + info->buff_used = 1; + } + + return 0; + } + else + { + if ((root = info->s->state.key_root[keynr]) == HA_OFFSET_ERROR) + return -1; + + return rtree_get_req(info, &keyinfo[keynr], key_length, root, 0); + } +} + +/* +Go down and insert key into tree +Result values: +-1 - error + 0 - child was not split + 1 - child was split +*/ +static int rtree_insert_req(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, + uint key_length, my_off_t page, my_off_t *new_page, + int ins_level, int level) +{ + uchar *k; + uint nod_flag; + uchar *page_buf; + int res; + + if (!(page_buf = (uchar*)my_alloca((uint)keyinfo->block_length + + MI_MAX_KEY_BUFF))) + { + my_errno = HA_ERR_OUT_OF_MEM; + return -1; + } + if (!_mi_fetch_keypage(info, keyinfo, page, page_buf, 0)) + goto err1; + nod_flag = mi_test_if_nod(page_buf); + + if ((ins_level == -1 && nod_flag) || /* key: go down to leaf */ + (ins_level > -1 && ins_level > level)) /* branch: go down to ins_level */ + { + if ((k = rtree_choose_key(info, keyinfo, key, key_length, page_buf, + nod_flag)) == NULL) + goto err1; + switch ((res = rtree_insert_req(info, keyinfo, key, key_length, + _mi_kpos(nod_flag, k), new_page, ins_level, level + 1))) + { + case 0: /* child was not split */ + { + rtree_combine_rect(keyinfo->seg, k, key, k, key_length); + if (_mi_write_keypage(info, keyinfo, page, page_buf)) + goto err1; + goto ok; + } + case 1: /* child was split */ + { + uchar *new_key = page_buf + keyinfo->block_length + nod_flag; + /* set proper MBR for key */ + if (rtree_set_key_mbr(info, keyinfo, k, key_length, + _mi_kpos(nod_flag, k))) + goto err1; + /* add new key for new page */ + _mi_kpointer(info, new_key - nod_flag, *new_page); + if (rtree_set_key_mbr(info, keyinfo, new_key, key_length, *new_page)) + goto err1; + res = rtree_add_key(info, keyinfo, new_key, key_length, + page_buf, new_page); + if (_mi_write_keypage(info, keyinfo, page, page_buf)) + goto err1; + goto ok; + } + default: + case -1: /* error */ + { + goto err1; + } + } + } + else + { + res = rtree_add_key(info, keyinfo, key, key_length, page_buf, new_page); + if (_mi_write_keypage(info, keyinfo, page, page_buf)) + goto err1; + goto ok; + } + +ok: + my_afree((byte*)page_buf); + return res; + +err1: + my_afree((byte*)page_buf); + return -1; +} + +/* +Insert key into the tree +Result values: +-1 - error + 0 - root was not split + 1 - root was split +*/ +static int rtree_insert_level(MI_INFO *info, uint keynr, uchar *key, + uint key_length, int ins_level) +{ + my_off_t old_root; + MI_KEYDEF *keyinfo = info->s->keyinfo + keynr; + int res; + my_off_t new_page; + + if ((old_root = info->s->state.key_root[keynr]) == HA_OFFSET_ERROR) + { + int res; + + if ((old_root = _mi_new(info, keyinfo)) == HA_OFFSET_ERROR) + return -1; + info->buff_used = 1; + mi_putint(info->buff, 2, 0); + res = rtree_add_key(info, keyinfo, key, key_length, info->buff, NULL); + if (_mi_write_keypage(info, keyinfo, old_root, info->buff)) + return 1; + info->s->state.key_root[keynr] = old_root; + return res; + } + + switch ((res = rtree_insert_req(info, &keyinfo[keynr], key, key_length, + old_root, &new_page, ins_level, 0))) + { + case 0: /* root was not split */ + { + break; + } + case 1: /* root was split, grow a new root */ + { + uchar *new_root_buf; + my_off_t new_root; + uchar *new_key; + uint nod_flag = info->s->base.key_reflength; + + if (!(new_root_buf = (uchar*)my_alloca((uint)keyinfo->block_length + + MI_MAX_KEY_BUFF))) + { + my_errno = HA_ERR_OUT_OF_MEM; + return -1; + } + + mi_putint(new_root_buf, 2, nod_flag); + if ((new_root = _mi_new(info, keyinfo)) == HA_OFFSET_ERROR) + goto err1; + + new_key = new_root_buf + keyinfo->block_length + nod_flag; + + _mi_kpointer(info, new_key - nod_flag, old_root); + if (rtree_set_key_mbr(info, keyinfo, new_key, key_length, old_root)) + goto err1; + if (rtree_add_key(info, keyinfo, new_key, key_length, new_root_buf, NULL) + == -1) + goto err1; + _mi_kpointer(info, new_key - nod_flag, new_page); + if (rtree_set_key_mbr(info, keyinfo, new_key, key_length, new_page)) + goto err1; + if (rtree_add_key(info, keyinfo, new_key, key_length, new_root_buf, NULL) + == -1) + goto err1; + if (_mi_write_keypage(info, keyinfo, new_root, new_root_buf)) + goto err1; + info->s->state.key_root[keynr] = new_root; + + my_afree((byte*)new_root_buf); + break; +err1: + my_afree((byte*)new_root_buf); + return -1; + } + default: + case -1: /* error */ + { + break; + } + } + return res; +} + +/* +Insert key into the tree - interface function +Result values: +-1 - error + 0 - OK +*/ +int rtree_insert(MI_INFO *info, uint keynr, uchar *key, uint key_length) +{ + return (rtree_insert_level(info, keynr, key, key_length, -1) == -1) ? -1 : 0; +} + +/* +Fill reinsert page buffer +*/ +static int rtree_fill_reinsert_list(stPageList *ReinsertList, my_off_t page, + int level) +{ + if (ReinsertList->n_pages == ReinsertList->m_pages) + { + ReinsertList->m_pages += REINSERT_BUFFER_INC; + if (!(ReinsertList->pages = (stPageLevel*)my_realloc((gptr)ReinsertList->pages, + ReinsertList->m_pages * sizeof(stPageLevel), MYF(MY_ALLOW_ZERO_PTR)))) + goto err1; + } + /* save page to ReinsertList */ + ReinsertList->pages[ReinsertList->n_pages].offs = page; + ReinsertList->pages[ReinsertList->n_pages].level = level; + ReinsertList->n_pages++; + return 0; + +err1: + return -1; +} + +/* +Go down and delete key from the tree +Result values: +-1 - error + 0 - deleted + 1 - not found + 2 - empty leaf +*/ +static int rtree_delete_req(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, + uint key_length, my_off_t page, uint *page_size, + stPageList *ReinsertList, int level) +{ + uchar *k; + uchar *last; + ulong i; + uint nod_flag; + uchar *page_buf; + int res; + + if (!(page_buf = (uchar*)my_alloca((uint)keyinfo->block_length))) + { + my_errno = HA_ERR_OUT_OF_MEM; + return -1; + } + if (!_mi_fetch_keypage(info, keyinfo, page, page_buf, 0)) + goto err1; + nod_flag = mi_test_if_nod(page_buf); + + k = rt_PAGE_FIRST_KEY(page_buf, nod_flag); + last = rt_PAGE_END(page_buf); + + for (i = 0; k < last; k = rt_PAGE_NEXT_KEY(k, key_length, nod_flag), ++i) + { + if (nod_flag) + { + /* not leaf */ + if (!rtree_key_cmp(keyinfo->seg, key, k, key_length, MBR_WITHIN)) + { + switch ((res = rtree_delete_req(info, keyinfo, key, key_length, + _mi_kpos(nod_flag, k), page_size, ReinsertList, level + 1))) + { + case 0: /* deleted */ + { + /* test page filling */ + if (*page_size + key_length >= rt_PAGE_MIN_SIZE(keyinfo->block_length)) + { + /* OK */ + if (rtree_set_key_mbr(info, keyinfo, k, key_length, + _mi_kpos(nod_flag, k))) + goto err1; + if (_mi_write_keypage(info, keyinfo, page, page_buf)) + goto err1; + } + else + { + /* too small: delete key & add it descendant to reinsert list */ + if (rtree_fill_reinsert_list(ReinsertList, _mi_kpos(nod_flag, k), + level + 1)) + goto err1; + rtree_delete_key(info, page_buf, k, key_length, nod_flag); + if (_mi_write_keypage(info, keyinfo, page, page_buf)) + goto err1; + *page_size = mi_getint(page_buf); + } + + goto ok; + } + case 1: /* not found - continue searching */ + { + break; + } + case 2: /* vacuous case: last key in the leaf */ + { + rtree_delete_key(info, page_buf, k, key_length, nod_flag); + if (_mi_write_keypage(info, keyinfo, page, page_buf)) + goto err1; + *page_size = mi_getint(page_buf); + res = 0; + goto ok; + } + default: /* error */ + case -1: + { + goto err1; + } + } + } + } + else + { + /* leaf */ + if (!rtree_key_cmp(keyinfo->seg, key, k, key_length, MBR_EQUAL | MBR_DATA)) + { + rtree_delete_key(info, page_buf, k, key_length, nod_flag); + *page_size = mi_getint(page_buf); + if (*page_size == 2) + { + /* last key in the leaf */ + res = 2; + if (_mi_dispose(info, keyinfo, page)) + goto err1; + } + else + { + res = 0; + if (_mi_write_keypage(info, keyinfo, page, page_buf)) + goto err1; + } + goto ok; + } + } + } + res = 1; + +ok: + my_afree((byte*)page_buf); + return res; + +err1: + my_afree((byte*)page_buf); + return -1; +} + +/* +Delete key - interface function +Result values: +-1 - error + 0 - deleted +*/ +int rtree_delete(MI_INFO *info, uint keynr, uchar *key, uint key_length) +{ + uint page_size; + stPageList ReinsertList; + my_off_t old_root; + MI_KEYDEF *keyinfo = info->s->keyinfo + keynr; + + if ((old_root = info->s->state.key_root[keynr]) == HA_OFFSET_ERROR) + { + my_errno = HA_ERR_KEY_NOT_FOUND; + return -1; + } + + ReinsertList.pages = NULL; + ReinsertList.n_pages = 0; + ReinsertList.m_pages = 0; + + switch (rtree_delete_req(info, keyinfo, key, key_length, old_root, + &page_size, &ReinsertList, 0)) + { + case 2: + { + info->s->state.key_root[keynr] = HA_OFFSET_ERROR; + return 0; + } + case 0: + { + uint nod_flag; + ulong i; + for (i = 0; i < ReinsertList.n_pages; ++i) + { + uchar *page_buf; + uint nod_flag; + uchar *k; + uchar *last; + + if (!(page_buf = (uchar*)my_alloca((uint)keyinfo->block_length))) + { + my_errno = HA_ERR_OUT_OF_MEM; + goto err1; + } + if (!_mi_fetch_keypage(info, keyinfo, ReinsertList.pages[i].offs, + page_buf, 0)) + goto err1; + nod_flag = mi_test_if_nod(page_buf); + k = rt_PAGE_FIRST_KEY(page_buf, nod_flag); + last = rt_PAGE_END(page_buf); + for (; k < last; k = rt_PAGE_NEXT_KEY(k, key_length, nod_flag)) + { + if (rtree_insert_level(info, keynr, k, key_length, + ReinsertList.pages[i].level) == -1) + { + my_afree((byte*)page_buf); + goto err1; + } + } + my_afree((byte*)page_buf); + if (_mi_dispose(info, keyinfo, ReinsertList.pages[i].offs)) + goto err1; + } + if (ReinsertList.pages) + free(ReinsertList.pages); + + /* check for redundant root (not leaf, 1 child) and eliminate */ + if ((old_root = info->s->state.key_root[keynr]) == HA_OFFSET_ERROR) + goto err1; + if (!_mi_fetch_keypage(info, keyinfo, old_root, info->buff, 0)) + goto err1; + nod_flag = mi_test_if_nod(info->buff); + page_size = mi_getint(info->buff); + if (nod_flag && (page_size == 2 + key_length + + (nod_flag ? nod_flag : info->s->base.rec_reflength))) + { + my_off_t new_root = _mi_kpos(nod_flag, + rt_PAGE_FIRST_KEY(info->buff, nod_flag)); + if (_mi_dispose(info, keyinfo, old_root)) + goto err1; + info->s->state.key_root[keynr] = new_root; + } + return 0; + +err1: + return -1; + } + case 1: /* not found */ + { + my_errno = HA_ERR_KEY_NOT_FOUND; + return -1; + } + default: + case -1: /* error */ + { + return -1; + } + } +} + +/* +Estimate number of suitable keys in the tree +*/ +ha_rows rtree_estimate(MI_INFO *info, uint keynr, uchar *key, + uint key_length, uint flag) +{ + MI_KEYDEF *keyinfo = info->s->keyinfo + keynr; + my_off_t root; + uint i = 0; + uchar *k; + uchar *last; + uint nod_flag; + uchar *page_buf; + uint k_len; + double area = 0; + ha_rows res = 0; + + if (flag & MBR_DISJOINT) + return info->state->records; + + if ((root = info->s->state.key_root[keynr]) == HA_OFFSET_ERROR) + return HA_POS_ERROR; + if (!(page_buf = (uchar*)my_alloca((uint)keyinfo->block_length))) + return HA_POS_ERROR; + if (!_mi_fetch_keypage(info, keyinfo, root, page_buf, 0)) + goto err1; + nod_flag = mi_test_if_nod(page_buf); + + k_len = keyinfo->keylength - info->s->base.rec_reflength; + + k = rt_PAGE_FIRST_KEY(page_buf, nod_flag); + last = rt_PAGE_END(page_buf); + + for (; k < last; k = rt_PAGE_NEXT_KEY(k, k_len, nod_flag), ++i) + { + if (nod_flag) + { + double k_area = rtree_rect_volume(keyinfo->seg, k, key_length); + + if (k_area == 0) + { + if (flag & (MBR_CONTAIN | MBR_INTERSECT)) + { + area += 1; + } + else if (flag & (MBR_WITHIN | MBR_EQUAL)) + { + if (!rtree_key_cmp(keyinfo->seg, key, k, key_length, MBR_WITHIN)) + area += 1; + } + else + goto err1; + } + else + { + if (flag & (MBR_CONTAIN | MBR_INTERSECT)) + { + area += rtree_overlapping_area(keyinfo->seg, key, k, key_length) / + k_area; + } + else if (flag & (MBR_WITHIN | MBR_EQUAL)) + { + if (!rtree_key_cmp(keyinfo->seg, key, k, key_length, MBR_WITHIN)) + area += rtree_rect_volume(keyinfo->seg, key, key_length) / + k_area; + } + else + goto err1; + } + } + else + { + if (!rtree_key_cmp(keyinfo->seg, key, k, key_length, flag)) + ++res; + } + } + if (nod_flag) + { + if (i) + res = (int)(area / i * info->state->records); + else + res = HA_POS_ERROR; + } + + my_afree((byte*)page_buf); + return res; + +err1: + my_afree((byte*)page_buf); + return HA_POS_ERROR; +} diff --git a/myisam/rt_index.h b/myisam/rt_index.h new file mode 100644 index 00000000000..1a0fce72a82 --- /dev/null +++ b/myisam/rt_index.h @@ -0,0 +1,44 @@ +/* Copyright (C) 2000 MySQL AB & Ramil Kalimullin & MySQL Finland AB + & TCX DataKonsult AB + + 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; either version 2 of the License, or + (at your option) any later version. + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _rt_index_h +#define _rt_index_h + +#define rt_PAGE_FIRST_KEY(page, nod_flag) (page + 2 + nod_flag) +#define rt_PAGE_NEXT_KEY(key, key_length, nod_flag) (key + key_length + \ + (nod_flag ? nod_flag : info->s->base.rec_reflength)) +#define rt_PAGE_END(page) (page + mi_getint(page)) + +#define rt_PAGE_MIN_SIZE(block_length) ((uint)(block_length) / 2) + +int rtree_insert(MI_INFO *info, uint keynr, uchar *key, uint key_length); +int rtree_delete(MI_INFO *info, uint keynr, uchar *key, uint key_length); + +int rtree_find_first(MI_INFO *info, uint keynr, uchar *key, uint key_length, + uint search_flag); +int rtree_find_next(MI_INFO *info, uint keynr, uint search_flag); + +int rtree_get_first(MI_INFO *info, uint keynr, uint key_length); +int rtree_get_next(MI_INFO *info, uint keynr, uint key_length); + +ha_rows rtree_estimate(MI_INFO *info, uint keynr, uchar *key, + uint key_length, uint flag); + +int rtree_split_page(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *page, uchar *key, + uint key_length, my_off_t *new_page_offs); + +#endif /* _rt_index_h */ diff --git a/myisam/rt_key.c b/myisam/rt_key.c new file mode 100644 index 00000000000..c08e918c6db --- /dev/null +++ b/myisam/rt_key.c @@ -0,0 +1,154 @@ +/* Copyright (C) 2000 MySQL AB & Ramil Kalimullin & MySQL Finland AB + & TCX DataKonsult AB + + 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; either version 2 of the License, or + (at your option) any later version. + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#include "myisamdef.h" + +#include "rt_index.h" +#include "rt_key.h" +#include "rt_mbr.h" + +/* +Add key to the page +Result values: +-1 - error + 0 - not split + 1 - split +*/ +int rtree_add_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, + uint key_length, uchar *page_buf, my_off_t *new_page) +{ + uint page_size = mi_getint(page_buf); + uint nod_flag = mi_test_if_nod(page_buf); + + if (page_size + key_length + nod_flag <= keyinfo->block_length) + { + /* split won't be necessary */ + if (nod_flag) + { + /* save key */ + memcpy(rt_PAGE_END(page_buf), key - nod_flag, key_length + nod_flag); + page_size += key_length + nod_flag; + } + else + { + /* save key */ + memcpy(rt_PAGE_END(page_buf), key, key_length + + info->s->base.rec_reflength); + page_size += key_length + info->s->base.rec_reflength; + } + mi_putint(page_buf, page_size, nod_flag); + return 0; + } + else + { + if (rtree_split_page(info, keyinfo, page_buf, key, key_length, new_page)) + return -1; + else + return 1; + } +} + +/* +Delete key from the page +*/ +int rtree_delete_key(MI_INFO *info, uchar *page_buf, uchar *key, + uint key_length, uint nod_flag) +{ + uint16 page_size = mi_getint(page_buf); + uchar *key_start; + + if (nod_flag) + { + key_start = key - nod_flag; + } + else + { + key_start = key; + key_length += info->s->base.rec_reflength; + } + memmove(key_start, key + key_length, page_size - key_length - + (key - page_buf)); + page_size -= key_length + nod_flag; + + mi_putint(page_buf, page_size, nod_flag); + + return 0; +} + +/* +Calculate and store key MBR +*/ +int rtree_set_key_mbr(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, + uint key_length, my_off_t child_page) +{ + uchar *k; + uchar *last; + uint nod_flag; + + if (!_mi_fetch_keypage(info, keyinfo, child_page, info->buff, 0)) + goto err1; + nod_flag = mi_test_if_nod(info->buff); + + k = rt_PAGE_FIRST_KEY(info->buff, nod_flag); + last = rt_PAGE_END(info->buff); + + rtree_page_mbr(info, keyinfo->seg, info->buff, key, key_length); + + return 0; + +err1: + return -1; +} + +/* +Choose non-leaf better key for insertion +*/ +uchar *rtree_choose_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, + uint key_length, uchar *page_buf, uint nod_flag) +{ + double increase; + double best_incr = DBL_MAX; + double area; + double best_area; + uchar *best_key; + + uchar *k = rt_PAGE_FIRST_KEY(page_buf, nod_flag); + uchar *last = rt_PAGE_END(page_buf); + + for (; k < last; k = rt_PAGE_NEXT_KEY(k, key_length, nod_flag)) + { + if ((increase = rtree_area_increase(keyinfo->seg, key, k, key_length, + &area)) == -1) + return NULL; + if (increase < best_incr) + { + best_key = k; + best_area = area; + best_incr = increase; + } + else + { + if ((increase == best_incr) && (area < best_area)) + { + best_key = k; + best_area = area; + best_incr = increase; + } + } + } + return best_key; +} diff --git a/myisam/rt_key.h b/myisam/rt_key.h new file mode 100644 index 00000000000..dfd7b874b54 --- /dev/null +++ b/myisam/rt_key.h @@ -0,0 +1,31 @@ +/* Copyright (C) 2000 MySQL AB & Ramil Kalimullin & MySQL Finland AB + & TCX DataKonsult AB + + 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; either version 2 of the License, or + (at your option) any later version. + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* Written by Ramil Kalimullin, who has a shared copyright to this code */ + +#ifndef _rt_key_h +#define _rt_key_h + +int rtree_add_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, + uint key_length, uchar *page_buf, my_off_t *new_page); +int rtree_delete_key(MI_INFO *info, uchar *page, uchar *key, + uint key_length, uint nod_flag); +int rtree_set_key_mbr(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, + uint key_length, my_off_t child_page); +uchar *rtree_choose_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, + uint key_length, uchar *page_buf, uint nod_flag); +#endif /* _rt_key_h */ diff --git a/myisam/rt_mbr.c b/myisam/rt_mbr.c new file mode 100644 index 00000000000..7ffc1cfa267 --- /dev/null +++ b/myisam/rt_mbr.c @@ -0,0 +1,758 @@ +/* Copyright (C) 2000 MySQL AB & Ramil Kalimullin & MySQL Finland AB + & TCX DataKonsult AB + + 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; either version 2 of the License, or + (at your option) any later version. + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#include "myisamdef.h" + +#include "rt_index.h" +#include "rt_mbr.h" + +#define INTERSECT_CMP(amin, amax, bmin, bmax) ((amin > bmax) || (bmin > amax)) +#define CONTAIN_CMP(amin, amax, bmin, bmax) ((bmin > amin) || (bmax < amax)) +#define WITHIN_CMP(amin, amax, bmin, bmax) ((amin > bmin) || (amax < bmax)) +#define DISJOINT_CMP(amin, amax, bmin, bmax) ((amin <= bmax) && (bmin <= amax)) +#define EQUAL_CMP(amix, amax, bmin, bmax) ((amix != bmin) || (amax != bmax)) + +#define FCMP(A, B) ((int)(A) - (int)(B)) +#define p_inc(A, B, X) {A += X; B += X;} + +#define RT_CMP(nextflag) \ + if (nextflag & MBR_INTERSECT) \ + { \ + if (INTERSECT_CMP(amin, amax, bmin, bmax)) \ + return 1; \ + } \ + else if (nextflag & MBR_CONTAIN) \ + { \ + if (CONTAIN_CMP(amin, amax, bmin, bmax)) \ + return 1; \ + } \ + else if (nextflag & MBR_WITHIN) \ + { \ + if (WITHIN_CMP(amin, amax, bmin, bmax)) \ + return 1; \ + } \ + else if (nextflag & MBR_EQUAL) \ + { \ + if (EQUAL_CMP(amin, amax, bmin, bmax)) \ + return 1; \ + } \ + else /* if (nextflag & MBR_DISJOINT) */ \ + { \ + if (DISJOINT_CMP(amin, amax, bmin, bmax)) \ + return 1; \ + } + +#define RT_CMP_KORR(type, korr_func, len, nextflag) \ +{ \ + type amin, amax, bmin, bmax; \ + amin = korr_func(a); \ + bmin = korr_func(b); \ + p_inc(a, b, len); \ + amax = korr_func(a); \ + bmax = korr_func(b); \ + RT_CMP(nextflag); \ + p_inc(a, b, len); \ + break; \ +} + +#define RT_CMP_GET(type, get_func, len, nextflag) \ +{ \ + type amin, amax, bmin, bmax; \ + get_func(amin, a); \ + get_func(bmin, b); \ + p_inc(a, b, len); \ + get_func(amax, a); \ + get_func(bmax, b); \ + RT_CMP(nextflag); \ + p_inc(a, b, len); \ + break; \ +} + +/* + Compares two keys a and b depending on nextflag + nextflag can contain these flags: + MBR_INTERSECT(a,b) a overlaps b + MBR_CONTAIN(a,b) a contains b + MBR_DISJOINT(a,b) a disjoint b + MBR_WITHIN(a,b) a within b + MBR_EQUAL(a,b) All coordinates of MBRs are equal + MBR_DATA(a,b) Data reference is the same + Returns 0 on success. +*/ +int rtree_key_cmp(MI_KEYSEG *keyseg, uchar *b, uchar *a, uint key_length, + uint nextflag) +{ + for (; (int) key_length > 0; keyseg += 2 ) + { + key_length -= keyseg->length * 2; + + switch ((enum ha_base_keytype) keyseg->type) { + case HA_KEYTYPE_TEXT: + case HA_KEYTYPE_BINARY: + case HA_KEYTYPE_VARTEXT: + case HA_KEYTYPE_VARBINARY: + case HA_KEYTYPE_NUM: + default: + return 1; + break; + case HA_KEYTYPE_INT8: + { + int amin,amax,bmin,bmax; + amin = (int)*((signed char *)a); + bmin = (int)*((signed char *)b); + p_inc(a, b, 1); + amax = (int)*((signed char *)a); + bmax = (int)*((signed char *)b); + RT_CMP(nextflag); + p_inc(a, b, 1); + break; + } + case HA_KEYTYPE_SHORT_INT: + RT_CMP_KORR(int16, mi_sint2korr, 2, nextflag); + case HA_KEYTYPE_USHORT_INT: + RT_CMP_KORR(uint16, mi_uint2korr, 2, nextflag); + case HA_KEYTYPE_INT24: + RT_CMP_KORR(int32, mi_sint3korr, 3, nextflag); + case HA_KEYTYPE_UINT24: + RT_CMP_KORR(uint32, mi_uint3korr, 3, nextflag); + case HA_KEYTYPE_LONG_INT: + RT_CMP_KORR(int32, mi_sint4korr, 4, nextflag); + case HA_KEYTYPE_ULONG_INT: + RT_CMP_KORR(uint32, mi_uint4korr, 4, nextflag); +#ifdef HAVE_LONG_LONG + case HA_KEYTYPE_LONGLONG: + RT_CMP_KORR(longlong, mi_sint8korr, 8, nextflag) + case HA_KEYTYPE_ULONGLONG: + RT_CMP_KORR(ulonglong, mi_uint8korr, 8, nextflag) +#endif + case HA_KEYTYPE_FLOAT: + RT_CMP_GET(float, mi_float4get, 4, nextflag); + case HA_KEYTYPE_DOUBLE: + RT_CMP_GET(double, mi_float8get, 8, nextflag); + case HA_KEYTYPE_END: + goto end; + } + } + +end: + if (nextflag & MBR_DATA) + { + uchar *end = a + keyseg->length; + do + { + if (*a++ != *b++) + return FCMP(a[-1], b[-1]); + } while (a != end); + } + return 0; +} + +#define RT_VOL_KORR(type, korr_func, len) \ +{ \ + type amin, amax; \ + amin = korr_func(a); \ + a += len; \ + amax = korr_func(a); \ + a += len; \ + res *= ((double)amax - (double)amin); \ + break; \ +} + +#define RT_VOL_GET(type, get_func, len) \ +{ \ + type amin, amax; \ + get_func(amin, a); \ + a += len; \ + get_func(amax, a); \ + a += len; \ + res *= ((double)amax - (double)amin); \ + break; \ +} + +/* + Calculates rectangle volume +*/ +double rtree_rect_volume(MI_KEYSEG *keyseg, uchar *a, uint key_length) +{ + double res = 1; + for (; (int)key_length > 0; keyseg += 2) + { + key_length -= keyseg->length * 2; + + switch ((enum ha_base_keytype) keyseg->type) { + case HA_KEYTYPE_TEXT: + case HA_KEYTYPE_BINARY: + case HA_KEYTYPE_VARTEXT: + case HA_KEYTYPE_VARBINARY: + case HA_KEYTYPE_NUM: + default: + return 1; + break; + case HA_KEYTYPE_INT8: + { + int amin, amax; + amin = (int)*((signed char *)a); + a += 1; + amax = (int)*((signed char *)a); + a += 1; + res *= ((double)amax - (double)amin); + break; + } + case HA_KEYTYPE_SHORT_INT: + RT_VOL_KORR(int16, mi_sint2korr, 2); + case HA_KEYTYPE_USHORT_INT: + RT_VOL_KORR(uint16, mi_uint2korr, 2); + case HA_KEYTYPE_INT24: + RT_VOL_KORR(int32, mi_sint3korr, 3); + case HA_KEYTYPE_UINT24: + RT_VOL_KORR(uint32, mi_uint3korr, 3); + case HA_KEYTYPE_LONG_INT: + RT_VOL_KORR(int32, mi_sint4korr, 4); + case HA_KEYTYPE_ULONG_INT: + RT_VOL_KORR(uint32, mi_uint4korr, 4); +#ifdef HAVE_LONG_LONG + case HA_KEYTYPE_LONGLONG: + RT_VOL_KORR(longlong, mi_sint8korr, 8); + case HA_KEYTYPE_ULONGLONG: + RT_VOL_KORR(ulonglong, mi_uint8korr, 8); +#endif + case HA_KEYTYPE_FLOAT: + RT_VOL_GET(float, mi_float4get, 4); + case HA_KEYTYPE_DOUBLE: + RT_VOL_GET(double, mi_float8get, 8); + case HA_KEYTYPE_END: + key_length = 0; + break; + } + } + return res; +} + +#define RT_D_MBR_KORR(type, korr_func, len) \ +{ \ + type amin, amax; \ + amin = korr_func(a); \ + a += len; \ + amax = korr_func(a); \ + a += len; \ + *res++ = (double)amin; \ + *res++ = (double)amax; \ + break; \ +} + +#define RT_D_MBR_GET(type, get_func, len) \ +{ \ + type amin, amax; \ + get_func(amin, a); \ + a += len; \ + get_func(amax, a); \ + a += len; \ + *res++ = (double)amin; \ + *res++ = (double)amax; \ + break; \ +} + +/* + Creates an MBR as an array of doubles. +*/ +int rtree_d_mbr(MI_KEYSEG *keyseg, uchar *a, uint key_length, double *res) +{ + for (; (int)key_length > 0; keyseg += 2) + { + key_length -= keyseg->length * 2; + + switch ((enum ha_base_keytype) keyseg->type) { + case HA_KEYTYPE_TEXT: + case HA_KEYTYPE_BINARY: + case HA_KEYTYPE_VARTEXT: + case HA_KEYTYPE_VARBINARY: + case HA_KEYTYPE_NUM: + default: + return 1; + break; + case HA_KEYTYPE_INT8: + { + int amin, amax; + amin = (int)*((signed char *)a); + a += 1; + amax = (int)*((signed char *)a); + a += 1; + *res++ = (double)amin; + *res++ = (double)amax; + break; + } + case HA_KEYTYPE_SHORT_INT: + RT_D_MBR_KORR(int16, mi_sint2korr, 2); + case HA_KEYTYPE_USHORT_INT: + RT_D_MBR_KORR(uint16, mi_uint2korr, 2); + case HA_KEYTYPE_INT24: + RT_D_MBR_KORR(int32, mi_sint3korr, 3); + case HA_KEYTYPE_UINT24: + RT_D_MBR_KORR(uint32, mi_uint3korr, 3); + case HA_KEYTYPE_LONG_INT: + RT_D_MBR_KORR(int32, mi_sint4korr, 4); + case HA_KEYTYPE_ULONG_INT: + RT_D_MBR_KORR(uint32, mi_uint4korr, 4); +#ifdef HAVE_LONG_LONG + case HA_KEYTYPE_LONGLONG: + RT_D_MBR_KORR(longlong, mi_sint8korr, 8); + case HA_KEYTYPE_ULONGLONG: + RT_D_MBR_KORR(ulonglong, mi_uint8korr, 8); +#endif + case HA_KEYTYPE_FLOAT: + RT_D_MBR_GET(float, mi_float4get, 4); + case HA_KEYTYPE_DOUBLE: + RT_D_MBR_GET(double, mi_float8get, 8); + case HA_KEYTYPE_END: + key_length = 0; + break; + } + } + return 0; +} + +#define RT_COMB_KORR(type, korr_func, store_func, len) \ +{ \ + type amin, amax, bmin, bmax; \ + amin = korr_func(a); \ + bmin = korr_func(b); \ + p_inc(a, b, len); \ + amax = korr_func(a); \ + bmax = korr_func(b); \ + p_inc(a, b, len); \ + amin = min(amin, bmin); \ + amax = max(amax, bmax); \ + store_func(c, amin); \ + c += len; \ + store_func(c, amax); \ + c += len; \ + break; \ +} + +#define RT_COMB_GET(type, get_func, store_func, len) \ +{ \ + type amin, amax, bmin, bmax; \ + get_func(amin, a); \ + get_func(bmin, b); \ + p_inc(a, b, len); \ + get_func(amax, a); \ + get_func(bmax, b); \ + p_inc(a, b, len); \ + amin = min(amin, bmin); \ + amax = max(amax, bmax); \ + store_func(c, amin); \ + c += len; \ + store_func(c, amax); \ + c += len; \ + break; \ +} + +/* +Creates common minimal bounding rectungle +for two input rectagnles a and b +Result is written to c +*/ +int rtree_combine_rect(MI_KEYSEG *keyseg, uchar* a, uchar* b, uchar* c, + uint key_length) +{ + + for ( ; (int) key_length > 0 ; keyseg += 2) + { + key_length -= keyseg->length * 2; + + switch ((enum ha_base_keytype) keyseg->type) { + case HA_KEYTYPE_TEXT: + case HA_KEYTYPE_BINARY: + case HA_KEYTYPE_VARTEXT: + case HA_KEYTYPE_VARBINARY: + case HA_KEYTYPE_NUM: + default: + return 1; + break; + case HA_KEYTYPE_INT8: + { + int amin, amax, bmin, bmax; + amin = (int)*((signed char *)a); + bmin = (int)*((signed char *)b); + p_inc(a, b, 1); + amax = (int)*((signed char *)a); + bmax = (int)*((signed char *)b); + p_inc(a, b, 1); + amin = min(amin, bmin); + amax = max(amax, bmax); + *((signed char*)c) = amin; + c += 1; + *((signed char*)c) = amax; + c += 1; + break; + } + case HA_KEYTYPE_SHORT_INT: + RT_COMB_KORR(int16, mi_sint2korr, mi_int2store, 2); + case HA_KEYTYPE_USHORT_INT: + RT_COMB_KORR(uint16, mi_uint2korr, mi_int2store, 2); + case HA_KEYTYPE_INT24: + RT_COMB_KORR(int32, mi_sint3korr, mi_int3store, 3); + case HA_KEYTYPE_UINT24: + RT_COMB_KORR(uint32, mi_uint3korr, mi_int3store, 3); + case HA_KEYTYPE_LONG_INT: + RT_COMB_KORR(int32, mi_sint4korr, mi_int4store, 4); + case HA_KEYTYPE_ULONG_INT: + RT_COMB_KORR(uint32, mi_uint4korr, mi_int4store, 4); +#ifdef HAVE_LONG_LONG + case HA_KEYTYPE_LONGLONG: + RT_COMB_KORR(longlong, mi_sint8korr, mi_int8store, 8); + case HA_KEYTYPE_ULONGLONG: + RT_COMB_KORR(ulonglong, mi_uint8korr, mi_int8store, 8); +#endif + case HA_KEYTYPE_FLOAT: + RT_COMB_GET(float, mi_float4get, mi_float4store, 4); + case HA_KEYTYPE_DOUBLE: + RT_COMB_GET(double, mi_float8get, mi_float8store, 8); + case HA_KEYTYPE_END: + return 0; + } + } + return 0; +} + +#define RT_OVL_AREA_KORR(type, korr_func, len) \ +{ \ + type amin, amax, bmin, bmax; \ + amin = korr_func(a); \ + bmin = korr_func(b); \ + p_inc(a, b, len); \ + amax = korr_func(a); \ + bmax = korr_func(b); \ + p_inc(a, b, len); \ + amin = max(amin, bmin); \ + amax = min(amax, bmax); \ + if (amin >= amax) \ + return 0; \ + res *= amax - amin; \ + break; \ +} + +#define RT_OVL_AREA_GET(type, get_func, len) \ +{ \ + type amin, amax, bmin, bmax; \ + get_func(amin, a); \ + get_func(bmin, b); \ + p_inc(a, b, len); \ + get_func(amax, a); \ + get_func(bmax, b); \ + p_inc(a, b, len); \ + amin = max(amin, bmin); \ + amax = min(amax, bmax); \ + if (amin >= amax) \ + return 0; \ + res *= amax - amin; \ + break; \ +} + +/* +Calculates overlapping area of two MBRs a & b +*/ +double rtree_overlapping_area(MI_KEYSEG *keyseg, uchar* a, uchar* b, + uint key_length) +{ + double res = 1; + for (; (int) key_length > 0 ; keyseg += 2) + { + key_length -= keyseg->length * 2; + + switch ((enum ha_base_keytype) keyseg->type) { + case HA_KEYTYPE_TEXT: + case HA_KEYTYPE_BINARY: + case HA_KEYTYPE_VARTEXT: + case HA_KEYTYPE_VARBINARY: + case HA_KEYTYPE_NUM: + default: + return -1; + break; + case HA_KEYTYPE_INT8: + { + int amin, amax, bmin, bmax; + amin = (int)*((signed char *)a); + bmin = (int)*((signed char *)b); + p_inc(a, b, 1); + amax = (int)*((signed char *)a); + bmax = (int)*((signed char *)b); + p_inc(a, b, 1); + amin = max(amin, bmin); + amax = min(amax, bmax); + if (amin >= amax) + return 0; + res *= amax - amin; + break; + } + case HA_KEYTYPE_SHORT_INT: + RT_OVL_AREA_KORR(int16, mi_sint2korr, 2); + case HA_KEYTYPE_USHORT_INT: + RT_OVL_AREA_KORR(uint16, mi_uint2korr, 2); + case HA_KEYTYPE_INT24: + RT_OVL_AREA_KORR(int32, mi_sint3korr, 3); + case HA_KEYTYPE_UINT24: + RT_OVL_AREA_KORR(uint32, mi_uint3korr, 3); + case HA_KEYTYPE_LONG_INT: + RT_OVL_AREA_KORR(int32, mi_sint4korr, 4); + case HA_KEYTYPE_ULONG_INT: + RT_OVL_AREA_KORR(uint32, mi_uint4korr, 4); +#ifdef HAVE_LONG_LONG + case HA_KEYTYPE_LONGLONG: + RT_OVL_AREA_KORR(longlong, mi_sint8korr, 8); + case HA_KEYTYPE_ULONGLONG: + RT_OVL_AREA_KORR(ulonglong, mi_uint8korr, 8); +#endif + case HA_KEYTYPE_FLOAT: + RT_OVL_AREA_GET(float, mi_float4get, 4); + case HA_KEYTYPE_DOUBLE: + RT_OVL_AREA_GET(double, mi_float8get, 8); + case HA_KEYTYPE_END: + return res; + } + } + return res; +} + +#define RT_AREA_INC_KORR(type, korr_func, len) \ +{ \ + type amin, amax, bmin, bmax; \ + amin = korr_func(a); \ + bmin = korr_func(b); \ + p_inc(a, b, len); \ + amax = korr_func(a); \ + bmax = korr_func(b); \ + p_inc(a, b, len); \ + a_area *= (((double)amax) - ((double)amin)); \ + *ab_area *= ((double)max(amax, bmax) - (double)min(amin, bmin)); \ + break; \ +} + +#define RT_AREA_INC_GET(type, get_func, len)\ +{\ + type amin, amax, bmin, bmax; \ + get_func(amin, a); \ + get_func(bmin, b); \ + p_inc(a, b, len); \ + get_func(amax, a); \ + get_func(bmax, b); \ + p_inc(a, b, len); \ + a_area *= (((double)amax) - ((double)amin)); \ + *ab_area *= ((double)max(amax, bmax) - (double)min(amin, bmin)); \ + break; \ +} + +/* +Calculates MBR_AREA(a+b) - MBR_AREA(a) +*/ +double rtree_area_increase(MI_KEYSEG *keyseg, uchar* a, uchar* b, + uint key_length, double *ab_area) +{ + double a_area = 1; + + *ab_area = 1; + for (; (int)key_length > 0; keyseg += 2) + { + key_length -= keyseg->length * 2; + + /* Handle NULL part */ + if (keyseg->null_bit) + { + return -1; + } + + switch ((enum ha_base_keytype) keyseg->type) { + case HA_KEYTYPE_TEXT: + case HA_KEYTYPE_BINARY: + case HA_KEYTYPE_VARTEXT: + case HA_KEYTYPE_VARBINARY: + case HA_KEYTYPE_NUM: + default: + return 1; + break; + case HA_KEYTYPE_INT8: + { + int amin, amax, bmin, bmax; + amin = (int)*((signed char *)a); + bmin = (int)*((signed char *)b); + p_inc(a, b, 1); + amax = (int)*((signed char *)a); + bmax = (int)*((signed char *)b); + p_inc(a, b, 1); + a_area *= (((double)amax) - ((double)amin)); + *ab_area *= ((double)max(amax, bmax) - (double)min(amin, bmin)); + break; + } + case HA_KEYTYPE_SHORT_INT: + RT_AREA_INC_KORR(int16, mi_sint2korr, 2); + case HA_KEYTYPE_USHORT_INT: + RT_AREA_INC_KORR(uint16, mi_uint2korr, 2); + case HA_KEYTYPE_INT24: + RT_AREA_INC_KORR(int32, mi_sint3korr, 3); + case HA_KEYTYPE_UINT24: + RT_AREA_INC_KORR(int32, mi_uint3korr, 3); + case HA_KEYTYPE_LONG_INT: + RT_AREA_INC_KORR(int32, mi_sint4korr, 4); + case HA_KEYTYPE_ULONG_INT: + RT_AREA_INC_KORR(uint32, mi_uint4korr, 4); +#ifdef HAVE_LONG_LONG + case HA_KEYTYPE_LONGLONG: + RT_AREA_INC_KORR(longlong, mi_sint8korr, 8); + case HA_KEYTYPE_ULONGLONG: + RT_AREA_INC_KORR(ulonglong, mi_uint8korr, 8); +#endif + case HA_KEYTYPE_FLOAT: + RT_AREA_INC_GET(float, mi_float4get, 4); + case HA_KEYTYPE_DOUBLE: + RT_AREA_INC_GET(double, mi_float8get, 8); + case HA_KEYTYPE_END: + return *ab_area - a_area; + } + } + return *ab_area - a_area; +} + +#define RT_PAGE_MBR_KORR(type, korr_func, store_func, len) \ +{ \ + type amin, amax, bmin, bmax; \ + amin = korr_func(k + inc); \ + amax = korr_func(k + inc + len); \ + k = rt_PAGE_NEXT_KEY(k, k_len, nod_flag); \ + for (; k < last; k = rt_PAGE_NEXT_KEY(k, k_len, nod_flag)) \ +{ \ + bmin = korr_func(k + inc); \ + bmax = korr_func(k + inc + len); \ + if (amin > bmin) \ + amin = bmin; \ + if (amax < bmax) \ + amax = bmax; \ +} \ + store_func(c, amin); \ + c += len; \ + store_func(c, amax); \ + c += len; \ + inc += 2 * len; \ + break; \ +} + +#define RT_PAGE_MBR_GET(type, get_func, store_func, len) \ +{ \ + type amin, amax, bmin, bmax; \ + get_func(amin, k + inc); \ + get_func(amax, k + inc + len); \ + k = rt_PAGE_NEXT_KEY(k, k_len, nod_flag); \ + for (; k < last; k = rt_PAGE_NEXT_KEY(k, k_len, nod_flag)) \ +{ \ + get_func(bmin, k + inc); \ + get_func(bmax, k + inc + len); \ + if (amin > bmin) \ + amin = bmin; \ + if (amax < bmax) \ + amax = bmax; \ +} \ + store_func(c, amin); \ + c += len; \ + store_func(c, amax); \ + c += len; \ + inc += 2 * len; \ + break; \ +} + +/* +Calculates key page total MBR = MBR(key1) + MBR(key2) + ... +*/ +int rtree_page_mbr(MI_INFO *info, MI_KEYSEG *keyseg, uchar *page_buf, + uchar *c, uint key_length) +{ + uint inc = 0; + uint k_len = key_length; + uint nod_flag = mi_test_if_nod(page_buf); + uchar *k; + uchar *last = rt_PAGE_END(page_buf); + + for (; (int)key_length > 0; keyseg += 2) + { + key_length -= keyseg->length * 2; + + /* Handle NULL part */ + if (keyseg->null_bit) + { + return 1; + } + + k = rt_PAGE_FIRST_KEY(page_buf, nod_flag); + + switch ((enum ha_base_keytype) keyseg->type) { + case HA_KEYTYPE_TEXT: + case HA_KEYTYPE_BINARY: + case HA_KEYTYPE_VARTEXT: + case HA_KEYTYPE_VARBINARY: + case HA_KEYTYPE_NUM: + default: + return 1; + break; + case HA_KEYTYPE_INT8: + { + int amin, amax, bmin, bmax; + amin = (int)*((signed char *)(k + inc)); + amax = (int)*((signed char *)(k + inc + 1)); + k = rt_PAGE_NEXT_KEY(k, k_len, nod_flag); + for (; k < last; k = rt_PAGE_NEXT_KEY(k, k_len, nod_flag)) + { + bmin = (int)*((signed char *)(k + inc)); + bmax = (int)*((signed char *)(k + inc + 1)); + + if (amin > bmin) + amin = bmin; + if (amax < bmax) + amax = bmax; + } + *((signed char*)c) = amin; + c += 1; + *((signed char*)c) = amax; + c += 1; + inc += 1 * 2; + break; + } + case HA_KEYTYPE_SHORT_INT: + RT_PAGE_MBR_KORR(int16, mi_sint2korr, mi_int2store, 2); + case HA_KEYTYPE_USHORT_INT: + RT_PAGE_MBR_KORR(uint16, mi_uint2korr, mi_int2store, 2); + case HA_KEYTYPE_INT24: + RT_PAGE_MBR_KORR(int32, mi_sint3korr, mi_int3store, 3); + case HA_KEYTYPE_UINT24: + RT_PAGE_MBR_KORR(uint32, mi_uint3korr, mi_int3store, 3); + case HA_KEYTYPE_LONG_INT: + RT_PAGE_MBR_KORR(int32, mi_sint4korr, mi_int4store, 4); + case HA_KEYTYPE_ULONG_INT: + RT_PAGE_MBR_KORR(uint32, mi_uint4korr, mi_int4store, 4); +#ifdef HAVE_LONG_LONG + case HA_KEYTYPE_LONGLONG: + RT_PAGE_MBR_KORR(longlong, mi_sint8korr, mi_int8store, 8); + case HA_KEYTYPE_ULONGLONG: + RT_PAGE_MBR_KORR(ulonglong, mi_uint8korr, mi_int8store, 8); +#endif + case HA_KEYTYPE_FLOAT: + RT_PAGE_MBR_GET(float, mi_float4get, mi_float4store, 4); + case HA_KEYTYPE_DOUBLE: + RT_PAGE_MBR_GET(double, mi_float8get, mi_float8store, 8); + case HA_KEYTYPE_END: + return 0; + } + } + return 0; +} diff --git a/myisam/rt_mbr.h b/myisam/rt_mbr.h new file mode 100644 index 00000000000..87af3b06c2e --- /dev/null +++ b/myisam/rt_mbr.h @@ -0,0 +1,33 @@ +/* Copyright (C) 2000 MySQL AB & Ramil Kalimullin & MySQL Finland AB + & TCX DataKonsult AB + + 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; either version 2 of the License, or + (at your option) any later version. + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _rt_mbr_h +#define _rt_mbr_h + +int rtree_key_cmp(MI_KEYSEG *keyseg, uchar *a, uchar *b, uint key_length, + uint nextflag); +int rtree_combine_rect(MI_KEYSEG *keyseg,uchar *, uchar *, uchar*, + uint key_length); +double rtree_rect_volume(MI_KEYSEG *keyseg, uchar*, uint key_length); +int rtree_d_mbr(MI_KEYSEG *keyseg, uchar *a, uint key_length, double *res); +double rtree_overlapping_area(MI_KEYSEG *keyseg, uchar *a, uchar *b, + uint key_length); +double rtree_area_increase(MI_KEYSEG *keyseg, uchar *a, uchar *b, + uint key_length, double *ab_area); +int rtree_page_mbr(MI_INFO *info, MI_KEYSEG *keyseg, uchar *page_buf, + uchar* c, uint key_length); +#endif /* _rt_mbr_h */ diff --git a/myisam/rt_split.c b/myisam/rt_split.c new file mode 100644 index 00000000000..3363bbe2d9b --- /dev/null +++ b/myisam/rt_split.c @@ -0,0 +1,343 @@ +/* Copyright (C) 2000 MySQL AB & Alexey Botchkov & MySQL Finland AB + & TCX DataKonsult AB + + 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; either version 2 of the License, or + (at your option) any later version. + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#include "myisamdef.h" + +#include "rt_index.h" +#include "rt_key.h" +#include "rt_mbr.h" + +typedef struct +{ + double square; + int n_node; + uchar *key; + double *coords; +} SplitStruct; + +inline static double *reserve_coords(double **d_buffer, int n_dim) +{ + double *coords = *d_buffer; + (*d_buffer) += n_dim * 2; + return coords; +} + +static void mbr_join(double *a, const double *b, int n_dim) +{ + double *end = a + n_dim * 2; + do + { + if (a[0] > b[0]) + a[0] = b[0]; + + if (a[1] < b[1]) + a[1] = b[1]; + + a += 2; + b += 2; + }while (a != end); +} + +/* +Counts the square of mbr which is a join of a and b +*/ +static double mbr_join_square(const double *a, const double *b, int n_dim) +{ + const double *end = a + n_dim * 2; + double square = 1.0; + do + { + square *= + ((a[1] < b[1]) ? b[1] : a[1]) - ((a[0] > b[0]) ? b[0] : a[0]); + + a += 2; + b += 2; + }while (a != end); + + return square; +} + +static double count_square(const double *a, int n_dim) +{ + const double *end = a + n_dim * 2; + double square = 1.0; + do + { + square *= a[1] - a[0]; + a += 2; + }while (a != end); + return square; +} + +inline static void copy_coords(double *dst, const double *src, int n_dim) +{ + memcpy(dst, src, sizeof(double) * (n_dim * 2)); +} + +/* +Select two nodes to collect group upon +*/ +static void pick_seeds(SplitStruct *node, int n_entries, + SplitStruct **seed_a, SplitStruct **seed_b, int n_dim) +{ + SplitStruct *cur1; + SplitStruct *lim1 = node + (n_entries - 1); + SplitStruct *cur2; + SplitStruct *lim2 = node + n_entries; + + double max_d = -DBL_MAX; + double d; + + for (cur1 = node; cur1 < lim1; ++cur1) + { + for (cur2=cur1 + 1; cur2 < lim2; ++cur2) + { + + d = mbr_join_square(cur1->coords, cur2->coords, n_dim) - cur1->square - + cur2->square; + if (d > max_d) + { + max_d = d; + *seed_a = cur1; + *seed_b = cur2; + } + } + } +} + +/* +Select next node and group where to add +*/ +static void pick_next(SplitStruct *node, int n_entries, double *g1, double *g2, + SplitStruct **choice, int *n_group, int n_dim) +{ + SplitStruct *cur = node; + SplitStruct *end = node + n_entries; + + double max_diff = -DBL_MAX; + + for (; curn_node) + { + continue; + } + + diff = mbr_join_square(g1, cur->coords, n_dim) - + mbr_join_square(g2, cur->coords, n_dim); + + abs_diff = fabs(diff); + if (abs_diff > max_diff) + { + max_diff = abs_diff; + *n_group = 1 + (diff > 0); + *choice = cur; + } + } +} + +/* +Mark not-in-group entries as n_group +*/ +static void mark_all_entries(SplitStruct *node, int n_entries, int n_group) +{ + SplitStruct *cur = node; + SplitStruct *end = node + n_entries; + for (; curn_node) + { + continue; + } + cur->n_node = n_group; + } +} + +static int split_rtree_node(SplitStruct *node, int n_entries, + int all_size, /* Total key's size */ + int key_size, + int min_size, /* Minimal group size */ + int size1, int size2 /* initial group sizes */, + double **d_buffer, int n_dim) +{ + SplitStruct *cur; + SplitStruct *a; + SplitStruct *b; + double *g1 = reserve_coords(d_buffer, n_dim); + double *g2 = reserve_coords(d_buffer, n_dim); + SplitStruct *next; + int next_node; + int i; + SplitStruct *end = node + n_entries; + + if (all_size < min_size * 2) + { + return 1; + } + + cur = node; + for (; cursquare = count_square(cur->coords, n_dim); + cur->n_node = 0; + } + + pick_seeds(node, n_entries, &a, &b, n_dim); + a->n_node = 1; + b->n_node = 2; + + + copy_coords(g1, a->coords, n_dim); + size1 += key_size; + copy_coords(g2, b->coords, n_dim); + size2 += key_size; + + + for (i=n_entries - 2; i>0; --i) + { + if (all_size - (size2 + key_size) < min_size) /* Can't write into group 2 */ + { + mark_all_entries(node, n_entries, 1); + break; + } + + if (all_size - (size1 + key_size) < min_size) /* Can't write into group 1 */ + { + mark_all_entries(node, n_entries, 2); + break; + } + + pick_next(node, n_entries, g1, g2, &next, &next_node, n_dim); + if (next_node == 1) + { + size1 += key_size; + mbr_join(g1, next->coords, n_dim); + } + else + { + size2 += key_size; + mbr_join(g2, next->coords, n_dim); + } + next->n_node = next_node; + } + + return 0; +} + +int rtree_split_page(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *page, uchar *key, + uint key_length, my_off_t *new_page_offs) +{ + int n1, n2; /* Number of items in groups */ + + SplitStruct *task; + SplitStruct *cur; + SplitStruct *stop; + double *coord_buf; + double *next_coord; + double *old_coord; + int n_dim; + uchar *source_cur, *cur1, *cur2; + uchar *new_page; + int err_code = 0; + + uint nod_flag = mi_test_if_nod(page); + uint full_length = key_length + (nod_flag ? nod_flag : + info->s->base.rec_reflength); + + int max_keys = (mi_getint(page)-2) / (full_length); + + n_dim = (keyinfo->keysegs-1) / 2; + + { + int coord_buf_size = n_dim * 2 * sizeof(double) * (max_keys + 1 + 4); + coord_buf = + my_alloca(coord_buf_size + sizeof(SplitStruct) * (max_keys + 1)); + + task = (SplitStruct *)(((char *)coord_buf) + coord_buf_size); + } + next_coord = coord_buf; + + stop = task + max_keys; + source_cur = rt_PAGE_FIRST_KEY(page, nod_flag); + + for (cur = task; cur < stop; ++cur, source_cur = rt_PAGE_NEXT_KEY(source_cur, + key_length, nod_flag)) + { + cur->coords = reserve_coords(&next_coord, n_dim); + cur->key = source_cur; + rtree_d_mbr(keyinfo->seg, source_cur, key_length, cur->coords); + } + + cur->coords = reserve_coords(&next_coord, n_dim); + rtree_d_mbr(keyinfo->seg, key, key_length, cur->coords); + cur->key = key; + + old_coord = next_coord; + + if (split_rtree_node(task, max_keys + 1, + mi_getint(page) + full_length + 2, full_length, + rt_PAGE_MIN_SIZE(keyinfo->block_length), + 2, 2, &next_coord, n_dim)) + { + err_code = 1; + goto split_err; + } + + if (!(new_page = (uchar*)my_alloca((uint)keyinfo->block_length))) + return -1; + + stop = task + (max_keys + 1); + cur1 = rt_PAGE_FIRST_KEY(page, nod_flag); + cur2 = rt_PAGE_FIRST_KEY(new_page, nod_flag); + + n1 = 0; + n2 = 0; + for (cur = task; cur < stop; ++cur) + { + uchar *to; + if (cur->n_node == 1) + { + to = cur1; + cur1 = rt_PAGE_NEXT_KEY(cur1, key_length, nod_flag); + ++n1; + } + else + { + to = cur2; + cur2 = rt_PAGE_NEXT_KEY(cur2, key_length, nod_flag); + ++n2; + } + memcpy(to - nod_flag, cur->key - nod_flag, full_length); + } + + mi_putint(page, 2 + n1 * full_length, nod_flag); + mi_putint(new_page, 2 + n2 * full_length, nod_flag); + + *new_page_offs=_mi_new(info, keyinfo); + _mi_write_keypage(info, keyinfo, *new_page_offs, new_page); + my_afree((byte*)new_page); + +split_err: + my_afree((byte*)coord_buf); + return err_code; +} + + + diff --git a/myisam/rt_test.c b/myisam/rt_test.c new file mode 100644 index 00000000000..b18ec1fc857 --- /dev/null +++ b/myisam/rt_test.c @@ -0,0 +1,417 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + 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; either version 2 of the License, or + (at your option) any later version. + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* Testing of the basic functions of a MyISAM rtree table */ +/* Written by Alex Barkov who has a shared copyright to this code */ + + +#include "myisam.h" +#include "rt_index.h" + +#define MAX_REC_LENGTH 1024 +#define ndims 2 +#define KEYALG HA_KEY_ALG_RTREE + +static int read_with_pos(MI_INFO * file, int silent); +static void create_record(char *record,uint rownr); +static void create_record1(char *record,uint rownr); +static void print_record(char * record,my_off_t offs,const char * tail); +static int run_test(const char *filename); + + +int main(int argc,char *argv[]) +{ + MY_INIT(argv[0]); + exit(run_test("rt_test")); +} + + + +int run_test(const char *filename) +{ + MI_INFO *file; + MI_UNIQUEDEF uniquedef; + MI_CREATE_INFO create_info; + MI_COLUMNDEF recinfo[20]; + MI_KEYDEF keyinfo[20]; + MI_KEYSEG keyseg[20]; + + int silent=0; + int opt_unique=0; + int create_flag=0; + int key_type=HA_KEYTYPE_DOUBLE; + int key_length=8; + int null_fields=0; + int nrecords=30; + int rec_length=0; + int uniques=0; + int i; + int error; + int row_count=0; + char record[MAX_REC_LENGTH]; + char read_record[MAX_REC_LENGTH]; + int upd=10; + ha_rows hrows; + + + + /* Define a column for NULLs and DEL markers*/ + + recinfo[0].type=FIELD_NORMAL; + recinfo[0].length=1; /* For NULL bits */ + rec_length=1; + + + /* Define 2*ndims columns for coordinates*/ + + for (i=1; i<=2*ndims ;i++){ + recinfo[i].type=FIELD_NORMAL; + recinfo[i].length=key_length; + rec_length+=key_length; + } + + + /* Define a key with 2*ndims segments */ + + keyinfo[0].seg=keyseg; + keyinfo[0].keysegs=2*ndims; + keyinfo[0].flag=0; + keyinfo[0].key_alg=KEYALG; + + for (i=0; i<2*ndims; i++){ + keyinfo[0].seg[i].type= key_type; + keyinfo[0].seg[i].flag=0; /* Things like HA_REVERSE_SORT */ + keyinfo[0].seg[i].start= (key_length*i)+1; + keyinfo[0].seg[i].length=key_length; + keyinfo[0].seg[i].null_bit= null_fields ? 2 : 0; + keyinfo[0].seg[i].null_pos=0; + keyinfo[0].seg[i].language=MY_CHARSET_CURRENT; + } + + + if(!silent) + printf("- Creating isam-file\n"); + + bzero((char*) &create_info,sizeof(create_info)); + create_info.max_rows=10000000; + + if (mi_create(filename, + 1, /* keys */ + keyinfo, + 1+2*ndims+opt_unique, /* columns */ + recinfo,uniques,&uniquedef,&create_info,create_flag)) + goto err; + + + + + if(!silent) + printf("- Open isam-file\n"); + + if (!(file=mi_open(filename,2,HA_OPEN_ABORT_IF_LOCKED))) + goto err; + + + if (!silent) + printf("- Writing key:s\n"); + + for (i=0; i "); + print_record(record,mi_position(file),"\n"); + error=mi_update(file,read_record,record); + if(error) + { + printf("pos: %2d mi_update: %3d errno: %3d\n",i,error,my_errno); + goto err; + } + } + +*/ + + + if((error=read_with_pos(file,silent))) + goto err; + + + + if (!silent) + printf("- Test mi_rkey then a sequence of mi_rnext_same\n"); + + create_record(record, nrecords*4/5); + print_record(record,0," search for\n"); + + if ((error=mi_rkey(file,read_record,0,record+1,0,HA_READ_MBR_INTERSECT))) + { + printf("mi_rkey: %3d errno: %3d\n",error,my_errno); + goto err; + } + print_record(read_record,mi_position(file)," mi_rkey\n"); + row_count=1; + + + do { + if((error=mi_rnext_same(file,read_record))) + { + if(error==HA_ERR_END_OF_FILE) + break; + printf("mi_next: %3d errno: %3d\n",error,my_errno); + goto err; + } + print_record(read_record,mi_position(file)," mi_rnext_same\n"); + row_count++; + }while(1); + printf(" %d rows\n",row_count); + + + + + + + if (!silent) + printf("- Test mi_rfirst then a sequence of mi_rnext\n"); + + error=mi_rfirst(file,read_record,0); + if (error) + { + printf("mi_rfirst: %3d errno: %3d\n",error,my_errno); + goto err; + } + row_count=1; + print_record(read_record,mi_position(file)," mi_frirst\n"); + + for(i=0;is->keyinfo[keynr]; + uint len = 0; + byte *pos; + uint dlen; + uchar *dptr; + double mbr[SPDIMS * 2]; + uint i; + + keyseg = &keyinfo->seg[-1]; + pos = (byte*)record + keyseg->start; + + dlen = _mi_calc_blob_length(keyseg->bit_start, pos); + memcpy_fixed(&dptr, pos + keyseg->bit_start, sizeof(char*)); + sp_mbr_from_wkb(dptr, dlen, SPDIMS, mbr); + + for (i = 0, keyseg = keyinfo->seg; keyseg->type; keyseg++, i++) + { + uint length = keyseg->length; + + pos = ((byte*)mbr) + keyseg->start; + if (keyseg->flag & HA_SWAP_KEY) + { + pos += length; + while (length--) + { + *key++ = *--pos; + } + } + else + { + memcpy((byte*)key, pos, length); + key += keyseg->length; + } + len += keyseg->length; + } + _mi_dpointer(info, key, filepos); + return len; +} + +/* +Calculate minimal bounding rectangle (mbr) of the spatial object +stored in "well-known binary representation" (wkb) format. +*/ +static int sp_mbr_from_wkb(uchar *wkb, uint size, uint n_dims, double *mbr) +{ + uint i; + + for (i=0; i < n_dims; ++i) + { + mbr[i * 2] = DBL_MAX; + mbr[i * 2 + 1] = -DBL_MAX; + } + + return sp_get_geometry_mbr(&wkb, wkb + size, n_dims, mbr, 1); +} + +/* +Add one point stored in wkb to mbr +*/ +static int sp_add_point_to_mbr(uchar *(*wkb), uchar *end, uint n_dims, + uchar byte_order, double *mbr) +{ + double ord; + double *mbr_end = mbr + n_dims * 2; + + while (mbr < mbr_end) + { + if ((*wkb) > end - 8) + return -1; + float8get(ord, (*wkb)); + (*wkb) += 8; + if (ord < *mbr) + *mbr = ord; + mbr++; + if (ord > *mbr) + *mbr = ord; + mbr++; + } + return 0; +} + +static int sp_get_point_mbr(uchar *(*wkb), uchar *end, uint n_dims, + uchar byte_order, double *mbr) +{ + return sp_add_point_to_mbr(wkb, end, n_dims, byte_order, mbr); +} + +static int sp_get_linestring_mbr(uchar *(*wkb), uchar *end, uint n_dims, + uchar byte_order, double *mbr) +{ + uint n_points; + + n_points = uint4korr(*wkb); + (*wkb) += 4; + for (; n_points > 0; --n_points) + { + /* Add next point to mbr */ + if (sp_add_point_to_mbr(wkb, end, n_dims, byte_order, mbr)) + return -1; + } + return 0; +} + +static int sp_get_polygon_mbr(uchar *(*wkb), uchar *end, uint n_dims, + uchar byte_order, double *mbr) +{ + uint n_linear_rings; + uint n_points; + + n_linear_rings = uint4korr((*wkb)); + (*wkb) += 4; + + for (; n_linear_rings > 0; --n_linear_rings) + { + n_points = uint4korr((*wkb)); + (*wkb) += 4; + for (; n_points > 0; --n_points) + { + /* Add next point to mbr */ + if (sp_add_point_to_mbr(wkb, end, n_dims, byte_order, mbr)) + return -1; + } + } + return 0; +} + +static int sp_get_geometry_mbr(uchar *(*wkb), uchar *end, uint n_dims, + double *mbr, int top) +{ + int res; + uchar byte_order; + uint wkb_type; + + byte_order = *(*wkb); + ++(*wkb); + + wkb_type = uint4korr((*wkb)); + (*wkb) += 4; + + switch ((enum wkbType) wkb_type) + { + case wkbPoint: + res = sp_get_point_mbr(wkb, end, n_dims, byte_order, mbr); + break; + case wkbLineString: + res = sp_get_linestring_mbr(wkb, end, n_dims, byte_order, mbr); + break; + case wkbPolygon: + res = sp_get_polygon_mbr(wkb, end, n_dims, byte_order, mbr); + break; + case wkbMultiPoint: + { + uint n_items; + n_items = uint4korr((*wkb)); + (*wkb) += 4; + for (; n_items > 0; --n_items) + { + byte_order = *(*wkb); + ++(*wkb); + (*wkb) += 4; + if (sp_get_point_mbr(wkb, end, n_dims, byte_order, mbr)) + return -1; + } + res = 0; + break; + } + case wkbMultiLineString: + { + uint n_items; + n_items = uint4korr((*wkb)); + (*wkb) += 4; + for (; n_items > 0; --n_items) + { + byte_order = *(*wkb); + ++(*wkb); + (*wkb) += 4; + if (sp_get_linestring_mbr(wkb, end, n_dims, byte_order, mbr)) + return -1; + } + res = 0; + break; + } + case wkbMultiPolygon: + { + uint n_items; + n_items = uint4korr((*wkb)); + (*wkb) += 4; + for (; n_items > 0; --n_items) + { + byte_order = *(*wkb); + ++(*wkb); + (*wkb) += 4; + if (sp_get_polygon_mbr(wkb, end, n_dims, byte_order, mbr)) + return -1; + } + res = 0; + break; + } + case wkbGeometryCollection: + { + uint n_items; + + if (!top) + return -1; + + n_items = uint4korr((*wkb)); + (*wkb) += 4; + for (; n_items > 0; --n_items) + { + if (sp_get_geometry_mbr(wkb, end, n_dims, mbr, 0)) + return -1; + } + res = 0; + break; + } + default: + res = -1; + } + return res; +} diff --git a/myisam/sp_test.c b/myisam/sp_test.c new file mode 100644 index 00000000000..9fc130eb6de --- /dev/null +++ b/myisam/sp_test.c @@ -0,0 +1,565 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + 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; either version 2 of the License, or + (at your option) any later version. + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* Testing of the basic functions of a MyISAM spatial table */ +/* Written by Alex Barkov, who has a shared copyright to this code */ + +#include "myisam.h" +#include "sp_defs.h" + +#define MAX_REC_LENGTH 1024 +#define KEYALG HA_KEY_ALG_RTREE + +static void create_point(char *record,uint rownr); +static void create_linestring(char *record,uint rownr); +static void print_record(char * record,my_off_t offs,const char * tail); + +static void create_key(char *key,uint rownr); +static void print_key(const char *key,const char * tail); + +static int run_test(const char *filename); +static int read_with_pos(MI_INFO * file, int silent); + +static int rtree_CreatePointWKB(double *ords, uint n_dims, uchar *wkb); +static int rtree_CreateLineStringWKB(double *ords, uint n_dims, uint n_points, uchar *wkb); +static void rtree_PrintWKB(uchar *wkb, uint n_dims); + + +static char blob_key[MAX_REC_LENGTH]; + + +int main(int argc,char *argv[]) +{ + MY_INIT(argv[0]); + exit(run_test("sp_test")); +} + + + +int run_test(const char *filename) +{ + MI_INFO *file; + MI_UNIQUEDEF uniquedef; + MI_CREATE_INFO create_info; + MI_COLUMNDEF recinfo[20]; + MI_KEYDEF keyinfo[20]; + MI_KEYSEG keyseg[20]; + + int silent=0; + int create_flag=0; + int null_fields=0; + int nrecords=30; + int uniques=0; + int i; + int error; + int row_count=0; + char record[MAX_REC_LENGTH]; + char key[MAX_REC_LENGTH]; + char read_record[MAX_REC_LENGTH]; + int upd=10; + ha_rows hrows; + + /* Define a column for NULLs and DEL markers*/ + + recinfo[0].type=FIELD_NORMAL; + recinfo[0].length=1; /* For NULL bits */ + + + /* Define spatial column */ + + recinfo[1].type=FIELD_BLOB; + recinfo[1].length=4 + mi_portable_sizeof_char_ptr; + + + + /* Define a key with 1 spatial segment */ + + keyinfo[0].seg=keyseg; + keyinfo[0].keysegs=1; + keyinfo[0].flag=HA_SPATIAL; + keyinfo[0].key_alg=KEYALG; + + keyinfo[0].seg[0].type= HA_KEYTYPE_BINARY; + keyinfo[0].seg[0].flag=0; + keyinfo[0].seg[0].start= 1; + keyinfo[0].seg[0].length=1; /* Spatial ignores it anyway */ + keyinfo[0].seg[0].null_bit= null_fields ? 2 : 0; + keyinfo[0].seg[0].null_pos=0; + keyinfo[0].seg[0].language=MY_CHARSET_CURRENT; + keyinfo[0].seg[0].bit_start=4; /* Long BLOB */ + + + if(!silent) + printf("- Creating isam-file\n"); + + bzero((char*) &create_info,sizeof(create_info)); + create_info.max_rows=10000000; + + if (mi_create(filename, + 1, /* keys */ + keyinfo, + 2, /* columns */ + recinfo,uniques,&uniquedef,&create_info,create_flag)) + goto err; + + + + + if(!silent) + printf("- Open isam-file\n"); + + if (!(file=mi_open(filename,2,HA_OPEN_ABORT_IF_LOCKED))) + goto err; + + + + if (!silent) + printf("- Writing key:s\n"); + + for (i=0; i "); + print_record(record,mi_position(file),"\n"); + error=mi_update(file,read_record,record); + if(error) + { + printf("pos: %2d mi_update: %3d errno: %3d\n",i,error,my_errno); + goto err; + } + } + + + + if((error=read_with_pos(file,silent))) + goto err; + + + + if (!silent) + printf("- Test mi_rkey then a sequence of mi_rnext_same\n"); + + create_key(key, nrecords*4/5); + print_key(key," search for INTERSECT\n"); + + if ((error=mi_rkey(file,read_record,0,key,0,HA_READ_MBR_INTERSECT))) + { + printf("mi_rkey: %3d errno: %3d\n",error,my_errno); + goto err; + } + print_record(read_record,mi_position(file)," mi_rkey\n"); + row_count=1; + + + do { + if((error=mi_rnext_same(file,read_record))) + { + if(error==HA_ERR_END_OF_FILE) + break; + printf("mi_next: %3d errno: %3d\n",error,my_errno); + goto err; + } + print_record(read_record,mi_position(file)," mi_rnext_same\n"); + row_count++; + }while(1); + printf(" %d rows\n",row_count); + + + + + + + if (!silent) + printf("- Test mi_rfirst then a sequence of mi_rnext\n"); + + error=mi_rfirst(file,read_record,0); + if (error) + { + printf("mi_rfirst: %3d errno: %3d\n",error,my_errno); + goto err; + } + row_count=1; + print_record(read_record,mi_position(file)," mi_frirst\n"); + + for(i=0;i "); + printf(" offs=%ld ",(long int)offs); + printf("%s",tail); +} + + + +static void create_point(char *record,uint rownr) +{ + uint tmp; + char *ptr; + char *pos=record; + double x[200]; + int i; + + for(i=0;i Date: Thu, 21 Feb 2002 14:10:11 +0200 Subject: Fixing some bugs in UNION's --- sql/sql_select.cc | 299 ++++++++++++++++++++++++++++++------------------------ sql/sql_union.cc | 6 ++ 2 files changed, 174 insertions(+), 131 deletions(-) diff --git a/sql/sql_select.cc b/sql/sql_select.cc index e2e5e4bf55a..4d2a72c7784 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -144,7 +144,7 @@ static bool add_ref_to_table_cond(THD *thd, JOIN_TAB *join_tab); static void init_sum_functions(Item_sum **func); static bool update_sum_func(Item_sum **func); static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, - bool distinct); + bool distinct, const char *message=NullS); static void describe_info(THD *thd, const char *info); /* @@ -195,6 +195,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, Procedure *procedure; List all_fields(fields); bool select_distinct; + SELECT_LEX *select_lex = &(thd->lex.select_lex); DBUG_ENTER("mysql_select"); /* Check that all tables, fields, conds and order are ok */ @@ -350,10 +351,13 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, } if (cond_value == Item::COND_FALSE || !thd->select_limit) { /* Impossible cond */ - error=return_zero_rows(result, tables, fields, - join.tmp_table_param.sum_func_count != 0 && !group, - select_options,"Impossible WHERE",having, - procedure); + if (select_options & SELECT_DESCRIBE && select_lex->next) + select_describe(&join,false,false,false,"Impossible WHERE"); + else + error=return_zero_rows(result, tables, fields, + join.tmp_table_param.sum_func_count != 0 && !group, + select_options,"Impossible WHERE",having, + procedure); delete procedure; DBUG_RETURN(error); } @@ -366,17 +370,23 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, { if (res < 0) { - error=return_zero_rows(result, tables, fields, !group, - select_options,"No matching min/max row", - having,procedure); + if (select_options & SELECT_DESCRIBE && select_lex->next) + select_describe(&join,false,false,false,"No matching min/max row"); + else + error=return_zero_rows(result, tables, fields, !group, + select_options,"No matching min/max row", + having,procedure); delete procedure; DBUG_RETURN(error); } if (select_options & SELECT_DESCRIBE) { - describe_info(thd,"Select tables optimized away"); + if (select_lex->next) + select_describe(&join,false,false,false,"Select tables optimized away"); + else + describe_info(thd,"Select tables optimized away"); delete procedure; - DBUG_RETURN(0); + DBUG_RETURN(error); } tables=0; // All tables resolved } @@ -385,7 +395,12 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, { // Only test of functions error=0; if (select_options & SELECT_DESCRIBE) - describe_info(thd,"No tables used"); + { + if (select_lex->next) + select_describe(&join,false,false,false,"No tables used"); + else + describe_info(thd,"No tables used"); + } else { result->send_fields(fields,1); @@ -463,11 +478,14 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, } if (make_join_select(&join,select,conds)) { - error=return_zero_rows(result,tables,fields, - join.tmp_table_param.sum_func_count != 0 && !group, - select_options, - "Impossible WHERE noticed after reading const tables", - having,procedure); + if (select_options & SELECT_DESCRIBE && select_lex->next) + select_describe(&join,false,false,false,"Impossible WHERE noticed after reading const tables"); + else + error=return_zero_rows(result,tables,fields, + join.tmp_table_param.sum_func_count != 0 && !group, + select_options, + "Impossible WHERE noticed after reading const tables", + having,procedure); goto err; } @@ -535,7 +553,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, make_join_readinfo(&join, (select_options & (SELECT_DESCRIBE | SELECT_NO_JOIN_CACHE)) | - (thd->lex.select_lex.ftfunc_list.elements ? SELECT_NO_JOIN_CACHE : 0)); + (select_lex->ftfunc_list.elements ? SELECT_NO_JOIN_CACHE : 0)); /* Need to tell Innobase that to play it safe, it should fetch all columns of the tables: this is because MySQL @@ -2516,6 +2534,7 @@ static void make_join_readinfo(JOIN *join,uint options) { uint i; + SELECT_LEX *select_lex = &(join->thd->lex.select_lex); DBUG_ENTER("make_join_readinfo"); for (i=join->const_tables ; i < join->tables ; i++) @@ -2598,7 +2617,7 @@ make_join_readinfo(JOIN *join,uint options) /* These init changes read_record */ if (tab->use_quick == 2) { - join->thd->lex.select_lex.options|=QUERY_NO_GOOD_INDEX_USED; + select_lex->options|=QUERY_NO_GOOD_INDEX_USED; tab->read_first_record= join_init_quick_read_record; statistic_increment(select_range_check_count, &LOCK_status); } @@ -2613,7 +2632,7 @@ make_join_readinfo(JOIN *join,uint options) } else { - join->thd->lex.select_lex.options|=QUERY_NO_INDEX_USED; + select_lex->options|=QUERY_NO_INDEX_USED; statistic_increment(select_scan_count, &LOCK_status); } } @@ -2625,7 +2644,7 @@ make_join_readinfo(JOIN *join,uint options) } else { - join->thd->lex.select_lex.options|=QUERY_NO_INDEX_USED; + select_lex->options|=QUERY_NO_INDEX_USED; statistic_increment(select_full_join_count, &LOCK_status); } } @@ -2913,7 +2932,7 @@ return_zero_rows(select_result *result,TABLE_LIST *tables,List &fields, DBUG_ENTER("return_zero_rows"); if (select_options & SELECT_DESCRIBE) - { + { describe_info(current_thd, info); DBUG_RETURN(0); } @@ -6940,16 +6959,17 @@ static bool add_ref_to_table_cond(THD *thd, JOIN_TAB *join_tab) ****************************************************************************/ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, - bool distinct) + bool distinct,const char *message) { List field_list; Item *item; THD *thd=join->thd; + SELECT_LEX *select_lex = &(join->thd->lex.select_lex); DBUG_ENTER("select_describe"); /* Don't log this into the slow query log */ - join->thd->lex.select_lex.options&= ~(QUERY_NO_INDEX_USED | QUERY_NO_GOOD_INDEX_USED); - if (join->thd->lex.select == &join->thd->lex.select_lex) + select_lex->options&= ~(QUERY_NO_INDEX_USED | QUERY_NO_GOOD_INDEX_USED); + if (join->thd->lex.select == select_lex) { field_list.push_back(new Item_empty_string("table",NAME_LEN)); field_list.push_back(new Item_empty_string("type",10)); @@ -6970,133 +6990,150 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, } char buff[512],*buff_ptr; String tmp(buff,sizeof(buff)),*packet= &thd->packet; - table_map used_tables=0; - for (uint i=0 ; i < join->tables ; i++) + if (message) { - JOIN_TAB *tab=join->join_tab+i; - TABLE *table=tab->table; - - if (tab->type == JT_ALL && tab->select && tab->select->quick) - tab->type= JT_RANGE; packet->length(0); - net_store_data(packet,table->table_name); - net_store_data(packet,join_type_str[tab->type]); - tmp.length(0); - key_map bits; - uint j; - for (j=0,bits=tab->keys ; bits ; j++,bits>>=1) - { - if (bits & 1) - { - if (tmp.length()) - tmp.append(','); - tmp.append(table->key_info[j].name); - } - } - if (tmp.length()) - net_store_data(packet,tmp.ptr(),tmp.length()); - else - net_store_null(packet); - if (tab->ref.key_parts) + net_store_null(packet); + net_store_null(packet); + net_store_null(packet); + net_store_null(packet); + net_store_null(packet); + net_store_null(packet); + net_store_null(packet); + net_store_data(packet,message,strlen(message)); + if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length())) + DBUG_VOID_RETURN; + } + else + { + table_map used_tables=0; + for (uint i=0 ; i < join->tables ; i++) { - net_store_data(packet,table->key_info[tab->ref.key].name); - net_store_data(packet,(uint32) tab->ref.key_length); + JOIN_TAB *tab=join->join_tab+i; + TABLE *table=tab->table; + + if (tab->type == JT_ALL && tab->select && tab->select->quick) + tab->type= JT_RANGE; + packet->length(0); + net_store_data(packet,table->table_name); + net_store_data(packet,join_type_str[tab->type]); tmp.length(0); - for (store_key **ref=tab->ref.key_copy ; *ref ; ref++) + key_map bits; + uint j; + for (j=0,bits=tab->keys ; bits ; j++,bits>>=1) { - if (tmp.length()) - tmp.append(','); - tmp.append((*ref)->name()); + if (bits & 1) + { + if (tmp.length()) + tmp.append(','); + tmp.append(table->key_info[j].name); + } } - net_store_data(packet,tmp.ptr(),tmp.length()); - } - else if (tab->type == JT_NEXT) - { - net_store_data(packet,table->key_info[tab->index].name); - net_store_data(packet,(uint32) table->key_info[tab->index].key_length); - net_store_null(packet); - } - else if (tab->select && tab->select->quick) - { - net_store_data(packet,table->key_info[tab->select->quick->index].name);; - net_store_data(packet,(uint32) tab->select->quick->max_used_key_length); - net_store_null(packet); - } - else - { - net_store_null(packet); - net_store_null(packet); - net_store_null(packet); - } - sprintf(buff,"%.0f",join->best_positions[i].records_read); - net_store_data(packet,buff); - my_bool key_read=table->key_read; - if (tab->type == JT_NEXT && - ((table->used_keys & ((key_map) 1 << tab->index)))) - key_read=1; - - buff_ptr=buff; - if (tab->info) - net_store_data(packet,tab->info); - else if (tab->select) - { - if (tab->use_quick == 2) + if (tmp.length()) + net_store_data(packet,tmp.ptr(),tmp.length()); + else + net_store_null(packet); + if (tab->ref.key_parts) { - sprintf(buff_ptr,"range checked for each record (index map: %u)", - tab->keys); - buff_ptr=strend(buff_ptr); + net_store_data(packet,table->key_info[tab->ref.key].name); + net_store_data(packet,(uint32) tab->ref.key_length); + tmp.length(0); + for (store_key **ref=tab->ref.key_copy ; *ref ; ref++) + { + if (tmp.length()) + tmp.append(','); + tmp.append((*ref)->name()); + } + net_store_data(packet,tmp.ptr(),tmp.length()); + } + else if (tab->type == JT_NEXT) + { + net_store_data(packet,table->key_info[tab->index].name); + net_store_data(packet,(uint32) table->key_info[tab->index].key_length); + net_store_null(packet); + } + else if (tab->select && tab->select->quick) + { + net_store_data(packet,table->key_info[tab->select->quick->index].name);; + net_store_data(packet,(uint32) tab->select->quick->max_used_key_length); + net_store_null(packet); } else - buff_ptr=strmov(buff_ptr,"where used"); - } - if (key_read) - { - if (buff != buff_ptr) { - buff_ptr[0]=';' ; buff_ptr[1]=' '; buff_ptr+=2; + net_store_null(packet); + net_store_null(packet); + net_store_null(packet); } - buff_ptr=strmov(buff_ptr,"Using index"); - } - if (table->reginfo.not_exists_optimize) - { - if (buff != buff_ptr) + sprintf(buff,"%.0f",join->best_positions[i].records_read); + net_store_data(packet,buff); + my_bool key_read=table->key_read; + if (tab->type == JT_NEXT && + ((table->used_keys & ((key_map) 1 << tab->index)))) + key_read=1; + + buff_ptr=buff; + if (tab->info) + net_store_data(packet,tab->info); + else if (tab->select) { - buff_ptr[0]=';' ; buff_ptr[1]=' '; buff_ptr+=2; + if (tab->use_quick == 2) + { + sprintf(buff_ptr,"range checked for each record (index map: %u)", + tab->keys); + buff_ptr=strend(buff_ptr); + } + else + buff_ptr=strmov(buff_ptr,"where used"); } - buff_ptr=strmov(buff_ptr,"Not exists"); - } - if (need_tmp_table) - { - need_tmp_table=0; - if (buff != buff_ptr) + if (key_read) { - buff_ptr[0]=';' ; buff_ptr[1]=' '; buff_ptr+=2; + if (buff != buff_ptr) + { + buff_ptr[0]=';' ; buff_ptr[1]=' '; buff_ptr+=2; + } + buff_ptr=strmov(buff_ptr,"Using index"); } - buff_ptr=strmov(buff_ptr,"Using temporary"); - } - if (need_order) - { - need_order=0; - if (buff != buff_ptr) + if (table->reginfo.not_exists_optimize) { - buff_ptr[0]=';' ; buff_ptr[1]=' '; buff_ptr+=2; + if (buff != buff_ptr) + { + buff_ptr[0]=';' ; buff_ptr[1]=' '; buff_ptr+=2; + } + buff_ptr=strmov(buff_ptr,"Not exists"); } - buff_ptr=strmov(buff_ptr,"Using filesort"); - } - if (distinct & test_all_bits(used_tables,thd->used_tables)) - { - if (buff != buff_ptr) + if (need_tmp_table) { - buff_ptr[0]=';' ; buff_ptr[1]=' '; buff_ptr+=2; + need_tmp_table=0; + if (buff != buff_ptr) + { + buff_ptr[0]=';' ; buff_ptr[1]=' '; buff_ptr+=2; + } + buff_ptr=strmov(buff_ptr,"Using temporary"); } - buff_ptr=strmov(buff_ptr,"Distinct"); - } - net_store_data(packet,buff,(uint) (buff_ptr - buff)); - if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length())) - DBUG_VOID_RETURN; /* purecov: inspected */ + if (need_order) + { + need_order=0; + if (buff != buff_ptr) + { + buff_ptr[0]=';' ; buff_ptr[1]=' '; buff_ptr+=2; + } + buff_ptr=strmov(buff_ptr,"Using filesort"); + } + if (distinct & test_all_bits(used_tables,thd->used_tables)) + { + if (buff != buff_ptr) + { + buff_ptr[0]=';' ; buff_ptr[1]=' '; buff_ptr+=2; + } + buff_ptr=strmov(buff_ptr,"Distinct"); + } + net_store_data(packet,buff,(uint) (buff_ptr - buff)); + if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length())) + DBUG_VOID_RETURN; /* Purecov: Inspected */ - // For next iteration - used_tables|=table->map; + // For next iteration + used_tables|=table->map; + } } if (!join->thd->lex.select->next) send_eof(&thd->net); diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 0d8a41e9966..51ad2425022 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -76,6 +76,12 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) for (sl= &lex->select_lex; sl; sl=sl->next) { lex->select=sl; + thd->offset_limit=sl->offset_limit; + thd->select_limit=sl->select_limit+sl->offset_limit; + if (thd->select_limit < sl->select_limit) + thd->select_limit= HA_POS_ERROR; // no limit + if (thd->select_limit == HA_POS_ERROR) + sl->options&= ~OPTION_FOUND_ROWS; res=mysql_select(thd, (TABLE_LIST*) sl->table_list.first, sl->item_list, sl->where, -- cgit v1.2.1 From 32a08516c974045bfc16fb30fcac18bb7ad8fbb8 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 22 Feb 2002 15:24:42 +0400 Subject: Added GIS extension BitKeeper/etc/ignore: Added myisam/rt_test myisam/sp_test to the ignore list --- .bzrignore | 2 + libmysqld/Makefile.am | 3 +- sql/Makefile.am | 3 +- sql/field.cc | 57 +- sql/field.h | 32 +- sql/gstream.cc | 137 +++++ sql/gstream.h | 61 +++ sql/ha_myisam.cc | 8 +- sql/item.h | 1 + sql/item_cmpfunc.cc | 81 +++ sql/item_cmpfunc.h | 79 +++ sql/item_create.cc | 155 ++++++ sql/item_create.h | 38 ++ sql/item_func.cc | 129 +++++ sql/item_func.h | 87 ++- sql/item_strfunc.cc | 330 ++++++++++++ sql/item_strfunc.h | 193 +++++++ sql/lex.h | 43 ++ sql/opt_range.cc | 120 ++++- sql/opt_range.h | 9 +- sql/opt_sum.cc | 2 +- sql/spatial.cc | 1435 +++++++++++++++++++++++++++++++++++++++++++++++++ sql/spatial.h | 476 ++++++++++++++++ sql/sql_class.h | 7 +- sql/sql_show.cc | 6 + sql/sql_string.cc | 40 ++ sql/sql_string.h | 45 ++ sql/sql_table.cc | 57 +- sql/sql_yacc.yy | 61 ++- sql/structs.h | 1 + sql/table.cc | 24 +- 31 files changed, 3674 insertions(+), 48 deletions(-) create mode 100644 sql/gstream.cc create mode 100644 sql/gstream.h create mode 100644 sql/spatial.cc create mode 100644 sql/spatial.h diff --git a/.bzrignore b/.bzrignore index 6781375218d..af66d715b02 100644 --- a/.bzrignore +++ b/.bzrignore @@ -460,3 +460,5 @@ vio/test-sslserver vio/viotest-ssl Docs/mysql.xml mysql-test/r/rpl000001.eval +myisam/rt_test +myisam/sp_test diff --git a/libmysqld/Makefile.am b/libmysqld/Makefile.am index edee13c98bb..6e5c0b183bb 100644 --- a/libmysqld/Makefile.am +++ b/libmysqld/Makefile.am @@ -53,7 +53,8 @@ sqlsources = convert.cc derror.cc field.cc field_conv.cc filesort.cc \ sql_rename.cc sql_repl.cc sql_select.cc sql_do.cc sql_show.cc \ sql_string.cc sql_table.cc sql_test.cc sql_udf.cc \ sql_update.cc sql_yacc.cc table.cc thr_malloc.cc time.cc \ - unireg.cc uniques.cc stacktrace.c sql_union.cc hash_filo.cc + unireg.cc uniques.cc stacktrace.c sql_union.cc hash_filo.cc \ + spatial.cc gstream.cc EXTRA_DIST = lib_vio.c diff --git a/sql/Makefile.am b/sql/Makefile.am index e1ed9ad8915..c83b5388ca0 100644 --- a/sql/Makefile.am +++ b/sql/Makefile.am @@ -81,7 +81,8 @@ mysqld_SOURCES = sql_lex.cc sql_handler.cc \ sql_udf.cc sql_analyse.cc sql_analyse.h sql_cache.cc \ slave.cc sql_repl.cc sql_union.cc \ mini_client.cc mini_client_errors.c \ - stacktrace.c repl_failsafe.h repl_failsafe.cc + stacktrace.c repl_failsafe.h repl_failsafe.cc \ + gstream.cc spatial.cc gen_lex_hash_SOURCES = gen_lex_hash.cc gen_lex_hash_LDADD = $(LDADD) $(CXXLDFLAGS) diff --git a/sql/field.cc b/sql/field.cc index 2a0d0160d00..5d398d0ae5f 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -3712,7 +3712,7 @@ Field_blob::Field_blob(char *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg, :Field_str(ptr_arg, (1L << min(blob_pack_length,3)*8)-1L, null_ptr_arg, null_bit_arg, unireg_check_arg, field_name_arg, table_arg), - packlength(blob_pack_length),binary_flag(binary_arg) + packlength(blob_pack_length),binary_flag(binary_arg), geom_flag(true) { flags|= BLOB_FLAG; if (binary_arg) @@ -3954,8 +3954,30 @@ int Field_blob::cmp_binary(const char *a_ptr, const char *b_ptr, /* The following is used only when comparing a key */ -void Field_blob::get_key_image(char *buff,uint length) +void Field_blob::get_key_image(char *buff,uint length, imagetype type) { + if(type == itMBR) + { + length-=HA_KEY_BLOB_LENGTH; + ulong blob_length=get_length(ptr); + char *blob; + get_ptr(&blob); + if(!blob_length) + { + return; + } + + MBR mbr; + Geometry gobj; + gobj.create_from_wkb(blob,blob_length); + gobj.get_mbr(&mbr); + float8store(buff, mbr.xmin); + float8store(buff+8, mbr.xmax); + float8store(buff+16, mbr.ymin); + float8store(buff+24, mbr.ymax); + return; + } + length-=HA_KEY_BLOB_LENGTH; uint32 blob_length=get_length(ptr); char *blob; @@ -3977,6 +3999,31 @@ void Field_blob::set_key_image(char *buff,uint length) Field_blob::store(buff+2,length); } +void Field_geom::get_key_image(char *buff,uint length, imagetype type) +{ + length-=HA_KEY_BLOB_LENGTH; + ulong blob_length=get_length(ptr); + char *blob; + get_ptr(&blob); + memcpy(buff+2,blob,length); + + MBR mbr; + Geometry gobj; + gobj.create_from_wkb(blob,blob_length); + gobj.get_mbr(&mbr); + float8store(buff, mbr.xmin); + float8store(buff+8, mbr.xmax); + float8store(buff+16, mbr.ymin); + float8store(buff+24, mbr.ymax); + return; +} + +void Field_geom::set_key_image(char *buff,uint length) +{ +} + + + int Field_blob::key_cmp(const byte *key_ptr, uint max_key_length) { char *blob1; @@ -4606,6 +4653,7 @@ uint32 calc_pack_length(enum_field_types type,uint32 length) case FIELD_TYPE_LONG_BLOB: return 4+portable_sizeof_char_ptr; case FIELD_TYPE_SET: case FIELD_TYPE_ENUM: abort(); return 0; // This shouldn't happen + default: return 0; } return 0; // This shouldn't happen } @@ -4652,6 +4700,11 @@ Field *make_field(char *ptr, uint32 field_length, return new Field_blob(ptr,null_pos,null_bit, unireg_check, field_name, table, pack_length,f_is_binary(pack_flag) != 0); + if (f_is_geom(pack_flag)) + return new Field_geom(ptr,null_pos,null_bit, + unireg_check, field_name, table, + pack_length,f_is_binary(pack_flag) != 0); + if (interval) { if (f_is_enum(pack_flag)) diff --git a/sql/field.h b/sql/field.h index a9b257f0c3a..422e91768e6 100644 --- a/sql/field.h +++ b/sql/field.h @@ -47,6 +47,9 @@ public: enum utype { NONE,DATE,SHIELD,NOEMPTY,CASEUP,PNR,BGNR,PGNR,YES,NO,REL, CHECK,EMPTY,UNKNOWN_FIELD,CASEDN,NEXT_NUMBER,INTERVAL_FIELD, BIT_FIELD, TIMESTAMP_FIELD,CAPITALIZE,BLOB_FIELD}; + + enum imagetype { itRAW, itMBR}; + utype unireg_check; uint32 field_length; // Length of field uint16 flags; @@ -137,7 +140,7 @@ public: { memcpy(buff,ptr,length); } inline void set_image(char *buff,uint length) { memcpy(ptr,buff,length); } - virtual void get_key_image(char *buff,uint length) + virtual void get_key_image(char *buff,uint length, imagetype type) { get_image(buff,length); } virtual void set_key_image(char *buff,uint length) { set_image(buff,length); } @@ -825,6 +828,7 @@ class Field_blob :public Field_str { uint packlength; String value; // For temporaries bool binary_flag; + bool geom_flag; public: Field_blob(char *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg, enum utype unireg_check_arg, const char *field_name_arg, @@ -834,7 +838,7 @@ public: struct st_table *table_arg, bool binary_arg) :Field_str((char*) 0,len_arg, maybe_null_arg ? (uchar*) "": 0,0, NONE, field_name_arg, table_arg), - packlength(3),binary_flag(binary_arg) + packlength(3),binary_flag(binary_arg), geom_flag(true) { flags|= BLOB_FLAG; if (binary_arg) @@ -881,7 +885,7 @@ public: store_length(length); memcpy_fixed(ptr+packlength,&data,sizeof(char*)); } - void get_key_image(char *buff,uint length); + void get_key_image(char *buff,uint length, imagetype type); void set_key_image(char *buff,uint length); void sql_type(String &str) const; inline bool copy() @@ -910,6 +914,25 @@ public: }; +class Field_geom :public Field_blob { +public: + Field_geom(char *ptr_arg, uchar *null_ptr_arg, uint null_bit_arg, + enum utype unireg_check_arg, const char *field_name_arg, + struct st_table *table_arg,uint blob_pack_length, + bool binary_arg) + :Field_blob(ptr_arg, null_ptr_arg, null_bit_arg, unireg_check_arg, + field_name_arg, table_arg, blob_pack_length,binary_arg) {} + Field_geom(uint32 len_arg,bool maybe_null_arg, const char *field_name_arg, + struct st_table *table_arg, bool binary_arg) + :Field_blob(len_arg, maybe_null_arg, field_name_arg, + table_arg, binary_arg) {} + enum ha_base_keytype key_type() const { return HA_KEYTYPE_VARBINARY; } + + void get_key_image(char *buff,uint length, imagetype type); + void set_key_image(char *buff,uint length); +}; + + class Field_enum :public Field_str { protected: uint packlength; @@ -1059,6 +1082,8 @@ bool test_if_int(const char *str,int length); #define FIELDFLAG_INTERVAL 256 #define FIELDFLAG_BITFIELD 512 // mangled with dec! #define FIELDFLAG_BLOB 1024 // mangled with dec! +#define FIELDFLAG_GEOM 2048 + #define FIELDFLAG_LEFT_FULLSCREEN 8192 #define FIELDFLAG_RIGHT_FULLSCREEN 16384 #define FIELDFLAG_FORMAT_NUMBER 16384 // predit: ###,,## in output @@ -1085,6 +1110,7 @@ bool test_if_int(const char *str,int length); #define f_is_enum(x) ((x) & FIELDFLAG_INTERVAL) #define f_is_bitfield(x) ((x) & FIELDFLAG_BITFIELD) #define f_is_blob(x) (((x) & (FIELDFLAG_BLOB | FIELDFLAG_NUMBER)) == FIELDFLAG_BLOB) +#define f_is_geom(x) ((x) & FIELDFLAG_GEOM) #define f_is_equ(x) ((x) & (1+2+FIELDFLAG_PACK+31*256)) #define f_settype(x) (((int) x) << FIELDFLAG_PACK_SHIFT) #define f_maybe_null(x) (x & FIELDFLAG_MAYBE_NULL) diff --git a/sql/gstream.cc b/sql/gstream.cc new file mode 100644 index 00000000000..5a58fef6744 --- /dev/null +++ b/sql/gstream.cc @@ -0,0 +1,137 @@ +#include "mysql_priv.h" + +int GTextReadStream::get_next_toc_type() const +{ + const char *cur = m_cur; + while((*cur)&&(strchr(" \t\r\n",*cur))) + { + cur++; + } + if(!(*cur)) + { + return eostream; + } + + if(((*cur>='a') && (*cur<='z')) || ((*cur>='A') && (*cur<='Z')) || (*cur=='_')) + { + return word; + } + + if(((*cur>='0') && (*cur<='9')) || (*cur=='-') || (*cur=='+') || (*cur=='.')) + { + return numeric; + } + + if(*cur == '(') + { + return l_bra; + } + + if(*cur == ')') + { + return r_bra; + } + + if(*cur == ',') + { + return comma; + } + + return unknown; +} + +const char *GTextReadStream::get_next_word(int *word_len) +{ + const char *cur = m_cur; + while((*cur)&&(strchr(" \t\r\n",*cur))) + { + cur++; + } + m_last_text_position = cur; + + if(!(*cur)) + { + return 0; + } + + const char *wd_start = cur; + + if(((*cur<'a') || (*cur>'z')) && ((*cur<'A') || (*cur>'Z')) && (*cur!='_')) + { + return NULL; + } + + ++cur; + + while(((*cur>='a') && (*cur<='z')) || ((*cur>='A') && (*cur<='Z')) || (*cur=='_') || + ((*cur>='0') && (*cur<='9'))) + { + ++cur; + } + + *word_len = cur - wd_start; + + m_cur = cur; + + return wd_start; +} + +int GTextReadStream::get_next_number(double *d) +{ + const char *cur = m_cur; + while((*cur)&&(strchr(" \t\r\n",*cur))) + { + cur++; + } + + m_last_text_position = cur; + if(!(*cur)) + { + set_error_msg("Numeric constant expected"); + return 1; + } + + if(((*cur<'0') || (*cur>'9')) && (*cur!='-') && (*cur!='+') && (*cur!='.')) + { + set_error_msg("Numeric constant expected"); + return 1; + } + + char *endptr; + + *d = strtod(cur, &endptr); + + if(endptr) + { + m_cur = endptr; + } + + return 0; +} + +char GTextReadStream::get_next_symbol() +{ + const char *cur = m_cur; + while((*cur)&&(strchr(" \t\r\n",*cur))) + { + cur++; + } + if(!(*cur)) + { + return 0; + } + + m_cur = cur + 1; + m_last_text_position = cur; + + return *cur; +} + +void GTextReadStream::set_error_msg(const char *msg) +{ + size_t len = strlen(msg); + m_err_msg = (char *)my_realloc(m_err_msg, len + 1, MYF(MY_ALLOW_ZERO_PTR)); + memcpy(m_err_msg, msg, len + 1); +} + + diff --git a/sql/gstream.h b/sql/gstream.h new file mode 100644 index 00000000000..f8df6e337b0 --- /dev/null +++ b/sql/gstream.h @@ -0,0 +1,61 @@ +#ifndef GSTREAM_H +#define GSTREAM_H + +#ifdef WITHOUT_MYSQL + #include ".\rtree\myisamdef.h" +#else + #include "mysql_priv.h" +#endif + +class GTextReadStream +{ +public: + enum TokTypes + { + unknown, + eostream, + word, + numeric, + l_bra, + r_bra, + comma, + }; + GTextReadStream(const char *buffer, int size) : + m_cur(buffer), m_limit(buffer + size), m_last_text_position(buffer), m_err_msg(NULL) {} + GTextReadStream() : m_cur(NULL), m_limit(NULL), m_err_msg(NULL) {} + + ~GTextReadStream() + { + my_free(m_err_msg, MYF(MY_ALLOW_ZERO_PTR)); + } + + int get_next_toc_type() const; + const char *get_next_word(int *word_len); + int get_next_number(double *d); + char get_next_symbol(); + + const char *get_last_text_position() const + { + return m_last_text_position; + } + + void set_error_msg(const char *msg); + +// caller should free this pointer + char *get_error_msg() + { + char *err_msg = m_err_msg; + m_err_msg = NULL; + return err_msg; + } +protected: + const char *m_cur; + const char *m_limit; + const char *m_last_text_position; + char *m_err_msg; +}; + +#endif + + + diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc index 78ac9f3b309..05bc8901c5b 100644 --- a/sql/ha_myisam.cc +++ b/sql/ha_myisam.cc @@ -28,6 +28,7 @@ #include "../srclib/myisam/myisamdef.h" #else #include "../myisam/myisamdef.h" +#include "../myisam/rt_index.h" #endif ulong myisam_sort_buffer_size; @@ -763,7 +764,7 @@ int ha_myisam::index_read(byte * buf, const byte * key, uint key_len, enum ha_rkey_function find_flag) { statistic_increment(ha_read_key_count,&LOCK_status); - int error=mi_rkey(file,buf,active_index, key, key_len, find_flag); + int error=mi_rkey(file,buf,active_index, key, key_len, (enum ha_rkey_function)find_flag); table->status=error ? STATUS_NOT_FOUND: 0; return error; } @@ -772,7 +773,7 @@ int ha_myisam::index_read_idx(byte * buf, uint index, const byte * key, uint key_len, enum ha_rkey_function find_flag) { statistic_increment(ha_read_key_count,&LOCK_status); - int error=mi_rkey(file,buf,index, key, key_len, find_flag); + int error=mi_rkey(file,buf,index, key, key_len, (enum ha_rkey_function)find_flag); table->status=error ? STATUS_NOT_FOUND: 0; return error; } @@ -1008,7 +1009,8 @@ int ha_myisam::create(const char *name, register TABLE *table, pos=table->key_info; for (i=0; i < table->keys ; i++, pos++) { - keydef[i].flag= (pos->flags & (HA_NOSAME | HA_FULLTEXT)); + keydef[i].flag= (pos->flags & (HA_NOSAME | HA_FULLTEXT | HA_SPATIAL)); + keydef[i].key_alg=pos->key_alg; // +BAR keydef[i].seg=keyseg; keydef[i].keysegs=pos->key_parts; for (j=0 ; j < pos->key_parts ; j++) diff --git a/sql/item.h b/sql/item.h index 5028f25c6b8..247b3d7081d 100644 --- a/sql/item.h +++ b/sql/item.h @@ -357,6 +357,7 @@ public: }; +#include "spatial.h" #include "item_sum.h" #include "item_func.h" #include "item_cmpfunc.h" diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 0c83698e60a..1de398177b5 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -24,6 +24,7 @@ #include "mysql_priv.h" #include + /* ** Test functions ** These returns 0LL if false and 1LL if true and null if some arg is null @@ -1348,3 +1349,83 @@ Item_func_regex::~Item_func_regex() } #endif /* USE_REGEX */ + + +/**************************************************************** + Classes and functions for spatial relations +*****************************************************************/ + +longlong Item_func_spatial_rel::val_int() +{ + String *res1=args[0]->val_str(&tmp_value1); + String *res2=args[1]->val_str(&tmp_value2); + Geometry g1, g2; + MBR mbr1,mbr2; + + if ((null_value=(args[0]->null_value || + args[1]->null_value || + g1.create_from_wkb(res1->ptr(),res1->length()) || + g2.create_from_wkb(res2->ptr(),res2->length()) || + g1.get_mbr(&mbr1) || + g2.get_mbr(&mbr2)))) + return 0; + + switch (spatial_rel) + { + case SP_CONTAINS_FUNC: + return mbr1.contains(&mbr2); + case SP_WITHIN_FUNC: + return mbr1.within(&mbr2); + case SP_EQUALS_FUNC: + return mbr1.equals(&mbr2); + case SP_DISJOINT_FUNC: + return mbr1.disjoint(&mbr2); + case SP_INTERSECTS_FUNC: + return mbr1.intersects(&mbr2); + case SP_TOUCHES_FUNC: + return mbr1.touches(&mbr2); + case SP_OVERLAPS_FUNC: + return mbr1.overlaps(&mbr2); + case SP_CROSSES_FUNC: + return 0; + default: + break; + } + + null_value=1; + return 0; +} + +longlong Item_func_isempty::val_int() +{ + String tmp; + null_value=0; + return args[0]->null_value ? 1 : 0; +} + +longlong Item_func_issimple::val_int() +{ + String tmp; + String *wkb=args[0]->val_str(&tmp); + + if ((null_value= (!wkb || args[0]->null_value ))) + return 0; + /* TODO: Ramil or Holyfoot, add real IsSimple calculation */ + return 0; +} + +longlong Item_func_isclosed::val_int() +{ + String tmp; + String *wkb=args[0]->val_str(&tmp); + Geometry geom; + int isclosed; + + null_value= (!wkb || + args[0]->null_value || + geom.create_from_wkb(wkb->ptr(),wkb->length()) || + !GEOM_METHOD_PRESENT(geom,is_closed) || + geom.is_closed(&isclosed)); + + return (longlong) isclosed; +} diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index c9c7d5654d6..b8f21f21008 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -570,3 +570,82 @@ inline Item *and_conds(Item *a,Item *b) cond->update_used_tables(); return cond; } + + +/************************************************************** +Spatial relations +***************************************************************/ + +class Item_func_spatial_rel :public Item_bool_func2 +{ + enum Functype spatial_rel; +public: + Item_func_spatial_rel(Item *a,Item *b, enum Functype sp_rel) : + Item_bool_func2(a,b) { spatial_rel = sp_rel; } + longlong val_int(); + enum Functype functype() const + { + switch (spatial_rel) + { + case SP_CONTAINS_FUNC: + return SP_WITHIN_FUNC; + case SP_WITHIN_FUNC: + return SP_CONTAINS_FUNC; + default: + return spatial_rel; + } + } + enum Functype rev_functype() const { return spatial_rel; } + const char *func_name() const + { + switch (spatial_rel) + { + case SP_CONTAINS_FUNC: + return "contains"; + case SP_WITHIN_FUNC: + return "within"; + case SP_EQUALS_FUNC: + return "equals"; + case SP_DISJOINT_FUNC: + return "disjoint"; + case SP_INTERSECTS_FUNC: + return "intersects"; + case SP_TOUCHES_FUNC: + return "touches"; + case SP_CROSSES_FUNC: + return "crosses"; + case SP_OVERLAPS_FUNC: + return "overlaps"; + default: + return "sp_unknown"; + } + } +}; + + +class Item_func_isempty :public Item_bool_func +{ +public: + Item_func_isempty(Item *a) :Item_bool_func(a) {} + longlong val_int(); + optimize_type select_optimize() const { return OPTIMIZE_NONE; } + const char *func_name() const { return "isempty"; } +}; + +class Item_func_issimple :public Item_bool_func +{ +public: + Item_func_issimple(Item *a) :Item_bool_func(a) {} + longlong val_int(); + optimize_type select_optimize() const { return OPTIMIZE_NONE; } + const char *func_name() const { return "issimple"; } +}; + +class Item_func_isclosed :public Item_bool_func +{ +public: + Item_func_isclosed(Item *a) :Item_bool_func(a) {} + longlong val_int(); + optimize_type select_optimize() const { return OPTIMIZE_NONE; } + const char *func_name() const { return "isclosed"; } +}; diff --git a/sql/item_create.cc b/sql/item_create.cc index 6f64e9517ba..79d7fcfe230 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -413,3 +413,158 @@ Item *create_func_cast(Item *a, Item_cast cast_type) } return res; } + +Item *create_func_geometry_from_text(Item* a) +{ + return new Item_func_geometry_from_text(a); +} + +Item *create_func_as_text(Item* a) +{ + return new Item_func_as_text(a); +} + +Item *create_func_startpoint(Item* a) +{ + return new Item_func_spatial_decomp(a, Item_func::SP_STARTPOINT); +} + +Item *create_func_endpoint(Item* a) +{ + return new Item_func_spatial_decomp(a, Item_func::SP_ENDPOINT); +} + +Item *create_func_exteriorring(Item* a) +{ + return new Item_func_spatial_decomp(a, Item_func::SP_EXTERIORRING); +} + +Item *create_func_pointn(Item* a, Item* b) +{ + return new Item_func_spatial_decomp_n(a,b,Item_func::SP_POINTN); +} + +Item *create_func_interiorringn(Item* a, Item* b) +{ + return new Item_func_spatial_decomp_n(a,b,Item_func::SP_INTERIORRINGN); +} + +Item *create_func_geometryn(Item* a, Item* b) +{ + return new Item_func_spatial_decomp_n(a,b,Item_func::SP_GEOMETRYN); +} + +Item *create_func_centroid(Item* a) +{ + return new Item_func_centroid(a); +} + +Item *create_func_envelope(Item* a) +{ + return new Item_func_envelope(a); +} + +Item *create_func_equals(Item* a, Item* b) +{ + return new Item_func_spatial_rel(a, b, Item_func::SP_EQUALS_FUNC); +} + +Item *create_func_disjoint(Item* a, Item* b) +{ + return new Item_func_spatial_rel(a, b, Item_func::SP_DISJOINT_FUNC); +} + +Item *create_func_intersects(Item* a, Item* b) +{ + return new Item_func_spatial_rel(a, b, Item_func::SP_INTERSECTS_FUNC); +} + +Item *create_func_touches(Item* a, Item* b) +{ + return new Item_func_spatial_rel(a, b, Item_func::SP_TOUCHES_FUNC); +} + +Item *create_func_crosses(Item* a, Item* b) +{ + return new Item_func_spatial_rel(a, b, Item_func::SP_CROSSES_FUNC); +} + +Item *create_func_within(Item* a, Item* b) +{ + return new Item_func_spatial_rel(a, b, Item_func::SP_WITHIN_FUNC); +} + +Item *create_func_contains(Item* a, Item* b) +{ + return new Item_func_spatial_rel(a, b, Item_func::SP_CONTAINS_FUNC); +} + +Item *create_func_overlaps(Item* a, Item* b) +{ + return new Item_func_spatial_rel(a, b, Item_func::SP_OVERLAPS_FUNC); +} + +Item *create_func_isempty(Item* a) +{ + return new Item_func_isempty(a); +} + +Item *create_func_issimple(Item* a) +{ + return new Item_func_issimple(a); +} + +Item *create_func_isclosed(Item* a) +{ + return new Item_func_isclosed(a); +} + +Item *create_func_geometry_type(Item* a) +{ + return new Item_func_geometry_type(a); +} + +Item *create_func_dimension(Item* a) +{ + return new Item_func_dimension(a); +} + +Item *create_func_x(Item* a) +{ + return new Item_func_x(a); +} + +Item *create_func_y(Item* a) +{ + return new Item_func_y(a); +} + +Item *create_func_numpoints(Item* a) +{ + return new Item_func_numpoints(a); +} + +Item *create_func_numinteriorring(Item* a) +{ + return new Item_func_numinteriorring(a); +} + +Item *create_func_numgeometries(Item* a) +{ + return new Item_func_numgeometries(a); +} + +Item *create_func_area(Item* a) +{ + return new Item_func_area(a); +} + +Item *create_func_glength(Item* a) +{ + return new Item_func_glength(a); +} + +Item *create_func_point(Item* a, Item* b) +{ + return new Item_func_point(a,b); +} diff --git a/sql/item_create.h b/sql/item_create.h index 580596505da..6f7e8ebf89a 100644 --- a/sql/item_create.h +++ b/sql/item_create.h @@ -88,3 +88,41 @@ Item *create_func_version(void); Item *create_func_weekday(Item* a); Item *create_load_file(Item* a); Item *create_wait_for_master_pos(Item* a, Item* b); + +Item *create_func_geometry_from_text(Item* a); +Item *create_func_as_text(Item* a); +Item *create_func_startpoint(Item* a); +Item *create_func_endpoint(Item* a); +Item *create_func_exteriorring(Item* a); +Item *create_func_centroid(Item* a); +Item *create_func_envelope(Item* a); +Item *create_func_pointn(Item* a, Item* b); +Item *create_func_interiorringn(Item* a, Item* b); +Item *create_func_geometryn(Item* a, Item* b); + +Item *create_func_equals(Item* a, Item* b); +Item *create_func_disjoint(Item* a, Item* b); +Item *create_func_intersects(Item* a, Item* b); +Item *create_func_touches(Item* a, Item* b); +Item *create_func_crosses(Item* a, Item* b); +Item *create_func_within(Item* a, Item* b); +Item *create_func_contains(Item* a, Item* b); +Item *create_func_overlaps(Item* a, Item* b); + +Item *create_func_isempty(Item* a); +Item *create_func_issimple(Item* a); +Item *create_func_isclosed(Item* a); + +Item *create_func_geometry_type(Item* a); +Item *create_func_dimension(Item* a); +Item *create_func_x(Item* a); +Item *create_func_y(Item* a); +Item *create_func_area(Item* a); +Item *create_func_glength(Item* a); + +Item *create_func_numpoints(Item* a); +Item *create_func_numinteriorring(Item* a); +Item *create_func_numgeometries(Item* a); + +Item *create_func_point(Item* a,Item* b); + diff --git a/sql/item_func.cc b/sql/item_func.cc index 1818a755a43..65d4413b484 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -27,6 +27,8 @@ #include #include #include "slave.h" // for wait_for_master_pos +#include "gstream.h" + /* return TRUE if item is a constant */ @@ -2252,3 +2254,130 @@ Item *get_system_var(LEX_STRING name) my_error(ER_UNKNOWN_SYSTEM_VARIABLE,MYF(0),name); return 0; } + + +/************************************************************************** +Spatial functions +***************************************************************************/ + +longlong Item_func_dimension::val_int() +{ + uint32 dim; + String *wkb=args[0]->val_str(&value); + Geometry geom; + + null_value= (!wkb || + args[0]->null_value || + geom.create_from_wkb(wkb->ptr(),wkb->length()) || + geom.dimension(&dim)); + + return (longlong) dim; +} + +longlong Item_func_numinteriorring::val_int() +{ + uint32 num; + String *wkb=args[0]->val_str(&value); + Geometry geom; + + null_value= (!wkb || + args[0]->null_value || + geom.create_from_wkb(wkb->ptr(),wkb->length()) || + !GEOM_METHOD_PRESENT(geom,num_interior_ring) || + geom.num_interior_ring(&num)); + + return (longlong) num; +} + +longlong Item_func_numgeometries::val_int() +{ + uint32 num; + String *wkb=args[0]->val_str(&value); + Geometry geom; + + null_value= (!wkb || + args[0]->null_value || + geom.create_from_wkb(wkb->ptr(),wkb->length()) || + !GEOM_METHOD_PRESENT(geom,num_geometries) || + geom.num_geometries(&num)); + + return (longlong) num; +} + +longlong Item_func_numpoints::val_int() +{ + uint32 num; + String *wkb=args[0]->val_str(&value); + Geometry geom; + + null_value= (!wkb || + args[0]->null_value || + geom.create_from_wkb(wkb->ptr(),wkb->length()) || + !GEOM_METHOD_PRESENT(geom,num_points) || + geom.num_points(&num)); + + return (longlong) num; +} + + +double Item_func_x::val() +{ + double res; + String *wkb=args[0]->val_str(&value); + Geometry geom; + + null_value= (!wkb || + args[0]->null_value || + geom.create_from_wkb(wkb->ptr(),wkb->length()) || + !GEOM_METHOD_PRESENT(geom,get_x) || + geom.get_x(&res)); + + return res; +} + + +double Item_func_y::val() +{ + double res; + String *wkb=args[0]->val_str(&value); + Geometry geom; + + null_value= (!wkb || + args[0]->null_value || + geom.create_from_wkb(wkb->ptr(),wkb->length()) || + !GEOM_METHOD_PRESENT(geom,get_y) || + geom.get_y(&res)); + + return res; +} + + +double Item_func_area::val() +{ + double res; + String *wkb=args[0]->val_str(&value); + Geometry geom; + + null_value= (!wkb || + args[0]->null_value || + geom.create_from_wkb(wkb->ptr(),wkb->length()) || + !GEOM_METHOD_PRESENT(geom,area) || + geom.area(&res)); + + return res; +} + + +double Item_func_glength::val() +{ + double res; + String *wkb=args[0]->val_str(&value); + Geometry geom; + + null_value= (!wkb || + args[0]->null_value || + geom.create_from_wkb(wkb->ptr(),wkb->length()) || + !GEOM_METHOD_PRESENT(geom,length) || + geom.length(&res)); + return res; +} diff --git a/sql/item_func.h b/sql/item_func.h index 823bfb44a96..41df0a63c1c 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -39,7 +39,12 @@ public: enum Functype { UNKNOWN_FUNC,EQ_FUNC,EQUAL_FUNC,NE_FUNC,LT_FUNC,LE_FUNC, GE_FUNC,GT_FUNC,FT_FUNC, LIKE_FUNC,NOTLIKE_FUNC,ISNULL_FUNC,ISNOTNULL_FUNC, - COND_AND_FUNC,COND_OR_FUNC,BETWEEN,IN_FUNC,INTERVAL_FUNC}; + COND_AND_FUNC,COND_OR_FUNC,BETWEEN,IN_FUNC,INTERVAL_FUNC, + SP_EQUALS_FUNC, SP_DISJOINT_FUNC,SP_INTERSECTS_FUNC, + SP_TOUCHES_FUNC,SP_CROSSES_FUNC,SP_WITHIN_FUNC, + SP_CONTAINS_FUNC,SP_OVERLAPS_FUNC, + SP_STARTPOINT,SP_ENDPOINT,SP_EXTERIORRING, + SP_POINTN,SP_GEOMETRYN,SP_INTERIORRINGN}; enum optimize_type { OPTIMIZE_NONE,OPTIMIZE_KEY,OPTIMIZE_OP, OPTIMIZE_NULL }; enum Type type() const { return FUNC_ITEM; } virtual enum Functype functype() const { return UNKNOWN_FUNC; } @@ -944,6 +949,86 @@ public: void init_search(bool no_order); }; + +class Item_func_dimension :public Item_int_func +{ + String value; +public: + Item_func_dimension(Item *a) :Item_int_func(a) {} + longlong val_int(); + const char *func_name() const { return "dimension"; } + void fix_length_and_dec() { max_length=10; } +}; + + +class Item_func_x :public Item_real_func +{ + String value; +public: + Item_func_x(Item *a) :Item_real_func(a) {} + double val(); + const char *func_name() const { return "x"; } +}; + + +class Item_func_y :public Item_real_func +{ + String value; +public: + Item_func_y(Item *a) :Item_real_func(a) {} + double val(); + const char *func_name() const { return "y"; } +}; + + +class Item_func_numgeometries :public Item_int_func +{ + String value; +public: + Item_func_numgeometries(Item *a) :Item_int_func(a) {} + longlong val_int(); + const char *func_name() const { return "numgeometries"; } + void fix_length_and_dec() { max_length=10; } +}; + +class Item_func_numinteriorring :public Item_int_func +{ + String value; +public: + Item_func_numinteriorring(Item *a) :Item_int_func(a) {} + longlong val_int(); + const char *func_name() const { return "numinteriorring"; } + void fix_length_and_dec() { max_length=10; } +}; + +class Item_func_numpoints :public Item_int_func +{ + String value; +public: + Item_func_numpoints(Item *a) :Item_int_func(a) {} + longlong val_int(); + const char *func_name() const { return "numpoints"; } + void fix_length_and_dec() { max_length=10; } +}; + +class Item_func_area :public Item_real_func +{ + String value; +public: + Item_func_area(Item *a) :Item_real_func(a) {} + double val(); + const char *func_name() const { return "area"; } +}; + +class Item_func_glength :public Item_real_func +{ + String value; +public: + Item_func_glength(Item *a) :Item_real_func(a) {} + double val(); + const char *func_name() const { return "glength"; } +}; + class Item_func_match_nl :public Item_func_match { public: diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index c64fdc7a049..cdf909e8c4d 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1953,3 +1953,333 @@ String* Item_func_inet_ntoa::val_str(String* str) str->length(str->length()-1); // Remove last '.'; return str; } + +/******************************************************* +General functions for spatial objects +********************************************************/ + +#include "gstream.h" + +String *Item_func_geometry_from_text::val_str(String *str) +{ + Geometry geom; + String *wkt = args[0]->val_str(str); + GTextReadStream trs(wkt->ptr(), wkt->length()); + + str->length(0); + if ((null_value=(args[0]->null_value || geom.create_from_wkt(&trs, str, 0)))) + return 0; + return str; +} + + +void Item_func_geometry_from_text::fix_length_and_dec() +{ + max_length=MAX_BLOB_WIDTH; +} + + +String *Item_func_as_text::val_str(String *str) +{ + String *wkt = args[0]->val_str(str); + Geometry geom; + + str->length(0); + if ((null_value=(args[0]->null_value || + geom.create_from_wkb(wkt->ptr(),wkt->length()) || + geom.as_wkt(str)))) + return 0; + return str; +} + +void Item_func_as_text::fix_length_and_dec() +{ + max_length=MAX_BLOB_WIDTH; +} + +String *Item_func_geometry_type::val_str(String *str) +{ + String *wkt = args[0]->val_str(str); + Geometry geom; + + if ((null_value=(args[0]->null_value || + geom.create_from_wkb(wkt->ptr(),wkt->length())))) + return 0; + str->copy(geom.get_class_info()->m_name); + return str; +} + + +String *Item_func_envelope::val_str(String *str) +{ + String *wkb = args[0]->val_str(str); + Geometry geom; + + null_value = args[0]->null_value || + geom.create_from_wkb(wkb->ptr(),wkb->length()) || + geom.envelope(str); + + return null_value ? 0 : str; +} + + +String *Item_func_centroid::val_str(String *str) +{ + String *wkb = args[0]->val_str(str); + Geometry geom; + + null_value = args[0]->null_value || + geom.create_from_wkb(wkb->ptr(),wkb->length()) || + !GEOM_METHOD_PRESENT(geom,centroid) || + geom.centroid(str); + + return null_value ? 0: str; +} + + +/*********************************************** + Spatial decomposition functions +***********************************************/ + +String *Item_func_spatial_decomp::val_str(String *str) +{ + String *wkb = args[0]->val_str(str); + Geometry geom; + + if ((null_value = (args[0]->null_value || + geom.create_from_wkb(wkb->ptr(),wkb->length())))) + return 0; + + null_value=1; + switch(decomp_func) + { + case SP_STARTPOINT: + if (!GEOM_METHOD_PRESENT(geom,start_point) || geom.start_point(str)) + goto ret; + break; + + case SP_ENDPOINT: + if (!GEOM_METHOD_PRESENT(geom,end_point) || geom.end_point(str)) + goto ret; + break; + + case SP_EXTERIORRING: + if (!GEOM_METHOD_PRESENT(geom,exterior_ring) || geom.exterior_ring(str)) + goto ret; + break; + + default: + goto ret; + } + null_value=0; + +ret: + return null_value ? 0 : str; +} + + +String *Item_func_spatial_decomp_n::val_str(String *str) +{ + String *wkb = args[0]->val_str(str); + long n = (long) args[1]->val_int(); + Geometry geom; + + if ((null_value = (args[0]->null_value || + args[1]->null_value || + geom.create_from_wkb(wkb->ptr(),wkb->length()) ))) + return 0; + + null_value=1; + + switch(decomp_func_n) + { + case SP_POINTN: + if (!GEOM_METHOD_PRESENT(geom,point_n) || + geom.point_n(n,str)) + goto ret; + break; + + case SP_GEOMETRYN: + if (!GEOM_METHOD_PRESENT(geom,geometry_n) || + geom.geometry_n(n,str)) + goto ret; + break; + + case SP_INTERIORRINGN: + if (!GEOM_METHOD_PRESENT(geom,interior_ring_n) || + geom.interior_ring_n(n,str)) + goto ret; + break; + + default: + goto ret; + } + null_value=0; + +ret: + return null_value ? 0 : str; +} + + + +/*********************************************** +Functions to concatinate various spatial objects +************************************************/ + + +/* +* Concatinate doubles into Point +*/ + + +String *Item_func_point::val_str(String *str) +{ + if ( (null_value = (args[0]->null_value || + args[1]->null_value || + str->realloc(1+4+8+8)))) + return 0; + + str->length(0); + str->q_append((char)Geometry::wkbNDR); + str->q_append((uint32)Geometry::wkbPoint); + str->q_append((double)args[0]->val()); + str->q_append((double)args[1]->val()); + return str; +} + + +/* + Concatinates various items into various collections + with checkings for valid wkb type of items. + For example, MultiPoint can be a collection of Points only. + coll_type contains wkb type of target collection. + item_type contains a valid wkb type of items. + In the case when coll_type is wkbGeometryCollection, + we do not check wkb type of items, any is valid. +*/ + +String *Item_func_spatial_collection::val_str(String *str) +{ + uint i; + + null_value=1; + + str->length(0); + if(str->reserve(9,512)) + return 0; + + str->q_append((char)Geometry::wkbNDR); + str->q_append((uint32)coll_type); + str->q_append((uint32)arg_count); + + for (i = 0; i < arg_count; ++i) + { + if (args[i]->null_value) + goto ret; + + String *res = args[i]->val_str(str); + + if ( coll_type == Geometry::wkbGeometryCollection ) + { + /* + In the case of GeometryCollection we don't need + any checkings for item types, so just copy them + into target collection + */ + if ((null_value=(str->reserve(res->length(),512)))) + goto ret; + + str->q_append(res->ptr(),res->length()); + } + else + { + uint32 wkb_type, len=res->length(); + const char *data=res->ptr()+1; + + /* + In the case of named collection we must to + check that items are of specific type, let's + do this checking now + */ + + if (len<5) + goto ret; + wkb_type=uint4korr(data); + data+=4; + len-=5; + if ( wkb_type != item_type ) + goto ret; + + switch(coll_type) + { + case Geometry::wkbMultiPoint: + case Geometry::wkbMultiLineString: + case Geometry::wkbMultiPolygon: + if (lenreserve(len,512)) + goto ret; + str->q_append(data,len); + break; + + case Geometry::wkbLineString: + if (str->reserve(POINT_DATA_SIZE,512)) + goto ret; + str->q_append(data,POINT_DATA_SIZE); + break; + + case Geometry::wkbPolygon: + { + uint32 n_points; + double x1, y1, x2, y2; + + if (len < WKB_HEADER_SIZE + 4 + 8 + 8) + goto ret; + data+=WKB_HEADER_SIZE; + len-=WKB_HEADER_SIZE; + + uint32 llen=len; + const char *ldata=data; + + n_points=uint4korr(data); + data+=4; + float8get(x1,data); + data+=8; + float8get(y1,data); + data+=8; + + len-= 4 + 8 + 8; + + if (len < n_points * POINT_DATA_SIZE) + goto ret; + data+=(n_points-2) * POINT_DATA_SIZE; + + float8get(x2,data); + float8get(y2,data+8); + + if ((x1 != x2) || (y1 != y2)) + goto ret; + + if (str->reserve(llen,512)) + goto ret; + str->q_append(ldata, llen); + } + break; + + default: + goto ret; + } + } + } + + if (str->length() > max_allowed_packet) + goto ret; + + null_value = 0; + +ret: + return null_value ? 0 : str; +} diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index 1279a5099d5..a8768e62f98 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -475,3 +475,196 @@ public: const char *func_name() const { return "inet_ntoa"; } void fix_length_and_dec() { decimals = 0; max_length=3*8+7; } }; + + +/******************************************************* +Spatial functions +********************************************************/ + +class Item_func_geometry_from_text :public Item_str_func +{ +public: + Item_func_geometry_from_text(Item *a) :Item_str_func(a) {} + const char *func_name() const { return "geometryfromtext"; } + String *val_str(String *); + void fix_length_and_dec(); +}; + +class Item_func_as_text :public Item_str_func +{ +public: + Item_func_as_text(Item *a) :Item_str_func(a) {} + const char *func_name() const { return "astext"; } + String *val_str(String *); + void fix_length_and_dec(); +}; + +class Item_func_geometry_type :public Item_str_func +{ +public: + Item_func_geometry_type(Item *a) :Item_str_func(a) {} + String *val_str(String *); + const char *func_name() const { return "geometrytype"; } + void fix_length_and_dec() + { + max_length=20; // "GeometryCollection" is the most long + }; +}; + +class Item_func_centroid :public Item_str_func +{ +public: + Item_func_centroid(Item *a) :Item_str_func(a) {} + const char *func_name() const { return "centroid"; } + String *val_str(String *); + void fix_length_and_dec(){max_length=MAX_BLOB_WIDTH;} +}; + +class Item_func_envelope :public Item_str_func +{ +public: + Item_func_envelope(Item *a) :Item_str_func(a) {} + const char *func_name() const { return "envelope"; } + String *val_str(String *); + void fix_length_and_dec(){max_length=MAX_BLOB_WIDTH;} +}; + +class Item_func_point :public Item_str_func +{ +public: + Item_func_point(Item *a,Item *b) :Item_str_func(a,b) {} + const char *func_name() const { return "point"; } + String *val_str(String *); + void fix_length_and_dec(){max_length=MAX_BLOB_WIDTH;} +}; + +class Item_func_spatial_decomp :public Item_str_func +{ + enum Functype decomp_func; +public: + Item_func_spatial_decomp(Item *a, Item_func::Functype ft) : + Item_str_func(a) { decomp_func = ft; } + const char *func_name() const + { + switch (decomp_func) + { + case SP_STARTPOINT: + return "startpoint"; + case SP_ENDPOINT: + return "endpoint"; + case SP_EXTERIORRING: + return "exteriorring"; + default: + return "spatial_decomp_unknown"; + } + } + String *val_str(String *); + void fix_length_and_dec(){max_length=MAX_BLOB_WIDTH;} +}; + +class Item_func_spatial_decomp_n :public Item_str_func +{ + enum Functype decomp_func_n; +public: + Item_func_spatial_decomp_n(Item *a, Item *b, Item_func::Functype ft) : + Item_str_func(a, b) { decomp_func_n = ft; } + const char *func_name() const + { + switch (decomp_func_n) + { + case SP_POINTN: + return "pointn"; + case SP_GEOMETRYN: + return "geometryn"; + case SP_INTERIORRINGN: + return "interiorringn"; + default: + return "spatial_decomp_n_unknown"; + } + } + String *val_str(String *); + void fix_length_and_dec(){max_length=MAX_BLOB_WIDTH;} +}; + + +class Item_func_spatial_collection :public Item_str_func +{ + String tmp_value; + enum Geometry::wkbType coll_type; + enum Geometry::wkbType item_type; +public: + Item_func_spatial_collection( + List &list, enum Geometry::wkbType ct, enum Geometry::wkbType it) : + Item_str_func(list) + { + coll_type=ct; + item_type=it; + } + String *val_str(String *); + void fix_length_and_dec(){max_length=MAX_BLOB_WIDTH;} + const char *func_name() const { return "multipoint"; } +}; + + +/* +class Item_func_multipoint :public Item_str_func +{ + String tmp_value; +public: + Item_func_multipoint(List &list) :Item_str_func(list) {} + String *val_str(String *); + void fix_length_and_dec(){max_length=MAX_BLOB_WIDTH;} + const char *func_name() const { return "multipoint"; } +}; + +class Item_func_linestring :public Item_str_func +{ + String tmp_value; +public: + Item_func_linestring(List &list) :Item_str_func(list) {} + String *val_str(String *); + void fix_length_and_dec(){max_length=MAX_BLOB_WIDTH;} + const char *func_name() const { return "linestring"; } +}; + +class Item_func_multilinestring :public Item_str_func +{ + String tmp_value; +public: + Item_func_multilinestring(List &list) :Item_str_func(list) {} + String *val_str(String *); + void fix_length_and_dec(){max_length=MAX_BLOB_WIDTH;} + const char *func_name() const { return "multilinestring"; } +}; + +class Item_func_polygon :public Item_str_func +{ + String tmp_value; +public: + Item_func_polygon(List &list) :Item_str_func(list) {} + String *val_str(String *); + void fix_length_and_dec(){max_length=MAX_BLOB_WIDTH;} + const char *func_name() const { return "polygon"; } +}; + +class Item_func_multipolygon :public Item_str_func +{ + String tmp_value; +public: + Item_func_multipolygon(List &list) :Item_str_func(list) {} + String *val_str(String *); + void fix_length_and_dec(){max_length=MAX_BLOB_WIDTH;} + const char *func_name() const { return "multipolygon"; } +}; + +class Item_func_geometrycollection :public Item_str_func +{ + String tmp_value; +public: + Item_func_geometrycollection(List &list) :Item_str_func(list) {} + String *val_str(String *); + void fix_length_and_dec(){max_length=MAX_BLOB_WIDTH;} + const char *func_name() const { return "geometrycollection"; } +}; + +*/ diff --git a/sql/lex.h b/sql/lex.h index 6bee4152e48..04edaf217b9 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -75,6 +75,7 @@ static SYMBOL symbols[] = { { "BOOL", SYM(BOOL_SYM),0,0}, { "BOOLEAN", SYM(BOOLEAN_SYM),0,0}, { "BOTH", SYM(BOTH),0,0}, + { "BTREE", SYM(BTREE_SYM),0,0}, { "BY", SYM(BY),0,0}, { "CACHE", SYM(CACHE_SYM),0,0}, { "CASCADE", SYM(CASCADE),0,0}, @@ -158,12 +159,14 @@ static SYMBOL symbols[] = { { "FULL", SYM(FULL),0,0}, { "FULLTEXT", SYM(FULLTEXT_SYM),0,0}, { "FUNCTION", SYM(UDF_SYM),0,0}, + { "GEOM", SYM(GEOM_SYM),0,0}, { "GLOBAL", SYM(GLOBAL_SYM),0,0}, { "GRANT", SYM(GRANT),0,0}, { "GRANTS", SYM(GRANTS),0,0}, { "GROUP", SYM(GROUP),0,0}, { "HAVING", SYM(HAVING),0,0}, { "HANDLER", SYM(HANDLER_SYM),0,0}, + { "HASH", SYM(HASH_SYM),0,0}, { "HEAP", SYM(HEAP_SYM),0,0}, { "HIGH_PRIORITY", SYM(HIGH_PRIORITY),0,0}, { "HOUR", SYM(HOUR_SYM),0,0}, @@ -296,6 +299,7 @@ static SYMBOL symbols[] = { { "ROLLBACK", SYM(ROLLBACK_SYM),0,0}, { "ROW", SYM(ROW_SYM),0,0}, { "ROWS", SYM(ROWS_SYM),0,0}, + { "RTREE", SYM(RTREE_SYM),0,0}, { "SECOND", SYM(SECOND_SYM),0,0}, { "SELECT", SYM(SELECT_SYM),0,0}, { "SERIALIZABLE", SYM(SERIALIZABLE_SYM),0,0}, @@ -308,6 +312,7 @@ static SYMBOL symbols[] = { { "SLAVE", SYM(SLAVE),0,0}, { "SMALLINT", SYM(SMALLINT),0,0}, { "SONAME", SYM(UDF_SONAME_SYM),0,0}, + { "SPATIAL", SYM(SPATIAL_SYM),0,0}, { "SQL_AUTO_IS_NULL", SYM(SQL_AUTO_IS_NULL),0,0}, { "SQL_BIG_RESULT", SYM(SQL_BIG_RESULT),0,0}, { "SQL_BIG_SELECTS", SYM(SQL_BIG_SELECTS),0,0}, @@ -384,8 +389,10 @@ static SYMBOL sql_functions[] = { { "ABS", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_abs)}, { "ACOS", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_acos)}, { "ADDDATE", SYM(DATE_ADD_INTERVAL),0,0}, + { "AREA", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_area)}, { "ASCII", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ascii)}, { "ASIN", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_asin)}, + { "ASTEXT", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_as_text)}, { "ATAN", SYM(ATAN),0,0}, { "ATAN2", SYM(ATAN),0,0}, { "BENCHMARK", SYM(BENCHMARK_SYM),0,0}, @@ -396,17 +403,20 @@ static SYMBOL sql_functions[] = { { "CAST", SYM(CAST_SYM),0,0}, { "CEILING", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ceiling)}, { "BIT_LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_bit_length)}, + { "CENTROID", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_centroid)}, { "CHAR_LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_char_length)}, { "CHARACTER_LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_char_length)}, { "COALESCE", SYM(COALESCE),0,0}, { "CONCAT", SYM(CONCAT),0,0}, { "CONCAT_WS", SYM(CONCAT_WS),0,0}, { "CONNECTION_ID", SYM(FUNC_ARG0),0,CREATE_FUNC(create_func_connection_id)}, + { "CONTAINS", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_contains)}, { "CONV", SYM(FUNC_ARG3),0,CREATE_FUNC(create_func_conv)}, { "CONVERT", SYM(CONVERT_SYM),0,0}, { "COUNT", SYM(COUNT_SYM),0,0}, { "COS", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_cos)}, { "COT", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_cot)}, + { "CROSSES", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_crosses)}, { "CURDATE", SYM(CURDATE),0,0}, { "CURTIME", SYM(CURTIME),0,0}, { "DATE_ADD", SYM(DATE_ADD_INTERVAL),0,0}, @@ -420,9 +430,15 @@ static SYMBOL sql_functions[] = { { "DEGREES", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_degrees)}, { "DES_ENCRYPT", SYM(DES_ENCRYPT_SYM),0,0}, { "DES_DECRYPT", SYM(DES_DECRYPT_SYM),0,0}, + { "DIMENSION", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_dimension)}, + { "DISJOINT", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_disjoint)}, { "ELT", SYM(ELT_FUNC),0,0}, { "ENCODE", SYM(ENCODE_SYM),0,0}, { "ENCRYPT", SYM(ENCRYPT),0,0}, + { "ENDPOINT", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_endpoint)}, + { "ENVELOPE", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_envelope)}, + { "EQUALS", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_equals)}, + { "EXTERIORRING", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_exteriorring)}, { "EXTRACT", SYM(EXTRACT_SYM),0,0}, { "EXP", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_exp)}, { "EXPORT_SET", SYM(EXPORT_SET),0,0}, @@ -434,6 +450,11 @@ static SYMBOL sql_functions[] = { { "FROM_DAYS", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_from_days)}, { "FROM_UNIXTIME", SYM(FROM_UNIXTIME),0,0}, { "GET_LOCK", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_get_lock)}, + { "GEOMETRYCOLLECTION",SYM(GEOMETRYCOLLECTION),0,0}, + { "GEOMETRYN", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_geometryn)}, + { "GEOMETRYTYPE", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_geometry_type)}, + { "GEOMFROMTEXT", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_geometry_from_text)}, + { "GLENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_glength)}, { "GREATEST", SYM(GREATEST_SYM),0,0}, { "GROUP_UNIQUE_USERS", SYM(GROUP_UNIQUE_USERS),0,0}, { "HEX", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_hex)}, @@ -441,10 +462,16 @@ static SYMBOL sql_functions[] = { { "INET_ATON", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_inet_aton)}, { "INET_NTOA", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_inet_ntoa)}, { "INSTR", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_instr)}, + { "INTERIORRINGN", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_interiorringn)}, + { "INTERSECTS", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_intersects)}, + { "ISCLOSED", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_isclosed)}, + { "ISEMPTY", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_isempty)}, { "ISNULL", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_isnull)}, + { "ISSIMPLE", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_issimple)}, { "LCASE", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_lcase)}, { "LEAST", SYM(LEAST_SYM),0,0}, { "LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_length)}, + { "LINESTRING", SYM(LINESTRING),0,0}, { "LOAD_FILE", SYM(FUNC_ARG1),0,CREATE_FUNC(create_load_file)}, { "LOCATE", SYM(LOCATE),0,0}, { "LOG", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_log)}, @@ -460,15 +487,25 @@ static SYMBOL sql_functions[] = { { "MID", SYM(SUBSTRING),0,0}, /* unireg function */ { "MIN", SYM(MIN_SYM),0,0}, { "MOD", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_mod)}, + { "MULTILINESTRING", SYM(MULTILINESTRING),0,0}, + { "MULTIPOINT", SYM(MULTIPOINT),0,0}, + { "MULTIPOLYGON", SYM(MULTIPOLYGON),0,0}, { "MONTHNAME", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_monthname)}, { "NOW", SYM(NOW_SYM),0,0}, { "NULLIF", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_nullif)}, + { "NUMGEOMETRIES", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_numgeometries)}, + { "NUMINTERIORRING", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_numinteriorring)}, + { "NUMPOINTS", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_numpoints)}, { "OCTET_LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_length)}, { "OCT", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_oct)}, { "ORD", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ord)}, + { "OVERLAPS", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_overlaps)}, { "PERIOD_ADD", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_period_add)}, { "PERIOD_DIFF", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_period_diff)}, { "PI", SYM(FUNC_ARG0),0,CREATE_FUNC(create_func_pi)}, + { "POINT", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_point)}, + { "POINTN", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_pointn)}, + { "POLYGON", SYM(POLYGON),0,0}, { "POSITION", SYM(POSITION_SYM),0,0}, { "POW", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_pow)}, { "POWER", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_pow)}, @@ -489,6 +526,7 @@ static SYMBOL sql_functions[] = { { "SOUNDEX", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_soundex)}, { "SPACE", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_space)}, { "SQRT", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_sqrt)}, + { "STARTPOINT", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_startpoint)}, { "STD", SYM(STD_SYM),0,0}, { "STDDEV", SYM(STD_SYM),0,0}, { "STRCMP", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_strcmp)}, @@ -501,6 +539,7 @@ static SYMBOL sql_functions[] = { { "TIME_FORMAT", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_time_format)}, { "TIME_TO_SEC", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_time_to_sec)}, { "TO_DAYS", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_to_days)}, + { "TOUCHES", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_touches)}, { "TRIM", SYM(TRIM),0,0}, { "UCASE", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ucase)}, { "UNIQUE_USERS", SYM(UNIQUE_USERS),0,0}, @@ -510,5 +549,9 @@ static SYMBOL sql_functions[] = { { "VERSION", SYM(FUNC_ARG0),0,CREATE_FUNC(create_func_version)}, { "WEEK", SYM(WEEK_SYM),0,0}, { "WEEKDAY", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_weekday)}, + { "WITHIN", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_within)}, + { "X", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_x)}, + { "Y", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_y)}, { "YEARWEEK", SYM(YEARWEEK),0,0} + }; diff --git a/sql/opt_range.cc b/sql/opt_range.cc index c3f4c91b718..34ee34ecc79 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -172,8 +172,9 @@ public: void store(uint length,char **min_key,uint min_key_flag, char **max_key, uint max_key_flag) { - if (!(min_flag & NO_MIN_RANGE) && - !(min_key_flag & (NO_MIN_RANGE | NEAR_MIN))) + if ((min_flag & GEOM_FLAG) || + (!(min_flag & NO_MIN_RANGE) && + !(min_key_flag & (NO_MIN_RANGE | NEAR_MIN)))) { if (maybe_null && *min_value) { @@ -659,6 +660,8 @@ int SQL_SELECT::test_quick_select(key_map keys_to_use, table_map prev_tables, key_parts->null_bit= key_info->key_part[part].null_bit; if (key_parts->field->type() == FIELD_TYPE_BLOB) key_parts->part_length+=HA_KEY_BLOB_LENGTH; + key_parts->image_type = + (key_info->flags & HA_SPATIAL) ? Field::itMBR : Field::itRAW; } param.real_keynr[param.keys++]=idx; } @@ -676,6 +679,7 @@ int SQL_SELECT::test_quick_select(key_map keys_to_use, table_map prev_tables, { SEL_ARG **key,**end,**best_key=0; + for (idx=0,key=tree->keys, end=key+param.keys ; key != end ; key++,idx++) @@ -1042,7 +1046,7 @@ get_mm_leaf(PARAM *param, Field *field, KEY_PART *key_part, DBUG_RETURN(0); if (maybe_null) *str=0; // Not NULL - field->get_key_image(str+maybe_null,key_part->part_length); + field->get_key_image(str+maybe_null,key_part->part_length, key_part->image_type); if (!(tree=new SEL_ARG(field,str,str))) DBUG_RETURN(0); @@ -1067,6 +1071,41 @@ get_mm_leaf(PARAM *param, Field *field, KEY_PART *key_part, case Item_func::GE_FUNC: tree->max_flag=NO_MAX_RANGE; break; + case Item_func::SP_EQUALS_FUNC: + tree->min_flag=GEOM_FLAG | HA_READ_MBR_EQUAL;// NEAR_MIN;//512; + tree->max_flag=NO_MAX_RANGE; + break; + case Item_func::SP_DISJOINT_FUNC: + tree->min_flag=GEOM_FLAG | HA_READ_MBR_DISJOINT;// NEAR_MIN;//512; + tree->max_flag=NO_MAX_RANGE; + break; + case Item_func::SP_INTERSECTS_FUNC: + tree->min_flag=GEOM_FLAG | HA_READ_MBR_INTERSECT;// NEAR_MIN;//512; + tree->max_flag=NO_MAX_RANGE; + break; + case Item_func::SP_TOUCHES_FUNC: + tree->min_flag=GEOM_FLAG | HA_READ_MBR_INTERSECT;// NEAR_MIN;//512; + tree->max_flag=NO_MAX_RANGE; + break; + + case Item_func::SP_CROSSES_FUNC: + tree->min_flag=GEOM_FLAG | HA_READ_MBR_INTERSECT;// NEAR_MIN;//512; + tree->max_flag=NO_MAX_RANGE; + break; + case Item_func::SP_WITHIN_FUNC: + tree->min_flag=GEOM_FLAG | HA_READ_MBR_WITHIN;// NEAR_MIN;//512; + tree->max_flag=NO_MAX_RANGE; + break; + + case Item_func::SP_CONTAINS_FUNC: + tree->min_flag=GEOM_FLAG | HA_READ_MBR_CONTAIN;// NEAR_MIN;//512; + tree->max_flag=NO_MAX_RANGE; + break; + case Item_func::SP_OVERLAPS_FUNC: + tree->min_flag=GEOM_FLAG | HA_READ_MBR_INTERSECT;// NEAR_MIN;//512; + tree->max_flag=NO_MAX_RANGE; + break; + default: break; } @@ -2187,18 +2226,30 @@ check_quick_keys(PARAM *param,uint idx,SEL_ARG *key_tree, !memcmp(param->min_key,param->max_key,min_key_length)) tmp=1; // Max one record else + { + if(tmp_min_flag & GEOM_FLAG) + { + tmp=param->table->file-> + records_in_range((int) keynr,(byte*)(param->min_key + 1), + min_key_length, (ha_rkey_function)(tmp_min_flag ^ GEOM_FLAG), + (byte *)NullS,0,HA_READ_KEY_EXACT); + } + else + { tmp=param->table->file-> records_in_range((int) keynr, (byte*) (!min_key_length ? NullS : param->min_key), min_key_length, - (tmp_min_flag & NEAR_MIN ? - HA_READ_AFTER_KEY : HA_READ_KEY_EXACT), + tmp_min_flag & NEAR_MIN ? + HA_READ_AFTER_KEY : HA_READ_KEY_EXACT, (byte*) (!max_key_length ? NullS : param->max_key), max_key_length, (tmp_max_flag & NEAR_MAX ? HA_READ_BEFORE_KEY : HA_READ_AFTER_KEY)); + } + } end: if (tmp == HA_POS_ERROR) // Impossible range return tmp; @@ -2294,19 +2345,24 @@ get_quick_keys(PARAM *param,QUICK_SELECT *quick,KEY_PART *key, } } else - flag=key_tree->min_flag | key_tree->max_flag; + { + flag = (key_tree->min_flag & GEOM_FLAG) ? + key_tree->min_flag : key_tree->min_flag | key_tree->max_flag; + } /* Ensure that some part of min_key and max_key are used. If not, regard this as no lower/upper range */ - if (tmp_min_key != param->min_key) - flag&= ~NO_MIN_RANGE; - else - flag|= NO_MIN_RANGE; - if (tmp_max_key != param->max_key) - flag&= ~NO_MAX_RANGE; - else - flag|= NO_MAX_RANGE; - + if((flag & GEOM_FLAG) == 0) + { + if (tmp_min_key != param->min_key) + flag&= ~NO_MIN_RANGE; + else + flag|= NO_MIN_RANGE; + if (tmp_max_key != param->max_key) + flag&= ~NO_MAX_RANGE; + else + flag|= NO_MAX_RANGE; + } if (flag == 0) { uint length= (uint) (tmp_min_key - param->min_key); @@ -2439,13 +2495,19 @@ int QUICK_SELECT::get_next() int result; if (range) { // Already read through key - result=((range->flag & EQ_RANGE) ? +/* result=((range->flag & EQ_RANGE) ? file->index_next_same(record, (byte*) range->min_key, range->min_length) : file->index_next(record)); +*/ + result=((range->flag & (EQ_RANGE | GEOM_FLAG) ) ? + file->index_next_same(record, (byte*) range->min_key, + range->min_length) : + file->index_next(record)); + if (!result) { - if (!cmp_next(*it.ref())) + if ((range->flag & GEOM_FLAG) || !cmp_next(*it.ref())) DBUG_RETURN(0); } else if (result != HA_ERR_END_OF_FILE) @@ -2454,6 +2516,23 @@ int QUICK_SELECT::get_next() if (!(range=it++)) DBUG_RETURN(HA_ERR_END_OF_FILE); // All ranges used + + if(range->flag & GEOM_FLAG) + { + if ((result = file->index_read(record, + (byte*) (range->min_key + ((range->flag & GEOM_FLAG) > 0)), + range->min_length, + (ha_rkey_function)(range->flag ^ GEOM_FLAG)))) + + { + if (result != HA_ERR_KEY_NOT_FOUND) + DBUG_RETURN(result); + range=0; // Not found, to next range + continue; + } + DBUG_RETURN(0); + } + if (range->flag & NO_MIN_RANGE) // Read first record { int error; @@ -2464,13 +2543,14 @@ int QUICK_SELECT::get_next() range=0; // No matching records; go to next range continue; } - if ((result = file->index_read(record,(byte*) range->min_key, + if ((result = file->index_read(record, + (byte*) (range->min_key + ((range->flag & GEOM_FLAG) > 0)), range->min_length, - ((range->flag & NEAR_MIN) ? + (range->flag & NEAR_MIN) ? HA_READ_AFTER_KEY: (range->flag & EQ_RANGE) ? HA_READ_KEY_EXACT : - HA_READ_KEY_OR_NEXT)))) + HA_READ_KEY_OR_NEXT))) { if (result != HA_ERR_KEY_NOT_FOUND) diff --git a/sql/opt_range.h b/sql/opt_range.h index 83eb10235ea..86df6121042 100644 --- a/sql/opt_range.h +++ b/sql/opt_range.h @@ -31,11 +31,14 @@ #define UNIQUE_RANGE 16 #define EQ_RANGE 32 #define NULL_RANGE 64 +#define GEOM_FLAG 128 + typedef struct st_key_part { - uint16 key,part,part_length; - uint8 null_bit; - Field *field; + uint16 key,part,part_length; + uint8 null_bit; + Field *field; + Field::imagetype image_type; } KEY_PART; class QUICK_RANGE :public Sql_alloc { diff --git a/sql/opt_sum.cc b/sql/opt_sum.cc index 78878c40b37..b7b2552ef52 100644 --- a/sql/opt_sum.cc +++ b/sql/opt_sum.cc @@ -343,7 +343,7 @@ static bool find_range_key(TABLE_REF *ref, Field* field, COND *cond) // Save found constant if (part->null_bit) *key_ptr++= (byte) test(part->field->is_null()); - part->field->get_key_image((char*) key_ptr,part->length); + part->field->get_key_image((char*) key_ptr,part->length, Field::itRAW); key_ptr+=part->store_length - test(part->null_bit); left_length-=part->store_length; } diff --git a/sql/spatial.cc b/sql/spatial.cc new file mode 100644 index 00000000000..32942a70dc2 --- /dev/null +++ b/sql/spatial.cc @@ -0,0 +1,1435 @@ +#include "mysql_priv.h" + + +#define MAX_DIGITS_IN_DOUBLE 16 + +/***************************** GClassInfo *******************************/ + +#define IMPLEMENT_GEOM(class_name, type_id, name) \ +{ \ + (GF_InitFromText) &class_name::init_from_text, \ + (GF_GetDataAsText) &class_name::get_data_as_text, \ + (GF_GetDataSize) &class_name::get_data_size, \ + (GF_GetMBR) &class_name::get_mbr, \ + (GF_GetD) &class_name::get_x, \ + (GF_GetD) &class_name::get_y, \ + (GF_GetD) &class_name::length, \ + (GF_GetD) &class_name::area, \ + (GF_GetI) &class_name::is_closed, \ + (GF_GetUI) &class_name::num_interior_ring, \ + (GF_GetUI) &class_name::num_points, \ + (GF_GetUI) &class_name::num_geometries, \ + (GF_GetUI) &class_name::dimension, \ + (GF_GetWS) &class_name::start_point, \ + (GF_GetWS) &class_name::end_point, \ + (GF_GetWS) &class_name::exterior_ring, \ + (GF_GetWS) &class_name::centroid, \ + (GF_GetUIWS) &class_name::point_n, \ + (GF_GetUIWS) &class_name::interior_ring_n, \ + (GF_GetUIWS) &class_name::geometry_n, \ + class_name::type_id, \ + name, \ + NULL \ +}, + + +static Geometry::GClassInfo ci_collection[] = +{ + IMPLEMENT_GEOM(GPoint, wkbPoint, "POINT") + IMPLEMENT_GEOM(GLineString, wkbLineString, "LINESTRING") + IMPLEMENT_GEOM(GPolygon, wkbPolygon, "POLYGON") + IMPLEMENT_GEOM(GMultiPoint, wkbMultiPoint, "MULTIPOINT") + IMPLEMENT_GEOM(GMultiLineString, wkbMultiLineString, "MULTILINESTRING") + IMPLEMENT_GEOM(GMultiPolygon, wkbMultiPolygon, "MULTIPOLYGON") + IMPLEMENT_GEOM(GGeometryCollection, wkbGeometryCollection, "GEOMETRYCOLLECTION") +}; + +static Geometry::GClassInfo *ci_collection_end = ci_collection + sizeof(ci_collection); + +/***************************** Geometry *******************************/ + +Geometry::GClassInfo *Geometry::find_class(int type_id) +{ + for (GClassInfo *cur_rt = ci_collection; cur_rt < ci_collection_end; ++cur_rt) + { + if (cur_rt->m_type_id == type_id) + { + return cur_rt; + } + } + return NULL; +} + +Geometry::GClassInfo *Geometry::find_class(const char *name, size_t len) +{ + for (GClassInfo *cur_rt = ci_collection; + cur_rt < ci_collection_end; ++cur_rt) + { + if ((cur_rt->m_name[len] == 0) && + (strncmp(cur_rt->m_name, name, len) == 0)) + { + return cur_rt; + } + } + return NULL; +} + +int Geometry::create_from_wkb(const char *data, uint32 data_len) +{ + uint32 geom_type; + + if (data_len < 1+4) + return 1; + data += sizeof(char); + +//FIXME: check byte ordering + geom_type = uint4korr(data); + data += 4; + m_vmt = find_class(geom_type); + if (!m_vmt) return -1; + m_data = data; + m_data_end = data + data_len; + return 0; +} + +int Geometry::create_from_wkt(GTextReadStream *trs, String *wkt, int init_stream) +{ + int name_len; + const char *name = trs->get_next_word(&name_len); + if (!name) + { + trs->set_error_msg("Geometry name expected"); + return -1; + } + if (!(m_vmt = find_class(name, name_len))) + return -1; + if (wkt->reserve(1 + 4, 512)) + return 1; + wkt->q_append((char)wkbNDR); + wkt->q_append((uint32)get_class_info()->m_type_id); + if (trs->get_next_symbol() != '(') + { + trs->set_error_msg("'(' expected"); + return -1; + } + if (init_from_text(trs, wkt)) return 1; + if (trs->get_next_symbol() != ')') + { + trs->set_error_msg("')' expected"); + return -1; + } + if (init_stream) + { + init_from_wkb(wkt->ptr(), wkt->length()); + shift_wkb_header(); + } + return 0; +} + +int Geometry::envelope(String *result) const +{ + MBR mbr; + + get_mbr(&mbr); + + if (result->reserve(1+4*3+sizeof(double)*10)) + return 1; + + result->q_append((char)wkbNDR); + result->q_append((uint32)wkbPolygon); + result->q_append((uint32)1); + result->q_append((uint32)5); + result->q_append(mbr.xmin); + result->q_append(mbr.ymin); + result->q_append(mbr.xmax); + result->q_append(mbr.ymin); + result->q_append(mbr.xmax); + result->q_append(mbr.ymax); + result->q_append(mbr.xmin); + result->q_append(mbr.ymax); + result->q_append(mbr.xmin); + result->q_append(mbr.ymin); + + return 0; +} + +/***************************** Point *******************************/ + +size_t GPoint::get_data_size() const +{ + return POINT_DATA_SIZE; +} + +int GPoint::init_from_text(GTextReadStream *trs, String *wkb) +{ + double x, y; + if (wkb->reserve(sizeof(double)*2)) + return 1; + if (trs->get_next_number(&x)) + return 1; + if (trs->get_next_number(&y)) + return 1; + wkb->q_append(x); + wkb->q_append(y); + + return 0; +} + +int GPoint::get_data_as_text(String *txt) const +{ + double x, y; + if (get_xy(&x, &y)) + return 1; + if (txt->reserve(MAX_DIGITS_IN_DOUBLE * 2 + 1)) + return 1; + txt->qs_append(x); + txt->qs_append(' '); + txt->qs_append(y); + return 0; +} + +int GPoint::get_mbr(MBR *mbr) const +{ + double x, y; + if (get_xy(&x, &y)) + return 1; + mbr->add_xy(x, y); + return 0; +} + +/***************************** LineString *******************************/ + +size_t GLineString::get_data_size() const +{ + uint32 n_points = uint4korr(m_data); + + return 4 + n_points*POINT_DATA_SIZE; +} + +int GLineString::init_from_text(GTextReadStream *trs, String *wkb) +{ + uint32 n_points = 0; + int np_pos = wkb->length(); + GPoint p; + + if (wkb->reserve(4, 512)) + return 1; + + wkb->q_append((uint32)n_points); + + for (;;) + { + if (p.init_from_text(trs, wkb)) + return 1; + ++n_points; + if (trs->get_next_toc_type() == GTextReadStream::comma) + trs->get_next_symbol(); + else break; + } + + if (n_points<2) + { + trs->set_error_msg("Too few points in LINESTRING"); + return 1; + } + + wkb->WriteAtPosition(np_pos, n_points); + + return 0; +} + +int GLineString::get_data_as_text(String *txt) const +{ + uint32 n_points; + const char *data = m_data; + + if (no_data(data, 4)) + return 1; + + n_points = uint4korr(data); + data += 4; + + if (no_data(data, sizeof(double) * 2 * n_points)) + return 1; + + if (txt->reserve(((MAX_DIGITS_IN_DOUBLE + 1)*2 + 1) * n_points)) + return 1; + for (; n_points>0; --n_points) + { + double x, y; + float8get(x, data); + data += sizeof(double); + float8get(y, data); + data += sizeof(double); + txt->qs_append(x); + txt->qs_append(' '); + txt->qs_append(y); + txt->qs_append(','); + } + txt->length(txt->length() - 1); + return 0; +} + +int GLineString::get_mbr(MBR *mbr) const +{ + uint32 n_points; + const char *data = m_data; + + if (no_data(data, 4)) + return 1; + + n_points = uint4korr(data); + data += 4; + + if (no_data(data, sizeof(double) * 2 * n_points)) + return 1; + for (; n_points>0; --n_points) + { + mbr->add_xy((double *)data, (double *)(data + 8)); + data += 8+8; + } + + return 0; +} + +int GLineString::length(double *len) const +{ + uint32 n_points; + double prev_x, prev_y; + const char *data = m_data; + + *len=0; + if (no_data(data, 4)) + return 1; + n_points = uint4korr(data); + data += 4; + + if (no_data(data, sizeof(double) * 2 * n_points)) + return 1; + + --n_points; + float8get(prev_x, data); + data += 8; + float8get(prev_y, data); + data += 8; + + for (; n_points>0; --n_points) + { + double x, y; + float8get(x, data); + data += 8; + float8get(y, data); + data += 8; + *len+=sqrt(pow(prev_x-x,2)+pow(prev_y-y,2)); + prev_x=x; + prev_y=y; + } + return 0; +} + +int GLineString::is_closed(int *closed) const + +{ + uint32 n_points; + double x1, y1, x2, y2; + + const char *data = m_data; + + if (no_data(data, 4)) + return 1; + n_points = uint4korr(data); + data += 4; + if (no_data(data, (8+8) * n_points)) + return 1; + float8get(x1, data); + data += 8; + float8get(y1, data); + data += 8 + (n_points-2)*POINT_DATA_SIZE; + float8get(x2, data); + data += 8; + float8get(y2, data); + + *closed=(x1==x2)&&(y1==y2); + + return 0; +} + +int GLineString::num_points(uint32 *n_points) const +{ + *n_points = uint4korr(m_data); + return 0; +} + +int GLineString::start_point(String *result) const +{ + const char *data = m_data + 4; + if (no_data(data, 8+8)) + return 1; + + if (result->reserve(1 + 4 + sizeof(double) * 2)) + return 1; + + result->q_append((char)wkbNDR); + result->q_append((uint32)wkbPoint); + result->q_append((double *)data); + result->q_append((double *)(data + 8)); + + return 0; +} + +int GLineString::end_point(String *result) const +{ + const char *data = m_data; + uint32 n_points; + + if (no_data(data, 4)) + return 1; + n_points = uint4korr(data); + + data += 4 + (n_points-1)*POINT_DATA_SIZE; + + if (no_data(data, 8+8)) + return 1; + + if (result->reserve(1 + 4 + sizeof(double) * 2)) + return 1; + result->q_append((char)wkbNDR); + result->q_append((uint32)wkbPoint); + result->q_append((double *)data); + result->q_append((double *)(data + 8)); + + return 0; +} + + +int GLineString::point_n(uint32 num, String *result) const +{ + const char *data = m_data; + uint32 n_points; + + if (no_data(data, 4)) + return 1; + n_points = uint4korr(data); + + if ((uint32)(num-1) >= n_points) // really means (num > n_points || num < 1) + return 1; + + data += 4 + (num - 1)*POINT_DATA_SIZE; + + if (no_data(data, 8+8)) + return 1; + if (result->reserve(1 + 4 + sizeof(double) * 2)) + return 1; + + result->q_append((char)wkbNDR); + result->q_append((uint32)wkbPoint); + result->q_append((double *)data); + result->q_append((double *)(data + 8)); + + return 0; +} + +/***************************** Polygon *******************************/ + +size_t GPolygon::get_data_size() const +{ + uint32 n_linear_rings = 0; + const char *data = m_data; + if (no_data(data, 4)) + return 1; + + n_linear_rings = uint4korr(data); + data += 4; + for (; n_linear_rings>0; --n_linear_rings) + { + if (no_data(data, 4)) + return 1; + data += 4 + uint4korr(data)*POINT_DATA_SIZE; + } + return data - m_data; +} + +int GPolygon::init_from_text(GTextReadStream *trs, String *wkb) +{ + uint32 n_linear_rings = 0; + int lr_pos = wkb->length(); + + if (wkb->reserve(4, 512)) + return 1; + + wkb->q_append((uint32)n_linear_rings); + + for (;;) + { + GLineString ls; + size_t ls_pos=wkb->length(); + if (trs->get_next_symbol() != '(') + { + trs->set_error_msg("'(' expected"); + return 1; + } + if (ls.init_from_text(trs, wkb)) + return 1; + if (trs->get_next_symbol() != ')') + { + trs->set_error_msg("')' expected"); + return 1; + } + ls.init_from_wkb(wkb->ptr()+ls_pos, wkb->length()-ls_pos); + int closed; + ls.is_closed(&closed); + if (!closed) + { + trs->set_error_msg("POLYGON's linear ring isn't closed"); + return 1; + } + ++n_linear_rings; + if (trs->get_next_toc_type() == GTextReadStream::comma) + trs->get_next_symbol(); + else + break; + } + wkb->WriteAtPosition(lr_pos, n_linear_rings); + return 0; +} + +int GPolygon::get_data_as_text(String *txt) const +{ + uint32 n_linear_rings; + const char *data = m_data; + + if (no_data(data, 4)) + return 1; + + n_linear_rings = uint4korr(data); + data += 4; + + for (; n_linear_rings>0; --n_linear_rings) + { + if(no_data(data, 4)) + return 1; + uint32 n_points = uint4korr(data); + data += 4; + if (no_data(data, (8+8) * n_points)) + return 1; + + if (txt->reserve(2 + ((MAX_DIGITS_IN_DOUBLE + 1)*2 + 1) * n_points)) + return 1; + txt->qs_append('('); + for (; n_points>0; --n_points) + { + txt->qs_append((double *)data); + txt->qs_append(' '); + txt->qs_append((double *)(data + 8)); + txt->qs_append(','); + + data += 8+8; + } + (*txt)[txt->length()-1] = ')'; + txt->qs_append(','); + } + txt->length(txt->length() - 1); + return 0; +} + +int GPolygon::get_mbr(MBR *mbr) const +{ + uint32 n_linear_rings; + + const char *data = m_data; + if (no_data(data, 4)) + return 1; + n_linear_rings = uint4korr(data); + data += 4; + for (; n_linear_rings>0; --n_linear_rings) + { + if (no_data(data, 4)) + return 1; + uint32 n_points = uint4korr(data); + data += 4; + if (no_data(data, (8+8) * n_points)) + return 1; + for (; n_points>0; --n_points) + { + mbr->add_xy((double *)data, (double *)(data + 8)); + data += 8+8; + } + } + return 0; +} + +int GPolygon::area(double *ar) const +{ + uint32 n_linear_rings; + double result = -1.0; + + const char *data = m_data; + if (no_data(data, 4)) + return 1; + n_linear_rings = uint4korr(data); + data += 4; + for (; n_linear_rings>0; --n_linear_rings) + { + double prev_x, prev_y; + double lr_area=0; + if (no_data(data, 4)) + return 1; + uint32 n_points = uint4korr(data); + if (no_data(data, (8+8) * n_points)) + return 1; + float8get(prev_x, data+4); + float8get(prev_y, data+(4+8)); + data += (4+8+8); + + --n_points; + for (; n_points>0; --n_points) + { + double x, y; + float8get(x, data); + float8get(y, data + 8); + lr_area+=(prev_x+x)*(prev_y-y); + prev_x=x; + prev_y=y; + data += (8+8); + } + lr_area=fabs(lr_area)/2; + if(result==-1) result=lr_area; + else result-=lr_area; + } + *ar=fabs(result); + return 0; +} + + +int GPolygon::exterior_ring(String *result) const +{ + uint32 n_points; + const char *data = m_data + 4; // skip n_linerings + + if (no_data(data, 4)) + return 1; + n_points = uint4korr(data); + data += 4; + if (no_data(data, n_points * POINT_DATA_SIZE)) + return 1; + + if (result->reserve(1+4+4+ n_points * POINT_DATA_SIZE)) + return 1; + + result->q_append((char)wkbNDR); + result->q_append((uint32)wkbLineString); + result->q_append(n_points); + result->q_append(data, n_points * POINT_DATA_SIZE); + + return 0; +} + +int GPolygon::num_interior_ring(uint32 *n_int_rings) const +{ + const char *data = m_data; + if (no_data(data, 4)) + return 1; + *n_int_rings = uint4korr(data); + --(*n_int_rings); + + return 0; +} + +int GPolygon::interior_ring_n(uint32 num, String *result) const +{ + const char *data = m_data; + uint32 n_linear_rings; + uint32 n_points; + + if (no_data(data, 4)) + return 1; + + n_linear_rings = uint4korr(data); + data += 4; + if ((num >= n_linear_rings) || (num < 1)) + return -1; + + for (; num > 0; --num) + { + if (no_data(data, 4)) + return 1; + data += 4 + uint4korr(data) * POINT_DATA_SIZE; + } + if (no_data(data, 4)) + return 1; + n_points = uint4korr(data); + int points_size = n_points * POINT_DATA_SIZE; + data += 4; + if (no_data(data, points_size)) + return 1; + + if (result->reserve(1+4+4+ points_size)) + return 1; + + result->q_append((char)wkbNDR); + result->q_append((uint32)wkbLineString); + result->q_append(n_points); + result->q_append(data, points_size); + + return 0; +} + +int GPolygon::centroid_xy(double *x, double *y) const +{ + uint32 n_linear_rings; + uint32 i; + double res_area, res_cx, res_cy; + const char *data = m_data; + + if (no_data(data, 4)) + return 1; + n_linear_rings = uint4korr(data); + data += 4; + + for(i = 0; i < n_linear_rings; ++i) + { + if (no_data(data, 4)) + return 1; + uint32 n_points = uint4korr(data); + double prev_x, prev_y; + double cur_area = 0; + double cur_cx = 0; + double cur_cy = 0; + + data += 4; + if (no_data(data, (8+8) * n_points)) + return 1; + float8get(prev_x, data); + float8get(prev_y, data+8); + data += (8+8); + + uint32 n = n_points - 1; + for (; n > 0; --n) + { + double x, y; + float8get(x, data); + float8get(y, data + 8); + + cur_area += (prev_x + x) * (prev_y - y); + cur_cx += x; + cur_cy += y; + prev_x = x; + prev_y = y; + data += (8+8); + } + cur_area = fabs(cur_area) / 2; + cur_cx = cur_cx / (n_points - 1); + cur_cy = cur_cy / (n_points - 1); + if(i) + { + double d_area = res_area - cur_area; + if (d_area <= 0) + return 1; + res_cx = (res_area * res_cx - cur_area * cur_cx) / d_area; + res_cy = (res_area * res_cy - cur_area * cur_cy) / d_area; + } + else + { + res_area = cur_area; + res_cx = cur_cx; + res_cy = cur_cy; + } + } + + *x = res_cx; + *y = res_cy; + + return 0; +} + +int GPolygon::centroid(String *result) const +{ + double x, y; + + this->centroid_xy(&x, &y); + if (result->reserve(1 + 4 + sizeof(double) * 2)) + return 1; + + result->q_append((char)wkbNDR); + result->q_append((uint32)wkbPoint); + result->q_append(x); + result->q_append(y); + + return 0; +} + + +/***************************** MultiPoint *******************************/ + +size_t GMultiPoint::get_data_size() const +{ + return 4 + uint4korr(m_data)*(POINT_DATA_SIZE + WKB_HEADER_SIZE); +} + +int GMultiPoint::init_from_text(GTextReadStream *trs, String *wkb) +{ + uint32 n_points = 0; + int np_pos = wkb->length(); + GPoint p; + + if (wkb->reserve(4, 512)) + return 1; + wkb->q_append((uint32)n_points); + + for (;;) + { + if (wkb->reserve(1+4, 512)) + return 1; + wkb->q_append((char)wkbNDR); + wkb->q_append((uint32)wkbPoint); + if (p.init_from_text(trs, wkb)) + return 1; + ++n_points; + if (trs->get_next_toc_type() == GTextReadStream::comma) + trs->get_next_symbol(); + else + break; + } + wkb->WriteAtPosition(np_pos, n_points); + + return 0; +} + +int GMultiPoint::get_data_as_text(String *txt) const +{ + uint32 n_points; + const char *data = m_data; + if (no_data(data, 4)) + return 1; + + n_points = uint4korr(data); + data += 4; + if (no_data(data, n_points * (8+8+WKB_HEADER_SIZE))) + return 1; + + if (txt->reserve(((MAX_DIGITS_IN_DOUBLE + 1)*2 + 1) * n_points)) + return 1; + + for (; n_points>0; --n_points) + { + txt->qs_append((double *)(data + WKB_HEADER_SIZE)); + txt->qs_append(' '); + txt->qs_append((double *)(data + (8 + WKB_HEADER_SIZE))); + txt->qs_append(','); + data += 8+8+WKB_HEADER_SIZE; + } + txt->length(txt->length()-1); + return 0; +} + +int GMultiPoint::get_mbr(MBR *mbr) const +{ + uint32 n_points; + const char *data = m_data; + if (no_data(data, 4)) + return 1; + n_points = uint4korr(data); + data += 4; + if (no_data(data, n_points * (8+8+WKB_HEADER_SIZE))) + return 1; + for (; n_points>0; --n_points) + { + mbr->add_xy((double *)(data + WKB_HEADER_SIZE), + (double *)(data + 8 + WKB_HEADER_SIZE)); + data += (8+8+WKB_HEADER_SIZE); + } + return 0; +} + +/***************************** MultiLineString *******************************/ + +size_t GMultiLineString::get_data_size() const +{ + uint32 n_line_strings = 0; + const char *data = m_data; + if (no_data(data, 4)) + return 1; + n_line_strings = uint4korr(data); + data += 4; + + for (; n_line_strings>0; --n_line_strings) + { + if (no_data(data, WKB_HEADER_SIZE + 4)) + return 1; + data += WKB_HEADER_SIZE + 4 + uint4korr(data + WKB_HEADER_SIZE) * POINT_DATA_SIZE; + } + return data - m_data; +} + +int GMultiLineString::init_from_text(GTextReadStream *trs, String *wkb) +{ + uint32 n_line_strings = 0; + int ls_pos = wkb->length(); + + if (wkb->reserve(4, 512)) + return 1; + + wkb->q_append((uint32)n_line_strings); + + for (;;) + { + GLineString ls; + + if (wkb->reserve(1+4, 512)) + return 1; + wkb->q_append((char)wkbNDR); + wkb->q_append((uint32)wkbLineString); + + if (trs->get_next_symbol() != '(') + { + trs->set_error_msg("'(' expected"); + return 1; + } + if (ls.init_from_text(trs, wkb)) + return 1; + + if (trs->get_next_symbol() != ')') + { + trs->set_error_msg("')' expected"); + return 1; + } + ++n_line_strings; + if (trs->get_next_toc_type() == GTextReadStream::comma) + trs->get_next_symbol(); + else + break; + } + wkb->WriteAtPosition(ls_pos, n_line_strings); + + return 0; +} + +int GMultiLineString::get_data_as_text(String *txt) const +{ + uint32 n_line_strings; + const char *data = m_data; + if (no_data(data, 4)) + return 1; + n_line_strings = uint4korr(data); + data += 4; + for (; n_line_strings>0; --n_line_strings) + { + if (no_data(data, (WKB_HEADER_SIZE + 4))) + return 1; + uint32 n_points = uint4korr(data + WKB_HEADER_SIZE); + data += WKB_HEADER_SIZE + 4; + if (no_data(data, n_points * (8+8))) + return 1; + + if (txt->reserve(2 + ((MAX_DIGITS_IN_DOUBLE + 1)*2 + 1) * n_points)) + return 1; + txt->qs_append('('); + for (; n_points>0; --n_points) + { + txt->qs_append((double *)data); + txt->qs_append(' '); + txt->qs_append((double *)(data + 8)); + txt->qs_append(','); + data += 8+8; + } + (*txt)[txt->length()-1] = ')'; + txt->qs_append(','); + } + txt->length(txt->length() - 1); + return 0; +} + +int GMultiLineString::get_mbr(MBR *mbr) const +{ + uint32 n_line_strings; + const char *data = m_data; + if (no_data(data, 4)) + return 1; + n_line_strings = uint4korr(data); + data += 4; + + for (; n_line_strings>0; --n_line_strings) + { + if (no_data(data, WKB_HEADER_SIZE + 4)) + return 1; + uint32 n_points = uint4korr(data + WKB_HEADER_SIZE); + data += 4+WKB_HEADER_SIZE; + if (no_data(data, (8+8)*n_points)) + return 1; + + for (; n_points>0; --n_points) + { + mbr->add_xy((double *)data, (double *)(data + 8)); + data += 8+8; + } + } + return 0; +} + +int GMultiLineString::length(double *len) const +{ + uint32 n_line_strings; + const char *data = m_data; + if (no_data(data, 4)) + return 1; + n_line_strings = uint4korr(data); + data += 4; + *len=0; + for (; n_line_strings>0; --n_line_strings) + { + double ls_len; + GLineString ls; + data += WKB_HEADER_SIZE; + ls.init_from_wkb(data, m_data_end - data); + if (ls.length(&ls_len)) + return 1; + *len+=ls_len; + data += ls.get_data_size(); + } + return 0; +} + +int GMultiLineString::is_closed(int *closed) const +{ + uint32 n_line_strings; + const char *data = m_data; + if (no_data(data, 1)) + return 1; + n_line_strings = uint4korr(data); + data += 4 + WKB_HEADER_SIZE; + for (; n_line_strings>0; --n_line_strings) + { + GLineString ls; + ls.init_from_wkb(data, m_data_end - data); + if (ls.is_closed(closed)) + return 1; + if (!*closed) + return 0; + data += ls.get_data_size() + WKB_HEADER_SIZE; + } + return 0; +} + +/***************************** MultiPolygon *******************************/ + +size_t GMultiPolygon::get_data_size() const +{ + uint32 n_polygons; + const char *data = m_data; + if (no_data(data, 4)) + return 1; + n_polygons = uint4korr(data); + data += 4; + + for (; n_polygons>0; --n_polygons) + { + if (no_data(data, 4 + WKB_HEADER_SIZE)) + return 1; + uint32 n_linear_rings = uint4korr(data + WKB_HEADER_SIZE); + data += 4 + WKB_HEADER_SIZE; + + for (; n_linear_rings > 0; --n_linear_rings) + { + data += 4 + uint4korr(data) * POINT_DATA_SIZE; + } + } + return data - m_data; +} + +int GMultiPolygon::init_from_text(GTextReadStream *trs, String *wkb) +{ + uint32 n_polygons = 0; + int np_pos = wkb->length(); + GPolygon p; + + if (wkb->reserve(4, 512)) + return 1; + + wkb->q_append((uint32)n_polygons); + + for (;;) + { + if (wkb->reserve(1+4, 512)) + return 1; + wkb->q_append((char)wkbNDR); + wkb->q_append((uint32)wkbPolygon); + + if (trs->get_next_symbol() != '(') + { + trs->set_error_msg("'(' expected"); + return 1; + } + if (p.init_from_text(trs, wkb)) + return 1; + if (trs->get_next_symbol() != ')') + { + trs->set_error_msg("')' expected"); + return 1; + } + ++n_polygons; + if (trs->get_next_toc_type() == GTextReadStream::comma) + trs->get_next_symbol(); + else + break; + } + wkb->WriteAtPosition(np_pos, n_polygons); + return 0; +} + +int GMultiPolygon::get_data_as_text(String *txt) const +{ + uint32 n_polygons; + const char *data = m_data; + if (no_data(data, 4)) + return 1; + n_polygons = uint4korr(data); + data += 4; + + for (; n_polygons>0; --n_polygons) + { + if (no_data(data, 4 + WKB_HEADER_SIZE)) + return 1; + data += WKB_HEADER_SIZE; + uint32 n_linear_rings = uint4korr(data); + data += 4; + + if (txt->reserve(1, 512)) + return 1; + txt->q_append('('); + for (; n_linear_rings>0; --n_linear_rings) + { + if (no_data(data, 4)) + return 1; + uint32 n_points = uint4korr(data); + data += 4; + if (no_data(data, (8+8)*n_points)) return 1; + + if (txt->reserve(2 + ((MAX_DIGITS_IN_DOUBLE + 1)*2 + 1) * n_points, + 512)) return 1; + txt->qs_append('('); + for (; n_points>0; --n_points) + { + txt->qs_append((double *)data); + txt->qs_append(' '); + txt->qs_append((double *)(data + 8)); + txt->qs_append(','); + data += 8+8; + } + (*txt)[txt->length()-1] = ')'; + txt->qs_append(','); + } + (*txt)[txt->length()-1] = ')'; + txt->qs_append(','); + } + txt->length(txt->length() - 1); + return 0; +} + +int GMultiPolygon::get_mbr(MBR *mbr) const +{ + uint32 n_polygons; + const char *data = m_data; + if (no_data(data, 4)) + return 1; + n_polygons = uint4korr(data); + data += 4; + + for (; n_polygons>0; --n_polygons) + { + if (no_data(data, 4+WKB_HEADER_SIZE)) + return 1; + uint32 n_linear_rings = uint4korr(data + WKB_HEADER_SIZE); + data += WKB_HEADER_SIZE + 4; + + for (; n_linear_rings>0; --n_linear_rings) + { + if (no_data(data, 4)) + return 1; + uint32 n_points = uint4korr(data); + data += 4; + if (no_data(data, (8+8)*n_points)) + return 1; + + for (; n_points>0; --n_points) + { + mbr->add_xy((double *)data, (double *)(data + 8)); + data += 8+8; + } + } + } + return 0; +} + + +int GMultiPolygon::area(double *ar) const +{ + uint32 n_polygons; + const char *data = m_data; + double result = 0; + if (no_data(data, 4)) + return 1; + n_polygons = uint4korr(data); + data += 4; + + for (; n_polygons>0; --n_polygons) + { + double p_area; + + GPolygon p; + data += WKB_HEADER_SIZE; + p.init_from_wkb(data, m_data_end - data); + if (p.area(&p_area)) + return 1; + result += p_area; + data += p.get_data_size(); + } + *ar = result; + return 0; +} + +int GMultiPolygon::centroid(String *result) const +{ + uint32 n_polygons; + uint i; + GPolygon p; + double res_area, res_cx, res_cy; + double cur_area, cur_cx, cur_cy; + + const char *data = m_data; + if (no_data(data, 4)) + return 1; + n_polygons = uint4korr(data); + data += 4; + + for (i = 0; i < n_polygons; ++i) + { + data += WKB_HEADER_SIZE; + p.init_from_wkb(data, m_data_end - data); + if (p.area(&cur_area)) + return 1; + + if (p.centroid_xy(&cur_cx, &cur_cy)) + return 1; + + if(i) + { + double sum_area = res_area + cur_area; + res_cx = (res_area * res_cx + cur_area * cur_cx) / sum_area; + res_cy = (res_area * res_cy + cur_area * cur_cy) / sum_area; + } + else + { + res_area = cur_area; + res_cx = cur_cx; + res_cy = cur_cy; + } + + data += p.get_data_size(); + } + + if (result->reserve(1 + 4 + sizeof(double) * 2)) + return 1; + result->q_append((char)wkbNDR); + result->q_append((uint32)wkbPoint); + result->q_append(res_cx); + result->q_append(res_cy); + + return 0; +} + +/***************************** GeometryCollection *******************************/ + +size_t GGeometryCollection::get_data_size() const +{ + uint32 n_objects; + const char *data = m_data; + if (no_data(data, 4)) + return 1; + n_objects = uint4korr(data); + data += 4; + + for (; n_objects>0; --n_objects) + { + if (no_data(data, WKB_HEADER_SIZE)) + return 1; + uint32 wkb_type = uint4korr(data + sizeof(char)); + data += WKB_HEADER_SIZE; + + Geometry geom; + + if (geom.init(wkb_type)) + return 0; + + geom.init_from_wkb(data, m_data_end - data); + size_t object_size=geom.get_data_size(); + data += object_size; + } + return data - m_data; +} + +int GGeometryCollection::init_from_text(GTextReadStream *trs, String *wkb) +{ + uint32 n_objects = 0; + int no_pos = wkb->length(); + Geometry g; + + if (wkb->reserve(4, 512)) + return 1; + wkb->q_append((uint32)n_objects); + + for (;;) + { + if (g.create_from_wkt(trs, wkb)) + return 1; + + if (g.get_class_info()->m_type_id==wkbGeometryCollection) + { + trs->set_error_msg("Unexpected GEOMETRYCOLLECTION"); + return 1; + } + ++n_objects; + if (trs->get_next_toc_type() == GTextReadStream::comma) + trs->get_next_symbol(); + else break; + } + wkb->WriteAtPosition(no_pos, n_objects); + + return 0; +} + +int GGeometryCollection::get_data_as_text(String *txt) const +{ + uint32 n_objects; + const char *data = m_data; + Geometry geom; + if (no_data(data, 4)) + return 1; + n_objects = uint4korr(data); + data += 4; + + for (; n_objects>0; --n_objects) + { + if (no_data(data, WKB_HEADER_SIZE)) + return 1; + uint32 wkb_type = uint4korr(data + sizeof(char)); + data += WKB_HEADER_SIZE; + + if (geom.init(wkb_type)) + return 1; + geom.init_from_wkb(data, m_data_end - data); + if (geom.as_wkt(txt)) + return 1; + data += geom.get_data_size(); + txt->reserve(1, 512); + txt->q_append(','); + } + txt->length(txt->length() - 1); + return 0; +} + +int GGeometryCollection::get_mbr(MBR *mbr) const +{ + uint32 n_objects; + const char *data = m_data; + if (no_data(data, 4)) + return 1; + n_objects = uint4korr(data); + data += 4; + for (; n_objects>0; --n_objects) + { + if(no_data(data, WKB_HEADER_SIZE)) + return 1; + uint32 wkb_type = uint4korr(data + sizeof(char)); + data += WKB_HEADER_SIZE; + Geometry geom; + + if (geom.init(wkb_type)) + return 1; + geom.init_from_wkb(data, m_data_end - data); + geom.get_mbr(mbr); + data += geom.get_data_size(); + } + return 0; +} + +int GGeometryCollection::num_geometries(uint32 *num) const +{ + *num = uint4korr(m_data); + return 0; +} + +int GGeometryCollection::geometry_n(uint32 num, String *result) const +{ + const char *data = m_data; + uint32 n_objects; + if (no_data(data, 4)) + return 1; + n_objects = uint4korr(data); + data += 4; + + if ((num > n_objects) || (num < 1)) + { + return -1; + } + for (; num > 0; --num) + { + if (no_data(data, WKB_HEADER_SIZE)) + return 1; + uint32 wkb_type = uint4korr(data + sizeof(char)); + data += WKB_HEADER_SIZE; + + Geometry geom; + if (geom.init(wkb_type)) + return 1; + geom.init_from_wkb(data, m_data_end - data); + if (num == 1) + { + if (result->reserve(1+4+geom.get_data_size())) + return 1; + result->q_append((char)wkbNDR); + result->q_append((uint32)wkb_type); + result->q_append(data, geom.get_data_size()); + break; + } + else + { + data += geom.get_data_size(); + } + } + return 0; +} + +int GGeometryCollection::dimension(uint32 *dim) const +{ + uint32 n_objects; + *dim = 0; + const char *data = m_data; + if (no_data(data, 4)) + return 1; + n_objects = uint4korr(data); + data += 4; + + for (; n_objects > 0; --n_objects) + { + if (no_data(data, WKB_HEADER_SIZE)) + return 1; + uint32 wkb_type = uint4korr(data + sizeof(char)); + data += WKB_HEADER_SIZE; + + uint32 d; + + Geometry geom; + if (geom.init(wkb_type)) + return 1; + geom.init_from_wkb(data, m_data_end - data); + if (geom.dimension(&d)) + return 1; + + if (d > *dim) + *dim = d; + data += geom.get_data_size(); + } + return 0; +} + +/***************************** /objects *******************************/ diff --git a/sql/spatial.h b/sql/spatial.h new file mode 100644 index 00000000000..09e8722a85e --- /dev/null +++ b/sql/spatial.h @@ -0,0 +1,476 @@ +#ifndef _spatial_h +#define _spatial_h + +#include "gstream.h" + +const int POINT_DATA_SIZE = 8+8; +const int WKB_HEADER_SIZE = 1+4; + +struct stPoint2D +{ + double x; + double y; +}; + +struct stLinearRing +{ + size_t n_points; + stPoint2D points; +}; + +/***************************** MBR *******************************/ + +struct MBR +{ + MBR() + { + xmin=DBL_MAX; + ymin=DBL_MAX; + xmax=-DBL_MAX; + ymax=-DBL_MAX; + } + + MBR(const double &_xmin, const double &_ymin, const double &_xmax, const double &_ymax) + { + xmin=_xmin; + ymin=_ymin; + xmax=_xmax; + ymax=_ymax; + } + + MBR(const stPoint2D &min, const stPoint2D &max) + { + xmin=min.x; + ymin=min.y; + xmax=max.x; + ymax=max.y; + } + + double xmin; + double ymin; + double xmax; + double ymax; + + void add_xy(double x, double y) + { /* Not using "else" for proper one point MBR calculation */ + if (xxmax) + { + xmax=x; + } + if (yymax) + { + ymax=y; + } + } + + void add_xy(double *px, double *py) + { /* Not using "else" for proper one point MBR calculation */ + double x, y; + float8get(x, px); + float8get(y, py); + if (xxmax) + { + xmax=x; + } + if (yymax) + { + ymax=y; + } + } + + void add_mbr(const MBR *mbr) + { + if (mbr->xminxmin; + } + if (mbr->xmax>xmax) + { + xmax=mbr->xmax; + } + if (mbr->yminymin; + } + if (mbr->ymax>ymax) + { + ymax=mbr->ymax; + } + } + + int equals(const MBR *mbr) + { + return (mbr->xmin==xmin)&&(mbr->ymin==ymin)&&(mbr->xmax==xmax)&&(mbr->ymax==ymax); + } + + int disjoint(const MBR *mbr) + { + return (mbr->xmin>xmax)||(mbr->ymin>ymax)||(mbr->xmaxymaxxmin==xmax) || (mbr->xmax==xmin)) && + ((mbr->ymin>=ymin) && (mbr->ymin<=ymax) || + (mbr->ymax>=ymin) && (mbr->ymax<=ymax))) || + (((mbr->ymin==ymax) || (mbr->ymax==ymin)) && + ((mbr->xmin>=xmin) && (mbr->xmin<=xmax) || + (mbr->xmax>=xmin)&&(mbr->xmax<=xmax))); + } + + int within(const MBR *mbr) + { + return (mbr->xmin<=xmin) && (mbr->ymin<=ymin) && + (mbr->xmax>=xmax) && (mbr->ymax>=ymax); + } + + int contains(const MBR *mbr) + { + return (mbr->xmin>=xmin) && (mbr->ymin>=ymin) && + (mbr->xmax<=xmax) && (mbr->ymax<=ymax); + } + + bool inner_point(double x, double y) const + { + return (xminx) && (yminx); + } + + int overlaps(const MBR *mbr) + { + int lb = mbr->inner_point(xmin, ymin); + int rb = mbr->inner_point(xmax, ymin); + int rt = mbr->inner_point(xmax, ymax); + int lt = mbr->inner_point(xmin, ymax); + + int a = lb+rb+rt+lt; + return (a>0) && (a<4) && (!within(mbr)); + } +}; + + +/***************************** Geometry *******************************/ + +class Geometry; + +typedef int (Geometry::*GF_InitFromText)(GTextReadStream *, String *); +typedef int (Geometry::*GF_GetDataAsText)(String *) const; +typedef size_t (Geometry::*GF_GetDataSize)() const; +typedef int (Geometry::*GF_GetMBR)(MBR *) const; + +typedef int (Geometry::*GF_GetD)(double *) const; +typedef int (Geometry::*GF_GetI)(int *) const; +typedef int (Geometry::*GF_GetUI)(uint32 *) const; +typedef int (Geometry::*GF_GetWS)(String *) const; +typedef int (Geometry::*GF_GetUIWS)(uint32, String *) const; + +#define GEOM_METHOD_PRESENT(geom_obj, method)\ + (geom_obj.m_vmt->method != &Geometry::method) + +class Geometry +{ +public: + enum wkbType + { + wkbPoint = 1, + wkbLineString = 2, + wkbPolygon = 3, + wkbMultiPoint = 4, + wkbMultiLineString = 5, + wkbMultiPolygon = 6, + wkbGeometryCollection = 7 + }; + enum wkbByteOrder + { + wkbXDR = 0, /* Big Endian */ + wkbNDR = 1 /* Little Endian */ + }; + + + class GClassInfo + { + public: + GF_InitFromText init_from_text; + GF_GetDataAsText get_data_as_text; + GF_GetDataSize get_data_size; + GF_GetMBR get_mbr; + GF_GetD get_x; + GF_GetD get_y; + GF_GetD length; + GF_GetD area; + + GF_GetI is_closed; + + GF_GetUI num_interior_ring; + GF_GetUI num_points; + GF_GetUI num_geometries; + GF_GetUI dimension; + + GF_GetWS start_point; + GF_GetWS end_point; + GF_GetWS exterior_ring; + GF_GetWS centroid; + + GF_GetUIWS point_n; + GF_GetUIWS interior_ring_n; + GF_GetUIWS geometry_n; + + int m_type_id; + const char *m_name; + GClassInfo *m_next_rt; + }; + GClassInfo *m_vmt; + + const GClassInfo *get_class_info() const { return m_vmt; } + size_t get_data_size() const { return (this->*m_vmt->get_data_size)(); } + + int init_from_text(GTextReadStream *trs, String *wkb) + { return (this->*m_vmt->init_from_text)(trs, wkb); } + + int get_data_as_text(String *txt) const + { return (this->*m_vmt->get_data_as_text)(txt); } + + int get_mbr(MBR *mbr) const { return (this->*m_vmt->get_mbr)(mbr); } + int dimension(uint32 *dim) const + { return (this->*m_vmt->dimension)(dim); } + + int get_x(double *x) const { return (this->*m_vmt->get_x)(x); } + int get_y(double *y) const { return (this->*m_vmt->get_y)(y); } + int length(double *len) const { return (this->*m_vmt->length)(len); } + int area(double *ar) const { return (this->*m_vmt->area)(ar); } + + int is_closed(int *closed) const { return (this->*m_vmt->is_closed)(closed); } + + int num_interior_ring(uint32 *n_int_rings) const + { return (this->*m_vmt->num_interior_ring)(n_int_rings); } + int num_points(uint32 *n_points) const + { return (this->*m_vmt->num_points)(n_points); } + + int num_geometries(uint32 *num) const + { return (this->*m_vmt->num_geometries)(num); } + + int start_point(String *point) const + { return (this->*m_vmt->start_point)(point); } + int end_point(String *point) const + { return (this->*m_vmt->end_point)(point); } + int exterior_ring(String *ring) const + { return (this->*m_vmt->exterior_ring)(ring); } + int centroid(String *point) const + { return (this->*m_vmt->centroid)(point); } + + int point_n(uint32 num, String *result) const + { return (this->*m_vmt->point_n)(num, result); } + int interior_ring_n(uint32 num, String *result) const + { return (this->*m_vmt->interior_ring_n)(num, result); } + int geometry_n(uint32 num, String *result) const + { return (this->*m_vmt->geometry_n)(num, result); } + +public: + int create_from_wkb(const char *data, uint32 data_len); + int create_from_wkt(GTextReadStream *trs, String *wkt, int init_stream=1); + int init(int type_id) + { + m_vmt = find_class(type_id); + return !m_vmt; + } + int new_geometry(const char *name, size_t len) + { + m_vmt = find_class(name, len); + return !m_vmt; + } + + int as_wkt(String *wkt) const + { + if(wkt->reserve(strlen(get_class_info()->m_name) + 2, 512)) + return 1; + wkt->qs_append(get_class_info()->m_name); + wkt->qs_append('('); + if(get_data_as_text(wkt)) + return 1; + wkt->qs_append(')'); + return 0; + } + + void init_from_wkb(const char *data, uint32 data_len) + { + m_data = data; + m_data_end = data + data_len; + } + + void shift_wkb_header() + { + m_data += WKB_HEADER_SIZE; + } + + int envelope(String *result) const; + +protected: + static GClassInfo *find_class(int type_id); + static GClassInfo *find_class(const char *name, size_t len); + + bool no_data(const char *cur_data, uint32 data_amount) const + { + return cur_data + data_amount > m_data_end; + } + + const char *m_data; + const char *m_data_end; +}; + +/***************************** Point *******************************/ + +class GPoint: public Geometry +{ +public: + size_t get_data_size() const; + int init_from_text(GTextReadStream *trs, String *wkb); + int get_data_as_text(String *txt) const; + int get_mbr(MBR *mbr) const; + + int get_xy(double *x, double *y) const + { + const char *data = m_data; + if(no_data(data, sizeof(double)) * 2) return 1; + float8get(*x, data); + float8get(*y, data + sizeof(double)); + return 0; + } + + int get_x(double *x) const + { + if(no_data(m_data, sizeof(double))) return 1; + float8get(*x, m_data); + return 0; + } + + int get_y(double *y) const + { + const char *data = m_data; + if(no_data(data, sizeof(double)) * 2) return 1; + float8get(*y, data + sizeof(double)); + return 0; + } + + int dimension(uint32 *dim) const { *dim = 0; return 0; } +}; + +/***************************** LineString *******************************/ + +class GLineString: public Geometry +{ +public: + size_t get_data_size() const; + int init_from_text(GTextReadStream *trs, String *wkb); + int get_data_as_text(String *txt) const; + int get_mbr(MBR *mbr) const; + + int length(double *len) const; + int is_closed(int *closed) const; + int num_points(uint32 *n_points) const; + int start_point(String *point) const; + int end_point(String *point) const; + int point_n(uint32 n, String *result) const; + int dimension(uint32 *dim) const { *dim = 1; return 0; } +// IsRing +}; + +/***************************** Polygon *******************************/ + +class GPolygon: public Geometry +{ +public: + size_t get_data_size() const; + int init_from_text(GTextReadStream *trs, String *wkb); + int get_data_as_text(String *txt) const; + int get_mbr(MBR *mbr) const; + + int area(double *ar) const; + int exterior_ring(String *result) const; + int num_interior_ring(uint32 *n_int_rings) const; + int interior_ring_n(uint32 num, String *result) const; + int centroid_xy(double *x, double *y) const; + int centroid(String *result) const; + int dimension(uint32 *dim) const { *dim = 2; return 0; } +// PointOnSurface +}; + +/***************************** MultiPoint *******************************/ + +class GMultiPoint: public Geometry +{ +public: + size_t get_data_size() const; + int init_from_text(GTextReadStream *trs, String *wkb); + int get_data_as_text(String *txt) const; + int get_mbr(MBR *mbr) const; + int dimension(uint32 *dim) const { *dim = 0; return 0; } +}; + +/***************************** MultiLineString *******************************/ + +class GMultiLineString: public Geometry +{ +public: + size_t get_data_size() const; + int init_from_text(GTextReadStream *trs, String *wkb); + int get_data_as_text(String *txt) const; + int get_mbr(MBR *mbr) const; + + int length(double *len) const; + int is_closed(int *closed) const; + int dimension(uint32 *dim) const { *dim = 1; return 0; } +}; + +/***************************** MultiPolygon *******************************/ + +class GMultiPolygon: public Geometry +{ +public: + size_t get_data_size() const; + int init_from_text(GTextReadStream *trs, String *wkb); + int get_data_as_text(String *txt) const; + int get_mbr(MBR *mbr) const; + + int area(double *ar) const; + int centroid(String *result) const; + int dimension(uint32 *dim) const { *dim = 2; return 0; } +// PointOnSurface +}; + +/***************************** GeometryCollection *******************************/ + +class GGeometryCollection: public Geometry +{ +public: + size_t get_data_size() const; + int init_from_text(GTextReadStream *trs, String *wkb); + int get_data_as_text(String *txt) const; + int get_mbr(MBR *mbr) const; + + int num_geometries(uint32 *num) const; + int geometry_n(uint32 num, String *result) const; + + int dimension(uint32 *dim) const; +}; + +#endif diff --git a/sql/sql_class.h b/sql/sql_class.h index a1423cfcdf1..355987c259e 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -198,13 +198,18 @@ public: class Key :public Sql_alloc { public: - enum Keytype { PRIMARY, UNIQUE, MULTIPLE, FULLTEXT }; + enum Keytype { PRIMARY, UNIQUE, MULTIPLE, FULLTEXT, SPATIAL }; enum Keytype type; + enum ha_key_alg alg; // +BAR List columns; const char *Name; Key(enum Keytype type_par,const char *name_arg,List &cols) :type(type_par), columns(cols),Name(name_arg) {} + + Key(enum Keytype type_par, enum ha_key_alg alg_par, const char *name_arg,List &cols) + :type(type_par),alg(alg_par), columns(cols),Name(name_arg){} //+BAR + ~Key() {} const char *name() { return Name; } }; diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 131266a11d6..52541ffe50f 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -880,11 +880,17 @@ store_create_info(THD *thd, TABLE *table, String *packet) packet->append("UNIQUE ", 7); else if (key_info->flags & HA_FULLTEXT) packet->append("FULLTEXT ", 9); + else if (key_info->flags & HA_SPATIAL) + packet->append("SPATIAL ", 8); packet->append("KEY ", 4); if (!found_primary) append_identifier(thd,packet,key_info->name); + // +BAR: send USING only in non-default case: non-spatial rtree + if((key_info->key_alg == HA_KEY_ALG_RTREE) && !(key_info->flags & HA_SPATIAL)) + packet->append(" USING RTREE",12); + packet->append(" (", 2); for (uint j=0 ; j < key_info->key_parts ; j++,key_part++) diff --git a/sql/sql_string.cc b/sql/sql_string.cc index 8fe84947ac2..f0cfd590072 100644 --- a/sql/sql_string.cc +++ b/sql/sql_string.cc @@ -459,6 +459,44 @@ bool String::replace(uint32 offset,uint32 arg_length,const String &to) return FALSE; } +// added by Holyfoot for "geometry" needs +int String::reserve(uint32 space_needed, uint32 grow_by) +{ + if (Alloced_length < str_length + space_needed) + { + if (realloc(Alloced_length + max(space_needed, grow_by) - 1)) + return TRUE; + } + return FALSE; +} + +void String::qs_append(const char *str) +{ + int len = strlen(str); + memcpy(Ptr + str_length, str, len + 1); + str_length += len; +} + +void String::qs_append(double d) +{ + char *buff = Ptr + str_length; + sprintf(buff,"%.14g", d); + str_length += strlen(buff); +} + +void String::qs_append(double *d) +{ + double ld; + float8get(ld, d); + qs_append(ld); +} + +void String::qs_append(const char &c) +{ + Ptr[str_length] = c; + str_length += sizeof(c); +} + int sortcmp(const String *x,const String *y) { @@ -805,3 +843,5 @@ int wild_compare(String &match,String &wild, char escape) DBUG_RETURN(wild_compare(match.ptr(),match.ptr()+match.length(), wild.ptr(), wild.ptr()+wild.length(),escape)); } + + diff --git a/sql/sql_string.h b/sql/sql_string.h index ad7455ecbf1..ac579cd752d 100644 --- a/sql/sql_string.h +++ b/sql/sql_string.h @@ -188,4 +188,49 @@ public: friend int wild_compare(String &match,String &wild,char escape); uint32 numchars(); int charpos(int i,uint32 offset=0); + +// added by Holyfoot for "geometry" needs + int reserve(uint32 space_needed) + { + return realloc(str_length + space_needed); + } + int reserve(uint32 space_needed, uint32 grow_by); + +// these append operations do NOT check alloced memory +// q_*** methods writes values of parameters itself +// qs_*** methods writes string representation of value + void q_append(const char &c) + { + Ptr[str_length++] = c; + } + void q_append(const uint32 &n) + { + int4store(Ptr + str_length, n); + str_length += 4; + } + void q_append(double d) + { + float8store(Ptr + str_length, d); + str_length += 8; + } + void q_append(double *d) + { + float8store(Ptr + str_length, *d); + str_length += 8; + } + void q_append(const char *data, uint32 data_len) + { + memcpy(Ptr + str_length, data, data_len); + str_length += data_len; + } + + void WriteAtPosition(int position, uint32 value) + { + int4store(Ptr + position,value); + } + + void qs_append(const char *str); + void qs_append(double d); + void qs_append(double *d); + void qs_append(const char &c); }; diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 0335c6f49cf..fa1879b33ff 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -438,8 +438,21 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, uint key_length=0; key_part_spec *column; - key_info->flags= (key->type == Key::MULTIPLE) ? 0 : - (key->type == Key::FULLTEXT) ? HA_FULLTEXT : HA_NOSAME; + switch(key->type){ + case Key::MULTIPLE: + key_info->flags = 0; + break; + case Key::FULLTEXT: + key_info->flags = HA_FULLTEXT; + break; + case Key::SPATIAL: + key_info->flags = HA_SPATIAL; + break; + default: + key_info->flags = HA_NOSAME; + } + + key_info->key_alg = key->alg; key_info->key_parts=(uint8) key->columns.elements; key_info->key_part=key_part_info; key_info->usable_key_parts= key_number; @@ -452,7 +465,31 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, DBUG_RETURN(-1); } } - + /* + Make SPATIAL to be RTREE by default + SPATIAL only on BLOB or at least BINARY, this + actually should be replaced by special GEOM type + in near future when new frm file is ready + checking for proper key parts number: + */ + + if(key_info->flags == HA_SPATIAL){ + if(key_info->key_parts!=1){ + my_printf_error(ER_WRONG_ARGUMENTS, + ER(ER_WRONG_ARGUMENTS),MYF(0),"SPATIAL INDEX"); + DBUG_RETURN(-1); + } + }else + { + if(key_info->key_alg == HA_KEY_ALG_RTREE){ + if((key_info->key_parts&1)==1){ + my_printf_error(ER_WRONG_ARGUMENTS, + ER(ER_WRONG_ARGUMENTS),MYF(0),"RTREE INDEX"); + DBUG_RETURN(-1); + } + } + } + List_iterator cols(key->columns); for (uint column_nr=0 ; (column=cols++) ; column_nr++) { @@ -480,6 +517,14 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, { if (key->type == Key::FULLTEXT) column->length=1; /* ft-code ignores it anyway :-) */ + else if (key->type == Key::SPATIAL) + { + /* + BAR: 4 is: (Xmin,Xmax,Ymin,Ymax), this is for 2D case + Lately we'll extend this code to support more dimensions + */ + column->length=4*sizeof(double); + } else { my_printf_error(ER_BLOB_KEY_WITHOUT_LENGTH, @@ -1471,11 +1516,13 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, key_part_length)); } if (key_parts.elements) - key_list.push_back(new Key(key_info->flags & HA_NOSAME ? + key_list.push_back(new Key(key_info->flags & HA_SPATIAL ? Key::SPATIAL : + (key_info->flags & HA_NOSAME ? (!my_strcasecmp(key_name, "PRIMARY") ? Key::PRIMARY : Key::UNIQUE) : (key_info->flags & HA_FULLTEXT ? - Key::FULLTEXT : Key::MULTIPLE), + Key::FULLTEXT : Key::MULTIPLE)), + key_info->key_alg, key_name,key_parts)); } key_it.rewind(); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 742c39ce901..62b1e1841ff 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -54,6 +54,7 @@ inline Item *or_or_concat(Item* A, Item* B) List *item_list; List *string_list; Key::Keytype key_type; + enum ha_key_alg key_alg; enum db_type db_type; enum row_type row_type; enum ha_rkey_function ha_rkey_mode; @@ -154,6 +155,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token BOOL_SYM %token BOOLEAN_SYM %token BOTH +%token BTREE_SYM %token BY %token CACHE_SYM %token CASCADE @@ -200,6 +202,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token GREATEST_SYM %token GROUP %token HAVING +%token HASH_SYM %token HEAP_SYM %token HEX_NUM %token HIGH_PRIORITY @@ -291,10 +294,12 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token ROWS_SYM %token ROW_FORMAT_SYM %token ROW_SYM +%token RTREE_SYM %token SET %token SERIALIZABLE_SYM %token SESSION_SYM %token SHUTDOWN +%token SPATIAL_SYM %token SQL_CACHE_SYM %token SQL_NO_CACHE_SYM %token SSL_SYM @@ -344,6 +349,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token ENUM %token FAST_SYM %token FLOAT_SYM +%token GEOM_SYM %token INT_SYM %token LIMIT %token LONGBLOB @@ -401,6 +407,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token FORMAT_SYM %token FOR_SYM %token FROM_UNIXTIME +%token GEOMETRYCOLLECTION %token GROUP_UNIQUE_USERS %token HOUR_MINUTE_SYM %token HOUR_SECOND_SYM @@ -412,6 +419,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token INTERVAL_SYM %token LAST_INSERT_ID %token LEFT +%token LINESTRING %token LOCATE %token MAKE_SET_SYM %token MINUTE_SECOND_SYM @@ -419,8 +427,12 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token MODE_SYM %token MODIFY_SYM %token MONTH_SYM +%token MULTILINESTRING +%token MULTIPOINT +%token MULTIPOLYGON %token NOW_SYM %token PASSWORD +%token POLYGON %token POSITION_SYM %token PROCEDURE %token RAND @@ -527,6 +539,9 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %type key_type opt_unique_or_fulltext +%type + key_alg opt_btree_or_rtree + %type key_usage_list @@ -713,21 +728,22 @@ create: } create2 - | CREATE opt_unique_or_fulltext INDEX ident ON table_ident + | CREATE opt_unique_or_fulltext INDEX ident key_alg ON table_ident { LEX *lex=Lex; lex->sql_command= SQLCOM_CREATE_INDEX; - if (!add_table_to_list($6,NULL,1)) + if (!add_table_to_list($7,NULL,1)) YYABORT; lex->create_list.empty(); lex->key_list.empty(); lex->col_list.empty(); lex->change=NullS; } - '(' key_list ')' + '(' key_list ')' { LEX *lex=Lex; - lex->key_list.push_back(new Key($2,$4.str,lex->col_list)); + + lex->key_list.push_back(new Key($2,$5,$4.str,lex->col_list)); lex->col_list.empty(); } | CREATE DATABASE opt_if_not_exists ident @@ -874,10 +890,10 @@ field_list_item: { Lex->col_list.empty(); /* Alloced by sql_alloc */ } - | key_type opt_ident '(' key_list ')' + | key_type opt_ident key_alg '(' key_list ')' { LEX *lex=Lex; - lex->key_list.push_back(new Key($1,$2,lex->col_list)); + lex->key_list.push_back(new Key($1,$3,$2,lex->col_list)); lex->col_list.empty(); /* Alloced by sql_alloc */ } | opt_constraint FOREIGN KEY_SYM opt_ident '(' key_list ')' references @@ -942,6 +958,8 @@ type: $$=FIELD_TYPE_TINY_BLOB; } | BLOB_SYM { Lex->type|=BINARY_FLAG; $$=FIELD_TYPE_BLOB; } + | GEOM_SYM { Lex->type|=BINARY_FLAG; + $$=FIELD_TYPE_GEOMETRY; } | MEDIUMBLOB { Lex->type|=BINARY_FLAG; $$=FIELD_TYPE_MEDIUM_BLOB; } | LONGBLOB { Lex->type|=BINARY_FLAG; @@ -1083,6 +1101,8 @@ key_type: | key_or_index { $$= Key::MULTIPLE; } | FULLTEXT_SYM { $$= Key::FULLTEXT; } | FULLTEXT_SYM key_or_index { $$= Key::FULLTEXT; } + | SPATIAL_SYM { $$= Key::SPATIAL; } + | SPATIAL_SYM key_or_index { $$= Key::SPATIAL; } | opt_constraint UNIQUE_SYM { $$= Key::UNIQUE; } | opt_constraint UNIQUE_SYM key_or_index { $$= Key::UNIQUE; } @@ -1099,6 +1119,16 @@ opt_unique_or_fulltext: /* empty */ { $$= Key::MULTIPLE; } | UNIQUE_SYM { $$= Key::UNIQUE; } | FULLTEXT_SYM { $$= Key::FULLTEXT; } + | SPATIAL_SYM { $$= Key::SPATIAL; } + +key_alg: + /* empty */ { $$= HA_KEY_ALG_BTREE; } + | USING opt_btree_or_rtree { $$= $2 } + +opt_btree_or_rtree: + BTREE_SYM { $$= HA_KEY_ALG_BTREE; } + | RTREE_SYM { $$= HA_KEY_ALG_RTREE; } + | HASH_SYM { $$= HA_KEY_ALG_HASH; } key_list: key_list ',' key_part order_dir { Lex->col_list.push_back($3); } @@ -1684,6 +1714,10 @@ simple_expr: } | FIELD_FUNC '(' expr ',' expr_list ')' { $$= new Item_func_field($3, *$5); } + | GEOMETRYCOLLECTION '(' expr_list ')' + { $$= new Item_func_spatial_collection(* $3, + Geometry::wkbGeometryCollection, + Geometry::wkbPoint); } | HOUR_SYM '(' expr ')' { $$= new Item_func_hour($3); } | IF '(' expr ',' expr ',' expr ')' @@ -1708,6 +1742,9 @@ simple_expr: } | LEFT '(' expr ',' expr ')' { $$= new Item_func_left($3,$5); } + | LINESTRING '(' expr_list ')' + { $$= new Item_func_spatial_collection(* $3, + Geometry::wkbLineString, Geometry::wkbPoint); } | LOCATE '(' expr ',' expr ')' { $$= new Item_func_locate($5,$3); } | LOCATE '(' expr ',' expr ',' expr ')' @@ -1720,6 +1757,15 @@ simple_expr: { $$= new Item_func_minute($3); } | MONTH_SYM '(' expr ')' { $$= new Item_func_month($3); } + | MULTILINESTRING '(' expr_list ')' + { $$= new Item_func_spatial_collection(* $3, + Geometry::wkbMultiLineString, Geometry::wkbLineString); } + | MULTIPOINT '(' expr_list ')' + { $$= new Item_func_spatial_collection(* $3, + Geometry::wkbMultiPoint, Geometry::wkbPoint); } + | MULTIPOLYGON '(' expr_list ')' + { $$= new Item_func_spatial_collection(* $3, + Geometry::wkbMultiPolygon, Geometry::wkbPolygon ); } | NOW_SYM optional_braces { $$= new Item_func_now(); current_thd->safe_to_cache_query=0;} | NOW_SYM '(' expr ')' @@ -1728,6 +1774,9 @@ simple_expr: { $$= new Item_func_password($3); } + | POLYGON '(' expr_list ')' + { $$= new Item_func_spatial_collection(* $3, + Geometry::wkbPolygon, Geometry::wkbLineString); } | POSITION_SYM '(' no_in_expr IN_SYM expr ')' { $$ = new Item_func_locate($5,$3); } | RAND '(' expr ')' diff --git a/sql/structs.h b/sql/structs.h index 9e577128c8d..3ee4680f4a4 100644 --- a/sql/structs.h +++ b/sql/structs.h @@ -64,6 +64,7 @@ typedef struct st_key_part_info { /* Info about a key part */ typedef struct st_key { uint key_length; /* Tot length of key */ uint flags; /* dupp key and pack flags */ + enum ha_key_alg key_alg; /* +BAR Algorithm BTREE or RTREE */ uint key_parts; /* How many key_parts */ uint extra_length; uint usable_key_parts; /* Should normally be = key_parts */ diff --git a/sql/table.cc b/sql/table.cc index 9aae9e17e5a..9e6283d6ad4 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -153,7 +153,9 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, { keyinfo->flags= ((uint) strpos[0]) ^ HA_NOSAME; keyinfo->key_length= (uint) uint2korr(strpos+1); - keyinfo->key_parts= (uint) strpos[3]; strpos+=4; + keyinfo->key_parts= (uint) strpos[3]; + strpos+=4; + keyinfo->key_part= key_part; keyinfo->rec_per_key= rec_per_key; for (j=keyinfo->key_parts ; j-- ; key_part++) @@ -395,6 +397,26 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, } } + keyinfo->key_alg=HA_KEY_ALG_BTREE; // BAR : btree by default + +#define BAR_DIRTY_HACK +#ifdef BAR_DIRTY_HACK + // BAR FIXME: Dirty hack while waiting for new .frm format + switch(keyinfo->name[0]){ + case 'R': + keyinfo->key_alg=HA_KEY_ALG_RTREE; + break; + case 'S': + keyinfo->key_alg = HA_KEY_ALG_RTREE; + keyinfo->flags |= HA_SPATIAL; + break; + case 'B': + default: + keyinfo->key_alg=HA_KEY_ALG_BTREE; + break; + } +#endif + for (i=0 ; i < keyinfo->key_parts ; key_part++,i++) { if (new_field_pack_flag <= 1) -- cgit v1.2.1 From b9aebaa0aced6e22a84b86dd02481b4a4f56a32e Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 23 Feb 2002 14:18:41 +0200 Subject: Small addition to SHOW GRANTS --- sql/sql_acl.cc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index 577084a650a..c5782f65798 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -2687,6 +2687,13 @@ int mysql_show_grants(THD *thd,LEX_USER *lex_user) #endif /* HAVE_OPENSSL */ if (want_access & GRANT_ACL) global.append(" WITH GRANT OPTION",18); + else if (acl_user->questions) + { + char buff[65], *p; // just as in int2str + global.append(" WITH MAX_QUERIES_PER_HOUR = ",29); + p=int2str(acl_user->questions,buff,10); + global.append(buff,p-buff); + } thd->packet.length(0); net_store_data(&thd->packet,global.ptr(),global.length()); if (my_net_write(&thd->net,(char*) thd->packet.ptr(), -- cgit v1.2.1 From 0ab62691ec12c75880d815b90374deaf6fd26283 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 28 Feb 2002 14:28:42 +0400 Subject: These files must be ignored being symlinked from /sql BitKeeper/etc/ignore: Added libmysqld/gstream.cc libmysqld/spatial.cc to the ignore list --- .bzrignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.bzrignore b/.bzrignore index d22d68be57d..f40e1f26cd2 100644 --- a/.bzrignore +++ b/.bzrignore @@ -463,3 +463,5 @@ vio/test-ssl vio/test-sslclient vio/test-sslserver vio/viotest-ssl +libmysqld/gstream.cc +libmysqld/spatial.cc -- cgit v1.2.1 From 143a179f3c1c4cca5b61979bb1a24b2053057ae0 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 28 Feb 2002 14:05:47 +0200 Subject: Porting surgical changes from 4.0 to 4.1 --- sql/sql_select.cc | 108 ++++++++++++++++++++++++++++-------------------------- sql/sql_union.cc | 58 ++++++++++++++--------------- 2 files changed, 85 insertions(+), 81 deletions(-) diff --git a/sql/sql_select.cc b/sql/sql_select.cc index ae6c38a874e..3135fe050dc 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -6963,13 +6963,16 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, { List field_list; Item *item; + List item_list; THD *thd=join->thd; + MYSQL_LOCK *save_lock; SELECT_LEX *select_lex = &(join->thd->lex.select_lex); + select_result *result=join->result; DBUG_ENTER("select_describe"); /* Don't log this into the slow query log */ select_lex->options&= ~(QUERY_NO_INDEX_USED | QUERY_NO_GOOD_INDEX_USED); - if (join->thd->lex.select == select_lex) + if (thd->lex.select == select_lex) { field_list.push_back(new Item_empty_string("table",NAME_LEN)); field_list.push_back(new Item_empty_string("type",10)); @@ -6985,24 +6988,22 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, item->maybe_null=1; field_list.push_back(new Item_real("rows",0.0,0,10)); field_list.push_back(new Item_empty_string("Extra",255)); - if (send_fields(thd,field_list,1)) + if (result->send_fields(field_list,1)) return; } - char buff[512],*buff_ptr; - String tmp(buff,sizeof(buff)),*packet= &thd->packet; + if (message) { - packet->length(0); - net_store_null(packet); - net_store_null(packet); - net_store_null(packet); - net_store_null(packet); - net_store_null(packet); - net_store_null(packet); - net_store_null(packet); - net_store_data(packet,message,strlen(message)); - if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length())) - DBUG_VOID_RETURN; + item_list.push_back(new Item_empty_string("",0)); + item_list.push_back(new Item_empty_string("",0)); + item_list.push_back(new Item_empty_string("",0)); + item_list.push_back(new Item_empty_string("",0)); + item_list.push_back(new Item_empty_string("",0)); + item_list.push_back(new Item_empty_string("",0)); + item_list.push_back(new Item_empty_string("",0)); + item_list.push_back(new Item_string(message,strlen(message))); + if (result->send_data(item_list)) + result->send_error(0,NullS); } else { @@ -7011,69 +7012,70 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, { JOIN_TAB *tab=join->join_tab+i; TABLE *table=tab->table; - + char buff[512],*buff_ptr=buff; + char buff1[512], buff2[512], bufff[512]; + String tmp1(buff1,sizeof(buff1)); + String tmp2(buff2,sizeof(buff2)); + item_list.empty(); if (tab->type == JT_ALL && tab->select && tab->select->quick) tab->type= JT_RANGE; - packet->length(0); - net_store_data(packet,table->table_name); - net_store_data(packet,join_type_str[tab->type]); - tmp.length(0); + item_list.push_back(new Item_string(table->table_name,strlen(table->table_name))); + item_list.push_back(new Item_string(join_type_str[tab->type],strlen(join_type_str[tab->type]))); + tmp1.length(0); tmp2.length(0); key_map bits; uint j; for (j=0,bits=tab->keys ; bits ; j++,bits>>=1) { if (bits & 1) { - if (tmp.length()) - tmp.append(','); - tmp.append(table->key_info[j].name); + if (tmp1.length()) + tmp1.append(','); + tmp1.append(table->key_info[j].name); } } - if (tmp.length()) - net_store_data(packet,tmp.ptr(),tmp.length()); + if (tmp1.length()) + item_list.push_back(new Item_string(tmp1.ptr(),tmp1.length())); else - net_store_null(packet); + item_list.push_back(new Item_null()); if (tab->ref.key_parts) { - net_store_data(packet,table->key_info[tab->ref.key].name); - net_store_data(packet,(uint32) tab->ref.key_length); - tmp.length(0); + item_list.push_back(new Item_string(table->key_info[tab->ref.key].name,strlen(table->key_info[tab->ref.key].name))); + item_list.push_back(new Item_int((int) tab->ref.key_length)); for (store_key **ref=tab->ref.key_copy ; *ref ; ref++) { - if (tmp.length()) - tmp.append(','); - tmp.append((*ref)->name()); + if (tmp2.length()) + tmp2.append(','); + tmp2.append((*ref)->name()); } - net_store_data(packet,tmp.ptr(),tmp.length()); + item_list.push_back(new Item_string(tmp2.ptr(),tmp2.length())); } else if (tab->type == JT_NEXT) { - net_store_data(packet,table->key_info[tab->index].name); - net_store_data(packet,(uint32) table->key_info[tab->index].key_length); - net_store_null(packet); + item_list.push_back(new Item_string(table->key_info[tab->index].name,strlen(table->key_info[tab->index].name))); + item_list.push_back(new Item_int((int) table->key_info[tab->index].key_length)); + item_list.push_back(new Item_null()); } else if (tab->select && tab->select->quick) { - net_store_data(packet,table->key_info[tab->select->quick->index].name);; - net_store_data(packet,(uint32) tab->select->quick->max_used_key_length); - net_store_null(packet); + item_list.push_back(new Item_string(table->key_info[tab->select->quick->index].name,strlen(table->key_info[tab->select->quick->index].name))); + item_list.push_back(new Item_int((int) tab->select->quick->max_used_key_length)); + item_list.push_back(new Item_null()); } else { - net_store_null(packet); - net_store_null(packet); - net_store_null(packet); + item_list.push_back(new Item_null()); + item_list.push_back(new Item_null()); + item_list.push_back(new Item_null()); } - sprintf(buff,"%.0f",join->best_positions[i].records_read); - net_store_data(packet,buff); + sprintf(bufff,"%.0f",join->best_positions[i].records_read); + item_list.push_back(new Item_string(bufff,strlen(bufff))); my_bool key_read=table->key_read; if (tab->type == JT_NEXT && ((table->used_keys & ((key_map) 1 << tab->index)))) key_read=1; - buff_ptr=buff; if (tab->info) - net_store_data(packet,tab->info); + item_list.push_back(new Item_string(tab->info,strlen(tab->info))); else if (tab->select) { if (tab->use_quick == 2) @@ -7127,16 +7129,20 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, } buff_ptr=strmov(buff_ptr,"Distinct"); } - net_store_data(packet,buff,(uint) (buff_ptr - buff)); - if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length())) - DBUG_VOID_RETURN; /* Purecov: Inspected */ - + item_list.push_back(new Item_string(buff,(uint) (buff_ptr - buff))); // For next iteration used_tables|=table->map; + if (result->send_data(item_list)) + result->send_error(0,NullS); } } if (!join->thd->lex.select->next) - send_eof(&thd->net); + { + save_lock=thd->lock; + thd->lock=(MYSQL_LOCK *)0; + result->send_eof(); + thd->lock=save_lock; + } DBUG_VOID_RETURN; } diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 51ad2425022..60155e0ce8d 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -31,10 +31,11 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) ORDER *order; List item_list; TABLE *table; + int describe=(lex->select_lex.options & SELECT_DESCRIBE) ? 1 : 0; + int res; TABLE_LIST result_table_list; TMP_TABLE_PARAM tmp_table_param; select_union *union_result; - int res; DBUG_ENTER("mysql_union"); /* Fix tables 'to-be-unioned-from' list to point at opened tables */ @@ -70,33 +71,26 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) lex_sl=0; order=0; } - - if (lex->select_lex.options & SELECT_DESCRIBE) + + if (describe) { - for (sl= &lex->select_lex; sl; sl=sl->next) - { - lex->select=sl; - thd->offset_limit=sl->offset_limit; - thd->select_limit=sl->select_limit+sl->offset_limit; - if (thd->select_limit < sl->select_limit) - thd->select_limit= HA_POS_ERROR; // no limit - if (thd->select_limit == HA_POS_ERROR) - sl->options&= ~OPTION_FOUND_ROWS; - res=mysql_select(thd, (TABLE_LIST*) sl->table_list.first, - sl->item_list, - sl->where, - ((sl->braces) ? - (ORDER *) sl->order_list.first : (ORDER *) 0), - (ORDER*) sl->group_list.first, - sl->having, - (ORDER*) NULL, - (sl->options | thd->options | SELECT_NO_UNLOCK | - SELECT_DESCRIBE), - result); - } - DBUG_RETURN(0); + Item *item; + item_list.push_back(new Item_empty_string("table",NAME_LEN)); + item_list.push_back(new Item_empty_string("type",10)); + item_list.push_back(item=new Item_empty_string("possible_keys", + NAME_LEN*MAX_KEY)); + item->maybe_null=1; + item_list.push_back(item=new Item_empty_string("key",NAME_LEN)); + item->maybe_null=1; + item_list.push_back(item=new Item_int("key_len",0,3)); + item->maybe_null=1; + item_list.push_back(item=new Item_empty_string("ref", + NAME_LEN*MAX_REF_PARTS)); + item->maybe_null=1; + item_list.push_back(new Item_real("rows",0.0,0,10)); + item_list.push_back(new Item_empty_string("Extra",255)); } - + else { Item *item; List_iterator it(lex->select_lex.item_list); @@ -113,7 +107,7 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) bzero((char*) &tmp_table_param,sizeof(tmp_table_param)); tmp_table_param.field_count=item_list.elements; if (!(table=create_tmp_table(thd, &tmp_table_param, item_list, - (ORDER*) 0, !lex->union_option, + (ORDER*) 0, !describe & !lex->union_option, 1, 0, (lex->select_lex.options | thd->options | TMP_TABLE_ALL_COLUMNS)))) @@ -130,7 +124,9 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) res= -1; goto exit; } - for (sl= &lex->select_lex; sl; sl=sl->next) + union_result->save_time_stamp=!describe; + + for (sl=&lex->select_lex;sl;sl=sl->next) { thd->offset_limit=sl->offset_limit; thd->select_limit=sl->select_limit+sl->offset_limit; @@ -146,7 +142,7 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) (ORDER*) sl->group_list.first, sl->having, (ORDER*) NULL, - sl->options | thd->options | SELECT_NO_UNLOCK, + sl->options | thd->options | SELECT_NO_UNLOCK | ((describe) ? SELECT_DESCRIBE : 0), union_result); if (res) goto exit; @@ -187,6 +183,8 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) if (thd->select_limit == HA_POS_ERROR) thd->options&= ~OPTION_FOUND_ROWS; } + if (describe) + thd->select_limit= HA_POS_ERROR; // no limit res=mysql_select(thd,&result_table_list, item_list, NULL, /*ftfunc_list,*/ order, (ORDER*) NULL, NULL, (ORDER*) NULL, @@ -222,7 +220,7 @@ select_union::~select_union() int select_union::prepare(List &list) { - if (list.elements != table->fields) + if (save_time_stamp && list.elements != table->fields) { my_message(ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT, ER(ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT),MYF(0)); -- cgit v1.2.1 From 94958d062b460449c1f249abfa0766b7d7554eb9 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 28 Feb 2002 17:28:36 +0400 Subject: Several new OpenGIS functions Fixes in GeomFromText() to accept an new optional argument respobsible for SRID. This is for more OpenGIS conformance and PostGIS compatibility to simplify migrating from PgSQL to MySQL sql/gen_lex_hash.cc: Changed max_allowed_array sql/lex.h: Added several symbols for new OpenGIS SQL functions sql/sql_yacc.yy: new OpenGIS functions (spatial constructors) --- sql/gen_lex_hash.cc | 2 +- sql/lex.h | 11 +++++++++-- sql/sql_yacc.yy | 50 +++++++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 55 insertions(+), 8 deletions(-) diff --git a/sql/gen_lex_hash.cc b/sql/gen_lex_hash.cc index 7ebdbcd8ba8..918ec753f68 100644 --- a/sql/gen_lex_hash.cc +++ b/sql/gen_lex_hash.cc @@ -30,7 +30,7 @@ bool opt_search=0; int opt_verbose=0; ulong opt_count=100000; -#define max_allowed_array 8000 // Don't generate bigger arrays than this +#define max_allowed_array 16000 // Don't generate bigger arrays than this #define max_symbol 32767 // Use this for 'not found' #define how_much_for_plus 8 // 2-8 #define type_count 1 // 1-5 diff --git a/sql/lex.h b/sql/lex.h index 04edaf217b9..c720a308f7d 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -159,7 +159,7 @@ static SYMBOL symbols[] = { { "FULL", SYM(FULL),0,0}, { "FULLTEXT", SYM(FULLTEXT_SYM),0,0}, { "FUNCTION", SYM(UDF_SYM),0,0}, - { "GEOM", SYM(GEOM_SYM),0,0}, + { "GEOMETRY", SYM(GEOMETRY_SYM),0,0}, { "GLOBAL", SYM(GLOBAL_SYM),0,0}, { "GRANT", SYM(GRANT),0,0}, { "GRANTS", SYM(GRANTS),0,0}, @@ -453,7 +453,8 @@ static SYMBOL sql_functions[] = { { "GEOMETRYCOLLECTION",SYM(GEOMETRYCOLLECTION),0,0}, { "GEOMETRYN", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_geometryn)}, { "GEOMETRYTYPE", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_geometry_type)}, - { "GEOMFROMTEXT", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_geometry_from_text)}, + { "GEOMCOLLFROMTEXT", SYM(GEOMCOLLFROMTEXT),0,0}, + { "GEOMFROMTEXT", SYM(GEOMFROMTEXT),0,0}, { "GLENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_glength)}, { "GREATEST", SYM(GREATEST_SYM),0,0}, { "GROUP_UNIQUE_USERS", SYM(GROUP_UNIQUE_USERS),0,0}, @@ -471,6 +472,7 @@ static SYMBOL sql_functions[] = { { "LCASE", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_lcase)}, { "LEAST", SYM(LEAST_SYM),0,0}, { "LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_length)}, + { "LINEFROMTEXT", SYM(LINEFROMTEXT),0,0}, { "LINESTRING", SYM(LINESTRING),0,0}, { "LOAD_FILE", SYM(FUNC_ARG1),0,CREATE_FUNC(create_load_file)}, { "LOCATE", SYM(LOCATE),0,0}, @@ -487,6 +489,9 @@ static SYMBOL sql_functions[] = { { "MID", SYM(SUBSTRING),0,0}, /* unireg function */ { "MIN", SYM(MIN_SYM),0,0}, { "MOD", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_mod)}, + { "MLINEFROMTEXT", SYM(MLINEFROMTEXT),0,0}, + { "MPOINTFROMTEXT", SYM(MPOINTFROMTEXT),0,0}, + { "MPOLYFROMTEXT", SYM(MPOLYFROMTEXT),0,0}, { "MULTILINESTRING", SYM(MULTILINESTRING),0,0}, { "MULTIPOINT", SYM(MULTIPOINT),0,0}, { "MULTIPOLYGON", SYM(MULTIPOLYGON),0,0}, @@ -504,7 +509,9 @@ static SYMBOL sql_functions[] = { { "PERIOD_DIFF", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_period_diff)}, { "PI", SYM(FUNC_ARG0),0,CREATE_FUNC(create_func_pi)}, { "POINT", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_point)}, + { "POINTFROMTEXT", SYM(POINTFROMTEXT),0,0}, { "POINTN", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_pointn)}, + { "POLYFROMTEXT", SYM(POLYFROMTEXT),0,0}, { "POLYGON", SYM(POLYGON),0,0}, { "POSITION", SYM(POSITION_SYM),0,0}, { "POW", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_pow)}, diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 857d7a245f0..b8b56a72657 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -349,7 +349,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token ENUM %token FAST_SYM %token FLOAT_SYM -%token GEOM_SYM +%token GEOMETRY_SYM %token INT_SYM %token LIMIT %token LONGBLOB @@ -407,6 +407,8 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token FORMAT_SYM %token FOR_SYM %token FROM_UNIXTIME +%token GEOMCOLLFROMTEXT +%token GEOMFROMTEXT %token GEOMETRYCOLLECTION %token GROUP_UNIQUE_USERS %token HOUR_MINUTE_SYM @@ -419,6 +421,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token INTERVAL_SYM %token LAST_INSERT_ID %token LEFT +%token LINEFROMTEXT %token LINESTRING %token LOCATE %token MAKE_SET_SYM @@ -427,11 +430,16 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token MODE_SYM %token MODIFY_SYM %token MONTH_SYM +%token MLINEFROMTEXT +%token MPOINTFROMTEXT +%token MPOLYFROMTEXT %token MULTILINESTRING %token MULTIPOINT %token MULTIPOLYGON %token NOW_SYM %token PASSWORD +%token POINTFROMTEXT +%token POLYFROMTEXT %token POLYGON %token POSITION_SYM %token PROCEDURE @@ -966,7 +974,7 @@ type: $$=FIELD_TYPE_TINY_BLOB; } | BLOB_SYM { Lex->type|=BINARY_FLAG; $$=FIELD_TYPE_BLOB; } - | GEOM_SYM { Lex->type|=BINARY_FLAG; + | GEOMETRY_SYM { Lex->type|=BINARY_FLAG; $$=FIELD_TYPE_GEOMETRY; } | MEDIUMBLOB { Lex->type|=BINARY_FLAG; $$=FIELD_TYPE_MEDIUM_BLOB; } @@ -1722,6 +1730,10 @@ simple_expr: } | FIELD_FUNC '(' expr ',' expr_list ')' { $$= new Item_func_field($3, *$5); } + | GEOMFROMTEXT '(' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | GEOMFROMTEXT '(' expr ',' expr ')' + { $$= new Item_func_geometry_from_text($3) } | GEOMETRYCOLLECTION '(' expr_list ')' { $$= new Item_func_spatial_collection(* $3, Geometry::wkbGeometryCollection, @@ -1757,10 +1769,18 @@ simple_expr: { $$= new Item_func_locate($5,$3); } | LOCATE '(' expr ',' expr ',' expr ')' { $$= new Item_func_locate($5,$3,$7); } - | GREATEST_SYM '(' expr ',' expr_list ')' + | GEOMCOLLFROMTEXT '(' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | GEOMCOLLFROMTEXT '(' expr ',' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | GREATEST_SYM '(' expr ',' expr_list ')' { $5->push_front($3); $$= new Item_func_max(*$5); } | LEAST_SYM '(' expr ',' expr_list ')' { $5->push_front($3); $$= new Item_func_min(*$5); } + | LINEFROMTEXT '(' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | LINEFROMTEXT '(' expr ',' expr ')' + { $$= new Item_func_geometry_from_text($3) } | MINUTE_SYM '(' expr ')' { $$= new Item_func_minute($3); } | MONTH_SYM '(' expr ')' @@ -1768,7 +1788,19 @@ simple_expr: | MULTILINESTRING '(' expr_list ')' { $$= new Item_func_spatial_collection(* $3, Geometry::wkbMultiLineString, Geometry::wkbLineString); } - | MULTIPOINT '(' expr_list ')' + | MLINEFROMTEXT '(' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | MLINEFROMTEXT '(' expr ',' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | MPOINTFROMTEXT '(' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | MPOINTFROMTEXT '(' expr ',' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | MPOLYFROMTEXT '(' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | MPOLYFROMTEXT '(' expr ',' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | MULTIPOINT '(' expr_list ')' { $$= new Item_func_spatial_collection(* $3, Geometry::wkbMultiPoint, Geometry::wkbPoint); } | MULTIPOLYGON '(' expr_list ')' @@ -1782,7 +1814,15 @@ simple_expr: { $$= new Item_func_password($3); } - | POLYGON '(' expr_list ')' + | POINTFROMTEXT '(' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | POINTFROMTEXT '(' expr ',' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | POLYFROMTEXT '(' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | POLYFROMTEXT '(' expr ',' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | POLYGON '(' expr_list ')' { $$= new Item_func_spatial_collection(* $3, Geometry::wkbPolygon, Geometry::wkbLineString); } | POSITION_SYM '(' no_in_expr IN_SYM expr ')' -- cgit v1.2.1 From f739974c5e5b4dbf68c5000b8231f554d9ffd40d Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 28 Feb 2002 22:01:41 +0200 Subject: Porting from mysql-4.0. Read comments there if you are interested .. BitKeeper/etc/ignore: Added sql/sql_yacc.yy.orig to the ignore list --- .bzrignore | 1 + libmysql/libmysql.c | 2 +- mysql-test/r/union.result | 15 +++++++++++++++ mysql-test/t/union.test | 6 ++++++ sql/sql_yacc.yy | 8 ++++---- 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/.bzrignore b/.bzrignore index f40e1f26cd2..f2da28f44f8 100644 --- a/.bzrignore +++ b/.bzrignore @@ -465,3 +465,4 @@ vio/test-sslserver vio/viotest-ssl libmysqld/gstream.cc libmysqld/spatial.cc +sql/sql_yacc.yy.orig diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index 32aa8e59888..4e4518bbe10 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -737,7 +737,7 @@ static void mysql_read_default_options(struct st_mysql_options *options, *end=0; /* Remove '=' */ } /* Change all '_' in variable name to '-' */ - for (end= *option ; (end= strcend(end,'_')) ; ) + for (end= *option ; (end= strcend(end,'_')) && *end ; ) *end= '-'; switch (find_type(*option+2,&option_types,2)) { case 1: /* port */ diff --git a/mysql-test/r/union.result b/mysql-test/r/union.result index 6a27df648b5..e842bb3b447 100644 --- a/mysql-test/r/union.result +++ b/mysql-test/r/union.result @@ -86,6 +86,21 @@ explain select a,b from t1 union all select a,b from t2; table type possible_keys key key_len ref rows Extra t1 ALL NULL NULL NULL NULL 4 t2 ALL NULL NULL NULL NULL 4 +explain select xx from t1 union select 1; +Unknown column 'xx' in 'field list' +explain select a,b from t1 union select 1; +table type possible_keys key key_len ref rows Extra +t1 ALL NULL NULL NULL NULL 4 + 0 0 No tables used +explain select 1 union select a,b from t1 union select 1; +table type possible_keys key key_len ref rows Extra + 0 0 No tables used +t1 ALL NULL NULL NULL NULL 4 + 0 0 No tables used +explain select a,b from t1 union select 1 limit 0; +table type possible_keys key key_len ref rows Extra +t1 ALL NULL NULL NULL NULL 4 + 0 0 Impossible WHERE select a,b from t1 into outfile 'skr' union select a,b from t2; Wrong usage of UNION and INTO select a,b from t1 order by a union select a,b from t2; diff --git a/mysql-test/t/union.test b/mysql-test/t/union.test index 8d98e6e0389..f782c61d97a 100644 --- a/mysql-test/t/union.test +++ b/mysql-test/t/union.test @@ -24,6 +24,12 @@ select 't1',b,count(*) from t1 group by b UNION select 't2',b,count(*) from t2 g # Test some error conditions with UNION explain select a,b from t1 union all select a,b from t2; +--error 1054 +explain select xx from t1 union select 1; +explain select a,b from t1 union select 1; +explain select 1 union select a,b from t1 union select 1; +explain select a,b from t1 union select 1 limit 0; + --error 1221 select a,b from t1 into outfile 'skr' union select a,b from t2; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 857d7a245f0..3c0d476ac83 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1977,7 +1977,7 @@ opt_else: | ELSE expr { $$= $2; } when_list: - { Select->when_list.push_front(new List) } + { Select->when_list.push_front(new List); } when_list2 { $$= Select->when_list.pop(); } @@ -2080,7 +2080,7 @@ opt_key_definition: } key_usage_list: - key_or_index { Select->interval_list.empty() } '(' key_usage_list2 ')' + key_or_index { Select->interval_list.empty(); } '(' key_usage_list2 ')' { $$= &Select->interval_list; } key_usage_list2: @@ -2686,7 +2686,7 @@ describe: YYABORT; } opt_describe_column - | describe_command select { Lex->select_lex.options|= SELECT_DESCRIBE }; + | describe_command select { Lex->select_lex.options|= SELECT_DESCRIBE; } describe_command: @@ -3126,7 +3126,7 @@ set: lex->select->select_limit=lex->thd->default_select_limit; lex->tx_isolation=lex->thd->tx_isolation; lex->option_type=0; - lex->option_list.empty() + lex->option_list.empty(); } option_value_list -- cgit v1.2.1 From c66afc4d7c238cdb63cda9c06286afb4ac981de9 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 4 Mar 2002 15:31:22 +0400 Subject: New armscii8 charset configure.in: Added armscii8 sql/share/charsets/Index: A --- configure.in | 2 +- sql/share/charsets/Index | 1 + sql/share/charsets/armscii8.conf | 74 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 sql/share/charsets/armscii8.conf diff --git a/configure.in b/configure.in index f8f5d88369b..dae6415ffdd 100644 --- a/configure.in +++ b/configure.in @@ -1866,7 +1866,7 @@ CHARSETS_AVAILABLE="big5 cp1251 cp1257 croat czech danish dec8 dos estonia euc_kr gb2312 gbk german1 greek hebrew hp8 hungarian koi8_ru koi8_ukr latin1 latin1_de latin2 latin5 sjis swe7 tis620 ujis - usa7 win1250 win1251ukr" + usa7 win1250 win1251ukr armscii8" CHARSETS_DEPRECATED="win1251" DEFAULT_CHARSET=latin1 AC_DIVERT_POP diff --git a/sql/share/charsets/Index b/sql/share/charsets/Index index 5cf30682cc0..9781b516f97 100644 --- a/sql/share/charsets/Index +++ b/sql/share/charsets/Index @@ -36,3 +36,4 @@ gbk 28 cp1257 29 latin5 30 latin1_de 31 +armscii8 32 diff --git a/sql/share/charsets/armscii8.conf b/sql/share/charsets/armscii8.conf new file mode 100644 index 00000000000..15c232c7e94 --- /dev/null +++ b/sql/share/charsets/armscii8.conf @@ -0,0 +1,74 @@ +# Configuration file for the armscii8 (armenian) character set + +# ctype array (must have 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 20 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 10 10 01 02 01 02 01 02 01 02 01 02 01 02 01 02 + 01 02 01 02 01 02 01 02 01 02 01 02 01 02 01 02 + 01 02 01 02 01 02 01 02 01 02 01 02 01 02 01 02 + 01 02 01 02 01 02 01 02 01 02 01 02 01 02 01 02 + 01 02 01 02 01 02 01 02 01 02 01 02 01 02 10 10 + +# to_lower array (must have 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 B8 A9 AA AB AC AD AE AF + B0 B1 B3 B3 B5 B5 B7 B7 B9 B9 BB BB BD BD BF BF + C1 C1 C3 C3 C5 C5 C7 C7 C9 C9 CB CB CD CD CF CF + D1 D1 D3 D3 D5 D5 D7 D7 D9 D9 DB DB DD DD DF DF + E1 E1 E3 E3 E5 E5 E7 E7 E9 E9 EB EB ED ED EF EF + F1 F1 F3 F3 F5 F5 F7 F7 F9 F9 FB FB FD FD FE FF + +# to_upper array (must have 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF + B0 B1 B2 B2 B4 B4 B6 B6 B8 B8 BA BA BC BC BE BE + C0 C0 C2 C2 C4 C4 C6 C6 C8 C8 CA CA CC CC CE CE + D0 D0 D2 D2 D4 D4 D6 D6 D8 D8 DA DA DC DC DE DE + E0 E0 E2 E2 E4 E4 E6 E6 E8 E8 EA EA EC EC EE EE + F0 F0 F2 F2 F4 F4 F6 F6 F8 F8 FA FA FC FC FE FF + +# sort_order array (must have 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF -- cgit v1.2.1 From 1a7c7d763cb34b52c723c526b2e8b38432e7dec1 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 5 Mar 2002 16:12:11 +0200 Subject: Fixes done in 4.0 repository. For comments see the corresponding ones in 4.0. --- mysql-test/mysql-test-run.sh | 2 ++ mysql-test/r/select_found.result | 6 ++++++ mysql-test/t/select_found.test | 2 ++ sql/sql_select.cc | 6 +++--- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index 465c1cfdaa2..33f08b42b17 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -726,6 +726,7 @@ start_master() --server-id=1 \ --basedir=$MY_BASEDIR \ --port=$MASTER_MYPORT \ + --local-infile \ --exit-info=256 \ --core \ --datadir=$MASTER_MYDDIR \ @@ -745,6 +746,7 @@ start_master() --server-id=1 --rpl-recovery-rank=1 \ --basedir=$MY_BASEDIR --init-rpl-role=master \ --port=$MASTER_MYPORT \ + --local-infile \ --datadir=$MASTER_MYDDIR \ --pid-file=$MASTER_MYPID \ --socket=$MASTER_MYSOCK \ diff --git a/mysql-test/r/select_found.result b/mysql-test/r/select_found.result index 3a84c3e52da..0e2cc108bb4 100644 --- a/mysql-test/r/select_found.result +++ b/mysql-test/r/select_found.result @@ -20,6 +20,12 @@ a b select found_rows(); FOUND_ROWS() 8 +select SQL_BUFFER_RESULT SQL_CALC_FOUND_ROWS * from t1 limit 1; +a b +1 2 +select found_rows(); +FOUND_ROWS() +8 select SQL_CALC_FOUND_ROWS * from t1 order by b desc limit 1; a b 8 9 diff --git a/mysql-test/t/select_found.test b/mysql-test/t/select_found.test index 9b14ab1fcf0..d6b6284a88b 100644 --- a/mysql-test/t/select_found.test +++ b/mysql-test/t/select_found.test @@ -9,6 +9,8 @@ select SQL_CALC_FOUND_ROWS * from t1; select found_rows(); select SQL_CALC_FOUND_ROWS * from t1 limit 1; select found_rows(); +select SQL_BUFFER_RESULT SQL_CALC_FOUND_ROWS * from t1 limit 1; +select found_rows(); select SQL_CALC_FOUND_ROWS * from t1 order by b desc limit 1; select found_rows(); select SQL_CALC_FOUND_ROWS distinct b from t1 limit 1; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 3135fe050dc..14feb12c769 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -187,7 +187,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, TABLE *tmp_table; int error, tmp_error; bool need_tmp,hidden_group_fields; - bool simple_order,simple_group,no_order, skip_sort_order; + bool simple_order,simple_group,no_order, skip_sort_order, buffer_result; Item::cond_result cond_value; SQL_SELECT *select; DYNAMIC_ARRAY keyuse; @@ -201,6 +201,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, /* Check that all tables, fields, conds and order are ok */ select_distinct=test(select_options & SELECT_DISTINCT); + buffer_result=test(select_options & OPTION_BUFFER_RESULT) && !test(select_options & OPTION_FOUND_ROWS); tmp_table=0; select=0; no_order=skip_sort_order=0; @@ -546,8 +547,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, need_tmp= (join.const_tables != join.tables && ((select_distinct || !simple_order || !simple_group) || - (group && order) || - test(select_options & OPTION_BUFFER_RESULT))); + (group && order) || buffer_result)); // No cache for MATCH make_join_readinfo(&join, -- cgit v1.2.1 From 336fcc224e6869ff27544ae743169c388f19d52d Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 6 Mar 2002 14:56:54 +0200 Subject: small bug fix, read more about it in 4.0 --- heap/hp_rnext.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/heap/hp_rnext.c b/heap/hp_rnext.c index 4e5cb7e37c2..7a6b6846169 100644 --- a/heap/hp_rnext.c +++ b/heap/hp_rnext.c @@ -23,6 +23,12 @@ int heap_rnext(HP_INFO *info, byte *record) byte *pos; HP_SHARE *share=info->s; DBUG_ENTER("heap_rnext"); + + if (!(info->s->records)) + { + my_errno=HA_ERR_END_OF_FILE; + DBUG_RETURN(my_errno); + } if (info->lastinx < 0) DBUG_RETURN(my_errno=HA_ERR_WRONG_INDEX); -- cgit v1.2.1 From 0cc0dbc1ed62ac8c98664077cb8cca6e117899d8 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 6 Mar 2002 17:44:43 +0400 Subject: Charsets related things are prepared by configure in new way. This is to simplify maintaining charsets, especially changing CHARSET_INFO structure. acconfig.h: New defines for charsets configure.in: New way to build charsets include/m_ctype.h: Prototypes, moved from ctype_autoconf.c libmysql/Makefile.shared: Removed ctype_autoconf.c and ctype_extra_sources.c from target dependancies strings/Makefile.am: The same with above strings/conf_to_src.c: Remove unnecessary comment strings/ctype-czech.c: Fix for possible bugs that prototypes was not included strings/ctype-euc_kr.c: Fix for possible bugs that prototypes was not included strings/ctype-gb2312.c: Fix for possible bugs that prototypes was not included strings/ctype-ujis.c: Fix for possible bugs that prototypes was not included strings/ctype.c: Move tables from ctype_extra_sources.c and hide them under #ifdefs --- acconfig.h | 38 + configure.in | 287 +++-- include/m_ctype.h | 82 ++ libmysql/Makefile.shared | 8 +- strings/Makefile.am | 8 - strings/conf_to_src.c | 2 +- strings/ctype-czech.c | 1 + strings/ctype-euc_kr.c | 1 + strings/ctype-gb2312.c | 1 + strings/ctype-ujis.c | 1 + strings/ctype.c | 2633 +++++++++++++++++++++++++++++++++++++++++++++- 11 files changed, 2878 insertions(+), 184 deletions(-) diff --git a/acconfig.h b/acconfig.h index 02be1ace0c6..aaa1162e9d1 100644 --- a/acconfig.h +++ b/acconfig.h @@ -18,6 +18,9 @@ #undef CRAY_STACKSEG_END +/* Define the default charset name */ +#undef DEFAULT_CHARSET_NAME + /* Version of .frm files */ #undef DOT_FRM_VERSION @@ -63,6 +66,41 @@ /* READLINE: */ #undef HAVE_BSD_SIGNALS +/* Define charsets you want */ +#undef HAVE_CHARSET_armscii8 +#undef HAVE_CHARSET_big5 +#undef HAVE_CHARSET_cp1251 +#undef HAVE_CHARSET_cp1257 +#undef HAVE_CHARSET_croat +#undef HAVE_CHARSET_czech +#undef HAVE_CHARSET_danish +#undef HAVE_CHARSET_dec8 +#undef HAVE_CHARSET_dos +#undef HAVE_CHARSET_estonia +#undef HAVE_CHARSET_euc_kr +#undef HAVE_CHARSET_gb2312 +#undef HAVE_CHARSET_gbk +#undef HAVE_CHARSET_german1 +#undef HAVE_CHARSET_greek +#undef HAVE_CHARSET_hebrew +#undef HAVE_CHARSET_hp8 +#undef HAVE_CHARSET_hungarian +#undef HAVE_CHARSET_koi8_ru +#undef HAVE_CHARSET_koi8_ukr +#undef HAVE_CHARSET_latin1 +#undef HAVE_CHARSET_latin1_de +#undef HAVE_CHARSET_latin2 +#undef HAVE_CHARSET_latin5 +#undef HAVE_CHARSET_sjis +#undef HAVE_CHARSET_swe7 +#undef HAVE_CHARSET_tis620 +#undef HAVE_CHARSET_ujis +#undef HAVE_CHARSET_usa7 +#undef HAVE_CHARSET_utf8 +#undef HAVE_CHARSET_win1250 +#undef HAVE_CHARSET_win1251ukr +#undef HAVE_CHARSET_win1251 + /* ZLIB and compress: */ #undef HAVE_COMPRESS diff --git a/configure.in b/configure.in index dae6415ffdd..2772a2c92ab 100644 --- a/configure.in +++ b/configure.in @@ -1856,17 +1856,18 @@ fi AC_SUBST(readline_dir) AC_SUBST(readline_link) + dnl In order to add new charset, you must add charset name to dnl this CHARSETS_AVAILABLE list and sql/share/charsets/Index. dnl If the character set uses strcoll or other special handling, dnl you must also create strings/ctype-$charset_name.c AC_DIVERT_PUSH(0) -CHARSETS_AVAILABLE="big5 cp1251 cp1257 +CHARSETS_AVAILABLE="armscii8 big5 cp1251 cp1257 croat czech danish dec8 dos estonia euc_kr gb2312 gbk german1 greek hebrew hp8 hungarian koi8_ru koi8_ukr latin1 latin1_de latin2 latin5 sjis swe7 tis620 ujis - usa7 win1250 win1251ukr armscii8" + usa7 utf8 win1250 win1251ukr" CHARSETS_DEPRECATED="win1251" DEFAULT_CHARSET=latin1 AC_DIVERT_POP @@ -1899,197 +1900,153 @@ else fi fi -# Ensure that the default_charset is first in CHARSETS -TMP_CHARSETS="$default_charset " -for i in $CHARSETS -do - if test $i != $default_charset - then - TMP_CHARSETS="$TMP_CHARSETS $i" - fi -done -CHARSETS=$TMP_CHARSETS +use_mb="no" -# Check if charsets are all good for cs in $CHARSETS do - charset_okay=0 - for charset in $CHARSETS_AVAILABLE $CHARSETS_DEPRECATED - do - if test $cs = $charset; then charset_okay=1; fi - done - if test $charset_okay = 0; - then - AC_MSG_ERROR([Charset $cs not available. (Available $CHARSETS_AVAILABLE). - See the Installation chapter in the Reference Manual.]); - fi + case $cs in + armscii8) + AC_DEFINE(HAVE_CHARSET_armscii8) + use_mb="yes" + ;; + big5) + AC_DEFINE(HAVE_CHARSET_big5) + use_mb="yes" + ;; + cp1251) + AC_DEFINE(HAVE_CHARSET_cp1251) + ;; + cp1257) + AC_DEFINE(HAVE_CHARSET_cp1257) + ;; + croat) + AC_DEFINE(HAVE_CHARSET_croat) + ;; + czech) + AC_DEFINE(HAVE_CHARSET_czech) + ;; + danish) + AC_DEFINE(HAVE_CHARSET_danish) + ;; + dec8) + AC_DEFINE(HAVE_CHARSET_dec8) + ;; + dos) + AC_DEFINE(HAVE_CHARSET_dos) + ;; + estonia) + AC_DEFINE(HAVE_CHARSET_estonia) + ;; + euc_kr) + AC_DEFINE(HAVE_CHARSET_euc_kr) + use_mb="yes" + ;; + gb2312) + AC_DEFINE(HAVE_CHARSET_gb2312) + use_mb="yes" + ;; + gbk) + AC_DEFINE(HAVE_CHARSET_gbk) + use_mb="yes" + ;; + german1) + AC_DEFINE(HAVE_CHARSET_german1) + ;; + greek) + AC_DEFINE(HAVE_CHARSET_greek) + ;; + hebrew) + AC_DEFINE(HAVE_CHARSET_hebrew) + ;; + hp8) + AC_DEFINE(HAVE_CHARSET_hp8) + ;; + hungarian) + AC_DEFINE(HAVE_CHARSET_hungarian) + ;; + koi8_ru) + AC_DEFINE(HAVE_CHARSET_koi8_ru) + ;; + koi8_ukr) + AC_DEFINE(HAVE_CHARSET_koi8_ukr) + ;; + latin1) + AC_DEFINE(HAVE_CHARSET_latin1) + ;; + latin1_de) + AC_DEFINE(HAVE_CHARSET_latin1_de) + ;; + latin2) + AC_DEFINE(HAVE_CHARSET_latin2) + ;; + latin5) + AC_DEFINE(HAVE_CHARSET_latin5) + ;; + sjis) + AC_DEFINE(HAVE_CHARSET_sjis) + use_mb="yes" + ;; + swe7) + AC_DEFINE(HAVE_CHARSET_swe7) + ;; + tis620) + AC_DEFINE(HAVE_CHARSET_tis620) + ;; + ujis) + AC_DEFINE(HAVE_CHARSET_ujis) + use_mb="yes" + ;; + usa7) + AC_DEFINE(HAVE_CHARSET_usa7) + ;; + utf8) + AC_DEFINE(HAVE_CHARSET_utf8) + use_mb="yes" + ;; + win1250) + AC_DEFINE(HAVE_CHARSET_win1250) + ;; + win1251) + AC_DEFINE(HAVE_CHARSET_win1251) + ;; + win1251ukr) + AC_DEFINE(HAVE_CHARSET_win1251ukr) + ;; + *) + AC_MSG_ERROR([Charset $cs not available. (Available $CHARSETS_AVAILABLE). + See the Installation chapter in the Reference Manual.]); + esac done - + CHARSET_SRCS="" CHARSETS_NEED_SOURCE="" -CHARSET_DECLARATIONS="" -CHARSET_COMP_CS_INIT="CHARSET_INFO compiled_charsets[[]] = {" - -want_use_strcoll=0 -want_use_mb=0 - -index_file="$srcdir/sql/share/charsets/Index" for c in $CHARSETS do - # get the charset number from $index_file -changequote(,)dnl - subpat='^'"${c}"'[ ][ ]*\([0-9][0-9]*\)[^0-9]*$' - number=`sed -e "/$subpat/!d" -e 's//\1/' $index_file` -changequote([,])dnl - # some sanity checking.... - if test X"$number" = X - then - AC_MSG_ERROR([No number was found in $index_file for the $c character set. This is a bug in the MySQL distribution. Please report this message to bugs@lists.mysql.com.]) - fi - cs_file="$srcdir/strings/ctype-$c.c" if test -f $cs_file then CHARSET_SRCS="${CHARSET_SRCS}ctype-$c.c " - # get the strxfrm multiplier and max mb len from files - subpat='^.*\\.configure\\. strxfrm_multiply_'"${c}"'=' - strx=`$AWK 'sub("'"$subpat"'", "") { print }' $cs_file` - subpat='^.*\\.configure\\. mbmaxlen_'"${c}"'=' - maxl=`$AWK 'sub("'"$subpat"'", "") { print }' $cs_file` - - CHARSET_DECLARATIONS="$CHARSET_DECLARATIONS - -/* declarations for the ${c} character set, filled in by configure */ -extern uchar ctype_${c}[[]], to_lower_${c}[[]], to_upper_${c}[[]], sort_order_${c}[[]];" - else CHARSETS_NEED_SOURCE="$CHARSETS_NEED_SOURCE $c" - strx='' - maxl='' - fi - - CHARSET_COMP_CS_INIT="$CHARSET_COMP_CS_INIT - - /* this information is filled in by configure */ - { - $number, /* number */ - \"$c\", /* name */ - ctype_${c}, - to_lower_${c}, - to_upper_${c}, - sort_order_${c}," - - if test -n "$strx" - then - want_use_strcoll=1 - - CHARSET_DECLARATIONS="$CHARSET_DECLARATIONS -extern int my_strcoll_${c}(const uchar *, const uchar *); -extern int my_strxfrm_${c}(uchar *, const uchar *, int); -extern int my_strnncoll_${c}(const uchar *, int, const uchar *, int); -extern int my_strnxfrm_${c}(uchar *, const uchar *, int, int); -extern my_bool my_like_range_${c}(const char *, uint, pchar, uint, - char *, char *, uint *, uint *);" - - CHARSET_COMP_CS_INIT="$CHARSET_COMP_CS_INIT - $strx, /* strxfrm_multiply */ - my_strcoll_${c}, - my_strxfrm_${c}, - my_strnncoll_${c}, - my_strnxfrm_${c}, - my_like_range_${c}," - else - CHARSET_COMP_CS_INIT="$CHARSET_COMP_CS_INIT - 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */" - fi - - if test -n "$maxl" - then - want_use_mb=1 - - CHARSET_DECLARATIONS="$CHARSET_DECLARATIONS -extern int ismbchar_${c}(const char *, const char *); -extern my_bool ismbhead_${c}(uint); -extern int mbcharlen_${c}(uint);" - - - CHARSET_COMP_CS_INIT="$CHARSET_COMP_CS_INIT - $maxl, /* mbmaxlen */ - ismbchar_${c}, - ismbhead_${c}, - mbcharlen_${c}" - else - CHARSET_COMP_CS_INIT="$CHARSET_COMP_CS_INIT - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL /* mbcharlen */" fi - CHARSET_COMP_CS_INIT="$CHARSET_COMP_CS_INIT - }," done -CHARSET_COMP_CS_INIT="$CHARSET_COMP_CS_INIT - - /* this information is filled in by configure */ - { - 0, /* end-of-list marker */ - NullS, - NULL, - NULL, - NULL, - NULL, - 0, - NULL, - NULL, - NULL, - NULL, - NULL, - 0, - NULL, - NULL, - NULL - } -};" - - -if test $want_use_strcoll = 1 -then - AC_DEFINE(USE_STRCOLL) -fi - -if test $want_use_mb = 1 +if test "$use_mb" = "yes" then AC_DEFINE(USE_MB) AC_DEFINE(USE_MB_IDENT) fi +# Temporary hack for USE_STRCOLL +AC_DEFINE(USE_STRCOLL) + AC_SUBST(default_charset) +AC_DEFINE_UNQUOTED(DEFAULT_CHARSET_NAME,"$default_charset") AC_SUBST(CHARSET_SRCS) CHARSET_OBJS="`echo "$CHARSET_SRCS" | sed -e 's/\.c /.o /g'`" AC_SUBST(CHARSET_OBJS) AC_SUBST(CHARSETS_NEED_SOURCE) -dnl We can't use AC_SUBST because these substitutions are too long. -dnl I don't want to use sed, either, because there's a reason why -dnl autoconf breaks up the substitution commands. So we'll just -dnl write to a file and #include it. -dnl AC_SUBST(CHARSET_DECLARATIONS) -dnl AC_SUBST(CHARSET_COMP_CS_INIT) -dnl sed -e "s%@CHARSET_DECLARATIONS@%$CHARSET_DECLARATIONS%g" \ -dnl -e "s%@CHARSET_COMP_CS_INIT@%$CHARSET_COMP_CS_INIT%g" \ -dnl $srcdir/strings/ctype.c.in > $srcdir/strings/ctype.c - -cat < $srcdir/strings/ctype_autoconf.c -/* This file is generated automatically by configure. */$CHARSET_DECLARATIONS - -$CHARSET_COMP_CS_INIT -EOF AC_MSG_RESULT([default: $default_charset; compiled in: $CHARSETS]) diff --git a/include/m_ctype.h b/include/m_ctype.h index 61afcb7245e..daeffdc2fee 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -26,6 +26,88 @@ extern "C" { #endif +/* declarations for the big5 character set */ +extern uchar ctype_big5[], to_lower_big5[], to_upper_big5[], sort_order_big5[]; +extern int my_strcoll_big5(const uchar *, const uchar *); +extern int my_strxfrm_big5(uchar *, const uchar *, int); +extern int my_strnncoll_big5(const uchar *, int, const uchar *, int); +extern int my_strnxfrm_big5(uchar *, const uchar *, int, int); +extern my_bool my_like_range_big5(const char *, uint, pchar, uint, + char *, char *, uint *, uint *); +extern int ismbchar_big5(const char *, const char *); +extern my_bool ismbhead_big5(uint); +extern int mbcharlen_big5(uint); + +/* declarations for the czech character set */ +extern uchar ctype_czech[], to_lower_czech[], to_upper_czech[], sort_order_czech[]; +extern int my_strcoll_czech(const uchar *, const uchar *); +extern int my_strxfrm_czech(uchar *, const uchar *, int); +extern int my_strnncoll_czech(const uchar *, int, const uchar *, int); +extern int my_strnxfrm_czech(uchar *, const uchar *, int, int); +extern my_bool my_like_range_czech(const char *, uint, pchar, uint, + char *, char *, uint *, uint *); + +/* declarations for the euc_kr character set */ +extern uchar ctype_euc_kr[], to_lower_euc_kr[], to_upper_euc_kr[], sort_order_euc_kr[]; +extern int ismbchar_euc_kr(const char *, const char *); +extern my_bool ismbhead_euc_kr(uint); +extern int mbcharlen_euc_kr(uint); + +/* declarations for the gb2312 character set */ +extern uchar ctype_gb2312[], to_lower_gb2312[], to_upper_gb2312[], sort_order_gb2312[]; +extern int ismbchar_gb2312(const char *, const char *); +extern my_bool ismbhead_gb2312(uint); +extern int mbcharlen_gb2312(uint); + +/* declarations for the gbk character set */ +extern uchar ctype_gbk[], to_lower_gbk[], to_upper_gbk[], sort_order_gbk[]; +extern int my_strcoll_gbk(const uchar *, const uchar *); +extern int my_strxfrm_gbk(uchar *, const uchar *, int); +extern int my_strnncoll_gbk(const uchar *, int, const uchar *, int); +extern int my_strnxfrm_gbk(uchar *, const uchar *, int, int); +extern my_bool my_like_range_gbk(const char *, uint, pchar, uint, + char *, char *, uint *, uint *); +extern int ismbchar_gbk(const char *, const char *); +extern my_bool ismbhead_gbk(uint); +extern int mbcharlen_gbk(uint); + +/* declarations for the latin1_de character set */ +extern uchar ctype_latin1_de[], to_lower_latin1_de[], to_upper_latin1_de[], sort_order_latin1_de[]; +extern int my_strcoll_latin1_de(const uchar *, const uchar *); +extern int my_strxfrm_latin1_de(uchar *, const uchar *, int); +extern int my_strnncoll_latin1_de(const uchar *, int, const uchar *, int); +extern int my_strnxfrm_latin1_de(uchar *, const uchar *, int, int); +extern my_bool my_like_range_latin1_de(const char *, uint, pchar, uint, + char *, char *, uint *, uint *); + +/* declarations for the sjis character set */ +extern uchar ctype_sjis[], to_lower_sjis[], to_upper_sjis[], sort_order_sjis[]; +extern int my_strcoll_sjis(const uchar *, const uchar *); +extern int my_strxfrm_sjis(uchar *, const uchar *, int); +extern int my_strnncoll_sjis(const uchar *, int, const uchar *, int); +extern int my_strnxfrm_sjis(uchar *, const uchar *, int, int); +extern my_bool my_like_range_sjis(const char *, uint, pchar, uint, + char *, char *, uint *, uint *); +extern int ismbchar_sjis(const char *, const char *); +extern my_bool ismbhead_sjis(uint); +extern int mbcharlen_sjis(uint); + +/* declarations for the tis620 character set */ +extern uchar ctype_tis620[], to_lower_tis620[], to_upper_tis620[], sort_order_tis620[]; +extern int my_strcoll_tis620(const uchar *, const uchar *); +extern int my_strxfrm_tis620(uchar *, const uchar *, int); +extern int my_strnncoll_tis620(const uchar *, int, const uchar *, int); +extern int my_strnxfrm_tis620(uchar *, const uchar *, int, int); +extern my_bool my_like_range_tis620(const char *, uint, pchar, uint, + char *, char *, uint *, uint *); + +/* declarations for the ujis character set */ +extern uchar ctype_ujis[], to_lower_ujis[], to_upper_ujis[], sort_order_ujis[]; +extern int ismbchar_ujis(const char *, const char *); +extern my_bool ismbhead_ujis(uint); +extern int mbcharlen_ujis(uint); + + #define CHARSET_DIR "charsets/" typedef struct charset_info_st diff --git a/libmysql/Makefile.shared b/libmysql/Makefile.shared index 0d3aa79b9ce..93cbf130f18 100644 --- a/libmysql/Makefile.shared +++ b/libmysql/Makefile.shared @@ -42,7 +42,7 @@ mystringsobjects = strmov.lo strxmov.lo strxnmov.lo strnmov.lo \ bchange.lo bmove.lo bmove_upp.lo longlong2str.lo \ strtoull.lo strtoll.lo llstr.lo \ ctype.lo $(LTCHARSET_OBJS) -mystringsextra= strto.c ctype_autoconf.c +mystringsextra= strto.c dbugobjects = dbug.lo # IT IS IN SAFEMALLOC.C sanity.lo mysysheaders = mysys_priv.h my_static.h mysysobjects1 = my_init.lo my_static.lo my_malloc.lo my_realloc.lo \ @@ -75,19 +75,15 @@ DEFS = -DDEFAULT_CHARSET_HOME="\"$(MYSQLBASEdir)\"" \ # The automatic dependencies miss this bmove_upp.lo: $(LTCHARSET_OBJS) -ctype.lo: ctype_extra_sources.c clean-local: rm -f `echo $(mystringsobjects) | sed "s;\.lo;.c;g"` \ `echo $(dbugobjects) | sed "s;\.lo;.c;g"` \ `echo $(mysysobjects) | sed "s;\.lo;.c;g"` \ `echo $(vio_objects) | sed "s;\.lo;.c;g"` \ - $(mystringsextra) $(mysysheaders) ctype_extra_sources.c \ + $(mystringsextra) $(mysysheaders) \ ../linked_client_sources -ctype_extra_sources.c: conf_to_src - ./conf_to_src $(top_srcdir) @CHARSETS_NEED_SOURCE@ > \ - $(srcdir)/ctype_extra_sources.c conf_to_src_SOURCES = conf_to_src.c conf_to_src_LDADD= #force static linking of conf_to_src - essential when linking against diff --git a/strings/Makefile.am b/strings/Makefile.am index 3bce48045b3..c1cfe64eb70 100644 --- a/strings/Makefile.am +++ b/strings/Makefile.am @@ -44,7 +44,6 @@ noinst_PROGRAMS = conf_to_src EXTRA_DIST = ctype-big5.c ctype-czech.c ctype-euc_kr.c \ ctype-gb2312.c ctype-gbk.c ctype-sjis.c \ ctype-tis620.c ctype-ujis.c ctype-latin1_de.c \ - ctype_autoconf.c \ strto.c strings-x86.s longlong2str-x86.s \ strxmov.c bmove_upp.c strappend.c strcont.c strend.c \ strfill.c strcend.c is_prefix.c strstr.c strinstr.c \ @@ -63,11 +62,6 @@ OMIT_DEPENDENCIES = pthread.h stdio.h __stdio.h stdlib.h __stdlib.h math.h\ cdefs.h machdep.h signal.h __signal.h util.h libmystrings_a_LIBADD= @CHARSET_OBJS@ -ctype.o: ctype_extra_sources.c - -ctype_extra_sources.c: conf_to_src - ./conf_to_src $(top_srcdir) @CHARSETS_NEED_SOURCE@ > \ - $(srcdir)/ctype_extra_sources.c conf_to_src_SOURCES = conf_to_src.c conf_to_src_LDADD= #force static linking of conf_to_src - essential when linking against @@ -77,8 +71,6 @@ conf_to_src_LDFLAGS= @NOINST_LDFLAGS@ # This is because the dependency tracking misses @FOO@ vars in sources. strtoull.o: @CHARSET_OBJS@ -clean-local: - rm -f ctype_extra_sources.c if ASSEMBLER # On Linux gcc can compile the assembly files diff --git a/strings/conf_to_src.c b/strings/conf_to_src.c index 22e04337b14..2f88c9ad22e 100644 --- a/strings/conf_to_src.c +++ b/strings/conf_to_src.c @@ -124,7 +124,7 @@ print_arrays_for(char *set) } printf("\ -/* The %s character set. Generated automatically by configure and\n\ +/* The %s character set. Generated automatically by\n\ * the %s program\n\ */\n\n", set, prog); diff --git a/strings/ctype-czech.c b/strings/ctype-czech.c index 70f95e0d5d6..4564ca2361b 100644 --- a/strings/ctype-czech.c +++ b/strings/ctype-czech.c @@ -68,6 +68,7 @@ #include #include "m_string.h" +#include "m_ctype.h" #else diff --git a/strings/ctype-euc_kr.c b/strings/ctype-euc_kr.c index d05ca518283..ed8266bf96f 100644 --- a/strings/ctype-euc_kr.c +++ b/strings/ctype-euc_kr.c @@ -28,6 +28,7 @@ #include #include "m_string.h" +#include "m_ctype.h" uchar NEAR ctype_euc_kr[257] = { diff --git a/strings/ctype-gb2312.c b/strings/ctype-gb2312.c index 28717d98403..7b9b22f0227 100644 --- a/strings/ctype-gb2312.c +++ b/strings/ctype-gb2312.c @@ -26,6 +26,7 @@ #include #include "m_string.h" +#include "m_ctype.h" uchar NEAR ctype_gb2312[257] = { diff --git a/strings/ctype-ujis.c b/strings/ctype-ujis.c index 2091a610d19..568b5a69d9d 100644 --- a/strings/ctype-ujis.c +++ b/strings/ctype-ujis.c @@ -26,6 +26,7 @@ #include #include "m_string.h" +#include "m_ctype.h" uchar NEAR ctype_ujis[257] = { diff --git a/strings/ctype.c b/strings/ctype.c index 8e3571b1b88..4be87f9c62a 100644 --- a/strings/ctype.c +++ b/strings/ctype.c @@ -20,11 +20,2636 @@ #include #endif -/* generated by make, using conf_to_src */ -#include "ctype_extra_sources.c" +#ifdef HAVE_CHARSET_armscii8 +static uchar ctype_armscii8[] = { + 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 16, 16 +}; + +static uchar to_lower_armscii8[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,184,169,170,171,172,173,174,175, + 176,177,179,179,181,181,183,183,185,185,187,187,189,189,191,191, + 193,193,195,195,197,197,199,199,201,201,203,203,205,205,207,207, + 209,209,211,211,213,213,215,215,217,217,219,219,221,221,223,223, + 225,225,227,227,229,229,231,231,233,233,235,235,237,237,239,239, + 241,241,243,243,245,245,247,247,249,249,251,251,253,253,254,255 +}; + +static uchar to_upper_armscii8[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,178,180,180,182,182,184,184,186,186,188,188,190,190, + 192,192,194,194,196,196,198,198,200,200,202,202,204,204,206,206, + 208,208,210,210,212,212,214,214,216,216,218,218,220,220,222,222, + 224,224,226,226,228,228,230,230,232,232,234,234,236,236,238,238, + 240,240,242,242,244,244,246,246,248,248,250,250,252,252,254,255 +}; + +static uchar sort_order_armscii8[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; +#endif + + +#ifdef HAVE_CHARSET_cp1251 + +/* The cp1251 character set. Generated automatically by + * the ./conf_to_src program + */ + +static uchar ctype_cp1251[] = { + 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static uchar to_lower_cp1251[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,184,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar to_upper_cp1251[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,168,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223 +}; + +static uchar sort_order_cp1251[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,124,125,126,127,128, + 129, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,130,131,132,133,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, 97,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, 97,255,255,255,255,255,255,255, + 91, 92, 93, 94, 95, 96, 98, 99,100,101,102,103,104,105,106,107, + 108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123, + 91, 92, 93, 94, 95, 96, 98, 99,100,101,102,103,104,105,106,107, + 108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123 +}; +#endif + + +#ifdef HAVE_CHARSET_cp1257 + +/* The cp1257 character set. Generated automatically by + * the ./conf_to_src program + */ + +static uchar ctype_cp1257[] = { + 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, + 2, 2, 0, 0, 0, 0, 2, 0, 2, 0, 0, 2, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0 +}; + +static uchar to_lower_cp1257[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 224,225,194,195,196,197,230,199,232,201,202,235,204,205,206,207, + 240,209,210,211,212,213,214,215,248,217,218,251,220,221,254,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar to_upper_cp1257[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 192,193,226,227,228,229,198,231,200,233,234,203,236,237,238,239, + 208,241,242,243,244,245,246,247,216,249,250,219,252,253,222,255 +}; + +static uchar sort_order_cp1257[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 67, 68, 70, 71, 74, 75, 76, 77, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 91, 92, 95, 96, 97, 78,255, 98, 99,100,101,102, + 103, 65, 67, 68, 70, 71, 74, 75, 76, 77, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 91, 92, 95, 96, 97, 78,255,104,105,106,107,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 66, 79,255,255,255,255, 72,255, 69,255,255, 73,255,255,255,255, + 90,255,255,255,255,255,255,255, 94,255,255, 93,255,255,255,255, + 255, 79,255,255,255,255, 72,255, 69,255,255, 73,255,255,255,255, + 90,255,255,255,255,255,255,255, 94,255,255, 93,255,255,255,255 +}; +#endif + + +#ifdef HAVE_CHARSET_croat + +/* The croat character set. Generated by + * the ./conf_to_src program + */ + +static uchar ctype_croat[] = { + 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 16, 1, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static uchar to_lower_croat[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,154,139,140,141,158,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,215,248,249,250,251,252,253,254,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar to_upper_croat[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,138,155,156,157,142,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,247,216,217,218,219,220,221,222,255 +}; + +static uchar sort_order_croat[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 70, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 88, 89, 90, 91, 92, 93, 94, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 70, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 88, 89, 90, 91, 92, 93, 94,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137, 87,139,140,141, 95,143, + 144,145,146,147,148,149,150,151,152,153, 87,155,156,157, 95,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 65, 65, 65, 65, 92, 91, 69, 67, 68, 69, 69, 69, 73, 73, 73, 73, + 71, 78, 79, 79, 79, 79, 93,215,216, 85, 85, 85, 89, 89,222,223, + 65, 65, 65, 65, 92, 91, 69, 67, 68, 69, 69, 69, 73, 73, 73, 73, + 71, 78, 79, 79, 79, 79, 93,247,216, 85, 85, 85, 89, 89,222,255 +}; +#endif + + +#ifdef HAVE_CHARSET_danish + +/* The danish character set. Generated automatically by + * the ./conf_to_src program + */ + +static uchar ctype_danish[] = { + 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 16, 1, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static uchar to_lower_danish[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,215,248,249,250,251,252,253,254,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar to_upper_danish[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,247,216,217,218,219,220,221,222,255 +}; + +static uchar sort_order_danish[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 65, 65, 65, 65, 91, 93, 91, 67, 69, 69, 69, 69, 73, 73, 73, 73, + 68, 78, 79, 79, 79, 79, 92,215, 92, 85, 85, 85, 89, 89,222,223, + 65, 65, 65, 65, 91, 93, 91, 67, 69, 69, 69, 69, 73, 73, 73, 73, + 68, 78, 79, 79, 79, 79, 92,247, 92, 85, 85, 85, 89, 89,222,255 +}; +#endif + + + +#ifdef HAVE_CHARSET_dec8 + +/* The dec8 character set. Generated automatically by + * the ./conf_to_src program + */ + +static uchar ctype_dec8[] = { + 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 16, 1, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static uchar to_lower_dec8[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,215,248,249,250,251,252,253,254,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar to_upper_dec8[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,247,216,217,218,219,220,221,222,255 +}; + +static uchar sort_order_dec8[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 65, 65, 65, 65, 92, 91, 92, 67, 69, 69, 69, 69, 73, 73, 73, 73, + 68, 78, 79, 79, 79, 79, 93,215,216, 85, 85, 85, 89, 89,222,223, + 65, 65, 65, 65, 92, 91, 92, 67, 69, 69, 69, 69, 73, 73, 73, 73, + 68, 78, 79, 79, 79, 79, 93,247,216, 85, 85, 85, 89, 89,222,255 +}; +#endif + + +#ifdef HAVE_CHARSET_dos + +/* The dos character set. Generated automatically by + * the ./conf_to_src program + */ + +static uchar ctype_dos[] = { + 0, + 32, 48, 48, 48, 48, 48, 48, 32, 32, 40, 40, 40, 40, 40, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 48, 48, 48, 48, 48, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 48, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 2, 1, 2, 2, 2, 2, 2, 2, 1, 1, 16, 16, 16, 16, 16, + 2, 2, 2, 2, 2, 1, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 32 +}; + +static uchar to_lower_dos[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 135,129,130,131,132,133,134,135,136,137,138,139,140,141,132,134, + 130,145,145,147,148,149,150,151,152,148,129,155,156,157,158,159, + 160,161,162,163,164,164,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar to_upper_dos[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,154,144, 65,142, 65,143,128, 69, 69, 69, 73, 73, 73,142,143, + 144,146,146, 79,153, 79, 85, 85, 89,153,154,155,156,157,158,159, + 65, 73, 79, 85,165,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar sort_order_dos[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 67, 89, 69, 65, 92, 65, 91, 67, 69, 69, 69, 73, 73, 73, 92, 91, + 69, 92, 92, 79, 93, 79, 85, 85, 89, 93, 89, 36, 36, 36, 36, 36, + 65, 73, 79, 85, 78, 78,166,167, 63,169,170,171,172, 33, 34, 34, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; +#endif + +#ifdef HAVE_CHARSET_estonia + +/* The estonia character set. Generated automatically by + * the ./conf_to_src program + */ + +static uchar ctype_estonia[] = { + 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 16, 1, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static uchar to_lower_estonia[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,184,169,186,171,172,173,174,191, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,215,248,249,250,251,252,253,254,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar to_upper_estonia[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,168,185,170,187,188,189,190,175, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,247,216,217,218,219,220,221,222,255 +}; + +static uchar sort_order_estonia[] = { + 0, 2, 3, 4, 5, 6, 7, 8, 9, 46, 47, 48, 49, 50, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 44, 51, 52, 53, 54, 55, 56, 39, 57, 58, 59, 93, 60, 40, 61, 62, + 118,122,124,126,128,129,130,131,132,133, 63, 64, 94, 95, 96, 65, + 66,134,144,146,152,154,164,166,170,172,178,180,184,190,192,198, + 206,208,210,214,229,232,238,240,250,252,221, 67, 68, 69, 70, 71, + 72,135,145,147,153,155,165,167,171,173,179,181,185,191,193,199, + 207,209,211,215,230,233,239,241,251,253,222, 73, 74, 75, 76, 28, + 1, 29, 87, 30, 90,116,113,114, 31,117, 32, 91, 33, 78, 82, 81, + 34, 85, 86, 88, 89,115, 42, 43, 35,231, 36, 92, 37, 79, 84, 38, + 45,254,102,103,104,255, 77,105,204,106,212, 98,107, 41,108,142, + 109, 97,125,127, 80,110,111,112,205,123,213, 99,119,120,121,143, + 140,176,136,148,244,138,162,160,150,156,223,158,168,182,174,186, + 219,194,196,200,202,242,246,100,236,188,216,234,248,225,227,218, + 141,177,137,149,245,139,163,161,151,157,224,159,169,183,175,187, + 220,195,197,201,203,243,247,101,237,189,217,235,249,226,228, 83 +}; +#endif + +#ifdef HAVE_CHARSET_german1 + +/* The german1 character set. Generated automatically by + * the ./conf_to_src program + */ + +static uchar ctype_german1[] = { + 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 16, 1, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static uchar to_lower_german1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,215,248,249,250,251,252,253,254,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar to_upper_german1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,247,216,217,218,219,220,221,222,255 +}; + +static uchar sort_order_german1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 65, 65, 65, 65, 65, 65, 65, 67, 69, 69, 69, 69, 73, 73, 73, 73, + 208, 78, 79, 79, 79, 79, 79,215, 79, 85, 85, 85, 85, 89,222, 83, + 65, 65, 65, 65, 65, 65, 65, 67, 69, 69, 69, 69, 73, 73, 73, 73, + 208, 78, 79, 79, 79, 79, 79,247, 79, 85, 85, 85, 85, 89,222,255 +}; +#endif + +#ifdef HAVE_CHARSET_greek + +/* The greek character set. Generated automatically by + * the ./conf_to_src program + */ + +static uchar ctype_greek[] = { + 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 72, 16, 16, 16, 0, 0, 16, 16, 16, 16, 0, 16, 16, 16, 0, 16, + 16, 16, 16, 16, 16, 16, 1, 16, 1, 1, 1, 16, 1, 16, 1, 1, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0 +}; + +static uchar to_lower_greek[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,220,183,221,222,223,187,252,189,253,254, + 192,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,210,243,244,245,246,247,248,249,250,251,220,221,222,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar to_upper_greek[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 218,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,193,197,199,201, + 219,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,211,211,212,213,214,215,216,217,218,219,207,213,217,255 +}; + +static uchar sort_order_greek[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,193,183,197,199,201,187,207,189,213,217, + 201,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,201,213,193,197,199,201, + 213,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,211,211,212,213,214,215,216,217,201,213,207,213,217,255 +}; +#endif + +#ifdef HAVE_CHARSET_hebrew + +/* The hebrew character set. Generated automatically by + * the ./conf_to_src program + */ + +static uchar ctype_hebrew[] = { + 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0 +}; + +static uchar to_lower_hebrew[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar to_upper_hebrew[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar sort_order_hebrew[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,247,216,217,218,219,220,221,222,255, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; +#endif + +#ifdef HAVE_CHARSET_hp8 + +/* The hp8 character set. Generated automatically by + * the ./conf_to_src program + */ + +static uchar ctype_hp8[] = { + 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 32, 32, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 16, 16, 2, 16, 2, 2, + 1, 16, 16, 1, 2, 16, 16, 2, 1, 16, 1, 1, 1, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 32, 32, 32, 32, 16, 16, 16, 16, 16, 16, 16, 16, 16, 32 +}; + +static uchar to_lower_hp8[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,200,192,201,193,205,209,221,168,169,170,171,172,203,195,175, + 176,178,178,179,181,181,183,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 212,209,214,215,212,213,214,215,204,217,206,207,197,221,222,194, + 196,226,226,228,228,213,217,198,202,234,234,236,236,199,239,239, + 241,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar to_upper_hp8[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,177,179,180,180,182,182,184,185,186,187,188,189,190,191, + 162,164,223,174,224,220,231,237,161,163,232,173,216,165,218,219, + 208,166,210,211,208,229,210,211,216,230,218,219,220,167,222,223, + 224,225,225,227,227,229,230,231,232,233,233,235,235,237,238,238, + 240,240,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar sort_order_hp8[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 92, 93, 91, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; +#endif + +#ifdef HAVE_CHARSET_hungarian + +/* The hungarian character set. Generated automatically by + * the ./conf_to_src program + */ + +static uchar ctype_hungarian[] = { + 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 72, + 1, 16, 1, 16, 1, 1, 16, 0, 0, 1, 1, 1, 1, 16, 1, 1, + 16, 2, 16, 2, 16, 2, 2, 16, 16, 2, 2, 2, 2, 16, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 16, 1, 1, 1, 1, 1, 1, 16, 1, 1, 1, 1, 1, 1, 1, 16, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, 2, 2, 16 +}; + +static uchar to_lower_hungarian[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,139,139,161,161,142,160, + 130,145,146,147,148,162,150,163,150,148,129,155,156,157,158,159, + 160,161,162,163,181,182,166,147,168,185,186,187,188,173,190,191, + 176,177,178,179,180,225,182,183,184,185,186,187,188,189,190,191, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 208,241,242,243,244,245,246,215,248,249,250,251,252,253,254,223, + 162,225,226,227,228,229,230,231,232,233,234,150,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar to_upper_hungarian[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,154,144,131,132,133,134,135,136,137,138,138,140,141,142,143, + 144,145,146,167,153,149,152,151,152,153,154,155,156,157,158,159, + 143,141,149,151,164,165,166,167,168,169,170,171,172,173,174,175, + 176,160,178,162,180,181,165,183,184,169,170,171,172,189,174,175, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 224,193,194,195,196,197,198,199,200,201,202,235,204,205,206,207, + 240,209,210,211,212,213,214,247,216,217,218,219,220,221,222,255 +}; + +static uchar sort_order_hungarian[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 71, 72, 76, 78, 83, 84, 85, 86, 90, 91, 92, 96, 97,100, + 105,106,107,110,114,117,122,123,124,125,127,131,132,133,134,135, + 136, 65, 71, 72, 76, 78, 83, 84, 85, 86, 90, 91, 92, 96, 97,100, + 105,106,107,110,114,117,122,123,124,125,127,137,138,139,140, 0, + 1,120, 78, 4, 5, 6, 7, 8, 9, 10,103,103, 86, 86, 15, 65, + 78, 18, 19,103,103,100,120,117,120,103,120, 28, 29, 30, 31,255, + 65, 86,100,117, 94,111,255,103,255,112,113,115,128,255,129,130, + 255, 66,255, 93,255, 65,111,255,255,112,113,115,128,255,129,130, + 108, 65, 68, 69, 70, 95, 73, 75, 74, 78, 81, 82, 80, 86, 87, 77, + 255, 98, 99,100,102,103,103,255,109,119,117,120,120,126,116,255, + 100, 65, 68, 69, 70, 95, 73, 75, 74, 78, 81,120, 80, 86, 88, 77, + 255, 98, 99,100,102,103,103,255,109,119,117,120,120,126,116,255 +}; +#endif + +#ifdef HAVE_CHARSET_koi8_ru + +/* The koi8_ru character set. Generated automatically by + * the ./conf_to_src program + */ + +static uchar ctype_koi8_ru[] = { + 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 2, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 1, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 +}; + +static uchar to_lower_koi8_ru[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,163,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223 +}; + +static uchar to_upper_koi8_ru[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,179,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar sort_order_koi8_ru[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,229,163,164,165,166,167,168,169,170,171,172,173,174, + 175,176,177,229,178,179,180,181,182,183,184,185,186,187,188,189, + 254,223,224,246,227,228,244,226,245,232,233,234,235,236,237,238, + 239,255,240,241,242,243,230,225,252,251,231,248,253,249,247,250, + 254,223,224,246,227,228,244,226,245,232,233,234,235,236,237,238, + 239,255,240,241,242,243,230,225,252,251,231,248,253,249,247,250 +}; +#endif + +#ifdef HAVE_CHARSET_koi8_ukr + +/* The koi8_ukr character set. Generated automatically by + * the ./conf_to_src program + */ + +static uchar ctype_koi8_ukr[] = { + 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 2, 2, 16, 2, 2, 16, 16, 16, 16, 16, 2, 16, 16, + 16, 16, 16, 1, 1, 16, 1, 1, 16, 16, 16, 16, 16, 1, 16, 16, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 +}; + +static uchar to_lower_koi8_ukr[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 32, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32,163,164, 32,166,167, 32, 32, 32, 32, 32,173, 32, 32, + 32, 32, 32,163,164, 32,166,167, 32, 32, 32, 32, 32,173, 32, 32, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223 +}; + +static uchar to_upper_koi8_ukr[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 32, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32,179,180, 32,182,183, 32, 32, 32, 32, 32,189, 32, 32, + 32, 32, 32,179,180, 32,182,183, 32, 32, 32, 32, 32,189, 32, 32, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar sort_order_koi8_ukr[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 32, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180, + 181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196, + 197,198,199,136,135,200,140,141,201,202,203,204,205,132,206,207, + 208,209,210,136,135,211,140,141,212,213,214,215,216,132,217,218, + 163,128,129,155,133,134,153,131,154,139,142,143,144,145,146,147, + 148,164,149,150,151,152,137,130,161,160,138,157,162,158,156,159, + 163,128,129,155,133,134,153,131,154,139,142,143,144,145,146,147, + 148,164,149,150,151,152,137,130,161,160,138,157,162,158,156,159 +}; +#endif + +#ifdef HAVE_CHARSET_latin1 + +/* The latin1 character set. Generated automatically by + * the ./conf_to_src program + */ + +static uchar ctype_latin1[] = { + 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 16, 1, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static uchar to_lower_latin1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,215,248,249,250,251,252,253,254,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar to_upper_latin1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,247,216,217,218,219,220,221,222,255 +}; + +static uchar sort_order_latin1[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 65, 65, 65, 65, 92, 91, 92, 67, 69, 69, 69, 69, 73, 73, 73, 73, + 68, 78, 79, 79, 79, 79, 93,215,216, 85, 85, 85, 89, 89,222,223, + 65, 65, 65, 65, 92, 91, 92, 67, 69, 69, 69, 69, 73, 73, 73, 73, + 68, 78, 79, 79, 79, 79, 93,247,216, 85, 85, 85, 89, 89,222,255 +}; +#endif + +#ifdef HAVE_CHARSET_latin2 + +/* The latin2 character set. Generated automatically by + * the ./conf_to_src program + */ + +static uchar ctype_latin2[] = { + 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 72, 1, 16, 1, 16, 1, 1, 16, 16, 1, 1, 1, 1, 16, 1, 1, + 16, 2, 16, 2, 16, 2, 2, 16, 16, 2, 2, 2, 2, 16, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 16, 1, 1, 1, 1, 1, 1, 16, 1, 1, 1, 1, 1, 1, 1, 16, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, 2, 2, 16 +}; + +static uchar to_lower_latin2[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,177,162,179,164,181,182,167,168,185,186,187,188,173,190,191, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 208,241,242,243,244,245,246,215,248,249,250,251,252,253,254,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar to_upper_latin2[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,161,178,163,180,165,166,183,184,169,170,171,172,189,174,175, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 240,209,210,211,212,213,214,247,216,217,218,219,220,221,222,255 +}; + +static uchar sort_order_latin2[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 68, 69, 72, 73, 75, 76, 77, 78, 79, 80, 81, 83, 84, 86, + 88, 89, 90, 91, 94, 95, 96, 97, 98, 99,100,104,105,106,107,108, + 109, 65, 68, 69, 72, 73, 75, 76, 77, 78, 79, 80, 81, 83, 84, 86, + 88, 89, 90, 91, 94, 95, 96, 97, 98, 99,100,110,111,112,113,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255, 66,255, 82,255, 81, 92,255,255, 93, 91, 94,101,255,103,102, + 255, 66,255, 82,255, 81, 92,255,255, 93, 91, 94,101,255,103,102, + 90, 67, 67, 67, 67, 81, 70, 69, 71, 73, 74, 73, 73, 78, 78, 72, + 255, 85, 84, 87, 86, 86, 86,255, 90, 95, 95, 95, 95, 99, 94,255, + 90, 67, 67, 67, 67, 81, 70, 69, 71, 73, 74, 73, 73, 78, 78, 72, + 255, 85, 84, 87, 86, 86, 86,255, 90, 95, 95, 95, 95, 99, 94,255 +}; +#endif + +#ifdef HAVE_CHARSET_latin5 + +/* The latin5 character set. Generated automatically by + * the ./conf_to_src program + */ + +static uchar ctype_latin5[] = { + 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 16, 1, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static uchar to_lower_latin5[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,253,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,215,248,249,250,251,252,105,254,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar to_upper_latin5[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72,221, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,247,216,217,218,219,220, 73,222,255 +}; + +static uchar sort_order_latin5[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 69, 70, 71, 72, 74, 75, 77, 78, 79, 80, 81, 82, + 84, 85, 86, 87, 89, 90, 92, 93, 94, 95, 96, 97, 98, 99,100,101, + 102, 65, 66, 67, 69, 70, 71, 72, 74, 76, 77, 78, 79, 80, 81, 82, + 84, 85, 86, 87, 89, 90, 92, 93, 94, 95, 96,135,136,137,138,139, + 140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155, + 156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171, + 172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187, + 188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203, + 204,205,206,207,208,209,210, 68,211,212,213,214,215,216,217,218, + 73,219,220,221,222,223, 83,224,225,226,227,228, 91, 76, 88,229, + 204,205,206,207,208,209,210, 68,211,212,213,214,215,216,217,218, + 73,219,220,221,222,223, 83,250,225,226,227,228, 91, 75, 88,255 +}; +#endif + +#ifdef HAVE_CHARSET_swe7 + +/* The swe7 character set. Generated automatically by + * the ./conf_to_src program + */ + +static uchar ctype_swe7[] = { + 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 1,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, + 1,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static uchar to_lower_swe7[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar to_upper_swe7[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar sort_order_swe7[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 69, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 92, 93, 91, 89, 95, + 69, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 92, 93, 91, 89,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; +#endif + +#ifdef HAVE_CHARSET_usa7 + +/* The usa7 character set. Generated automatically by + * the ./conf_to_src program + */ + +static uchar ctype_usa7[] = { + 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static uchar to_lower_usa7[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar to_upper_usa7[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar sort_order_usa7[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 92, 93, 91, 94, 95, + 69, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125, 89,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; +#endif + +#ifdef HAVE_CHARSET_win1250 + +/* The win1250 character set. Generated automatically by + * the ./conf_to_src program + */ + +static uchar ctype_win1250[] = { + 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32, + 32, 32, 16, 32, 16, 16, 16, 16, 32, 16, 1, 16, 1, 1, 1, 1, + 32, 16, 16, 16, 16, 16, 16, 16, 32, 16, 2, 16, 2, 2, 2, 2, + 72, 16, 16, 1, 16, 1, 16, 1, 16, 16, 1, 16, 16, 16, 16, 1, + 16, 16, 16, 2, 16, 16, 16, 16, 16, 2, 2, 16, 1, 16, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 16, 1, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, 2, 2, 16 +}; + +static uchar to_lower_win1250[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,154,139,156,157,158,159, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,179,164,185,166,223,168,169,186,171,172,173,174,191, + 176,177,178,179,180,181,182,183,184,185,186,187,190,189,190,191, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,215,248,249,250,251,252,253,254,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar to_upper_win1250[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,138,155,140,141,142,143, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,163,180,181,182,183,184,165,170,187,188,189,188,175, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,167, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,247,216,217,218,219,220,221,222,255 +}; + +static uchar sort_order_win1250[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 70, 73, 74, 75, 76, 77, 78, 79, 80, 82, 83, 85, + 86, 87, 88, 89, 91, 92, 93, 94, 95, 96, 97, 99,100,101,102,103, + 104, 65, 66, 67, 70, 73, 74, 75, 76, 77, 78, 79, 80, 82, 83, 85, + 86, 87, 88, 89, 91, 92, 93, 94, 95, 96, 97,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137, 90,139, 90, 91, 98, 98, + 144,145,146,147,148,149,150,151,152,153, 90,155, 90, 91, 98, 98, + 32,161,162, 80,164, 65,166, 89,168,169, 89,171,172,173,174, 98, + 176,177,178, 80,180,181,182,183,184, 65, 89,187, 80,189, 80, 98, + 88, 65, 65, 65, 65, 80, 69, 67, 68, 73, 73, 73, 73, 77, 77, 70, + 71, 83, 83, 85, 85, 85, 85,215, 88, 92, 92, 92, 92, 96, 91, 89, + 88, 65, 65, 65, 65, 80, 69, 67, 68, 73, 73, 73, 73, 77, 77, 70, + 71, 83, 83, 85, 85, 85, 85,247, 88, 92, 92, 92, 92, 96, 91,255 +}; +#endif + +#ifdef HAVE_CHARSET_win1251 + +/* The win1251 character set. Generated automatically by + * the ./conf_to_src program + */ + +static uchar ctype_win1251[] = { + 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 1, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 16, 16, 16, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static uchar to_lower_win1251[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,184,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,245,247,248,249,250,251,252,253,254,255, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar to_upper_win1251[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,168,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,213,215,216,217,218,219,220,221,222,223, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223 +}; + +static uchar sort_order_win1251[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,198,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,198,185,186,187,188,189,190,191, + 192,193,194,195,196,197,199,200,201,202,203,204,205,206,207,208, + 209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224, + 192,193,194,195,196,197,199,200,201,202,203,204,205,206,207,208, + 209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224 +}; +#endif + +#ifdef HAVE_CHARSET_win1251ukr + +/* The win1251ukr character set. Generated automatically by + * the ./conf_to_src program + */ + +static uchar ctype_win1251ukr[] = { + 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 1, 16, 1, 16, 16, 16, 16, 1, + 16, 16, 1, 2, 16, 16, 16, 16, 2, 16, 2, 16, 16, 16, 16, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +static uchar to_lower_win1251ukr[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 32, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32,165, 32, 32,168, 32,170, 32, 32, 32, 32,175, + 32, 32,178,178,165, 32, 32, 32,168, 32,170, 32, 32, 32, 32,175, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223 +}; + +static uchar to_upper_win1251ukr[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 32, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32,180, 32, 32,184, 32,186, 32, 32, 32, 32,191, + 32, 32,179,179,180, 32, 32, 32,184, 32,186, 32, 32, 32, 32,191, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +static uchar sort_order_win1251ukr[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 32, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180, + 181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196, + 197,198,199,200,201,132,202,203,136,204,135,205,206,207,208,141, + 209,210,140,140,132,211,212,213,136,214,135,215,216,217,218,141, + 128,129,130,131,133,134,137,138,139,142,143,144,145,146,147,148, + 149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164, + 128,129,130,131,133,134,137,138,139,142,143,144,145,146,147,148, + 149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164 +}; +#endif + + + +CHARSET_INFO compiled_charsets[] = { + +#ifdef HAVE_CHARSET_latin1 + { + 8, /* number */ + "latin1", /* name */ + ctype_latin1, + to_lower_latin1, + to_upper_latin1, + sort_order_latin1, + 0, /* strxfrm_multiply */ + NULL, /* strcoll */ + NULL, /* strxfrm */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL /* mbcharlen */ + }, +#endif + +#ifdef HAVE_CHARSET_big5 + { + 1, /* number */ + "big5", /* name */ + ctype_big5, + to_lower_big5, + to_upper_big5, + sort_order_big5, + 1, /* strxfrm_multiply */ + my_strcoll_big5, + my_strxfrm_big5, + my_strnncoll_big5, + my_strnxfrm_big5, + my_like_range_big5, + 2, /* mbmaxlen */ + ismbchar_big5, + ismbhead_big5, + mbcharlen_big5 + }, +#endif + +#ifdef HAVE_CHARSET_cp1251 + { + 14, /* number */ + "cp1251", /* name */ + ctype_cp1251, + to_lower_cp1251, + to_upper_cp1251, + sort_order_cp1251, + 0, /* strxfrm_multiply */ + NULL, /* strcoll */ + NULL, /* strxfrm */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL /* mbcharlen */ + }, +#endif + +#ifdef HAVE_CHARSET_cp1257 + { + 29, /* number */ + "cp1257", /* name */ + ctype_cp1257, + to_lower_cp1257, + to_upper_cp1257, + sort_order_cp1257, + 0, /* strxfrm_multiply */ + NULL, /* strcoll */ + NULL, /* strxfrm */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL /* mbcharlen */ + }, +#endif + +#ifdef HAVE_CHARSET_croat + { + 27, /* number */ + "croat", /* name */ + ctype_croat, + to_lower_croat, + to_upper_croat, + sort_order_croat, + 0, /* strxfrm_multiply */ + NULL, /* strcoll */ + NULL, /* strxfrm */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL /* mbcharlen */ + }, +#endif + +#ifdef HAVE_CHARSET_czech + { + 2, /* number */ + "czech", /* name */ + ctype_czech, + to_lower_czech, + to_upper_czech, + sort_order_czech, + 4, /* strxfrm_multiply */ + my_strcoll_czech, + my_strxfrm_czech, + my_strnncoll_czech, + my_strnxfrm_czech, + my_like_range_czech, + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL /* mbcharlen */ + }, +#endif + +#ifdef HAVE_CHARSET_danish + { + 15, /* number */ + "danish", /* name */ + ctype_danish, + to_lower_danish, + to_upper_danish, + sort_order_danish, + 0, /* strxfrm_multiply */ + NULL, /* strcoll */ + NULL, /* strxfrm */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL /* mbcharlen */ + }, +#endif + +#ifdef HAVE_CHARSET_dec8 + { + 3, /* number */ + "dec8", /* name */ + ctype_dec8, + to_lower_dec8, + to_upper_dec8, + sort_order_dec8, + 0, /* strxfrm_multiply */ + NULL, /* strcoll */ + NULL, /* strxfrm */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL /* mbcharlen */ + }, +#endif + +#ifdef HAVE_CHARSET_dos + { + 4, /* number */ + "dos", /* name */ + ctype_dos, + to_lower_dos, + to_upper_dos, + sort_order_dos, + 0, /* strxfrm_multiply */ + NULL, /* strcoll */ + NULL, /* strxfrm */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL /* mbcharlen */ + }, +#endif + +#ifdef HAVE_CHARSET_estonia + { + 20, /* number */ + "estonia", /* name */ + ctype_estonia, + to_lower_estonia, + to_upper_estonia, + sort_order_estonia, + 0, /* strxfrm_multiply */ + NULL, /* strcoll */ + NULL, /* strxfrm */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL /* mbcharlen */ + }, +#endif + +#ifdef HAVE_CHARSET_euc_kr + { + 19, /* number */ + "euc_kr", /* name */ + ctype_euc_kr, + to_lower_euc_kr, + to_upper_euc_kr, + sort_order_euc_kr, + 0, /* strxfrm_multiply */ + NULL, /* strcoll */ + NULL, /* strxfrm */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 2, /* mbmaxlen */ + ismbchar_euc_kr, + ismbhead_euc_kr, + mbcharlen_euc_kr + }, +#endif + +#ifdef HAVE_CHARSET_gb2312 + { + 24, /* number */ + "gb2312", /* name */ + ctype_gb2312, + to_lower_gb2312, + to_upper_gb2312, + sort_order_gb2312, + 0, /* strxfrm_multiply */ + NULL, /* strcoll */ + NULL, /* strxfrm */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 2, /* mbmaxlen */ + ismbchar_gb2312, + ismbhead_gb2312, + mbcharlen_gb2312 + }, +#endif + +#ifdef HAVE_CHARSET_gbk + { + 28, /* number */ + "gbk", /* name */ + ctype_gbk, + to_lower_gbk, + to_upper_gbk, + sort_order_gbk, + 1, /* strxfrm_multiply */ + my_strcoll_gbk, + my_strxfrm_gbk, + my_strnncoll_gbk, + my_strnxfrm_gbk, + my_like_range_gbk, + 2, /* mbmaxlen */ + ismbchar_gbk, + ismbhead_gbk, + mbcharlen_gbk + }, +#endif + +#ifdef HAVE_CHARSET_german1 + { + 5, /* number */ + "german1", /* name */ + ctype_german1, + to_lower_german1, + to_upper_german1, + sort_order_german1, + 0, /* strxfrm_multiply */ + NULL, /* strcoll */ + NULL, /* strxfrm */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL /* mbcharlen */ + }, +#endif + +#ifdef HAVE_CHARSET_greek + { + 25, /* number */ + "greek", /* name */ + ctype_greek, + to_lower_greek, + to_upper_greek, + sort_order_greek, + 0, /* strxfrm_multiply */ + NULL, /* strcoll */ + NULL, /* strxfrm */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL /* mbcharlen */ + }, +#endif + +#ifdef HAVE_CHARSET_hebrew + { + 16, /* number */ + "hebrew", /* name */ + ctype_hebrew, + to_lower_hebrew, + to_upper_hebrew, + sort_order_hebrew, + 0, /* strxfrm_multiply */ + NULL, /* strcoll */ + NULL, /* strxfrm */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL /* mbcharlen */ + }, +#endif + +#ifdef HAVE_CHARSET_hp8 + { + 6, /* number */ + "hp8", /* name */ + ctype_hp8, + to_lower_hp8, + to_upper_hp8, + sort_order_hp8, + 0, /* strxfrm_multiply */ + NULL, /* strcoll */ + NULL, /* strxfrm */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL /* mbcharlen */ + }, +#endif + +#ifdef HAVE_CHARSET_hungarian + { + 21, /* number */ + "hungarian", /* name */ + ctype_hungarian, + to_lower_hungarian, + to_upper_hungarian, + sort_order_hungarian, + 0, /* strxfrm_multiply */ + NULL, /* strcoll */ + NULL, /* strxfrm */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL /* mbcharlen */ + }, +#endif + +#ifdef HAVE_CHARSET_koi8_ru + { + 7, /* number */ + "koi8_ru", /* name */ + ctype_koi8_ru, + to_lower_koi8_ru, + to_upper_koi8_ru, + sort_order_koi8_ru, + 0, /* strxfrm_multiply */ + NULL, /* strcoll */ + NULL, /* strxfrm */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL /* mbcharlen */ + }, +#endif + +#ifdef HAVE_CHARSET_koi8_ukr + { + 22, /* number */ + "koi8_ukr", /* name */ + ctype_koi8_ukr, + to_lower_koi8_ukr, + to_upper_koi8_ukr, + sort_order_koi8_ukr, + 0, /* strxfrm_multiply */ + NULL, /* strcoll */ + NULL, /* strxfrm */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL /* mbcharlen */ + }, +#endif + +#ifdef HAVE_CHARSET_latin1_de + { + 31, /* number */ + "latin1_de", /* name */ + ctype_latin1_de, + to_lower_latin1_de, + to_upper_latin1_de, + sort_order_latin1_de, + 2, /* strxfrm_multiply */ + my_strcoll_latin1_de, + my_strxfrm_latin1_de, + my_strnncoll_latin1_de, + my_strnxfrm_latin1_de, + my_like_range_latin1_de, + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL /* mbcharlen */ + }, +#endif + +#ifdef HAVE_CHARSET_latin2 + { + 9, /* number */ + "latin2", /* name */ + ctype_latin2, + to_lower_latin2, + to_upper_latin2, + sort_order_latin2, + 0, /* strxfrm_multiply */ + NULL, /* strcoll */ + NULL, /* strxfrm */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL /* mbcharlen */ + }, +#endif + +#ifdef HAVE_CHARSET_latin5 + { + 30, /* number */ + "latin5", /* name */ + ctype_latin5, + to_lower_latin5, + to_upper_latin5, + sort_order_latin5, + 0, /* strxfrm_multiply */ + NULL, /* strcoll */ + NULL, /* strxfrm */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL /* mbcharlen */ + }, +#endif + +#ifdef HAVE_CHARSET_sjis + { + 13, /* number */ + "sjis", /* name */ + ctype_sjis, + to_lower_sjis, + to_upper_sjis, + sort_order_sjis, + 1, /* strxfrm_multiply */ + my_strcoll_sjis, + my_strxfrm_sjis, + my_strnncoll_sjis, + my_strnxfrm_sjis, + my_like_range_sjis, + 2, /* mbmaxlen */ + ismbchar_sjis, + ismbhead_sjis, + mbcharlen_sjis + }, +#endif + +#ifdef HAVE_CHARSET_swe7 + { + 10, /* number */ + "swe7", /* name */ + ctype_swe7, + to_lower_swe7, + to_upper_swe7, + sort_order_swe7, + 0, /* strxfrm_multiply */ + NULL, /* strcoll */ + NULL, /* strxfrm */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL /* mbcharlen */ + }, +#endif + +#ifdef HAVE_CHARSET_tis620 + { + 18, /* number */ + "tis620", /* name */ + ctype_tis620, + to_lower_tis620, + to_upper_tis620, + sort_order_tis620, + 4, /* strxfrm_multiply */ + my_strcoll_tis620, + my_strxfrm_tis620, + my_strnncoll_tis620, + my_strnxfrm_tis620, + my_like_range_tis620, + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL /* mbcharlen */ + }, +#endif + +#ifdef HAVE_CHARSET_ujis + { + 12, /* number */ + "ujis", /* name */ + ctype_ujis, + to_lower_ujis, + to_upper_ujis, + sort_order_ujis, + 0, /* strxfrm_multiply */ + NULL, /* strcoll */ + NULL, /* strxfrm */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 3, /* mbmaxlen */ + ismbchar_ujis, + ismbhead_ujis, + mbcharlen_ujis + }, +#endif + +#ifdef HAVE_CHARSET_usa7 + { + 11, /* number */ + "usa7", /* name */ + ctype_usa7, + to_lower_usa7, + to_upper_usa7, + sort_order_usa7, + 0, /* strxfrm_multiply */ + NULL, /* strcoll */ + NULL, /* strxfrm */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL /* mbcharlen */ + }, +#endif + +#ifdef HAVE_CHARSET_win1250 + { + 26, /* number */ + "win1250", /* name */ + ctype_win1250, + to_lower_win1250, + to_upper_win1250, + sort_order_win1250, + 0, /* strxfrm_multiply */ + NULL, /* strcoll */ + NULL, /* strxfrm */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL /* mbcharlen */ + }, +#endif + +#ifdef HAVE_CHARSET_win1251ukr + { + 23, /* number */ + "win1251ukr", /* name */ + ctype_win1251ukr, + to_lower_win1251ukr, + to_upper_win1251ukr, + sort_order_win1251ukr, + 0, /* strxfrm_multiply */ + NULL, /* strcoll */ + NULL, /* strxfrm */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL /* mbcharlen */ + }, +#endif + +#ifdef HAVE_CHARSET_armscii8 + { + 32, /* number */ + "armscii8", /* name */ + ctype_armscii8, + to_lower_armscii8, + to_upper_armscii8, + sort_order_armscii8, + 0, /* strxfrm_multiply */ + NULL, /* strcoll */ + NULL, /* strxfrm */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL /* mbcharlen */ + }, +#endif + +#ifdef HAVE_CHARSET_win1251 + { + 17, /* number */ + "win1251", /* name */ + ctype_win1251, + to_lower_win1251, + to_upper_win1251, + sort_order_win1251, + 0, /* strxfrm_multiply */ + NULL, /* strcoll */ + NULL, /* strxfrm */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL /* mbcharlen */ + }, +#endif + + { + 0, /* end-of-list marker */ + NullS, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL + } +}; -/* generated by configure */ -#include "ctype_autoconf.c" CHARSET_INFO *default_charset_info = &compiled_charsets[0]; -- cgit v1.2.1 From 654db69b8247a7e6be4e039a558f635af9abae57 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 6 Mar 2002 20:04:13 +0400 Subject: Regex library is switched to use new ctype tools to allow usage of many character sets at a time. include/m_ctype.h: Added condition to simplify migrating from old ctype Added new style toupper, tolower which accepts charset in first argument regex/debug.c: Added charset argument regex/debug.ih: added charset argument regex/engine.c: added charset argument regex/engine.ih: added charset arguent regex/main.c: added charset argument regex/regcomp.c: added CHARSET_INFO field regex/regcomp.ih: Added charset argument regex/regex.h: Added #include for CHARSET_INFO Added charset argument for regcomp() regex/regex2.h: New charset argument for ISWORD() regex/regexec.c: New charset argument regex/reginit.c: Move to new style ctype. However still needs fixes: instead of single static cclass variable, each charset must have it's own variable. sql/item_cmpfunc.cc: Pass charset field into regcomp() This will be fixed tommorow to use String->charset instead of default_charset_info --- include/m_ctype.h | 5 +++ regex/debug.c | 22 ++++++------ regex/debug.ih | 4 +-- regex/engine.c | 97 ++++++++++++++++++++++++++++------------------------- regex/engine.ih | 10 +++--- regex/main.c | 4 +-- regex/regcomp.c | 42 +++++++++++++---------- regex/regcomp.ih | 2 +- regex/regex.h | 5 ++- regex/regex2.h | 2 +- regex/regexec.c | 4 +-- regex/reginit.c | 23 +++++++------ sql/item_cmpfunc.cc | 6 ++-- 13 files changed, 126 insertions(+), 100 deletions(-) diff --git a/include/m_ctype.h b/include/m_ctype.h index daeffdc2fee..998841c14d4 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -180,6 +180,7 @@ extern const char *compiled_charset_name(uint charset_number); #define _B 0100 /* Blank */ #define _X 0200 /* heXadecimal digit */ +#ifndef HIDE_OLD_CTYPE #define my_ctype (default_charset_info->ctype) #define my_to_upper (default_charset_info->to_upper) #define my_to_lower (default_charset_info->to_lower) @@ -201,6 +202,8 @@ extern const char *compiled_charset_name(uint charset_number); #define isprint(c) ((my_ctype+1)[(uchar) (c)] & (_P | _U | _L | _N | _B)) #define isgraph(c) ((my_ctype+1)[(uchar) (c)] & (_P | _U | _L | _N)) #define iscntrl(c) ((my_ctype+1)[(uchar) (c)] & _C) +#endif + #define isascii(c) (!((c) & ~0177)) #define toascii(c) ((c) & 0177) @@ -208,6 +211,8 @@ extern const char *compiled_charset_name(uint charset_number); #undef ctype #endif /* ctype */ +#define my_toupper(s,c) (char) ((s)->to_upper[(uchar) (c)]) +#define my_tolower(s,c) (char) ((s)->to_lower[(uchar) (c)]) #define my_isalpha(s, c) (((s)->ctype+1)[(uchar) (c)] & (_U | _L)) #define my_isupper(s, c) (((s)->ctype+1)[(uchar) (c)] & _U) #define my_islower(s, c) (((s)->ctype+1)[(uchar) (c)] & _L) diff --git a/regex/debug.c b/regex/debug.c index 35279941d48..bdd3e00d5a7 100644 --- a/regex/debug.c +++ b/regex/debug.c @@ -45,7 +45,7 @@ FILE *d; if (g->nplus > 0) fprintf(d, ", nplus %ld", (long)g->nplus); fprintf(d, "\n"); - s_print(g, d); + s_print(r->charset, g, d); for (i = 0; i < g->ncategories; i++) { nincat[i] = 0; for (c = CHAR_MIN; c <= CHAR_MAX; c++) @@ -58,7 +58,7 @@ FILE *d; for (c = CHAR_MIN; c <= CHAR_MAX; c++) if (g->categories[c] == i) break; - fprintf(d, ", %d=%s", i, regchar(c,buf)); + fprintf(d, ", %d=%s", i, regchar(r->charset,c,buf)); } fprintf(d, "\n"); for (i = 1; i < g->ncategories; i++) @@ -68,14 +68,14 @@ FILE *d; for (c = CHAR_MIN; c <= CHAR_MAX+1; c++) /* +1 does flush */ if (c <= CHAR_MAX && g->categories[c] == i) { if (last < 0) { - fprintf(d, "%s", regchar(c,buf)); + fprintf(d, "%s", regchar(r->charset,c,buf)); last = c; } } else { if (last >= 0) { if (last != c-1) fprintf(d, "-%s", - regchar(c-1,buf)); + regchar(r->charset,c-1,buf)); last = -1; } } @@ -88,7 +88,8 @@ FILE *d; == static void s_print(register struct re_guts *g, FILE *d); */ static void -s_print(g, d) +s_print(charset, g, d) +CHARSET_INFO *charset; register struct re_guts *g; FILE *d; { @@ -127,7 +128,7 @@ FILE *d; if (strchr("\\|()^$.[+*?{}!<> ", (char)opnd) != NULL) fprintf(d, "\\%c", (char)opnd); else - fprintf(d, "%s", regchar((char)opnd,buf)); + fprintf(d, "%s", regchar(charset,(char)opnd,buf)); break; case OBOL: fprintf(d, "^"); @@ -151,14 +152,14 @@ FILE *d; for (i = 0; i < g->csetsize+1; i++) /* +1 flushes */ if (CHIN(cs, i) && i < g->csetsize) { if (last < 0) { - fprintf(d, "%s", regchar(i,buf)); + fprintf(d, "%s", regchar(charset,i,buf)); last = i; } } else { if (last >= 0) { if (last != i-1) fprintf(d, "-%s", - regchar(i-1,buf)); + regchar(charset,i-1,buf)); last = -1; } } @@ -230,12 +231,13 @@ FILE *d; == static char *regchar(int ch); */ static char * /* -> representation */ -regchar(ch,buf) +regchar(charset,ch,buf) +CHARSET_INFO *charset; int ch; char *buf; { - if (isprint(ch) || ch == ' ') + if (my_isprint(charset,ch) || ch == ' ') sprintf(buf, "%c", ch); else sprintf(buf, "\\%o", ch); diff --git a/regex/debug.ih b/regex/debug.ih index 532ec5086e5..0d91e170437 100644 --- a/regex/debug.ih +++ b/regex/debug.ih @@ -5,8 +5,8 @@ extern "C" { /* === debug.c === */ void regprint(regex_t *r, FILE *d); -static void s_print(register struct re_guts *g, FILE *d); -static char *regchar(int ch,char *buf); +static void s_print(CHARSET_INFO *charset, register struct re_guts *g, FILE *d); +static char *regchar(CHARSET_INFO *charset, int ch,char *buf); #ifdef __cplusplus } diff --git a/regex/engine.c b/regex/engine.c index e77fbd7cf89..6734560b9bf 100644 --- a/regex/engine.c +++ b/regex/engine.c @@ -63,7 +63,8 @@ struct match { == size_t nmatch, regmatch_t pmatch[], int eflags); */ static int /* 0 success, REG_NOMATCH failure */ -matcher(g, str, nmatch, pmatch, eflags) +matcher(charset,g, str, nmatch, pmatch, eflags) +CHARSET_INFO *charset; register struct re_guts *g; char *str; size_t nmatch; @@ -120,7 +121,7 @@ int eflags; /* this loop does only one repetition except for backrefs */ for (;;) { - endp = fast(m, start, stop, gf, gl); + endp = fast(charset, m, start, stop, gf, gl); if (endp == NULL) { /* a miss */ if (m->pmatch != NULL) free((char *)m->pmatch); @@ -136,7 +137,7 @@ int eflags; assert(m->coldp != NULL); for (;;) { NOTE("finding start"); - endp = slow(m, m->coldp, stop, gf, gl); + endp = slow(charset, m, m->coldp, stop, gf, gl); if (endp != NULL) break; assert(m->coldp < m->endp); @@ -159,7 +160,7 @@ int eflags; m->pmatch[i].rm_so = m->pmatch[i].rm_eo = -1; if (!g->backrefs && !(m->eflags®_BACKR)) { NOTE("dissecting"); - dp = dissect(m, m->coldp, endp, gf, gl); + dp = dissect(charset, m, m->coldp, endp, gf, gl); } else { if (g->nplus > 0 && m->lastpos == NULL) m->lastpos = (char **)malloc((g->nplus+1) * @@ -170,7 +171,7 @@ int eflags; return(REG_ESPACE); } NOTE("backref dissect"); - dp = backref(m, m->coldp, endp, gf, gl, (sopno)0); + dp = backref(charset, m, m->coldp, endp, gf, gl, (sopno)0); } if (dp != NULL) break; @@ -182,7 +183,7 @@ int eflags; if (dp != NULL || endp <= m->coldp) break; /* defeat */ NOTE("backoff"); - endp = slow(m, m->coldp, endp-1, gf, gl); + endp = slow(charset, m, m->coldp, endp-1, gf, gl); if (endp == NULL) break; /* defeat */ /* try it on a shorter possibility */ @@ -193,7 +194,7 @@ int eflags; } #endif NOTE("backoff dissect"); - dp = backref(m, m->coldp, endp, gf, gl, (sopno)0); + dp = backref(charset, m, m->coldp, endp, gf, gl, (sopno)0); } assert(dp == NULL || dp == endp); if (dp != NULL) /* found a shorter one */ @@ -235,7 +236,8 @@ int eflags; == char *stop, sopno startst, sopno stopst); */ static char * /* == stop (success) always */ -dissect(m, start, stop, startst, stopst) +dissect(charset, m, start, stop, startst, stopst) +CHARSET_INFO *charset; register struct match *m; char *start; char *stop; @@ -299,10 +301,10 @@ sopno stopst; stp = stop; for (;;) { /* how long could this one be? */ - rest = slow(m, sp, stp, ss, es); + rest = slow(charset, m, sp, stp, ss, es); assert(rest != NULL); /* it did match */ /* could the rest match the rest? */ - tail = slow(m, rest, stop, es, stopst); + tail = slow(charset, m, rest, stop, es, stopst); if (tail == stop) break; /* yes! */ /* no -- try a shorter match for this one */ @@ -312,8 +314,8 @@ sopno stopst; ssub = ss + 1; esub = es - 1; /* did innards match? */ - if (slow(m, sp, rest, ssub, esub) != NULL) { - dp = dissect(m, sp, rest, ssub, esub); + if (slow(charset, m, sp, rest, ssub, esub) != NULL) { + dp = dissect(charset, m, sp, rest, ssub, esub); assert(dp == rest); } else /* no */ assert(sp == rest); @@ -323,10 +325,10 @@ sopno stopst; stp = stop; for (;;) { /* how long could this one be? */ - rest = slow(m, sp, stp, ss, es); + rest = slow(charset, m, sp, stp, ss, es); assert(rest != NULL); /* it did match */ /* could the rest match the rest? */ - tail = slow(m, rest, stop, es, stopst); + tail = slow(charset, m, rest, stop, es, stopst); if (tail == stop) break; /* yes! */ /* no -- try a shorter match for this one */ @@ -338,7 +340,7 @@ sopno stopst; ssp = sp; oldssp = ssp; for (;;) { /* find last match of innards */ - sep = slow(m, ssp, rest, ssub, esub); + sep = slow(charset, m, ssp, rest, ssub, esub); if (sep == NULL || sep == ssp) break; /* failed or matched null */ oldssp = ssp; /* on to next try */ @@ -350,8 +352,8 @@ sopno stopst; ssp = oldssp; } assert(sep == rest); /* must exhaust substring */ - assert(slow(m, ssp, sep, ssub, esub) == rest); - dp = dissect(m, ssp, sep, ssub, esub); + assert(slow(charset, m, ssp, sep, ssub, esub) == rest); + dp = dissect(charset, m, ssp, sep, ssub, esub); assert(dp == sep); sp = rest; break; @@ -359,10 +361,10 @@ sopno stopst; stp = stop; for (;;) { /* how long could this one be? */ - rest = slow(m, sp, stp, ss, es); + rest = slow(charset, m, sp, stp, ss, es); assert(rest != NULL); /* it did match */ /* could the rest match the rest? */ - tail = slow(m, rest, stop, es, stopst); + tail = slow(charset, m, rest, stop, es, stopst); if (tail == stop) break; /* yes! */ /* no -- try a shorter match for this one */ @@ -373,7 +375,7 @@ sopno stopst; esub = ss + OPND(m->g->strip[ss]) - 1; assert(OP(m->g->strip[esub]) == OOR1); for (;;) { /* find first matching branch */ - if (slow(m, sp, rest, ssub, esub) == rest) + if (slow(charset, m, sp, rest, ssub, esub) == rest) break; /* it matched all of it */ /* that one missed, try next one */ assert(OP(m->g->strip[esub]) == OOR1); @@ -386,7 +388,7 @@ sopno stopst; else assert(OP(m->g->strip[esub]) == O_CH); } - dp = dissect(m, sp, rest, ssub, esub); + dp = dissect(charset, m, sp, rest, ssub, esub); assert(dp == rest); sp = rest; break; @@ -423,7 +425,8 @@ sopno stopst; == char *stop, sopno startst, sopno stopst, sopno lev); */ static char * /* == stop (success) or NULL (failure) */ -backref(m, start, stop, startst, stopst, lev) +backref(charset,m, start, stop, startst, stopst, lev) +CHARSET_INFO *charset; register struct match *m; char *start; char *stop; @@ -486,8 +489,8 @@ sopno lev; /* PLUS nesting level */ (sp < m->endp && *(sp-1) == '\n' && (m->g->cflags®_NEWLINE)) || (sp > m->beginp && - !ISWORD(*(sp-1))) ) && - (sp < m->endp && ISWORD(*sp)) ) + !ISWORD(charset,*(sp-1))) ) && + (sp < m->endp && ISWORD(charset,*sp)) ) { /* yes */ } else return(NULL); @@ -496,8 +499,8 @@ sopno lev; /* PLUS nesting level */ if (( (sp == m->endp && !(m->eflags®_NOTEOL)) || (sp < m->endp && *sp == '\n' && (m->g->cflags®_NEWLINE)) || - (sp < m->endp && !ISWORD(*sp)) ) && - (sp > m->beginp && ISWORD(*(sp-1))) ) + (sp < m->endp && !ISWORD(charset,*sp)) ) && + (sp > m->beginp && ISWORD(charset,*(sp-1))) ) { /* yes */ } else return(NULL); @@ -543,28 +546,28 @@ sopno lev; /* PLUS nesting level */ return(NULL); while (m->g->strip[ss] != SOP(O_BACK, i)) ss++; - return(backref(m, sp+len, stop, ss+1, stopst, lev)); + return(backref(charset, m, sp+len, stop, ss+1, stopst, lev)); break; case OQUEST_: /* to null or not */ - dp = backref(m, sp, stop, ss+1, stopst, lev); + dp = backref(charset, m, sp, stop, ss+1, stopst, lev); if (dp != NULL) return(dp); /* not */ - return(backref(m, sp, stop, ss+OPND(s)+1, stopst, lev)); + return(backref(charset, m, sp, stop, ss+OPND(s)+1, stopst, lev)); break; case OPLUS_: assert(m->lastpos != NULL); assert(lev+1 <= m->g->nplus); m->lastpos[lev+1] = sp; - return(backref(m, sp, stop, ss+1, stopst, lev+1)); + return(backref(charset, m, sp, stop, ss+1, stopst, lev+1)); break; case O_PLUS: if (sp == m->lastpos[lev]) /* last pass matched null */ - return(backref(m, sp, stop, ss+1, stopst, lev-1)); + return(backref(charset, m, sp, stop, ss+1, stopst, lev-1)); /* try another pass */ m->lastpos[lev] = sp; - dp = backref(m, sp, stop, ss-OPND(s)+1, stopst, lev); + dp = backref(charset, m, sp, stop, ss-OPND(s)+1, stopst, lev); if (dp == NULL) - return(backref(m, sp, stop, ss+1, stopst, lev-1)); + return(backref(charset, m, sp, stop, ss+1, stopst, lev-1)); else return(dp); break; @@ -573,7 +576,7 @@ sopno lev; /* PLUS nesting level */ esub = ss + OPND(s) - 1; assert(OP(m->g->strip[esub]) == OOR1); for (;;) { /* find first matching branch */ - dp = backref(m, sp, stop, ssub, esub, lev); + dp = backref(charset, m, sp, stop, ssub, esub, lev); if (dp != NULL) return(dp); /* that one missed, try next one */ @@ -594,7 +597,7 @@ sopno lev; /* PLUS nesting level */ assert(0 < i && i <= m->g->nsub); offsave = m->pmatch[i].rm_so; m->pmatch[i].rm_so = sp - m->offp; - dp = backref(m, sp, stop, ss+1, stopst, lev); + dp = backref(charset, m, sp, stop, ss+1, stopst, lev); if (dp != NULL) return(dp); m->pmatch[i].rm_so = offsave; @@ -605,7 +608,7 @@ sopno lev; /* PLUS nesting level */ assert(0 < i && i <= m->g->nsub); offsave = m->pmatch[i].rm_eo; m->pmatch[i].rm_eo = sp - m->offp; - dp = backref(m, sp, stop, ss+1, stopst, lev); + dp = backref(charset, m, sp, stop, ss+1, stopst, lev); if (dp != NULL) return(dp); m->pmatch[i].rm_eo = offsave; @@ -628,7 +631,8 @@ sopno lev; /* PLUS nesting level */ == char *stop, sopno startst, sopno stopst); */ static char * /* where tentative match ended, or NULL */ -fast(m, start, stop, startst, stopst) +fast(charset, m, start, stop, startst, stopst) +CHARSET_INFO *charset; register struct match *m; char *start; char *stop; @@ -678,12 +682,12 @@ sopno stopst; } /* how about a word boundary? */ - if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) && - (c != OUT && ISWORD(c)) ) { + if ( (flagch == BOL || (lastc != OUT && !ISWORD(charset,lastc))) && + (c != OUT && ISWORD(charset,c)) ) { flagch = BOW; } - if ( (lastc != OUT && ISWORD(lastc)) && - (flagch == EOL || (c != OUT && !ISWORD(c))) ) { + if ( (lastc != OUT && ISWORD(charset,lastc)) && + (flagch == EOL || (c != OUT && !ISWORD(charset,c))) ) { flagch = EOW; } if (flagch == BOW || flagch == EOW) { @@ -719,7 +723,8 @@ sopno stopst; == char *stop, sopno startst, sopno stopst); */ static char * /* where it ended */ -slow(m, start, stop, startst, stopst) +slow(charset, m, start, stop, startst, stopst) +CHARSET_INFO *charset; register struct match *m; char *start; char *stop; @@ -767,12 +772,12 @@ sopno stopst; } /* how about a word boundary? */ - if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) && - (c != OUT && ISWORD(c)) ) { + if ( (flagch == BOL || (lastc != OUT && !ISWORD(charset,lastc))) && + (c != OUT && ISWORD(charset,c)) ) { flagch = BOW; } - if ( (lastc != OUT && ISWORD(lastc)) && - (flagch == EOL || (c != OUT && !ISWORD(c))) ) { + if ( (lastc != OUT && ISWORD(charset,lastc)) && + (flagch == EOL || (c != OUT && !ISWORD(charset,c))) ) { flagch = EOW; } if (flagch == BOW || flagch == EOW) { diff --git a/regex/engine.ih b/regex/engine.ih index c65733b5756..7cfcb39fb2d 100644 --- a/regex/engine.ih +++ b/regex/engine.ih @@ -4,11 +4,11 @@ extern "C" { #endif /* === engine.c === */ -static int matcher(register struct re_guts *g, char *string, size_t nmatch, regmatch_t pmatch[], int eflags); -static char *dissect(register struct match *m, char *start, char *stop, sopno startst, sopno stopst); -static char *backref(register struct match *m, char *start, char *stop, sopno startst, sopno stopst, sopno lev); -static char *fast(register struct match *m, char *start, char *stop, sopno startst, sopno stopst); -static char *slow(register struct match *m, char *start, char *stop, sopno startst, sopno stopst); +static int matcher(CHARSET_INFO *charset,register struct re_guts *g, char *string, size_t nmatch, regmatch_t pmatch[], int eflags); +static char *dissect(CHARSET_INFO *charset,register struct match *m, char *start, char *stop, sopno startst, sopno stopst); +static char *backref(CHARSET_INFO *charset, register struct match *m, char *start, char *stop, sopno startst, sopno stopst, sopno lev); +static char *fast(CHARSET_INFO *charset, register struct match *m, char *start, char *stop, sopno startst, sopno stopst); +static char *slow(CHARSET_INFO *charset, register struct match *m, char *start, char *stop, sopno startst, sopno stopst); static states step(register struct re_guts *g, sopno start, sopno stop, register states bef, int ch, register states aft); #define BOL (OUT+1) #define EOL (BOL+1) diff --git a/regex/main.c b/regex/main.c index 7844a4d8384..70d75e6ec50 100644 --- a/regex/main.c +++ b/regex/main.c @@ -74,7 +74,7 @@ char *argv[]; exit(status); } - err = regcomp(&re, argv[optind++], copts); + err = regcomp(&re, argv[optind++], copts, default_charset_info); if (err) { len = regerror(err, &re, erbuf, sizeof(erbuf)); fprintf(stderr, "error %s, %d/%d `%s'\n", @@ -226,7 +226,7 @@ int opts; /* may not match f1 */ strcpy(f0copy, f0); re.re_endp = (opts®_PEND) ? f0copy + strlen(f0copy) : NULL; fixstr(f0copy); - err = regcomp(&re, f0copy, opts); + err = regcomp(&re, f0copy, opts, default_charset_info); if (err != 0 && (!opt('C', f1) || err != efind(f2))) { /* unexpected error or wrong error */ len = regerror(err, &re, erbuf, sizeof(erbuf)); diff --git a/regex/regcomp.c b/regex/regcomp.c index 6f8221a706d..8a4ebbdfe17 100644 --- a/regex/regcomp.c +++ b/regex/regcomp.c @@ -28,6 +28,7 @@ struct parse { # define NPAREN 10 /* we need to remember () 1-9 for back refs */ sopno pbegin[NPAREN]; /* -> ( ([0] unused) */ sopno pend[NPAREN]; /* -> ) ([0] unused) */ + CHARSET_INFO *charset; /* for ctype things */ }; #include "regcomp.ih" @@ -99,10 +100,11 @@ static int never = 0; /* for use in asserts; shuts lint up */ = #define REG_DUMP 0200 */ int /* 0 success, otherwise REG_something */ -regcomp(preg, pattern, cflags) +regcomp(preg, pattern, cflags, charset) regex_t *preg; const char *pattern; int cflags; +CHARSET_INFO *charset; { struct parse pa; register struct re_guts *g; @@ -116,6 +118,7 @@ int cflags; #endif regex_init(); /* Init cclass if neaded */ + preg->charset=charset; cflags = GOODFLAGS(cflags); if ((cflags®_EXTENDED) && (cflags®_NOSPEC)) return(REG_INVARG); @@ -146,6 +149,7 @@ int cflags; p->end = p->next + len; p->error = 0; p->ncsalloc = 0; + p->charset = preg->charset; for (i = 0; i < NPAREN; i++) { p->pbegin[i] = 0; p->pend[i] = 0; @@ -327,7 +331,7 @@ register struct parse *p; ordinary(p, c); break; case '{': /* okay as ordinary except if digit follows */ - if(REQUIRE(!MORE() || !isdigit(PEEK()), REG_BADRPT)) {} + if(REQUIRE(!MORE() || !my_isdigit(p->charset,PEEK()), REG_BADRPT)) {} /* FALLTHROUGH */ default: ordinary(p, c); @@ -339,7 +343,8 @@ register struct parse *p; c = PEEK(); /* we call { a repetition if followed by a digit */ if (!( c == '*' || c == '+' || c == '?' || - (c == '{' && MORE2() && isdigit(PEEK2())) )) + (c == '{' && MORE2() && + my_isdigit(p->charset,PEEK2())) )) return; /* no repetition, we're done */ NEXT(); @@ -368,7 +373,7 @@ register struct parse *p; case '{': count = p_count(p); if (EAT(',')) { - if (isdigit(PEEK())) { + if (my_isdigit(p->charset,PEEK())) { count2 = p_count(p); if(REQUIRE(count <= count2, REG_BADBR)) {} } else /* single number with comma */ @@ -389,7 +394,8 @@ register struct parse *p; return; c = PEEK(); if (!( c == '*' || c == '+' || c == '?' || - (c == '{' && MORE2() && isdigit(PEEK2())) ) ) + (c == '{' && MORE2() && + my_isdigit(p->charset,PEEK2())) ) ) return; SETERROR(REG_BADRPT); } @@ -546,7 +552,7 @@ int starordinary; /* is a leading * an ordinary character? */ } else if (EATTWO('\\', '{')) { count = p_count(p); if (EAT(',')) { - if (MORE() && isdigit(PEEK())) { + if (MORE() && my_isdigit(p->charset,PEEK())) { count2 = p_count(p); if(REQUIRE(count <= count2, REG_BADBR)) {} } else /* single number with comma */ @@ -577,7 +583,7 @@ register struct parse *p; register int count = 0; register int ndigits = 0; - while (MORE() && isdigit(PEEK()) && count <= DUPMAX) { + while (MORE() && my_isdigit(p->charset,PEEK()) && count <= DUPMAX) { count = count*10 + (GETNEXT() - '0'); ndigits++; } @@ -632,8 +638,8 @@ register struct parse *p; register int ci; for (i = p->g->csetsize - 1; i >= 0; i--) - if (CHIN(cs, i) && isalpha(i)) { - ci = othercase(i); + if (CHIN(cs, i) && my_isalpha(p->charset,i)) { + ci = othercase(p->charset,i); if (ci != i) CHadd(cs, ci); } @@ -744,7 +750,7 @@ register cset *cs; register char *u; register char c; - while (MORE() && isalpha(PEEK())) + while (MORE() && my_isalpha(p->charset,PEEK())) NEXT(); len = p->next - sp; for (cp = cclasses; cp->name != NULL; cp++) @@ -837,14 +843,15 @@ int endc; /* name ended by endc,']' */ == static char othercase(int ch); */ static char /* if no counterpart, return ch */ -othercase(ch) +othercase(charset,ch) +CHARSET_INFO *charset; int ch; { - assert(isalpha(ch)); - if (isupper(ch)) - return(tolower(ch)); - else if (islower(ch)) - return(toupper(ch)); + assert(my_isalpha(charset,ch)); + if (my_isupper(charset,ch)) + return(my_tolower(charset,ch)); + else if (my_islower(charset,ch)) + return(my_toupper(charset,ch)); else /* peculiar, but could happen */ return(ch); } @@ -887,7 +894,8 @@ register int ch; { register cat_t *cap = p->g->categories; - if ((p->g->cflags®_ICASE) && isalpha(ch) && othercase(ch) != ch) + if ((p->g->cflags®_ICASE) && my_isalpha(p->charset,ch) && + othercase(p->charset,ch) != ch) bothcases(p, ch); else { EMIT(OCHAR, (unsigned char)ch); diff --git a/regex/regcomp.ih b/regex/regcomp.ih index 4ae45bbf4a9..32f1f6e89eb 100644 --- a/regex/regcomp.ih +++ b/regex/regcomp.ih @@ -16,7 +16,7 @@ static void p_b_cclass(register struct parse *p, register cset *cs); static void p_b_eclass(register struct parse *p, register cset *cs); static char p_b_symbol(register struct parse *p); static char p_b_coll_elem(register struct parse *p, int endc); -static char othercase(int ch); +static char othercase(CHARSET_INFO *charset,int ch); static void bothcases(register struct parse *p, int ch); static void ordinary(register struct parse *p, register int ch); static void nonnewline(register struct parse *p); diff --git a/regex/regex.h b/regex/regex.h index 99a0077251e..1602f66d190 100644 --- a/regex/regex.h +++ b/regex/regex.h @@ -5,6 +5,8 @@ extern "C" { #endif +#include "m_ctype.h" + /* === regex2.h === */ #ifdef _WIN64 typedef __int64 regoff_t; @@ -17,6 +19,7 @@ typedef struct { size_t re_nsub; /* number of parenthesized subexpressions */ const char *re_endp; /* end pointer for REG_PEND */ struct re_guts *re_g; /* none of your business :-) */ + CHARSET_INFO *charset; /* For ctype things */ } regex_t; typedef struct { regoff_t rm_so; /* start of match */ @@ -25,7 +28,7 @@ typedef struct { /* === regcomp.c === */ -extern int regcomp(regex_t *, const char *, int); +extern int regcomp(regex_t *, const char *, int, CHARSET_INFO *charset); #define REG_BASIC 0000 #define REG_EXTENDED 0001 #define REG_ICASE 0002 diff --git a/regex/regex2.h b/regex/regex2.h index 0d94baa310f..bba54ea2054 100644 --- a/regex/regex2.h +++ b/regex/regex2.h @@ -140,6 +140,6 @@ struct re_guts { /* misc utilities */ #undef OUT /* May be defined in windows */ #define OUT (CHAR_MAX+1) /* a non-character value */ -#define ISWORD(c) (isalnum(c) || (c) == '_') +#define ISWORD(s,c) (my_isalnum(s,c) || (c) == '_') #endif /* __regex2_h__ */ diff --git a/regex/regexec.c b/regex/regexec.c index 7f2704f8214..723289bd0ad 100644 --- a/regex/regexec.c +++ b/regex/regexec.c @@ -133,7 +133,7 @@ int eflags; if ((size_t) g->nstates <= CHAR_BIT*sizeof(states1) && !(eflags®_LARGE)) - return(smatcher(g, (char *)str, nmatch, pmatch, eflags)); + return(smatcher(preg->charset, g, (char *)str, nmatch, pmatch, eflags)); else - return(lmatcher(g, (char *)str, nmatch, pmatch, eflags)); + return(lmatcher(preg->charset, g, (char *)str, nmatch, pmatch, eflags)); } diff --git a/regex/reginit.c b/regex/reginit.c index 18647c386fc..fe81f88a342 100644 --- a/regex/reginit.c +++ b/regex/reginit.c @@ -12,6 +12,7 @@ void regex_init() char buff[CCLASS_LAST][256]; int count[CCLASS_LAST]; uint i; + CHARSET_INFO *cs=default_charset_info; if (!regex_inited) { @@ -20,27 +21,27 @@ void regex_init() for (i=1 ; i<= 255; i++) { - if (isalnum(i)) + if (my_isalnum(cs,i)) buff[CCLASS_ALNUM][count[CCLASS_ALNUM]++]=(char) i; - if (isalpha(i)) + if (my_isalpha(cs,i)) buff[CCLASS_ALPHA][count[CCLASS_ALPHA]++]=(char) i; - if (iscntrl(i)) + if (my_iscntrl(cs,i)) buff[CCLASS_CNTRL][count[CCLASS_CNTRL]++]=(char) i; - if (isdigit(i)) + if (my_isdigit(cs,i)) buff[CCLASS_DIGIT][count[CCLASS_DIGIT]++]=(char) i; - if (isgraph(i)) + if (my_isgraph(cs,i)) buff[CCLASS_GRAPH][count[CCLASS_GRAPH]++]=(char) i; - if (islower(i)) + if (my_islower(cs,i)) buff[CCLASS_LOWER][count[CCLASS_LOWER]++]=(char) i; - if (isprint(i)) + if (my_isprint(cs,i)) buff[CCLASS_PRINT][count[CCLASS_PRINT]++]=(char) i; - if (ispunct(i)) + if (my_ispunct(cs,i)) buff[CCLASS_PUNCT][count[CCLASS_PUNCT]++]=(char) i; - if (isspace(i)) + if (my_isspace(cs,i)) buff[CCLASS_SPACE][count[CCLASS_SPACE]++]=(char) i; - if (isupper(i)) + if (my_isupper(cs,i)) buff[CCLASS_UPPER][count[CCLASS_UPPER]++]=(char) i; - if (isxdigit(i)) + if (my_isxdigit(cs,i)) buff[CCLASS_XDIGIT][count[CCLASS_XDIGIT]++]=(char) i; } buff[CCLASS_BLANK][0]=' '; diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 1de398177b5..a09c503e3d5 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -1278,7 +1278,8 @@ Item_func_regex::fix_fields(THD *thd,TABLE_LIST *tables) int error; if ((error=regcomp(&preg,res->c_ptr(), binary ? REG_EXTENDED | REG_NOSUB : - REG_EXTENDED | REG_NOSUB | REG_ICASE))) + REG_EXTENDED | REG_NOSUB | REG_ICASE, + default_charset_info))) { (void) regerror(error,&preg,buff,sizeof(buff)); my_printf_error(ER_REGEXP_ERROR,ER(ER_REGEXP_ERROR),MYF(0),buff); @@ -1325,7 +1326,8 @@ longlong Item_func_regex::val_int() } if (regcomp(&preg,res2->c_ptr(), binary ? REG_EXTENDED | REG_NOSUB : - REG_EXTENDED | REG_NOSUB | REG_ICASE)) + REG_EXTENDED | REG_NOSUB | REG_ICASE, + default_charset_info)) { null_value=1; -- cgit v1.2.1 From 220eeadc3d623ceede6990570e67bc5fab15d1ec Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 7 Mar 2002 15:23:24 +0400 Subject: Extend String class with CHARSET_INFO field --- sql/item_cmpfunc.cc | 4 ++-- sql/sql_string.h | 35 +++++++++++++++++++++++++++-------- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index a09c503e3d5..d4ab03003ce 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -1279,7 +1279,7 @@ Item_func_regex::fix_fields(THD *thd,TABLE_LIST *tables) if ((error=regcomp(&preg,res->c_ptr(), binary ? REG_EXTENDED | REG_NOSUB : REG_EXTENDED | REG_NOSUB | REG_ICASE, - default_charset_info))) + res->charset()))) { (void) regerror(error,&preg,buff,sizeof(buff)); my_printf_error(ER_REGEXP_ERROR,ER(ER_REGEXP_ERROR),MYF(0),buff); @@ -1327,7 +1327,7 @@ longlong Item_func_regex::val_int() if (regcomp(&preg,res2->c_ptr(), binary ? REG_EXTENDED | REG_NOSUB : REG_EXTENDED | REG_NOSUB | REG_ICASE, - default_charset_info)) + res->charset())) { null_value=1; diff --git a/sql/sql_string.h b/sql/sql_string.h index ac579cd752d..6e8fefb079a 100644 --- a/sql/sql_string.h +++ b/sql/sql_string.h @@ -36,26 +36,45 @@ class String char *Ptr; uint32 str_length,Alloced_length; bool alloced; + CHARSET_INFO *str_charset; public: String() - { Ptr=0; str_length=Alloced_length=0; alloced=0; } + { + Ptr=0; str_length=Alloced_length=0; alloced=0; + str_charset=default_charset_info; + } String(uint32 length_arg) - { alloced=0; Alloced_length=0; (void) real_alloc(length_arg); } + { + alloced=0; Alloced_length=0; (void) real_alloc(length_arg); + str_charset=default_charset_info; + } String(const char *str) - { Ptr=(char*) str; str_length=(uint) strlen(str); Alloced_length=0; alloced=0;} + { + Ptr=(char*) str; str_length=(uint) strlen(str); Alloced_length=0; alloced=0; + str_charset=default_charset_info; + } String(const char *str,uint32 len) - { Ptr=(char*) str; str_length=len; Alloced_length=0; alloced=0;} + { + Ptr=(char*) str; str_length=len; Alloced_length=0; alloced=0; + str_charset=default_charset_info; + } String(char *str,uint32 len) - { Ptr=(char*) str; Alloced_length=str_length=len; alloced=0;} + { + Ptr=(char*) str; Alloced_length=str_length=len; alloced=0; + str_charset=default_charset_info; + } String(const String &str) - { Ptr=str.Ptr ; str_length=str.str_length ; - Alloced_length=str.Alloced_length; alloced=0; } - + { + Ptr=str.Ptr ; str_length=str.str_length ; + Alloced_length=str.Alloced_length; alloced=0; + str_charset=str.str_charset; + } static void *operator new(size_t size) { return (void*) sql_alloc((uint) size); } static void operator delete(void *ptr_arg,size_t size) /*lint -e715 */ { sql_element_free(ptr_arg); } ~String() { free(); } + inline CHARSET_INFO *charset() const { return str_charset; } inline uint32 length() const { return str_length;} inline uint32 alloced_length() const { return Alloced_length;} inline char& operator [] (uint32 i) const { return Ptr[i]; } -- cgit v1.2.1 From 6265e94c350650b43d8b8002ea1dde527c44b7af Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 7 Mar 2002 14:19:18 +0200 Subject: Same patches as for 4.0. See there for details --- heap/hp_rfirst.c | 5 +++++ heap/hp_rnext.c | 6 ------ sql/sql_yacc.yy | 6 +++--- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/heap/hp_rfirst.c b/heap/hp_rfirst.c index 9a1f09244a0..b20918ff3a7 100644 --- a/heap/hp_rfirst.c +++ b/heap/hp_rfirst.c @@ -21,6 +21,11 @@ int heap_rfirst(HP_INFO *info, byte *record) { DBUG_ENTER("heap_rfirst"); + if (!(info->s->records)) + { + my_errno=HA_ERR_END_OF_FILE; + DBUG_RETURN(my_errno); + } info->current_record=0; info->current_hash_ptr=0; info->update=HA_STATE_PREV_FOUND; diff --git a/heap/hp_rnext.c b/heap/hp_rnext.c index 7a6b6846169..af08a0e68a2 100644 --- a/heap/hp_rnext.c +++ b/heap/hp_rnext.c @@ -24,12 +24,6 @@ int heap_rnext(HP_INFO *info, byte *record) HP_SHARE *share=info->s; DBUG_ENTER("heap_rnext"); - if (!(info->s->records)) - { - my_errno=HA_ERR_END_OF_FILE; - DBUG_RETURN(my_errno); - } - if (info->lastinx < 0) DBUG_RETURN(my_errno=HA_ERR_WRONG_INDEX); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index f91d6a48d50..41e56328613 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1652,7 +1652,7 @@ simple_expr: | BINARY expr %prec NEG { $$= new Item_func_binary($2); } | CAST_SYM '(' expr AS cast_type ')' { $$= create_func_cast($3, $5); } | CASE_SYM opt_expr WHEN_SYM when_list opt_else END - { $$= new Item_func_case(* $4, $2, $5 ) } + { $$= new Item_func_case(* $4, $2, $5 ); } | CONVERT_SYM '(' expr ',' cast_type ')' { $$= create_func_cast($3, $5); } | FUNC_ARG0 '(' ')' { $$= ((Item*(*)(void))($1.symbol->create_func))();} @@ -1969,7 +1969,7 @@ sum_expr: { $$=new Item_sum_sum($3); } in_sum_expr: - { Select->in_sum_expr++ } + { Select->in_sum_expr++; } expr { Select->in_sum_expr--; @@ -2042,7 +2042,7 @@ opt_pad: join_table_list: '(' join_table_list ')' { $$=$2; } | join_table { $$=$1; } - | join_table_list normal_join join_table { $$=$3 } + | join_table_list normal_join join_table { $$=$3; } | join_table_list STRAIGHT_JOIN join_table { $$=$3 ; $$->straight=1; } | join_table_list INNER_SYM JOIN_SYM join_table ON expr { add_join_on($4,$6); $$=$4; } -- cgit v1.2.1 From 9a072af95a774f57162f2307c8f2b876681ff68d Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 7 Mar 2002 17:05:44 +0400 Subject: New fiedls in CHARSET_INFO strucutre include/m_ctype.h: Adding new functions into CHARSET_INFO structure strings/ctype.c: Temporary fill these new fields with NULL --- include/m_ctype.h | 106 +++++++++++++++++++++++++++++++++++------------------- strings/ctype.c | 99 +++++++++++++++++++++++++++++++++----------------- 2 files changed, 136 insertions(+), 69 deletions(-) diff --git a/include/m_ctype.h b/include/m_ctype.h index 998841c14d4..9e29263ee54 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -26,6 +26,76 @@ extern "C" { #endif + +#define CHARSET_DIR "charsets/" + +typedef struct charset_info_st +{ + uint number; + const char *name; + uchar *ctype; + uchar *to_lower; + uchar *to_upper; + uchar *sort_order; + + uint strxfrm_multiply; + int (*strcoll)(const uchar *, const uchar *); + int (*strxfrm)(uchar *, const uchar *, int); + int (*strnncoll)(const uchar *, int, const uchar *, int); + int (*strnxfrm)(uchar *, const uchar *, int, int); + my_bool (*like_range)(const char *, uint, pchar, uint, + char *, char *, uint *, uint *); + + uint mbmaxlen; + int (*ismbchar)(const char *, const char *); + my_bool (*ismbhead)(uint); + int (*mbcharlen)(uint); + + /* Functions for case convertion */ + void (*caseup_str)(struct charset_info_st *, uchar *); + void (*casedn_str)(struct charset_info_st *, uchar *); + void (*caseup)(struct charset_info_st *, uchar *, uint); + void (*casedn)(struct charset_info_st *, uchar *, uint); + + /* Functions for case comparison */ + int (*strcasecmp)(struct charset_info_st *, const uchar *, const uchar *); + int (*strncasecmp)(struct charset_info_st *, const uchar *, const uchar *, uint); + +} CHARSET_INFO; + +/* strings/ctype.c */ +extern CHARSET_INFO *default_charset_info; +extern CHARSET_INFO *find_compiled_charset(uint cs_number); +extern CHARSET_INFO *find_compiled_charset_by_name(const char *name); +extern CHARSET_INFO compiled_charsets[]; +extern uint compiled_charset_number(const char *name); +extern const char *compiled_charset_name(uint charset_number); + +#define MY_CHARSET_UNDEFINED 0 +#define MY_CHARSET_CURRENT (default_charset_info->number) + +/* declarations for simple charsets */ +extern int my_strnxfrm_simple(CHARSET_INFO *, uchar *, const uchar *, int, int); +extern int my_strnncoll_simple(CHARSET_INFO *, const uchar *, int, const uchar *, int); + +/* Functions for 8bit */ +extern void my_caseup_str_8bit(CHARSET_INFO *, uchar *); +extern void my_casedn_str_8bit(CHARSET_INFO *, uchar *); +extern void my_caseup_8bit(CHARSET_INFO *, uchar *, uint); +extern void my_casedn_8bit(CHARSET_INFO *, uchar *, uint); + +extern int my_strcasecmp_8bit(CHARSET_INFO * cs, const uchar *, const uchar *); +extern int my_strncasecmp_8bit(CHARSET_INFO * cs, const uchar *, const uchar *, uint); + +/* Functions for multibyte charsets */ +extern void my_caseup_str_mb(CHARSET_INFO *, uchar *); +extern void my_casedn_str_mb(CHARSET_INFO *, uchar *); +extern void my_caseup_mb(CHARSET_INFO *, uchar *, uint); +extern void my_casedn_mb(CHARSET_INFO *, uchar *, uint); + +extern int my_strcasecmp_mb(CHARSET_INFO * cs,const uchar *, const uchar *); +extern int my_strncasecmp_mb(CHARSET_INFO * cs,const uchar *, const uchar *t, uint); + /* declarations for the big5 character set */ extern uchar ctype_big5[], to_lower_big5[], to_upper_big5[], sort_order_big5[]; extern int my_strcoll_big5(const uchar *, const uchar *); @@ -108,42 +178,6 @@ extern my_bool ismbhead_ujis(uint); extern int mbcharlen_ujis(uint); -#define CHARSET_DIR "charsets/" - -typedef struct charset_info_st -{ - uint number; - const char *name; - uchar *ctype; - uchar *to_lower; - uchar *to_upper; - uchar *sort_order; - - uint strxfrm_multiply; - int (*strcoll)(const uchar *, const uchar *); - int (*strxfrm)(uchar *, const uchar *, int); - int (*strnncoll)(const uchar *, int, const uchar *, int); - int (*strnxfrm)(uchar *, const uchar *, int, int); - my_bool (*like_range)(const char *, uint, pchar, uint, - char *, char *, uint *, uint *); - - uint mbmaxlen; - int (*ismbchar)(const char *, const char *); - my_bool (*ismbhead)(uint); - int (*mbcharlen)(uint); -} CHARSET_INFO; - -/* strings/ctype.c */ -extern CHARSET_INFO *default_charset_info; -extern CHARSET_INFO *find_compiled_charset(uint cs_number); -extern CHARSET_INFO *find_compiled_charset_by_name(const char *name); -extern CHARSET_INFO compiled_charsets[]; -extern uint compiled_charset_number(const char *name); -extern const char *compiled_charset_name(uint charset_number); - -#define MY_CHARSET_UNDEFINED 0 -#define MY_CHARSET_CURRENT (default_charset_info->number) - /* Don't include std ctype.h when this is included */ #define _CTYPE_H #define _CTYPE_H_ diff --git a/strings/ctype.c b/strings/ctype.c index 4be87f9c62a..ab17a16bb54 100644 --- a/strings/ctype.c +++ b/strings/ctype.c @@ -1975,7 +1975,8 @@ CHARSET_INFO compiled_charsets[] = { 0, /* mbmaxlen */ NULL, /* ismbchar */ NULL, /* ismbhead */ - NULL /* mbcharlen */ + NULL, /* mbcharlen */ + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -1996,7 +1997,8 @@ CHARSET_INFO compiled_charsets[] = { 2, /* mbmaxlen */ ismbchar_big5, ismbhead_big5, - mbcharlen_big5 + mbcharlen_big5, + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2017,7 +2019,8 @@ CHARSET_INFO compiled_charsets[] = { 0, /* mbmaxlen */ NULL, /* ismbchar */ NULL, /* ismbhead */ - NULL /* mbcharlen */ + NULL, /* mbcharlen */ + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2038,7 +2041,8 @@ CHARSET_INFO compiled_charsets[] = { 0, /* mbmaxlen */ NULL, /* ismbchar */ NULL, /* ismbhead */ - NULL /* mbcharlen */ + NULL, /* mbcharlen */ + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2059,7 +2063,8 @@ CHARSET_INFO compiled_charsets[] = { 0, /* mbmaxlen */ NULL, /* ismbchar */ NULL, /* ismbhead */ - NULL /* mbcharlen */ + NULL, /* mbcharlen */ + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2080,7 +2085,8 @@ CHARSET_INFO compiled_charsets[] = { 0, /* mbmaxlen */ NULL, /* ismbchar */ NULL, /* ismbhead */ - NULL /* mbcharlen */ + NULL, /* mbcharlen */ + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2101,7 +2107,8 @@ CHARSET_INFO compiled_charsets[] = { 0, /* mbmaxlen */ NULL, /* ismbchar */ NULL, /* ismbhead */ - NULL /* mbcharlen */ + NULL, /* mbcharlen */ + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2122,7 +2129,8 @@ CHARSET_INFO compiled_charsets[] = { 0, /* mbmaxlen */ NULL, /* ismbchar */ NULL, /* ismbhead */ - NULL /* mbcharlen */ + NULL, /* mbcharlen */ + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2143,7 +2151,8 @@ CHARSET_INFO compiled_charsets[] = { 0, /* mbmaxlen */ NULL, /* ismbchar */ NULL, /* ismbhead */ - NULL /* mbcharlen */ + NULL, /* mbcharlen */ + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2164,7 +2173,8 @@ CHARSET_INFO compiled_charsets[] = { 0, /* mbmaxlen */ NULL, /* ismbchar */ NULL, /* ismbhead */ - NULL /* mbcharlen */ + NULL, /* mbcharlen */ + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2185,7 +2195,8 @@ CHARSET_INFO compiled_charsets[] = { 2, /* mbmaxlen */ ismbchar_euc_kr, ismbhead_euc_kr, - mbcharlen_euc_kr + mbcharlen_euc_kr, + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2206,7 +2217,8 @@ CHARSET_INFO compiled_charsets[] = { 2, /* mbmaxlen */ ismbchar_gb2312, ismbhead_gb2312, - mbcharlen_gb2312 + mbcharlen_gb2312, + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2227,7 +2239,8 @@ CHARSET_INFO compiled_charsets[] = { 2, /* mbmaxlen */ ismbchar_gbk, ismbhead_gbk, - mbcharlen_gbk + mbcharlen_gbk, + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2248,7 +2261,8 @@ CHARSET_INFO compiled_charsets[] = { 0, /* mbmaxlen */ NULL, /* ismbchar */ NULL, /* ismbhead */ - NULL /* mbcharlen */ + NULL, /* mbcharlen */ + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2269,7 +2283,8 @@ CHARSET_INFO compiled_charsets[] = { 0, /* mbmaxlen */ NULL, /* ismbchar */ NULL, /* ismbhead */ - NULL /* mbcharlen */ + NULL, /* mbcharlen */ + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2290,7 +2305,8 @@ CHARSET_INFO compiled_charsets[] = { 0, /* mbmaxlen */ NULL, /* ismbchar */ NULL, /* ismbhead */ - NULL /* mbcharlen */ + NULL, /* mbcharlen */ + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2311,7 +2327,8 @@ CHARSET_INFO compiled_charsets[] = { 0, /* mbmaxlen */ NULL, /* ismbchar */ NULL, /* ismbhead */ - NULL /* mbcharlen */ + NULL, /* mbcharlen */ + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2332,7 +2349,8 @@ CHARSET_INFO compiled_charsets[] = { 0, /* mbmaxlen */ NULL, /* ismbchar */ NULL, /* ismbhead */ - NULL /* mbcharlen */ + NULL, /* mbcharlen */ + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2353,7 +2371,8 @@ CHARSET_INFO compiled_charsets[] = { 0, /* mbmaxlen */ NULL, /* ismbchar */ NULL, /* ismbhead */ - NULL /* mbcharlen */ + NULL, /* mbcharlen */ + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2374,7 +2393,8 @@ CHARSET_INFO compiled_charsets[] = { 0, /* mbmaxlen */ NULL, /* ismbchar */ NULL, /* ismbhead */ - NULL /* mbcharlen */ + NULL, /* mbcharlen */ + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2395,7 +2415,8 @@ CHARSET_INFO compiled_charsets[] = { 0, /* mbmaxlen */ NULL, /* ismbchar */ NULL, /* ismbhead */ - NULL /* mbcharlen */ + NULL, /* mbcharlen */ + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2416,7 +2437,8 @@ CHARSET_INFO compiled_charsets[] = { 0, /* mbmaxlen */ NULL, /* ismbchar */ NULL, /* ismbhead */ - NULL /* mbcharlen */ + NULL, /* mbcharlen */ + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2437,7 +2459,8 @@ CHARSET_INFO compiled_charsets[] = { 0, /* mbmaxlen */ NULL, /* ismbchar */ NULL, /* ismbhead */ - NULL /* mbcharlen */ + NULL, /* mbcharlen */ + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2458,7 +2481,8 @@ CHARSET_INFO compiled_charsets[] = { 2, /* mbmaxlen */ ismbchar_sjis, ismbhead_sjis, - mbcharlen_sjis + mbcharlen_sjis, + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2479,7 +2503,8 @@ CHARSET_INFO compiled_charsets[] = { 0, /* mbmaxlen */ NULL, /* ismbchar */ NULL, /* ismbhead */ - NULL /* mbcharlen */ + NULL, /* mbcharlen */ + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2500,7 +2525,8 @@ CHARSET_INFO compiled_charsets[] = { 0, /* mbmaxlen */ NULL, /* ismbchar */ NULL, /* ismbhead */ - NULL /* mbcharlen */ + NULL, /* mbcharlen */ + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2521,7 +2547,8 @@ CHARSET_INFO compiled_charsets[] = { 3, /* mbmaxlen */ ismbchar_ujis, ismbhead_ujis, - mbcharlen_ujis + mbcharlen_ujis, + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2542,7 +2569,8 @@ CHARSET_INFO compiled_charsets[] = { 0, /* mbmaxlen */ NULL, /* ismbchar */ NULL, /* ismbhead */ - NULL /* mbcharlen */ + NULL, /* mbcharlen */ + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2563,7 +2591,8 @@ CHARSET_INFO compiled_charsets[] = { 0, /* mbmaxlen */ NULL, /* ismbchar */ NULL, /* ismbhead */ - NULL /* mbcharlen */ + NULL, /* mbcharlen */ + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2584,7 +2613,8 @@ CHARSET_INFO compiled_charsets[] = { 0, /* mbmaxlen */ NULL, /* ismbchar */ NULL, /* ismbhead */ - NULL /* mbcharlen */ + NULL, /* mbcharlen */ + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2605,7 +2635,8 @@ CHARSET_INFO compiled_charsets[] = { 0, /* mbmaxlen */ NULL, /* ismbchar */ NULL, /* ismbhead */ - NULL /* mbcharlen */ + NULL, /* mbcharlen */ + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2626,7 +2657,8 @@ CHARSET_INFO compiled_charsets[] = { 0, /* mbmaxlen */ NULL, /* ismbchar */ NULL, /* ismbhead */ - NULL /* mbcharlen */ + NULL, /* mbcharlen */ + NULL,NULL,NULL,NULL,NULL,NULL }, #endif @@ -2646,7 +2678,8 @@ CHARSET_INFO compiled_charsets[] = { 0, NULL, NULL, - NULL + NULL, + NULL,NULL,NULL,NULL,NULL,NULL } }; -- cgit v1.2.1 From c10827ba04cd417010beacfc5da972de65817574 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 9 Mar 2002 14:21:34 +0200 Subject: Take a look at comments in 4.0 --- sql/mysqld.cc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 187a4732aa0..5e4fc654320 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -2456,6 +2456,7 @@ pthread_handler_decl(handle_connections_sockets,arg __attribute__((unused))) struct request_info req; signal(SIGCHLD, SIG_DFL); request_init(&req, RQ_DAEMON, libwrapName, RQ_FILE, new_sock, NULL); +#ifndef __linux__ fromhost(&req); if (!hosts_access(&req)) { @@ -2465,6 +2466,12 @@ pthread_handler_decl(handle_connections_sockets,arg __attribute__((unused))) clean_exit() - same stupid thing ... */ syslog(deny_severity, "refused connect from %s", eval_client(&req)); +#else + fromhost(); + if (!hosts_access()) + { + syslog(deny_severity, "refused connect from %s", eval_client()); +#endif if (req.sink) ((void (*)(int))req.sink)(req.fd); -- cgit v1.2.1 From 68375e0f008d109f574491bd3b0eb2184e6f3ad2 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 12 Mar 2002 21:37:58 +0400 Subject: New ctype functions/macros to support many charsets at a time client/mysql.cc: new ctypes client/mysqldump.c: new ctypes client/mysqltest.c: new ctypes client/sql_string.cc: new ctypes client/sql_string.h: new ctypes extra/mysql_install.c: new ctypes extra/replace.c: new ctypes extra/resolve_stack_dump.c: new ctypes extra/resolveip.c: new ctypes heap/hp_hash.c: new ctypes include/m_ctype.h: new ctypes include/my_sys.h: new ctypes isam/_key.c: new ctypes isam/_search.c: new ctypes libmysql/Makefile.shared: new ctypes libmysql/libmysql.c: new ctypes myisam/ft_dump.c: new ctypes myisam/ft_parser.c: new ctypes myisam/mi_test1.c: new ctypes mysys/charset.c: new ctypes mysys/default.c: new ctypes mysys/getvar.c: new ctypes mysys/hash.c: new ctypes mysys/mf_casecnv.c: new ctypes mysys/mf_dirname.c: new ctypes mysys/mf_format.c: new ctypes mysys/mf_iocache2.c: new ctypes mysys/mf_soundex.c: new ctypes mysys/mf_wfile.c: new ctypes mysys/my_error.c: new ctypes mysys/my_getwd.c: new ctypes mysys/my_init.c: new ctypes mysys/my_vsnprintf.c: new ctypes mysys/typelib.c: new ctypes sql/convert.cc: new ctypes sql/des_key_file.cc: new ctypes sql/field.cc: new ctypes sql/field.h: new ctypes sql/field_conv.cc: new ctypes sql/filesort.cc: new ctypes sql/ha_innodb.cc: new ctypes sql/hostname.cc: new ctypes sql/init.cc: new ctypes sql/item.cc: new ctypes sql/item_func.cc: new ctypes sql/item_strfunc.cc: new ctypes sql/item_sum.cc: new ctypes sql/item_timefunc.cc: new ctypes sql/key.cc: new ctypes sql/log.cc: new ctypes sql/mysql_priv.h: new ctypes sql/mysqld.cc: new ctypes sql/opt_range.cc: new ctypes sql/procedure.cc: new ctypes sql/slave.cc: new ctypes sql/sql_acl.cc: new ctypes sql/sql_analyse.cc: new ctypes sql/sql_base.cc: new ctypes sql/sql_cache.cc: new ctypes sql/sql_db.cc: new ctypes sql/sql_handler.cc: new ctypes sql/sql_lex.cc: new ctypes sql/sql_parse.cc: new ctypes sql/sql_show.cc: new ctypes sql/sql_string.cc: new ctypes sql/sql_string.h: new ctypes sql/sql_table.cc: new ctypes sql/sql_yacc.yy: new ctypes sql/table.cc: new ctypes sql/time.cc: new ctypes strings/Makefile.am: new ctypes strings/ctype-big5.c: new ctypes strings/ctype-czech.c: new ctypes strings/ctype-gbk.c: new ctypes strings/ctype-latin1_de.c: new ctypes strings/ctype-sjis.c: new ctypes strings/ctype-tis620.c: new ctypes strings/ctype.c: new ctypes strings/str2int.c: new ctypes strings/strto.c: new ctypes tools/mysqlmanager.c: new ctypes --- client/mysql.cc | 42 +++--- client/mysqldump.c | 11 +- client/mysqltest.c | 48 +++---- client/sql_string.cc | 204 ++++++++++++++++++++-------- client/sql_string.h | 94 +++++++++++-- extra/mysql_install.c | 2 +- extra/replace.c | 2 +- extra/resolve_stack_dump.c | 10 +- extra/resolveip.c | 2 +- heap/hp_hash.c | 13 +- include/m_ctype.h | 155 +++++++++------------ include/my_sys.h | 16 +-- isam/_key.c | 6 +- isam/_search.c | 16 ++- libmysql/Makefile.shared | 2 +- libmysql/libmysql.c | 10 +- myisam/ft_dump.c | 2 +- myisam/ft_parser.c | 16 ++- myisam/mi_test1.c | 6 +- mysys/charset.c | 8 +- mysys/default.c | 10 +- mysys/getvar.c | 9 +- mysys/hash.c | 7 +- mysys/mf_casecnv.c | 216 +++-------------------------- mysys/mf_dirname.c | 6 - mysys/mf_format.c | 6 - mysys/mf_iocache2.c | 2 +- mysys/mf_soundex.c | 20 +-- mysys/mf_wfile.c | 7 - mysys/my_error.c | 2 +- mysys/my_getwd.c | 3 +- mysys/my_init.c | 3 +- mysys/my_vsnprintf.c | 2 +- mysys/typelib.c | 4 +- sql/convert.cc | 12 +- sql/des_key_file.cc | 5 +- sql/field.cc | 114 ++++++++-------- sql/field.h | 19 ++- sql/field_conv.cc | 2 +- sql/filesort.cc | 11 +- sql/ha_innodb.cc | 5 +- sql/hostname.cc | 4 +- sql/init.cc | 14 +- sql/item.cc | 4 +- sql/item_func.cc | 3 +- sql/item_strfunc.cc | 16 +-- sql/item_sum.cc | 3 +- sql/item_timefunc.cc | 8 +- sql/key.cc | 5 +- sql/log.cc | 4 +- sql/mysql_priv.h | 6 +- sql/mysqld.cc | 11 +- sql/opt_range.cc | 3 +- sql/procedure.cc | 3 +- sql/slave.cc | 9 +- sql/sql_acl.cc | 46 ++++--- sql/sql_analyse.cc | 10 +- sql/sql_base.cc | 21 +-- sql/sql_cache.cc | 5 +- sql/sql_db.cc | 6 +- sql/sql_handler.cc | 2 +- sql/sql_lex.cc | 78 +++++------ sql/sql_parse.cc | 15 ++- sql/sql_show.cc | 10 +- sql/sql_string.cc | 74 +++++----- sql/sql_string.h | 4 +- sql/sql_table.cc | 33 +++-- sql/sql_yacc.yy | 3 +- sql/table.cc | 14 +- sql/time.cc | 53 +++++--- strings/Makefile.am | 6 +- strings/ctype-big5.c | 12 +- strings/ctype-czech.c | 19 ++- strings/ctype-gbk.c | 20 ++- strings/ctype-latin1_de.c | 25 ++-- strings/ctype-mb.c | 125 +++++++++++++++++ strings/ctype-simple.c | 87 ++++++++++++ strings/ctype-sjis.c | 27 ++-- strings/ctype-tis620.c | 11 +- strings/ctype.c | 329 +++++++++++++++++++++++++++++++-------------- strings/str2int.c | 2 +- strings/strto.c | 12 +- tools/mysqlmanager.c | 18 +-- 83 files changed, 1335 insertions(+), 955 deletions(-) create mode 100644 strings/ctype-mb.c create mode 100644 strings/ctype-simple.c diff --git a/client/mysql.cc b/client/mysql.cc index 769b4490096..5f79dd6b8d7 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -924,14 +924,14 @@ static COMMANDS *find_command (char *name,char cmd_char) } else { - while (isspace(*name)) + while (my_isspace(system_charset_info,*name)) name++; if (strchr(name,';') || strstr(name,"\\g")) return ((COMMANDS *) 0); if ((end=strcont(name," \t"))) { len=(uint) (end - name); - while (isspace(*end)) + while (my_isspace(system_charset_info,*end)) end++; if (!*end) end=0; // no arguments to function @@ -943,7 +943,8 @@ static COMMANDS *find_command (char *name,char cmd_char) for (uint i= 0; commands[i].name; i++) { if (commands[i].func && - ((name && !my_casecmp(name,commands[i].name,len) && + ((name && + !my_strncasecmp(system_charset_info,name,commands[i].name,len) && !commands[i].name[len] && (!end || (end && commands[i].takes_params))) || !name && commands[i].cmd_char == cmd_char)) @@ -971,7 +972,8 @@ static bool add_line(String &buffer,char *line,char *in_string) for (pos=out=line ; (inchar= (uchar) *pos) ; pos++) { - if (isspace(inchar) && out == line && buffer.is_empty()) + if (my_isspace(default_charset_info,inchar) && out == line && + buffer.is_empty()) continue; #ifdef USE_MB int l; @@ -1039,7 +1041,7 @@ static bool add_line(String &buffer,char *line,char *in_string) } else if (!*in_string && (inchar == '#' || inchar == '-' && pos[1] == '-' && - isspace(pos[2]))) + my_isspace(system_charset_info,pos[2]))) break; // comment to end of line else { // Add found char to buffer @@ -1439,7 +1441,8 @@ com_go(String *buffer,char *line __attribute__((unused))) (void) com_print(buffer,0); if (skip_updates && - (buffer->length() < 4 || my_sortcmp(buffer->ptr(),"SET ",4))) + (buffer->length() < 4 || my_sortcmp(system_charset_info,buffer->ptr(), + "SET ",4))) { (void) put_info("Ignoring query to other database",INFO_INFO); return 0; @@ -1871,7 +1874,7 @@ com_tee(String *buffer, char *line __attribute__((unused))) if (status.batch) return 0; - while (isspace(*line)) + while (my_isspace(system_charset_info,*line)) line++; if (!(param = strchr(line, ' '))) // if outfile wasn't given, use the default { @@ -1884,10 +1887,11 @@ com_tee(String *buffer, char *line __attribute__((unused))) } else { - while (isspace(*param)) + while (my_isspace(system_charset_info,*param)) param++; end=strmake(file_name, param, sizeof(file_name)-1); - while (end > file_name && (isspace(end[-1]) || iscntrl(end[-1]))) + while (end > file_name && (my_isspace(system_charset_info,end[-1]) || + my_iscntrl(system_charset_info,end[-1]))) end--; end[0]=0; strmov(outfile, file_name); @@ -1930,7 +1934,7 @@ com_pager(String *buffer, char *line __attribute__((unused))) if (status.batch) return 0; /* Skip space from file name */ - while (isspace(*line)) + while (my_isspace(system_charset_info,*line)) line++; if (!(param = strchr(line, ' '))) // if pager was not given, use the default { @@ -1946,10 +1950,11 @@ com_pager(String *buffer, char *line __attribute__((unused))) } else { - while (isspace(*param)) + while (my_isspace(system_charset_info,*param)) param++; end=strmake(pager_name, param, sizeof(pager_name)-1); - while (end > pager_name && (isspace(end[-1]) || iscntrl(end[-1]))) + while (end > pager_name && (my_isspace(system_charset_info,end[-1]) || + my_iscntrl(system_charset_info,end[-1]))) end--; end[0]=0; strmov(pager, pager_name); @@ -2083,7 +2088,7 @@ com_connect(String *buffer, char *line) if (buffer) { - while (isspace(*line)) + while (my_isspace(system_charset_info,*line)) line++; strnmov(buff,line,sizeof(buff)-1); // Don't destroy history if (buff[0] == '\\') // Short command @@ -2129,15 +2134,16 @@ static int com_source(String *buffer, char *line) FILE *sql_file; /* Skip space from file name */ - while (isspace(*line)) + while (my_isspace(system_charset_info,*line)) line++; if (!(param = strchr(line, ' '))) // Skip command name return put_info("Usage: \\. | source ", INFO_ERROR, 0); - while (isspace(*param)) + while (my_isspace(system_charset_info,*param)) param++; end=strmake(source_name,param,sizeof(source_name)-1); - while (end > source_name && (isspace(end[-1]) || iscntrl(end[-1]))) + while (end > source_name && (my_isspace(system_charset_info,end[-1]) || + my_iscntrl(system_charset_info,end[-1]))) end--; end[0]=0; unpack_filename(source_name,source_name); @@ -2178,7 +2184,7 @@ com_use(String *buffer __attribute__((unused)), char *line) char *tmp; char buff[256]; - while (isspace(*line)) + while (my_isspace(system_charset_info,*line)) line++; strnmov(buff,line,sizeof(buff)-1); // Don't destroy history if (buff[0] == '\\') // Short command @@ -2463,7 +2469,7 @@ static void remove_cntrl(String &buffer) { char *start,*end; end=(start=(char*) buffer.ptr())+buffer.length(); - while (start < end && !isgraph(end[-1])) + while (start < end && !my_isgraph(system_charset_info,end[-1])) end--; buffer.length((uint) (end-start)); } diff --git a/client/mysqldump.c b/client/mysqldump.c index da708849992..bcb1195fb58 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -600,7 +600,7 @@ static my_bool test_if_special_chars(const char *str) { #if MYSQL_VERSION_ID >= 32300 for ( ; *str ; str++) - if (!isvar(*str) && *str != '$') + if (!my_isvar(system_charset_info,*str) && *str != '$') return 1; #endif return 0; @@ -1112,7 +1112,8 @@ static void dumpTable(uint numFields, char *table) /* change any strings ("inf","nan",..) into NULL */ char *ptr = row[i]; dynstr_append(&extended_row, - (!isalpha(*ptr)) ? ptr : "NULL"); + (!my_isalpha(system_charset_info,*ptr)) ? + ptr : "NULL"); } } else @@ -1144,9 +1145,11 @@ static void dumpTable(uint numFields, char *table) char *ptr = row[i]; if (opt_xml) fprintf(md_result_file, "\t\t<%s>%s\n", - field->name,!isalpha(*ptr) ?ptr: "NULL",field->name); + field->name, + !my_isalpha(system_charset_info,*ptr) ?ptr: "NULL",field->name); else - fputs((!isalpha(*ptr)) ? ptr : "NULL", md_result_file); + fputs((!my_isalpha(system_charset_info,*ptr)) ? + ptr : "NULL", md_result_file); } } else diff --git a/client/mysqltest.c b/client/mysqltest.c index 4ae74d129b9..dd71c3255a0 100644 --- a/client/mysqltest.c +++ b/client/mysqltest.c @@ -456,9 +456,9 @@ void init_parser() int hex_val(int c) { - if (isdigit(c)) + if (my_isdigit(system_charset_info,c)) return c - '0'; - else if ((c = tolower(c)) >= 'a' && c <= 'f') + else if ((c = my_tolower(system_charset_info,c)) >= 'a' && c <= 'f') return c - 'a' + 10; else return -1; @@ -569,7 +569,7 @@ VAR* var_get(const char* var_name, const char** var_name_end, my_bool raw, { const char* save_var_name = var_name, *end; end = (var_name_end) ? *var_name_end : 0; - while (isvar(*var_name) && var_name != end) + while (my_isvar(system_charset_info,*var_name) && var_name != end) ++var_name; if (var_name == save_var_name) { @@ -729,7 +729,7 @@ int do_server_op(struct st_query* q,const char* op) com_p=strmov(com_p,"_exec "); if (!*p) die("Missing server name in server_%s\n",op); - while (*p && !isspace(*p)) + while (*p && !my_isspace(system_charset_info,*p)) { *com_p++=*p++; } @@ -762,7 +762,7 @@ int do_require_version(struct st_query* q) if (!*p) die("Missing version argument in require_version\n"); ver_arg = p; - while (*p && !isspace(*p)) + while (*p && !my_isspace(system_charset_info,*p)) p++; *p = 0; ver_arg_len = p - ver_arg; @@ -792,7 +792,7 @@ int do_source(struct st_query* q) if (!*p) die("Missing file name in source\n"); name = p; - while (*p && !isspace(*p)) + while (*p && !my_isspace(system_charset_info,*p)) p++; *p = 0; @@ -1012,11 +1012,11 @@ int do_let(struct st_query* q) if (!*p) die("Missing variable name in let\n"); var_name = p; - while(*p && (*p != '=' || isspace(*p))) + while(*p && (*p != '=' || my_isspace(system_charset_info,*p))) p++; var_name_end = p; if (*p == '=') p++; - while(*p && isspace(*p)) + while(*p && my_isspace(system_charset_info,*p)) p++; var_val_start = p; return var_set(var_name, var_name_end, var_val_start, q->end); @@ -1047,7 +1047,7 @@ int do_sleep(struct st_query* q) char* p=q->first_argument; struct timeval t; int dec_mul = 1000000; - while(*p && isspace(*p)) p++; + while(*p && my_isspace(system_charset_info,*p)) p++; if (!*p) die("Missing argument in sleep\n"); t.tv_usec = 0; @@ -1067,7 +1067,7 @@ int do_sleep(struct st_query* q) else { t.tv_sec = atoi(p); - while(*p && *p != '.' && !isspace(*p)) + while(*p && *p != '.' && !my_isspace(system_charset_info,*p)) p++; if (*p == '.') { @@ -1099,7 +1099,7 @@ static void get_file_name(char *filename, struct st_query* q) char* p=q->first_argument; strnmov(filename, p, FN_REFLEN); /* Remove end space */ - while (p > filename && isspace(p[-1])) + while (p > filename && my_isspace(system_charset_info,p[-1])) p--; p[0]=0; } @@ -1185,7 +1185,7 @@ static char *get_string(char **to_ptr, char **from_ptr, if (*from != ' ' && *from) die("Wrong string argument in %s\n", q->query); - while (isspace(*from)) /* Point to next string */ + while (my_isspace(system_charset_info,*from)) /* Point to next string */ from++; *to =0; /* End of string marker */ @@ -1243,7 +1243,7 @@ static void get_replace(struct st_query *q) insert_pointer_name(&to_array,to); } for (i=1,pos=word_end_chars ; i < 256 ; i++) - if (isspace(i)) + if (my_isspace(system_charset_info,i)) *pos++=i; *pos=0; /* End pointer */ if (!(glob_replace=init_replace((char**) from_array.typelib.type_names, @@ -1278,7 +1278,7 @@ int select_connection(struct st_query* q) if (!*p) die("Missing connection name in connect\n"); name = p; - while(*p && !isspace(*p)) + while(*p && !my_isspace(system_charset_info,*p)) p++; *p = 0; @@ -1304,7 +1304,7 @@ int close_connection(struct st_query* q) if (!*p) die("Missing connection name in connect\n"); name = p; - while(*p && !isspace(*p)) + while(*p && !my_isspace(system_charset_info,*p)) p++; *p = 0; @@ -1340,11 +1340,11 @@ int close_connection(struct st_query* q) char* safe_get_param(char* str, char** arg, const char* msg) { DBUG_ENTER("safe_get_param"); - while (*str && isspace(*str)) str++; + while (*str && my_isspace(system_charset_info,*str)) str++; *arg = str; for (; *str && *str != ',' && *str != ')' ; str++) { - if (isspace(*str)) *str = 0; + if (my_isspace(system_charset_info,*str)) *str = 0; } if (!*str) die(msg); @@ -1626,7 +1626,7 @@ int read_line(char* buf, int size) { state = R_COMMENT; } - else if (isspace(c)) + else if (my_isspace(system_charset_info,c)) { if (c == '\n') start_lineno= ++*lineno; /* Query hasn't started yet */ @@ -1752,7 +1752,7 @@ int read_query(struct st_query** q_ptr) { expected_errno = 0; p++; - for (;isdigit(*p);p++) + for (;my_isdigit(system_charset_info,*p);p++) expected_errno = expected_errno * 10 + *p - '0'; q->expected_errno[0] = expected_errno; q->expected_errno[1] = 0; @@ -1760,25 +1760,25 @@ int read_query(struct st_query** q_ptr) } } - while(*p && isspace(*p)) p++ ; + while(*p && my_isspace(system_charset_info,*p)) p++ ; if (*p == '@') { p++; p1 = q->record_file; - while (!isspace(*p) && + while (!my_isspace(system_charset_info,*p) && p1 < q->record_file + sizeof(q->record_file) - 1) *p1++ = *p++; *p1 = 0; } } - while (*p && isspace(*p)) p++; + while (*p && my_isspace(system_charset_info,*p)) p++; if (!(q->query_buf=q->query=my_strdup(p,MYF(MY_WME)))) die(NullS); /* Calculate first word and first argument */ - for (p=q->query; *p && !isspace(*p) ; p++) ; + for (p=q->query; *p && !my_isspace(system_charset_info,*p) ; p++) ; q->first_word_len = (uint) (p - q->query); - while (*p && isspace(*p)) p++; + while (*p && my_isspace(system_charset_info,*p)) p++; q->first_argument=p; q->end = strend(q->query); parser.read_lines++; diff --git a/client/sql_string.cc b/client/sql_string.cc index 3c5e481eaad..62b1812afb3 100644 --- a/client/sql_string.cc +++ b/client/sql_string.cc @@ -234,7 +234,7 @@ bool String::fill(uint32 max_length,char fill_char) void String::strip_sp() { - while (str_length && isspace(Ptr[str_length-1])) + while (str_length && my_isspace(str_charset,Ptr[str_length-1])) str_length--; } @@ -296,10 +296,10 @@ uint32 String::numchars() register uint32 n=0,mblen; register const char *mbstr=Ptr; register const char *end=mbstr+str_length; - if (use_mb(default_charset_info)) + if (use_mb(str_charset)) { while (mbstr < end) { - if ((mblen=my_ismbchar(default_charset_info, mbstr,end))) mbstr+=mblen; + if ((mblen=my_ismbchar(str_charset, mbstr,end))) mbstr+=mblen; else ++mbstr; ++n; } @@ -316,11 +316,11 @@ int String::charpos(int i,uint32 offset) register uint32 mblen; register const char *mbstr=Ptr+offset; register const char *end=Ptr+str_length; - if (use_mb(default_charset_info)) + if (use_mb(str_charset)) { if (i<=0) return i; while (i && mbstr < end) { - if ((mblen=my_ismbchar(default_charset_info, mbstr,end))) mbstr+=mblen; + if ((mblen=my_ismbchar(str_charset, mbstr,end))) mbstr+=mblen; else ++mbstr; --i; } @@ -361,6 +361,39 @@ skipp: return -1; } +/* + Search after a string without regarding to case + This needs to be replaced when we have character sets per string +*/ + +int String::strstr_case(const String &s,uint32 offset) +{ + if (s.length()+offset <= str_length) + { + if (!s.length()) + return ((int) offset); // Empty string is always found + + register const char *str = Ptr+offset; + register const char *search=s.ptr(); + const char *end=Ptr+str_length-s.length()+1; + const char *search_end=s.ptr()+s.length(); +skipp: + while (str != end) + { + if (str_charset->sort_order[*str++] == str_charset->sort_order[*search]) + { + register char *i,*j; + i=(char*) str; j=(char*) search+1; + while (j != search_end) + if (str_charset->sort_order[*i++] != + str_charset->sort_order[*j++]) + goto skipp; + return (int) (str-Ptr) -1; + } + } + } + return -1; +} /* ** Search string from end. Offset is offset to the end of string @@ -428,6 +461,44 @@ bool String::replace(uint32 offset,uint32 arg_length,const String &to) return FALSE; } +// added by Holyfoot for "geometry" needs +int String::reserve(uint32 space_needed, uint32 grow_by) +{ + if (Alloced_length < str_length + space_needed) + { + if (realloc(Alloced_length + max(space_needed, grow_by) - 1)) + return TRUE; + } + return FALSE; +} + +void String::qs_append(const char *str) +{ + int len = strlen(str); + memcpy(Ptr + str_length, str, len + 1); + str_length += len; +} + +void String::qs_append(double d) +{ + char *buff = Ptr + str_length; + sprintf(buff,"%.14g", d); + str_length += strlen(buff); +} + +void String::qs_append(double *d) +{ + double ld; + float8get(ld, d); + qs_append(ld); +} + +void String::qs_append(const char &c) +{ + Ptr[str_length] = c; + str_length += sizeof(c); +} + int sortcmp(const String *x,const String *y) { @@ -436,15 +507,15 @@ int sortcmp(const String *x,const String *y) uint32 x_len=x->length(),y_len=y->length(),len=min(x_len,y_len); #ifdef USE_STRCOLL - if (use_strcoll(default_charset_info)) + if (use_strcoll(x->str_charset)) { #ifndef CMP_ENDSPACE - while (x_len && isspace(s[x_len-1])) + while (x_len && my_isspace(x->str_charset,s[x_len-1])) x_len--; - while (y_len && isspace(t[y_len-1])) + while (y_len && my_isspace(x->str_charset,t[y_len-1])) y_len--; #endif - return my_strnncoll(default_charset_info, + return my_strnncoll(x->str_charset, (unsigned char *)s,x_len,(unsigned char *)t,y_len); } else @@ -454,9 +525,10 @@ int sortcmp(const String *x,const String *y) y_len-=len; while (len--) { - if (my_sort_order[(uchar) *s++] != my_sort_order[(uchar) *t++]) - return ((int) my_sort_order[(uchar) s[-1]] - - (int) my_sort_order[(uchar) t[-1]]); + if (x->str_charset->sort_order[(uchar) *s++] != + x->str_charset->sort_order[(uchar) *t++]) + return ((int) x->str_charset->sort_order[(uchar) s[-1]] - + (int) x->str_charset->sort_order[(uchar) t[-1]]); } #ifndef CMP_ENDSPACE /* Don't compare end space in strings */ @@ -465,14 +537,14 @@ int sortcmp(const String *x,const String *y) { const char *end=t+y_len; for (; t != end ; t++) - if (!isspace(*t)) + if (!my_isspace(x->str_charset,*t)) return -1; } else { const char *end=s+x_len; for (; s != end ; s++) - if (!isspace(*s)) + if (!my_isspace(x->str_charset,*s)) return 1; } return 0; @@ -520,11 +592,10 @@ String *copy_if_not_alloced(String *to,String *from,uint32 from_length) /* Make it easier to handle different charactersets */ #ifdef USE_MB -#define INC_PTR(A,B) A+=((use_mb_flag && \ - my_ismbchar(default_charset_info,A,B)) ? \ - my_ismbchar(default_charset_info,A,B) : 1) +#define INC_PTR(cs,A,B) A+=((use_mb_flag && \ + my_ismbchar(cs,A,B)) ? my_ismbchar(cs,A,B) : 1) #else -#define INC_PTR(A,B) A++ +#define INC_PTR(cs,A,B) A++ #endif /* @@ -535,14 +606,14 @@ String *copy_if_not_alloced(String *to,String *from,uint32 from_length) */ #ifdef LIKE_CMP_TOUPPER -#define likeconv(A) (uchar) toupper(A) +#define likeconv(s,A) (uchar) my_toupper(s,A) #else -#define likeconv(A) (uchar) my_sort_order[(uchar) (A)] +#define likeconv(s,A) (uchar) (s)->sort_order[(uchar) (A)] #endif -static int wild_case_compare(const char *str,const char *str_end, - const char *wildstr,const char *wildend, - char escape) +int wild_case_compare(CHARSET_INFO *cs, const char *str,const char *str_end, + const char *wildstr,const char *wildend, + char escape) { int result= -1; // Not found, using wildcards #ifdef USE_MB @@ -557,7 +628,7 @@ static int wild_case_compare(const char *str,const char *str_end, #ifdef USE_MB int l; if (use_mb_flag && - (l = my_ismbchar(default_charset_info, wildstr, wildend))) + (l = my_ismbchar(cs, wildstr, wildend))) { if (str+l > str_end || memcmp(str, wildstr, l) != 0) return 1; @@ -566,7 +637,7 @@ static int wild_case_compare(const char *str,const char *str_end, } else #endif - if (str == str_end || likeconv(*wildstr++) != likeconv(*str++)) + if (str == str_end || likeconv(cs,*wildstr++) != likeconv(cs,*str++)) return(1); // No match if (wildstr == wildend) return (str != str_end); // Match if both are at end @@ -576,9 +647,9 @@ static int wild_case_compare(const char *str,const char *str_end, { do { - if (str == str_end) // Skipp one char if possible + if (str == str_end) // Skip one char if possible return (result); - INC_PTR(str,str_end); + INC_PTR(cs,str,str_end); } while (++wildstr < wildend && *wildstr == wild_one); if (wildstr == wildend) break; @@ -595,7 +666,7 @@ static int wild_case_compare(const char *str,const char *str_end, { if (str == str_end) return (-1); - INC_PTR(str,str_end); + INC_PTR(cs,str,str_end); continue; } break; // Not a wild character @@ -613,10 +684,10 @@ static int wild_case_compare(const char *str,const char *str_end, int mblen; LINT_INIT(mblen); if (use_mb_flag) - mblen = my_ismbchar(default_charset_info, wildstr, wildend); + mblen = my_ismbchar(cs, wildstr, wildend); #endif - INC_PTR(wildstr,wildend); // This is compared trough cmp - cmp=likeconv(cmp); + INC_PTR(cs,wildstr,wildend); // This is compared trough cmp + cmp=likeconv(cs,cmp); do { #ifdef USE_MB @@ -634,26 +705,26 @@ static int wild_case_compare(const char *str,const char *str_end, break; } } - else if (!my_ismbchar(default_charset_info, str, str_end) && - likeconv(*str) == cmp) + else if (!my_ismbchar(cs, str, str_end) && + likeconv(cs,*str) == cmp) { str++; break; } - INC_PTR(str, str_end); + INC_PTR(cs,str, str_end); } } else { #endif /* USE_MB */ - while (str != str_end && likeconv(*str) != cmp) + while (str != str_end && likeconv(cs,*str) != cmp) str++; if (str++ == str_end) return (-1); #ifdef USE_MB } #endif { - int tmp=wild_case_compare(str,str_end,wildstr,wildend,escape); + int tmp=wild_case_compare(cs,str,str_end,wildstr,wildend,escape); if (tmp <= 0) return (tmp); } @@ -667,17 +738,23 @@ static int wild_case_compare(const char *str,const char *str_end, int wild_case_compare(String &match,String &wild, char escape) { - return wild_case_compare(match.ptr(),match.ptr()+match.length(), - wild.ptr(), wild.ptr()+wild.length(),escape); + DBUG_ENTER("wild_case_compare"); + DBUG_PRINT("enter",("match='%s', wild='%s', escape='%c'" + ,match.ptr(),wild.ptr(),escape)); + DBUG_RETURN(wild_case_compare(match.str_charset,match.ptr(),match.ptr()+match.length(), + wild.ptr(), wild.ptr()+wild.length(),escape)); } /* ** The following is used when using LIKE on binary strings */ -static int wild_compare(const char *str,const char *str_end, - const char *wildstr,const char *wildend,char escape) +int wild_compare(const char *str,const char *str_end, + const char *wildstr,const char *wildend,char escape) { + DBUG_ENTER("wild_compare"); + DBUG_PRINT("enter",("str='%s', str_end='%s', wildstr='%s', wildend='%s', escape='%c'" + ,str,str_end,wildstr,wildend,escape)); int result= -1; // Not found, using wildcards while (wildstr != wildend) { @@ -686,17 +763,21 @@ static int wild_compare(const char *str,const char *str_end, if (*wildstr == escape && wildstr+1 != wildend) wildstr++; if (str == str_end || *wildstr++ != *str++) - return(1); + { + DBUG_RETURN(1); + } if (wildstr == wildend) - return (str != str_end); // Match if both are at end + { + DBUG_RETURN(str != str_end); // Match if both are at end + } result=1; // Found an anchor char } if (*wildstr == wild_one) { do { - if (str == str_end) // Skipp one char if possible - return (result); + if (str == str_end) // Skip one char if possible + DBUG_RETURN(result); str++; } while (*++wildstr == wild_one && wildstr != wildend); if (wildstr == wildend) @@ -713,17 +794,22 @@ static int wild_compare(const char *str,const char *str_end, if (*wildstr == wild_one) { if (str == str_end) - return (-1); + { + DBUG_RETURN(-1); + } str++; continue; } break; // Not a wild character } if (wildstr == wildend) - return(0); // Ok if wild_many is last + { + DBUG_RETURN(0); // Ok if wild_many is last + } if (str == str_end) - return -1; - + { + DBUG_RETURN(-1); + } char cmp; if ((cmp= *wildstr) == escape && wildstr+1 != wildend) cmp= *++wildstr; @@ -732,22 +818,32 @@ static int wild_compare(const char *str,const char *str_end, { while (str != str_end && *str != cmp) str++; - if (str++ == str_end) return (-1); + if (str++ == str_end) + { + DBUG_RETURN(-1); + } { int tmp=wild_compare(str,str_end,wildstr,wildend,escape); if (tmp <= 0) - return (tmp); + { + DBUG_RETURN(tmp); + } } } while (str != str_end && wildstr[0] != wild_many); - return(-1); + DBUG_RETURN(-1); } } - return (str != str_end ? 1 : 0); + DBUG_RETURN(str != str_end ? 1 : 0); } int wild_compare(String &match,String &wild, char escape) { - return wild_compare(match.ptr(),match.ptr()+match.length(), - wild.ptr(), wild.ptr()+wild.length(),escape); + DBUG_ENTER("wild_compare"); + DBUG_PRINT("enter",("match='%s', wild='%s', escape='%c'" + ,match.ptr(),wild.ptr(),escape)); + DBUG_RETURN(wild_compare(match.ptr(),match.ptr()+match.length(), + wild.ptr(), wild.ptr()+wild.length(),escape)); } + + diff --git a/client/sql_string.h b/client/sql_string.h index cffe78936a0..811e49a0d02 100644 --- a/client/sql_string.h +++ b/client/sql_string.h @@ -24,31 +24,57 @@ #define NOT_FIXED_DEC 31 #endif +class String; +int sortcmp(const String *a,const String *b); +int stringcmp(const String *a,const String *b); +String *copy_if_not_alloced(String *a,String *b,uint32 arg_length); +int wild_case_compare(String &match,String &wild,char escape); +int wild_compare(String &match,String &wild,char escape); + class String { char *Ptr; uint32 str_length,Alloced_length; bool alloced; + CHARSET_INFO *str_charset; public: String() - { Ptr=0; str_length=Alloced_length=0; alloced=0; } + { + Ptr=0; str_length=Alloced_length=0; alloced=0; + str_charset=default_charset_info; + } String(uint32 length_arg) - { alloced=0; Alloced_length=0; (void) real_alloc(length_arg); } + { + alloced=0; Alloced_length=0; (void) real_alloc(length_arg); + str_charset=default_charset_info; + } String(const char *str) - { Ptr=(char*) str; str_length=(uint) strlen(str); Alloced_length=0; alloced=0;} + { + Ptr=(char*) str; str_length=(uint) strlen(str); Alloced_length=0; alloced=0; + str_charset=default_charset_info; + } String(const char *str,uint32 len) - { Ptr=(char*) str; str_length=len; Alloced_length=0; alloced=0;} + { + Ptr=(char*) str; str_length=len; Alloced_length=0; alloced=0; + str_charset=default_charset_info; + } String(char *str,uint32 len) - { Ptr=(char*) str; Alloced_length=str_length=len; alloced=0;} + { + Ptr=(char*) str; Alloced_length=str_length=len; alloced=0; + str_charset=default_charset_info; + } String(const String &str) - { Ptr=str.Ptr ; str_length=str.str_length ; - Alloced_length=str.Alloced_length; alloced=0; } - + { + Ptr=str.Ptr ; str_length=str.str_length ; + Alloced_length=str.Alloced_length; alloced=0; + str_charset=str.str_charset; + } static void *operator new(size_t size) { return (void*) sql_alloc((uint) size); } static void operator delete(void *ptr_arg,size_t size) /*lint -e715 */ { sql_element_free(ptr_arg); } ~String() { free(); } + inline CHARSET_INFO *charset() const { return str_charset; } inline uint32 length() const { return str_length;} inline uint32 alloced_length() const { return Alloced_length;} inline char& operator [] (uint32 i) const { return Ptr[i]; } @@ -124,7 +150,7 @@ public: char *new_ptr; if (!(new_ptr=(char*) my_realloc(Ptr,arg_length,MYF(0)))) { - (void) my_free(Ptr,MYF(0)); + Alloced_length = 0; real_alloc(arg_length); } else @@ -153,6 +179,7 @@ public: bool append(const char *s,uint32 arg_length=0); bool append(IO_CACHE* file, uint32 arg_length); int strstr(const String &search,uint32 offset=0); // Returns offset to substring or -1 + int strstr_case(const String &s,uint32 offset=0); int strrstr(const String &search,uint32 offset=0); // Returns offset to substring or -1 bool replace(uint32 offset,uint32 arg_length,const String &to); inline bool append(char chr) @@ -171,8 +198,8 @@ public: } bool fill(uint32 max_length,char fill); void strip_sp(); - inline void caseup() { ::caseup(Ptr,str_length); } - inline void casedn() { ::casedn(Ptr,str_length); } + inline void caseup() { my_caseup(str_charset,Ptr,str_length); } + inline void casedn() { my_casedn(str_charset,Ptr,str_length); } friend int sortcmp(const String *a,const String *b); friend int stringcmp(const String *a,const String *b); friend String *copy_if_not_alloced(String *a,String *b,uint32 arg_length); @@ -180,4 +207,49 @@ public: friend int wild_compare(String &match,String &wild,char escape); uint32 numchars(); int charpos(int i,uint32 offset=0); + +// added by Holyfoot for "geometry" needs + int reserve(uint32 space_needed) + { + return realloc(str_length + space_needed); + } + int reserve(uint32 space_needed, uint32 grow_by); + +// these append operations do NOT check alloced memory +// q_*** methods writes values of parameters itself +// qs_*** methods writes string representation of value + void q_append(const char &c) + { + Ptr[str_length++] = c; + } + void q_append(const uint32 &n) + { + int4store(Ptr + str_length, n); + str_length += 4; + } + void q_append(double d) + { + float8store(Ptr + str_length, d); + str_length += 8; + } + void q_append(double *d) + { + float8store(Ptr + str_length, *d); + str_length += 8; + } + void q_append(const char *data, uint32 data_len) + { + memcpy(Ptr + str_length, data, data_len); + str_length += data_len; + } + + void WriteAtPosition(int position, uint32 value) + { + int4store(Ptr + position,value); + } + + void qs_append(const char *str); + void qs_append(double d); + void qs_append(double *d); + void qs_append(const char &c); }; diff --git a/extra/mysql_install.c b/extra/mysql_install.c index 1fa62f35b7e..3f716dccef5 100644 --- a/extra/mysql_install.c +++ b/extra/mysql_install.c @@ -155,7 +155,7 @@ static int get_answer(QUESTION_WIDGET* w) char c; if (!fgets(buf,sizeof(buf),w->in)) die("Failed fgets on input stream"); - switch ((c=tolower(*buf))) + switch ((c=my_tolower(system_charset_info,*buf))) { case '\n': return w->default_ind; diff --git a/extra/replace.c b/extra/replace.c index 41312f5e3d4..5826586988a 100644 --- a/extra/replace.c +++ b/extra/replace.c @@ -113,7 +113,7 @@ char *argv[]; exit(1); for (i=1,pos=word_end_chars ; i < 256 ; i++) - if (isspace(i)) + if (my_isspace(system_charset_info,i)) *pos++=i; *pos=0; if (!(replace=init_replace((char**) from.typelib.type_names, diff --git a/extra/resolve_stack_dump.c b/extra/resolve_stack_dump.c index 6c2ddf66027..7d1d125ec7e 100644 --- a/extra/resolve_stack_dump.c +++ b/extra/resolve_stack_dump.c @@ -178,9 +178,9 @@ trace dump and specify the path to it with -s or --symbols-file"); static uchar hex_val(char c) { uchar l; - if(isdigit(c)) + if(my_isdigit(system_charset_info,c)) return c - '0'; - l = tolower(c); + l = my_tolower(system_charset_info,c); if(l < 'a' || l > 'f') return HEX_INVALID; return (uchar)10 + ((uchar)c - (uchar)'a'); @@ -206,10 +206,10 @@ static int init_sym_entry(SYM_ENTRY* se, char* buf) if(!se->addr) return -1; - while(isspace(*buf++)) + while ( my_isspace(system_charset_info,*buf++)) /* empty */; - while(isspace(*buf++)) + while (my_isspace(system_charset_info,*buf++)) /* empty - skip more space */; --buf; /* now we are on the symbol */ @@ -293,7 +293,7 @@ static void do_resolve() while(fgets(buf, sizeof(buf), fp_dump)) { p = buf; - while(isspace(*p)) + while(my_isspace(system_charset_info,*p)) ++p; /* skip space */; diff --git a/extra/resolveip.c b/extra/resolveip.c index 2d21d5c672c..20630d8414d 100644 --- a/extra/resolveip.c +++ b/extra/resolveip.c @@ -128,7 +128,7 @@ int main(int argc, char **argv) { ip = *argv++; - if (isdigit(ip[0])) + if (my_isdigit(system_charset_info,ip[0])) { taddr = inet_addr(ip); if (taddr == htonl(INADDR_BROADCAST)) diff --git a/heap/hp_hash.c b/heap/hp_hash.c index e29e51d2b75..519779d330d 100644 --- a/heap/hp_hash.c +++ b/heap/hp_hash.c @@ -173,7 +173,7 @@ ulong _hp_hashnr(register HP_KEYDEF *keydef, register const byte *key) for (; pos < (uchar*) key ; pos++) { nr^=(ulong) ((((uint) nr & 63)+nr2) * - ((uint) my_sort_order[(uint) *pos])) + (nr << 8); + ((uint) default_charset_info->sort_order[(uint) *pos])) + (nr << 8); nr2+=3; } } @@ -212,7 +212,7 @@ ulong _hp_rec_hashnr(register HP_KEYDEF *keydef, register const byte *rec) for (; pos < end ; pos++) { nr^=(ulong) ((((uint) nr & 63)+nr2)* - ((uint) my_sort_order[(uint) *pos]))+ (nr << 8); + ((uint) default_charset_info->sort_order[(uint) *pos]))+ (nr << 8); nr2+=3; } } @@ -343,7 +343,7 @@ int _hp_rec_key_cmp(HP_KEYDEF *keydef, const byte *rec1, const byte *rec2) } if (seg->type == HA_KEYTYPE_TEXT) { - if (my_sortcmp(rec1+seg->start,rec2+seg->start,seg->length)) + if (my_sortcmp(default_charset_info,rec1+seg->start,rec2+seg->start,seg->length)) return 1; } else @@ -375,7 +375,12 @@ int _hp_key_cmp(HP_KEYDEF *keydef, const byte *rec, const byte *key) } if (seg->type == HA_KEYTYPE_TEXT) { - if (my_sortcmp(rec+seg->start,key,seg->length)) + /* + BAR TODO: this will not use default_charset_info + I need Ram to apply his HEAP patches with + CHARSET_INFO field in HP segments + */ + if (my_sortcmp(default_charset_info,rec+seg->start,key,seg->length)) return 1; } else diff --git a/include/m_ctype.h b/include/m_ctype.h index 9e29263ee54..43ae23e7ac3 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -39,11 +39,12 @@ typedef struct charset_info_st uchar *sort_order; uint strxfrm_multiply; - int (*strcoll)(const uchar *, const uchar *); - int (*strxfrm)(uchar *, const uchar *, int); - int (*strnncoll)(const uchar *, int, const uchar *, int); - int (*strnxfrm)(uchar *, const uchar *, int, int); - my_bool (*like_range)(const char *, uint, pchar, uint, + int (*strnncoll)(struct charset_info_st *, + const uchar *, uint, const uchar *, uint); + int (*strnxfrm)(struct charset_info_st *, + uchar *, uint, const uchar *, uint); + my_bool (*like_range)(struct charset_info_st *, + const char *, uint, pchar, uint, char *, char *, uint *, uint *); uint mbmaxlen; @@ -52,19 +53,21 @@ typedef struct charset_info_st int (*mbcharlen)(uint); /* Functions for case convertion */ - void (*caseup_str)(struct charset_info_st *, uchar *); - void (*casedn_str)(struct charset_info_st *, uchar *); - void (*caseup)(struct charset_info_st *, uchar *, uint); - void (*casedn)(struct charset_info_st *, uchar *, uint); + void (*caseup_str)(struct charset_info_st *, char *); + void (*casedn_str)(struct charset_info_st *, char *); + void (*caseup)(struct charset_info_st *, char *, uint); + void (*casedn)(struct charset_info_st *, char *, uint); /* Functions for case comparison */ - int (*strcasecmp)(struct charset_info_st *, const uchar *, const uchar *); - int (*strncasecmp)(struct charset_info_st *, const uchar *, const uchar *, uint); + int (*strcasecmp)(struct charset_info_st *, const char *, const char *); + int (*strncasecmp)(struct charset_info_st *, const char *, const char *, uint); + char max_sort_char; /* For LIKE otimization */ } CHARSET_INFO; /* strings/ctype.c */ extern CHARSET_INFO *default_charset_info; +extern CHARSET_INFO *system_charset_info; extern CHARSET_INFO *find_compiled_charset(uint cs_number); extern CHARSET_INFO *find_compiled_charset_by_name(const char *name); extern CHARSET_INFO compiled_charsets[]; @@ -75,34 +78,32 @@ extern const char *compiled_charset_name(uint charset_number); #define MY_CHARSET_CURRENT (default_charset_info->number) /* declarations for simple charsets */ -extern int my_strnxfrm_simple(CHARSET_INFO *, uchar *, const uchar *, int, int); -extern int my_strnncoll_simple(CHARSET_INFO *, const uchar *, int, const uchar *, int); +extern int my_strnxfrm_simple(CHARSET_INFO *, char *, uint, const char *, uint); +extern int my_strnncoll_simple(CHARSET_INFO *, const char *, uint, const char *, uint); /* Functions for 8bit */ -extern void my_caseup_str_8bit(CHARSET_INFO *, uchar *); -extern void my_casedn_str_8bit(CHARSET_INFO *, uchar *); -extern void my_caseup_8bit(CHARSET_INFO *, uchar *, uint); -extern void my_casedn_8bit(CHARSET_INFO *, uchar *, uint); +extern void my_caseup_str_8bit(CHARSET_INFO *, char *); +extern void my_casedn_str_8bit(CHARSET_INFO *, char *); +extern void my_caseup_8bit(CHARSET_INFO *, char *, uint); +extern void my_casedn_8bit(CHARSET_INFO *, char *, uint); -extern int my_strcasecmp_8bit(CHARSET_INFO * cs, const uchar *, const uchar *); -extern int my_strncasecmp_8bit(CHARSET_INFO * cs, const uchar *, const uchar *, uint); +extern int my_strcasecmp_8bit(CHARSET_INFO * cs, const char *, const char *); +extern int my_strncasecmp_8bit(CHARSET_INFO * cs, const char *, const char *, uint); /* Functions for multibyte charsets */ -extern void my_caseup_str_mb(CHARSET_INFO *, uchar *); -extern void my_casedn_str_mb(CHARSET_INFO *, uchar *); -extern void my_caseup_mb(CHARSET_INFO *, uchar *, uint); -extern void my_casedn_mb(CHARSET_INFO *, uchar *, uint); +extern void my_caseup_str_mb(CHARSET_INFO *, char *); +extern void my_casedn_str_mb(CHARSET_INFO *, char *); +extern void my_caseup_mb(CHARSET_INFO *, char *, uint); +extern void my_casedn_mb(CHARSET_INFO *, char *, uint); -extern int my_strcasecmp_mb(CHARSET_INFO * cs,const uchar *, const uchar *); -extern int my_strncasecmp_mb(CHARSET_INFO * cs,const uchar *, const uchar *t, uint); +extern int my_strcasecmp_mb(CHARSET_INFO * cs,const char *, const char *); +extern int my_strncasecmp_mb(CHARSET_INFO * cs,const char *, const char *t, uint); /* declarations for the big5 character set */ extern uchar ctype_big5[], to_lower_big5[], to_upper_big5[], sort_order_big5[]; -extern int my_strcoll_big5(const uchar *, const uchar *); -extern int my_strxfrm_big5(uchar *, const uchar *, int); -extern int my_strnncoll_big5(const uchar *, int, const uchar *, int); -extern int my_strnxfrm_big5(uchar *, const uchar *, int, int); -extern my_bool my_like_range_big5(const char *, uint, pchar, uint, +extern int my_strnncoll_big5(CHARSET_INFO *,const uchar *, uint, const uchar *, uint); +extern int my_strnxfrm_big5(CHARSET_INFO *,uchar *, uint, const uchar *, uint); +extern my_bool my_like_range_big5(CHARSET_INFO *,const char *, uint, pchar, uint, char *, char *, uint *, uint *); extern int ismbchar_big5(const char *, const char *); extern my_bool ismbhead_big5(uint); @@ -110,11 +111,10 @@ extern int mbcharlen_big5(uint); /* declarations for the czech character set */ extern uchar ctype_czech[], to_lower_czech[], to_upper_czech[], sort_order_czech[]; -extern int my_strcoll_czech(const uchar *, const uchar *); -extern int my_strxfrm_czech(uchar *, const uchar *, int); -extern int my_strnncoll_czech(const uchar *, int, const uchar *, int); -extern int my_strnxfrm_czech(uchar *, const uchar *, int, int); -extern my_bool my_like_range_czech(const char *, uint, pchar, uint, +extern int my_strnncoll_czech(CHARSET_INFO *, const uchar *, uint, const uchar *, uint); +extern int my_strnxfrm_czech(CHARSET_INFO *, uchar *, uint, const uchar *, uint); +extern my_bool my_like_range_czech(CHARSET_INFO *, + const char *, uint, pchar, uint, char *, char *, uint *, uint *); /* declarations for the euc_kr character set */ @@ -131,11 +131,9 @@ extern int mbcharlen_gb2312(uint); /* declarations for the gbk character set */ extern uchar ctype_gbk[], to_lower_gbk[], to_upper_gbk[], sort_order_gbk[]; -extern int my_strcoll_gbk(const uchar *, const uchar *); -extern int my_strxfrm_gbk(uchar *, const uchar *, int); -extern int my_strnncoll_gbk(const uchar *, int, const uchar *, int); -extern int my_strnxfrm_gbk(uchar *, const uchar *, int, int); -extern my_bool my_like_range_gbk(const char *, uint, pchar, uint, +extern int my_strnncoll_gbk(CHARSET_INFO *, const uchar *, uint, const uchar *, uint); +extern int my_strnxfrm_gbk(CHARSET_INFO *, uchar *, uint, const uchar *, uint); +extern my_bool my_like_range_gbk(CHARSET_INFO *, const char *, uint, pchar, uint, char *, char *, uint *, uint *); extern int ismbchar_gbk(const char *, const char *); extern my_bool ismbhead_gbk(uint); @@ -143,20 +141,16 @@ extern int mbcharlen_gbk(uint); /* declarations for the latin1_de character set */ extern uchar ctype_latin1_de[], to_lower_latin1_de[], to_upper_latin1_de[], sort_order_latin1_de[]; -extern int my_strcoll_latin1_de(const uchar *, const uchar *); -extern int my_strxfrm_latin1_de(uchar *, const uchar *, int); -extern int my_strnncoll_latin1_de(const uchar *, int, const uchar *, int); -extern int my_strnxfrm_latin1_de(uchar *, const uchar *, int, int); -extern my_bool my_like_range_latin1_de(const char *, uint, pchar, uint, +extern int my_strnncoll_latin1_de(CHARSET_INFO *, const uchar *, uint, const uchar *, uint); +extern int my_strnxfrm_latin1_de(CHARSET_INFO *, uchar *, uint, const uchar *, uint); +extern my_bool my_like_range_latin1_de(CHARSET_INFO *, const char *, uint, pchar, uint, char *, char *, uint *, uint *); /* declarations for the sjis character set */ extern uchar ctype_sjis[], to_lower_sjis[], to_upper_sjis[], sort_order_sjis[]; -extern int my_strcoll_sjis(const uchar *, const uchar *); -extern int my_strxfrm_sjis(uchar *, const uchar *, int); -extern int my_strnncoll_sjis(const uchar *, int, const uchar *, int); -extern int my_strnxfrm_sjis(uchar *, const uchar *, int, int); -extern my_bool my_like_range_sjis(const char *, uint, pchar, uint, +extern int my_strnncoll_sjis(CHARSET_INFO *, const uchar *, uint, const uchar *, uint); +extern int my_strnxfrm_sjis(CHARSET_INFO *, uchar *, uint, const uchar *, uint); +extern my_bool my_like_range_sjis(CHARSET_INFO *, const char *, uint, pchar, uint, char *, char *, uint *, uint *); extern int ismbchar_sjis(const char *, const char *); extern my_bool ismbhead_sjis(uint); @@ -164,11 +158,9 @@ extern int mbcharlen_sjis(uint); /* declarations for the tis620 character set */ extern uchar ctype_tis620[], to_lower_tis620[], to_upper_tis620[], sort_order_tis620[]; -extern int my_strcoll_tis620(const uchar *, const uchar *); -extern int my_strxfrm_tis620(uchar *, const uchar *, int); -extern int my_strnncoll_tis620(const uchar *, int, const uchar *, int); -extern int my_strnxfrm_tis620(uchar *, const uchar *, int, int); -extern my_bool my_like_range_tis620(const char *, uint, pchar, uint, +extern int my_strnncoll_tis620(CHARSET_INFO *, const uchar *, uint, const uchar *, uint); +extern int my_strnxfrm_tis620(CHARSET_INFO *, uchar *, uint, const uchar *, uint); +extern my_bool my_like_range_tis620(CHARSET_INFO *, const char *, uint, pchar, uint, char *, char *, uint *, uint *); /* declarations for the ujis character set */ @@ -214,32 +206,11 @@ extern int mbcharlen_ujis(uint); #define _B 0100 /* Blank */ #define _X 0200 /* heXadecimal digit */ -#ifndef HIDE_OLD_CTYPE -#define my_ctype (default_charset_info->ctype) -#define my_to_upper (default_charset_info->to_upper) -#define my_to_lower (default_charset_info->to_lower) -#define my_sort_order (default_charset_info->sort_order) - -#define _toupper(c) (char) my_to_upper[(uchar) (c)] -#define _tolower(c) (char) my_to_lower[(uchar) (c)] -#define toupper(c) (char) my_to_upper[(uchar) (c)] -#define tolower(c) (char) my_to_lower[(uchar) (c)] - -#define isalpha(c) ((my_ctype+1)[(uchar) (c)] & (_U | _L)) -#define isupper(c) ((my_ctype+1)[(uchar) (c)] & _U) -#define islower(c) ((my_ctype+1)[(uchar) (c)] & _L) -#define isdigit(c) ((my_ctype+1)[(uchar) (c)] & _N) -#define isxdigit(c) ((my_ctype+1)[(uchar) (c)] & _X) -#define isalnum(c) ((my_ctype+1)[(uchar) (c)] & (_U | _L | _N)) -#define isspace(c) ((my_ctype+1)[(uchar) (c)] & _S) -#define ispunct(c) ((my_ctype+1)[(uchar) (c)] & _P) -#define isprint(c) ((my_ctype+1)[(uchar) (c)] & (_P | _U | _L | _N | _B)) -#define isgraph(c) ((my_ctype+1)[(uchar) (c)] & (_P | _U | _L | _N)) -#define iscntrl(c) ((my_ctype+1)[(uchar) (c)] & _C) -#endif #define isascii(c) (!((c) & ~0177)) #define toascii(c) ((c) & 0177) +#define tocntrl(c) ((c) & 31) +#define toprint(c) ((c) | 64) #ifdef ctype #undef ctype @@ -259,26 +230,28 @@ extern int mbcharlen_ujis(uint); #define my_isgraph(s, c) (((s)->ctype+1)[(uchar) (c)] & (_P | _U | _L | _N)) #define my_iscntrl(s, c) (((s)->ctype+1)[(uchar) (c)] & _C) -#define use_strcoll(s) ((s)->strcoll != NULL) -#define MY_STRXFRM_MULTIPLY (default_charset_info->strxfrm_multiply) -#define my_strnxfrm(s, a, b, c, d) ((s)->strnxfrm((a), (b), (c), (d))) -#define my_strnncoll(s, a, b, c, d) ((s)->strnncoll((a), (b), (c), (d))) -#define my_strxfrm(s, a, b, c, d) ((s)->strnxfrm((a), (b), (c))) -#define my_strcoll(s, a, b) ((s)->strcoll((a), (b))) +/* Some macros that should be cleaned up a little */ +#define my_isvar(s,c) (my_isalnum(s,c) || (c) == '_') +#define my_isvar_start(s,c) (my_isalpha(s,c) || (c) == '_') + +#define use_strcoll(s) ((s)->strnncoll != NULL) +#define my_strnxfrm(s, a, b, c, d) ((s)->strnxfrm((s), (a), (b), (c), (d))) +#define my_strnncoll(s, a, b, c, d) ((s)->strnncoll((s), (a), (b), (c), (d))) #define my_like_range(s, a, b, c, d, e, f, g, h) \ - ((s)->like_range((a), (b), (c), (d), (e), (f), (g), (h))) + ((s)->like_range((s), (a), (b), (c), (d), (e), (f), (g), (h))) #define use_mb(s) ((s)->ismbchar != NULL) -#define MBMAXLEN (default_charset_info->mbmaxlen) #define my_ismbchar(s, a, b) ((s)->ismbchar((a), (b))) #define my_ismbhead(s, a) ((s)->ismbhead((a))) #define my_mbcharlen(s, a) ((s)->mbcharlen((a))) -/* Some macros that should be cleaned up a little */ -#define isvar(c) (isalnum(c) || (c) == '_') -#define isvar_start(c) (isalpha(c) || (c) == '_') -#define tocntrl(c) ((c) & 31) -#define toprint(c) ((c) | 64) +#define my_caseup(s, a, l) ((s)->caseup((s), (a), (l))) +#define my_casedn(s, a, l) ((s)->casedn((s), (a), (l))) +#define my_caseup_str(s, a) ((s)->caseup_str((s), (a))) +#define my_casedn_str(s, a) ((s)->casedn_str((s), (a))) +#define my_strcasecmp(s, a, b) ((s)->strcasecmp((s), (a), (b))) +#define my_strncasecmp(s, a, b, l) ((s)->strncasecmp((s), (a), (b), (l))) + /* XXX: still need to take care of this one */ #ifdef MY_CHARSET_TIS620 diff --git a/include/my_sys.h b/include/my_sys.h index 61f93d665cd..ab6ae170651 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -563,11 +563,7 @@ extern void allow_break(void); #endif extern void my_remember_signal(int signal_number,sig_handler (*func)(int)); -extern void caseup(my_string str,uint length); -extern void casedn(my_string str,uint length); -extern void caseup_str(my_string str); -extern void casedn_str(my_string str); -extern void case_sort(my_string str,uint length); +extern void case_sort(CHARSET_INFO *cs, my_string str,uint length); extern uint dirname_part(my_string to,const char *name); extern uint dirname_length(const char *name); #define base_name(A) (A+dirname_length(A)) @@ -592,18 +588,14 @@ extern my_string my_path(my_string to,const char *progname, extern my_string my_load_path(my_string to, const char *path, const char *own_path_prefix); extern int wild_compare(const char *str,const char *wildstr); -extern my_string my_strcasestr(const char *src,const char *suffix); -extern int my_strcasecmp(const char *s,const char *t); -extern int my_strsortcmp(const char *s,const char *t); -extern int my_casecmp(const char *s,const char *t,uint length); -extern int my_sortcmp(const char *s,const char *t,uint length); -extern int my_sortncmp(const char *s,uint s_len, const char *t,uint t_len); +extern int my_sortcmp(CHARSET_INFO *cs, const char *s,const char *t,uint length); +extern int my_sortncmp(CHARSET_INFO *cs, const char *s,uint s_len, const char *t,uint t_len); extern WF_PACK *wf_comp(my_string str); extern int wf_test(struct wild_file_pack *wf_pack,const char *name); extern void wf_end(struct wild_file_pack *buffer); extern size_s stripp_sp(my_string str); extern void get_date(my_string to,int timeflag,time_t use_time); -extern void soundex(my_string out_pntr, my_string in_pntr,pbool remove_garbage); +extern void soundex(CHARSET_INFO *, my_string out_pntr, my_string in_pntr,pbool remove_garbage); extern int init_record_cache(RECORD_CACHE *info,uint cachesize,File file, uint reclength,enum cache_type type, pbool use_async_io); diff --git a/isam/_key.c b/isam/_key.c index c0d667cb32d..0bedb428808 100644 --- a/isam/_key.c +++ b/isam/_key.c @@ -58,7 +58,7 @@ uint _nisam_make_key(register N_INFO *info, uint keynr, uchar *key, const char * #endif { if (type == HA_KEYTYPE_TEXT) - case_sort((byte*) key,length); + case_sort(default_charset_info,(byte*) key,length); } key+=length; } @@ -71,7 +71,7 @@ uint _nisam_make_key(register N_INFO *info, uint keynr, uchar *key, const char * #endif { if (type == HA_KEYTYPE_TEXT) - case_sort((byte*) key,(uint) keyseg->base.length); + case_sort(default_charset_info,(byte*) key,(uint) keyseg->base.length); } #ifdef NAN_TEST else if (type == HA_KEYTYPE_FLOAT) @@ -154,7 +154,7 @@ uint _nisam_pack_key(register N_INFO *info, uint keynr, uchar *key, uchar *old, #endif { if (type == HA_KEYTYPE_TEXT) - case_sort((byte*) key,length); + case_sort(default_charset_info,(byte*) key,length); } key+= length; } diff --git a/isam/_search.c b/isam/_search.c index 57787d61818..d76a8ce3097 100644 --- a/isam/_search.c +++ b/isam/_search.c @@ -515,11 +515,13 @@ int _nisam_key_cmp(register N_KEYSEG *keyseg, register uchar *a, register uchar if (*a++ != *b++) { a--; b--; - if (isdigit((char) *a) && isdigit((char) *b)) + if (my_isdigit(default_charset_info, (char) *a) && + my_isdigit(default_charset_info, (char) *b)) return ((int) *a - (int) *b); - if (*a == '-' || isdigit((char) *b)) + if (*a == '-' || my_isdigit(default_charset_info,(char) *b)) return (-1); - if (*b == '-' || *b++ == ' ' || isdigit((char) *a)) + if (*b == '-' || *b++ == ' ' || + my_isdigit(default_charset_info,(char) *a)) return (1); if (*a++ == ' ') return (-1); @@ -539,11 +541,13 @@ int _nisam_key_cmp(register N_KEYSEG *keyseg, register uchar *a, register uchar if (*a++ != *b++) { a--; b--; - if (isdigit((char) *a) && isdigit((char) *b)) + if (my_isdigit(default_charset_info,(char) *a) && + my_isdigit(default_charset_info,(char) *b)) return ((int) *a - (int) *b); - if (*a == '-' || isdigit((char) *b)) + if (*a == '-' || my_isdigit(default_charset_info,(char) *b)) return (-1); - if (*b == '-' || *b++ == ' ' || isdigit((char) *a)) + if (*b == '-' || *b++ == ' ' || + my_isdigit(default_charset_info,(char) *a)) return (1); if (*a++ == ' ') return -1; diff --git a/libmysql/Makefile.shared b/libmysql/Makefile.shared index 93cbf130f18..f9b69124dbe 100644 --- a/libmysql/Makefile.shared +++ b/libmysql/Makefile.shared @@ -41,7 +41,7 @@ mystringsobjects = strmov.lo strxmov.lo strxnmov.lo strnmov.lo \ strcend.lo bcmp.lo \ bchange.lo bmove.lo bmove_upp.lo longlong2str.lo \ strtoull.lo strtoll.lo llstr.lo \ - ctype.lo $(LTCHARSET_OBJS) + ctype.lo ctype-simple.lo ctype-mb.lo $(LTCHARSET_OBJS) mystringsextra= strto.c dbugobjects = dbug.lo # IT IS IN SAFEMALLOC.C sanity.lo mysysheaders = mysys_priv.h my_static.h diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index 4e4518bbe10..c3ef33296b1 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -1282,8 +1282,8 @@ STDCALL mysql_rpl_query_type(const char* q, int len) for(; q < q_end; ++q) { char c; - if (isalpha(c=*q)) - switch(tolower(c)) + if (my_isalpha(system_charset_info,c=*q)) + switch(my_tolower(system_charset_info,c)) { case 'i': /* insert */ case 'u': /* update or unlock tables */ @@ -1292,9 +1292,11 @@ STDCALL mysql_rpl_query_type(const char* q, int len) case 'a': /* alter */ return MYSQL_RPL_MASTER; case 'c': /* create or check */ - return tolower(q[1]) == 'h' ? MYSQL_RPL_ADMIN : MYSQL_RPL_MASTER ; + return my_tolower(system_charset_info,q[1]) == 'h' ? MYSQL_RPL_ADMIN : + MYSQL_RPL_MASTER; case 's': /* select or show */ - return tolower(q[1]) == 'h' ? MYSQL_RPL_ADMIN : MYSQL_RPL_SLAVE; + return my_tolower(system_charset_info,q[1]) == 'h' ? MYSQL_RPL_ADMIN : + MYSQL_RPL_SLAVE; case 'f': /* flush */ case 'r': /* repair */ case 'g': /* grant */ diff --git a/myisam/ft_dump.c b/myisam/ft_dump.c index 6308694b58e..c40145b87ed 100644 --- a/myisam/ft_dump.c +++ b/myisam/ft_dump.c @@ -106,7 +106,7 @@ int main(int argc,char *argv[]) #endif snprintf(buf,MAX_LEN,"%.*s",(int) keylen,info->lastkey+1); - casedn_str(buf); + my_casedn_str(default_charset_info,buf); total++; lengths[keylen]++; diff --git a/myisam/ft_parser.c b/myisam/ft_parser.c index c1b1190bcab..b241ae9be88 100644 --- a/myisam/ft_parser.c +++ b/myisam/ft_parser.c @@ -107,13 +107,13 @@ FT_WORD * ft_linearize(TREE *wtree) DBUG_RETURN(wlist); } -#define true_word_char(X) (isalnum(X) || (X)=='_') +#define true_word_char(s,X) (my_isalnum(s,X) || (X)=='_') #ifdef HYPHEN_IS_DELIM #define misc_word_char(X) ((X)=='\'') #else #define misc_word_char(X) ((X)=='\'' || (X)=='-') #endif -#define word_char(X) (true_word_char(X) || misc_word_char(X)) +#define word_char(s,X) (true_word_char(s,X) || misc_word_char(s,X)) /* returns: @@ -134,7 +134,11 @@ byte ft_get_word(byte **start, byte *end, FT_WORD *word, FTB_PARAM *param) { for (;docprev=' '; */ @@ -156,7 +160,7 @@ byte ft_get_word(byte **start, byte *end, FT_WORD *word, FTB_PARAM *param) mwc=0; for (word->pos=doc; docpos=doc; docbuf; } - while (!isspace(*endptr)) + while (!my_isspace(system_charset_info, *endptr)) *buf++= *endptr++; *buf=0; fb->p = endptr; @@ -540,11 +540,9 @@ void _print_csinfo(CHARSET_INFO *cs) printf("to_lower:\n"); _print_array(cs->to_lower, 256); printf("to_upper:\n"); _print_array(cs->to_upper, 256); printf("sort_order:\n"); _print_array(cs->sort_order, 256); - printf("collate: %3s (%d, %p, %p, %p, %p, %p)\n", + printf("collate: %3s (%d, %p, %p, %p)\n", cs->strxfrm_multiply ? "yes" : "no", cs->strxfrm_multiply, - cs->strcoll, - cs->strxfrm, cs->strnncoll, cs->strnxfrm, cs->like_range); diff --git a/mysys/default.c b/mysys/default.c index d3c1b3815eb..ad34d4b949d 100644 --- a/mysys/default.c +++ b/mysys/default.c @@ -247,7 +247,7 @@ static my_bool search_default_file(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, { line++; /* Ignore comment and empty lines */ - for (ptr=buff ; isspace(*ptr) ; ptr++ ) ; + for (ptr=buff ; my_isspace(system_charset_info,*ptr) ; ptr++ ) ; if (*ptr == '#' || *ptr == ';' || !*ptr) continue; if (*ptr == '[') /* Group name */ @@ -260,7 +260,7 @@ static my_bool search_default_file(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, name,line); goto err; } - for ( ; isspace(end[-1]) ; end--) ; /* Remove end space */ + for ( ; my_isspace(system_charset_info,end[-1]) ; end--) ;/* Remove end space */ end[0]=0; read_values=find_type(ptr,group,3) > 0; continue; @@ -276,7 +276,7 @@ static my_bool search_default_file(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, continue; if (!(end=value=strchr(ptr,'='))) end=strend(ptr); /* Option without argument */ - for ( ; isspace(end[-1]) ; end--) ; + for ( ; my_isspace(system_charset_info,end[-1]) ; end--) ; if (!value) { if (!(tmp=alloc_root(alloc,(uint) (end-ptr)+3))) @@ -289,9 +289,9 @@ static my_bool search_default_file(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, { /* Remove pre- and end space */ char *value_end; - for (value++ ; isspace(*value); value++) ; + for (value++ ; my_isspace(system_charset_info,*value); value++) ; value_end=strend(value); - for ( ; isspace(value_end[-1]) ; value_end--) ; + for ( ; my_isspace(system_charset_info,value_end[-1]) ; value_end--) ; if (value_end < value) /* Empty string */ value_end=value; if (!(tmp=alloc_root(alloc,(uint) (end-ptr)+3 + diff --git a/mysys/getvar.c b/mysys/getvar.c index bb470423c57..b5cc123f4b4 100644 --- a/mysys/getvar.c +++ b/mysys/getvar.c @@ -58,14 +58,15 @@ my_bool set_changeable_var(my_string str,CHANGEABLE_VAR *vars) longlong num; /* Skip end space from variable */ - for (var_end=end ; end > str && isspace(var_end[-1]) ; var_end--) ; + for (var_end=end ; end > str && my_isspace(system_charset_info, var_end[-1]) ; var_end--) ; length=(uint) (var_end-str); /* Skip start space from argument */ - for (end++ ; isspace(*end) ; end++) ; + for (end++ ; my_isspace(system_charset_info, *end) ; end++) ; for (var=vars,found=0 ; (name=var->name) ; var++) { - if (!my_casecmp(name,str,length)) + /* BAR TODO: remove system_charset_info */ + if (!my_strncasecmp(system_charset_info,name,str,length)) { found=var; found_count++; if (!name[length]) @@ -93,7 +94,7 @@ my_bool set_changeable_var(my_string str,CHANGEABLE_VAR *vars) num*=1024L*1024L; else if (endchar == 'g' || endchar == 'G') num*=1024L*1024L*1024L; - else if (!isdigit(endchar)) + else if (!my_isdigit(system_charset_info, endchar)) { fprintf(stderr,"Unknown prefix used for variable value '%s'\n",str); DBUG_RETURN(1); diff --git a/mysys/hash.c b/mysys/hash.c index 0b326ebc508..f1ce5052e4f 100644 --- a/mysys/hash.c +++ b/mysys/hash.c @@ -129,7 +129,9 @@ static uint calc_hashnr_caseup(const byte *key,uint length) register uint nr=1, nr2=4; while (length--) { - nr^= (((nr & 63)+nr2)*((uint) (uchar) toupper(*key++)))+ (nr << 8); + /* BAR TODO: remove default_charset_info */ + nr^= (((nr & 63)+nr2)* + ((uint) (uchar) my_toupper(default_charset_info, *key++)))+ (nr << 8); nr2+=3; } return((uint) nr); @@ -271,9 +273,10 @@ static int hashcmp(HASH *hash,HASH_LINK *pos,const byte *key,uint length) { uint rec_keylength; byte *rec_key=hash_key(hash,pos->data,&rec_keylength,1); + /* BAR TODO: remove default_charset_info */ return (length && length != rec_keylength) || (hash->flags & HASH_CASE_INSENSITIVE ? - my_casecmp(rec_key,key,rec_keylength) : + my_strncasecmp(default_charset_info, rec_key,key,rec_keylength) : memcmp(rec_key,key,rec_keylength)); } diff --git a/mysys/mf_casecnv.c b/mysys/mf_casecnv.c index 0302688ad1f..510a9b08f76 100644 --- a/mysys/mf_casecnv.c +++ b/mysys/mf_casecnv.c @@ -28,234 +28,50 @@ #include #endif - /* string to uppercase */ - -void caseup_str(my_string str) -{ -#ifdef USE_MB - if (use_mb(default_charset_info)) - { - register uint32 l; - register char *end=str+strlen(str); - while (*str) - { - if ((l=my_ismbchar(default_charset_info, str,end))) str+=l; - else *str=toupper(*str),++str; - } - } - else -#endif - while ((*str = toupper(*str)) != 0) - str++; -} /* caseup_str */ - - /* string to lowercase */ - -void casedn_str(my_string str) -{ -#ifdef USE_MB - if (use_mb(default_charset_info)) - { - register uint32 l; - register char *end=str+strlen(str); - while (*str) - { - if ((l=my_ismbchar(default_charset_info, str,end))) str+=l; - else *str=tolower(*str),++str; - } - } - else -#endif - while ((*str= tolower(*str)) != 0) - str++; -} /* casedn_str */ - - - /* to uppercase */ - -void caseup(my_string str, uint length) -{ -#ifdef USE_MB - if (use_mb(default_charset_info)) - { - register uint32 l; - register char *end=str+length; - while (str0 ; length--, str++) - *str= toupper(*str); -} /* caseup */ - - /* to lowercase */ - -void casedn(my_string str, uint length) -{ -#ifdef USE_MB - if (use_mb(default_charset_info)) - { - register uint32 l; - register char *end=str+length; - while (str0 ; length--, str++) - *str= tolower(*str); -} /* casedn */ /* to sort-string that can be compared to get text in order */ -void case_sort(my_string str, uint length) +void case_sort(CHARSET_INFO *cs, my_string str, uint length) { for ( ; length>0 ; length--, str++) - *str= (char) my_sort_order[(uchar) *str]; + *str= (char) cs->sort_order[(uchar) *str]; } /* case_sort */ - /* find string in another with no case_sensivity */ - -/* ToDo: This function should be modified to support multibyte charset. - However it is not used untill 3.23.5. - Wei He (hewei@mail.ied.ac.cn) -*/ - -my_string my_strcasestr(const char *str, const char *search) -{ - uchar *i,*j,*pos; - - pos=(uchar*) str; -skipp: - while (*pos != '\0') - { - if (toupper((uchar) *pos++) == toupper((uchar) *search)) - { - i=(uchar*) pos; j=(uchar*) search+1; - while (*j) - if (toupper(*i++) != toupper(*j++)) goto skipp; - return ((char*) pos-1); - } - } - return ((my_string) 0); -} /* strcstr */ - - - /* compare strings without regarding to case */ - -int my_strcasecmp(const char *s, const char *t) -{ -#ifdef USE_MB - if (use_mb(default_charset_info)) - { - register uint32 l; - register const char *end=s+strlen(s); - while (ssort_order[(uchar) *s++] != cs->sort_order[(uchar) *t++]) + return ((int) cs->sort_order[(uchar) s[-1]] - + (int) cs->sort_order[(uchar) t[-1]]); } return 0; } } -int my_sortncmp(const char *s, uint s_len, const char *t, uint t_len) +int my_sortncmp(CHARSET_INFO *cs, + const char *s, uint s_len, + const char *t, uint t_len) { #ifdef USE_STRCOLL - if (use_strcoll(default_charset_info)) - return my_strnncoll(default_charset_info, - (uchar *)s, s_len, (uchar *)t, t_len); + if (use_strcoll(cs)) + return my_strnncoll(cs, (uchar *)s, s_len, (uchar *)t, t_len); else #endif { uint len= min(s_len,t_len); while (len--) { - if (my_sort_order[(uchar) *s++] != my_sort_order[(uchar) *t++]) - return ((int) my_sort_order[(uchar) s[-1]] - - (int) my_sort_order[(uchar) t[-1]]); + if (cs->sort_order[(uchar) *s++] != cs->sort_order[(uchar) *t++]) + return ((int) cs->sort_order[(uchar) s[-1]] - + (int) cs->sort_order[(uchar) t[-1]]); } return (int) (s_len - t_len); } diff --git a/mysys/mf_dirname.c b/mysys/mf_dirname.c index 6523abcdb12..320917c8f3e 100644 --- a/mysys/mf_dirname.c +++ b/mysys/mf_dirname.c @@ -108,11 +108,5 @@ char *convert_dirname(char *to, const char *from, const char *from_end) *to++=FN_LIBCHAR; *to=0; } -#ifdef FN_UPPER_CASE - caseup_str(to_org); -#endif -#ifdef FN_LOWER_CASE - casedn_str(to_org); -#endif return to; /* Pointer to end of dir */ } /* convert_dirname */ diff --git a/mysys/mf_format.c b/mysys/mf_format.c index ab1904da162..e68f7df9d83 100644 --- a/mysys/mf_format.c +++ b/mysys/mf_format.c @@ -91,12 +91,6 @@ my_string fn_format(my_string to, const char *name, const char *dir, name=buff; } pos=strmake(strmov(to,dev),name,length); -#ifdef FN_UPPER_CASE - caseup_str(to); -#endif -#ifdef FN_LOWER_CASE - casedn_str(to); -#endif (void) strmov(pos,ext); /* Don't convert extension */ } /* diff --git a/mysys/mf_iocache2.c b/mysys/mf_iocache2.c index 127bf20e8fe..147850a10bc 100644 --- a/mysys/mf_iocache2.c +++ b/mysys/mf_iocache2.c @@ -249,7 +249,7 @@ uint my_b_vprintf(IO_CACHE *info, const char* fmt, va_list args) /* Found one '%' */ } /* Skipp if max size is used (to be compatible with printf) */ - while (isdigit(*fmt) || *fmt == '.' || *fmt == '-') + while (my_isdigit(system_charset_info, *fmt) || *fmt == '.' || *fmt == '-') fmt++; if (*fmt == 's') /* String parameter */ { diff --git a/mysys/mf_soundex.c b/mysys/mf_soundex.c index 4f7aa7da601..8ecd95137b0 100644 --- a/mysys/mf_soundex.c +++ b/mysys/mf_soundex.c @@ -34,12 +34,12 @@ #include #include "my_static.h" -static char get_scode(char **ptr,pbool remove_garbage); +static char get_scode(CHARSET_INFO * cs, char **ptr,pbool remove_garbage); /* outputed string is 4 byte long */ /* out_pntr can be == in_pntr */ -void soundex(register my_string out_pntr, my_string in_pntr, +void soundex(CHARSET_INFO * cs,register my_string out_pntr, my_string in_pntr, pbool remove_garbage) { char ch,last_ch; @@ -47,11 +47,11 @@ void soundex(register my_string out_pntr, my_string in_pntr, if (remove_garbage) { - while (*in_pntr && isspace(*in_pntr)) /* Skipp pre-space */ + while (*in_pntr && my_isspace(cs,*in_pntr)) /* Skipp pre-space */ in_pntr++; } - *out_pntr++ = toupper(*in_pntr); /* Copy first letter */ - last_ch = get_scode(&in_pntr,0); /* code of the first letter */ + *out_pntr++ = my_toupper(cs,*in_pntr);/* Copy first letter */ + last_ch = get_scode(cs,&in_pntr,0); /* code of the first letter */ /* for the first 'double-letter */ /* check. */ end=out_pntr+3; /* Loop on input letters until */ @@ -59,7 +59,7 @@ void soundex(register my_string out_pntr, my_string in_pntr, /* letter code count = 3 */ in_pntr++; - while (out_pntr < end && (ch = get_scode(&in_pntr,remove_garbage)) != 0) + while (out_pntr < end && (ch = get_scode(cs,&in_pntr,remove_garbage)) != 0) { in_pntr++; if ((ch != '0') && (ch != last_ch)) /* if not skipped or double */ @@ -81,19 +81,19 @@ void soundex(register my_string out_pntr, my_string in_pntr, else return 0 */ -static char get_scode(char **ptr, pbool remove_garbage) +static char get_scode(CHARSET_INFO * cs,char **ptr, pbool remove_garbage) { uchar ch; if (remove_garbage) { - while (**ptr && !isalpha(**ptr)) + while (**ptr && !my_isalpha(cs,**ptr)) (*ptr)++; } - ch=toupper(**ptr); + ch=my_toupper(cs,**ptr); if (ch < 'A' || ch > 'Z') { - if (isalpha(ch)) /* If exetended alfa (country spec) */ + if (my_isalpha(cs,ch)) /* If exetended alfa (country spec) */ return '0'; /* threat as vokal */ return 0; /* Can't map */ } diff --git a/mysys/mf_wfile.c b/mysys/mf_wfile.c index e9e12c72755..3c10de1f238 100644 --- a/mysys/mf_wfile.c +++ b/mysys/mf_wfile.c @@ -54,13 +54,6 @@ WF_PACK *wf_comp(my_string str) for (pos=str ; *pos ; pos++) ant+= test(*pos == ' ' || *pos == ','); -#ifdef FN_UPPER_CASE - caseup(str,(int) (pos-str)); -#endif -#ifdef FN_LOWER_CASE - casedn(str,(int) (pos-str)); -#endif - if ((ret= (WF_PACK*) my_malloc((uint) ant*(sizeof(my_string*)+2)+ sizeof(WF_PACK)+ (uint) strlen(str)+1, MYF(MY_WME))) diff --git a/mysys/my_error.c b/mysys/my_error.c index 61f8c16aba5..fd0cdcc2289 100644 --- a/mysys/my_error.c +++ b/mysys/my_error.c @@ -62,7 +62,7 @@ int my_error(int nr,myf MyFlags, ...) else { /* Skipp if max size is used (to be compatible with printf) */ - while (isdigit(*tpos) || *tpos == '.' || *tpos == '-') + while (my_isdigit(system_charset_info, *tpos) || *tpos == '.' || *tpos == '-') tpos++; if (*tpos == 'l') /* Skipp 'l' argument */ tpos++; diff --git a/mysys/my_getwd.c b/mysys/my_getwd.c index 22c6a4dbc2b..240b17ef87f 100644 --- a/mysys/my_getwd.c +++ b/mysys/my_getwd.c @@ -109,7 +109,8 @@ int my_setwd(const char *dir, myf MyFlags) uint drive,drives; pos++; /* Skipp FN_DEVCHAR */ - drive=(uint) (toupper(dir[0])-'A'+1); drives= (uint) -1; + drive=(uint) (my_toupper(system_charset_info,dir[0])-'A'+1); + drives= (uint) -1; if ((pos-(byte*) dir) == 2 && drive > 0 && drive < 32) { #ifdef OS2 diff --git a/mysys/my_init.c b/mysys/my_init.c index c4e6132aa9c..faf4e7f83f0 100644 --- a/mysys/my_init.c +++ b/mysys/my_init.c @@ -17,7 +17,6 @@ #include "mysys_priv.h" #include "my_static.h" #include "mysys_err.h" -#include "m_ctype.h" #include #include #ifdef THREAD @@ -50,7 +49,7 @@ my_bool my_init_done=0; static ulong atoi_octal(const char *str) { long int tmp; - while (*str && isspace(*str)) + while (*str && my_isspace(system_charset_info, *str)) str++; str2int(str, (*str == '0' ? 8 : 10), /* Octalt or decimalt */ diff --git a/mysys/my_vsnprintf.c b/mysys/my_vsnprintf.c index 0fe6eff24a6..519faa1de03 100644 --- a/mysys/my_vsnprintf.c +++ b/mysys/my_vsnprintf.c @@ -41,7 +41,7 @@ int my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap) } /* Skipp if max size is used (to be compatible with printf) */ fmt++; - while (isdigit(*fmt) || *fmt == '.' || *fmt == '-') + while (my_isdigit(system_charset_info,*fmt) || *fmt == '.' || *fmt == '-') fmt++; if (*fmt == 'l') fmt++; diff --git a/mysys/typelib.c b/mysys/typelib.c index e2c8eade5c8..e524f903b5d 100644 --- a/mysys/typelib.c +++ b/mysys/typelib.c @@ -47,7 +47,9 @@ int find_type(my_string x, TYPELIB *typelib, uint full_name) find=0; for (pos=0 ; (j=typelib->type_names[pos]) ; pos++) { - for (i=x ; *i && toupper(*i) == toupper(*j) ; i++, j++) ; + for (i=x ; + *i && my_toupper(system_charset_info,*i) == + my_toupper(system_charset_info,*j) ; i++, j++) ; if (! *j) { while (*i == ' ') diff --git a/sql/convert.cc b/sql/convert.cc index 7a06208759c..1b9a94462c7 100644 --- a/sql/convert.cc +++ b/sql/convert.cc @@ -433,7 +433,17 @@ CONVERT *get_convert_set(const char *name) { for (CONVERT **ptr=convert_tables ; *ptr ; ptr++) { - if (!my_strcasecmp((*ptr)->name,name)) + /* + BAR TODO: Monty's comments: + Why is this using system_charset_info ? + Isn't the character-set string given in the users default charset? + Please add a TODO note to the code that this has to be fixed when the user + will be able to cast strings to different character sets... + The current code will also not work if/when we introduce support for + 16 bit characters... + (I know that there is a LOT of changes to do if we ever want do this...) + */ + if (!my_strcasecmp(system_charset_info,(*ptr)->name,name)) return (*ptr); } return 0; diff --git a/sql/des_key_file.cc b/sql/des_key_file.cc index d9c924b5a3c..ca92e38279b 100644 --- a/sql/des_key_file.cc +++ b/sql/des_key_file.cc @@ -70,9 +70,10 @@ load_des_key_file(const char *file_name) { offset=(char) (offset - '0'); // Remove newline and possible other control characters - for (start=buf+1 ; isspace(*start) ; start++) ; + for (start=buf+1 ; my_isspace(system_charset_info, *start) ; start++) ; end=buf+length; - for (end=strend(buf) ; end > start && !isgraph(end[-1]) ; end--) ; + for (end=strend(buf) ; + end > start && !my_isgraph(system_charset_info, end[-1]) ; end--) ; if (start != end) { diff --git a/sql/field.cc b/sql/field.cc index 5d398d0ae5f..f2d9f51283a 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -68,7 +68,8 @@ const char field_separator=','; */ static bool -number_dec(struct st_decstr *sdec, const char *str, const char *end) +number_dec(CHARSET_INFO *cs, struct st_decstr *sdec, + const char *str, const char *end) { sdec->sign=sdec->extra=0; if (str == end) @@ -86,7 +87,7 @@ number_dec(struct st_decstr *sdec, const char *str, const char *end) str++; } const char *start=str; - while (str != end && isdigit(*str)) + while (str != end && my_isdigit(cs,*str)) str++; if (!(sdec->nr_length=(uint) (str-start))) sdec->extra=1; // We must put one 0 before . @@ -95,13 +96,13 @@ number_dec(struct st_decstr *sdec, const char *str, const char *end) { str++; start=str; - while (str != end && isdigit(*str)) + while (str != end && my_isdigit(cs,*str)) str++; } sdec->nr_dec=(uint) (str-start); if (current_thd->count_cuted_fields) { - while (str != end && isspace(*str)) + while (str != end && my_isspace(cs,*str)) str++; /* purecov: inspected */ if (str != end) { @@ -135,7 +136,8 @@ bool test_if_int(const char *str,int length) { const char *end=str+length; - while (str != end && isspace(*str)) // Allow start space + // Allow start space + while (str != end && my_isspace(system_charset_info,*str)) str++; /* purecov: inspected */ if (str != end && (*str == '-' || *str == '+')) str++; @@ -143,7 +145,7 @@ bool test_if_int(const char *str,int length) return 0; // Error: Empty string for ( ; str != end ; str++) { - if (!isdigit(*str)) + if (!my_isdigit(system_charset_info,*str)) { if (*str == '.') { // Allow '.0000' @@ -151,10 +153,10 @@ bool test_if_int(const char *str,int length) if (str == end) return 1; } - if (!isspace(*str)) + if (!my_isspace(system_charset_info,*str)) return 0; for (str++ ; str != end ; str++) - if (!isspace(*str)) + if (!my_isspace(system_charset_info,*str)) return 0; return 1; } @@ -165,7 +167,7 @@ bool test_if_int(const char *str,int length) static bool test_if_real(const char *str,int length) { - while (length && isspace(*str)) + while (length && my_isspace(system_charset_info,*str)) { // Allow start space length--; str++; } @@ -174,10 +176,10 @@ static bool test_if_real(const char *str,int length) if (*str == '+' || *str == '-') { length--; str++; - if (!length || !(isdigit(*str) || *str == '.')) + if (!length || !(my_isdigit(system_charset_info,*str) || *str == '.')) return 0; } - while (length && isdigit(*str)) + while (length && my_isdigit(system_charset_info,*str)) { length--; str++; } @@ -186,7 +188,7 @@ static bool test_if_real(const char *str,int length) if (*str == '.') { length--; str++; - while (length && isdigit(*str)) + while (length && my_isdigit(system_charset_info,*str)) { length--; str++; } @@ -195,18 +197,19 @@ static bool test_if_real(const char *str,int length) return 1; if (*str == 'E' || *str == 'e') { - if (length < 3 || (str[1] != '+' && str[1] != '-') || !isdigit(str[2])) + if (length < 3 || (str[1] != '+' && str[1] != '-') || + !my_isdigit(system_charset_info,str[2])) return 0; length-=3; str+=3; - while (length && isdigit(*str)) + while (length && my_isdigit(system_charset_info,*str)) { length--; str++; } } for ( ; length ; length--, str++) { // Allow end space - if (!isspace(*str)) + if (!my_isspace(system_charset_info,*str)) return 0; } return 1; @@ -405,7 +408,7 @@ void Field_decimal::store(const char *from,uint len) if ((tmp_dec= dec)) tmp_dec++; // Calculate pos of '.' - while (from != end && isspace(*from)) + while (from != end && my_isspace(system_charset_info,*from)) from++; if (zerofill) { @@ -416,7 +419,7 @@ void Field_decimal::store(const char *from,uint len) } else fyllchar=' '; - error=number_dec(&decstr,from,end); + error=number_dec(system_charset_info,&decstr,from,end); if (decstr.sign) { from++; @@ -479,7 +482,7 @@ void Field_decimal::store(const char *from,uint len) { if (*from != '0') { - if (!isspace(*from)) // Space is ok + if (!my_isspace(system_charset_info,*from)) // Space is ok current_thd->cuted_fields++; break; } @@ -603,8 +606,10 @@ int Field_decimal::cmp(const char *a_ptr,const char *b_ptr) for (end=a_ptr+field_length; a_ptr != end && (*a_ptr == *b_ptr || - ((isspace(*a_ptr) || *a_ptr == '+' || *a_ptr == '0') && - (isspace(*b_ptr) || *b_ptr == '+' || *b_ptr == '0'))); + ((my_isspace(system_charset_info,*a_ptr) || *a_ptr == '+' || + *a_ptr == '0') && + (my_isspace(system_charset_info,*b_ptr) || *b_ptr == '+' || + *b_ptr == '0'))); a_ptr++,b_ptr++) { if (*a_ptr == '-') // If both numbers are negative @@ -631,7 +636,7 @@ void Field_decimal::sort_string(char *to,uint length) char *str,*end; for (str=ptr,end=ptr+length; str != end && - ((isspace(*str) || *str == '+' || *str == '0')) ; + ((my_isspace(system_charset_info,*str) || *str == '+' || *str == '0')) ; str++) *to++=' '; @@ -643,7 +648,7 @@ void Field_decimal::sort_string(char *to,uint length) *to++=1; // Smaller than any number str++; while (str != end) - if (isdigit(*str)) + if (my_isdigit(system_charset_info,*str)) *to++= (char) ('9' - *str++); else *to++= *str++; @@ -1265,7 +1270,7 @@ void Field_medium::sql_type(String &res) const void Field_long::store(const char *from,uint len) { - while (len && isspace(*from)) + while (len && my_isspace(system_charset_info,*from)) { len--; from++; } @@ -1493,7 +1498,7 @@ void Field_long::sql_type(String &res) const void Field_longlong::store(const char *from,uint len) { - while (len && isspace(*from)) + while (len && my_isspace(system_charset_info,*from)) { // For easy error check len--; from++; } @@ -3306,7 +3311,7 @@ void Field_string::store(const char *from,uint length) const char *end=from+length; for (from+=field_length ; from != end ; from++) { - if (!isspace(*from)) + if (!my_isspace(field_charset,*from)) { current_thd->cuted_fields++; break; @@ -3377,7 +3382,7 @@ int Field_string::cmp(const char *a_ptr, const char *b_ptr) if (binary_flag) return memcmp(a_ptr,b_ptr,field_length); else - return my_sortcmp(a_ptr,b_ptr,field_length); + return my_sortcmp(field_charset,a_ptr,b_ptr,field_length); } void Field_string::sort_string(char *to,uint length) @@ -3387,17 +3392,17 @@ void Field_string::sort_string(char *to,uint length) else { #ifdef USE_STRCOLL - if (use_strcoll(default_charset_info)) { - uint tmp=my_strnxfrm(default_charset_info, - (unsigned char *)to, (unsigned char *) ptr, - length, field_length); + if (use_strcoll(field_charset)) { + uint tmp=my_strnxfrm(field_charset, + (unsigned char *)to, length, + (unsigned char *) ptr, field_length); if (tmp < length) bzero(to + tmp, length - tmp); } else #endif for (char *from=ptr,*end=ptr+length ; from != end ;) - *to++=(char) my_sort_order[(uint) (uchar) *from++]; + *to++=(char) field_charset->sort_order[(uint) (uchar) *from++]; } } @@ -3446,7 +3451,7 @@ int Field_string::pack_cmp(const char *a, const char *b, uint length) int cmp= memcmp(a,b,min(a_length,b_length)); return cmp ? cmp : (int) (a_length - b_length); } - return my_sortncmp(a,a_length, b,b_length); + return my_sortncmp(field_charset, a,a_length, b,b_length); } @@ -3463,7 +3468,7 @@ int Field_string::pack_cmp(const char *b, uint length) int cmp= memcmp(ptr,b,min(a_length,b_length)); return cmp ? cmp : (int) (a_length - b_length); } - return my_sortncmp(ptr,a_length, b, b_length); + return my_sortncmp(field_charset, ptr,a_length, b, b_length); } @@ -3568,7 +3573,7 @@ int Field_varstring::cmp(const char *a_ptr, const char *b_ptr) if (binary_flag) diff=memcmp(a_ptr+2,b_ptr+2,min(a_length,b_length)); else - diff=my_sortcmp(a_ptr+2,b_ptr+2,min(a_length,b_length)); + diff=my_sortcmp(field_charset, a_ptr+2,b_ptr+2,min(a_length,b_length)); return diff ? diff : (int) (a_length - b_length); } @@ -3580,10 +3585,10 @@ void Field_varstring::sort_string(char *to,uint length) else { #ifdef USE_STRCOLL - if (use_strcoll(default_charset_info)) - tot_length=my_strnxfrm(default_charset_info, - (unsigned char *) to, (unsigned char *)ptr+2, - length, tot_length); + if (use_strcoll(field_charset)) + tot_length=my_strnxfrm(field_charset, + (unsigned char *) to, length, + (unsigned char *)ptr+2, tot_length); else { #endif @@ -3591,7 +3596,7 @@ void Field_varstring::sort_string(char *to,uint length) if (tot_length > length) tot_length=length; for (char *from=ptr+2,*end=from+tot_length ; from != end ;) - *tmp++=(char) my_sort_order[(uint) (uchar) *from++]; + *tmp++=(char) field_charset->sort_order[(uint) (uchar) *from++]; #ifdef USE_STRCOLL } #endif @@ -3662,7 +3667,7 @@ int Field_varstring::pack_cmp(const char *a, const char *b, uint key_length) int cmp= memcmp(a,b,min(a_length,b_length)); return cmp ? cmp : (int) (a_length - b_length); } - return my_sortncmp(a,a_length, b,b_length); + return my_sortncmp(field_charset, a,a_length, b,b_length); } int Field_varstring::pack_cmp(const char *b, uint key_length) @@ -3683,7 +3688,7 @@ int Field_varstring::pack_cmp(const char *b, uint key_length) int cmp= memcmp(a,b,min(a_length,b_length)); return cmp ? cmp : (int) (a_length - b_length); } - return my_sortncmp(a,a_length, b,b_length); + return my_sortncmp(field_charset, a,a_length, b,b_length); } uint Field_varstring::packed_col_length(const char *ptr, uint length) @@ -3906,7 +3911,7 @@ int Field_blob::cmp(const char *a,uint32 a_length, const char *b, if (binary_flag) diff=memcmp(a,b,min(a_length,b_length)); else - diff=my_sortcmp(a,b,min(a_length,b_length)); + diff=my_sortcmp(field_charset, a,b,min(a_length,b_length)); return diff ? diff : (int) (a_length - b_length); } @@ -4063,11 +4068,11 @@ void Field_blob::sort_string(char *to,uint length) else { #ifdef USE_STRCOLL - if (use_strcoll(default_charset_info)) + if (use_strcoll(field_charset)) { - blob_length=my_strnxfrm(default_charset_info, - (unsigned char *)to,(unsigned char *)blob, - length,blob_org_length); + blob_length=my_strnxfrm(field_charset, + (unsigned char *)to, length, + (unsigned char *)blob, blob_org_length); if (blob_length >= length) return; to+=blob_length; @@ -4075,7 +4080,7 @@ void Field_blob::sort_string(char *to,uint length) else #endif for (char *end=blob+blob_length ; blob != end ;) - *to++=(char) my_sort_order[(uint) (uchar) *blob++]; + *to++=(char) field_charset->sort_order[(uint) (uchar) *blob++]; } bzero(to,length-blob_length); } @@ -4153,7 +4158,7 @@ int Field_blob::pack_cmp(const char *a, const char *b, uint key_length) int cmp= memcmp(a,b,min(a_length,b_length)); return cmp ? cmp : (int) (a_length - b_length); } - return my_sortncmp(a,a_length, b,b_length); + return my_sortncmp(field_charset, a,a_length, b,b_length); } @@ -4179,7 +4184,7 @@ int Field_blob::pack_cmp(const char *b, uint key_length) int cmp= memcmp(a,b,min(a_length,b_length)); return cmp ? cmp : (int) (a_length - b_length); } - return my_sortncmp(a,a_length, b,b_length); + return my_sortncmp(field_charset, a,a_length, b,b_length); } /* Create a packed key that will be used for storage from a MySQL row */ @@ -4290,14 +4295,16 @@ void Field_enum::store_type(ulonglong value) uint find_enum(TYPELIB *lib,const char *x, uint length) { const char *end=x+length; - while (end > x && isspace(end[-1])) + while (end > x && my_isspace(system_charset_info,end[-1])) end--; const char *i; const char *j; for (uint pos=0 ; (j=lib->type_names[pos]) ; pos++) { - for (i=x ; i != end && toupper(*i) == toupper(*j) ; i++, j++) ; + for (i=x ; i != end && + my_toupper(system_charset_info,*i) == + my_toupper(system_charset_info,*j) ; i++, j++) ; if (i == end && ! *j) return(pos+1); } @@ -4474,7 +4481,7 @@ void Field_enum::sql_type(String &res) const ulonglong find_set(TYPELIB *lib,const char *x,uint length) { const char *end=x+length; - while (end > x && isspace(end[-1])) + while (end > x && my_isspace(system_charset_info, end[-1])) end--; ulonglong found=0; @@ -4600,7 +4607,8 @@ bool Field_enum::eq_def(Field *field) if (typelib->count < from_lib->count) return 0; for (uint i=0 ; i < from_lib->count ; i++) - if (my_strcasecmp(typelib->type_names[i],from_lib->type_names[i])) + if (my_strcasecmp(field_charset, + typelib->type_names[i],from_lib->type_names[i])) return 0; return 1; } diff --git a/sql/field.h b/sql/field.h index 422e91768e6..cd1697fcf44 100644 --- a/sql/field.h +++ b/sql/field.h @@ -145,12 +145,7 @@ public: virtual void set_key_image(char *buff,uint length) { set_image(buff,length); } inline int cmp_image(char *buff,uint length) - { - if (binary()) - return memcmp(ptr,buff,length); - else - return my_casecmp(ptr,buff,length); - } + { return memcmp(ptr,buff,length); } inline longlong val_int_offset(uint row_offset) { ptr+=row_offset; @@ -241,6 +236,8 @@ public: class Field_str :public Field { +protected: + CHARSET_INFO *field_charset; public: Field_str(char *ptr_arg,uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, utype unireg_check_arg, @@ -248,12 +245,20 @@ public: struct st_table *table_arg) :Field(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, unireg_check_arg, field_name_arg, table_arg) - {} + { field_charset=default_charset_info; } Item_result result_type () const { return STRING_RESULT; } uint decimals() const { return NOT_FIXED_DEC; } friend class create_field; void make_field(Send_field *); uint size_of() const { return sizeof(*this); } + inline int cmp_image(char *buff,uint length) + { + if (binary()) + return memcmp(ptr,buff,length); + else + return my_strncasecmp(field_charset,ptr,buff,length); + } + }; diff --git a/sql/field_conv.cc b/sql/field_conv.cc index c7a6d778953..02be0365002 100644 --- a/sql/field_conv.cc +++ b/sql/field_conv.cc @@ -276,7 +276,7 @@ static void do_cut_string(Copy_field *copy) ptr != end ; ptr++) { - if (!isspace(*ptr)) + if (!my_isspace(system_charset_info, *ptr)) { current_thd->cuted_fields++; // Give a warning break; diff --git a/sql/filesort.cc b/sql/filesort.cc index a5f42d5731e..675cc294de4 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -513,9 +513,8 @@ static void make_sortkey(register SORTPARAM *param, from=param->tmp_buffer; } uint tmp_length=my_strnxfrm(default_charset_info, - to,(unsigned char *) from, - sort_field->length, - length); + to,sort_field->length, + (unsigned char *) from, length); if (tmp_length < sort_field->length) bzero((char*) to+tmp_length,sort_field->length-tmp_length); } @@ -527,7 +526,7 @@ static void make_sortkey(register SORTPARAM *param, memcpy(to,res->ptr(),length); bzero((char *)to+length,diff); if (!item->binary) - case_sort((char*) to,length); + case_sort(default_charset_info, (char*) to,length); #ifdef USE_STRCOLL } #endif @@ -925,7 +924,7 @@ sortlength(SORT_FIELD *sortorder, uint s_length) sortorder->length=sortorder->field->pack_length(); #ifdef USE_STRCOLL if (use_strcoll(default_charset_info) && !sortorder->field->binary()) - sortorder->length= sortorder->length*MY_STRXFRM_MULTIPLY; + sortorder->length= sortorder->length*default_charset_info->strxfrm_multiply; #endif } if (sortorder->field->maybe_null()) @@ -938,7 +937,7 @@ sortlength(SORT_FIELD *sortorder, uint s_length) sortorder->length=sortorder->item->max_length; #ifdef USE_STRCOLL if (use_strcoll(default_charset_info) && !sortorder->item->binary) - sortorder->length= sortorder->length*MY_STRXFRM_MULTIPLY; + sortorder->length= sortorder->length*default_charset_info->strxfrm_multiply; #endif break; case INT_RESULT: diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index 4cf06dfb731..d53b027a415 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -1194,7 +1194,10 @@ innobase_mysql_cmp( case FIELD_TYPE_STRING: case FIELD_TYPE_VAR_STRING: - ret = my_sortncmp((const char*) a, a_length, + // BAR TODO: Discuss with heikki.tuuri@innodb.com + // so that he sends CHARSET_INFO for the field to this function. + ret = my_sortncmp(default_charset_info, + (const char*) a, a_length, (const char*) b, b_length); if (ret < 0) { return(-1); diff --git a/sql/hostname.cc b/sql/hostname.cc index 7d4e4a8ca75..0b35f970c42 100644 --- a/sql/hostname.cc +++ b/sql/hostname.cc @@ -213,10 +213,10 @@ my_string ip_to_hostname(struct in_addr *in, uint *errors) /* Don't accept hostnames that starts with digits because they may be false ip:s */ - if (isdigit(name[0])) + if (my_isdigit(system_charset_info,name[0])) { char *pos; - for (pos= name+1 ; isdigit(*pos); pos++) ; + for (pos= name+1 ; my_isdigit(system_charset_info,*pos); pos++) ; if (*pos == '.') { DBUG_PRINT("error",("mysqld doesn't accept hostnames that starts with a number followed by a '.'")); diff --git a/sql/init.cc b/sql/init.cc index df06ddd41ef..fe80c282563 100644 --- a/sql/init.cc +++ b/sql/init.cc @@ -24,6 +24,7 @@ void unireg_init(ulong options) { uint i; double nr; + CHARSET_INFO *cs; DBUG_ENTER("unireg_init"); MYSYS_PROGRAM_DONT_USE_CURSES(); @@ -54,13 +55,16 @@ void unireg_init(ulong options) // The following is needed because of like optimization in select.cc - uchar max_char=my_sort_order[(uchar) max_sort_char]; - for (i = 0; i < 256; i++) + for (cs=compiled_charsets; cs->number; cs++) { - if ((uchar) my_sort_order[i] > max_char) + uchar max_char=cs->sort_order[(uchar) cs->max_sort_char]; + for (i = 0; i < 256; i++) { - max_char=(uchar) my_sort_order[i]; - max_sort_char= (char) i; + if ((uchar) cs->sort_order[i] > max_char) + { + max_char=(uchar) cs->sort_order[i]; + cs->max_sort_char= (char) i; + } } } thread_stack_min=thread_stack - STACK_MIN_SIZE; diff --git a/sql/item.cc b/sql/item.cc index c081fd9dd5f..0c241684474 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -50,7 +50,7 @@ void Item::set_name(char *str,uint length) name=str; // Used by AS else { - while (length && !isgraph(*str)) + while (length && !my_isgraph(system_charset_info,*str)) { // Fix problem with yacc length--; str++; @@ -62,7 +62,7 @@ void Item::set_name(char *str,uint length) bool Item::eq(const Item *item) const // Only doing this on conds { return type() == item->type() && name && item->name && - !my_strcasecmp(name,item->name); + !my_strcasecmp(system_charset_info,name,item->name); } /* diff --git a/sql/item_func.cc b/sql/item_func.cc index 65d4413b484..09e3aab08c6 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -991,7 +991,8 @@ longlong Item_func_find_in_set::val_int() const char *pos= f_pos; while (pos != f_end) { - if (toupper(*str) != toupper(*pos)) + if (my_toupper(find->charset(),*str) != + my_toupper(find->charset(),*pos)) goto not_found; str++; pos++; diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index cdf909e8c4d..de07f5b1ee7 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -42,7 +42,7 @@ uint nr_of_decimals(const char *str) if ((str=strchr(str,'.'))) { const char *start= ++str; - for ( ; isdigit(*str) ; str++) ; + for ( ; my_isdigit(system_charset_info,*str) ; str++) ; return (uint) (str-start); } return 0; @@ -1268,9 +1268,9 @@ extern "C" { extern const char *soundex_map; // In mysys/static.c } -static char get_scode(char *ptr) +static char get_scode(CHARSET_INFO *cs,char *ptr) { - uchar ch=toupper(*ptr); + uchar ch=my_toupper(cs,*ptr); if (ch < 'A' || ch > 'Z') { // Thread extended alfa (country spec) @@ -1292,21 +1292,21 @@ String *Item_func_soundex::val_str(String *str) char *to= (char *) tmp_value.ptr(); char *from= (char *) res->ptr(), *end=from+res->length(); - while (from != end && isspace(*from)) // Skip pre-space + while (from != end && my_isspace(str->charset(),*from)) // Skip pre-space from++; /* purecov: inspected */ if (from == end) return &empty_string; // No alpha characters. - *to++ = toupper(*from); // Copy first letter - last_ch = get_scode(from); // code of the first letter + *to++ = my_toupper(str->charset(),*from);// Copy first letter + last_ch = get_scode(str->charset(),from);// code of the first letter // for the first 'double-letter check. // Loop on input letters until // end of input (null) or output // letter code count = 3 for (from++ ; from < end ; from++) { - if (!isalpha(*from)) + if (!my_isalpha(str->charset(),*from)) continue; - ch=get_scode(from); + ch=get_scode(str->charset(),from); if ((ch != '0') && (ch != last_ch)) // if not skipped or double { *to++ = ch; // letter, copy to output diff --git a/sql/item_sum.cc b/sql/item_sum.cc index e8f16e3ed56..7ebeda19993 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -864,7 +864,8 @@ static int simple_raw_key_cmp(void* arg, byte* key1, byte* key2) static int simple_str_key_cmp(void* arg, byte* key1, byte* key2) { - return my_sortcmp((char*) key1, (char*) key2, *(uint*) arg); + /* BAR TODO: remove default_charset_info */ + return my_sortcmp(default_charset_info,(char*) key1, (char*) key2, *(uint*) arg); } /* diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index 8f55a02b020..b10054e11d2 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -49,16 +49,16 @@ bool get_interval_info(const char *str,uint length,uint count, { const char *end=str+length; uint i; - while (str != end && !isdigit(*str)) + while (str != end && !my_isdigit(system_charset_info,*str)) str++; for (i=0 ; i < count ; i++) { long value; - for (value=0; str != end && isdigit(*str) ; str++) + for (value=0; str != end && my_isdigit(system_charset_info,*str) ; str++) value=value*10L + (long) (*str - '0'); values[i]= value; - while (str != end && !isdigit(*str)) + while (str != end && !my_isdigit(system_charset_info,*str)) str++; if (str == end && i != count-1) { @@ -289,7 +289,7 @@ static bool get_interval_value(Item *args,interval_type int_type, /* record negative intervalls in t->neg */ str=res->ptr(); const char *end=str+res->length(); - while (str != end && isspace(*str)) + while (str != end && my_isspace(system_charset_info,*str)) str++; if (str != end && *str == '-') { diff --git a/sql/key.cc b/sql/key.cc index d2f483e3d73..a5d3d0a65b9 100644 --- a/sql/key.cc +++ b/sql/key.cc @@ -192,8 +192,9 @@ int key_cmp(TABLE *table,const byte *key,uint idx,uint key_length) if (!(key_part->key_type & (FIELDFLAG_NUMBER+FIELDFLAG_BINARY+ FIELDFLAG_PACK))) { - if (my_sortcmp((char*) key,(char*) table->record[0]+key_part->offset, - length)) + /* BAR TODO: I'm not sure this should be system_charset_info */ + if (my_sortcmp(system_charset_info,(char*) key, + (char*) table->record[0]+key_part->offset,length)) return 1; } else if (memcmp(key,table->record[0]+key_part->offset,length)) diff --git a/sql/log.cc b/sql/log.cc index 892780d3882..1a315ea9f9c 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -1208,7 +1208,7 @@ static bool test_if_number(register const char *str, while (*str++ == ' ') ; if (*--str == '-' || *str == '+') str++; - while (isdigit(*str) || (allow_wildcards && + while (my_isdigit(system_charset_info,*str) || (allow_wildcards && (*str == wild_many || *str == wild_one))) { flag=1; @@ -1217,7 +1217,7 @@ static bool test_if_number(register const char *str, if (*str == '.') { for (str++ ; - isdigit(*str) || + my_isdigit(system_charset_info,*str) || (allow_wildcards && (*str == wild_many || *str == wild_one)) ; str++, flag=1) ; } diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 924f85b0a89..728d6d7a35f 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -549,7 +549,7 @@ void open_log(MYSQL_LOG *log, const char *hostname, extern uint32 server_id; extern char *mysql_data_home,server_version[SERVER_VERSION_LENGTH], - max_sort_char, mysql_real_data_home[]; + mysql_real_data_home[]; extern my_string mysql_tmpdir; extern const char *first_keyword, *localhost, *delayed_user; extern ulong refresh_version,flush_version, thread_id,query_id,opened_tables, @@ -708,10 +708,10 @@ bool check_db_name(const char *db); bool check_column_name(const char *name); bool check_table_name(const char *name, uint length); char *get_field(MEM_ROOT *mem,TABLE *table,uint fieldnr); -int wild_case_compare(const char *str,const char *wildstr); +int wild_case_compare(CHARSET_INFO *cs, const char *str,const char *wildstr); int wild_compare(const char *str,const char *str_end, const char *wildstr,const char *wildend,char escape); -int wild_case_compare(const char *str,const char *str_end, +int wild_case_compare(CHARSET_INFO *cs, const char *str,const char *str_end, const char *wildstr,const char *wildend,char escape); /* from hostname.cc */ diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 5e4fc654320..40b9ab24831 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -863,7 +863,7 @@ static void set_user(const char *user) { // allow a numeric uid to be used const char *pos; - for (pos=user; isdigit(*pos); pos++) ; + for (pos=user; my_isdigit(system_charset_info,*pos); pos++) ; if (*pos) // Not numeric id { fprintf(stderr,"Fatal error: Can't change to run as user '%s' ; Please check that the user exists!\n",user); @@ -3769,7 +3769,7 @@ static void get_options(int argc,char **argv) exit(1); } val = p--; - while(isspace(*p) && p > optarg) *p-- = 0; + while(my_isspace(system_charset_info,*p) && p > optarg) *p-- = 0; if(p == optarg) { fprintf(stderr, @@ -3778,7 +3778,7 @@ static void get_options(int argc,char **argv) } *val = 0; val += 2; - while(*val && isspace(*val)) *val++; + while(*val && my_isspace(system_charset_info,*val)) *val++; if (!*val) { fprintf(stderr, @@ -3937,7 +3937,7 @@ static void get_options(int argc,char **argv) have_symlink=SHOW_OPTION_DISABLED; break; case (int) OPT_BIND_ADDRESS: - if (optarg && isdigit(optarg[0])) + if (optarg && my_isdigit(system_charset_info,optarg[0])) { my_bind_addr = (ulong) inet_addr(optarg); } @@ -4409,7 +4409,8 @@ static ulong find_bit_type(const char *x, TYPELIB *bit_lib) j=pos; while (j != end) { - if (toupper(*i++) != toupper(*j++)) + if (my_toupper(system_charset_info,*i++) != + my_toupper(system_charset_info,*j++)) goto skipp; } found_int=bit; diff --git a/sql/opt_range.cc b/sql/opt_range.cc index 34ee34ecc79..8bd47913b7b 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -985,7 +985,8 @@ get_mm_leaf(PARAM *param, Field *field, KEY_PART *key_part, like_error=like_range(res->ptr(),res->length(),wild_prefix, field_length, min_str+offset,max_str+offset, - max_sort_char,&min_length,&max_length); + default_charset_info->max_sort_char, + &min_length,&max_length); } if (like_error) // Can't optimize with LIKE DBUG_RETURN(0); diff --git a/sql/procedure.cc b/sql/procedure.cc index 437bd82d6e5..7779f5ce085 100644 --- a/sql/procedure.cc +++ b/sql/procedure.cc @@ -57,7 +57,8 @@ setup_procedure(THD *thd,ORDER *param,select_result *result, DBUG_RETURN(0); for (i=0 ; i < array_elements(sql_procs) ; i++) { - if (!my_strcasecmp((*param->item)->name,sql_procs[i].name)) + if (!my_strcasecmp(system_charset_info, + (*param->item)->name,sql_procs[i].name)) { Procedure *proc=(*sql_procs[i].init)(thd,param,result,field_list); *error= !proc; diff --git a/sql/slave.cc b/sql/slave.cc index 100e305530f..9630cf6aa0e 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -237,9 +237,9 @@ void init_slave_skip_errors(char* arg) exit(1); } use_slave_mask = 1; - for (;isspace(*arg);++arg) + for (;my_isspace(system_charset_info,*arg);++arg) /* empty */; - if (!my_casecmp(arg,"all",3)) + if (!my_strncasecmp(system_charset_info,arg,"all",3)) { bitmap_set_all(&slave_error_mask); return; @@ -251,7 +251,7 @@ void init_slave_skip_errors(char* arg) break; if (err_code < MAX_SLAVE_ERROR) bitmap_set_bit(&slave_error_mask,(uint)err_code); - while (!isdigit(*p) && *p) + while (!my_isdigit(system_charset_info,*p) && *p) p++; } } @@ -492,7 +492,8 @@ static TABLE_RULE_ENT* find_wild(DYNAMIC_ARRAY *a, const char* key, int len) { TABLE_RULE_ENT* e ; get_dynamic(a, (gptr)&e, i); - if (!wild_case_compare(key, key_end, (const char*)e->db, + if (!wild_case_compare(system_charset_info, key, key_end, + (const char*)e->db, (const char*)(e->db + e->key_len),'\\')) return e; } diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index c5782f65798..198569cec3c 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -381,7 +381,7 @@ static uint get_access(TABLE *form,uint fieldnr) for (pos=form->field+fieldnr,bit=1 ; *pos ; pos++ , bit<<=1) { (*pos)->val_str(&res,&res); - if (toupper(res[0]) == 'Y') + if (my_toupper(system_charset_info, res[0]) == 'Y') access_bits|=bit; } return access_bits; @@ -729,7 +729,7 @@ uint acl_get(const char *host, const char *ip, const char *bin_ip, end=strmov((tmp_db=strmov(key+sizeof(struct in_addr),user)+1),db); if (lower_case_table_names) { - casedn_str(tmp_db); + my_casedn_str(system_charset_info, tmp_db); db=tmp_db; } key_length=(uint) (end-key); @@ -793,7 +793,7 @@ exit: } -int wild_case_compare(const char *str,const char *wildstr) +int wild_case_compare(CHARSET_INFO *cs, const char *str,const char *wildstr) { reg3 int flag; DBUG_ENTER("wild_case_compare"); @@ -804,7 +804,8 @@ int wild_case_compare(const char *str,const char *wildstr) { if (*wildstr == wild_prefix && wildstr[1]) wildstr++; - if (toupper(*wildstr++) != toupper(*str++)) DBUG_RETURN(1); + if (my_toupper(cs, *wildstr++) != + my_toupper(cs, *str++)) DBUG_RETURN(1); } if (! *wildstr ) DBUG_RETURN (*str != 0); if (*wildstr++ == wild_one) @@ -822,12 +823,12 @@ int wild_case_compare(const char *str,const char *wildstr) char cmp; if ((cmp= *wildstr) == wild_prefix && wildstr[1]) cmp=wildstr[1]; - cmp=toupper(cmp); - while (*str && toupper(*str) != cmp) + cmp=my_toupper(cs, cmp); + while (*str && my_toupper(cs, *str) != cmp) str++; if (!*str) DBUG_RETURN (1); } - if (wild_case_compare(str,wildstr) == 0) DBUG_RETURN (0); + if (wild_case_compare(cs, str,wildstr) == 0) DBUG_RETURN (0); } while (*str++); DBUG_RETURN(1); } @@ -862,7 +863,8 @@ static void init_check_host(void) { // Check if host already exists acl_host_and_ip *acl=dynamic_element(&acl_wild_hosts,j, acl_host_and_ip *); - if (!my_strcasecmp(acl_user->host.hostname,acl->hostname)) + if (!my_strcasecmp(system_charset_info, + acl_user->host.hostname, acl->hostname)) break; // already stored } if (j == acl_wild_hosts.elements) // If new @@ -940,7 +942,8 @@ bool change_password(THD *thd, const char *host, const char *user, new_password[length & 16]=0; if (!thd || (!thd->slave_thread && ( strcmp(thd->user,user) || - my_strcasecmp(host,thd->host ? thd->host : thd->ip)))) + my_strcasecmp(system_charset_info, + host, (thd->host ? thd->host : thd->ip))))) { if (check_access(thd, UPDATE_ACL, "mysql",0,1)) DBUG_RETURN(1); @@ -1061,7 +1064,8 @@ static bool compare_hostname(const acl_host_and_ip *host, const char *hostname, return (tmp & host->ip_mask) == host->ip; } return (!host->hostname || - (hostname && !wild_case_compare(hostname,host->hostname)) || + (hostname && !wild_case_compare(system_charset_info, + hostname,host->hostname)) || (ip && !wild_compare(ip,host->hostname))); } @@ -1414,8 +1418,8 @@ public: tname= strdup_root(&memex,t); if (lower_case_table_names) { - casedn_str(db); - casedn_str(tname); + my_casedn_str(system_charset_info, db); + my_casedn_str(system_charset_info, tname); } key_length =(uint) strlen(d)+(uint) strlen(u)+(uint) strlen(t)+3; hash_key = (char*) alloc_root(&memex,key_length); @@ -1440,8 +1444,8 @@ public: } if (lower_case_table_names) { - casedn_str(db); - casedn_str(tname); + my_casedn_str(system_charset_info, db); + my_casedn_str(system_charset_info, tname); } key_length = ((uint) strlen(db) + (uint) strlen(user) + (uint) strlen(tname) + 3); @@ -1534,8 +1538,10 @@ static GRANT_TABLE *table_hash_search(const char *host,const char* ip, } else { - if ((host && !wild_case_compare(host,grant_table->host)) || - (ip && !wild_case_compare(ip,grant_table->host))) + if ((host && !wild_case_compare(system_charset_info, + host,grant_table->host)) || + (ip && !wild_case_compare(system_charset_info, + ip,grant_table->host))) found=grant_table; // Host ok } } @@ -2051,7 +2057,7 @@ int mysql_grant (THD *thd, const char *db, List &list, uint rights, if (lower_case_table_names && db) { strmov(tmp_db,db); - casedn_str(tmp_db); + my_casedn_str(system_charset_info, tmp_db); db=tmp_db; } @@ -2476,8 +2482,10 @@ bool check_grant_db(THD *thd,const char *db) GRANT_TABLE *grant_table = (GRANT_TABLE*) hash_element(&hash_tables,idx); if (len < grant_table->key_length && !memcmp(grant_table->hash_key,helping,len) && - (thd->host && !wild_case_compare(thd->host,grant_table->host) || - (thd->ip && !wild_case_compare(thd->ip,grant_table->host)))) + (thd->host && !wild_case_compare(system_charset_info, + thd->host,grant_table->host) || + (thd->ip && !wild_case_compare(system_charset_info, + thd->ip,grant_table->host)))) { error=0; // Found match break; diff --git a/sql/sql_analyse.cc b/sql/sql_analyse.cc index df8a8f1fdde..fc764333916 100644 --- a/sql/sql_analyse.cc +++ b/sql/sql_analyse.cc @@ -163,7 +163,7 @@ bool test_if_number(NUM_INFO *info, const char *str, uint str_len) // MySQL removes any endspaces of a string, so we must take care only of // spaces in front of a string - for (; str != end && isspace(*str); str++) ; + for (; str != end && my_isspace(system_charset_info, *str); str++) ; if (str == end) return 0; @@ -176,10 +176,10 @@ bool test_if_number(NUM_INFO *info, const char *str, uint str_len) else info->negative = 0; begin = str; - for (; str != end && isdigit(*str); str++) + for (; str != end && my_isdigit(system_charset_info,*str); str++) { if (!info->integers && *str == '0' && (str + 1) != end && - isdigit(*(str + 1))) + my_isdigit(system_charset_info,*(str + 1))) info->zerofill = 1; // could be a postnumber for example info->integers++; } @@ -205,7 +205,7 @@ bool test_if_number(NUM_INFO *info, const char *str, uint str_len) str++; if (*str != '-' && *str != '+') return 0; - for (str++; str != end && isdigit(*str); str++) ; + for (str++; str != end && my_isdigit(system_charset_info,*str); str++) ; if (str == end) { info->is_float = 1; // we can't use variable decimals here @@ -220,7 +220,7 @@ bool test_if_number(NUM_INFO *info, const char *str, uint str_len) info->ullval = (ulonglong) strtoull(begin, NULL, 10); return 1; } - for (; str != end && isdigit(*str); str++) + for (; str != end && my_isdigit(system_charset_info,*str); str++) info->decimals++; if (str == end) { diff --git a/sql/sql_base.cc b/sql/sql_base.cc index f4a70db2e5d..e73a0c63fa6 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -50,7 +50,8 @@ static byte *cache_key(const byte *record,uint *length, void table_cache_init(void) { - VOID(hash_init(&open_cache,table_cache_size+16,0,0,cache_key, + VOID(hash_init(&open_cache, + table_cache_size+16,0,0,cache_key, (void (*)(void*)) free_cache_entry,0)); mysql_rm_tmp_tables(); } @@ -780,7 +781,7 @@ TABLE *open_table(THD *thd,const char *db,const char *table_name, { if (table->key_length == key_length && !memcmp(table->table_cache_key,key,key_length) && - !my_strcasecmp(table->table_name,alias)) + !my_strcasecmp(system_charset_info,table->table_name,alias)) goto reset; } my_printf_error(ER_TABLE_NOT_LOCKED,ER(ER_TABLE_NOT_LOCKED),MYF(0),alias); @@ -1559,11 +1560,12 @@ Field *find_field_in_table(THD *thd,TABLE *table,const char *name,uint length, Field **ptr=table->field; while ((field = *ptr++)) { - if (!my_strcasecmp(field->field_name, name)) + if (!my_strcasecmp(system_charset_info, field->field_name, name)) goto found; } } - if (allow_rowid && !my_strcasecmp(name,"_rowid") && + if (allow_rowid && + !my_strcasecmp(system_charset_info, name, "_rowid") && (field=table->rowid_field)) goto found; return (Field*) 0; @@ -1686,7 +1688,8 @@ find_item_in_list(Item *find,List &items) { if (field_name && item->type() == Item::FIELD_ITEM) { - if (!my_strcasecmp(((Item_field*) item)->name,field_name)) + if (!my_strcasecmp(system_charset_info, + ((Item_field*) item)->name,field_name)) { if (!table_name) { @@ -1709,8 +1712,9 @@ find_item_in_list(Item *find,List &items) } } else if (!table_name && (item->eq(find) || - find->name && - !my_strcasecmp(item->name,find->name))) + find->name && + !my_strcasecmp(system_charset_info, + item->name,find->name))) { found=li.ref(); break; @@ -1938,7 +1942,8 @@ int setup_conds(THD *thd,TABLE_LIST *tables,COND **conds) // TODO: This could be optimized to use hashed names if t2 had a hash for (j=0 ; j < t2->fields ; j++) { - if (!my_strcasecmp(t1->field[i]->field_name, + if (!my_strcasecmp(system_charset_info, + t1->field[i]->field_name, t2->field[j]->field_name)) { Item_func_eq *tmp=new Item_func_eq(new Item_field(t1->field[i]), diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc index c5ebeead05a..72ac20d8818 100644 --- a/sql/sql_cache.cc +++ b/sql/sql_cache.cc @@ -896,8 +896,9 @@ Query_cache::send_result_to_client(THD *thd, char *sql, uint query_length) Test if the query is a SELECT (pre-space is removed in dispatch_command) */ - if (toupper(sql[0]) != 'S' || toupper(sql[1]) != 'E' || - toupper(sql[2]) !='L') + if (my_toupper(system_charset_info, sql[0]) != 'S' || + my_toupper(system_charset_info, sql[1]) != 'E' || + my_toupper(system_charset_info,sql[2]) !='L') { DBUG_PRINT("qcache", ("The statement is not a SELECT; Not cached")); goto err; diff --git a/sql/sql_db.cc b/sql/sql_db.cc index dd8ed634011..30e7262cae0 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -218,7 +218,8 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db, DBUG_PRINT("info",("Examining: %s", file->name)); /* Check if file is a raid directory */ - if (isdigit(file->name[0]) && isdigit(file->name[1]) && + if (my_isdigit(system_charset_info,file->name[0]) && + my_isdigit(system_charset_info,file->name[1]) && !file->name[2] && !level) { char newpath[FN_REFLEN]; @@ -243,7 +244,8 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db, continue; } strxmov(filePath,org_path,"/",file->name,NullS); - if (db && !my_strcasecmp(fn_ext(file->name), reg_ext)) + if (db && !my_strcasecmp(system_charset_info, + fn_ext(file->name), reg_ext)) { /* Drop the table nicely */ *fn_ext(file->name)=0; // Remove extension diff --git a/sql/sql_handler.cc b/sql/sql_handler.cc index 8f9d3474ce2..f4d6f3416a6 100644 --- a/sql/sql_handler.cc +++ b/sql/sql_handler.cc @@ -270,7 +270,7 @@ static TABLE **find_table_ptr_by_name(THD *thd, const char *db, for (TABLE *table=*ptr; table ; table=*ptr) { if (!memcmp(table->table_cache_key, db, dblen) && - !my_strcasecmp(table->table_name,table_name)) + !my_strcasecmp(system_charset_info,table->table_name,table_name)) break; ptr=&(table->next); } diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 7995e7701e5..9371eb00b79 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -92,15 +92,15 @@ void lex_init(void) /* Fill state_map with states to get a faster parser */ for (i=0; i < 256 ; i++) { - if (isalpha(i)) + if (my_isalpha(system_charset_info,i)) state_map[i]=(uchar) STATE_IDENT; - else if (isdigit(i)) + else if (my_isdigit(system_charset_info,i)) state_map[i]=(uchar) STATE_NUMBER_IDENT; #if defined(USE_MB) && defined(USE_MB_IDENT) - else if (use_mb(default_charset_info) && my_ismbhead(default_charset_info, i)) + else if (use_mb(system_charset_info) && my_ismbhead(system_charset_info, i)) state_map[i]=(uchar) STATE_IDENT; #endif - else if (!isgraph(i)) + else if (!my_isgraph(system_charset_info,i)) state_map[i]=(uchar) STATE_SKIP; else state_map[i]=(uchar) STATE_CHAR; @@ -220,8 +220,8 @@ static char *get_text(LEX *lex) c = yyGet(); #ifdef USE_MB int l; - if (use_mb(default_charset_info) && - (l = my_ismbchar(default_charset_info, + if (use_mb(system_charset_info) && + (l = my_ismbchar(system_charset_info, (const char *)lex->ptr-1, (const char *)lex->end_of_query))) { lex->ptr += l-1; @@ -265,8 +265,8 @@ static char *get_text(LEX *lex) { #ifdef USE_MB int l; - if (use_mb(default_charset_info) && - (l = my_ismbchar(default_charset_info, + if (use_mb(system_charset_info) && + (l = my_ismbchar(system_charset_info, (const char *)str, (const char *)end))) { while (l--) *to++ = *str++; @@ -471,11 +471,11 @@ int yylex(void *arg) break; } #if defined(USE_MB) && defined(USE_MB_IDENT) - if (use_mb(default_charset_info)) + if (use_mb(system_charset_info)) { - if (my_ismbhead(default_charset_info, yyGetLast())) + if (my_ismbhead(system_charset_info, yyGetLast())) { - int l = my_ismbchar(default_charset_info, + int l = my_ismbchar(system_charset_info, (const char *)lex->ptr-1, (const char *)lex->end_of_query); if (l == 0) { @@ -487,10 +487,10 @@ int yylex(void *arg) while (state_map[c=yyGet()] == STATE_IDENT || state_map[c] == STATE_NUMBER_IDENT) { - if (my_ismbhead(default_charset_info, c)) + if (my_ismbhead(system_charset_info, c)) { int l; - if ((l = my_ismbchar(default_charset_info, + if ((l = my_ismbchar(system_charset_info, (const char *)lex->ptr-1, (const char *)lex->end_of_query)) == 0) break; @@ -533,7 +533,7 @@ int yylex(void *arg) return((int) c); case STATE_NUMBER_IDENT: // number or ident which num-start - while (isdigit((c = yyGet()))) ; + while (my_isdigit(system_charset_info,(c = yyGet()))) ; if (state_map[c] != STATE_IDENT) { // Can't be identifier state=STATE_INT_OR_REAL; @@ -542,12 +542,13 @@ int yylex(void *arg) if (c == 'e' || c == 'E') { // The following test is written this way to allow numbers of type 1e1 - if (isdigit(yyPeek()) || (c=(yyGet())) == '+' || c == '-') + if (my_isdigit(system_charset_info,yyPeek()) || + (c=(yyGet())) == '+' || c == '-') { // Allow 1E+10 - if (isdigit(yyPeek())) // Number must have digit after sign + if (my_isdigit(system_charset_info,yyPeek())) // Number must have digit after sign { yySkip(); - while (isdigit(yyGet())) ; + while (my_isdigit(system_charset_info,yyGet())) ; yylval->lex_str=get_token(lex,yyLength()); return(FLOAT_NUM); } @@ -557,7 +558,7 @@ int yylex(void *arg) else if (c == 'x' && (lex->ptr - lex->tok_start) == 2 && lex->tok_start[0] == '0' ) { // Varbinary - while (isxdigit((c = yyGet()))) ; + while (my_isxdigit(system_charset_info,(c = yyGet()))) ; if ((lex->ptr - lex->tok_start) >= 4 && state_map[c] != STATE_IDENT) { yylval->lex_str=get_token(lex,yyLength()); @@ -571,11 +572,11 @@ int yylex(void *arg) // fall through case STATE_IDENT_START: // Incomplete ident #if defined(USE_MB) && defined(USE_MB_IDENT) - if (use_mb(default_charset_info)) + if (use_mb(system_charset_info)) { - if (my_ismbhead(default_charset_info, yyGetLast())) + if (my_ismbhead(system_charset_info, yyGetLast())) { - int l = my_ismbchar(default_charset_info, + int l = my_ismbchar(system_charset_info, (const char *)lex->ptr-1, (const char *)lex->end_of_query); if (l == 0) @@ -588,10 +589,10 @@ int yylex(void *arg) while (state_map[c=yyGet()] == STATE_IDENT || state_map[c] == STATE_NUMBER_IDENT) { - if (my_ismbhead(default_charset_info, c)) + if (my_ismbhead(system_charset_info, c)) { int l; - if ((l = my_ismbchar(default_charset_info, + if ((l = my_ismbchar(system_charset_info, (const char *)lex->ptr-1, (const char *)lex->end_of_query)) == 0) break; @@ -618,15 +619,15 @@ int yylex(void *arg) case STATE_USER_VARIABLE_DELIMITER: lex->tok_start=lex->ptr; // Skip first ` #ifdef USE_MB - if (use_mb(default_charset_info)) + if (use_mb(system_charset_info)) { while ((c=yyGet()) && state_map[c] != STATE_USER_VARIABLE_DELIMITER && c != (uchar) NAMES_SEP_CHAR) { - if (my_ismbhead(default_charset_info, c)) + if (my_ismbhead(system_charset_info, c)) { int l; - if ((l = my_ismbchar(default_charset_info, + if ((l = my_ismbchar(system_charset_info, (const char *)lex->ptr-1, (const char *)lex->end_of_query)) == 0) break; @@ -651,17 +652,18 @@ int yylex(void *arg) if (prev_state == STATE_OPERATOR_OR_IDENT) { if (c == '-' && yyPeek() == '-' && - (isspace(yyPeek2()) || iscntrl(yyPeek2()))) + (my_isspace(system_charset_info,yyPeek2()) || + my_iscntrl(system_charset_info,yyPeek2()))) state=STATE_COMMENT; else state= STATE_CHAR; // Must be operator break; } - if (!isdigit(c=yyGet()) || yyPeek() == 'x') + if (!my_isdigit(system_charset_info,c=yyGet()) || yyPeek() == 'x') { if (c != '.') { - if (c == '-' && isspace(yyPeek())) + if (c == '-' && my_isspace(system_charset_info,yyPeek())) state=STATE_COMMENT; else state = STATE_CHAR; // Return sign as single char @@ -669,9 +671,9 @@ int yylex(void *arg) } yyUnget(); // Fix for next loop } - while (isdigit(c=yyGet())) ; // Incomplete real or int number + while (my_isdigit(system_charset_info,c=yyGet())) ; // Incomplete real or int number if ((c == 'e' || c == 'E') && - (yyPeek() == '+' || yyPeek() == '-' || isdigit(yyPeek()))) + (yyPeek() == '+' || yyPeek() == '-' || my_isdigit(system_charset_info,yyPeek()))) { // Real number yyUnget(); c= '.'; // Fool next test @@ -685,19 +687,19 @@ int yylex(void *arg) } // fall through case STATE_REAL: // Incomplete real number - while (isdigit(c = yyGet())) ; + while (my_isdigit(system_charset_info,c = yyGet())) ; if (c == 'e' || c == 'E') { c = yyGet(); if (c == '-' || c == '+') c = yyGet(); // Skip sign - if (!isdigit(c)) + if (!my_isdigit(system_charset_info,c)) { // No digit after sign state= STATE_CHAR; break; } - while (isdigit(yyGet())) ; + while (my_isdigit(system_charset_info,yyGet())) ; yylval->lex_str=get_token(lex,yyLength()); return(FLOAT_NUM); } @@ -706,7 +708,7 @@ int yylex(void *arg) case STATE_HEX_NUMBER: // Found x'hexstring' yyGet(); // Skip ' - while (isxdigit((c = yyGet()))) ; + while (my_isxdigit(system_charset_info,(c = yyGet()))) ; length=(lex->ptr - lex->tok_start); // Length of hexnum+3 if (!(length & 1) || c != '\'') { @@ -786,7 +788,7 @@ int yylex(void *arg) ulong version=MYSQL_VERSION_ID; yySkip(); state=STATE_START; - if (isdigit(yyPeek())) + if (my_isdigit(system_charset_info,yyPeek())) { // Version number version=strtol((char*) lex->ptr,(char**) &lex->ptr,10); } @@ -841,7 +843,7 @@ int yylex(void *arg) // Actually real shouldn't start // with . but allow them anyhow case STATE_REAL_OR_POINT: - if (isdigit(yyPeek())) + if (my_isdigit(system_charset_info,yyPeek())) state = STATE_REAL; // Real else { @@ -868,7 +870,7 @@ int yylex(void *arg) return((int) '@'); case STATE_HOSTNAME: // end '@' of user@hostname for (c=yyGet() ; - isalnum(c) || c == '.' || c == '_' || c == '$'; + my_isalnum(system_charset_info,c) || c == '.' || c == '_' || c == '$'; c= yyGet()) ; yylval->lex_str=get_token(lex,yyLength()); return(LEX_HOSTNAME); diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index e649f109a0d..ef6c0eb2a5d 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -692,7 +692,8 @@ pthread_handler_decl(handle_bootstrap,arg) while (fgets(buff, thd->net.max_packet, file)) { uint length=(uint) strlen(buff); - while (length && (isspace(buff[length-1]) || buff[length-1] == ';')) + while (length && (my_isspace(system_charset_info, buff[length-1]) || + buff[length-1] == ';')) length--; buff[length]=0; thd->current_tablenr=0; @@ -917,13 +918,14 @@ bool dispatch_command(enum enum_server_command command, THD *thd, { packet_length--; // Remove end null /* Remove garage at start and end of query */ - while (isspace(packet[0]) && packet_length > 0) + while (my_isspace(system_charset_info,packet[0]) && packet_length > 0) { packet++; packet_length--; } char *pos=packet+packet_length; // Point at end null - while (packet_length > 0 && (pos[-1] == ';' || isspace(pos[-1]))) + while (packet_length > 0 && + (pos[-1] == ';' || my_isspace(system_charset_info,pos[-1]))) { pos--; packet_length--; @@ -2261,7 +2263,8 @@ mysql_execute_command(void) if (user->password.str && (strcmp(thd->user,user->user.str) || user->host.str && - my_strcasecmp(user->host.str, thd->host_or_ip))) + my_strcasecmp(system_charset_info, + user->host.str, thd->host_or_ip))) { if (check_access(thd, UPDATE_ACL, "mysql",0,1)) goto error; @@ -3112,8 +3115,8 @@ TABLE_LIST *add_table_to_list(Table_ident *table, LEX_STRING *alias, ptr->name=alias_str; if (lower_case_table_names) { - casedn_str(ptr->db); - casedn_str(table->table.str); + my_casedn_str(system_charset_info,ptr->db); + my_casedn_str(system_charset_info,table->table.str); } ptr->real_name=table->table.str; ptr->lock_type=flags; diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 52541ffe50f..3e7b8f13844 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -209,7 +209,7 @@ mysql_find_files(THD *thd,List *files, const char *db,const char *path, else { // Return only .frm files which aren't temp files. - if (my_strcasecmp(ext=fn_ext(file->name),reg_ext) || + if (my_strcasecmp(system_charset_info, ext=fn_ext(file->name),reg_ext) || is_prefix(file->name,tmp_file_prefix)) continue; *ext=0; @@ -217,7 +217,7 @@ mysql_find_files(THD *thd,List *files, const char *db,const char *path, { if (lower_case_table_names) { - if (wild_case_compare(file->name,wild)) + if (wild_case_compare(system_charset_info,file->name,wild)) continue; } else if (wild_compare(file->name,wild)) @@ -472,7 +472,8 @@ mysqld_show_fields(THD *thd, TABLE_LIST *table_list,const char *wild, String *packet= &thd->packet; for (ptr=table->field; (field= *ptr) ; ptr++) { - if (!wild || !wild[0] || !wild_case_compare(field->field_name,wild)) + if (!wild || !wild[0] || + !wild_case_compare(system_charset_info, field->field_name,wild)) { #ifdef NOT_USED if (thd->col_access & TABLE_ACLS || @@ -744,7 +745,8 @@ mysqld_list_fields(THD *thd, TABLE_LIST *table_list, const char *wild) Field **ptr,*field; for (ptr=table->field ; (field= *ptr); ptr++) { - if (!wild || !wild[0] || !wild_case_compare(field->field_name,wild)) + if (!wild || !wild[0] || + !wild_case_compare(system_charset_info, field->field_name,wild)) field_list.push_back(new Item_field(field)); } restore_record(table,2); // Get empty record diff --git a/sql/sql_string.cc b/sql/sql_string.cc index f0cfd590072..62b1812afb3 100644 --- a/sql/sql_string.cc +++ b/sql/sql_string.cc @@ -234,7 +234,7 @@ bool String::fill(uint32 max_length,char fill_char) void String::strip_sp() { - while (str_length && isspace(Ptr[str_length-1])) + while (str_length && my_isspace(str_charset,Ptr[str_length-1])) str_length--; } @@ -296,10 +296,10 @@ uint32 String::numchars() register uint32 n=0,mblen; register const char *mbstr=Ptr; register const char *end=mbstr+str_length; - if (use_mb(default_charset_info)) + if (use_mb(str_charset)) { while (mbstr < end) { - if ((mblen=my_ismbchar(default_charset_info, mbstr,end))) mbstr+=mblen; + if ((mblen=my_ismbchar(str_charset, mbstr,end))) mbstr+=mblen; else ++mbstr; ++n; } @@ -316,11 +316,11 @@ int String::charpos(int i,uint32 offset) register uint32 mblen; register const char *mbstr=Ptr+offset; register const char *end=Ptr+str_length; - if (use_mb(default_charset_info)) + if (use_mb(str_charset)) { if (i<=0) return i; while (i && mbstr < end) { - if ((mblen=my_ismbchar(default_charset_info, mbstr,end))) mbstr+=mblen; + if ((mblen=my_ismbchar(str_charset, mbstr,end))) mbstr+=mblen; else ++mbstr; --i; } @@ -380,12 +380,14 @@ int String::strstr_case(const String &s,uint32 offset) skipp: while (str != end) { - if (my_sort_order[*str++] == my_sort_order[*search]) + if (str_charset->sort_order[*str++] == str_charset->sort_order[*search]) { register char *i,*j; i=(char*) str; j=(char*) search+1; while (j != search_end) - if (my_sort_order[*i++] != my_sort_order[*j++]) goto skipp; + if (str_charset->sort_order[*i++] != + str_charset->sort_order[*j++]) + goto skipp; return (int) (str-Ptr) -1; } } @@ -505,15 +507,15 @@ int sortcmp(const String *x,const String *y) uint32 x_len=x->length(),y_len=y->length(),len=min(x_len,y_len); #ifdef USE_STRCOLL - if (use_strcoll(default_charset_info)) + if (use_strcoll(x->str_charset)) { #ifndef CMP_ENDSPACE - while (x_len && isspace(s[x_len-1])) + while (x_len && my_isspace(x->str_charset,s[x_len-1])) x_len--; - while (y_len && isspace(t[y_len-1])) + while (y_len && my_isspace(x->str_charset,t[y_len-1])) y_len--; #endif - return my_strnncoll(default_charset_info, + return my_strnncoll(x->str_charset, (unsigned char *)s,x_len,(unsigned char *)t,y_len); } else @@ -523,9 +525,10 @@ int sortcmp(const String *x,const String *y) y_len-=len; while (len--) { - if (my_sort_order[(uchar) *s++] != my_sort_order[(uchar) *t++]) - return ((int) my_sort_order[(uchar) s[-1]] - - (int) my_sort_order[(uchar) t[-1]]); + if (x->str_charset->sort_order[(uchar) *s++] != + x->str_charset->sort_order[(uchar) *t++]) + return ((int) x->str_charset->sort_order[(uchar) s[-1]] - + (int) x->str_charset->sort_order[(uchar) t[-1]]); } #ifndef CMP_ENDSPACE /* Don't compare end space in strings */ @@ -534,14 +537,14 @@ int sortcmp(const String *x,const String *y) { const char *end=t+y_len; for (; t != end ; t++) - if (!isspace(*t)) + if (!my_isspace(x->str_charset,*t)) return -1; } else { const char *end=s+x_len; for (; s != end ; s++) - if (!isspace(*s)) + if (!my_isspace(x->str_charset,*s)) return 1; } return 0; @@ -589,11 +592,10 @@ String *copy_if_not_alloced(String *to,String *from,uint32 from_length) /* Make it easier to handle different charactersets */ #ifdef USE_MB -#define INC_PTR(A,B) A+=((use_mb_flag && \ - my_ismbchar(default_charset_info,A,B)) ? \ - my_ismbchar(default_charset_info,A,B) : 1) +#define INC_PTR(cs,A,B) A+=((use_mb_flag && \ + my_ismbchar(cs,A,B)) ? my_ismbchar(cs,A,B) : 1) #else -#define INC_PTR(A,B) A++ +#define INC_PTR(cs,A,B) A++ #endif /* @@ -604,12 +606,12 @@ String *copy_if_not_alloced(String *to,String *from,uint32 from_length) */ #ifdef LIKE_CMP_TOUPPER -#define likeconv(A) (uchar) toupper(A) +#define likeconv(s,A) (uchar) my_toupper(s,A) #else -#define likeconv(A) (uchar) my_sort_order[(uchar) (A)] +#define likeconv(s,A) (uchar) (s)->sort_order[(uchar) (A)] #endif -int wild_case_compare(const char *str,const char *str_end, +int wild_case_compare(CHARSET_INFO *cs, const char *str,const char *str_end, const char *wildstr,const char *wildend, char escape) { @@ -626,7 +628,7 @@ int wild_case_compare(const char *str,const char *str_end, #ifdef USE_MB int l; if (use_mb_flag && - (l = my_ismbchar(default_charset_info, wildstr, wildend))) + (l = my_ismbchar(cs, wildstr, wildend))) { if (str+l > str_end || memcmp(str, wildstr, l) != 0) return 1; @@ -635,7 +637,7 @@ int wild_case_compare(const char *str,const char *str_end, } else #endif - if (str == str_end || likeconv(*wildstr++) != likeconv(*str++)) + if (str == str_end || likeconv(cs,*wildstr++) != likeconv(cs,*str++)) return(1); // No match if (wildstr == wildend) return (str != str_end); // Match if both are at end @@ -647,7 +649,7 @@ int wild_case_compare(const char *str,const char *str_end, { if (str == str_end) // Skip one char if possible return (result); - INC_PTR(str,str_end); + INC_PTR(cs,str,str_end); } while (++wildstr < wildend && *wildstr == wild_one); if (wildstr == wildend) break; @@ -664,7 +666,7 @@ int wild_case_compare(const char *str,const char *str_end, { if (str == str_end) return (-1); - INC_PTR(str,str_end); + INC_PTR(cs,str,str_end); continue; } break; // Not a wild character @@ -682,10 +684,10 @@ int wild_case_compare(const char *str,const char *str_end, int mblen; LINT_INIT(mblen); if (use_mb_flag) - mblen = my_ismbchar(default_charset_info, wildstr, wildend); + mblen = my_ismbchar(cs, wildstr, wildend); #endif - INC_PTR(wildstr,wildend); // This is compared trough cmp - cmp=likeconv(cmp); + INC_PTR(cs,wildstr,wildend); // This is compared trough cmp + cmp=likeconv(cs,cmp); do { #ifdef USE_MB @@ -703,26 +705,26 @@ int wild_case_compare(const char *str,const char *str_end, break; } } - else if (!my_ismbchar(default_charset_info, str, str_end) && - likeconv(*str) == cmp) + else if (!my_ismbchar(cs, str, str_end) && + likeconv(cs,*str) == cmp) { str++; break; } - INC_PTR(str, str_end); + INC_PTR(cs,str, str_end); } } else { #endif /* USE_MB */ - while (str != str_end && likeconv(*str) != cmp) + while (str != str_end && likeconv(cs,*str) != cmp) str++; if (str++ == str_end) return (-1); #ifdef USE_MB } #endif { - int tmp=wild_case_compare(str,str_end,wildstr,wildend,escape); + int tmp=wild_case_compare(cs,str,str_end,wildstr,wildend,escape); if (tmp <= 0) return (tmp); } @@ -739,7 +741,7 @@ int wild_case_compare(String &match,String &wild, char escape) DBUG_ENTER("wild_case_compare"); DBUG_PRINT("enter",("match='%s', wild='%s', escape='%c'" ,match.ptr(),wild.ptr(),escape)); - DBUG_RETURN(wild_case_compare(match.ptr(),match.ptr()+match.length(), + DBUG_RETURN(wild_case_compare(match.str_charset,match.ptr(),match.ptr()+match.length(), wild.ptr(), wild.ptr()+wild.length(),escape)); } diff --git a/sql/sql_string.h b/sql/sql_string.h index 6e8fefb079a..811e49a0d02 100644 --- a/sql/sql_string.h +++ b/sql/sql_string.h @@ -198,8 +198,8 @@ public: } bool fill(uint32 max_length,char fill); void strip_sp(); - inline void caseup() { ::caseup(Ptr,str_length); } - inline void casedn() { ::casedn(Ptr,str_length); } + inline void caseup() { my_caseup(str_charset,Ptr,str_length); } + inline void casedn() { my_casedn(str_charset,Ptr,str_length); } friend int sortcmp(const String *a,const String *b); friend int stringcmp(const String *a,const String *b); friend String *copy_if_not_alloced(String *a,String *b,uint32 arg_length); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 4b849fd850d..7e679f59fc0 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -302,7 +302,9 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, null_fields++; while ((dup_field=it2++) != sql_field) { - if (my_strcasecmp(sql_field->field_name, dup_field->field_name) == 0) + if (my_strcasecmp(system_charset_info, + sql_field->field_name, + dup_field->field_name) == 0) { my_error(ER_DUP_FIELDNAME,MYF(0),sql_field->field_name); DBUG_RETURN(-1); @@ -496,7 +498,9 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, it.rewind(); field=0; while ((sql_field=it++) && - my_strcasecmp(column->field_name,sql_field->field_name)) + my_strcasecmp(system_charset_info, + column->field_name, + sql_field->field_name)) field++; if (!sql_field) { @@ -727,7 +731,7 @@ static bool check_if_keyname_exists(const char *name, KEY *start, KEY *end) { for (KEY *key=start ; key != end ; key++) - if (!my_strcasecmp(name,key->name)) + if (!my_strcasecmp(system_charset_info,name,key->name)) return 1; return 0; } @@ -1235,9 +1239,9 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, strmov(new_name_buff,new_name); fn_same(new_name_buff,table_name,3); if (lower_case_table_names) - casedn_str(new_name); + my_casedn_str(system_charset_info,new_name); if ((lower_case_table_names && - !my_strcasecmp(new_name_buff,table_name)) || + !my_strcasecmp(system_charset_info, new_name_buff,table_name)) || (!lower_case_table_names && !strcmp(new_name_buff,table_name))) new_name=table_name; // No. Make later check easier @@ -1348,7 +1352,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, while ((drop=drop_it++)) { if (drop->type == Alter_drop::COLUMN && - !my_strcasecmp(field->field_name, drop->name)) + !my_strcasecmp(system_charset_info,field->field_name, drop->name)) { /* Reset auto_increment value if it was dropped */ if (MTYP_TYPENR(field->unireg_check) == Field::NEXT_NUMBER && @@ -1369,7 +1373,8 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, def_it.rewind(); while ((def=def_it++)) { - if (def->change && !my_strcasecmp(field->field_name, def->change)) + if (def->change && + !my_strcasecmp(system_charset_info,field->field_name, def->change)) break; } if (def) @@ -1393,7 +1398,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, Alter_column *alter; while ((alter=alter_it++)) { - if (!my_strcasecmp(field->field_name, alter->name)) + if (!my_strcasecmp(system_charset_info,field->field_name, alter->name)) break; } if (alter) @@ -1427,7 +1432,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, find_it.rewind(); while ((find=find_it++)) // Add new columns { - if (!my_strcasecmp(def->after, find->field_name)) + if (!my_strcasecmp(system_charset_info,def->after, find->field_name)) break; } if (!find) @@ -1473,7 +1478,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, while ((drop=drop_it++)) { if (drop->type == Alter_drop::KEY && - !my_strcasecmp(key_name, drop->name)) + !my_strcasecmp(system_charset_info,key_name, drop->name)) break; } if (drop) @@ -1495,10 +1500,11 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, { if (cfield->change) { - if (!my_strcasecmp(key_part_name, cfield->change)) + if (!my_strcasecmp(system_charset_info,key_part_name, cfield->change)) break; } - else if (!my_strcasecmp(key_part_name, cfield->field_name)) + else if (!my_strcasecmp(system_charset_info, + key_part_name, cfield->field_name)) break; } if (!cfield) @@ -1518,7 +1524,8 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, if (key_parts.elements) key_list.push_back(new Key(key_info->flags & HA_SPATIAL ? Key::SPATIAL : (key_info->flags & HA_NOSAME ? - (!my_strcasecmp(key_name, "PRIMARY") ? + (!my_strcasecmp(system_charset_info, + key_name, "PRIMARY") ? Key::PRIMARY : Key::UNIQUE) : (key_info->flags & HA_FULLTEXT ? Key::FULLTEXT : Key::MULTIPLE)), diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 41e56328613..d762c8784a3 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -3654,7 +3654,8 @@ column_list_id: LEX *lex=Lex; while ((point=iter++)) { - if (!my_strcasecmp(point->column.ptr(),new_str->ptr())) + if (!my_strcasecmp(system_charset_info, + point->column.ptr(), new_str->ptr())) break; } lex->grant_tot_col|= lex->which_columns; diff --git a/sql/table.cc b/sql/table.cc index 9e6283d6ad4..2fa5d41f1ba 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -1067,9 +1067,10 @@ bool check_db_name(const char *name) while (*name) { #if defined(USE_MB) && defined(USE_MB_IDENT) - if (use_mb(default_charset_info)) + if (use_mb(system_charset_info)) { - int len=my_ismbchar(default_charset_info, name, name+MBMAXLEN); + int len=my_ismbchar(system_charset_info, name, + name+system_charset_info->mbmaxlen); if (len) { name += len; @@ -1099,9 +1100,9 @@ bool check_table_name(const char *name, uint length) while (name != end) { #if defined(USE_MB) && defined(USE_MB_IDENT) - if (use_mb(default_charset_info)) + if (use_mb(system_charset_info)) { - int len=my_ismbchar(default_charset_info, name, end); + int len=my_ismbchar(system_charset_info, name, end); if (len) { name += len; @@ -1121,9 +1122,10 @@ bool check_column_name(const char *name) while (*name) { #if defined(USE_MB) && defined(USE_MB_IDENT) - if (use_mb(default_charset_info)) + if (use_mb(system_charset_info)) { - int len=my_ismbchar(default_charset_info, name, name+MBMAXLEN); + int len=my_ismbchar(system_charset_info, name, + name+system_charset_info->mbmaxlen); if (len) { name += len; diff --git a/sql/time.cc b/sql/time.cc index aab886648e3..2a791ccc30e 100644 --- a/sql/time.cc +++ b/sql/time.cc @@ -268,13 +268,13 @@ void find_date(string pos,uint *vek,uint flag) DBUG_PRINT("enter",("pos: '%s' flag: %d",pos,flag)); bzero((char*) vek,sizeof(int)*4); - while (*pos && !isdigit(*pos)) + while (*pos && !my_isdigit(system_charset_info,*pos)) pos++; length=(uint) strlen(pos); for (uint i=0 ; i< 3; i++) { start=pos; value=0; - while (isdigit(pos[0]) && + while (my_isdigit(system_charset_info,pos[0]) && ((pos-start) < 2 || ((pos-start) < 4 && length >= 8 && !(flag & 3)))) { @@ -282,7 +282,8 @@ void find_date(string pos,uint *vek,uint flag) pos++; } vek[flag & 3]=value; flag>>=2; - while (*pos && (ispunct(*pos) || isspace(*pos))) + while (*pos && (my_ispunct(system_charset_info,*pos) || + my_isspace(system_charset_info,*pos))) pos++; } DBUG_PRINT("exit",("year: %d month: %d day: %d",vek[0],vek[1],vek[2])); @@ -434,7 +435,8 @@ str_to_TIME(const char *str, uint length, TIME *l_time,bool fuzzy_date) DBUG_ENTER("str_to_TIME"); DBUG_PRINT("enter",("str: %.*s",length,str)); - for (; str != end && !isdigit(*str) ; str++) ; // Skip garbage + // Skip garbage + for (; str != end && !my_isdigit(system_charset_info, *str) ; str++) ; if (str == end) DBUG_RETURN(TIMESTAMP_NONE); /* @@ -442,14 +444,14 @@ str_to_TIME(const char *str, uint length, TIME *l_time,bool fuzzy_date) ** If length= 8 or >= 14 then year is of format YYYY. (YYYY-MM-DD, YYYYMMDD, YYYYYMMDDHHMMSS) */ - for (pos=str; pos != end && isdigit(*pos) ; pos++) ; + for (pos=str; pos != end && my_isdigit(system_charset_info,*pos) ; pos++) ; digits= (uint) (pos-str); year_length= (digits == 4 || digits == 8 || digits >= 14) ? 4 : 2; field_length=year_length-1; - for (i=0 ; i < 6 && str != end && isdigit(*str) ; i++) + for (i=0 ; i < 6 && str != end && my_isdigit(system_charset_info,*str) ; i++) { uint tmp_value=(uint) (uchar) (*str++ - '0'); - while (str != end && isdigit(str[0]) && field_length--) + while (str != end && my_isdigit(system_charset_info,str[0]) && field_length--) { tmp_value=tmp_value*10 + (uint) (uchar) (*str - '0'); str++; @@ -459,10 +461,12 @@ str_to_TIME(const char *str, uint length, TIME *l_time,bool fuzzy_date) str++; // ISO8601: CCYYMMDDThhmmss else if ( i != 5 ) // Skip inter-field delimiters { - while (str != end && (ispunct(*str) || isspace(*str))) + while (str != end && + (my_ispunct(system_charset_info,*str) || + my_isspace(system_charset_info,*str))) { // Only allow space between days and hours - if (isspace(*str) && i != 2) + if (my_isspace(system_charset_info,*str) && i != 2) DBUG_RETURN(TIMESTAMP_NONE); str++; } @@ -470,12 +474,13 @@ str_to_TIME(const char *str, uint length, TIME *l_time,bool fuzzy_date) field_length=1; // Rest fields can only be 2 } /* Handle second fractions */ - if (i == 6 && (uint) (end-str) >= 2 && *str == '.' && isdigit(str[1])) + if (i == 6 && (uint) (end-str) >= 2 && *str == '.' && + my_isdigit(system_charset_info,str[1])) { str++; uint tmp_value=(uint) (uchar) (*str - '0'); field_length=3; - while (str++ != end && isdigit(str[0]) && field_length--) + while (str++ != end && my_isdigit(system_charset_info,str[0]) && field_length--) tmp_value=tmp_value*10 + (uint) (uchar) (*str - '0'); date[6]=tmp_value; } @@ -498,7 +503,7 @@ str_to_TIME(const char *str, uint length, TIME *l_time,bool fuzzy_date) { for ( ; str != end ; str++) { - if (!isspace(*str)) + if (!my_isspace(system_charset_info,*str)) { current_thd->cuted_fields++; break; @@ -559,7 +564,8 @@ bool str_to_time(const char *str,uint length,TIME *l_time) uint state; l_time->neg=0; - for (; str != end && !isdigit(*str) && *str != '-' ; str++) + for (; str != end && + !my_isdigit(system_charset_info,*str) && *str != '-' ; str++) length--; if (str != end && *str == '-') { @@ -578,7 +584,7 @@ bool str_to_time(const char *str,uint length,TIME *l_time) } /* Not a timestamp. Try to get this as a DAYS_TO_SECOND string */ - for (value=0; str != end && isdigit(*str) ; str++) + for (value=0; str != end && my_isdigit(system_charset_info,*str) ; str++) value=value*10L + (long) (*str - '0'); if (*str == ' ') @@ -589,14 +595,16 @@ bool str_to_time(const char *str,uint length,TIME *l_time) LINT_INIT(state); found_days=found_hours=0; - if ((uint) (end-str) > 1 && (*str == ' ' && isdigit(str[1]))) + if ((uint) (end-str) > 1 && (*str == ' ' && + my_isdigit(system_charset_info,str[1]))) { // days ! date[0]=value; state=1; // Assume next is hours found_days=1; str++; // Skip space; } - else if ((end-str) > 1 && *str == ':' && isdigit(str[1])) + else if ((end-str) > 1 && *str == ':' && + my_isdigit(system_charset_info,str[1])) { date[0]=0; // Assume we found hours date[1]=value; @@ -618,10 +626,11 @@ bool str_to_time(const char *str,uint length,TIME *l_time) /* Read hours, minutes and seconds */ for (;;) { - for (value=0; str != end && isdigit(*str) ; str++) + for (value=0; str != end && my_isdigit(system_charset_info,*str) ; str++) value=value*10L + (long) (*str - '0'); date[state++]=value; - if (state == 4 || (end-str) < 2 || *str != ':' || !isdigit(str[1])) + if (state == 4 || (end-str) < 2 || *str != ':' || + !my_isdigit(system_charset_info,str[1])) break; str++; // Skip ':' } @@ -641,11 +650,13 @@ bool str_to_time(const char *str,uint length,TIME *l_time) fractional: /* Get fractional second part */ - if ((end-str) >= 2 && *str == '.' && isdigit(str[1])) + if ((end-str) >= 2 && *str == '.' && my_isdigit(system_charset_info,str[1])) { uint field_length=3; str++; value=(uint) (uchar) (*str - '0'); - while (++str != end && isdigit(str[0]) && field_length--) + while (++str != end && + my_isdigit(system_charset_info,str[0]) && + field_length--) value=value*10 + (uint) (uchar) (*str - '0'); date[4]=value; } @@ -670,7 +681,7 @@ bool str_to_time(const char *str,uint length,TIME *l_time) { do { - if (!isspace(*str)) + if (!my_isspace(system_charset_info,*str)) { current_thd->cuted_fields++; break; diff --git a/strings/Makefile.am b/strings/Makefile.am index c1cfe64eb70..33d048a42d1 100644 --- a/strings/Makefile.am +++ b/strings/Makefile.am @@ -22,19 +22,19 @@ pkglib_LIBRARIES = libmystrings.a # Exact one of ASSEMBLER_X if ASSEMBLER_x86 ASRCS = strings-x86.s longlong2str-x86.s -CSRCS = bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c ctype.c strnlen.c +CSRCS = bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c ctype.c ctype-simple.c ctype-mb.c strnlen.c else if ASSEMBLER_sparc # These file MUST all be on the same line!! Otherwise automake # generats a very broken makefile ASRCS = bmove_upp-sparc.s strappend-sparc.s strend-sparc.s strinstr-sparc.s strmake-sparc.s strmov-sparc.s strnmov-sparc.s strstr-sparc.s strxmov-sparc.s -CSRCS = strcont.c strfill.c strcend.c is_prefix.c longlong2str.c bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c ctype.c strnlen.c +CSRCS = strcont.c strfill.c strcend.c is_prefix.c longlong2str.c bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c ctype.c ctype-simple.c ctype-mb.c strnlen.c else #no assembler ASRCS = # These file MUST all be on the same line!! Otherwise automake # generats a very broken makefile -CSRCS = strxmov.c bmove_upp.c strappend.c strcont.c strend.c strfill.c strcend.c is_prefix.c strstr.c strinstr.c strmake.c strnmov.c strmov.c longlong2str.c bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c ctype.c strnlen.c +CSRCS = strxmov.c bmove_upp.c strappend.c strcont.c strend.c strfill.c strcend.c is_prefix.c strstr.c strinstr.c strmake.c strnmov.c strmov.c longlong2str.c bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c ctype.c ctype-simple.c ctype-mb.c strnlen.c endif endif diff --git a/strings/ctype-big5.c b/strings/ctype-big5.c index 44f8a100897..2155f3e72c9 100644 --- a/strings/ctype-big5.c +++ b/strings/ctype-big5.c @@ -213,7 +213,9 @@ static uint16 big5strokexfrm(uint16 i) return 0xA140; } -int my_strnncoll_big5(const uchar * s1, int len1, const uchar * s2, int len2) +int my_strnncoll_big5(CHARSET_INFO *cs, + const uchar * s1, uint len1, + const uchar * s2, uint len2) { uint len; @@ -235,10 +237,11 @@ int my_strnncoll_big5(const uchar * s1, int len1, const uchar * s2, int len2) return (int) (len1-len2); } -int my_strnxfrm_big5(uchar * dest, const uchar * src, int len, int srclen) +int my_strnxfrm_big5(CHARSET_INFO *cs, + uchar * dest, uint len, + const uchar * src, uint srclen) { uint16 e; - /*uchar *d = dest; XXX: unused*/ len = srclen; while (len--) @@ -323,7 +326,8 @@ int my_strxfrm_big5(uchar * dest, const uchar * src, int len) #define wild_one '_' #define wild_many '%' -my_bool my_like_range_big5(const char *ptr,uint ptr_length,pchar escape, +my_bool my_like_range_big5(CHARSET_INFO *cs, + const char *ptr,uint ptr_length,pchar escape, uint res_length, char *min_str,char *max_str, uint *min_length,uint *max_length) { diff --git a/strings/ctype-czech.c b/strings/ctype-czech.c index 4564ca2361b..7db37c0b5d9 100644 --- a/strings/ctype-czech.c +++ b/strings/ctype-czech.c @@ -280,7 +280,9 @@ int my_strxfrm_czech(uchar * dest, const uchar * src, int len) /* Function strnncoll, actually strcoll, with Czech sorting, which expect the length of the strings being specified */ -int my_strnncoll_czech(const uchar * s1, int len1, const uchar * s2, int len2) +int my_strnncoll_czech(CHARSET_INFO *cs, + const uchar * s1, uint len1, + const uchar * s2, uint len2) { int v1, v2; const uchar * p1, * p2, * store1, * store2; @@ -292,8 +294,8 @@ int my_strnncoll_czech(const uchar * s1, int len1, const uchar * s2, int len2) do { - NEXT_CMP_VALUE(s1, p1, store1, pass1, v1, len1); - NEXT_CMP_VALUE(s2, p2, store2, pass2, v2, len2); + NEXT_CMP_VALUE(s1, p1, store1, pass1, v1, (int)len1); + NEXT_CMP_VALUE(s2, p2, store2, pass2, v2, (int)len2); diff = v1 - v2; if (diff != 0) return diff; @@ -304,7 +306,9 @@ int my_strnncoll_czech(const uchar * s1, int len1, const uchar * s2, int len2) /* Function strnxfrm, actually strxfrm, with Czech sorting, which expect the length of the strings being specified */ -int my_strnxfrm_czech(uchar * dest, const uchar * src, int len, int srclen) +int my_strnxfrm_czech(CHARSET_INFO *cs, + uchar * dest, uint len, + const uchar * src, uint srclen) { int value; const uchar * p, * store; @@ -314,8 +318,8 @@ int my_strnxfrm_czech(uchar * dest, const uchar * src, int len, int srclen) do { - NEXT_CMP_VALUE(src, p, store, pass, value, srclen); - ADD_TO_RESULT(dest, len, totlen, value); + NEXT_CMP_VALUE(src, p, store, pass, value, (int)srclen); + ADD_TO_RESULT(dest, (int)len, totlen, value); } while (value); return totlen; @@ -372,7 +376,8 @@ int my_strnxfrm_czech(uchar * dest, const uchar * src, int len, int srclen) #define EXAMPLE -my_bool my_like_range_czech(const char *ptr,uint ptr_length,pchar escape, +my_bool my_like_range_czech(CHARSET_INFO *cs, + const char *ptr,uint ptr_length,pchar escape, uint res_length, char *min_str,char *max_str, uint *min_length,uint *max_length) { diff --git a/strings/ctype-gbk.c b/strings/ctype-gbk.c index 9fccce175d8..3ef37d2f6bb 100644 --- a/strings/ctype-gbk.c +++ b/strings/ctype-gbk.c @@ -2579,7 +2579,9 @@ static uint16 gbksortorder(uint16 i) } -int my_strnncoll_gbk(const uchar * s1, int len1, const uchar * s2, int len2) +int my_strnncoll_gbk(CHARSET_INFO *cs, + const uchar * s1, uint len1, + const uchar * s2, uint len2) { uint len,c1,c2; @@ -2603,13 +2605,10 @@ int my_strnncoll_gbk(const uchar * s1, int len1, const uchar * s2, int len2) return (int) (len1-len2); } -int my_strcoll_gbk(const uchar * s1, const uchar * s2) -{ - return my_strnncoll_gbk(s1, (uint) strlen((char*) s1), - s2, (uint) strlen((char*) s2)); -} -int my_strnxfrm_gbk(uchar * dest, const uchar * src, int len, int srclen) +int my_strnxfrm_gbk(CHARSET_INFO *cs, + uchar * dest, uint len, + const uchar * src, uint srclen) { uint16 e; @@ -2629,10 +2628,6 @@ int my_strnxfrm_gbk(uchar * dest, const uchar * src, int len, int srclen) return srclen; } -int my_strxfrm_gbk(uchar * dest, const uchar * src, int len) -{ - return my_strnxfrm_gbk(dest,src,len,(uint) strlen((char*) src)); -} /* ** Calculate min_str and max_str that ranges a LIKE string. @@ -2655,7 +2650,8 @@ int my_strxfrm_gbk(uchar * dest, const uchar * src, int len) #define wild_one '_' #define wild_many '%' -extern my_bool my_like_range_gbk(const char *ptr,uint ptr_length,pchar escape, +extern my_bool my_like_range_gbk(CHARSET_INFO *cs, + const char *ptr,uint ptr_length,pchar escape, uint res_length, char *min_str,char *max_str, uint *min_length,uint *max_length) { diff --git a/strings/ctype-latin1_de.c b/strings/ctype-latin1_de.c index 86b667b8f40..961112a65b4 100644 --- a/strings/ctype-latin1_de.c +++ b/strings/ctype-latin1_de.c @@ -162,8 +162,9 @@ uchar sort_order_latin1_de[] = { } -int my_strnncoll_latin1_de(const uchar * s1, int len1, - const uchar * s2, int len2) +int my_strnncoll_latin1_de(CHARSET_INFO *cs, + const uchar * s1, uint len1, + const uchar * s2, uint len2) { const uchar *e1 = s1 + len1; const uchar *e2 = s2 + len2; @@ -235,7 +236,9 @@ int my_strnncoll_latin1_de(const uchar * s1, int len1, } -int my_strnxfrm_latin1_de(uchar * dest, const uchar * src, int len, int srclen) +int my_strnxfrm_latin1_de(CHARSET_INFO *cs, + uchar * dest, uint len, + const uchar * src, uint srclen) { const uchar *dest_orig = dest; const uchar *de = dest + len; @@ -274,19 +277,6 @@ int my_strnxfrm_latin1_de(uchar * dest, const uchar * src, int len, int srclen) } -int my_strcoll_latin1_de(const uchar * s1, const uchar * s2) -{ - /* XXX QQ: This should be fixed to not call strlen */ - return my_strnncoll_latin1_de(s1, strlen((char*) s1), - s2, strlen((char*) s2)); -} - -int my_strxfrm_latin1_de(uchar * dest, const uchar * src, int len) -{ - /* XXX QQ: This should be fixed to not call strlen */ - return my_strnxfrm_latin1_de(dest, src, len, strlen((char*) src)); -} - /* * Calculate min_str and max_str that ranges a LIKE string. * Arguments: @@ -311,7 +301,8 @@ int my_strxfrm_latin1_de(uchar * dest, const uchar * src, int len) #define wild_one '_' #define wild_many '%' -my_bool my_like_range_latin1_de(const char *ptr, uint ptr_length, +my_bool my_like_range_latin1_de(CHARSET_INFO *cs, + const char *ptr, uint ptr_length, pchar escape, uint res_length, char *min_str, char *max_str, uint *min_length, uint *max_length) diff --git a/strings/ctype-mb.c b/strings/ctype-mb.c new file mode 100644 index 00000000000..97de219429c --- /dev/null +++ b/strings/ctype-mb.c @@ -0,0 +1,125 @@ +/* Copyright (C) 2000 MySQL AB + + 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; either version 2 of the License, or + (at your option) any later version. + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#include +#include "m_ctype.h" + +void my_caseup_str_mb(CHARSET_INFO * cs, char *str) +{ + register uint32 l; + register char *end=str+strlen(str); /* BAR TODO: remove strlen() call */ + while (*str) + { + if ((l=my_ismbchar(cs, str,end))) + str+=l; + else + { + *str=(char)my_toupper(cs,(uchar)*str); + str++; + } + } +} + +void my_casedn_str_mb(CHARSET_INFO * cs, char *str) +{ + register uint32 l; + register char *end=str+strlen(str); + while (*str) + { + if ((l=my_ismbchar(cs, str,end))) + str+=l; + else + { + *str=(char)my_tolower(cs,(uchar)*str); + str++; + } + } +} + +void my_caseup_mb(CHARSET_INFO * cs, char *str, uint length) +{ + register uint32 l; + register char *end=str+length; + while (str +#include "m_ctype.h" +#include "dbug.h" +#include "assert.h" + +int my_strnxfrm_simple(CHARSET_INFO * cs, + char *dest, uint len, + const char *src, uint srclen) +{ + DBUG_ASSERT(len >= srclen); + + for ( ; len > 0 ; len-- ) + *dest++= (char) cs->sort_order[(uchar) *src++]; + return srclen; +} + +int my_strnncoll_simple(CHARSET_INFO * cs,const char *s, uint slen, + const char *t, uint tlen) +{ + int len = ( slen > tlen ) ? tlen : slen; + while (len--) + { + if (cs->sort_order[(uchar) *s++] != cs->sort_order[(uchar) *t++]) + return ((int) cs->sort_order[(uchar) s[-1]] - + (int) cs->sort_order[(uchar) t[-1]]); + } + return (int) (slen-tlen); +} + + +void my_caseup_str_8bit(CHARSET_INFO * cs,char *str) +{ + while ((*str = (char) my_toupper(cs,(uchar) *str)) != 0) + str++; +} + + +void my_casedn_str_8bit(CHARSET_INFO * cs,char *str) +{ + while ((*str = (char) my_tolower(cs,(uchar)*str)) != 0) + str++; +} + + +void my_caseup_8bit(CHARSET_INFO * cs, char *str, uint length) +{ + for ( ; length>0 ; length--, str++) + *str= (char) my_toupper(cs,(uchar)*str); +} + +void my_casedn_8bit(CHARSET_INFO * cs, char *str, uint length) +{ + for ( ; length>0 ; length--, str++) + *str= (char)my_tolower(cs,(uchar) *str); +} + + +int my_strcasecmp_8bit(CHARSET_INFO * cs,const char *s, const char *t) +{ + while (my_toupper(cs,(uchar) *s) == my_toupper(cs,(uchar) *t++)) + if (!*s++) return 0; + return ((int) my_toupper(cs,(uchar) s[0]) - (int) my_toupper(cs,(uchar) t[-1])); +} + + +int my_strncasecmp_8bit(CHARSET_INFO * cs, + const char *s, const char *t, uint len) +{ + while (len-- != 0 && my_toupper(cs,(uchar)*s++) == my_toupper(cs,(uchar)*t++)) ; + return (int) len+1; +} diff --git a/strings/ctype-sjis.c b/strings/ctype-sjis.c index 5d5f64cc5fe..f3c5d8a2920 100644 --- a/strings/ctype-sjis.c +++ b/strings/ctype-sjis.c @@ -198,7 +198,9 @@ int mbcharlen_sjis(uint c) #define sjiscode(c,d) ((((uint) (uchar)(c)) << 8) | (uint) (uchar) (d)) -int my_strnncoll_sjis(const uchar *s1, int len1, const uchar *s2, int len2) +int my_strnncoll_sjis(CHARSET_INFO *cs, + const uchar *s1, uint len1, + const uchar *s2, uint len2) { const uchar *e1 = s1 + len1; const uchar *e2 = s2 + len2; @@ -221,13 +223,9 @@ int my_strnncoll_sjis(const uchar *s1, int len1, const uchar *s2, int len2) return len1 - len2; } -int my_strcoll_sjis(const uchar *s1, const uchar *s2) -{ - return (uint) my_strnncoll_sjis(s1,(uint) strlen((char*) s1), - s2,(uint) strlen((char*) s2)); -} - -int my_strnxfrm_sjis(uchar *dest, const uchar *src, int len, int srclen) +int my_strnxfrm_sjis(CHARSET_INFO *cs, + uchar *dest, uint len, + const uchar *src, uint srclen) { uchar *d_end = dest + len; uchar *s_end = (uchar*) src + srclen; @@ -243,12 +241,6 @@ int my_strnxfrm_sjis(uchar *dest, const uchar *src, int len, int srclen) return srclen; } -int my_strxfrm_sjis(uchar *dest, const uchar *src, int len) -{ - return my_strnxfrm_sjis(dest, src, len, (uint) strlen((char*) src)); -} - - /* ** Calculate min_str and max_str that ranges a LIKE string. ** Arguments: @@ -270,9 +262,10 @@ int my_strxfrm_sjis(uchar *dest, const uchar *src, int len) #define wild_one '_' #define wild_many '%' -my_bool my_like_range_sjis(const char *ptr,uint ptr_length,pchar escape, - uint res_length, char *min_str,char *max_str, - uint *min_length,uint *max_length) +my_bool my_like_range_sjis(CHARSET_INFO *cs, + const char *ptr,uint ptr_length,pchar escape, + uint res_length, char *min_str,char *max_str, + uint *min_length,uint *max_length) { const char *end=ptr+ptr_length; char *min_org=min_str; diff --git a/strings/ctype-tis620.c b/strings/ctype-tis620.c index 370c4c773c6..134ab527ecc 100644 --- a/strings/ctype-tis620.c +++ b/strings/ctype-tis620.c @@ -535,7 +535,9 @@ static uchar* thai2sortable(const uchar * tstr,uint len) Arg: 2 Strings and it compare length Ret: strcmp result */ -int my_strnncoll_tis620(const uchar * s1, int len1, const uchar * s2, int len2) +int my_strnncoll_tis620(CHARSET_INFO *cs, + const uchar * s1, uint len1, + const uchar * s2, uint len2) { uchar *tc1, *tc2; int i; @@ -551,7 +553,9 @@ int my_strnncoll_tis620(const uchar * s1, int len1, const uchar * s2, int len2) Arg: Destination buffer, source string, dest length and source length Ret: Conveted string size */ -int my_strnxfrm_tis620(uchar * dest, const uchar * src, int len, int srclen) +int my_strnxfrm_tis620(CHARSET_INFO *cs, + uchar * dest, uint len, + const uchar * src, uint srclen) { uint bufSize; uchar *tmp; @@ -607,7 +611,8 @@ int my_strxfrm_tis620(uchar * dest, const uchar * src, int len) #define wild_one '_' #define wild_many '%' -my_bool my_like_range_tis620(const char *ptr, uint ptr_length, pchar escape, +my_bool my_like_range_tis620(CHARSET_INFO *cs, + const char *ptr, uint ptr_length, pchar escape, uint res_length, char *min_str, char *max_str, uint *min_length, uint *max_length) { diff --git a/strings/ctype.c b/strings/ctype.c index ab17a16bb54..5e2bb38d4fd 100644 --- a/strings/ctype.c +++ b/strings/ctype.c @@ -1967,8 +1967,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_latin1, sort_order_latin1, 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ NULL, /* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ @@ -1976,7 +1974,13 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -1989,8 +1993,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_big5, sort_order_big5, 1, /* strxfrm_multiply */ - my_strcoll_big5, - my_strxfrm_big5, my_strnncoll_big5, my_strnxfrm_big5, my_like_range_big5, @@ -1998,7 +2000,13 @@ CHARSET_INFO compiled_charsets[] = { ismbchar_big5, ismbhead_big5, mbcharlen_big5, - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_mb, + my_casedn_str_mb, + my_caseup_mb, + my_casedn_mb, + my_strcasecmp_mb, + my_strncasecmp_mb, + 0 }, #endif @@ -2011,8 +2019,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_cp1251, sort_order_cp1251, 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ NULL, /* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ @@ -2020,7 +2026,13 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -2033,8 +2045,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_cp1257, sort_order_cp1257, 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ NULL, /* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ @@ -2042,7 +2052,13 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -2055,8 +2071,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_croat, sort_order_croat, 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ NULL, /* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ @@ -2064,7 +2078,13 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -2077,8 +2097,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_czech, sort_order_czech, 4, /* strxfrm_multiply */ - my_strcoll_czech, - my_strxfrm_czech, my_strnncoll_czech, my_strnxfrm_czech, my_like_range_czech, @@ -2086,7 +2104,13 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -2099,8 +2123,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_danish, sort_order_danish, 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ NULL, /* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ @@ -2108,7 +2130,13 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -2121,8 +2149,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_dec8, sort_order_dec8, 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ NULL, /* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ @@ -2130,7 +2156,13 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -2143,8 +2175,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_dos, sort_order_dos, 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ NULL, /* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ @@ -2152,7 +2182,13 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -2165,8 +2201,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_estonia, sort_order_estonia, 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ NULL, /* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ @@ -2174,7 +2208,13 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -2187,8 +2227,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_euc_kr, sort_order_euc_kr, 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ NULL, /* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ @@ -2196,7 +2234,13 @@ CHARSET_INFO compiled_charsets[] = { ismbchar_euc_kr, ismbhead_euc_kr, mbcharlen_euc_kr, - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_mb, + my_casedn_str_mb, + my_caseup_mb, + my_casedn_mb, + my_strcasecmp_mb, + my_strncasecmp_mb, + 0 }, #endif @@ -2209,8 +2253,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_gb2312, sort_order_gb2312, 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ NULL, /* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ @@ -2218,7 +2260,13 @@ CHARSET_INFO compiled_charsets[] = { ismbchar_gb2312, ismbhead_gb2312, mbcharlen_gb2312, - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_mb, + my_casedn_str_mb, + my_caseup_mb, + my_casedn_mb, + my_strcasecmp_mb, + my_strncasecmp_mb, + 0 }, #endif @@ -2231,8 +2279,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_gbk, sort_order_gbk, 1, /* strxfrm_multiply */ - my_strcoll_gbk, - my_strxfrm_gbk, my_strnncoll_gbk, my_strnxfrm_gbk, my_like_range_gbk, @@ -2240,7 +2286,13 @@ CHARSET_INFO compiled_charsets[] = { ismbchar_gbk, ismbhead_gbk, mbcharlen_gbk, - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_mb, + my_casedn_str_mb, + my_caseup_mb, + my_casedn_mb, + my_strcasecmp_mb, + my_strncasecmp_mb, + 0 }, #endif @@ -2253,8 +2305,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_german1, sort_order_german1, 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ NULL, /* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ @@ -2262,7 +2312,13 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -2275,8 +2331,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_greek, sort_order_greek, 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ NULL, /* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ @@ -2284,7 +2338,13 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -2297,8 +2357,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_hebrew, sort_order_hebrew, 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ NULL, /* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ @@ -2306,7 +2364,13 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -2319,8 +2383,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_hp8, sort_order_hp8, 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ NULL, /* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ @@ -2328,7 +2390,13 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -2341,8 +2409,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_hungarian, sort_order_hungarian, 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ NULL, /* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ @@ -2350,7 +2416,13 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -2363,8 +2435,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_koi8_ru, sort_order_koi8_ru, 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ NULL, /* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ @@ -2372,7 +2442,13 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -2385,8 +2461,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_koi8_ukr, sort_order_koi8_ukr, 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ NULL, /* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ @@ -2394,7 +2468,13 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -2407,8 +2487,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_latin1_de, sort_order_latin1_de, 2, /* strxfrm_multiply */ - my_strcoll_latin1_de, - my_strxfrm_latin1_de, my_strnncoll_latin1_de, my_strnxfrm_latin1_de, my_like_range_latin1_de, @@ -2416,7 +2494,13 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -2429,8 +2513,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_latin2, sort_order_latin2, 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ NULL, /* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ @@ -2438,7 +2520,13 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -2451,8 +2539,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_latin5, sort_order_latin5, 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ NULL, /* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ @@ -2460,7 +2546,13 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -2473,8 +2565,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_sjis, sort_order_sjis, 1, /* strxfrm_multiply */ - my_strcoll_sjis, - my_strxfrm_sjis, my_strnncoll_sjis, my_strnxfrm_sjis, my_like_range_sjis, @@ -2482,7 +2572,13 @@ CHARSET_INFO compiled_charsets[] = { ismbchar_sjis, ismbhead_sjis, mbcharlen_sjis, - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -2495,8 +2591,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_swe7, sort_order_swe7, 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ NULL, /* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ @@ -2504,7 +2598,13 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -2517,8 +2617,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_tis620, sort_order_tis620, 4, /* strxfrm_multiply */ - my_strcoll_tis620, - my_strxfrm_tis620, my_strnncoll_tis620, my_strnxfrm_tis620, my_like_range_tis620, @@ -2526,7 +2624,13 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -2539,8 +2643,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_ujis, sort_order_ujis, 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ NULL, /* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ @@ -2548,7 +2650,13 @@ CHARSET_INFO compiled_charsets[] = { ismbchar_ujis, ismbhead_ujis, mbcharlen_ujis, - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_mb, + my_casedn_str_mb, + my_caseup_mb, + my_casedn_mb, + my_strcasecmp_mb, + my_strncasecmp_mb, + 0 }, #endif @@ -2561,8 +2669,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_usa7, sort_order_usa7, 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ NULL, /* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ @@ -2570,7 +2676,13 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -2583,8 +2695,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_win1250, sort_order_win1250, 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ NULL, /* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ @@ -2592,7 +2702,13 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -2605,8 +2721,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_win1251ukr, sort_order_win1251ukr, 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ NULL, /* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ @@ -2614,7 +2728,13 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -2627,8 +2747,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_armscii8, sort_order_armscii8, 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ NULL, /* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ @@ -2636,7 +2754,13 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -2649,8 +2773,6 @@ CHARSET_INFO compiled_charsets[] = { to_upper_win1251, sort_order_win1251, 0, /* strxfrm_multiply */ - NULL, /* strcoll */ - NULL, /* strxfrm */ NULL, /* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ @@ -2658,7 +2780,13 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - NULL,NULL,NULL,NULL,NULL,NULL + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 }, #endif @@ -2673,18 +2801,23 @@ CHARSET_INFO compiled_charsets[] = { NULL, NULL, NULL, + 0, + NULL, + NULL, + NULL, + NULL, NULL, NULL, - 0, NULL, NULL, NULL, - NULL,NULL,NULL,NULL,NULL,NULL + 0 } }; CHARSET_INFO *default_charset_info = &compiled_charsets[0]; +CHARSET_INFO *system_charset_info = &compiled_charsets[0]; CHARSET_INFO *find_compiled_charset(uint cs_number) { diff --git a/strings/str2int.c b/strings/str2int.c index 58669287473..d7e6bb9aabc 100644 --- a/strings/str2int.c +++ b/strings/str2int.c @@ -98,7 +98,7 @@ char *str2int(register const char *src, register int radix, long int lower, converted value (and the scale!) as *negative* numbers, so the sign is the opposite of what you might expect. */ - while (isspace(*src)) src++; + while (my_isspace(system_charset_info,*src)) src++; sign = -1; if (*src == '+') src++; else if (*src == '-') src++, sign = 1; diff --git a/strings/strto.c b/strings/strto.c index 84dccbcbeb8..9af101296a3 100644 --- a/strings/strto.c +++ b/strings/strto.c @@ -95,7 +95,7 @@ function (const char *nptr,char **endptr,int base) s = nptr; /* Skip white space. */ - while (isspace (*s)) + while (my_isspace (system_charset_info, *s)) ++s; if (*s == '\0') { @@ -116,7 +116,7 @@ function (const char *nptr,char **endptr,int base) else negative = 0; - if (base == 16 && s[0] == '0' && toupper (s[1]) == 'X') + if (base == 16 && s[0] == '0' && my_toupper (system_charset_info, s[1]) == 'X') s += 2; /* If BASE is zero, figure it out ourselves. */ @@ -124,7 +124,7 @@ function (const char *nptr,char **endptr,int base) { if (*s == '0') { - if (toupper (s[1]) == 'X') + if (my_toupper (system_charset_into, s[1]) == 'X') { s += 2; base = 16; @@ -146,10 +146,10 @@ function (const char *nptr,char **endptr,int base) i = 0; for (c = *s; c != '\0'; c = *++s) { - if (isdigit (c)) + if (my_isdigit (system_charset_info, c)) c -= '0'; - else if (isalpha (c)) - c = toupper (c) - 'A' + 10; + else if (my_isalpha (system_charset_info, c)) + c = my_toupper (system_charset_into, c) - 'A' + 10; else break; if (c >= base) diff --git a/tools/mysqlmanager.c b/tools/mysqlmanager.c index bd43c6bc0ec..9dbf433d8a1 100644 --- a/tools/mysqlmanager.c +++ b/tools/mysqlmanager.c @@ -402,8 +402,8 @@ static int exec_line(struct manager_thd* thd,char* buf,char* buf_end) { char* p=buf; struct manager_cmd* cmd; - for (;pfatal=1; return 1; } - for (;phandler_func(thd,p,buf_end); } @@ -691,7 +691,7 @@ HANDLE_DECL(handle_query) int num_fields,i,ident_len; char* ident,*query; query=ident=args_start; - while (!isspace(*query)) + while (!my_isspace(system_charset_info,*query)) query++; if (query == ident) { @@ -699,7 +699,7 @@ HANDLE_DECL(handle_query) goto err; } ident_len=(int)(query-ident); - while (querycmd_buf,p=thd->user,p_end=p+MAX_USER_NAME; bufuser, (uint)(p-thd->user)))) return 1; - for (;isspace(*buf) && buf Date: Thu, 14 Mar 2002 20:52:48 +0400 Subject: use String->charset instead of default_charset_info client/mysql.cc: default_charset_info -> system_charset_info include/m_ctype.h: Remove old ctype mysys/charset.c: Initialize fields after dynamic charset loading sql/sql_parse.cc: default_charset_info -> system_charset_info --- client/mysql.cc | 12 ++++++------ include/m_ctype.h | 39 ++++----------------------------------- mysys/charset.c | 10 ++++++++++ sql/item_func.cc | 11 +++++------ sql/item_strfunc.cc | 37 ++++++++++++++++++++----------------- sql/sql_parse.cc | 4 ++-- sql/sql_string.cc | 2 +- 7 files changed, 48 insertions(+), 67 deletions(-) diff --git a/client/mysql.cc b/client/mysql.cc index 5f79dd6b8d7..9bea7c73ef4 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -972,13 +972,13 @@ static bool add_line(String &buffer,char *line,char *in_string) for (pos=out=line ; (inchar= (uchar) *pos) ; pos++) { - if (my_isspace(default_charset_info,inchar) && out == line && + if (my_isspace(system_charset_info,inchar) && out == line && buffer.is_empty()) continue; #ifdef USE_MB int l; - if (use_mb(default_charset_info) && - (l = my_ismbchar(default_charset_info, pos, strend))) { + if (use_mb(system_charset_info) && + (l = my_ismbchar(system_charset_info, pos, strend))) { while (l--) *out++ = *pos++; pos--; @@ -1813,8 +1813,8 @@ safe_put_field(const char *pos,ulong length) { #ifdef USE_MB int l; - if (use_mb(default_charset_info) && - (l = my_ismbchar(default_charset_info, pos, end))) { + if (use_mb(system_charset_info) && + (l = my_ismbchar(system_charset_info, pos, end))) { while (l--) tee_putc(*pos++, PAGER); pos--; @@ -2361,7 +2361,7 @@ com_status(String *buffer __attribute__((unused)), tee_fprintf(stdout, "Protocol version:\t%d\n", mysql_get_proto_info(&mysql)); tee_fprintf(stdout, "Connection:\t\t%s\n", mysql_get_host_info(&mysql)); tee_fprintf(stdout, "Client characterset:\t%s\n", - default_charset_info->name); + system_charset_info->name); tee_fprintf(stdout, "Server characterset:\t%s\n", mysql.charset->name); if (strstr(mysql_get_host_info(&mysql),"TCP/IP") || ! mysql.unix_socket) tee_fprintf(stdout, "TCP port:\t\t%d\n", mysql.port); diff --git a/include/m_ctype.h b/include/m_ctype.h index 43ae23e7ac3..f46b7ef651f 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -170,33 +170,6 @@ extern my_bool ismbhead_ujis(uint); extern int mbcharlen_ujis(uint); -/* Don't include std ctype.h when this is included */ -#define _CTYPE_H -#define _CTYPE_H_ -#define _CTYPE_INCLUDED -#define __CTYPE_INCLUDED -#define _CTYPE_USING /* Don't put names in global namespace. */ - -/* Fix things, if ctype.h would have been included before */ -#undef toupper -#undef _toupper -#undef _tolower -#undef toupper -#undef tolower -#undef isalpha -#undef isupper -#undef islower -#undef isdigit -#undef isxdigit -#undef isalnum -#undef isspace -#undef ispunct -#undef isprint -#undef isgraph -#undef iscntrl -#undef isascii -#undef toascii - #define _U 01 /* Upper case */ #define _L 02 /* Lower case */ #define _N 04 /* Numeral (digit) */ @@ -207,14 +180,10 @@ extern int mbcharlen_ujis(uint); #define _X 0200 /* heXadecimal digit */ -#define isascii(c) (!((c) & ~0177)) -#define toascii(c) ((c) & 0177) -#define tocntrl(c) ((c) & 31) -#define toprint(c) ((c) | 64) - -#ifdef ctype -#undef ctype -#endif /* ctype */ +#define my_isascii(c) (!((c) & ~0177)) +#define my_toascii(c) ((c) & 0177) +#define my_tocntrl(c) ((c) & 31) +#define my_toprint(c) ((c) | 64) #define my_toupper(s,c) (char) ((s)->to_upper[(uchar) (c)]) #define my_tolower(s,c) (char) ((s)->to_lower[(uchar) (c)]) diff --git a/mysys/charset.c b/mysys/charset.c index 1d84bb67d68..de6ccbf7ea9 100644 --- a/mysys/charset.c +++ b/mysys/charset.c @@ -329,6 +329,14 @@ static CHARSET_INFO *add_charset(uint cs_number, const char *cs_name, myf flags) memcpy((char*) cs->to_upper, (char*) tmp_to_upper, sizeof(tmp_to_upper)); memcpy((char*) cs->sort_order, (char*) tmp_sort_order, sizeof(tmp_sort_order)); + + cs->caseup_str = my_caseup_str_8bit; + cs->casedn_str = my_casedn_str_8bit; + cs->caseup = my_caseup_8bit; + cs->casedn = my_casedn_8bit; + cs->strcasecmp = my_strcasecmp_8bit; + cs->strncasecmp = my_strncasecmp_8bit; + insert_dynamic(&cs_info_table, (gptr) &cs); return cs; } @@ -396,6 +404,7 @@ my_bool set_default_charset(uint cs, myf flags) DBUG_RETURN(TRUE); /* error */ } default_charset_info = new_charset; + system_charset_info = new_charset; DBUG_RETURN(FALSE); } @@ -428,6 +437,7 @@ my_bool set_default_charset_by_name(const char *cs_name, myf flags) } default_charset_info = new_charset; + system_charset_info = new_charset; DBUG_RETURN(FALSE); } diff --git a/sql/item_func.cc b/sql/item_func.cc index 09e3aab08c6..587388d6159 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -830,7 +830,7 @@ longlong Item_func_locate::val_int() { start=(uint) args[2]->val_int()-1; #ifdef USE_MB - if (use_mb(default_charset_info)) + if (use_mb(a->str_charset)) { start0=start; if (!binary_str) @@ -843,7 +843,7 @@ longlong Item_func_locate::val_int() if (!b->length()) // Found empty string at start return (longlong) (start+1); #ifdef USE_MB - if (use_mb(default_charset_info) && !binary_str) + if (use_mb(a->str_charset) && !binary_str) { const char *ptr=a->ptr()+start; const char *search=b->ptr(); @@ -862,7 +862,7 @@ longlong Item_func_locate::val_int() return (longlong) start0+1; } skipp: - if ((l=my_ismbchar(default_charset_info,ptr,strend))) ptr+=l; + if ((l=my_ismbchar(a->str_charset,ptr,strend))) ptr+=l; else ++ptr; ++start0; } @@ -913,11 +913,10 @@ longlong Item_func_ord::val_int() null_value=0; if (!res->length()) return 0; #ifdef USE_MB - if (use_mb(default_charset_info) && !args[0]->binary) + if (use_mb(res->str_charset) && !args[0]->binary) { register const char *str=res->ptr(); - register uint32 n=0, l=my_ismbchar(default_charset_info, - str,str+res->length()); + register uint32 n=0, l=my_ismbchar(res->str_charset,str,str+res->length()); if (!l) return (longlong)((uchar) *str); while (l--) n=(n<<8)|(uint32)((uchar) *str++); diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index de07f5b1ee7..a9ba3526e1c 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -510,7 +510,7 @@ String *Item_func_reverse::val_str(String *str) ptr = (char *) res->ptr(); end=ptr+res->length(); #ifdef USE_MB - if (use_mb(default_charset_info) && !binary) + if (use_mb(res->str_charset) && !binary) { String tmpstr; tmpstr.copy(*res); @@ -518,7 +518,7 @@ String *Item_func_reverse::val_str(String *str) register uint32 l; while (ptr < end) { - if ((l=my_ismbchar(default_charset_info, ptr,end))) + if ((l=my_ismbchar(res->str_charset, ptr,end))) tmp-=l, memcpy(tmp,ptr,l), ptr+=l; else *--tmp=*ptr++; @@ -561,8 +561,7 @@ String *Item_func_replace::val_str(String *str) #ifdef USE_MB const char *ptr,*end,*strend,*search,*search_end; register uint32 l; - bool binary_str = (args[0]->binary || args[1]->binary || - !use_mb(default_charset_info)); + bool binary_str; #endif null_value=0; @@ -573,6 +572,10 @@ String *Item_func_replace::val_str(String *str) if (args[1]->null_value) goto null; +#ifdef USE_MB + binary_str = (args[0]->binary || args[1]->binary || !use_mb(res->str_charset)); +#endif + if (res2->length() == 0) return res; #ifndef USE_MB @@ -618,7 +621,7 @@ redo: goto redo; } skipp: - if ((l=my_ismbchar(default_charset_info, ptr,strend))) ptr+=l; + if ((l=my_ismbchar(res->str_charset, ptr,strend))) ptr+=l; else ++ptr; } } @@ -676,7 +679,7 @@ String *Item_func_insert::val_str(String *str) args[3]->null_value) goto null; /* purecov: inspected */ #ifdef USE_MB - if (use_mb(default_charset_info) && !args[0]->binary) + if (use_mb(res->str_charset) && !args[0]->binary) { start=res->charpos(start); length=res->charpos(length,start); @@ -748,7 +751,7 @@ String *Item_func_left::val_str(String *str) if (length <= 0) return &empty_string; #ifdef USE_MB - if (use_mb(default_charset_info) && !binary) + if (use_mb(res->str_charset) && !binary) length = res->charpos(length); #endif if (res->length() > (ulong) length) @@ -796,7 +799,7 @@ String *Item_func_right::val_str(String *str) if (res->length() <= (uint) length) return res; /* purecov: inspected */ #ifdef USE_MB - if (use_mb(default_charset_info) && !binary) + if (use_mb(res->str_charset) && !binary) { uint start=res->numchars()-(uint) length; if (start<=0) return res; @@ -829,7 +832,7 @@ String *Item_func_substr::val_str(String *str) (arg_count == 3 && args[2]->null_value)))) return 0; /* purecov: inspected */ #ifdef USE_MB - if (use_mb(default_charset_info) && !binary) + if (use_mb(res->str_charset) && !binary) { start=res->charpos(start); length=res->charpos(length,start); @@ -889,7 +892,7 @@ String *Item_func_substr_index::val_str(String *str) return &empty_string; // Wrong parameters #ifdef USE_MB - if (use_mb(default_charset_info) && !binary) + if (use_mb(res->str_charset) && !binary) { const char *ptr=res->ptr(); const char *strend = ptr+res->length(); @@ -914,7 +917,7 @@ String *Item_func_substr_index::val_str(String *str) continue; } skipp: - if ((l=my_ismbchar(default_charset_info, ptr,strend))) ptr+=l; + if ((l=my_ismbchar(res->str_charset, ptr,strend))) ptr+=l; else ++ptr; } /* either not found or got total number when count<0 */ if (pass == 0) /* count<0 */ @@ -1043,11 +1046,11 @@ String *Item_func_rtrim::val_str(String *str) { char chr=(*remove_str)[0]; #ifdef USE_MB - if (use_mb(default_charset_info) && !binary) + if (use_mb(res->str_charset) && !binary) { while (ptr < end) { - if ((l=my_ismbchar(default_charset_info, ptr,end))) ptr+=l,p=ptr; + if ((l=my_ismbchar(res->str_charset, ptr,end))) ptr+=l,p=ptr; else ++ptr; } ptr=p; @@ -1060,12 +1063,12 @@ String *Item_func_rtrim::val_str(String *str) { const char *r_ptr=remove_str->ptr(); #ifdef USE_MB - if (use_mb(default_charset_info) && !binary) + if (use_mb(res->str_charset) && !binary) { loop: while (ptr + remove_length < end) { - if ((l=my_ismbchar(default_charset_info, ptr,end))) ptr+=l; + if ((l=my_ismbchar(res->str_charset, ptr,end))) ptr+=l; else ++ptr; } if (ptr + remove_length == end && !memcmp(ptr,r_ptr,remove_length)) @@ -1111,14 +1114,14 @@ String *Item_func_trim::val_str(String *str) while (ptr+remove_length <= end && !memcmp(ptr,r_ptr,remove_length)) ptr+=remove_length; #ifdef USE_MB - if (use_mb(default_charset_info) && !binary) + if (use_mb(res->str_charset) && !binary) { char *p=ptr; register uint32 l; loop: while (ptr + remove_length < end) { - if ((l=my_ismbchar(default_charset_info, ptr,end))) ptr+=l; + if ((l=my_ismbchar(res->str_charset, ptr,end))) ptr+=l; else ++ptr; } if (ptr + remove_length == end && !memcmp(ptr,r_ptr,remove_length)) diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index ef6c0eb2a5d..c47d6ddd4bb 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -3043,8 +3043,8 @@ static void remove_escape(char *name) #ifdef USE_MB int l; /* if ((l = ismbchar(name, name+MBMAXLEN))) { Wei He: I think it's wrong */ - if (use_mb(default_charset_info) && - (l = my_ismbchar(default_charset_info, name, strend))) + if (use_mb(system_charset_info) && + (l = my_ismbchar(system_charset_info, name, strend))) { while (l--) *to++ = *name++; diff --git a/sql/sql_string.cc b/sql/sql_string.cc index 62b1812afb3..cf9e9f62507 100644 --- a/sql/sql_string.cc +++ b/sql/sql_string.cc @@ -617,7 +617,7 @@ int wild_case_compare(CHARSET_INFO *cs, const char *str,const char *str_end, { int result= -1; // Not found, using wildcards #ifdef USE_MB - bool use_mb_flag=use_mb(default_charset_info); + bool use_mb_flag=use_mb(cs); #endif while (wildstr != wildend) { -- cgit v1.2.1 From 8959b690fe796a44ddda440290b3fe9a9cf89ca5 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 14 Mar 2002 21:44:42 +0400 Subject: Hash now supports several charsets --- client/mysqltest.c | 3 ++- include/hash.h | 6 ++++-- mysys/hash.c | 30 ++++++++++++++++-------------- sql/ha_berkeley.cc | 2 +- sql/ha_innodb.cc | 2 +- sql/hash_filo.h | 4 ++-- sql/item_func.cc | 3 ++- sql/repl_failsafe.cc | 2 +- sql/slave.cc | 2 +- sql/sql_acl.cc | 11 +++++++---- sql/sql_base.cc | 2 +- sql/sql_cache.cc | 4 ++-- sql/sql_class.cc | 2 +- sql/sql_parse.cc | 3 ++- sql/sql_select.cc | 6 ++++-- sql/sql_udf.cc | 3 ++- sql/table.cc | 1 + tools/mysqlmanager.c | 6 ++++-- 18 files changed, 54 insertions(+), 38 deletions(-) diff --git a/client/mysqltest.c b/client/mysqltest.c index dd71c3255a0..473205e608f 100644 --- a/client/mysqltest.c +++ b/client/mysqltest.c @@ -2325,7 +2325,8 @@ static void var_from_env(const char* name, const char* def_val) static void init_var_hash() { VAR* v; - if (hash_init(&var_hash, 1024, 0, 0, get_var_key, var_free, MYF(0))) + if (hash_init(&var_hash, system_charset_info, + 1024, 0, 0, get_var_key, var_free, MYF(0))) die("Variable hash initialization failed"); var_from_env("MASTER_MYPORT", "9306"); var_from_env("SLAVE_MYPORT", "9307"); diff --git a/include/hash.h b/include/hash.h index 8ca8d9fde02..49a75d98dcb 100644 --- a/include/hash.h +++ b/include/hash.h @@ -40,10 +40,12 @@ typedef struct st_hash { DYNAMIC_ARRAY array; /* Place for hash_keys */ hash_get_key get_key; void (*free)(void *); - uint (*calc_hashnr)(const byte *key,uint length); + uint (*calc_hashnr)(CHARSET_INFO *cs, const byte *key,uint length); + CHARSET_INFO *charset; } HASH; -my_bool hash_init(HASH *hash,uint default_array_elements, uint key_offset, +my_bool hash_init(HASH *hash,CHARSET_INFO *charset, + uint default_array_elements, uint key_offset, uint key_length, hash_get_key get_key, void (*free_element)(void*), uint flags); void hash_free(HASH *tree); diff --git a/mysys/hash.c b/mysys/hash.c index f1ce5052e4f..41ebe59c2de 100644 --- a/mysys/hash.c +++ b/mysys/hash.c @@ -31,12 +31,13 @@ static uint hash_mask(uint hashnr,uint buffmax,uint maxlength); static void movelink(HASH_LINK *array,uint pos,uint next_link,uint newlink); -static uint calc_hashnr(const byte *key,uint length); -static uint calc_hashnr_caseup(const byte *key,uint length); +static uint calc_hashnr(CHARSET_INFO *cs,const byte *key,uint length); +static uint calc_hashnr_caseup(CHARSET_INFO *cs, const byte *key,uint length); static int hashcmp(HASH *hash,HASH_LINK *pos,const byte *key,uint length); -my_bool hash_init(HASH *hash,uint size,uint key_offset,uint key_length, +my_bool hash_init(HASH *hash,CHARSET_INFO *charset, + uint size,uint key_offset,uint key_length, hash_get_key get_key, void (*free_element)(void*),uint flags) { @@ -56,6 +57,7 @@ my_bool hash_init(HASH *hash,uint size,uint key_offset,uint key_length, hash->get_key=get_key; hash->free=free_element; hash->flags=flags; + hash->charset=charset; if (flags & HASH_CASE_INSENSITIVE) hash->calc_hashnr=calc_hashnr_caseup; else @@ -104,14 +106,15 @@ static uint hash_rec_mask(HASH *hash,HASH_LINK *pos,uint buffmax, { uint length; byte *key=hash_key(hash,pos->data,&length,0); - return hash_mask((*hash->calc_hashnr)(key,length),buffmax,maxlength); + return hash_mask((*hash->calc_hashnr)(hash->charset,key,length), + buffmax,maxlength); } #ifndef NEW_HASH_FUNCTION /* Calc hashvalue for a key */ -static uint calc_hashnr(const byte *key,uint length) +static uint calc_hashnr(CHARSET_INFO *cs, const byte *key,uint length) { register uint nr=1, nr2=4; while (length--) @@ -124,14 +127,13 @@ static uint calc_hashnr(const byte *key,uint length) /* Calc hashvalue for a key, case indepenently */ -static uint calc_hashnr_caseup(const byte *key,uint length) +static uint calc_hashnr_caseup(CHARSET_INFO *cs, const byte *key,uint length) { register uint nr=1, nr2=4; while (length--) { - /* BAR TODO: remove default_charset_info */ nr^= (((nr & 63)+nr2)* - ((uint) (uchar) my_toupper(default_charset_info, *key++)))+ (nr << 8); + ((uint) (uchar) my_toupper(cs, *key++)))+ (nr << 8); nr2+=3; } return((uint) nr); @@ -152,7 +154,7 @@ static uint calc_hashnr_caseup(const byte *key,uint length) * This works well on both numbers and strings. */ -uint calc_hashnr(const byte *key, uint len) +uint calc_hashnr(CHARSET_INFO *cs, const byte *key, uint len) { const byte *end=key+len; uint hash; @@ -164,14 +166,14 @@ uint calc_hashnr(const byte *key, uint len) return (hash); } -uint calc_hashnr_caseup(const byte *key, uint len) +uint calc_hashnr_caseup(CHARSET_INFO *cs, const byte *key, uint len) { const byte *end=key+len; uint hash; for (hash = 0; key < end; key++) { hash *= 16777619; - hash ^= (uint) (uchar) toupper(*key); + hash ^= (uint) (uchar) my_toupper(cs,*key); } return (hash); } @@ -186,7 +188,7 @@ uint rec_hashnr(HASH *hash,const byte *record) { uint length; byte *key=hash_key(hash,record,&length,0); - return (*hash->calc_hashnr)(key,length); + return (*hash->calc_hashnr)(hash->charset,key,length); } @@ -202,7 +204,7 @@ gptr hash_search(HASH *hash,const byte *key,uint length) flag=1; if (hash->records) { - idx=hash_mask((*hash->calc_hashnr)(key,length ? length : + idx=hash_mask((*hash->calc_hashnr)(hash->charset,key,length ? length : hash->key_length), hash->blength,hash->records); do @@ -516,7 +518,7 @@ my_bool hash_update(HASH *hash,byte *record,byte *old_key,uint old_key_length) /* Search after record with key */ - idx=hash_mask((*hash->calc_hashnr)(old_key,(old_key_length ? + idx=hash_mask((*hash->calc_hashnr)(hash->charset, old_key,(old_key_length ? old_key_length : hash->key_length)), blength,records); diff --git a/sql/ha_berkeley.cc b/sql/ha_berkeley.cc index 614d1b5abf5..58a090a8aed 100644 --- a/sql/ha_berkeley.cc +++ b/sql/ha_berkeley.cc @@ -168,7 +168,7 @@ bool berkeley_init(void) db_env=0; /* purecov: inspected */ } - (void) hash_init(&bdb_open_tables,32,0,0, + (void) hash_init(&bdb_open_tables,system_charset_info,32,0,0, (hash_get_key) bdb_get_key,0,0); pthread_mutex_init(&bdb_mutex,MY_MUTEX_INIT_FAST); DBUG_RETURN(db_env == 0); diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index d53b027a415..fd2dcf4dfb6 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -666,7 +666,7 @@ innobase_init(void) DBUG_RETURN(1); } - (void) hash_init(&innobase_open_tables,32,0,0, + (void) hash_init(&innobase_open_tables,system_charset_info,32,0,0, (hash_get_key) innobase_get_key,0,0); pthread_mutex_init(&innobase_mutex,MY_MUTEX_INIT_FAST); DBUG_RETURN(0); diff --git a/sql/hash_filo.h b/sql/hash_filo.h index b8d45f0d3be..4d746d9b9bd 100644 --- a/sql/hash_filo.h +++ b/sql/hash_filo.h @@ -75,8 +75,8 @@ public: if (!locked) (void) pthread_mutex_lock(&lock); (void) hash_free(&cache); - (void) hash_init(&cache,size,key_offset, key_length, get_key, free_element, - 0); + (void) hash_init(&cache,system_charset_info,size,key_offset, + key_length, get_key, free_element,0); if (!locked) (void) pthread_mutex_unlock(&lock); first_link=last_link=0; diff --git a/sql/item_func.cc b/sql/item_func.cc index 587388d6159..e25f4c6e94a 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -1421,7 +1421,8 @@ char *ull_get_key(const ULL *ull,uint *length, void item_user_lock_init(void) { pthread_mutex_init(&LOCK_user_locks,MY_MUTEX_INIT_SLOW); - hash_init(&hash_user_locks,16,0,0,(hash_get_key) ull_get_key,NULL,0); + hash_init(&hash_user_locks,system_charset_info, + 16,0,0,(hash_get_key) ull_get_key,NULL,0); } void item_user_lock_free(void) diff --git a/sql/repl_failsafe.cc b/sql/repl_failsafe.cc index 257418d1682..3f16880c18e 100644 --- a/sql/repl_failsafe.cc +++ b/sql/repl_failsafe.cc @@ -184,7 +184,7 @@ static void slave_info_free(void *s) void init_slave_list() { - hash_init(&slave_list, SLAVE_LIST_CHUNK, 0, 0, + hash_init(&slave_list, system_charset_info, SLAVE_LIST_CHUNK, 0, 0, (hash_get_key) slave_list_key, slave_info_free, 0); pthread_mutex_init(&LOCK_slave_list, MY_MUTEX_INIT_FAST); } diff --git a/sql/slave.cc b/sql/slave.cc index 9630cf6aa0e..52f04ef8675 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -470,7 +470,7 @@ int start_slave_threads(bool need_slave_mutex, bool wait_for_start, void init_table_rule_hash(HASH* h, bool* h_inited) { - hash_init(h, TABLE_RULE_HASH_SIZE,0,0, + hash_init(h, system_charset_info,TABLE_RULE_HASH_SIZE,0,0, (hash_get_key) get_table_key, (void (*)(void*)) free_table_ent, 0); *h_inited = 1; diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index 198569cec3c..32630a9537e 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -847,7 +847,7 @@ static void init_check_host(void) DBUG_ENTER("init_check_host"); VOID(init_dynamic_array(&acl_wild_hosts,sizeof(struct acl_host_and_ip), acl_users.elements,1)); - VOID(hash_init(&acl_check_hosts,acl_users.elements,0,0, + VOID(hash_init(&acl_check_hosts,system_charset_info,acl_users.elements,0,0, (hash_get_key) check_get_key,0,HASH_CASE_INSENSITIVE)); if (!allow_all_hosts) { @@ -1424,7 +1424,8 @@ public: key_length =(uint) strlen(d)+(uint) strlen(u)+(uint) strlen(t)+3; hash_key = (char*) alloc_root(&memex,key_length); strmov(strmov(strmov(hash_key,user)+1,db)+1,tname); - (void) hash_init(&hash_columns,0,0,0, (hash_get_key) get_key_column,0, + (void) hash_init(&hash_columns,system_charset_info, + 0,0,0, (hash_get_key) get_key_column,0, HASH_CASE_INSENSITIVE); } @@ -1456,7 +1457,8 @@ public: privs = fix_rights_for_table(privs); cols = fix_rights_for_column(cols); - (void) hash_init(&hash_columns,0,0,0, (hash_get_key) get_key_column,0, + (void) hash_init(&hash_columns,system_charset_info, + 0,0,0, (hash_get_key) get_key_column,0, HASH_CASE_INSENSITIVE); if (cols) { @@ -2143,7 +2145,8 @@ int grant_init (void) DBUG_ENTER("grant_init"); grant_option = FALSE; - (void) hash_init(&hash_tables,0,0,0, (hash_get_key) get_grant_table, + (void) hash_init(&hash_tables,system_charset_info, + 0,0,0, (hash_get_key) get_grant_table, (hash_free_key) free_grant_table,0); init_sql_alloc(&memex,1024,0); diff --git a/sql/sql_base.cc b/sql/sql_base.cc index e73a0c63fa6..d2d38d9a7c4 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -50,7 +50,7 @@ static byte *cache_key(const byte *record,uint *length, void table_cache_init(void) { - VOID(hash_init(&open_cache, + VOID(hash_init(&open_cache,system_charset_info, table_cache_size+16,0,0,cache_key, (void (*)(void*)) free_cache_entry,0)); mysql_rm_tmp_tables(); diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc index 72ac20d8818..78d82f9b420 100644 --- a/sql/sql_cache.cc +++ b/sql/sql_cache.cc @@ -1330,9 +1330,9 @@ ulong Query_cache::init_cache() DUMP(this); - VOID(hash_init(&queries,def_query_hash_size, 0, 0, + VOID(hash_init(&queries,system_charset_info,def_query_hash_size, 0, 0, query_cache_query_get_key, 0, 0)); - VOID(hash_init(&tables,def_table_hash_size, 0, 0, + VOID(hash_init(&tables,system_charset_info,def_table_hash_size, 0, 0, query_cache_table_get_key, 0, 0)); queries_in_cache = 0; diff --git a/sql/sql_class.cc b/sql/sql_class.cc index f6f66b0b7da..d0caa4e7b8c 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -137,7 +137,7 @@ THD::THD():user_time(0),fatal_error(0),last_insert_id_used(0), /* Initialize sub structures */ bzero((char*) &mem_root,sizeof(mem_root)); user_connect=(UC *)0; - hash_init(&user_vars, USER_VARS_HASH_SIZE, 0, 0, + hash_init(&user_vars, system_charset_info, USER_VARS_HASH_SIZE, 0, 0, (hash_get_key) get_var_key, (void (*)(void*)) free_var,0); #ifdef USING_TRANSACTIONS diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index c47d6ddd4bb..7fd3db1fe21 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -269,7 +269,8 @@ static void free_user(struct user_conn *uc) void init_max_user_conn(void) { - (void) hash_init(&hash_user_connections,max_connections,0,0, + (void) hash_init(&hash_user_connections,system_charset_info,max_connections, + 0,0, (hash_get_key) get_key_conn, (void (*)(void*)) free_user, 0); } diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 14feb12c769..1ea85984bcc 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -5874,8 +5874,10 @@ static int remove_dup_with_hash_index(THD *thd, TABLE *table, (uint) (field_count*sizeof(*field_lengths)), NullS)) DBUG_RETURN(1); - if (hash_init(&hash, (uint) file->records, 0, key_length, - (hash_get_key) 0, 0, 0)) + + // BAR TODO: this must be fixed to use charset from "table" argument + if (hash_init(&hash, default_charset_info, (uint) file->records, 0, + key_length,(hash_get_key) 0, 0, 0)) { my_free((char*) key_buffer,MYF(0)); DBUG_RETURN(1); diff --git a/sql/sql_udf.cc b/sql/sql_udf.cc index 9493f969802..f44fa3b7321 100644 --- a/sql/sql_udf.cc +++ b/sql/sql_udf.cc @@ -127,7 +127,8 @@ void udf_init() init_sql_alloc(&mem, 1024,0); THD *new_thd = new THD; if (!new_thd || - hash_init(&udf_hash,32,0,0,get_hash_key, NULL, HASH_CASE_INSENSITIVE)) + hash_init(&udf_hash,system_charset_info, + 32,0,0,get_hash_key, NULL, HASH_CASE_INSENSITIVE)) { sql_print_error("Can't allocate memory for udf structures"); hash_free(&udf_hash); diff --git a/sql/table.cc b/sql/table.cc index 2fa5d41f1ba..eeda172c65d 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -319,6 +319,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, use_hash= outparam->fields >= MAX_FIELDS_BEFORE_HASH; if (use_hash) use_hash= !hash_init(&outparam->name_hash, + system_charset_info, outparam->fields,0,0, (hash_get_key) get_field_name,0, HASH_CASE_INSENSITIVE); diff --git a/tools/mysqlmanager.c b/tools/mysqlmanager.c index 9dbf433d8a1..536b76a1351 100644 --- a/tools/mysqlmanager.c +++ b/tools/mysqlmanager.c @@ -1655,7 +1655,8 @@ static void init_user_hash() FILE* f; char buf[80]; int line_num=1; - if (hash_init(&user_hash,1024,0,0,get_user_key,manager_user_free,MYF(0))) + if (hash_init(&user_hash,system_charset_info,1024,0,0, + get_user_key,manager_user_free,MYF(0))) die("Could not initialize user hash"); if (!(f=fopen(manager_pw_file,"r"))) die("Could not open password file '%s'", manager_pw_file); @@ -1693,7 +1694,8 @@ static void init_pid_file() static void init_globals() { pthread_attr_t thr_attr; - if (hash_init(&exec_hash,1024,0,0,get_exec_key,manager_exec_free,MYF(0))) + if (hash_init(&exec_hash,system_charset_info,1024,0,0, + get_exec_key,manager_exec_free,MYF(0))) die("Exec hash initialization failed"); if (!one_thread) { -- cgit v1.2.1 From 9a0253ffb2ce1a5a79ded187004e8fa142bb1d25 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 14 Mar 2002 22:10:56 +0400 Subject: Removed some default_charset_info --- client/sql_string.cc | 2 +- mysys/hash.c | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/client/sql_string.cc b/client/sql_string.cc index 62b1812afb3..cf9e9f62507 100644 --- a/client/sql_string.cc +++ b/client/sql_string.cc @@ -617,7 +617,7 @@ int wild_case_compare(CHARSET_INFO *cs, const char *str,const char *str_end, { int result= -1; // Not found, using wildcards #ifdef USE_MB - bool use_mb_flag=use_mb(default_charset_info); + bool use_mb_flag=use_mb(cs); #endif while (wildstr != wildend) { diff --git a/mysys/hash.c b/mysys/hash.c index 41ebe59c2de..3faaff1f169 100644 --- a/mysys/hash.c +++ b/mysys/hash.c @@ -275,10 +275,9 @@ static int hashcmp(HASH *hash,HASH_LINK *pos,const byte *key,uint length) { uint rec_keylength; byte *rec_key=hash_key(hash,pos->data,&rec_keylength,1); - /* BAR TODO: remove default_charset_info */ return (length && length != rec_keylength) || (hash->flags & HASH_CASE_INSENSITIVE ? - my_strncasecmp(default_charset_info, rec_key,key,rec_keylength) : + my_strncasecmp(hash->charset, rec_key,key,rec_keylength) : memcmp(rec_key,key,rec_keylength)); } -- cgit v1.2.1 From 1b7471a4313c852618fb10710923ef9b131cb4de Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 14 Mar 2002 23:03:15 +0400 Subject: remove default_charset_info sql/field.h: New function to get charset --- sql/field.h | 1 + sql/filesort.cc | 26 +++++++++++++++++--------- sql/opt_range.cc | 7 ++++--- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/sql/field.h b/sql/field.h index cd1697fcf44..e66865b6fb1 100644 --- a/sql/field.h +++ b/sql/field.h @@ -251,6 +251,7 @@ public: friend class create_field; void make_field(Send_field *); uint size_of() const { return sizeof(*this); } + inline CHARSET_INFO *charset() const { return field_charset; } inline int cmp_image(char *buff,uint length) { if (binary()) diff --git a/sql/filesort.cc b/sql/filesort.cc index 675cc294de4..54bd0543886 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -205,7 +205,7 @@ ha_rows filesort(TABLE *table, SORT_FIELD *sortorder, uint s_length, err: #ifdef USE_STRCOLL - if (use_strcoll(default_charset_info)) + if (param.tmp_buffer) x_free(param.tmp_buffer); #endif x_free((gptr) sort_keys); @@ -470,6 +470,9 @@ static void make_sortkey(register SORTPARAM *param, switch (sort_field->result_type) { case STRING_RESULT: { + // BAR TODO: need checking that it is really Field_str based class + CHARSET_INFO *cs=((Field_str*)(sort_field->field))->charset(); + if (item->maybe_null) *to++=1; /* All item->str() to use some extra byte for end null.. */ @@ -495,7 +498,7 @@ static void make_sortkey(register SORTPARAM *param, length=sort_field->length; } #ifdef USE_STRCOLL - if (use_strcoll(default_charset_info)) + if(use_strcoll(cs)) { if (item->binary) { @@ -512,8 +515,7 @@ static void make_sortkey(register SORTPARAM *param, memcpy(param->tmp_buffer,from,length); from=param->tmp_buffer; } - uint tmp_length=my_strnxfrm(default_charset_info, - to,sort_field->length, + uint tmp_length=my_strnxfrm(cs,to,sort_field->length, (unsigned char *) from, length); if (tmp_length < sort_field->length) bzero((char*) to+tmp_length,sort_field->length-tmp_length); @@ -526,7 +528,7 @@ static void make_sortkey(register SORTPARAM *param, memcpy(to,res->ptr(),length); bzero((char *)to+length,diff); if (!item->binary) - case_sort(default_charset_info, (char*) to,length); + case_sort(cs, (char*) to,length); #ifdef USE_STRCOLL } #endif @@ -923,8 +925,10 @@ sortlength(SORT_FIELD *sortorder, uint s_length) { sortorder->length=sortorder->field->pack_length(); #ifdef USE_STRCOLL - if (use_strcoll(default_charset_info) && !sortorder->field->binary()) - sortorder->length= sortorder->length*default_charset_info->strxfrm_multiply; + // BAR TODO: need checking that it is really Field_str based class + CHARSET_INFO *cs=((Field_str*)(sortorder->field))->charset(); + if (use_strcoll(cs) && !sortorder->field->binary()) + sortorder->length= sortorder->length*cs->strxfrm_multiply; #endif } if (sortorder->field->maybe_null()) @@ -932,12 +936,16 @@ sortlength(SORT_FIELD *sortorder, uint s_length) } else { +#ifdef USE_STRCOLL + // BAR TODO: need checking that it is really Field_str based class + CHARSET_INFO *cs=((Field_str*)(sortorder->field))->charset(); +#endif switch ((sortorder->result_type=sortorder->item->result_type())) { case STRING_RESULT: sortorder->length=sortorder->item->max_length; #ifdef USE_STRCOLL - if (use_strcoll(default_charset_info) && !sortorder->item->binary) - sortorder->length= sortorder->length*default_charset_info->strxfrm_multiply; + if (use_strcoll(cs) && !sortorder->item->binary) + sortorder->length= sortorder->length*cs->strxfrm_multiply; #endif break; case INT_RESULT: diff --git a/sql/opt_range.cc b/sql/opt_range.cc index 8bd47913b7b..9c8b7da6960 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -974,9 +974,10 @@ get_mm_leaf(PARAM *param, Field *field, KEY_PART *key_part, &min_length,&max_length); else { + CHARSET_INFO *charset=((Field_str*)(field))->charset(); #ifdef USE_STRCOLL - if (use_strcoll(default_charset_info)) - like_error= my_like_range(default_charset_info, + if (use_strcoll(charset)) + like_error= my_like_range(charset, res->ptr(),res->length(),wild_prefix, field_length, min_str+maybe_null, max_str+maybe_null,&min_length,&max_length); @@ -985,7 +986,7 @@ get_mm_leaf(PARAM *param, Field *field, KEY_PART *key_part, like_error=like_range(res->ptr(),res->length(),wild_prefix, field_length, min_str+offset,max_str+offset, - default_charset_info->max_sort_char, + charset->max_sort_char, &min_length,&max_length); } if (like_error) // Can't optimize with LIKE -- cgit v1.2.1 From 53bd33c676a4b87e3170ea06f9ff75cdbff48507 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 15 Mar 2002 14:21:06 +0200 Subject: making full-text working with UNION's --- sql/sql_base.cc | 8 ++++---- sql/sql_select.cc | 5 +++-- sql/sql_union.cc | 3 ++- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/sql/sql_base.cc b/sql/sql_base.cc index e73a0c63fa6..69de3393820 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -2180,8 +2180,8 @@ bool remove_table_from_cache(THD *thd, const char *db, const char *table_name, int setup_ftfuncs(THD *thd) { - List_iterator li(thd->lex.select_lex.ftfunc_list), - lj(thd->lex.select_lex.ftfunc_list); + List_iterator li(thd->lex.select->ftfunc_list), + lj(thd->lex.select->ftfunc_list); Item_func_match *ftf, *ftf2; while ((ftf=li++)) @@ -2201,9 +2201,9 @@ int setup_ftfuncs(THD *thd) int init_ftfuncs(THD *thd, bool no_order) { - if (thd->lex.select_lex.ftfunc_list.elements) + if (thd->lex.select->ftfunc_list.elements) { - List_iterator li(thd->lex.select_lex.ftfunc_list); + List_iterator li(thd->lex.select->ftfunc_list); Item_func_match *ifm; DBUG_PRINT("info",("Performing FULLTEXT search")); thd->proc_info="FULLTEXT initialization"; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 14feb12c769..50ca1d71314 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -196,6 +196,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, List all_fields(fields); bool select_distinct; SELECT_LEX *select_lex = &(thd->lex.select_lex); + SELECT_LEX *cur_sel = thd->lex.select; DBUG_ENTER("mysql_select"); /* Check that all tables, fields, conds and order are ok */ @@ -553,7 +554,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, make_join_readinfo(&join, (select_options & (SELECT_DESCRIBE | SELECT_NO_JOIN_CACHE)) | - (select_lex->ftfunc_list.elements ? SELECT_NO_JOIN_CACHE : 0)); + (cur_sel->ftfunc_list.elements ? SELECT_NO_JOIN_CACHE : 0)); /* Need to tell Innobase that to play it safe, it should fetch all columns of the tables: this is because MySQL @@ -1615,7 +1616,7 @@ update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse,JOIN_TAB *join_tab, add_key_part(keyuse,field); } - if (thd->lex.select_lex.ftfunc_list.elements) + if (thd->lex.select->ftfunc_list.elements) { add_ft_keys(keyuse,join_tab,cond,normal_tables); } diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 60155e0ce8d..7d921d6e598 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -126,7 +126,7 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) } union_result->save_time_stamp=!describe; - for (sl=&lex->select_lex;sl;sl=sl->next) + for (sl=lex->select=&lex->select_lex;sl;sl=lex->select=sl->next) { thd->offset_limit=sl->offset_limit; thd->select_limit=sl->select_limit+sl->offset_limit; @@ -155,6 +155,7 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) delete union_result; /* Send result to 'result' */ + lex->select = &lex->select_lex; res =-1; { /* Create a list of fields in the temporary table */ -- cgit v1.2.1 From af87d92aa29ebaabf3aa78d8c7a0e8afc53db2d8 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 19 Mar 2002 14:23:11 +0200 Subject: Some changes from 4.0. Take a look their for details --- mysql-test/r/union.result | 21 +++++++++++++++++++++ mysql-test/t/union.test | 8 ++++++++ sql/sql_union.cc | 2 ++ sql/sql_yacc.yy | 14 +++++++------- 4 files changed, 38 insertions(+), 7 deletions(-) diff --git a/mysql-test/r/union.result b/mysql-test/r/union.result index e842bb3b447..113f6680167 100644 --- a/mysql-test/r/union.result +++ b/mysql-test/r/union.result @@ -77,6 +77,8 @@ a b (select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1); a b 1 a +2 b +3 c (select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1) order by b desc; a b 3 c @@ -157,3 +159,22 @@ testtt tsestset 1 drop table t1; +drop table if exists t1,t2; +create table t1 (a int); +create table t2 (a int); +insert into t1 values (1),(2),(3),(4),(5); +insert into t2 values (11),(12),(13),(14),(15); +(select * from t1 limit 2) union (select * from t2 limit 3) limit 4; +a +1 +2 +11 +12 +(select * from t1 limit 2) union (select * from t2 limit 3); +a +1 +2 +11 +12 +13 +drop table t1,t2; diff --git a/mysql-test/t/union.test b/mysql-test/t/union.test index f782c61d97a..f648ebfd48c 100644 --- a/mysql-test/t/union.test +++ b/mysql-test/t/union.test @@ -77,3 +77,11 @@ SELECT pseudo1 FROM t1 WHERE pseudo='joce' UNION SELECT pseudo FROM t1 WHERE pse SELECT pseudo1 FROM t1 WHERE pseudo='joce' UNION ALL SELECT pseudo FROM t1 WHERE pseudo1='joce'; SELECT pseudo1 FROM t1 WHERE pseudo='joce' UNION SELECT 1; drop table t1; +drop table if exists t1,t2; +create table t1 (a int); +create table t2 (a int); +insert into t1 values (1),(2),(3),(4),(5); +insert into t2 values (11),(12),(13),(14),(15); +(select * from t1 limit 2) union (select * from t2 limit 3) limit 4; +(select * from t1 limit 2) union (select * from t2 limit 3); +drop table t1,t2; diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 7d921d6e598..7532f43a663 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -184,6 +184,8 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) if (thd->select_limit == HA_POS_ERROR) thd->options&= ~OPTION_FOUND_ROWS; } + else + thd->select_limit= HA_POS_ERROR; // no limit if (describe) thd->select_limit= HA_POS_ERROR; // no limit res=mysql_select(thd,&result_table_list, diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index d762c8784a3..3c9c005fb48 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1441,22 +1441,22 @@ select_option_list: select_option: STRAIGHT_JOIN { Select->options|= SELECT_STRAIGHT_JOIN; } - | HIGH_PRIORITY { Lex->lock_option= TL_READ_HIGH_PRIORITY; } + | HIGH_PRIORITY { if (Select != &Lex->select_lex) YYABORT; Lex->lock_option= TL_READ_HIGH_PRIORITY; } | DISTINCT { Select->options|= SELECT_DISTINCT; } | SQL_SMALL_RESULT { Select->options|= SELECT_SMALL_RESULT; } | SQL_BIG_RESULT { Select->options|= SELECT_BIG_RESULT; } - | SQL_BUFFER_RESULT { Select->options|= OPTION_BUFFER_RESULT; } - | SQL_CALC_FOUND_ROWS { Select->options|= OPTION_FOUND_ROWS; } - | SQL_NO_CACHE_SYM { current_thd->safe_to_cache_query=0; } - | SQL_CACHE_SYM { Select->options |= OPTION_TO_QUERY_CACHE; } + | SQL_BUFFER_RESULT { if (Select != &Lex->select_lex) YYABORT; Select->options|= OPTION_BUFFER_RESULT; } + | SQL_CALC_FOUND_ROWS { if (Select != &Lex->select_lex) YYABORT; Select->options|= OPTION_FOUND_ROWS; } + | SQL_NO_CACHE_SYM { if (Select != &Lex->select_lex) YYABORT; current_thd->safe_to_cache_query=0; } + | SQL_CACHE_SYM { if (Select != &Lex->select_lex) YYABORT; Select->options |= OPTION_TO_QUERY_CACHE; } | ALL {} select_lock_type: /* empty */ | FOR_SYM UPDATE_SYM - { Lex->lock_option= TL_WRITE; current_thd->safe_to_cache_query=0; } + { if (Select != &Lex->select_lex) YYABORT; Lex->lock_option= TL_WRITE; current_thd->safe_to_cache_query=0; } | LOCK_SYM IN_SYM SHARE_SYM MODE_SYM - { Lex->lock_option= TL_READ_WITH_SHARED_LOCKS; current_thd->safe_to_cache_query=0; } + { if (Select != &Lex->select_lex) YYABORT; Lex->lock_option= TL_READ_WITH_SHARED_LOCKS; current_thd->safe_to_cache_query=0; } select_item_list: select_item_list ',' select_item -- cgit v1.2.1 From 1fd84d347762c2db01427b8c159072c5e14161a5 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 19 Mar 2002 20:03:10 +0400 Subject: Configure.in/Makefile.in charset related things are now earier to maintain Fixes in charset related C++ code configure.in: Make things to be easier managable include/m_ctype.h: Hide some functions under conditional compilation libmysql/Makefile.shared: Make things to be easier managable sql/item_func.cc: Fixed that private member is not available in this context sql/item_strfunc.cc: Fixed that private member is not available in this context strings/Makefile.am: Make charset things to be easier managable Some fixes in charset C++ code strings/ctype-big5.c: Hide some functions under conditional compilation strings/ctype-czech.c: Hide some functions under conditional compilation strings/ctype-euc_kr.c: Hide some functions under conditional compilation strings/ctype-gb2312.c: Hide some functions under conditional compilation strings/ctype-gbk.c: Hide some functions under conditional compilation strings/ctype-latin1_de.c: Hide some functions under conditional compilation strings/ctype-mb.c: Hide some functions under conditional compilation strings/ctype-sjis.c: Hide some functions under conditional compilation strings/ctype-tis620.c: Hide some functions under conditional compilation strings/ctype-ujis.c: Hide some functions under conditional compilation --- configure.in | 31 +++++-------------------------- include/m_ctype.h | 21 ++++++++++++++++++++- libmysql/Makefile.shared | 11 ++++++----- sql/item_func.cc | 10 +++++----- sql/item_strfunc.cc | 32 ++++++++++++++++---------------- strings/Makefile.am | 12 ++++++------ strings/ctype-big5.c | 4 ++++ strings/ctype-czech.c | 4 ++++ strings/ctype-euc_kr.c | 5 +++++ strings/ctype-gb2312.c | 4 ++++ strings/ctype-gbk.c | 5 +++++ strings/ctype-latin1_de.c | 4 ++++ strings/ctype-mb.c | 4 ++++ strings/ctype-sjis.c | 5 +++++ strings/ctype-tis620.c | 4 ++++ strings/ctype-ujis.c | 5 +++++ 16 files changed, 102 insertions(+), 59 deletions(-) diff --git a/configure.in b/configure.in index 2772a2c92ab..796b6621534 100644 --- a/configure.in +++ b/configure.in @@ -1869,6 +1869,7 @@ CHARSETS_AVAILABLE="armscii8 big5 cp1251 cp1257 latin1 latin1_de latin2 latin5 sjis swe7 tis620 ujis usa7 utf8 win1250 win1251ukr" CHARSETS_DEPRECATED="win1251" +CHARSETS_COMPLEX="big5 czech euc_kr gb2312 gbk latin1_de sjis tis620 ujis" DEFAULT_CHARSET=latin1 AC_DIVERT_POP @@ -1889,15 +1890,11 @@ AC_MSG_CHECKING("character sets") if test "$extra_charsets" = none; then CHARSETS="" elif test "$extra_charsets" = complex; then - CHARSETS=`/bin/ls -1 $srcdir/strings/ctype-*.c | \ - sed -e 's;^.*/ctype-;;' -e 's;.c$;;'` - CHARSETS=`echo $CHARSETS` # get rid of line breaks + CHARSETS="$CHARSETS_COMPLEX" +elif test "$extra_charsets" = all; then + CHARSETS="$CHARSETS_AVAILABLE $CHARSETS_DEPRECATED" else - if test "$extra_charsets" = all; then - CHARSETS="$CHARSETS_AVAILABLE $CHARSETS_DEPRECATED" - else - CHARSETS=`echo $extra_charsets | sed -e 's/,/ /g'` - fi + CHARSETS=`echo $extra_charsets | sed -e 's/,/ /g'` fi use_mb="no" @@ -2018,19 +2015,6 @@ do esac done -CHARSET_SRCS="" -CHARSETS_NEED_SOURCE="" - -for c in $CHARSETS -do - cs_file="$srcdir/strings/ctype-$c.c" - if test -f $cs_file - then - CHARSET_SRCS="${CHARSET_SRCS}ctype-$c.c " - CHARSETS_NEED_SOURCE="$CHARSETS_NEED_SOURCE $c" - fi -done - if test "$use_mb" = "yes" then AC_DEFINE(USE_MB) @@ -2042,11 +2026,6 @@ AC_DEFINE(USE_STRCOLL) AC_SUBST(default_charset) AC_DEFINE_UNQUOTED(DEFAULT_CHARSET_NAME,"$default_charset") -AC_SUBST(CHARSET_SRCS) -CHARSET_OBJS="`echo "$CHARSET_SRCS" | sed -e 's/\.c /.o /g'`" -AC_SUBST(CHARSET_OBJS) -AC_SUBST(CHARSETS_NEED_SOURCE) - AC_MSG_RESULT([default: $default_charset; compiled in: $CHARSETS]) diff --git a/include/m_ctype.h b/include/m_ctype.h index f46b7ef651f..e63e918f838 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -90,15 +90,17 @@ extern void my_casedn_8bit(CHARSET_INFO *, char *, uint); extern int my_strcasecmp_8bit(CHARSET_INFO * cs, const char *, const char *); extern int my_strncasecmp_8bit(CHARSET_INFO * cs, const char *, const char *, uint); +#ifdef USE_MB /* Functions for multibyte charsets */ extern void my_caseup_str_mb(CHARSET_INFO *, char *); extern void my_casedn_str_mb(CHARSET_INFO *, char *); extern void my_caseup_mb(CHARSET_INFO *, char *, uint); extern void my_casedn_mb(CHARSET_INFO *, char *, uint); - extern int my_strcasecmp_mb(CHARSET_INFO * cs,const char *, const char *); extern int my_strncasecmp_mb(CHARSET_INFO * cs,const char *, const char *t, uint); +#endif +#ifdef HAVE_CHARSET_big5 /* declarations for the big5 character set */ extern uchar ctype_big5[], to_lower_big5[], to_upper_big5[], sort_order_big5[]; extern int my_strnncoll_big5(CHARSET_INFO *,const uchar *, uint, const uchar *, uint); @@ -108,7 +110,9 @@ extern my_bool my_like_range_big5(CHARSET_INFO *,const char *, uint, pchar, uint extern int ismbchar_big5(const char *, const char *); extern my_bool ismbhead_big5(uint); extern int mbcharlen_big5(uint); +#endif +#ifdef HAVE_CHARSET_czech /* declarations for the czech character set */ extern uchar ctype_czech[], to_lower_czech[], to_upper_czech[], sort_order_czech[]; extern int my_strnncoll_czech(CHARSET_INFO *, const uchar *, uint, const uchar *, uint); @@ -116,19 +120,25 @@ extern int my_strnxfrm_czech(CHARSET_INFO *, uchar *, uint, const uchar *, u extern my_bool my_like_range_czech(CHARSET_INFO *, const char *, uint, pchar, uint, char *, char *, uint *, uint *); +#endif +#ifdef HAVE_CHARSET_euc_kr /* declarations for the euc_kr character set */ extern uchar ctype_euc_kr[], to_lower_euc_kr[], to_upper_euc_kr[], sort_order_euc_kr[]; extern int ismbchar_euc_kr(const char *, const char *); extern my_bool ismbhead_euc_kr(uint); extern int mbcharlen_euc_kr(uint); +#endif +#ifdef HAVE_CHARSET_gb2312 /* declarations for the gb2312 character set */ extern uchar ctype_gb2312[], to_lower_gb2312[], to_upper_gb2312[], sort_order_gb2312[]; extern int ismbchar_gb2312(const char *, const char *); extern my_bool ismbhead_gb2312(uint); extern int mbcharlen_gb2312(uint); +#endif +#ifdef HAVE_CHARSET_gbk /* declarations for the gbk character set */ extern uchar ctype_gbk[], to_lower_gbk[], to_upper_gbk[], sort_order_gbk[]; extern int my_strnncoll_gbk(CHARSET_INFO *, const uchar *, uint, const uchar *, uint); @@ -138,14 +148,18 @@ extern my_bool my_like_range_gbk(CHARSET_INFO *, const char *, uint, pchar, uint extern int ismbchar_gbk(const char *, const char *); extern my_bool ismbhead_gbk(uint); extern int mbcharlen_gbk(uint); +#endif +#ifdef HAVE_CHARSET_latin1_de /* declarations for the latin1_de character set */ extern uchar ctype_latin1_de[], to_lower_latin1_de[], to_upper_latin1_de[], sort_order_latin1_de[]; extern int my_strnncoll_latin1_de(CHARSET_INFO *, const uchar *, uint, const uchar *, uint); extern int my_strnxfrm_latin1_de(CHARSET_INFO *, uchar *, uint, const uchar *, uint); extern my_bool my_like_range_latin1_de(CHARSET_INFO *, const char *, uint, pchar, uint, char *, char *, uint *, uint *); +#endif +#ifdef HAVE_CHARSET_sjis /* declarations for the sjis character set */ extern uchar ctype_sjis[], to_lower_sjis[], to_upper_sjis[], sort_order_sjis[]; extern int my_strnncoll_sjis(CHARSET_INFO *, const uchar *, uint, const uchar *, uint); @@ -155,19 +169,24 @@ extern my_bool my_like_range_sjis(CHARSET_INFO *, const char *, uint, pchar, uin extern int ismbchar_sjis(const char *, const char *); extern my_bool ismbhead_sjis(uint); extern int mbcharlen_sjis(uint); +#endif +#ifdef HAVE_CHARSET_tis620 /* declarations for the tis620 character set */ extern uchar ctype_tis620[], to_lower_tis620[], to_upper_tis620[], sort_order_tis620[]; extern int my_strnncoll_tis620(CHARSET_INFO *, const uchar *, uint, const uchar *, uint); extern int my_strnxfrm_tis620(CHARSET_INFO *, uchar *, uint, const uchar *, uint); extern my_bool my_like_range_tis620(CHARSET_INFO *, const char *, uint, pchar, uint, char *, char *, uint *, uint *); +#endif +#ifdef HAVE_CHARSET_ujis /* declarations for the ujis character set */ extern uchar ctype_ujis[], to_lower_ujis[], to_upper_ujis[], sort_order_ujis[]; extern int ismbchar_ujis(const char *, const char *); extern my_bool ismbhead_ujis(uint); extern int mbcharlen_ujis(uint); +#endif #define _U 01 /* Upper case */ diff --git a/libmysql/Makefile.shared b/libmysql/Makefile.shared index f9b69124dbe..1dd176bbe27 100644 --- a/libmysql/Makefile.shared +++ b/libmysql/Makefile.shared @@ -27,9 +27,6 @@ pkglib_LTLIBRARIES = $(target) noinst_PROGRAMS = conf_to_src -# We need .lo, not .o files for everything. -CHARSET_OBJS=@CHARSET_OBJS@ -LTCHARSET_OBJS= ${CHARSET_OBJS:.o=.lo} target_sources = libmysql.c net.c password.c manager.c \ get_password.c errmsg.c @@ -41,7 +38,11 @@ mystringsobjects = strmov.lo strxmov.lo strxnmov.lo strnmov.lo \ strcend.lo bcmp.lo \ bchange.lo bmove.lo bmove_upp.lo longlong2str.lo \ strtoull.lo strtoll.lo llstr.lo \ - ctype.lo ctype-simple.lo ctype-mb.lo $(LTCHARSET_OBJS) + ctype.lo ctype-simple.lo ctype-mb.lo \ + ctype-big5.lo ctype-czech.lo ctype-euc_kr.lo \ + ctype-gb2312.lo ctype-gbk.lo ctype-latin1_de.lo \ + ctype-sjis.lo ctype-tis620.lo ctype-ujis.lo + mystringsextra= strto.c dbugobjects = dbug.lo # IT IS IN SAFEMALLOC.C sanity.lo mysysheaders = mysys_priv.h my_static.h @@ -74,7 +75,7 @@ DEFS = -DDEFAULT_CHARSET_HOME="\"$(MYSQLBASEdir)\"" \ -DSHAREDIR="\"$(MYSQLSHAREdir)\"" $(target_defs) # The automatic dependencies miss this -bmove_upp.lo: $(LTCHARSET_OBJS) +#bmove_upp.lo: $(LTCHARSET_OBJS) clean-local: rm -f `echo $(mystringsobjects) | sed "s;\.lo;.c;g"` \ diff --git a/sql/item_func.cc b/sql/item_func.cc index e25f4c6e94a..488fe1314a8 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -830,7 +830,7 @@ longlong Item_func_locate::val_int() { start=(uint) args[2]->val_int()-1; #ifdef USE_MB - if (use_mb(a->str_charset)) + if (use_mb(a->charset())) { start0=start; if (!binary_str) @@ -843,7 +843,7 @@ longlong Item_func_locate::val_int() if (!b->length()) // Found empty string at start return (longlong) (start+1); #ifdef USE_MB - if (use_mb(a->str_charset) && !binary_str) + if (use_mb(a->charset()) && !binary_str) { const char *ptr=a->ptr()+start; const char *search=b->ptr(); @@ -862,7 +862,7 @@ longlong Item_func_locate::val_int() return (longlong) start0+1; } skipp: - if ((l=my_ismbchar(a->str_charset,ptr,strend))) ptr+=l; + if ((l=my_ismbchar(a->charset(),ptr,strend))) ptr+=l; else ++ptr; ++start0; } @@ -913,10 +913,10 @@ longlong Item_func_ord::val_int() null_value=0; if (!res->length()) return 0; #ifdef USE_MB - if (use_mb(res->str_charset) && !args[0]->binary) + if (use_mb(res->charset()) && !args[0]->binary) { register const char *str=res->ptr(); - register uint32 n=0, l=my_ismbchar(res->str_charset,str,str+res->length()); + register uint32 n=0, l=my_ismbchar(res->charset(),str,str+res->length()); if (!l) return (longlong)((uchar) *str); while (l--) n=(n<<8)|(uint32)((uchar) *str++); diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index a9ba3526e1c..cfbfda97148 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -510,7 +510,7 @@ String *Item_func_reverse::val_str(String *str) ptr = (char *) res->ptr(); end=ptr+res->length(); #ifdef USE_MB - if (use_mb(res->str_charset) && !binary) + if (use_mb(res->charset()) && !binary) { String tmpstr; tmpstr.copy(*res); @@ -518,7 +518,7 @@ String *Item_func_reverse::val_str(String *str) register uint32 l; while (ptr < end) { - if ((l=my_ismbchar(res->str_charset, ptr,end))) + if ((l=my_ismbchar(res->charset(), ptr,end))) tmp-=l, memcpy(tmp,ptr,l), ptr+=l; else *--tmp=*ptr++; @@ -573,7 +573,7 @@ String *Item_func_replace::val_str(String *str) goto null; #ifdef USE_MB - binary_str = (args[0]->binary || args[1]->binary || !use_mb(res->str_charset)); + binary_str = (args[0]->binary || args[1]->binary || !use_mb(res->charset())); #endif if (res2->length() == 0) @@ -621,7 +621,7 @@ redo: goto redo; } skipp: - if ((l=my_ismbchar(res->str_charset, ptr,strend))) ptr+=l; + if ((l=my_ismbchar(res->charset(), ptr,strend))) ptr+=l; else ++ptr; } } @@ -679,7 +679,7 @@ String *Item_func_insert::val_str(String *str) args[3]->null_value) goto null; /* purecov: inspected */ #ifdef USE_MB - if (use_mb(res->str_charset) && !args[0]->binary) + if (use_mb(res->charset()) && !args[0]->binary) { start=res->charpos(start); length=res->charpos(length,start); @@ -751,7 +751,7 @@ String *Item_func_left::val_str(String *str) if (length <= 0) return &empty_string; #ifdef USE_MB - if (use_mb(res->str_charset) && !binary) + if (use_mb(res->charset()) && !binary) length = res->charpos(length); #endif if (res->length() > (ulong) length) @@ -799,7 +799,7 @@ String *Item_func_right::val_str(String *str) if (res->length() <= (uint) length) return res; /* purecov: inspected */ #ifdef USE_MB - if (use_mb(res->str_charset) && !binary) + if (use_mb(res->charset()) && !binary) { uint start=res->numchars()-(uint) length; if (start<=0) return res; @@ -832,7 +832,7 @@ String *Item_func_substr::val_str(String *str) (arg_count == 3 && args[2]->null_value)))) return 0; /* purecov: inspected */ #ifdef USE_MB - if (use_mb(res->str_charset) && !binary) + if (use_mb(res->charset()) && !binary) { start=res->charpos(start); length=res->charpos(length,start); @@ -892,7 +892,7 @@ String *Item_func_substr_index::val_str(String *str) return &empty_string; // Wrong parameters #ifdef USE_MB - if (use_mb(res->str_charset) && !binary) + if (use_mb(res->charset()) && !binary) { const char *ptr=res->ptr(); const char *strend = ptr+res->length(); @@ -917,7 +917,7 @@ String *Item_func_substr_index::val_str(String *str) continue; } skipp: - if ((l=my_ismbchar(res->str_charset, ptr,strend))) ptr+=l; + if ((l=my_ismbchar(res->charset(), ptr,strend))) ptr+=l; else ++ptr; } /* either not found or got total number when count<0 */ if (pass == 0) /* count<0 */ @@ -1046,11 +1046,11 @@ String *Item_func_rtrim::val_str(String *str) { char chr=(*remove_str)[0]; #ifdef USE_MB - if (use_mb(res->str_charset) && !binary) + if (use_mb(res->charset()) && !binary) { while (ptr < end) { - if ((l=my_ismbchar(res->str_charset, ptr,end))) ptr+=l,p=ptr; + if ((l=my_ismbchar(res->charset(), ptr,end))) ptr+=l,p=ptr; else ++ptr; } ptr=p; @@ -1063,12 +1063,12 @@ String *Item_func_rtrim::val_str(String *str) { const char *r_ptr=remove_str->ptr(); #ifdef USE_MB - if (use_mb(res->str_charset) && !binary) + if (use_mb(res->charset()) && !binary) { loop: while (ptr + remove_length < end) { - if ((l=my_ismbchar(res->str_charset, ptr,end))) ptr+=l; + if ((l=my_ismbchar(res->charset(), ptr,end))) ptr+=l; else ++ptr; } if (ptr + remove_length == end && !memcmp(ptr,r_ptr,remove_length)) @@ -1114,14 +1114,14 @@ String *Item_func_trim::val_str(String *str) while (ptr+remove_length <= end && !memcmp(ptr,r_ptr,remove_length)) ptr+=remove_length; #ifdef USE_MB - if (use_mb(res->str_charset) && !binary) + if (use_mb(res->charset()) && !binary) { char *p=ptr; register uint32 l; loop: while (ptr + remove_length < end) { - if ((l=my_ismbchar(res->str_charset, ptr,end))) ptr+=l; + if ((l=my_ismbchar(res->charset(), ptr,end))) ptr+=l; else ++ptr; } if (ptr + remove_length == end && !memcmp(ptr,r_ptr,remove_length)) diff --git a/strings/Makefile.am b/strings/Makefile.am index 33d048a42d1..15baa8316e5 100644 --- a/strings/Makefile.am +++ b/strings/Makefile.am @@ -22,23 +22,23 @@ pkglib_LIBRARIES = libmystrings.a # Exact one of ASSEMBLER_X if ASSEMBLER_x86 ASRCS = strings-x86.s longlong2str-x86.s -CSRCS = bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c ctype.c ctype-simple.c ctype-mb.c strnlen.c +CSRCS = bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c strnlen.c ctype.c ctype-simple.c ctype-mb.c ctype-big5.c ctype-czech.c ctype-euc_kr.c ctype-gb2312.c ctype-gbk.c ctype-latin1_de.c ctype-sjis.c ctype-tis620.c ctype-ujis.c else if ASSEMBLER_sparc # These file MUST all be on the same line!! Otherwise automake # generats a very broken makefile ASRCS = bmove_upp-sparc.s strappend-sparc.s strend-sparc.s strinstr-sparc.s strmake-sparc.s strmov-sparc.s strnmov-sparc.s strstr-sparc.s strxmov-sparc.s -CSRCS = strcont.c strfill.c strcend.c is_prefix.c longlong2str.c bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c ctype.c ctype-simple.c ctype-mb.c strnlen.c +CSRCS = strcont.c strfill.c strcend.c is_prefix.c longlong2str.c bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c strnlen.c ctype.c ctype-simple.c ctype-mb.c ctype-big5.c ctype-czech.c ctype-euc_kr.c ctype-gb2312.c ctype-gbk.c ctype-latin1_de.c ctype-sjis.c ctype-tis620.c ctype-ujis.c else #no assembler ASRCS = # These file MUST all be on the same line!! Otherwise automake # generats a very broken makefile -CSRCS = strxmov.c bmove_upp.c strappend.c strcont.c strend.c strfill.c strcend.c is_prefix.c strstr.c strinstr.c strmake.c strnmov.c strmov.c longlong2str.c bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c ctype.c ctype-simple.c ctype-mb.c strnlen.c +CSRCS = strxmov.c bmove_upp.c strappend.c strcont.c strend.c strfill.c strcend.c is_prefix.c strstr.c strinstr.c strmake.c strnmov.c strmov.c longlong2str.c bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c strnlen.c ctype.c ctype-simple.c ctype-mb.c ctype-big5.c ctype-czech.c ctype-euc_kr.c ctype-gb2312.c ctype-gbk.c ctype-latin1_de.c ctype-sjis.c ctype-tis620.c ctype-ujis.c endif endif -libmystrings_a_SOURCES = @CHARSET_SRCS@ $(ASRCS) $(CSRCS) +libmystrings_a_SOURCES = $(ASRCS) $(CSRCS) noinst_PROGRAMS = conf_to_src # Default charset definitions EXTRA_DIST = ctype-big5.c ctype-czech.c ctype-euc_kr.c \ @@ -61,7 +61,7 @@ OMIT_DEPENDENCIES = pthread.h stdio.h __stdio.h stdlib.h __stdlib.h math.h\ sleep.h specific.h version.h pwd.h timers.h uio.h \ cdefs.h machdep.h signal.h __signal.h util.h -libmystrings_a_LIBADD= @CHARSET_OBJS@ +libmystrings_a_LIBADD= conf_to_src_SOURCES = conf_to_src.c conf_to_src_LDADD= #force static linking of conf_to_src - essential when linking against @@ -69,7 +69,7 @@ conf_to_src_LDADD= conf_to_src_LDFLAGS= @NOINST_LDFLAGS@ # This is because the dependency tracking misses @FOO@ vars in sources. -strtoull.o: @CHARSET_OBJS@ +#strtoull.o: @CHARSET_OBJS@ if ASSEMBLER diff --git a/strings/ctype-big5.c b/strings/ctype-big5.c index 2155f3e72c9..a8bda0131f7 100644 --- a/strings/ctype-big5.c +++ b/strings/ctype-big5.c @@ -31,6 +31,8 @@ #include "m_string.h" #include "m_ctype.h" +#ifdef HAVE_CHARSET_big5 + /* Support for Chinese(BIG5) characters, by jou@nematic.ieo.nctu.edu.tw modified by Wei He (hewei@mail.ied.ac.cn) */ @@ -390,3 +392,5 @@ int mbcharlen_big5(uint c) { return (isbig5head(c)? 2: 0); } + +#endif diff --git a/strings/ctype-czech.c b/strings/ctype-czech.c index 7db37c0b5d9..eaf0b1ef38b 100644 --- a/strings/ctype-czech.c +++ b/strings/ctype-czech.c @@ -77,6 +77,8 @@ #endif +#ifdef HAVE_CHARSET_czech + /* These are four tables for four passes of the algorithm. Please see below for what are the "special values" @@ -513,3 +515,5 @@ uchar NEAR sort_order_czech[] = { }; #endif + +#endif diff --git a/strings/ctype-euc_kr.c b/strings/ctype-euc_kr.c index ed8266bf96f..07cea62414b 100644 --- a/strings/ctype-euc_kr.c +++ b/strings/ctype-euc_kr.c @@ -30,6 +30,9 @@ #include "m_string.h" #include "m_ctype.h" +#ifdef HAVE_CHARSET_euc_kr + + uchar NEAR ctype_euc_kr[257] = { 0, /* For standard library */ @@ -196,3 +199,5 @@ int mbcharlen_euc_kr(uint c) { return (iseuc_kr(c) ? 2 : 0); } + +#endif diff --git a/strings/ctype-gb2312.c b/strings/ctype-gb2312.c index 7b9b22f0227..3139bd81d52 100644 --- a/strings/ctype-gb2312.c +++ b/strings/ctype-gb2312.c @@ -28,6 +28,8 @@ #include "m_string.h" #include "m_ctype.h" +#ifdef HAVE_CHARSET_gb2312 + uchar NEAR ctype_gb2312[257] = { 0, /* For standard library */ @@ -178,3 +180,5 @@ int mbcharlen_gb2312(uint c) { return (isgb2312head(c)? 2:0); } + +#endif diff --git a/strings/ctype-gbk.c b/strings/ctype-gbk.c index 3ef37d2f6bb..9a7154f566b 100644 --- a/strings/ctype-gbk.c +++ b/strings/ctype-gbk.c @@ -31,6 +31,9 @@ #include "m_string.h" #include "m_ctype.h" +#ifdef HAVE_CHARSET_gbk + + /* Support for Chinese(GBK) characters, by hewei@mail.ied.ac.cn */ #define isgbkhead(c) (0x81<=(uchar)(c) && (uchar)(c)<=0xfe) @@ -2715,3 +2718,5 @@ int mbcharlen_gbk(uint c) { return (isgbkhead(c)? 2:0); } + +#endif diff --git a/strings/ctype-latin1_de.c b/strings/ctype-latin1_de.c index 961112a65b4..e7bbf1438a6 100644 --- a/strings/ctype-latin1_de.c +++ b/strings/ctype-latin1_de.c @@ -36,6 +36,8 @@ #include "m_string.h" #include "m_ctype.h" +#ifdef HAVE_CHARSET_latin1_de + uchar ctype_latin1_de[] = { 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, @@ -350,3 +352,5 @@ my_bool my_like_range_latin1_de(CHARSET_INFO *cs, *min_str++ = *max_str++ = ' '; // Because if key compression return 0; } + +#endif diff --git a/strings/ctype-mb.c b/strings/ctype-mb.c index 97de219429c..d328ebb7a36 100644 --- a/strings/ctype-mb.c +++ b/strings/ctype-mb.c @@ -17,6 +17,9 @@ #include #include "m_ctype.h" +#ifdef USE_MB + + void my_caseup_str_mb(CHARSET_INFO * cs, char *str) { register uint32 l; @@ -123,3 +126,4 @@ int my_strncasecmp_mb(CHARSET_INFO * cs, return 0; } +#endif diff --git a/strings/ctype-sjis.c b/strings/ctype-sjis.c index f3c5d8a2920..79d4e8a94c7 100644 --- a/strings/ctype-sjis.c +++ b/strings/ctype-sjis.c @@ -21,6 +21,9 @@ #include "m_string.h" #include "m_ctype.h" +#ifdef HAVE_CHARSET_sjis + + /* * This comment is parsed by configure to create ctype.c, * so don't change it unless you know what you are doing. @@ -308,3 +311,5 @@ my_bool my_like_range_sjis(CHARSET_INFO *cs, *min_str++ = *max_str++ = ' '; /* Because if key compression */ return 0; } + +#endif diff --git a/strings/ctype-tis620.c b/strings/ctype-tis620.c index 134ab527ecc..5df8b1d8cc6 100644 --- a/strings/ctype-tis620.c +++ b/strings/ctype-tis620.c @@ -49,6 +49,8 @@ #include "m_ctype.h" #include "t_ctype.h" +#ifdef HAVE_CHARSET_tis620 + static uchar* thai2sortable(const uchar *tstr,uint len); #define BUFFER_MULTIPLY 4 @@ -682,3 +684,5 @@ void ThNormalize(uchar* ptr, uint field_length, const uchar* from, uint length) } } } + +#endif diff --git a/strings/ctype-ujis.c b/strings/ctype-ujis.c index 568b5a69d9d..80c09eedcff 100644 --- a/strings/ctype-ujis.c +++ b/strings/ctype-ujis.c @@ -28,6 +28,9 @@ #include "m_string.h" #include "m_ctype.h" +#ifdef HAVE_CHARSET_ujis + + uchar NEAR ctype_ujis[257] = { 0, /* For standard library */ @@ -198,3 +201,5 @@ int mbcharlen_ujis(uint c) { return (isujis(c)? 2: isujis_ss2(c)? 2: isujis_ss3(c)? 3: 0); } + +#endif -- cgit v1.2.1 From 474e64081b971eae55ae7db834a9ea582f74bad3 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 20 Mar 2002 16:53:43 +0400 Subject: Fixed that selected default charset was not compiled in some cases --- configure.in | 2 ++ 1 file changed, 2 insertions(+) diff --git a/configure.in b/configure.in index 796b6621534..87e225afe05 100644 --- a/configure.in +++ b/configure.in @@ -1897,6 +1897,8 @@ else CHARSETS=`echo $extra_charsets | sed -e 's/,/ /g'` fi +CHARSETS="$DEFAULT_CHARSET $CHARSETS" + use_mb="no" for cs in $CHARSETS -- cgit v1.2.1 From bbde41e9f79b7461da9795bd9ccb9fb314ff5ada Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 20 Mar 2002 17:33:10 +0400 Subject: Fix for crash in the case of non-string fields --- sql/filesort.cc | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/sql/filesort.cc b/sql/filesort.cc index 54bd0543886..69279040643 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -925,10 +925,13 @@ sortlength(SORT_FIELD *sortorder, uint s_length) { sortorder->length=sortorder->field->pack_length(); #ifdef USE_STRCOLL - // BAR TODO: need checking that it is really Field_str based class - CHARSET_INFO *cs=((Field_str*)(sortorder->field))->charset(); - if (use_strcoll(cs) && !sortorder->field->binary()) - sortorder->length= sortorder->length*cs->strxfrm_multiply; + if (!sortorder->field->binary()) + { + // BAR TODO: need checking that it is really Field_str based class + CHARSET_INFO *cs=((Field_str*)(sortorder->field))->charset(); + if (use_strcoll(cs)) + sortorder->length= sortorder->length*cs->strxfrm_multiply; + } #endif } if (sortorder->field->maybe_null()) @@ -937,15 +940,19 @@ sortlength(SORT_FIELD *sortorder, uint s_length) else { #ifdef USE_STRCOLL - // BAR TODO: need checking that it is really Field_str based class - CHARSET_INFO *cs=((Field_str*)(sortorder->field))->charset(); + #endif switch ((sortorder->result_type=sortorder->item->result_type())) { case STRING_RESULT: sortorder->length=sortorder->item->max_length; #ifdef USE_STRCOLL - if (use_strcoll(cs) && !sortorder->item->binary) - sortorder->length= sortorder->length*cs->strxfrm_multiply; + if (!sortorder->item->binary) + { + // BAR TODO: need checking that it is really Field_str based class + CHARSET_INFO *cs=((Field_str*)(sortorder->field))->charset(); + if (use_strcoll(cs)) + sortorder->length= sortorder->length*cs->strxfrm_multiply; + } #endif break; case INT_RESULT: -- cgit v1.2.1 From 9f09ae660bcd27b4c19d85b4515b8566722c9eec Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 20 Mar 2002 20:52:23 +0400 Subject: Added new method to set string's charset sql/item_cmpfunc.cc: Fix for IN, when String->charset is empty --- sql/item_cmpfunc.cc | 3 +++ sql/sql_string.h | 1 + 2 files changed, 4 insertions(+) diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index d4ab03003ce..f1af89cfefc 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -890,6 +890,9 @@ void in_string::set(uint pos,Item *item) String *res=item->val_str(str); if (res && res != str) *str= *res; + // BAR TODO: I'm not sure this is absolutely correct + if (!str->charset()) + str->set_charset(default_charset_info); } byte *in_string::get_value(Item *item) diff --git a/sql/sql_string.h b/sql/sql_string.h index 811e49a0d02..9bf13b93628 100644 --- a/sql/sql_string.h +++ b/sql/sql_string.h @@ -74,6 +74,7 @@ public: { sql_element_free(ptr_arg); } ~String() { free(); } + inline void set_charset(CHARSET_INFO *charset) { str_charset=charset; } inline CHARSET_INFO *charset() const { return str_charset; } inline uint32 length() const { return str_length;} inline uint32 alloced_length() const { return Alloced_length;} -- cgit v1.2.1 From ac44fe1f1248138dfe22b0caa50c21e4d627d394 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 22 Mar 2002 16:06:14 +0400 Subject: filesort.cc: Fixed that i mixed Field and Item in some cases sql/filesort.cc: Fixed that i mixed Field and Item in some cases --- sql/filesort.cc | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/sql/filesort.cc b/sql/filesort.cc index 69279040643..99eceb64703 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -470,8 +470,7 @@ static void make_sortkey(register SORTPARAM *param, switch (sort_field->result_type) { case STRING_RESULT: { - // BAR TODO: need checking that it is really Field_str based class - CHARSET_INFO *cs=((Field_str*)(sort_field->field))->charset(); + CHARSET_INFO *cs=item->str_value.charset(); if (item->maybe_null) *to++=1; @@ -947,9 +946,8 @@ sortlength(SORT_FIELD *sortorder, uint s_length) sortorder->length=sortorder->item->max_length; #ifdef USE_STRCOLL if (!sortorder->item->binary) - { - // BAR TODO: need checking that it is really Field_str based class - CHARSET_INFO *cs=((Field_str*)(sortorder->field))->charset(); + { + CHARSET_INFO *cs=sortorder->item->str_value.charset(); if (use_strcoll(cs)) sortorder->length= sortorder->length*cs->strxfrm_multiply; } -- cgit v1.2.1 From d96a17ffd1e3001b59a60e5e3d1a43e373cc1f2a Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 22 Mar 2002 16:25:22 +0400 Subject: index name can't be used as key name without space character --- mysql-test/r/heap.result | 2 +- mysql-test/t/heap.test | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/heap.result b/mysql-test/r/heap.result index fc4a116307e..5a2cd50237e 100644 --- a/mysql-test/r/heap.result +++ b/mysql-test/r/heap.result @@ -62,7 +62,7 @@ explain select * from t1 where a in (869751,736494,226312,802616); table type possible_keys key key_len ref rows Extra t1 range uniq_id uniq_id 4 NULL 4 where used; Using index drop table t1; -create table t1 (x int not null, y int not null, key x(x), unique y(y)) +create table t1 (x int not null, y int not null, key x (x), unique y (y)) type=heap; insert into t1 values (1,1),(2,2),(1,3),(2,4),(2,5),(2,6); select * from t1 where x=1; diff --git a/mysql-test/t/heap.test b/mysql-test/t/heap.test index b08e8f6ea36..43d6a31bc77 100644 --- a/mysql-test/t/heap.test +++ b/mysql-test/t/heap.test @@ -36,7 +36,7 @@ alter table t1 type=myisam; explain select * from t1 where a in (869751,736494,226312,802616); drop table t1; -create table t1 (x int not null, y int not null, key x(x), unique y(y)) +create table t1 (x int not null, y int not null, key x (x), unique y (y)) type=heap; insert into t1 values (1,1),(2,2),(1,3),(2,4),(2,5),(2,6); select * from t1 where x=1; -- cgit v1.2.1 From 0d835dc3e5215e178bef5bca909f90e92b666f46 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 23 Mar 2002 10:04:42 +0200 Subject: correction test suite to be correct with spatial indexes hack mysql-test/r/myisam.result: prevent determination this index as spatial (due to spatial index determination hack (first dig 'S')) mysql-test/t/myisam.test: prevent determination this index as spatial (due to spatial index determination hack (first dig 'S')) --- mysql-test/r/myisam.result | 2 +- mysql-test/t/myisam.test | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/myisam.result b/mysql-test/r/myisam.result index c5c69c1ba7b..fb18841ac3f 100644 --- a/mysql-test/r/myisam.result +++ b/mysql-test/r/myisam.result @@ -1,7 +1,7 @@ drop table if exists t1; CREATE TABLE t1 ( STRING_DATA char(255) default NULL, -KEY STRING_DATA (STRING_DATA) +KEY string_data (STRING_DATA) ) TYPE=MyISAM; INSERT INTO t1 VALUES ('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); INSERT INTO t1 VALUES ('DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD'); diff --git a/mysql-test/t/myisam.test b/mysql-test/t/myisam.test index 861bc807323..42d1dd6d553 100644 --- a/mysql-test/t/myisam.test +++ b/mysql-test/t/myisam.test @@ -5,7 +5,7 @@ drop table if exists t1; CREATE TABLE t1 ( STRING_DATA char(255) default NULL, - KEY STRING_DATA (STRING_DATA) + KEY string_data (STRING_DATA) ) TYPE=MyISAM; INSERT INTO t1 VALUES ('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -- cgit v1.2.1 From c9ba7c5f21582136747219c0f95be9a1f7b819ee Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 23 Mar 2002 21:00:58 +0200 Subject: making rpl000001 working BUILD/compile-pentium-debug: static linking --- BUILD/FINISH.sh | 1 + BUILD/SETUP.sh | 4 ++++ BUILD/compile-pentium-debug | 2 +- configure.in | 5 ++++- 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/BUILD/FINISH.sh b/BUILD/FINISH.sh index fbeaf1e3c68..82f31a14dc4 100644 --- a/BUILD/FINISH.sh +++ b/BUILD/FINISH.sh @@ -1,5 +1,6 @@ cflags="$c_warnings $extra_flags" cxxflags="$cxx_warnings $base_cxxflags $extra_flags" +extra_configs="$extra_configs $local_infile_configs" configure="./configure $base_configs $extra_configs" for arg do diff --git a/BUILD/SETUP.sh b/BUILD/SETUP.sh index a69cdcb14fd..8c523fc4877 100644 --- a/BUILD/SETUP.sh +++ b/BUILD/SETUP.sh @@ -57,6 +57,10 @@ static_link="--with-mysqld-ldflags=-all-static --with-client-ldflags=-all-static alpha_configs="" # Not used yet pentium_configs="" sparc_configs="" +# we need local-infile in all binaries for rpl000001 +# if you need to disable local-infile in the client, write a build script +# and unset local_infile_configs +local_infile_configs="--enable-local-infile" debug_configs="--with-debug" diff --git a/BUILD/compile-pentium-debug b/BUILD/compile-pentium-debug index 7d25ac4a406..ec6cf23c649 100755 --- a/BUILD/compile-pentium-debug +++ b/BUILD/compile-pentium-debug @@ -8,6 +8,6 @@ c_warnings="$c_warnings $debug_extra_warnings" cxx_warnings="$cxx_warnings $debug_extra_warnings" extra_configs="$pentium_configs $debug_configs" -extra_configs="$extra_configs " +extra_configs="$extra_configs $static_link" . "$path/FINISH.sh" diff --git a/configure.in b/configure.in index 87e225afe05..ebd9bd6b4f9 100644 --- a/configure.in +++ b/configure.in @@ -587,7 +587,10 @@ AC_SUBST(MYSQLD_USER) AC_ARG_ENABLE(local-infile, [ --enable-local-infile If LOAD DATA LOCAL INFILE is enabled by default.], - [ ENABLED_LOCAL_INFILE=$enablewal ], + [ + ENABLED_LOCAL_INFILE=$enablewal + AC_DEFINE(ENABLED_LOCAL_INFILE) + ], [ ENABLED_LOCAL_INFILE=no ] ) -- cgit v1.2.1 From 2ec108107db299b3984a06746388798acbd95b0b Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 26 Mar 2002 15:06:05 +0200 Subject: Derived tables ! mysql-test/r/union.result: small bug fixes in unions BitKeeper/etc/ignore: Added Docs/manual.texi.orig Docs/manual.texi.rej to the ignore list mysql-test/t/union.test: test for a bug fix in union's sql/sql_union.cc: bug fix for unions --- .bzrignore | 2 + mysql-test/r/derived.result | 10 ++++ mysql-test/r/union.result | 10 ++++ mysql-test/t/derived.test | 7 +++ mysql-test/t/union.test | 4 ++ sql/mysql_priv.h | 1 + sql/sql_class.h | 6 ++- sql/sql_derived.cc | 121 ++++++++++++++++++++++++++++++++++++++++++++ sql/sql_lex.h | 8 +-- sql/sql_parse.cc | 18 +++++-- sql/sql_union.cc | 8 ++- sql/sql_yacc.yy | 24 +++++++++ sql/table.h | 1 + 13 files changed, 208 insertions(+), 12 deletions(-) create mode 100644 mysql-test/r/derived.result create mode 100644 mysql-test/t/derived.test create mode 100644 sql/sql_derived.cc diff --git a/.bzrignore b/.bzrignore index f2da28f44f8..cfd2ca463cc 100644 --- a/.bzrignore +++ b/.bzrignore @@ -466,3 +466,5 @@ vio/viotest-ssl libmysqld/gstream.cc libmysqld/spatial.cc sql/sql_yacc.yy.orig +Docs/manual.texi.orig +Docs/manual.texi.rej diff --git a/mysql-test/r/derived.result b/mysql-test/r/derived.result new file mode 100644 index 00000000000..5a41a51463e --- /dev/null +++ b/mysql-test/r/derived.result @@ -0,0 +1,10 @@ +drop table if exists t1,t2; +CREATE TABLE t1 (a int not null, b char (10) not null); +insert into t1 values(1,'a'),(2,'b'),(3,'c'),(3,'c'); +CREATE TABLE t2 (a int not null, b char (10) not null); +insert into t2 values (3,'c'),(4,'d'),(5,'f'),(6,'e'); +select t1.a,t3.y from t1,(select a as y from t2 where b='c') as t3 where t1.a = t3.y; +a y +3 3 +3 3 +drop table if exists t1.t2; diff --git a/mysql-test/r/union.result b/mysql-test/r/union.result index 113f6680167..ef82b414420 100644 --- a/mysql-test/r/union.result +++ b/mysql-test/r/union.result @@ -177,4 +177,14 @@ a 11 12 13 +(select * from t1 limit 2) union (select * from t2 limit 20,3); +a +1 +2 +set SQL_SELECT_LIMIT=2; +(select * from t1 limit 2) union (select * from t2 limit 3); +a +1 +2 +set SQL_SELECT_LIMIT=DEFAULT; drop table t1,t2; diff --git a/mysql-test/t/derived.test b/mysql-test/t/derived.test new file mode 100644 index 00000000000..4a3e8e86d4a --- /dev/null +++ b/mysql-test/t/derived.test @@ -0,0 +1,7 @@ +drop table if exists t1,t2; +CREATE TABLE t1 (a int not null, b char (10) not null); +insert into t1 values(1,'a'),(2,'b'),(3,'c'),(3,'c'); +CREATE TABLE t2 (a int not null, b char (10) not null); +insert into t2 values (3,'c'),(4,'d'),(5,'f'),(6,'e'); +select t1.a,t3.y from t1,(select a as y from t2 where b='c') as t3 where t1.a = t3.y; +drop table if exists t1.t2; \ No newline at end of file diff --git a/mysql-test/t/union.test b/mysql-test/t/union.test index f648ebfd48c..086351e9da1 100644 --- a/mysql-test/t/union.test +++ b/mysql-test/t/union.test @@ -84,4 +84,8 @@ insert into t1 values (1),(2),(3),(4),(5); insert into t2 values (11),(12),(13),(14),(15); (select * from t1 limit 2) union (select * from t2 limit 3) limit 4; (select * from t1 limit 2) union (select * from t2 limit 3); +(select * from t1 limit 2) union (select * from t2 limit 20,3); +set SQL_SELECT_LIMIT=2; +(select * from t1 limit 2) union (select * from t2 limit 3); +set SQL_SELECT_LIMIT=DEFAULT; drop table t1,t2; diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 728d6d7a35f..9f9ec229236 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -335,6 +335,7 @@ int mysql_select(THD *thd,TABLE_LIST *tables,List &list,COND *conds, ORDER *order, ORDER *group,Item *having,ORDER *proc_param, ulong select_type,select_result *result); int mysql_union(THD *thd,LEX *lex,select_result *result); +int mysql_derived(THD *thd,LEX *lex,SELECT_LEX *s, TABLE_LIST *t); Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, Item_result_field ***copy_func, Field **from_field, bool group,bool modify_item); diff --git a/sql/sql_class.h b/sql/sql_class.h index 355987c259e..2c945ce7331 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -659,15 +659,17 @@ class Table_ident :public Sql_alloc { public: LEX_STRING db; LEX_STRING table; + SELECT_LEX *sel; inline Table_ident(LEX_STRING db_arg,LEX_STRING table_arg,bool force) - :table(table_arg) + :table(table_arg), sel((SELECT_LEX *)0) { if (!force && (current_thd->client_capabilities & CLIENT_NO_SCHEMA)) db.str=0; else db= db_arg; } - inline Table_ident(LEX_STRING table_arg) :table(table_arg) {db.str=0;} + inline Table_ident(LEX_STRING table_arg) :table(table_arg), sel((SELECT_LEX *)0) {db.str=0;} + inline Table_ident(SELECT_LEX *s) : sel(s) {db.str=0; table.str=(char *)""; table.length=0;} inline void change_db(char *db_name) { db.str= db_name; db.length=(uint) strlen(db_name); } }; diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc new file mode 100644 index 00000000000..f1b60dd9b84 --- /dev/null +++ b/sql/sql_derived.cc @@ -0,0 +1,121 @@ +/* Copyright (C) 2000 MySQL AB + + 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; either version 2 of the License, or + (at your option) any later version. + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + + +/* + Derived tables + These were introduced by Monty and Sinisa +*/ + + +#include "mysql_priv.h" +#include "sql_select.h" +#include "sql_acl.h" + +static const char *any_db="*any*"; // Special symbol for check_access + + +int mysql_derived(THD *thd, LEX *lex,SELECT_LEX *s, TABLE_LIST *t) +{ + SELECT_LEX *sl=s; + List item_list; + TABLE *table; + int res; + select_union *derived_result; + TABLE_LIST *tables=(TABLE_LIST *)sl->table_list.first; + TMP_TABLE_PARAM tmp_table_param; + DBUG_ENTER("mysql_derived"); + + if (tables) + res=check_table_access(thd,SELECT_ACL, tables); + else + res=check_access(thd, SELECT_ACL, any_db); + if (res) + DBUG_RETURN(-1); + + for (TABLE_LIST *cursor= (TABLE_LIST *)tables; + cursor; + cursor=cursor->next) + { + if (cursor->derived) + { + res=mysql_derived(thd,lex,(SELECT_LEX *)cursor->derived,cursor); + if (res) DBUG_RETURN(res); + } + } + Item *item; + List_iterator it(sl->item_list); + + while ((item= it++)) + item_list.push_back(item); + + if (!(res=open_and_lock_tables(thd,tables))) + { + if (tables && setup_fields(thd,tables,item_list,0,0,1)) + { + res=-1; + goto exit; + } + bzero((char*) &tmp_table_param,sizeof(tmp_table_param)); + tmp_table_param.field_count=item_list.elements; + if (!(table=create_tmp_table(thd, &tmp_table_param, sl->item_list, + (ORDER*) 0, 0, 1, 0, + (sl->options | thd->options | TMP_TABLE_ALL_COLUMNS)))) + { + res=-1; + goto exit; + } + + if ((derived_result=new select_union(table))) + { + thd->offset_limit=sl->offset_limit; + thd->select_limit=sl->select_limit+sl->offset_limit; + if (thd->select_limit < sl->select_limit) + thd->select_limit= HA_POS_ERROR; + if (thd->select_limit == HA_POS_ERROR) + sl->options&= ~OPTION_FOUND_ROWS; + + res=mysql_select(thd, tables, sl->item_list, + sl->where, (ORDER *) sl->order_list.first, + (ORDER*) sl->group_list.first, + sl->having, (ORDER*) NULL, + sl->options | thd->options | SELECT_NO_UNLOCK, + derived_result); + if (!res) + { +// Here we entirely fix both TABLE_LIST and list of SELECT's as there were no derived tables + if (derived_result->flush()) + res=1; + else + { + t->real_name=table->real_name; + t->table=table; + sl->prev->next=sl->next; + t->derived=(SELECT_LEX *)0; // just in case ... + if (!sl->next) lex->last_select = sl; + } + } + delete derived_result; + } + if (res) + free_tmp_table(thd,table); +exit: + close_thread_tables(thd); + if (res > 0) + send_error(&thd->net, ER_UNKNOWN_COM_ERROR); // temporary only ... + } + DBUG_RETURN(res); +} diff --git a/sql/sql_lex.h b/sql/sql_lex.h index c0ede015eb8..5a4cabbfb9c 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -101,7 +101,7 @@ typedef struct st_lex_master_info } LEX_MASTER_INFO; -enum sub_select_type {UNSPECIFIED_TYPE,UNION_TYPE, INTERSECT_TYPE, EXCEPT_TYPE, NOT_A_SELECT}; +enum sub_select_type {UNSPECIFIED_TYPE,UNION_TYPE, INTERSECT_TYPE, EXCEPT_TYPE, NOT_A_SELECT, DERIVED_TABLE_TYPE}; /* The state of the lex parsing for selects */ @@ -120,7 +120,7 @@ typedef struct st_select_lex { List ftfunc_list; uint in_sum_expr, sort_default; bool create_refs, braces; - st_select_lex *next; + st_select_lex *next, *prev; } SELECT_LEX; @@ -141,7 +141,7 @@ public: typedef struct st_lex { uint yylineno,yytoklen; /* Simulate lex */ LEX_YYSTYPE yylval; - SELECT_LEX select_lex, *select; + SELECT_LEX select_lex, *select, *last_select; uchar *ptr,*tok_start,*tok_end,*end_of_query; char *length,*dec,*change,*name; char *backup_dir; /* For RESTORE/BACKUP */ @@ -185,7 +185,7 @@ typedef struct st_lex { uint grant,grant_tot_col,which_columns, union_option, mqh; thr_lock_type lock_option; bool drop_primary,drop_if_exists,local_file; - bool in_comment,ignore_space,verbose,simple_alter, option_type; + bool in_comment,ignore_space,verbose,simple_alter, option_type, derived_tables; } LEX; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 7fd3db1fe21..b916122ee7f 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1226,6 +1226,14 @@ mysql_execute_command(void) Skip if we are in the slave thread, some table rules have been given and the table list says the query should not be replicated */ + if (lex->derived_tables) + { + for (TABLE_LIST *cursor= tables; + cursor; + cursor=cursor->next) + if (cursor->derived && mysql_derived(thd,lex,(SELECT_LEX *)cursor->derived,cursor)) + DBUG_VOID_RETURN; + } if ((lex->select_lex.next && create_total_list(thd,lex,&tables)) || (table_rules_on && tables && thd->slave_thread && !tables_ok(thd,tables))) @@ -2648,7 +2656,7 @@ mysql_init_query(THD *thd) thd->lex.value_list.empty(); thd->lex.select_lex.table_list.elements=0; thd->free_list=0; thd->lex.union_option=0; - thd->lex.select = &thd->lex.select_lex; + thd->lex.select = thd->lex.last_select = &thd->lex.select_lex; thd->lex.select_lex.table_list.first=0; thd->lex.select_lex.table_list.next= (byte**) &thd->lex.select_lex.table_list.first; thd->lex.select_lex.next=0; @@ -2675,7 +2683,7 @@ mysql_init_select(LEX *lex) select_lex->order_list.next= (byte**) &select_lex->order_list.first; select_lex->group_list.first=0; select_lex->group_list.next= (byte**) &select_lex->group_list.first; - select_lex->next = (SELECT_LEX *)NULL; + select_lex->next = select_lex->prev = (SELECT_LEX *)NULL; } bool @@ -2684,8 +2692,9 @@ mysql_new_select(LEX *lex) SELECT_LEX *select_lex = (SELECT_LEX *) lex->thd->calloc(sizeof(SELECT_LEX)); if (!select_lex) return 1; + lex->select=lex->last_select; lex->select->next=select_lex; - lex->select=select_lex; + lex->select=lex->last_select=select_lex; select_lex->table_list.next= (byte**) &select_lex->table_list.first; select_lex->item_list.empty(); select_lex->when_list.empty(); @@ -3099,7 +3108,7 @@ TABLE_LIST *add_table_to_list(Table_ident *table, LEX_STRING *alias, DBUG_RETURN(0); // End of memory alias_str= alias ? alias->str : table->table.str; if (table->table.length > NAME_LEN || - check_table_name(table->table.str,table->table.length) || + (table->table.length && check_table_name(table->table.str,table->table.length)) || table->db.str && check_db_name(table->db.str)) { net_printf(&thd->net,ER_WRONG_TABLE_NAME,table->table.str); @@ -3122,6 +3131,7 @@ TABLE_LIST *add_table_to_list(Table_ident *table, LEX_STRING *alias, ptr->real_name=table->table.str; ptr->lock_type=flags; ptr->updating=updating; + ptr->derived=(SELECT_LEX *)table->sel; if (use_index) ptr->use_index=(List *) thd->memdup((gptr) use_index, sizeof(*use_index)); diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 7532f43a663..1658fa701c5 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -126,8 +126,9 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) } union_result->save_time_stamp=!describe; - for (sl=lex->select=&lex->select_lex;sl;sl=lex->select=sl->next) + for (sl= &lex->select_lex; sl; sl=sl->next) { + lex->select=sl; thd->offset_limit=sl->offset_limit; thd->select_limit=sl->select_limit+sl->offset_limit; if (thd->select_limit < sl->select_limit) @@ -185,7 +186,10 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) thd->options&= ~OPTION_FOUND_ROWS; } else - thd->select_limit= HA_POS_ERROR; // no limit + { + thd->offset_limit= 0; + thd->select_limit= thd->default_select_limit; + } if (describe) thd->select_limit= HA_POS_ERROR; // no limit res=mysql_select(thd,&result_table_list, diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 3c9c005fb48..ee31e726eb1 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2099,6 +2099,30 @@ join_table: } | '{' ident join_table LEFT OUTER JOIN_SYM join_table ON expr '}' { add_join_on($7,$9); $7->outer_join|=JOIN_TYPE_LEFT; $$=$7; } + | '(' SELECT_SYM select_part3 ')' opt_table_alias + { + LEX *lex=Lex; + lex->select=lex->select->prev; + if (!($$=add_table_to_list(new Table_ident(Lex->last_select),$5,0,TL_UNLOCK))) + YYABORT; + } + +select_part3: + { + LEX *lex=Lex; + lex->derived_tables=true; + SELECT_LEX *tmp=lex->select; + if (lex->select->linkage == NOT_A_SELECT || mysql_new_select(lex)) + YYABORT; + mysql_init_select(lex); + lex->select->linkage=DERIVED_TABLE_TYPE; + lex->select->prev=tmp; + } + select_options select_item_list select_intoto + +select_intoto: + limit_clause {} + | select_from opt_outer: /* empty */ {} diff --git a/sql/table.h b/sql/table.h index 259c34030b2..211a8ea816e 100644 --- a/sql/table.h +++ b/sql/table.h @@ -147,6 +147,7 @@ typedef struct st_table_list { bool straight; /* optimize with prev table */ bool updating; /* for replicate-do/ignore table */ bool shared; /* Used twice in union */ + void *derived; } TABLE_LIST; typedef struct st_open_table_list -- cgit v1.2.1 From dae6e2c67b4e936d910f266c46b510565c1b54f0 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 26 Mar 2002 16:53:18 +0200 Subject: Doing what I hate to. Adding entries into the Changelog --- Docs/manual.texi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Docs/manual.texi b/Docs/manual.texi index e15e19fe743..e66babcb636 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -48638,6 +48638,8 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}. @itemize @bullet @item +Added derived tables +@item Allow numeric user id to @code{mysqld --user=#}. @item Fixed a bug where @code{SQL_CALC_ROWS} returned a wrong value when used -- cgit v1.2.1 From a84488d2cd975e0babbf2c2e7e4f23ade2e8b610 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 26 Mar 2002 17:20:02 +0200 Subject: manual.texi bk commit Docs/manual.texi: bk commit --- Docs/manual.texi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Docs/manual.texi b/Docs/manual.texi index e66babcb636..ef0dbcce277 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -48640,6 +48640,8 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}. @item Added derived tables @item +Fixed UNION bug with braces +@item Allow numeric user id to @code{mysqld --user=#}. @item Fixed a bug where @code{SQL_CALC_ROWS} returned a wrong value when used -- cgit v1.2.1 From a84fb9476a7e6ea4d46d5940ab8582bf917867a9 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 26 Mar 2002 17:44:18 +0200 Subject: --- Docs/manual.texi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Docs/manual.texi b/Docs/manual.texi index ef0dbcce277..48f14a60635 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -48642,6 +48642,8 @@ Added derived tables @item Fixed UNION bug with braces @item +Fixed UNION bug with limits +@item Allow numeric user id to @code{mysqld --user=#}. @item Fixed a bug where @code{SQL_CALC_ROWS} returned a wrong value when used -- cgit v1.2.1 From cf3858e4784ee6eef6793b87bc526d05e9b19642 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 27 Mar 2002 16:57:24 +0200 Subject: manual.texi test. Docs/manual.texi: test. --- Docs/manual.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index 48f14a60635..bcedf48e0db 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -48638,7 +48638,7 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}. @itemize @bullet @item -Added derived tables +Added derived tables @item Fixed UNION bug with braces @item -- cgit v1.2.1 From c6cb79baa9748a36308ccd385646fa26bca2bf61 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 27 Mar 2002 17:03:50 +0200 Subject: manual.texi just a test Docs/manual.texi: just a test --- Docs/manual.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index bcedf48e0db..48f14a60635 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -48638,7 +48638,7 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}. @itemize @bullet @item -Added derived tables +Added derived tables @item Fixed UNION bug with braces @item -- cgit v1.2.1 From 907d0c589707cb4ef0ebe75321466557df188197 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 27 Mar 2002 17:23:30 +0200 Subject: manual.texi test Docs/manual.texi: test --- Docs/manual.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index 48f14a60635..bcedf48e0db 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -48638,7 +48638,7 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}. @itemize @bullet @item -Added derived tables +Added derived tables @item Fixed UNION bug with braces @item -- cgit v1.2.1 From 547d3412839d6eb59492b861b3f041ff442f58ff Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 27 Mar 2002 17:28:02 +0200 Subject: manual.texi test Docs/manual.texi: test --- Docs/manual.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index bcedf48e0db..48f14a60635 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -48638,7 +48638,7 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}. @itemize @bullet @item -Added derived tables +Added derived tables @item Fixed UNION bug with braces @item -- cgit v1.2.1 From da8ab3b7fc6fa0289ae71542e98aa2600aa752f9 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 27 Mar 2002 17:54:27 +0200 Subject: manual.texi test . Docs/manual.texi: test . --- Docs/manual.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index 48f14a60635..bcedf48e0db 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -48638,7 +48638,7 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}. @itemize @bullet @item -Added derived tables +Added derived tables @item Fixed UNION bug with braces @item -- cgit v1.2.1 From 1bb4cbf7569b3ff5141b02484279ab0b99cc6ac8 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 27 Mar 2002 18:01:10 +0200 Subject: test --- Docs/manual.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index bcedf48e0db..48f14a60635 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -48638,7 +48638,7 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}. @itemize @bullet @item -Added derived tables +Added derived tables @item Fixed UNION bug with braces @item -- cgit v1.2.1 From d923006d9809bfbdce193220431c25c006e07abf Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 27 Mar 2002 18:02:41 +0200 Subject: manual.texi --- Docs/manual.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index 48f14a60635..45ee5c4a064 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -48638,7 +48638,7 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}. @itemize @bullet @item -Added derived tables +Added derived tables @item Fixed UNION bug with braces @item -- cgit v1.2.1 From 4b267ca8715c53dca71438025bfd90ecdc434c7d Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 27 Mar 2002 18:05:05 +0200 Subject: manual.texi . Docs/manual.texi: . --- Docs/manual.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index 45ee5c4a064..48f14a60635 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -48638,7 +48638,7 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}. @itemize @bullet @item -Added derived tables +Added derived tables @item Fixed UNION bug with braces @item -- cgit v1.2.1 From 3813d786da6b87ce8707f88e34904041dd6f0b75 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 27 Mar 2002 18:07:06 +0200 Subject: manual.texi --- Docs/manual.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index 48f14a60635..bcedf48e0db 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -48638,7 +48638,7 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}. @itemize @bullet @item -Added derived tables +Added derived tables @item Fixed UNION bug with braces @item -- cgit v1.2.1 From 437b0b0e871350b8937c8d37c9c2b2f05299bfb7 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 28 Mar 2002 17:31:46 +0400 Subject: New UTF8 charset strings/ctype-big5.c: New format for mb char functions strings/ctype-euc_kr.c: New format for mb char functions strings/ctype-gb2312.c: New format for mb char functions strings/ctype-gbk.c: New format for mb char functions strings/ctype-sjis.c: New format for mb char functions strings/ctype-ujis.c: New format for mb char functions --- configure.in | 2 +- include/m_ctype.h | 91 ++- libmysql/Makefile.shared | 2 +- sql/init.cc | 5 +- sql/share/charsets/Index | 1 + strings/Makefile.am | 8 +- strings/ctype-big5.c | 6 +- strings/ctype-euc_kr.c | 6 +- strings/ctype-gb2312.c | 6 +- strings/ctype-gbk.c | 6 +- strings/ctype-sjis.c | 16 +- strings/ctype-ujis.c | 6 +- strings/ctype-utf8.c | 1960 ++++++++++++++++++++++++++++++++++++++++++++++ strings/ctype.c | 27 + 14 files changed, 2088 insertions(+), 54 deletions(-) create mode 100644 strings/ctype-utf8.c diff --git a/configure.in b/configure.in index ebd9bd6b4f9..137621260fa 100644 --- a/configure.in +++ b/configure.in @@ -1872,7 +1872,7 @@ CHARSETS_AVAILABLE="armscii8 big5 cp1251 cp1257 latin1 latin1_de latin2 latin5 sjis swe7 tis620 ujis usa7 utf8 win1250 win1251ukr" CHARSETS_DEPRECATED="win1251" -CHARSETS_COMPLEX="big5 czech euc_kr gb2312 gbk latin1_de sjis tis620 ujis" +CHARSETS_COMPLEX="big5 czech euc_kr gb2312 gbk latin1_de sjis tis620 ujis utf8" DEFAULT_CHARSET=latin1 AC_DIVERT_POP diff --git a/include/m_ctype.h b/include/m_ctype.h index e63e918f838..14e0ba337f1 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -29,6 +29,22 @@ extern "C" { #define CHARSET_DIR "charsets/" +#define my_wc_t ulong + +typedef struct unicase_info_st { + uint16 toupper; + uint16 tolower; + uint16 sort; +} MY_UNICASE_INFO; + +#define MY_CS_ILSEQ 0 +#define MY_CS_ILUNI 0 +#define MY_CS_TOOSMALL -1 +#define MY_CS_TOOFEW(n) (-1-(n)) + + + + typedef struct charset_info_st { uint number; @@ -48,9 +64,9 @@ typedef struct charset_info_st char *, char *, uint *, uint *); uint mbmaxlen; - int (*ismbchar)(const char *, const char *); - my_bool (*ismbhead)(uint); - int (*mbcharlen)(uint); + int (*ismbchar)(struct charset_info_st *, const char *, const char *); + my_bool (*ismbhead)(struct charset_info_st *, uint); + int (*mbcharlen)(struct charset_info_st *, uint); /* Functions for case convertion */ void (*caseup_str)(struct charset_info_st *, char *); @@ -107,9 +123,9 @@ extern int my_strnncoll_big5(CHARSET_INFO *,const uchar *, uint, const uchar extern int my_strnxfrm_big5(CHARSET_INFO *,uchar *, uint, const uchar *, uint); extern my_bool my_like_range_big5(CHARSET_INFO *,const char *, uint, pchar, uint, char *, char *, uint *, uint *); -extern int ismbchar_big5(const char *, const char *); -extern my_bool ismbhead_big5(uint); -extern int mbcharlen_big5(uint); +extern int ismbchar_big5(CHARSET_INFO *, const char *, const char *); +extern my_bool ismbhead_big5(CHARSET_INFO *, uint); +extern int mbcharlen_big5(CHARSET_INFO *, uint); #endif #ifdef HAVE_CHARSET_czech @@ -125,17 +141,17 @@ extern my_bool my_like_range_czech(CHARSET_INFO *, #ifdef HAVE_CHARSET_euc_kr /* declarations for the euc_kr character set */ extern uchar ctype_euc_kr[], to_lower_euc_kr[], to_upper_euc_kr[], sort_order_euc_kr[]; -extern int ismbchar_euc_kr(const char *, const char *); -extern my_bool ismbhead_euc_kr(uint); -extern int mbcharlen_euc_kr(uint); +extern int ismbchar_euc_kr(CHARSET_INFO *, const char *, const char *); +extern my_bool ismbhead_euc_kr(CHARSET_INFO *, uint); +extern int mbcharlen_euc_kr(CHARSET_INFO *, uint); #endif #ifdef HAVE_CHARSET_gb2312 /* declarations for the gb2312 character set */ extern uchar ctype_gb2312[], to_lower_gb2312[], to_upper_gb2312[], sort_order_gb2312[]; -extern int ismbchar_gb2312(const char *, const char *); -extern my_bool ismbhead_gb2312(uint); -extern int mbcharlen_gb2312(uint); +extern int ismbchar_gb2312(CHARSET_INFO *, const char *, const char *); +extern my_bool ismbhead_gb2312(CHARSET_INFO *, uint); +extern int mbcharlen_gb2312(CHARSET_INFO *, uint); #endif #ifdef HAVE_CHARSET_gbk @@ -145,9 +161,9 @@ extern int my_strnncoll_gbk(CHARSET_INFO *, const uchar *, uint, const uchar extern int my_strnxfrm_gbk(CHARSET_INFO *, uchar *, uint, const uchar *, uint); extern my_bool my_like_range_gbk(CHARSET_INFO *, const char *, uint, pchar, uint, char *, char *, uint *, uint *); -extern int ismbchar_gbk(const char *, const char *); -extern my_bool ismbhead_gbk(uint); -extern int mbcharlen_gbk(uint); +extern int ismbchar_gbk(CHARSET_INFO *, const char *, const char *); +extern my_bool ismbhead_gbk(CHARSET_INFO *, uint); +extern int mbcharlen_gbk(CHARSET_INFO *, uint); #endif #ifdef HAVE_CHARSET_latin1_de @@ -166,9 +182,9 @@ extern int my_strnncoll_sjis(CHARSET_INFO *, const uchar *, uint, const ucha extern int my_strnxfrm_sjis(CHARSET_INFO *, uchar *, uint, const uchar *, uint); extern my_bool my_like_range_sjis(CHARSET_INFO *, const char *, uint, pchar, uint, char *, char *, uint *, uint *); -extern int ismbchar_sjis(const char *, const char *); -extern my_bool ismbhead_sjis(uint); -extern int mbcharlen_sjis(uint); +extern int ismbchar_sjis(CHARSET_INFO *, const char *, const char *); +extern my_bool ismbhead_sjis(CHARSET_INFO *, uint); +extern int mbcharlen_sjis(CHARSET_INFO *, uint); #endif #ifdef HAVE_CHARSET_tis620 @@ -183,11 +199,38 @@ extern my_bool my_like_range_tis620(CHARSET_INFO *, const char *, uint, pchar, u #ifdef HAVE_CHARSET_ujis /* declarations for the ujis character set */ extern uchar ctype_ujis[], to_lower_ujis[], to_upper_ujis[], sort_order_ujis[]; -extern int ismbchar_ujis(const char *, const char *); -extern my_bool ismbhead_ujis(uint); -extern int mbcharlen_ujis(uint); +extern int ismbchar_ujis(CHARSET_INFO *, const char *, const char *); +extern my_bool ismbhead_ujis(CHARSET_INFO *, uint); +extern int mbcharlen_ujis(CHARSET_INFO *, uint); #endif +#ifdef HAVE_CHARSET_utf8 + +extern uchar ctype_utf8[]; +extern uchar to_lower_utf8[]; +extern uchar to_upper_utf8[]; + +int my_strnncoll_utf8(CHARSET_INFO *cs, + const uchar *s, uint s_len, const uchar *t, uint t_len); + +int my_strnxfrm_utf8(CHARSET_INFO *cs, + uchar *dest, uint destlen, const uchar *src, uint srclen); + +int my_ismbchar_utf8(CHARSET_INFO *cs, const char *b, const char *e); +my_bool my_ismbhead_utf8(CHARSET_INFO * cs, uint ch); +int my_mbcharlen_utf8(CHARSET_INFO *cs, uint c); + +void my_caseup_str_utf8(CHARSET_INFO * cs, char * s); +void my_casedn_str_utf8(CHARSET_INFO *cs, char * s); +void my_caseup_utf8(CHARSET_INFO *cs, char *s, uint len); +void my_casedn_utf8(CHARSET_INFO *cs, char *s, uint len); + +int my_strcasecmp_utf8(CHARSET_INFO *cs, const char *s, const char *t); +int my_strncasecmp_utf8(CHARSET_INFO *cs, const char *s,const char *t,uint l); + +int my_utf8_uni (CHARSET_INFO *cs, my_wc_t *p, const uchar *s, const uchar *e); +int my_uni_utf8 (CHARSET_INFO *cs, my_wc_t pwc , uchar *b, uchar *e); +#endif #define _U 01 /* Upper case */ #define _L 02 /* Lower case */ @@ -229,9 +272,9 @@ extern int mbcharlen_ujis(uint); ((s)->like_range((s), (a), (b), (c), (d), (e), (f), (g), (h))) #define use_mb(s) ((s)->ismbchar != NULL) -#define my_ismbchar(s, a, b) ((s)->ismbchar((a), (b))) -#define my_ismbhead(s, a) ((s)->ismbhead((a))) -#define my_mbcharlen(s, a) ((s)->mbcharlen((a))) +#define my_ismbchar(s, a, b) ((s)->ismbchar((s), (a), (b))) +#define my_ismbhead(s, a) ((s)->ismbhead((s), (a))) +#define my_mbcharlen(s, a) ((s)->mbcharlen((s),(a))) #define my_caseup(s, a, l) ((s)->caseup((s), (a), (l))) #define my_casedn(s, a, l) ((s)->casedn((s), (a), (l))) diff --git a/libmysql/Makefile.shared b/libmysql/Makefile.shared index 1dd176bbe27..b9313bf3b89 100644 --- a/libmysql/Makefile.shared +++ b/libmysql/Makefile.shared @@ -41,7 +41,7 @@ mystringsobjects = strmov.lo strxmov.lo strxnmov.lo strnmov.lo \ ctype.lo ctype-simple.lo ctype-mb.lo \ ctype-big5.lo ctype-czech.lo ctype-euc_kr.lo \ ctype-gb2312.lo ctype-gbk.lo ctype-latin1_de.lo \ - ctype-sjis.lo ctype-tis620.lo ctype-ujis.lo + ctype-sjis.lo ctype-tis620.lo ctype-ujis.lo ctype-utf8.lo mystringsextra= strto.c dbugobjects = dbug.lo # IT IS IN SAFEMALLOC.C sanity.lo diff --git a/sql/init.cc b/sql/init.cc index fe80c282563..eea10e51bd8 100644 --- a/sql/init.cc +++ b/sql/init.cc @@ -57,7 +57,10 @@ void unireg_init(ulong options) for (cs=compiled_charsets; cs->number; cs++) { - uchar max_char=cs->sort_order[(uchar) cs->max_sort_char]; + uchar max_char; + if (!cs->sort_order) + continue; + cs->sort_order[(uchar) cs->max_sort_char]; for (i = 0; i < 256; i++) { if ((uchar) cs->sort_order[i] > max_char) diff --git a/sql/share/charsets/Index b/sql/share/charsets/Index index 9781b516f97..565b98a1c60 100644 --- a/sql/share/charsets/Index +++ b/sql/share/charsets/Index @@ -37,3 +37,4 @@ cp1257 29 latin5 30 latin1_de 31 armscii8 32 +utf8 33 diff --git a/strings/Makefile.am b/strings/Makefile.am index 15baa8316e5..d17a8d8fce7 100644 --- a/strings/Makefile.am +++ b/strings/Makefile.am @@ -22,19 +22,19 @@ pkglib_LIBRARIES = libmystrings.a # Exact one of ASSEMBLER_X if ASSEMBLER_x86 ASRCS = strings-x86.s longlong2str-x86.s -CSRCS = bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c strnlen.c ctype.c ctype-simple.c ctype-mb.c ctype-big5.c ctype-czech.c ctype-euc_kr.c ctype-gb2312.c ctype-gbk.c ctype-latin1_de.c ctype-sjis.c ctype-tis620.c ctype-ujis.c +CSRCS = bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c strnlen.c ctype.c ctype-simple.c ctype-mb.c ctype-big5.c ctype-czech.c ctype-euc_kr.c ctype-gb2312.c ctype-gbk.c ctype-latin1_de.c ctype-sjis.c ctype-tis620.c ctype-ujis.c ctype-utf8.c else if ASSEMBLER_sparc # These file MUST all be on the same line!! Otherwise automake # generats a very broken makefile ASRCS = bmove_upp-sparc.s strappend-sparc.s strend-sparc.s strinstr-sparc.s strmake-sparc.s strmov-sparc.s strnmov-sparc.s strstr-sparc.s strxmov-sparc.s -CSRCS = strcont.c strfill.c strcend.c is_prefix.c longlong2str.c bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c strnlen.c ctype.c ctype-simple.c ctype-mb.c ctype-big5.c ctype-czech.c ctype-euc_kr.c ctype-gb2312.c ctype-gbk.c ctype-latin1_de.c ctype-sjis.c ctype-tis620.c ctype-ujis.c +CSRCS = strcont.c strfill.c strcend.c is_prefix.c longlong2str.c bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c strnlen.c ctype.c ctype-simple.c ctype-mb.c ctype-big5.c ctype-czech.c ctype-euc_kr.c ctype-gb2312.c ctype-gbk.c ctype-latin1_de.c ctype-sjis.c ctype-tis620.c ctype-ujis.cctype-utf8.c else #no assembler ASRCS = # These file MUST all be on the same line!! Otherwise automake # generats a very broken makefile -CSRCS = strxmov.c bmove_upp.c strappend.c strcont.c strend.c strfill.c strcend.c is_prefix.c strstr.c strinstr.c strmake.c strnmov.c strmov.c longlong2str.c bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c strnlen.c ctype.c ctype-simple.c ctype-mb.c ctype-big5.c ctype-czech.c ctype-euc_kr.c ctype-gb2312.c ctype-gbk.c ctype-latin1_de.c ctype-sjis.c ctype-tis620.c ctype-ujis.c +CSRCS = strxmov.c bmove_upp.c strappend.c strcont.c strend.c strfill.c strcend.c is_prefix.c strstr.c strinstr.c strmake.c strnmov.c strmov.c longlong2str.c bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c strnlen.c ctype.c ctype-simple.c ctype-mb.c ctype-big5.c ctype-czech.c ctype-euc_kr.c ctype-gb2312.c ctype-gbk.c ctype-latin1_de.c ctype-sjis.c ctype-tis620.c ctype-ujis.c ctype-utf8.c endif endif @@ -42,7 +42,7 @@ libmystrings_a_SOURCES = $(ASRCS) $(CSRCS) noinst_PROGRAMS = conf_to_src # Default charset definitions EXTRA_DIST = ctype-big5.c ctype-czech.c ctype-euc_kr.c \ - ctype-gb2312.c ctype-gbk.c ctype-sjis.c \ + ctype-gb2312.c ctype-gbk.c ctype-sjis.c ctype-utf8.c \ ctype-tis620.c ctype-ujis.c ctype-latin1_de.c \ strto.c strings-x86.s longlong2str-x86.s \ strxmov.c bmove_upp.c strappend.c strcont.c strend.c \ diff --git a/strings/ctype-big5.c b/strings/ctype-big5.c index a8bda0131f7..00eada424b1 100644 --- a/strings/ctype-big5.c +++ b/strings/ctype-big5.c @@ -378,17 +378,17 @@ my_bool my_like_range_big5(CHARSET_INFO *cs, return 0; } -int ismbchar_big5(const char* p, const char *e) +int ismbchar_big5(CHARSET_INFO *cs,const char* p, const char *e) { return (isbig5head(*(p)) && (e)-(p)>1 && isbig5tail(*((p)+1))? 2: 0); } -my_bool ismbhead_big5(uint c) +my_bool ismbhead_big5(CHARSET_INFO *cs, uint c) { return isbig5head(c); } -int mbcharlen_big5(uint c) +int mbcharlen_big5(CHARSET_INFO *cs, uint c) { return (isbig5head(c)? 2: 0); } diff --git a/strings/ctype-euc_kr.c b/strings/ctype-euc_kr.c index 07cea62414b..4fd8600dd99 100644 --- a/strings/ctype-euc_kr.c +++ b/strings/ctype-euc_kr.c @@ -183,19 +183,19 @@ uchar NEAR sort_order_euc_kr[]= #define iseuc_kr(c) ((0xa1<=(uchar)(c) && (uchar)(c)<=0xfe)) -int ismbchar_euc_kr(const char* p, const char *e) +int ismbchar_euc_kr(CHARSET_INFO *cs,const char* p, const char *e) { return ((*(uchar*)(p)<0x80)? 0:\ iseuc_kr(*(p)) && (e)-(p)>1 && iseuc_kr(*((p)+1))? 2:\ 0); } -my_bool ismbhead_euc_kr(uint c) +my_bool ismbhead_euc_kr(CHARSET_INFO *cs,uint c) { return (iseuc_kr(c)); } -int mbcharlen_euc_kr(uint c) +int mbcharlen_euc_kr(CHARSET_INFO *cs,uint c) { return (iseuc_kr(c) ? 2 : 0); } diff --git a/strings/ctype-gb2312.c b/strings/ctype-gb2312.c index 3139bd81d52..96ad352a97e 100644 --- a/strings/ctype-gb2312.c +++ b/strings/ctype-gb2312.c @@ -166,17 +166,17 @@ uchar NEAR sort_order_gb2312[]= #define isgb2312tail(c) (0xa1<=(uchar)(c) && (uchar)(c)<=0xfe) -int ismbchar_gb2312(const char* p, const char *e) +int ismbchar_gb2312(CHARSET_INFO *cs,const char* p, const char *e) { return (isgb2312head(*(p)) && (e)-(p)>1 && isgb2312tail(*((p)+1))? 2: 0); } -my_bool ismbhead_gb2312(uint c) +my_bool ismbhead_gb2312(CHARSET_INFO *cs,uint c) { return isgb2312head(c); } -int mbcharlen_gb2312(uint c) +int mbcharlen_gb2312(CHARSET_INFO *cs,uint c) { return (isgb2312head(c)? 2:0); } diff --git a/strings/ctype-gbk.c b/strings/ctype-gbk.c index 9a7154f566b..5bc2d490fd4 100644 --- a/strings/ctype-gbk.c +++ b/strings/ctype-gbk.c @@ -2704,17 +2704,17 @@ extern my_bool my_like_range_gbk(CHARSET_INFO *cs, } -int ismbchar_gbk(const char* p, const char *e) +int ismbchar_gbk(CHARSET_INFO *cs,const char* p, const char *e) { return (isgbkhead(*(p)) && (e)-(p)>1 && isgbktail(*((p)+1))? 2: 0); } -my_bool ismbhead_gbk(uint c) +my_bool ismbhead_gbk(CHARSET_INFO *cs,uint c) { return isgbkhead(c); } -int mbcharlen_gbk(uint c) +int mbcharlen_gbk(CHARSET_INFO *cs,uint c) { return (isgbkhead(c)? 2:0); } diff --git a/strings/ctype-sjis.c b/strings/ctype-sjis.c index 79d4e8a94c7..3d74ddceda7 100644 --- a/strings/ctype-sjis.c +++ b/strings/ctype-sjis.c @@ -183,17 +183,17 @@ uchar NEAR sort_order_sjis[]= (0x80<=(c) && (c)<=0xfc)) -int ismbchar_sjis(const char* p, const char *e) +int ismbchar_sjis(CHARSET_INFO *cs,const char* p, const char *e) { return (issjishead((uchar) *p) && (e-p)>1 && issjistail((uchar)p[1]) ? 2: 0); } -my_bool ismbhead_sjis(uint c) +my_bool ismbhead_sjis(CHARSET_INFO *cs,uint c) { return issjishead((uchar) c); } -int mbcharlen_sjis(uint c) +int mbcharlen_sjis(CHARSET_INFO *cs,uint c) { return (issjishead((uchar) c) ? 2: 0); } @@ -208,8 +208,8 @@ int my_strnncoll_sjis(CHARSET_INFO *cs, const uchar *e1 = s1 + len1; const uchar *e2 = s2 + len2; while (s1 < e1 && s2 < e2) { - if (ismbchar_sjis((char*) s1, (char*) e1) && - ismbchar_sjis((char*) s2, (char*) e2)) { + if (ismbchar_sjis(cs,(char*) s1, (char*) e1) && + ismbchar_sjis(cs,(char*) s2, (char*) e2)) { uint c1 = sjiscode(*s1, *(s1+1)); uint c2 = sjiscode(*s2, *(s2+1)); if (c1 != c2) @@ -233,7 +233,7 @@ int my_strnxfrm_sjis(CHARSET_INFO *cs, uchar *d_end = dest + len; uchar *s_end = (uchar*) src + srclen; while (dest < d_end && src < s_end) { - if (ismbchar_sjis((char*) src, (char*) s_end)) { + if (ismbchar_sjis(cs,(char*) src, (char*) s_end)) { *dest++ = *src++; if (dest < d_end && src < s_end) *dest++ = *src++; @@ -275,7 +275,7 @@ my_bool my_like_range_sjis(CHARSET_INFO *cs, char *min_end=min_str+res_length; while (ptr < end && min_str < min_end) { - if (ismbchar_sjis(ptr, end)) { + if (ismbchar_sjis(cs, ptr, end)) { *min_str++ = *max_str++ = *ptr++; if (min_str < min_end) *min_str++ = *max_str++ = *ptr++; @@ -283,7 +283,7 @@ my_bool my_like_range_sjis(CHARSET_INFO *cs, } if (*ptr == escape && ptr+1 < end) { ptr++; /* Skip escape */ - if (ismbchar_sjis(ptr, end)) + if (ismbchar_sjis(cs, ptr, end)) *min_str++ = *max_str++ = *ptr++; if (min_str < min_end) *min_str++ = *max_str++ = *ptr++; diff --git a/strings/ctype-ujis.c b/strings/ctype-ujis.c index 80c09eedcff..5398b93816e 100644 --- a/strings/ctype-ujis.c +++ b/strings/ctype-ujis.c @@ -183,7 +183,7 @@ uchar NEAR sort_order_ujis[]= #define isujis_ss3(c) (((c)&0xff) == 0x8f) -int ismbchar_ujis(const char* p, const char *e) +int ismbchar_ujis(CHARSET_INFO *cs,const char* p, const char *e) { return ((*(uchar*)(p)<0x80)? 0:\ isujis(*(p)) && (e)-(p)>1 && isujis(*((p)+1))? 2:\ @@ -192,12 +192,12 @@ int ismbchar_ujis(const char* p, const char *e) 0); } -my_bool ismbhead_ujis(uint c) +my_bool ismbhead_ujis(CHARSET_INFO *cs,uint c) { return (isujis(c) || isujis_ss2(c) || isujis_ss3(c)); } -int mbcharlen_ujis(uint c) +int mbcharlen_ujis(CHARSET_INFO *cs,uint c) { return (isujis(c)? 2: isujis_ss2(c)? 2: isujis_ss3(c)? 3: 0); } diff --git a/strings/ctype-utf8.c b/strings/ctype-utf8.c new file mode 100644 index 00000000000..6070f2ecb5c --- /dev/null +++ b/strings/ctype-utf8.c @@ -0,0 +1,1960 @@ +/* Copyright (C) 2000 MySQL AB + + 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; either + version 2 of the License, or (at your option) any later version. + + 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., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* UTF8 according RFC 2279 */ +/* Written by Alexander Barkov */ + +#include +#include + +#ifdef HAVE_CHARSET_utf8 +#define HAVE_UNIDATA +#endif + +#ifdef HAVE_UNIDATA + +static MY_UNICASE_INFO plane00[]={ + {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_INFO 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_INFO 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_INFO 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_INFO 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,0x0418}, + {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,0x0418}, + {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_INFO 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_INFO 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_INFO 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_INFO 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_INFO 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_INFO 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} +}; + +static MY_UNICASE_INFO *uni_plane[256]={ + plane00, plane01, plane02, plane03, plane04, plane05, NULL, NULL, + 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 + +}; + +#endif + + + +#ifdef HAVE_CHARSET_utf8 + +/* These arrays are taken from usa7 implementation */ + +uchar ctype_utf8[] = { + 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +uchar to_lower_utf8[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +uchar to_upper_utf8[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + + +int my_utf8_uni (__attribute__((unused)) CHARSET_INFO *cs, + my_wc_t * pwc, const uchar *s, const uchar *e) +{ + unsigned char c = s[0]; + + if (c < 0x80) + { + *pwc = c; + return 1; + } + else if (c < 0xc2) + return MY_CS_ILSEQ; + else if (c < 0xe0) + { + if (s+2 > e) /* We need 2 characters */ + return MY_CS_TOOFEW(0); + + if (!((s[1] ^ 0x80) < 0x40)) + return MY_CS_ILSEQ; + + *pwc = ((my_wc_t) (c & 0x1f) << 6) | (my_wc_t) (s[1] ^ 0x80); + return 2; + } + else if (c < 0xf0) + { + if (s+3 > e) /* We need 3 characters */ + return MY_CS_TOOFEW(0); + + if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 && (c >= 0xe1 || s[1] >= 0xa0))) + return MY_CS_ILSEQ; + + *pwc = ((my_wc_t) (c & 0x0f) << 12) | + ((my_wc_t) (s[1] ^ 0x80) << 6) | + (my_wc_t) (s[2] ^ 0x80); + + return 3; + +#ifdef UNICODE_32BIT + + } + else if (c < 0xf8 && sizeof(my_wc_t)*8 >= 32) + { + if (s+4 > e) /* We need 4 characters */ + return MY_CS_TOOFEW(0); + + if (!((s[1] ^ 0x80) < 0x40 && + (s[2] ^ 0x80) < 0x40 && + (s[3] ^ 0x80) < 0x40 && + (c >= 0xf1 || s[1] >= 0x90))) + return MY_CS_ILSEQ; + + *pwc = ((my_wc_t) (c & 0x07) << 18) | + ((my_wc_t) (s[1] ^ 0x80) << 12) | + ((my_wc_t) (s[2] ^ 0x80) << 6) | + (my_wc_t) (s[3] ^ 0x80); + + return 4; + } + else if (c < 0xfc && sizeof(my_wc_t)*8 >= 32) + { + if (s+5 >e) /* We need 5 characters */ + return MY_CS_TOOFEW(0); + + if (!((s[1] ^ 0x80) < 0x40 && + (s[2] ^ 0x80) < 0x40 && + (s[3] ^ 0x80) < 0x40 && + (s[4] ^ 0x80) < 0x40 && + (c >= 0xf9 || s[1] >= 0x88))) + return MY_CS_ILSEQ; + + *pwc = ((my_wc_t) (c & 0x03) << 24) | + ((my_wc_t) (s[1] ^ 0x80) << 18) | + ((my_wc_t) (s[2] ^ 0x80) << 12) | + ((my_wc_t) (s[3] ^ 0x80) << 6) | + (my_wc_t) (s[4] ^ 0x80); + return 5; + } + else if (c < 0xfe && sizeof(my_wc_t)*8 >= 32) + { + if ( s+6 >e ) /* We need 6 characters */ + return MY_CS_TOOFEW(0); + + if (!((s[1] ^ 0x80) < 0x40 && + (s[2] ^ 0x80) < 0x40 && + (s[3] ^ 0x80) < 0x40 && + (s[4] ^ 0x80) < 0x40 && + (s[5] ^ 0x80) < 0x40 && + (c >= 0xfd || s[1] >= 0x84))) + return MY_CS_ILSEQ; + + *pwc = ((my_wc_t) (c & 0x01) << 30) + | ((my_wc_t) (s[1] ^ 0x80) << 24) + | ((my_wc_t) (s[2] ^ 0x80) << 18) + | ((my_wc_t) (s[3] ^ 0x80) << 12) + | ((my_wc_t) (s[4] ^ 0x80) << 6) + | (my_wc_t) (s[5] ^ 0x80); + return 6; +#endif + } else + return MY_CS_ILSEQ; +} + +int my_uni_utf8 (__attribute__((unused)) CHARSET_INFO *cs, + my_wc_t wc, uchar *r, uchar *e) +{ + int count; + + if (wc < 0x80) + count = 1; + else if (wc < 0x800) + count = 2; + else if (wc < 0x10000) + count = 3; +#ifdef UNICODE_32BIT + else if (wc < 0x200000) + count = 4; + else if (wc < 0x4000000) + count = 5; + else if (wc <= 0x7fffffff) + count = 6; +#endif + else return MY_CS_ILUNI; + + /* + e is a character after the string r, not the last character of it. + Because of it (r+count > e), not (r+count-1 >e ) + */ + if ( r+count > e ) + return MY_CS_TOOSMALL; + + switch (count) { + /* Fall through all cases!!! */ +#ifdef UNICODE_32BIT + case 6: r[5] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x4000000; + case 5: r[4] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x200000; + case 4: r[3] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x10000; +#endif + case 3: r[2] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x800; + case 2: r[1] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0xc0; + case 1: r[0] = wc; + } + return count; +} + + +void my_caseup_utf8(CHARSET_INFO *cs, char *s, uint slen) +{ + my_wc_t wc; + int res; + char *e=s+slen; + + while ((s < e) && (res=my_utf8_uni(cs,&wc, (uchar *)s, (uchar*)e))>0 ) + { + int plane = (wc>>8) & 0xFF; + wc = uni_plane[plane] ? uni_plane[plane][wc & 0xFF].toupper : wc; + if (res != my_uni_utf8(cs,wc,(uchar*)s,(uchar*)e)) + break; + s+=res; + } +} + +void my_caseup_str_utf8(CHARSET_INFO * cs, char * s) +{ + my_caseup_utf8(cs, s, strlen(s)); +} + + +void my_casedn_utf8(CHARSET_INFO *cs, char *s, uint slen) +{ + my_wc_t wc; + int res; + char *e=s+slen; + + while ((s < e) && (res=my_utf8_uni(cs, &wc, (uchar*)s, (uchar*)e))>0) + { + int plane = (wc>>8) & 0xFF; + wc = uni_plane[plane] ? uni_plane[plane][wc & 0xFF].tolower : wc; + if (res != my_uni_utf8(cs, wc, (uchar*)s, (uchar*)e)) + { + break; + } + s+=res; + } +} + +void my_casedn_str_utf8(CHARSET_INFO *cs, char * s) +{ + my_casedn_utf8(cs, s, strlen(s)); +} + + +int my_strnncoll_utf8(CHARSET_INFO *cs, + const uchar *s, uint slen, const uchar *t, uint tlen) +{ + int s_res,t_res; + my_wc_t s_wc,t_wc; + const uchar *se=s+slen; + const uchar *te=t+tlen; + + while ( s < se && t < te ) + { + int plane; + s_res=my_utf8_uni(cs,&s_wc, s, se); + t_res=my_utf8_uni(cs,&t_wc, t, te); + + if ( s_res <= 0 || t_res <= 0 ) + { + /* Incorrect string, compare by char value */ + return ((int)s[0]-(int)t[0]); + } + + plane=(s_wc>>8) & 0xFF; + s_wc = uni_plane[plane] ? uni_plane[plane][s_wc & 0xFF].sort : s_wc; + plane=(t_wc>>8) & 0xFF; + t_wc = uni_plane[plane] ? uni_plane[plane][t_wc & 0xFF].sort : t_wc; + if ( s_wc != t_wc ) + { + return ((int) s_wc) - ((int) t_wc); + } + + s+=s_res; + t+=t_res; + } + return ( (se-s) - (te-t) ); +} + +int my_strncasecmp_utf8(CHARSET_INFO *cs, + const char *s, const char *t, uint len) +{ + int s_res,t_res; + my_wc_t s_wc,t_wc; + const char *se=s+len; + const char *te=t+len; + + while ( s < se && t < te ) + { + int plane; + + s_res=my_utf8_uni(cs,&s_wc, (const uchar*)s, (const uchar*)se); + t_res=my_utf8_uni(cs,&t_wc, (const uchar*)t, (const uchar*)te); + + if ( s_res <= 0 || t_res <= 0 ) + { + /* Incorrect string, compare by char value */ + return ((int)s[0]-(int)t[0]); + } + + plane=(s_wc>>8) & 0xFF; + s_wc = uni_plane[plane] ? uni_plane[plane][s_wc & 0xFF].tolower : s_wc; + + plane=(t_wc>>8) & 0xFF; + t_wc = uni_plane[plane] ? uni_plane[plane][t_wc & 0xFF].tolower : t_wc; + + if ( s_wc != t_wc ) + return ((int) s_wc) - ((int) t_wc); + + s+=s_res; + t+=t_res; + } + return ( (se-s) - (te-t) ); +} + +int my_strcasecmp_utf8(CHARSET_INFO *cs, const char *s, const char *t) +{ + uint s_len=strlen(s); + uint t_len=strlen(t); + uint len = (s_len > t_len) ? s_len : t_len; + return my_strncasecmp_utf8(cs, s, t, len); +} + +int my_strnxfrm_utf8(CHARSET_INFO *cs, + uchar *dst, uint dstlen, const uchar *src, uint srclen) +{ + my_wc_t wc; + int res; + int plane; + uchar *de = dst + dstlen; + const uchar *se = src + srclen; + const uchar *dst_orig = dst; + + while( src < se && dst < de ) + { + if ((res=my_utf8_uni(cs,&wc, src, se))<0) + { + break; + } + src+=res; + srclen-=res; + + plane=(wc>>8) & 0xFF; + wc = uni_plane[plane] ? uni_plane[plane][wc & 0xFF].sort : wc; + + if ((res=my_uni_utf8(cs,wc,dst,de)) <0) + { + break; + } + dst+=res; + } + return dst - dst_orig; +} + +int my_ismbchar_utf8(CHARSET_INFO *cs,const char *b, const char *e) +{ + my_wc_t wc; + int res=my_utf8_uni(cs,&wc, (const uchar*)b, (const uchar*)e); + return (res>1) ? res : 0; +} + +my_bool my_ismbhead_utf8(__attribute__((unused)) CHARSET_INFO *cs, uint ch) +{ + return ( ch >= 0xc2 ); +} + +int my_mbcharlen_utf8(__attribute__((unused)) CHARSET_INFO *cs, uint c) +{ + if (c < 0x80) + return 1; + else if (c < 0xc2) + return 0; /* Illegal mb head */ + else if (c < 0xe0) + return 2; + else if (c < 0xf0) + return 3; +#ifdef UNICODE_32BIT + else if (c < 0xf8) + return 4; + else if (c < 0xfc) + return 5; + else if (c < 0xfe) + return 6; +#endif + return 0; /* Illegal mb head */; +} + +#ifdef MY_TEST_UTF8 + +#include + +static void test_mb(CHARSET_INFO *cs, uchar *s) +{ + while(*s) + { + if(my_ismbhead_utf8(cs,*s)) + { + int len=my_mbcharlen_utf8(cs,*s); + while(len--) + { + printf("%c",*s); + s++; + } + printf("\n"); + } + else + { + printf("%c\n",*s); + s++; + } + } +} + +int main() +{ + char str[1024]=" utf8 test проба ПЕРРпо-РУССКИ"; + CHARSET_INFO *cs; + + test_mb(cs,(uchar*)str); + + printf("orig :'%s'\n",str); + + my_caseup_utf8(cs,str,15); + printf("caseup :'%s'\n",str); + + my_caseup_str_utf8(cs,str); + printf("caseup_str:'%s'\n",str); + + my_casedn_utf8(cs,str,15); + printf("casedn :'%s'\n",str); + + my_casedn_str_utf8(cs,str); + printf("casedn_str:'%s'\n",str); + + return 0; +} + +#endif + +#endif diff --git a/strings/ctype.c b/strings/ctype.c index 5e2bb38d4fd..9fed9ebafb6 100644 --- a/strings/ctype.c +++ b/strings/ctype.c @@ -2660,6 +2660,32 @@ CHARSET_INFO compiled_charsets[] = { }, #endif +#ifdef HAVE_CHARSET_utf8 + { + 33, /* number */ + "utf8", /* name */ + ctype_utf8, /* ctype */ + to_lower_utf8, /* to_lower */ + to_upper_utf8, /* to_upper */ + to_upper_utf8, /* sort_order */ + 1, /* strxfrm_multiply */ + my_strnncoll_utf8, /* strnncoll */ + my_strnxfrm_utf8, /* strnxfrm */ + NULL, /* like_range */ + 6, /* mbmaxlen */ + my_ismbchar_utf8, /* ismbchar */ + my_ismbhead_utf8, /* ismbhead */ + my_mbcharlen_utf8, /* mbcharlen */ + my_caseup_str_utf8, + my_casedn_str_utf8, + my_caseup_utf8, + my_casedn_utf8, + my_strcasecmp_utf8, + my_strncasecmp_utf8, + 0 + }, +#endif + #ifdef HAVE_CHARSET_usa7 { 11, /* number */ @@ -2790,6 +2816,7 @@ CHARSET_INFO compiled_charsets[] = { }, #endif + { 0, /* end-of-list marker */ NullS, -- cgit v1.2.1 From 4fd893e5d3a0ff652ab21dcdb748f7aad4d7ebdf Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 29 Mar 2002 16:06:06 +0400 Subject: charset<->unicode conversion tables and routines some warnings fixes include/m_ctype.h: New charset conversion fields in CHARSET_INFO mysys/hash.c: Fix for "unused argument" warning strings/ctype-big5.c: Fix for "unused argument" warning strings/ctype-czech.c: Fix for "unused argument" warning strings/ctype-euc_kr.c: Fix for "unused argument" warning strings/ctype-gb2312.c: Fix for "unused argument" warning strings/ctype-gbk.c: Fix for "unused argument" warning strings/ctype-latin1_de.c: Fix for "unused argument" warning strings/ctype-simple.c: 8bit<->unicode convertion routines strings/ctype-sjis.c: Fix for "unused argument" warning strings/ctype-tis620.c: Fix for "unused argument" warning strings/ctype-ujis.c: Fix for "unused argument" warning strings/ctype-utf8.c: Fix for "unused argument" warning strings/ctype.c: 8bit <-> unicode conversion tables --- include/m_ctype.h | 30 +- mysys/hash.c | 3 +- strings/ctype-big5.c | 13 +- strings/ctype-czech.c | 6 +- strings/ctype-euc_kr.c | 7 +- strings/ctype-gb2312.c | 7 +- strings/ctype-gbk.c | 13 +- strings/ctype-latin1_de.c | 6 +- strings/ctype-simple.c | 23 + strings/ctype-sjis.c | 13 +- strings/ctype-tis620.c | 6 +- strings/ctype-ujis.c | 7 +- strings/ctype-utf8.c | 8 +- strings/ctype.c | 1571 ++++++++++++++++++++++++++++++++++++--------- 14 files changed, 1371 insertions(+), 342 deletions(-) diff --git a/include/m_ctype.h b/include/m_ctype.h index 14e0ba337f1..a676f56da1d 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -42,7 +42,11 @@ typedef struct unicase_info_st { #define MY_CS_TOOSMALL -1 #define MY_CS_TOOFEW(n) (-1-(n)) - +typedef struct my_uni_idx_st { + uint16 from; + uint16 to; + uchar *tab; +} MY_UNI_IDX; typedef struct charset_info_st @@ -53,7 +57,10 @@ typedef struct charset_info_st uchar *to_lower; uchar *to_upper; uchar *sort_order; - + uint16 *tab_to_uni; + MY_UNI_IDX *tab_from_uni; + + /* Collation routines */ uint strxfrm_multiply; int (*strnncoll)(struct charset_info_st *, const uchar *, uint, const uchar *, uint); @@ -62,12 +69,19 @@ typedef struct charset_info_st my_bool (*like_range)(struct charset_info_st *, const char *, uint, pchar, uint, char *, char *, uint *, uint *); - + + /* Multibyte routines */ uint mbmaxlen; int (*ismbchar)(struct charset_info_st *, const char *, const char *); my_bool (*ismbhead)(struct charset_info_st *, uint); int (*mbcharlen)(struct charset_info_st *, uint); - + + /* Unicode convertion */ + int (*mb_wc)(struct charset_info_st *cs,my_wc_t *wc, + const unsigned char *s,const unsigned char *e); + int (*wc_mb)(struct charset_info_st *cs,my_wc_t wc, + unsigned char *s,unsigned char *e); + /* Functions for case convertion */ void (*caseup_str)(struct charset_info_st *, char *); void (*casedn_str)(struct charset_info_st *, char *); @@ -106,6 +120,12 @@ extern void my_casedn_8bit(CHARSET_INFO *, char *, uint); extern int my_strcasecmp_8bit(CHARSET_INFO * cs, const char *, const char *); extern int my_strncasecmp_8bit(CHARSET_INFO * cs, const char *, const char *, uint); +int my_mb_wc_8bit(CHARSET_INFO *cs,my_wc_t *wc, + const unsigned char *s,const unsigned char *e); +int my_wc_mb_8bit(CHARSET_INFO *cs,my_wc_t wc, + unsigned char *s, unsigned char *e); + + #ifdef USE_MB /* Functions for multibyte charsets */ extern void my_caseup_str_mb(CHARSET_INFO *, char *); @@ -229,7 +249,7 @@ int my_strcasecmp_utf8(CHARSET_INFO *cs, const char *s, const char *t); int my_strncasecmp_utf8(CHARSET_INFO *cs, const char *s,const char *t,uint l); int my_utf8_uni (CHARSET_INFO *cs, my_wc_t *p, const uchar *s, const uchar *e); -int my_uni_utf8 (CHARSET_INFO *cs, my_wc_t pwc , uchar *b, uchar *e); +int my_uni_utf8 (CHARSET_INFO *cs, my_wc_t wc, uchar *b, uchar *e); #endif #define _U 01 /* Upper case */ diff --git a/mysys/hash.c b/mysys/hash.c index 3faaff1f169..d7d4cf83d55 100644 --- a/mysys/hash.c +++ b/mysys/hash.c @@ -114,7 +114,8 @@ static uint hash_rec_mask(HASH *hash,HASH_LINK *pos,uint buffmax, /* Calc hashvalue for a key */ -static uint calc_hashnr(CHARSET_INFO *cs, const byte *key,uint length) +static uint calc_hashnr(CHARSET_INFO *cs __attribute__((unused)), + const byte *key,uint length) { register uint nr=1, nr2=4; while (length--) diff --git a/strings/ctype-big5.c b/strings/ctype-big5.c index 00eada424b1..3bfc5f3ab9b 100644 --- a/strings/ctype-big5.c +++ b/strings/ctype-big5.c @@ -215,7 +215,7 @@ static uint16 big5strokexfrm(uint16 i) return 0xA140; } -int my_strnncoll_big5(CHARSET_INFO *cs, +int my_strnncoll_big5(CHARSET_INFO *cs __attribute__((unused)), const uchar * s1, uint len1, const uchar * s2, uint len2) { @@ -239,7 +239,7 @@ int my_strnncoll_big5(CHARSET_INFO *cs, return (int) (len1-len2); } -int my_strnxfrm_big5(CHARSET_INFO *cs, +int my_strnxfrm_big5(CHARSET_INFO *cs __attribute__((unused)), uchar * dest, uint len, const uchar * src, uint srclen) { @@ -328,7 +328,7 @@ int my_strxfrm_big5(uchar * dest, const uchar * src, int len) #define wild_one '_' #define wild_many '%' -my_bool my_like_range_big5(CHARSET_INFO *cs, +my_bool my_like_range_big5(CHARSET_INFO *cs __attribute__((unused)), const char *ptr,uint ptr_length,pchar escape, uint res_length, char *min_str,char *max_str, uint *min_length,uint *max_length) @@ -378,17 +378,18 @@ my_bool my_like_range_big5(CHARSET_INFO *cs, return 0; } -int ismbchar_big5(CHARSET_INFO *cs,const char* p, const char *e) +int ismbchar_big5(CHARSET_INFO *cs __attribute__((unused)), + const char* p, const char *e) { return (isbig5head(*(p)) && (e)-(p)>1 && isbig5tail(*((p)+1))? 2: 0); } -my_bool ismbhead_big5(CHARSET_INFO *cs, uint c) +my_bool ismbhead_big5(CHARSET_INFO *cs __attribute__((unused)), uint c) { return isbig5head(c); } -int mbcharlen_big5(CHARSET_INFO *cs, uint c) +int mbcharlen_big5(CHARSET_INFO *cs __attribute__((unused)), uint c) { return (isbig5head(c)? 2: 0); } diff --git a/strings/ctype-czech.c b/strings/ctype-czech.c index eaf0b1ef38b..f3b7777a6d4 100644 --- a/strings/ctype-czech.c +++ b/strings/ctype-czech.c @@ -282,7 +282,7 @@ int my_strxfrm_czech(uchar * dest, const uchar * src, int len) /* Function strnncoll, actually strcoll, with Czech sorting, which expect the length of the strings being specified */ -int my_strnncoll_czech(CHARSET_INFO *cs, +int my_strnncoll_czech(CHARSET_INFO *cs __attribute__((unused)), const uchar * s1, uint len1, const uchar * s2, uint len2) { @@ -308,7 +308,7 @@ int my_strnncoll_czech(CHARSET_INFO *cs, /* Function strnxfrm, actually strxfrm, with Czech sorting, which expect the length of the strings being specified */ -int my_strnxfrm_czech(CHARSET_INFO *cs, +int my_strnxfrm_czech(CHARSET_INFO *cs __attribute__((unused)), uchar * dest, uint len, const uchar * src, uint srclen) { @@ -378,7 +378,7 @@ int my_strnxfrm_czech(CHARSET_INFO *cs, #define EXAMPLE -my_bool my_like_range_czech(CHARSET_INFO *cs, +my_bool my_like_range_czech(CHARSET_INFO *cs __attribute__((unused)), const char *ptr,uint ptr_length,pchar escape, uint res_length, char *min_str,char *max_str, uint *min_length,uint *max_length) diff --git a/strings/ctype-euc_kr.c b/strings/ctype-euc_kr.c index 4fd8600dd99..b54c80ffe99 100644 --- a/strings/ctype-euc_kr.c +++ b/strings/ctype-euc_kr.c @@ -183,19 +183,20 @@ uchar NEAR sort_order_euc_kr[]= #define iseuc_kr(c) ((0xa1<=(uchar)(c) && (uchar)(c)<=0xfe)) -int ismbchar_euc_kr(CHARSET_INFO *cs,const char* p, const char *e) +int ismbchar_euc_kr(CHARSET_INFO *cs __attribute__((unused)), + const char* p, const char *e) { return ((*(uchar*)(p)<0x80)? 0:\ iseuc_kr(*(p)) && (e)-(p)>1 && iseuc_kr(*((p)+1))? 2:\ 0); } -my_bool ismbhead_euc_kr(CHARSET_INFO *cs,uint c) +my_bool ismbhead_euc_kr(CHARSET_INFO *cs __attribute__((unused)),uint c) { return (iseuc_kr(c)); } -int mbcharlen_euc_kr(CHARSET_INFO *cs,uint c) +int mbcharlen_euc_kr(CHARSET_INFO *cs __attribute__((unused)),uint c) { return (iseuc_kr(c) ? 2 : 0); } diff --git a/strings/ctype-gb2312.c b/strings/ctype-gb2312.c index 96ad352a97e..556bae0747c 100644 --- a/strings/ctype-gb2312.c +++ b/strings/ctype-gb2312.c @@ -166,17 +166,18 @@ uchar NEAR sort_order_gb2312[]= #define isgb2312tail(c) (0xa1<=(uchar)(c) && (uchar)(c)<=0xfe) -int ismbchar_gb2312(CHARSET_INFO *cs,const char* p, const char *e) +int ismbchar_gb2312(CHARSET_INFO *cs __attribute__((unused)), + const char* p, const char *e) { return (isgb2312head(*(p)) && (e)-(p)>1 && isgb2312tail(*((p)+1))? 2: 0); } -my_bool ismbhead_gb2312(CHARSET_INFO *cs,uint c) +my_bool ismbhead_gb2312(CHARSET_INFO *cs __attribute__((unused)),uint c) { return isgb2312head(c); } -int mbcharlen_gb2312(CHARSET_INFO *cs,uint c) +int mbcharlen_gb2312(CHARSET_INFO *cs __attribute__((unused)),uint c) { return (isgb2312head(c)? 2:0); } diff --git a/strings/ctype-gbk.c b/strings/ctype-gbk.c index 5bc2d490fd4..68ee90651d6 100644 --- a/strings/ctype-gbk.c +++ b/strings/ctype-gbk.c @@ -2582,7 +2582,7 @@ static uint16 gbksortorder(uint16 i) } -int my_strnncoll_gbk(CHARSET_INFO *cs, +int my_strnncoll_gbk(CHARSET_INFO *cs __attribute__((unused)), const uchar * s1, uint len1, const uchar * s2, uint len2) { @@ -2609,7 +2609,7 @@ int my_strnncoll_gbk(CHARSET_INFO *cs, } -int my_strnxfrm_gbk(CHARSET_INFO *cs, +int my_strnxfrm_gbk(CHARSET_INFO *cs __attribute__((unused)), uchar * dest, uint len, const uchar * src, uint srclen) { @@ -2653,7 +2653,7 @@ int my_strnxfrm_gbk(CHARSET_INFO *cs, #define wild_one '_' #define wild_many '%' -extern my_bool my_like_range_gbk(CHARSET_INFO *cs, +extern my_bool my_like_range_gbk(CHARSET_INFO *cs __attribute__((unused)), const char *ptr,uint ptr_length,pchar escape, uint res_length, char *min_str,char *max_str, uint *min_length,uint *max_length) @@ -2704,17 +2704,18 @@ extern my_bool my_like_range_gbk(CHARSET_INFO *cs, } -int ismbchar_gbk(CHARSET_INFO *cs,const char* p, const char *e) +int ismbchar_gbk(CHARSET_INFO *cs __attribute__((unused)), + const char* p, const char *e) { return (isgbkhead(*(p)) && (e)-(p)>1 && isgbktail(*((p)+1))? 2: 0); } -my_bool ismbhead_gbk(CHARSET_INFO *cs,uint c) +my_bool ismbhead_gbk(CHARSET_INFO *cs __attribute__((unused)),uint c) { return isgbkhead(c); } -int mbcharlen_gbk(CHARSET_INFO *cs,uint c) +int mbcharlen_gbk(CHARSET_INFO *cs __attribute__((unused)),uint c) { return (isgbkhead(c)? 2:0); } diff --git a/strings/ctype-latin1_de.c b/strings/ctype-latin1_de.c index e7bbf1438a6..acaa668b24e 100644 --- a/strings/ctype-latin1_de.c +++ b/strings/ctype-latin1_de.c @@ -164,7 +164,7 @@ uchar sort_order_latin1_de[] = { } -int my_strnncoll_latin1_de(CHARSET_INFO *cs, +int my_strnncoll_latin1_de(CHARSET_INFO *cs __attribute__((unused)), const uchar * s1, uint len1, const uchar * s2, uint len2) { @@ -238,7 +238,7 @@ int my_strnncoll_latin1_de(CHARSET_INFO *cs, } -int my_strnxfrm_latin1_de(CHARSET_INFO *cs, +int my_strnxfrm_latin1_de(CHARSET_INFO *cs __attribute__((unused)), uchar * dest, uint len, const uchar * src, uint srclen) { @@ -303,7 +303,7 @@ int my_strnxfrm_latin1_de(CHARSET_INFO *cs, #define wild_one '_' #define wild_many '%' -my_bool my_like_range_latin1_de(CHARSET_INFO *cs, +my_bool my_like_range_latin1_de(CHARSET_INFO *cs __attribute__((unused)), const char *ptr, uint ptr_length, pchar escape, uint res_length, char *min_str, char *max_str, diff --git a/strings/ctype-simple.c b/strings/ctype-simple.c index 5473a15e4fe..52c66f0ad4e 100644 --- a/strings/ctype-simple.c +++ b/strings/ctype-simple.c @@ -85,3 +85,26 @@ int my_strncasecmp_8bit(CHARSET_INFO * cs, while (len-- != 0 && my_toupper(cs,(uchar)*s++) == my_toupper(cs,(uchar)*t++)) ; return (int) len+1; } + +int my_mb_wc_8bit(CHARSET_INFO *cs,my_wc_t *wc, + const unsigned char *str, + const unsigned char *end __attribute__((unused))) +{ + *wc=cs->tab_to_uni[*str]; + return (!wc[0] && str[0]) ? MY_CS_ILSEQ : 1; +} + +int my_wc_mb_8bit(CHARSET_INFO *cs,my_wc_t wc, + unsigned char *s, + unsigned char *e __attribute__((unused))) +{ + MY_UNI_IDX *idx; + + for(idx=cs->tab_from_uni; idx->tab ; idx++){ + if(idx->from<=wc && idx->to>=wc){ + s[0]=idx->tab[wc-idx->from]; + return (!s[0] && wc) ? MY_CS_ILUNI : 1; + } + } + return MY_CS_ILUNI; +} diff --git a/strings/ctype-sjis.c b/strings/ctype-sjis.c index 3d74ddceda7..0d99ed452cf 100644 --- a/strings/ctype-sjis.c +++ b/strings/ctype-sjis.c @@ -183,17 +183,18 @@ uchar NEAR sort_order_sjis[]= (0x80<=(c) && (c)<=0xfc)) -int ismbchar_sjis(CHARSET_INFO *cs,const char* p, const char *e) +int ismbchar_sjis(CHARSET_INFO *cs __attribute__((unused)), + const char* p, const char *e) { return (issjishead((uchar) *p) && (e-p)>1 && issjistail((uchar)p[1]) ? 2: 0); } -my_bool ismbhead_sjis(CHARSET_INFO *cs,uint c) +my_bool ismbhead_sjis(CHARSET_INFO *cs __attribute__((unused)),uint c) { return issjishead((uchar) c); } -int mbcharlen_sjis(CHARSET_INFO *cs,uint c) +int mbcharlen_sjis(CHARSET_INFO *cs __attribute__((unused)),uint c) { return (issjishead((uchar) c) ? 2: 0); } @@ -201,7 +202,7 @@ int mbcharlen_sjis(CHARSET_INFO *cs,uint c) #define sjiscode(c,d) ((((uint) (uchar)(c)) << 8) | (uint) (uchar) (d)) -int my_strnncoll_sjis(CHARSET_INFO *cs, +int my_strnncoll_sjis(CHARSET_INFO *cs __attribute__((unused)), const uchar *s1, uint len1, const uchar *s2, uint len2) { @@ -226,7 +227,7 @@ int my_strnncoll_sjis(CHARSET_INFO *cs, return len1 - len2; } -int my_strnxfrm_sjis(CHARSET_INFO *cs, +int my_strnxfrm_sjis(CHARSET_INFO *cs __attribute__((unused)), uchar *dest, uint len, const uchar *src, uint srclen) { @@ -265,7 +266,7 @@ int my_strnxfrm_sjis(CHARSET_INFO *cs, #define wild_one '_' #define wild_many '%' -my_bool my_like_range_sjis(CHARSET_INFO *cs, +my_bool my_like_range_sjis(CHARSET_INFO *cs __attribute__((unused)), const char *ptr,uint ptr_length,pchar escape, uint res_length, char *min_str,char *max_str, uint *min_length,uint *max_length) diff --git a/strings/ctype-tis620.c b/strings/ctype-tis620.c index 5df8b1d8cc6..8510ba21d0a 100644 --- a/strings/ctype-tis620.c +++ b/strings/ctype-tis620.c @@ -537,7 +537,7 @@ static uchar* thai2sortable(const uchar * tstr,uint len) Arg: 2 Strings and it compare length Ret: strcmp result */ -int my_strnncoll_tis620(CHARSET_INFO *cs, +int my_strnncoll_tis620(CHARSET_INFO *cs __attribute__((unused)), const uchar * s1, uint len1, const uchar * s2, uint len2) { @@ -555,7 +555,7 @@ int my_strnncoll_tis620(CHARSET_INFO *cs, Arg: Destination buffer, source string, dest length and source length Ret: Conveted string size */ -int my_strnxfrm_tis620(CHARSET_INFO *cs, +int my_strnxfrm_tis620(CHARSET_INFO *cs __attribute__((unused)), uchar * dest, uint len, const uchar * src, uint srclen) { @@ -613,7 +613,7 @@ int my_strxfrm_tis620(uchar * dest, const uchar * src, int len) #define wild_one '_' #define wild_many '%' -my_bool my_like_range_tis620(CHARSET_INFO *cs, +my_bool my_like_range_tis620(CHARSET_INFO *cs __attribute__((unused)), const char *ptr, uint ptr_length, pchar escape, uint res_length, char *min_str, char *max_str, uint *min_length, uint *max_length) diff --git a/strings/ctype-ujis.c b/strings/ctype-ujis.c index 5398b93816e..fb8804c2253 100644 --- a/strings/ctype-ujis.c +++ b/strings/ctype-ujis.c @@ -183,7 +183,8 @@ uchar NEAR sort_order_ujis[]= #define isujis_ss3(c) (((c)&0xff) == 0x8f) -int ismbchar_ujis(CHARSET_INFO *cs,const char* p, const char *e) +int ismbchar_ujis(CHARSET_INFO *cs __attribute__((unused)), + const char* p, const char *e) { return ((*(uchar*)(p)<0x80)? 0:\ isujis(*(p)) && (e)-(p)>1 && isujis(*((p)+1))? 2:\ @@ -192,12 +193,12 @@ int ismbchar_ujis(CHARSET_INFO *cs,const char* p, const char *e) 0); } -my_bool ismbhead_ujis(CHARSET_INFO *cs,uint c) +my_bool ismbhead_ujis(CHARSET_INFO *cs __attribute__((unused)),uint c) { return (isujis(c) || isujis_ss2(c) || isujis_ss3(c)); } -int mbcharlen_ujis(CHARSET_INFO *cs,uint c) +int mbcharlen_ujis(CHARSET_INFO *cs __attribute__((unused)),uint c) { return (isujis(c)? 2: isujis_ss2(c)? 2: isujis_ss3(c)? 3: 0); } diff --git a/strings/ctype-utf8.c b/strings/ctype-utf8.c index 6070f2ecb5c..ab2a2db9acc 100644 --- a/strings/ctype-utf8.c +++ b/strings/ctype-utf8.c @@ -1571,7 +1571,7 @@ uchar to_upper_utf8[] = { }; -int my_utf8_uni (__attribute__((unused)) CHARSET_INFO *cs, +int my_utf8_uni (CHARSET_INFO *cs __attribute__((unused)) , my_wc_t * pwc, const uchar *s, const uchar *e) { unsigned char c = s[0]; @@ -1673,7 +1673,7 @@ int my_utf8_uni (__attribute__((unused)) CHARSET_INFO *cs, return MY_CS_ILSEQ; } -int my_uni_utf8 (__attribute__((unused)) CHARSET_INFO *cs, +int my_uni_utf8 (CHARSET_INFO *cs __attribute__((unused)) , my_wc_t wc, uchar *r, uchar *e) { int count; @@ -1879,12 +1879,12 @@ int my_ismbchar_utf8(CHARSET_INFO *cs,const char *b, const char *e) return (res>1) ? res : 0; } -my_bool my_ismbhead_utf8(__attribute__((unused)) CHARSET_INFO *cs, uint ch) +my_bool my_ismbhead_utf8(CHARSET_INFO *cs __attribute__((unused)) , uint ch) { return ( ch >= 0xc2 ); } -int my_mbcharlen_utf8(__attribute__((unused)) CHARSET_INFO *cs, uint c) +int my_mbcharlen_utf8(CHARSET_INFO *cs __attribute__((unused)) , uint c) { if (c < 0x80) return 1; diff --git a/strings/ctype.c b/strings/ctype.c index 9fed9ebafb6..5972dfdeafa 100644 --- a/strings/ctype.c +++ b/strings/ctype.c @@ -20,6 +20,235 @@ #include #endif +#if defined(HAVE_CHARSET_latin1)||defined(HAVE_CHARSET_latin1_de)||\ +defined(HAVE_CHARSET_danish)||defined(HAVE_CHARSET_german1) + +static uint16 tab_8859_1_uni[256]={ + 0,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, +0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, +0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, +0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, +0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, +0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, +0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, +0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, +0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, +0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, +0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, +0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, +0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, +0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, +0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, +0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x00A0,0x00A1,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7, +0x00A8,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF, +0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7, +0x00B8,0x00B9,0x00BA,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF, +0x00C0,0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x00C7, +0x00C8,0x00C9,0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF, +0x00D0,0x00D1,0x00D2,0x00D3,0x00D4,0x00D5,0x00D6,0x00D7, +0x00D8,0x00D9,0x00DA,0x00DB,0x00DC,0x00DD,0x00DE,0x00DF, +0x00E0,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6,0x00E7, +0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF, +0x00F0,0x00F1,0x00F2,0x00F3,0x00F4,0x00F5,0x00F6,0x00F7, +0x00F8,0x00F9,0x00FA,0x00FB,0x00FC,0x00FD,0x00FE,0x00FF +}; + +static uchar tab_uni_8859_1_plane00[]={ +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, +0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, +0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, +0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, +0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, +0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, +0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, +0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, +0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, +0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, +0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, +0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}; + +static MY_UNI_IDX idx_uni_8859_1[]={ + {0x0000,0x00FF,tab_uni_8859_1_plane00}, + {0,0,NULL} +}; +#endif + +#if defined(HAVE_CHARSET_latin2)||defined(HAVE_CHARSET_croat)||\ +defined(HAVE_CHARSET_hungarian)||defined(HAVE_CHARSET_czech) + +static uint16 tab_8859_2_uni[256]={ + 0,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, +0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, +0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, +0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, +0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, +0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, +0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, +0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, +0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, +0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, +0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, +0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, +0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, +0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, +0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, +0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x00A0,0x0104,0x02D8,0x0141,0x00A4,0x013D,0x015A,0x00A7, +0x00A8,0x0160,0x015E,0x0164,0x0179,0x00AD,0x017D,0x017B, +0x00B0,0x0105,0x02DB,0x0142,0x00B4,0x013E,0x015B,0x02C7, +0x00B8,0x0161,0x015F,0x0165,0x017A,0x02DD,0x017E,0x017C, +0x0154,0x00C1,0x00C2,0x0102,0x00C4,0x0139,0x0106,0x00C7, +0x010C,0x00C9,0x0118,0x00CB,0x011A,0x00CD,0x00CE,0x010E, +0x0110,0x0143,0x0147,0x00D3,0x00D4,0x0150,0x00D6,0x00D7, +0x0158,0x016E,0x00DA,0x0170,0x00DC,0x00DD,0x0162,0x00DF, +0x0155,0x00E1,0x00E2,0x0103,0x00E4,0x013A,0x0107,0x00E7, +0x010D,0x00E9,0x0119,0x00EB,0x011B,0x00ED,0x00EE,0x010F, +0x0111,0x0144,0x0148,0x00F3,0x00F4,0x0151,0x00F6,0x00F7, +0x0159,0x016F,0x00FA,0x0171,0x00FC,0x00FD,0x0163,0x02D9 +}; + + +/* 0000-00FD , 254 chars */ +static uchar tab_uni_8859_2_plane00[]={ +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, +0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, +0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, +0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, +0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, +0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, +0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0xA0,0x00,0x00,0x00,0xA4,0x00,0x00,0xA7,0xA8,0x00,0x00,0x00,0x00,0xAD,0x00,0x00, +0xB0,0x00,0x00,0x00,0xB4,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0xC1,0xC2,0x00,0xC4,0x00,0x00,0xC7,0x00,0xC9,0x00,0xCB,0x00,0xCD,0xCE,0x00, +0x00,0x00,0x00,0xD3,0xD4,0x00,0xD6,0xD7,0x00,0x00,0xDA,0x00,0xDC,0xDD,0x00,0xDF, +0x00,0xE1,0xE2,0x00,0xE4,0x00,0x00,0xE7,0x00,0xE9,0x00,0xEB,0x00,0xED,0xEE,0x00, +0x00,0x00,0x00,0xF3,0xF4,0x00,0xF6,0xF7,0x00,0x00,0xFA,0x00,0xFC,0xFD}; + +/* 0102-017E , 125 chars */ +static uchar tab_uni_8859_2_plane01[]={ +0xC3,0xE3,0xA1,0xB1,0xC6,0xE6,0x00,0x00,0x00,0x00,0xC8,0xE8,0xCF,0xEF,0xD0,0xF0, +0x00,0x00,0x00,0x00,0x00,0x00,0xCA,0xEA,0xCC,0xEC,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC5,0xE5,0x00,0x00,0xA5,0xB5,0x00,0x00,0xA3, +0xB3,0xD1,0xF1,0x00,0x00,0xD2,0xF2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD5,0xF5, +0x00,0x00,0xC0,0xE0,0x00,0x00,0xD8,0xF8,0xA6,0xB6,0x00,0x00,0xAA,0xBA,0xA9,0xB9, +0xDE,0xFE,0xAB,0xBB,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD9,0xF9,0xDB,0xFB, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAC,0xBC,0xAF,0xBF,0xAE,0xBE}; + +/* 02C7-02DD , 23 chars */ +static uchar tab_uni_8859_2_plane02[]={ +0xB7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0xA2,0xFF,0x00,0xB2,0x00,0xBD}; + +static MY_UNI_IDX idx_uni_8859_2[]={ + {0x0000,0x00FD,tab_uni_8859_2_plane00}, + {0x0102,0x017E,tab_uni_8859_2_plane01}, + {0x02C7,0x02DD,tab_uni_8859_2_plane02}, + {0,0,NULL} +}; +#endif + +#if defined(HAVE_CHARSET_cp1251) || defined(HAVE_CHARSET_win1251) || defined(HAVE_CHARSET_win1251ukr) +static uint16 tab_cp1251_uni[256]={ + 0,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, +0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, +0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, +0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, +0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, +0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, +0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, +0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, +0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, +0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, +0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, +0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, +0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, +0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, +0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, +0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, +0x0402,0x0403,0x201A,0x0453,0x201E,0x2026,0x2020,0x2021, + 0,0x2030,0x0409,0x2039,0x040A,0x040C,0x040B,0x040F, +0x0452,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014, + 0,0x2122,0x0459,0x203A,0x045A,0x045C,0x045B,0x045F, +0x00A0,0x040E,0x045E,0x0408,0x00A4,0x0490,0x00A6,0x00A7, +0x0401,0x00A9,0x0404,0x00AB,0x00AC,0x00AD,0x00AE,0x0407, +0x00B0,0x00B1,0x0406,0x0456,0x0491,0x00B5,0x00B6,0x00B7, +0x0451,0x2116,0x0454,0x00BB,0x0458,0x0405,0x0455,0x0457, +0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0416,0x0417, +0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E,0x041F, +0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427, +0x0428,0x0429,0x042A,0x042B,0x042C,0x042D,0x042E,0x042F, +0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0436,0x0437, +0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E,0x043F, +0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447, +0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E,0x044F +}; + +/* 0000-00BB , 188 chars */ +static uchar tab_uni_cp1251_plane00[]={ +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, +0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, +0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, +0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, +0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, +0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, +0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0xA0,0x00,0x00,0x00,0xA4,0x00,0xA6,0xA7,0x00,0xA9,0x00,0xAB,0xAC,0xAD,0xAE,0x00, +0xB0,0xB1,0x00,0x00,0x00,0xB5,0xB6,0xB7,0x00,0x00,0x00,0xBB}; + +/* 0401-0491 , 145 chars */ +static uchar tab_uni_cp1251_plane04[]={ +0xA8,0x80,0x81,0xAA,0xBD,0xB2,0xAF,0xA3,0x8A,0x8C,0x8E,0x8D,0x00,0xA1,0x8F,0xC0, +0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0, +0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0, +0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0, +0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x00, +0xB8,0x90,0x83,0xBA,0xBE,0xB3,0xBF,0xBC,0x9A,0x9C,0x9E,0x9D,0x00,0xA2,0x9F,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA5, +0xB4}; + +/* 2013-203A , 40 chars */ +static uchar tab_uni_cp1251_plane20[]={ +0x96,0x97,0x00,0x00,0x00,0x91,0x92,0x82,0x00,0x93,0x94,0x84,0x00,0x86,0x87,0x95, +0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x9B}; + +/* 2116-2122 , 13 chars */ +static uchar tab_uni_cp1251_plane21[]={ +0xB9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99}; + +static MY_UNI_IDX idx_uni_cp1251[]={ + {0x0000,0x00BB,tab_uni_cp1251_plane00}, + {0x0401,0x0491,tab_uni_cp1251_plane04}, + {0x2013,0x203A,tab_uni_cp1251_plane20}, + {0x2116,0x2122,tab_uni_cp1251_plane21}, + {0,0,NULL} +}; +#endif + + + #ifdef HAVE_CHARSET_armscii8 static uchar ctype_armscii8[] = { 0, @@ -97,6 +326,85 @@ static uchar sort_order_armscii8[] = { 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 }; + +static uint16 tab_armscii_8_uni[256]={ + 0,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, +0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, +0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, +0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, +0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, +0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, +0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, +0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, +0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, +0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, +0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, +0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, +0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, +0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, +0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, +0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, +0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, +0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F, +0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097, +0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F, +0x00A0,0x2741,0x00A7,0x0589,0x0029,0x0028,0x00BB,0x00AB, +0x2014,0x002E,0x055D,0x002C,0x002D,0x055F,0x2026,0x055C, +0x055B,0x055E,0x0531,0x0561,0x0532,0x0562,0x0533,0x0563, +0x0534,0x0564,0x0535,0x0565,0x0536,0x0566,0x0537,0x0567, +0x0538,0x0568,0x0539,0x0569,0x053A,0x056A,0x053B,0x056B, +0x053C,0x056C,0x053D,0x056D,0x053E,0x056E,0x053F,0x056F, +0x0540,0x0570,0x0541,0x0571,0x0542,0x0572,0x0543,0x0573, +0x0544,0x0574,0x0545,0x0575,0x0546,0x0576,0x0547,0x0577, +0x0548,0x0578,0x0549,0x0579,0x054A,0x057A,0x054B,0x057B, +0x054C,0x057C,0x054D,0x057D,0x054E,0x057E,0x054F,0x057F, +0x0550,0x0580,0x0551,0x0581,0x0552,0x0582,0x0553,0x0583, +0x0554,0x0584,0x0555,0x0585,0x0556,0x0586,0x2019,0x0027 +}; + + +/* 0000-00BB , 188 chars */ +static uchar tab_uni_armscii_8_plane00[]={ +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, +0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, +0x20,0x21,0x22,0x23,0x24,0x25,0x26,0xFF,0xA5,0xA4,0x2A,0x2B,0xAB,0xAC,0xA9,0x2F, +0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, +0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, +0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, +0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, +0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, +0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, +0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0xA2,0x00,0x00,0x00,0xA7,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA6}; + +/* 0531-0589 , 89 chars */ +static uchar tab_uni_armscii_8_plane05[]={ +0xB2,0xB4,0xB6,0xB8,0xBA,0xBC,0xBE,0xC0,0xC2,0xC4,0xC6,0xC8,0xCA,0xCC,0xCE,0xD0, +0xD2,0xD4,0xD6,0xD8,0xDA,0xDC,0xDE,0xE0,0xE2,0xE4,0xE6,0xE8,0xEA,0xEC,0xEE,0xF0, +0xF2,0xF4,0xF6,0xF8,0xFA,0xFC,0x00,0x00,0x00,0x00,0xB0,0xAF,0xAA,0xB1,0xAD,0x00, +0xB3,0xB5,0xB7,0xB9,0xBB,0xBD,0xBF,0xC1,0xC3,0xC5,0xC7,0xC9,0xCB,0xCD,0xCF,0xD1, +0xD3,0xD5,0xD7,0xD9,0xDB,0xDD,0xDF,0xE1,0xE3,0xE5,0xE7,0xE9,0xEB,0xED,0xEF,0xF1, +0xF3,0xF5,0xF7,0xF9,0xFB,0xFD,0x00,0x00,0xA3}; + +/* 2014-2026 , 19 chars */ +static uchar tab_uni_armscii_8_plane20[]={ +0xA8,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0xAE}; + +/* 2741-2741 , 1 chars */ +static uchar tab_uni_armscii_8_plane27[]={ +0xA1}; + + +static MY_UNI_IDX idx_uni_armscii_8[]={ + {0x0000,0x00BB,tab_uni_armscii_8_plane00}, + {0x0531,0x0589,tab_uni_armscii_8_plane05}, + {0x2014,0x2026,tab_uni_armscii_8_plane20}, + {0x2741,0x2741,tab_uni_armscii_8_plane27}, + {0,0,NULL} +}; + #endif @@ -182,6 +490,7 @@ static uchar sort_order_cp1251[] = { 91, 92, 93, 94, 95, 96, 98, 99,100,101,102,103,104,105,106,107, 108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123 }; + #endif @@ -267,6 +576,104 @@ static uchar sort_order_cp1257[] = { 255, 79,255,255,255,255, 72,255, 69,255,255, 73,255,255,255,255, 90,255,255,255,255,255,255,255, 94,255,255, 93,255,255,255,255 }; + +static uint16 tab_cp1257_uni[256]={ + 0,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, +0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, +0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, +0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, +0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, +0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, +0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, +0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, +0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, +0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, +0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, +0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, +0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, +0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, +0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, +0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, +0x20AC, 0,0x201A, 0,0x201E,0x2026,0x2020,0x2021, + 0,0x2030, 0,0x2039, 0,0x00A8,0x02C7,0x00B8, + 0,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014, + 0,0x2122, 0,0x203A, 0,0x00AF,0x02DB, 0, +0x00A0, 0,0x00A2,0x00A3,0x00A4, 0,0x00A6,0x00A7, +0x00D8,0x00A9,0x0156,0x00AB,0x00AC,0x00AD,0x00AE,0x00C6, +0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7, +0x00F8,0x00B9,0x0157,0x00BB,0x00BC,0x00BD,0x00BE,0x00E6, +0x0104,0x012E,0x0100,0x0106,0x00C4,0x00C5,0x0118,0x0112, +0x010C,0x00C9,0x0179,0x0116,0x0122,0x0136,0x012A,0x013B, +0x0160,0x0143,0x0145,0x00D3,0x014C,0x00D5,0x00D6,0x00D7, +0x0172,0x0141,0x015A,0x016A,0x00DC,0x017B,0x017D,0x00DF, +0x0105,0x012F,0x0101,0x0107,0x00E4,0x00E5,0x0119,0x0113, +0x010D,0x00E9,0x017A,0x0117,0x0123,0x0137,0x012B,0x013C, +0x0161,0x0144,0x0146,0x00F3,0x014D,0x00F5,0x00F6,0x00F7, +0x0173,0x0142,0x015B,0x016B,0x00FC,0x017C,0x017E,0x02D9 +}; + + +/* 0000-00FC , 253 chars */ +static uchar tab_uni_cp1257_plane00[]={ +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, +0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, +0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, +0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, +0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, +0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, +0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0xA0,0x00,0xA2,0xA3,0xA4,0x00,0xA6,0xA7,0x8D,0xA9,0x00,0xAB,0xAC,0xAD,0xAE,0x9D, +0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0x8F,0xB9,0x00,0xBB,0xBC,0xBD,0xBE,0x00, +0x00,0x00,0x00,0x00,0xC4,0xC5,0xAF,0x00,0x00,0xC9,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0xD3,0x00,0xD5,0xD6,0xD7,0xA8,0x00,0x00,0x00,0xDC,0x00,0x00,0xDF, +0x00,0x00,0x00,0x00,0xE4,0xE5,0xBF,0x00,0x00,0xE9,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0xF3,0x00,0xF5,0xF6,0xF7,0xB8,0x00,0x00,0x00,0xFC}; + +/* 0100-017E , 127 chars */ +static uchar tab_uni_cp1257_plane01[]={ +0xC2,0xE2,0x00,0x00,0xC0,0xE0,0xC3,0xE3,0x00,0x00,0x00,0x00,0xC8,0xE8,0x00,0x00, +0x00,0x00,0xC7,0xE7,0x00,0x00,0xCB,0xEB,0xC6,0xE6,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0xCC,0xEC,0x00,0x00,0x00,0x00,0x00,0x00,0xCE,0xEE,0x00,0x00,0xC1,0xE1, +0x00,0x00,0x00,0x00,0x00,0x00,0xCD,0xED,0x00,0x00,0x00,0xCF,0xEF,0x00,0x00,0x00, +0x00,0xD9,0xF9,0xD1,0xF1,0xD2,0xF2,0x00,0x00,0x00,0x00,0x00,0xD4,0xF4,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0xAA,0xBA,0x00,0x00,0xDA,0xFA,0x00,0x00,0x00,0x00, +0xD0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDB,0xFB,0x00,0x00,0x00,0x00, +0x00,0x00,0xD8,0xF8,0x00,0x00,0x00,0x00,0x00,0xCA,0xEA,0xDD,0xFD,0xDE,0xFE}; + +/* 2013-20AC , 154 chars */ +static uchar tab_uni_cp1257_plane20[]={ +0x96,0x97,0x00,0x00,0x00,0x91,0x92,0x82,0x00,0x93,0x94,0x84,0x00,0x86,0x87,0x95, +0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x9B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80}; + +/* 02C7-02DB , 21 chars */ +static uchar tab_uni_cp1257_plane02[]={ +0x8E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0xFF,0x00,0x9E}; + +/* 2122-2122 , 1 chars */ +static uchar tab_uni_cp1257_plane21[]={ +0x99}; + +static MY_UNI_IDX idx_uni_cp1257[]={ + {0x0000,0x00FC,tab_uni_cp1257_plane00}, + {0x0100,0x017E,tab_uni_cp1257_plane01}, + {0x2013,0x20AC,tab_uni_cp1257_plane20}, + {0x02C7,0x02DB,tab_uni_cp1257_plane02}, + {0x2122,0x2122,tab_uni_cp1257_plane21}, + {0,0,NULL} +}; + #endif @@ -1196,6 +1603,107 @@ static uchar sort_order_koi8_ru[] = { 254,223,224,246,227,228,244,226,245,232,233,234,235,236,237,238, 239,255,240,241,242,243,230,225,252,251,231,248,253,249,247,250 }; + +static uint16 tab_koi8_r_uni[256]={ + 0,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, +0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, +0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, +0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, +0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, +0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, +0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, +0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, +0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, +0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, +0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, +0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, +0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, +0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, +0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, +0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, +0x2500,0x2502,0x250C,0x2510,0x2514,0x2518,0x251C,0x2524, +0x252C,0x2534,0x253C,0x2580,0x2584,0x2588,0x258C,0x2590, +0x2591,0x2592,0x2593,0x2320,0x25A0,0x2219,0x221A,0x2248, +0x2264,0x2265,0x00A0,0x2321,0x00B0,0x00B2,0x00B7,0x00F7, +0x2550,0x2551,0x2552,0x0451,0x2553,0x2554,0x2555,0x2556, +0x2557,0x2558,0x2559,0x255A,0x255B,0x255C,0x255D,0x255E, +0x255F,0x2560,0x2561,0x0401,0x2562,0x2563,0x2564,0x2565, +0x2566,0x2567,0x2568,0x2569,0x256A,0x256B,0x256C,0x00A9, +0x044E,0x0430,0x0431,0x0446,0x0434,0x0435,0x0444,0x0433, +0x0445,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E, +0x043F,0x044F,0x0440,0x0441,0x0442,0x0443,0x0436,0x0432, +0x044C,0x044B,0x0437,0x0448,0x044D,0x0449,0x0447,0x044A, +0x042E,0x0410,0x0411,0x0426,0x0414,0x0415,0x0424,0x0413, +0x0425,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E, +0x041F,0x042F,0x0420,0x0421,0x0422,0x0423,0x0416,0x0412, +0x042C,0x042B,0x0417,0x0428,0x042D,0x0429,0x0427,0x042A +}; + + +/* 0000-00F7 , 248 chars */ +static uchar tab_uni_koi8_r_plane00[]={ +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, +0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, +0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, +0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, +0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, +0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, +0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x9A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBF,0x00,0x00,0x00,0x00,0x00,0x00, +0x9C,0x00,0x9D,0x00,0x00,0x00,0x00,0x9E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F}; + +/* 0401-0451 , 81 chars */ +static uchar tab_uni_koi8_r_plane04[]={ +0xB3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE1, +0xE2,0xF7,0xE7,0xE4,0xE5,0xF6,0xFA,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF2, +0xF3,0xF4,0xF5,0xE6,0xE8,0xE3,0xFE,0xFB,0xFD,0xFF,0xF9,0xF8,0xFC,0xE0,0xF1,0xC1, +0xC2,0xD7,0xC7,0xC4,0xC5,0xD6,0xDA,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD2, +0xD3,0xD4,0xD5,0xC6,0xC8,0xC3,0xDE,0xDB,0xDD,0xDF,0xD9,0xD8,0xDC,0xC0,0xD1,0x00, +0xA3}; + +/* 2500-25A0 , 161 chars */ +static uchar tab_uni_koi8_r_plane25[]={ +0x80,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00, +0x83,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x86,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8A,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0xA0,0xA1,0xA2,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0, +0xB1,0xB2,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x8B,0x00,0x00,0x00,0x8C,0x00,0x00,0x00,0x8D,0x00,0x00,0x00,0x8E,0x00,0x00,0x00, +0x8F,0x90,0x91,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x94}; + +/* 2219-2265 , 77 chars */ +static uchar tab_uni_koi8_r_plane22[]={ +0x95,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x99}; + +/* 2320-2321 , 2 chars */ +static uchar tab_uni_koi8_r_plane23[]={ +0x93,0x9B}; + + +static MY_UNI_IDX idx_uni_koi8_r[]={ + {0x0000,0x00F7,tab_uni_koi8_r_plane00}, + {0x0401,0x0451,tab_uni_koi8_r_plane04}, + {0x2500,0x25A0,tab_uni_koi8_r_plane25}, + {0x2219,0x2265,tab_uni_koi8_r_plane22}, + {0x2320,0x2321,tab_uni_koi8_r_plane23}, + {0,0,NULL} +}; + #endif #ifdef HAVE_CHARSET_koi8_ukr @@ -1280,6 +1788,116 @@ static uchar sort_order_koi8_ukr[] = { 163,128,129,155,133,134,153,131,154,139,142,143,144,145,146,147, 148,164,149,150,151,152,137,130,161,160,138,157,162,158,156,159 }; + +static uint16 tab_koi8_u_uni[256]={ + 0,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, +0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, +0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, +0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, +0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, +0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, +0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, +0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, +0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, +0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, +0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, +0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, +0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, +0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, +0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, +0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E, 0, +0x2500,0x2502,0x250C,0x2510,0x2514,0x2518,0x251C,0x2524, +0x252C,0x2534,0x253C,0x2580,0x2584,0x2588,0x258C,0x2590, +0x2591,0x2592,0x2593,0x2320,0x25A0,0x2022,0x221A,0x2248, +0x2264,0x2265,0x00A0,0x2321,0x00B0,0x00B2,0x00B7,0x00F7, +0x2550,0x2551,0x2552,0x0451,0x0454,0x2554,0x0456,0x0457, +0x2557,0x2558,0x2559,0x255A,0x255B,0x0491,0x255D,0x255E, +0x255F,0x2560,0x2561,0x0401,0x0404,0x2563,0x0406,0x0407, +0x2566,0x2567,0x2568,0x2569,0x256A,0x0490,0x256C,0x00A9, +0x044E,0x0430,0x0431,0x0446,0x0434,0x0435,0x0444,0x0433, +0x0445,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E, +0x043F,0x044F,0x0440,0x0441,0x0442,0x0443,0x0436,0x0432, +0x044C,0x044B,0x0437,0x0448,0x044D,0x0449,0x0447,0x044A, +0x042E,0x0410,0x0411,0x0426,0x0414,0x0415,0x0424,0x0413, +0x0425,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E, +0x041F,0x042F,0x0420,0x0421,0x0422,0x0423,0x0416,0x0412, +0x042C,0x042B,0x0417,0x0428,0x042D,0x0429,0x0427,0x042A +}; + + +/* 0000-00F7 , 248 chars */ +static uchar tab_uni_koi8_u_plane00[]={ +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, +0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, +0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, +0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, +0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, +0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, +0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x9A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBF,0x00,0x00,0x00,0x00,0x00,0x00, +0x9C,0x00,0x9D,0x00,0x00,0x00,0x00,0x9E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9F}; + +/* 0401-0491 , 145 chars */ +static uchar tab_uni_koi8_u_plane04[]={ +0xB3,0x00,0x00,0xB4,0x00,0xB6,0xB7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE1, +0xE2,0xF7,0xE7,0xE4,0xE5,0xF6,0xFA,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF2, +0xF3,0xF4,0xF5,0xE6,0xE8,0xE3,0xFE,0xFB,0xFD,0xFF,0xF9,0xF8,0xFC,0xE0,0xF1,0xC1, +0xC2,0xD7,0xC7,0xC4,0xC5,0xD6,0xDA,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD2, +0xD3,0xD4,0xD5,0xC6,0xC8,0xC3,0xDE,0xDB,0xDD,0xDF,0xD9,0xD8,0xDC,0xC0,0xD1,0x00, +0xA3,0x00,0x00,0xA4,0x00,0xA6,0xA7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBD, +0xAD}; + +/* 2500-25A0 , 161 chars */ +static uchar tab_uni_koi8_u_plane25[]={ +0x80,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00, +0x83,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x86,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8A,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0xA0,0xA1,0xA2,0x00,0xA5,0x00,0x00,0xA8,0xA9,0xAA,0xAB,0xAC,0x00,0xAE,0xAF,0xB0, +0xB1,0xB2,0x00,0xB5,0x00,0x00,0xB8,0xB9,0xBA,0xBB,0xBC,0x00,0xBE,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x8B,0x00,0x00,0x00,0x8C,0x00,0x00,0x00,0x8D,0x00,0x00,0x00,0x8E,0x00,0x00,0x00, +0x8F,0x90,0x91,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x94}; + +/* 221A-2265 , 76 chars */ +static uchar tab_uni_koi8_u_plane22[]={ +0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x99}; + +/* 2320-2321 , 2 chars */ +static uchar tab_uni_koi8_u_plane23[]={ +0x93,0x9B}; + +/* 2022-2022 , 1 chars */ +static uchar tab_uni_koi8_u_plane20[]={ +0x95}; + + +static MY_UNI_IDX idx_uni_koi8_u[]={ + {0x0000,0x00F7,tab_uni_koi8_u_plane00}, + {0x0401,0x0491,tab_uni_koi8_u_plane04}, + {0x2500,0x25A0,tab_uni_koi8_u_plane25}, + {0x221A,0x2265,tab_uni_koi8_u_plane22}, + {0x2320,0x2321,tab_uni_koi8_u_plane23}, + {0x2022,0x2022,tab_uni_koi8_u_plane20}, + {0,0,NULL} +}; + #endif #ifdef HAVE_CHARSET_latin1 @@ -1532,6 +2150,77 @@ static uchar sort_order_latin5[] = { 204,205,206,207,208,209,210, 68,211,212,213,214,215,216,217,218, 73,219,220,221,222,223, 83,250,225,226,227,228, 91, 75, 88,255 }; + +static uint16 tab_8859_9_uni[256]={ + 0,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, +0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, +0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, +0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, +0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, +0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, +0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, +0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, +0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, +0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, +0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, +0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, +0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, +0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, +0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, +0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x00A0,0x00A1,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7, +0x00A8,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF, +0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7, +0x00B8,0x00B9,0x00BA,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF, +0x00C0,0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x00C7, +0x00C8,0x00C9,0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF, +0x011E,0x00D1,0x00D2,0x00D3,0x00D4,0x00D5,0x00D6,0x00D7, +0x00D8,0x00D9,0x00DA,0x00DB,0x00DC,0x0130,0x015E,0x00DF, +0x00E0,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6,0x00E7, +0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF, +0x011F,0x00F1,0x00F2,0x00F3,0x00F4,0x00F5,0x00F6,0x00F7, +0x00F8,0x00F9,0x00FA,0x00FB,0x00FC,0x0131,0x015F,0x00FF +}; + + +/* 0000-00FF , 256 chars */ +static uchar tab_uni_8859_9_plane00[]={ +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, +0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, +0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, +0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, +0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, +0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, +0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, +0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, +0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, +0x00,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0x00,0x00,0xDF, +0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, +0x00,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0x00,0x00,0xFF}; + +/* 011E-015F , 66 chars */ +static uchar tab_uni_8859_9_plane01[]={ +0xD0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0xDD,0xFD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0xDE,0xFE}; + + +static MY_UNI_IDX idx_uni_8859_9[]={ + {0x0000,0x00FF,tab_uni_8859_9_plane00}, + {0x011E,0x015F,tab_uni_8859_9_plane01}, + {0,0,NULL} +}; + #endif #ifdef HAVE_CHARSET_swe7 @@ -1700,6 +2389,60 @@ static uchar sort_order_usa7[] = { 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 }; + +static uint16 tab_us_ascii_uni[256]={ + 0,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, +0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, +0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, +0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, +0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, +0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, +0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, +0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, +0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, +0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, +0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, +0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, +0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, +0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, +0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, +0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + + +/* 0000-007E , 127 chars */ +static uchar tab_uni_us_ascii_plane00[]={ +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, +0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, +0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, +0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, +0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, +0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, +0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E}; + + +static MY_UNI_IDX idx_uni_us_ascii[]={ + {0x0000,0x007E,tab_uni_us_ascii_plane00}, + {0,0,NULL} +}; + #endif #ifdef HAVE_CHARSET_win1250 @@ -1784,6 +2527,105 @@ static uchar sort_order_win1250[] = { 88, 65, 65, 65, 65, 80, 69, 67, 68, 73, 73, 73, 73, 77, 77, 70, 71, 83, 83, 85, 85, 85, 85,247, 88, 92, 92, 92, 92, 96, 91,255 }; + +static uint16 tab_cp1250_uni[256]={ + 0,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, +0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, +0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, +0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, +0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, +0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, +0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, +0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, +0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, +0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, +0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, +0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, +0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, +0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, +0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, +0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, +0x20AC, 0,0x201A, 0,0x201E,0x2026,0x2020,0x2021, + 0,0x2030,0x0160,0x2039,0x015A,0x0164,0x017D,0x0179, + 0,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014, + 0,0x2122,0x0161,0x203A,0x015B,0x0165,0x017E,0x017A, +0x00A0,0x02C7,0x02D8,0x0141,0x00A4,0x0104,0x00A6,0x00A7, +0x00A8,0x00A9,0x015E,0x00AB,0x00AC,0x00AD,0x00AE,0x017B, +0x00B0,0x00B1,0x02DB,0x0142,0x00B4,0x00B5,0x00B6,0x00B7, +0x00B8,0x0105,0x015F,0x00BB,0x013D,0x02DD,0x013E,0x017C, +0x0154,0x00C1,0x00C2,0x0102,0x00C4,0x0139,0x0106,0x00C7, +0x010C,0x00C9,0x0118,0x00CB,0x011A,0x00CD,0x00CE,0x010E, +0x0110,0x0143,0x0147,0x00D3,0x00D4,0x0150,0x00D6,0x00D7, +0x0158,0x016E,0x00DA,0x0170,0x00DC,0x00DD,0x0162,0x00DF, +0x0155,0x00E1,0x00E2,0x0103,0x00E4,0x013A,0x0107,0x00E7, +0x010D,0x00E9,0x0119,0x00EB,0x011B,0x00ED,0x00EE,0x010F, +0x0111,0x0144,0x0148,0x00F3,0x00F4,0x0151,0x00F6,0x00F7, +0x0159,0x016F,0x00FA,0x0171,0x00FC,0x00FD,0x0163,0x02D9 +}; + + +/* 0000-00FD , 254 chars */ +static uchar tab_uni_cp1250_plane00[]={ +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, +0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, +0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, +0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, +0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, +0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, +0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0xA0,0x00,0x00,0x00,0xA4,0x00,0xA6,0xA7,0xA8,0xA9,0x00,0xAB,0xAC,0xAD,0xAE,0x00, +0xB0,0xB1,0x00,0x00,0xB4,0xB5,0xB6,0xB7,0xB8,0x00,0x00,0xBB,0x00,0x00,0x00,0x00, +0x00,0xC1,0xC2,0x00,0xC4,0x00,0x00,0xC7,0x00,0xC9,0x00,0xCB,0x00,0xCD,0xCE,0x00, +0x00,0x00,0x00,0xD3,0xD4,0x00,0xD6,0xD7,0x00,0x00,0xDA,0x00,0xDC,0xDD,0x00,0xDF, +0x00,0xE1,0xE2,0x00,0xE4,0x00,0x00,0xE7,0x00,0xE9,0x00,0xEB,0x00,0xED,0xEE,0x00, +0x00,0x00,0x00,0xF3,0xF4,0x00,0xF6,0xF7,0x00,0x00,0xFA,0x00,0xFC,0xFD}; + +/* 0102-017E , 125 chars */ +static uchar tab_uni_cp1250_plane01[]={ +0xC3,0xE3,0xA5,0xB9,0xC6,0xE6,0x00,0x00,0x00,0x00,0xC8,0xE8,0xCF,0xEF,0xD0,0xF0, +0x00,0x00,0x00,0x00,0x00,0x00,0xCA,0xEA,0xCC,0xEC,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC5,0xE5,0x00,0x00,0xBC,0xBE,0x00,0x00,0xA3, +0xB3,0xD1,0xF1,0x00,0x00,0xD2,0xF2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD5,0xF5, +0x00,0x00,0xC0,0xE0,0x00,0x00,0xD8,0xF8,0x8C,0x9C,0x00,0x00,0xAA,0xBA,0x8A,0x9A, +0xDE,0xFE,0x8D,0x9D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD9,0xF9,0xDB,0xFB, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8F,0x9F,0xAF,0xBF,0x8E,0x9E}; + +/* 2013-20AC , 154 chars */ +static uchar tab_uni_cp1250_plane20[]={ +0x96,0x97,0x00,0x00,0x00,0x91,0x92,0x82,0x00,0x93,0x94,0x84,0x00,0x86,0x87,0x95, +0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x9B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80}; + +/* 02C7-02DD , 23 chars */ +static uchar tab_uni_cp1250_plane02[]={ +0xA1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0xA2,0xFF,0x00,0xB2,0x00,0xBD}; + +/* 2122-2122 , 1 chars */ +static uchar tab_uni_cp1250_plane21[]={ +0x99}; + + +static MY_UNI_IDX idx_uni_cp1250[]={ + {0x0000,0x00FD,tab_uni_cp1250_plane00}, + {0x0102,0x017E,tab_uni_cp1250_plane01}, + {0x2013,0x20AC,tab_uni_cp1250_plane20}, + {0x02C7,0x02DD,tab_uni_cp1250_plane02}, + {0x2122,0x2122,tab_uni_cp1250_plane21}, + {0,0,NULL} +}; + #endif #ifdef HAVE_CHARSET_win1251 @@ -1966,14 +2808,18 @@ CHARSET_INFO compiled_charsets[] = { to_lower_latin1, to_upper_latin1, sort_order_latin1, - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ + tab_8859_1_uni, /* tab_to_uni */ + idx_uni_8859_1, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -1986,20 +2832,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_big5 { - 1, /* number */ - "big5", /* name */ + 1, /* number */ + "big5", /* name */ ctype_big5, to_lower_big5, to_upper_big5, sort_order_big5, - 1, /* strxfrm_multiply */ + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + 1, /* strxfrm_multiply */ my_strnncoll_big5, my_strnxfrm_big5, my_like_range_big5, - 2, /* mbmaxlen */ + 2, /* mbmaxlen */ ismbchar_big5, ismbhead_big5, mbcharlen_big5, + NULL, /* mb_wc */ + NULL, /* wc_mb */ my_caseup_str_mb, my_casedn_str_mb, my_caseup_mb, @@ -2012,20 +2862,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_cp1251 { - 14, /* number */ - "cp1251", /* name */ + 14, /* number */ + "cp1251", /* name */ ctype_cp1251, to_lower_cp1251, to_upper_cp1251, sort_order_cp1251, - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ + tab_cp1251_uni, /* tab_to_uni */ + idx_uni_cp1251, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -2038,20 +2892,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_cp1257 { - 29, /* number */ - "cp1257", /* name */ + 29, /* number */ + "cp1257", /* name */ ctype_cp1257, to_lower_cp1257, to_upper_cp1257, sort_order_cp1257, - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ + tab_cp1257_uni, /* tab_to_uni */ + idx_uni_cp1257, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -2064,20 +2922,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_croat { - 27, /* number */ - "croat", /* name */ + 27, /* number */ + "croat", /* name */ ctype_croat, to_lower_croat, to_upper_croat, sort_order_croat, - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ + tab_8859_2_uni, /* tab_to_uni */ + idx_uni_8859_2, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -2090,20 +2952,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_czech { - 2, /* number */ - "czech", /* name */ + 2, /* number */ + "czech", /* name */ ctype_czech, to_lower_czech, to_upper_czech, sort_order_czech, - 4, /* strxfrm_multiply */ + tab_8859_2_uni, /* tab_to_uni */ + idx_uni_8859_2, /* tab_from_uni */ + 4, /* strxfrm_multiply */ my_strnncoll_czech, my_strnxfrm_czech, my_like_range_czech, - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -2116,20 +2982,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_danish { - 15, /* number */ - "danish", /* name */ + 15, /* number */ + "danish", /* name */ ctype_danish, to_lower_danish, to_upper_danish, sort_order_danish, - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ + tab_8859_1_uni, /* tab_to_uni */ + idx_uni_8859_1, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -2142,20 +3012,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_dec8 { - 3, /* number */ - "dec8", /* name */ + 3, /* number */ + "dec8", /* name */ ctype_dec8, to_lower_dec8, to_upper_dec8, sort_order_dec8, - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -2168,20 +3042,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_dos { - 4, /* number */ - "dos", /* name */ + 4, /* number */ + "dos", /* name */ ctype_dos, to_lower_dos, to_upper_dos, sort_order_dos, - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -2194,20 +3072,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_estonia { - 20, /* number */ - "estonia", /* name */ + 20, /* number */ + "estonia", /* name */ ctype_estonia, to_lower_estonia, to_upper_estonia, sort_order_estonia, - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -2220,20 +3102,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_euc_kr { - 19, /* number */ - "euc_kr", /* name */ + 19, /* number */ + "euc_kr", /* name */ ctype_euc_kr, to_lower_euc_kr, to_upper_euc_kr, sort_order_euc_kr, - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 2, /* mbmaxlen */ + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 2, /* mbmaxlen */ ismbchar_euc_kr, ismbhead_euc_kr, mbcharlen_euc_kr, + NULL, /* mb_wc */ + NULL, /* wc_mb */ my_caseup_str_mb, my_casedn_str_mb, my_caseup_mb, @@ -2246,20 +3132,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_gb2312 { - 24, /* number */ - "gb2312", /* name */ + 24, /* number */ + "gb2312", /* name */ ctype_gb2312, to_lower_gb2312, to_upper_gb2312, sort_order_gb2312, - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 2, /* mbmaxlen */ + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 2, /* mbmaxlen */ ismbchar_gb2312, ismbhead_gb2312, mbcharlen_gb2312, + NULL, /* mb_wc */ + NULL, /* wc_mb */ my_caseup_str_mb, my_casedn_str_mb, my_caseup_mb, @@ -2272,20 +3162,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_gbk { - 28, /* number */ - "gbk", /* name */ + 28, /* number */ + "gbk", /* name */ ctype_gbk, to_lower_gbk, to_upper_gbk, sort_order_gbk, - 1, /* strxfrm_multiply */ + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + 1, /* strxfrm_multiply */ my_strnncoll_gbk, my_strnxfrm_gbk, my_like_range_gbk, - 2, /* mbmaxlen */ + 2, /* mbmaxlen */ ismbchar_gbk, ismbhead_gbk, mbcharlen_gbk, + NULL, /* mb_wc */ + NULL, /* wc_mb */ my_caseup_str_mb, my_casedn_str_mb, my_caseup_mb, @@ -2298,20 +3192,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_german1 { - 5, /* number */ - "german1", /* name */ + 5, /* number */ + "german1", /* name */ ctype_german1, to_lower_german1, to_upper_german1, sort_order_german1, - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ + tab_8859_1_uni, /* tab_to_uni */ + idx_uni_8859_1, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -2324,20 +3222,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_greek { - 25, /* number */ - "greek", /* name */ + 25, /* number */ + "greek", /* name */ ctype_greek, to_lower_greek, to_upper_greek, sort_order_greek, - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -2350,20 +3252,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_hebrew { - 16, /* number */ - "hebrew", /* name */ + 16, /* number */ + "hebrew", /* name */ ctype_hebrew, to_lower_hebrew, to_upper_hebrew, sort_order_hebrew, - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -2376,20 +3282,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_hp8 { - 6, /* number */ - "hp8", /* name */ + 6, /* number */ + "hp8", /* name */ ctype_hp8, to_lower_hp8, to_upper_hp8, sort_order_hp8, - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -2402,20 +3312,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_hungarian { - 21, /* number */ - "hungarian", /* name */ + 21, /* number */ + "hungarian", /* name */ ctype_hungarian, to_lower_hungarian, to_upper_hungarian, sort_order_hungarian, - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ + tab_8859_2_uni, /* tab_to_uni */ + idx_uni_8859_2, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -2428,20 +3342,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_koi8_ru { - 7, /* number */ - "koi8_ru", /* name */ + 7, /* number */ + "koi8_ru", /* name */ ctype_koi8_ru, to_lower_koi8_ru, to_upper_koi8_ru, sort_order_koi8_ru, - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ + tab_koi8_r_uni, /* tab_to_uni */ + idx_uni_koi8_r, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -2454,20 +3372,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_koi8_ukr { - 22, /* number */ - "koi8_ukr", /* name */ + 22, /* number */ + "koi8_ukr", /* name */ ctype_koi8_ukr, to_lower_koi8_ukr, to_upper_koi8_ukr, sort_order_koi8_ukr, - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ + tab_koi8_u_uni, /* tab_to_uni */ + idx_uni_koi8_u, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -2480,20 +3402,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_latin1_de { - 31, /* number */ - "latin1_de", /* name */ + 31, /* number */ + "latin1_de", /* name */ ctype_latin1_de, to_lower_latin1_de, to_upper_latin1_de, sort_order_latin1_de, - 2, /* strxfrm_multiply */ + tab_8859_1_uni, /* tab_to_uni */ + idx_uni_8859_1, /* tab_from_uni */ + 2, /* strxfrm_multiply */ my_strnncoll_latin1_de, my_strnxfrm_latin1_de, my_like_range_latin1_de, - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -2506,20 +3432,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_latin2 { - 9, /* number */ - "latin2", /* name */ + 9, /* number */ + "latin2", /* name */ ctype_latin2, to_lower_latin2, to_upper_latin2, sort_order_latin2, - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ + tab_8859_2_uni, /* tab_to_uni */ + idx_uni_8859_2, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -2532,20 +3462,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_latin5 { - 30, /* number */ - "latin5", /* name */ + 30, /* number */ + "latin5", /* name */ ctype_latin5, to_lower_latin5, to_upper_latin5, sort_order_latin5, - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ + tab_8859_9_uni, /* tab_to_uni */ + idx_uni_8859_9, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -2558,20 +3492,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_sjis { - 13, /* number */ - "sjis", /* name */ + 13, /* number */ + "sjis", /* name */ ctype_sjis, to_lower_sjis, to_upper_sjis, sort_order_sjis, - 1, /* strxfrm_multiply */ + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + 1, /* strxfrm_multiply */ my_strnncoll_sjis, my_strnxfrm_sjis, my_like_range_sjis, - 2, /* mbmaxlen */ + 2, /* mbmaxlen */ ismbchar_sjis, ismbhead_sjis, mbcharlen_sjis, + NULL, /* mb_wc */ + NULL, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -2584,20 +3522,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_swe7 { - 10, /* number */ - "swe7", /* name */ + 10, /* number */ + "swe7", /* name */ ctype_swe7, to_lower_swe7, to_upper_swe7, sort_order_swe7, - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -2610,20 +3552,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_tis620 { - 18, /* number */ - "tis620", /* name */ + 18, /* number */ + "tis620", /* name */ ctype_tis620, to_lower_tis620, to_upper_tis620, sort_order_tis620, - 4, /* strxfrm_multiply */ + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + 4, /* strxfrm_multiply */ my_strnncoll_tis620, my_strnxfrm_tis620, my_like_range_tis620, - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -2642,14 +3588,18 @@ CHARSET_INFO compiled_charsets[] = { to_lower_ujis, to_upper_ujis, sort_order_ujis, - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 3, /* mbmaxlen */ + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 3, /* mbmaxlen */ ismbchar_ujis, ismbhead_ujis, mbcharlen_ujis, + NULL, /* mb_wc */ + NULL, /* wc_mb */ my_caseup_str_mb, my_casedn_str_mb, my_caseup_mb, @@ -2662,20 +3612,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_utf8 { - 33, /* number */ - "utf8", /* name */ - ctype_utf8, /* ctype */ - to_lower_utf8, /* to_lower */ - to_upper_utf8, /* to_upper */ - to_upper_utf8, /* sort_order */ - 1, /* strxfrm_multiply */ - my_strnncoll_utf8, /* strnncoll */ - my_strnxfrm_utf8, /* strnxfrm */ - NULL, /* like_range */ - 6, /* mbmaxlen */ - my_ismbchar_utf8, /* ismbchar */ - my_ismbhead_utf8, /* ismbhead */ - my_mbcharlen_utf8, /* mbcharlen */ + 33, /* number */ + "utf8", /* name */ + ctype_utf8, /* ctype */ + to_lower_utf8, /* to_lower */ + to_upper_utf8, /* to_upper */ + to_upper_utf8, /* sort_order */ + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + 1, /* strxfrm_multiply */ + my_strnncoll_utf8, /* strnncoll */ + my_strnxfrm_utf8, /* strnxfrm */ + NULL, /* like_range */ + 6, /* mbmaxlen */ + my_ismbchar_utf8, /* ismbchar */ + my_ismbhead_utf8, /* ismbhead */ + my_mbcharlen_utf8, /* mbcharlen */ + my_utf8_uni, /* mb_wc */ + my_uni_utf8, /* wc_mb */ my_caseup_str_utf8, my_casedn_str_utf8, my_caseup_utf8, @@ -2688,20 +3642,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_usa7 { - 11, /* number */ - "usa7", /* name */ + 11, /* number */ + "usa7", /* name */ ctype_usa7, to_lower_usa7, to_upper_usa7, sort_order_usa7, - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ + tab_us_ascii_uni, /* tab_to_uni */ + idx_uni_us_ascii, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -2714,20 +3672,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_win1250 { - 26, /* number */ - "win1250", /* name */ + 26, /* number */ + "win1250", /* name */ ctype_win1250, to_lower_win1250, to_upper_win1250, sort_order_win1250, - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ + tab_cp1250_uni, /* tab_to_uni */ + idx_uni_cp1250, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -2740,20 +3702,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_win1251ukr { - 23, /* number */ - "win1251ukr", /* name */ + 23, /* number */ + "win1251ukr", /* name */ ctype_win1251ukr, to_lower_win1251ukr, to_upper_win1251ukr, sort_order_win1251ukr, - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ + tab_cp1251_uni, /* tab_to_uni */ + idx_uni_cp1251, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -2766,20 +3732,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_armscii8 { - 32, /* number */ - "armscii8", /* name */ + 32, /* number */ + "armscii8", /* name */ ctype_armscii8, to_lower_armscii8, to_upper_armscii8, sort_order_armscii8, - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ + tab_armscii_8_uni, /* tab_to_uni */ + idx_uni_armscii_8, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -2792,20 +3762,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_win1251 { - 17, /* number */ - "win1251", /* name */ + 17, /* number */ + "win1251", /* name */ ctype_win1251, to_lower_win1251, to_upper_win1251, sort_order_win1251, - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ + tab_cp1251_uni, /* tab_to_uni */ + idx_uni_cp1251, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, @@ -2816,14 +3790,15 @@ CHARSET_INFO compiled_charsets[] = { }, #endif - { - 0, /* end-of-list marker */ + 0, /* end-of-list marker */ NullS, NULL, NULL, NULL, NULL, + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ 0, NULL, NULL, @@ -2832,6 +3807,10 @@ CHARSET_INFO compiled_charsets[] = { NULL, NULL, NULL, + + NULL, /* mb_wc */ + NULL, /* wc_mb */ + NULL, NULL, NULL, -- cgit v1.2.1 From f29e7f5726a5982d87bf1be1f273a24a0c1f1c19 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 29 Mar 2002 18:22:21 +0400 Subject: Charset convertion operator CONVERT( string USING charset) --- sql/item_strfunc.cc | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++ sql/item_strfunc.h | 13 +++++++++++ sql/sql_yacc.yy | 10 ++++++++ 3 files changed, 90 insertions(+) diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index cfbfda97148..90f27148578 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1776,6 +1776,73 @@ String *Item_func_conv::val_str(String *str) } +String *Item_func_conv_charset::val_str(String *str) +{ + my_wc_t wc; + int cnvres; + const uchar *s, *se; + uchar *d, *d0, *de; + uint dmaxlen; + String *arg= args[0]->val_str(str); + CHARSET_INFO *from,*to; + + if (!arg) + { + null_value=1; + return 0; + } + + from=arg->charset(); + to=conv_charset; + + s=(const uchar*)arg->ptr(); + se=s+arg->length(); + + dmaxlen=arg->length()*(conv_charset->mbmaxlen?conv_charset->mbmaxlen:1)+1; + str->alloc(dmaxlen); + d0=d=(unsigned char*)str->ptr(); + de=d+dmaxlen; + + while( s < se && d < de){ + + cnvres=from->mb_wc(from,&wc,s,se); + if (cnvres>0) + { + s+=cnvres; + } + else if (cnvres==MY_CS_ILSEQ) + { + s++; + wc='?'; + } + else + break; + +outp: + cnvres=to->wc_mb(to,wc,d,de); + if (cnvres>0) + { + d+=cnvres; + } + else if (cnvres==MY_CS_ILUNI && wc!='?') + { + wc='?'; + goto outp; + } + else + break; + }; + + str->length((uint) (d-d0)); + str->set_charset(to); + return str; +} + +void Item_func_conv_charset::fix_length_and_dec() +{ + /* BAR TODO: What to do here??? */ +} + String *Item_func_hex::val_str(String *str) { if (args[0]->result_type() != STRING_RESULT) diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index a8768e62f98..5dcf24cfef6 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -476,6 +476,19 @@ public: void fix_length_and_dec() { decimals = 0; max_length=3*8+7; } }; +class Item_func_conv_charset :public Item_str_func +{ + CHARSET_INFO *conv_charset; +public: + Item_func_conv_charset(Item *a, CHARSET_INFO *cs) :Item_str_func(a) + { + conv_charset=cs; + } + String *val_str(String *); + void fix_length_and_dec(); + const char *func_name() const { return "conv_charset"; } +}; + /******************************************************* Spatial functions diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index ee31e726eb1..9ca5b44aa64 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1654,6 +1654,16 @@ simple_expr: | CASE_SYM opt_expr WHEN_SYM when_list opt_else END { $$= new Item_func_case(* $4, $2, $5 ); } | CONVERT_SYM '(' expr ',' cast_type ')' { $$= create_func_cast($3, $5); } + | CONVERT_SYM '(' expr USING IDENT ')' + { + CHARSET_INFO *cs=find_compiled_charset_by_name($5.str); + if (!cs) + { + net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$5); + YYABORT; + } + $$= new Item_func_conv_charset($3,cs); + } | FUNC_ARG0 '(' ')' { $$= ((Item*(*)(void))($1.symbol->create_func))();} | FUNC_ARG1 '(' expr ')' -- cgit v1.2.1 From 19bc62c86563b5a880c4db6828d0d1fca0dbc4d7 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 29 Mar 2002 19:11:06 +0400 Subject: Now this syntax works too: CONVERT(string,charset_to,charset_from) where charset_to and charset_from are expressions. For example: CONVERT('test','latin2','cp1250') sql/item_strfunc.cc: Now this syntax works too: CONVERT(string,charset_to,charset_from) sql/item_strfunc.h: Now this syntax works too: CONVERT(string,charset_to,charset_from) sql/sql_yacc.yy: Now this syntax works too: CONVERT(string,charset_to,charset_from) --- sql/item_strfunc.cc | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++ sql/item_strfunc.h | 10 ++++++++ sql/sql_yacc.yy | 4 +++ 3 files changed, 87 insertions(+) diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 90f27148578..df238a6c331 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1843,6 +1843,79 @@ void Item_func_conv_charset::fix_length_and_dec() /* BAR TODO: What to do here??? */ } + +String *Item_func_conv_charset3::val_str(String *str) +{ + my_wc_t wc; + int cnvres; + const uchar *s, *se; + uchar *d, *d0, *de; + uint dmaxlen; + String *arg= args[0]->val_str(str); + String *to_cs= args[1]->val_str(str); + String *from_cs= args[2]->val_str(str); + CHARSET_INFO *from_charset; + CHARSET_INFO *to_charset; + + if (!arg || args[0]->null_value || + !to_cs || args[1]->null_value || + !from_cs || args[2]->null_value || + !(from_charset=find_compiled_charset_by_name(from_cs->ptr())) || + !(to_charset=find_compiled_charset_by_name(to_cs->ptr()))) + { + null_value=1; + return 0; + } + + s=(const uchar*)arg->ptr(); + se=s+arg->length(); + + dmaxlen=arg->length()*(to_charset->mbmaxlen?to_charset->mbmaxlen:1)+1; + str->alloc(dmaxlen); + d0=d=(unsigned char*)str->ptr(); + de=d+dmaxlen; + + while( s < se && d < de){ + + cnvres=from_charset->mb_wc(from_charset,&wc,s,se); + if (cnvres>0) + { + s+=cnvres; + } + else if (cnvres==MY_CS_ILSEQ) + { + s++; + wc='?'; + } + else + break; + +outp: + cnvres=to_charset->wc_mb(to_charset,wc,d,de); + if (cnvres>0) + { + d+=cnvres; + } + else if (cnvres==MY_CS_ILUNI && wc!='?') + { + wc='?'; + goto outp; + } + else + break; + }; + + str->length((uint) (d-d0)); + str->set_charset(to_charset); + return str; +} + +void Item_func_conv_charset3::fix_length_and_dec() +{ + /* BAR TODO: What to do here??? */ +} + + String *Item_func_hex::val_str(String *str) { if (args[0]->result_type() != STRING_RESULT) diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index 5dcf24cfef6..091289fd040 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -489,6 +489,16 @@ public: const char *func_name() const { return "conv_charset"; } }; +class Item_func_conv_charset3 :public Item_str_func +{ +public: + Item_func_conv_charset3(Item *arg1,Item *arg2,Item *arg3) + :Item_str_func(arg1,arg2,arg3) {} + String *val_str(String *); + void fix_length_and_dec(); + const char *func_name() const { return "conv_charset3"; } +}; + /******************************************************* Spatial functions diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 9ca5b44aa64..90ecb4c92fc 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1664,6 +1664,10 @@ simple_expr: } $$= new Item_func_conv_charset($3,cs); } + | CONVERT_SYM '(' expr ',' expr ',' expr ')' + { + $$= new Item_func_conv_charset3($3,$5,$7); + } | FUNC_ARG0 '(' ')' { $$= ((Item*(*)(void))($1.symbol->create_func))();} | FUNC_ARG1 '(' expr ')' -- cgit v1.2.1 From 4206cf1289ac489ca2cbbf135096f3324fb2407d Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 29 Mar 2002 19:27:21 +0400 Subject: add sql_derived.cc into compilation --- libmysqld/Makefile.am | 2 +- sql/Makefile.am | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libmysqld/Makefile.am b/libmysqld/Makefile.am index 6e5c0b183bb..c98e1c7e973 100644 --- a/libmysqld/Makefile.am +++ b/libmysqld/Makefile.am @@ -49,7 +49,7 @@ sqlsources = convert.cc derror.cc field.cc field_conv.cc filesort.cc \ repl_failsafe.cc slave.cc \ sql_analyse.cc sql_base.cc sql_cache.cc sql_class.cc \ sql_crypt.cc sql_db.cc sql_delete.cc sql_insert.cc sql_lex.cc \ - sql_list.cc sql_manager.cc sql_map.cc sql_parse.cc \ + sql_list.cc sql_manager.cc sql_map.cc sql_parse.cc sql_derived.cc \ sql_rename.cc sql_repl.cc sql_select.cc sql_do.cc sql_show.cc \ sql_string.cc sql_table.cc sql_test.cc sql_udf.cc \ sql_update.cc sql_yacc.cc table.cc thr_malloc.cc time.cc \ diff --git a/sql/Makefile.am b/sql/Makefile.am index c83b5388ca0..f58075358b6 100644 --- a/sql/Makefile.am +++ b/sql/Makefile.am @@ -79,7 +79,7 @@ mysqld_SOURCES = sql_lex.cc sql_handler.cc \ sql_db.cc sql_table.cc sql_rename.cc sql_crypt.cc \ sql_load.cc mf_iocache.cc field_conv.cc sql_show.cc \ sql_udf.cc sql_analyse.cc sql_analyse.h sql_cache.cc \ - slave.cc sql_repl.cc sql_union.cc \ + slave.cc sql_repl.cc sql_union.cc sql_derived.cc \ mini_client.cc mini_client_errors.c \ stacktrace.c repl_failsafe.h repl_failsafe.cc \ gstream.cc spatial.cc -- cgit v1.2.1 From b68daf5c8348599df38ef5a692e405f161dae094 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 29 Mar 2002 19:54:21 +0400 Subject: Big5 conversion routines include/m_ctype.h: Add conversion routines prototypes sql/init.cc: Fix for small bug --- include/m_ctype.h | 18 +- sql/init.cc | 2 +- strings/ctype-big5.c | 5824 +++++++++++++++++++++++++++++++++++++++++++++++++- strings/ctype.c | 4 +- 4 files changed, 5839 insertions(+), 9 deletions(-) diff --git a/include/m_ctype.h b/include/m_ctype.h index a676f56da1d..33afd610cf4 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -120,10 +120,8 @@ extern void my_casedn_8bit(CHARSET_INFO *, char *, uint); extern int my_strcasecmp_8bit(CHARSET_INFO * cs, const char *, const char *); extern int my_strncasecmp_8bit(CHARSET_INFO * cs, const char *, const char *, uint); -int my_mb_wc_8bit(CHARSET_INFO *cs,my_wc_t *wc, - const unsigned char *s,const unsigned char *e); -int my_wc_mb_8bit(CHARSET_INFO *cs,my_wc_t wc, - unsigned char *s, unsigned char *e); +int my_mb_wc_8bit(CHARSET_INFO *cs,my_wc_t *wc, const uchar *s,const uchar *e); +int my_wc_mb_8bit(CHARSET_INFO *cs,my_wc_t wc, uchar *s, uchar *e); #ifdef USE_MB @@ -146,6 +144,8 @@ extern my_bool my_like_range_big5(CHARSET_INFO *,const char *, uint, pchar, uint extern int ismbchar_big5(CHARSET_INFO *, const char *, const char *); extern my_bool ismbhead_big5(CHARSET_INFO *, uint); extern int mbcharlen_big5(CHARSET_INFO *, uint); +int my_mb_wc_big5(CHARSET_INFO *cs,my_wc_t *wc, const uchar *s,const uchar *e); +int my_wc_mb_big5(CHARSET_INFO *cs,my_wc_t wc, uchar *s, uchar *e); #endif #ifdef HAVE_CHARSET_czech @@ -164,6 +164,8 @@ extern uchar ctype_euc_kr[], to_lower_euc_kr[], to_upper_euc_kr[], sort_order_eu extern int ismbchar_euc_kr(CHARSET_INFO *, const char *, const char *); extern my_bool ismbhead_euc_kr(CHARSET_INFO *, uint); extern int mbcharlen_euc_kr(CHARSET_INFO *, uint); +int my_mb_wc_euc_kr(CHARSET_INFO *cs,my_wc_t *wc, const uchar *s,const uchar *e); +int my_wc_mb_euc_kr(CHARSET_INFO *cs,my_wc_t wc, uchar *s, uchar *e); #endif #ifdef HAVE_CHARSET_gb2312 @@ -172,6 +174,8 @@ extern uchar ctype_gb2312[], to_lower_gb2312[], to_upper_gb2312[], sort_order_gb extern int ismbchar_gb2312(CHARSET_INFO *, const char *, const char *); extern my_bool ismbhead_gb2312(CHARSET_INFO *, uint); extern int mbcharlen_gb2312(CHARSET_INFO *, uint); +int my_mb_wc_gb2312(CHARSET_INFO *cs,my_wc_t *wc, const uchar *s,const uchar *e); +int my_wc_mb_gb2312(CHARSET_INFO *cs,my_wc_t wc, uchar *s, uchar *e); #endif #ifdef HAVE_CHARSET_gbk @@ -184,6 +188,8 @@ extern my_bool my_like_range_gbk(CHARSET_INFO *, const char *, uint, pchar, uint extern int ismbchar_gbk(CHARSET_INFO *, const char *, const char *); extern my_bool ismbhead_gbk(CHARSET_INFO *, uint); extern int mbcharlen_gbk(CHARSET_INFO *, uint); +int my_mb_wc_gbk(CHARSET_INFO *cs,my_wc_t *wc, const uchar *s,const uchar *e); +int my_wc_mb_gbk(CHARSET_INFO *cs,my_wc_t wc, uchar *s, uchar *e); #endif #ifdef HAVE_CHARSET_latin1_de @@ -205,6 +211,8 @@ extern my_bool my_like_range_sjis(CHARSET_INFO *, const char *, uint, pchar, uin extern int ismbchar_sjis(CHARSET_INFO *, const char *, const char *); extern my_bool ismbhead_sjis(CHARSET_INFO *, uint); extern int mbcharlen_sjis(CHARSET_INFO *, uint); +int my_mb_wc_sjis(CHARSET_INFO *cs,my_wc_t *wc, const uchar *s,const uchar *e); +int my_wc_mb_sjis(CHARSET_INFO *cs,my_wc_t wc, uchar *s, uchar *e); #endif #ifdef HAVE_CHARSET_tis620 @@ -222,6 +230,8 @@ extern uchar ctype_ujis[], to_lower_ujis[], to_upper_ujis[], sort_order_ujis[]; extern int ismbchar_ujis(CHARSET_INFO *, const char *, const char *); extern my_bool ismbhead_ujis(CHARSET_INFO *, uint); extern int mbcharlen_ujis(CHARSET_INFO *, uint); +int my_mb_wc_euc_jp(CHARSET_INFO *cs,my_wc_t *wc, const uchar *s,const uchar *e); +int my_wc_mb_euc_jp(CHARSET_INFO *cs,my_wc_t wc, uchar *s, uchar *e); #endif #ifdef HAVE_CHARSET_utf8 diff --git a/sql/init.cc b/sql/init.cc index eea10e51bd8..ac0ff701649 100644 --- a/sql/init.cc +++ b/sql/init.cc @@ -60,7 +60,7 @@ void unireg_init(ulong options) uchar max_char; if (!cs->sort_order) continue; - cs->sort_order[(uchar) cs->max_sort_char]; + max_char=cs->sort_order[(uchar) cs->max_sort_char]; for (i = 0; i < 256; i++) { if ((uchar) cs->sort_order[i] > max_char) diff --git a/strings/ctype-big5.c b/strings/ctype-big5.c index 3bfc5f3ab9b..36a2641d2ab 100644 --- a/strings/ctype-big5.c +++ b/strings/ctype-big5.c @@ -33,8 +33,11 @@ #ifdef HAVE_CHARSET_big5 -/* Support for Chinese(BIG5) characters, by jou@nematic.ieo.nctu.edu.tw - modified by Wei He (hewei@mail.ied.ac.cn) */ +/* + Support for Chinese(BIG5) characters, by jou@nematic.ieo.nctu.edu.tw + modified by Wei He (hewei@mail.ied.ac.cn) + modified by Alex Barkov +*/ #define isbig5head(c) (0xa1<=(uchar)(c) && (uchar)(c)<=0xf9) #define isbig5tail(c) ((0x40<=(uchar)(c) && (uchar)(c)<=0x7e) || \ @@ -394,4 +397,5821 @@ int mbcharlen_big5(CHARSET_INFO *cs __attribute__((unused)), uint c) return (isbig5head(c)? 2: 0); } +/* page 0 0xA140-0xC7FC */ +static uint16 tab_big5_uni0[]={ +0x3000,0xFF0C,0x3001,0x3002,0xFF0E,0x2022,0xFF1B,0xFF1A, +0xFF1F,0xFF01,0xFE30,0x2026,0x2025,0xFE50,0xFF64,0xFE52, +0x00B7,0xFE54,0xFE55,0xFE56,0xFE57,0xFF5C,0x2013,0xFE31, +0x2014,0xFE33,0xFFFD,0xFE34,0xFE4F,0xFF08,0xFF09,0xFE35, +0xFE36,0xFF5B,0xFF5D,0xFE37,0xFE38,0x3014,0x3015,0xFE39, +0xFE3A,0x3010,0x3011,0xFE3B,0xFE3C,0x300A,0x300B,0xFE3D, +0xFE3E,0x3008,0x3009,0xFE3F,0xFE40,0x300C,0x300D,0xFE41, +0xFE42,0x300E,0x300F,0xFE43,0xFE44,0xFE59,0xFE5A, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xFE5B,0xFE5C,0xFE5D,0xFE5E,0x2018,0x2019,0x201C, +0x201D,0x301D,0x301E,0x2035,0x2032,0xFF03,0xFF06,0xFF0A, +0x203B,0x00A7,0x3003,0x25CB,0x25CF,0x25B3,0x25B2,0x25CE, +0x2606,0x2605,0x25C7,0x25C6,0x25A1,0x25A0,0x25BD,0x25BC, +0x32A3,0x2105,0x203E,0xFFFD,0xFF3F,0xFFFD,0xFE49,0xFE4A, +0xFE4D,0xFE4E,0xFE4B,0xFE4C,0xFE5F,0xFE60,0xFE61,0xFF0B, +0xFF0D,0x00D7,0x00F7,0x00B1,0x221A,0xFF1C,0xFF1E,0xFF1D, +0x2266,0x2267,0x2260,0x221E,0x2252,0x2261,0xFE62,0xFE63, +0xFE64,0xFE65,0xFE66,0x223C,0x2229,0x222A,0x22A5,0x2220, +0x221F,0x22BF,0x33D2,0x33D1,0x222B,0x222E,0x2235,0x2234, +0x2640,0x2642,0x2641,0x2609,0x2191,0x2193,0x2190,0x2192, +0x2196,0x2197,0x2199,0x2198,0x2225,0x2223,0xFFFD, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xFFFD,0xFF0F,0xFF3C,0xFF04,0x00A5,0x3012,0x00A2,0x00A3, +0xFF05,0xFF20,0x2103,0x2109,0xFE69,0xFE6A,0xFE6B,0x33D5, +0x339C,0x339D,0x339E,0x33CE,0x33A1,0x338E,0x338F,0x33C4, +0x00B0,0x5159,0x515B,0x515E,0x515D,0x5161,0x5163,0x55E7, +0x74E9,0x7CCE,0x2581,0x2582,0x2583,0x2584,0x2585,0x2586, +0x2587,0x2588,0x258F,0x258E,0x258D,0x258C,0x258B,0x258A, +0x2589,0x253C,0x2534,0x252C,0x2524,0x251C,0x2594,0x2500, +0x2502,0x2595,0x250C,0x2510,0x2514,0x2518,0x256D, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x256E,0x2570,0x256F,0x2550,0x255E,0x256A,0x2561, +0x25E2,0x25E3,0x25E5,0x25E4,0x2571,0x2572,0x2573,0xFF10, +0xFF11,0xFF12,0xFF13,0xFF14,0xFF15,0xFF16,0xFF17,0xFF18, +0xFF19,0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166, +0x2167,0x2168,0x2169,0x3021,0x3022,0x3023,0x3024,0x3025, +0x3026,0x3027,0x3028,0x3029,0xFFFD,0x5344,0xFFFD,0xFF21, +0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27,0xFF28,0xFF29, +0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F,0xFF30,0xFF31, +0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37,0xFF38,0xFF39, +0xFF3A,0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47, +0xFF48,0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F, +0xFF50,0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,0xFF56, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xFF57,0xFF58,0xFF59,0xFF5A,0x0391,0x0392,0x0393,0x0394, +0x0395,0x0396,0x0397,0x0398,0x0399,0x039A,0x039B,0x039C, +0x039D,0x039E,0x039F,0x03A0,0x03A1,0x03A3,0x03A4,0x03A5, +0x03A6,0x03A7,0x03A8,0x03A9,0x03B1,0x03B2,0x03B3,0x03B4, +0x03B5,0x03B6,0x03B7,0x03B8,0x03B9,0x03BA,0x03BB,0x03BC, +0x03BD,0x03BE,0x03BF,0x03C0,0x03C1,0x03C3,0x03C4,0x03C5, +0x03C6,0x03C7,0x03C8,0x03C9,0x3105,0x3106,0x3107,0x3108, +0x3109,0x310A,0x310B,0x310C,0x310D,0x310E,0x310F, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x3110,0x3111,0x3112,0x3113,0x3114,0x3115,0x3116, +0x3117,0x3118,0x3119,0x311A,0x311B,0x311C,0x311D,0x311E, +0x311F,0x3120,0x3121,0x3122,0x3123,0x3124,0x3125,0x3126, +0x3127,0x3128,0x3129,0x02D9,0x02C9,0x02CA,0x02C7,0x02CB, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4E00,0x4E59,0x4E01,0x4E03,0x4E43,0x4E5D,0x4E86,0x4E8C, +0x4EBA,0x513F,0x5165,0x516B,0x51E0,0x5200,0x5201,0x529B, +0x5315,0x5341,0x535C,0x53C8,0x4E09,0x4E0B,0x4E08,0x4E0A, +0x4E2B,0x4E38,0x51E1,0x4E45,0x4E48,0x4E5F,0x4E5E,0x4E8E, +0x4EA1,0x5140,0x5203,0x52FA,0x5343,0x53C9,0x53E3,0x571F, +0x58EB,0x5915,0x5927,0x5973,0x5B50,0x5B51,0x5B53,0x5BF8, +0x5C0F,0x5C22,0x5C38,0x5C71,0x5DDD,0x5DE5,0x5DF1,0x5DF2, +0x5DF3,0x5DFE,0x5E72,0x5EFE,0x5F0B,0x5F13,0x624D, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x4E11,0x4E10,0x4E0D,0x4E2D,0x4E30,0x4E39,0x4E4B, +0x5C39,0x4E88,0x4E91,0x4E95,0x4E92,0x4E94,0x4EA2,0x4EC1, +0x4EC0,0x4EC3,0x4EC6,0x4EC7,0x4ECD,0x4ECA,0x4ECB,0x4EC4, +0x5143,0x5141,0x5167,0x516D,0x516E,0x516C,0x5197,0x51F6, +0x5206,0x5207,0x5208,0x52FB,0x52FE,0x52FF,0x5316,0x5339, +0x5348,0x5347,0x5345,0x535E,0x5384,0x53CB,0x53CA,0x53CD, +0x58EC,0x5929,0x592B,0x592A,0x592D,0x5B54,0x5C11,0x5C24, +0x5C3A,0x5C6F,0x5DF4,0x5E7B,0x5EFF,0x5F14,0x5F15,0x5FC3, +0x6208,0x6236,0x624B,0x624E,0x652F,0x6587,0x6597,0x65A4, +0x65B9,0x65E5,0x66F0,0x6708,0x6728,0x6B20,0x6B62,0x6B79, +0x6BCB,0x6BD4,0x6BDB,0x6C0F,0x6C34,0x706B,0x722A,0x7236, +0x723B,0x7247,0x7259,0x725B,0x72AC,0x738B,0x4E19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4E16,0x4E15,0x4E14,0x4E18,0x4E3B,0x4E4D,0x4E4F,0x4E4E, +0x4EE5,0x4ED8,0x4ED4,0x4ED5,0x4ED6,0x4ED7,0x4EE3,0x4EE4, +0x4ED9,0x4EDE,0x5145,0x5144,0x5189,0x518A,0x51AC,0x51F9, +0x51FA,0x51F8,0x520A,0x52A0,0x529F,0x5305,0x5306,0x5317, +0x531D,0x4EDF,0x534A,0x5349,0x5361,0x5360,0x536F,0x536E, +0x53BB,0x53EF,0x53E4,0x53F3,0x53EC,0x53EE,0x53E9,0x53E8, +0x53FC,0x53F8,0x53F5,0x53EB,0x53E6,0x53EA,0x53F2,0x53F1, +0x53F0,0x53E5,0x53ED,0x53FB,0x56DB,0x56DA,0x5916, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x592E,0x5931,0x5974,0x5976,0x5B55,0x5B83,0x5C3C, +0x5DE8,0x5DE7,0x5DE6,0x5E02,0x5E03,0x5E73,0x5E7C,0x5F01, +0x5F18,0x5F17,0x5FC5,0x620A,0x6253,0x6254,0x6252,0x6251, +0x65A5,0x65E6,0x672E,0x672C,0x672A,0x672B,0x672D,0x6B63, +0x6BCD,0x6C11,0x6C10,0x6C38,0x6C41,0x6C40,0x6C3E,0x72AF, +0x7384,0x7389,0x74DC,0x74E6,0x7518,0x751F,0x7528,0x7529, +0x7530,0x7531,0x7532,0x7533,0x758B,0x767D,0x76AE,0x76BF, +0x76EE,0x77DB,0x77E2,0x77F3,0x793A,0x79BE,0x7A74,0x7ACB, +0x4E1E,0x4E1F,0x4E52,0x4E53,0x4E69,0x4E99,0x4EA4,0x4EA6, +0x4EA5,0x4EFF,0x4F09,0x4F19,0x4F0A,0x4F15,0x4F0D,0x4F10, +0x4F11,0x4F0F,0x4EF2,0x4EF6,0x4EFB,0x4EF0,0x4EF3,0x4EFD, +0x4F01,0x4F0B,0x5149,0x5147,0x5146,0x5148,0x5168, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5171,0x518D,0x51B0,0x5217,0x5211,0x5212,0x520E,0x5216, +0x52A3,0x5308,0x5321,0x5320,0x5370,0x5371,0x5409,0x540F, +0x540C,0x540A,0x5410,0x5401,0x540B,0x5404,0x5411,0x540D, +0x5408,0x5403,0x540E,0x5406,0x5412,0x56E0,0x56DE,0x56DD, +0x5733,0x5730,0x5728,0x572D,0x572C,0x572F,0x5729,0x5919, +0x591A,0x5937,0x5938,0x5984,0x5978,0x5983,0x597D,0x5979, +0x5982,0x5981,0x5B57,0x5B58,0x5B87,0x5B88,0x5B85,0x5B89, +0x5BFA,0x5C16,0x5C79,0x5DDE,0x5E06,0x5E76,0x5E74, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5F0F,0x5F1B,0x5FD9,0x5FD6,0x620E,0x620C,0x620D, +0x6210,0x6263,0x625B,0x6258,0x6536,0x65E9,0x65E8,0x65EC, +0x65ED,0x66F2,0x66F3,0x6709,0x673D,0x6734,0x6731,0x6735, +0x6B21,0x6B64,0x6B7B,0x6C16,0x6C5D,0x6C57,0x6C59,0x6C5F, +0x6C60,0x6C50,0x6C55,0x6C61,0x6C5B,0x6C4D,0x6C4E,0x7070, +0x725F,0x725D,0x767E,0x7AF9,0x7C73,0x7CF8,0x7F36,0x7F8A, +0x7FBD,0x8001,0x8003,0x800C,0x8012,0x8033,0x807F,0x8089, +0x808B,0x808C,0x81E3,0x81EA,0x81F3,0x81FC,0x820C,0x821B, +0x821F,0x826E,0x8272,0x827E,0x866B,0x8840,0x884C,0x8863, +0x897F,0x9621,0x4E32,0x4EA8,0x4F4D,0x4F4F,0x4F47,0x4F57, +0x4F5E,0x4F34,0x4F5B,0x4F55,0x4F30,0x4F50,0x4F51,0x4F3D, +0x4F3A,0x4F38,0x4F43,0x4F54,0x4F3C,0x4F46,0x4F63, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4F5C,0x4F60,0x4F2F,0x4F4E,0x4F36,0x4F59,0x4F5D,0x4F48, +0x4F5A,0x514C,0x514B,0x514D,0x5175,0x51B6,0x51B7,0x5225, +0x5224,0x5229,0x522A,0x5228,0x52AB,0x52A9,0x52AA,0x52AC, +0x5323,0x5373,0x5375,0x541D,0x542D,0x541E,0x543E,0x5426, +0x544E,0x5427,0x5446,0x5443,0x5433,0x5448,0x5442,0x541B, +0x5429,0x544A,0x5439,0x543B,0x5438,0x542E,0x5435,0x5436, +0x5420,0x543C,0x5440,0x5431,0x542B,0x541F,0x542C,0x56EA, +0x56F0,0x56E4,0x56EB,0x574A,0x5751,0x5740,0x574D, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5747,0x574E,0x573E,0x5750,0x574F,0x573B,0x58EF, +0x593E,0x599D,0x5992,0x59A8,0x599E,0x59A3,0x5999,0x5996, +0x598D,0x59A4,0x5993,0x598A,0x59A5,0x5B5D,0x5B5C,0x5B5A, +0x5B5B,0x5B8C,0x5B8B,0x5B8F,0x5C2C,0x5C40,0x5C41,0x5C3F, +0x5C3E,0x5C90,0x5C91,0x5C94,0x5C8C,0x5DEB,0x5E0C,0x5E8F, +0x5E87,0x5E8A,0x5EF7,0x5F04,0x5F1F,0x5F64,0x5F62,0x5F77, +0x5F79,0x5FD8,0x5FCC,0x5FD7,0x5FCD,0x5FF1,0x5FEB,0x5FF8, +0x5FEA,0x6212,0x6211,0x6284,0x6297,0x6296,0x6280,0x6276, +0x6289,0x626D,0x628A,0x627C,0x627E,0x6279,0x6273,0x6292, +0x626F,0x6298,0x626E,0x6295,0x6293,0x6291,0x6286,0x6539, +0x653B,0x6538,0x65F1,0x66F4,0x675F,0x674E,0x674F,0x6750, +0x6751,0x675C,0x6756,0x675E,0x6749,0x6746,0x6760, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6753,0x6757,0x6B65,0x6BCF,0x6C42,0x6C5E,0x6C99,0x6C81, +0x6C88,0x6C89,0x6C85,0x6C9B,0x6C6A,0x6C7A,0x6C90,0x6C70, +0x6C8C,0x6C68,0x6C96,0x6C92,0x6C7D,0x6C83,0x6C72,0x6C7E, +0x6C74,0x6C86,0x6C76,0x6C8D,0x6C94,0x6C98,0x6C82,0x7076, +0x707C,0x707D,0x7078,0x7262,0x7261,0x7260,0x72C4,0x72C2, +0x7396,0x752C,0x752B,0x7537,0x7538,0x7682,0x76EF,0x77E3, +0x79C1,0x79C0,0x79BF,0x7A76,0x7CFB,0x7F55,0x8096,0x8093, +0x809D,0x8098,0x809B,0x809A,0x80B2,0x826F,0x8292, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x828B,0x828D,0x898B,0x89D2,0x8A00,0x8C37,0x8C46, +0x8C55,0x8C9D,0x8D64,0x8D70,0x8DB3,0x8EAB,0x8ECA,0x8F9B, +0x8FB0,0x8FC2,0x8FC6,0x8FC5,0x8FC4,0x5DE1,0x9091,0x90A2, +0x90AA,0x90A6,0x90A3,0x9149,0x91C6,0x91CC,0x9632,0x962E, +0x9631,0x962A,0x962C,0x4E26,0x4E56,0x4E73,0x4E8B,0x4E9B, +0x4E9E,0x4EAB,0x4EAC,0x4F6F,0x4F9D,0x4F8D,0x4F73,0x4F7F, +0x4F6C,0x4F9B,0x4F8B,0x4F86,0x4F83,0x4F70,0x4F75,0x4F88, +0x4F69,0x4F7B,0x4F96,0x4F7E,0x4F8F,0x4F91,0x4F7A,0x5154, +0x5152,0x5155,0x5169,0x5177,0x5176,0x5178,0x51BD,0x51FD, +0x523B,0x5238,0x5237,0x523A,0x5230,0x522E,0x5236,0x5241, +0x52BE,0x52BB,0x5352,0x5354,0x5353,0x5351,0x5366,0x5377, +0x5378,0x5379,0x53D6,0x53D4,0x53D7,0x5473,0x5475, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5496,0x5478,0x5495,0x5480,0x547B,0x5477,0x5484,0x5492, +0x5486,0x547C,0x5490,0x5471,0x5476,0x548C,0x549A,0x5462, +0x5468,0x548B,0x547D,0x548E,0x56FA,0x5783,0x5777,0x576A, +0x5769,0x5761,0x5766,0x5764,0x577C,0x591C,0x5949,0x5947, +0x5948,0x5944,0x5954,0x59BE,0x59BB,0x59D4,0x59B9,0x59AE, +0x59D1,0x59C6,0x59D0,0x59CD,0x59CB,0x59D3,0x59CA,0x59AF, +0x59B3,0x59D2,0x59C5,0x5B5F,0x5B64,0x5B63,0x5B97,0x5B9A, +0x5B98,0x5B9C,0x5B99,0x5B9B,0x5C1A,0x5C48,0x5C45, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5C46,0x5CB7,0x5CA1,0x5CB8,0x5CA9,0x5CAB,0x5CB1, +0x5CB3,0x5E18,0x5E1A,0x5E16,0x5E15,0x5E1B,0x5E11,0x5E78, +0x5E9A,0x5E97,0x5E9C,0x5E95,0x5E96,0x5EF6,0x5F26,0x5F27, +0x5F29,0x5F80,0x5F81,0x5F7F,0x5F7C,0x5FDD,0x5FE0,0x5FFD, +0x5FF5,0x5FFF,0x600F,0x6014,0x602F,0x6035,0x6016,0x602A, +0x6015,0x6021,0x6027,0x6029,0x602B,0x601B,0x6216,0x6215, +0x623F,0x623E,0x6240,0x627F,0x62C9,0x62CC,0x62C4,0x62BF, +0x62C2,0x62B9,0x62D2,0x62DB,0x62AB,0x62D3,0x62D4,0x62CB, +0x62C8,0x62A8,0x62BD,0x62BC,0x62D0,0x62D9,0x62C7,0x62CD, +0x62B5,0x62DA,0x62B1,0x62D8,0x62D6,0x62D7,0x62C6,0x62AC, +0x62CE,0x653E,0x65A7,0x65BC,0x65FA,0x6614,0x6613,0x660C, +0x6606,0x6602,0x660E,0x6600,0x660F,0x6615,0x660A, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6607,0x670D,0x670B,0x676D,0x678B,0x6795,0x6771,0x679C, +0x6773,0x6777,0x6787,0x679D,0x6797,0x676F,0x6770,0x677F, +0x6789,0x677E,0x6790,0x6775,0x679A,0x6793,0x677C,0x676A, +0x6772,0x6B23,0x6B66,0x6B67,0x6B7F,0x6C13,0x6C1B,0x6CE3, +0x6CE8,0x6CF3,0x6CB1,0x6CCC,0x6CE5,0x6CB3,0x6CBD,0x6CBE, +0x6CBC,0x6CE2,0x6CAB,0x6CD5,0x6CD3,0x6CB8,0x6CC4,0x6CB9, +0x6CC1,0x6CAE,0x6CD7,0x6CC5,0x6CF1,0x6CBF,0x6CBB,0x6CE1, +0x6CDB,0x6CCA,0x6CAC,0x6CEF,0x6CDC,0x6CD6,0x6CE0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x7095,0x708E,0x7092,0x708A,0x7099,0x722C,0x722D, +0x7238,0x7248,0x7267,0x7269,0x72C0,0x72CE,0x72D9,0x72D7, +0x72D0,0x73A9,0x73A8,0x739F,0x73AB,0x73A5,0x753D,0x759D, +0x7599,0x759A,0x7684,0x76C2,0x76F2,0x76F4,0x77E5,0x77FD, +0x793E,0x7940,0x7941,0x79C9,0x79C8,0x7A7A,0x7A79,0x7AFA, +0x7CFE,0x7F54,0x7F8C,0x7F8B,0x8005,0x80BA,0x80A5,0x80A2, +0x80B1,0x80A1,0x80AB,0x80A9,0x80B4,0x80AA,0x80AF,0x81E5, +0x81FE,0x820D,0x82B3,0x829D,0x8299,0x82AD,0x82BD,0x829F, +0x82B9,0x82B1,0x82AC,0x82A5,0x82AF,0x82B8,0x82A3,0x82B0, +0x82BE,0x82B7,0x864E,0x8671,0x521D,0x8868,0x8ECB,0x8FCE, +0x8FD4,0x8FD1,0x90B5,0x90B8,0x90B1,0x90B6,0x91C7,0x91D1, +0x9577,0x9580,0x961C,0x9640,0x963F,0x963B,0x9644, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9642,0x96B9,0x96E8,0x9752,0x975E,0x4E9F,0x4EAD,0x4EAE, +0x4FE1,0x4FB5,0x4FAF,0x4FBF,0x4FE0,0x4FD1,0x4FCF,0x4FDD, +0x4FC3,0x4FB6,0x4FD8,0x4FDF,0x4FCA,0x4FD7,0x4FAE,0x4FD0, +0x4FC4,0x4FC2,0x4FDA,0x4FCE,0x4FDE,0x4FB7,0x5157,0x5192, +0x5191,0x51A0,0x524E,0x5243,0x524A,0x524D,0x524C,0x524B, +0x5247,0x52C7,0x52C9,0x52C3,0x52C1,0x530D,0x5357,0x537B, +0x539A,0x53DB,0x54AC,0x54C0,0x54A8,0x54CE,0x54C9,0x54B8, +0x54A6,0x54B3,0x54C7,0x54C2,0x54BD,0x54AA,0x54C1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x54C4,0x54C8,0x54AF,0x54AB,0x54B1,0x54BB,0x54A9, +0x54A7,0x54BF,0x56FF,0x5782,0x578B,0x57A0,0x57A3,0x57A2, +0x57CE,0x57AE,0x5793,0x5955,0x5951,0x594F,0x594E,0x5950, +0x59DC,0x59D8,0x59FF,0x59E3,0x59E8,0x5A03,0x59E5,0x59EA, +0x59DA,0x59E6,0x5A01,0x59FB,0x5B69,0x5BA3,0x5BA6,0x5BA4, +0x5BA2,0x5BA5,0x5C01,0x5C4E,0x5C4F,0x5C4D,0x5C4B,0x5CD9, +0x5CD2,0x5DF7,0x5E1D,0x5E25,0x5E1F,0x5E7D,0x5EA0,0x5EA6, +0x5EFA,0x5F08,0x5F2D,0x5F65,0x5F88,0x5F85,0x5F8A,0x5F8B, +0x5F87,0x5F8C,0x5F89,0x6012,0x601D,0x6020,0x6025,0x600E, +0x6028,0x604D,0x6070,0x6068,0x6062,0x6046,0x6043,0x606C, +0x606B,0x606A,0x6064,0x6241,0x62DC,0x6316,0x6309,0x62FC, +0x62ED,0x6301,0x62EE,0x62FD,0x6307,0x62F1,0x62F7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x62EF,0x62EC,0x62FE,0x62F4,0x6311,0x6302,0x653F,0x6545, +0x65AB,0x65BD,0x65E2,0x6625,0x662D,0x6620,0x6627,0x662F, +0x661F,0x6628,0x6631,0x6624,0x66F7,0x67FF,0x67D3,0x67F1, +0x67D4,0x67D0,0x67EC,0x67B6,0x67AF,0x67F5,0x67E9,0x67EF, +0x67C4,0x67D1,0x67B4,0x67DA,0x67E5,0x67B8,0x67CF,0x67DE, +0x67F3,0x67B0,0x67D9,0x67E2,0x67DD,0x67D2,0x6B6A,0x6B83, +0x6B86,0x6BB5,0x6BD2,0x6BD7,0x6C1F,0x6CC9,0x6D0B,0x6D32, +0x6D2A,0x6D41,0x6D25,0x6D0C,0x6D31,0x6D1E,0x6D17, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6D3B,0x6D3D,0x6D3E,0x6D36,0x6D1B,0x6CF5,0x6D39, +0x6D27,0x6D38,0x6D29,0x6D2E,0x6D35,0x6D0E,0x6D2B,0x70AB, +0x70BA,0x70B3,0x70AC,0x70AF,0x70AD,0x70B8,0x70AE,0x70A4, +0x7230,0x7272,0x726F,0x7274,0x72E9,0x72E0,0x72E1,0x73B7, +0x73CA,0x73BB,0x73B2,0x73CD,0x73C0,0x73B3,0x751A,0x752D, +0x754F,0x754C,0x754E,0x754B,0x75AB,0x75A4,0x75A5,0x75A2, +0x75A3,0x7678,0x7686,0x7687,0x7688,0x76C8,0x76C6,0x76C3, +0x76C5,0x7701,0x76F9,0x76F8,0x7709,0x770B,0x76FE,0x76FC, +0x7707,0x77DC,0x7802,0x7814,0x780C,0x780D,0x7946,0x7949, +0x7948,0x7947,0x79B9,0x79BA,0x79D1,0x79D2,0x79CB,0x7A7F, +0x7A81,0x7AFF,0x7AFD,0x7C7D,0x7D02,0x7D05,0x7D00,0x7D09, +0x7D07,0x7D04,0x7D06,0x7F38,0x7F8E,0x7FBF,0x8004, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8010,0x800D,0x8011,0x8036,0x80D6,0x80E5,0x80DA,0x80C3, +0x80C4,0x80CC,0x80E1,0x80DB,0x80CE,0x80DE,0x80E4,0x80DD, +0x81F4,0x8222,0x82E7,0x8303,0x8305,0x82E3,0x82DB,0x82E6, +0x8304,0x82E5,0x8302,0x8309,0x82D2,0x82D7,0x82F1,0x8301, +0x82DC,0x82D4,0x82D1,0x82DE,0x82D3,0x82DF,0x82EF,0x8306, +0x8650,0x8679,0x867B,0x867A,0x884D,0x886B,0x8981,0x89D4, +0x8A08,0x8A02,0x8A03,0x8C9E,0x8CA0,0x8D74,0x8D73,0x8DB4, +0x8ECD,0x8ECC,0x8FF0,0x8FE6,0x8FE2,0x8FEA,0x8FE5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x8FED,0x8FEB,0x8FE4,0x8FE8,0x90CA,0x90CE,0x90C1, +0x90C3,0x914B,0x914A,0x91CD,0x9582,0x9650,0x964B,0x964C, +0x964D,0x9762,0x9769,0x97CB,0x97ED,0x97F3,0x9801,0x98A8, +0x98DB,0x98DF,0x9996,0x9999,0x4E58,0x4EB3,0x500C,0x500D, +0x5023,0x4FEF,0x5026,0x5025,0x4FF8,0x5029,0x5016,0x5006, +0x503C,0x501F,0x501A,0x5012,0x5011,0x4FFA,0x5000,0x5014, +0x5028,0x4FF1,0x5021,0x500B,0x5019,0x5018,0x4FF3,0x4FEE, +0x502D,0x502A,0x4FFE,0x502B,0x5009,0x517C,0x51A4,0x51A5, +0x51A2,0x51CD,0x51CC,0x51C6,0x51CB,0x5256,0x525C,0x5254, +0x525B,0x525D,0x532A,0x537F,0x539F,0x539D,0x53DF,0x54E8, +0x5510,0x5501,0x5537,0x54FC,0x54E5,0x54F2,0x5506,0x54FA, +0x5514,0x54E9,0x54ED,0x54E1,0x5509,0x54EE,0x54EA, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x54E6,0x5527,0x5507,0x54FD,0x550F,0x5703,0x5704,0x57C2, +0x57D4,0x57CB,0x57C3,0x5809,0x590F,0x5957,0x5958,0x595A, +0x5A11,0x5A18,0x5A1C,0x5A1F,0x5A1B,0x5A13,0x59EC,0x5A20, +0x5A23,0x5A29,0x5A25,0x5A0C,0x5A09,0x5B6B,0x5C58,0x5BB0, +0x5BB3,0x5BB6,0x5BB4,0x5BAE,0x5BB5,0x5BB9,0x5BB8,0x5C04, +0x5C51,0x5C55,0x5C50,0x5CED,0x5CFD,0x5CFB,0x5CEA,0x5CE8, +0x5CF0,0x5CF6,0x5D01,0x5CF4,0x5DEE,0x5E2D,0x5E2B,0x5EAB, +0x5EAD,0x5EA7,0x5F31,0x5F92,0x5F91,0x5F90,0x6059, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6063,0x6065,0x6050,0x6055,0x606D,0x6069,0x606F, +0x6084,0x609F,0x609A,0x608D,0x6094,0x608C,0x6085,0x6096, +0x6247,0x62F3,0x6308,0x62FF,0x634E,0x633E,0x632F,0x6355, +0x6342,0x6346,0x634F,0x6349,0x633A,0x6350,0x633D,0x632A, +0x632B,0x6328,0x634D,0x634C,0x6548,0x6549,0x6599,0x65C1, +0x65C5,0x6642,0x6649,0x664F,0x6643,0x6652,0x664C,0x6645, +0x6641,0x66F8,0x6714,0x6715,0x6717,0x6821,0x6838,0x6848, +0x6846,0x6853,0x6839,0x6842,0x6854,0x6829,0x68B3,0x6817, +0x684C,0x6851,0x683D,0x67F4,0x6850,0x6840,0x683C,0x6843, +0x682A,0x6845,0x6813,0x6818,0x6841,0x6B8A,0x6B89,0x6BB7, +0x6C23,0x6C27,0x6C28,0x6C26,0x6C24,0x6CF0,0x6D6A,0x6D95, +0x6D88,0x6D87,0x6D66,0x6D78,0x6D77,0x6D59,0x6D93, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6D6C,0x6D89,0x6D6E,0x6D5A,0x6D74,0x6D69,0x6D8C,0x6D8A, +0x6D79,0x6D85,0x6D65,0x6D94,0x70CA,0x70D8,0x70E4,0x70D9, +0x70C8,0x70CF,0x7239,0x7279,0x72FC,0x72F9,0x72FD,0x72F8, +0x72F7,0x7386,0x73ED,0x7409,0x73EE,0x73E0,0x73EA,0x73DE, +0x7554,0x755D,0x755C,0x755A,0x7559,0x75BE,0x75C5,0x75C7, +0x75B2,0x75B3,0x75BD,0x75BC,0x75B9,0x75C2,0x75B8,0x768B, +0x76B0,0x76CA,0x76CD,0x76CE,0x7729,0x771F,0x7720,0x7728, +0x77E9,0x7830,0x7827,0x7838,0x781D,0x7834,0x7837, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x7825,0x782D,0x7820,0x781F,0x7832,0x7955,0x7950, +0x7960,0x795F,0x7956,0x795E,0x795D,0x7957,0x795A,0x79E4, +0x79E3,0x79E7,0x79DF,0x79E6,0x79E9,0x79D8,0x7A84,0x7A88, +0x7AD9,0x7B06,0x7B11,0x7C89,0x7D21,0x7D17,0x7D0B,0x7D0A, +0x7D20,0x7D22,0x7D14,0x7D10,0x7D15,0x7D1A,0x7D1C,0x7D0D, +0x7D19,0x7D1B,0x7F3A,0x7F5F,0x7F94,0x7FC5,0x7FC1,0x8006, +0x8018,0x8015,0x8019,0x8017,0x803D,0x803F,0x80F1,0x8102, +0x80F0,0x8105,0x80ED,0x80F4,0x8106,0x80F8,0x80F3,0x8108, +0x80FD,0x810A,0x80FC,0x80EF,0x81ED,0x81EC,0x8200,0x8210, +0x822A,0x822B,0x8228,0x822C,0x82BB,0x832B,0x8352,0x8354, +0x834A,0x8338,0x8350,0x8349,0x8335,0x8334,0x834F,0x8332, +0x8339,0x8336,0x8317,0x8340,0x8331,0x8328,0x8343, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8654,0x868A,0x86AA,0x8693,0x86A4,0x86A9,0x868C,0x86A3, +0x869C,0x8870,0x8877,0x8881,0x8882,0x887D,0x8879,0x8A18, +0x8A10,0x8A0E,0x8A0C,0x8A15,0x8A0A,0x8A17,0x8A13,0x8A16, +0x8A0F,0x8A11,0x8C48,0x8C7A,0x8C79,0x8CA1,0x8CA2,0x8D77, +0x8EAC,0x8ED2,0x8ED4,0x8ECF,0x8FB1,0x9001,0x9006,0x8FF7, +0x9000,0x8FFA,0x8FF4,0x9003,0x8FFD,0x9005,0x8FF8,0x9095, +0x90E1,0x90DD,0x90E2,0x9152,0x914D,0x914C,0x91D8,0x91DD, +0x91D7,0x91DC,0x91D9,0x9583,0x9662,0x9663,0x9661, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x965B,0x965D,0x9664,0x9658,0x965E,0x96BB,0x98E2, +0x99AC,0x9AA8,0x9AD8,0x9B25,0x9B32,0x9B3C,0x4E7E,0x507A, +0x507D,0x505C,0x5047,0x5043,0x504C,0x505A,0x5049,0x5065, +0x5076,0x504E,0x5055,0x5075,0x5074,0x5077,0x504F,0x500F, +0x506F,0x506D,0x515C,0x5195,0x51F0,0x526A,0x526F,0x52D2, +0x52D9,0x52D8,0x52D5,0x5310,0x530F,0x5319,0x533F,0x5340, +0x533E,0x53C3,0x66FC,0x5546,0x556A,0x5566,0x5544,0x555E, +0x5561,0x5543,0x554A,0x5531,0x5556,0x554F,0x5555,0x552F, +0x5564,0x5538,0x552E,0x555C,0x552C,0x5563,0x5533,0x5541, +0x5557,0x5708,0x570B,0x5709,0x57DF,0x5805,0x580A,0x5806, +0x57E0,0x57E4,0x57FA,0x5802,0x5835,0x57F7,0x57F9,0x5920, +0x5962,0x5A36,0x5A41,0x5A49,0x5A66,0x5A6A,0x5A40, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5A3C,0x5A62,0x5A5A,0x5A46,0x5A4A,0x5B70,0x5BC7,0x5BC5, +0x5BC4,0x5BC2,0x5BBF,0x5BC6,0x5C09,0x5C08,0x5C07,0x5C60, +0x5C5C,0x5C5D,0x5D07,0x5D06,0x5D0E,0x5D1B,0x5D16,0x5D22, +0x5D11,0x5D29,0x5D14,0x5D19,0x5D24,0x5D27,0x5D17,0x5DE2, +0x5E38,0x5E36,0x5E33,0x5E37,0x5EB7,0x5EB8,0x5EB6,0x5EB5, +0x5EBE,0x5F35,0x5F37,0x5F57,0x5F6C,0x5F69,0x5F6B,0x5F97, +0x5F99,0x5F9E,0x5F98,0x5FA1,0x5FA0,0x5F9C,0x607F,0x60A3, +0x6089,0x60A0,0x60A8,0x60CB,0x60B4,0x60E6,0x60BD, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x60C5,0x60BB,0x60B5,0x60DC,0x60BC,0x60D8,0x60D5, +0x60C6,0x60DF,0x60B8,0x60DA,0x60C7,0x621A,0x621B,0x6248, +0x63A0,0x63A7,0x6372,0x6396,0x63A2,0x63A5,0x6377,0x6367, +0x6398,0x63AA,0x6371,0x63A9,0x6389,0x6383,0x639B,0x636B, +0x63A8,0x6384,0x6388,0x6399,0x63A1,0x63AC,0x6392,0x638F, +0x6380,0x637B,0x6369,0x6368,0x637A,0x655D,0x6556,0x6551, +0x6559,0x6557,0x555F,0x654F,0x6558,0x6555,0x6554,0x659C, +0x659B,0x65AC,0x65CF,0x65CB,0x65CC,0x65CE,0x665D,0x665A, +0x6664,0x6668,0x6666,0x665E,0x66F9,0x52D7,0x671B,0x6881, +0x68AF,0x68A2,0x6893,0x68B5,0x687F,0x6876,0x68B1,0x68A7, +0x6897,0x68B0,0x6883,0x68C4,0x68AD,0x6886,0x6885,0x6894, +0x689D,0x68A8,0x689F,0x68A1,0x6882,0x6B32,0x6BBA, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6BEB,0x6BEC,0x6C2B,0x6D8E,0x6DBC,0x6DF3,0x6DD9,0x6DB2, +0x6DE1,0x6DCC,0x6DE4,0x6DFB,0x6DFA,0x6E05,0x6DC7,0x6DCB, +0x6DAF,0x6DD1,0x6DAE,0x6DDE,0x6DF9,0x6DB8,0x6DF7,0x6DF5, +0x6DC5,0x6DD2,0x6E1A,0x6DB5,0x6DDA,0x6DEB,0x6DD8,0x6DEA, +0x6DF1,0x6DEE,0x6DE8,0x6DC6,0x6DC4,0x6DAA,0x6DEC,0x6DBF, +0x6DE6,0x70F9,0x7109,0x710A,0x70FD,0x70EF,0x723D,0x727D, +0x7281,0x731C,0x731B,0x7316,0x7313,0x7319,0x7387,0x7405, +0x740A,0x7403,0x7406,0x73FE,0x740D,0x74E0,0x74F6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x74F7,0x751C,0x7522,0x7565,0x7566,0x7562,0x7570, +0x758F,0x75D4,0x75D5,0x75B5,0x75CA,0x75CD,0x768E,0x76D4, +0x76D2,0x76DB,0x7737,0x773E,0x773C,0x7736,0x7738,0x773A, +0x786B,0x7843,0x784E,0x7965,0x7968,0x796D,0x79FB,0x7A92, +0x7A95,0x7B20,0x7B28,0x7B1B,0x7B2C,0x7B26,0x7B19,0x7B1E, +0x7B2E,0x7C92,0x7C97,0x7C95,0x7D46,0x7D43,0x7D71,0x7D2E, +0x7D39,0x7D3C,0x7D40,0x7D30,0x7D33,0x7D44,0x7D2F,0x7D42, +0x7D32,0x7D31,0x7F3D,0x7F9E,0x7F9A,0x7FCC,0x7FCE,0x7FD2, +0x801C,0x804A,0x8046,0x812F,0x8116,0x8123,0x812B,0x8129, +0x8130,0x8124,0x8202,0x8235,0x8237,0x8236,0x8239,0x838E, +0x839E,0x8398,0x8378,0x83A2,0x8396,0x83BD,0x83AB,0x8392, +0x838A,0x8393,0x8389,0x83A0,0x8377,0x837B,0x837C, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8386,0x83A7,0x8655,0x5F6A,0x86C7,0x86C0,0x86B6,0x86C4, +0x86B5,0x86C6,0x86CB,0x86B1,0x86AF,0x86C9,0x8853,0x889E, +0x8888,0x88AB,0x8892,0x8896,0x888D,0x888B,0x8993,0x898F, +0x8A2A,0x8A1D,0x8A23,0x8A25,0x8A31,0x8A2D,0x8A1F,0x8A1B, +0x8A22,0x8C49,0x8C5A,0x8CA9,0x8CAC,0x8CAB,0x8CA8,0x8CAA, +0x8CA7,0x8D67,0x8D66,0x8DBE,0x8DBA,0x8EDB,0x8EDF,0x9019, +0x900D,0x901A,0x9017,0x9023,0x901F,0x901D,0x9010,0x9015, +0x901E,0x9020,0x900F,0x9022,0x9016,0x901B,0x9014, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x90E8,0x90ED,0x90FD,0x9157,0x91CE,0x91F5,0x91E6, +0x91E3,0x91E7,0x91ED,0x91E9,0x9589,0x966A,0x9675,0x9673, +0x9678,0x9670,0x9674,0x9676,0x9677,0x966C,0x96C0,0x96EA, +0x96E9,0x7AE0,0x7ADF,0x9802,0x9803,0x9B5A,0x9CE5,0x9E75, +0x9E7F,0x9EA5,0x9EBB,0x50A2,0x508D,0x5085,0x5099,0x5091, +0x5080,0x5096,0x5098,0x509A,0x6700,0x51F1,0x5272,0x5274, +0x5275,0x5269,0x52DE,0x52DD,0x52DB,0x535A,0x53A5,0x557B, +0x5580,0x55A7,0x557C,0x558A,0x559D,0x5598,0x5582,0x559C, +0x55AA,0x5594,0x5587,0x558B,0x5583,0x55B3,0x55AE,0x559F, +0x553E,0x55B2,0x559A,0x55BB,0x55AC,0x55B1,0x557E,0x5589, +0x55AB,0x5599,0x570D,0x582F,0x582A,0x5834,0x5824,0x5830, +0x5831,0x5821,0x581D,0x5820,0x58F9,0x58FA,0x5960, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5A77,0x5A9A,0x5A7F,0x5A92,0x5A9B,0x5AA7,0x5B73,0x5B71, +0x5BD2,0x5BCC,0x5BD3,0x5BD0,0x5C0A,0x5C0B,0x5C31,0x5D4C, +0x5D50,0x5D34,0x5D47,0x5DFD,0x5E45,0x5E3D,0x5E40,0x5E43, +0x5E7E,0x5ECA,0x5EC1,0x5EC2,0x5EC4,0x5F3C,0x5F6D,0x5FA9, +0x5FAA,0x5FA8,0x60D1,0x60E1,0x60B2,0x60B6,0x60E0,0x611C, +0x6123,0x60FA,0x6115,0x60F0,0x60FB,0x60F4,0x6168,0x60F1, +0x610E,0x60F6,0x6109,0x6100,0x6112,0x621F,0x6249,0x63A3, +0x638C,0x63CF,0x63C0,0x63E9,0x63C9,0x63C6,0x63CD, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x63D2,0x63E3,0x63D0,0x63E1,0x63D6,0x63ED,0x63EE, +0x6376,0x63F4,0x63EA,0x63DB,0x6452,0x63DA,0x63F9,0x655E, +0x6566,0x6562,0x6563,0x6591,0x6590,0x65AF,0x666E,0x6670, +0x6674,0x6676,0x666F,0x6691,0x667A,0x667E,0x6677,0x66FE, +0x66FF,0x671F,0x671D,0x68FA,0x68D5,0x68E0,0x68D8,0x68D7, +0x6905,0x68DF,0x68F5,0x68EE,0x68E7,0x68F9,0x68D2,0x68F2, +0x68E3,0x68CB,0x68CD,0x690D,0x6912,0x690E,0x68C9,0x68DA, +0x696E,0x68FB,0x6B3E,0x6B3A,0x6B3D,0x6B98,0x6B96,0x6BBC, +0x6BEF,0x6C2E,0x6C2F,0x6C2C,0x6E2F,0x6E38,0x6E54,0x6E21, +0x6E32,0x6E67,0x6E4A,0x6E20,0x6E25,0x6E23,0x6E1B,0x6E5B, +0x6E58,0x6E24,0x6E56,0x6E6E,0x6E2D,0x6E26,0x6E6F,0x6E34, +0x6E4D,0x6E3A,0x6E2C,0x6E43,0x6E1D,0x6E3E,0x6ECB, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6E89,0x6E19,0x6E4E,0x6E63,0x6E44,0x6E72,0x6E69,0x6E5F, +0x7119,0x711A,0x7126,0x7130,0x7121,0x7136,0x716E,0x711C, +0x724C,0x7284,0x7280,0x7336,0x7325,0x7334,0x7329,0x743A, +0x742A,0x7433,0x7422,0x7425,0x7435,0x7436,0x7434,0x742F, +0x741B,0x7426,0x7428,0x7525,0x7526,0x756B,0x756A,0x75E2, +0x75DB,0x75E3,0x75D9,0x75D8,0x75DE,0x75E0,0x767B,0x767C, +0x7696,0x7693,0x76B4,0x76DC,0x774F,0x77ED,0x785D,0x786C, +0x786F,0x7A0D,0x7A08,0x7A0B,0x7A05,0x7A00,0x7A98, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x7A97,0x7A96,0x7AE5,0x7AE3,0x7B49,0x7B56,0x7B46, +0x7B50,0x7B52,0x7B54,0x7B4D,0x7B4B,0x7B4F,0x7B51,0x7C9F, +0x7CA5,0x7D5E,0x7D50,0x7D68,0x7D55,0x7D2B,0x7D6E,0x7D72, +0x7D61,0x7D66,0x7D62,0x7D70,0x7D73,0x5584,0x7FD4,0x7FD5, +0x800B,0x8052,0x8085,0x8155,0x8154,0x814B,0x8151,0x814E, +0x8139,0x8146,0x813E,0x814C,0x8153,0x8174,0x8212,0x821C, +0x83E9,0x8403,0x83F8,0x840D,0x83E0,0x83C5,0x840B,0x83C1, +0x83EF,0x83F1,0x83F4,0x8457,0x840A,0x83F0,0x840C,0x83CC, +0x83FD,0x83F2,0x83CA,0x8438,0x840E,0x8404,0x83DC,0x8407, +0x83D4,0x83DF,0x865B,0x86DF,0x86D9,0x86ED,0x86D4,0x86DB, +0x86E4,0x86D0,0x86DE,0x8857,0x88C1,0x88C2,0x88B1,0x8983, +0x8996,0x8A3B,0x8A60,0x8A55,0x8A5E,0x8A3C,0x8A41, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8A54,0x8A5B,0x8A50,0x8A46,0x8A34,0x8A3A,0x8A36,0x8A56, +0x8C61,0x8C82,0x8CAF,0x8CBC,0x8CB3,0x8CBD,0x8CC1,0x8CBB, +0x8CC0,0x8CB4,0x8CB7,0x8CB6,0x8CBF,0x8CB8,0x8D8A,0x8D85, +0x8D81,0x8DCE,0x8DDD,0x8DCB,0x8DDA,0x8DD1,0x8DCC,0x8DDB, +0x8DC6,0x8EFB,0x8EF8,0x8EFC,0x8F9C,0x902E,0x9035,0x9031, +0x9038,0x9032,0x9036,0x9102,0x90F5,0x9109,0x90FE,0x9163, +0x9165,0x91CF,0x9214,0x9215,0x9223,0x9209,0x921E,0x920D, +0x9210,0x9207,0x9211,0x9594,0x958F,0x958B,0x9591, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x9593,0x9592,0x958E,0x968A,0x968E,0x968B,0x967D, +0x9685,0x9686,0x968D,0x9672,0x9684,0x96C1,0x96C5,0x96C4, +0x96C6,0x96C7,0x96EF,0x96F2,0x97CC,0x9805,0x9806,0x9808, +0x98E7,0x98EA,0x98EF,0x98E9,0x98F2,0x98ED,0x99AE,0x99AD, +0x9EC3,0x9ECD,0x9ED1,0x4E82,0x50AD,0x50B5,0x50B2,0x50B3, +0x50C5,0x50BE,0x50AC,0x50B7,0x50BB,0x50AF,0x50C7,0x527F, +0x5277,0x527D,0x52DF,0x52E6,0x52E4,0x52E2,0x52E3,0x532F, +0x55DF,0x55E8,0x55D3,0x55E6,0x55CE,0x55DC,0x55C7,0x55D1, +0x55E3,0x55E4,0x55EF,0x55DA,0x55E1,0x55C5,0x55C6,0x55E5, +0x55C9,0x5712,0x5713,0x585E,0x5851,0x5858,0x5857,0x585A, +0x5854,0x586B,0x584C,0x586D,0x584A,0x5862,0x5852,0x584B, +0x5967,0x5AC1,0x5AC9,0x5ACC,0x5ABE,0x5ABD,0x5ABC, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5AB3,0x5AC2,0x5AB2,0x5D69,0x5D6F,0x5E4C,0x5E79,0x5EC9, +0x5EC8,0x5F12,0x5F59,0x5FAC,0x5FAE,0x611A,0x610F,0x6148, +0x611F,0x60F3,0x611B,0x60F9,0x6101,0x6108,0x614E,0x614C, +0x6144,0x614D,0x613E,0x6134,0x6127,0x610D,0x6106,0x6137, +0x6221,0x6222,0x6413,0x643E,0x641E,0x642A,0x642D,0x643D, +0x642C,0x640F,0x641C,0x6414,0x640D,0x6436,0x6416,0x6417, +0x6406,0x656C,0x659F,0x65B0,0x6697,0x6689,0x6687,0x6688, +0x6696,0x6684,0x6698,0x668D,0x6703,0x6994,0x696D, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x695A,0x6977,0x6960,0x6954,0x6975,0x6930,0x6982, +0x694A,0x6968,0x696B,0x695E,0x6953,0x6979,0x6986,0x695D, +0x6963,0x695B,0x6B47,0x6B72,0x6BC0,0x6BBF,0x6BD3,0x6BFD, +0x6EA2,0x6EAF,0x6ED3,0x6EB6,0x6EC2,0x6E90,0x6E9D,0x6EC7, +0x6EC5,0x6EA5,0x6E98,0x6EBC,0x6EBA,0x6EAB,0x6ED1,0x6E96, +0x6E9C,0x6EC4,0x6ED4,0x6EAA,0x6EA7,0x6EB4,0x714E,0x7159, +0x7169,0x7164,0x7149,0x7167,0x715C,0x716C,0x7166,0x714C, +0x7165,0x715E,0x7146,0x7168,0x7156,0x723A,0x7252,0x7337, +0x7345,0x733F,0x733E,0x746F,0x745A,0x7455,0x745F,0x745E, +0x7441,0x743F,0x7459,0x745B,0x745C,0x7576,0x7578,0x7600, +0x75F0,0x7601,0x75F2,0x75F1,0x75FA,0x75FF,0x75F4,0x75F3, +0x76DE,0x76DF,0x775B,0x776B,0x7766,0x775E,0x7763, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7779,0x776A,0x776C,0x775C,0x7765,0x7768,0x7762,0x77EE, +0x788E,0x78B0,0x7897,0x7898,0x788C,0x7889,0x787C,0x7891, +0x7893,0x787F,0x797A,0x797F,0x7981,0x842C,0x79BD,0x7A1C, +0x7A1A,0x7A20,0x7A14,0x7A1F,0x7A1E,0x7A9F,0x7AA0,0x7B77, +0x7BC0,0x7B60,0x7B6E,0x7B67,0x7CB1,0x7CB3,0x7CB5,0x7D93, +0x7D79,0x7D91,0x7D81,0x7D8F,0x7D5B,0x7F6E,0x7F69,0x7F6A, +0x7F72,0x7FA9,0x7FA8,0x7FA4,0x8056,0x8058,0x8086,0x8084, +0x8171,0x8170,0x8178,0x8165,0x816E,0x8173,0x816B, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x8179,0x817A,0x8166,0x8205,0x8247,0x8482,0x8477, +0x843D,0x8431,0x8475,0x8466,0x846B,0x8449,0x846C,0x845B, +0x843C,0x8435,0x8461,0x8463,0x8469,0x846D,0x8446,0x865E, +0x865C,0x865F,0x86F9,0x8713,0x8708,0x8707,0x8700,0x86FE, +0x86FB,0x8702,0x8703,0x8706,0x870A,0x8859,0x88DF,0x88D4, +0x88D9,0x88DC,0x88D8,0x88DD,0x88E1,0x88CA,0x88D5,0x88D2, +0x899C,0x89E3,0x8A6B,0x8A72,0x8A73,0x8A66,0x8A69,0x8A70, +0x8A87,0x8A7C,0x8A63,0x8AA0,0x8A71,0x8A85,0x8A6D,0x8A62, +0x8A6E,0x8A6C,0x8A79,0x8A7B,0x8A3E,0x8A68,0x8C62,0x8C8A, +0x8C89,0x8CCA,0x8CC7,0x8CC8,0x8CC4,0x8CB2,0x8CC3,0x8CC2, +0x8CC5,0x8DE1,0x8DDF,0x8DE8,0x8DEF,0x8DF3,0x8DFA,0x8DEA, +0x8DE4,0x8DE6,0x8EB2,0x8F03,0x8F09,0x8EFE,0x8F0A, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8F9F,0x8FB2,0x904B,0x904A,0x9053,0x9042,0x9054,0x903C, +0x9055,0x9050,0x9047,0x904F,0x904E,0x904D,0x9051,0x903E, +0x9041,0x9112,0x9117,0x916C,0x916A,0x9169,0x91C9,0x9237, +0x9257,0x9238,0x923D,0x9240,0x923E,0x925B,0x924B,0x9264, +0x9251,0x9234,0x9249,0x924D,0x9245,0x9239,0x923F,0x925A, +0x9598,0x9698,0x9694,0x9695,0x96CD,0x96CB,0x96C9,0x96CA, +0x96F7,0x96FB,0x96F9,0x96F6,0x9756,0x9774,0x9776,0x9810, +0x9811,0x9813,0x980A,0x9812,0x980C,0x98FC,0x98F4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x98FD,0x98FE,0x99B3,0x99B1,0x99B4,0x9AE1,0x9CE9, +0x9E82,0x9F0E,0x9F13,0x9F20,0x50E7,0x50EE,0x50E5,0x50D6, +0x50ED,0x50DA,0x50D5,0x50CF,0x50D1,0x50F1,0x50CE,0x50E9, +0x5162,0x51F3,0x5283,0x5282,0x5331,0x53AD,0x55FE,0x5600, +0x561B,0x5617,0x55FD,0x5614,0x5606,0x5609,0x560D,0x560E, +0x55F7,0x5616,0x561F,0x5608,0x5610,0x55F6,0x5718,0x5716, +0x5875,0x587E,0x5883,0x5893,0x588A,0x5879,0x5885,0x587D, +0x58FD,0x5925,0x5922,0x5924,0x596A,0x5969,0x5AE1,0x5AE6, +0x5AE9,0x5AD7,0x5AD6,0x5AD8,0x5AE3,0x5B75,0x5BDE,0x5BE7, +0x5BE1,0x5BE5,0x5BE6,0x5BE8,0x5BE2,0x5BE4,0x5BDF,0x5C0D, +0x5C62,0x5D84,0x5D87,0x5E5B,0x5E63,0x5E55,0x5E57,0x5E54, +0x5ED3,0x5ED6,0x5F0A,0x5F46,0x5F70,0x5FB9,0x6147, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x613F,0x614B,0x6177,0x6162,0x6163,0x615F,0x615A,0x6158, +0x6175,0x622A,0x6487,0x6458,0x6454,0x64A4,0x6478,0x645F, +0x647A,0x6451,0x6467,0x6434,0x646D,0x647B,0x6572,0x65A1, +0x65D7,0x65D6,0x66A2,0x66A8,0x669D,0x699C,0x69A8,0x6995, +0x69C1,0x69AE,0x69D3,0x69CB,0x699B,0x69B7,0x69BB,0x69AB, +0x69B4,0x69D0,0x69CD,0x69AD,0x69CC,0x69A6,0x69C3,0x69A3, +0x6B49,0x6B4C,0x6C33,0x6F33,0x6F14,0x6EFE,0x6F13,0x6EF4, +0x6F29,0x6F3E,0x6F20,0x6F2C,0x6F0F,0x6F02,0x6F22, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6EFF,0x6EEF,0x6F06,0x6F31,0x6F38,0x6F32,0x6F23, +0x6F15,0x6F2B,0x6F2F,0x6F88,0x6F2A,0x6EEC,0x6F01,0x6EF2, +0x6ECC,0x6EF7,0x7194,0x7199,0x717D,0x718A,0x7184,0x7192, +0x723E,0x7292,0x7296,0x7344,0x7350,0x7464,0x7463,0x746A, +0x7470,0x746D,0x7504,0x7591,0x7627,0x760D,0x760B,0x7609, +0x7613,0x76E1,0x76E3,0x7784,0x777D,0x777F,0x7761,0x78C1, +0x789F,0x78A7,0x78B3,0x78A9,0x78A3,0x798E,0x798F,0x798D, +0x7A2E,0x7A31,0x7AAA,0x7AA9,0x7AED,0x7AEF,0x7BA1,0x7B95, +0x7B8B,0x7B75,0x7B97,0x7B9D,0x7B94,0x7B8F,0x7BB8,0x7B87, +0x7B84,0x7CB9,0x7CBD,0x7CBE,0x7DBB,0x7DB0,0x7D9C,0x7DBD, +0x7DBE,0x7DA0,0x7DCA,0x7DB4,0x7DB2,0x7DB1,0x7DBA,0x7DA2, +0x7DBF,0x7DB5,0x7DB8,0x7DAD,0x7DD2,0x7DC7,0x7DAC, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7F70,0x7FE0,0x7FE1,0x7FDF,0x805E,0x805A,0x8087,0x8150, +0x8180,0x818F,0x8188,0x818A,0x817F,0x8182,0x81E7,0x81FA, +0x8207,0x8214,0x821E,0x824B,0x84C9,0x84BF,0x84C6,0x84C4, +0x8499,0x849E,0x84B2,0x849C,0x84CB,0x84B8,0x84C0,0x84D3, +0x8490,0x84BC,0x84D1,0x84CA,0x873F,0x871C,0x873B,0x8722, +0x8725,0x8734,0x8718,0x8755,0x8737,0x8729,0x88F3,0x8902, +0x88F4,0x88F9,0x88F8,0x88FD,0x88E8,0x891A,0x88EF,0x8AA6, +0x8A8C,0x8A9E,0x8AA3,0x8A8D,0x8AA1,0x8A93,0x8AA4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x8AAA,0x8AA5,0x8AA8,0x8A98,0x8A91,0x8A9A,0x8AA7, +0x8C6A,0x8C8D,0x8C8C,0x8CD3,0x8CD1,0x8CD2,0x8D6B,0x8D99, +0x8D95,0x8DFC,0x8F14,0x8F12,0x8F15,0x8F13,0x8FA3,0x9060, +0x9058,0x905C,0x9063,0x9059,0x905E,0x9062,0x905D,0x905B, +0x9119,0x9118,0x911E,0x9175,0x9178,0x9177,0x9174,0x9278, +0x9280,0x9285,0x9298,0x9296,0x927B,0x9293,0x929C,0x92A8, +0x927C,0x9291,0x95A1,0x95A8,0x95A9,0x95A3,0x95A5,0x95A4, +0x9699,0x969C,0x969B,0x96CC,0x96D2,0x9700,0x977C,0x9785, +0x97F6,0x9817,0x9818,0x98AF,0x98B1,0x9903,0x9905,0x990C, +0x9909,0x99C1,0x9AAF,0x9AB0,0x9AE6,0x9B41,0x9B42,0x9CF4, +0x9CF6,0x9CF3,0x9EBC,0x9F3B,0x9F4A,0x5104,0x5100,0x50FB, +0x50F5,0x50F9,0x5102,0x5108,0x5109,0x5105,0x51DC, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5287,0x5288,0x5289,0x528D,0x528A,0x52F0,0x53B2,0x562E, +0x563B,0x5639,0x5632,0x563F,0x5634,0x5629,0x5653,0x564E, +0x5657,0x5674,0x5636,0x562F,0x5630,0x5880,0x589F,0x589E, +0x58B3,0x589C,0x58AE,0x58A9,0x58A6,0x596D,0x5B09,0x5AFB, +0x5B0B,0x5AF5,0x5B0C,0x5B08,0x5BEE,0x5BEC,0x5BE9,0x5BEB, +0x5C64,0x5C65,0x5D9D,0x5D94,0x5E62,0x5E5F,0x5E61,0x5EE2, +0x5EDA,0x5EDF,0x5EDD,0x5EE3,0x5EE0,0x5F48,0x5F71,0x5FB7, +0x5FB5,0x6176,0x6167,0x616E,0x615D,0x6155,0x6182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x617C,0x6170,0x616B,0x617E,0x61A7,0x6190,0x61AB, +0x618E,0x61AC,0x619A,0x61A4,0x6194,0x61AE,0x622E,0x6469, +0x646F,0x6479,0x649E,0x64B2,0x6488,0x6490,0x64B0,0x64A5, +0x6493,0x6495,0x64A9,0x6492,0x64AE,0x64AD,0x64AB,0x649A, +0x64AC,0x6499,0x64A2,0x64B3,0x6575,0x6577,0x6578,0x66AE, +0x66AB,0x66B4,0x66B1,0x6A23,0x6A1F,0x69E8,0x6A01,0x6A1E, +0x6A19,0x69FD,0x6A21,0x6A13,0x6A0A,0x69F3,0x6A02,0x6A05, +0x69ED,0x6A11,0x6B50,0x6B4E,0x6BA4,0x6BC5,0x6BC6,0x6F3F, +0x6F7C,0x6F84,0x6F51,0x6F66,0x6F54,0x6F86,0x6F6D,0x6F5B, +0x6F78,0x6F6E,0x6F8E,0x6F7A,0x6F70,0x6F64,0x6F97,0x6F58, +0x6ED5,0x6F6F,0x6F60,0x6F5F,0x719F,0x71AC,0x71B1,0x71A8, +0x7256,0x729B,0x734E,0x7357,0x7469,0x748B,0x7483, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x747E,0x7480,0x757F,0x7620,0x7629,0x761F,0x7624,0x7626, +0x7621,0x7622,0x769A,0x76BA,0x76E4,0x778E,0x7787,0x778C, +0x7791,0x778B,0x78CB,0x78C5,0x78BA,0x78CA,0x78BE,0x78D5, +0x78BC,0x78D0,0x7A3F,0x7A3C,0x7A40,0x7A3D,0x7A37,0x7A3B, +0x7AAF,0x7AAE,0x7BAD,0x7BB1,0x7BC4,0x7BB4,0x7BC6,0x7BC7, +0x7BC1,0x7BA0,0x7BCC,0x7CCA,0x7DE0,0x7DF4,0x7DEF,0x7DFB, +0x7DD8,0x7DEC,0x7DDD,0x7DE8,0x7DE3,0x7DDA,0x7DDE,0x7DE9, +0x7D9E,0x7DD9,0x7DF2,0x7DF9,0x7F75,0x7F77,0x7FAF, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x7FE9,0x8026,0x819B,0x819C,0x819D,0x81A0,0x819A, +0x8198,0x8517,0x853D,0x851A,0x84EE,0x852C,0x852D,0x8513, +0x8511,0x8523,0x8521,0x8514,0x84EC,0x8525,0x84FF,0x8506, +0x8782,0x8774,0x8776,0x8760,0x8766,0x8778,0x8768,0x8759, +0x8757,0x874C,0x8753,0x885B,0x885D,0x8910,0x8907,0x8912, +0x8913,0x8915,0x890A,0x8ABC,0x8AD2,0x8AC7,0x8AC4,0x8A95, +0x8ACB,0x8AF8,0x8AB2,0x8AC9,0x8AC2,0x8ABF,0x8AB0,0x8AD6, +0x8ACD,0x8AB6,0x8AB9,0x8ADB,0x8C4C,0x8C4E,0x8C6C,0x8CE0, +0x8CDE,0x8CE6,0x8CE4,0x8CEC,0x8CED,0x8CE2,0x8CE3,0x8CDC, +0x8CEA,0x8CE1,0x8D6D,0x8D9F,0x8DA3,0x8E2B,0x8E10,0x8E1D, +0x8E22,0x8E0F,0x8E29,0x8E1F,0x8E21,0x8E1E,0x8EBA,0x8F1D, +0x8F1B,0x8F1F,0x8F29,0x8F26,0x8F2A,0x8F1C,0x8F1E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8F25,0x9069,0x906E,0x9068,0x906D,0x9077,0x9130,0x912D, +0x9127,0x9131,0x9187,0x9189,0x918B,0x9183,0x92C5,0x92BB, +0x92B7,0x92EA,0x92AC,0x92E4,0x92C1,0x92B3,0x92BC,0x92D2, +0x92C7,0x92F0,0x92B2,0x95AD,0x95B1,0x9704,0x9706,0x9707, +0x9709,0x9760,0x978D,0x978B,0x978F,0x9821,0x982B,0x981C, +0x98B3,0x990A,0x9913,0x9912,0x9918,0x99DD,0x99D0,0x99DF, +0x99DB,0x99D1,0x99D5,0x99D2,0x99D9,0x9AB7,0x9AEE,0x9AEF, +0x9B27,0x9B45,0x9B44,0x9B77,0x9B6F,0x9D06,0x9D09, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x9D03,0x9EA9,0x9EBE,0x9ECE,0x58A8,0x9F52,0x5112, +0x5118,0x5114,0x5110,0x5115,0x5180,0x51AA,0x51DD,0x5291, +0x5293,0x52F3,0x5659,0x566B,0x5679,0x5669,0x5664,0x5678, +0x566A,0x5668,0x5665,0x5671,0x566F,0x566C,0x5662,0x5676, +0x58C1,0x58BE,0x58C7,0x58C5,0x596E,0x5B1D,0x5B34,0x5B78, +0x5BF0,0x5C0E,0x5F4A,0x61B2,0x6191,0x61A9,0x618A,0x61CD, +0x61B6,0x61BE,0x61CA,0x61C8,0x6230,0x64C5,0x64C1,0x64CB, +0x64BB,0x64BC,0x64DA,0x64C4,0x64C7,0x64C2,0x64CD,0x64BF, +0x64D2,0x64D4,0x64BE,0x6574,0x66C6,0x66C9,0x66B9,0x66C4, +0x66C7,0x66B8,0x6A3D,0x6A38,0x6A3A,0x6A59,0x6A6B,0x6A58, +0x6A39,0x6A44,0x6A62,0x6A61,0x6A4B,0x6A47,0x6A35,0x6A5F, +0x6A48,0x6B59,0x6B77,0x6C05,0x6FC2,0x6FB1,0x6FA1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6FC3,0x6FA4,0x6FC1,0x6FA7,0x6FB3,0x6FC0,0x6FB9,0x6FB6, +0x6FA6,0x6FA0,0x6FB4,0x71BE,0x71C9,0x71D0,0x71D2,0x71C8, +0x71D5,0x71B9,0x71CE,0x71D9,0x71DC,0x71C3,0x71C4,0x7368, +0x749C,0x74A3,0x7498,0x749F,0x749E,0x74E2,0x750C,0x750D, +0x7634,0x7638,0x763A,0x76E7,0x76E5,0x77A0,0x779E,0x779F, +0x77A5,0x78E8,0x78DA,0x78EC,0x78E7,0x79A6,0x7A4D,0x7A4E, +0x7A46,0x7A4C,0x7A4B,0x7ABA,0x7BD9,0x7C11,0x7BC9,0x7BE4, +0x7BDB,0x7BE1,0x7BE9,0x7BE6,0x7CD5,0x7CD6,0x7E0A, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x7E11,0x7E08,0x7E1B,0x7E23,0x7E1E,0x7E1D,0x7E09, +0x7E10,0x7F79,0x7FB2,0x7FF0,0x7FF1,0x7FEE,0x8028,0x81B3, +0x81A9,0x81A8,0x81FB,0x8208,0x8258,0x8259,0x854A,0x8559, +0x8548,0x8568,0x8569,0x8543,0x8549,0x856D,0x856A,0x855E, +0x8783,0x879F,0x879E,0x87A2,0x878D,0x8861,0x892A,0x8932, +0x8925,0x892B,0x8921,0x89AA,0x89A6,0x8AE6,0x8AFA,0x8AEB, +0x8AF1,0x8B00,0x8ADC,0x8AE7,0x8AEE,0x8AFE,0x8B01,0x8B02, +0x8AF7,0x8AED,0x8AF3,0x8AF6,0x8AFC,0x8C6B,0x8C6D,0x8C93, +0x8CF4,0x8E44,0x8E31,0x8E34,0x8E42,0x8E39,0x8E35,0x8F3B, +0x8F2F,0x8F38,0x8F33,0x8FA8,0x8FA6,0x9075,0x9074,0x9078, +0x9072,0x907C,0x907A,0x9134,0x9192,0x9320,0x9336,0x92F8, +0x9333,0x932F,0x9322,0x92FC,0x932B,0x9304,0x931A, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9310,0x9326,0x9321,0x9315,0x932E,0x9319,0x95BB,0x96A7, +0x96A8,0x96AA,0x96D5,0x970E,0x9711,0x9716,0x970D,0x9713, +0x970F,0x975B,0x975C,0x9766,0x9798,0x9830,0x9838,0x983B, +0x9837,0x982D,0x9839,0x9824,0x9910,0x9928,0x991E,0x991B, +0x9921,0x991A,0x99ED,0x99E2,0x99F1,0x9AB8,0x9ABC,0x9AFB, +0x9AED,0x9B28,0x9B91,0x9D15,0x9D23,0x9D26,0x9D28,0x9D12, +0x9D1B,0x9ED8,0x9ED4,0x9F8D,0x9F9C,0x512A,0x511F,0x5121, +0x5132,0x52F5,0x568E,0x5680,0x5690,0x5685,0x5687, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x568F,0x58D5,0x58D3,0x58D1,0x58CE,0x5B30,0x5B2A, +0x5B24,0x5B7A,0x5C37,0x5C68,0x5DBC,0x5DBA,0x5DBD,0x5DB8, +0x5E6B,0x5F4C,0x5FBD,0x61C9,0x61C2,0x61C7,0x61E6,0x61CB, +0x6232,0x6234,0x64CE,0x64CA,0x64D8,0x64E0,0x64F0,0x64E6, +0x64EC,0x64F1,0x64E2,0x64ED,0x6582,0x6583,0x66D9,0x66D6, +0x6A80,0x6A94,0x6A84,0x6AA2,0x6A9C,0x6ADB,0x6AA3,0x6A7E, +0x6A97,0x6A90,0x6AA0,0x6B5C,0x6BAE,0x6BDA,0x6C08,0x6FD8, +0x6FF1,0x6FDF,0x6FE0,0x6FDB,0x6FE4,0x6FEB,0x6FEF,0x6F80, +0x6FEC,0x6FE1,0x6FE9,0x6FD5,0x6FEE,0x6FF0,0x71E7,0x71DF, +0x71EE,0x71E6,0x71E5,0x71ED,0x71EC,0x71F4,0x71E0,0x7235, +0x7246,0x7370,0x7372,0x74A9,0x74B0,0x74A6,0x74A8,0x7646, +0x7642,0x764C,0x76EA,0x77B3,0x77AA,0x77B0,0x77AC, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x77A7,0x77AD,0x77EF,0x78F7,0x78FA,0x78F4,0x78EF,0x7901, +0x79A7,0x79AA,0x7A57,0x7ABF,0x7C07,0x7C0D,0x7BFE,0x7BF7, +0x7C0C,0x7BE0,0x7CE0,0x7CDC,0x7CDE,0x7CE2,0x7CDF,0x7CD9, +0x7CDD,0x7E2E,0x7E3E,0x7E46,0x7E37,0x7E32,0x7E43,0x7E2B, +0x7E3D,0x7E31,0x7E45,0x7E41,0x7E34,0x7E39,0x7E48,0x7E35, +0x7E3F,0x7E2F,0x7F44,0x7FF3,0x7FFC,0x8071,0x8072,0x8070, +0x806F,0x8073,0x81C6,0x81C3,0x81BA,0x81C2,0x81C0,0x81BF, +0x81BD,0x81C9,0x81BE,0x81E8,0x8209,0x8271,0x85AA, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x8584,0x857E,0x859C,0x8591,0x8594,0x85AF,0x859B, +0x8587,0x85A8,0x858A,0x8667,0x87C0,0x87D1,0x87B3,0x87D2, +0x87C6,0x87AB,0x87BB,0x87BA,0x87C8,0x87CB,0x893B,0x8936, +0x8944,0x8938,0x893D,0x89AC,0x8B0E,0x8B17,0x8B19,0x8B1B, +0x8B0A,0x8B20,0x8B1D,0x8B04,0x8B10,0x8C41,0x8C3F,0x8C73, +0x8CFA,0x8CFD,0x8CFC,0x8CF8,0x8CFB,0x8DA8,0x8E49,0x8E4B, +0x8E48,0x8E4A,0x8F44,0x8F3E,0x8F42,0x8F45,0x8F3F,0x907F, +0x907D,0x9084,0x9081,0x9082,0x9080,0x9139,0x91A3,0x919E, +0x919C,0x934D,0x9382,0x9328,0x9375,0x934A,0x9365,0x934B, +0x9318,0x937E,0x936C,0x935B,0x9370,0x935A,0x9354,0x95CA, +0x95CB,0x95CC,0x95C8,0x95C6,0x96B1,0x96B8,0x96D6,0x971C, +0x971E,0x97A0,0x97D3,0x9846,0x98B6,0x9935,0x9A01, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x99FF,0x9BAE,0x9BAB,0x9BAA,0x9BAD,0x9D3B,0x9D3F,0x9E8B, +0x9ECF,0x9EDE,0x9EDC,0x9EDD,0x9EDB,0x9F3E,0x9F4B,0x53E2, +0x5695,0x56AE,0x58D9,0x58D8,0x5B38,0x5F5D,0x61E3,0x6233, +0x64F4,0x64F2,0x64FE,0x6506,0x64FA,0x64FB,0x64F7,0x65B7, +0x66DC,0x6726,0x6AB3,0x6AAC,0x6AC3,0x6ABB,0x6AB8,0x6AC2, +0x6AAE,0x6AAF,0x6B5F,0x6B78,0x6BAF,0x7009,0x700B,0x6FFE, +0x7006,0x6FFA,0x7011,0x700F,0x71FB,0x71FC,0x71FE,0x71F8, +0x7377,0x7375,0x74A7,0x74BF,0x7515,0x7656,0x7658, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x7652,0x77BD,0x77BF,0x77BB,0x77BC,0x790E,0x79AE, +0x7A61,0x7A62,0x7A60,0x7AC4,0x7AC5,0x7C2B,0x7C27,0x7C2A, +0x7C1E,0x7C23,0x7C21,0x7CE7,0x7E54,0x7E55,0x7E5E,0x7E5A, +0x7E61,0x7E52,0x7E59,0x7F48,0x7FF9,0x7FFB,0x8077,0x8076, +0x81CD,0x81CF,0x820A,0x85CF,0x85A9,0x85CD,0x85D0,0x85C9, +0x85B0,0x85BA,0x85B9,0x85A6,0x87EF,0x87EC,0x87F2,0x87E0, +0x8986,0x89B2,0x89F4,0x8B28,0x8B39,0x8B2C,0x8B2B,0x8C50, +0x8D05,0x8E59,0x8E63,0x8E66,0x8E64,0x8E5F,0x8E55,0x8EC0, +0x8F49,0x8F4D,0x9087,0x9083,0x9088,0x91AB,0x91AC,0x91D0, +0x9394,0x938A,0x9396,0x93A2,0x93B3,0x93AE,0x93AC,0x93B0, +0x9398,0x939A,0x9397,0x95D4,0x95D6,0x95D0,0x95D5,0x96E2, +0x96DC,0x96D9,0x96DB,0x96DE,0x9724,0x97A3,0x97A6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x97AD,0x97F9,0x984D,0x984F,0x984C,0x984E,0x9853,0x98BA, +0x993E,0x993F,0x993D,0x992E,0x99A5,0x9A0E,0x9AC1,0x9B03, +0x9B06,0x9B4F,0x9B4E,0x9B4D,0x9BCA,0x9BC9,0x9BFD,0x9BC8, +0x9BC0,0x9D51,0x9D5D,0x9D60,0x9EE0,0x9F15,0x9F2C,0x5133, +0x56A5,0x58DE,0x58DF,0x58E2,0x5BF5,0x9F90,0x5EEC,0x61F2, +0x61F7,0x61F6,0x61F5,0x6500,0x650F,0x66E0,0x66DD,0x6AE5, +0x6ADD,0x6ADA,0x6AD3,0x701B,0x701F,0x7028,0x701A,0x701D, +0x7015,0x7018,0x7206,0x720D,0x7258,0x72A2,0x7378, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x737A,0x74BD,0x74CA,0x74E3,0x7587,0x7586,0x765F, +0x7661,0x77C7,0x7919,0x79B1,0x7A6B,0x7A69,0x7C3E,0x7C3F, +0x7C38,0x7C3D,0x7C37,0x7C40,0x7E6B,0x7E6D,0x7E79,0x7E69, +0x7E6A,0x7F85,0x7E73,0x7FB6,0x7FB9,0x7FB8,0x81D8,0x85E9, +0x85DD,0x85EA,0x85D5,0x85E4,0x85E5,0x85F7,0x87FB,0x8805, +0x880D,0x87F9,0x87FE,0x8960,0x895F,0x8956,0x895E,0x8B41, +0x8B5C,0x8B58,0x8B49,0x8B5A,0x8B4E,0x8B4F,0x8B46,0x8B59, +0x8D08,0x8D0A,0x8E7C,0x8E72,0x8E87,0x8E76,0x8E6C,0x8E7A, +0x8E74,0x8F54,0x8F4E,0x8FAD,0x908A,0x908B,0x91B1,0x91AE, +0x93E1,0x93D1,0x93DF,0x93C3,0x93C8,0x93DC,0x93DD,0x93D6, +0x93E2,0x93CD,0x93D8,0x93E4,0x93D7,0x93E8,0x95DC,0x96B4, +0x96E3,0x972A,0x9727,0x9761,0x97DC,0x97FB,0x985E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9858,0x985B,0x98BC,0x9945,0x9949,0x9A16,0x9A19,0x9B0D, +0x9BE8,0x9BE7,0x9BD6,0x9BDB,0x9D89,0x9D61,0x9D72,0x9D6A, +0x9D6C,0x9E92,0x9E97,0x9E93,0x9EB4,0x52F8,0x56A8,0x56B7, +0x56B6,0x56B4,0x56BC,0x58E4,0x5B40,0x5B43,0x5B7D,0x5BF6, +0x5DC9,0x61F8,0x61FA,0x6518,0x6514,0x6519,0x66E6,0x6727, +0x6AEC,0x703E,0x7030,0x7032,0x7210,0x737B,0x74CF,0x7662, +0x7665,0x7926,0x792A,0x792C,0x792B,0x7AC7,0x7AF6,0x7C4C, +0x7C43,0x7C4D,0x7CEF,0x7CF0,0x8FAE,0x7E7D,0x7E7C, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x7E82,0x7F4C,0x8000,0x81DA,0x8266,0x85FB,0x85F9, +0x8611,0x85FA,0x8606,0x860B,0x8607,0x860A,0x8814,0x8815, +0x8964,0x89BA,0x89F8,0x8B70,0x8B6C,0x8B66,0x8B6F,0x8B5F, +0x8B6B,0x8D0F,0x8D0D,0x8E89,0x8E81,0x8E85,0x8E82,0x91B4, +0x91CB,0x9418,0x9403,0x93FD,0x95E1,0x9730,0x98C4,0x9952, +0x9951,0x99A8,0x9A2B,0x9A30,0x9A37,0x9A35,0x9C13,0x9C0D, +0x9E79,0x9EB5,0x9EE8,0x9F2F,0x9F5F,0x9F63,0x9F61,0x5137, +0x5138,0x56C1,0x56C0,0x56C2,0x5914,0x5C6C,0x5DCD,0x61FC, +0x61FE,0x651D,0x651C,0x6595,0x66E9,0x6AFB,0x6B04,0x6AFA, +0x6BB2,0x704C,0x721B,0x72A7,0x74D6,0x74D4,0x7669,0x77D3, +0x7C50,0x7E8F,0x7E8C,0x7FBC,0x8617,0x862D,0x861A,0x8823, +0x8822,0x8821,0x881F,0x896A,0x896C,0x89BD,0x8B74, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8B77,0x8B7D,0x8D13,0x8E8A,0x8E8D,0x8E8B,0x8F5F,0x8FAF, +0x91BA,0x942E,0x9433,0x9435,0x943A,0x9438,0x9432,0x942B, +0x95E2,0x9738,0x9739,0x9732,0x97FF,0x9867,0x9865,0x9957, +0x9A45,0x9A43,0x9A40,0x9A3E,0x9ACF,0x9B54,0x9B51,0x9C2D, +0x9C25,0x9DAF,0x9DB4,0x9DC2,0x9DB8,0x9E9D,0x9EEF,0x9F19, +0x9F5C,0x9F66,0x9F67,0x513C,0x513B,0x56C8,0x56CA,0x56C9, +0x5B7F,0x5DD4,0x5DD2,0x5F4E,0x61FF,0x6524,0x6B0A,0x6B61, +0x7051,0x7058,0x7380,0x74E4,0x758A,0x766E,0x766C, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x79B3,0x7C60,0x7C5F,0x807E,0x807D,0x81DF,0x8972, +0x896F,0x89FC,0x8B80,0x8D16,0x8D17,0x8E91,0x8E93,0x8F61, +0x9148,0x9444,0x9451,0x9452,0x973D,0x973E,0x97C3,0x97C1, +0x986B,0x9955,0x9A55,0x9A4D,0x9AD2,0x9B1A,0x9C49,0x9C31, +0x9C3E,0x9C3B,0x9DD3,0x9DD7,0x9F34,0x9F6C,0x9F6A,0x9F94, +0x56CC,0x5DD6,0x6200,0x6523,0x652B,0x652A,0x66EC,0x6B10, +0x74DA,0x7ACA,0x7C64,0x7C63,0x7C65,0x7E93,0x7E96,0x7E94, +0x81E2,0x8638,0x863F,0x8831,0x8B8A,0x9090,0x908F,0x9463, +0x9460,0x9464,0x9768,0x986F,0x995C,0x9A5A,0x9A5B,0x9A57, +0x9AD3,0x9AD4,0x9AD1,0x9C54,0x9C57,0x9C56,0x9DE5,0x9E9F, +0x9EF4,0x56D1,0x58E9,0x652C,0x705E,0x7671,0x7672,0x77D7, +0x7F50,0x7F88,0x8836,0x8839,0x8862,0x8B93,0x8B92, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8B96,0x8277,0x8D1B,0x91C0,0x946A,0x9742,0x9748,0x9744, +0x97C6,0x9870,0x9A5F,0x9B22,0x9B58,0x9C5F,0x9DF9,0x9DFA, +0x9E7C,0x9E7D,0x9F07,0x9F77,0x9F72,0x5EF3,0x6B16,0x7063, +0x7C6C,0x7C6E,0x883B,0x89C0,0x8EA1,0x91C1,0x9472,0x9470, +0x9871,0x995E,0x9AD6,0x9B23,0x9ECC,0x7064,0x77DA,0x8B9A, +0x9477,0x97C9,0x9A62,0x9A65,0x7E9C,0x8B9C,0x8EAA,0x91C5, +0x947D,0x947E,0x947C,0x9C77,0x9C78,0x9EF7,0x8C54,0x947F, +0x9E1A,0x7228,0x9A6A,0x9B31,0x9E1B,0x9E1E,0x7C72, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x30FE,0x309D,0x309E,0x3005,0x3041,0x3042,0x3043, +0x3044,0x3045,0x3046,0x3047,0x3048,0x3049,0x304A,0x304B, +0x304C,0x304D,0x304E,0x304F,0x3050,0x3051,0x3052,0x3053, +0x3054,0x3055,0x3056,0x3057,0x3058,0x3059,0x305A,0x305B, +0x305C,0x305D,0x305E,0x305F,0x3060,0x3061,0x3062,0x3063, +0x3064,0x3065,0x3066,0x3067,0x3068,0x3069,0x306A,0x306B, +0x306C,0x306D,0x306E,0x306F,0x3070,0x3071,0x3072,0x3073, +0x3074,0x3075,0x3076,0x3077,0x3078,0x3079,0x307A,0x307B, +0x307C,0x307D,0x307E,0x307F,0x3080,0x3081,0x3082,0x3083, +0x3084,0x3085,0x3086,0x3087,0x3088,0x3089,0x308A,0x308B, +0x308C,0x308D,0x308E,0x308F,0x3090,0x3091,0x3092,0x3093, +0x30A1,0x30A2,0x30A3,0x30A4,0x30A5,0x30A6,0x30A7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x30A8,0x30A9,0x30AA,0x30AB,0x30AC,0x30AD,0x30AE,0x30AF, +0x30B0,0x30B1,0x30B2,0x30B3,0x30B4,0x30B5,0x30B6,0x30B7, +0x30B8,0x30B9,0x30BA,0x30BB,0x30BC,0x30BD,0x30BE,0x30BF, +0x30C0,0x30C1,0x30C2,0x30C3,0x30C4,0x30C5,0x30C6,0x30C7, +0x30C8,0x30C9,0x30CA,0x30CB,0x30CC,0x30CD,0x30CE,0x30CF, +0x30D0,0x30D1,0x30D2,0x30D3,0x30D4,0x30D5,0x30D6,0x30D7, +0x30D8,0x30D9,0x30DA,0x30DB,0x30DC,0x30DD,0x30DE,0x30DF, +0x30E0,0x30E1,0x30E2,0x30E3,0x30E4,0x30E5,0x30E6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x30E7,0x30E8,0x30E9,0x30EA,0x30EB,0x30EC,0x30ED, +0x30EE,0x30EF,0x30F0,0x30F1,0x30F2,0x30F3,0x30F4,0x30F5, +0x30F6,0x0414,0x0415,0x0401,0x0416,0x0417,0x0418,0x0419, +0x041A,0x041B,0x041C,0x0423,0x0424,0x0425,0x0426,0x0427, +0x0428,0x0429,0x042A,0x042B,0x042C,0x042D,0x042E,0x042F, +0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0451,0x0436, +0x0437,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E, +0x043F,0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446, +0x0447,0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E, +0x044F,0x2460,0x2461,0x2462,0x2463,0x2464,0x2465,0x2466, +0x2467,0x2468,0x2469,0x2474,0x2475,0x2476,0x2477,0x2478, +0x2479,0x247A,0x247B,0x247C,0x247D}; + +/* page 1 0xC940-0xF9D5 */ +static uint16 tab_big5_uni1[]={ +0x4E42,0x4E5C,0x51F5,0x531A,0x5382,0x4E07,0x4E0C,0x4E47, +0x4E8D,0x56D7,0xFA0C,0x5C6E,0x5F73,0x4E0F,0x5187,0x4E0E, +0x4E2E,0x4E93,0x4EC2,0x4EC9,0x4EC8,0x5198,0x52FC,0x536C, +0x53B9,0x5720,0x5903,0x592C,0x5C10,0x5DFF,0x65E1,0x6BB3, +0x6BCC,0x6C14,0x723F,0x4E31,0x4E3C,0x4EE8,0x4EDC,0x4EE9, +0x4EE1,0x4EDD,0x4EDA,0x520C,0x531C,0x534C,0x5722,0x5723, +0x5917,0x592F,0x5B81,0x5B84,0x5C12,0x5C3B,0x5C74,0x5C73, +0x5E04,0x5E80,0x5E82,0x5FC9,0x6209,0x6250,0x6C15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6C36,0x6C43,0x6C3F,0x6C3B,0x72AE,0x72B0,0x738A, +0x79B8,0x808A,0x961E,0x4F0E,0x4F18,0x4F2C,0x4EF5,0x4F14, +0x4EF1,0x4F00,0x4EF7,0x4F08,0x4F1D,0x4F02,0x4F05,0x4F22, +0x4F13,0x4F04,0x4EF4,0x4F12,0x51B1,0x5213,0x5209,0x5210, +0x52A6,0x5322,0x531F,0x534D,0x538A,0x5407,0x56E1,0x56DF, +0x572E,0x572A,0x5734,0x593C,0x5980,0x597C,0x5985,0x597B, +0x597E,0x5977,0x597F,0x5B56,0x5C15,0x5C25,0x5C7C,0x5C7A, +0x5C7B,0x5C7E,0x5DDF,0x5E75,0x5E84,0x5F02,0x5F1A,0x5F74, +0x5FD5,0x5FD4,0x5FCF,0x625C,0x625E,0x6264,0x6261,0x6266, +0x6262,0x6259,0x6260,0x625A,0x6265,0x65EF,0x65EE,0x673E, +0x6739,0x6738,0x673B,0x673A,0x673F,0x673C,0x6733,0x6C18, +0x6C46,0x6C52,0x6C5C,0x6C4F,0x6C4A,0x6C54,0x6C4B, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6C4C,0x7071,0x725E,0x72B4,0x72B5,0x738E,0x752A,0x767F, +0x7A75,0x7F51,0x8278,0x827C,0x8280,0x827D,0x827F,0x864D, +0x897E,0x9099,0x9097,0x9098,0x909B,0x9094,0x9622,0x9624, +0x9620,0x9623,0x4F56,0x4F3B,0x4F62,0x4F49,0x4F53,0x4F64, +0x4F3E,0x4F67,0x4F52,0x4F5F,0x4F41,0x4F58,0x4F2D,0x4F33, +0x4F3F,0x4F61,0x518F,0x51B9,0x521C,0x521E,0x5221,0x52AD, +0x52AE,0x5309,0x5363,0x5372,0x538E,0x538F,0x5430,0x5437, +0x542A,0x5454,0x5445,0x5419,0x541C,0x5425,0x5418, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x543D,0x544F,0x5441,0x5428,0x5424,0x5447,0x56EE, +0x56E7,0x56E5,0x5741,0x5745,0x574C,0x5749,0x574B,0x5752, +0x5906,0x5940,0x59A6,0x5998,0x59A0,0x5997,0x598E,0x59A2, +0x5990,0x598F,0x59A7,0x59A1,0x5B8E,0x5B92,0x5C28,0x5C2A, +0x5C8D,0x5C8F,0x5C88,0x5C8B,0x5C89,0x5C92,0x5C8A,0x5C86, +0x5C93,0x5C95,0x5DE0,0x5E0A,0x5E0E,0x5E8B,0x5E89,0x5E8C, +0x5E88,0x5E8D,0x5F05,0x5F1D,0x5F78,0x5F76,0x5FD2,0x5FD1, +0x5FD0,0x5FED,0x5FE8,0x5FEE,0x5FF3,0x5FE1,0x5FE4,0x5FE3, +0x5FFA,0x5FEF,0x5FF7,0x5FFB,0x6000,0x5FF4,0x623A,0x6283, +0x628C,0x628E,0x628F,0x6294,0x6287,0x6271,0x627B,0x627A, +0x6270,0x6281,0x6288,0x6277,0x627D,0x6272,0x6274,0x6537, +0x65F0,0x65F4,0x65F3,0x65F2,0x65F5,0x6745,0x6747, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6759,0x6755,0x674C,0x6748,0x675D,0x674D,0x675A,0x674B, +0x6BD0,0x6C19,0x6C1A,0x6C78,0x6C67,0x6C6B,0x6C84,0x6C8B, +0x6C8F,0x6C71,0x6C6F,0x6C69,0x6C9A,0x6C6D,0x6C87,0x6C95, +0x6C9C,0x6C66,0x6C73,0x6C65,0x6C7B,0x6C8E,0x7074,0x707A, +0x7263,0x72BF,0x72BD,0x72C3,0x72C6,0x72C1,0x72BA,0x72C5, +0x7395,0x7397,0x7393,0x7394,0x7392,0x753A,0x7539,0x7594, +0x7595,0x7681,0x793D,0x8034,0x8095,0x8099,0x8090,0x8092, +0x809C,0x8290,0x828F,0x8285,0x828E,0x8291,0x8293, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x828A,0x8283,0x8284,0x8C78,0x8FC9,0x8FBF,0x909F, +0x90A1,0x90A5,0x909E,0x90A7,0x90A0,0x9630,0x9628,0x962F, +0x962D,0x4E33,0x4F98,0x4F7C,0x4F85,0x4F7D,0x4F80,0x4F87, +0x4F76,0x4F74,0x4F89,0x4F84,0x4F77,0x4F4C,0x4F97,0x4F6A, +0x4F9A,0x4F79,0x4F81,0x4F78,0x4F90,0x4F9C,0x4F94,0x4F9E, +0x4F92,0x4F82,0x4F95,0x4F6B,0x4F6E,0x519E,0x51BC,0x51BE, +0x5235,0x5232,0x5233,0x5246,0x5231,0x52BC,0x530A,0x530B, +0x533C,0x5392,0x5394,0x5487,0x547F,0x5481,0x5491,0x5482, +0x5488,0x546B,0x547A,0x547E,0x5465,0x546C,0x5474,0x5466, +0x548D,0x546F,0x5461,0x5460,0x5498,0x5463,0x5467,0x5464, +0x56F7,0x56F9,0x576F,0x5772,0x576D,0x576B,0x5771,0x5770, +0x5776,0x5780,0x5775,0x577B,0x5773,0x5774,0x5762, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5768,0x577D,0x590C,0x5945,0x59B5,0x59BA,0x59CF,0x59CE, +0x59B2,0x59CC,0x59C1,0x59B6,0x59BC,0x59C3,0x59D6,0x59B1, +0x59BD,0x59C0,0x59C8,0x59B4,0x59C7,0x5B62,0x5B65,0x5B93, +0x5B95,0x5C44,0x5C47,0x5CAE,0x5CA4,0x5CA0,0x5CB5,0x5CAF, +0x5CA8,0x5CAC,0x5C9F,0x5CA3,0x5CAD,0x5CA2,0x5CAA,0x5CA7, +0x5C9D,0x5CA5,0x5CB6,0x5CB0,0x5CA6,0x5E17,0x5E14,0x5E19, +0x5F28,0x5F22,0x5F23,0x5F24,0x5F54,0x5F82,0x5F7E,0x5F7D, +0x5FDE,0x5FE5,0x602D,0x6026,0x6019,0x6032,0x600B, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6034,0x600A,0x6017,0x6033,0x601A,0x601E,0x602C, +0x6022,0x600D,0x6010,0x602E,0x6013,0x6011,0x600C,0x6009, +0x601C,0x6214,0x623D,0x62AD,0x62B4,0x62D1,0x62BE,0x62AA, +0x62B6,0x62CA,0x62AE,0x62B3,0x62AF,0x62BB,0x62A9,0x62B0, +0x62B8,0x653D,0x65A8,0x65BB,0x6609,0x65FC,0x6604,0x6612, +0x6608,0x65FB,0x6603,0x660B,0x660D,0x6605,0x65FD,0x6611, +0x6610,0x66F6,0x670A,0x6785,0x676C,0x678E,0x6792,0x6776, +0x677B,0x6798,0x6786,0x6784,0x6774,0x678D,0x678C,0x677A, +0x679F,0x6791,0x6799,0x6783,0x677D,0x6781,0x6778,0x6779, +0x6794,0x6B25,0x6B80,0x6B7E,0x6BDE,0x6C1D,0x6C93,0x6CEC, +0x6CEB,0x6CEE,0x6CD9,0x6CB6,0x6CD4,0x6CAD,0x6CE7,0x6CB7, +0x6CD0,0x6CC2,0x6CBA,0x6CC3,0x6CC6,0x6CED,0x6CF2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6CD2,0x6CDD,0x6CB4,0x6C8A,0x6C9D,0x6C80,0x6CDE,0x6CC0, +0x6D30,0x6CCD,0x6CC7,0x6CB0,0x6CF9,0x6CCF,0x6CE9,0x6CD1, +0x7094,0x7098,0x7085,0x7093,0x7086,0x7084,0x7091,0x7096, +0x7082,0x709A,0x7083,0x726A,0x72D6,0x72CB,0x72D8,0x72C9, +0x72DC,0x72D2,0x72D4,0x72DA,0x72CC,0x72D1,0x73A4,0x73A1, +0x73AD,0x73A6,0x73A2,0x73A0,0x73AC,0x739D,0x74DD,0x74E8, +0x753F,0x7540,0x753E,0x758C,0x7598,0x76AF,0x76F3,0x76F1, +0x76F0,0x76F5,0x77F8,0x77FC,0x77F9,0x77FB,0x77FA, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x77F7,0x7942,0x793F,0x79C5,0x7A78,0x7A7B,0x7AFB, +0x7C75,0x7CFD,0x8035,0x808F,0x80AE,0x80A3,0x80B8,0x80B5, +0x80AD,0x8220,0x82A0,0x82C0,0x82AB,0x829A,0x8298,0x829B, +0x82B5,0x82A7,0x82AE,0x82BC,0x829E,0x82BA,0x82B4,0x82A8, +0x82A1,0x82A9,0x82C2,0x82A4,0x82C3,0x82B6,0x82A2,0x8670, +0x866F,0x866D,0x866E,0x8C56,0x8FD2,0x8FCB,0x8FD3,0x8FCD, +0x8FD6,0x8FD5,0x8FD7,0x90B2,0x90B4,0x90AF,0x90B3,0x90B0, +0x9639,0x963D,0x963C,0x963A,0x9643,0x4FCD,0x4FC5,0x4FD3, +0x4FB2,0x4FC9,0x4FCB,0x4FC1,0x4FD4,0x4FDC,0x4FD9,0x4FBB, +0x4FB3,0x4FDB,0x4FC7,0x4FD6,0x4FBA,0x4FC0,0x4FB9,0x4FEC, +0x5244,0x5249,0x52C0,0x52C2,0x533D,0x537C,0x5397,0x5396, +0x5399,0x5398,0x54BA,0x54A1,0x54AD,0x54A5,0x54CF, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x54C3,0x830D,0x54B7,0x54AE,0x54D6,0x54B6,0x54C5,0x54C6, +0x54A0,0x5470,0x54BC,0x54A2,0x54BE,0x5472,0x54DE,0x54B0, +0x57B5,0x579E,0x579F,0x57A4,0x578C,0x5797,0x579D,0x579B, +0x5794,0x5798,0x578F,0x5799,0x57A5,0x579A,0x5795,0x58F4, +0x590D,0x5953,0x59E1,0x59DE,0x59EE,0x5A00,0x59F1,0x59DD, +0x59FA,0x59FD,0x59FC,0x59F6,0x59E4,0x59F2,0x59F7,0x59DB, +0x59E9,0x59F3,0x59F5,0x59E0,0x59FE,0x59F4,0x59ED,0x5BA8, +0x5C4C,0x5CD0,0x5CD8,0x5CCC,0x5CD7,0x5CCB,0x5CDB, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5CDE,0x5CDA,0x5CC9,0x5CC7,0x5CCA,0x5CD6,0x5CD3, +0x5CD4,0x5CCF,0x5CC8,0x5CC6,0x5CCE,0x5CDF,0x5CF8,0x5DF9, +0x5E21,0x5E22,0x5E23,0x5E20,0x5E24,0x5EB0,0x5EA4,0x5EA2, +0x5E9B,0x5EA3,0x5EA5,0x5F07,0x5F2E,0x5F56,0x5F86,0x6037, +0x6039,0x6054,0x6072,0x605E,0x6045,0x6053,0x6047,0x6049, +0x605B,0x604C,0x6040,0x6042,0x605F,0x6024,0x6044,0x6058, +0x6066,0x606E,0x6242,0x6243,0x62CF,0x630D,0x630B,0x62F5, +0x630E,0x6303,0x62EB,0x62F9,0x630F,0x630C,0x62F8,0x62F6, +0x6300,0x6313,0x6314,0x62FA,0x6315,0x62FB,0x62F0,0x6541, +0x6543,0x65AA,0x65BF,0x6636,0x6621,0x6632,0x6635,0x661C, +0x6626,0x6622,0x6633,0x662B,0x663A,0x661D,0x6634,0x6639, +0x662E,0x670F,0x6710,0x67C1,0x67F2,0x67C8,0x67BA, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x67DC,0x67BB,0x67F8,0x67D8,0x67C0,0x67B7,0x67C5,0x67EB, +0x67E4,0x67DF,0x67B5,0x67CD,0x67B3,0x67F7,0x67F6,0x67EE, +0x67E3,0x67C2,0x67B9,0x67CE,0x67E7,0x67F0,0x67B2,0x67FC, +0x67C6,0x67ED,0x67CC,0x67AE,0x67E6,0x67DB,0x67FA,0x67C9, +0x67CA,0x67C3,0x67EA,0x67CB,0x6B28,0x6B82,0x6B84,0x6BB6, +0x6BD6,0x6BD8,0x6BE0,0x6C20,0x6C21,0x6D28,0x6D34,0x6D2D, +0x6D1F,0x6D3C,0x6D3F,0x6D12,0x6D0A,0x6CDA,0x6D33,0x6D04, +0x6D19,0x6D3A,0x6D1A,0x6D11,0x6D00,0x6D1D,0x6D42, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6D01,0x6D18,0x6D37,0x6D03,0x6D0F,0x6D40,0x6D07, +0x6D20,0x6D2C,0x6D08,0x6D22,0x6D09,0x6D10,0x70B7,0x709F, +0x70BE,0x70B1,0x70B0,0x70A1,0x70B4,0x70B5,0x70A9,0x7241, +0x7249,0x724A,0x726C,0x7270,0x7273,0x726E,0x72CA,0x72E4, +0x72E8,0x72EB,0x72DF,0x72EA,0x72E6,0x72E3,0x7385,0x73CC, +0x73C2,0x73C8,0x73C5,0x73B9,0x73B6,0x73B5,0x73B4,0x73EB, +0x73BF,0x73C7,0x73BE,0x73C3,0x73C6,0x73B8,0x73CB,0x74EC, +0x74EE,0x752E,0x7547,0x7548,0x75A7,0x75AA,0x7679,0x76C4, +0x7708,0x7703,0x7704,0x7705,0x770A,0x76F7,0x76FB,0x76FA, +0x77E7,0x77E8,0x7806,0x7811,0x7812,0x7805,0x7810,0x780F, +0x780E,0x7809,0x7803,0x7813,0x794A,0x794C,0x794B,0x7945, +0x7944,0x79D5,0x79CD,0x79CF,0x79D6,0x79CE,0x7A80, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7A7E,0x7AD1,0x7B00,0x7B01,0x7C7A,0x7C78,0x7C79,0x7C7F, +0x7C80,0x7C81,0x7D03,0x7D08,0x7D01,0x7F58,0x7F91,0x7F8D, +0x7FBE,0x8007,0x800E,0x800F,0x8014,0x8037,0x80D8,0x80C7, +0x80E0,0x80D1,0x80C8,0x80C2,0x80D0,0x80C5,0x80E3,0x80D9, +0x80DC,0x80CA,0x80D5,0x80C9,0x80CF,0x80D7,0x80E6,0x80CD, +0x81FF,0x8221,0x8294,0x82D9,0x82FE,0x82F9,0x8307,0x82E8, +0x8300,0x82D5,0x833A,0x82EB,0x82D6,0x82F4,0x82EC,0x82E1, +0x82F2,0x82F5,0x830C,0x82FB,0x82F6,0x82F0,0x82EA, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x82E4,0x82E0,0x82FA,0x82F3,0x82ED,0x8677,0x8674, +0x867C,0x8673,0x8841,0x884E,0x8867,0x886A,0x8869,0x89D3, +0x8A04,0x8A07,0x8D72,0x8FE3,0x8FE1,0x8FEE,0x8FE0,0x90F1, +0x90BD,0x90BF,0x90D5,0x90C5,0x90BE,0x90C7,0x90CB,0x90C8, +0x91D4,0x91D3,0x9654,0x964F,0x9651,0x9653,0x964A,0x964E, +0x501E,0x5005,0x5007,0x5013,0x5022,0x5030,0x501B,0x4FF5, +0x4FF4,0x5033,0x5037,0x502C,0x4FF6,0x4FF7,0x5017,0x501C, +0x5020,0x5027,0x5035,0x502F,0x5031,0x500E,0x515A,0x5194, +0x5193,0x51CA,0x51C4,0x51C5,0x51C8,0x51CE,0x5261,0x525A, +0x5252,0x525E,0x525F,0x5255,0x5262,0x52CD,0x530E,0x539E, +0x5526,0x54E2,0x5517,0x5512,0x54E7,0x54F3,0x54E4,0x551A, +0x54FF,0x5504,0x5508,0x54EB,0x5511,0x5505,0x54F1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x550A,0x54FB,0x54F7,0x54F8,0x54E0,0x550E,0x5503,0x550B, +0x5701,0x5702,0x57CC,0x5832,0x57D5,0x57D2,0x57BA,0x57C6, +0x57BD,0x57BC,0x57B8,0x57B6,0x57BF,0x57C7,0x57D0,0x57B9, +0x57C1,0x590E,0x594A,0x5A19,0x5A16,0x5A2D,0x5A2E,0x5A15, +0x5A0F,0x5A17,0x5A0A,0x5A1E,0x5A33,0x5B6C,0x5BA7,0x5BAD, +0x5BAC,0x5C03,0x5C56,0x5C54,0x5CEC,0x5CFF,0x5CEE,0x5CF1, +0x5CF7,0x5D00,0x5CF9,0x5E29,0x5E28,0x5EA8,0x5EAE,0x5EAA, +0x5EAC,0x5F33,0x5F30,0x5F67,0x605D,0x605A,0x6067, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6041,0x60A2,0x6088,0x6080,0x6092,0x6081,0x609D, +0x6083,0x6095,0x609B,0x6097,0x6087,0x609C,0x608E,0x6219, +0x6246,0x62F2,0x6310,0x6356,0x632C,0x6344,0x6345,0x6336, +0x6343,0x63E4,0x6339,0x634B,0x634A,0x633C,0x6329,0x6341, +0x6334,0x6358,0x6354,0x6359,0x632D,0x6347,0x6333,0x635A, +0x6351,0x6338,0x6357,0x6340,0x6348,0x654A,0x6546,0x65C6, +0x65C3,0x65C4,0x65C2,0x664A,0x665F,0x6647,0x6651,0x6712, +0x6713,0x681F,0x681A,0x6849,0x6832,0x6833,0x683B,0x684B, +0x684F,0x6816,0x6831,0x681C,0x6835,0x682B,0x682D,0x682F, +0x684E,0x6844,0x6834,0x681D,0x6812,0x6814,0x6826,0x6828, +0x682E,0x684D,0x683A,0x6825,0x6820,0x6B2C,0x6B2F,0x6B2D, +0x6B31,0x6B34,0x6B6D,0x8082,0x6B88,0x6BE6,0x6BE4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6BE8,0x6BE3,0x6BE2,0x6BE7,0x6C25,0x6D7A,0x6D63,0x6D64, +0x6D76,0x6D0D,0x6D61,0x6D92,0x6D58,0x6D62,0x6D6D,0x6D6F, +0x6D91,0x6D8D,0x6DEF,0x6D7F,0x6D86,0x6D5E,0x6D67,0x6D60, +0x6D97,0x6D70,0x6D7C,0x6D5F,0x6D82,0x6D98,0x6D2F,0x6D68, +0x6D8B,0x6D7E,0x6D80,0x6D84,0x6D16,0x6D83,0x6D7B,0x6D7D, +0x6D75,0x6D90,0x70DC,0x70D3,0x70D1,0x70DD,0x70CB,0x7F39, +0x70E2,0x70D7,0x70D2,0x70DE,0x70E0,0x70D4,0x70CD,0x70C5, +0x70C6,0x70C7,0x70DA,0x70CE,0x70E1,0x7242,0x7278, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x7277,0x7276,0x7300,0x72FA,0x72F4,0x72FE,0x72F6, +0x72F3,0x72FB,0x7301,0x73D3,0x73D9,0x73E5,0x73D6,0x73BC, +0x73E7,0x73E3,0x73E9,0x73DC,0x73D2,0x73DB,0x73D4,0x73DD, +0x73DA,0x73D7,0x73D8,0x73E8,0x74DE,0x74DF,0x74F4,0x74F5, +0x7521,0x755B,0x755F,0x75B0,0x75C1,0x75BB,0x75C4,0x75C0, +0x75BF,0x75B6,0x75BA,0x768A,0x76C9,0x771D,0x771B,0x7710, +0x7713,0x7712,0x7723,0x7711,0x7715,0x7719,0x771A,0x7722, +0x7727,0x7823,0x782C,0x7822,0x7835,0x782F,0x7828,0x782E, +0x782B,0x7821,0x7829,0x7833,0x782A,0x7831,0x7954,0x795B, +0x794F,0x795C,0x7953,0x7952,0x7951,0x79EB,0x79EC,0x79E0, +0x79EE,0x79ED,0x79EA,0x79DC,0x79DE,0x79DD,0x7A86,0x7A89, +0x7A85,0x7A8B,0x7A8C,0x7A8A,0x7A87,0x7AD8,0x7B10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7B04,0x7B13,0x7B05,0x7B0F,0x7B08,0x7B0A,0x7B0E,0x7B09, +0x7B12,0x7C84,0x7C91,0x7C8A,0x7C8C,0x7C88,0x7C8D,0x7C85, +0x7D1E,0x7D1D,0x7D11,0x7D0E,0x7D18,0x7D16,0x7D13,0x7D1F, +0x7D12,0x7D0F,0x7D0C,0x7F5C,0x7F61,0x7F5E,0x7F60,0x7F5D, +0x7F5B,0x7F96,0x7F92,0x7FC3,0x7FC2,0x7FC0,0x8016,0x803E, +0x8039,0x80FA,0x80F2,0x80F9,0x80F5,0x8101,0x80FB,0x8100, +0x8201,0x822F,0x8225,0x8333,0x832D,0x8344,0x8319,0x8351, +0x8325,0x8356,0x833F,0x8341,0x8326,0x831C,0x8322, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x8342,0x834E,0x831B,0x832A,0x8308,0x833C,0x834D, +0x8316,0x8324,0x8320,0x8337,0x832F,0x8329,0x8347,0x8345, +0x834C,0x8353,0x831E,0x832C,0x834B,0x8327,0x8348,0x8653, +0x8652,0x86A2,0x86A8,0x8696,0x868D,0x8691,0x869E,0x8687, +0x8697,0x8686,0x868B,0x869A,0x8685,0x86A5,0x8699,0x86A1, +0x86A7,0x8695,0x8698,0x868E,0x869D,0x8690,0x8694,0x8843, +0x8844,0x886D,0x8875,0x8876,0x8872,0x8880,0x8871,0x887F, +0x886F,0x8883,0x887E,0x8874,0x887C,0x8A12,0x8C47,0x8C57, +0x8C7B,0x8CA4,0x8CA3,0x8D76,0x8D78,0x8DB5,0x8DB7,0x8DB6, +0x8ED1,0x8ED3,0x8FFE,0x8FF5,0x9002,0x8FFF,0x8FFB,0x9004, +0x8FFC,0x8FF6,0x90D6,0x90E0,0x90D9,0x90DA,0x90E3,0x90DF, +0x90E5,0x90D8,0x90DB,0x90D7,0x90DC,0x90E4,0x9150, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x914E,0x914F,0x91D5,0x91E2,0x91DA,0x965C,0x965F,0x96BC, +0x98E3,0x9ADF,0x9B2F,0x4E7F,0x5070,0x506A,0x5061,0x505E, +0x5060,0x5053,0x504B,0x505D,0x5072,0x5048,0x504D,0x5041, +0x505B,0x504A,0x5062,0x5015,0x5045,0x505F,0x5069,0x506B, +0x5063,0x5064,0x5046,0x5040,0x506E,0x5073,0x5057,0x5051, +0x51D0,0x526B,0x526D,0x526C,0x526E,0x52D6,0x52D3,0x532D, +0x539C,0x5575,0x5576,0x553C,0x554D,0x5550,0x5534,0x552A, +0x5551,0x5562,0x5536,0x5535,0x5530,0x5552,0x5545, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x550C,0x5532,0x5565,0x554E,0x5539,0x5548,0x552D, +0x553B,0x5540,0x554B,0x570A,0x5707,0x57FB,0x5814,0x57E2, +0x57F6,0x57DC,0x57F4,0x5800,0x57ED,0x57FD,0x5808,0x57F8, +0x580B,0x57F3,0x57CF,0x5807,0x57EE,0x57E3,0x57F2,0x57E5, +0x57EC,0x57E1,0x580E,0x57FC,0x5810,0x57E7,0x5801,0x580C, +0x57F1,0x57E9,0x57F0,0x580D,0x5804,0x595C,0x5A60,0x5A58, +0x5A55,0x5A67,0x5A5E,0x5A38,0x5A35,0x5A6D,0x5A50,0x5A5F, +0x5A65,0x5A6C,0x5A53,0x5A64,0x5A57,0x5A43,0x5A5D,0x5A52, +0x5A44,0x5A5B,0x5A48,0x5A8E,0x5A3E,0x5A4D,0x5A39,0x5A4C, +0x5A70,0x5A69,0x5A47,0x5A51,0x5A56,0x5A42,0x5A5C,0x5B72, +0x5B6E,0x5BC1,0x5BC0,0x5C59,0x5D1E,0x5D0B,0x5D1D,0x5D1A, +0x5D20,0x5D0C,0x5D28,0x5D0D,0x5D26,0x5D25,0x5D0F, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5D30,0x5D12,0x5D23,0x5D1F,0x5D2E,0x5E3E,0x5E34,0x5EB1, +0x5EB4,0x5EB9,0x5EB2,0x5EB3,0x5F36,0x5F38,0x5F9B,0x5F96, +0x5F9F,0x608A,0x6090,0x6086,0x60BE,0x60B0,0x60BA,0x60D3, +0x60D4,0x60CF,0x60E4,0x60D9,0x60DD,0x60C8,0x60B1,0x60DB, +0x60B7,0x60CA,0x60BF,0x60C3,0x60CD,0x60C0,0x6332,0x6365, +0x638A,0x6382,0x637D,0x63BD,0x639E,0x63AD,0x639D,0x6397, +0x63AB,0x638E,0x636F,0x6387,0x6390,0x636E,0x63AF,0x6375, +0x639C,0x636D,0x63AE,0x637C,0x63A4,0x633B,0x639F, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6378,0x6385,0x6381,0x6391,0x638D,0x6370,0x6553, +0x65CD,0x6665,0x6661,0x665B,0x6659,0x665C,0x6662,0x6718, +0x6879,0x6887,0x6890,0x689C,0x686D,0x686E,0x68AE,0x68AB, +0x6956,0x686F,0x68A3,0x68AC,0x68A9,0x6875,0x6874,0x68B2, +0x688F,0x6877,0x6892,0x687C,0x686B,0x6872,0x68AA,0x6880, +0x6871,0x687E,0x689B,0x6896,0x688B,0x68A0,0x6889,0x68A4, +0x6878,0x687B,0x6891,0x688C,0x688A,0x687D,0x6B36,0x6B33, +0x6B37,0x6B38,0x6B91,0x6B8F,0x6B8D,0x6B8E,0x6B8C,0x6C2A, +0x6DC0,0x6DAB,0x6DB4,0x6DB3,0x6E74,0x6DAC,0x6DE9,0x6DE2, +0x6DB7,0x6DF6,0x6DD4,0x6E00,0x6DC8,0x6DE0,0x6DDF,0x6DD6, +0x6DBE,0x6DE5,0x6DDC,0x6DDD,0x6DDB,0x6DF4,0x6DCA,0x6DBD, +0x6DED,0x6DF0,0x6DBA,0x6DD5,0x6DC2,0x6DCF,0x6DC9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6DD0,0x6DF2,0x6DD3,0x6DFD,0x6DD7,0x6DCD,0x6DE3,0x6DBB, +0x70FA,0x710D,0x70F7,0x7117,0x70F4,0x710C,0x70F0,0x7104, +0x70F3,0x7110,0x70FC,0x70FF,0x7106,0x7113,0x7100,0x70F8, +0x70F6,0x710B,0x7102,0x710E,0x727E,0x727B,0x727C,0x727F, +0x731D,0x7317,0x7307,0x7311,0x7318,0x730A,0x7308,0x72FF, +0x730F,0x731E,0x7388,0x73F6,0x73F8,0x73F5,0x7404,0x7401, +0x73FD,0x7407,0x7400,0x73FA,0x73FC,0x73FF,0x740C,0x740B, +0x73F4,0x7408,0x7564,0x7563,0x75CE,0x75D2,0x75CF, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x75CB,0x75CC,0x75D1,0x75D0,0x768F,0x7689,0x76D3, +0x7739,0x772F,0x772D,0x7731,0x7732,0x7734,0x7733,0x773D, +0x7725,0x773B,0x7735,0x7848,0x7852,0x7849,0x784D,0x784A, +0x784C,0x7826,0x7845,0x7850,0x7964,0x7967,0x7969,0x796A, +0x7963,0x796B,0x7961,0x79BB,0x79FA,0x79F8,0x79F6,0x79F7, +0x7A8F,0x7A94,0x7A90,0x7B35,0x7B47,0x7B34,0x7B25,0x7B30, +0x7B22,0x7B24,0x7B33,0x7B18,0x7B2A,0x7B1D,0x7B31,0x7B2B, +0x7B2D,0x7B2F,0x7B32,0x7B38,0x7B1A,0x7B23,0x7C94,0x7C98, +0x7C96,0x7CA3,0x7D35,0x7D3D,0x7D38,0x7D36,0x7D3A,0x7D45, +0x7D2C,0x7D29,0x7D41,0x7D47,0x7D3E,0x7D3F,0x7D4A,0x7D3B, +0x7D28,0x7F63,0x7F95,0x7F9C,0x7F9D,0x7F9B,0x7FCA,0x7FCB, +0x7FCD,0x7FD0,0x7FD1,0x7FC7,0x7FCF,0x7FC9,0x801F, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x801E,0x801B,0x8047,0x8043,0x8048,0x8118,0x8125,0x8119, +0x811B,0x812D,0x811F,0x812C,0x811E,0x8121,0x8115,0x8127, +0x811D,0x8122,0x8211,0x8238,0x8233,0x823A,0x8234,0x8232, +0x8274,0x8390,0x83A3,0x83A8,0x838D,0x837A,0x8373,0x83A4, +0x8374,0x838F,0x8381,0x8395,0x8399,0x8375,0x8394,0x83A9, +0x837D,0x8383,0x838C,0x839D,0x839B,0x83AA,0x838B,0x837E, +0x83A5,0x83AF,0x8388,0x8397,0x83B0,0x837F,0x83A6,0x8387, +0x83AE,0x8376,0x839A,0x8659,0x8656,0x86BF,0x86B7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x86C2,0x86C1,0x86C5,0x86BA,0x86B0,0x86C8,0x86B9, +0x86B3,0x86B8,0x86CC,0x86B4,0x86BB,0x86BC,0x86C3,0x86BD, +0x86BE,0x8852,0x8889,0x8895,0x88A8,0x88A2,0x88AA,0x889A, +0x8891,0x88A1,0x889F,0x8898,0x88A7,0x8899,0x889B,0x8897, +0x88A4,0x88AC,0x888C,0x8893,0x888E,0x8982,0x89D6,0x89D9, +0x89D5,0x8A30,0x8A27,0x8A2C,0x8A1E,0x8C39,0x8C3B,0x8C5C, +0x8C5D,0x8C7D,0x8CA5,0x8D7D,0x8D7B,0x8D79,0x8DBC,0x8DC2, +0x8DB9,0x8DBF,0x8DC1,0x8ED8,0x8EDE,0x8EDD,0x8EDC,0x8ED7, +0x8EE0,0x8EE1,0x9024,0x900B,0x9011,0x901C,0x900C,0x9021, +0x90EF,0x90EA,0x90F0,0x90F4,0x90F2,0x90F3,0x90D4,0x90EB, +0x90EC,0x90E9,0x9156,0x9158,0x915A,0x9153,0x9155,0x91EC, +0x91F4,0x91F1,0x91F3,0x91F8,0x91E4,0x91F9,0x91EA, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x91EB,0x91F7,0x91E8,0x91EE,0x957A,0x9586,0x9588,0x967C, +0x966D,0x966B,0x9671,0x966F,0x96BF,0x976A,0x9804,0x98E5, +0x9997,0x509B,0x5095,0x5094,0x509E,0x508B,0x50A3,0x5083, +0x508C,0x508E,0x509D,0x5068,0x509C,0x5092,0x5082,0x5087, +0x515F,0x51D4,0x5312,0x5311,0x53A4,0x53A7,0x5591,0x55A8, +0x55A5,0x55AD,0x5577,0x5645,0x55A2,0x5593,0x5588,0x558F, +0x55B5,0x5581,0x55A3,0x5592,0x55A4,0x557D,0x558C,0x55A6, +0x557F,0x5595,0x55A1,0x558E,0x570C,0x5829,0x5837, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5819,0x581E,0x5827,0x5823,0x5828,0x57F5,0x5848, +0x5825,0x581C,0x581B,0x5833,0x583F,0x5836,0x582E,0x5839, +0x5838,0x582D,0x582C,0x583B,0x5961,0x5AAF,0x5A94,0x5A9F, +0x5A7A,0x5AA2,0x5A9E,0x5A78,0x5AA6,0x5A7C,0x5AA5,0x5AAC, +0x5A95,0x5AAE,0x5A37,0x5A84,0x5A8A,0x5A97,0x5A83,0x5A8B, +0x5AA9,0x5A7B,0x5A7D,0x5A8C,0x5A9C,0x5A8F,0x5A93,0x5A9D, +0x5BEA,0x5BCD,0x5BCB,0x5BD4,0x5BD1,0x5BCA,0x5BCE,0x5C0C, +0x5C30,0x5D37,0x5D43,0x5D6B,0x5D41,0x5D4B,0x5D3F,0x5D35, +0x5D51,0x5D4E,0x5D55,0x5D33,0x5D3A,0x5D52,0x5D3D,0x5D31, +0x5D59,0x5D42,0x5D39,0x5D49,0x5D38,0x5D3C,0x5D32,0x5D36, +0x5D40,0x5D45,0x5E44,0x5E41,0x5F58,0x5FA6,0x5FA5,0x5FAB, +0x60C9,0x60B9,0x60CC,0x60E2,0x60CE,0x60C4,0x6114, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x60F2,0x610A,0x6116,0x6105,0x60F5,0x6113,0x60F8,0x60FC, +0x60FE,0x60C1,0x6103,0x6118,0x611D,0x6110,0x60FF,0x6104, +0x610B,0x624A,0x6394,0x63B1,0x63B0,0x63CE,0x63E5,0x63E8, +0x63EF,0x63C3,0x649D,0x63F3,0x63CA,0x63E0,0x63F6,0x63D5, +0x63F2,0x63F5,0x6461,0x63DF,0x63BE,0x63DD,0x63DC,0x63C4, +0x63D8,0x63D3,0x63C2,0x63C7,0x63CC,0x63CB,0x63C8,0x63F0, +0x63D7,0x63D9,0x6532,0x6567,0x656A,0x6564,0x655C,0x6568, +0x6565,0x658C,0x659D,0x659E,0x65AE,0x65D0,0x65D2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x667C,0x666C,0x667B,0x6680,0x6671,0x6679,0x666A, +0x6672,0x6701,0x690C,0x68D3,0x6904,0x68DC,0x692A,0x68EC, +0x68EA,0x68F1,0x690F,0x68D6,0x68F7,0x68EB,0x68E4,0x68F6, +0x6913,0x6910,0x68F3,0x68E1,0x6907,0x68CC,0x6908,0x6970, +0x68B4,0x6911,0x68EF,0x68C6,0x6914,0x68F8,0x68D0,0x68FD, +0x68FC,0x68E8,0x690B,0x690A,0x6917,0x68CE,0x68C8,0x68DD, +0x68DE,0x68E6,0x68F4,0x68D1,0x6906,0x68D4,0x68E9,0x6915, +0x6925,0x68C7,0x6B39,0x6B3B,0x6B3F,0x6B3C,0x6B94,0x6B97, +0x6B99,0x6B95,0x6BBD,0x6BF0,0x6BF2,0x6BF3,0x6C30,0x6DFC, +0x6E46,0x6E47,0x6E1F,0x6E49,0x6E88,0x6E3C,0x6E3D,0x6E45, +0x6E62,0x6E2B,0x6E3F,0x6E41,0x6E5D,0x6E73,0x6E1C,0x6E33, +0x6E4B,0x6E40,0x6E51,0x6E3B,0x6E03,0x6E2E,0x6E5E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6E68,0x6E5C,0x6E61,0x6E31,0x6E28,0x6E60,0x6E71,0x6E6B, +0x6E39,0x6E22,0x6E30,0x6E53,0x6E65,0x6E27,0x6E78,0x6E64, +0x6E77,0x6E55,0x6E79,0x6E52,0x6E66,0x6E35,0x6E36,0x6E5A, +0x7120,0x711E,0x712F,0x70FB,0x712E,0x7131,0x7123,0x7125, +0x7122,0x7132,0x711F,0x7128,0x713A,0x711B,0x724B,0x725A, +0x7288,0x7289,0x7286,0x7285,0x728B,0x7312,0x730B,0x7330, +0x7322,0x7331,0x7333,0x7327,0x7332,0x732D,0x7326,0x7323, +0x7335,0x730C,0x742E,0x742C,0x7430,0x742B,0x7416, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x741A,0x7421,0x742D,0x7431,0x7424,0x7423,0x741D, +0x7429,0x7420,0x7432,0x74FB,0x752F,0x756F,0x756C,0x75E7, +0x75DA,0x75E1,0x75E6,0x75DD,0x75DF,0x75E4,0x75D7,0x7695, +0x7692,0x76DA,0x7746,0x7747,0x7744,0x774D,0x7745,0x774A, +0x774E,0x774B,0x774C,0x77DE,0x77EC,0x7860,0x7864,0x7865, +0x785C,0x786D,0x7871,0x786A,0x786E,0x7870,0x7869,0x7868, +0x785E,0x7862,0x7974,0x7973,0x7972,0x7970,0x7A02,0x7A0A, +0x7A03,0x7A0C,0x7A04,0x7A99,0x7AE6,0x7AE4,0x7B4A,0x7B3B, +0x7B44,0x7B48,0x7B4C,0x7B4E,0x7B40,0x7B58,0x7B45,0x7CA2, +0x7C9E,0x7CA8,0x7CA1,0x7D58,0x7D6F,0x7D63,0x7D53,0x7D56, +0x7D67,0x7D6A,0x7D4F,0x7D6D,0x7D5C,0x7D6B,0x7D52,0x7D54, +0x7D69,0x7D51,0x7D5F,0x7D4E,0x7F3E,0x7F3F,0x7F65, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7F66,0x7FA2,0x7FA0,0x7FA1,0x7FD7,0x8051,0x804F,0x8050, +0x80FE,0x80D4,0x8143,0x814A,0x8152,0x814F,0x8147,0x813D, +0x814D,0x813A,0x81E6,0x81EE,0x81F7,0x81F8,0x81F9,0x8204, +0x823C,0x823D,0x823F,0x8275,0x833B,0x83CF,0x83F9,0x8423, +0x83C0,0x83E8,0x8412,0x83E7,0x83E4,0x83FC,0x83F6,0x8410, +0x83C6,0x83C8,0x83EB,0x83E3,0x83BF,0x8401,0x83DD,0x83E5, +0x83D8,0x83FF,0x83E1,0x83CB,0x83CE,0x83D6,0x83F5,0x83C9, +0x8409,0x840F,0x83DE,0x8411,0x8406,0x83C2,0x83F3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x83D5,0x83FA,0x83C7,0x83D1,0x83EA,0x8413,0x83C3, +0x83EC,0x83EE,0x83C4,0x83FB,0x83D7,0x83E2,0x841B,0x83DB, +0x83FE,0x86D8,0x86E2,0x86E6,0x86D3,0x86E3,0x86DA,0x86EA, +0x86DD,0x86EB,0x86DC,0x86EC,0x86E9,0x86D7,0x86E8,0x86D1, +0x8848,0x8856,0x8855,0x88BA,0x88D7,0x88B9,0x88B8,0x88C0, +0x88BE,0x88B6,0x88BC,0x88B7,0x88BD,0x88B2,0x8901,0x88C9, +0x8995,0x8998,0x8997,0x89DD,0x89DA,0x89DB,0x8A4E,0x8A4D, +0x8A39,0x8A59,0x8A40,0x8A57,0x8A58,0x8A44,0x8A45,0x8A52, +0x8A48,0x8A51,0x8A4A,0x8A4C,0x8A4F,0x8C5F,0x8C81,0x8C80, +0x8CBA,0x8CBE,0x8CB0,0x8CB9,0x8CB5,0x8D84,0x8D80,0x8D89, +0x8DD8,0x8DD3,0x8DCD,0x8DC7,0x8DD6,0x8DDC,0x8DCF,0x8DD5, +0x8DD9,0x8DC8,0x8DD7,0x8DC5,0x8EEF,0x8EF7,0x8EFA, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8EF9,0x8EE6,0x8EEE,0x8EE5,0x8EF5,0x8EE7,0x8EE8,0x8EF6, +0x8EEB,0x8EF1,0x8EEC,0x8EF4,0x8EE9,0x902D,0x9034,0x902F, +0x9106,0x912C,0x9104,0x90FF,0x90FC,0x9108,0x90F9,0x90FB, +0x9101,0x9100,0x9107,0x9105,0x9103,0x9161,0x9164,0x915F, +0x9162,0x9160,0x9201,0x920A,0x9225,0x9203,0x921A,0x9226, +0x920F,0x920C,0x9200,0x9212,0x91FF,0x91FD,0x9206,0x9204, +0x9227,0x9202,0x921C,0x9224,0x9219,0x9217,0x9205,0x9216, +0x957B,0x958D,0x958C,0x9590,0x9687,0x967E,0x9688, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x9689,0x9683,0x9680,0x96C2,0x96C8,0x96C3,0x96F1, +0x96F0,0x976C,0x9770,0x976E,0x9807,0x98A9,0x98EB,0x9CE6, +0x9EF9,0x4E83,0x4E84,0x4EB6,0x50BD,0x50BF,0x50C6,0x50AE, +0x50C4,0x50CA,0x50B4,0x50C8,0x50C2,0x50B0,0x50C1,0x50BA, +0x50B1,0x50CB,0x50C9,0x50B6,0x50B8,0x51D7,0x527A,0x5278, +0x527B,0x527C,0x55C3,0x55DB,0x55CC,0x55D0,0x55CB,0x55CA, +0x55DD,0x55C0,0x55D4,0x55C4,0x55E9,0x55BF,0x55D2,0x558D, +0x55CF,0x55D5,0x55E2,0x55D6,0x55C8,0x55F2,0x55CD,0x55D9, +0x55C2,0x5714,0x5853,0x5868,0x5864,0x584F,0x584D,0x5849, +0x586F,0x5855,0x584E,0x585D,0x5859,0x5865,0x585B,0x583D, +0x5863,0x5871,0x58FC,0x5AC7,0x5AC4,0x5ACB,0x5ABA,0x5AB8, +0x5AB1,0x5AB5,0x5AB0,0x5ABF,0x5AC8,0x5ABB,0x5AC6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5AB7,0x5AC0,0x5ACA,0x5AB4,0x5AB6,0x5ACD,0x5AB9,0x5A90, +0x5BD6,0x5BD8,0x5BD9,0x5C1F,0x5C33,0x5D71,0x5D63,0x5D4A, +0x5D65,0x5D72,0x5D6C,0x5D5E,0x5D68,0x5D67,0x5D62,0x5DF0, +0x5E4F,0x5E4E,0x5E4A,0x5E4D,0x5E4B,0x5EC5,0x5ECC,0x5EC6, +0x5ECB,0x5EC7,0x5F40,0x5FAF,0x5FAD,0x60F7,0x6149,0x614A, +0x612B,0x6145,0x6136,0x6132,0x612E,0x6146,0x612F,0x614F, +0x6129,0x6140,0x6220,0x9168,0x6223,0x6225,0x6224,0x63C5, +0x63F1,0x63EB,0x6410,0x6412,0x6409,0x6420,0x6424, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6433,0x6443,0x641F,0x6415,0x6418,0x6439,0x6437, +0x6422,0x6423,0x640C,0x6426,0x6430,0x6428,0x6441,0x6435, +0x642F,0x640A,0x641A,0x6440,0x6425,0x6427,0x640B,0x63E7, +0x641B,0x642E,0x6421,0x640E,0x656F,0x6592,0x65D3,0x6686, +0x668C,0x6695,0x6690,0x668B,0x668A,0x6699,0x6694,0x6678, +0x6720,0x6966,0x695F,0x6938,0x694E,0x6962,0x6971,0x693F, +0x6945,0x696A,0x6939,0x6942,0x6957,0x6959,0x697A,0x6948, +0x6949,0x6935,0x696C,0x6933,0x693D,0x6965,0x68F0,0x6978, +0x6934,0x6969,0x6940,0x696F,0x6944,0x6976,0x6958,0x6941, +0x6974,0x694C,0x693B,0x694B,0x6937,0x695C,0x694F,0x6951, +0x6932,0x6952,0x692F,0x697B,0x693C,0x6B46,0x6B45,0x6B43, +0x6B42,0x6B48,0x6B41,0x6B9B,0xFA0D,0x6BFB,0x6BFC, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6BF9,0x6BF7,0x6BF8,0x6E9B,0x6ED6,0x6EC8,0x6E8F,0x6EC0, +0x6E9F,0x6E93,0x6E94,0x6EA0,0x6EB1,0x6EB9,0x6EC6,0x6ED2, +0x6EBD,0x6EC1,0x6E9E,0x6EC9,0x6EB7,0x6EB0,0x6ECD,0x6EA6, +0x6ECF,0x6EB2,0x6EBE,0x6EC3,0x6EDC,0x6ED8,0x6E99,0x6E92, +0x6E8E,0x6E8D,0x6EA4,0x6EA1,0x6EBF,0x6EB3,0x6ED0,0x6ECA, +0x6E97,0x6EAE,0x6EA3,0x7147,0x7154,0x7152,0x7163,0x7160, +0x7141,0x715D,0x7162,0x7172,0x7178,0x716A,0x7161,0x7142, +0x7158,0x7143,0x714B,0x7170,0x715F,0x7150,0x7153, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x7144,0x714D,0x715A,0x724F,0x728D,0x728C,0x7291, +0x7290,0x728E,0x733C,0x7342,0x733B,0x733A,0x7340,0x734A, +0x7349,0x7444,0x744A,0x744B,0x7452,0x7451,0x7457,0x7440, +0x744F,0x7450,0x744E,0x7442,0x7446,0x744D,0x7454,0x74E1, +0x74FF,0x74FE,0x74FD,0x751D,0x7579,0x7577,0x6983,0x75EF, +0x760F,0x7603,0x75F7,0x75FE,0x75FC,0x75F9,0x75F8,0x7610, +0x75FB,0x75F6,0x75ED,0x75F5,0x75FD,0x7699,0x76B5,0x76DD, +0x7755,0x775F,0x7760,0x7752,0x7756,0x775A,0x7769,0x7767, +0x7754,0x7759,0x776D,0x77E0,0x7887,0x789A,0x7894,0x788F, +0x7884,0x7895,0x7885,0x7886,0x78A1,0x7883,0x7879,0x7899, +0x7880,0x7896,0x787B,0x797C,0x7982,0x797D,0x7979,0x7A11, +0x7A18,0x7A19,0x7A12,0x7A17,0x7A15,0x7A22,0x7A13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7A1B,0x7A10,0x7AA3,0x7AA2,0x7A9E,0x7AEB,0x7B66,0x7B64, +0x7B6D,0x7B74,0x7B69,0x7B72,0x7B65,0x7B73,0x7B71,0x7B70, +0x7B61,0x7B78,0x7B76,0x7B63,0x7CB2,0x7CB4,0x7CAF,0x7D88, +0x7D86,0x7D80,0x7D8D,0x7D7F,0x7D85,0x7D7A,0x7D8E,0x7D7B, +0x7D83,0x7D7C,0x7D8C,0x7D94,0x7D84,0x7D7D,0x7D92,0x7F6D, +0x7F6B,0x7F67,0x7F68,0x7F6C,0x7FA6,0x7FA5,0x7FA7,0x7FDB, +0x7FDC,0x8021,0x8164,0x8160,0x8177,0x815C,0x8169,0x815B, +0x8162,0x8172,0x6721,0x815E,0x8176,0x8167,0x816F, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x8144,0x8161,0x821D,0x8249,0x8244,0x8240,0x8242, +0x8245,0x84F1,0x843F,0x8456,0x8476,0x8479,0x848F,0x848D, +0x8465,0x8451,0x8440,0x8486,0x8467,0x8430,0x844D,0x847D, +0x845A,0x8459,0x8474,0x8473,0x845D,0x8507,0x845E,0x8437, +0x843A,0x8434,0x847A,0x8443,0x8478,0x8432,0x8445,0x8429, +0x83D9,0x844B,0x842F,0x8442,0x842D,0x845F,0x8470,0x8439, +0x844E,0x844C,0x8452,0x846F,0x84C5,0x848E,0x843B,0x8447, +0x8436,0x8433,0x8468,0x847E,0x8444,0x842B,0x8460,0x8454, +0x846E,0x8450,0x870B,0x8704,0x86F7,0x870C,0x86FA,0x86D6, +0x86F5,0x874D,0x86F8,0x870E,0x8709,0x8701,0x86F6,0x870D, +0x8705,0x88D6,0x88CB,0x88CD,0x88CE,0x88DE,0x88DB,0x88DA, +0x88CC,0x88D0,0x8985,0x899B,0x89DF,0x89E5,0x89E4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x89E1,0x89E0,0x89E2,0x89DC,0x89E6,0x8A76,0x8A86,0x8A7F, +0x8A61,0x8A3F,0x8A77,0x8A82,0x8A84,0x8A75,0x8A83,0x8A81, +0x8A74,0x8A7A,0x8C3C,0x8C4B,0x8C4A,0x8C65,0x8C64,0x8C66, +0x8C86,0x8C84,0x8C85,0x8CCC,0x8D68,0x8D69,0x8D91,0x8D8C, +0x8D8E,0x8D8F,0x8D8D,0x8D93,0x8D94,0x8D90,0x8D92,0x8DF0, +0x8DE0,0x8DEC,0x8DF1,0x8DEE,0x8DD0,0x8DE9,0x8DE3,0x8DE2, +0x8DE7,0x8DF2,0x8DEB,0x8DF4,0x8F06,0x8EFF,0x8F01,0x8F00, +0x8F05,0x8F07,0x8F08,0x8F02,0x8F0B,0x9052,0x903F, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x9044,0x9049,0x903D,0x9110,0x910D,0x910F,0x9111, +0x9116,0x9114,0x910B,0x910E,0x916E,0x916F,0x9248,0x9252, +0x9230,0x923A,0x9266,0x9233,0x9265,0x925E,0x9283,0x922E, +0x924A,0x9246,0x926D,0x926C,0x924F,0x9260,0x9267,0x926F, +0x9236,0x9261,0x9270,0x9231,0x9254,0x9263,0x9250,0x9272, +0x924E,0x9253,0x924C,0x9256,0x9232,0x959F,0x959C,0x959E, +0x959B,0x9692,0x9693,0x9691,0x9697,0x96CE,0x96FA,0x96FD, +0x96F8,0x96F5,0x9773,0x9777,0x9778,0x9772,0x980F,0x980D, +0x980E,0x98AC,0x98F6,0x98F9,0x99AF,0x99B2,0x99B0,0x99B5, +0x9AAD,0x9AAB,0x9B5B,0x9CEA,0x9CED,0x9CE7,0x9E80,0x9EFD, +0x50E6,0x50D4,0x50D7,0x50E8,0x50F3,0x50DB,0x50EA,0x50DD, +0x50E4,0x50D3,0x50EC,0x50F0,0x50EF,0x50E3,0x50E0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x51D8,0x5280,0x5281,0x52E9,0x52EB,0x5330,0x53AC,0x5627, +0x5615,0x560C,0x5612,0x55FC,0x560F,0x561C,0x5601,0x5613, +0x5602,0x55FA,0x561D,0x5604,0x55FF,0x55F9,0x5889,0x587C, +0x5890,0x5898,0x5886,0x5881,0x587F,0x5874,0x588B,0x587A, +0x5887,0x5891,0x588E,0x5876,0x5882,0x5888,0x587B,0x5894, +0x588F,0x58FE,0x596B,0x5ADC,0x5AEE,0x5AE5,0x5AD5,0x5AEA, +0x5ADA,0x5AED,0x5AEB,0x5AF3,0x5AE2,0x5AE0,0x5ADB,0x5AEC, +0x5ADE,0x5ADD,0x5AD9,0x5AE8,0x5ADF,0x5B77,0x5BE0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5BE3,0x5C63,0x5D82,0x5D80,0x5D7D,0x5D86,0x5D7A, +0x5D81,0x5D77,0x5D8A,0x5D89,0x5D88,0x5D7E,0x5D7C,0x5D8D, +0x5D79,0x5D7F,0x5E58,0x5E59,0x5E53,0x5ED8,0x5ED1,0x5ED7, +0x5ECE,0x5EDC,0x5ED5,0x5ED9,0x5ED2,0x5ED4,0x5F44,0x5F43, +0x5F6F,0x5FB6,0x612C,0x6128,0x6141,0x615E,0x6171,0x6173, +0x6152,0x6153,0x6172,0x616C,0x6180,0x6174,0x6154,0x617A, +0x615B,0x6165,0x613B,0x616A,0x6161,0x6156,0x6229,0x6227, +0x622B,0x642B,0x644D,0x645B,0x645D,0x6474,0x6476,0x6472, +0x6473,0x647D,0x6475,0x6466,0x64A6,0x644E,0x6482,0x645E, +0x645C,0x644B,0x6453,0x6460,0x6450,0x647F,0x643F,0x646C, +0x646B,0x6459,0x6465,0x6477,0x6573,0x65A0,0x66A1,0x66A0, +0x669F,0x6705,0x6704,0x6722,0x69B1,0x69B6,0x69C9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x69A0,0x69CE,0x6996,0x69B0,0x69AC,0x69BC,0x6991,0x6999, +0x698E,0x69A7,0x698D,0x69A9,0x69BE,0x69AF,0x69BF,0x69C4, +0x69BD,0x69A4,0x69D4,0x69B9,0x69CA,0x699A,0x69CF,0x69B3, +0x6993,0x69AA,0x69A1,0x699E,0x69D9,0x6997,0x6990,0x69C2, +0x69B5,0x69A5,0x69C6,0x6B4A,0x6B4D,0x6B4B,0x6B9E,0x6B9F, +0x6BA0,0x6BC3,0x6BC4,0x6BFE,0x6ECE,0x6EF5,0x6EF1,0x6F03, +0x6F25,0x6EF8,0x6F37,0x6EFB,0x6F2E,0x6F09,0x6F4E,0x6F19, +0x6F1A,0x6F27,0x6F18,0x6F3B,0x6F12,0x6EED,0x6F0A, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6F36,0x6F73,0x6EF9,0x6EEE,0x6F2D,0x6F40,0x6F30, +0x6F3C,0x6F35,0x6EEB,0x6F07,0x6F0E,0x6F43,0x6F05,0x6EFD, +0x6EF6,0x6F39,0x6F1C,0x6EFC,0x6F3A,0x6F1F,0x6F0D,0x6F1E, +0x6F08,0x6F21,0x7187,0x7190,0x7189,0x7180,0x7185,0x7182, +0x718F,0x717B,0x7186,0x7181,0x7197,0x7244,0x7253,0x7297, +0x7295,0x7293,0x7343,0x734D,0x7351,0x734C,0x7462,0x7473, +0x7471,0x7475,0x7472,0x7467,0x746E,0x7500,0x7502,0x7503, +0x757D,0x7590,0x7616,0x7608,0x760C,0x7615,0x7611,0x760A, +0x7614,0x76B8,0x7781,0x777C,0x7785,0x7782,0x776E,0x7780, +0x776F,0x777E,0x7783,0x78B2,0x78AA,0x78B4,0x78AD,0x78A8, +0x787E,0x78AB,0x789E,0x78A5,0x78A0,0x78AC,0x78A2,0x78A4, +0x7998,0x798A,0x798B,0x7996,0x7995,0x7994,0x7993, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7997,0x7988,0x7992,0x7990,0x7A2B,0x7A4A,0x7A30,0x7A2F, +0x7A28,0x7A26,0x7AA8,0x7AAB,0x7AAC,0x7AEE,0x7B88,0x7B9C, +0x7B8A,0x7B91,0x7B90,0x7B96,0x7B8D,0x7B8C,0x7B9B,0x7B8E, +0x7B85,0x7B98,0x5284,0x7B99,0x7BA4,0x7B82,0x7CBB,0x7CBF, +0x7CBC,0x7CBA,0x7DA7,0x7DB7,0x7DC2,0x7DA3,0x7DAA,0x7DC1, +0x7DC0,0x7DC5,0x7D9D,0x7DCE,0x7DC4,0x7DC6,0x7DCB,0x7DCC, +0x7DAF,0x7DB9,0x7D96,0x7DBC,0x7D9F,0x7DA6,0x7DAE,0x7DA9, +0x7DA1,0x7DC9,0x7F73,0x7FE2,0x7FE3,0x7FE5,0x7FDE, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x8024,0x805D,0x805C,0x8189,0x8186,0x8183,0x8187, +0x818D,0x818C,0x818B,0x8215,0x8497,0x84A4,0x84A1,0x849F, +0x84BA,0x84CE,0x84C2,0x84AC,0x84AE,0x84AB,0x84B9,0x84B4, +0x84C1,0x84CD,0x84AA,0x849A,0x84B1,0x84D0,0x849D,0x84A7, +0x84BB,0x84A2,0x8494,0x84C7,0x84CC,0x849B,0x84A9,0x84AF, +0x84A8,0x84D6,0x8498,0x84B6,0x84CF,0x84A0,0x84D7,0x84D4, +0x84D2,0x84DB,0x84B0,0x8491,0x8661,0x8733,0x8723,0x8728, +0x876B,0x8740,0x872E,0x871E,0x8721,0x8719,0x871B,0x8743, +0x872C,0x8741,0x873E,0x8746,0x8720,0x8732,0x872A,0x872D, +0x873C,0x8712,0x873A,0x8731,0x8735,0x8742,0x8726,0x8727, +0x8738,0x8724,0x871A,0x8730,0x8711,0x88F7,0x88E7,0x88F1, +0x88F2,0x88FA,0x88FE,0x88EE,0x88FC,0x88F6,0x88FB, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x88F0,0x88EC,0x88EB,0x899D,0x89A1,0x899F,0x899E,0x89E9, +0x89EB,0x89E8,0x8AAB,0x8A99,0x8A8B,0x8A92,0x8A8F,0x8A96, +0x8C3D,0x8C68,0x8C69,0x8CD5,0x8CCF,0x8CD7,0x8D96,0x8E09, +0x8E02,0x8DFF,0x8E0D,0x8DFD,0x8E0A,0x8E03,0x8E07,0x8E06, +0x8E05,0x8DFE,0x8E00,0x8E04,0x8F10,0x8F11,0x8F0E,0x8F0D, +0x9123,0x911C,0x9120,0x9122,0x911F,0x911D,0x911A,0x9124, +0x9121,0x911B,0x917A,0x9172,0x9179,0x9173,0x92A5,0x92A4, +0x9276,0x929B,0x927A,0x92A0,0x9294,0x92AA,0x928D, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x92A6,0x929A,0x92AB,0x9279,0x9297,0x927F,0x92A3, +0x92EE,0x928E,0x9282,0x9295,0x92A2,0x927D,0x9288,0x92A1, +0x928A,0x9286,0x928C,0x9299,0x92A7,0x927E,0x9287,0x92A9, +0x929D,0x928B,0x922D,0x969E,0x96A1,0x96FF,0x9758,0x977D, +0x977A,0x977E,0x9783,0x9780,0x9782,0x977B,0x9784,0x9781, +0x977F,0x97CE,0x97CD,0x9816,0x98AD,0x98AE,0x9902,0x9900, +0x9907,0x999D,0x999C,0x99C3,0x99B9,0x99BB,0x99BA,0x99C2, +0x99BD,0x99C7,0x9AB1,0x9AE3,0x9AE7,0x9B3E,0x9B3F,0x9B60, +0x9B61,0x9B5F,0x9CF1,0x9CF2,0x9CF5,0x9EA7,0x50FF,0x5103, +0x5130,0x50F8,0x5106,0x5107,0x50F6,0x50FE,0x510B,0x510C, +0x50FD,0x510A,0x528B,0x528C,0x52F1,0x52EF,0x5648,0x5642, +0x564C,0x5635,0x5641,0x564A,0x5649,0x5646,0x5658, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x565A,0x5640,0x5633,0x563D,0x562C,0x563E,0x5638,0x562A, +0x563A,0x571A,0x58AB,0x589D,0x58B1,0x58A0,0x58A3,0x58AF, +0x58AC,0x58A5,0x58A1,0x58FF,0x5AFF,0x5AF4,0x5AFD,0x5AF7, +0x5AF6,0x5B03,0x5AF8,0x5B02,0x5AF9,0x5B01,0x5B07,0x5B05, +0x5B0F,0x5C67,0x5D99,0x5D97,0x5D9F,0x5D92,0x5DA2,0x5D93, +0x5D95,0x5DA0,0x5D9C,0x5DA1,0x5D9A,0x5D9E,0x5E69,0x5E5D, +0x5E60,0x5E5C,0x7DF3,0x5EDB,0x5EDE,0x5EE1,0x5F49,0x5FB2, +0x618B,0x6183,0x6179,0x61B1,0x61B0,0x61A2,0x6189, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x619B,0x6193,0x61AF,0x61AD,0x619F,0x6192,0x61AA, +0x61A1,0x618D,0x6166,0x61B3,0x622D,0x646E,0x6470,0x6496, +0x64A0,0x6485,0x6497,0x649C,0x648F,0x648B,0x648A,0x648C, +0x64A3,0x649F,0x6468,0x64B1,0x6498,0x6576,0x657A,0x6579, +0x657B,0x65B2,0x65B3,0x66B5,0x66B0,0x66A9,0x66B2,0x66B7, +0x66AA,0x66AF,0x6A00,0x6A06,0x6A17,0x69E5,0x69F8,0x6A15, +0x69F1,0x69E4,0x6A20,0x69FF,0x69EC,0x69E2,0x6A1B,0x6A1D, +0x69FE,0x6A27,0x69F2,0x69EE,0x6A14,0x69F7,0x69E7,0x6A40, +0x6A08,0x69E6,0x69FB,0x6A0D,0x69FC,0x69EB,0x6A09,0x6A04, +0x6A18,0x6A25,0x6A0F,0x69F6,0x6A26,0x6A07,0x69F4,0x6A16, +0x6B51,0x6BA5,0x6BA3,0x6BA2,0x6BA6,0x6C01,0x6C00,0x6BFF, +0x6C02,0x6F41,0x6F26,0x6F7E,0x6F87,0x6FC6,0x6F92, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6F8D,0x6F89,0x6F8C,0x6F62,0x6F4F,0x6F85,0x6F5A,0x6F96, +0x6F76,0x6F6C,0x6F82,0x6F55,0x6F72,0x6F52,0x6F50,0x6F57, +0x6F94,0x6F93,0x6F5D,0x6F00,0x6F61,0x6F6B,0x6F7D,0x6F67, +0x6F90,0x6F53,0x6F8B,0x6F69,0x6F7F,0x6F95,0x6F63,0x6F77, +0x6F6A,0x6F7B,0x71B2,0x71AF,0x719B,0x71B0,0x71A0,0x719A, +0x71A9,0x71B5,0x719D,0x71A5,0x719E,0x71A4,0x71A1,0x71AA, +0x719C,0x71A7,0x71B3,0x7298,0x729A,0x7358,0x7352,0x735E, +0x735F,0x7360,0x735D,0x735B,0x7361,0x735A,0x7359, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x7362,0x7487,0x7489,0x748A,0x7486,0x7481,0x747D, +0x7485,0x7488,0x747C,0x7479,0x7508,0x7507,0x757E,0x7625, +0x761E,0x7619,0x761D,0x761C,0x7623,0x761A,0x7628,0x761B, +0x769C,0x769D,0x769E,0x769B,0x778D,0x778F,0x7789,0x7788, +0x78CD,0x78BB,0x78CF,0x78CC,0x78D1,0x78CE,0x78D4,0x78C8, +0x78C3,0x78C4,0x78C9,0x799A,0x79A1,0x79A0,0x799C,0x79A2, +0x799B,0x6B76,0x7A39,0x7AB2,0x7AB4,0x7AB3,0x7BB7,0x7BCB, +0x7BBE,0x7BAC,0x7BCE,0x7BAF,0x7BB9,0x7BCA,0x7BB5,0x7CC5, +0x7CC8,0x7CCC,0x7CCB,0x7DF7,0x7DDB,0x7DEA,0x7DE7,0x7DD7, +0x7DE1,0x7E03,0x7DFA,0x7DE6,0x7DF6,0x7DF1,0x7DF0,0x7DEE, +0x7DDF,0x7F76,0x7FAC,0x7FB0,0x7FAD,0x7FED,0x7FEB,0x7FEA, +0x7FEC,0x7FE6,0x7FE8,0x8064,0x8067,0x81A3,0x819F, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x819E,0x8195,0x81A2,0x8199,0x8197,0x8216,0x824F,0x8253, +0x8252,0x8250,0x824E,0x8251,0x8524,0x853B,0x850F,0x8500, +0x8529,0x850E,0x8509,0x850D,0x851F,0x850A,0x8527,0x851C, +0x84FB,0x852B,0x84FA,0x8508,0x850C,0x84F4,0x852A,0x84F2, +0x8515,0x84F7,0x84EB,0x84F3,0x84FC,0x8512,0x84EA,0x84E9, +0x8516,0x84FE,0x8528,0x851D,0x852E,0x8502,0x84FD,0x851E, +0x84F6,0x8531,0x8526,0x84E7,0x84E8,0x84F0,0x84EF,0x84F9, +0x8518,0x8520,0x8530,0x850B,0x8519,0x852F,0x8662, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x8756,0x8763,0x8764,0x8777,0x87E1,0x8773,0x8758, +0x8754,0x875B,0x8752,0x8761,0x875A,0x8751,0x875E,0x876D, +0x876A,0x8750,0x874E,0x875F,0x875D,0x876F,0x876C,0x877A, +0x876E,0x875C,0x8765,0x874F,0x877B,0x8775,0x8762,0x8767, +0x8769,0x885A,0x8905,0x890C,0x8914,0x890B,0x8917,0x8918, +0x8919,0x8906,0x8916,0x8911,0x890E,0x8909,0x89A2,0x89A4, +0x89A3,0x89ED,0x89F0,0x89EC,0x8ACF,0x8AC6,0x8AB8,0x8AD3, +0x8AD1,0x8AD4,0x8AD5,0x8ABB,0x8AD7,0x8ABE,0x8AC0,0x8AC5, +0x8AD8,0x8AC3,0x8ABA,0x8ABD,0x8AD9,0x8C3E,0x8C4D,0x8C8F, +0x8CE5,0x8CDF,0x8CD9,0x8CE8,0x8CDA,0x8CDD,0x8CE7,0x8DA0, +0x8D9C,0x8DA1,0x8D9B,0x8E20,0x8E23,0x8E25,0x8E24,0x8E2E, +0x8E15,0x8E1B,0x8E16,0x8E11,0x8E19,0x8E26,0x8E27, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8E14,0x8E12,0x8E18,0x8E13,0x8E1C,0x8E17,0x8E1A,0x8F2C, +0x8F24,0x8F18,0x8F1A,0x8F20,0x8F23,0x8F16,0x8F17,0x9073, +0x9070,0x906F,0x9067,0x906B,0x912F,0x912B,0x9129,0x912A, +0x9132,0x9126,0x912E,0x9185,0x9186,0x918A,0x9181,0x9182, +0x9184,0x9180,0x92D0,0x92C3,0x92C4,0x92C0,0x92D9,0x92B6, +0x92CF,0x92F1,0x92DF,0x92D8,0x92E9,0x92D7,0x92DD,0x92CC, +0x92EF,0x92C2,0x92E8,0x92CA,0x92C8,0x92CE,0x92E6,0x92CD, +0x92D5,0x92C9,0x92E0,0x92DE,0x92E7,0x92D1,0x92D3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x92B5,0x92E1,0x92C6,0x92B4,0x957C,0x95AC,0x95AB, +0x95AE,0x95B0,0x96A4,0x96A2,0x96D3,0x9705,0x9708,0x9702, +0x975A,0x978A,0x978E,0x9788,0x97D0,0x97CF,0x981E,0x981D, +0x9826,0x9829,0x9828,0x9820,0x981B,0x9827,0x98B2,0x9908, +0x98FA,0x9911,0x9914,0x9916,0x9917,0x9915,0x99DC,0x99CD, +0x99CF,0x99D3,0x99D4,0x99CE,0x99C9,0x99D6,0x99D8,0x99CB, +0x99D7,0x99CC,0x9AB3,0x9AEC,0x9AEB,0x9AF3,0x9AF2,0x9AF1, +0x9B46,0x9B43,0x9B67,0x9B74,0x9B71,0x9B66,0x9B76,0x9B75, +0x9B70,0x9B68,0x9B64,0x9B6C,0x9CFC,0x9CFA,0x9CFD,0x9CFF, +0x9CF7,0x9D07,0x9D00,0x9CF9,0x9CFB,0x9D08,0x9D05,0x9D04, +0x9E83,0x9ED3,0x9F0F,0x9F10,0x511C,0x5113,0x5117,0x511A, +0x5111,0x51DE,0x5334,0x53E1,0x5670,0x5660,0x566E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5673,0x5666,0x5663,0x566D,0x5672,0x565E,0x5677,0x571C, +0x571B,0x58C8,0x58BD,0x58C9,0x58BF,0x58BA,0x58C2,0x58BC, +0x58C6,0x5B17,0x5B19,0x5B1B,0x5B21,0x5B14,0x5B13,0x5B10, +0x5B16,0x5B28,0x5B1A,0x5B20,0x5B1E,0x5BEF,0x5DAC,0x5DB1, +0x5DA9,0x5DA7,0x5DB5,0x5DB0,0x5DAE,0x5DAA,0x5DA8,0x5DB2, +0x5DAD,0x5DAF,0x5DB4,0x5E67,0x5E68,0x5E66,0x5E6F,0x5EE9, +0x5EE7,0x5EE6,0x5EE8,0x5EE5,0x5F4B,0x5FBC,0x619D,0x61A8, +0x6196,0x61C5,0x61B4,0x61C6,0x61C1,0x61CC,0x61BA, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x61BF,0x61B8,0x618C,0x64D7,0x64D6,0x64D0,0x64CF, +0x64C9,0x64BD,0x6489,0x64C3,0x64DB,0x64F3,0x64D9,0x6533, +0x657F,0x657C,0x65A2,0x66C8,0x66BE,0x66C0,0x66CA,0x66CB, +0x66CF,0x66BD,0x66BB,0x66BA,0x66CC,0x6723,0x6A34,0x6A66, +0x6A49,0x6A67,0x6A32,0x6A68,0x6A3E,0x6A5D,0x6A6D,0x6A76, +0x6A5B,0x6A51,0x6A28,0x6A5A,0x6A3B,0x6A3F,0x6A41,0x6A6A, +0x6A64,0x6A50,0x6A4F,0x6A54,0x6A6F,0x6A69,0x6A60,0x6A3C, +0x6A5E,0x6A56,0x6A55,0x6A4D,0x6A4E,0x6A46,0x6B55,0x6B54, +0x6B56,0x6BA7,0x6BAA,0x6BAB,0x6BC8,0x6BC7,0x6C04,0x6C03, +0x6C06,0x6FAD,0x6FCB,0x6FA3,0x6FC7,0x6FBC,0x6FCE,0x6FC8, +0x6F5E,0x6FC4,0x6FBD,0x6F9E,0x6FCA,0x6FA8,0x7004,0x6FA5, +0x6FAE,0x6FBA,0x6FAC,0x6FAA,0x6FCF,0x6FBF,0x6FB8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6FA2,0x6FC9,0x6FAB,0x6FCD,0x6FAF,0x6FB2,0x6FB0,0x71C5, +0x71C2,0x71BF,0x71B8,0x71D6,0x71C0,0x71C1,0x71CB,0x71D4, +0x71CA,0x71C7,0x71CF,0x71BD,0x71D8,0x71BC,0x71C6,0x71DA, +0x71DB,0x729D,0x729E,0x7369,0x7366,0x7367,0x736C,0x7365, +0x736B,0x736A,0x747F,0x749A,0x74A0,0x7494,0x7492,0x7495, +0x74A1,0x750B,0x7580,0x762F,0x762D,0x7631,0x763D,0x7633, +0x763C,0x7635,0x7632,0x7630,0x76BB,0x76E6,0x779A,0x779D, +0x77A1,0x779C,0x779B,0x77A2,0x77A3,0x7795,0x7799, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x7797,0x78DD,0x78E9,0x78E5,0x78EA,0x78DE,0x78E3, +0x78DB,0x78E1,0x78E2,0x78ED,0x78DF,0x78E0,0x79A4,0x7A44, +0x7A48,0x7A47,0x7AB6,0x7AB8,0x7AB5,0x7AB1,0x7AB7,0x7BDE, +0x7BE3,0x7BE7,0x7BDD,0x7BD5,0x7BE5,0x7BDA,0x7BE8,0x7BF9, +0x7BD4,0x7BEA,0x7BE2,0x7BDC,0x7BEB,0x7BD8,0x7BDF,0x7CD2, +0x7CD4,0x7CD7,0x7CD0,0x7CD1,0x7E12,0x7E21,0x7E17,0x7E0C, +0x7E1F,0x7E20,0x7E13,0x7E0E,0x7E1C,0x7E15,0x7E1A,0x7E22, +0x7E0B,0x7E0F,0x7E16,0x7E0D,0x7E14,0x7E25,0x7E24,0x7F43, +0x7F7B,0x7F7C,0x7F7A,0x7FB1,0x7FEF,0x802A,0x8029,0x806C, +0x81B1,0x81A6,0x81AE,0x81B9,0x81B5,0x81AB,0x81B0,0x81AC, +0x81B4,0x81B2,0x81B7,0x81A7,0x81F2,0x8255,0x8256,0x8257, +0x8556,0x8545,0x856B,0x854D,0x8553,0x8561,0x8558, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8540,0x8546,0x8564,0x8541,0x8562,0x8544,0x8551,0x8547, +0x8563,0x853E,0x855B,0x8571,0x854E,0x856E,0x8575,0x8555, +0x8567,0x8560,0x858C,0x8566,0x855D,0x8554,0x8565,0x856C, +0x8663,0x8665,0x8664,0x879B,0x878F,0x8797,0x8793,0x8792, +0x8788,0x8781,0x8796,0x8798,0x8779,0x8787,0x87A3,0x8785, +0x8790,0x8791,0x879D,0x8784,0x8794,0x879C,0x879A,0x8789, +0x891E,0x8926,0x8930,0x892D,0x892E,0x8927,0x8931,0x8922, +0x8929,0x8923,0x892F,0x892C,0x891F,0x89F1,0x8AE0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x8AE2,0x8AF2,0x8AF4,0x8AF5,0x8ADD,0x8B14,0x8AE4, +0x8ADF,0x8AF0,0x8AC8,0x8ADE,0x8AE1,0x8AE8,0x8AFF,0x8AEF, +0x8AFB,0x8C91,0x8C92,0x8C90,0x8CF5,0x8CEE,0x8CF1,0x8CF0, +0x8CF3,0x8D6C,0x8D6E,0x8DA5,0x8DA7,0x8E33,0x8E3E,0x8E38, +0x8E40,0x8E45,0x8E36,0x8E3C,0x8E3D,0x8E41,0x8E30,0x8E3F, +0x8EBD,0x8F36,0x8F2E,0x8F35,0x8F32,0x8F39,0x8F37,0x8F34, +0x9076,0x9079,0x907B,0x9086,0x90FA,0x9133,0x9135,0x9136, +0x9193,0x9190,0x9191,0x918D,0x918F,0x9327,0x931E,0x9308, +0x931F,0x9306,0x930F,0x937A,0x9338,0x933C,0x931B,0x9323, +0x9312,0x9301,0x9346,0x932D,0x930E,0x930D,0x92CB,0x931D, +0x92FA,0x9325,0x9313,0x92F9,0x92F7,0x9334,0x9302,0x9324, +0x92FF,0x9329,0x9339,0x9335,0x932A,0x9314,0x930C, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x930B,0x92FE,0x9309,0x9300,0x92FB,0x9316,0x95BC,0x95CD, +0x95BE,0x95B9,0x95BA,0x95B6,0x95BF,0x95B5,0x95BD,0x96A9, +0x96D4,0x970B,0x9712,0x9710,0x9799,0x9797,0x9794,0x97F0, +0x97F8,0x9835,0x982F,0x9832,0x9924,0x991F,0x9927,0x9929, +0x999E,0x99EE,0x99EC,0x99E5,0x99E4,0x99F0,0x99E3,0x99EA, +0x99E9,0x99E7,0x9AB9,0x9ABF,0x9AB4,0x9ABB,0x9AF6,0x9AFA, +0x9AF9,0x9AF7,0x9B33,0x9B80,0x9B85,0x9B87,0x9B7C,0x9B7E, +0x9B7B,0x9B82,0x9B93,0x9B92,0x9B90,0x9B7A,0x9B95, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x9B7D,0x9B88,0x9D25,0x9D17,0x9D20,0x9D1E,0x9D14, +0x9D29,0x9D1D,0x9D18,0x9D22,0x9D10,0x9D19,0x9D1F,0x9E88, +0x9E86,0x9E87,0x9EAE,0x9EAD,0x9ED5,0x9ED6,0x9EFA,0x9F12, +0x9F3D,0x5126,0x5125,0x5122,0x5124,0x5120,0x5129,0x52F4, +0x5693,0x568C,0x568D,0x5686,0x5684,0x5683,0x567E,0x5682, +0x567F,0x5681,0x58D6,0x58D4,0x58CF,0x58D2,0x5B2D,0x5B25, +0x5B32,0x5B23,0x5B2C,0x5B27,0x5B26,0x5B2F,0x5B2E,0x5B7B, +0x5BF1,0x5BF2,0x5DB7,0x5E6C,0x5E6A,0x5FBE,0x5FBB,0x61C3, +0x61B5,0x61BC,0x61E7,0x61E0,0x61E5,0x61E4,0x61E8,0x61DE, +0x64EF,0x64E9,0x64E3,0x64EB,0x64E4,0x64E8,0x6581,0x6580, +0x65B6,0x65DA,0x66D2,0x6A8D,0x6A96,0x6A81,0x6AA5,0x6A89, +0x6A9F,0x6A9B,0x6AA1,0x6A9E,0x6A87,0x6A93,0x6A8E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6A95,0x6A83,0x6AA8,0x6AA4,0x6A91,0x6A7F,0x6AA6,0x6A9A, +0x6A85,0x6A8C,0x6A92,0x6B5B,0x6BAD,0x6C09,0x6FCC,0x6FA9, +0x6FF4,0x6FD4,0x6FE3,0x6FDC,0x6FED,0x6FE7,0x6FE6,0x6FDE, +0x6FF2,0x6FDD,0x6FE2,0x6FE8,0x71E1,0x71F1,0x71E8,0x71F2, +0x71E4,0x71F0,0x71E2,0x7373,0x736E,0x736F,0x7497,0x74B2, +0x74AB,0x7490,0x74AA,0x74AD,0x74B1,0x74A5,0x74AF,0x7510, +0x7511,0x7512,0x750F,0x7584,0x7643,0x7648,0x7649,0x7647, +0x76A4,0x76E9,0x77B5,0x77AB,0x77B2,0x77B7,0x77B6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x77B4,0x77B1,0x77A8,0x77F0,0x78F3,0x78FD,0x7902, +0x78FB,0x78FC,0x78F2,0x7905,0x78F9,0x78FE,0x7904,0x79AB, +0x79A8,0x7A5C,0x7A5B,0x7A56,0x7A58,0x7A54,0x7A5A,0x7ABE, +0x7AC0,0x7AC1,0x7C05,0x7C0F,0x7BF2,0x7C00,0x7BFF,0x7BFB, +0x7C0E,0x7BF4,0x7C0B,0x7BF3,0x7C02,0x7C09,0x7C03,0x7C01, +0x7BF8,0x7BFD,0x7C06,0x7BF0,0x7BF1,0x7C10,0x7C0A,0x7CE8, +0x7E2D,0x7E3C,0x7E42,0x7E33,0x9848,0x7E38,0x7E2A,0x7E49, +0x7E40,0x7E47,0x7E29,0x7E4C,0x7E30,0x7E3B,0x7E36,0x7E44, +0x7E3A,0x7F45,0x7F7F,0x7F7E,0x7F7D,0x7FF4,0x7FF2,0x802C, +0x81BB,0x81C4,0x81CC,0x81CA,0x81C5,0x81C7,0x81BC,0x81E9, +0x825B,0x825A,0x825C,0x8583,0x8580,0x858F,0x85A7,0x8595, +0x85A0,0x858B,0x85A3,0x857B,0x85A4,0x859A,0x859E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8577,0x857C,0x8589,0x85A1,0x857A,0x8578,0x8557,0x858E, +0x8596,0x8586,0x858D,0x8599,0x859D,0x8581,0x85A2,0x8582, +0x8588,0x8585,0x8579,0x8576,0x8598,0x8590,0x859F,0x8668, +0x87BE,0x87AA,0x87AD,0x87C5,0x87B0,0x87AC,0x87B9,0x87B5, +0x87BC,0x87AE,0x87C9,0x87C3,0x87C2,0x87CC,0x87B7,0x87AF, +0x87C4,0x87CA,0x87B4,0x87B6,0x87BF,0x87B8,0x87BD,0x87DE, +0x87B2,0x8935,0x8933,0x893C,0x893E,0x8941,0x8952,0x8937, +0x8942,0x89AD,0x89AF,0x89AE,0x89F2,0x89F3,0x8B1E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x8B18,0x8B16,0x8B11,0x8B05,0x8B0B,0x8B22,0x8B0F, +0x8B12,0x8B15,0x8B07,0x8B0D,0x8B08,0x8B06,0x8B1C,0x8B13, +0x8B1A,0x8C4F,0x8C70,0x8C72,0x8C71,0x8C6F,0x8C95,0x8C94, +0x8CF9,0x8D6F,0x8E4E,0x8E4D,0x8E53,0x8E50,0x8E4C,0x8E47, +0x8F43,0x8F40,0x9085,0x907E,0x9138,0x919A,0x91A2,0x919B, +0x9199,0x919F,0x91A1,0x919D,0x91A0,0x93A1,0x9383,0x93AF, +0x9364,0x9356,0x9347,0x937C,0x9358,0x935C,0x9376,0x9349, +0x9350,0x9351,0x9360,0x936D,0x938F,0x934C,0x936A,0x9379, +0x9357,0x9355,0x9352,0x934F,0x9371,0x9377,0x937B,0x9361, +0x935E,0x9363,0x9367,0x9380,0x934E,0x9359,0x95C7,0x95C0, +0x95C9,0x95C3,0x95C5,0x95B7,0x96AE,0x96B0,0x96AC,0x9720, +0x971F,0x9718,0x971D,0x9719,0x979A,0x97A1,0x979C, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x979E,0x979D,0x97D5,0x97D4,0x97F1,0x9841,0x9844,0x984A, +0x9849,0x9845,0x9843,0x9925,0x992B,0x992C,0x992A,0x9933, +0x9932,0x992F,0x992D,0x9931,0x9930,0x9998,0x99A3,0x99A1, +0x9A02,0x99FA,0x99F4,0x99F7,0x99F9,0x99F8,0x99F6,0x99FB, +0x99FD,0x99FE,0x99FC,0x9A03,0x9ABE,0x9AFE,0x9AFD,0x9B01, +0x9AFC,0x9B48,0x9B9A,0x9BA8,0x9B9E,0x9B9B,0x9BA6,0x9BA1, +0x9BA5,0x9BA4,0x9B86,0x9BA2,0x9BA0,0x9BAF,0x9D33,0x9D41, +0x9D67,0x9D36,0x9D2E,0x9D2F,0x9D31,0x9D38,0x9D30, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x9D45,0x9D42,0x9D43,0x9D3E,0x9D37,0x9D40,0x9D3D, +0x7FF5,0x9D2D,0x9E8A,0x9E89,0x9E8D,0x9EB0,0x9EC8,0x9EDA, +0x9EFB,0x9EFF,0x9F24,0x9F23,0x9F22,0x9F54,0x9FA0,0x5131, +0x512D,0x512E,0x5698,0x569C,0x5697,0x569A,0x569D,0x5699, +0x5970,0x5B3C,0x5C69,0x5C6A,0x5DC0,0x5E6D,0x5E6E,0x61D8, +0x61DF,0x61ED,0x61EE,0x61F1,0x61EA,0x61F0,0x61EB,0x61D6, +0x61E9,0x64FF,0x6504,0x64FD,0x64F8,0x6501,0x6503,0x64FC, +0x6594,0x65DB,0x66DA,0x66DB,0x66D8,0x6AC5,0x6AB9,0x6ABD, +0x6AE1,0x6AC6,0x6ABA,0x6AB6,0x6AB7,0x6AC7,0x6AB4,0x6AAD, +0x6B5E,0x6BC9,0x6C0B,0x7007,0x700C,0x700D,0x7001,0x7005, +0x7014,0x700E,0x6FFF,0x7000,0x6FFB,0x7026,0x6FFC,0x6FF7, +0x700A,0x7201,0x71FF,0x71F9,0x7203,0x71FD,0x7376, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x74B8,0x74C0,0x74B5,0x74C1,0x74BE,0x74B6,0x74BB,0x74C2, +0x7514,0x7513,0x765C,0x7664,0x7659,0x7650,0x7653,0x7657, +0x765A,0x76A6,0x76BD,0x76EC,0x77C2,0x77BA,0x78FF,0x790C, +0x7913,0x7914,0x7909,0x7910,0x7912,0x7911,0x79AD,0x79AC, +0x7A5F,0x7C1C,0x7C29,0x7C19,0x7C20,0x7C1F,0x7C2D,0x7C1D, +0x7C26,0x7C28,0x7C22,0x7C25,0x7C30,0x7E5C,0x7E50,0x7E56, +0x7E63,0x7E58,0x7E62,0x7E5F,0x7E51,0x7E60,0x7E57,0x7E53, +0x7FB5,0x7FB3,0x7FF7,0x7FF8,0x8075,0x81D1,0x81D2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x81D0,0x825F,0x825E,0x85B4,0x85C6,0x85C0,0x85C3, +0x85C2,0x85B3,0x85B5,0x85BD,0x85C7,0x85C4,0x85BF,0x85CB, +0x85CE,0x85C8,0x85C5,0x85B1,0x85B6,0x85D2,0x8624,0x85B8, +0x85B7,0x85BE,0x8669,0x87E7,0x87E6,0x87E2,0x87DB,0x87EB, +0x87EA,0x87E5,0x87DF,0x87F3,0x87E4,0x87D4,0x87DC,0x87D3, +0x87ED,0x87D8,0x87E3,0x87A4,0x87D7,0x87D9,0x8801,0x87F4, +0x87E8,0x87DD,0x8953,0x894B,0x894F,0x894C,0x8946,0x8950, +0x8951,0x8949,0x8B2A,0x8B27,0x8B23,0x8B33,0x8B30,0x8B35, +0x8B47,0x8B2F,0x8B3C,0x8B3E,0x8B31,0x8B25,0x8B37,0x8B26, +0x8B36,0x8B2E,0x8B24,0x8B3B,0x8B3D,0x8B3A,0x8C42,0x8C75, +0x8C99,0x8C98,0x8C97,0x8CFE,0x8D04,0x8D02,0x8D00,0x8E5C, +0x8E62,0x8E60,0x8E57,0x8E56,0x8E5E,0x8E65,0x8E67, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8E5B,0x8E5A,0x8E61,0x8E5D,0x8E69,0x8E54,0x8F46,0x8F47, +0x8F48,0x8F4B,0x9128,0x913A,0x913B,0x913E,0x91A8,0x91A5, +0x91A7,0x91AF,0x91AA,0x93B5,0x938C,0x9392,0x93B7,0x939B, +0x939D,0x9389,0x93A7,0x938E,0x93AA,0x939E,0x93A6,0x9395, +0x9388,0x9399,0x939F,0x938D,0x93B1,0x9391,0x93B2,0x93A4, +0x93A8,0x93B4,0x93A3,0x93A5,0x95D2,0x95D3,0x95D1,0x96B3, +0x96D7,0x96DA,0x5DC2,0x96DF,0x96D8,0x96DD,0x9723,0x9722, +0x9725,0x97AC,0x97AE,0x97A8,0x97AB,0x97A4,0x97AA, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x97A2,0x97A5,0x97D7,0x97D9,0x97D6,0x97D8,0x97FA, +0x9850,0x9851,0x9852,0x98B8,0x9941,0x993C,0x993A,0x9A0F, +0x9A0B,0x9A09,0x9A0D,0x9A04,0x9A11,0x9A0A,0x9A05,0x9A07, +0x9A06,0x9AC0,0x9ADC,0x9B08,0x9B04,0x9B05,0x9B29,0x9B35, +0x9B4A,0x9B4C,0x9B4B,0x9BC7,0x9BC6,0x9BC3,0x9BBF,0x9BC1, +0x9BB5,0x9BB8,0x9BD3,0x9BB6,0x9BC4,0x9BB9,0x9BBD,0x9D5C, +0x9D53,0x9D4F,0x9D4A,0x9D5B,0x9D4B,0x9D59,0x9D56,0x9D4C, +0x9D57,0x9D52,0x9D54,0x9D5F,0x9D58,0x9D5A,0x9E8E,0x9E8C, +0x9EDF,0x9F01,0x9F00,0x9F16,0x9F25,0x9F2B,0x9F2A,0x9F29, +0x9F28,0x9F4C,0x9F55,0x5134,0x5135,0x5296,0x52F7,0x53B4, +0x56AB,0x56AD,0x56A6,0x56A7,0x56AA,0x56AC,0x58DA,0x58DD, +0x58DB,0x5912,0x5B3D,0x5B3E,0x5B3F,0x5DC3,0x5E70, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5FBF,0x61FB,0x6507,0x6510,0x650D,0x6509,0x650C,0x650E, +0x6584,0x65DE,0x65DD,0x66DE,0x6AE7,0x6AE0,0x6ACC,0x6AD1, +0x6AD9,0x6ACB,0x6ADF,0x6ADC,0x6AD0,0x6AEB,0x6ACF,0x6ACD, +0x6ADE,0x6B60,0x6BB0,0x6C0C,0x7019,0x7027,0x7020,0x7016, +0x702B,0x7021,0x7022,0x7023,0x7029,0x7017,0x7024,0x701C, +0x702A,0x720C,0x720A,0x7207,0x7202,0x7205,0x72A5,0x72A6, +0x72A4,0x72A3,0x72A1,0x74CB,0x74C5,0x74B7,0x74C3,0x7516, +0x7660,0x77C9,0x77CA,0x77C4,0x77F1,0x791D,0x791B, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x7921,0x791C,0x7917,0x791E,0x79B0,0x7A67,0x7A68, +0x7C33,0x7C3C,0x7C39,0x7C2C,0x7C3B,0x7CEC,0x7CEA,0x7E76, +0x7E75,0x7E78,0x7E70,0x7E77,0x7E6F,0x7E7A,0x7E72,0x7E74, +0x7E68,0x7F4B,0x7F4A,0x7F83,0x7F86,0x7FB7,0x7FFD,0x7FFE, +0x8078,0x81D7,0x81D5,0x8264,0x8261,0x8263,0x85EB,0x85F1, +0x85ED,0x85D9,0x85E1,0x85E8,0x85DA,0x85D7,0x85EC,0x85F2, +0x85F8,0x85D8,0x85DF,0x85E3,0x85DC,0x85D1,0x85F0,0x85E6, +0x85EF,0x85DE,0x85E2,0x8800,0x87FA,0x8803,0x87F6,0x87F7, +0x8809,0x880C,0x880B,0x8806,0x87FC,0x8808,0x87FF,0x880A, +0x8802,0x8962,0x895A,0x895B,0x8957,0x8961,0x895C,0x8958, +0x895D,0x8959,0x8988,0x89B7,0x89B6,0x89F6,0x8B50,0x8B48, +0x8B4A,0x8B40,0x8B53,0x8B56,0x8B54,0x8B4B,0x8B55, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8B51,0x8B42,0x8B52,0x8B57,0x8C43,0x8C77,0x8C76,0x8C9A, +0x8D06,0x8D07,0x8D09,0x8DAC,0x8DAA,0x8DAD,0x8DAB,0x8E6D, +0x8E78,0x8E73,0x8E6A,0x8E6F,0x8E7B,0x8EC2,0x8F52,0x8F51, +0x8F4F,0x8F50,0x8F53,0x8FB4,0x9140,0x913F,0x91B0,0x91AD, +0x93DE,0x93C7,0x93CF,0x93C2,0x93DA,0x93D0,0x93F9,0x93EC, +0x93CC,0x93D9,0x93A9,0x93E6,0x93CA,0x93D4,0x93EE,0x93E3, +0x93D5,0x93C4,0x93CE,0x93C0,0x93D2,0x93E7,0x957D,0x95DA, +0x95DB,0x96E1,0x9729,0x972B,0x972C,0x9728,0x9726, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x97B3,0x97B7,0x97B6,0x97DD,0x97DE,0x97DF,0x985C, +0x9859,0x985D,0x9857,0x98BF,0x98BD,0x98BB,0x98BE,0x9948, +0x9947,0x9943,0x99A6,0x99A7,0x9A1A,0x9A15,0x9A25,0x9A1D, +0x9A24,0x9A1B,0x9A22,0x9A20,0x9A27,0x9A23,0x9A1E,0x9A1C, +0x9A14,0x9AC2,0x9B0B,0x9B0A,0x9B0E,0x9B0C,0x9B37,0x9BEA, +0x9BEB,0x9BE0,0x9BDE,0x9BE4,0x9BE6,0x9BE2,0x9BF0,0x9BD4, +0x9BD7,0x9BEC,0x9BDC,0x9BD9,0x9BE5,0x9BD5,0x9BE1,0x9BDA, +0x9D77,0x9D81,0x9D8A,0x9D84,0x9D88,0x9D71,0x9D80,0x9D78, +0x9D86,0x9D8B,0x9D8C,0x9D7D,0x9D6B,0x9D74,0x9D75,0x9D70, +0x9D69,0x9D85,0x9D73,0x9D7B,0x9D82,0x9D6F,0x9D79,0x9D7F, +0x9D87,0x9D68,0x9E94,0x9E91,0x9EC0,0x9EFC,0x9F2D,0x9F40, +0x9F41,0x9F4D,0x9F56,0x9F57,0x9F58,0x5337,0x56B2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x56B5,0x56B3,0x58E3,0x5B45,0x5DC6,0x5DC7,0x5EEE,0x5EEF, +0x5FC0,0x5FC1,0x61F9,0x6517,0x6516,0x6515,0x6513,0x65DF, +0x66E8,0x66E3,0x66E4,0x6AF3,0x6AF0,0x6AEA,0x6AE8,0x6AF9, +0x6AF1,0x6AEE,0x6AEF,0x703C,0x7035,0x702F,0x7037,0x7034, +0x7031,0x7042,0x7038,0x703F,0x703A,0x7039,0x7040,0x703B, +0x7033,0x7041,0x7213,0x7214,0x72A8,0x737D,0x737C,0x74BA, +0x76AB,0x76AA,0x76BE,0x76ED,0x77CC,0x77CE,0x77CF,0x77CD, +0x77F2,0x7925,0x7923,0x7927,0x7928,0x7924,0x7929, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x79B2,0x7A6E,0x7A6C,0x7A6D,0x7AF7,0x7C49,0x7C48, +0x7C4A,0x7C47,0x7C45,0x7CEE,0x7E7B,0x7E7E,0x7E81,0x7E80, +0x7FBA,0x7FFF,0x8079,0x81DB,0x81D9,0x820B,0x8268,0x8269, +0x8622,0x85FF,0x8601,0x85FE,0x861B,0x8600,0x85F6,0x8604, +0x8609,0x8605,0x860C,0x85FD,0x8819,0x8810,0x8811,0x8817, +0x8813,0x8816,0x8963,0x8966,0x89B9,0x89F7,0x8B60,0x8B6A, +0x8B5D,0x8B68,0x8B63,0x8B65,0x8B67,0x8B6D,0x8DAE,0x8E86, +0x8E88,0x8E84,0x8F59,0x8F56,0x8F57,0x8F55,0x8F58,0x8F5A, +0x908D,0x9143,0x9141,0x91B7,0x91B5,0x91B2,0x91B3,0x940B, +0x9413,0x93FB,0x9420,0x940F,0x9414,0x93FE,0x9415,0x9410, +0x9428,0x9419,0x940D,0x93F5,0x9400,0x93F7,0x9407,0x940E, +0x9416,0x9412,0x93FA,0x9409,0x93F8,0x940A,0x93FF, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x93FC,0x940C,0x93F6,0x9411,0x9406,0x95DE,0x95E0,0x95DF, +0x972E,0x972F,0x97B9,0x97BB,0x97FD,0x97FE,0x9860,0x9862, +0x9863,0x985F,0x98C1,0x98C2,0x9950,0x994E,0x9959,0x994C, +0x994B,0x9953,0x9A32,0x9A34,0x9A31,0x9A2C,0x9A2A,0x9A36, +0x9A29,0x9A2E,0x9A38,0x9A2D,0x9AC7,0x9ACA,0x9AC6,0x9B10, +0x9B12,0x9B11,0x9C0B,0x9C08,0x9BF7,0x9C05,0x9C12,0x9BF8, +0x9C40,0x9C07,0x9C0E,0x9C06,0x9C17,0x9C14,0x9C09,0x9D9F, +0x9D99,0x9DA4,0x9D9D,0x9D92,0x9D98,0x9D90,0x9D9B, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x9DA0,0x9D94,0x9D9C,0x9DAA,0x9D97,0x9DA1,0x9D9A, +0x9DA2,0x9DA8,0x9D9E,0x9DA3,0x9DBF,0x9DA9,0x9D96,0x9DA6, +0x9DA7,0x9E99,0x9E9B,0x9E9A,0x9EE5,0x9EE4,0x9EE7,0x9EE6, +0x9F30,0x9F2E,0x9F5B,0x9F60,0x9F5E,0x9F5D,0x9F59,0x9F91, +0x513A,0x5139,0x5298,0x5297,0x56C3,0x56BD,0x56BE,0x5B48, +0x5B47,0x5DCB,0x5DCF,0x5EF1,0x61FD,0x651B,0x6B02,0x6AFC, +0x6B03,0x6AF8,0x6B00,0x7043,0x7044,0x704A,0x7048,0x7049, +0x7045,0x7046,0x721D,0x721A,0x7219,0x737E,0x7517,0x766A, +0x77D0,0x792D,0x7931,0x792F,0x7C54,0x7C53,0x7CF2,0x7E8A, +0x7E87,0x7E88,0x7E8B,0x7E86,0x7E8D,0x7F4D,0x7FBB,0x8030, +0x81DD,0x8618,0x862A,0x8626,0x861F,0x8623,0x861C,0x8619, +0x8627,0x862E,0x8621,0x8620,0x8629,0x861E,0x8625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8829,0x881D,0x881B,0x8820,0x8824,0x881C,0x882B,0x884A, +0x896D,0x8969,0x896E,0x896B,0x89FA,0x8B79,0x8B78,0x8B45, +0x8B7A,0x8B7B,0x8D10,0x8D14,0x8DAF,0x8E8E,0x8E8C,0x8F5E, +0x8F5B,0x8F5D,0x9146,0x9144,0x9145,0x91B9,0x943F,0x943B, +0x9436,0x9429,0x943D,0x943C,0x9430,0x9439,0x942A,0x9437, +0x942C,0x9440,0x9431,0x95E5,0x95E4,0x95E3,0x9735,0x973A, +0x97BF,0x97E1,0x9864,0x98C9,0x98C6,0x98C0,0x9958,0x9956, +0x9A39,0x9A3D,0x9A46,0x9A44,0x9A42,0x9A41,0x9A3A, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x9A3F,0x9ACD,0x9B15,0x9B17,0x9B18,0x9B16,0x9B3A, +0x9B52,0x9C2B,0x9C1D,0x9C1C,0x9C2C,0x9C23,0x9C28,0x9C29, +0x9C24,0x9C21,0x9DB7,0x9DB6,0x9DBC,0x9DC1,0x9DC7,0x9DCA, +0x9DCF,0x9DBE,0x9DC5,0x9DC3,0x9DBB,0x9DB5,0x9DCE,0x9DB9, +0x9DBA,0x9DAC,0x9DC8,0x9DB1,0x9DAD,0x9DCC,0x9DB3,0x9DCD, +0x9DB2,0x9E7A,0x9E9C,0x9EEB,0x9EEE,0x9EED,0x9F1B,0x9F18, +0x9F1A,0x9F31,0x9F4E,0x9F65,0x9F64,0x9F92,0x4EB9,0x56C6, +0x56C5,0x56CB,0x5971,0x5B4B,0x5B4C,0x5DD5,0x5DD1,0x5EF2, +0x6521,0x6520,0x6526,0x6522,0x6B0B,0x6B08,0x6B09,0x6C0D, +0x7055,0x7056,0x7057,0x7052,0x721E,0x721F,0x72A9,0x737F, +0x74D8,0x74D5,0x74D9,0x74D7,0x766D,0x76AD,0x7935,0x79B4, +0x7A70,0x7A71,0x7C57,0x7C5C,0x7C59,0x7C5B,0x7C5A, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7CF4,0x7CF1,0x7E91,0x7F4F,0x7F87,0x81DE,0x826B,0x8634, +0x8635,0x8633,0x862C,0x8632,0x8636,0x882C,0x8828,0x8826, +0x882A,0x8825,0x8971,0x89BF,0x89BE,0x89FB,0x8B7E,0x8B84, +0x8B82,0x8B86,0x8B85,0x8B7F,0x8D15,0x8E95,0x8E94,0x8E9A, +0x8E92,0x8E90,0x8E96,0x8E97,0x8F60,0x8F62,0x9147,0x944C, +0x9450,0x944A,0x944B,0x944F,0x9447,0x9445,0x9448,0x9449, +0x9446,0x973F,0x97E3,0x986A,0x9869,0x98CB,0x9954,0x995B, +0x9A4E,0x9A53,0x9A54,0x9A4C,0x9A4F,0x9A48,0x9A4A, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x9A49,0x9A52,0x9A50,0x9AD0,0x9B19,0x9B2B,0x9B3B, +0x9B56,0x9B55,0x9C46,0x9C48,0x9C3F,0x9C44,0x9C39,0x9C33, +0x9C41,0x9C3C,0x9C37,0x9C34,0x9C32,0x9C3D,0x9C36,0x9DDB, +0x9DD2,0x9DDE,0x9DDA,0x9DCB,0x9DD0,0x9DDC,0x9DD1,0x9DDF, +0x9DE9,0x9DD9,0x9DD8,0x9DD6,0x9DF5,0x9DD5,0x9DDD,0x9EB6, +0x9EF0,0x9F35,0x9F33,0x9F32,0x9F42,0x9F6B,0x9F95,0x9FA2, +0x513D,0x5299,0x58E8,0x58E7,0x5972,0x5B4D,0x5DD8,0x882F, +0x5F4F,0x6201,0x6203,0x6204,0x6529,0x6525,0x6596,0x66EB, +0x6B11,0x6B12,0x6B0F,0x6BCA,0x705B,0x705A,0x7222,0x7382, +0x7381,0x7383,0x7670,0x77D4,0x7C67,0x7C66,0x7E95,0x826C, +0x863A,0x8640,0x8639,0x863C,0x8631,0x863B,0x863E,0x8830, +0x8832,0x882E,0x8833,0x8976,0x8974,0x8973,0x89FE, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8B8C,0x8B8E,0x8B8B,0x8B88,0x8C45,0x8D19,0x8E98,0x8F64, +0x8F63,0x91BC,0x9462,0x9455,0x945D,0x9457,0x945E,0x97C4, +0x97C5,0x9800,0x9A56,0x9A59,0x9B1E,0x9B1F,0x9B20,0x9C52, +0x9C58,0x9C50,0x9C4A,0x9C4D,0x9C4B,0x9C55,0x9C59,0x9C4C, +0x9C4E,0x9DFB,0x9DF7,0x9DEF,0x9DE3,0x9DEB,0x9DF8,0x9DE4, +0x9DF6,0x9DE1,0x9DEE,0x9DE6,0x9DF2,0x9DF0,0x9DE2,0x9DEC, +0x9DF4,0x9DF3,0x9DE8,0x9DED,0x9EC2,0x9ED0,0x9EF2,0x9EF3, +0x9F06,0x9F1C,0x9F38,0x9F37,0x9F36,0x9F43,0x9F4F, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x9F71,0x9F70,0x9F6E,0x9F6F,0x56D3,0x56CD,0x5B4E, +0x5C6D,0x652D,0x66ED,0x66EE,0x6B13,0x705F,0x7061,0x705D, +0x7060,0x7223,0x74DB,0x74E5,0x77D5,0x7938,0x79B7,0x79B6, +0x7C6A,0x7E97,0x7F89,0x826D,0x8643,0x8838,0x8837,0x8835, +0x884B,0x8B94,0x8B95,0x8E9E,0x8E9F,0x8EA0,0x8E9D,0x91BE, +0x91BD,0x91C2,0x946B,0x9468,0x9469,0x96E5,0x9746,0x9743, +0x9747,0x97C7,0x97E5,0x9A5E,0x9AD5,0x9B59,0x9C63,0x9C67, +0x9C66,0x9C62,0x9C5E,0x9C60,0x9E02,0x9DFE,0x9E07,0x9E03, +0x9E06,0x9E05,0x9E00,0x9E01,0x9E09,0x9DFF,0x9DFD,0x9E04, +0x9EA0,0x9F1E,0x9F46,0x9F74,0x9F75,0x9F76,0x56D4,0x652E, +0x65B8,0x6B18,0x6B19,0x6B17,0x6B1A,0x7062,0x7226,0x72AA, +0x77D8,0x77D9,0x7939,0x7C69,0x7C6B,0x7CF6,0x7E9A, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7E98,0x7E9B,0x7E99,0x81E0,0x81E1,0x8646,0x8647,0x8648, +0x8979,0x897A,0x897C,0x897B,0x89FF,0x8B98,0x8B99,0x8EA5, +0x8EA4,0x8EA3,0x946E,0x946D,0x946F,0x9471,0x9473,0x9749, +0x9872,0x995F,0x9C68,0x9C6E,0x9C6D,0x9E0B,0x9E0D,0x9E10, +0x9E0F,0x9E12,0x9E11,0x9EA1,0x9EF5,0x9F09,0x9F47,0x9F78, +0x9F7B,0x9F7A,0x9F79,0x571E,0x7066,0x7C6F,0x883C,0x8DB2, +0x8EA6,0x91C3,0x9474,0x9478,0x9476,0x9475,0x9A60,0x9C74, +0x9C73,0x9C71,0x9C75,0x9E14,0x9E13,0x9EF6,0x9F0A, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x9FA4,0x7068,0x7065,0x7CF7,0x866A,0x883E,0x883D, +0x883F,0x8B9E,0x8C9C,0x8EA9,0x8EC9,0x974B,0x9873,0x9874, +0x98CC,0x9961,0x99AB,0x9A64,0x9A66,0x9A67,0x9B24,0x9E15, +0x9E17,0x9F48,0x6207,0x6B1E,0x7227,0x864C,0x8EA8,0x9482, +0x9480,0x9481,0x9A69,0x9A68,0x9B2E,0x9E19,0x7229,0x864B, +0x8B9F,0x9483,0x9C79,0x9EB7,0x7675,0x9A6B,0x9C7A,0x9E1D, +0x7069,0x706A,0x9EA4,0x9F7E,0x9F49,0x9F98}; + +static int func_big5_uni_onechar(int code){ + if ((code>=0xA140)&&(code<=0xC7FC)) + return(tab_big5_uni0[code-0xA140]); + if ((code>=0xC940)&&(code<=0xF9D5)) + return(tab_big5_uni1[code-0xC940]); + return(0); +} + + +/* page 0 0x00A2-0x00F7 */ +static uint16 tab_uni_big50[]={ +0xA246,0xA247, 0,0xA244, 0,0xA1B1, 0, 0, + 0, 0, 0, 0, 0, 0,0xA258,0xA1D3, + 0, 0, 0, 0, 0,0xA150, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xA1D1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xA1D2}; + +/* page 1 0x02C7-0x0451 */ +static uint16 tab_uni_big51[]={ +0xA3BE, 0,0xA3BC,0xA3BD,0xA3BF, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xA3BB, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xA344,0xA345,0xA346,0xA347,0xA348,0xA349, +0xA34A,0xA34B,0xA34C,0xA34D,0xA34E,0xA34F,0xA350,0xA351, +0xA352,0xA353,0xA354, 0,0xA355,0xA356,0xA357,0xA358, +0xA359,0xA35A,0xA35B, 0, 0, 0, 0, 0, + 0, 0,0xA35C,0xA35D,0xA35E,0xA35F,0xA360,0xA361, +0xA362,0xA363,0xA364,0xA365,0xA366,0xA367,0xA368,0xA369, +0xA36A,0xA36B,0xA36C, 0,0xA36D,0xA36E,0xA36F,0xA370, +0xA371,0xA372,0xA373, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xC7B3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xC7B1,0xC7B2,0xC7B4, +0xC7B5,0xC7B6,0xC7B7,0xC7B8,0xC7B9,0xC7BA, 0, 0, + 0, 0, 0, 0,0xC7BB,0xC7BC,0xC7BD,0xC7BE, +0xC7BF,0xC7C0,0xC7C1,0xC7C2,0xC7C3,0xC7C4,0xC7C5,0xC7C6, +0xC7C7,0xC7C8,0xC7C9,0xC7CA,0xC7CB,0xC7CC,0xC7CD,0xC7CF, +0xC7D0,0xC7D1,0xC7D2,0xC7D3,0xC7D4,0xC7D5,0xC7D6,0xC7D7, +0xC7D8,0xC7D9,0xC7DA,0xC7DB,0xC7DC,0xC7DD,0xC7DE,0xC7DF, +0xC7E0,0xC7E1,0xC7E2,0xC7E3,0xC7E4,0xC7E5,0xC7E6,0xC7E7, +0xC7E8, 0,0xC7CE}; + +/* page 2 0x2013-0x22BF */ +static uint16 tab_uni_big52[]={ +0xA156,0xA158, 0, 0, 0,0xA1A5,0xA1A6, 0, + 0,0xA1A7,0xA1A8, 0, 0, 0, 0,0xA145, + 0, 0,0xA14C,0xA14B, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xA1AC, + 0, 0,0xA1AB, 0, 0, 0, 0, 0, +0xA1B0, 0, 0,0xA1C2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA24A, 0,0xA1C1, 0, 0, 0,0xA24B, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xA2B9,0xA2BA,0xA2BB, +0xA2BC,0xA2BD,0xA2BE,0xA2BF,0xA2C0,0xA2C1,0xA2C2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xA1F6,0xA1F4,0xA1F7, +0xA1F5, 0, 0,0xA1F8,0xA1F9,0xA1FB,0xA1FA, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xA1D4, + 0, 0, 0,0xA1DB,0xA1E8,0xA1E7, 0, 0, +0xA1FD, 0,0xA1FC, 0, 0, 0,0xA1E4,0xA1E5, +0xA1EC, 0, 0,0xA1ED, 0, 0, 0, 0, + 0,0xA1EF,0xA1EE, 0, 0, 0, 0, 0, + 0,0xA1E3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xA1DC, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xA1DA,0xA1DD, 0, + 0, 0, 0,0xA1D8,0xA1D9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xA1E6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xA1E9}; + +/* page 3 0x2460-0x2642 */ +static uint16 tab_uni_big53[]={ +0xC7E9,0xC7EA,0xC7EB,0xC7EC,0xC7ED,0xC7EE,0xC7EF,0xC7F0, +0xC7F1,0xC7F2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xC7F3,0xC7F4,0xC7F5,0xC7F6, +0xC7F7,0xC7F8,0xC7F9,0xC7FA,0xC7FB,0xC7FC, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA277, 0,0xA278, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xA27A, 0, 0, 0, +0xA27B, 0, 0, 0,0xA27C, 0, 0, 0, +0xA27D, 0, 0, 0,0xA275, 0, 0, 0, + 0, 0, 0, 0,0xA274, 0, 0, 0, + 0, 0, 0, 0,0xA273, 0, 0, 0, + 0, 0, 0, 0,0xA272, 0, 0, 0, + 0, 0, 0, 0,0xA271, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA2A4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xA2A5, 0, + 0,0xA2A7, 0, 0, 0, 0, 0, 0, + 0, 0,0xA2A6, 0, 0,0xA27E,0xA2A1,0xA2A3, +0xA2A2,0xA2AC,0xA2AD,0xA2AE, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xA262,0xA263,0xA264,0xA265,0xA266,0xA267,0xA268, +0xA269,0xA270,0xA26F,0xA26E,0xA26D,0xA26C,0xA26B,0xA26A, + 0, 0, 0, 0,0xA276,0xA279, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA1BD,0xA1BC, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xA1B6,0xA1B5, 0, 0, 0, 0, + 0, 0, 0, 0,0xA1BF,0xA1BE, 0, 0, + 0, 0, 0, 0, 0, 0,0xA1BB,0xA1BA, + 0, 0, 0,0xA1B3, 0, 0,0xA1B7,0xA1B4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xA2A8,0xA2A9,0xA2AB,0xA2AA, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xA1B9,0xA1B8, 0, + 0,0xA1F3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA1F0,0xA1F2,0xA1F1}; + +/* page 4 0x3000-0x3129 */ +static uint16 tab_uni_big54[]={ +0xA140,0xA142,0xA143,0xA1B2, 0,0xC6A4, 0, 0, +0xA171,0xA172,0xA16D,0xA16E,0xA175,0xA176,0xA179,0xA17A, +0xA169,0xA16A,0xA245, 0,0xA165,0xA166, 0, 0, + 0, 0, 0, 0, 0,0xA1A9,0xA1AA, 0, + 0,0xA2C3,0xA2C4,0xA2C5,0xA2C6,0xA2C7,0xA2C8,0xA2C9, +0xA2CA,0xA2CB, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xC6A5,0xC6A6,0xC6A7,0xC6A8,0xC6A9,0xC6AA,0xC6AB, +0xC6AC,0xC6AD,0xC6AE,0xC6AF,0xC6B0,0xC6B1,0xC6B2,0xC6B3, +0xC6B4,0xC6B5,0xC6B6,0xC6B7,0xC6B8,0xC6B9,0xC6BA,0xC6BB, +0xC6BC,0xC6BD,0xC6BE,0xC6BF,0xC6C0,0xC6C1,0xC6C2,0xC6C3, +0xC6C4,0xC6C5,0xC6C6,0xC6C7,0xC6C8,0xC6C9,0xC6CA,0xC6CB, +0xC6CC,0xC6CD,0xC6CE,0xC6CF,0xC6D0,0xC6D1,0xC6D2,0xC6D3, +0xC6D4,0xC6D5,0xC6D6,0xC6D7,0xC6D8,0xC6D9,0xC6DA,0xC6DB, +0xC6DC,0xC6DD,0xC6DE,0xC6DF,0xC6E0,0xC6E1,0xC6E2,0xC6E3, +0xC6E4,0xC6E5,0xC6E6,0xC6E7,0xC6E8,0xC6E9,0xC6EA,0xC6EB, +0xC6EC,0xC6ED,0xC6EE,0xC6EF,0xC6F0,0xC6F1,0xC6F2,0xC6F3, +0xC6F4,0xC6F5,0xC6F6,0xC6F7, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xC6A2,0xC6A3, 0, + 0,0xC6F8,0xC6F9,0xC6FA,0xC6FB,0xC6FC,0xC6FD,0xC6FE, +0xC740,0xC741,0xC742,0xC743,0xC744,0xC745,0xC746,0xC747, +0xC748,0xC749,0xC74A,0xC74B,0xC74C,0xC74D,0xC74E,0xC74F, +0xC750,0xC751,0xC752,0xC753,0xC754,0xC755,0xC756,0xC757, +0xC758,0xC759,0xC75A,0xC75B,0xC75C,0xC75D,0xC75E,0xC75F, +0xC760,0xC761,0xC762,0xC763,0xC764,0xC765,0xC766,0xC767, +0xC768,0xC769,0xC76A,0xC76B,0xC76C,0xC76D,0xC76E,0xC76F, +0xC770,0xC771,0xC772,0xC773,0xC774,0xC775,0xC776,0xC777, +0xC778,0xC779,0xC77A,0xC77B,0xC77C,0xC77D,0xC77E,0xC7A1, +0xC7A2,0xC7A3,0xC7A4,0xC7A5,0xC7A6,0xC7A7,0xC7A8,0xC7A9, +0xC7AA,0xC7AB,0xC7AC,0xC7AD,0xC7AE,0xC7AF,0xC7B0, 0, + 0, 0, 0, 0, 0, 0,0xC6A1, 0, + 0, 0, 0, 0, 0,0xA374,0xA375,0xA376, +0xA377,0xA378,0xA379,0xA37A,0xA37B,0xA37C,0xA37D,0xA37E, +0xA3A1,0xA3A2,0xA3A3,0xA3A4,0xA3A5,0xA3A6,0xA3A7,0xA3A8, +0xA3A9,0xA3AA,0xA3AB,0xA3AC,0xA3AD,0xA3AE,0xA3AF,0xA3B0, +0xA3B1,0xA3B2,0xA3B3,0xA3B4,0xA3B5,0xA3B6,0xA3B7,0xA3B8, +0xA3B9,0xA3BA}; + +/* page 5 0x32A3-0x32A3 */ +static uint16 tab_uni_big55[]={ +0xA1C0}; + +/* page 6 0x338E-0x33D5 */ +static uint16 tab_uni_big56[]={ +0xA255,0xA256, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xA250,0xA251, +0xA252, 0, 0,0xA254, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xA257, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA253, 0, 0,0xA1EB,0xA1EA, 0, 0,0xA24F +}; + +/* page 7 0x4E00-0x9483 */ +static uint16 tab_uni_big57[]={ +0xA440,0xA442, 0,0xA443, 0, 0, 0,0xC945, +0xA456,0xA454,0xA457,0xA455,0xC946,0xA4A3,0xC94F,0xC94D, +0xA4A2,0xA4A1, 0, 0,0xA542,0xA541,0xA540, 0, +0xA543,0xA4FE, 0, 0, 0, 0,0xA5E0,0xA5E1, + 0, 0, 0, 0, 0, 0,0xA8C3, 0, + 0, 0, 0,0xA458, 0,0xA4A4,0xC950, 0, +0xA4A5,0xC963,0xA6EA,0xCBB1, 0, 0, 0, 0, +0xA459,0xA4A6, 0,0xA544,0xC964, 0, 0, 0, + 0, 0,0xC940,0xA444, 0,0xA45B, 0,0xC947, +0xA45C, 0, 0,0xA4A7, 0,0xA545,0xA547,0xA546, + 0, 0,0xA5E2,0xA5E3, 0, 0,0xA8C4, 0, +0xADBC,0xA441, 0, 0,0xC941,0xA445,0xA45E,0xA45D, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xA5E4, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xA8C5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xB0AE,0xD44B, + 0, 0,0xB6C3,0xDCB1,0xDCB2, 0,0xA446, 0, +0xA4A9, 0, 0,0xA8C6,0xA447,0xC948,0xA45F, 0, + 0,0xA4AA,0xA4AC,0xC951,0xA4AD,0xA4AB, 0, 0, + 0,0xA5E5, 0,0xA8C7, 0, 0,0xA8C8,0xAB45, + 0,0xA460,0xA4AE, 0,0xA5E6,0xA5E8,0xA5E7, 0, +0xA6EB, 0, 0,0xA8C9,0xA8CA,0xAB46,0xAB47, 0, + 0, 0, 0,0xADBD, 0, 0,0xDCB3, 0, + 0,0xF6D6,0xA448, 0, 0, 0, 0, 0, +0xA4B0,0xA4AF,0xC952,0xA4B1,0xA4B7, 0,0xA4B2,0xA4B3, +0xC954,0xC953,0xA4B5,0xA4B6, 0,0xA4B4, 0, 0, + 0, 0, 0, 0,0xA54A,0xA54B,0xA54C,0xA54D, +0xA549,0xA550,0xC96A, 0,0xC966,0xC969,0xA551,0xA561, + 0,0xC968, 0,0xA54E,0xA54F,0xA548, 0, 0, +0xC965,0xC967, 0, 0, 0, 0, 0, 0, +0xA5F5,0xC9B0,0xA5F2,0xA5F6,0xC9BA,0xC9AE,0xA5F3,0xC9B2, + 0, 0, 0,0xA5F4, 0,0xA5F7, 0,0xA5E9, +0xC9B1,0xA5F8,0xC9B5, 0,0xC9B9,0xC9B6, 0, 0, +0xC9B3,0xA5EA,0xA5EC,0xA5F9, 0,0xA5EE,0xC9AB,0xA5F1, +0xA5EF,0xA5F0,0xC9BB,0xC9B8,0xC9AF,0xA5ED, 0, 0, +0xC9AC,0xA5EB, 0, 0, 0,0xC9B4, 0, 0, + 0, 0,0xC9B7, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xC9AD,0xCA66, 0,0xA742, +0xA6F4, 0, 0,0xCA67,0xA6F1, 0,0xA744, 0, +0xA6F9, 0,0xA6F8,0xCA5B,0xA6FC,0xA6F7,0xCA60,0xCA68, + 0,0xCA64, 0,0xA6FA, 0, 0,0xA6FD,0xA6EE, +0xA747,0xCA5D, 0, 0,0xCBBD,0xA6EC,0xA743,0xA6ED, +0xA6F5,0xA6F6,0xCA62,0xCA5E,0xA6FB,0xA6F3,0xCA5A,0xA6EF, +0xCA65,0xA745,0xA748,0xA6F2,0xA740,0xA746,0xA6F0,0xCA63, +0xA741,0xCA69,0xCA5C,0xA6FE,0xCA5F, 0, 0,0xCA61, + 0,0xA8D8,0xCBBF,0xCBCB,0xA8D0, 0,0xCBCC,0xA8CB, +0xA8D5, 0, 0,0xA8CE,0xCBB9,0xA8D6,0xCBB8,0xCBBC, +0xCBC3,0xCBC1,0xA8DE,0xA8D9,0xCBB3,0xCBB5,0xA8DB,0xA8CF, +0xCBB6,0xCBC2,0xCBC9,0xA8D4,0xCBBB,0xCBB4,0xA8D3,0xCBB7, +0xA8D7,0xCBBA, 0,0xA8D2, 0,0xA8CD, 0,0xA8DC, +0xCBC4,0xA8DD,0xCBC8, 0,0xCBC6,0xCBCA,0xA8DA,0xCBBE, +0xCBB2, 0,0xCBC0,0xA8D1,0xCBC5,0xA8CC,0xCBC7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xAB56,0xAB4A, + 0, 0,0xCDE0,0xCDE8, 0,0xAB49,0xAB51,0xAB5D, + 0,0xCDEE,0xCDEC,0xCDE7, 0, 0, 0,0xAB4B, +0xCDED,0xCDE3,0xAB59,0xAB50,0xAB58,0xCDDE, 0,0xCDEA, + 0,0xCDE1,0xAB54,0xCDE2, 0,0xCDDD,0xAB5B,0xAB4E, +0xAB57,0xAB4D, 0,0xCDDF,0xCDE4, 0,0xCDEB,0xAB55, +0xAB52,0xCDE6,0xAB5A,0xCDE9,0xCDE5,0xAB4F,0xAB5C,0xAB53, +0xAB4C,0xAB48, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xCDEF, 0,0xADD7,0xADC1, + 0,0xADD1, 0,0xADD6,0xD0D0,0xD0CF,0xD0D4,0xD0D5, +0xADC4, 0,0xADCD, 0, 0, 0,0xADDA, 0, +0xADCE, 0, 0, 0, 0,0xD0C9,0xADC7,0xD0CA, + 0,0xADDC, 0,0xADD3,0xADBE,0xADBF,0xD0DD,0xB0BF, + 0,0xADCC,0xADCB,0xD0CB,0xADCF,0xD45B,0xADC6,0xD0D6, +0xADD5,0xADD4,0xADCA,0xD0CE,0xD0D7, 0,0xD0C8,0xADC9, +0xD0D8,0xADD2,0xD0CC,0xADC0, 0,0xADC3,0xADC2,0xD0D9, +0xADD0,0xADC5,0xADD9,0xADDB,0xD0D3,0xADD8, 0,0xD0DB, +0xD0CD,0xD0DC, 0,0xD0D1, 0,0xD0DA, 0,0xD0D2, + 0, 0, 0, 0,0xADC8, 0, 0, 0, +0xD463,0xD457, 0,0xB0B3, 0,0xD45C,0xD462,0xB0B2, +0xD455,0xB0B6,0xD459,0xD452,0xB0B4,0xD456,0xB0B9,0xB0BE, + 0,0xD467, 0,0xD451, 0,0xB0BA, 0,0xD466, + 0, 0,0xB0B5,0xD458,0xB0B1,0xD453,0xD44F,0xD45D, +0xD450,0xD44E,0xD45A,0xD460,0xD461,0xB0B7, 0, 0, +0xD85B,0xD45E,0xD44D,0xD45F, 0,0xB0C1,0xD464,0xB0C0, +0xD44C, 0,0xD454,0xD465,0xB0BC,0xB0BB,0xB0B8,0xB0BD, + 0, 0,0xB0AF, 0, 0,0xB0B0, 0, 0, +0xB3C8, 0,0xD85E,0xD857, 0,0xB3C5, 0,0xD85F, + 0, 0, 0,0xD855,0xD858,0xB3C4,0xD859, 0, + 0,0xB3C7,0xD85D, 0,0xD853,0xD852,0xB3C9, 0, +0xB3CA,0xB3C6,0xB3CB,0xD851,0xD85C,0xD85A,0xD854, 0, + 0, 0,0xB3C3,0xD856, 0, 0, 0, 0, + 0, 0, 0, 0,0xB6CA,0xB6C4,0xDCB7,0xB6CD, +0xDCBD,0xDCC0,0xB6C6,0xB6C7,0xDCBA,0xB6C5,0xDCC3,0xB6CB, +0xDCC4, 0,0xDCBF,0xB6CC, 0,0xDCB4,0xB6C9,0xDCB5, + 0,0xDCBE,0xDCBC, 0,0xDCB8,0xB6C8,0xDCB6,0xB6CE, +0xDCBB,0xDCC2,0xDCB9,0xDCC1, 0, 0,0xB9B6,0xB9B3, + 0,0xB9B4, 0,0xE0F9,0xE0F1,0xB9B2,0xB9AF,0xE0F2, + 0, 0,0xB9B1,0xE0F5, 0,0xE0F7, 0, 0, +0xE0FE, 0, 0,0xE0FD,0xE0F8,0xB9AE,0xE0F0,0xB9AC, +0xE0F3,0xB9B7,0xE0F6, 0,0xE0FA,0xB9B0,0xB9AD,0xE0FC, +0xE0FB,0xB9B5, 0,0xE0F4, 0,0xBBF8,0xE4EC, 0, +0xE4E9,0xBBF9, 0,0xBBF7, 0,0xE4F0,0xE4ED,0xE4E6, +0xBBF6, 0,0xBBFA,0xE4E7,0xBBF5,0xBBFD,0xE4EA,0xE4EB, +0xBBFB,0xBBFC,0xE4F1,0xE4EE,0xE4EF, 0, 0, 0, +0xBEAA,0xE8F8,0xBEA7,0xE8F5,0xBEA9,0xBEAB, 0,0xE8F6, +0xBEA8, 0,0xE8F7, 0,0xE8F4, 0, 0,0xC076, +0xECBD,0xC077,0xECBB, 0,0xECBC,0xECBA,0xECB9, 0, + 0,0xECBE,0xC075, 0, 0,0xEFB8,0xEFB9, 0, +0xE4E8,0xEFB7,0xC078,0xC35F,0xF1EB,0xF1EC, 0,0xC4D7, +0xC4D8,0xF5C1,0xF5C0,0xC56C,0xC56B,0xF7D0, 0,0xA449, +0xA461,0xA4B9, 0,0xA4B8,0xA553,0xA552,0xA5FC,0xA5FB, +0xA5FD,0xA5FA, 0,0xA74A,0xA749,0xA74B, 0, 0, + 0, 0,0xA8E0, 0,0xA8DF,0xA8E1, 0,0xAB5E, + 0,0xA259,0xD0DE,0xA25A,0xB0C2,0xA25C,0xA25B,0xD860, + 0,0xA25D,0xB9B8,0xA25E, 0,0xA44A, 0,0xA4BA, +0xA5FE,0xA8E2, 0,0xA44B,0xA4BD,0xA4BB,0xA4BC, 0, + 0,0xA640, 0, 0, 0,0xA74C,0xA8E4,0xA8E3, +0xA8E5, 0, 0, 0,0xADDD, 0, 0, 0, +0xBEAC, 0, 0, 0, 0, 0, 0,0xC94E, + 0,0xA554,0xA555, 0, 0,0xA641, 0,0xCA6A, + 0,0xAB60,0xAB5F,0xD0E0,0xD0DF,0xB0C3, 0,0xA4BE, +0xC955, 0, 0, 0, 0, 0,0xCBCD, 0, +0xAB61, 0,0xADE0, 0,0xADDE,0xADDF, 0, 0, + 0, 0,0xBEAD, 0,0xA556, 0, 0, 0, +0xA642,0xC9BC, 0, 0, 0, 0,0xA74D,0xA74E, + 0,0xCA6B, 0, 0,0xCBCE,0xA8E6,0xCBCF, 0, + 0, 0, 0, 0,0xD0E2,0xD0E3,0xADE3, 0, +0xD0E4, 0,0xD0E1,0xADE4,0xADE2,0xADE1,0xD0E5, 0, +0xD468, 0, 0, 0,0xD861, 0, 0,0xDCC5, +0xE140, 0, 0, 0,0xBBFE,0xBEAE,0xE8F9, 0, +0xA44C,0xA45A, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xB0C4,0xB3CD, 0,0xB9B9, 0,0xC942,0xA4BF, 0, +0xA559,0xA557,0xA558, 0, 0,0xA8E7, 0, 0, +0xA44D,0xA44E, 0,0xA462, 0, 0,0xA4C0,0xA4C1, +0xA4C2,0xC9BE,0xA55A, 0,0xC96B, 0,0xA646, 0, +0xC9BF,0xA644,0xA645,0xC9BD, 0, 0,0xA647,0xA643, + 0, 0, 0, 0,0xCA6C,0xAAEC,0xCA6D, 0, + 0,0xCA6E, 0, 0,0xA750,0xA74F, 0, 0, +0xA753,0xA751,0xA752, 0, 0, 0,0xA8ED, 0, +0xA8EC,0xCBD4,0xCBD1,0xCBD2, 0,0xCBD0,0xA8EE,0xA8EA, +0xA8E9, 0,0xA8EB,0xA8E8, 0, 0, 0, 0, + 0,0xA8EF, 0,0xAB63,0xCDF0, 0,0xCBD3,0xAB68, + 0,0xCDF1,0xAB64,0xAB67,0xAB66,0xAB65,0xAB62, 0, + 0, 0,0xD0E8, 0,0xADE7,0xD0EB,0xADE5, 0, + 0, 0,0xD0E7,0xADE8,0xADE6,0xADE9,0xD0E9,0xD0EA, + 0,0xD0E6,0xD0EC, 0, 0, 0, 0, 0, + 0,0xB3D1,0xB0C5,0xD469,0xD46B,0xD46A,0xD46C,0xB0C6, + 0, 0,0xB3CE, 0,0xB3CF,0xB3D0, 0,0xB6D0, +0xDCC7, 0,0xDCC6,0xDCC8,0xDCC9,0xB6D1, 0,0xB6CF, +0xE141,0xE142,0xB9BB,0xB9BA,0xE35A, 0, 0,0xBC40, +0xBC41,0xBC42,0xBC44,0xE4F2,0xE4F3,0xBC43, 0, 0, + 0,0xBEAF, 0,0xBEB0, 0, 0,0xF1ED,0xF5C3, +0xF5C2,0xF7D1, 0,0xA44F, 0, 0, 0,0xA55C, +0xA55B, 0, 0,0xA648, 0, 0,0xC9C0, 0, + 0,0xA755,0xA756,0xA754,0xA757,0xCA6F,0xCA70, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xA8F1,0xCBD5, 0,0xA8F0, 0, +0xCDF2,0xAB6C,0xCDF3,0xAB6B, 0, 0, 0,0xAB69, + 0,0xAB6A, 0, 0, 0,0xD0ED, 0, 0, + 0, 0,0xB0C7,0xD46E, 0,0xB0CA,0xD46D,0xB1E5, +0xB0C9,0xB0C8, 0,0xB3D4, 0,0xB3D3,0xB3D2,0xB6D2, + 0, 0,0xB6D5,0xB6D6,0xB6D4, 0,0xB6D3, 0, + 0,0xE143, 0,0xE144, 0, 0, 0,0xE4F5, +0xBC45,0xE4F4, 0,0xBEB1,0xECBF,0xC079, 0,0xF1EE, +0xC455, 0,0xA463,0xA4C3,0xC956, 0,0xA4C4,0xA4C5, + 0, 0, 0, 0, 0,0xA55D,0xA55E, 0, +0xA649,0xCA71,0xCBD6,0xCBD7, 0,0xAB6D,0xD0EE,0xB0CC, +0xB0CB,0xD863,0xD862, 0, 0,0xA450,0xA4C6,0xA55F, + 0,0xB0CD,0xC943, 0,0xC96C,0xA560, 0,0xC9C2, +0xA64B,0xA64A,0xC9C1,0xA758, 0, 0, 0, 0, + 0, 0,0xADEA, 0, 0,0xD46F, 0,0xB6D7, +0xE145,0xB9BC, 0, 0,0xE8FA, 0, 0,0xF3FD, + 0,0xA4C7, 0, 0,0xCBD8,0xCDF4,0xB0D0,0xB0CE, +0xB0CF,0xA451, 0,0xA464,0xA2CD,0xA4CA, 0,0xA4C9, +0xA4C8,0xA563,0xA562, 0,0xC96D,0xC9C3, 0, 0, + 0,0xA8F5,0xA8F2,0xA8F4,0xA8F3, 0, 0,0xAB6E, + 0, 0,0xB3D5, 0,0xA452, 0,0xA4CB, 0, +0xA565,0xA564, 0,0xCA72, 0, 0,0xA8F6, 0, + 0, 0, 0, 0,0xC957, 0,0xA567,0xA566, +0xA64C,0xA64D,0xCA73,0xA759, 0,0xA75A, 0,0xA8F7, +0xA8F8,0xA8F9, 0,0xAB6F,0xCDF5, 0, 0,0xADEB, + 0, 0,0xC944, 0,0xA4CC, 0, 0, 0, + 0, 0,0xC9C4, 0, 0, 0,0xCA74,0xCA75, + 0, 0,0xCBD9, 0,0xCBDA, 0,0xCDF7,0xCDF6, +0xCDF9,0xCDF8,0xAB70, 0,0xD470,0xADED,0xD0EF,0xADEC, + 0, 0, 0, 0,0xD864,0xB3D6, 0,0xD865, + 0, 0, 0, 0,0xE146,0xB9BD, 0, 0, + 0, 0,0xBC46, 0,0xF1EF, 0, 0, 0, + 0,0xC958, 0,0xA568, 0, 0, 0, 0, + 0, 0, 0,0xB0D1, 0, 0, 0, 0, +0xA453,0xA465,0xA4CE,0xA4CD, 0,0xA4CF, 0, 0, + 0, 0, 0, 0,0xA8FB, 0,0xA8FA,0xA8FC, + 0, 0, 0,0xAB71, 0, 0, 0,0xADEE, + 0,0xE8FB,0xC24F,0xA466,0xA56A,0xA579,0xA574, 0, +0xA56F,0xA56E,0xA575,0xA573,0xA56C,0xA57A,0xA56D,0xA569, +0xA578,0xA577,0xA576,0xA56B, 0,0xA572, 0, 0, +0xA571, 0, 0,0xA57B,0xA570, 0, 0, 0, + 0,0xA653, 0,0xA659,0xA655, 0,0xA65B,0xC9C5, +0xA658,0xA64E,0xA651,0xA654,0xA650,0xA657,0xA65A,0xA64F, +0xA652,0xA656,0xA65C, 0, 0, 0, 0, 0, +0xCA7E,0xCA7B, 0,0xA767,0xCA7C,0xA75B,0xA75D,0xA775, +0xA770, 0, 0, 0,0xCAA5,0xCA7D,0xA75F,0xA761, +0xCAA4,0xA768,0xCA78,0xA774,0xA776,0xA75C,0xA76D, 0, +0xCA76,0xA773, 0,0xA764, 0,0xA76E,0xA76F,0xCA77, +0xA76C,0xA76A, 0,0xA76B,0xA771,0xCAA1,0xA75E, 0, +0xA772,0xCAA3,0xA766,0xA763, 0,0xCA7A,0xA762,0xCAA6, +0xA765, 0,0xA769, 0, 0, 0,0xA760,0xCAA2, + 0, 0, 0, 0,0xCA79, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xCBEB,0xCBEA,0xA94F,0xCBED,0xCBEF,0xCBE4,0xCBE7,0xCBEE, +0xA950, 0, 0,0xCBE1,0xCBE5, 0, 0,0xCBE9, +0xCE49,0xA94B,0xCE4D,0xA8FD,0xCBE6,0xA8FE,0xA94C,0xA945, +0xA941, 0,0xCBE2,0xA944,0xA949,0xA952,0xCBE3,0xCBDC, +0xA943,0xCBDD,0xCBDF, 0,0xA946, 0,0xA948,0xCBDB, +0xCBE0, 0, 0,0xA951,0xA94D,0xCBE8,0xA953, 0, +0xA94A,0xCBDE,0xA947, 0, 0,0xA942,0xA940, 0, +0xCBEC, 0,0xA94E, 0, 0, 0, 0, 0, +0xCE48,0xCDFB,0xCE4B, 0, 0,0xCDFD,0xAB78,0xABA8, +0xAB74,0xABA7,0xAB7D,0xABA4,0xAB72,0xCDFC,0xCE43,0xABA3, +0xCE4F,0xABA5, 0,0xAB79, 0, 0,0xCE45,0xCE42, +0xAB77, 0,0xCDFA,0xABA6,0xCE4A,0xAB7C,0xCE4C,0xABA9, +0xAB73,0xAB7E,0xAB7B,0xCE40,0xABA1,0xCE46,0xCE47,0xAB7A, +0xABA2,0xAB76, 0, 0, 0, 0,0xAB75,0xCDFE, + 0, 0, 0, 0, 0, 0,0xCE44, 0, + 0, 0, 0, 0, 0, 0,0xCE4E, 0, +0xD144,0xADFB,0xD0F1, 0,0xD0F6,0xADF4,0xAE40,0xD0F4, +0xADEF,0xADF9,0xADFE,0xD0FB, 0,0xADFA,0xADFD, 0, + 0,0xD0FE,0xADF5,0xD0F5, 0, 0, 0,0xD142, +0xD143, 0,0xADF7,0xD141,0xADF3,0xAE43, 0,0xD0F8, + 0,0xADF1, 0,0xD146,0xD0F9,0xD0FD,0xADF6,0xAE42, +0xD0FA,0xADFC,0xD140,0xD147,0xD4A1, 0,0xD145,0xAE44, +0xADF0,0xD0FC,0xD0F3, 0,0xADF8, 0, 0,0xD0F2, + 0, 0,0xD0F7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xD0F0,0xAE41, + 0, 0,0xD477, 0,0xB0E4,0xD4A7,0xB0E2,0xB0DF, +0xD47C,0xB0DB,0xD4A2,0xB0E6,0xD476,0xD47B,0xD47A,0xADF2, +0xB0E1,0xD4A5, 0,0xD4A8,0xD473, 0,0xB3E8, 0, +0xD4A9,0xB0E7, 0,0xB0D9,0xB0D6,0xD47E,0xB0D3, 0, +0xD4A6, 0,0xB0DA,0xD4AA, 0,0xD474,0xD4A4,0xB0DD, +0xD475,0xD478,0xD47D, 0, 0,0xB0DE,0xB0DC,0xB0E8, + 0, 0, 0, 0,0xB0E3, 0,0xB0D7,0xB1D2, + 0,0xB0D8,0xD479,0xB0E5,0xB0E0,0xD4A3,0xB0D5, 0, + 0, 0,0xB0D4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xD471,0xD472,0xD86A, + 0, 0, 0,0xB3D7,0xB3DA,0xD875,0xB3EE,0xD878, +0xB3D8,0xD871,0xB3DE,0xB3E4,0xB5BD, 0, 0,0xB3E2, +0xD86E,0xB3EF,0xB3DB,0xB3E3,0xD876,0xDCD7,0xD87B,0xD86F, + 0,0xD866,0xD873,0xD86D,0xB3E1,0xD879, 0, 0, +0xB3DD,0xB3F1,0xB3EA, 0,0xB3DF,0xB3DC, 0,0xB3E7, + 0,0xD87A,0xD86C,0xD872,0xD874,0xD868,0xD877,0xB3D9, +0xD867, 0,0xB3E0,0xB3F0,0xB3EC,0xD869,0xB3E6, 0, + 0,0xB3ED,0xB3E9,0xB3E5, 0,0xD870, 0, 0, + 0, 0, 0,0xB3EB, 0, 0, 0,0xDCD5, +0xDCD1, 0,0xDCE0,0xDCCA,0xDCD3,0xB6E5,0xB6E6,0xB6DE, +0xDCDC,0xB6E8,0xDCCF,0xDCCE,0xDCCC,0xDCDE,0xB6DC,0xDCD8, +0xDCCD,0xB6DF,0xDCD6,0xB6DA,0xDCD2,0xDCD9,0xDCDB, 0, + 0,0xDCDF,0xB6E3,0xDCCB,0xB6DD,0xDCD0, 0,0xB6D8, + 0,0xB6E4,0xDCDA,0xB6E0,0xB6E1,0xB6E7,0xB6DB,0xA25F, +0xB6D9,0xDCD4, 0, 0, 0, 0, 0,0xB6E2, + 0, 0,0xDCDD, 0, 0, 0,0xB9CD,0xB9C8, + 0,0xE155,0xE151, 0,0xE14B,0xB9C2,0xB9BE,0xE154, +0xB9BF,0xE14E,0xE150, 0,0xE153, 0,0xB9C4, 0, +0xB9CB,0xB9C5, 0, 0,0xE149,0xB9C6,0xB9C7,0xE14C, +0xB9CC, 0,0xE14A,0xE14F,0xB9C3,0xE148,0xB9C9,0xB9C1, + 0, 0, 0,0xB9C0,0xE14D,0xE152, 0,0xB9CA, + 0, 0, 0, 0, 0, 0, 0,0xE147, + 0,0xBC4D,0xE547, 0,0xE544, 0,0xBC47,0xBC53, +0xBC54, 0,0xBC4A,0xE542,0xBC4C,0xE4F9,0xBC52, 0, +0xE546,0xBC49,0xE548,0xBC48, 0,0xE543,0xE545,0xBC4B, +0xE541,0xE4FA,0xE4F7, 0, 0,0xD86B,0xE4FD, 0, +0xE4F6,0xE4FC,0xE4FB, 0,0xE4F8, 0,0xBC4F, 0, + 0, 0, 0,0xBC4E, 0, 0, 0,0xBC50, +0xE4FE,0xBEB2,0xE540, 0, 0, 0,0xE945, 0, +0xE8FD, 0,0xBEBE,0xE942,0xBEB6,0xBEBA,0xE941, 0, +0xBEB9,0xBEB5,0xBEB8,0xBEB3,0xBEBD,0xE943,0xE8FE,0xBEBC, +0xE8FC,0xBEBB,0xE944,0xE940,0xBC51, 0,0xBEBF,0xE946, +0xBEB7,0xBEB4, 0, 0, 0, 0,0xECC6,0xECC8, +0xC07B,0xECC9,0xECC7,0xECC5,0xECC4,0xC07D,0xECC3,0xC07E, + 0, 0, 0, 0,0xECC1,0xECC2,0xC07A,0xC0A1, +0xC07C, 0, 0,0xECC0, 0,0xC250, 0,0xEFBC, +0xEFBA,0xEFBF,0xEFBD, 0,0xEFBB,0xEFBE, 0, 0, + 0, 0, 0, 0, 0,0xC360,0xF1F2,0xF1F3, +0xC456, 0,0xF1F4,0xF1F0,0xF1F5,0xF1F1,0xC251, 0, + 0, 0,0xF3FE,0xF441,0xC459,0xF440,0xC458,0xC457, + 0, 0, 0, 0,0xC45A,0xF5C5,0xF5C6, 0, +0xC4DA,0xC4D9,0xC4DB,0xF5C4, 0,0xF6D8,0xF6D7, 0, +0xC56D,0xC56F,0xC56E,0xF6D9,0xC5C8,0xF8A6, 0, 0, + 0,0xC5F1, 0,0xF8A5,0xF8EE, 0, 0,0xC949, + 0, 0,0xA57D,0xA57C, 0,0xA65F,0xA65E,0xC9C7, +0xA65D,0xC9C6, 0, 0,0xA779,0xCAA9, 0,0xCAA8, + 0, 0,0xA777,0xA77A, 0, 0,0xCAA7, 0, +0xA778, 0, 0, 0, 0, 0, 0,0xCBF0, + 0,0xCBF1,0xA954, 0, 0, 0, 0,0xABAA, + 0,0xD148,0xD149,0xAE45,0xAE46, 0, 0,0xD4AC, +0xB0E9,0xB0EB,0xD4AB,0xB0EA,0xD87C,0xB3F2, 0, 0, + 0, 0,0xB6E9,0xB6EA,0xDCE1, 0,0xB9CF, 0, +0xB9CE, 0,0xE549,0xE948,0xE947, 0,0xF96B,0xA467, +0xC959, 0,0xC96E,0xC96F, 0, 0, 0, 0, +0xA662,0xA666,0xC9C9, 0,0xA664,0xA663,0xC9C8,0xA665, +0xA661, 0, 0,0xA660,0xC9CA, 0, 0, 0, + 0, 0, 0,0xA7A6, 0, 0,0xA7A3, 0, +0xA77D,0xCAAA, 0, 0, 0,0xCAAB, 0,0xA7A1, + 0,0xCAAD,0xA77B,0xCAAE,0xCAAC,0xA77E,0xA7A2,0xA7A5, +0xA7A4,0xA77C,0xCAAF, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xA959,0xCBFE, 0,0xA95B, 0,0xA95A, 0, +0xCC40,0xA958,0xA957,0xCBF5, 0,0xCBF4, 0,0xCBF2, +0xCBF7,0xCBF6,0xCBF3,0xCBFC,0xCBFD,0xCBFA,0xCBF8,0xA956, + 0, 0, 0,0xCBFB,0xA95C,0xCC41, 0, 0, +0xCBF9, 0,0xABAB,0xA955, 0, 0, 0, 0, + 0, 0, 0,0xABAC,0xCE54, 0, 0,0xCE5A, + 0, 0, 0,0xABB2,0xCE58,0xCE5E, 0,0xCE55, +0xCE59,0xCE5B,0xCE5D,0xCE57, 0,0xCE56,0xCE51,0xCE52, +0xABAD, 0,0xABAF,0xABAE,0xCE53,0xCE5C, 0, 0, + 0, 0, 0, 0, 0, 0,0xABB1, 0, + 0, 0, 0, 0, 0,0xCE50,0xD153, 0, +0xD152,0xD157,0xD14E, 0,0xD151,0xD150, 0,0xD154, + 0,0xD158,0xAE47,0xAE4A, 0, 0,0xD14F,0xD155, + 0, 0, 0,0xAE49,0xD14A, 0,0xABB0,0xD4BA, +0xD156, 0,0xD14D, 0,0xAE48,0xD14C, 0, 0, + 0, 0, 0, 0,0xD4B1, 0, 0,0xB0EC, +0xB0F0,0xD4C1,0xD4AF,0xD4BD,0xB0F1,0xD4BF, 0,0xD4C5, + 0,0xD4C9, 0, 0,0xD4C0,0xD4B4,0xD4BC, 0, +0xD4CA,0xD4C8,0xD4BE,0xD4B9,0xD4B2,0xD8A6,0xD4B0,0xB0F5, +0xD4B7,0xB0F6,0xB0F2,0xD4AD,0xD4C3,0xD4B5, 0, 0, +0xD4B3,0xD4C6,0xB0F3, 0,0xD4CC,0xB0ED,0xB0EF,0xD4BB, +0xD4B6,0xAE4B,0xB0EE,0xD4B8,0xD4C7,0xD4CB,0xD4C2, 0, +0xD4C4, 0, 0, 0,0xD4AE, 0, 0, 0, + 0,0xD8A1, 0,0xD8AA,0xD8A9,0xB3FA,0xD8A2, 0, +0xB3FB,0xB3F9, 0,0xD8A4,0xB3F6,0xD8A8, 0,0xD8A3, +0xD8A5,0xD87D,0xB3F4, 0,0xD8B2,0xD8B1,0xD8AE,0xB3F3, +0xB3F7,0xB3F8,0xD14B,0xD8AB,0xB3F5,0xB0F4,0xD8AD,0xD87E, +0xD8B0,0xD8AF, 0,0xD8B3, 0,0xDCEF, 0,0xD8AC, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD8A7,0xDCE7,0xB6F4,0xB6F7,0xB6F2,0xDCE6,0xDCEA,0xDCE5, + 0,0xB6EC,0xB6F6,0xDCE2,0xB6F0,0xDCE9, 0,0xB6EE, +0xB6ED,0xDCEC,0xB6EF,0xDCEE, 0,0xDCEB,0xB6EB, 0, + 0, 0,0xB6F5,0xDCF0,0xDCE4,0xDCED, 0, 0, +0xDCE3, 0, 0,0xB6F1, 0,0xB6F3, 0,0xDCE8, + 0,0xDCF1, 0, 0,0xE15D,0xB9D0,0xE163, 0, + 0,0xB9D5,0xE15F,0xE166,0xE157,0xB9D7,0xB9D1,0xE15C, +0xBC55,0xE15B,0xE164,0xB9D2, 0,0xB9D6,0xE15A,0xE160, +0xE165,0xE156,0xB9D4,0xE15E, 0, 0,0xE162,0xE168, +0xE158,0xE161, 0,0xB9D3,0xE167, 0, 0, 0, +0xE159, 0, 0, 0,0xBC59,0xE54B,0xBC57,0xBC56, +0xE54D,0xE552, 0,0xE54E, 0,0xE551,0xBC5C, 0, +0xBEA5,0xBC5B, 0,0xE54A,0xE550, 0,0xBC5A,0xE54F, + 0,0xE54C, 0,0xBC58, 0, 0, 0, 0, + 0, 0,0xE94D, 0,0xE94F,0xE94A,0xBEC1,0xE94C, + 0,0xBEC0,0xE94E, 0, 0,0xBEC3,0xE950,0xBEC2, +0xE949,0xE94B, 0, 0, 0, 0,0xC0A5,0xECCC, + 0,0xC0A4,0xECCD,0xC0A3,0xECCB,0xC0A2,0xECCA, 0, +0xC253,0xC252,0xF1F6,0xF1F8, 0,0xF1F7,0xC361,0xC362, + 0, 0,0xC363,0xF442,0xC45B, 0, 0,0xF7D3, +0xF7D2,0xC5F2, 0,0xA468,0xA4D0, 0, 0,0xA7A7, + 0, 0, 0, 0,0xCE5F, 0, 0, 0, + 0,0xB3FC,0xB3FD, 0,0xDCF2,0xB9D8,0xE169,0xE553, + 0, 0, 0,0xC95A, 0, 0,0xCAB0, 0, + 0, 0, 0, 0,0xCC42,0xCE60,0xD159,0xAE4C, + 0, 0,0xF1F9, 0,0xC4DC,0xA469,0xA57E,0xC970, + 0,0xA667,0xA668, 0,0xA95D, 0, 0, 0, +0xB0F7, 0,0xB9DA, 0,0xB9DB,0xB9D9, 0,0xA46A, + 0,0xA4D1,0xA4D3,0xA4D2,0xC95B,0xA4D4,0xA5A1,0xC971, + 0,0xA5A2, 0, 0, 0, 0, 0,0xA669, +0xA66A, 0, 0, 0,0xC9CB, 0,0xA7A8, 0, +0xCAB1, 0, 0, 0,0xA961,0xCC43, 0,0xA95F, +0xA960,0xA95E,0xD15A, 0, 0, 0,0xABB6,0xABB5, +0xABB7,0xABB4, 0,0xCE61,0xA962,0xABB3, 0,0xAE4D, +0xAE4E, 0,0xAE4F, 0,0xD4CD, 0, 0, 0, +0xB3FE,0xD8B4,0xB0F8, 0, 0, 0, 0,0xB6F8, + 0,0xB9DD,0xB9DC,0xE16A, 0,0xBC5D,0xBEC4, 0, +0xEFC0,0xF6DA,0xF7D4,0xA46B,0xA5A3, 0,0xA5A4,0xC9D1, +0xA66C,0xA66F, 0,0xC9CF,0xC9CD,0xA66E,0xC9D0,0xC9D2, +0xC9CC,0xA671,0xA670,0xA66D,0xA66B,0xC9CE, 0, 0, + 0, 0,0xA7B3, 0, 0,0xA7B0,0xCAB6,0xCAB9, +0xCAB8, 0,0xA7AA,0xA7B2, 0, 0,0xA7AF,0xCAB5, +0xCAB3,0xA7AE, 0, 0, 0,0xA7A9,0xA7AC, 0, +0xCAB4,0xCABB,0xCAB7,0xA7AD,0xA7B1,0xA7B4,0xCAB2,0xCABA, +0xA7AB, 0, 0, 0, 0, 0,0xA967,0xA96F, + 0,0xCC4F,0xCC48,0xA970,0xCC53,0xCC44,0xCC4B, 0, + 0,0xA966,0xCC45,0xA964,0xCC4C,0xCC50,0xA963, 0, +0xCC51,0xCC4A, 0,0xCC4D, 0,0xA972,0xA969,0xCC54, +0xCC52, 0,0xA96E,0xA96C,0xCC49,0xA96B,0xCC47,0xCC46, +0xA96A,0xA968,0xA971,0xA96D,0xA965, 0,0xCC4E, 0, +0xABB9, 0,0xABC0,0xCE6F,0xABB8,0xCE67,0xCE63, 0, +0xCE73,0xCE62, 0,0xABBB,0xCE6C,0xABBE,0xABC1, 0, +0xABBC,0xCE70,0xABBF, 0,0xAE56,0xCE76,0xCE64, 0, + 0,0xCE66,0xCE6D,0xCE71,0xCE75,0xCE72,0xCE6B,0xCE6E, + 0, 0,0xCE68,0xABC3,0xCE6A,0xCE69,0xCE74,0xABBA, +0xCE65,0xABC2, 0,0xABBD, 0, 0, 0, 0, + 0,0xAE5C,0xD162, 0,0xAE5B, 0, 0,0xD160, + 0,0xAE50, 0,0xAE55, 0,0xD15F,0xD15C,0xD161, +0xAE51,0xD15B, 0,0xAE54,0xAE52, 0,0xD163,0xAE53, +0xAE57, 0, 0,0xAE58, 0,0xAE5A, 0, 0, + 0,0xAE59, 0, 0, 0,0xD15D,0xD15E, 0, + 0, 0, 0,0xD164, 0,0xD4D4,0xB0F9,0xD8C2, +0xD4D3,0xD4E6, 0, 0,0xB140, 0,0xD4E4, 0, +0xB0FE,0xB0FA,0xD4ED,0xD4DD,0xD4E0, 0,0xB143,0xD4EA, +0xD4E2,0xB0FB,0xB144, 0,0xD4E7,0xD4E5, 0, 0, +0xD4D6,0xD4EB,0xD4DF,0xD4DA, 0,0xD4D0,0xD4EC,0xD4DC, +0xD4CF, 0,0xB142,0xD4E1,0xD4EE,0xD4DE,0xD4D2,0xD4D7, +0xD4CE, 0,0xB141, 0,0xD4DB,0xD4D8,0xB0FC,0xD4D1, + 0,0xD4E9,0xB0FD, 0,0xD4D9,0xD4D5, 0, 0, +0xD4E8, 0, 0, 0, 0, 0, 0,0xB440, +0xD8BB, 0,0xD8B8,0xD8C9,0xD8BD,0xD8CA, 0,0xB442, + 0, 0, 0,0xD8C6,0xD8C3, 0, 0, 0, + 0, 0,0xD8C4,0xD8C7,0xD8CB, 0,0xD4E3,0xD8CD, +0xDD47, 0,0xB443,0xD8CE,0xD8B6,0xD8C0, 0,0xD8C5, + 0, 0,0xB441,0xB444,0xD8CC,0xD8CF,0xD8BA,0xD8B7, + 0, 0,0xD8B9, 0, 0,0xD8BE,0xD8BC,0xB445, + 0,0xD8C8, 0, 0,0xD8BF, 0,0xD8C1,0xD8B5, +0xDCFA,0xDCF8,0xB742,0xB740,0xDD43,0xDCF9,0xDD44,0xDD40, +0xDCF7,0xDD46,0xDCF6,0xDCFD,0xB6FE,0xB6FD,0xB6FC,0xDCFB, +0xDD41,0xB6F9,0xB741, 0,0xDCF4, 0,0xDCFE,0xDCF3, +0xDCFC,0xB6FA,0xDD42,0xDCF5,0xB6FB,0xDD45, 0, 0, + 0, 0, 0, 0, 0,0xE16E,0xB9E2,0xB9E1, +0xB9E3,0xE17A,0xE170,0xE176,0xE16B,0xE179,0xE178,0xE17C, +0xE175,0xB9DE,0xE174,0xB9E4, 0,0xE16D,0xB9DF, 0, +0xE17B,0xB9E0,0xE16F,0xE172,0xE177,0xE171,0xE16C, 0, + 0, 0, 0,0xE173,0xE555,0xBC61,0xE558,0xE557, +0xE55A,0xE55C, 0,0xBC5F, 0,0xE556, 0,0xE554, + 0,0xE55D,0xE55B,0xE559, 0,0xE55F, 0,0xE55E, +0xBC63,0xBC5E, 0,0xBC60,0xBC62, 0, 0,0xE560, +0xE957, 0, 0,0xE956,0xE955, 0,0xE958,0xE951, + 0,0xE952,0xE95A,0xE953, 0,0xBEC5,0xE95C, 0, +0xE95B,0xE954, 0,0xECD1,0xC0A8,0xECCF,0xECD4,0xECD3, +0xE959, 0,0xC0A7, 0,0xECD2,0xECCE,0xECD6,0xECD5, +0xC0A6, 0,0xECD0, 0,0xBEC6, 0, 0, 0, +0xC254, 0, 0, 0,0xEFC1,0xF1FA,0xF1FB,0xF1FC, +0xC45C, 0, 0,0xC45D, 0,0xF443, 0,0xF5C8, +0xF5C7, 0, 0,0xF6DB,0xF6DC,0xF7D5,0xF8A7, 0, +0xA46C,0xA46D, 0,0xA46E,0xA4D5,0xA5A5,0xC9D3,0xA672, +0xA673, 0,0xA7B7,0xA7B8,0xA7B6,0xA7B5, 0,0xA973, + 0, 0,0xCC55,0xA975,0xA974,0xCC56, 0, 0, + 0,0xABC4, 0,0xAE5D,0xD165, 0,0xD4F0, 0, +0xB145,0xB447,0xD4EF,0xB446, 0,0xB9E5, 0,0xE17D, +0xBEC7, 0,0xC0A9,0xECD7, 0,0xC45E, 0,0xC570, + 0,0xC972, 0,0xA5A6,0xC973,0xA676, 0,0xA674, +0xA675,0xA677, 0,0xA7BA,0xA7B9, 0,0xCABC,0xA7BB, + 0, 0,0xCABD,0xCC57, 0,0xCC58, 0,0xA976, +0xA978,0xA97A,0xA977,0xA97B,0xA979, 0, 0, 0, + 0, 0,0xABC8,0xABC5,0xABC7,0xABC9,0xABC6,0xD166, +0xCE77, 0, 0, 0,0xD168,0xD167,0xAE63, 0, +0xAE5F, 0, 0,0xAE60,0xAE62,0xAE64,0xAE61, 0, +0xAE66,0xAE65, 0, 0, 0, 0, 0,0xB14A, +0xD4F2,0xD4F1,0xB149, 0,0xB148,0xB147,0xB14B,0xB146, + 0, 0,0xD8D5,0xD8D2,0xB449,0xD8D1,0xD8D6, 0, +0xB44B,0xD8D4,0xB448,0xB44A,0xD8D3, 0,0xDD48, 0, +0xDD49,0xDD4A, 0, 0, 0, 0,0xB9E6,0xB9EE, +0xE17E,0xB9E8,0xB9EC,0xE1A1,0xB9ED,0xB9E9,0xB9EA,0xB9E7, +0xB9EB,0xBC66,0xD8D0,0xBC67,0xBC65, 0,0xBC64,0xE95D, +0xBEC8,0xECD8,0xECD9, 0, 0,0xC364,0xC45F, 0, +0xA46F, 0,0xA678, 0, 0, 0, 0, 0, + 0,0xABCA, 0,0xD169,0xAE67, 0, 0,0xB14E, +0xB14D,0xB14C,0xB44C,0xB44D,0xD8D7,0xB9EF,0xBEC9,0xA470, +0xC95C,0xA4D6,0xC974, 0, 0,0xC9D4,0xA679, 0, + 0, 0,0xA97C, 0, 0, 0, 0,0xDD4B, + 0, 0,0xA471, 0,0xA4D7,0xC9D5, 0, 0, +0xCABE, 0,0xCABF, 0,0xA7BC, 0, 0, 0, +0xD8D8,0xB44E, 0,0xDD4C, 0, 0, 0,0xC0AA, +0xA472,0xA4A8,0xA4D8,0xC975,0xA5A7, 0,0xA7C0,0xA7BF, +0xA7BD,0xA7BE, 0, 0,0xCC59,0xA97E,0xA9A1,0xCC5A, +0xA97D, 0, 0,0xABCE,0xCE78,0xABCD,0xABCB,0xABCC, +0xAE6A,0xAE68, 0, 0,0xD16B,0xAE69,0xD16A, 0, +0xAE5E,0xD4F3, 0, 0,0xB150,0xB151, 0, 0, +0xB14F, 0,0xB9F0,0xE1A2,0xBC68,0xBC69, 0,0xE561, +0xC0AB,0xEFC2,0xEFC3, 0,0xC4DD,0xF8A8,0xC94B,0xA4D9, + 0,0xA473, 0,0xC977,0xC976, 0, 0, 0, + 0,0xA67A,0xC9D7,0xC9D8,0xC9D6, 0,0xC9D9, 0, + 0, 0, 0, 0, 0, 0,0xCAC7, 0, +0xCAC2,0xCAC4,0xCAC6,0xCAC3,0xA7C4,0xCAC0, 0,0xCAC1, +0xA7C1,0xA7C2,0xCAC5,0xCAC8,0xA7C3,0xCAC9, 0, 0, + 0, 0, 0, 0, 0,0xCC68, 0,0xCC62, +0xCC5D,0xA9A3,0xCC65,0xCC63,0xCC5C,0xCC69,0xCC6C,0xCC67, +0xCC60,0xA9A5,0xCC66,0xA9A6,0xCC61,0xCC64,0xCC5B,0xCC5F, +0xCC6B,0xA9A7, 0,0xA9A8, 0,0xCC5E,0xCC6A,0xA9A2, +0xA9A4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xCEAB,0xCEA4, +0xCEAA,0xCEA3,0xCEA5,0xCE7D,0xCE7B, 0,0xCEAC,0xCEA9, +0xCE79, 0,0xABD0,0xCEA7,0xCEA8, 0,0xCEA6,0xCE7C, +0xCE7A,0xABCF,0xCEA2,0xCE7E, 0, 0,0xCEA1,0xCEAD, + 0, 0, 0, 0, 0, 0, 0, 0, +0xAE6F, 0,0xAE6E, 0,0xD16C,0xAE6B,0xD16E, 0, +0xAE70,0xD16F, 0, 0,0xAE73, 0,0xAE71,0xD170, +0xCEAE,0xD172, 0,0xAE6D, 0,0xAE6C, 0,0xD16D, +0xD171,0xAE72, 0, 0, 0, 0,0xB153,0xB152, + 0, 0, 0,0xD4F5,0xD4F9,0xD4FB,0xB154,0xD4FE, + 0,0xB158,0xD541, 0,0xB15A, 0,0xB156,0xB15E, + 0,0xB15B,0xD4F7,0xB155, 0,0xD4F6,0xD4F4,0xD543, +0xD4F8, 0,0xB157,0xD542,0xB15C,0xD4FD,0xD4FC,0xB15D, +0xD4FA,0xB159, 0, 0, 0, 0,0xD544, 0, +0xD540,0xD8E7,0xD8EE,0xD8E3,0xB451,0xD8DF,0xD8EF,0xD8D9, +0xD8EC,0xD8EA,0xD8E4, 0,0xD8ED,0xD8E6, 0,0xD8DE, +0xD8F0,0xD8DC,0xD8E9,0xD8DA, 0,0xD8F1, 0,0xB452, + 0,0xD8EB,0xDD4F,0xD8DD,0xB44F, 0,0xD8E1, 0, +0xB450,0xD8E0,0xD8E5, 0, 0,0xD8E2, 0, 0, + 0,0xD8E8, 0, 0, 0, 0,0xDD53, 0, + 0, 0,0xDD56,0xDD4E, 0,0xDD50, 0,0xDD55, +0xDD54,0xB743, 0,0xD8DB,0xDD52, 0, 0,0xB744, + 0,0xDD4D,0xDD51, 0, 0, 0, 0,0xE1A9, + 0,0xE1B0,0xE1A7, 0,0xE1AE,0xE1A5,0xE1AD,0xE1B1, +0xE1A4,0xE1A8,0xE1A3, 0,0xB9F1, 0,0xE1A6,0xB9F2, +0xE1AC,0xE1AB,0xE1AA, 0, 0,0xE1AF, 0, 0, + 0, 0,0xE565,0xE567,0xBC6B,0xE568, 0,0xE563, + 0,0xE562,0xE56C, 0,0xE56A,0xBC6A,0xE56D,0xE564, +0xE569,0xE56B,0xE566, 0, 0, 0, 0,0xE961, +0xE966,0xE960,0xE965, 0,0xE95E,0xE968,0xE964,0xE969, +0xE963,0xE95F,0xE967, 0,0xE96A,0xE962, 0,0xECDA, +0xC0AF, 0,0xC0AD, 0,0xC0AC,0xC0AE, 0, 0, +0xEFC4, 0,0xF172,0xF1FD, 0, 0,0xF444,0xF445, + 0,0xC460, 0,0xF5C9, 0,0xC4DE, 0,0xF5CA, + 0,0xF6DE,0xC572, 0,0xC571,0xF6DD,0xC5C9, 0, +0xF7D6, 0, 0, 0, 0,0xA474,0xA67B,0xC9DA, +0xCACA,0xA8B5,0xB15F, 0, 0,0xA475,0xA5AA,0xA5A9, +0xA5A8, 0, 0,0xA7C5, 0, 0,0xAE74, 0, +0xDD57,0xA476,0xA477,0xA478,0xA4DA, 0, 0,0xABD1, + 0,0xCEAF, 0, 0, 0,0xB453,0xA479,0xC95D, + 0, 0,0xA5AB,0xA5AC,0xC978, 0,0xA67C, 0, + 0, 0,0xCACB, 0,0xA7C6, 0,0xCACC, 0, + 0,0xA9AE, 0, 0,0xCC6E,0xA9AC,0xA9AB,0xCC6D, +0xA9A9,0xCC6F,0xA9AA,0xA9AD, 0,0xABD2, 0,0xABD4, +0xCEB3,0xCEB0,0xCEB1,0xCEB2,0xCEB4,0xABD3, 0, 0, +0xD174,0xD173, 0,0xAE76, 0,0xAE75, 0, 0, + 0, 0, 0,0xB162,0xD546, 0,0xB161,0xB163, +0xB160, 0, 0, 0, 0,0xB455,0xD545, 0, +0xB456,0xD8F3, 0,0xB457,0xD8F2,0xB454, 0, 0, + 0, 0,0xDD5A,0xDD5C,0xB745,0xDD5B,0xDD59,0xDD58, + 0, 0, 0,0xE1B4,0xB9F7,0xB9F5, 0,0xB9F6, +0xE1B2,0xE1B3, 0,0xB9F3,0xE571,0xE56F, 0,0xBC6D, +0xE570,0xBC6E,0xBC6C,0xB9F4, 0, 0,0xE96D,0xE96B, +0xE96C,0xE56E,0xECDC,0xC0B0,0xECDB,0xEFC5,0xEFC6,0xE96E, +0xF1FE, 0,0xA47A,0xA5AD,0xA67E,0xC9DB,0xA67D, 0, +0xA9AF,0xB746, 0,0xA4DB,0xA5AE,0xABD5,0xB458, 0, +0xC979, 0,0xC97A, 0,0xC9DC, 0, 0,0xA7C8, +0xCAD0,0xCACE,0xA7C9,0xCACD,0xCACF,0xCAD1, 0,0xA7C7, + 0, 0, 0, 0, 0,0xA9B3,0xA9B4,0xA9B1, + 0, 0,0xA9B0,0xCEB8,0xA9B2, 0, 0, 0, +0xABD6, 0,0xCEB7,0xCEB9,0xCEB6,0xCEBA,0xABD7,0xAE79, +0xD175, 0,0xD177,0xAE77,0xD178,0xAE78,0xD176, 0, +0xCEB5,0xD547,0xD54A,0xD54B,0xD548,0xB167,0xB166,0xB164, +0xB165,0xD549, 0, 0, 0, 0,0xB168, 0, + 0,0xB45A,0xB45B, 0,0xB45C,0xDD5D,0xDD5F,0xDD61, +0xB748,0xB747,0xB459,0xDD60,0xDD5E, 0,0xE1B8, 0, + 0,0xE1B6,0xE1BC,0xB9F8,0xE1BD,0xE1BA,0xB9F9,0xE1B7, +0xE1B5,0xE1BB,0xBC70,0xE573,0xE1B9,0xBC72,0xE574,0xBC71, +0xBC74,0xE575,0xBC6F,0xBC73, 0,0xE973,0xE971,0xE970, +0xE972,0xE96F, 0, 0,0xC366, 0,0xF446,0xF447, + 0,0xF5CB,0xF6DF,0xC655, 0, 0,0xA9B5,0xA7CA, + 0, 0,0xABD8, 0, 0, 0,0xA47B,0xA4DC, + 0,0xA5AF,0xC9DD, 0,0xA7CB,0xCAD2, 0,0xCEBB, +0xABD9, 0,0xB9FA,0xA47C, 0, 0, 0,0xA6A1, + 0, 0,0xB749,0xA47D,0xA4DD,0xA4DE, 0,0xA5B1, +0xA5B0, 0,0xC9DE,0xA6A2, 0,0xCAD3, 0,0xA7CC, + 0, 0,0xCC71,0xCC72,0xCC73, 0,0xA9B6,0xA9B7, +0xCC70,0xA9B8, 0, 0, 0,0xABDA,0xCEBC, 0, +0xD17A,0xAE7A, 0,0xD179, 0,0xB169,0xD54C,0xB16A, +0xD54D, 0, 0, 0,0xB45D, 0, 0, 0, +0xDD62, 0, 0,0xE1BF,0xE1BE, 0,0xB9FB, 0, +0xBC75,0xE576,0xBECA,0xE974,0xC0B1, 0,0xC573,0xF7D8, + 0, 0, 0, 0,0xCC74, 0,0xCEBD,0xB16B, +0xD8F4,0xB74A, 0, 0, 0,0xC255, 0, 0, + 0, 0,0xA7CE, 0,0xA7CD,0xABDB, 0,0xD17B, + 0,0xB16D,0xB343,0xB16E,0xB16C,0xB45E, 0,0xE1C0, +0xB9FC,0xBC76, 0,0xC94C,0xC9DF, 0,0xCAD5,0xA7CF, +0xCAD4,0xA7D0, 0, 0,0xA9BC,0xCC77,0xCC76,0xA9BB, +0xA9B9,0xA9BA,0xCC75, 0, 0,0xABDD,0xCEBE,0xABE0, +0xABDC,0xABE2,0xABDE,0xABDF,0xABE1, 0, 0, 0, +0xAE7D,0xAE7C,0xAE7B, 0, 0, 0,0xD54F,0xB16F, +0xB172,0xB170, 0,0xD54E,0xB175, 0,0xB171,0xD550, +0xB174,0xB173, 0, 0, 0,0xD8F6,0xD8F5, 0, +0xB461,0xB45F,0xB460,0xD8F7,0xB74B,0xDD64,0xB74C,0xDD63, + 0, 0,0xE577, 0, 0,0xBC78,0xE1C1,0xBC77, + 0,0xB9FD, 0,0xECDE,0xE975,0xC0B2,0xECDD,0xF240, +0xF448,0xF449, 0,0xA4DF, 0,0xA5B2, 0, 0, + 0,0xC97B, 0, 0,0xA7D2,0xA7D4, 0,0xC9E2, +0xCAD8,0xCAD7,0xCAD6, 0,0xC9E1,0xC9E0,0xA6A4,0xA7D3, +0xA7D1,0xA6A3, 0, 0, 0,0xA9BD,0xCC78, 0, +0xA9BE,0xCADD, 0,0xCADF,0xCADE,0xCC79, 0, 0, +0xCADA, 0,0xA7D8,0xA7D6, 0,0xCAD9,0xCADB,0xCAE1, + 0,0xA7D5, 0,0xCADC,0xCAE5,0xA9C0, 0,0xCAE2, +0xA7D7, 0,0xCAE0,0xCAE3, 0,0xA9BF, 0,0xA9C1, +0xCAE4, 0, 0, 0, 0, 0, 0, 0, + 0,0xCCAF,0xCCA2,0xCC7E,0xCCAE,0xCCA9,0xABE7,0xA9C2, +0xCCAA,0xCCAD,0xABE3,0xCCAC,0xA9C3,0xA9C8,0xA9C6,0xCCA3, + 0,0xCC7C,0xCCA5,0xA9CD,0xCCB0,0xABE4,0xCCA6, 0, +0xABE5,0xA9C9,0xCCA8, 0,0xCECD,0xABE6,0xCC7B,0xA9CA, +0xABE8,0xA9CB,0xA9C7,0xA9CC,0xCCA7,0xCC7A,0xCCAB,0xA9C4, + 0, 0,0xCC7D,0xCCA4,0xCCA1,0xA9C5, 0,0xCEBF, + 0,0xCEC0, 0, 0, 0, 0, 0, 0, +0xCECA,0xD1A1,0xCECB,0xABEE,0xCECE,0xCEC4,0xABED,0xCEC6, + 0,0xCEC7, 0, 0,0xCEC9,0xABE9, 0, 0, +0xAEA3, 0, 0,0xCEC5,0xCEC1,0xAEA4, 0, 0, +0xCECF,0xAE7E,0xD17D,0xCEC8, 0,0xD17C,0xCEC3,0xCECC, + 0, 0,0xABEC,0xAEA1,0xABF2,0xAEA2,0xCED0,0xD17E, +0xABEB,0xAEA6,0xABF1,0xABF0,0xABEF,0xAEA5,0xCED1,0xAEA7, +0xABEA, 0,0xCEC2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xB176, +0xD1A4,0xD1A6, 0,0xD1A8,0xAEA8,0xAEAE,0xD553,0xD1AC, +0xD1A3,0xB178,0xD551, 0,0xAEAD,0xAEAB,0xD1AE, 0, +0xD552, 0,0xD1A5, 0,0xAEAC,0xD1A9,0xAEAF,0xD1AB, + 0, 0,0xAEAA,0xD1AA,0xD1AD,0xD1A7, 0,0xAEA9, +0xB179, 0,0xD1A2,0xB177, 0, 0, 0, 0, +0xB17A, 0, 0, 0, 0, 0, 0, 0, +0xD555,0xD55E,0xB464, 0,0xB17C,0xB1A3,0xB465,0xD560, +0xB1AA,0xD8F9,0xD556,0xB1A2,0xB1A5,0xB17E,0xD554,0xD562, +0xD565,0xD949, 0,0xD563,0xD8FD,0xB1A1,0xB1A8,0xB1AC, +0xD55D,0xD8F8,0xD561,0xB17B,0xD8FA,0xD564,0xD8FC,0xD559, + 0,0xB462, 0,0xD557,0xD558,0xB1A7, 0, 0, +0xB1A6,0xD55B,0xB1AB,0xD55F,0xB1A4,0xD55C, 0,0xB1A9, +0xB466,0xB463,0xD8FB, 0,0xD55A, 0,0xB17D, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xB46B,0xB46F,0xD940,0xB751,0xB46D,0xD944,0xB471,0xDD65, +0xD946,0xB753,0xB469,0xB46C,0xD947, 0,0xD948,0xD94E, +0xB473,0xB754, 0,0xD94A,0xD94F,0xD943,0xB75E, 0, +0xB755,0xB472,0xD941,0xD950, 0,0xB75D,0xB470,0xB74E, +0xD94D, 0,0xB474,0xD945,0xD8FE,0xB46A,0xD942, 0, +0xD94B, 0,0xB74D,0xB752,0xB467,0xD94C, 0,0xB750, + 0, 0, 0,0xB468, 0, 0, 0,0xB75C, +0xE1C3,0xDD70, 0,0xDD68,0xE1C2, 0,0xDD6C,0xDD6E, + 0, 0,0xDD6B, 0,0xB75B, 0,0xDD6A,0xB75F, + 0, 0, 0,0xE1D2, 0, 0,0xB75A,0xBA40, +0xDD71,0xE1C4, 0, 0,0xB758,0xDD69,0xDD6D,0xB9FE, +0xB74F,0xDD66,0xDD67,0xBA41,0xB757,0xB759,0xB756,0xDD6F, + 0, 0,0xE1C8,0xE1C9,0xE1CE,0xBC7D,0xE1D5, 0, +0xBA47, 0,0xBA46,0xE1D0, 0,0xBC7C,0xE1C5,0xBA45, + 0,0xE1D4,0xBA43,0xBA44, 0,0xE1D1,0xE5AA,0xBC7A, +0xB46E, 0,0xE1D3,0xBCA3,0xE1CB, 0,0xBC7B, 0, +0xBCA2,0xE1C6,0xE1CA,0xE1C7,0xE1CD,0xBA48,0xBC79,0xBA42, + 0,0xE57A,0xE1CF, 0,0xBCA1, 0,0xBCA4, 0, +0xE1CC, 0,0xBC7E,0xE579, 0, 0, 0, 0, + 0,0xE57E,0xBECE,0xE578,0xE9A3,0xE5A9,0xBCA8, 0, +0xBCA6,0xBECC,0xE5A6,0xE5A2,0xBCAC, 0,0xE978, 0, + 0, 0,0xBCAA,0xE5A1, 0,0xE976, 0,0xE5A5, + 0,0xE5A8,0xE57D, 0,0xBCAB, 0, 0,0xBCA5, +0xE977,0xBECD,0xE5A7,0xBCA7,0xBCA9,0xE5A4,0xBCAD,0xE5A3, +0xE57C,0xE57B,0xBECB,0xE5AB,0xE97A,0xECE0,0xBED0, 0, +0xE9A2, 0,0xE97E, 0,0xECE1, 0,0xBED1,0xE9A1, + 0,0xE97C,0xC0B4,0xECDF, 0,0xE979,0xE97B,0xC0B5, +0xBED3,0xC0B3,0xBED2,0xC0B7,0xE97D,0xBECF, 0, 0, + 0, 0, 0, 0, 0, 0,0xEFCF, 0, +0xEFC7, 0, 0, 0, 0, 0,0xECE7,0xEFC8, +0xECE3, 0, 0,0xC256,0xECE5,0xECE4,0xC0B6,0xECE2, +0xECE6,0xEFD0,0xEFCC,0xEFCE, 0,0xEFC9,0xEFCA, 0, +0xEFCD,0xEFCB,0xC367, 0, 0,0xC36A,0xC369,0xC368, +0xC461,0xF44A,0xC462,0xF241,0xC4DF,0xF5CC,0xC4E0,0xC574, +0xC5CA,0xF7D9, 0,0xF7DA,0xF7DB, 0, 0,0xF9BA, +0xA4E0,0xC97C,0xA5B3, 0,0xA6A6,0xA6A7,0xA6A5, 0, +0xA6A8,0xA7DA,0xA7D9, 0,0xCCB1,0xA9CF,0xA9CE, 0, + 0,0xD1AF,0xB1AD,0xB1AE, 0, 0, 0,0xB475, +0xDD72,0xB760,0xB761,0xDD74,0xDD76,0xDD75, 0,0xE1D7, + 0,0xE1D6,0xBA49,0xE1D8, 0,0xE5AC,0xBCAE, 0, +0xBED4, 0,0xC0B8,0xC257,0xC0B9, 0,0xA4E1, 0, + 0, 0,0xCAE6, 0, 0,0xCCB2,0xA9D1,0xA9D0, +0xA9D2,0xABF3,0xCED2,0xCED3, 0, 0,0xD1B0,0xAEB0, +0xB1AF,0xB476,0xD951,0xA4E2, 0,0xA47E,0xA4E3, 0, +0xC97D,0xA5B7,0xA5B6,0xA5B4,0xA5B5, 0, 0, 0, +0xA6AB,0xC9E9,0xC9EB,0xA6AA,0xC9E3, 0,0xC9E4, 0, +0xC9EA,0xC9E6,0xC9E8,0xA6A9,0xC9E5,0xC9EC,0xC9E7, 0, + 0, 0, 0, 0, 0,0xA7E1,0xA7EA,0xA7E8, +0xCAF0,0xCAED,0xCAF5,0xA7E6,0xCAF6, 0,0xA7DF,0xCAF3, + 0,0xA7E5,0xCAEF,0xCAEE,0xA7E3,0xCAF4,0xA7E4,0xA9D3, +0xA7DE,0xCAF1, 0,0xCAE7,0xA7DB, 0,0xA7EE,0xCAEC, +0xCAF2,0xA7E0,0xA7E2, 0,0xCAE8, 0,0xCAE9,0xCAEA, + 0,0xA7ED,0xA7E7,0xA7EC,0xCAEB,0xA7EB,0xA7DD,0xA7DC, +0xA7E9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA9E1,0xCCBE,0xCCB7,0xA9DC,0xA9EF,0xCCB3,0xCCBA,0xCCBC, +0xCCBF,0xA9EA, 0,0xCCBB,0xCCB4,0xA9E8,0xCCB8, 0, +0xCCC0,0xA9D9, 0,0xCCBD,0xA9E3,0xA9E2,0xCCB6,0xA9D7, + 0, 0,0xA9D8, 0,0xA9D6, 0,0xA9EE,0xA9E6, +0xA9E0,0xA9D4,0xCCB9,0xA9DF,0xA9D5,0xA9E7,0xA9F0,0xCED4, +0xA9E4,0xCCB5,0xA9DA,0xA9DD,0xA9DE, 0,0xA9EC,0xA9ED, +0xA9EB,0xA9E5,0xA9E9,0xA9DB,0xABF4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xCEDA,0xAC41,0xABF8,0xABFA,0xAC40, +0xCEE6,0xABFD,0xD1B1,0xAEB1,0xAC43,0xCED7,0xCEDF,0xABFE, +0xCEDE,0xCEDB,0xCEE3,0xCEE5,0xABF7,0xABFB,0xAC42,0xAEB3, +0xCEE0,0xABF9,0xAC45,0xCED9, 0, 0, 0,0xABFC, +0xAEB2,0xABF6, 0,0xCED6,0xCEDD,0xCED5,0xCED8,0xCEDC, +0xD1B2,0xAC44, 0,0xCEE1,0xCEE2,0xCEE4,0xABF5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xAEC1,0xD1BE,0xAEBF,0xAEC0,0xD1B4,0xD1C4, 0,0xAEB6, + 0, 0,0xD566,0xD1C6,0xD1C0, 0,0xD1B7, 0, +0xD1C9,0xD1BA,0xAEBC,0xD57D,0xD1BD,0xAEBE,0xAEB5, 0, +0xD1CB,0xD1BF,0xAEB8,0xD1B8,0xD1B5,0xD1B6,0xAEB9,0xD1C5, +0xD1CC,0xAEBB,0xD1BC,0xD1BB,0xAEC3,0xAEC2,0xAEB4,0xAEBA, +0xAEBD,0xD1C8, 0, 0,0xD1C2,0xAEB7,0xD1B3,0xD1CA, +0xD1C1,0xD1C3,0xD1C7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xD567, 0,0xB1B7, +0xB1CB,0xB1CA, 0,0xB1BF, 0,0xD579,0xD575,0xD572, +0xD5A6,0xB1BA,0xB1B2, 0, 0,0xD577,0xB4A8,0xB1B6, +0xD5A1, 0,0xB1CC,0xB1C9,0xD57B,0xD56A, 0, 0, +0xB1C8,0xD5A3,0xD569,0xB1BD,0xB1C1,0xD5A2, 0,0xD573, +0xB1C2,0xB1BC,0xD568, 0,0xB478,0xD5A5,0xD571,0xB1C7, +0xD574,0xD5A4,0xB1C6, 0,0xD952, 0,0xB1B3,0xD56F, +0xB1B8,0xB1C3, 0,0xB1BE,0xD578,0xD56E,0xD56C,0xD57E, +0xB1B0,0xB1C4,0xB1B4,0xB477,0xD57C,0xB1B5, 0,0xB1B1, +0xB1C0,0xB1BB,0xB1B9,0xD570,0xB1C5,0xD56D,0xD57A,0xD576, +0xD954,0xD953, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xD56B,0xD964, 0, +0xB47A, 0,0xD96A,0xD959,0xD967,0xDD77,0xB47D,0xD96B, +0xD96E,0xB47C,0xD95C,0xD96D,0xD96C,0xB47E,0xD955,0xB479, +0xB4A3, 0,0xB4A1,0xD969, 0,0xD95F,0xB4A5,0xD970, +0xD968,0xD971,0xB4AD,0xB4AB,0xD966,0xD965, 0,0xD963, +0xD95D,0xB4A4, 0,0xB4A2,0xD1B9,0xD956, 0,0xDDB7, +0xD957,0xB47B,0xB4AA,0xDD79, 0,0xB4A6,0xB4A7,0xD958, +0xD96F,0xDD78,0xD960,0xD95B,0xB4A9,0xD961,0xD95E, 0, + 0,0xB4AE, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xB770, 0, + 0,0xDD7C,0xDDB1,0xDDB6,0xDDAA,0xB76C,0xDDBB,0xB769, +0xDD7A, 0,0xDD7B,0xB762,0xB76B,0xDDA4,0xB76E,0xB76F, +0xDDA5, 0,0xDDB2,0xDDB8,0xB76A, 0,0xB764,0xDDA3, +0xDD7D,0xDDBA,0xDDA8,0xDDA9,0xDD7E,0xDDB4,0xDDAB,0xDDB5, +0xDDAD, 0,0xB765,0xE1D9,0xB768,0xB766,0xDDB9,0xDDB0, +0xDDAC, 0, 0,0xDDA1,0xBA53,0xDDAF,0xB76D,0xDDA7, + 0,0xDDA6, 0, 0, 0,0xB767,0xB763,0xE1EE, +0xDDB3,0xDDAE, 0,0xDDA2, 0, 0, 0, 0, + 0, 0, 0,0xE1E9, 0,0xE1DA,0xE1E5, 0, +0xE1EC,0xBA51,0xB4AC,0xE1EA,0xBA4C, 0, 0, 0, +0xBA4B,0xE1F1, 0,0xE1DB,0xE1E8,0xE1DC,0xE1E7,0xBA4F, +0xE1EB,0xD962, 0, 0, 0,0xE1F2,0xE1E3,0xBA52, +0xE5BA,0xBCAF, 0,0xE1F0,0xE1EF,0xBA54,0xE5AD,0xBCB0, +0xE5AE, 0,0xE1DF,0xE1E0,0xE1DD,0xE1E2,0xE1DE,0xE1F3, +0xBA4E,0xBCB1,0xBA50,0xBA55, 0,0xE1E1, 0,0xE1ED, + 0, 0,0xE1E6, 0, 0,0xE5B1, 0,0xBA4A, +0xBCB4,0xE9AA,0xE5B6,0xE5B5,0xE5B7, 0, 0,0xE5B4, +0xBCB5, 0,0xBCBB,0xBCB8, 0,0xBCB9,0xE5AF,0xE5B2, +0xE5BC,0xBCC1,0xBCBF, 0,0xE5B3,0xD95A,0xBCB2,0xE5B9, +0xE5B0, 0,0xBCC2,0xE5B8,0xBA4D,0xBCB7,0xE1E4, 0, + 0,0xBCBA, 0,0xBCBE,0xBCC0,0xBCBD,0xBCBC, 0, +0xBCB6,0xE5BB,0xBCB3,0xBCC3, 0, 0, 0, 0, + 0, 0, 0,0xBED8,0xBED9,0xE9A9,0xBEE2,0xBEDF, + 0,0xBED6,0xBEDD,0xE9AB,0xBEDB,0xBED5, 0,0xBEDC, + 0,0xE9A8,0xC0BB,0xBED7, 0,0xBEDE,0xC0BA,0xE9A7, +0xE9A6, 0,0xBEE0, 0,0xBEE1, 0,0xE9A5,0xE9A4, +0xC0BC,0xE9AE,0xBEDA,0xE9AC, 0, 0, 0, 0, +0xC0BD, 0,0xC0C2,0xECEA,0xECEC, 0,0xC0BF, 0, +0xECED,0xECE9, 0,0xECEB,0xC0C0,0xC0C3, 0,0xECE8, +0xC0BE,0xC0C1,0xC259,0xE9AD,0xC258, 0, 0,0xC25E, +0xEFD4, 0,0xC25C,0xC25D,0xEFD7,0xEFD3,0xC25A,0xEFD1, +0xC36B,0xEFD5, 0,0xEFD6,0xEFD2, 0,0xC25B,0xF242, + 0,0xF245, 0, 0,0xF246,0xF244,0xF247,0xC36C, +0xF243, 0, 0,0xF44E,0xC464,0xF44D,0xF44C,0xF44B, +0xC463,0xC465, 0,0xF5CD,0xC4E2,0xC4E1, 0, 0, +0xF6E1,0xF6E0,0xF6E3,0xC5CB,0xC575,0xF7DD,0xF6E2, 0, + 0,0xF7DC,0xC5CD,0xC5CC,0xC5F3,0xF8A9,0xF8EF,0xA4E4, + 0, 0,0xD972,0xE9AF, 0, 0,0xA6AC,0xCAF7, +0xA7F1,0xA7EF, 0,0xA7F0, 0,0xCCC1,0xA9F1,0xAC46, + 0,0xCEE7, 0,0xCEE8, 0,0xAC47,0xD1CE, 0, +0xAEC4,0xAEC5,0xD1CD, 0, 0, 0, 0,0xB1D3, + 0,0xB1CF, 0,0xD5A7,0xB1D6,0xB1D5,0xB1CE,0xB1D1, +0xB1D4,0xB1D0, 0, 0,0xD976,0xB1CD,0xB4AF, 0, + 0, 0,0xB4B1,0xB4B2,0xD975,0xD978,0xB4B0,0xD973, +0xD977, 0,0xD974, 0,0xB771, 0, 0,0xDDBC, + 0, 0,0xBA56,0xE1F4,0xBEE3,0xBCC4,0xE5BD,0xBCC5, +0xBCC6,0xE5BF,0xE5BE,0xE5C0,0xE9B1, 0, 0,0xE9B0, +0xECEF,0xECEE,0xC0C4,0xC0C5,0xF248, 0, 0,0xA4E5, + 0, 0, 0, 0,0xD979, 0, 0, 0, +0xB4B4,0xB4B3,0xDDBD, 0,0xEFD8,0xC4E3,0xF7DE,0xA4E6, + 0,0xAEC6, 0,0xB1D8,0xB1D7,0xD97A,0xD97B,0xB772, +0xE1F5,0xBA57,0xE9B2, 0,0xA4E7,0xA5B8, 0,0xA9F2, +0xCCC2, 0,0xCEE9,0xAC48,0xB1D9, 0,0xD97C,0xB4B5, +0xB773, 0,0xE5C1,0xE5C2, 0, 0,0xECF0,0xC25F, +0xF8F0,0xA4E8, 0,0xCCC3,0xA9F3,0xAC49, 0,0xCEEA, + 0,0xAEC7,0xD1D2,0xD1D0,0xD1D1,0xAEC8,0xD1CF, 0, + 0, 0, 0,0xB1DB,0xB1DC,0xD5A8,0xB1DD,0xB1DA, +0xD97D, 0,0xD97E,0xDDBE, 0, 0,0xBA59,0xBA58, + 0, 0,0xECF1,0xEFD9, 0,0xF24A,0xF249,0xF44F, + 0,0xC95E,0xAC4A, 0, 0,0xA4E9,0xA5B9, 0, +0xA6AE,0xA6AD, 0, 0,0xA6AF,0xA6B0,0xC9EE,0xC9ED, +0xCAF8,0xA7F2,0xCAFB,0xCAFA,0xCAF9,0xCAFC, 0, 0, + 0, 0,0xA9F4,0xCCC9,0xCCC5,0xCCCE, 0, 0, +0xA9FB, 0,0xA9F9,0xCCCA,0xCCC6,0xCCCD,0xA9F8,0xAA40, +0xCCC8,0xCCC4,0xA9FE,0xCCCB,0xA9F7,0xCCCC,0xA9FA,0xA9FC, +0xCCD0,0xCCCF,0xCCC7,0xA9F6,0xA9F5,0xA9FD, 0, 0, + 0, 0, 0, 0,0xCEEF,0xCEF5, 0,0xAC50, +0xAC4D,0xCEEC,0xCEF1, 0,0xAC53,0xAC4B,0xCEF0,0xAC4E, +0xAC51, 0, 0,0xCEF3, 0,0xAC4C,0xCEF8,0xAC4F, + 0,0xAC52,0xCEED,0xCEF2,0xCEF6,0xCEEE,0xCEEB, 0, + 0,0xCEF7,0xCEF4, 0, 0, 0, 0, 0, + 0,0xAED0,0xAEC9,0xAECC, 0,0xAECF, 0,0xD1D5, + 0,0xAECA,0xD1D3, 0,0xAECE, 0, 0,0xAECB, + 0,0xD1D6,0xAECD, 0, 0, 0, 0, 0, + 0,0xD5AC,0xB1DF,0xD5AB,0xD5AD,0xB1DE,0xB1E3,0xD1D4, + 0,0xD5AA,0xD5AE, 0,0xB1E0,0xD5A9,0xB1E2, 0, +0xB1E1, 0,0xD9A7, 0,0xD9A2, 0,0xB4B6,0xB4BA, +0xB4B7,0xD9A5,0xD9A8, 0,0xB4B8, 0,0xB4B9,0xB4BE, +0xDDC7,0xD9A6,0xB4BC,0xD9A3,0xD9A1, 0,0xB4BD, 0, +0xD9A4, 0, 0, 0,0xB779, 0,0xDDBF,0xB776, +0xB777,0xB775,0xDDC4,0xDDC3,0xDDC0,0xB77B, 0, 0, +0xDDC2,0xB4BB, 0, 0,0xDDC6,0xDDC1,0xB778,0xB774, +0xB77A,0xDDC5, 0, 0, 0,0xBA5C, 0,0xE1F8, +0xE1F7,0xE1F6,0xBA5A, 0, 0, 0, 0, 0, +0xBA5B,0xE5C5,0xE5C8,0xBCC8, 0, 0,0xBCC7,0xE5C9, +0xE5C4,0xBCCA,0xE5C6, 0,0xBCC9,0xE5C3, 0,0xE5C7, +0xBEE9,0xBEE6,0xE9BB,0xE9BA, 0,0xE9B9,0xE9B4, 0, +0xE9B5, 0, 0, 0,0xBEE7, 0,0xBEE4,0xBEE8, +0xE9B3,0xBEE5,0xE9B6,0xE9B7,0xE9BC, 0, 0,0xE9B8, + 0, 0,0xECF2, 0, 0, 0,0xC0C7, 0, +0xEFDC,0xC0C6,0xEFDA,0xEFDB,0xC260,0xC36E,0xF24B, 0, +0xC36D, 0, 0,0xF451,0xF452, 0,0xC466, 0, +0xF450,0xC4E4, 0,0xF7DF,0xC5CE,0xF8AA,0xF8AB, 0, +0xA4EA, 0,0xA6B1,0xA6B2,0xA7F3, 0,0xCCD1,0xAC54, +0xAED1,0xB1E4, 0, 0,0xB0D2, 0,0xB4BF,0xB4C0, +0xB3CC,0xD9A9, 0,0xB77C,0xE1FA,0xE1F9, 0, 0, +0xA4EB,0xA6B3,0xCCD2,0xAA42, 0,0xAA41, 0,0xCEF9, +0xCEFA, 0,0xD1D7,0xD1D8,0xAED2,0xAED3, 0,0xAED4, +0xD5AF, 0, 0,0xB1E6, 0,0xB4C2, 0,0xB4C1, +0xDDC8,0xDF7A,0xE1FB,0xE9BD, 0, 0,0xC261,0xC467, +0xA4EC, 0,0xA5BC,0xA5BD,0xA5BB,0xA5BE,0xA5BA, 0, + 0,0xA6B6, 0,0xC9F6,0xA6B5,0xA6B7, 0, 0, +0xC9F1,0xC9F0,0xC9F3,0xC9F2,0xC9F5,0xA6B4,0xC9EF,0xC9F4, + 0, 0, 0, 0, 0,0xCAFD,0xA7FD,0xCAFE, +0xCB43,0xA7FC, 0,0xCB47,0xCB42,0xCB45,0xA7F5,0xA7F6, +0xA7F7,0xA7F8, 0,0xA840, 0,0xCB41,0xA7FA,0xA841, + 0,0xCB40,0xCB46, 0,0xA7F9,0xCB44,0xA7FB,0xA7F4, +0xA7FE, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xAA57, 0,0xCCD4,0xAA43, 0,0xAA4D, +0xAA4E,0xAA46,0xAA58,0xAA48,0xCCDC,0xAA53,0xCCD7,0xAA49, +0xCCE6,0xCCE7,0xCCDF,0xCCD8,0xAA56,0xCCE4,0xAA51,0xAA4F, + 0,0xCCE5, 0,0xCCE3,0xCCDB,0xCCD3,0xCCDA,0xAA4A, + 0,0xAA50, 0,0xAA44,0xCCDE,0xCCDD,0xCCD5, 0, +0xAA52,0xCCE1,0xCCD6,0xAA55,0xCCE8,0xAA45, 0,0xAA4C, +0xCCD9,0xCCE2,0xAA54, 0,0xAA47,0xAA4B, 0,0xCCE0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xCF5B,0xAC5C, +0xAC69, 0,0xCF56,0xCF4C,0xAC62,0xCF4A,0xAC5B,0xCF45, +0xAC65,0xCF52,0xCEFE,0xCF41, 0, 0, 0, 0, +0xCF44,0xCEFB,0xCF51,0xCF61,0xAC60,0xCF46,0xCF58, 0, +0xCEFD,0xCF5F,0xCF60,0xCF63,0xCF5A,0xCF4B,0xCF53,0xAC66, +0xAC59,0xAC61,0xAC6D,0xAC56,0xAC58, 0, 0, 0, +0xCF43,0xAC6A,0xAC63,0xCF5D,0xCF40,0xAC6C,0xAC67,0xCF49, + 0, 0,0xAC6B,0xCF50,0xCF48,0xAC64,0xCF5C,0xCF54, + 0,0xAC5E,0xCF62,0xCF47,0xAC5A,0xCF59,0xCF4F,0xAC5F, +0xCF55,0xAC57,0xCEFC,0xAC68,0xAEE3,0xAC5D,0xCF4E,0xCF4D, +0xCF42, 0,0xCF5E, 0,0xCF57, 0, 0,0xAC55, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xD1EC,0xAEEA,0xD1ED, 0,0xD1E1,0xAEDF, +0xAEEB, 0,0xD1DA, 0,0xD1E3,0xD1EB, 0,0xD1D9, +0xD1F4,0xAED5, 0, 0, 0,0xD1F3,0xD1EE, 0, +0xD1EF,0xAEDD,0xAEE8,0xD1E5, 0,0xD1E6,0xD1F0,0xD1E7, + 0,0xD1E2,0xD1DC,0xD1DD,0xD1EA,0xD1E4, 0, 0, +0xAED6,0xAEDA,0xD1F2,0xD1DE,0xAEE6,0xAEE2, 0, 0, +0xAEE5,0xAEEC,0xAEDB,0xAEE7,0xD1E9,0xAEE9,0xAED8, 0, +0xAED7,0xD1DB, 0,0xD1DF,0xAEE0,0xD1F1,0xD1E8,0xD1E0, +0xAEE4,0xAEE1, 0,0xAED9,0xAEDC, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xD5C4, 0,0xD5B4,0xD5B5,0xD5B9, + 0,0xD5C8,0xD5C5, 0,0xD5BE,0xD5BD,0xB1ED,0xD5C1, +0xD5D0,0xD5B0, 0,0xD5D1,0xD5C3,0xD5D5,0xD5C9,0xB1EC, +0xD5C7,0xB1E7,0xB1FC,0xB1F2, 0,0xB1F6,0xB1F5,0xD5B1, + 0,0xD5CE,0xD5D4,0xD5CC,0xD5D3, 0, 0,0xD5C0, +0xD5B2,0xD5D2,0xD5C2,0xB1EA,0xB1F7, 0,0xD5CB,0xB1F0, + 0, 0, 0,0xD5CA,0xD5B3,0xB1F8, 0,0xB1FA, +0xD5CD,0xB1FB,0xB1E9,0xD5BA,0xD5CF, 0, 0,0xB1EF, +0xB1F9,0xD5BC,0xD5C6,0xD5B7,0xD5BB,0xB1F4,0xD5B6,0xB1E8, +0xB1F1,0xB1EE,0xD5BF,0xAEDE,0xD9C0,0xB1EB, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xB1F3, 0,0xD9C3,0xD9D9, +0xD9CE,0xB4D6, 0,0xB4D1,0xD9BD,0xB4D2,0xD9CD, 0, +0xD9C6,0xD9D3,0xB4CE,0xD9AB,0xD9D5,0xB4C4,0xD9B3,0xB4C7, +0xB4C6, 0,0xB4D7, 0,0xD9AD,0xD9CF,0xD9D0,0xB4C9, +0xB4C5,0xD9BB, 0,0xB4D0,0xD9B6, 0,0xD9D1,0xB4CC, +0xD9C9,0xD9D6,0xD9B0,0xD9B5,0xD9AF, 0,0xB4CB,0xD9C2, +0xDDDE,0xD9B1,0xB4CF,0xD9BA,0xD9D2,0xB4CA,0xD9B7,0xD9B4, +0xD9C5,0xB4CD,0xB4C3,0xB4D9,0xD9C8,0xD9C7, 0, 0, + 0, 0, 0, 0,0xD9AC,0xB4C8,0xD9D4,0xD9BC, +0xD9BE, 0,0xD9CB,0xD9CA,0xD9AA,0xB4D3,0xB4D5,0xD9B2, +0xD9B9,0xD9C1,0xB4D4,0xD9B8,0xD9C4,0xD9D7, 0,0xD9CC, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xD9D8, 0, 0, + 0, 0,0xD9AE, 0, 0, 0, 0,0xDDF2, +0xB7A6, 0,0xDDF0,0xDDDB,0xDDE0,0xDDD9, 0,0xDDEC, +0xDDCB,0xDDD2, 0,0xDDEA,0xDDF4,0xDDDC, 0,0xDDCF, +0xDDE2,0xDDE7,0xDDD3, 0,0xDDE4,0xDDD0, 0, 0, +0xDDD7,0xDDD8,0xB7A8,0xDDEB,0xDDE9, 0,0xDDCC,0xDDEE, + 0,0xDDEF,0xDDF1,0xB7AC,0xB7A4, 0,0xD5B8,0xDDD4, +0xDDE6,0xDDD5,0xB7A1,0xB7B1,0xDDED,0xB7AF,0xB7AB,0xDDCA, +0xB7A3, 0,0xDDCD,0xB7B0, 0,0xDDDD,0xDDC9, 0, +0xB7A9,0xDDE1,0xDDD1,0xB7AA,0xDDDA,0xB77E,0xB4D8,0xDDE3, +0xD9BF,0xDDCE, 0, 0,0xDDE8,0xB7A5,0xDDE5,0xB7A2, +0xDDDF,0xB7AD,0xDDD6,0xDDF3, 0, 0, 0, 0, + 0, 0,0xB7A7,0xDEC6, 0, 0,0xB7AE, 0, + 0, 0, 0, 0, 0,0xE24A,0xE248, 0, +0xE25E,0xE246, 0,0xE258,0xB77D,0xBA5F,0xE242,0xE25D, + 0,0xE247,0xE255,0xBA64,0xBA5D, 0,0xE25B, 0, +0xE240,0xE25A, 0,0xBA6F,0xE251,0xE261,0xBA6D,0xE249, +0xBA5E,0xE24B,0xE259,0xBA67,0xE244,0xBA6B,0xBA61,0xE24D, +0xE243,0xE1FC, 0,0xE257,0xBA68,0xE260,0xE1FD,0xBA65, + 0,0xE253, 0,0xBA66,0xE245,0xE250,0xE24C,0xE24E, + 0,0xBA60,0xE25F,0xBA6E,0xE24F, 0,0xE262, 0, + 0,0xE1FE,0xE254,0xBA63,0xBA6C,0xBA6A,0xE241,0xE256, +0xBA69, 0, 0,0xBA62,0xE252, 0, 0, 0, + 0,0xE25C, 0, 0, 0, 0, 0, 0, + 0, 0,0xE5D5, 0,0xE5D1,0xE5CD,0xE5E1,0xE5DE, +0xBCCD, 0, 0,0xE5E5,0xE5D4,0xBCD8,0xE5DB, 0, + 0,0xE5D0,0xE5DA,0xBCD5,0xE5EE, 0,0xE5EB,0xE5DD, +0xE5CE, 0, 0,0xE5E2,0xE5E4,0xBCD1,0xE5D8,0xE5D3, +0xE5CA,0xBCCE,0xBCD6, 0,0xE5E7,0xBCD7,0xE5CB,0xE5ED, +0xE5E0,0xE5E6,0xBCD4, 0, 0,0xE5E3, 0,0xE5EA, + 0,0xBCD9, 0,0xBCD3,0xE5DC,0xE5CF,0xE5EF,0xE5CC, +0xE5E8,0xBCD0, 0,0xE5D6, 0,0xE5D7,0xBCCF,0xBCCC, +0xE5D2,0xBCD2, 0,0xBCCB, 0,0xE5E9,0xE5EC,0xE5D9, +0xE9CA, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xE9C2, 0,0xE9BE,0xBEF6, 0, 0, +0xBEEB,0xBEF0,0xBEEC,0xE9CC,0xE9D7,0xBEEA,0xE9C4,0xE9CD, +0xE5DF,0xE9CE, 0, 0,0xBEF1, 0,0xE9DD,0xBEF5, +0xBEF8,0xE9C0, 0,0xBEF4, 0,0xE9DB,0xE9DC,0xE9D2, +0xE9D1,0xE9C9, 0, 0,0xE9D3,0xE9DA,0xE9D9, 0, +0xBEEF,0xBEED,0xE9CB,0xE9C8, 0,0xE9C5,0xE9D8,0xBEF7, +0xE9D6,0xBEF3,0xBEF2, 0,0xE9D0, 0,0xE9BF,0xE9C1, +0xE9C3,0xE9D5,0xE9CF,0xBEEE, 0,0xE9C6, 0,0xE9D4, + 0, 0, 0, 0, 0, 0,0xE9C7, 0, + 0, 0, 0, 0, 0, 0,0xC0CF,0xED45, +0xC0C8,0xECF5, 0,0xED41,0xC0CA,0xED48, 0,0xECFC, + 0,0xECF7, 0, 0,0xED49,0xECF3,0xECFE, 0, +0xC0D1,0xED44,0xED4A,0xECFD,0xC0C9,0xED40,0xECF4,0xC0D0, + 0, 0,0xED47,0xECF9,0xC0CC, 0,0xECFB,0xECF8, +0xC0D2,0xECFA,0xC0CB,0xC0CE,0xED43,0xECF6,0xED46, 0, +0xED42, 0, 0, 0,0xC263,0xEFE7,0xC268,0xC269, + 0, 0, 0,0xC262,0xEFE6, 0,0xEFE3,0xEFE4, +0xC266,0xEFDE,0xEFE2,0xC265, 0,0xEFDF, 0, 0, + 0, 0,0xC267,0xC264, 0,0xEFDD,0xEFE1,0xEFE5, + 0, 0, 0,0xF251,0xF24E,0xF257, 0,0xF256, +0xF254,0xF24F, 0,0xC372, 0, 0, 0, 0, + 0,0xF250,0xC371,0xC0CD,0xF253,0xC370,0xF258,0xF252, +0xF24D,0xEFE0, 0, 0, 0,0xC36F, 0,0xF24C, +0xF456, 0,0xF455,0xF255,0xC468, 0,0xF459,0xF45A, +0xF454,0xF458, 0,0xF453, 0, 0, 0, 0, +0xF5D1,0xF457,0xC4E7,0xC4E5,0xF5CF, 0, 0, 0, +0xF5D2, 0,0xF5CE,0xF5D0,0xC4E6, 0, 0, 0, +0xF6E5,0xF6E6,0xC576,0xF6E4, 0, 0, 0,0xF7E2, +0xC5CF,0xF7E0,0xF7E1,0xF8AC, 0, 0,0xC656,0xF8F3, +0xF8F1,0xF8F2,0xF8F4, 0, 0, 0,0xF9BB, 0, +0xA4ED,0xA6B8, 0,0xAA59, 0,0xCCE9, 0, 0, +0xCF64, 0, 0, 0,0xD1F5,0xD1F7, 0,0xD1F6, + 0,0xD1F8,0xB1FD,0xD5D7,0xD1F9, 0,0xD5D6,0xD5D8, +0xD5D9,0xD9DA,0xB4DB,0xD9DB,0xD9DD,0xB4DC,0xB4DA,0xD9DC, + 0,0xDDFA,0xDDF8,0xDDF7, 0,0xDDF6,0xDDF5,0xB7B2, +0xDDF9,0xBA70,0xE263,0xE265,0xBA71,0xE264,0xBCDB, 0, +0xBCDA,0xE5F0, 0, 0,0xE9DF,0xE9DE,0xE9E0, 0, + 0,0xBEF9, 0,0xED4B,0xC0D3, 0,0xEFE8,0xC26A, +0xF259,0xC577,0xA4EE,0xA5BF,0xA6B9,0xA842,0xAA5A,0xAA5B, + 0, 0,0xAC6E, 0, 0,0xD1FA, 0, 0, + 0, 0,0xB7B3, 0, 0, 0,0xE6D1,0xBEFA, +0xC26B,0xA4EF, 0,0xA6BA, 0, 0,0xCCEB,0xAA5C, +0xCCEA, 0,0xCF65,0xAC6F,0xCF66, 0,0xAC70, 0, +0xD1FC,0xAEEE,0xAEED, 0,0xD5DE,0xD5DC,0xD5DD,0xD5DB, + 0,0xD5DA, 0, 0,0xD9DE,0xD9E1,0xB4DE,0xD9DF, +0xB4DD,0xD9E0, 0,0xDDFB, 0, 0,0xE266,0xE267, +0xE268, 0,0xE5F3,0xE5F2,0xBCDC,0xE5F1,0xE5F4,0xE9E1, + 0, 0,0xE9E2,0xE9E3, 0,0xED4C,0xC0D4,0xC26C, +0xF25A, 0,0xC4E8,0xC95F, 0,0xAC71,0xCF67,0xAEEF, + 0, 0,0xB1FE, 0,0xB4DF,0xD9E2, 0,0xB7B5, +0xB7B4, 0, 0,0xE269,0xE26A,0xBCDD,0xBCDE,0xE9E5, +0xE9E4,0xEFE9,0xF7E3,0xA4F0,0xC960,0xA5C0, 0,0xA843, +0xCB48, 0,0xAC72,0xB7B6,0xA4F1, 0,0xCF68,0xAC73, +0xCF69, 0,0xC0D5,0xA4F2, 0, 0,0xCCEC, 0, +0xCF6A, 0,0xD242,0xD241,0xD1FE, 0,0xD1FD,0xD243, +0xD240, 0, 0,0xB240,0xB241, 0, 0,0xB4E0, +0xD9E3, 0,0xD9E4,0xD9E5, 0, 0, 0,0xDE41, +0xDE42,0xDE40, 0,0xDDFD,0xDDFE,0xB7B7,0xE26B,0xE5F7, +0xE5F6,0xE5F5,0xE5F8,0xE9E7,0xE9E6,0xBEFB,0xE9E8, 0, +0xC0D6,0xED4D, 0,0xEFEA,0xF25B,0xF6E7, 0,0xA4F3, +0xA5C2,0xA5C1, 0,0xAA5D,0xC961,0xC97E,0xA6BB, 0, +0xC9F7,0xCB49,0xCB4A,0xAA5E, 0,0xCCED, 0,0xAC74, +0xCF6B,0xCF6C, 0,0xAEF0,0xAEF4,0xD244,0xAEF3,0xAEF1, +0xAEF2, 0,0xD5DF,0xB242,0xB4E3, 0,0xB4E1,0xB4E2, +0xD9E6, 0, 0,0xBA72,0xA4F4, 0,0xC9A1, 0, +0xA5C3, 0, 0,0xC9A4, 0, 0,0xA5C6,0xC9A3, +0xA5C5,0xA5C4,0xA844,0xC9A2, 0, 0,0xC9F8, 0, + 0, 0,0xC9FC,0xC9FE,0xCA40,0xA6C5,0xA6C6,0xC9FB, +0xA6C1, 0,0xC9F9, 0,0xC9FD,0xA6C2, 0,0xA6BD, + 0,0xA6BE, 0,0xA6C4,0xC9FA,0xA6BC,0xA845,0xA6BF, +0xA6C0,0xA6C3, 0, 0, 0,0xCB5B,0xCB59,0xCB4C, +0xA851,0xCB53,0xA84C,0xCB4D, 0,0xCB55, 0,0xCB52, +0xA84F,0xCB51,0xA856,0xCB5A,0xA858, 0,0xA85A, 0, +0xCB4B, 0,0xA84D,0xCB5C, 0,0xA854,0xA857, 0, +0xCD45,0xA847,0xA85E,0xA855,0xCB4E,0xA84A,0xA859,0xCB56, +0xA848,0xA849,0xCD43,0xCB4F,0xA850,0xA85B,0xCB5D,0xCB50, +0xA84E, 0,0xA853,0xCCEE,0xA85C,0xCB57,0xA852, 0, +0xA85D,0xA846,0xCB54,0xA84B,0xCB58,0xCD44, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xAA6A,0xAA7A,0xCCF5,0xAA71, 0, +0xCD4B,0xAA62, 0,0xAA65,0xCD42, 0,0xCCF3,0xCCF7, +0xAA6D,0xAA6F,0xCCFA,0xAA76,0xAA68,0xAA66,0xAA67,0xAA75, +0xCD47,0xAA70,0xCCF9,0xCCFB,0xAA6E,0xAA73,0xCCFC,0xCD4A, + 0,0xAC75,0xAA79, 0,0xAA63,0xCD49, 0,0xCD4D, +0xCCF8,0xCD4F,0xCD40,0xAA6C,0xCCF4,0xAA6B,0xAA7D,0xAA72, + 0,0xCCF2,0xCF75,0xAA78,0xAA7C,0xCD41,0xCD46, 0, +0xAA7E,0xAA77,0xAA69,0xAA5F, 0,0xAA64, 0,0xCCF6, +0xAA60,0xCD4E, 0,0xCCF0,0xCCEF,0xCCFD,0xCCF1,0xAA7B, +0xAEF5,0xAA74,0xCCFE,0xAA61, 0,0xACA6, 0, 0, + 0,0xCD4C, 0, 0, 0, 0, 0, 0, +0xCF7C,0xCFA1, 0,0xCFA4,0xCF77, 0, 0,0xCFA7, +0xCFAA,0xCFAC,0xCF74,0xAC76,0xAC7B,0xD249,0xACAD,0xCFA5, +0xCFAD,0xCF7B,0xCF73, 0, 0, 0,0xD264,0xAC7E, +0xCFA2,0xCF78,0xCF7A,0xACA5, 0,0xCF7D,0xAC7D,0xCF70, +0xCFA8, 0,0xCFAB, 0, 0,0xAC7A, 0,0xACA8, +0xCF6D,0xACAA,0xAC78,0xACAE,0xCFA9,0xCF6F,0xACAB,0xD25E, +0xCD48,0xAC7C,0xAC77,0xCF76,0xCF6E,0xACAC,0xACA4,0xCFA3, +0xACA9,0xACA7,0xCF79,0xACA1,0xCF71,0xACA2,0xACA3,0xCF72, +0xCFA6,0xAC79,0xCF7E, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD24C,0xAEFD,0xAF43, 0, 0, 0,0xD255,0xD25B, +0xD257,0xD24A,0xD24D,0xD246,0xD247,0xAF4A,0xAEFA,0xD256, +0xD25F,0xAF45,0xAEF6, 0,0xAF40,0xD24E,0xAF42,0xD24F, +0xD259, 0, 0, 0,0xAF44,0xD268,0xD248,0xAEFC, +0xAEFB,0xAF48,0xD245,0xD266,0xD25A,0xD267,0xD261,0xD253, +0xD262, 0,0xD25C,0xD265,0xD263,0xAF49,0xD254,0xAEF9, +0xAEF8,0xAF41,0xAF47,0xD260,0xAF46,0xD251,0xB243, 0, +0xD269,0xD250,0xD24B,0xAEFE,0xAF4B,0xAEF7, 0,0xD258, +0xD25D, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xB265,0xD5E1,0xD5E5, 0,0xB252,0xB250, + 0, 0,0xB247,0xD5E3,0xD5E2,0xB25B, 0,0xD5E8, +0xB255, 0,0xD5FA,0xD647,0xB244,0xD5F7,0xD5F0,0xB267, +0xD5E0, 0,0xD5FC, 0,0xB264,0xB258,0xB263,0xB24E, +0xD5EC,0xD5FE,0xD5F6,0xB24F,0xB249,0xD645, 0,0xD5FD, +0xD640,0xB251,0xB259,0xD642,0xD5EA,0xD5FB,0xD5EF,0xD644, +0xB25E,0xB246,0xB25C,0xD5F4,0xD5F2,0xD5F3,0xB253,0xD5EE, +0xD5ED,0xB248,0xD5E7,0xD646,0xB24A,0xD5F1,0xB268, 0, +0xB262,0xD5E6,0xB25F,0xB25D,0xB266,0xD5F8,0xB261,0xD252, +0xD5F9,0xB260,0xD641,0xB245,0xD5F5,0xB257,0xD5E9,0xB256, + 0,0xB254,0xB24C,0xB24B,0xD9E7,0xD643, 0, 0, +0xD5EB, 0, 0,0xD9FC, 0,0xB24D, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xB541,0xB25A,0xB4EE,0xD9F6,0xB4FC, 0,0xD9EA, +0xB4EB,0xB4E7,0xDA49,0xB4ED,0xB4F1,0xB4EC,0xB4F5,0xDA4D, +0xDA44, 0, 0,0xD9F1,0xB4FA,0xB4F4,0xD9FD,0xB4E4, +0xDA4A,0xDA43,0xB4E8,0xD9F7,0xB4F7,0xDA55,0xDA56, 0, +0xB4E5,0xDA48,0xB4F9,0xD9FB,0xD9ED,0xD9EE,0xB4FD,0xD9F2, +0xD9F9,0xD9F3, 0,0xB4FB,0xB544,0xD9EF,0xD9E8,0xD9E9, + 0,0xD9EB,0xB4EA,0xD9F8, 0,0xB4F8,0xB542, 0, + 0,0xD9FA,0xDA53,0xDA4B,0xB4E6,0xDA51,0xB4F2, 0, +0xB4F0, 0,0xDA57,0xB4EF,0xDA41,0xD9F4,0xD9FE,0xB547, +0xDA45,0xDA42,0xD9F0,0xB543,0xDA4F,0xDA4C,0xDA54,0xB4E9, +0xDA40,0xB546, 0,0xDA47, 0, 0,0xB4F3,0xB4F6, + 0,0xDA46,0xB545,0xD9F5,0xD5E4, 0, 0,0xDA50, +0xDA4E,0xDA52, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD9EC,0xB540, 0, 0, 0,0xDE61,0xDE60,0xDE46, +0xB7BD, 0,0xDE5F,0xDE49,0xDE4A, 0,0xB7C7,0xDE68, +0xB7C2,0xDE5E, 0,0xDE43,0xB7C8,0xB7BE,0xDE52,0xDE48, +0xDE4B,0xDE63,0xB7B8,0xDE6A,0xDE62,0xB7C1,0xDE57,0xB7CC, + 0, 0,0xB7CB,0xB7C5, 0, 0,0xDE69,0xB7B9, +0xDE55,0xDE4C,0xDE59,0xDE65,0xB7CD, 0,0xB7BB,0xDE54, + 0,0xDE4D,0xB7C4, 0,0xB7C3,0xDE50,0xDE5A,0xDE64, +0xDE47,0xDE51,0xB7BC,0xDE5B,0xB7C9,0xB7C0,0xDE4E,0xB7BF, +0xDE45,0xDE53,0xDE67,0xB4FE,0xBAB0,0xDE56,0xE26C,0xDE58, +0xDE66,0xB7C6,0xDE4F,0xB7BA,0xB7CA,0xBCF0,0xDE44, 0, +0xDE5D, 0, 0, 0,0xDE5C, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE2AA,0xBAAD,0xE27D,0xE2A4,0xBAA2, + 0,0xE26E,0xBAAF, 0,0xBA77,0xE26D,0xE2B0,0xBAB1, +0xE271,0xE2A3, 0,0xE273,0xE2B3,0xE2AF,0xBA75,0xBAA1, +0xE653,0xBAAE,0xBA7D,0xE26F, 0,0xE2AE,0xBAA3,0xE2AB, +0xE2B8,0xE275,0xE27E, 0, 0,0xE2B6,0xE2AC,0xBA7C, + 0, 0,0xE27C,0xBA76,0xBA74,0xBAA8, 0, 0, +0xE27A,0xE277,0xE278, 0,0xE2B2, 0,0xE2B7,0xE2B5, +0xBA7A,0xE2B9,0xBA7E,0xBAA7, 0,0xE270,0xE5FA,0xE279, + 0,0xBA78,0xBAAC,0xBAA9,0xBA7B,0xE2A5,0xE274,0xBAAA, +0xE2A7,0xBAA4,0xBAA6,0xBA73, 0,0xE2A9,0xE2A1,0xE272, +0xBAA5,0xE2B1,0xE2B4,0xE27B,0xE2A8, 0,0xBA79,0xBCDF, +0xE2A6,0xE5F9, 0,0xE2AD, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE276,0xE644, +0xE64E,0xBCE2,0xE64D,0xE659,0xBCE4,0xE64B, 0,0xE64F, +0xBCEF, 0,0xE646,0xBCE7, 0,0xE652,0xE9F0,0xBCF3, +0xBCF2,0xE654,0xE643,0xE65E,0xBCED, 0,0xBCE3,0xE657, + 0,0xE65B,0xE660,0xE655,0xE649,0xBCE6,0xBCE9,0xBCF1, +0xBCEC, 0,0xE64C,0xE2A2, 0, 0,0xE648,0xE65F, +0xBCE8, 0,0xBCEB,0xE661,0xBCE0,0xE656,0xE5FB,0xE65C, +0xC0DF, 0,0xE64A, 0,0xBCE1,0xE645,0xBCE5,0xE5FC, +0xBAAB,0xE641, 0,0xE65A,0xE642,0xE640,0xBCEA, 0, +0xE658, 0,0xE5FE,0xE651,0xE650,0xE65D,0xE647,0xBCEE, + 0, 0, 0, 0, 0, 0,0xE9F3, 0, +0xBF49,0xBEFE,0xEA40,0xE9EB,0xBF41,0xE9F7,0xBF48,0xBF43, +0xE9F5,0xED4F,0xE9FB,0xEA42,0xE9FA,0xE9E9,0xE9F8,0xEA44, +0xEA46,0xBEFD,0xEA45,0xBF44,0xBF4A, 0,0xBF47, 0, +0xE9FE,0xBF46,0xE9F9, 0,0xE9ED,0xE9F2, 0,0xE9FD, +0xBF45,0xBF42,0xBEFC,0xBF40,0xE9F1, 0,0xE5FD,0xE9EC, +0xE9EF,0xEA41,0xE9F4,0xE9EA,0xED4E,0xEA43,0xE9EE,0xE9FC, + 0, 0, 0, 0,0xED51,0xC0E3, 0, 0, +0xC0D7, 0, 0,0xC0DB,0xED53,0xED59,0xED57,0xC0D9, +0xC0DA,0xC0E1,0xED5A,0xED52,0xC0DC, 0,0xED56,0xED55, +0xED5B,0xC0E2, 0,0xC0DD,0xC0E0,0xED54,0xC0E4,0xC0DE, +0xC0E5,0xC0D8,0xED58, 0,0xED50, 0, 0,0xEFF7, + 0, 0,0xC271,0xEFF4,0xEFF6, 0,0xC26F,0xEFF2, +0xEFF3,0xEFEE, 0, 0,0xE9F6,0xEFEF,0xC270,0xEFEB, + 0,0xC26D,0xEFF8,0xC26E,0xEFEC,0xEFED,0xEFF1,0xC273, + 0,0xC272, 0, 0,0xEFF0,0xC378,0xF25F,0xF265, +0xC379,0xF25C,0xC376,0xC373,0xF267,0xC377, 0,0xC374, +0xF25E,0xF261,0xF262,0xF263,0xF266, 0,0xEFF5,0xF25D, +0xC375,0xF264,0xF268,0xF260, 0, 0, 0,0xF45D, +0xC46A,0xF460,0xC46B,0xF468,0xF45F,0xF45C, 0,0xF45E, +0xF462,0xF465,0xF464,0xF467,0xF45B, 0,0xC469,0xF463, +0xF466,0xF469,0xF461,0xF5D3,0xF5D4,0xF5D8,0xF5D9, 0, +0xF5D6,0xF5D7,0xF5D5, 0,0xC4E9, 0, 0, 0, + 0,0xC578,0xF6EB, 0, 0,0xF6E8,0xF6E9,0xF6EA, +0xC579, 0,0xF7E5,0xF7E4, 0,0xF8AF,0xC5F4,0xF8AD, +0xF8B0,0xF8AE,0xF8F5,0xC657,0xC665,0xF9A3,0xF96C, 0, +0xF9A2,0xF9D0,0xF9D1,0xA4F5, 0, 0, 0, 0, +0xA6C7,0xCA41, 0, 0,0xCB5E, 0,0xA85F, 0, +0xA862, 0,0xCB5F, 0,0xA860,0xA861, 0, 0, + 0, 0,0xCD58,0xCD5A,0xCD55,0xCD52,0xCD54, 0, + 0, 0,0xAAA4, 0, 0, 0,0xAAA2, 0, + 0,0xCD56,0xAAA3,0xCD53,0xCD50,0xAAA1,0xCD57, 0, +0xCD51,0xAAA5,0xCD59, 0, 0, 0, 0,0xCFAF, + 0,0xCFB3, 0, 0,0xACB7, 0, 0, 0, + 0,0xCFB6, 0,0xACAF,0xACB2,0xACB4,0xACB6,0xACB3, +0xCFB2,0xCFB1, 0,0xACB1,0xCFB4,0xCFB5, 0,0xCFAE, +0xACB5, 0,0xACB0, 0, 0, 0,0xCFB0, 0, + 0, 0, 0, 0, 0,0xD277,0xD278,0xD279, +0xAF50, 0,0xAF4C,0xD26E, 0,0xD276,0xD27B,0xAF51, + 0,0xD26C,0xD272,0xD26B,0xD275, 0, 0,0xD271, +0xAF4D,0xAF4F,0xD27A, 0,0xD26A,0xD26D,0xD273, 0, +0xD274,0xD27C,0xD270, 0,0xAF4E, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xB26D, +0xD64E, 0, 0,0xD650,0xD64C, 0,0xD658,0xD64A, +0xD657,0xB269,0xD648,0xDA5B,0xD652,0xB26C, 0,0xD653, +0xD656, 0,0xD65A, 0,0xD64F, 0,0xD654, 0, + 0,0xB26A,0xB26B,0xD659,0xD64D,0xD649,0xD65B, 0, +0xD651, 0, 0,0xD655, 0, 0, 0,0xD64B, + 0,0xB548,0xB549,0xDA65,0xB54F, 0,0xDA59,0xDA62, +0xDA58,0xB54C,0xDA60,0xDA5E, 0,0xDA5F,0xB54A, 0, +0xDA63, 0, 0, 0, 0, 0,0xDA5C,0xDA5A, +0xB54B,0xDA5D,0xDA61, 0, 0, 0,0xB54D, 0, + 0, 0,0xDA64, 0, 0, 0, 0, 0, + 0,0xDE70,0xDE77,0xDE79,0xDEA1, 0,0xB7DA,0xDE6B, + 0,0xB7D2, 0,0xDE7A,0xB7D7,0xDEA2,0xB7CE, 0, +0xDE7D, 0,0xDE6D,0xDE7E,0xDE6C, 0,0xB7DC, 0, +0xDE78,0xB7CF,0xDEA3, 0,0xB7D4,0xDE71,0xB7D9,0xDE7C, +0xDE6F,0xDE76,0xDE72,0xDE6E,0xB7D1,0xB7D8,0xB7D6,0xB7D3, +0xB7DB,0xB7D0,0xDE75, 0,0xB7D5, 0,0xB54E, 0, +0xDE7B, 0,0xDE73, 0, 0, 0, 0, 0, +0xDE74, 0, 0,0xE2C1, 0,0xBAB4, 0, 0, +0xE2BD,0xE2C3,0xE2BF, 0,0xBAB6,0xE2BE,0xE2C2,0xE2BA, + 0,0xE2BC,0xBAB5, 0, 0, 0, 0,0xE2C0, +0xE2BB, 0,0xBAB7, 0,0xBAB2, 0, 0,0xE2C4, + 0,0xBAB3,0xE667,0xE664,0xE670,0xE66A,0xE66C,0xBCF4, +0xE666,0xE66E, 0, 0,0xE66D,0xE66B, 0,0xE671, +0xBCF7,0xE668,0xE66F, 0,0xBCF5, 0, 0,0xE663, +0xE665,0xBCF6,0xE662,0xE672, 0,0xE669, 0, 0, +0xEA4A,0xBF51, 0, 0,0xEA55,0xEA53,0xBF4B,0xEA49, +0xEA4C,0xEA4D,0xEA48,0xBF55,0xBF56,0xEA47,0xEA56,0xEA51, +0xBF4F,0xBF4C,0xEA50,0xEA4E, 0, 0,0xBF52,0xEA52, +0xBF4D, 0,0xBF4E, 0,0xEA4F,0xBF50,0xEA4B, 0, +0xEA54,0xBF53,0xEA57,0xEA58,0xBF54, 0, 0,0xC0E7, +0xC0EE,0xED5C,0xED62, 0,0xED60,0xC0EA,0xC0E9,0xC0E6, +0xED5E, 0, 0, 0,0xC0EC,0xC0EB,0xC0E8, 0, +0xED61,0xED5D,0xED5F, 0,0xC0ED, 0, 0, 0, +0xC277,0xEFFB, 0,0xC274,0xC275,0xEFFD,0xC276,0xEFFA, + 0,0xEFF9,0xF26C,0xEFFC, 0,0xF26D,0xC37A,0xF26B, + 0, 0,0xF26A, 0,0xF269,0xC37B, 0, 0, +0xC46C, 0, 0,0xF46A,0xF46B, 0, 0, 0, + 0,0xF5DC,0xF5DB,0xC4EA, 0,0xF5DA,0xF6EC,0xF6ED, + 0, 0,0xF7E6,0xF8B1, 0, 0,0xF8F6,0xF9BC, +0xC679,0xF9C6,0xA4F6, 0,0xAAA6,0xAAA7, 0, 0, +0xACB8, 0, 0, 0, 0,0xC0EF,0xA4F7, 0, +0xAAA8,0xAF52,0xB7DD,0xA4F8, 0,0xB26E,0xBAB8,0xC962, + 0,0xCFB7,0xD27D, 0,0xE2C5, 0,0xC0F0,0xA4F9, +0xAAA9,0xCFB8,0xCFB9,0xDA66,0xB550, 0, 0,0xDEA4, + 0, 0,0xB7DE,0xE2C6, 0, 0,0xBCF8, 0, +0xC37C,0xA4FA,0xDA67,0xA4FB, 0,0xA6C9,0xCA42,0xA6C8, +0xA865,0xA864,0xA863,0xCB60, 0, 0, 0,0xAAAA, + 0,0xAAAB,0xCD5B, 0,0xCFBA, 0,0xCFBD,0xACBA, +0xCFBB, 0,0xACB9,0xCFBC,0xACBB, 0,0xD2A2,0xD2A1, +0xD27E,0xAF53, 0,0xD65D,0xD65E,0xB26F,0xD65C,0xD65F, +0xB552,0xB270, 0, 0,0xB551,0xDA6B,0xDA6A, 0, +0xDA68,0xDA69, 0,0xDA6C,0xDEA6,0xDEA5,0xDEA9, 0, +0xDEA8,0xDEA7,0xBAB9,0xE2C9, 0,0xE2C8,0xBABA,0xE2C7, +0xE673, 0,0xE674,0xBCF9, 0,0xEA59,0xEA5A, 0, + 0,0xF272,0xC37D,0xF271,0xF270,0xF26E,0xF26F,0xC4EB, +0xF46C,0xF6EE,0xF8F7, 0,0xA4FC, 0,0xC9A5,0xA5C7, +0xC9A6, 0, 0, 0,0xCA43,0xCA44, 0, 0, + 0, 0,0xCB66, 0, 0,0xCB62, 0,0xCB61, +0xAAAC,0xCB65,0xA867,0xCB63,0xA866,0xCB67,0xCB64, 0, + 0,0xCD5F,0xCFBE,0xCD5D,0xCD64, 0,0xAAAD, 0, +0xAAB0,0xCD65,0xCD61, 0,0xCD62, 0,0xCD5C,0xAAAF, +0xCD5E,0xAAAE,0xCD63, 0,0xCD60, 0, 0,0xCFC2, +0xACBD,0xACBE, 0,0xCFC5,0xCFBF, 0,0xCFC4, 0, +0xCFC0,0xACBC,0xCFC3,0xCFC1, 0, 0, 0, 0, + 0, 0, 0,0xD2A8,0xD2A5, 0,0xD2A7,0xAF58, +0xAF57,0xAF55,0xD2A4,0xD2A9,0xAF54,0xAF56,0xD2A6,0xD667, +0xD2A3,0xD2AA, 0, 0, 0, 0, 0,0xD662, +0xD666, 0,0xD665,0xDA6E,0xDA79, 0, 0,0xD668, + 0,0xD663,0xDA6D,0xB274, 0, 0,0xB273,0xD661, +0xD664,0xB275, 0,0xB272,0xB271,0xD660,0xD669, 0, + 0, 0,0xDA70,0xDA77, 0,0xB554,0xDA76,0xDA73, + 0,0xB556, 0, 0, 0,0xDA75, 0, 0, +0xDA6F,0xDA71,0xDA74,0xDA72,0xB555,0xDA78,0xB553,0xB7DF, + 0, 0,0xDEAD,0xDEAC,0xDEAA, 0,0xB7E2,0xB7E1, +0xDEAE, 0,0xDEAB,0xE2CA,0xBABB,0xB7E0, 0, 0, + 0,0xDEB0,0xDEAF, 0,0xE2CD,0xE2CB,0xBCFA, 0, +0xBABC,0xE2CC,0xE676, 0, 0, 0, 0,0xBCFB, +0xE675,0xE67E,0xE67D,0xE67B, 0,0xE67A,0xE677,0xE678, +0xE679,0xE67C,0xE6A1, 0, 0,0xEA5F,0xEA5C,0xEA5D, +0xBF57,0xEA5B,0xEA61,0xEA60,0xEA5E, 0,0xED64,0xED65, +0xC0F1, 0,0xC0F2,0xED63, 0,0xC279,0xEFFE,0xC278, +0xC37E, 0,0xC3A1,0xC46D,0xF46E,0xF46D,0xF5DD,0xF6EF, +0xC57A,0xF7E8,0xF7E7,0xF7E9,0xA5C8,0xCFC6,0xAF59,0xB276, +0xD66A,0xA5C9,0xC9A7,0xA4FD, 0, 0,0xCA45, 0, + 0, 0,0xCB6C,0xCB6A,0xCB6B,0xCB68,0xA868,0xCB69, + 0, 0, 0, 0, 0,0xCD6D, 0,0xAAB3, +0xCD6B,0xCD67,0xCD6A, 0,0xCD66,0xAAB5,0xCD69, 0, +0xAAB2,0xAAB1, 0,0xAAB4,0xCD6C,0xCD68, 0, 0, + 0, 0,0xACC2,0xACC5,0xCFCE,0xCFCD,0xCFCC,0xACBF, +0xCFD5,0xCFCB, 0,0xACC1,0xD2AF, 0,0xCFD2,0xCFD0, +0xACC4, 0,0xCFC8,0xCFD3, 0,0xCFCA,0xCFD4,0xCFD1, +0xCFC9, 0,0xACC0,0xCFD6,0xCFC7,0xACC3, 0, 0, + 0, 0,0xD2B4,0xD2AB,0xD2B6, 0,0xD2AE,0xD2B9, +0xD2BA,0xD2AC,0xD2B8,0xD2B5,0xD2B3,0xD2B7,0xAF5F, 0, +0xAF5D, 0, 0,0xD2B1, 0,0xD2AD, 0,0xD2B0, +0xD2BB,0xD2B2,0xAF5E,0xCFCF, 0,0xAF5A,0xAF5C, 0, + 0, 0, 0, 0,0xD678,0xD66D,0xD66B, 0, +0xD66C, 0,0xD673, 0,0xD674,0xD670,0xB27B,0xD675, +0xD672,0xD66F, 0,0xB279,0xD66E,0xB277,0xB27A,0xD671, +0xD679,0xAF5B,0xB278,0xD677,0xD676,0xB27C, 0, 0, + 0, 0, 0, 0, 0, 0,0xDA7E, 0, + 0, 0,0xDAA1,0xB560, 0,0xDAA7, 0, 0, +0xDAA9,0xDAA2,0xB55A,0xDAA6,0xDAA5,0xB55B,0xB561, 0, +0xB562,0xDAA8,0xB558,0xDA7D,0xDA7B,0xDAA3,0xDA7A,0xB55F, +0xDA7C,0xDAA4,0xDAAA,0xB559,0xB55E,0xB55C,0xB55D, 0, + 0, 0,0xB557, 0, 0, 0, 0,0xB7E9, +0xDEB7,0xB7E8,0xDEBB, 0,0xDEB1, 0,0xDEBC, 0, + 0, 0,0xDEB2,0xDEB3, 0,0xDEBD,0xDEBA,0xDEB8, +0xDEB9,0xDEB5,0xDEB4, 0,0xDEBE,0xB7E5, 0,0xDEB6, + 0,0xB7EA,0xB7E4,0xB7EB,0xB7EC, 0,0xB7E7,0xB7E6, + 0, 0,0xE2CE,0xBABE,0xBABD, 0, 0,0xE2D3, + 0,0xBCFC,0xBABF, 0, 0,0xBAC1,0xE2D4,0xB7E3, +0xBAC0,0xE2D0,0xE2D2,0xE2CF, 0,0xE2D1, 0, 0, + 0,0xE6AB, 0, 0,0xE6AA,0xE6A7,0xBD40,0xEA62, +0xBD41,0xE6A6, 0,0xBCFE, 0,0xE6A8,0xE6A5,0xE6A2, +0xE6A9,0xE6A3,0xE6A4,0xBCFD, 0, 0, 0, 0, +0xED69, 0,0xEA66, 0,0xEA65,0xEA67, 0,0xED66, +0xBF5A, 0,0xEA63, 0,0xBF58, 0,0xBF5C,0xBF5B, +0xEA64,0xEA68, 0,0xBF59, 0,0xED6D,0xC0F5,0xC27A, +0xC0F6,0xC0F3,0xED6A,0xED68, 0,0xED6B, 0,0xED6E, +0xC0F4,0xED6C,0xED67, 0, 0,0xF042,0xF045,0xF275, +0xF040, 0,0xF46F,0xF046, 0,0xC3A2,0xF044,0xC27B, +0xF041,0xF043,0xF047,0xF276, 0,0xF274, 0, 0, + 0, 0,0xC3A3,0xF273, 0, 0, 0,0xC46E, + 0, 0, 0, 0,0xC4ED,0xF6F1,0xC4EC,0xF6F3, +0xF6F0,0xF6F2,0xC5D0,0xF8B2,0xA5CA,0xCD6E,0xD2BC,0xD2BD, +0xB27D,0xDEBF,0xBF5D,0xC3A4,0xC57B,0xF8B3,0xA5CB, 0, +0xCD6F,0xA260, 0, 0,0xCFD7, 0,0xCFD8, 0, + 0, 0, 0, 0,0xD2BE,0xD2BF,0xB27E,0xB2A1, + 0, 0, 0,0xDAAB, 0,0xDEC2,0xDEC1,0xDEC0, +0xE2D5, 0,0xE2D6,0xE2D7,0xBAC2, 0, 0,0xE6AD, +0xE6AC, 0, 0,0xEA69,0xBF5E,0xBF5F, 0,0xED72, +0xED6F,0xED70,0xED71,0xF049,0xF048,0xC27C,0xF277,0xF5DE, +0xA5CC, 0,0xACC6, 0,0xB2A2,0xDEC3, 0,0xA5CD, + 0,0xD2C0,0xB2A3, 0, 0,0xB563,0xB564, 0, +0xA5CE,0xA5CF,0xCA46,0xA86A,0xA869,0xACC7,0xCFD9,0xDAAC, +0xA5D0,0xA5D1,0xA5D2,0xA5D3, 0, 0, 0,0xA86B, +0xA86C,0xCB6E,0xCB6D, 0, 0,0xAAB6,0xCD72,0xCD70, +0xCD71, 0, 0, 0, 0, 0, 0,0xCFDA, +0xCFDB, 0, 0,0xACCB,0xACC9, 0,0xACCA,0xACC8, + 0, 0, 0, 0,0xAF60, 0, 0, 0, + 0,0xAF64,0xAF63,0xD2C1,0xAF62,0xAF61, 0,0xD2C2, + 0, 0,0xB2A6,0xD67B,0xD67A,0xB2A4,0xB2A5, 0, + 0, 0,0xB566,0xB565,0xDAAE, 0, 0,0xDAAD, +0xB2A7, 0, 0, 0, 0, 0,0xB7ED,0xDEC5, +0xB7EE,0xDEC4, 0, 0, 0,0xE2D8,0xE6AE,0xBD42, +0xEA6A, 0, 0, 0,0xED73, 0,0xC3A6,0xC3A5, + 0, 0,0xC57C,0xA5D4,0xCD73, 0, 0,0xB2A8, +0xE2D9,0xBAC3, 0, 0,0xCB6F,0xCB70, 0, 0, +0xCD74,0xAAB8,0xAAB9, 0, 0,0xAAB7, 0, 0, + 0, 0,0xACCF,0xACD0,0xACCD,0xACCE, 0,0xCFDC, + 0, 0,0xCFDD,0xACCC, 0, 0, 0, 0, +0xD2C3, 0,0xAF68,0xAF69, 0,0xB2AB,0xD2C9, 0, +0xAF6E,0xAF6C,0xD2CA,0xD2C5,0xAF6B,0xAF6A,0xAF65,0xD2C8, +0xD2C7,0xD2C4,0xAF6D, 0,0xD2C6,0xAF66, 0,0xAF67, + 0, 0,0xB2AC,0xD6A1,0xD6A2,0xB2AD,0xD67C,0xD67E, +0xD6A4,0xD6A3,0xD67D, 0,0xB2A9,0xB2AA, 0,0xDAB6, +0xB56B,0xB56A,0xDAB0,0xB568, 0,0xDAB3,0xB56C,0xDAB4, +0xB56D,0xDAB1,0xB567,0xB569,0xDAB5, 0,0xDAB2,0xDAAF, + 0, 0, 0, 0, 0,0xDED2, 0,0xDEC7, +0xB7F0,0xB7F3,0xB7F2,0xB7F7,0xB7F6,0xDED3,0xDED1,0xDECA, +0xDECE,0xDECD,0xB7F4,0xDED0,0xDECC,0xDED4,0xDECB,0xB7F5, +0xB7EF,0xB7F1, 0,0xDEC9, 0, 0, 0, 0, +0xE2DB,0xBAC7,0xE2DF,0xBAC6,0xE2DC,0xBAC5, 0,0xDEC8, +0xDECF,0xE2DE, 0,0xBAC8,0xE2E0,0xE2DD,0xE2DA, 0, + 0,0xE6B1,0xE6B5,0xE6B7,0xE6B3,0xE6B2,0xE6B0,0xBD45, +0xBD43,0xBD48,0xBD49,0xE6B4,0xBD46,0xE6AF,0xBD47,0xBAC4, +0xE6B6,0xBD44, 0, 0, 0,0xEA6C, 0,0xEA6B, +0xEA73,0xEA6D,0xEA72,0xEA6F,0xBF60,0xEA71, 0, 0, +0xBF61, 0,0xBF62, 0,0xEA70,0xEA6E, 0, 0, + 0, 0,0xC0F8,0xED74, 0, 0,0xC0F7,0xED77, +0xED75,0xED76, 0, 0,0xC0F9, 0, 0, 0, +0xF04D, 0,0xC2A1,0xF04E, 0, 0,0xC27D,0xF04F, +0xC27E,0xF04C,0xF050, 0,0xF04A, 0, 0,0xC3A7, +0xF278,0xC3A8,0xC46F, 0,0xF04B,0xC470, 0, 0, + 0,0xC4EE,0xF5DF, 0,0xC57E,0xF6F4,0xC57D, 0, +0xF7EA,0xC5F5,0xC5F6, 0, 0,0xF9CC, 0, 0, +0xACD1,0xCFDE, 0,0xB56E,0xB56F,0xA5D5,0xA6CA,0xCA47, + 0,0xCB71,0xA86D, 0,0xAABA, 0,0xACD2,0xACD3, +0xACD4,0xD6A6,0xD2CB,0xAF6F, 0, 0,0xB2AE,0xD6A5, + 0, 0,0xDAB8,0xB571, 0,0xDAB7,0xB570, 0, + 0,0xDED5,0xBD4A,0xE6BB,0xE6B8,0xE6B9,0xE6BA, 0, + 0, 0, 0, 0,0xED78, 0,0xF051, 0, + 0, 0,0xF471,0xF470, 0,0xF6F5,0xA5D6,0xCD75, +0xAF70, 0, 0, 0,0xB572,0xDED6, 0, 0, +0xE2E1, 0,0xBD4B,0xEA74, 0,0xF052,0xF472,0xA5D7, + 0, 0,0xAABB,0xACD7,0xCFDF,0xACD8,0xACD6, 0, +0xACD5,0xD2CC,0xAF71, 0, 0,0xAF72,0xAF73, 0, + 0, 0,0xB2B0,0xD6A7,0xB2AF, 0, 0, 0, + 0, 0,0xDAB9,0xB2B1,0xB573,0xDED7,0xB7F8,0xB7F9, + 0,0xBAC9, 0,0xBACA,0xBD4C,0xBF64,0xEA75,0xBF63, + 0,0xED79,0xC0FA, 0,0xF053,0xF473,0xA5D8,0xA86E, +0xCD78,0xCD77,0xAABC,0xCD76,0xAABD,0xCD79, 0,0xCFE5, +0xACDB,0xACDA,0xCFE7,0xCFE6,0xACDF, 0,0xACDE, 0, + 0,0xACD9, 0,0xCFE1,0xCFE2,0xCFE3, 0,0xACE0, +0xCFE0,0xACDC,0xCFE4,0xACDD, 0, 0, 0, 0, +0xD2CF,0xD2D3,0xD2D1,0xD2D0, 0,0xD2D4, 0, 0, + 0,0xD2D5,0xD2D6,0xD2CE, 0,0xD2CD, 0,0xAF75, +0xAF76, 0,0xD2D7,0xD2D2, 0,0xD6B0, 0,0xD2D8, +0xAF77,0xAF74, 0, 0, 0,0xD6AA, 0,0xD6A9, + 0,0xD6AB,0xD6AC,0xD6AE,0xD6AD,0xD6B2,0xB2B5,0xB2B2, +0xB2B6,0xD6A8,0xB2B7,0xD6B1,0xB2B4,0xD6AF,0xB2B3, 0, + 0, 0, 0, 0,0xDABC,0xDABE,0xDABA,0xDABB, + 0, 0,0xDABF,0xDAC1,0xDAC2,0xDABD,0xDAC0,0xB574, + 0, 0,0xDEDB, 0,0xDEE0,0xDED8,0xDEDC, 0, + 0,0xDEE1,0xDEDD,0xB7FA,0xB843, 0,0xB7FD,0xDED9, +0xDEDA,0xBACE,0xB846,0xB7FE, 0,0xB844,0xB7FC,0xDEDF, +0xB845,0xDEDE,0xB841,0xB7FB,0xB842,0xDEE2,0xE2E6,0xE2E8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xB840, 0, 0,0xE2E3,0xBACC,0xE2E9,0xBACD, +0xE2E7,0xE2E2,0xE2E5,0xE2EA,0xBACB,0xE2E4, 0,0xBD4E, +0xE6BF,0xE6BE, 0,0xBD51,0xBD4F,0xE6BC,0xBD4D,0xE6BD, + 0,0xBD50, 0, 0, 0,0xEA7D, 0,0xEAA1, + 0,0xEA7E,0xEA76,0xEA7A,0xEA79,0xEA77,0xBF66,0xBF67, +0xBF65,0xEA78,0xEA7B,0xEA7C, 0,0xBF68, 0,0xC140, +0xEDA3, 0,0xC0FC,0xED7B,0xC0FE,0xC141, 0, 0, +0xC0FD,0xEDA2,0xED7C,0xC0FB,0xEDA1,0xED7A,0xED7E,0xED7D, + 0, 0,0xF055,0xC2A4,0xC2A5,0xC2A2, 0,0xC2A3, + 0, 0,0xF054, 0,0xF27B, 0, 0,0xC3A9, + 0,0xF279,0xF27A, 0,0xF474,0xF477,0xF475,0xF476, +0xF5E0, 0, 0,0xC4EF,0xF7EB,0xF8B4, 0,0xC5F7, +0xF8F8,0xF8F9,0xC666,0xA5D9,0xACE1, 0,0xDAC3, 0, +0xDEE3, 0,0xA5DA,0xA86F, 0,0xAABE, 0,0xCFE8, +0xCFE9,0xAF78, 0, 0,0xDAC4,0xB575,0xB847,0xC142, +0xEDA4,0xF27C,0xF478,0xA5DB, 0, 0, 0,0xCDA1, +0xCD7A,0xCD7C,0xCD7E,0xCD7D,0xCD7B,0xAABF, 0, 0, + 0, 0,0xACE2,0xCFF2, 0,0xCFED,0xCFEA, 0, + 0,0xCFF1, 0, 0,0xACE4,0xACE5,0xCFF0,0xCFEF, +0xCFEE,0xCFEB,0xCFEC,0xCFF3,0xACE3, 0, 0, 0, + 0, 0, 0, 0, 0,0xAF7C, 0,0xAFA4, +0xAFA3,0xD2E1,0xD2DB,0xD2D9, 0,0xAFA1,0xD6B9,0xAF7A, +0xD2DE,0xD2E2,0xD2E4,0xD2E0,0xD2DA,0xAFA2,0xD2DF,0xD2DD, +0xAF79,0xD2E5,0xAFA5,0xD2E3,0xAF7D,0xD2DC, 0,0xAF7E, +0xAF7B, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xB2B9, 0,0xD6BA, 0, 0, +0xD6B3,0xD6B5,0xD6B7, 0,0xD6B8,0xD6B6,0xB2BA, 0, +0xD6BB, 0,0xD6B4, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xDAC8,0xB576,0xDAD0, 0, +0xDAC5, 0,0xDAD1, 0,0xDAC6,0xDAC7, 0, 0, +0xDACF,0xDACE,0xDACB,0xB2B8,0xB577,0xDAC9,0xDACC,0xB578, +0xDACD,0xDACA, 0, 0, 0, 0, 0, 0, + 0,0xDEEE, 0,0xDEF2,0xB84E, 0,0xE2F0,0xB851, +0xDEF0, 0, 0,0xDEED,0xDEE8,0xDEEA,0xDEEB,0xDEE4, + 0,0xB84D, 0, 0,0xB84C, 0,0xB848,0xDEE7, + 0,0xB84F, 0,0xB850,0xDEE6,0xDEE9,0xDEF1,0xB84A, +0xB84B,0xDEEF,0xDEE5, 0, 0, 0,0xE2F2,0xBAD0, +0xE2F4,0xDEEC,0xE2F6,0xBAD4,0xE2F7,0xE2F3, 0,0xBAD1, +0xE2EF,0xBAD3,0xE2EC,0xE2F1,0xE2F5,0xE2EE, 0, 0, +0xB849, 0,0xE2EB,0xBAD2,0xE2ED, 0, 0, 0, + 0, 0,0xBD54,0xE6C1,0xBD58, 0,0xBD56, 0, + 0,0xBACF, 0,0xE6C8,0xE6C9,0xBD53, 0, 0, +0xE6C7,0xE6CA,0xBD55,0xBD52,0xE6C3,0xE6C0,0xE6C5,0xE6C2, +0xBD59,0xE6C4, 0, 0,0xE6C6,0xBD57, 0, 0, + 0, 0,0xBF6A,0xEAA8, 0,0xEAA2,0xEAA6,0xEAAC, +0xEAAD,0xEAA9,0xEAAA,0xEAA7, 0,0xEAA4, 0,0xBF6C, +0xBF69,0xEAA3,0xEAA5, 0,0xBF6B,0xEAAB, 0,0xC146, + 0, 0,0xEDAA,0xEDA5,0xC145, 0, 0,0xC143, + 0,0xEDAC,0xC144,0xEDA8,0xEDA9,0xEDA6,0xEDAD,0xF056, + 0,0xC147,0xEDA7, 0,0xEDAE,0xEDAB, 0, 0, + 0,0xF05A, 0, 0,0xF057, 0,0xC2A6, 0, +0xF05B,0xF05D,0xF05C,0xF058,0xF059, 0, 0,0xF2A3, + 0,0xC3AA, 0,0xF27E,0xF2A2,0xF27D,0xF2A4, 0, + 0,0xF2A1, 0,0xF47A,0xF47D,0xF479,0xC471,0xF47B, +0xF47C,0xF47E,0xC472,0xC474,0xC473,0xF5E1, 0,0xF5E3, + 0,0xF5E2, 0, 0, 0,0xF6F6, 0, 0, +0xF8B5,0xF8FA,0xA5DC, 0, 0,0xCB72,0xAAC0,0xCDA3, +0xAAC1,0xAAC2,0xCDA2, 0,0xCFF8,0xCFF7,0xACE6,0xACE9, +0xACE8,0xACE7,0xCFF4,0xCFF6,0xCFF5, 0, 0,0xD2E8, +0xAFA7,0xD2EC,0xD2EB,0xD2EA,0xD2E6,0xAFA6,0xAFAA,0xAFAD, + 0, 0,0xAFAE,0xD2E7,0xD2E9,0xAFAC,0xAFAB,0xAFA9, +0xAFA8,0xD6C2, 0,0xD6C0,0xD6BC,0xB2BB, 0,0xD6BD, +0xB2BC,0xD6BE,0xD6BF,0xD6C1, 0,0xB2BD, 0, 0, +0xDAD5, 0,0xDAD4,0xDAD3,0xDAD2, 0, 0, 0, + 0,0xDEF6,0xB852, 0,0xDEF3,0xDEF5, 0,0xB853, + 0,0xB854,0xDEF4, 0, 0, 0, 0, 0, +0xE341, 0,0xE2F9,0xE2FA, 0,0xBAD7,0xBAD5,0xBAD6, +0xE343, 0,0xE342,0xE2FE,0xE2FD,0xE2FC,0xE2FB,0xE340, +0xE2F8, 0,0xE6CB,0xE6D0,0xE6CE, 0, 0, 0, +0xE6CD,0xE6CC,0xE6CF, 0,0xEAAE, 0,0xBF6D,0xC148, +0xEDB0, 0,0xC149,0xEDAF,0xF05F,0xF05E,0xC2A7, 0, +0xF2A5,0xC3AB,0xF4A1,0xC5A1,0xF6F7, 0,0xF8B7,0xF8B6, +0xC9A8,0xACEA,0xACEB,0xD6C3, 0,0xB856,0xA5DD,0xA872, +0xA871,0xA870, 0, 0, 0,0xCDA4, 0, 0, +0xAAC4,0xAAC3, 0,0xACEE, 0,0xCFFA,0xCFFD,0xCFFB, + 0,0xACEC,0xACED, 0, 0,0xCFF9,0xCFFC, 0, +0xAFB5, 0, 0, 0,0xD2F3,0xD2F5,0xD2F4,0xAFB2, +0xD2EF, 0, 0,0xAFB0,0xAFAF, 0,0xAFB3,0xAFB1, + 0,0xAFB4,0xD2F2,0xD2ED,0xD2EE,0xD2F1,0xD2F0, 0, + 0, 0, 0, 0, 0, 0,0xD6C6,0xD6C7, +0xD6C5, 0,0xD6C4,0xB2BE, 0, 0, 0, 0, +0xB57D, 0,0xDAD6,0xDAD8,0xDADA,0xB57C, 0, 0, +0xB57A, 0,0xDAD7,0xB57B,0xDAD9,0xB579, 0, 0, +0xDF41,0xDEF7,0xDEFA,0xDEFE,0xB85A,0xDEFC, 0,0xDEFB, +0xDEF8,0xDEF9,0xB858,0xDF40,0xB857, 0,0xB85C,0xB85B, +0xB859, 0,0xDEFD, 0, 0, 0,0xE349, 0, +0xE348, 0, 0,0xE344, 0, 0,0xBAD8,0xE347, +0xE346,0xBAD9, 0, 0, 0, 0, 0,0xBD5E, + 0,0xE6D2, 0,0xBD5F,0xBD5B,0xBD5D, 0,0xBD5A, +0xBD5C, 0, 0, 0,0xEAAF, 0,0xBF70,0xEAB1, +0xEAB0, 0,0xE345,0xBF72,0xBF71,0xBF6E,0xBF6F, 0, + 0, 0, 0, 0,0xEDB5, 0,0xEDB3,0xC14A, +0xEDB4, 0,0xEDB6,0xEDB2,0xEDB1, 0, 0,0xF060, +0xC2AA,0xC2A8,0xC2A9, 0, 0, 0, 0,0xF2A6, +0xF2A7,0xC3AD, 0,0xC3AC,0xF4A3,0xF4A4,0xF4A2, 0, +0xF6F8,0xF6F9, 0, 0,0xA5DE,0xCA48,0xA873, 0, +0xCDA5,0xAAC6,0xAAC5,0xCDA6, 0, 0,0xD040,0xACEF, +0xCFFE,0xACF0, 0, 0,0xAFB6,0xD2F8,0xD2F6,0xD2FC, +0xAFB7,0xD2F7,0xD2FB,0xD2F9,0xD2FA, 0, 0,0xD6C8, +0xD6CA, 0,0xB2BF, 0,0xD6C9,0xB2C0,0xB5A2,0xB5A1, +0xB57E,0xDADB, 0, 0, 0, 0,0xDF44,0xB85D, +0xB85E, 0,0xDF43,0xDF42, 0, 0, 0, 0, +0xE34A,0xBADB,0xBADA,0xE34B,0xE34C, 0,0xBD61,0xBD60, + 0,0xEAB5,0xE6D3,0xE6D5,0xE6D4,0xEAB4,0xEAB2,0xEAB6, +0xEAB3, 0,0xBF73, 0, 0, 0,0xEDB7,0xC14B, +0xEDB8,0xEDB9, 0, 0,0xC2AB,0xC2AC, 0,0xC475, + 0, 0,0xC5D1,0xA5DF, 0, 0, 0, 0, + 0,0xD041, 0, 0, 0, 0, 0, 0, +0xD2FD,0xAFB8, 0, 0, 0, 0, 0,0xB3BA, +0xB3B9, 0, 0,0xB5A4,0xDADD,0xB5A3,0xDADC, 0, + 0, 0, 0,0xDF45, 0,0xBADC,0xE34D,0xBADD, + 0, 0, 0, 0, 0, 0,0xC476,0xF4A5, + 0,0xA6CB,0xAAC7,0xCDA7, 0,0xACF2, 0,0xACF1, +0xD042,0xD043, 0, 0,0xD340,0xD342,0xAFB9, 0, +0xD344,0xD347,0xD345, 0, 0, 0,0xD346,0xD343, +0xD2FE,0xAFBA,0xD348,0xD341, 0, 0, 0, 0, +0xD6D3,0xB2C6,0xD6DC,0xB2C3, 0,0xD6D5,0xB2C7, 0, +0xB2C1, 0,0xD6D0,0xD6DD,0xD6D1,0xD6CE,0xB2C5, 0, +0xB2C2, 0,0xD6D4,0xD6D7,0xB2C4,0xD6D8,0xB2C8,0xD6D9, +0xD6CF,0xD6D6,0xD6DA,0xD6D2,0xD6CD,0xD6CB, 0, 0, +0xD6DB, 0, 0,0xDADF, 0, 0, 0, 0, +0xDAE4, 0, 0, 0,0xDAE0,0xDAE6,0xB5A7,0xD6CC, +0xDAE1,0xB5A5,0xDADE,0xB5AC,0xDAE2,0xB5AB,0xDAE3,0xB5AD, +0xB5A8,0xB5AE,0xB5A9, 0,0xB5AA, 0,0xB5A6, 0, +0xDAE5, 0, 0, 0, 0, 0, 0, 0, +0xB861,0xDF50, 0,0xDF53,0xDF47,0xDF4C,0xDF46,0xB863, + 0,0xDF4A, 0, 0, 0,0xDF48,0xB862, 0, +0xDF4F,0xDF4E,0xDF4B,0xDF4D,0xDF49,0xBAE1,0xDF52,0xB85F, +0xDF51, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xE35D, 0,0xBAE8,0xE358, 0,0xBAE7, +0xE34E, 0,0xE350,0xBAE0,0xE355,0xE354,0xE357,0xBAE5, +0xE352,0xE351, 0, 0,0xBAE4,0xBADF,0xE353,0xBAE2, +0xE359,0xE35B, 0,0xE356,0xE34F,0xBAE3, 0, 0, +0xBD69,0xBADE, 0, 0,0xE35C, 0, 0, 0, + 0, 0, 0, 0,0xE6D9,0xBD62, 0,0xE6DB, + 0,0xBD63, 0, 0,0xBD65,0xE6DE, 0,0xE6D6, +0xBAE6,0xE6DC, 0, 0, 0, 0,0xE6D8, 0, +0xB860,0xBD68, 0, 0,0xBD64, 0,0xBD66,0xBD67, + 0,0xBF76,0xE6DD,0xE6D7,0xBD6A, 0,0xE6DA, 0, + 0, 0, 0, 0,0xEAC0,0xEABB, 0, 0, +0xEAC5,0xBF74,0xEABD,0xBF78,0xEAC3,0xEABA,0xEAB7,0xEAC6, +0xC151,0xBF79,0xEAC2,0xEAB8,0xBF77,0xEABC,0xBF7B,0xEAB9, +0xEABE,0xBF7A,0xEAC1,0xEAC4, 0, 0, 0, 0, +0xEDCB,0xEDCC,0xEDBC,0xEDC3,0xEDC1, 0, 0,0xC14F, +0xEDC8,0xEABF, 0,0xEDBF, 0,0xEDC9,0xC14E,0xEDBE, +0xEDBD,0xEDC7,0xEDC4,0xEDC6, 0,0xEDBA,0xEDCA,0xC14C, + 0,0xEDC5,0xEDCE,0xEDC2,0xC150,0xC14D,0xEDC0,0xEDBB, +0xEDCD,0xBF75, 0, 0, 0, 0, 0, 0, + 0,0xF063, 0, 0,0xF061,0xF067,0xC2B0,0xF065, +0xF064,0xC2B2,0xF06A,0xC2B1, 0,0xF06B,0xF068,0xC2AE, +0xF069,0xF062,0xC2AF,0xC2AD,0xF2AB,0xF066, 0, 0, +0xF06C, 0, 0,0xF2A8, 0, 0, 0,0xC3B2, +0xC3B0,0xF2AA, 0,0xF2AC,0xF2A9,0xC3B1,0xC3AE,0xC3AF, +0xC3B3, 0, 0,0xC478, 0,0xF4AA, 0,0xF4A9, +0xF4A7,0xF4A6,0xF4A8, 0,0xC477,0xC479, 0, 0, +0xC4F0, 0, 0,0xF5E5,0xF5E4, 0, 0,0xF6FA, + 0,0xF6FC,0xF6FE,0xF6FD,0xF6FB, 0, 0,0xC5A3, +0xC5A2, 0, 0,0xC5D3,0xC5D2,0xC5D4,0xF7ED,0xF7EC, + 0,0xF8FB,0xF8B8,0xF8FC,0xC658, 0,0xC659,0xF96D, + 0, 0,0xC67E,0xA6CC, 0,0xCDA8, 0, 0, +0xD045,0xD046,0xD044, 0, 0,0xACF3, 0,0xD047, +0xD048,0xD049, 0, 0,0xD349,0xD34F, 0, 0, +0xD34D,0xAFBB,0xD34B, 0,0xD34C,0xD34E, 0, 0, + 0,0xD34A,0xB2C9, 0,0xD6DE,0xB2CB,0xD6E0,0xB2CA, +0xD6DF, 0, 0, 0, 0, 0,0xDAE8,0xB5AF, + 0,0xDAEA,0xDAE7,0xD6E1, 0,0xB5B0, 0, 0, +0xDAE9, 0, 0, 0, 0, 0, 0,0xDF56, + 0,0xB864,0xDF54,0xB865,0xDF55,0xB866, 0, 0, + 0,0xBAE9,0xE361,0xE35E,0xE360,0xBAEA,0xBAEB,0xE35F, + 0, 0, 0, 0, 0,0xE6DF, 0, 0, +0xE6E0, 0,0xBD6B,0xE6E2,0xE6E1, 0,0xA261, 0, +0xEACA,0xEACB,0xEAC7, 0,0xEAC8,0xBF7C,0xBF7D,0xEAC9, + 0,0xC157, 0, 0,0xC153,0xC158,0xC154,0xC156, +0xC152, 0,0xC155, 0, 0, 0, 0,0xC2B3, +0xEDCF, 0,0xF2AE, 0,0xF2AD, 0,0xF4AB,0xC47A, +0xC47B,0xF741,0xF5E6, 0,0xF740, 0,0xF8FD,0xF9A4, +0xA6CD, 0, 0,0xA874, 0,0xCDA9,0xAAC8, 0, +0xACF6,0xD04C,0xACF4,0xD04A,0xACF9,0xACF5,0xACFA,0xACF8, +0xD04B,0xACF7,0xAFBF,0xAFBE,0xD35A,0xAFC7,0xD353,0xD359, +0xAFC3,0xD352,0xD358,0xD356,0xAFC2,0xAFC4,0xD355,0xAFBD, +0xD354,0xAFC8,0xAFC5,0xAFC9,0xAFC6,0xD351,0xD350,0xD357, +0xAFC0,0xAFBC,0xAFC1, 0, 0, 0, 0, 0, +0xD6F0,0xD6E9, 0,0xB5B5,0xD6E8, 0,0xB2CF,0xB2D6, +0xB2D3,0xB2D9,0xB2D8,0xB2D4, 0,0xD6E2,0xD6E5, 0, +0xD6E4,0xB2D0,0xD6E6,0xD6EF,0xB2D1,0xD6E3,0xD6EC,0xD6ED, +0xB2D2,0xD6EA,0xB2D7,0xB2CD,0xB2D5,0xD6E7,0xB2CC,0xD6EB, + 0, 0,0xD6EE, 0, 0, 0,0xDAFB,0xDAF2, +0xB5B2,0xDAF9,0xDAF6,0xDAEE,0xDAF7,0xB5B4,0xDAEF, 0, +0xDAEB, 0, 0,0xB86C,0xDAF4, 0,0xB5B1,0xDAFA, + 0,0xB5B8,0xB5BA,0xDAED, 0, 0,0xB5B9,0xDAF0, +0xB5B3,0xDAF8,0xDAF1,0xDAF5, 0,0xDAF3,0xB5B6,0xDAEC, +0xB5BB,0xB2CE,0xB5B7,0xB5BC, 0, 0, 0, 0, + 0,0xB868,0xDF5D,0xDF5F,0xDF61,0xDF65, 0,0xDF5B, +0xDF59,0xB86A, 0,0xDF60,0xDF64,0xDF5C,0xDF58, 0, +0xDF57, 0, 0, 0,0xDF62,0xDF5A,0xDF5E,0xB86B, + 0,0xB869,0xDF66,0xB867,0xDF63, 0,0xE372, 0, + 0, 0, 0, 0,0xBAEE,0xE36A,0xBD78,0xE374, +0xBAF1,0xE378,0xBAF7,0xE365, 0, 0,0xE375,0xE362, + 0,0xE377,0xE366, 0,0xBAFE,0xBAFB,0xE376,0xE370, +0xBAED,0xBAF5,0xBAF4, 0,0xBAF3,0xBAF9, 0,0xE363, +0xBAFA,0xE371,0xBAF6,0xBAEC,0xE373,0xBAEF,0xBAF0,0xBAF8, +0xE368,0xE367,0xE364, 0,0xE36C,0xE369,0xE36D,0xBAFD, + 0,0xE379,0xBAF2,0xE36E,0xE36F, 0,0xE36B, 0, + 0, 0,0xBAFC, 0, 0, 0, 0,0xE6E7, +0xBD70,0xBD79,0xBD75,0xE6E4, 0,0xBD72,0xBD76,0xE6F0, +0xBD6C,0xE6E8, 0,0xBD74, 0, 0,0xE6EB,0xE6E6, +0xBD73,0xBD77,0xE6E5, 0,0xBD71, 0,0xE6EF,0xBD6E, +0xE6EE,0xE6ED,0xBD7A,0xE572,0xBD6D, 0,0xE6EC,0xE6E3, + 0,0xBD7B,0xE6EA,0xBD6F, 0, 0, 0, 0, + 0, 0, 0,0xE6E9, 0, 0, 0, 0, +0xBFA2,0xBFA7,0xBF7E,0xEAD8,0xEACF,0xEADB,0xEAD3,0xEAD9, +0xBFA8,0xBFA1,0xEACC,0xEAD2,0xEADC,0xEAD5,0xEADA,0xEACE, + 0, 0,0xEAD6,0xBFA3,0xEAD4,0xBFA6,0xBFA5,0xEAD0, +0xEAD1,0xEACD,0xEAD7,0xBFA4,0xEADE,0xEADD, 0, 0, + 0,0xEDDA,0xEDD6,0xC15F, 0,0xEDD0,0xC159,0xC169, +0xEDDC,0xC161,0xC15D,0xEDD3,0xC164,0xC167,0xEDDE,0xC15C, +0xEDD5,0xC165,0xEDE0,0xEDDD,0xEDD1,0xC160,0xC15A,0xC168, +0xEDD8,0xC163,0xEDD2,0xC15E,0xEDDF,0xC162,0xC15B,0xEDD9, +0xC166,0xEDD7, 0, 0,0xEDDB, 0, 0, 0, +0xF06E,0xF074,0xC2B9,0xF077,0xC2B4,0xC2B5,0xF06F,0xF076, +0xF071,0xC2BA,0xC2B7, 0,0xF06D, 0,0xC2B6,0xF073, +0xF075,0xC2B8,0xF072,0xF070, 0, 0, 0, 0, +0xF2B8,0xC3B7,0xC3B8,0xC3B4, 0,0xC3B5, 0,0xF2B4, +0xF2B2, 0,0xF2B6,0xC3BA,0xF2B7,0xF2B0,0xF2AF,0xF2B3, +0xF2B1,0xC3B6,0xF2B5,0xF4AC,0xC47E,0xC47D,0xF4AD, 0, +0xF4AF,0xF4AE,0xC4A1, 0, 0, 0,0xF5EB,0xF5E8, +0xF5E9, 0,0xF5E7,0xF5EA,0xC4F2,0xF5EC, 0,0xC4F1, + 0,0xF742, 0,0xC5D5,0xC5D7,0xF7EE,0xC5D6,0xF8B9, +0xF940,0xF942,0xF8FE,0xF941,0xC66C, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xA6CE, 0, +0xACFB,0xD26F,0xAFCA, 0, 0,0xB2DA,0xDAFC,0xDAFD, + 0, 0, 0,0xEADF,0xC16A,0xEDE1, 0, 0, +0xC2BB, 0,0xF2BA,0xF2B9,0xC4A2,0xF5ED, 0,0xF743, +0xC5F8,0xCA49, 0, 0,0xAAC9,0xA875, 0, 0, +0xD04D, 0, 0,0xD360,0xD35B,0xD35F,0xD35D,0xAFCB, +0xD35E,0xD35C, 0,0xD6F1, 0,0xDAFE,0xDB40,0xDF69, +0xDF6A,0xB86E,0xB86F,0xDF68,0xDF6B,0xDF67,0xB86D, 0, +0xBB40, 0,0xB870,0xE37A, 0,0xBD7C,0xE6F1,0xBD7D, + 0,0xBFA9,0xEAE2,0xEAE0,0xEAE1,0xEDE4,0xEDE3,0xEDE2, + 0, 0, 0,0xF2BB, 0,0xC3B9,0xF2BC,0xF744, +0xC5F9,0xF8BA,0xA6CF,0xAACB,0xAACA,0xD04F,0xACFC, 0, + 0,0xD04E,0xD362, 0,0xAFCC,0xD6F2,0xD361, 0, + 0, 0,0xB2DC,0xD6F5,0xD6F3,0xD6F4,0xB2DB, 0, +0xDB42,0xDB43,0xDB41, 0,0xB873,0xDF6D,0xDF6C,0xDF6E, +0xB872,0xB871, 0, 0,0xE6F2,0xE6F4, 0,0xBD7E, +0xE6F3,0xEAE3,0xBFAA,0xF079, 0,0xF078,0xC3BB,0xF2BD, +0xC3BD,0xC3BC,0xF4B0,0xF5EE,0xC4F3,0xA6D0,0xD050,0xACFD, +0xD365,0xAFCE,0xD364,0xD363, 0,0xAFCD, 0,0xD6FB, + 0,0xD6FD,0xD6F6,0xD6F7,0xB2DD,0xD6F8,0xB2DE,0xD6FC, +0xD6F9,0xD6FA,0xB2DF, 0,0xB5BE,0xB5BF, 0,0xDB44, + 0, 0, 0,0xDF6F,0xDF70, 0,0xE37E,0xBB43, +0xBB41,0xBB42,0xE37B,0xE37C, 0,0xE37D,0xE6F9, 0, +0xE6FA,0xBDA1,0xE6F7,0xE6F6,0xE6F8,0xE6F5,0xBFAD,0xEAE4, +0xBFAB,0xBFAC,0xEDE6,0xC16B,0xEDE5,0xEFA8, 0,0xF07A, +0xF07B,0xC2BC, 0,0xC2BD,0xC16C,0xF2BE,0xF2BF,0xF4B1, +0xC4A3,0xA6D1, 0,0xA6D2,0xACFE,0xAACC,0xAFCF,0xD051, + 0, 0, 0,0xB5C0,0xA6D3,0xAD41,0xD052,0xD053, +0xAD40,0xAD42,0xA6D4, 0,0xD054,0xAFD1,0xD366,0xAFD3, +0xAFD0,0xAFD2, 0,0xD741,0xB2E0, 0,0xD740,0xD6FE, + 0,0xDF71, 0, 0,0xE3A1, 0,0xBDA2, 0, +0xBFAE,0xEAE6,0xEAE5, 0,0xEDE7, 0, 0, 0, +0xF5EF, 0, 0,0xA6D5,0xCB73,0xCDAA,0xAD43,0xD055, + 0,0xD368, 0, 0, 0,0xAFD4,0xD367,0xAFD5, + 0, 0, 0,0xD743, 0, 0,0xB2E2,0xD742, +0xD744, 0,0xB2E1, 0, 0, 0, 0,0xDB46, +0xDB47,0xDB45,0xB5C1, 0, 0, 0,0xB874, 0, +0xB875, 0,0xBB45, 0,0xE3A3,0xE3A2,0xBB44, 0, + 0, 0, 0, 0,0xE6FB, 0, 0,0xE6FC, + 0, 0, 0, 0,0xEAE7, 0, 0,0xC170, +0xC16F,0xC16D,0xC16E,0xC171, 0,0xF07C,0xC2BF,0xC2BE, +0xF2C0,0xF4B2, 0, 0, 0,0xC5A5,0xC5A4,0xA6D6, + 0, 0,0xD1FB, 0,0xB877,0xB5C2,0xB876,0xBB46, + 0,0xA6D7,0xC9A9,0xA6D8,0xA6D9, 0, 0,0xCDAB, +0xCB76, 0,0xCB77,0xA877, 0,0xCB74,0xA876, 0, +0xA879,0xCB75,0xA87B,0xA87A,0xCB78,0xA878, 0, 0, + 0,0xAAD1,0xAACF,0xCDAD, 0,0xAACE, 0, 0, + 0,0xAAD3,0xAAD5,0xAAD2, 0,0xCDB0,0xCDAC,0xAAD6, + 0,0xAAD0,0xA87C, 0,0xAAD4,0xCDAF, 0, 0, +0xCDAE, 0,0xAACD, 0, 0, 0, 0, 0, + 0, 0,0xD05B,0xAD47,0xAD48,0xD05D, 0,0xD057, +0xD05A,0xD063,0xD061, 0,0xAD49,0xD067,0xAD4C,0xD064, +0xD05C,0xD059, 0, 0,0xDB49,0xD062,0xAD44,0xD065, +0xD056,0xD05F,0xAD46,0xAD4B,0xD060,0xAD4F,0xAD4D, 0, +0xD058,0xAD4A, 0,0xD05E,0xAD4E,0xAD45,0xD066, 0, + 0, 0, 0, 0, 0,0xAFDA, 0,0xAFE3, +0xAFD8,0xAFD6,0xD36A,0xAFDE,0xAFDB,0xD36C, 0, 0, +0xAFDD,0xD36B,0xD369,0xD36E,0xAFE2,0xAFE0,0xDB48, 0, +0xD36F,0xD36D,0xAFD7, 0, 0,0xAFD9,0xAFDC, 0, +0xAFDF, 0,0xAFE1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xD74E,0xB2E4, 0, +0xD745,0xD747, 0,0xD748, 0,0xD750,0xD74C,0xD74A, + 0,0xD74D,0xD751,0xB2E5,0xB2E9,0xD746, 0,0xD74F, + 0,0xB2E7, 0,0xB2E6,0xD74B,0xD749, 0,0xB2E3, +0xB2E8, 0, 0, 0, 0, 0, 0, 0, + 0,0xB5C8,0xDB51, 0, 0,0xDB4F,0xB5CA, 0, + 0, 0, 0,0xDB4A,0xDFA1, 0,0xB5C9,0xDB4E, + 0, 0,0xDB4B,0xB5C5,0xB5CB,0xDB50,0xB5C7,0xDB4D, +0xBB47,0xB5C6,0xDB4C,0xB5CC,0xB5C4,0xB5C3, 0, 0, + 0, 0, 0,0xDF77,0xDF75, 0,0xDF7B, 0, +0xDF73,0xDFA2,0xDF78, 0,0xDF72,0xB87B,0xB8A3,0xDF7D, + 0,0xDF76, 0,0xB87E, 0, 0,0xB87C,0xDF7E, +0xB879,0xB878,0xDF79,0xB87D,0xB5CD, 0,0xDF7C,0xDF74, +0xB87A,0xB8A1,0xB8A2, 0, 0, 0, 0,0xBB4C, +0xBB48, 0,0xBB4D,0xE3A6, 0, 0,0xE3A5,0xE3A7, +0xBB4A,0xE3A4,0xBB4B,0xE3AA,0xE3A9,0xE3A8, 0,0xBB49, + 0, 0, 0, 0, 0,0xE741, 0,0xE744, +0xBDA8,0xE743,0xBDA7,0xBDA3,0xBDA4,0xBDA5,0xE740,0xE6FE, +0xBDA6, 0,0xE742,0xE6FD, 0, 0,0xEAE9,0xEAF3, +0xBFB1,0xBFB0, 0,0xEAED,0xEAEF, 0,0xEAEA, 0, +0xEAEE,0xEAE8,0xEAF1,0xBFAF,0xEAF0,0xEAEC, 0,0xEAF2, + 0,0xEAEB,0xC174,0xEDE8,0xEDEE,0xC178,0xC17A,0xC177, +0xC176, 0,0xC175,0xC173,0xEDE9,0xEDEC,0xC172,0xEDED, + 0,0xC179,0xEDEB, 0,0xEDEA,0xC2C0, 0,0xC2C1, +0xF0A1,0xF07D,0xF07E, 0, 0,0xF2C2, 0,0xF2C1, +0xC3BE,0xF4B4,0xC4A4,0xF4B3, 0,0xF5F0,0xF745,0xC5A6, +0xF943,0xF944,0xC5D8,0xA6DA, 0,0xAAD7,0xDB52,0xBB4E, +0xC17B,0xEDEF,0xA6DB, 0,0xAFE5,0xAFE4,0xDB53, 0, + 0, 0,0xEAF4,0xA6DC,0xAD50, 0, 0,0xDB54, +0xDB55,0xDB56,0xBB4F,0xBFB2,0xA6DD, 0,0xAAD8,0xD068, +0xAFE6,0xD370,0xB2EA, 0,0xDB57,0xB8A4, 0,0xBB50, +0xBFB3,0xC17C,0xC2C2,0xF4B5,0xA6DE,0xAAD9, 0, 0, +0xAFE7,0xD752,0xB5CE, 0,0xBB51,0xE3AB,0xE745, 0, + 0, 0, 0,0xA6DF,0xB5CF,0xDFA3,0xBB52,0xA6E0, +0xCDB1,0xD069,0xAD51, 0, 0,0xD372, 0, 0, +0xAFEA, 0,0xAFE8,0xAFE9,0xAFEB, 0, 0,0xD371, + 0, 0,0xD757,0xD754,0xD756,0xB2EB,0xB2ED,0xB2EC, +0xD753,0xB2EE,0xD755, 0,0xDB58,0xDB59, 0,0xDB5A, +0xDFA6, 0,0xDFA7, 0,0xDFA5,0xDFA8, 0,0xB8A5, + 0,0xDFA4, 0,0xBB53, 0, 0,0xE74A,0xE746, +0xE749,0xE74B,0xE748,0xE747, 0,0xEAF5,0xEAF6,0xEAF7, +0xBFB4,0xBFB5,0xEDF1,0xEDF0,0xEDF2, 0,0xF0A3,0xF0A2, + 0,0xF2C4, 0,0xF2C5,0xF2C3, 0,0xC4A5, 0, +0xF4B6,0xF4B7, 0,0xF746,0xF7EF,0xF8BB,0xA6E1,0xA87D, + 0,0xC17D,0xA6E2, 0,0xD758,0xDB5B, 0,0xC641, +0xCA4A, 0, 0, 0,0xCA4B,0xCA4D,0xA6E3,0xCA4E, +0xCA4C, 0, 0,0xCBA2,0xCBA3,0xCB7B, 0, 0, + 0, 0,0xCBA1,0xA8A1, 0,0xA8A2,0xCB7C,0xCB7A, +0xCB79,0xCB7D,0xA87E,0xCB7E,0xD06A, 0, 0, 0, +0xCDB6,0xAADC,0xCDB5,0xCDB7, 0,0xAADB,0xCDBC,0xAADF, +0xCDB2,0xCDC0,0xCDC6,0xAAE6,0xCDC3,0xAAE3, 0,0xCDB9, +0xCDBF,0xCDC1, 0,0xCDB4,0xAAE2,0xAADD,0xCDBA,0xAAE4, +0xAAE7,0xAAE1, 0,0xAADA,0xCDBE,0xCDB8,0xCDC5,0xAAE9, +0xAAE5,0xAAE0,0xCDBD,0xAFEC,0xCDBB,0xAADE,0xAAE8, 0, +0xCDB3, 0,0xCDC2,0xCDC4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xAD62,0xAD5C,0xAD64,0xAD61,0xD071,0xD074,0xAD5D, + 0,0xD06B, 0,0xAD56,0xAD60, 0,0xAD63,0xAD65, +0xD0A2,0xD077, 0,0xAD55,0xD0A1,0xAD59,0xAD57,0xAD52, +0xD06F, 0,0xD07E,0xD073,0xD076,0xD0A5, 0,0xAD66, +0xD07D,0xAD5E,0xD078,0xD0A4,0xD075,0xD079,0xD07C, 0, + 0,0xD06D,0xD0A3,0xD07B, 0, 0,0xD06C, 0, +0xD070,0xAD5F,0xAD5A,0xAD53,0xAD58,0xAD54,0xAD67,0xD06E, +0xD3A5,0xAD5B, 0, 0,0xD07A,0xCE41, 0, 0, + 0, 0, 0, 0, 0, 0,0xD3A8,0xAFFA, + 0,0xD376, 0,0xD3A3,0xD37D, 0,0xD3B2, 0, +0xD3AA, 0,0xD37E, 0,0xD3A9,0xD378,0xD37C,0xD3B5, +0xAFFD,0xD3AD,0xD3A4,0xAFED,0xD3B3,0xD374, 0,0xD3AC, + 0,0xAFFC,0xAFF7,0xD373,0xAFF5,0xAFF4,0xAFF9,0xD3AB, +0xAFF1,0xAFF8,0xD072,0xDB5C,0xD3A6, 0, 0,0xD37A, +0xAFFB,0xD37B,0xD3A1,0xAFFE,0xD375,0xD3AF, 0,0xD3AE, +0xD3B6,0xAFF3,0xAFF0,0xD3B4,0xD3B0,0xD3A7,0xD3A2,0xAFF6, +0xAFF2,0xD377,0xAFEE,0xD3B1,0xAFEF, 0,0xD379, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xD75E,0xD760,0xD765,0xD779,0xB2FC, +0xB2F2, 0,0xD75D,0xB2FD,0xB2FE,0xD768,0xD76F,0xD775, + 0,0xD762, 0,0xD769, 0, 0,0xB340,0xD777, +0xD772,0xB2FA,0xB2F8,0xD76E,0xD76A,0xD75C,0xB2EF,0xD761, +0xD759, 0,0xB2F7,0xB2F9,0xD766,0xD763,0xB2F4,0xD773, +0xB2F1,0xD764,0xD77A,0xD76C, 0,0xD76B,0xB2F0, 0, +0xB2FB, 0,0xB2F3,0xD75A,0xD75F,0xD770,0xD776,0xB341, +0xD75B,0xD767,0xD76D,0xB2F6, 0, 0,0xD778,0xD771, +0xD774, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xB2F5, 0,0xDB6C, +0xDB60,0xB5D7,0xDB7D,0xDBA7,0xDBAA,0xB5D5,0xDB68,0xDBA3, +0xDB69,0xDB77,0xB5E2,0xDB73,0xB5DF, 0,0xDB74,0xDB5D, + 0,0xDBA4, 0, 0,0xB5E8,0xDBA1,0xDB75,0xDBAC, +0xDB70,0xDFC8, 0,0xDBAF,0xB5E6,0xDB6E,0xDB7A,0xB5E9, +0xB5D4,0xDB72,0xDBAD,0xDB6B,0xDB64,0xDB6F, 0,0xDB63, +0xDB61,0xB5D0,0xDBA5,0xDB6A,0xDBA8, 0,0xDBA9,0xB5D8, +0xB5DD,0xB5D9,0xB5E1,0xDB7E,0xB5DA,0xDB76,0xDB66, 0, +0xB5D2,0xDB5E,0xDBA2,0xDBAB,0xDB65,0xB5E0,0xDBB0,0xDB71, + 0,0xDB6D, 0,0xB5D1,0xB5E5, 0,0xDB7C,0xB5E7, + 0,0xDB78,0xB5DC,0xB5D6,0xB5DE,0xB5D3,0xB5E4,0xDB79, +0xDB67,0xDB7B,0xDB62,0xDBA6, 0, 0, 0, 0, + 0, 0, 0,0xDBAE, 0, 0, 0, 0, + 0, 0, 0,0xDB5F, 0, 0, 0, 0, + 0,0xDFC7, 0,0xDFDD,0xB855,0xDFCC, 0,0xDFCA, +0xDFB5,0xB8A9,0xDFC5,0xDFD9,0xDFC1,0xB8B1,0xDFD8,0xDFBF, +0xB5E3,0xDFCF,0xDFC0,0xDFD6,0xB8B0,0xB8A8, 0,0xDFAA, +0xDFB2, 0,0xDFCB,0xDFC3,0xDFDC,0xDFC6,0xB8B6,0xDFD7, + 0,0xB8AD, 0,0xDFC9,0xDFD1,0xDFB6,0xDFD0, 0, +0xDFE1,0xDFB1,0xDFD2, 0,0xDFDF, 0,0xDFAB,0xB5DB, + 0,0xDFB9,0xDFB8,0xB8AF, 0,0xDFBC,0xDFBE,0xDFCD, +0xDFDE,0xB8B2, 0,0xB8B3, 0,0xDFB0,0xB8AB,0xDFB4, +0xDFDA,0xB8B4, 0,0xB8AC,0xB8AE,0xB8B5,0xDFE0,0xDFD3, +0xDFCE, 0, 0,0xDFBB,0xDFBA,0xB8AA,0xDFAC,0xB8A7, +0xDFC4,0xDFAD,0xDFC2, 0, 0,0xDFB7,0xDFDB, 0, + 0, 0,0xB8A6, 0, 0, 0,0xDFB3, 0, + 0, 0, 0, 0, 0,0xDFAF,0xDFD5,0xDFAE, +0xBB60,0xE3D3, 0, 0,0xE3C2, 0, 0,0xE3AC, +0xE3CA,0xBB58,0xE3BB,0xE3C5,0xBB5B,0xE3BE,0xBB59,0xE3AF, +0xE3CD,0xE3AE,0xE3C1, 0,0xE3AD, 0, 0,0xE3BF, +0xE3C8,0xE3C6,0xE3BA,0xE3B5,0xE3B3, 0,0xE3B4,0xE3C7, +0xE3D2,0xE3BC,0xBB5A, 0,0xE3B7, 0,0xE3CB, 0, +0xBB5D,0xE3B6,0xE3B0,0xE3C0,0xBB61, 0, 0,0xBB55, +0xBB5E,0xE3B8,0xE3B2, 0,0xBB57,0xDFD4,0xBB56,0xE3C3, + 0,0xBB54,0xBB63,0xBB5C,0xE3C4,0xE3B9,0xE3B1,0xE3CC, +0xE3BD,0xBB62,0xE3D0,0xBB5F,0xE3CF, 0,0xE3C9,0xE3CE, + 0, 0, 0,0xE3D1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE773, +0xE774,0xE767,0xE766,0xE762,0xBDB4, 0,0xBDAC,0xE776, +0xE775,0xDFA9,0xE75F,0xE763,0xE75D, 0,0xE770,0xE761, + 0,0xE777,0xE75A,0xE758,0xE764,0xE76E,0xE769,0xBDB6, +0xE74F, 0,0xE76D, 0, 0, 0,0xBDB7,0xDFBD, +0xE75B,0xE752,0xE755,0xE77B,0xE75C,0xE753,0xE751,0xE74E, + 0,0xBDB0,0xE765,0xBDAF,0xBDB3,0xE760,0xE768,0xBDA9, +0xE778,0xE77C,0xBDAB, 0,0xE757,0xE76B,0xE76F,0xE754, +0xE779,0xBDB2, 0,0xBDB1,0xE74C,0xBDB5,0xE772,0xE756, +0xE76A,0xE750,0xE75E,0xE759,0xBDAD,0xBDAE,0xE76C,0xE77D, +0xE77A,0xE771, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE74D, 0,0xBDAA,0xEB49, 0, +0xEB40,0xEB43, 0,0xBFBB,0xEB45,0xEAF9,0xEB41,0xEB47, +0xBFB8,0xBFBC,0xBFB6, 0, 0,0xEAFB,0xEB4C, 0, + 0,0xEB46, 0,0xEAFC,0xEB55,0xEB4F,0xEAF8,0xEE46, +0xEAFE,0xBFB7, 0,0xEB4A, 0,0xEB54,0xBFBF, 0, +0xEB51,0xEAFD,0xEB44,0xEB48,0xEB42,0xEB56,0xEB53,0xEB50, +0xBFB9,0xBFBA,0xBFBE,0xEAFA,0xEB57,0xBFBD,0xEB4D, 0, + 0,0xEB4B, 0, 0, 0,0xEB4E,0xEE53,0xEE40, +0xEE45,0xEE52,0xEE44,0xEDFB,0xEE41, 0,0xC1A2, 0, +0xEDF4,0xEE4D,0xEE4F,0xEDF3,0xC1A1,0xEE51,0xEE49,0xC1A8, +0xEE50,0xEE42,0xC1AA,0xEDF9,0xEB52,0xEE4A,0xEE47,0xEDF5, +0xEE55,0xC1A4, 0, 0,0xC1A5,0xEDF7,0xEE48, 0, +0xEE54,0xEE4B,0xEDFD,0xC1A7,0xC1A3,0xEE4C,0xEDFE,0xEE56, +0xEDF8,0xEE43,0xEE4E,0xEDFA,0xEDFC, 0,0xC2CB,0xEDF6, +0xC1A9,0xC2C4,0xC17E, 0, 0, 0, 0,0xC1A6, +0xC2C8,0xF0B3, 0,0xF0A9,0xF0A4,0xF0AA,0xF0B4,0xF0B8, +0xF0B7,0xC2CA,0xC2C9, 0, 0,0xF0AB,0xF0B9,0xF0AE, +0xF0A6, 0,0xF0A8,0xF0A7,0xF0AD,0xF0B2,0xF0A5,0xF0AC, +0xF0B1,0xC2C7, 0,0xF0AF, 0,0xC2C5,0xF0B0,0xC2C3, +0xC2C6,0xF2D5,0xF0B5, 0, 0,0xC3C2, 0,0xF2CD, +0xF2D1,0xF2C9,0xF2CC, 0,0xF2D4,0xC3C0,0xF2D9,0xF2D2, + 0,0xF2CA,0xF2DA,0xF2D3,0xC3C3,0xC3C4,0xF2D7, 0, +0xF2CB,0xC3BF,0xC3C1,0xF2C6,0xF2CE,0xF2C8, 0,0xF2D8, +0xF2D6,0xF2C7,0xF2CF, 0, 0, 0,0xF4BE,0xC3C5, +0xF2D0,0xC4A7,0xC4A9,0xC4A6, 0,0xF4C3,0xF4BB,0xF4B9, +0xF4BD,0xF4BA, 0, 0,0xF4BF,0xF4C1,0xC4AA,0xC4AC, + 0,0xF4C0,0xC4AD,0xC4AB,0xF4C2, 0, 0, 0, + 0,0xC4A8, 0, 0, 0, 0, 0,0xC4F4, +0xF5F1,0xF5F7,0xC4F6,0xF4BC,0xF5F6, 0,0xF5FD,0xF5F4, +0xF5FB,0xF5FA,0xF4B8,0xF5F5,0xF0B6,0xF5FE,0xF5F3,0xF5F8, + 0,0xF5FC,0xF5F2, 0,0xF74A,0xC4F5,0xF5F9, 0, + 0,0xF7F4,0xF74B,0xF749,0xF747,0xF748,0xF74C, 0, +0xC5D9,0xF7F2,0xF7F0,0xF7F5,0xF7F3, 0,0xF7F6,0xC5DA, +0xF7F1, 0, 0,0xF8BC, 0, 0,0xF945,0xF946, +0xF947, 0, 0,0xF9C7,0xF9BD,0xCA4F,0xAAEA, 0, +0xAD68, 0,0xD3B8,0xD3B7,0xB040,0xB342,0xD77C, 0, + 0,0xD77B, 0,0xB5EA,0xB8B8, 0,0xB8B7,0xB8B9, + 0,0xE3D4,0xE77E,0xEB58,0xEB5A,0xEB59, 0,0xC1AB, +0xEE57,0xF0BA,0xF9A5,0xA6E4, 0,0xCDC9,0xCDCA,0xCDC8, +0xCDC7,0xAAEB, 0,0xD0A9,0xD0A7, 0, 0,0xD0A6, + 0,0xAD69,0xAD6B,0xAD6A,0xD0A8, 0, 0, 0, + 0, 0, 0, 0, 0,0xD3C4,0xD3C1,0xD3BF, + 0, 0,0xB041,0xD3C2,0xB046,0xD3BC,0xD3CB, 0, +0xD3CD,0xD3BD, 0,0xB043,0xD3CE,0xD3C9,0xD3BB,0xD3C0, +0xD3CA,0xD3C6,0xD3C3, 0,0xB048,0xD3CC,0xD3BE, 0, + 0,0xD3C7,0xD3B9,0xB047,0xB044,0xD3C5, 0,0xD3C8, +0xD3BA,0xB045,0xB042, 0, 0, 0, 0,0xB34C, +0xD7A5,0xB34B, 0,0xD7A8,0xD7AB,0xB348,0xB346,0xD77E, +0xD7A9,0xD7A7,0xD7A4,0xD7AC,0xD7AD,0xD7AF,0xD7B0,0xD77D, +0xB345,0xD7A2,0xD7A1,0xD7AE,0xB347,0xD7A3,0xB349,0xB344, +0xD7A6,0xB34D, 0,0xB34A,0xD7AA, 0, 0, 0, +0xB5F1,0xDBBF, 0,0xDBB4,0xB5EE, 0,0xDFE7,0xDBBD, +0xDBB1,0xB5EC,0xDBB6,0xB5EF,0xDBBA,0xDBB8,0xB5F2,0xB5EB, + 0, 0,0xDBB2,0xDBB5,0xB5F0, 0,0xDBB3, 0, +0xDBBE,0xDBBC,0xDBB7,0xDBB9,0xDBBB,0xB5ED, 0, 0, + 0, 0, 0, 0, 0,0xDFE8,0xDFEE,0xDFE4, +0xDFEA,0xB8BA,0xDFE6,0xB8C0, 0, 0,0xB8BF, 0, +0xB8BE,0xDFED,0xB8C1,0xB8C2,0xDFE3,0xDFF0,0xB8C3,0xB8BD, +0xB8BC,0xDFEC,0xB8C4,0xDFE2,0xDFE5,0xDFEF,0xDFEB, 0, + 0,0xE3F4,0xE3E9,0xB8BB, 0, 0, 0, 0, +0xBB6A,0xE3DD,0xE3F2,0xE3DE,0xBB65, 0,0xE3DB, 0, +0xE3E4,0xE3DC,0xBB67,0xE3D6,0xE3F1,0xBB68,0xE3EE,0xE3EF, +0xE3D7,0xBB6D,0xE3E6, 0,0xE3E0,0xE3E7,0xE3DA, 0, +0xE3F3,0xE3EB,0xE3E5,0xE3D5,0xBB69,0xE3EC, 0,0xBB6C, +0xE3F0, 0,0xE3EA,0xBB66,0xE3E8, 0,0xE3E2,0xBB64, +0xE3D9,0xE3E1,0xE3ED,0xE3DF, 0, 0,0xE3E3, 0, + 0, 0, 0, 0,0xBDC1,0xDFE9,0xE7B2,0xE7BB, +0xE7B1,0xE7AD,0xE7AA,0xBDC2,0xE7A8,0xBB6B,0xE7A1,0xBDC0, +0xE7A7,0xBDBF,0xE7AC,0xE7A9,0xE7B9,0xE7B4,0xE7AE,0xE7B3, +0xBDBB,0xE7AB,0xE7BE,0xE7A2,0xE7A3,0xE7BA,0xBDBC,0xE7BF, +0xBDBE,0xE7C0,0xE7B0,0xE3D8,0xE7B6,0xE7AF,0xE7B8,0xE7B5, + 0, 0, 0,0xE7A6,0xBDB9,0xE7BD,0xBDBA,0xE7A4, +0xBDBD,0xEB64,0xE7B7,0xE7BC, 0, 0, 0, 0, + 0,0xEB61,0xBDB8,0xBFC0,0xEB6B,0xEB67, 0,0xEB65, +0xEB60,0xEB6F, 0, 0, 0,0xBFC4, 0,0xEB5C, +0xEB68,0xEB69,0xEB5F,0xEB5E,0xEB6C, 0,0xEB62,0xEB5D, +0xEB63, 0,0xEB6E,0xEB5B,0xEB6D,0xEB6A,0xBFC2,0xBFC1, + 0, 0,0xBFC3,0xEB66,0xF0CB, 0, 0, 0, + 0, 0,0xEE59,0xC1B1,0xEE5D,0xEE5A,0xEE61,0xEE67, +0xEE5C, 0,0xEE70,0xC1AE,0xEE6A,0xEE5F,0xEE6B,0xEE66, +0xEE6D,0xEE5E,0xC1B3,0xC1B2,0xEE60,0xEE6E,0xEE58,0xEE6C, +0xC1AC, 0,0xEE64,0xEE63,0xEE68,0xEE5B,0xC1B0, 0, +0xC1B4,0xEE62,0xEE69,0xC1B5,0xEE65, 0, 0, 0, + 0,0xC1AD,0xC1AF,0xF0C7,0xF0C5, 0, 0,0xF0CC, +0xF0C9,0xF0CD, 0,0xF0BE,0xF0C6,0xF0D1,0xEE6F,0xF0C2, +0xC2CF,0xE7A5,0xF0BD,0xF0CA,0xF0C4,0xF0C1,0xF0BC,0xF0BB, +0xF0D0, 0,0xF0C0,0xF0BF,0xC2CD,0xF0C8, 0,0xC2CC, + 0, 0,0xC2CE,0xF0C3,0xF0CF, 0,0xF2DE,0xF2DF, + 0,0xC3C9,0xF2DC,0xC3C6,0xF2E4, 0,0xC3CA,0xF2E6, +0xF2DB,0xF0CE,0xF2E8,0xF2DD, 0,0xC3C7,0xF2E3, 0, +0xF2E5,0xF2E0,0xF2E7,0xF2E2,0xF2E1,0xC3C8, 0, 0, +0xF4C5,0xF4C6, 0,0xF4C8,0xC4AE,0xC4AF,0xF4C9,0xF4C7, + 0,0xF4C4, 0,0xF642,0xF645,0xF641, 0,0xC4FA, +0xF643,0xC4F9,0xC4F8,0xC4F7,0xF644,0xF751,0xF74F, 0, +0xF74E,0xF640,0xF750,0xF646,0xF74D, 0,0xF7F9,0xF7D7, +0xF7F7,0xC5DB,0xF7F8,0xF7FA, 0,0xF8BF,0xC5FA,0xF8BE, +0xF8BD,0xC5FB, 0,0xC65A,0xF96E,0xF9A7,0xF9A6,0xF9A8, +0xA6E5,0xD0AA, 0,0xD3CF,0xD3D0, 0, 0, 0, +0xDBC0, 0,0xF647,0xF8C0,0xA6E6,0xAD6C,0xD0AB, 0, + 0, 0,0xD7B1,0xB34E, 0,0xDBC2,0xDBC1,0xB5F3, + 0,0xB8C5,0xE7C1,0xBDC3, 0,0xBDC4, 0, 0, + 0,0xBFC5,0xC5FC,0xA6E7, 0, 0, 0,0xD0AC, +0xAAED,0xD0AE,0xD0AD,0xAD6D, 0,0xD3D1, 0,0xD3D8, +0xB049,0xD3D6,0xD3D4, 0,0xD3DB,0xD3D2,0xD3D3,0xB04A, + 0,0xB04E, 0, 0,0xD3DC,0xB04D,0xD3DA,0xD3D7, +0xD3D5,0xB04B,0xB04C,0xD3D9, 0, 0, 0, 0, +0xB350,0xD7B2, 0,0xB355,0xD7C2,0xB354,0xD7C4, 0, + 0,0xD7B8,0xB352,0xD7C3, 0,0xD7B3,0xB353,0xD7BF, +0xD7BB,0xD7BD,0xD7B7,0xD7BE, 0, 0,0xB34F,0xD7BA, + 0,0xD7B9,0xD7B5, 0,0xD7C0, 0, 0,0xD7BC, +0xD7B4, 0,0xD7B6,0xB351,0xD7C1, 0, 0, 0, + 0,0xB5F6,0xDBCD, 0, 0, 0,0xDBC9,0xDBCB, +0xDBC6,0xDBC5,0xDBC3, 0,0xDBCA,0xDBCC,0xDBC8, 0, +0xDBC7,0xB5F4,0xB5F5, 0, 0, 0, 0, 0, + 0,0xDBCF,0xB8CD,0xDFF2,0xDFF8,0xDFF3,0xDFF4, 0, +0xDFF9, 0,0xB8CF, 0,0xB8C7,0xB8CE,0xDFF1,0xDBC4, +0xB8CA,0xB8C8,0xDFF7,0xDFF6,0xB8C9,0xB8CB,0xDFF5,0xB8C6, + 0,0xB8CC, 0, 0, 0, 0, 0,0xE3F6, +0xBB74, 0, 0,0xE442,0xE441, 0,0xE3FB,0xBB76, +0xE440,0xE3F7,0xE3F8,0xBB6E,0xBB70, 0,0xE3FD,0xE3F5, +0xBB72,0xBB71,0xE3F9,0xE3FE,0xE3FC,0xBB73,0xE3FA, 0, + 0,0xDBCE,0xBB6F, 0, 0,0xE7C2,0xE7C9,0xBDC6, + 0,0xE7CD,0xBDCA,0xE7C5,0xE7C3, 0,0xE7CC, 0, +0xBDC5,0xE7CB,0xBDC7,0xBDC8,0xE7C4,0xBDC9,0xE7CA,0xE7C6, +0xE7C7,0xE7C8,0xBB75, 0, 0, 0,0xEB70,0xEB7C, + 0,0xBFCA,0xEB77,0xEB79, 0,0xBFC8,0xEB71,0xEB75, + 0,0xEB78,0xBFC6,0xBFC9,0xEB7B,0xEB73,0xEB74,0xEB7A, +0xEB72,0xEB76,0xBFC7,0xEE72, 0,0xEE71,0xC1B7,0xEE77, +0xC1B9, 0, 0,0xC1B6,0xEE73,0xC1BA,0xEE74, 0, + 0,0xEE75,0xEE78, 0,0xC1B8, 0,0xF0D6, 0, + 0,0xF0D9, 0,0xF0D3,0xF0D5, 0, 0,0xF0D4, +0xF0D7,0xF0D8,0xEE76,0xF0D2, 0, 0,0xC3CD,0xF2EC, +0xF2EF,0xF2F1,0xF2EA,0xF2EB,0xF2EE,0xF2F0,0xC3CE,0xC3CC, +0xC3CB,0xF2ED,0xF2E9,0xF4CA,0xC4B0, 0,0xF4CB, 0, + 0,0xF649,0xC4FB,0xF64B,0xC4FC,0xF648,0xF64A,0xC5A8, + 0,0xF752,0xC5A7,0xF7FD,0xF7FC, 0,0xF7FB, 0, + 0,0xF948,0xF949,0xF94B,0xF94A, 0,0xCA50,0xA6E8, + 0,0xAD6E,0xD7C5,0xB5F7, 0,0xDFFA,0xC2D0, 0, +0xF2F2, 0, 0,0xA8A3, 0, 0, 0,0xB357, + 0, 0, 0,0xB356, 0,0xDBD0,0xB5F8,0xDBD2, +0xDBD1, 0, 0,0xDFFB,0xB8D0,0xE443,0xE446,0xE445, + 0,0xE444,0xE7CE,0xE7D0,0xE7CF, 0,0xBFCC, 0, + 0, 0,0xBFCB, 0,0xC1BB,0xEE79,0xEE7B,0xEE7A, + 0, 0,0xC2D1, 0, 0, 0,0xF2F4,0xF2F3, + 0,0xF4CC,0xC4B1, 0, 0,0xC4FD,0xF754,0xF753, +0xC65B, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xA8A4,0xD0AF,0xAD6F,0xD7C8,0xD7C6, 0, + 0,0xD7C7,0xDBD4,0xDBD5,0xE043,0xDBD3, 0,0xDFFC, +0xE041,0xE040,0xE042,0xB8D1,0xDFFE,0xDFFD,0xE044, 0, +0xE449,0xE447, 0,0xE448,0xE7D3,0xE7D1, 0, 0, +0xE7D2,0xEB7D,0xEE7C,0xEE7D,0xC2D2, 0,0xF2F5,0xF4CD, +0xC4B2, 0,0xF64C,0xF755,0xC5A9, 0,0xF7FE,0xF94C, +0xA8A5, 0,0xAD71,0xAD72,0xD0B0, 0, 0,0xD0B1, +0xAD70, 0,0xB054, 0,0xB052, 0,0xB051,0xB058, +0xB050,0xB059,0xD3DD,0xB056, 0,0xB053,0xB057,0xB055, +0xB04F, 0, 0,0xB35F, 0,0xB359,0xD7CC,0xB35E, + 0, 0,0xB360,0xB35A, 0,0xB35B, 0,0xD7CA, + 0, 0,0xB358, 0,0xD7CB,0xB35D, 0, 0, +0xD7C9,0xB35C, 0, 0,0xB644, 0,0xB646, 0, + 0,0xDBD8,0xB645,0xB5F9,0xB5FD, 0,0xB8E4,0xE049, +0xDBDA,0xB5FE, 0, 0,0xDBDD,0xDBDE,0xB643, 0, +0xDBE0, 0,0xDBE2, 0,0xDBE3,0xDBD7,0xDBD6,0xDBE4, +0xB642,0xDBE1,0xDBDF, 0,0xB640,0xB5FB,0xB647,0xDBDB, +0xDBDC,0xDBD9, 0,0xB641, 0, 0,0xB5FC, 0, +0xB5FA,0xE048,0xB8DF,0xB8DA, 0, 0,0xB8D5, 0, +0xB8E5,0xB8D6, 0,0xB8D2,0xB8E1,0xB8DE,0xB8E0, 0, +0xB8D7,0xB8DC,0xB8D3,0xB8D4,0xE050,0xE04D,0xE045,0xE04A, + 0,0xB8E2,0xE051,0xB8E3,0xB8D9, 0, 0,0xE047, + 0,0xE04F,0xE04B,0xE04E,0xE04C,0xB8DD,0xE046,0xB8D8, + 0, 0, 0,0xE44C,0xBB78,0xBB7B, 0,0xE44E, + 0,0xBBA5,0xE44D,0xBB7D, 0,0xBDCF,0xE44F, 0, +0xBBA4,0xE44B,0xBBA6, 0, 0, 0,0xBB79, 0, +0xB8DB,0xBB7C, 0,0xBB7A,0xBB7E,0xBBA2,0xBB77,0xBBA7, +0xBBA3, 0,0xBBA1,0xE44A, 0, 0, 0, 0, +0xBDD6, 0,0xBDD2, 0, 0, 0,0xBDD9, 0, +0xE7D6,0xBDDA,0xE7E2,0xE7DB,0xBDCB,0xE7E3,0xE7DD,0xBDD5, +0xE7DE, 0,0xBDD4,0xE7E1,0xBDCE,0xE7DF,0xE7D5,0xBDCD, +0xEBAA,0xBDD3, 0,0xBDD0, 0,0xBDD8, 0,0xE7D4, + 0,0xE7D8,0xBDCC,0xE7D7,0xE7D9,0xE7DA,0xBDD7,0xE7DC, +0xE7E0,0xE7E4, 0,0xBDDB,0xBFD2,0xEBA5,0xEBAB,0xEBA8, +0xEB7E,0xEBAC,0xEBA1, 0,0xEBA7, 0,0xBFCD,0xBFD3, +0xEBAD, 0, 0,0xBFCF, 0,0xBFD9,0xBFD4,0xEBAF, +0xEBA9,0xBFD0,0xEBA2,0xBFDA,0xEBA3,0xEBA4,0xBFDB,0xBFD8, +0xBDD1, 0,0xBFCE,0xEBB0,0xBFDC, 0,0xBFD5,0xEBAE, +0xBFD1,0xBFD6,0xBFD7, 0,0xC1C3,0xEEA4,0xEEAD,0xEEAA, +0xEEAC, 0,0xC1C0,0xEEA5, 0,0xEEAB,0xC1BC,0xEEA7, +0xC1C4,0xEEA3,0xEEA8,0xEEAF,0xEBA6,0xEEA9,0xEEA2,0xC1BD, +0xEEA1,0xC1BE,0xEEB0,0xC1BF,0xEEAE,0xC1C2,0xEE7E, 0, +0xC1C1, 0,0xEEA6,0xF0DC,0xF0EA,0xF0E5,0xF0E7,0xF0DB, +0xC2D3, 0,0xF0DA,0xC2D6,0xC2D5, 0,0xF0E9,0xF0E1, +0xF0DE,0xF0E4, 0,0xF0DD, 0,0xF0DF,0xF0E8,0xF0E6, + 0,0xC2D4,0xF0ED,0xF0EB,0xF0E2,0xF0EC,0xF0E3, 0, +0xF2F9,0xC3CF,0xF341, 0, 0,0xF64F,0xC3D6,0xF0E0, +0xF2F7,0xC3D2,0xF2F8,0xF2FD, 0, 0,0xC3D4,0xC3D5, +0xF2F6,0xF340,0xF342,0xF2FA,0xF2FC,0xF2FE,0xF2FB,0xF343, +0xC3D1,0xC3D7,0xC3D3, 0,0xC3D0,0xF4D0, 0,0xC4B7, +0xF4CE, 0, 0,0xF4D2, 0,0xF4D3,0xC4B5,0xF4D4, +0xF4D1, 0,0xF4CF,0xC4B8,0xC4B4,0xF4D5, 0,0xC4B6, +0xC4B3, 0, 0, 0,0xC4FE, 0, 0,0xC540, +0xF64E,0xF64D,0xF650,0xF651, 0,0xC541,0xF756,0xF75B, +0xC5AA, 0,0xF758, 0,0xF757,0xF75A,0xF759, 0, +0xF843, 0,0xC5DC,0xF842,0xF840, 0,0xF841, 0, + 0, 0,0xC5FE,0xC5FD,0xF8C1,0xF8C2,0xC640, 0, +0xF94D,0xF94E,0xC667, 0,0xC66D, 0,0xF9A9,0xF9C8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xA8A6, + 0,0xD7CD, 0,0xD7CE,0xE052,0xE450,0xE7E5,0xC1C6, + 0,0xC1C5,0xF0EE,0xF344, 0,0xF844,0xA8A7,0xD3DE, +0xB05A,0xB361,0xE054,0xE053,0xBDDC,0xE7E6,0xBDDD,0xEEB1, +0xC2D7, 0, 0, 0,0xC676,0xA8A8,0xCDCB,0xD3DF, + 0, 0,0xB362, 0,0xD7CF,0xD7D0, 0,0xDBE5, + 0,0xB648,0xB8E6, 0,0xE056,0xE055,0xE057, 0, +0xE451,0xE452,0xBBA8,0xBFDD,0xBDDE,0xBFDE, 0,0xEEB5, +0xEEB2,0xEEB4,0xEEB3,0xC1C7, 0,0xF0EF,0xF346,0xF345, +0xCBA4,0xB05C,0xB05B,0xD3E0, 0,0xD7D1, 0, 0, +0xDBE7,0xDBE6,0xB649, 0,0xE059,0xE05A,0xE058, 0, + 0,0xB8E8,0xB8E7, 0,0xBBAA,0xBBA9, 0,0xE7E7, +0xEBB3,0xEBB1,0xEBB2,0xBFDF,0xEEB7,0xEEB6, 0,0xF0F2, +0xF0F1,0xF0F0,0xF347, 0,0xF9AA,0xA8A9,0xAD73, 0, +0xAD74,0xB05D,0xB05E,0xD3E2,0xD3E1,0xD7D2, 0,0xB368, +0xB366,0xB363,0xB367,0xB365,0xB364, 0, 0,0xB64A, +0xDBEA, 0,0xB8ED,0xB64C,0xB651,0xDBEC,0xB653,0xB652, +0xB655,0xDBEB,0xDBE8,0xB64F,0xB64B,0xB64D,0xDBE9,0xB654, +0xB650,0xB64E,0xB8EF,0xB8EE,0xB8EC,0xB8F0, 0,0xB8EA, +0xB8EB, 0,0xB8E9, 0,0xE05B, 0, 0,0xE454, + 0,0xBBAC,0xBBAD,0xBBAB, 0,0xE453, 0,0xE455, + 0,0xE7EA,0xE7EC, 0,0xBDE7,0xE7ED,0xBDE0,0xE7E9, +0xBDDF,0xBDE9,0xBDE5,0xBDE6,0xBDE2,0xE7E8,0xBDE1,0xE7EE, +0xE7EB, 0,0xBDE8, 0,0xBDE3,0xBDE4,0xEBB5, 0, +0xEBB7,0xEBB6, 0,0xEBB8,0xBFE0,0xEBB4, 0, 0, +0xC1CB,0xEEB8,0xC1C8,0xC1CC,0xC1CA,0xC1C9,0xF0F3, 0, +0xF0F6, 0,0xF0F5, 0,0xF0F4,0xC2D8,0xF348,0xF349, +0xC3D8,0xF34A,0xC3D9, 0, 0,0xC4BA, 0,0xC4B9, +0xF652, 0, 0,0xC542,0xF653,0xF75C,0xC5AB,0xC5AC, + 0,0xF845, 0,0xC642, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xA8AA, 0,0xB36A,0xB369, +0xE05C,0xE05D, 0,0xBBAE,0xEBB9,0xBDEA,0xEBBA,0xEEB9, +0xA8AB, 0,0xD0B2,0xAD76,0xAD75, 0,0xD3E3,0xB05F, +0xD3E4,0xD7D5, 0,0xD7D4, 0,0xD7D3, 0, 0, +0xDBEE,0xB658, 0, 0,0xDBED,0xB657, 0, 0, + 0,0xDBEF,0xB656, 0,0xE05F,0xE062,0xE060,0xE061, +0xE065,0xE05E,0xE066,0xE063,0xE064,0xBBB0,0xE456, 0, + 0,0xBBAF, 0,0xE7F2,0xE7F0, 0, 0,0xBDEB, +0xE7EF,0xE7F1, 0,0xBDEC, 0,0xEBBB, 0,0xEBBC, +0xC1CD, 0,0xF34C,0xF34E,0xF34B,0xF34D,0xF4D6,0xF654, + 0, 0,0xF96F,0xA8AC,0xAD77,0xD3E5,0xD3E7,0xD3E6, + 0,0xD7D8,0xB36C, 0,0xD7D6, 0,0xB36B,0xD7D9, + 0,0xD7DA,0xD7D7, 0, 0,0xDBFB,0xB660,0xDBF3, +0xDBF9, 0, 0,0xB65B,0xB65E,0xDBF2,0xB659,0xDBF6, +0xE06C,0xB65D, 0,0xDBF1, 0,0xDBF7,0xDBF4,0xDBFA, +0xDBF0,0xDBF8,0xB65C,0xB65F,0xDBF5,0xB65A, 0,0xB8F2, +0xE068,0xB8F1,0xE06F,0xE06E,0xB8F8, 0,0xB8F9,0xE070, +0xB8F3,0xE06D,0xB8F7,0xE072,0xE069, 0,0xE06B,0xB8F4, +0xE067,0xE06A,0xE071,0xB8F5,0xE073, 0, 0, 0, + 0, 0,0xB8F6, 0,0xBBB1,0xE45B,0xE461,0xE459, +0xE462, 0,0xE458,0xE45D,0xE463,0xE460,0xE45F,0xE45E, + 0,0xE457,0xE45C, 0, 0,0xE45A, 0,0xBDF1, +0xBDEE,0xE7FB,0xE841,0xE843,0xE840,0xE7F8,0xE7FA,0xE845, +0xE842,0xE7FC,0xE846,0xE7F9,0xE844,0xBDEF,0xBDF5,0xBDF3, +0xE7F3,0xBDF4,0xBDF0,0xE7F4,0xE7F6,0xE7F5,0xE7FD,0xE7FE, + 0,0xBDF2, 0,0xBDED, 0, 0,0xE7F7, 0, +0xEBC6,0xBFE2, 0,0xEBBD,0xBFE3,0xBFE6,0xEBC2, 0, +0xEBBF,0xBFE5, 0, 0,0xEBC3,0xEBC4,0xEBBE,0xEBC7, +0xEBC0,0xEBC5,0xBFE4, 0,0xBFE1,0xEBC1, 0,0xEEBF, +0xC1D0,0xC1CE,0xC1D1,0xC1CF,0xEEBE,0xEEBB,0xEEBA, 0, +0xEEBD, 0, 0,0xEEBC,0xF145,0xC2DE,0xF0FB,0xF0FA, + 0,0xC2D9,0xF141,0xF140,0xF0F7,0xF143,0xF0FC,0xC2DD, +0xF0F9,0xF142,0xF0F8,0xC2DA,0xC2DC,0xF0FD,0xC2DB,0xF0FE, + 0,0xF144,0xF352, 0,0xC3DE,0xF34F, 0,0xF353, + 0, 0,0xC3DB,0xF351,0xC3E0, 0,0xC3DD, 0, +0xF350, 0,0xC3DF,0xF354,0xC3DA, 0, 0, 0, + 0,0xC4BC,0xC4BE, 0,0xF4D9,0xC4BD,0xF4D7,0xC3DC, +0xF4D8,0xC4BB,0xC543,0xC545,0xF656,0xC544,0xF655, 0, +0xF761,0xC5AD,0xF760,0xC5AE,0xF75E,0xF75D,0xF762,0xF763, +0xF846, 0,0xF75F, 0, 0,0xF8C6,0xF8C3,0xF8C4, +0xF8C5,0xC65C, 0,0xF951,0xF950,0xF94F,0xF970, 0, +0xF9BE,0xF9AB,0xC66E,0xA8AD,0xB060, 0, 0, 0, + 0, 0,0xB8FA, 0, 0, 0, 0, 0, + 0, 0,0xBDF6, 0, 0,0xEBC8, 0, 0, +0xC2DF, 0,0xF355, 0, 0, 0, 0, 0, + 0,0xF9AC,0xA8AE,0xAAEE,0xAD79,0xAD78, 0,0xB063, + 0,0xD3E8,0xB061,0xD3E9,0xB062, 0, 0,0xD7DF, +0xD7DB, 0, 0,0xB36D,0xD7DE,0xD7DD,0xD7DC,0xB36E, +0xD7E0,0xD7E1, 0, 0, 0,0xDC43,0xDC41,0xDC45, +0xDC46,0xDC4C, 0,0xDC48,0xDC4A, 0,0xDC42,0xDBFC, + 0,0xDC49, 0, 0,0xDC4B,0xDC44,0xDC47,0xDBFD, +0xB662,0xDC40,0xDBFE,0xB661,0xB663, 0,0xB8FD,0xE075, +0xE077,0xE076,0xE07B,0xB8FB, 0,0xE078,0xE074,0xE079, +0xE07A,0xB8FC,0xB8FE,0xE07C, 0,0xE467,0xE466, 0, +0xE464,0xE465,0xBBB3,0xBBB5,0xBBB2,0xBBB4,0xE84D,0xE84E, +0xE849, 0,0xE84A,0xBDF8,0xBDFD,0xBDF7,0xBDFE,0xBDF9, +0xE84B, 0, 0,0xE84C,0xE848,0xBE40,0xBDFB, 0, + 0,0xBDFA,0xBDFC, 0,0xE847, 0,0xEBCA,0xBFE8, + 0, 0,0xEBCC,0xBFEA,0xEBCF,0xEBCB,0xEBC9,0xEBCE, +0xBFE9,0xEBCD, 0,0xBFE7, 0, 0,0xC1D3,0xC1D6, +0xEEC1, 0,0xC1D4,0xEEC0,0xC1D2,0xC1D5,0xF146,0xF147, +0xF148,0xC2E0, 0,0xF149, 0,0xC2E1,0xC3E2,0xF358, +0xF359,0xF357,0xF356,0xF35A,0xC3E1,0xF4DD,0xF4DB,0xF4DC, +0xF4DE,0xF4DA,0xF4DF,0xF658, 0,0xF659,0xF657,0xC546, +0xF764,0xC5AF,0xF765,0xF848,0xF847, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xA8AF,0xB664, 0, 0,0xB940, + 0, 0, 0,0xBBB6, 0, 0,0xBFEC, 0, +0xBFEB, 0, 0, 0, 0,0xC3E3,0xC47C,0xC547, +0xA8B0,0xB064,0xB941, 0,0xF35B, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xCBA6, + 0, 0,0xA8B1, 0,0xA8B4,0xA8B3,0xA8B2, 0, + 0,0xCBA5, 0,0xCDCD, 0,0xCDCF,0xAAEF, 0, + 0,0xAAF1,0xCDCC,0xCDCE,0xAAF0,0xCDD1,0xCDD0,0xCDD2, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD0B6,0xD0B4,0xAD7C,0xD0B3,0xADA3,0xAD7E,0xAD7B, 0, +0xADA4, 0,0xAD7D,0xADA2, 0,0xADA1,0xD0B5, 0, +0xAD7A, 0, 0, 0,0xB06A,0xD3EB,0xD3F1,0xB067, +0xB06E, 0,0xB069,0xD3EE,0xD3F0,0xB06C,0xD3EA,0xD3ED, +0xB068,0xB065,0xD3EC,0xB06B,0xD3EF,0xB06D,0xB066, 0, + 0, 0, 0,0xD7E3,0xD7E6,0xB370, 0,0xB37A, +0xB376,0xD7E4, 0, 0,0xB37E,0xB377,0xB37C,0xB372, + 0,0xB36F,0xB371,0xB37D,0xD7E5,0xB375,0xB378,0xB374, +0xB379,0xD7E7,0xB37B,0xB373,0xD7E2, 0, 0, 0, + 0, 0, 0, 0, 0,0xDC4D,0xB665,0xDC4F, + 0,0xB667,0xB669, 0,0xDC4E,0xB666,0xB66A, 0, +0xB668, 0, 0, 0,0xB947,0xE0A3,0xB94F,0xE07E, + 0,0xB950,0xB945, 0,0xE0A1, 0, 0,0xB94A, + 0,0xE0A2,0xB943,0xB942, 0,0xB94D,0xB94C,0xB94B, +0xB949,0xB94E,0xE07D,0xB944,0xB946,0xB948, 0, 0, +0xBBB8,0xBBBB, 0,0xBBBF,0xBBB9,0xBBBE,0xBBBC, 0, +0xBBB7, 0,0xBBBD,0xBBBA, 0, 0, 0,0xE852, +0xBE43,0xBE41, 0,0xE853, 0,0xBE44,0xBE42,0xE851, +0xE850, 0,0xBFF0,0xE84F,0xBFEE,0xBFED,0xEBD0,0xBE45, +0xBFEF,0xEBD1,0xBFF2,0xEBD2,0xBFF1,0xC1D8,0xEEC3,0xC1D7, +0xC1DC,0xC1DA,0xC1DB,0xC2E3,0xC1D9,0xEEC2,0xEBD3,0xC2E2, +0xC2E4, 0,0xC3E4,0xC3E5, 0,0xF4E0, 0,0xC5DE, +0xC5DD,0xA8B6, 0, 0,0xCA55,0xB06F, 0,0xCA52, +0xCA53,0xCA51, 0,0xCA54, 0, 0,0xCBAA,0xCBA7, +0xCBAC,0xCBA8,0xA8B7,0xA8BA, 0,0xCBA9,0xA8B9,0xCBAB, + 0, 0,0xA8B8, 0, 0, 0, 0,0xCDD5, +0xCDD7,0xAAF4,0xCDD3,0xCDD6,0xCDD4,0xAAF2,0xAAF5, 0, +0xAAF3, 0, 0, 0, 0,0xD0B8,0xD0BC,0xD0B9, + 0,0xADA7, 0,0xADA8, 0,0xD0BB, 0,0xD0BD, +0xD0BF, 0,0xADA5,0xD0BE, 0, 0,0xADA6, 0, + 0, 0, 0, 0,0xD7EE,0xD0BA,0xD3F2,0xD3FB, +0xD3F9,0xD3F4,0xD3F5,0xD3FA,0xD3FC,0xB071, 0,0xD3F7, +0xD3F3,0xB070,0xB072,0xD3F6,0xD3FD,0xD3F8, 0, 0, +0xB3A1,0xD7F1,0xD7E9,0xD7EF,0xD7F0,0xB3A2, 0,0xD7E8, +0xD7EA,0xD0B7,0xD7EC,0xD7ED,0xD7EB,0xB66C, 0, 0, + 0,0xDC56,0xEBD4,0xDC57,0xDC54,0xB3A3,0xB66E,0xDC53, +0xDC59,0xDC58,0xB66B,0xDC5C,0xDC52,0xDC5B,0xDC50,0xDC5A, +0xDC55,0xB66D, 0,0xE0AA, 0,0xE0A5,0xE0AB,0xE0A6, +0xE0A4,0xE0A7,0xB951, 0,0xE0A9, 0,0xE0A8,0xB952, +0xBBC1,0xBBC0,0xE46E,0xE471,0xE469,0xE46D,0xBBC2,0xE46C, +0xE46A,0xE470,0xE46B,0xE468,0xE46F, 0,0xE859,0xBE48, +0xF14A,0xE856,0xE857,0xE855,0xDC51,0xBE47,0xE85A,0xE854, +0xBE46,0xBE49,0xE858,0xEBD5,0xBFF3,0xEBD6,0xEBD7, 0, +0xEEC4,0xC1DD,0xF14B,0xF14C, 0, 0,0xF14D,0xF35D, +0xF35C,0xF4E2, 0,0xF4E1,0xF65B,0xF65C,0xF65A,0xF766, +0xC5B0,0xA8BB,0xADAA,0xADA9,0xB075,0xB074,0xD440,0xD441, +0xD3FE, 0,0xB073,0xD7F5, 0,0xD7F6,0xD7F2,0xB3A4, +0xD7F3, 0,0xD7F4, 0, 0, 0, 0,0xDC5F, +0xDC61,0xDC5D,0xDC60,0xB66F,0xDC5E,0xB670, 0, 0, +0xDD73,0xB955,0xB954, 0,0xB953, 0,0xE0AC,0xE0AD, + 0, 0,0xE473,0xE475,0xBBC6,0xBBC3, 0,0xBBC5, +0xBBC4,0xE474,0xE472, 0, 0, 0, 0, 0, +0xE861,0xE85E,0xE85F,0xBE4D,0xE860,0xE85B,0xE85C,0xBE4A, + 0,0xBE4B,0xE85D,0xBE4C, 0,0xEBDB, 0,0xEBDC, +0xEBD9,0xEBDA,0xBFF4,0xEBD8, 0, 0, 0, 0, + 0,0xEEC8,0xEEC5,0xEEC7,0xC1E0,0xEECB,0xC1DF,0xEEC9, +0xEECC,0xEECA,0xEEC6,0xC1DE, 0,0xF14F, 0,0xF150, +0xF14E, 0,0xF152,0xC2E5,0xC2E6,0xF35F,0xC3E7,0xF151, +0xF35E,0xC3E6,0xF4E5,0xF4E6,0xC4BF,0xF4E4, 0,0xF4E3, + 0,0xF65D,0xC548, 0,0xF849,0xF8C8,0xF8C7, 0, +0xC643,0xC65D,0xF8C9,0xF971, 0,0xC66F,0xA8BC,0xAAF6, + 0,0xB956, 0,0xC4C0,0xA8BD,0xADAB,0xB3A5,0xB671, +0xC2E7,0xAAF7, 0,0xD0C1,0xD0C0,0xD442, 0,0xB078, +0xB076,0xB07A,0xD444, 0,0xB079,0xB077, 0, 0, + 0, 0,0xD443,0xB3A8,0xD7FC, 0,0xB3A7,0xB3A9, +0xD842,0xB3AB,0xD7FE,0xD840,0xD7F7,0xB3AA,0xD843, 0, + 0,0xD7F9, 0,0xD7FA,0xD7F8,0xB3A6, 0,0xD841, +0xD7FB,0xD7FD, 0, 0, 0,0xDC6D, 0,0xDC6C, +0xDC6A,0xDC62,0xDC71,0xDC65,0xDC6F,0xDC76,0xDC6E,0xB679, + 0,0xB675,0xDC63, 0,0xDC69,0xB677, 0,0xDC68, +0xB678,0xB67A,0xDC6B, 0,0xB672,0xB673,0xDC77,0xDC75, + 0,0xDC74,0xDC66, 0,0xDC72, 0,0xB676, 0, + 0, 0, 0,0xB674,0xDC73,0xDC64,0xDC67,0xDC70, + 0, 0, 0, 0, 0,0xE4BA,0xE0B7, 0, +0xE0B0,0xE0C3,0xE0CC,0xE0B3,0xB961, 0,0xE0C0,0xB957, +0xB959,0xB965,0xE0B1, 0, 0,0xB95A,0xB95C,0xB966, +0xB95B, 0, 0, 0, 0,0xB964,0xE0B9, 0, +0xE0AE,0xB962,0xE0B8,0xB95E,0xE0CA,0xB963,0xE0C8,0xE0BC, +0xE0C6,0xB960,0xE0AF,0xE0C9,0xE0C4, 0,0xE0CB,0xB958, + 0, 0,0xB967,0xB95D, 0, 0,0xE0B5, 0, +0xE0BD,0xE0C1, 0,0xE0C5,0xB95F,0xE0B4,0xE0B2,0xE0BE, + 0, 0, 0, 0,0xE0BB,0xE0BA, 0,0xE0BF, +0xE0C2, 0,0xE0C7, 0, 0, 0,0xE478, 0, +0xBBC7,0xE4A4,0xE47A,0xBBCC,0xBBD0,0xE4AD,0xE4B5,0xE4A6, +0xBBC8, 0,0xE4AA,0xE0B6, 0,0xBBC9,0xE4B1,0xE4B6, +0xE4AE, 0,0xE4B0,0xE4B9,0xE4B2,0xE47E,0xE4A9, 0, + 0,0xBBD1, 0,0xBBCD,0xE47C,0xE4AB,0xBBCB,0xE4A5, +0xBBCA,0xE4B3,0xE4A2,0xE479,0xBBCE,0xE4B8, 0, 0, +0xE47B,0xE4AF,0xE4AC,0xE4A7,0xE477,0xE476,0xE4A1,0xE4B4, +0xBBCF,0xE4B7,0xE47D,0xE4A3,0xBE52, 0, 0, 0, + 0, 0,0xBE5A,0xBE55,0xE8A4,0xE8A1,0xE867,0xBE50, + 0, 0, 0,0xBE4F,0xBE56, 0, 0, 0, +0xE865,0xBE54,0xE871,0xE863,0xE864,0xBE4E,0xE8A3,0xBE58, +0xE874,0xE879,0xE873,0xEBEE,0xE86F,0xE877,0xE875,0xE868, +0xE862,0xE87D,0xBE57,0xE87E, 0,0xE878, 0,0xE86D, +0xE86B,0xE866, 0, 0, 0,0xE86E,0xE87B,0xE86A, +0xE87A,0xE8A2, 0, 0,0xBE53, 0,0xE876,0xE87C, +0xE872,0xE86C,0xBE51, 0, 0, 0,0xE4A8,0xE870, +0xBE59,0xE869, 0, 0, 0, 0, 0,0xEBF4, +0xBFF7,0xEBF3,0xEBF0,0xEC44,0xBFFB, 0,0xEC41,0xEBF8, +0xEC43,0xEBE9,0xEBF6, 0,0xBFFD, 0,0xEBE1, 0, +0xEBDF,0xEC42, 0,0xEC40,0xEBFE,0xEBED,0xEBEC,0xEBE2, +0xC040, 0,0xEBE8,0xEBF2,0xEBFD,0xC043,0xEC45, 0, +0xC1E8,0xC045,0xBFFE,0xEBE6, 0,0xEBEF,0xEBDE,0xEBE0, +0xBFF5,0xC042,0xBFFA,0xEBE7,0xEBF7,0xEBF1,0xC041,0xEBDD, +0xC1E3,0xEBF9,0xEBFC,0xBFFC, 0,0xEBEB,0xC044,0xBFF9, + 0, 0, 0,0xBFF8,0xEBF5,0xEBFB,0xBFF6, 0, +0xEBE4,0xEBFA, 0, 0,0xEBE5, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xEBEA,0xEED2, + 0,0xEED7,0xC1E5,0xC1E7,0xEEDD,0xC1E1,0xEEEC,0xEEE3, +0xEED8,0xEED9,0xEEE2, 0,0xC1EE,0xEEE1,0xEED1,0xEEE0, +0xEED4,0xEEED,0xC1ED,0xC1EB,0xEED5, 0,0xEEE8, 0, +0xEEDA,0xEEE7, 0,0xEEE9,0xEED0,0xC1E6, 0,0xEEEA, + 0, 0,0xEEDE, 0,0xC1EA,0xEEDB, 0, 0, +0xC1EC,0xEEE4, 0, 0, 0,0xC1E4,0xEED6,0xEEE5, + 0,0xEEDF,0xEBE3,0xEEE6,0xEED3, 0,0xC1E9, 0, +0xEEEB, 0,0xC1E2,0xEECE, 0, 0, 0, 0, +0xF160,0xF159,0xC2E9, 0,0xF154,0xF163,0xF15B,0xEEDC, + 0,0xF165,0xF155, 0,0xC2E8,0xF15F,0xC2EA,0xC2F2, +0xC2F0,0xF161,0xC2F1,0xF157, 0,0xF158,0xF15D,0xF162, + 0,0xEECD,0xC2EB,0xF16A,0xF167,0xF16B,0xF15E,0xF15A, +0xF168,0xF36A,0xF15C, 0,0xC2EE, 0,0xC2ED,0xEECF, +0xC2EF,0xF164,0xF166,0xC2EC,0xF169,0xF153, 0,0xF156, + 0, 0, 0, 0, 0, 0, 0, 0, +0xF373, 0,0xF363,0xC3EB,0xF371, 0, 0,0xF361, +0xC3EC, 0,0xF36C, 0,0xF368,0xC3F1,0xF372,0xF362, +0xF365,0xC3E9,0xF374, 0,0xF36D,0xF370,0xC3EF,0xC3F4, +0xC3F2,0xF369,0xF364, 0,0xC3ED,0xC3EE,0xF360,0xC3EA, + 0,0xC3E8,0xC3F0,0xF36F,0xC3F3, 0,0xF36B,0xF375, +0xC3F5, 0, 0, 0,0xF367, 0,0xF36E, 0, + 0, 0, 0, 0, 0,0xF4F3,0xF542,0xF4F5, +0xF4FC,0xF366,0xF4FA,0xF4E9,0xF540,0xC4C3,0xF4ED,0xF4FE, +0xF4F4, 0, 0,0xC4C2, 0, 0,0xF544,0xF4F6, + 0,0xF4FB,0xF4FD,0xF4E7,0xF541,0xF4F2,0xF4F7,0xF4EB, +0xF4EF,0xF543,0xF4F9,0xF4E8,0xF4EC,0xF4EE,0xF4F8, 0, +0xC4C1,0xF4F1, 0, 0, 0, 0, 0, 0, +0xF4EA, 0, 0, 0, 0, 0, 0, 0, +0xF4F0,0xF661,0xF666,0xC54F,0xF668, 0,0xC549, 0, +0xF664,0xF66A,0xC54E,0xC54A, 0,0xC54B,0xF660,0xF667, +0xC54D,0xF665,0xC54C,0xF65F,0xF663,0xF662, 0,0xF65E, +0xF669, 0, 0, 0,0xC5B1,0xF76D,0xF770,0xF76C, +0xF76E,0xF76F,0xF769,0xF76A,0xF767, 0, 0,0xF76B, +0xF768,0xC5B2,0xC5B3, 0, 0,0xF84B, 0,0xF84D, + 0, 0, 0, 0, 0,0xF84C,0xF84E, 0, +0xC5E0, 0,0xF84A,0xC5DF,0xC5E1, 0, 0, 0, +0xF8CB,0xF8CC,0xC644,0xF8CA, 0,0xF953,0xF952,0xF954, +0xC65F,0xF955,0xC65E,0xF956,0xF972,0xF975,0xF974,0xC668, +0xF973, 0, 0, 0,0xC672,0xC670,0xC671,0xC677, +0xF9C0,0xF9C1,0xF9BF,0xF9C9}; + +/* page 8 0x9577-0x9FA4 */ +static uint16 tab_uni_big58[]={ +0xAAF8, 0, 0,0xD844,0xDC78,0xE8A5,0xF376, 0, + 0,0xAAF9, 0,0xADAC,0xB07B, 0, 0,0xD845, + 0,0xD846,0xB3AC, 0,0xB67D,0xDC7A,0xDC79,0xB6A3, +0xB67C,0xDC7B,0xB67E,0xB6A2,0xB6A1,0xB67B, 0, 0, + 0,0xB968, 0, 0,0xE0D0,0xE0CE, 0,0xE0CF, +0xE0CD, 0,0xBBD2, 0,0xBBD5,0xBBD7,0xBBD6, 0, + 0,0xBBD3,0xBBD4, 0,0xE8A7,0xE8A6,0xBE5B,0xE8A8, + 0,0xE8A9,0xBE5C, 0, 0, 0,0xEC4D,0xEC4B, +0xEEF3, 0,0xEC49,0xEC4A,0xC046,0xEC46,0xEC4E,0xEC48, +0xEC4C,0xEEEF, 0, 0,0xEEF1, 0,0xEEF2,0xC1F3, +0xEEEE,0xC1F2,0xEEF0,0xC1EF,0xC1F0,0xC1F1,0xEC47, 0, + 0,0xC2F5,0xF16E,0xF16C,0xF16D,0xC2F3,0xC2F6,0xC2F4, + 0, 0, 0,0xF377,0xF378,0xC3F6, 0,0xF545, +0xF547,0xF546,0xC4C4,0xC550,0xF66D,0xF66C,0xF66B, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xAAFA, 0,0xC9AA, + 0,0xCA58,0xA6E9,0xCA56,0xCA59,0xCA57, 0, 0, + 0,0xCBAE, 0,0xA8C1, 0,0xA8C2,0xCBB0,0xA8BF, +0xCBAF,0xCBAD,0xA8C0,0xA8BE, 0, 0, 0, 0, + 0, 0,0xCDD8,0xCDDB,0xAAFD,0xCDDA,0xCDD9, 0, +0xAAFC,0xAAFB, 0,0xAB40,0xCDDC,0xAAFE, 0, 0, + 0, 0, 0,0xD0C6,0xADAE,0xADAF,0xADB0,0xD0C7, +0xD0C3,0xADAD,0xD0C4, 0,0xD0C5,0xD0C2, 0, 0, + 0,0xB0A4, 0, 0,0xB0A1,0xD445,0xB0A2,0xB0A5, +0xD446, 0,0xB07E,0xB07C,0xB07D,0xB0A3, 0, 0, + 0, 0, 0,0xB3AD,0xD849,0xB3B5,0xD848, 0, +0xD84B,0xB3B1,0xD84A,0xB6AB,0xB3AF,0xB3B2,0xB3AE,0xB3B3, +0xB3B4,0xB3B0, 0, 0, 0,0xD847,0xB6A7,0xDC7D, + 0,0xDCA3, 0, 0,0xDCA2,0xB6AC,0xB6A8,0xB6A9, +0xDC7C,0xDC7E,0xDCA1,0xB6A4,0xB6A6, 0,0xB6AA,0xB6A5, + 0, 0,0xE0D3,0xE0D1,0xE0D2,0xB96A,0xB96B, 0, +0xE0D4,0xB969,0xBBD8, 0,0xBBDA,0xBBD9, 0,0xE4BB, + 0, 0,0xE4BC,0xE8AB, 0,0xE8AA, 0, 0, +0xC047,0xC048,0xEC4F,0xC049, 0,0xEEF6, 0,0xEEF4, + 0,0xEEF5,0xC1F4, 0,0xF16F,0xC3F7, 0, 0, + 0,0xC1F5,0xAB41, 0,0xB0A6,0xD447, 0, 0, +0xD84C,0xB3B6,0xB6AD,0xDCA4,0xDCA6,0xB6AF,0xB6AE,0xB6B0, +0xB6B1,0xDCA5,0xB96E,0xB96F,0xB96D,0xBBDB,0xB96C,0xE0D5, + 0, 0, 0,0xBBDC,0xE8AC,0xEC50,0xC04A,0xC1F6, +0xF170,0xF174,0xC2F9,0xF171,0xC2FA,0xC2F8,0xF175,0xC2FB, +0xF173, 0,0xF379,0xC2F7,0xC3F8, 0,0xF8CD, 0, + 0,0xAB42,0xB3B8,0xB3B7, 0, 0, 0, 0, +0xB6B2,0xDCA8,0xDCA7,0xB6B3, 0, 0,0xE0D9,0xB973, +0xB970,0xE0D8,0xB972,0xE0D6,0xB971, 0,0xE0D7, 0, +0xE4BD,0xBBDD, 0,0xE8AF, 0,0xBE5D,0xE8AD,0xBE5E, +0xBE5F,0xE8AE,0xBE60, 0,0xEC51, 0,0xC04E,0xC04B, +0xC050,0xEC53,0xC04C,0xEC52,0xC04F, 0, 0,0xC04D, + 0,0xEEF9,0xEEFB, 0, 0,0xC1F7,0xEEFA,0xC1F8, +0xEEF8,0xEEF7, 0,0xF177,0xF176,0xC2FC,0xF178,0xF37E, +0xC3FA,0xF37D,0xF37A,0xC3F9,0xF37B,0xF37C, 0,0xF548, +0xF549,0xC4C5, 0,0xC553, 0, 0,0xF66E, 0, + 0,0xC551,0xC552,0xF66F, 0, 0,0xC5B4,0xC5B5, +0xF771, 0, 0,0xC645,0xF8CF,0xC647, 0,0xF8CE, +0xF8D0,0xC646,0xF957, 0,0xF9AD, 0, 0, 0, + 0, 0, 0,0xAB43, 0, 0, 0,0xB974, + 0,0xE4BE, 0,0xE8B0,0xC051,0xC052, 0,0xAB44, + 0,0xBE61,0xC3FB,0xADB1, 0, 0, 0,0xC053, + 0,0xC5E2,0xADB2,0xD84D, 0,0xDCA9, 0,0xDCAB, + 0,0xDCAA, 0,0xE0DD,0xE0DA,0xB975, 0,0xB976, +0xE0DB,0xE0DC, 0,0xE4C0,0xE4C5,0xBBDE,0xE4BF,0xE4C1, +0xE4C8,0xE4C3,0xE4C7,0xE4C4,0xE4C2,0xE4C6,0xBBDF, 0, + 0,0xE8B3, 0,0xE8B1,0xBE63, 0,0xBE62,0xE8B2, +0xBE64, 0, 0, 0, 0,0xEC56, 0, 0, +0xEC55,0xC054,0xEC54,0xEEFC, 0,0xEEFE,0xEF41,0xEF40, + 0,0xC1F9,0xEEFD,0xF1A1,0xC2FD,0xF17D,0xF1A2,0xC2FE, + 0,0xF17B, 0,0xF17E,0xF17C,0xF179,0xC340,0xF17A, + 0, 0, 0, 0,0xF3A1, 0, 0,0xF3A3, +0xF3A2, 0,0xF54A, 0,0xF54B, 0, 0, 0, +0xF670, 0,0xC5B7, 0,0xC5B6,0xF84F,0xF850,0xC648, +0xF8D1, 0,0xC669, 0,0xADB3,0xB6B4,0xE4CA,0xE4C9, +0xE8B5,0xE8B4, 0, 0,0xC1FA,0xEF43,0xEF42,0xF1A5, +0xF1A3,0xF1A6,0xF1A4, 0, 0,0xC3FC,0xF3A4,0xF3A5, +0xF3A6, 0,0xF671, 0,0xF772, 0,0xF8D2, 0, + 0, 0, 0, 0, 0, 0,0xADB4, 0, + 0,0xEC57,0xEF44, 0,0xADB5, 0, 0,0xBBE0, + 0,0xEC58,0xC341,0xF1A7,0xC3FD, 0,0xF54C,0xF54D, +0xC554,0xF851,0xADB6,0xB3BB,0xB3BC,0xD84E,0xB6B5,0xB6B6, +0xDCAC,0xB6B7, 0,0xB97A, 0,0xB97C,0xE0DF,0xE0E0, +0xE0DE,0xB977,0xB978,0xB97B,0xB979, 0, 0,0xE4CB, +0xBBE1,0xBBE2, 0, 0,0xE8BC,0xBE67,0xE8B7,0xE8B6, + 0,0xE8BB,0xBE65, 0, 0,0xC05B, 0,0xE8B8, +0xE8BD,0xE8BA,0xE8B9, 0,0xBE66, 0,0xC059, 0, +0xEC5A,0xC055, 0,0xEC5B, 0, 0,0xEC59, 0, +0xC058,0xC056,0xC05A, 0,0xC057, 0, 0, 0, + 0, 0,0xEF45, 0,0xEF4A,0xEF46,0xEF49,0xC1FB, + 0,0xEDD4,0xEF48,0xEF47, 0,0xC344,0xC342,0xC345, +0xC343,0xF1A8,0xF1A9,0xF1AA,0xC346, 0, 0, 0, +0xF3AA,0xC440,0xF3A8, 0,0xC441,0xF3A7,0xF3A9,0xC3FE, +0xF551,0xF54E, 0,0xF54F,0xF550,0xF672,0xC556, 0, +0xC555, 0,0xF774,0xF773,0xC5B8, 0, 0, 0, +0xC5E3,0xC649,0xC660,0xF958,0xF9AE,0xF9AF, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xADB7,0xDCAD, 0, 0,0xE0E1,0xE4CC,0xE4CD, +0xBBE3, 0,0xBBE4,0xE8BE,0xBE68, 0, 0,0xC1FC, + 0,0xF1AB, 0,0xC347,0xF3AD,0xC442,0xF3AC,0xF3AE, +0xF3AB,0xF675,0xF552,0xF553, 0,0xC4C6, 0,0xF674, + 0, 0,0xF673, 0,0xF775,0xF9B0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xADB8, 0, 0, 0, +0xADB9, 0, 0,0xB0A7,0xD448, 0,0xD84F, 0, +0xB6B8, 0,0xB6BB,0xB6B9,0xDCAE, 0,0xB6BD, 0, +0xB6BA, 0, 0,0xB6BC, 0,0xB97E, 0,0xE0E2, + 0, 0,0xE0E3,0xE8C0, 0,0xB97D,0xB9A1,0xB9A2, + 0,0xE4CF, 0,0xE4CE,0xBBE5, 0,0xBBE6, 0, +0xE4D0,0xE8BF,0xBBE8,0xBE69, 0,0xBBE7, 0, 0, + 0,0xC05C,0xE8C1,0xBE6B,0xBE6A,0xE8C2,0xE8C5,0xE8C3, +0xE8C4,0xBE6C, 0,0xC061,0xC05F, 0, 0,0xC05E, +0xEC5D, 0,0xC060, 0, 0,0xEC5C,0xEF4B, 0, +0xEC5E,0xC05D,0xEC5F,0xEF4E,0xEF4C,0xEF4D,0xEF52,0xC34B, +0xEF51,0xEF54,0xEF53,0xEF50,0xEF4F, 0,0xC1FD, 0, + 0, 0, 0,0xF1AE, 0,0xF1AD,0xC34A,0xC348, +0xC349, 0,0xF1AC, 0,0xF3B1, 0,0xC443, 0, +0xF3B0,0xF3AF,0xC444, 0,0xF558,0xF557, 0,0xF555, + 0,0xF554,0xC4C8,0xC4C7,0xF559,0xF776,0xC5B9,0xF677, +0xC557,0xF676,0xF556, 0,0xF777,0xC5E4, 0,0xC661, +0xF959, 0,0xF9B1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xADBA, +0xD850,0xEF55,0xADBB, 0, 0,0xE4D2,0xE4D1,0xEC60, + 0, 0,0xEF57, 0,0xEF56, 0,0xC34C,0xF3B2, +0xF3B3,0xC4C9, 0, 0,0xF9B2,0xB0A8,0xB6BF,0xB6BE, +0xE0E4,0xE0E6,0xB9A4,0xE0E5,0xB9A3,0xB9A5,0xE0E7, 0, + 0, 0,0xE4D4,0xE4D6,0xE4D5, 0,0xE4D8, 0, + 0, 0,0xBBE9,0xE4D7,0xE4D3, 0, 0, 0, +0xE4D9, 0,0xE8CC, 0,0xE8CF,0xE8D1,0xE8C7,0xE8CB, +0xE8C8,0xBE6E,0xBE71,0xBE73,0xE8C9,0xE8CA,0xBE72,0xE8CD, +0xE8D0,0xE8CE,0xBE74, 0,0xBE70,0xE8C6,0xBE6D, 0, +0xBE6F, 0, 0,0xC063,0xEC66,0xEC64,0xEC63, 0, +0xEC69, 0,0xEC68,0xEC67, 0,0xEC62,0xC062,0xEC61, + 0,0xEC65,0xC064, 0, 0,0xEF5A, 0,0xEF5E, +0xEF5B,0xEF5D,0xEF5C,0xEF59,0xEF5F,0xEF62,0xEF60,0xEF61, +0xC240, 0,0xC1FE,0xEF58,0xEF63,0xF1B3,0xF1B6,0xF1B8, +0xF1B7, 0,0xF1B1,0xF1B5,0xF1B0, 0,0xF1B2,0xC34D, +0xF1AF, 0,0xF1B4, 0, 0,0xF3C0,0xF3B5,0xC445, + 0, 0,0xC446,0xF3B4,0xF3B9,0xF3BF,0xF3B7,0xF3BE, + 0,0xF3BB, 0,0xF3BA,0xF3BD,0xF3B8,0xF3B6, 0, +0xF3BC, 0,0xF560,0xF55E,0xC4CA,0xF55D,0xF563,0xF561, + 0,0xC4CB,0xF55C,0xF55A, 0,0xF55B,0xC4CD,0xF55F, +0xC4CC,0xF562,0xF678,0xF67E, 0, 0,0xF679,0xC55B, +0xF6A1,0xC55A,0xF67D,0xF67C,0xC559,0xF67B,0xC558,0xF67A, + 0,0xF77D,0xF7A1,0xF77E, 0,0xF77B,0xC5BB,0xF778, +0xF77C,0xF7A3, 0,0xF7A2,0xF779,0xF77A,0xC5BA,0xF852, +0xC5E7, 0,0xF853,0xC5E5,0xC5E6, 0, 0,0xF8D3, +0xC64A,0xF976, 0,0xC66A, 0,0xF9B3,0xC66B,0xF9B4, +0xF9B5,0xF9C3,0xF9C2,0xC67A,0xF9CD, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xB0A9, 0, 0,0xE0E9, 0,0xE0E8, 0, +0xBBEA,0xBBEB,0xE4DA, 0,0xE8D2,0xEC6C, 0, 0, +0xBE75,0xC065,0xEC6A, 0,0xEC6D,0xC066, 0,0xEF64, +0xEC6B,0xF1B9,0xC34E,0xF3C1, 0, 0, 0,0xF566, +0xF564, 0, 0,0xF565, 0, 0,0xF6A2, 0, +0xC55C,0xF7A4,0xC5EA,0xC5BC,0xC5E8,0xC5E9,0xF8D4,0xC662, + 0,0xB0AA, 0, 0, 0,0xF1BA, 0, 0, +0xD449, 0,0xB9A6, 0,0xE4DB, 0, 0,0xBBEC, +0xE4DC, 0, 0, 0,0xE8D4,0xE8D3,0xC068,0xBE76, +0xBE77, 0,0xE8D7,0xE8D6,0xE8D5, 0, 0,0xEC6E, +0xEC71, 0,0xEC70,0xEC6F,0xC067,0xEF68,0xEF66,0xEF65, + 0, 0,0xEF67, 0,0xC34F,0xF1BC,0xF1BD,0xC350, + 0,0xF1BB, 0,0xF3C3,0xF3C2,0xF3C5,0xC447,0xF3C4, + 0,0xF567,0xF569,0xF568, 0, 0,0xF6A3,0xF6A6, +0xF6A4,0xF6A5,0xF7A5,0xC5BD, 0, 0, 0,0xF854, +0xF855,0xF856, 0,0xC64B,0xC663,0xF9B6,0xB0AB, 0, +0xBE78,0xC069,0xF1BE, 0,0xF7A6, 0, 0,0xF9C4, +0xD44A, 0,0xC67B,0xB0AC,0xEC72, 0,0xF1BF, 0, +0xF3C6, 0, 0,0xF6A7,0xF7A7,0xB0AD, 0,0xE4DD, +0xE4DE, 0,0xBBED,0xBBEE,0xE8D9,0xBE7A,0xBE79,0xE8D8, + 0,0xEF69, 0,0xF1C0,0xF1C2,0xF1C1,0xC353,0xC352, +0xC351, 0,0xC55E,0xF6A8, 0,0xC55D,0xF7A9,0xF7A8, + 0,0xC64C,0xF8D5,0xB3BD,0xE0EA, 0, 0, 0, +0xE4E1,0xE4DF,0xE4E0, 0, 0,0xE8E2, 0,0xE8DD, +0xE8DA,0xE8E1, 0, 0, 0,0xE8E3, 0, 0, +0xBE7C,0xE8E0,0xE8DC, 0, 0,0xE8DB,0xE8DF,0xE8DE, +0xBE7B, 0, 0,0xEC7D,0xEC78,0xEC76,0xECA1,0xEC77, + 0,0xEC73, 0,0xEC79, 0, 0,0xEC74,0xEF72, +0xEC75,0xECA2, 0, 0, 0, 0, 0, 0, + 0,0xEC7C,0xC06A,0xEC7B,0xEC7A, 0,0xEC7E, 0, + 0, 0, 0,0xEF6A,0xEF6D, 0, 0,0xEF6C, + 0,0xEF74,0xEF6F,0xEF73, 0,0xEF71,0xEF70,0xEF6E, + 0,0xEF6B, 0,0xC243,0xC242, 0,0xC244,0xC241, +0xEF75, 0, 0, 0, 0, 0,0xF1C8,0xF1CB, + 0,0xF1C9,0xF1CD, 0, 0, 0,0xF1CE, 0, +0xF1C6,0xC358,0xF1C7, 0,0xF1C5,0xF1CC, 0,0xF1C4, +0xF1C3,0xC357,0xC355,0xC354, 0, 0, 0, 0, + 0, 0, 0, 0,0xF1CA,0xF3CF,0xF3D5,0xC44A, +0xF3D0, 0,0xF3D3,0xF3D7,0xC44B,0xF3D2, 0,0xF3CA, + 0,0xF3C9,0xF3D6,0xF3CD, 0,0xF3CB,0xF3D4,0xF3CC, +0xC449,0xC448, 0,0xF3C7,0xF3C8,0xF3D1, 0, 0, + 0,0xF3CE, 0, 0, 0, 0, 0, 0, +0xF56C,0xF56F, 0, 0, 0, 0,0xC356, 0, + 0, 0, 0, 0, 0, 0,0xF56D,0xF573, +0xF571,0xF56B,0xF576, 0,0xF56A, 0,0xC4CF,0xF572, + 0, 0, 0,0xF56E,0xC4CE,0xF575, 0, 0, +0xF574, 0, 0, 0, 0,0xF6AB,0xF6AA, 0, + 0, 0,0xF6B1, 0,0xF6AD,0xF6B0,0xC560, 0, + 0,0xF6AE,0xF6AF, 0,0xF6A9,0xF6AC,0xC55F, 0, + 0, 0,0xC5BF,0xF7B4,0xF7AF,0xF7B3, 0,0xF7B6, +0xF7B2, 0,0xF7AE, 0,0xC5C1,0xF7B1,0xF7B5,0xC5C0, +0xF7AC,0xF570,0xF7B0, 0, 0,0xF7AD, 0,0xF7AA, + 0,0xF7AB,0xC5BE,0xF85A,0xF85C,0xF85F,0xF85B,0xF860, + 0,0xF859, 0,0xF857, 0,0xC5EB,0xF85D,0xC5ED, +0xC5EC,0xF858,0xF85E, 0, 0, 0, 0,0xF8DA, +0xC64D,0xF8DB, 0,0xF8D9,0xF8D6, 0, 0,0xF8D8, +0xF8D7,0xF95A, 0, 0, 0, 0,0xF95C,0xF95B, + 0, 0,0xF979, 0,0xF978,0xF977,0xF97A, 0, +0xC673,0xC674,0xF9CA,0xF9CE, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xB3BE,0xDCAF, +0xE0ED, 0,0xB9A7,0xE0EB, 0, 0,0xE0EC, 0, + 0, 0,0xE4E2,0xE4E3,0xBBF1,0xBBEF,0xE4E4,0xBBF0, +0xE8E8, 0,0xE8EB,0xE8E5,0xE8EC,0xE8E4,0xE8E6, 0, +0xE8E7,0xE8EA, 0, 0,0xBEA1,0xE8EF,0xE8EE,0xBE7D, +0xE8E9,0xE8ED,0xBE7E, 0, 0, 0, 0, 0, + 0,0xECAC, 0,0xC06F, 0,0xECA7,0xC06B, 0, +0xECA4,0xECAA,0xECAD, 0,0xC070, 0,0xECA9,0xECA6, +0xECAE,0xECA5, 0,0xECAB,0xC06C, 0,0xECA3,0xC06D, + 0,0xC06E,0xECA8, 0, 0, 0,0xEFA9,0xEF7A, +0xEF7B,0xEF7E,0xEF7C, 0,0xEF76, 0, 0,0xEF79, +0xEFA5,0xEF7D, 0, 0,0xC245, 0,0xEFA7,0xEFA4, +0xC246,0xEFA6,0xEF77,0xEFA2,0xEFA3, 0,0xEFA1, 0, + 0, 0, 0,0xF1D2,0xF1D4,0xF1D7, 0, 0, +0xF1D1, 0,0xC359,0xF1D9,0xF1D0,0xF1DA, 0,0xF1D6, +0xF1D8,0xF1DC,0xF1D5,0xF1DD,0xF1D3,0xF1CF,0xC35A, 0, +0xF1DB,0xC35B,0xC44D, 0, 0, 0, 0, 0, +0xEF78,0xF3F1,0xF3E8,0xC44F,0xF3E4,0xC450, 0, 0, +0xF3ED,0xF3E7,0xF3DD,0xC44E,0xF3EA,0xF3E5,0xF3E6, 0, +0xF3D8,0xF3DF,0xF3EE, 0,0xF3EB, 0,0xF3E3, 0, +0xF3EF,0xF3DE,0xF3D9,0xF3EC, 0,0xF3DB,0xF3E9,0xF3E0, +0xF3F0,0xF3DC,0xC44C,0xF3DA,0xF3E1,0xF3E2, 0, 0, + 0,0xF57D, 0,0xF57B, 0,0xF5A2, 0,0xF5AE, +0xF5A5,0xF57C,0xF578,0xF5A7,0xF57E,0xF5A3,0xF57A,0xF5AA, +0xF577,0xF5A1,0xF5A6,0xF5A8,0xF5AB,0xF579, 0,0xF5AF, +0xF5B0,0xF5A9,0xF5AD,0xF5A4, 0,0xF6C1,0xF6C4, 0, +0xC561, 0,0xF6C3,0xF6C8,0xF6C6,0xC562,0xF6BD,0xF6B3, +0xF6B2,0xC564,0xF6BF,0xF6C0,0xF6BC,0xF6B4, 0,0xF6B9, +0xF5AC, 0,0xF6B5,0xC563,0xF6BB, 0,0xF6BA, 0, +0xF6B6,0xF6C2, 0,0xF6B7,0xF7BB,0xF6C5,0xF6C7,0xF6BE, +0xF6B8,0xF7BC,0xF7BE,0xF7B8,0xC5C2, 0,0xF7C5,0xF7C3, +0xC5C3,0xF7C2,0xF7C1,0xF7BA,0xF7B7,0xF7BD,0xF7C6,0xF7B9, +0xF7BF, 0,0xF869,0xF86E,0xF864,0xF867,0xC5EE,0xF86B, + 0,0xF872,0xF7C0, 0,0xF865,0xF86F,0xF873,0xF86A, +0xF863,0xF86D, 0,0xF86C,0xF871,0xF870,0xF7C4,0xF868, +0xF862,0xF866,0xC64E,0xC64F,0xF861, 0,0xF8E6,0xF8DD, +0xF8E5,0xF8E2,0xF8E3,0xF8DC,0xF8DF,0xF8E7,0xF8E1,0xF8E0, +0xF8DE, 0,0xF8E4, 0,0xF95D, 0,0xF95E, 0, +0xF960,0xF95F,0xF962,0xF961,0xF97C,0xF97B,0xF9B7, 0, +0xF9B8, 0,0xF9C5,0xC678,0xC67C, 0,0xF9CF,0xC67D, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xB3BF, 0, + 0, 0,0xC4D0,0xF6C9, 0,0xC650,0xC651, 0, +0xB3C0,0xE0EE, 0,0xB9A8,0xE8F0, 0, 0,0xECB0, +0xECB1,0xECAF,0xEFAB,0xEFAA,0xC247,0xF1DF,0xEFAC,0xF1DE, + 0, 0,0xF3F3,0xC451,0xC453,0xF3F2, 0, 0, +0xC452, 0,0xF5B1,0xF5B3,0xF5B2,0xF6CA,0xC565, 0, +0xC5EF,0xF8E8,0xF963, 0, 0,0xF9D2,0xB3C1, 0, +0xE4E5, 0,0xBEA2, 0, 0, 0,0xECB3,0xECB2, + 0,0xEFAD, 0, 0, 0,0xC454,0xC4D1,0xF7C7, +0xF9CB, 0, 0, 0,0xB3C2,0xBBF2, 0,0xBEA3, + 0,0xF3F4, 0,0xF874,0xB6C0, 0, 0, 0, + 0,0xEFAE, 0, 0, 0,0xC664,0xB6C1,0xBEA4, +0xC248,0xF875,0xB6C2, 0,0xE8F1,0xC072,0xECB4,0xECB5, + 0,0xC071, 0,0xEFAF,0xC24C,0xC24A,0xC24B,0xC249, +0xF1E0,0xC35C, 0, 0, 0,0xF5B5,0xF5B4,0xF5B7, +0xF5B6,0xC4D2, 0, 0,0xF6CB, 0,0xF6CD,0xF6CC, +0xC566,0xF7C8, 0,0xF876,0xF877,0xC5F0,0xF964,0xF97D, +0xC675, 0,0xDCB0,0xECB6,0xEFB0,0xF3F5,0xE0EF, 0, +0xEFB1,0xF1E2,0xF1E1, 0, 0, 0, 0,0xF878, +0xC652, 0,0xF965,0xF97E, 0, 0, 0,0xB9A9, +0xE8F2,0xE8F3, 0,0xECB7,0xB9AA, 0,0xC35D,0xF1E3, + 0,0xF6CF,0xC567,0xF6D0,0xF6CE,0xF879, 0,0xF8E9, + 0,0xB9AB, 0,0xEFB4,0xEFB3,0xEFB2,0xF1E4, 0, + 0,0xF1E8,0xF1E7,0xF1E6,0xF1E5,0xC35E,0xF3F6,0xF5B9, +0xC4D3,0xF5B8,0xF6D1,0xF7CB,0xF7CA,0xC5C4,0xF7C9,0xF87C, +0xF87B,0xF87A, 0, 0,0xBBF3, 0,0xECB8,0xC24D, + 0,0xF3F7,0xF3F8,0xF7CC,0xF87D, 0, 0,0xF8EA, +0xF966,0xF9B9,0xF9D4,0xBBF4,0xC24E,0xF1E9,0xF3F9,0xF6D2, +0xF87E, 0, 0,0xBEA6, 0,0xEFB5,0xF1EA,0xF3FA, +0xF3FB,0xF3FC,0xF5BE, 0,0xF5BA,0xC568,0xF5BD,0xF5BC, +0xC4D4,0xF5BB,0xC4D6, 0,0xC4D5,0xF6D4,0xF6D3,0xC569, +0xC56A, 0, 0,0xC5C6,0xF7CD,0xC5C5, 0,0xF8A3, +0xF8A4,0xF8A2,0xF8A1,0xC654, 0,0xF8EB,0xF8EC,0xF8ED, +0xC653,0xF967,0xF96A,0xF969,0xF968, 0, 0,0xF9D3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xC073, 0, + 0,0xC365,0xF5BF,0xF6D5, 0,0xC5C7,0xF7CE, 0, + 0,0xF9D5, 0, 0, 0,0xC074, 0, 0, + 0,0xEFB6, 0,0xF7CF, 0,0xF9A1}; + +/* page 9 0xFA0C-0xFA0D */ +static uint16 tab_uni_big59[]={ +0xC94A,0xDDFC}; + +/* page 10 0xFE30-0xFFFD */ +static uint16 tab_uni_big510[]={ +0xA14A,0xA157, 0,0xA159,0xA15B,0xA15F,0xA160,0xA163, +0xA164,0xA167,0xA168,0xA16B,0xA16C,0xA16F,0xA170,0xA173, +0xA174,0xA177,0xA178,0xA17B,0xA17C, 0, 0, 0, + 0,0xA1C6,0xA1C7,0xA1CA,0xA1CB,0xA1C8,0xA1C9,0xA15C, +0xA14D, 0,0xA14F, 0,0xA151,0xA152,0xA153,0xA154, + 0,0xA17D,0xA17E,0xA1A1,0xA1A2,0xA1A3,0xA1A4,0xA1CC, +0xA1CD,0xA1CE,0xA1DE,0xA1DF,0xA1E0,0xA1E1,0xA1E2, 0, + 0,0xA24C,0xA24D,0xA24E, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xA149, 0,0xA1AD,0xA243,0xA248,0xA1AE, 0, +0xA15D,0xA15E,0xA1AF,0xA1CF,0xA141,0xA1D0,0xA144,0xA241, +0xA2AF,0xA2B0,0xA2B1,0xA2B2,0xA2B3,0xA2B4,0xA2B5,0xA2B6, +0xA2B7,0xA2B8,0xA147,0xA146,0xA1D5,0xA1D7,0xA1D6,0xA148, +0xA249,0xA2CF,0xA2D0,0xA2D1,0xA2D2,0xA2D3,0xA2D4,0xA2D5, +0xA2D6,0xA2D7,0xA2D8,0xA2D9,0xA2DA,0xA2DB,0xA2DC,0xA2DD, +0xA2DE,0xA2DF,0xA2E0,0xA2E1,0xA2E2,0xA2E3,0xA2E4,0xA2E5, +0xA2E6,0xA2E7,0xA2E8, 0,0xA242, 0, 0,0xA1C4, + 0,0xA2E9,0xA2EA,0xA2EB,0xA2EC,0xA2ED,0xA2EE,0xA2EF, +0xA2F0,0xA2F1,0xA2F2,0xA2F3,0xA2F4,0xA2F5,0xA2F6,0xA2F7, +0xA2F8,0xA2F9,0xA2FA,0xA2FB,0xA2FC,0xA2FD,0xA2FE,0xA340, +0xA341,0xA342,0xA343,0xA161,0xA155,0xA162, 0, 0, + 0, 0, 0, 0,0xA14E, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xA2CE}; + +static int func_uni_big5_onechar(int code){ + if ((code>=0x00A2)&&(code<=0x00F7)) + return(tab_uni_big50[code-0x00A2]); + if ((code>=0x02C7)&&(code<=0x0451)) + return(tab_uni_big51[code-0x02C7]); + if ((code>=0x2013)&&(code<=0x22BF)) + return(tab_uni_big52[code-0x2013]); + if ((code>=0x2460)&&(code<=0x2642)) + return(tab_uni_big53[code-0x2460]); + if ((code>=0x3000)&&(code<=0x3129)) + return(tab_uni_big54[code-0x3000]); + if ((code>=0x32A3)&&(code<=0x32A3)) + return(tab_uni_big55[code-0x32A3]); + if ((code>=0x338E)&&(code<=0x33D5)) + return(tab_uni_big56[code-0x338E]); + if ((code>=0x4E00)&&(code<=0x9483)) + return(tab_uni_big57[code-0x4E00]); + if ((code>=0x9577)&&(code<=0x9FA4)) + return(tab_uni_big58[code-0x9577]); + if ((code>=0xFA0C)&&(code<=0xFA0D)) + return(tab_uni_big59[code-0xFA0C]); + if ((code>=0xFE30)&&(code<=0xFFFD)) + return(tab_uni_big510[code-0xFE30]); + return(0); +} + + +int +my_wc_mb_big5(CHARSET_INFO *cs __attribute__((unused)), + my_wc_t wc, unsigned char *s, unsigned char *e) +{ + + int code; + + if(wc<0x80) + { + s[0]=wc; + return 1; + } + + if(!(code=func_uni_big5_onechar(wc))) + return MY_CS_ILUNI; + + if(s+2>e) + return MY_CS_TOOSMALL; + + s[0]=code>>8; + s[1]=code&0xFF; + + return 2; +} + +int +my_mb_wc_big5(CHARSET_INFO *cs __attribute__((unused)), + my_wc_t *pwc,const uchar *s,const uchar *e) +{ + + int hi=s[0]; + + if(hi<0x80) + { + pwc[0]=hi; + return 1; + } + + if(s+2>e) + return MY_CS_TOOFEW(0); + + if(!(pwc[0]=func_big5_uni_onechar((hi<<8)+s[1]))) + return MY_CS_ILSEQ; + + return 2; +} + + #endif diff --git a/strings/ctype.c b/strings/ctype.c index 5972dfdeafa..d3c8ccdf9b9 100644 --- a/strings/ctype.c +++ b/strings/ctype.c @@ -2848,8 +2848,8 @@ CHARSET_INFO compiled_charsets[] = { ismbchar_big5, ismbhead_big5, mbcharlen_big5, - NULL, /* mb_wc */ - NULL, /* wc_mb */ + my_mb_wc_big5, /* mb_wc */ + my_wc_mb_big5, /* wc_mb */ my_caseup_str_mb, my_casedn_str_mb, my_caseup_mb, -- cgit v1.2.1 From f7eb69d6abe870e4db5cd5edfbd59c01a5373d43 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 29 Mar 2002 20:23:29 +0400 Subject: EUC-JP conversion routines --- strings/ctype-ujis.c | 8224 ++++++++++++++++++++++++++++++++++++++++++++++++++ strings/ctype.c | 52 +- 2 files changed, 8250 insertions(+), 26 deletions(-) diff --git a/strings/ctype-ujis.c b/strings/ctype-ujis.c index fb8804c2253..37edec4a2e5 100644 --- a/strings/ctype-ujis.c +++ b/strings/ctype-ujis.c @@ -203,4 +203,8228 @@ int mbcharlen_ujis(CHARSET_INFO *cs __attribute__((unused)),uint c) return (isujis(c)? 2: isujis_ss2(c)? 2: isujis_ss3(c)? 3: 0); } + +static uint16 tab_jisx0201_uni[256]={ + 0,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, +0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, +0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, +0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, +0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, +0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, +0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, +0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, +0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, +0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, +0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, +0x0058,0x0059,0x005A,0x005B,0x00A5,0x005D,0x005E,0x005F, +0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, +0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, +0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, +0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x203E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xFF61,0xFF62,0xFF63,0xFF64,0xFF65,0xFF66,0xFF67, +0xFF68,0xFF69,0xFF6A,0xFF6B,0xFF6C,0xFF6D,0xFF6E,0xFF6F, +0xFF70,0xFF71,0xFF72,0xFF73,0xFF74,0xFF75,0xFF76,0xFF77, +0xFF78,0xFF79,0xFF7A,0xFF7B,0xFF7C,0xFF7D,0xFF7E,0xFF7F, +0xFF80,0xFF81,0xFF82,0xFF83,0xFF84,0xFF85,0xFF86,0xFF87, +0xFF88,0xFF89,0xFF8A,0xFF8B,0xFF8C,0xFF8D,0xFF8E,0xFF8F, +0xFF90,0xFF91,0xFF92,0xFF93,0xFF94,0xFF95,0xFF96,0xFF97, +0xFF98,0xFF99,0xFF9A,0xFF9B,0xFF9C,0xFF9D,0xFF9E,0xFF9F, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + + +static int +my_mb_wc_jisx0201(CHARSET_INFO *cs __attribute__((unused)), + my_wc_t *wc,const uchar *s, + const uchar *e __attribute__((unused))) +{ + wc[0]=tab_jisx0201_uni[*s]; + return (!wc[0] && s[0]) ? MY_CS_ILSEQ : 1; +} + + +static int +my_wc_mb_jisx0201(CHARSET_INFO *cs __attribute__((unused)), + my_wc_t wc, uchar *s, + uchar *e __attribute__((unused))) +{ + + if (wc <= 0x7D) + { + *s = wc; + return (wc == 0x5C) ? MY_CS_ILUNI : 1; + } + + if (wc >= 0xFF61 && wc <= 0xFF9F) + { + *s = (wc - 0xFEC0); + return 1; + } + + if (wc==0x00A5) + { + *s = 0x5C; + return 1; + } + + if (wc==0x203E) + { + *s = 0x7E; + return 1; + } + + return MY_CS_ILUNI; +} + + +/* page 0 0x2121-0x217E */ +static uint16 tab_jisx0208_uni0[]={ +0x3000,0x3001,0x3002,0xFF0C,0xFF0E,0x30FB,0xFF1A,0xFF1B, +0xFF1F,0xFF01,0x309B,0x309C,0x00B4,0xFF40,0x00A8,0xFF3E, +0xFFE3,0xFF3F,0x30FD,0x30FE,0x309D,0x309E,0x3003,0x4EDD, +0x3005,0x3006,0x3007,0x30FC,0x2015,0x2010,0xFF0F,0x005C, +0x301C,0x2016,0xFF5C,0x2026,0x2025,0x2018,0x2019,0x201C, +0x201D,0xFF08,0xFF09,0x3014,0x3015,0xFF3B,0xFF3D,0xFF5B, +0xFF5D,0x3008,0x3009,0x300A,0x300B,0x300C,0x300D,0x300E, +0x300F,0x3010,0x3011,0xFF0B,0x2212,0x00B1,0x00D7,0x00F7, +0xFF1D,0x2260,0xFF1C,0xFF1E,0x2266,0x2267,0x221E,0x2234, +0x2642,0x2640,0x00B0,0x2032,0x2033,0x2103,0xFFE5,0xFF04, +0x00A2,0x00A3,0xFF05,0xFF03,0xFF06,0xFF0A,0xFF20,0x00A7, +0x2606,0x2605,0x25CB,0x25CF,0x25CE,0x25C7}; + +/* page 1 0x2221-0x227E */ +static uint16 tab_jisx0208_uni1[]={ +0x25C6,0x25A1,0x25A0,0x25B3,0x25B2,0x25BD,0x25BC,0x203B, +0x3012,0x2192,0x2190,0x2191,0x2193,0x3013, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x2208,0x220B,0x2286,0x2287,0x2282,0x2283,0x222A, +0x2229, 0, 0, 0, 0, 0, 0, 0, + 0,0x2227,0x2228,0x00AC,0x21D2,0x21D4,0x2200,0x2203, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x2220,0x22A5,0x2312,0x2202,0x2207, +0x2261,0x2252,0x226A,0x226B,0x221A,0x223D,0x221D,0x2235, +0x222B,0x222C, 0, 0, 0, 0, 0, 0, + 0,0x212B,0x2030,0x266F,0x266D,0x266A,0x2020,0x2021, +0x00B6, 0, 0, 0, 0,0x25EF}; + +/* page 2 0x2330-0x237A */ +static uint16 tab_jisx0208_uni2[]={ +0xFF10,0xFF11,0xFF12,0xFF13,0xFF14,0xFF15,0xFF16,0xFF17, +0xFF18,0xFF19, 0, 0, 0, 0, 0, 0, + 0,0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27, +0xFF28,0xFF29,0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F, +0xFF30,0xFF31,0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37, +0xFF38,0xFF39,0xFF3A, 0, 0, 0, 0, 0, + 0,0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47, +0xFF48,0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F, +0xFF50,0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,0xFF56,0xFF57, +0xFF58,0xFF59,0xFF5A}; + +/* page 3 0x2421-0x2473 */ +static uint16 tab_jisx0208_uni3[]={ +0x3041,0x3042,0x3043,0x3044,0x3045,0x3046,0x3047,0x3048, +0x3049,0x304A,0x304B,0x304C,0x304D,0x304E,0x304F,0x3050, +0x3051,0x3052,0x3053,0x3054,0x3055,0x3056,0x3057,0x3058, +0x3059,0x305A,0x305B,0x305C,0x305D,0x305E,0x305F,0x3060, +0x3061,0x3062,0x3063,0x3064,0x3065,0x3066,0x3067,0x3068, +0x3069,0x306A,0x306B,0x306C,0x306D,0x306E,0x306F,0x3070, +0x3071,0x3072,0x3073,0x3074,0x3075,0x3076,0x3077,0x3078, +0x3079,0x307A,0x307B,0x307C,0x307D,0x307E,0x307F,0x3080, +0x3081,0x3082,0x3083,0x3084,0x3085,0x3086,0x3087,0x3088, +0x3089,0x308A,0x308B,0x308C,0x308D,0x308E,0x308F,0x3090, +0x3091,0x3092,0x3093}; + +/* page 4 0x2521-0x2576 */ +static uint16 tab_jisx0208_uni4[]={ +0x30A1,0x30A2,0x30A3,0x30A4,0x30A5,0x30A6,0x30A7,0x30A8, +0x30A9,0x30AA,0x30AB,0x30AC,0x30AD,0x30AE,0x30AF,0x30B0, +0x30B1,0x30B2,0x30B3,0x30B4,0x30B5,0x30B6,0x30B7,0x30B8, +0x30B9,0x30BA,0x30BB,0x30BC,0x30BD,0x30BE,0x30BF,0x30C0, +0x30C1,0x30C2,0x30C3,0x30C4,0x30C5,0x30C6,0x30C7,0x30C8, +0x30C9,0x30CA,0x30CB,0x30CC,0x30CD,0x30CE,0x30CF,0x30D0, +0x30D1,0x30D2,0x30D3,0x30D4,0x30D5,0x30D6,0x30D7,0x30D8, +0x30D9,0x30DA,0x30DB,0x30DC,0x30DD,0x30DE,0x30DF,0x30E0, +0x30E1,0x30E2,0x30E3,0x30E4,0x30E5,0x30E6,0x30E7,0x30E8, +0x30E9,0x30EA,0x30EB,0x30EC,0x30ED,0x30EE,0x30EF,0x30F0, +0x30F1,0x30F2,0x30F3,0x30F4,0x30F5,0x30F6}; + +/* page 5 0x2621-0x2658 */ +static uint16 tab_jisx0208_uni5[]={ +0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398, +0x0399,0x039A,0x039B,0x039C,0x039D,0x039E,0x039F,0x03A0, +0x03A1,0x03A3,0x03A4,0x03A5,0x03A6,0x03A7,0x03A8,0x03A9, + 0, 0, 0, 0, 0, 0, 0, 0, +0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6,0x03B7,0x03B8, +0x03B9,0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF,0x03C0, +0x03C1,0x03C3,0x03C4,0x03C5,0x03C6,0x03C7,0x03C8,0x03C9 +}; + +/* page 6 0x2721-0x2771 */ +static uint16 tab_jisx0208_uni6[]={ +0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0401,0x0416, +0x0417,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E, +0x041F,0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426, +0x0427,0x0428,0x0429,0x042A,0x042B,0x042C,0x042D,0x042E, +0x042F, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0451,0x0436, +0x0437,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E, +0x043F,0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446, +0x0447,0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E, +0x044F}; + +/* page 7 0x2821-0x2840 */ +static uint16 tab_jisx0208_uni7[]={ +0x2500,0x2502,0x250C,0x2510,0x2518,0x2514,0x251C,0x252C, +0x2524,0x2534,0x253C,0x2501,0x2503,0x250F,0x2513,0x251B, +0x2517,0x2523,0x2533,0x252B,0x253B,0x254B,0x2520,0x252F, +0x2528,0x2537,0x253F,0x251D,0x2530,0x2525,0x2538,0x2542 +}; + +/* page 8 0x3021-0x307E */ +static uint16 tab_jisx0208_uni8[]={ +0x4E9C,0x5516,0x5A03,0x963F,0x54C0,0x611B,0x6328,0x59F6, +0x9022,0x8475,0x831C,0x7A50,0x60AA,0x63E1,0x6E25,0x65ED, +0x8466,0x82A6,0x9BF5,0x6893,0x5727,0x65A1,0x6271,0x5B9B, +0x59D0,0x867B,0x98F4,0x7D62,0x7DBE,0x9B8E,0x6216,0x7C9F, +0x88B7,0x5B89,0x5EB5,0x6309,0x6697,0x6848,0x95C7,0x978D, +0x674F,0x4EE5,0x4F0A,0x4F4D,0x4F9D,0x5049,0x56F2,0x5937, +0x59D4,0x5A01,0x5C09,0x60DF,0x610F,0x6170,0x6613,0x6905, +0x70BA,0x754F,0x7570,0x79FB,0x7DAD,0x7DEF,0x80C3,0x840E, +0x8863,0x8B02,0x9055,0x907A,0x533B,0x4E95,0x4EA5,0x57DF, +0x80B2,0x90C1,0x78EF,0x4E00,0x58F1,0x6EA2,0x9038,0x7A32, +0x8328,0x828B,0x9C2F,0x5141,0x5370,0x54BD,0x54E1,0x56E0, +0x59FB,0x5F15,0x98F2,0x6DEB,0x80E4,0x852D}; + +/* page 9 0x3121-0x317E */ +static uint16 tab_jisx0208_uni9[]={ +0x9662,0x9670,0x96A0,0x97FB,0x540B,0x53F3,0x5B87,0x70CF, +0x7FBD,0x8FC2,0x96E8,0x536F,0x9D5C,0x7ABA,0x4E11,0x7893, +0x81FC,0x6E26,0x5618,0x5504,0x6B1D,0x851A,0x9C3B,0x59E5, +0x53A9,0x6D66,0x74DC,0x958F,0x5642,0x4E91,0x904B,0x96F2, +0x834F,0x990C,0x53E1,0x55B6,0x5B30,0x5F71,0x6620,0x66F3, +0x6804,0x6C38,0x6CF3,0x6D29,0x745B,0x76C8,0x7A4E,0x9834, +0x82F1,0x885B,0x8A60,0x92ED,0x6DB2,0x75AB,0x76CA,0x99C5, +0x60A6,0x8B01,0x8D8A,0x95B2,0x698E,0x53AD,0x5186,0x5712, +0x5830,0x5944,0x5BB4,0x5EF6,0x6028,0x63A9,0x63F4,0x6CBF, +0x6F14,0x708E,0x7114,0x7159,0x71D5,0x733F,0x7E01,0x8276, +0x82D1,0x8597,0x9060,0x925B,0x9D1B,0x5869,0x65BC,0x6C5A, +0x7525,0x51F9,0x592E,0x5965,0x5F80,0x5FDC}; + +/* page 10 0x3221-0x327E */ +static uint16 tab_jisx0208_uni10[]={ +0x62BC,0x65FA,0x6A2A,0x6B27,0x6BB4,0x738B,0x7FC1,0x8956, +0x9D2C,0x9D0E,0x9EC4,0x5CA1,0x6C96,0x837B,0x5104,0x5C4B, +0x61B6,0x81C6,0x6876,0x7261,0x4E59,0x4FFA,0x5378,0x6069, +0x6E29,0x7A4F,0x97F3,0x4E0B,0x5316,0x4EEE,0x4F55,0x4F3D, +0x4FA1,0x4F73,0x52A0,0x53EF,0x5609,0x590F,0x5AC1,0x5BB6, +0x5BE1,0x79D1,0x6687,0x679C,0x67B6,0x6B4C,0x6CB3,0x706B, +0x73C2,0x798D,0x79BE,0x7A3C,0x7B87,0x82B1,0x82DB,0x8304, +0x8377,0x83EF,0x83D3,0x8766,0x8AB2,0x5629,0x8CA8,0x8FE6, +0x904E,0x971E,0x868A,0x4FC4,0x5CE8,0x6211,0x7259,0x753B, +0x81E5,0x82BD,0x86FE,0x8CC0,0x96C5,0x9913,0x99D5,0x4ECB, +0x4F1A,0x89E3,0x56DE,0x584A,0x58CA,0x5EFB,0x5FEB,0x602A, +0x6094,0x6062,0x61D0,0x6212,0x62D0,0x6539}; + +/* page 11 0x3321-0x337E */ +static uint16 tab_jisx0208_uni11[]={ +0x9B41,0x6666,0x68B0,0x6D77,0x7070,0x754C,0x7686,0x7D75, +0x82A5,0x87F9,0x958B,0x968E,0x8C9D,0x51F1,0x52BE,0x5916, +0x54B3,0x5BB3,0x5D16,0x6168,0x6982,0x6DAF,0x788D,0x84CB, +0x8857,0x8A72,0x93A7,0x9AB8,0x6D6C,0x99A8,0x86D9,0x57A3, +0x67FF,0x86CE,0x920E,0x5283,0x5687,0x5404,0x5ED3,0x62E1, +0x64B9,0x683C,0x6838,0x6BBB,0x7372,0x78BA,0x7A6B,0x899A, +0x89D2,0x8D6B,0x8F03,0x90ED,0x95A3,0x9694,0x9769,0x5B66, +0x5CB3,0x697D,0x984D,0x984E,0x639B,0x7B20,0x6A2B,0x6A7F, +0x68B6,0x9C0D,0x6F5F,0x5272,0x559D,0x6070,0x62EC,0x6D3B, +0x6E07,0x6ED1,0x845B,0x8910,0x8F44,0x4E14,0x9C39,0x53F6, +0x691B,0x6A3A,0x9784,0x682A,0x515C,0x7AC3,0x84B2,0x91DC, +0x938C,0x565B,0x9D28,0x6822,0x8305,0x8431}; + +/* page 12 0x3421-0x347E */ +static uint16 tab_jisx0208_uni12[]={ +0x7CA5,0x5208,0x82C5,0x74E6,0x4E7E,0x4F83,0x51A0,0x5BD2, +0x520A,0x52D8,0x52E7,0x5DFB,0x559A,0x582A,0x59E6,0x5B8C, +0x5B98,0x5BDB,0x5E72,0x5E79,0x60A3,0x611F,0x6163,0x61BE, +0x63DB,0x6562,0x67D1,0x6853,0x68FA,0x6B3E,0x6B53,0x6C57, +0x6F22,0x6F97,0x6F45,0x74B0,0x7518,0x76E3,0x770B,0x7AFF, +0x7BA1,0x7C21,0x7DE9,0x7F36,0x7FF0,0x809D,0x8266,0x839E, +0x89B3,0x8ACC,0x8CAB,0x9084,0x9451,0x9593,0x9591,0x95A2, +0x9665,0x97D3,0x9928,0x8218,0x4E38,0x542B,0x5CB8,0x5DCC, +0x73A9,0x764C,0x773C,0x5CA9,0x7FEB,0x8D0B,0x96C1,0x9811, +0x9854,0x9858,0x4F01,0x4F0E,0x5371,0x559C,0x5668,0x57FA, +0x5947,0x5B09,0x5BC4,0x5C90,0x5E0C,0x5E7E,0x5FCC,0x63EE, +0x673A,0x65D7,0x65E2,0x671F,0x68CB,0x68C4}; + +/* page 13 0x3521-0x357E */ +static uint16 tab_jisx0208_uni13[]={ +0x6A5F,0x5E30,0x6BC5,0x6C17,0x6C7D,0x757F,0x7948,0x5B63, +0x7A00,0x7D00,0x5FBD,0x898F,0x8A18,0x8CB4,0x8D77,0x8ECC, +0x8F1D,0x98E2,0x9A0E,0x9B3C,0x4E80,0x507D,0x5100,0x5993, +0x5B9C,0x622F,0x6280,0x64EC,0x6B3A,0x72A0,0x7591,0x7947, +0x7FA9,0x87FB,0x8ABC,0x8B70,0x63AC,0x83CA,0x97A0,0x5409, +0x5403,0x55AB,0x6854,0x6A58,0x8A70,0x7827,0x6775,0x9ECD, +0x5374,0x5BA2,0x811A,0x8650,0x9006,0x4E18,0x4E45,0x4EC7, +0x4F11,0x53CA,0x5438,0x5BAE,0x5F13,0x6025,0x6551,0x673D, +0x6C42,0x6C72,0x6CE3,0x7078,0x7403,0x7A76,0x7AAE,0x7B08, +0x7D1A,0x7CFE,0x7D66,0x65E7,0x725B,0x53BB,0x5C45,0x5DE8, +0x62D2,0x62E0,0x6319,0x6E20,0x865A,0x8A31,0x8DDD,0x92F8, +0x6F01,0x79A6,0x9B5A,0x4EA8,0x4EAB,0x4EAC}; + +/* page 14 0x3621-0x367E */ +static uint16 tab_jisx0208_uni14[]={ +0x4F9B,0x4FA0,0x50D1,0x5147,0x7AF6,0x5171,0x51F6,0x5354, +0x5321,0x537F,0x53EB,0x55AC,0x5883,0x5CE1,0x5F37,0x5F4A, +0x602F,0x6050,0x606D,0x631F,0x6559,0x6A4B,0x6CC1,0x72C2, +0x72ED,0x77EF,0x80F8,0x8105,0x8208,0x854E,0x90F7,0x93E1, +0x97FF,0x9957,0x9A5A,0x4EF0,0x51DD,0x5C2D,0x6681,0x696D, +0x5C40,0x66F2,0x6975,0x7389,0x6850,0x7C81,0x50C5,0x52E4, +0x5747,0x5DFE,0x9326,0x65A4,0x6B23,0x6B3D,0x7434,0x7981, +0x79BD,0x7B4B,0x7DCA,0x82B9,0x83CC,0x887F,0x895F,0x8B39, +0x8FD1,0x91D1,0x541F,0x9280,0x4E5D,0x5036,0x53E5,0x533A, +0x72D7,0x7396,0x77E9,0x82E6,0x8EAF,0x99C6,0x99C8,0x99D2, +0x5177,0x611A,0x865E,0x55B0,0x7A7A,0x5076,0x5BD3,0x9047, +0x9685,0x4E32,0x6ADB,0x91E7,0x5C51,0x5C48}; + +/* page 15 0x3721-0x377E */ +static uint16 tab_jisx0208_uni15[]={ +0x6398,0x7A9F,0x6C93,0x9774,0x8F61,0x7AAA,0x718A,0x9688, +0x7C82,0x6817,0x7E70,0x6851,0x936C,0x52F2,0x541B,0x85AB, +0x8A13,0x7FA4,0x8ECD,0x90E1,0x5366,0x8888,0x7941,0x4FC2, +0x50BE,0x5211,0x5144,0x5553,0x572D,0x73EA,0x578B,0x5951, +0x5F62,0x5F84,0x6075,0x6176,0x6167,0x61A9,0x63B2,0x643A, +0x656C,0x666F,0x6842,0x6E13,0x7566,0x7A3D,0x7CFB,0x7D4C, +0x7D99,0x7E4B,0x7F6B,0x830E,0x834A,0x86CD,0x8A08,0x8A63, +0x8B66,0x8EFD,0x981A,0x9D8F,0x82B8,0x8FCE,0x9BE8,0x5287, +0x621F,0x6483,0x6FC0,0x9699,0x6841,0x5091,0x6B20,0x6C7A, +0x6F54,0x7A74,0x7D50,0x8840,0x8A23,0x6708,0x4EF6,0x5039, +0x5026,0x5065,0x517C,0x5238,0x5263,0x55A7,0x570F,0x5805, +0x5ACC,0x5EFA,0x61B2,0x61F8,0x62F3,0x6372}; + +/* page 16 0x3821-0x387E */ +static uint16 tab_jisx0208_uni16[]={ +0x691C,0x6A29,0x727D,0x72AC,0x732E,0x7814,0x786F,0x7D79, +0x770C,0x80A9,0x898B,0x8B19,0x8CE2,0x8ED2,0x9063,0x9375, +0x967A,0x9855,0x9A13,0x9E78,0x5143,0x539F,0x53B3,0x5E7B, +0x5F26,0x6E1B,0x6E90,0x7384,0x73FE,0x7D43,0x8237,0x8A00, +0x8AFA,0x9650,0x4E4E,0x500B,0x53E4,0x547C,0x56FA,0x59D1, +0x5B64,0x5DF1,0x5EAB,0x5F27,0x6238,0x6545,0x67AF,0x6E56, +0x72D0,0x7CCA,0x88B4,0x80A1,0x80E1,0x83F0,0x864E,0x8A87, +0x8DE8,0x9237,0x96C7,0x9867,0x9F13,0x4E94,0x4E92,0x4F0D, +0x5348,0x5449,0x543E,0x5A2F,0x5F8C,0x5FA1,0x609F,0x68A7, +0x6A8E,0x745A,0x7881,0x8A9E,0x8AA4,0x8B77,0x9190,0x4E5E, +0x9BC9,0x4EA4,0x4F7C,0x4FAF,0x5019,0x5016,0x5149,0x516C, +0x529F,0x52B9,0x52FE,0x539A,0x53E3,0x5411}; + +/* page 17 0x3921-0x397E */ +static uint16 tab_jisx0208_uni17[]={ +0x540E,0x5589,0x5751,0x57A2,0x597D,0x5B54,0x5B5D,0x5B8F, +0x5DE5,0x5DE7,0x5DF7,0x5E78,0x5E83,0x5E9A,0x5EB7,0x5F18, +0x6052,0x614C,0x6297,0x62D8,0x63A7,0x653B,0x6602,0x6643, +0x66F4,0x676D,0x6821,0x6897,0x69CB,0x6C5F,0x6D2A,0x6D69, +0x6E2F,0x6E9D,0x7532,0x7687,0x786C,0x7A3F,0x7CE0,0x7D05, +0x7D18,0x7D5E,0x7DB1,0x8015,0x8003,0x80AF,0x80B1,0x8154, +0x818F,0x822A,0x8352,0x884C,0x8861,0x8B1B,0x8CA2,0x8CFC, +0x90CA,0x9175,0x9271,0x783F,0x92FC,0x95A4,0x964D,0x9805, +0x9999,0x9AD8,0x9D3B,0x525B,0x52AB,0x53F7,0x5408,0x58D5, +0x62F7,0x6FE0,0x8C6A,0x8F5F,0x9EB9,0x514B,0x523B,0x544A, +0x56FD,0x7A40,0x9177,0x9D60,0x9ED2,0x7344,0x6F09,0x8170, +0x7511,0x5FFD,0x60DA,0x9AA8,0x72DB,0x8FBC}; + +/* page 18 0x3A21-0x3A7E */ +static uint16 tab_jisx0208_uni18[]={ +0x6B64,0x9803,0x4ECA,0x56F0,0x5764,0x58BE,0x5A5A,0x6068, +0x61C7,0x660F,0x6606,0x6839,0x68B1,0x6DF7,0x75D5,0x7D3A, +0x826E,0x9B42,0x4E9B,0x4F50,0x53C9,0x5506,0x5D6F,0x5DE6, +0x5DEE,0x67FB,0x6C99,0x7473,0x7802,0x8A50,0x9396,0x88DF, +0x5750,0x5EA7,0x632B,0x50B5,0x50AC,0x518D,0x6700,0x54C9, +0x585E,0x59BB,0x5BB0,0x5F69,0x624D,0x63A1,0x683D,0x6B73, +0x6E08,0x707D,0x91C7,0x7280,0x7815,0x7826,0x796D,0x658E, +0x7D30,0x83DC,0x88C1,0x8F09,0x969B,0x5264,0x5728,0x6750, +0x7F6A,0x8CA1,0x51B4,0x5742,0x962A,0x583A,0x698A,0x80B4, +0x54B2,0x5D0E,0x57FC,0x7895,0x9DFA,0x4F5C,0x524A,0x548B, +0x643E,0x6628,0x6714,0x67F5,0x7A84,0x7B56,0x7D22,0x932F, +0x685C,0x9BAD,0x7B39,0x5319,0x518A,0x5237}; + +/* page 19 0x3B21-0x3B7E */ +static uint16 tab_jisx0208_uni19[]={ +0x5BDF,0x62F6,0x64AE,0x64E6,0x672D,0x6BBA,0x85A9,0x96D1, +0x7690,0x9BD6,0x634C,0x9306,0x9BAB,0x76BF,0x6652,0x4E09, +0x5098,0x53C2,0x5C71,0x60E8,0x6492,0x6563,0x685F,0x71E6, +0x73CA,0x7523,0x7B97,0x7E82,0x8695,0x8B83,0x8CDB,0x9178, +0x9910,0x65AC,0x66AB,0x6B8B,0x4ED5,0x4ED4,0x4F3A,0x4F7F, +0x523A,0x53F8,0x53F2,0x55E3,0x56DB,0x58EB,0x59CB,0x59C9, +0x59FF,0x5B50,0x5C4D,0x5E02,0x5E2B,0x5FD7,0x601D,0x6307, +0x652F,0x5B5C,0x65AF,0x65BD,0x65E8,0x679D,0x6B62,0x6B7B, +0x6C0F,0x7345,0x7949,0x79C1,0x7CF8,0x7D19,0x7D2B,0x80A2, +0x8102,0x81F3,0x8996,0x8A5E,0x8A69,0x8A66,0x8A8C,0x8AEE, +0x8CC7,0x8CDC,0x96CC,0x98FC,0x6B6F,0x4E8B,0x4F3C,0x4F8D, +0x5150,0x5B57,0x5BFA,0x6148,0x6301,0x6642}; + +/* page 20 0x3C21-0x3C7E */ +static uint16 tab_jisx0208_uni20[]={ +0x6B21,0x6ECB,0x6CBB,0x723E,0x74BD,0x75D4,0x78C1,0x793A, +0x800C,0x8033,0x81EA,0x8494,0x8F9E,0x6C50,0x9E7F,0x5F0F, +0x8B58,0x9D2B,0x7AFA,0x8EF8,0x5B8D,0x96EB,0x4E03,0x53F1, +0x57F7,0x5931,0x5AC9,0x5BA4,0x6089,0x6E7F,0x6F06,0x75BE, +0x8CEA,0x5B9F,0x8500,0x7BE0,0x5072,0x67F4,0x829D,0x5C61, +0x854A,0x7E1E,0x820E,0x5199,0x5C04,0x6368,0x8D66,0x659C, +0x716E,0x793E,0x7D17,0x8005,0x8B1D,0x8ECA,0x906E,0x86C7, +0x90AA,0x501F,0x52FA,0x5C3A,0x6753,0x707C,0x7235,0x914C, +0x91C8,0x932B,0x82E5,0x5BC2,0x5F31,0x60F9,0x4E3B,0x53D6, +0x5B88,0x624B,0x6731,0x6B8A,0x72E9,0x73E0,0x7A2E,0x816B, +0x8DA3,0x9152,0x9996,0x5112,0x53D7,0x546A,0x5BFF,0x6388, +0x6A39,0x7DAC,0x9700,0x56DA,0x53CE,0x5468}; + +/* page 21 0x3D21-0x3D7E */ +static uint16 tab_jisx0208_uni21[]={ +0x5B97,0x5C31,0x5DDE,0x4FEE,0x6101,0x62FE,0x6D32,0x79C0, +0x79CB,0x7D42,0x7E4D,0x7FD2,0x81ED,0x821F,0x8490,0x8846, +0x8972,0x8B90,0x8E74,0x8F2F,0x9031,0x914B,0x916C,0x96C6, +0x919C,0x4EC0,0x4F4F,0x5145,0x5341,0x5F93,0x620E,0x67D4, +0x6C41,0x6E0B,0x7363,0x7E26,0x91CD,0x9283,0x53D4,0x5919, +0x5BBF,0x6DD1,0x795D,0x7E2E,0x7C9B,0x587E,0x719F,0x51FA, +0x8853,0x8FF0,0x4FCA,0x5CFB,0x6625,0x77AC,0x7AE3,0x821C, +0x99FF,0x51C6,0x5FAA,0x65EC,0x696F,0x6B89,0x6DF3,0x6E96, +0x6F64,0x76FE,0x7D14,0x5DE1,0x9075,0x9187,0x9806,0x51E6, +0x521D,0x6240,0x6691,0x66D9,0x6E1A,0x5EB6,0x7DD2,0x7F72, +0x66F8,0x85AF,0x85F7,0x8AF8,0x52A9,0x53D9,0x5973,0x5E8F, +0x5F90,0x6055,0x92E4,0x9664,0x50B7,0x511F}; + +/* page 22 0x3E21-0x3E7E */ +static uint16 tab_jisx0208_uni22[]={ +0x52DD,0x5320,0x5347,0x53EC,0x54E8,0x5546,0x5531,0x5617, +0x5968,0x59BE,0x5A3C,0x5BB5,0x5C06,0x5C0F,0x5C11,0x5C1A, +0x5E84,0x5E8A,0x5EE0,0x5F70,0x627F,0x6284,0x62DB,0x638C, +0x6377,0x6607,0x660C,0x662D,0x6676,0x677E,0x68A2,0x6A1F, +0x6A35,0x6CBC,0x6D88,0x6E09,0x6E58,0x713C,0x7126,0x7167, +0x75C7,0x7701,0x785D,0x7901,0x7965,0x79F0,0x7AE0,0x7B11, +0x7CA7,0x7D39,0x8096,0x83D6,0x848B,0x8549,0x885D,0x88F3, +0x8A1F,0x8A3C,0x8A54,0x8A73,0x8C61,0x8CDE,0x91A4,0x9266, +0x937E,0x9418,0x969C,0x9798,0x4E0A,0x4E08,0x4E1E,0x4E57, +0x5197,0x5270,0x57CE,0x5834,0x58CC,0x5B22,0x5E38,0x60C5, +0x64FE,0x6761,0x6756,0x6D44,0x72B6,0x7573,0x7A63,0x84B8, +0x8B72,0x91B8,0x9320,0x5631,0x57F4,0x98FE}; + +/* page 23 0x3F21-0x3F7E */ +static uint16 tab_jisx0208_uni23[]={ +0x62ED,0x690D,0x6B96,0x71ED,0x7E54,0x8077,0x8272,0x89E6, +0x98DF,0x8755,0x8FB1,0x5C3B,0x4F38,0x4FE1,0x4FB5,0x5507, +0x5A20,0x5BDD,0x5BE9,0x5FC3,0x614E,0x632F,0x65B0,0x664B, +0x68EE,0x699B,0x6D78,0x6DF1,0x7533,0x75B9,0x771F,0x795E, +0x79E6,0x7D33,0x81E3,0x82AF,0x85AA,0x89AA,0x8A3A,0x8EAB, +0x8F9B,0x9032,0x91DD,0x9707,0x4EBA,0x4EC1,0x5203,0x5875, +0x58EC,0x5C0B,0x751A,0x5C3D,0x814E,0x8A0A,0x8FC5,0x9663, +0x976D,0x7B25,0x8ACF,0x9808,0x9162,0x56F3,0x53A8,0x9017, +0x5439,0x5782,0x5E25,0x63A8,0x6C34,0x708A,0x7761,0x7C8B, +0x7FE0,0x8870,0x9042,0x9154,0x9310,0x9318,0x968F,0x745E, +0x9AC4,0x5D07,0x5D69,0x6570,0x67A2,0x8DA8,0x96DB,0x636E, +0x6749,0x6919,0x83C5,0x9817,0x96C0,0x88FE}; + +/* page 24 0x4021-0x407E */ +static uint16 tab_jisx0208_uni24[]={ +0x6F84,0x647A,0x5BF8,0x4E16,0x702C,0x755D,0x662F,0x51C4, +0x5236,0x52E2,0x59D3,0x5F81,0x6027,0x6210,0x653F,0x6574, +0x661F,0x6674,0x68F2,0x6816,0x6B63,0x6E05,0x7272,0x751F, +0x76DB,0x7CBE,0x8056,0x58F0,0x88FD,0x897F,0x8AA0,0x8A93, +0x8ACB,0x901D,0x9192,0x9752,0x9759,0x6589,0x7A0E,0x8106, +0x96BB,0x5E2D,0x60DC,0x621A,0x65A5,0x6614,0x6790,0x77F3, +0x7A4D,0x7C4D,0x7E3E,0x810A,0x8CAC,0x8D64,0x8DE1,0x8E5F, +0x78A9,0x5207,0x62D9,0x63A5,0x6442,0x6298,0x8A2D,0x7A83, +0x7BC0,0x8AAC,0x96EA,0x7D76,0x820C,0x8749,0x4ED9,0x5148, +0x5343,0x5360,0x5BA3,0x5C02,0x5C16,0x5DDD,0x6226,0x6247, +0x64B0,0x6813,0x6834,0x6CC9,0x6D45,0x6D17,0x67D3,0x6F5C, +0x714E,0x717D,0x65CB,0x7A7F,0x7BAD,0x7DDA}; + +/* page 25 0x4121-0x417E */ +static uint16 tab_jisx0208_uni25[]={ +0x7E4A,0x7FA8,0x817A,0x821B,0x8239,0x85A6,0x8A6E,0x8CCE, +0x8DF5,0x9078,0x9077,0x92AD,0x9291,0x9583,0x9BAE,0x524D, +0x5584,0x6F38,0x7136,0x5168,0x7985,0x7E55,0x81B3,0x7CCE, +0x564C,0x5851,0x5CA8,0x63AA,0x66FE,0x66FD,0x695A,0x72D9, +0x758F,0x758E,0x790E,0x7956,0x79DF,0x7C97,0x7D20,0x7D44, +0x8607,0x8A34,0x963B,0x9061,0x9F20,0x50E7,0x5275,0x53CC, +0x53E2,0x5009,0x55AA,0x58EE,0x594F,0x723D,0x5B8B,0x5C64, +0x531D,0x60E3,0x60F3,0x635C,0x6383,0x633F,0x63BB,0x64CD, +0x65E9,0x66F9,0x5DE3,0x69CD,0x69FD,0x6F15,0x71E5,0x4E89, +0x75E9,0x76F8,0x7A93,0x7CDF,0x7DCF,0x7D9C,0x8061,0x8349, +0x8358,0x846C,0x84BC,0x85FB,0x88C5,0x8D70,0x9001,0x906D, +0x9397,0x971C,0x9A12,0x50CF,0x5897,0x618E}; + +/* page 26 0x4221-0x427E */ +static uint16 tab_jisx0208_uni26[]={ +0x81D3,0x8535,0x8D08,0x9020,0x4FC3,0x5074,0x5247,0x5373, +0x606F,0x6349,0x675F,0x6E2C,0x8DB3,0x901F,0x4FD7,0x5C5E, +0x8CCA,0x65CF,0x7D9A,0x5352,0x8896,0x5176,0x63C3,0x5B58, +0x5B6B,0x5C0A,0x640D,0x6751,0x905C,0x4ED6,0x591A,0x592A, +0x6C70,0x8A51,0x553E,0x5815,0x59A5,0x60F0,0x6253,0x67C1, +0x8235,0x6955,0x9640,0x99C4,0x9A28,0x4F53,0x5806,0x5BFE, +0x8010,0x5CB1,0x5E2F,0x5F85,0x6020,0x614B,0x6234,0x66FF, +0x6CF0,0x6EDE,0x80CE,0x817F,0x82D4,0x888B,0x8CB8,0x9000, +0x902E,0x968A,0x9EDB,0x9BDB,0x4EE3,0x53F0,0x5927,0x7B2C, +0x918D,0x984C,0x9DF9,0x6EDD,0x7027,0x5353,0x5544,0x5B85, +0x6258,0x629E,0x62D3,0x6CA2,0x6FEF,0x7422,0x8A17,0x9438, +0x6FC1,0x8AFE,0x8338,0x51E7,0x86F8,0x53EA}; + +/* page 27 0x4321-0x437E */ +static uint16 tab_jisx0208_uni27[]={ +0x53E9,0x4F46,0x9054,0x8FB0,0x596A,0x8131,0x5DFD,0x7AEA, +0x8FBF,0x68DA,0x8C37,0x72F8,0x9C48,0x6A3D,0x8AB0,0x4E39, +0x5358,0x5606,0x5766,0x62C5,0x63A2,0x65E6,0x6B4E,0x6DE1, +0x6E5B,0x70AD,0x77ED,0x7AEF,0x7BAA,0x7DBB,0x803D,0x80C6, +0x86CB,0x8A95,0x935B,0x56E3,0x58C7,0x5F3E,0x65AD,0x6696, +0x6A80,0x6BB5,0x7537,0x8AC7,0x5024,0x77E5,0x5730,0x5F1B, +0x6065,0x667A,0x6C60,0x75F4,0x7A1A,0x7F6E,0x81F4,0x8718, +0x9045,0x99B3,0x7BC9,0x755C,0x7AF9,0x7B51,0x84C4,0x9010, +0x79E9,0x7A92,0x8336,0x5AE1,0x7740,0x4E2D,0x4EF2,0x5B99, +0x5FE0,0x62BD,0x663C,0x67F1,0x6CE8,0x866B,0x8877,0x8A3B, +0x914E,0x92F3,0x99D0,0x6A17,0x7026,0x732A,0x82E7,0x8457, +0x8CAF,0x4E01,0x5146,0x51CB,0x558B,0x5BF5}; + +/* page 28 0x4421-0x447E */ +static uint16 tab_jisx0208_uni28[]={ +0x5E16,0x5E33,0x5E81,0x5F14,0x5F35,0x5F6B,0x5FB4,0x61F2, +0x6311,0x66A2,0x671D,0x6F6E,0x7252,0x753A,0x773A,0x8074, +0x8139,0x8178,0x8776,0x8ABF,0x8ADC,0x8D85,0x8DF3,0x929A, +0x9577,0x9802,0x9CE5,0x52C5,0x6357,0x76F4,0x6715,0x6C88, +0x73CD,0x8CC3,0x93AE,0x9673,0x6D25,0x589C,0x690E,0x69CC, +0x8FFD,0x939A,0x75DB,0x901A,0x585A,0x6802,0x63B4,0x69FB, +0x4F43,0x6F2C,0x67D8,0x8FBB,0x8526,0x7DB4,0x9354,0x693F, +0x6F70,0x576A,0x58F7,0x5B2C,0x7D2C,0x722A,0x540A,0x91E3, +0x9DB4,0x4EAD,0x4F4E,0x505C,0x5075,0x5243,0x8C9E,0x5448, +0x5824,0x5B9A,0x5E1D,0x5E95,0x5EAD,0x5EF7,0x5F1F,0x608C, +0x62B5,0x633A,0x63D0,0x68AF,0x6C40,0x7887,0x798E,0x7A0B, +0x7DE0,0x8247,0x8A02,0x8AE6,0x8E44,0x9013}; + +/* page 29 0x4521-0x457E */ +static uint16 tab_jisx0208_uni29[]={ +0x90B8,0x912D,0x91D8,0x9F0E,0x6CE5,0x6458,0x64E2,0x6575, +0x6EF4,0x7684,0x7B1B,0x9069,0x93D1,0x6EBA,0x54F2,0x5FB9, +0x64A4,0x8F4D,0x8FED,0x9244,0x5178,0x586B,0x5929,0x5C55, +0x5E97,0x6DFB,0x7E8F,0x751C,0x8CBC,0x8EE2,0x985B,0x70B9, +0x4F1D,0x6BBF,0x6FB1,0x7530,0x96FB,0x514E,0x5410,0x5835, +0x5857,0x59AC,0x5C60,0x5F92,0x6597,0x675C,0x6E21,0x767B, +0x83DF,0x8CED,0x9014,0x90FD,0x934D,0x7825,0x783A,0x52AA, +0x5EA6,0x571F,0x5974,0x6012,0x5012,0x515A,0x51AC,0x51CD, +0x5200,0x5510,0x5854,0x5858,0x5957,0x5B95,0x5CF6,0x5D8B, +0x60BC,0x6295,0x642D,0x6771,0x6843,0x68BC,0x68DF,0x76D7, +0x6DD8,0x6E6F,0x6D9B,0x706F,0x71C8,0x5F53,0x75D8,0x7977, +0x7B49,0x7B54,0x7B52,0x7CD6,0x7D71,0x5230}; + +/* page 30 0x4621-0x467E */ +static uint16 tab_jisx0208_uni30[]={ +0x8463,0x8569,0x85E4,0x8A0E,0x8B04,0x8C46,0x8E0F,0x9003, +0x900F,0x9419,0x9676,0x982D,0x9A30,0x95D8,0x50CD,0x52D5, +0x540C,0x5802,0x5C0E,0x61A7,0x649E,0x6D1E,0x77B3,0x7AE5, +0x80F4,0x8404,0x9053,0x9285,0x5CE0,0x9D07,0x533F,0x5F97, +0x5FB3,0x6D9C,0x7279,0x7763,0x79BF,0x7BE4,0x6BD2,0x72EC, +0x8AAD,0x6803,0x6A61,0x51F8,0x7A81,0x6934,0x5C4A,0x9CF6, +0x82EB,0x5BC5,0x9149,0x701E,0x5678,0x5C6F,0x60C7,0x6566, +0x6C8C,0x8C5A,0x9041,0x9813,0x5451,0x66C7,0x920D,0x5948, +0x90A3,0x5185,0x4E4D,0x51EA,0x8599,0x8B0E,0x7058,0x637A, +0x934B,0x6962,0x99B4,0x7E04,0x7577,0x5357,0x6960,0x8EDF, +0x96E3,0x6C5D,0x4E8C,0x5C3C,0x5F10,0x8FE9,0x5302,0x8CD1, +0x8089,0x8679,0x5EFF,0x65E5,0x4E73,0x5165}; + +/* page 31 0x4721-0x477E */ +static uint16 tab_jisx0208_uni31[]={ +0x5982,0x5C3F,0x97EE,0x4EFB,0x598A,0x5FCD,0x8A8D,0x6FE1, +0x79B0,0x7962,0x5BE7,0x8471,0x732B,0x71B1,0x5E74,0x5FF5, +0x637B,0x649A,0x71C3,0x7C98,0x4E43,0x5EFC,0x4E4B,0x57DC, +0x56A2,0x60A9,0x6FC3,0x7D0D,0x80FD,0x8133,0x81BF,0x8FB2, +0x8997,0x86A4,0x5DF4,0x628A,0x64AD,0x8987,0x6777,0x6CE2, +0x6D3E,0x7436,0x7834,0x5A46,0x7F75,0x82AD,0x99AC,0x4FF3, +0x5EC3,0x62DD,0x6392,0x6557,0x676F,0x76C3,0x724C,0x80CC, +0x80BA,0x8F29,0x914D,0x500D,0x57F9,0x5A92,0x6885,0x6973, +0x7164,0x72FD,0x8CB7,0x58F2,0x8CE0,0x966A,0x9019,0x877F, +0x79E4,0x77E7,0x8429,0x4F2F,0x5265,0x535A,0x62CD,0x67CF, +0x6CCA,0x767D,0x7B94,0x7C95,0x8236,0x8584,0x8FEB,0x66DD, +0x6F20,0x7206,0x7E1B,0x83AB,0x99C1,0x9EA6}; + +/* page 32 0x4821-0x487E */ +static uint16 tab_jisx0208_uni32[]={ +0x51FD,0x7BB1,0x7872,0x7BB8,0x8087,0x7B48,0x6AE8,0x5E61, +0x808C,0x7551,0x7560,0x516B,0x9262,0x6E8C,0x767A,0x9197, +0x9AEA,0x4F10,0x7F70,0x629C,0x7B4F,0x95A5,0x9CE9,0x567A, +0x5859,0x86E4,0x96BC,0x4F34,0x5224,0x534A,0x53CD,0x53DB, +0x5E06,0x642C,0x6591,0x677F,0x6C3E,0x6C4E,0x7248,0x72AF, +0x73ED,0x7554,0x7E41,0x822C,0x85E9,0x8CA9,0x7BC4,0x91C6, +0x7169,0x9812,0x98EF,0x633D,0x6669,0x756A,0x76E4,0x78D0, +0x8543,0x86EE,0x532A,0x5351,0x5426,0x5983,0x5E87,0x5F7C, +0x60B2,0x6249,0x6279,0x62AB,0x6590,0x6BD4,0x6CCC,0x75B2, +0x76AE,0x7891,0x79D8,0x7DCB,0x7F77,0x80A5,0x88AB,0x8AB9, +0x8CBB,0x907F,0x975E,0x98DB,0x6A0B,0x7C38,0x5099,0x5C3E, +0x5FAE,0x6787,0x6BD8,0x7435,0x7709,0x7F8E}; + +/* page 33 0x4921-0x497E */ +static uint16 tab_jisx0208_uni33[]={ +0x9F3B,0x67CA,0x7A17,0x5339,0x758B,0x9AED,0x5F66,0x819D, +0x83F1,0x8098,0x5F3C,0x5FC5,0x7562,0x7B46,0x903C,0x6867, +0x59EB,0x5A9B,0x7D10,0x767E,0x8B2C,0x4FF5,0x5F6A,0x6A19, +0x6C37,0x6F02,0x74E2,0x7968,0x8868,0x8A55,0x8C79,0x5EDF, +0x63CF,0x75C5,0x79D2,0x82D7,0x9328,0x92F2,0x849C,0x86ED, +0x9C2D,0x54C1,0x5F6C,0x658C,0x6D5C,0x7015,0x8CA7,0x8CD3, +0x983B,0x654F,0x74F6,0x4E0D,0x4ED8,0x57E0,0x592B,0x5A66, +0x5BCC,0x51A8,0x5E03,0x5E9C,0x6016,0x6276,0x6577,0x65A7, +0x666E,0x6D6E,0x7236,0x7B26,0x8150,0x819A,0x8299,0x8B5C, +0x8CA0,0x8CE6,0x8D74,0x961C,0x9644,0x4FAE,0x64AB,0x6B66, +0x821E,0x8461,0x856A,0x90E8,0x5C01,0x6953,0x98A8,0x847A, +0x8557,0x4F0F,0x526F,0x5FA9,0x5E45,0x670D}; + +/* page 34 0x4A21-0x4A7E */ +static uint16 tab_jisx0208_uni34[]={ +0x798F,0x8179,0x8907,0x8986,0x6DF5,0x5F17,0x6255,0x6CB8, +0x4ECF,0x7269,0x9B92,0x5206,0x543B,0x5674,0x58B3,0x61A4, +0x626E,0x711A,0x596E,0x7C89,0x7CDE,0x7D1B,0x96F0,0x6587, +0x805E,0x4E19,0x4F75,0x5175,0x5840,0x5E63,0x5E73,0x5F0A, +0x67C4,0x4E26,0x853D,0x9589,0x965B,0x7C73,0x9801,0x50FB, +0x58C1,0x7656,0x78A7,0x5225,0x77A5,0x8511,0x7B86,0x504F, +0x5909,0x7247,0x7BC7,0x7DE8,0x8FBA,0x8FD4,0x904D,0x4FBF, +0x52C9,0x5A29,0x5F01,0x97AD,0x4FDD,0x8217,0x92EA,0x5703, +0x6355,0x6B69,0x752B,0x88DC,0x8F14,0x7A42,0x52DF,0x5893, +0x6155,0x620A,0x66AE,0x6BCD,0x7C3F,0x83E9,0x5023,0x4FF8, +0x5305,0x5446,0x5831,0x5949,0x5B9D,0x5CF0,0x5CEF,0x5D29, +0x5E96,0x62B1,0x6367,0x653E,0x65B9,0x670B}; + +/* page 35 0x4B21-0x4B7E */ +static uint16 tab_jisx0208_uni35[]={ +0x6CD5,0x6CE1,0x70F9,0x7832,0x7E2B,0x80DE,0x82B3,0x840C, +0x84EC,0x8702,0x8912,0x8A2A,0x8C4A,0x90A6,0x92D2,0x98FD, +0x9CF3,0x9D6C,0x4E4F,0x4EA1,0x508D,0x5256,0x574A,0x59A8, +0x5E3D,0x5FD8,0x5FD9,0x623F,0x66B4,0x671B,0x67D0,0x68D2, +0x5192,0x7D21,0x80AA,0x81A8,0x8B00,0x8C8C,0x8CBF,0x927E, +0x9632,0x5420,0x982C,0x5317,0x50D5,0x535C,0x58A8,0x64B2, +0x6734,0x7267,0x7766,0x7A46,0x91E6,0x52C3,0x6CA1,0x6B86, +0x5800,0x5E4C,0x5954,0x672C,0x7FFB,0x51E1,0x76C6,0x6469, +0x78E8,0x9B54,0x9EBB,0x57CB,0x59B9,0x6627,0x679A,0x6BCE, +0x54E9,0x69D9,0x5E55,0x819C,0x6795,0x9BAA,0x67FE,0x9C52, +0x685D,0x4EA6,0x4FE3,0x53C8,0x62B9,0x672B,0x6CAB,0x8FC4, +0x4FAD,0x7E6D,0x9EBF,0x4E07,0x6162,0x6E80}; + +/* page 36 0x4C21-0x4C7E */ +static uint16 tab_jisx0208_uni36[]={ +0x6F2B,0x8513,0x5473,0x672A,0x9B45,0x5DF3,0x7B95,0x5CAC, +0x5BC6,0x871C,0x6E4A,0x84D1,0x7A14,0x8108,0x5999,0x7C8D, +0x6C11,0x7720,0x52D9,0x5922,0x7121,0x725F,0x77DB,0x9727, +0x9D61,0x690B,0x5A7F,0x5A18,0x51A5,0x540D,0x547D,0x660E, +0x76DF,0x8FF7,0x9298,0x9CF4,0x59EA,0x725D,0x6EC5,0x514D, +0x68C9,0x7DBF,0x7DEC,0x9762,0x9EBA,0x6478,0x6A21,0x8302, +0x5984,0x5B5F,0x6BDB,0x731B,0x76F2,0x7DB2,0x8017,0x8499, +0x5132,0x6728,0x9ED9,0x76EE,0x6762,0x52FF,0x9905,0x5C24, +0x623B,0x7C7E,0x8CB0,0x554F,0x60B6,0x7D0B,0x9580,0x5301, +0x4E5F,0x51B6,0x591C,0x723A,0x8036,0x91CE,0x5F25,0x77E2, +0x5384,0x5F79,0x7D04,0x85AC,0x8A33,0x8E8D,0x9756,0x67F3, +0x85AE,0x9453,0x6109,0x6108,0x6CB9,0x7652}; + +/* page 37 0x4D21-0x4D7E */ +static uint16 tab_jisx0208_uni37[]={ +0x8AED,0x8F38,0x552F,0x4F51,0x512A,0x52C7,0x53CB,0x5BA5, +0x5E7D,0x60A0,0x6182,0x63D6,0x6709,0x67DA,0x6E67,0x6D8C, +0x7336,0x7337,0x7531,0x7950,0x88D5,0x8A98,0x904A,0x9091, +0x90F5,0x96C4,0x878D,0x5915,0x4E88,0x4F59,0x4E0E,0x8A89, +0x8F3F,0x9810,0x50AD,0x5E7C,0x5996,0x5BB9,0x5EB8,0x63DA, +0x63FA,0x64C1,0x66DC,0x694A,0x69D8,0x6D0B,0x6EB6,0x7194, +0x7528,0x7AAF,0x7F8A,0x8000,0x8449,0x84C9,0x8981,0x8B21, +0x8E0A,0x9065,0x967D,0x990A,0x617E,0x6291,0x6B32,0x6C83, +0x6D74,0x7FCC,0x7FFC,0x6DC0,0x7F85,0x87BA,0x88F8,0x6765, +0x83B1,0x983C,0x96F7,0x6D1B,0x7D61,0x843D,0x916A,0x4E71, +0x5375,0x5D50,0x6B04,0x6FEB,0x85CD,0x862D,0x89A7,0x5229, +0x540F,0x5C65,0x674E,0x68A8,0x7406,0x7483}; + +/* page 38 0x4E21-0x4E7E */ +static uint16 tab_jisx0208_uni38[]={ +0x75E2,0x88CF,0x88E1,0x91CC,0x96E2,0x9678,0x5F8B,0x7387, +0x7ACB,0x844E,0x63A0,0x7565,0x5289,0x6D41,0x6E9C,0x7409, +0x7559,0x786B,0x7C92,0x9686,0x7ADC,0x9F8D,0x4FB6,0x616E, +0x65C5,0x865C,0x4E86,0x4EAE,0x50DA,0x4E21,0x51CC,0x5BEE, +0x6599,0x6881,0x6DBC,0x731F,0x7642,0x77AD,0x7A1C,0x7CE7, +0x826F,0x8AD2,0x907C,0x91CF,0x9675,0x9818,0x529B,0x7DD1, +0x502B,0x5398,0x6797,0x6DCB,0x71D0,0x7433,0x81E8,0x8F2A, +0x96A3,0x9C57,0x9E9F,0x7460,0x5841,0x6D99,0x7D2F,0x985E, +0x4EE4,0x4F36,0x4F8B,0x51B7,0x52B1,0x5DBA,0x601C,0x73B2, +0x793C,0x82D3,0x9234,0x96B7,0x96F6,0x970A,0x9E97,0x9F62, +0x66A6,0x6B74,0x5217,0x52A3,0x70C8,0x88C2,0x5EC9,0x604B, +0x6190,0x6F23,0x7149,0x7C3E,0x7DF4,0x806F}; + +/* page 39 0x4F21-0x4F53 */ +static uint16 tab_jisx0208_uni39[]={ +0x84EE,0x9023,0x932C,0x5442,0x9B6F,0x6AD3,0x7089,0x8CC2, +0x8DEF,0x9732,0x52B4,0x5A41,0x5ECA,0x5F04,0x6717,0x697C, +0x6994,0x6D6A,0x6F0F,0x7262,0x72FC,0x7BED,0x8001,0x807E, +0x874B,0x90CE,0x516D,0x9E93,0x7984,0x808B,0x9332,0x8AD6, +0x502D,0x548C,0x8A71,0x6B6A,0x8CC4,0x8107,0x60D1,0x67A0, +0x9DF2,0x4E99,0x4E98,0x9C10,0x8A6B,0x85C1,0x8568,0x6900, +0x6E7E,0x7897,0x8155}; + +/* page 40 0x5021-0x507E */ +static uint16 tab_jisx0208_uni40[]={ +0x5F0C,0x4E10,0x4E15,0x4E2A,0x4E31,0x4E36,0x4E3C,0x4E3F, +0x4E42,0x4E56,0x4E58,0x4E82,0x4E85,0x8C6B,0x4E8A,0x8212, +0x5F0D,0x4E8E,0x4E9E,0x4E9F,0x4EA0,0x4EA2,0x4EB0,0x4EB3, +0x4EB6,0x4ECE,0x4ECD,0x4EC4,0x4EC6,0x4EC2,0x4ED7,0x4EDE, +0x4EED,0x4EDF,0x4EF7,0x4F09,0x4F5A,0x4F30,0x4F5B,0x4F5D, +0x4F57,0x4F47,0x4F76,0x4F88,0x4F8F,0x4F98,0x4F7B,0x4F69, +0x4F70,0x4F91,0x4F6F,0x4F86,0x4F96,0x5118,0x4FD4,0x4FDF, +0x4FCE,0x4FD8,0x4FDB,0x4FD1,0x4FDA,0x4FD0,0x4FE4,0x4FE5, +0x501A,0x5028,0x5014,0x502A,0x5025,0x5005,0x4F1C,0x4FF6, +0x5021,0x5029,0x502C,0x4FFE,0x4FEF,0x5011,0x5006,0x5043, +0x5047,0x6703,0x5055,0x5050,0x5048,0x505A,0x5056,0x506C, +0x5078,0x5080,0x509A,0x5085,0x50B4,0x50B2}; + +/* page 41 0x5121-0x517E */ +static uint16 tab_jisx0208_uni41[]={ +0x50C9,0x50CA,0x50B3,0x50C2,0x50D6,0x50DE,0x50E5,0x50ED, +0x50E3,0x50EE,0x50F9,0x50F5,0x5109,0x5101,0x5102,0x5116, +0x5115,0x5114,0x511A,0x5121,0x513A,0x5137,0x513C,0x513B, +0x513F,0x5140,0x5152,0x514C,0x5154,0x5162,0x7AF8,0x5169, +0x516A,0x516E,0x5180,0x5182,0x56D8,0x518C,0x5189,0x518F, +0x5191,0x5193,0x5195,0x5196,0x51A4,0x51A6,0x51A2,0x51A9, +0x51AA,0x51AB,0x51B3,0x51B1,0x51B2,0x51B0,0x51B5,0x51BD, +0x51C5,0x51C9,0x51DB,0x51E0,0x8655,0x51E9,0x51ED,0x51F0, +0x51F5,0x51FE,0x5204,0x520B,0x5214,0x520E,0x5227,0x522A, +0x522E,0x5233,0x5239,0x524F,0x5244,0x524B,0x524C,0x525E, +0x5254,0x526A,0x5274,0x5269,0x5273,0x527F,0x527D,0x528D, +0x5294,0x5292,0x5271,0x5288,0x5291,0x8FA8}; + +/* page 42 0x5221-0x527E */ +static uint16 tab_jisx0208_uni42[]={ +0x8FA7,0x52AC,0x52AD,0x52BC,0x52B5,0x52C1,0x52CD,0x52D7, +0x52DE,0x52E3,0x52E6,0x98ED,0x52E0,0x52F3,0x52F5,0x52F8, +0x52F9,0x5306,0x5308,0x7538,0x530D,0x5310,0x530F,0x5315, +0x531A,0x5323,0x532F,0x5331,0x5333,0x5338,0x5340,0x5346, +0x5345,0x4E17,0x5349,0x534D,0x51D6,0x535E,0x5369,0x536E, +0x5918,0x537B,0x5377,0x5382,0x5396,0x53A0,0x53A6,0x53A5, +0x53AE,0x53B0,0x53B6,0x53C3,0x7C12,0x96D9,0x53DF,0x66FC, +0x71EE,0x53EE,0x53E8,0x53ED,0x53FA,0x5401,0x543D,0x5440, +0x542C,0x542D,0x543C,0x542E,0x5436,0x5429,0x541D,0x544E, +0x548F,0x5475,0x548E,0x545F,0x5471,0x5477,0x5470,0x5492, +0x547B,0x5480,0x5476,0x5484,0x5490,0x5486,0x54C7,0x54A2, +0x54B8,0x54A5,0x54AC,0x54C4,0x54C8,0x54A8}; + +/* page 43 0x5321-0x537E */ +static uint16 tab_jisx0208_uni43[]={ +0x54AB,0x54C2,0x54A4,0x54BE,0x54BC,0x54D8,0x54E5,0x54E6, +0x550F,0x5514,0x54FD,0x54EE,0x54ED,0x54FA,0x54E2,0x5539, +0x5540,0x5563,0x554C,0x552E,0x555C,0x5545,0x5556,0x5557, +0x5538,0x5533,0x555D,0x5599,0x5580,0x54AF,0x558A,0x559F, +0x557B,0x557E,0x5598,0x559E,0x55AE,0x557C,0x5583,0x55A9, +0x5587,0x55A8,0x55DA,0x55C5,0x55DF,0x55C4,0x55DC,0x55E4, +0x55D4,0x5614,0x55F7,0x5616,0x55FE,0x55FD,0x561B,0x55F9, +0x564E,0x5650,0x71DF,0x5634,0x5636,0x5632,0x5638,0x566B, +0x5664,0x562F,0x566C,0x566A,0x5686,0x5680,0x568A,0x56A0, +0x5694,0x568F,0x56A5,0x56AE,0x56B6,0x56B4,0x56C2,0x56BC, +0x56C1,0x56C3,0x56C0,0x56C8,0x56CE,0x56D1,0x56D3,0x56D7, +0x56EE,0x56F9,0x5700,0x56FF,0x5704,0x5709}; + +/* page 44 0x5421-0x547E */ +static uint16 tab_jisx0208_uni44[]={ +0x5708,0x570B,0x570D,0x5713,0x5718,0x5716,0x55C7,0x571C, +0x5726,0x5737,0x5738,0x574E,0x573B,0x5740,0x574F,0x5769, +0x57C0,0x5788,0x5761,0x577F,0x5789,0x5793,0x57A0,0x57B3, +0x57A4,0x57AA,0x57B0,0x57C3,0x57C6,0x57D4,0x57D2,0x57D3, +0x580A,0x57D6,0x57E3,0x580B,0x5819,0x581D,0x5872,0x5821, +0x5862,0x584B,0x5870,0x6BC0,0x5852,0x583D,0x5879,0x5885, +0x58B9,0x589F,0x58AB,0x58BA,0x58DE,0x58BB,0x58B8,0x58AE, +0x58C5,0x58D3,0x58D1,0x58D7,0x58D9,0x58D8,0x58E5,0x58DC, +0x58E4,0x58DF,0x58EF,0x58FA,0x58F9,0x58FB,0x58FC,0x58FD, +0x5902,0x590A,0x5910,0x591B,0x68A6,0x5925,0x592C,0x592D, +0x5932,0x5938,0x593E,0x7AD2,0x5955,0x5950,0x594E,0x595A, +0x5958,0x5962,0x5960,0x5967,0x596C,0x5969}; + +/* page 45 0x5521-0x557E */ +static uint16 tab_jisx0208_uni45[]={ +0x5978,0x5981,0x599D,0x4F5E,0x4FAB,0x59A3,0x59B2,0x59C6, +0x59E8,0x59DC,0x598D,0x59D9,0x59DA,0x5A25,0x5A1F,0x5A11, +0x5A1C,0x5A09,0x5A1A,0x5A40,0x5A6C,0x5A49,0x5A35,0x5A36, +0x5A62,0x5A6A,0x5A9A,0x5ABC,0x5ABE,0x5ACB,0x5AC2,0x5ABD, +0x5AE3,0x5AD7,0x5AE6,0x5AE9,0x5AD6,0x5AFA,0x5AFB,0x5B0C, +0x5B0B,0x5B16,0x5B32,0x5AD0,0x5B2A,0x5B36,0x5B3E,0x5B43, +0x5B45,0x5B40,0x5B51,0x5B55,0x5B5A,0x5B5B,0x5B65,0x5B69, +0x5B70,0x5B73,0x5B75,0x5B78,0x6588,0x5B7A,0x5B80,0x5B83, +0x5BA6,0x5BB8,0x5BC3,0x5BC7,0x5BC9,0x5BD4,0x5BD0,0x5BE4, +0x5BE6,0x5BE2,0x5BDE,0x5BE5,0x5BEB,0x5BF0,0x5BF6,0x5BF3, +0x5C05,0x5C07,0x5C08,0x5C0D,0x5C13,0x5C20,0x5C22,0x5C28, +0x5C38,0x5C39,0x5C41,0x5C46,0x5C4E,0x5C53}; + +/* page 46 0x5621-0x567E */ +static uint16 tab_jisx0208_uni46[]={ +0x5C50,0x5C4F,0x5B71,0x5C6C,0x5C6E,0x4E62,0x5C76,0x5C79, +0x5C8C,0x5C91,0x5C94,0x599B,0x5CAB,0x5CBB,0x5CB6,0x5CBC, +0x5CB7,0x5CC5,0x5CBE,0x5CC7,0x5CD9,0x5CE9,0x5CFD,0x5CFA, +0x5CED,0x5D8C,0x5CEA,0x5D0B,0x5D15,0x5D17,0x5D5C,0x5D1F, +0x5D1B,0x5D11,0x5D14,0x5D22,0x5D1A,0x5D19,0x5D18,0x5D4C, +0x5D52,0x5D4E,0x5D4B,0x5D6C,0x5D73,0x5D76,0x5D87,0x5D84, +0x5D82,0x5DA2,0x5D9D,0x5DAC,0x5DAE,0x5DBD,0x5D90,0x5DB7, +0x5DBC,0x5DC9,0x5DCD,0x5DD3,0x5DD2,0x5DD6,0x5DDB,0x5DEB, +0x5DF2,0x5DF5,0x5E0B,0x5E1A,0x5E19,0x5E11,0x5E1B,0x5E36, +0x5E37,0x5E44,0x5E43,0x5E40,0x5E4E,0x5E57,0x5E54,0x5E5F, +0x5E62,0x5E64,0x5E47,0x5E75,0x5E76,0x5E7A,0x9EBC,0x5E7F, +0x5EA0,0x5EC1,0x5EC2,0x5EC8,0x5ED0,0x5ECF}; + +/* page 47 0x5721-0x577E */ +static uint16 tab_jisx0208_uni47[]={ +0x5ED6,0x5EE3,0x5EDD,0x5EDA,0x5EDB,0x5EE2,0x5EE1,0x5EE8, +0x5EE9,0x5EEC,0x5EF1,0x5EF3,0x5EF0,0x5EF4,0x5EF8,0x5EFE, +0x5F03,0x5F09,0x5F5D,0x5F5C,0x5F0B,0x5F11,0x5F16,0x5F29, +0x5F2D,0x5F38,0x5F41,0x5F48,0x5F4C,0x5F4E,0x5F2F,0x5F51, +0x5F56,0x5F57,0x5F59,0x5F61,0x5F6D,0x5F73,0x5F77,0x5F83, +0x5F82,0x5F7F,0x5F8A,0x5F88,0x5F91,0x5F87,0x5F9E,0x5F99, +0x5F98,0x5FA0,0x5FA8,0x5FAD,0x5FBC,0x5FD6,0x5FFB,0x5FE4, +0x5FF8,0x5FF1,0x5FDD,0x60B3,0x5FFF,0x6021,0x6060,0x6019, +0x6010,0x6029,0x600E,0x6031,0x601B,0x6015,0x602B,0x6026, +0x600F,0x603A,0x605A,0x6041,0x606A,0x6077,0x605F,0x604A, +0x6046,0x604D,0x6063,0x6043,0x6064,0x6042,0x606C,0x606B, +0x6059,0x6081,0x608D,0x60E7,0x6083,0x609A}; + +/* page 48 0x5821-0x587E */ +static uint16 tab_jisx0208_uni48[]={ +0x6084,0x609B,0x6096,0x6097,0x6092,0x60A7,0x608B,0x60E1, +0x60B8,0x60E0,0x60D3,0x60B4,0x5FF0,0x60BD,0x60C6,0x60B5, +0x60D8,0x614D,0x6115,0x6106,0x60F6,0x60F7,0x6100,0x60F4, +0x60FA,0x6103,0x6121,0x60FB,0x60F1,0x610D,0x610E,0x6147, +0x613E,0x6128,0x6127,0x614A,0x613F,0x613C,0x612C,0x6134, +0x613D,0x6142,0x6144,0x6173,0x6177,0x6158,0x6159,0x615A, +0x616B,0x6174,0x616F,0x6165,0x6171,0x615F,0x615D,0x6153, +0x6175,0x6199,0x6196,0x6187,0x61AC,0x6194,0x619A,0x618A, +0x6191,0x61AB,0x61AE,0x61CC,0x61CA,0x61C9,0x61F7,0x61C8, +0x61C3,0x61C6,0x61BA,0x61CB,0x7F79,0x61CD,0x61E6,0x61E3, +0x61F6,0x61FA,0x61F4,0x61FF,0x61FD,0x61FC,0x61FE,0x6200, +0x6208,0x6209,0x620D,0x620C,0x6214,0x621B}; + +/* page 49 0x5921-0x597E */ +static uint16 tab_jisx0208_uni49[]={ +0x621E,0x6221,0x622A,0x622E,0x6230,0x6232,0x6233,0x6241, +0x624E,0x625E,0x6263,0x625B,0x6260,0x6268,0x627C,0x6282, +0x6289,0x627E,0x6292,0x6293,0x6296,0x62D4,0x6283,0x6294, +0x62D7,0x62D1,0x62BB,0x62CF,0x62FF,0x62C6,0x64D4,0x62C8, +0x62DC,0x62CC,0x62CA,0x62C2,0x62C7,0x629B,0x62C9,0x630C, +0x62EE,0x62F1,0x6327,0x6302,0x6308,0x62EF,0x62F5,0x6350, +0x633E,0x634D,0x641C,0x634F,0x6396,0x638E,0x6380,0x63AB, +0x6376,0x63A3,0x638F,0x6389,0x639F,0x63B5,0x636B,0x6369, +0x63BE,0x63E9,0x63C0,0x63C6,0x63E3,0x63C9,0x63D2,0x63F6, +0x63C4,0x6416,0x6434,0x6406,0x6413,0x6426,0x6436,0x651D, +0x6417,0x6428,0x640F,0x6467,0x646F,0x6476,0x644E,0x652A, +0x6495,0x6493,0x64A5,0x64A9,0x6488,0x64BC}; + +/* page 50 0x5A21-0x5A7E */ +static uint16 tab_jisx0208_uni50[]={ +0x64DA,0x64D2,0x64C5,0x64C7,0x64BB,0x64D8,0x64C2,0x64F1, +0x64E7,0x8209,0x64E0,0x64E1,0x62AC,0x64E3,0x64EF,0x652C, +0x64F6,0x64F4,0x64F2,0x64FA,0x6500,0x64FD,0x6518,0x651C, +0x6505,0x6524,0x6523,0x652B,0x6534,0x6535,0x6537,0x6536, +0x6538,0x754B,0x6548,0x6556,0x6555,0x654D,0x6558,0x655E, +0x655D,0x6572,0x6578,0x6582,0x6583,0x8B8A,0x659B,0x659F, +0x65AB,0x65B7,0x65C3,0x65C6,0x65C1,0x65C4,0x65CC,0x65D2, +0x65DB,0x65D9,0x65E0,0x65E1,0x65F1,0x6772,0x660A,0x6603, +0x65FB,0x6773,0x6635,0x6636,0x6634,0x661C,0x664F,0x6644, +0x6649,0x6641,0x665E,0x665D,0x6664,0x6667,0x6668,0x665F, +0x6662,0x6670,0x6683,0x6688,0x668E,0x6689,0x6684,0x6698, +0x669D,0x66C1,0x66B9,0x66C9,0x66BE,0x66BC}; + +/* page 51 0x5B21-0x5B7E */ +static uint16 tab_jisx0208_uni51[]={ +0x66C4,0x66B8,0x66D6,0x66DA,0x66E0,0x663F,0x66E6,0x66E9, +0x66F0,0x66F5,0x66F7,0x670F,0x6716,0x671E,0x6726,0x6727, +0x9738,0x672E,0x673F,0x6736,0x6741,0x6738,0x6737,0x6746, +0x675E,0x6760,0x6759,0x6763,0x6764,0x6789,0x6770,0x67A9, +0x677C,0x676A,0x678C,0x678B,0x67A6,0x67A1,0x6785,0x67B7, +0x67EF,0x67B4,0x67EC,0x67B3,0x67E9,0x67B8,0x67E4,0x67DE, +0x67DD,0x67E2,0x67EE,0x67B9,0x67CE,0x67C6,0x67E7,0x6A9C, +0x681E,0x6846,0x6829,0x6840,0x684D,0x6832,0x684E,0x68B3, +0x682B,0x6859,0x6863,0x6877,0x687F,0x689F,0x688F,0x68AD, +0x6894,0x689D,0x689B,0x6883,0x6AAE,0x68B9,0x6874,0x68B5, +0x68A0,0x68BA,0x690F,0x688D,0x687E,0x6901,0x68CA,0x6908, +0x68D8,0x6922,0x6926,0x68E1,0x690C,0x68CD}; + +/* page 52 0x5C21-0x5C7E */ +static uint16 tab_jisx0208_uni52[]={ +0x68D4,0x68E7,0x68D5,0x6936,0x6912,0x6904,0x68D7,0x68E3, +0x6925,0x68F9,0x68E0,0x68EF,0x6928,0x692A,0x691A,0x6923, +0x6921,0x68C6,0x6979,0x6977,0x695C,0x6978,0x696B,0x6954, +0x697E,0x696E,0x6939,0x6974,0x693D,0x6959,0x6930,0x6961, +0x695E,0x695D,0x6981,0x696A,0x69B2,0x69AE,0x69D0,0x69BF, +0x69C1,0x69D3,0x69BE,0x69CE,0x5BE8,0x69CA,0x69DD,0x69BB, +0x69C3,0x69A7,0x6A2E,0x6991,0x69A0,0x699C,0x6995,0x69B4, +0x69DE,0x69E8,0x6A02,0x6A1B,0x69FF,0x6B0A,0x69F9,0x69F2, +0x69E7,0x6A05,0x69B1,0x6A1E,0x69ED,0x6A14,0x69EB,0x6A0A, +0x6A12,0x6AC1,0x6A23,0x6A13,0x6A44,0x6A0C,0x6A72,0x6A36, +0x6A78,0x6A47,0x6A62,0x6A59,0x6A66,0x6A48,0x6A38,0x6A22, +0x6A90,0x6A8D,0x6AA0,0x6A84,0x6AA2,0x6AA3}; + +/* page 53 0x5D21-0x5D7E */ +static uint16 tab_jisx0208_uni53[]={ +0x6A97,0x8617,0x6ABB,0x6AC3,0x6AC2,0x6AB8,0x6AB3,0x6AAC, +0x6ADE,0x6AD1,0x6ADF,0x6AAA,0x6ADA,0x6AEA,0x6AFB,0x6B05, +0x8616,0x6AFA,0x6B12,0x6B16,0x9B31,0x6B1F,0x6B38,0x6B37, +0x76DC,0x6B39,0x98EE,0x6B47,0x6B43,0x6B49,0x6B50,0x6B59, +0x6B54,0x6B5B,0x6B5F,0x6B61,0x6B78,0x6B79,0x6B7F,0x6B80, +0x6B84,0x6B83,0x6B8D,0x6B98,0x6B95,0x6B9E,0x6BA4,0x6BAA, +0x6BAB,0x6BAF,0x6BB2,0x6BB1,0x6BB3,0x6BB7,0x6BBC,0x6BC6, +0x6BCB,0x6BD3,0x6BDF,0x6BEC,0x6BEB,0x6BF3,0x6BEF,0x9EBE, +0x6C08,0x6C13,0x6C14,0x6C1B,0x6C24,0x6C23,0x6C5E,0x6C55, +0x6C62,0x6C6A,0x6C82,0x6C8D,0x6C9A,0x6C81,0x6C9B,0x6C7E, +0x6C68,0x6C73,0x6C92,0x6C90,0x6CC4,0x6CF1,0x6CD3,0x6CBD, +0x6CD7,0x6CC5,0x6CDD,0x6CAE,0x6CB1,0x6CBE}; + +/* page 54 0x5E21-0x5E7E */ +static uint16 tab_jisx0208_uni54[]={ +0x6CBA,0x6CDB,0x6CEF,0x6CD9,0x6CEA,0x6D1F,0x884D,0x6D36, +0x6D2B,0x6D3D,0x6D38,0x6D19,0x6D35,0x6D33,0x6D12,0x6D0C, +0x6D63,0x6D93,0x6D64,0x6D5A,0x6D79,0x6D59,0x6D8E,0x6D95, +0x6FE4,0x6D85,0x6DF9,0x6E15,0x6E0A,0x6DB5,0x6DC7,0x6DE6, +0x6DB8,0x6DC6,0x6DEC,0x6DDE,0x6DCC,0x6DE8,0x6DD2,0x6DC5, +0x6DFA,0x6DD9,0x6DE4,0x6DD5,0x6DEA,0x6DEE,0x6E2D,0x6E6E, +0x6E2E,0x6E19,0x6E72,0x6E5F,0x6E3E,0x6E23,0x6E6B,0x6E2B, +0x6E76,0x6E4D,0x6E1F,0x6E43,0x6E3A,0x6E4E,0x6E24,0x6EFF, +0x6E1D,0x6E38,0x6E82,0x6EAA,0x6E98,0x6EC9,0x6EB7,0x6ED3, +0x6EBD,0x6EAF,0x6EC4,0x6EB2,0x6ED4,0x6ED5,0x6E8F,0x6EA5, +0x6EC2,0x6E9F,0x6F41,0x6F11,0x704C,0x6EEC,0x6EF8,0x6EFE, +0x6F3F,0x6EF2,0x6F31,0x6EEF,0x6F32,0x6ECC}; + +/* page 55 0x5F21-0x5F7E */ +static uint16 tab_jisx0208_uni55[]={ +0x6F3E,0x6F13,0x6EF7,0x6F86,0x6F7A,0x6F78,0x6F81,0x6F80, +0x6F6F,0x6F5B,0x6FF3,0x6F6D,0x6F82,0x6F7C,0x6F58,0x6F8E, +0x6F91,0x6FC2,0x6F66,0x6FB3,0x6FA3,0x6FA1,0x6FA4,0x6FB9, +0x6FC6,0x6FAA,0x6FDF,0x6FD5,0x6FEC,0x6FD4,0x6FD8,0x6FF1, +0x6FEE,0x6FDB,0x7009,0x700B,0x6FFA,0x7011,0x7001,0x700F, +0x6FFE,0x701B,0x701A,0x6F74,0x701D,0x7018,0x701F,0x7030, +0x703E,0x7032,0x7051,0x7063,0x7099,0x7092,0x70AF,0x70F1, +0x70AC,0x70B8,0x70B3,0x70AE,0x70DF,0x70CB,0x70DD,0x70D9, +0x7109,0x70FD,0x711C,0x7119,0x7165,0x7155,0x7188,0x7166, +0x7162,0x714C,0x7156,0x716C,0x718F,0x71FB,0x7184,0x7195, +0x71A8,0x71AC,0x71D7,0x71B9,0x71BE,0x71D2,0x71C9,0x71D4, +0x71CE,0x71E0,0x71EC,0x71E7,0x71F5,0x71FC}; + +/* page 56 0x6021-0x607E */ +static uint16 tab_jisx0208_uni56[]={ +0x71F9,0x71FF,0x720D,0x7210,0x721B,0x7228,0x722D,0x722C, +0x7230,0x7232,0x723B,0x723C,0x723F,0x7240,0x7246,0x724B, +0x7258,0x7274,0x727E,0x7282,0x7281,0x7287,0x7292,0x7296, +0x72A2,0x72A7,0x72B9,0x72B2,0x72C3,0x72C6,0x72C4,0x72CE, +0x72D2,0x72E2,0x72E0,0x72E1,0x72F9,0x72F7,0x500F,0x7317, +0x730A,0x731C,0x7316,0x731D,0x7334,0x732F,0x7329,0x7325, +0x733E,0x734E,0x734F,0x9ED8,0x7357,0x736A,0x7368,0x7370, +0x7378,0x7375,0x737B,0x737A,0x73C8,0x73B3,0x73CE,0x73BB, +0x73C0,0x73E5,0x73EE,0x73DE,0x74A2,0x7405,0x746F,0x7425, +0x73F8,0x7432,0x743A,0x7455,0x743F,0x745F,0x7459,0x7441, +0x745C,0x7469,0x7470,0x7463,0x746A,0x7476,0x747E,0x748B, +0x749E,0x74A7,0x74CA,0x74CF,0x74D4,0x73F1}; + +/* page 57 0x6121-0x617E */ +static uint16 tab_jisx0208_uni57[]={ +0x74E0,0x74E3,0x74E7,0x74E9,0x74EE,0x74F2,0x74F0,0x74F1, +0x74F8,0x74F7,0x7504,0x7503,0x7505,0x750C,0x750E,0x750D, +0x7515,0x7513,0x751E,0x7526,0x752C,0x753C,0x7544,0x754D, +0x754A,0x7549,0x755B,0x7546,0x755A,0x7569,0x7564,0x7567, +0x756B,0x756D,0x7578,0x7576,0x7586,0x7587,0x7574,0x758A, +0x7589,0x7582,0x7594,0x759A,0x759D,0x75A5,0x75A3,0x75C2, +0x75B3,0x75C3,0x75B5,0x75BD,0x75B8,0x75BC,0x75B1,0x75CD, +0x75CA,0x75D2,0x75D9,0x75E3,0x75DE,0x75FE,0x75FF,0x75FC, +0x7601,0x75F0,0x75FA,0x75F2,0x75F3,0x760B,0x760D,0x7609, +0x761F,0x7627,0x7620,0x7621,0x7622,0x7624,0x7634,0x7630, +0x763B,0x7647,0x7648,0x7646,0x765C,0x7658,0x7661,0x7662, +0x7668,0x7669,0x766A,0x7667,0x766C,0x7670}; + +/* page 58 0x6221-0x627E */ +static uint16 tab_jisx0208_uni58[]={ +0x7672,0x7676,0x7678,0x767C,0x7680,0x7683,0x7688,0x768B, +0x768E,0x7696,0x7693,0x7699,0x769A,0x76B0,0x76B4,0x76B8, +0x76B9,0x76BA,0x76C2,0x76CD,0x76D6,0x76D2,0x76DE,0x76E1, +0x76E5,0x76E7,0x76EA,0x862F,0x76FB,0x7708,0x7707,0x7704, +0x7729,0x7724,0x771E,0x7725,0x7726,0x771B,0x7737,0x7738, +0x7747,0x775A,0x7768,0x776B,0x775B,0x7765,0x777F,0x777E, +0x7779,0x778E,0x778B,0x7791,0x77A0,0x779E,0x77B0,0x77B6, +0x77B9,0x77BF,0x77BC,0x77BD,0x77BB,0x77C7,0x77CD,0x77D7, +0x77DA,0x77DC,0x77E3,0x77EE,0x77FC,0x780C,0x7812,0x7926, +0x7820,0x792A,0x7845,0x788E,0x7874,0x7886,0x787C,0x789A, +0x788C,0x78A3,0x78B5,0x78AA,0x78AF,0x78D1,0x78C6,0x78CB, +0x78D4,0x78BE,0x78BC,0x78C5,0x78CA,0x78EC}; + +/* page 59 0x6321-0x637E */ +static uint16 tab_jisx0208_uni59[]={ +0x78E7,0x78DA,0x78FD,0x78F4,0x7907,0x7912,0x7911,0x7919, +0x792C,0x792B,0x7940,0x7960,0x7957,0x795F,0x795A,0x7955, +0x7953,0x797A,0x797F,0x798A,0x799D,0x79A7,0x9F4B,0x79AA, +0x79AE,0x79B3,0x79B9,0x79BA,0x79C9,0x79D5,0x79E7,0x79EC, +0x79E1,0x79E3,0x7A08,0x7A0D,0x7A18,0x7A19,0x7A20,0x7A1F, +0x7980,0x7A31,0x7A3B,0x7A3E,0x7A37,0x7A43,0x7A57,0x7A49, +0x7A61,0x7A62,0x7A69,0x9F9D,0x7A70,0x7A79,0x7A7D,0x7A88, +0x7A97,0x7A95,0x7A98,0x7A96,0x7AA9,0x7AC8,0x7AB0,0x7AB6, +0x7AC5,0x7AC4,0x7ABF,0x9083,0x7AC7,0x7ACA,0x7ACD,0x7ACF, +0x7AD5,0x7AD3,0x7AD9,0x7ADA,0x7ADD,0x7AE1,0x7AE2,0x7AE6, +0x7AED,0x7AF0,0x7B02,0x7B0F,0x7B0A,0x7B06,0x7B33,0x7B18, +0x7B19,0x7B1E,0x7B35,0x7B28,0x7B36,0x7B50}; + +/* page 60 0x6421-0x647E */ +static uint16 tab_jisx0208_uni60[]={ +0x7B7A,0x7B04,0x7B4D,0x7B0B,0x7B4C,0x7B45,0x7B75,0x7B65, +0x7B74,0x7B67,0x7B70,0x7B71,0x7B6C,0x7B6E,0x7B9D,0x7B98, +0x7B9F,0x7B8D,0x7B9C,0x7B9A,0x7B8B,0x7B92,0x7B8F,0x7B5D, +0x7B99,0x7BCB,0x7BC1,0x7BCC,0x7BCF,0x7BB4,0x7BC6,0x7BDD, +0x7BE9,0x7C11,0x7C14,0x7BE6,0x7BE5,0x7C60,0x7C00,0x7C07, +0x7C13,0x7BF3,0x7BF7,0x7C17,0x7C0D,0x7BF6,0x7C23,0x7C27, +0x7C2A,0x7C1F,0x7C37,0x7C2B,0x7C3D,0x7C4C,0x7C43,0x7C54, +0x7C4F,0x7C40,0x7C50,0x7C58,0x7C5F,0x7C64,0x7C56,0x7C65, +0x7C6C,0x7C75,0x7C83,0x7C90,0x7CA4,0x7CAD,0x7CA2,0x7CAB, +0x7CA1,0x7CA8,0x7CB3,0x7CB2,0x7CB1,0x7CAE,0x7CB9,0x7CBD, +0x7CC0,0x7CC5,0x7CC2,0x7CD8,0x7CD2,0x7CDC,0x7CE2,0x9B3B, +0x7CEF,0x7CF2,0x7CF4,0x7CF6,0x7CFA,0x7D06}; + +/* page 61 0x6521-0x657E */ +static uint16 tab_jisx0208_uni61[]={ +0x7D02,0x7D1C,0x7D15,0x7D0A,0x7D45,0x7D4B,0x7D2E,0x7D32, +0x7D3F,0x7D35,0x7D46,0x7D73,0x7D56,0x7D4E,0x7D72,0x7D68, +0x7D6E,0x7D4F,0x7D63,0x7D93,0x7D89,0x7D5B,0x7D8F,0x7D7D, +0x7D9B,0x7DBA,0x7DAE,0x7DA3,0x7DB5,0x7DC7,0x7DBD,0x7DAB, +0x7E3D,0x7DA2,0x7DAF,0x7DDC,0x7DB8,0x7D9F,0x7DB0,0x7DD8, +0x7DDD,0x7DE4,0x7DDE,0x7DFB,0x7DF2,0x7DE1,0x7E05,0x7E0A, +0x7E23,0x7E21,0x7E12,0x7E31,0x7E1F,0x7E09,0x7E0B,0x7E22, +0x7E46,0x7E66,0x7E3B,0x7E35,0x7E39,0x7E43,0x7E37,0x7E32, +0x7E3A,0x7E67,0x7E5D,0x7E56,0x7E5E,0x7E59,0x7E5A,0x7E79, +0x7E6A,0x7E69,0x7E7C,0x7E7B,0x7E83,0x7DD5,0x7E7D,0x8FAE, +0x7E7F,0x7E88,0x7E89,0x7E8C,0x7E92,0x7E90,0x7E93,0x7E94, +0x7E96,0x7E8E,0x7E9B,0x7E9C,0x7F38,0x7F3A}; + +/* page 62 0x6621-0x667E */ +static uint16 tab_jisx0208_uni62[]={ +0x7F45,0x7F4C,0x7F4D,0x7F4E,0x7F50,0x7F51,0x7F55,0x7F54, +0x7F58,0x7F5F,0x7F60,0x7F68,0x7F69,0x7F67,0x7F78,0x7F82, +0x7F86,0x7F83,0x7F88,0x7F87,0x7F8C,0x7F94,0x7F9E,0x7F9D, +0x7F9A,0x7FA3,0x7FAF,0x7FB2,0x7FB9,0x7FAE,0x7FB6,0x7FB8, +0x8B71,0x7FC5,0x7FC6,0x7FCA,0x7FD5,0x7FD4,0x7FE1,0x7FE6, +0x7FE9,0x7FF3,0x7FF9,0x98DC,0x8006,0x8004,0x800B,0x8012, +0x8018,0x8019,0x801C,0x8021,0x8028,0x803F,0x803B,0x804A, +0x8046,0x8052,0x8058,0x805A,0x805F,0x8062,0x8068,0x8073, +0x8072,0x8070,0x8076,0x8079,0x807D,0x807F,0x8084,0x8086, +0x8085,0x809B,0x8093,0x809A,0x80AD,0x5190,0x80AC,0x80DB, +0x80E5,0x80D9,0x80DD,0x80C4,0x80DA,0x80D6,0x8109,0x80EF, +0x80F1,0x811B,0x8129,0x8123,0x812F,0x814B}; + +/* page 63 0x6721-0x677E */ +static uint16 tab_jisx0208_uni63[]={ +0x968B,0x8146,0x813E,0x8153,0x8151,0x80FC,0x8171,0x816E, +0x8165,0x8166,0x8174,0x8183,0x8188,0x818A,0x8180,0x8182, +0x81A0,0x8195,0x81A4,0x81A3,0x815F,0x8193,0x81A9,0x81B0, +0x81B5,0x81BE,0x81B8,0x81BD,0x81C0,0x81C2,0x81BA,0x81C9, +0x81CD,0x81D1,0x81D9,0x81D8,0x81C8,0x81DA,0x81DF,0x81E0, +0x81E7,0x81FA,0x81FB,0x81FE,0x8201,0x8202,0x8205,0x8207, +0x820A,0x820D,0x8210,0x8216,0x8229,0x822B,0x8238,0x8233, +0x8240,0x8259,0x8258,0x825D,0x825A,0x825F,0x8264,0x8262, +0x8268,0x826A,0x826B,0x822E,0x8271,0x8277,0x8278,0x827E, +0x828D,0x8292,0x82AB,0x829F,0x82BB,0x82AC,0x82E1,0x82E3, +0x82DF,0x82D2,0x82F4,0x82F3,0x82FA,0x8393,0x8303,0x82FB, +0x82F9,0x82DE,0x8306,0x82DC,0x8309,0x82D9}; + +/* page 64 0x6821-0x687E */ +static uint16 tab_jisx0208_uni64[]={ +0x8335,0x8334,0x8316,0x8332,0x8331,0x8340,0x8339,0x8350, +0x8345,0x832F,0x832B,0x8317,0x8318,0x8385,0x839A,0x83AA, +0x839F,0x83A2,0x8396,0x8323,0x838E,0x8387,0x838A,0x837C, +0x83B5,0x8373,0x8375,0x83A0,0x8389,0x83A8,0x83F4,0x8413, +0x83EB,0x83CE,0x83FD,0x8403,0x83D8,0x840B,0x83C1,0x83F7, +0x8407,0x83E0,0x83F2,0x840D,0x8422,0x8420,0x83BD,0x8438, +0x8506,0x83FB,0x846D,0x842A,0x843C,0x855A,0x8484,0x8477, +0x846B,0x84AD,0x846E,0x8482,0x8469,0x8446,0x842C,0x846F, +0x8479,0x8435,0x84CA,0x8462,0x84B9,0x84BF,0x849F,0x84D9, +0x84CD,0x84BB,0x84DA,0x84D0,0x84C1,0x84C6,0x84D6,0x84A1, +0x8521,0x84FF,0x84F4,0x8517,0x8518,0x852C,0x851F,0x8515, +0x8514,0x84FC,0x8540,0x8563,0x8558,0x8548}; + +/* page 65 0x6921-0x697E */ +static uint16 tab_jisx0208_uni65[]={ +0x8541,0x8602,0x854B,0x8555,0x8580,0x85A4,0x8588,0x8591, +0x858A,0x85A8,0x856D,0x8594,0x859B,0x85EA,0x8587,0x859C, +0x8577,0x857E,0x8590,0x85C9,0x85BA,0x85CF,0x85B9,0x85D0, +0x85D5,0x85DD,0x85E5,0x85DC,0x85F9,0x860A,0x8613,0x860B, +0x85FE,0x85FA,0x8606,0x8622,0x861A,0x8630,0x863F,0x864D, +0x4E55,0x8654,0x865F,0x8667,0x8671,0x8693,0x86A3,0x86A9, +0x86AA,0x868B,0x868C,0x86B6,0x86AF,0x86C4,0x86C6,0x86B0, +0x86C9,0x8823,0x86AB,0x86D4,0x86DE,0x86E9,0x86EC,0x86DF, +0x86DB,0x86EF,0x8712,0x8706,0x8708,0x8700,0x8703,0x86FB, +0x8711,0x8709,0x870D,0x86F9,0x870A,0x8734,0x873F,0x8737, +0x873B,0x8725,0x8729,0x871A,0x8760,0x875F,0x8778,0x874C, +0x874E,0x8774,0x8757,0x8768,0x876E,0x8759}; + +/* page 66 0x6A21-0x6A7E */ +static uint16 tab_jisx0208_uni66[]={ +0x8753,0x8763,0x876A,0x8805,0x87A2,0x879F,0x8782,0x87AF, +0x87CB,0x87BD,0x87C0,0x87D0,0x96D6,0x87AB,0x87C4,0x87B3, +0x87C7,0x87C6,0x87BB,0x87EF,0x87F2,0x87E0,0x880F,0x880D, +0x87FE,0x87F6,0x87F7,0x880E,0x87D2,0x8811,0x8816,0x8815, +0x8822,0x8821,0x8831,0x8836,0x8839,0x8827,0x883B,0x8844, +0x8842,0x8852,0x8859,0x885E,0x8862,0x886B,0x8881,0x887E, +0x889E,0x8875,0x887D,0x88B5,0x8872,0x8882,0x8897,0x8892, +0x88AE,0x8899,0x88A2,0x888D,0x88A4,0x88B0,0x88BF,0x88B1, +0x88C3,0x88C4,0x88D4,0x88D8,0x88D9,0x88DD,0x88F9,0x8902, +0x88FC,0x88F4,0x88E8,0x88F2,0x8904,0x890C,0x890A,0x8913, +0x8943,0x891E,0x8925,0x892A,0x892B,0x8941,0x8944,0x893B, +0x8936,0x8938,0x894C,0x891D,0x8960,0x895E}; + +/* page 67 0x6B21-0x6B7E */ +static uint16 tab_jisx0208_uni67[]={ +0x8966,0x8964,0x896D,0x896A,0x896F,0x8974,0x8977,0x897E, +0x8983,0x8988,0x898A,0x8993,0x8998,0x89A1,0x89A9,0x89A6, +0x89AC,0x89AF,0x89B2,0x89BA,0x89BD,0x89BF,0x89C0,0x89DA, +0x89DC,0x89DD,0x89E7,0x89F4,0x89F8,0x8A03,0x8A16,0x8A10, +0x8A0C,0x8A1B,0x8A1D,0x8A25,0x8A36,0x8A41,0x8A5B,0x8A52, +0x8A46,0x8A48,0x8A7C,0x8A6D,0x8A6C,0x8A62,0x8A85,0x8A82, +0x8A84,0x8AA8,0x8AA1,0x8A91,0x8AA5,0x8AA6,0x8A9A,0x8AA3, +0x8AC4,0x8ACD,0x8AC2,0x8ADA,0x8AEB,0x8AF3,0x8AE7,0x8AE4, +0x8AF1,0x8B14,0x8AE0,0x8AE2,0x8AF7,0x8ADE,0x8ADB,0x8B0C, +0x8B07,0x8B1A,0x8AE1,0x8B16,0x8B10,0x8B17,0x8B20,0x8B33, +0x97AB,0x8B26,0x8B2B,0x8B3E,0x8B28,0x8B41,0x8B4C,0x8B4F, +0x8B4E,0x8B49,0x8B56,0x8B5B,0x8B5A,0x8B6B}; + +/* page 68 0x6C21-0x6C7E */ +static uint16 tab_jisx0208_uni68[]={ +0x8B5F,0x8B6C,0x8B6F,0x8B74,0x8B7D,0x8B80,0x8B8C,0x8B8E, +0x8B92,0x8B93,0x8B96,0x8B99,0x8B9A,0x8C3A,0x8C41,0x8C3F, +0x8C48,0x8C4C,0x8C4E,0x8C50,0x8C55,0x8C62,0x8C6C,0x8C78, +0x8C7A,0x8C82,0x8C89,0x8C85,0x8C8A,0x8C8D,0x8C8E,0x8C94, +0x8C7C,0x8C98,0x621D,0x8CAD,0x8CAA,0x8CBD,0x8CB2,0x8CB3, +0x8CAE,0x8CB6,0x8CC8,0x8CC1,0x8CE4,0x8CE3,0x8CDA,0x8CFD, +0x8CFA,0x8CFB,0x8D04,0x8D05,0x8D0A,0x8D07,0x8D0F,0x8D0D, +0x8D10,0x9F4E,0x8D13,0x8CCD,0x8D14,0x8D16,0x8D67,0x8D6D, +0x8D71,0x8D73,0x8D81,0x8D99,0x8DC2,0x8DBE,0x8DBA,0x8DCF, +0x8DDA,0x8DD6,0x8DCC,0x8DDB,0x8DCB,0x8DEA,0x8DEB,0x8DDF, +0x8DE3,0x8DFC,0x8E08,0x8E09,0x8DFF,0x8E1D,0x8E1E,0x8E10, +0x8E1F,0x8E42,0x8E35,0x8E30,0x8E34,0x8E4A}; + +/* page 69 0x6D21-0x6D7E */ +static uint16 tab_jisx0208_uni69[]={ +0x8E47,0x8E49,0x8E4C,0x8E50,0x8E48,0x8E59,0x8E64,0x8E60, +0x8E2A,0x8E63,0x8E55,0x8E76,0x8E72,0x8E7C,0x8E81,0x8E87, +0x8E85,0x8E84,0x8E8B,0x8E8A,0x8E93,0x8E91,0x8E94,0x8E99, +0x8EAA,0x8EA1,0x8EAC,0x8EB0,0x8EC6,0x8EB1,0x8EBE,0x8EC5, +0x8EC8,0x8ECB,0x8EDB,0x8EE3,0x8EFC,0x8EFB,0x8EEB,0x8EFE, +0x8F0A,0x8F05,0x8F15,0x8F12,0x8F19,0x8F13,0x8F1C,0x8F1F, +0x8F1B,0x8F0C,0x8F26,0x8F33,0x8F3B,0x8F39,0x8F45,0x8F42, +0x8F3E,0x8F4C,0x8F49,0x8F46,0x8F4E,0x8F57,0x8F5C,0x8F62, +0x8F63,0x8F64,0x8F9C,0x8F9F,0x8FA3,0x8FAD,0x8FAF,0x8FB7, +0x8FDA,0x8FE5,0x8FE2,0x8FEA,0x8FEF,0x9087,0x8FF4,0x9005, +0x8FF9,0x8FFA,0x9011,0x9015,0x9021,0x900D,0x901E,0x9016, +0x900B,0x9027,0x9036,0x9035,0x9039,0x8FF8}; + +/* page 70 0x6E21-0x6E7E */ +static uint16 tab_jisx0208_uni70[]={ +0x904F,0x9050,0x9051,0x9052,0x900E,0x9049,0x903E,0x9056, +0x9058,0x905E,0x9068,0x906F,0x9076,0x96A8,0x9072,0x9082, +0x907D,0x9081,0x9080,0x908A,0x9089,0x908F,0x90A8,0x90AF, +0x90B1,0x90B5,0x90E2,0x90E4,0x6248,0x90DB,0x9102,0x9112, +0x9119,0x9132,0x9130,0x914A,0x9156,0x9158,0x9163,0x9165, +0x9169,0x9173,0x9172,0x918B,0x9189,0x9182,0x91A2,0x91AB, +0x91AF,0x91AA,0x91B5,0x91B4,0x91BA,0x91C0,0x91C1,0x91C9, +0x91CB,0x91D0,0x91D6,0x91DF,0x91E1,0x91DB,0x91FC,0x91F5, +0x91F6,0x921E,0x91FF,0x9214,0x922C,0x9215,0x9211,0x925E, +0x9257,0x9245,0x9249,0x9264,0x9248,0x9295,0x923F,0x924B, +0x9250,0x929C,0x9296,0x9293,0x929B,0x925A,0x92CF,0x92B9, +0x92B7,0x92E9,0x930F,0x92FA,0x9344,0x932E}; + +/* page 71 0x6F21-0x6F7E */ +static uint16 tab_jisx0208_uni71[]={ +0x9319,0x9322,0x931A,0x9323,0x933A,0x9335,0x933B,0x935C, +0x9360,0x937C,0x936E,0x9356,0x93B0,0x93AC,0x93AD,0x9394, +0x93B9,0x93D6,0x93D7,0x93E8,0x93E5,0x93D8,0x93C3,0x93DD, +0x93D0,0x93C8,0x93E4,0x941A,0x9414,0x9413,0x9403,0x9407, +0x9410,0x9436,0x942B,0x9435,0x9421,0x943A,0x9441,0x9452, +0x9444,0x945B,0x9460,0x9462,0x945E,0x946A,0x9229,0x9470, +0x9475,0x9477,0x947D,0x945A,0x947C,0x947E,0x9481,0x947F, +0x9582,0x9587,0x958A,0x9594,0x9596,0x9598,0x9599,0x95A0, +0x95A8,0x95A7,0x95AD,0x95BC,0x95BB,0x95B9,0x95BE,0x95CA, +0x6FF6,0x95C3,0x95CD,0x95CC,0x95D5,0x95D4,0x95D6,0x95DC, +0x95E1,0x95E5,0x95E2,0x9621,0x9628,0x962E,0x962F,0x9642, +0x964C,0x964F,0x964B,0x9677,0x965C,0x965E}; + +/* page 72 0x7021-0x707E */ +static uint16 tab_jisx0208_uni72[]={ +0x965D,0x965F,0x9666,0x9672,0x966C,0x968D,0x9698,0x9695, +0x9697,0x96AA,0x96A7,0x96B1,0x96B2,0x96B0,0x96B4,0x96B6, +0x96B8,0x96B9,0x96CE,0x96CB,0x96C9,0x96CD,0x894D,0x96DC, +0x970D,0x96D5,0x96F9,0x9704,0x9706,0x9708,0x9713,0x970E, +0x9711,0x970F,0x9716,0x9719,0x9724,0x972A,0x9730,0x9739, +0x973D,0x973E,0x9744,0x9746,0x9748,0x9742,0x9749,0x975C, +0x9760,0x9764,0x9766,0x9768,0x52D2,0x976B,0x9771,0x9779, +0x9785,0x977C,0x9781,0x977A,0x9786,0x978B,0x978F,0x9790, +0x979C,0x97A8,0x97A6,0x97A3,0x97B3,0x97B4,0x97C3,0x97C6, +0x97C8,0x97CB,0x97DC,0x97ED,0x9F4F,0x97F2,0x7ADF,0x97F6, +0x97F5,0x980F,0x980C,0x9838,0x9824,0x9821,0x9837,0x983D, +0x9846,0x984F,0x984B,0x986B,0x986F,0x9870}; + +/* page 73 0x7121-0x717E */ +static uint16 tab_jisx0208_uni73[]={ +0x9871,0x9874,0x9873,0x98AA,0x98AF,0x98B1,0x98B6,0x98C4, +0x98C3,0x98C6,0x98E9,0x98EB,0x9903,0x9909,0x9912,0x9914, +0x9918,0x9921,0x991D,0x991E,0x9924,0x9920,0x992C,0x992E, +0x993D,0x993E,0x9942,0x9949,0x9945,0x9950,0x994B,0x9951, +0x9952,0x994C,0x9955,0x9997,0x9998,0x99A5,0x99AD,0x99AE, +0x99BC,0x99DF,0x99DB,0x99DD,0x99D8,0x99D1,0x99ED,0x99EE, +0x99F1,0x99F2,0x99FB,0x99F8,0x9A01,0x9A0F,0x9A05,0x99E2, +0x9A19,0x9A2B,0x9A37,0x9A45,0x9A42,0x9A40,0x9A43,0x9A3E, +0x9A55,0x9A4D,0x9A5B,0x9A57,0x9A5F,0x9A62,0x9A65,0x9A64, +0x9A69,0x9A6B,0x9A6A,0x9AAD,0x9AB0,0x9ABC,0x9AC0,0x9ACF, +0x9AD1,0x9AD3,0x9AD4,0x9ADE,0x9ADF,0x9AE2,0x9AE3,0x9AE6, +0x9AEF,0x9AEB,0x9AEE,0x9AF4,0x9AF1,0x9AF7}; + +/* page 74 0x7221-0x727E */ +static uint16 tab_jisx0208_uni74[]={ +0x9AFB,0x9B06,0x9B18,0x9B1A,0x9B1F,0x9B22,0x9B23,0x9B25, +0x9B27,0x9B28,0x9B29,0x9B2A,0x9B2E,0x9B2F,0x9B32,0x9B44, +0x9B43,0x9B4F,0x9B4D,0x9B4E,0x9B51,0x9B58,0x9B74,0x9B93, +0x9B83,0x9B91,0x9B96,0x9B97,0x9B9F,0x9BA0,0x9BA8,0x9BB4, +0x9BC0,0x9BCA,0x9BB9,0x9BC6,0x9BCF,0x9BD1,0x9BD2,0x9BE3, +0x9BE2,0x9BE4,0x9BD4,0x9BE1,0x9C3A,0x9BF2,0x9BF1,0x9BF0, +0x9C15,0x9C14,0x9C09,0x9C13,0x9C0C,0x9C06,0x9C08,0x9C12, +0x9C0A,0x9C04,0x9C2E,0x9C1B,0x9C25,0x9C24,0x9C21,0x9C30, +0x9C47,0x9C32,0x9C46,0x9C3E,0x9C5A,0x9C60,0x9C67,0x9C76, +0x9C78,0x9CE7,0x9CEC,0x9CF0,0x9D09,0x9D08,0x9CEB,0x9D03, +0x9D06,0x9D2A,0x9D26,0x9DAF,0x9D23,0x9D1F,0x9D44,0x9D15, +0x9D12,0x9D41,0x9D3F,0x9D3E,0x9D46,0x9D48}; + +/* page 75 0x7321-0x737E */ +static uint16 tab_jisx0208_uni75[]={ +0x9D5D,0x9D5E,0x9D64,0x9D51,0x9D50,0x9D59,0x9D72,0x9D89, +0x9D87,0x9DAB,0x9D6F,0x9D7A,0x9D9A,0x9DA4,0x9DA9,0x9DB2, +0x9DC4,0x9DC1,0x9DBB,0x9DB8,0x9DBA,0x9DC6,0x9DCF,0x9DC2, +0x9DD9,0x9DD3,0x9DF8,0x9DE6,0x9DED,0x9DEF,0x9DFD,0x9E1A, +0x9E1B,0x9E1E,0x9E75,0x9E79,0x9E7D,0x9E81,0x9E88,0x9E8B, +0x9E8C,0x9E92,0x9E95,0x9E91,0x9E9D,0x9EA5,0x9EA9,0x9EB8, +0x9EAA,0x9EAD,0x9761,0x9ECC,0x9ECE,0x9ECF,0x9ED0,0x9ED4, +0x9EDC,0x9EDE,0x9EDD,0x9EE0,0x9EE5,0x9EE8,0x9EEF,0x9EF4, +0x9EF6,0x9EF7,0x9EF9,0x9EFB,0x9EFC,0x9EFD,0x9F07,0x9F08, +0x76B7,0x9F15,0x9F21,0x9F2C,0x9F3E,0x9F4A,0x9F52,0x9F54, +0x9F63,0x9F5F,0x9F60,0x9F61,0x9F66,0x9F67,0x9F6C,0x9F6A, +0x9F77,0x9F72,0x9F76,0x9F95,0x9F9C,0x9FA0}; + +/* page 76 0x7421-0x7426 */ +static uint16 tab_jisx0208_uni76[]={ +0x582F,0x69C7,0x9059,0x7464,0x51DC,0x7199}; + +static int +my_jisx0208_uni_onechar(int code){ + if ((code>=0x2121)&&(code<=0x217E)) + return(tab_jisx0208_uni0[code-0x2121]); + if ((code>=0x2221)&&(code<=0x227E)) + return(tab_jisx0208_uni1[code-0x2221]); + if ((code>=0x2330)&&(code<=0x237A)) + return(tab_jisx0208_uni2[code-0x2330]); + if ((code>=0x2421)&&(code<=0x2473)) + return(tab_jisx0208_uni3[code-0x2421]); + if ((code>=0x2521)&&(code<=0x2576)) + return(tab_jisx0208_uni4[code-0x2521]); + if ((code>=0x2621)&&(code<=0x2658)) + return(tab_jisx0208_uni5[code-0x2621]); + if ((code>=0x2721)&&(code<=0x2771)) + return(tab_jisx0208_uni6[code-0x2721]); + if ((code>=0x2821)&&(code<=0x2840)) + return(tab_jisx0208_uni7[code-0x2821]); + if ((code>=0x3021)&&(code<=0x307E)) + return(tab_jisx0208_uni8[code-0x3021]); + if ((code>=0x3121)&&(code<=0x317E)) + return(tab_jisx0208_uni9[code-0x3121]); + if ((code>=0x3221)&&(code<=0x327E)) + return(tab_jisx0208_uni10[code-0x3221]); + if ((code>=0x3321)&&(code<=0x337E)) + return(tab_jisx0208_uni11[code-0x3321]); + if ((code>=0x3421)&&(code<=0x347E)) + return(tab_jisx0208_uni12[code-0x3421]); + if ((code>=0x3521)&&(code<=0x357E)) + return(tab_jisx0208_uni13[code-0x3521]); + if ((code>=0x3621)&&(code<=0x367E)) + return(tab_jisx0208_uni14[code-0x3621]); + if ((code>=0x3721)&&(code<=0x377E)) + return(tab_jisx0208_uni15[code-0x3721]); + if ((code>=0x3821)&&(code<=0x387E)) + return(tab_jisx0208_uni16[code-0x3821]); + if ((code>=0x3921)&&(code<=0x397E)) + return(tab_jisx0208_uni17[code-0x3921]); + if ((code>=0x3A21)&&(code<=0x3A7E)) + return(tab_jisx0208_uni18[code-0x3A21]); + if ((code>=0x3B21)&&(code<=0x3B7E)) + return(tab_jisx0208_uni19[code-0x3B21]); + if ((code>=0x3C21)&&(code<=0x3C7E)) + return(tab_jisx0208_uni20[code-0x3C21]); + if ((code>=0x3D21)&&(code<=0x3D7E)) + return(tab_jisx0208_uni21[code-0x3D21]); + if ((code>=0x3E21)&&(code<=0x3E7E)) + return(tab_jisx0208_uni22[code-0x3E21]); + if ((code>=0x3F21)&&(code<=0x3F7E)) + return(tab_jisx0208_uni23[code-0x3F21]); + if ((code>=0x4021)&&(code<=0x407E)) + return(tab_jisx0208_uni24[code-0x4021]); + if ((code>=0x4121)&&(code<=0x417E)) + return(tab_jisx0208_uni25[code-0x4121]); + if ((code>=0x4221)&&(code<=0x427E)) + return(tab_jisx0208_uni26[code-0x4221]); + if ((code>=0x4321)&&(code<=0x437E)) + return(tab_jisx0208_uni27[code-0x4321]); + if ((code>=0x4421)&&(code<=0x447E)) + return(tab_jisx0208_uni28[code-0x4421]); + if ((code>=0x4521)&&(code<=0x457E)) + return(tab_jisx0208_uni29[code-0x4521]); + if ((code>=0x4621)&&(code<=0x467E)) + return(tab_jisx0208_uni30[code-0x4621]); + if ((code>=0x4721)&&(code<=0x477E)) + return(tab_jisx0208_uni31[code-0x4721]); + if ((code>=0x4821)&&(code<=0x487E)) + return(tab_jisx0208_uni32[code-0x4821]); + if ((code>=0x4921)&&(code<=0x497E)) + return(tab_jisx0208_uni33[code-0x4921]); + if ((code>=0x4A21)&&(code<=0x4A7E)) + return(tab_jisx0208_uni34[code-0x4A21]); + if ((code>=0x4B21)&&(code<=0x4B7E)) + return(tab_jisx0208_uni35[code-0x4B21]); + if ((code>=0x4C21)&&(code<=0x4C7E)) + return(tab_jisx0208_uni36[code-0x4C21]); + if ((code>=0x4D21)&&(code<=0x4D7E)) + return(tab_jisx0208_uni37[code-0x4D21]); + if ((code>=0x4E21)&&(code<=0x4E7E)) + return(tab_jisx0208_uni38[code-0x4E21]); + if ((code>=0x4F21)&&(code<=0x4F53)) + return(tab_jisx0208_uni39[code-0x4F21]); + if ((code>=0x5021)&&(code<=0x507E)) + return(tab_jisx0208_uni40[code-0x5021]); + if ((code>=0x5121)&&(code<=0x517E)) + return(tab_jisx0208_uni41[code-0x5121]); + if ((code>=0x5221)&&(code<=0x527E)) + return(tab_jisx0208_uni42[code-0x5221]); + if ((code>=0x5321)&&(code<=0x537E)) + return(tab_jisx0208_uni43[code-0x5321]); + if ((code>=0x5421)&&(code<=0x547E)) + return(tab_jisx0208_uni44[code-0x5421]); + if ((code>=0x5521)&&(code<=0x557E)) + return(tab_jisx0208_uni45[code-0x5521]); + if ((code>=0x5621)&&(code<=0x567E)) + return(tab_jisx0208_uni46[code-0x5621]); + if ((code>=0x5721)&&(code<=0x577E)) + return(tab_jisx0208_uni47[code-0x5721]); + if ((code>=0x5821)&&(code<=0x587E)) + return(tab_jisx0208_uni48[code-0x5821]); + if ((code>=0x5921)&&(code<=0x597E)) + return(tab_jisx0208_uni49[code-0x5921]); + if ((code>=0x5A21)&&(code<=0x5A7E)) + return(tab_jisx0208_uni50[code-0x5A21]); + if ((code>=0x5B21)&&(code<=0x5B7E)) + return(tab_jisx0208_uni51[code-0x5B21]); + if ((code>=0x5C21)&&(code<=0x5C7E)) + return(tab_jisx0208_uni52[code-0x5C21]); + if ((code>=0x5D21)&&(code<=0x5D7E)) + return(tab_jisx0208_uni53[code-0x5D21]); + if ((code>=0x5E21)&&(code<=0x5E7E)) + return(tab_jisx0208_uni54[code-0x5E21]); + if ((code>=0x5F21)&&(code<=0x5F7E)) + return(tab_jisx0208_uni55[code-0x5F21]); + if ((code>=0x6021)&&(code<=0x607E)) + return(tab_jisx0208_uni56[code-0x6021]); + if ((code>=0x6121)&&(code<=0x617E)) + return(tab_jisx0208_uni57[code-0x6121]); + if ((code>=0x6221)&&(code<=0x627E)) + return(tab_jisx0208_uni58[code-0x6221]); + if ((code>=0x6321)&&(code<=0x637E)) + return(tab_jisx0208_uni59[code-0x6321]); + if ((code>=0x6421)&&(code<=0x647E)) + return(tab_jisx0208_uni60[code-0x6421]); + if ((code>=0x6521)&&(code<=0x657E)) + return(tab_jisx0208_uni61[code-0x6521]); + if ((code>=0x6621)&&(code<=0x667E)) + return(tab_jisx0208_uni62[code-0x6621]); + if ((code>=0x6721)&&(code<=0x677E)) + return(tab_jisx0208_uni63[code-0x6721]); + if ((code>=0x6821)&&(code<=0x687E)) + return(tab_jisx0208_uni64[code-0x6821]); + if ((code>=0x6921)&&(code<=0x697E)) + return(tab_jisx0208_uni65[code-0x6921]); + if ((code>=0x6A21)&&(code<=0x6A7E)) + return(tab_jisx0208_uni66[code-0x6A21]); + if ((code>=0x6B21)&&(code<=0x6B7E)) + return(tab_jisx0208_uni67[code-0x6B21]); + if ((code>=0x6C21)&&(code<=0x6C7E)) + return(tab_jisx0208_uni68[code-0x6C21]); + if ((code>=0x6D21)&&(code<=0x6D7E)) + return(tab_jisx0208_uni69[code-0x6D21]); + if ((code>=0x6E21)&&(code<=0x6E7E)) + return(tab_jisx0208_uni70[code-0x6E21]); + if ((code>=0x6F21)&&(code<=0x6F7E)) + return(tab_jisx0208_uni71[code-0x6F21]); + if ((code>=0x7021)&&(code<=0x707E)) + return(tab_jisx0208_uni72[code-0x7021]); + if ((code>=0x7121)&&(code<=0x717E)) + return(tab_jisx0208_uni73[code-0x7121]); + if ((code>=0x7221)&&(code<=0x727E)) + return(tab_jisx0208_uni74[code-0x7221]); + if ((code>=0x7321)&&(code<=0x737E)) + return(tab_jisx0208_uni75[code-0x7321]); + if ((code>=0x7421)&&(code<=0x7426)) + return(tab_jisx0208_uni76[code-0x7421]); + return(0); +} + + +/* page 0 0x005C-0x005C */ +static uint16 tab_uni_jisx02080[]={ +0x2140}; + +/* page 1 0x00A2-0x00B6 */ +static uint16 tab_uni_jisx02081[]={ +0x2171,0x2172, 0, 0, 0,0x2178,0x212F, 0, + 0, 0,0x224C, 0, 0, 0,0x216B,0x215E, + 0, 0,0x212D, 0,0x2279}; + +/* page 2 0x00D7-0x00D7 */ +static uint16 tab_uni_jisx02082[]={ +0x215F}; + +/* page 3 0x00F7-0x00F7 */ +static uint16 tab_uni_jisx02083[]={ +0x2160}; + +/* page 4 0x0391-0x03C9 */ +static uint16 tab_uni_jisx02084[]={ +0x2621,0x2622,0x2623,0x2624,0x2625,0x2626,0x2627,0x2628, +0x2629,0x262A,0x262B,0x262C,0x262D,0x262E,0x262F,0x2630, +0x2631, 0,0x2632,0x2633,0x2634,0x2635,0x2636,0x2637, +0x2638, 0, 0, 0, 0, 0, 0, 0, +0x2641,0x2642,0x2643,0x2644,0x2645,0x2646,0x2647,0x2648, +0x2649,0x264A,0x264B,0x264C,0x264D,0x264E,0x264F,0x2650, +0x2651, 0,0x2652,0x2653,0x2654,0x2655,0x2656,0x2657, +0x2658}; + +/* page 5 0x0401-0x0451 */ +static uint16 tab_uni_jisx02085[]={ +0x2727, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x2721, +0x2722,0x2723,0x2724,0x2725,0x2726,0x2728,0x2729,0x272A, +0x272B,0x272C,0x272D,0x272E,0x272F,0x2730,0x2731,0x2732, +0x2733,0x2734,0x2735,0x2736,0x2737,0x2738,0x2739,0x273A, +0x273B,0x273C,0x273D,0x273E,0x273F,0x2740,0x2741,0x2751, +0x2752,0x2753,0x2754,0x2755,0x2756,0x2758,0x2759,0x275A, +0x275B,0x275C,0x275D,0x275E,0x275F,0x2760,0x2761,0x2762, +0x2763,0x2764,0x2765,0x2766,0x2767,0x2768,0x2769,0x276A, +0x276B,0x276C,0x276D,0x276E,0x276F,0x2770,0x2771, 0, +0x2757}; + +/* page 6 0x2010-0x203B */ +static uint16 tab_uni_jisx02086[]={ +0x213E, 0, 0, 0, 0,0x213D,0x2142, 0, +0x2146,0x2147, 0, 0,0x2148,0x2149, 0, 0, +0x2277,0x2278, 0, 0, 0,0x2145,0x2144, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x2273, 0,0x216C,0x216D, 0, 0, 0, 0, + 0, 0, 0,0x2228}; + +/* page 7 0x2103-0x2103 */ +static uint16 tab_uni_jisx02087[]={ +0x216E}; + +/* page 8 0x212B-0x212B */ +static uint16 tab_uni_jisx02088[]={ +0x2272}; + +/* page 9 0x2190-0x2193 */ +static uint16 tab_uni_jisx02089[]={ +0x222B,0x222C,0x222A,0x222D}; + +/* page 10 0x21D2-0x21D4 */ +static uint16 tab_uni_jisx020810[]={ +0x224D, 0,0x224E}; + +/* page 11 0x2200-0x223D */ +static uint16 tab_uni_jisx020811[]={ +0x224F, 0,0x225F,0x2250, 0, 0, 0,0x2260, +0x223A, 0, 0,0x223B, 0, 0, 0, 0, + 0, 0,0x215D, 0, 0, 0, 0, 0, + 0, 0,0x2265, 0, 0,0x2267,0x2167, 0, +0x225C, 0, 0, 0, 0, 0, 0,0x224A, +0x224B,0x2241,0x2240,0x2269,0x226A, 0, 0, 0, + 0, 0, 0, 0,0x2168,0x2268, 0, 0, + 0, 0, 0, 0, 0,0x2266}; + +/* page 12 0x2252-0x226B */ +static uint16 tab_uni_jisx020812[]={ +0x2262, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x2162,0x2261, + 0, 0, 0, 0,0x2165,0x2166, 0, 0, +0x2263,0x2264}; + +/* page 13 0x2282-0x2287 */ +static uint16 tab_uni_jisx020813[]={ +0x223E,0x223F, 0, 0,0x223C,0x223D}; + +/* page 14 0x22A5-0x22A5 */ +static uint16 tab_uni_jisx020814[]={ +0x225D}; + +/* page 15 0x2312-0x2312 */ +static uint16 tab_uni_jisx020815[]={ +0x225E}; + +/* page 16 0x2500-0x254B */ +static uint16 tab_uni_jisx020816[]={ +0x2821,0x282C,0x2822,0x282D, 0, 0, 0, 0, + 0, 0, 0, 0,0x2823, 0, 0,0x282E, +0x2824, 0, 0,0x282F,0x2826, 0, 0,0x2831, +0x2825, 0, 0,0x2830,0x2827,0x283C, 0, 0, +0x2837, 0, 0,0x2832,0x2829,0x283E, 0, 0, +0x2839, 0, 0,0x2834,0x2828, 0, 0,0x2838, +0x283D, 0, 0,0x2833,0x282A, 0, 0,0x283A, +0x283F, 0, 0,0x2835,0x282B, 0, 0,0x283B, + 0, 0,0x2840, 0, 0, 0, 0, 0, + 0, 0, 0,0x2836}; + +/* page 17 0x25A0-0x25CF */ +static uint16 tab_uni_jisx020817[]={ +0x2223,0x2222, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x2225,0x2224, 0, 0, 0, 0, + 0, 0, 0, 0,0x2227,0x2226, 0, 0, + 0, 0, 0, 0, 0, 0,0x2221,0x217E, + 0, 0, 0,0x217B, 0, 0,0x217D,0x217C +}; + +/* page 18 0x25EF-0x25EF */ +static uint16 tab_uni_jisx020818[]={ +0x227E}; + +/* page 19 0x2605-0x2606 */ +static uint16 tab_uni_jisx020819[]={ +0x217A,0x2179}; + +/* page 20 0x2640-0x2642 */ +static uint16 tab_uni_jisx020820[]={ +0x216A, 0,0x2169}; + +/* page 21 0x266A-0x266F */ +static uint16 tab_uni_jisx020821[]={ +0x2276, 0, 0,0x2275, 0,0x2274}; + +/* page 22 0x3000-0x301C */ +static uint16 tab_uni_jisx020822[]={ +0x2121,0x2122,0x2123,0x2137, 0,0x2139,0x213A,0x213B, +0x2152,0x2153,0x2154,0x2155,0x2156,0x2157,0x2158,0x2159, +0x215A,0x215B,0x2229,0x222E,0x214C,0x214D, 0, 0, + 0, 0, 0, 0,0x2141}; + +/* page 23 0x3041-0x30FE */ +static uint16 tab_uni_jisx020823[]={ +0x2421,0x2422,0x2423,0x2424,0x2425,0x2426,0x2427,0x2428, +0x2429,0x242A,0x242B,0x242C,0x242D,0x242E,0x242F,0x2430, +0x2431,0x2432,0x2433,0x2434,0x2435,0x2436,0x2437,0x2438, +0x2439,0x243A,0x243B,0x243C,0x243D,0x243E,0x243F,0x2440, +0x2441,0x2442,0x2443,0x2444,0x2445,0x2446,0x2447,0x2448, +0x2449,0x244A,0x244B,0x244C,0x244D,0x244E,0x244F,0x2450, +0x2451,0x2452,0x2453,0x2454,0x2455,0x2456,0x2457,0x2458, +0x2459,0x245A,0x245B,0x245C,0x245D,0x245E,0x245F,0x2460, +0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,0x2467,0x2468, +0x2469,0x246A,0x246B,0x246C,0x246D,0x246E,0x246F,0x2470, +0x2471,0x2472,0x2473, 0, 0, 0, 0, 0, + 0, 0,0x212B,0x212C,0x2135,0x2136, 0, 0, +0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527,0x2528, +0x2529,0x252A,0x252B,0x252C,0x252D,0x252E,0x252F,0x2530, +0x2531,0x2532,0x2533,0x2534,0x2535,0x2536,0x2537,0x2538, +0x2539,0x253A,0x253B,0x253C,0x253D,0x253E,0x253F,0x2540, +0x2541,0x2542,0x2543,0x2544,0x2545,0x2546,0x2547,0x2548, +0x2549,0x254A,0x254B,0x254C,0x254D,0x254E,0x254F,0x2550, +0x2551,0x2552,0x2553,0x2554,0x2555,0x2556,0x2557,0x2558, +0x2559,0x255A,0x255B,0x255C,0x255D,0x255E,0x255F,0x2560, +0x2561,0x2562,0x2563,0x2564,0x2565,0x2566,0x2567,0x2568, +0x2569,0x256A,0x256B,0x256C,0x256D,0x256E,0x256F,0x2570, +0x2571,0x2572,0x2573,0x2574,0x2575,0x2576, 0, 0, + 0, 0,0x2126,0x213C,0x2133,0x2134}; + +/* page 24 0x4E00-0x5516 */ +static uint16 tab_uni_jisx020824[]={ +0x306C,0x437A, 0,0x3C37, 0, 0, 0,0x4B7C, +0x3E66,0x3B30,0x3E65,0x323C, 0,0x4954,0x4D3F, 0, +0x5022,0x312F, 0, 0,0x336E,0x5023,0x4024,0x5242, +0x3556,0x4A3A, 0, 0, 0, 0,0x3E67, 0, + 0,0x4E3E, 0, 0, 0, 0,0x4A42, 0, + 0, 0,0x5024, 0, 0,0x4366, 0, 0, + 0,0x5025,0x367A, 0, 0, 0,0x5026, 0, +0x345D,0x4330, 0,0x3C67,0x5027, 0, 0,0x5028, + 0, 0,0x5029,0x4735, 0,0x3557, 0, 0, + 0, 0, 0,0x4737, 0,0x4663,0x3843,0x4B33, + 0, 0, 0, 0, 0,0x6949,0x502A,0x3E68, +0x502B,0x3235, 0, 0, 0,0x3665,0x3870,0x4C69, + 0, 0,0x5626, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x4D70, 0,0x467D, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x3425, 0, +0x3535, 0,0x502C, 0, 0,0x502D,0x4E3B, 0, +0x4D3D,0x4168,0x502F,0x3B76,0x4673, 0,0x5032, 0, + 0,0x313E,0x385F, 0,0x385E,0x3066, 0, 0, +0x4F4B,0x4F4A, 0,0x3A33,0x3021, 0,0x5033,0x5034, +0x5035,0x4B34,0x5036, 0,0x3872,0x3067,0x4B72, 0, +0x357C, 0, 0,0x357D,0x357E,0x4462,0x4E3C, 0, +0x5037, 0, 0,0x5038, 0, 0,0x5039, 0, + 0, 0,0x3F4D, 0, 0, 0, 0, 0, +0x3D3A,0x3F4E,0x503E, 0,0x503C, 0,0x503D,0x3558, + 0, 0,0x3A23,0x3270, 0,0x503B,0x503A,0x4A29, + 0, 0, 0, 0,0x3B46,0x3B45,0x423E,0x503F, +0x4955,0x4067, 0, 0, 0,0x2138,0x5040,0x5042, + 0, 0, 0,0x4265,0x4E61,0x304A, 0, 0, + 0, 0, 0, 0, 0,0x5041,0x323E, 0, +0x3644, 0,0x4367, 0, 0, 0,0x376F,0x5043, + 0, 0, 0,0x4724, 0, 0, 0, 0, + 0,0x346B, 0, 0, 0, 0, 0, 0, + 0,0x5044,0x304B, 0, 0,0x3860,0x346C,0x497A, +0x4832,0x3559, 0, 0, 0, 0, 0, 0, + 0, 0,0x3271, 0,0x5067,0x4541, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x476C, +0x5046, 0, 0, 0,0x483C, 0,0x4E62, 0, +0x3F2D, 0,0x3B47, 0,0x3B77,0x3240, 0, 0, + 0, 0, 0,0x4451, 0, 0,0x4322,0x504A, + 0, 0, 0, 0, 0,0x304C,0x4463,0x3D3B, +0x3A34,0x4D24, 0,0x424E, 0,0x323F, 0,0x5049, + 0,0x4D3E,0x5045,0x5047,0x3A6E,0x5048,0x5524, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5050, 0, 0, 0, 0, 0,0x5053, +0x5051, 0, 0,0x3242, 0,0x4A3B,0x504B, 0, + 0, 0, 0,0x504F,0x3873, 0, 0,0x3B48, + 0, 0, 0,0x3426, 0, 0,0x5054, 0, +0x504C, 0, 0,0x4E63, 0,0x3B78, 0,0x504D, + 0,0x5052, 0, 0, 0, 0,0x5055, 0, +0x504E, 0, 0,0x3621, 0,0x304D, 0, 0, +0x3622,0x3241, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x5525, 0,0x4B79,0x496E,0x3874, + 0, 0, 0, 0, 0,0x3F2F,0x4E37, 0, + 0, 0, 0, 0, 0, 0, 0,0x4A58, + 0, 0,0x3738,0x4225,0x3264, 0, 0, 0, + 0, 0,0x3D53, 0, 0, 0,0x5059, 0, +0x505E,0x505C, 0, 0,0x5057, 0, 0,0x422F, +0x505A, 0,0x505D,0x505B, 0,0x4A5D, 0,0x5058, + 0,0x3F2E, 0,0x4B73,0x505F,0x5060, 0, 0, + 0, 0, 0, 0, 0, 0,0x3D24,0x506D, + 0, 0, 0,0x4750, 0,0x4936,0x5068, 0, +0x4A70, 0,0x3236, 0, 0, 0,0x506C, 0, + 0, 0, 0, 0, 0,0x5066,0x506F, 0, + 0,0x4152, 0,0x3844, 0,0x475C, 0,0x6047, + 0,0x506E,0x455D, 0,0x5063, 0,0x3876, 0, + 0,0x3875,0x5061, 0, 0, 0, 0,0x3C5A, + 0,0x5069, 0,0x4A6F,0x434D,0x5065,0x3771, 0, +0x5062,0x506A,0x5064,0x4E51,0x506B,0x4F41, 0, 0, + 0, 0, 0, 0, 0, 0,0x3666, 0, + 0,0x3770, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x5070, 0, 0, 0,0x5071, +0x5075,0x304E, 0, 0, 0, 0, 0,0x4A50, +0x5074, 0, 0, 0, 0,0x5073,0x5077, 0, + 0, 0,0x5076, 0,0x4464, 0, 0, 0, + 0, 0, 0, 0, 0,0x3772, 0, 0, + 0, 0, 0, 0,0x5078, 0, 0, 0, + 0, 0,0x3C45, 0,0x4226,0x4465,0x3676, 0, +0x5079, 0, 0, 0, 0,0x3536, 0, 0, +0x507A, 0, 0, 0, 0,0x507C, 0, 0, + 0, 0, 0, 0, 0,0x4B35, 0, 0, + 0,0x3766, 0, 0, 0, 0, 0, 0, +0x3B31,0x4877,0x507B, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x3A45,0x4D43, 0, 0, + 0, 0,0x507E,0x5123,0x507D,0x3A44, 0,0x3D7D, + 0, 0, 0, 0, 0, 0,0x3739, 0, + 0, 0,0x5124, 0, 0,0x364F, 0, 0, + 0,0x5121,0x5122, 0, 0,0x462F, 0,0x417C, + 0,0x3623, 0, 0, 0,0x4B4D,0x5125, 0, + 0, 0,0x4E3D, 0, 0, 0,0x5126, 0, + 0, 0, 0,0x5129, 0,0x5127, 0,0x414E, + 0, 0, 0, 0, 0,0x5128,0x512A, 0, + 0, 0, 0, 0, 0,0x512C, 0, 0, + 0,0x512B, 0,0x4A48, 0, 0, 0, 0, +0x3537,0x512E,0x512F, 0,0x322F, 0, 0, 0, + 0,0x512D, 0, 0, 0, 0, 0, 0, + 0, 0,0x3C74, 0,0x5132,0x5131,0x5130, 0, +0x5056, 0,0x5133, 0, 0, 0, 0,0x3D7E, + 0,0x5134, 0, 0, 0, 0, 0, 0, + 0, 0,0x4D25, 0, 0, 0, 0, 0, + 0, 0,0x4C59, 0, 0, 0, 0,0x5136, + 0, 0,0x5135,0x5138,0x5137, 0, 0,0x5139, +0x513A,0x3074, 0,0x3835,0x373B,0x3D3C,0x437B,0x3624, +0x4068,0x3877, 0,0x396E,0x513C,0x4C48,0x4546, 0, +0x3B79, 0,0x513B, 0,0x513D, 0, 0, 0, + 0, 0,0x455E, 0,0x3375, 0, 0, 0, + 0, 0,0x513E, 0, 0,0x467E, 0, 0, +0x4134,0x5140,0x5141,0x482C,0x3878,0x4F3B,0x5142, 0, + 0,0x3626, 0, 0, 0,0x4A3C,0x4236,0x3671, +0x4535, 0, 0, 0,0x3773, 0, 0, 0, +0x5143, 0,0x5144, 0, 0,0x4662,0x315F, 0, + 0,0x5147,0x3A7D, 0,0x5146,0x3A46, 0,0x5148, +0x666E,0x5149,0x4B41,0x514A, 0,0x514B,0x514C,0x3E69, + 0,0x3C4C, 0, 0, 0, 0, 0, 0, +0x3427, 0,0x514F, 0,0x514D,0x4C3D,0x514E, 0, +0x495A,0x5150,0x5151,0x5152,0x455F, 0, 0, 0, +0x5156,0x5154,0x5155,0x5153,0x3A63,0x5157,0x4C6A,0x4E64, + 0, 0, 0, 0, 0,0x5158, 0, 0, + 0, 0, 0, 0,0x4028,0x5159,0x3D5A, 0, + 0,0x515A, 0,0x437C,0x4E3F,0x4560, 0, 0, + 0, 0, 0, 0, 0, 0,0x5245, 0, + 0, 0, 0,0x515B,0x7425,0x3645, 0, 0, +0x515C,0x4B5E, 0, 0, 0, 0,0x3D68,0x427C, + 0,0x515E,0x4664, 0, 0,0x515F, 0, 0, +0x5160,0x332E, 0, 0, 0,0x5161,0x3627, 0, +0x464C,0x317A,0x3D50, 0, 0,0x4821,0x5162, 0, +0x4561, 0, 0,0x3F4F,0x5163, 0,0x4A2C,0x405A, +0x3422, 0,0x3429,0x5164, 0, 0,0x5166, 0, + 0,0x373A, 0, 0,0x5165, 0, 0,0x4E73, + 0, 0, 0, 0, 0,0x3D69, 0, 0, + 0, 0, 0, 0,0x483D,0x4A4C, 0,0x5167, + 0,0x4D78,0x5168, 0, 0, 0,0x5169, 0, +0x457E, 0, 0,0x516A, 0, 0,0x4029,0x3A7E, +0x3774,0x516B,0x3B49,0x396F, 0, 0, 0, 0, + 0, 0, 0,0x4466,0x516D, 0, 0,0x4227, + 0, 0,0x3A6F,0x516E,0x516F,0x4130, 0,0x516C, + 0, 0, 0, 0,0x5171, 0,0x4B36, 0, + 0, 0, 0,0x3964, 0, 0,0x5170, 0, + 0, 0, 0,0x3775,0x3A5E,0x476D, 0, 0, + 0,0x5174,0x5172, 0, 0, 0, 0,0x497B, +0x3E6A,0x517B,0x3364,0x5175,0x5173,0x414F, 0, 0, + 0, 0, 0, 0, 0,0x5177, 0,0x5176, + 0, 0, 0,0x3344, 0, 0, 0,0x3760, +0x517C,0x4E2D, 0, 0, 0,0x5178, 0, 0, + 0,0x517D,0x517A, 0,0x5179, 0, 0, 0, + 0, 0, 0,0x4E4F, 0, 0, 0,0x3879, +0x3243, 0, 0,0x4E74, 0, 0, 0, 0, + 0,0x3D75,0x4558,0x3965,0x5222,0x5223, 0, 0, + 0,0x4E65, 0, 0,0x4F2B,0x5225, 0, 0, + 0,0x387A, 0, 0,0x5224, 0,0x332F, 0, + 0,0x5226, 0,0x4B56, 0,0x443C, 0,0x4D26, + 0,0x4A59, 0, 0, 0,0x5227, 0, 0, + 0, 0,0x7055, 0, 0,0x4630, 0,0x5228, +0x342A,0x4C33, 0, 0, 0,0x3E21,0x5229,0x4A67, +0x522D, 0,0x402A,0x522A,0x3650, 0,0x522B,0x342B, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x372E,0x522E, 0,0x522F, 0, 0, +0x5230,0x5231,0x3C5B, 0, 0, 0,0x387B,0x4C5E, + 0,0x4C68,0x4677, 0, 0,0x4A71,0x5232, 0, +0x5233, 0, 0, 0, 0,0x5235, 0,0x5237, +0x5236, 0, 0, 0, 0,0x5238,0x323D,0x4B4C, + 0,0x3A7C,0x5239, 0, 0,0x4159, 0, 0, +0x3E22,0x3629, 0,0x523A, 0, 0, 0, 0, + 0, 0,0x485B, 0, 0, 0, 0,0x523B, + 0,0x523C, 0,0x523D, 0, 0, 0, 0, +0x523E,0x4924,0x3668,0x3065, 0, 0, 0,0x463F, +0x523F,0x3D3D, 0,0x4069, 0,0x5241,0x5240,0x3E23, +0x3861,0x5243,0x483E, 0, 0,0x5244, 0, 0, + 0,0x485C,0x4234,0x426E,0x3628, 0, 0,0x466E, +0x4331, 0,0x476E, 0,0x4B4E, 0,0x5246, 0, +0x406A, 0, 0, 0, 0, 0,0x3735, 0, + 0,0x5247, 0, 0, 0, 0,0x5248,0x312C, +0x3075,0x346D, 0,0x4228,0x3551,0x4D71, 0,0x524B, +0x3237, 0, 0,0x524A, 0, 0, 0,0x362A, + 0, 0,0x524C, 0,0x4C71, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x524D, 0, +0x4E52, 0,0x387C, 0, 0, 0, 0,0x3836, +0x524E, 0, 0, 0, 0,0x5250,0x524F, 0, +0x3F5F,0x3139, 0, 0, 0,0x315E,0x5251, 0, +0x5252, 0, 0,0x3837, 0, 0,0x5253, 0, + 0, 0, 0,0x356E, 0, 0, 0, 0, + 0, 0,0x3B32,0x5254, 0, 0, 0, 0, +0x4B74,0x3A35,0x355A,0x4D27,0x4150,0x483F,0x3C7D, 0, + 0, 0, 0, 0,0x3D47, 0,0x3C68,0x3C75, + 0,0x3D76, 0,0x4840, 0, 0, 0,0x5257, + 0,0x3143,0x4151,0x387D,0x3845,0x3667, 0, 0, +0x525B,0x4321,0x427E,0x362B,0x3E24,0x525C,0x525A,0x3244, +0x4266,0x3C38,0x3B4B,0x3126, 0, 0,0x3370,0x3966, +0x3B4A, 0,0x525D, 0, 0, 0, 0, 0, + 0,0x525E, 0,0x3549,0x3346, 0, 0, 0, +0x3967,0x3548,0x445F,0x3125,0x4631,0x4C3E,0x3921,0x4D79, +0x4547,0x387E, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x372F, 0,0x5267, 0,0x3663, +0x4B4A, 0, 0, 0, 0, 0,0x485D, 0, + 0,0x5266, 0,0x345E,0x5261,0x5262,0x5264, 0, + 0, 0, 0, 0, 0, 0,0x5265, 0, +0x355B,0x3F61, 0,0x4A2D,0x5263,0x525F,0x3863, 0, +0x5260, 0,0x4F24, 0, 0, 0,0x4A72, 0, +0x4468,0x3862,0x3970, 0, 0, 0,0x5268, 0, + 0,0x465D, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x526C, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3C7E, 0,0x3C76, 0, 0, 0, 0, 0, +0x526F,0x526D, 0,0x4C23, 0,0x526A,0x5273,0x526E, + 0, 0, 0,0x5271,0x3846,0x4C3F, 0, 0, +0x5272, 0, 0, 0,0x5274, 0,0x5276, 0, + 0, 0, 0,0x3A70,0x4F42, 0,0x526B,0x5269, +0x5275, 0,0x5270, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x5278, 0,0x5323,0x527A, 0, 0, +0x527E, 0, 0,0x5321,0x527B, 0, 0,0x533E, + 0, 0,0x3A69,0x3331, 0, 0, 0, 0, +0x5279, 0, 0, 0,0x5325,0x3076,0x5324, 0, +0x3025,0x494A,0x5322, 0,0x527C, 0, 0,0x5277, +0x527D,0x3A48, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5326, 0, 0, 0, 0, 0, 0, 0, + 0,0x3077,0x532F, 0, 0,0x5327,0x5328, 0, +0x3E25,0x4B69, 0, 0, 0,0x532D,0x532C, 0, + 0, 0,0x452F, 0, 0, 0, 0, 0, + 0, 0,0x532E, 0, 0,0x532B, 0, 0, + 0, 0, 0, 0,0x3134, 0,0x3A36,0x3F30, + 0, 0, 0, 0, 0, 0, 0,0x5329, +0x4562, 0, 0, 0,0x532A, 0,0x3022}; + +/* page 25 0x552E-0x5563 */ +static uint16 tab_uni_jisx020825[]={ +0x5334,0x4D23, 0,0x3E27, 0,0x533A, 0, 0, + 0, 0,0x5339,0x5330, 0, 0, 0, 0, +0x4243, 0,0x5331, 0, 0, 0,0x426F,0x5336, +0x3E26, 0, 0, 0, 0, 0,0x5333, 0, + 0,0x4C64, 0, 0, 0,0x373C, 0, 0, +0x5337,0x5338, 0, 0, 0, 0,0x5335,0x533B, + 0, 0, 0, 0, 0,0x5332}; + +/* page 26 0x557B-0x576A */ +static uint16 tab_uni_jisx020826[]={ +0x5341,0x5346, 0,0x5342, 0,0x533D, 0, 0, +0x5347,0x4131, 0, 0,0x5349, 0,0x3922,0x533F, +0x437D, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x5343,0x533C,0x342D, + 0,0x346E,0x3365,0x5344,0x5340, 0, 0, 0, + 0, 0, 0, 0,0x3776,0x534A,0x5348,0x4153, +0x354A,0x362C, 0,0x5345, 0,0x3674, 0, 0, + 0, 0, 0,0x3144, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x534E,0x534C, 0,0x5427, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5351, 0, 0, 0, 0, 0,0x534B, + 0,0x534F, 0, 0,0x534D, 0, 0, 0, +0x3B4C,0x5350, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x5353, 0,0x5358, 0, + 0, 0,0x5356,0x5355, 0, 0, 0, 0, + 0, 0, 0,0x4332, 0, 0,0x3245, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5352, 0,0x5354,0x3E28,0x3133, 0, 0, +0x5357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x325E, 0, + 0, 0, 0, 0,0x5362, 0,0x3E7C,0x535E, + 0,0x535C, 0,0x535D, 0,0x535F, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x313D, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x4139, 0,0x5359, 0,0x535A, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x337A, 0, 0, 0, 0, 0, 0, 0, + 0,0x5361, 0, 0, 0,0x346F, 0,0x5364, +0x5360,0x5363, 0, 0, 0, 0, 0, 0, + 0,0x4A2E, 0, 0, 0,0x4655, 0,0x4838, + 0, 0, 0, 0, 0,0x5366, 0, 0, + 0, 0, 0,0x5365,0x3345, 0, 0,0x5367, + 0, 0, 0, 0,0x536A, 0, 0, 0, + 0,0x5369, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x5368, 0,0x4739, + 0, 0,0x536B, 0, 0, 0, 0, 0, + 0, 0, 0,0x536C, 0, 0, 0, 0, + 0,0x536E, 0,0x536D, 0, 0, 0, 0, + 0,0x5370, 0, 0, 0,0x5373,0x5371,0x536F, +0x5372, 0, 0, 0, 0,0x5374, 0, 0, + 0, 0, 0,0x5375, 0, 0,0x5376, 0, +0x5377, 0, 0, 0,0x5378,0x5145, 0,0x3C7C, +0x3B4D, 0, 0,0x3273, 0,0x3078, 0, 0, +0x4344, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x5379, 0,0x3A24, 0,0x304F, +0x3F5E, 0, 0, 0, 0, 0,0x537A,0x3847, + 0, 0,0x3971, 0,0x537C,0x537B, 0, 0, +0x4A60,0x537D, 0, 0, 0,0x5421,0x537E, 0, +0x5422, 0,0x5423, 0,0x3777, 0, 0,0x3160, +0x5424, 0, 0,0x5426, 0,0x5425, 0, 0, + 0,0x5428, 0, 0,0x455A, 0, 0, 0, + 0, 0, 0,0x5429,0x3035,0x3A5F, 0, 0, + 0, 0,0x373D, 0, 0,0x434F, 0, 0, + 0, 0, 0, 0,0x542A,0x542B, 0, 0, +0x542D, 0, 0, 0, 0,0x542E, 0,0x3A64, + 0, 0, 0, 0,0x3651, 0, 0,0x4B37, + 0, 0, 0,0x542C,0x542F,0x3A41,0x3923, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x5433, 0, + 0,0x3A25, 0,0x4333, 0, 0,0x5430,0x445A +}; + +/* page 27 0x577F-0x5A9B */ +static uint16 tab_uni_jisx020827[]={ +0x5434, 0, 0,0x3F62, 0, 0, 0, 0, + 0,0x5432,0x5435, 0,0x373F, 0, 0, 0, + 0, 0, 0, 0,0x5436, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5437, 0,0x3924,0x3340,0x5439, 0, 0, + 0, 0, 0,0x543A, 0, 0, 0, 0, + 0,0x543B, 0, 0,0x5438, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5431, 0, 0,0x543C, 0, 0,0x543D, + 0, 0, 0, 0,0x4B64, 0, 0,0x3E6B, + 0, 0, 0,0x543F,0x5440,0x543E, 0,0x5442, + 0, 0, 0, 0, 0,0x4738, 0, 0, +0x3068,0x4956, 0, 0,0x5443, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x3E7D, 0, 0, +0x3C39, 0,0x475D,0x3470, 0,0x3A6B, 0, 0, + 0,0x4B59, 0,0x4632, 0, 0,0x3778,0x424F, + 0, 0, 0,0x5441,0x5444, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x4244, 0, + 0, 0,0x5445, 0, 0, 0,0x5446, 0, + 0, 0,0x5448, 0, 0,0x4469, 0, 0, + 0, 0, 0,0x342E, 0, 0, 0, 0, +0x7421,0x3161,0x4A73, 0, 0,0x3E6C,0x4548, 0, + 0, 0, 0,0x3A66, 0, 0,0x544E, 0, + 0,0x4A3D,0x4E5D, 0, 0, 0, 0, 0, + 0, 0, 0,0x3274,0x544A, 0, 0, 0, + 0, 0,0x413A,0x544D, 0,0x4563, 0, 0, +0x4549,0x4564,0x4839,0x444D, 0, 0, 0,0x3A49, + 0, 0, 0,0x5449, 0, 0, 0, 0, + 0, 0,0x3176, 0,0x4536, 0, 0, 0, + 0,0x544B, 0,0x5447, 0, 0,0x3F50, 0, + 0, 0,0x544F, 0, 0, 0, 0,0x3D4E, + 0, 0, 0, 0,0x362D, 0,0x5450, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x4A68, 0, 0, 0, +0x417D, 0, 0, 0, 0,0x4446, 0, 0, +0x5452, 0, 0, 0, 0, 0, 0, 0, + 0,0x4B4F, 0, 0,0x5453, 0, 0,0x5458, + 0, 0, 0, 0,0x4A2F, 0, 0, 0, + 0,0x5457,0x5451,0x5454,0x5456, 0, 0,0x3A26, + 0, 0,0x4A49, 0, 0, 0,0x5459, 0, +0x4345, 0, 0,0x3275, 0,0x3E6D, 0, 0, + 0, 0,0x545B, 0,0x545A, 0,0x3968, 0, +0x545C,0x545E,0x545D, 0, 0,0x5460, 0,0x5455, +0x5462, 0, 0, 0, 0,0x5461,0x545F, 0, + 0, 0, 0, 0,0x3B4E,0x3F51, 0,0x4154, +0x5463,0x403C,0x306D,0x4764, 0, 0, 0, 0, +0x445B, 0,0x5465,0x5464,0x5466,0x5467,0x5468, 0, + 0, 0, 0,0x5469, 0, 0, 0, 0, + 0, 0,0x4A51,0x546A, 0, 0, 0, 0, +0x3246,0x546B, 0, 0, 0, 0,0x4D3C,0x3330, + 0,0x5249,0x3D48,0x423F,0x546C,0x4C6B, 0, 0, + 0, 0, 0,0x4C34, 0, 0,0x546E, 0, +0x4267, 0,0x4537,0x4240,0x4957,0x546F,0x5470,0x317B, + 0, 0,0x3C3A,0x5471, 0, 0, 0, 0, +0x3050,0x5472, 0, 0, 0, 0, 0,0x5473, + 0, 0, 0, 0, 0,0x3162, 0, 0, +0x3471,0x4660,0x4A74, 0, 0, 0, 0,0x5477, +0x4155,0x5476,0x3740, 0, 0,0x4B5B,0x5475, 0, +0x4565,0x5479, 0,0x5478, 0, 0, 0, 0, + 0,0x547B, 0,0x547A, 0, 0,0x317C, 0, +0x547C,0x3E29,0x547E,0x4325, 0,0x547D, 0,0x4A33, + 0, 0, 0, 0,0x3D77,0x455B, 0, 0, + 0,0x5521, 0, 0, 0, 0,0x3925, 0, + 0, 0,0x5522,0x4721,0x485E,0x4C51, 0, 0, + 0, 0, 0,0x4725, 0, 0,0x552B, 0, + 0, 0, 0, 0,0x3538, 0, 0,0x4D45, + 0, 0,0x4C2F, 0,0x562C, 0,0x5523, 0, + 0, 0, 0, 0,0x5526, 0,0x4245, 0, + 0,0x4B38, 0, 0, 0,0x454A, 0, 0, + 0, 0, 0,0x5527, 0, 0, 0, 0, + 0, 0,0x4B65, 0,0x3A4A, 0, 0,0x3E2A, + 0, 0, 0, 0, 0, 0, 0,0x5528, + 0, 0,0x3B50, 0,0x3B4F, 0, 0, 0, + 0,0x3039,0x3848, 0,0x402B,0x3051, 0, 0, + 0, 0,0x552C,0x552D, 0,0x552A, 0, 0, + 0, 0, 0, 0, 0, 0,0x3138,0x342F, + 0,0x5529, 0,0x4C45,0x4931, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3028, + 0, 0, 0, 0,0x3079, 0, 0, 0, +0x3B51, 0,0x3052, 0,0x3023, 0, 0, 0, + 0, 0,0x5532, 0, 0, 0, 0, 0, + 0, 0,0x5530, 0, 0, 0, 0, 0, + 0,0x4C3C, 0,0x5533, 0,0x5531, 0, 0, +0x552F,0x3F31, 0, 0, 0, 0,0x552E, 0, + 0, 0,0x4A5A, 0, 0, 0, 0, 0, +0x3864, 0, 0, 0, 0, 0,0x5537,0x5538, + 0, 0, 0, 0, 0,0x3E2B, 0, 0, + 0,0x5534,0x4F2C, 0, 0, 0, 0,0x474C, + 0, 0,0x5536, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x3A27, 0, 0, 0, 0, + 0, 0, 0,0x5539, 0, 0, 0,0x4958, + 0, 0, 0,0x553A, 0,0x5535, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4C3B, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x475E, 0, 0, 0, 0, + 0, 0, 0,0x553B,0x4932}; + +/* page 28 0x5ABC-0x5D29 */ +static uint16 tab_uni_jisx020828[]={ +0x553C,0x5540,0x553D, 0, 0,0x3247,0x553F, 0, + 0, 0, 0, 0, 0,0x3C3B, 0,0x553E, +0x3779, 0, 0, 0,0x554C, 0, 0, 0, + 0, 0,0x5545,0x5542, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x4364, 0,0x5541, + 0, 0,0x5543, 0, 0,0x5544, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x5546,0x5547, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x3472, 0,0x5549, +0x5548, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x554A, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x3E6E, 0, + 0, 0, 0, 0, 0, 0,0x554D, 0, +0x445C, 0, 0, 0,0x3145, 0,0x554B, 0, + 0, 0,0x554E, 0, 0, 0, 0, 0, + 0, 0,0x554F, 0,0x5552, 0, 0,0x5550, + 0,0x5551, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x3B52,0x5553, 0, 0, +0x3926,0x5554, 0,0x3B7A,0x4238, 0,0x5555,0x5556, +0x3B5A,0x3927, 0,0x4C52, 0, 0, 0,0x3528, +0x3849,0x5557,0x3358, 0, 0,0x5558, 0,0x4239, + 0, 0, 0, 0,0x5559,0x5623, 0,0x555A, + 0,0x555B, 0, 0,0x555C, 0,0x555E, 0, + 0, 0, 0, 0,0x555F, 0, 0,0x5560, + 0,0x4270, 0,0x3127,0x3C69,0x3042, 0,0x4157, +0x3430,0x3C35, 0,0x3928, 0, 0, 0, 0, + 0,0x4566, 0,0x3D21,0x3431,0x4368,0x446A,0x3038, +0x3539,0x4A75, 0,0x3C42, 0, 0,0x3552,0x406B, +0x3C3C,0x4D28,0x5561, 0, 0, 0, 0, 0, + 0, 0,0x355C, 0,0x3A4B, 0, 0,0x3332, +0x3163,0x3E2C,0x3248, 0,0x5562,0x4D46, 0, 0, + 0, 0, 0,0x3D49, 0, 0,0x3C64,0x5563, +0x3473,0x4652,0x4C29,0x5564, 0,0x5565, 0, 0, +0x4959, 0, 0, 0,0x5567, 0,0x3428,0x3677, +0x5566, 0, 0, 0, 0, 0, 0,0x3432, + 0,0x3F32,0x556B,0x3B21, 0,0x3249,0x556A, 0, +0x5568,0x556C,0x5569,0x472B,0x5C4D,0x3F33, 0,0x556D, + 0, 0,0x4E40, 0,0x556E, 0, 0,0x5570, + 0,0x437E,0x556F, 0,0x4023, 0,0x3B7B, 0, + 0, 0,0x4250,0x3C77, 0,0x4975,0x406C, 0, +0x3C4D,0x5571,0x3E2D,0x5572,0x5573,0x3053,0x423A,0x3F52, + 0,0x5574,0x4633,0x3E2E, 0,0x3E2F, 0,0x5575, + 0, 0,0x406D, 0, 0, 0,0x3E30, 0, + 0, 0, 0, 0,0x5576, 0,0x5577, 0, +0x4C60, 0, 0, 0,0x5578, 0, 0, 0, + 0,0x3646, 0, 0, 0,0x3D22, 0, 0, + 0, 0, 0, 0,0x5579,0x557A,0x3C5C,0x3F2C, +0x4674,0x3F54,0x4878,0x4722,0x3649,0x557B, 0, 0, + 0,0x356F,0x557C, 0,0x367E, 0,0x464F,0x3230, + 0,0x3B53,0x557D,0x5622,0x5621,0x367D, 0,0x557E, + 0,0x4538, 0, 0, 0, 0, 0, 0, + 0, 0,0x4230, 0,0x454B,0x3C48, 0, 0, +0x4158,0x4D7A, 0, 0, 0, 0, 0, 0, +0x5624, 0,0x5625,0x4656, 0,0x3B33, 0, 0, + 0, 0,0x5627, 0, 0,0x5628, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5629, 0, 0, 0,0x3474,0x562A, 0, 0, +0x562B, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x322C, 0, 0, + 0, 0, 0, 0,0x413B,0x3464, 0,0x562D, +0x4C28, 0, 0, 0, 0,0x4252, 0,0x3359, + 0, 0,0x562F,0x5631,0x345F, 0, 0,0x562E, +0x5630, 0,0x5633, 0, 0, 0, 0, 0, + 0,0x5632, 0,0x5634, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x5635, 0, 0, + 0, 0, 0, 0,0x463D,0x362E, 0, 0, + 0, 0, 0, 0,0x3265,0x5636,0x563B, 0, + 0,0x5639, 0,0x4A77,0x4A76, 0, 0, 0, + 0, 0,0x4567, 0, 0, 0,0x5638,0x3D54, + 0,0x5637, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x3F72, 0, 0, 0,0x563C, + 0, 0,0x3A6A, 0, 0,0x5642, 0, 0, +0x5643,0x563D,0x3333,0x563E,0x5647,0x5646,0x5645,0x5641, + 0, 0, 0,0x5640, 0, 0,0x5644, 0, + 0, 0, 0, 0, 0,0x4A78}; + +/* page 29 0x5D4B-0x6BF3 */ +static uint16 tab_uni_jisx020829[]={ +0x564B,0x5648, 0,0x564A, 0,0x4D72, 0,0x5649, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x563F, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x3F73, 0, + 0,0x564C, 0, 0,0x3A37, 0, 0, 0, +0x564D, 0, 0,0x564E, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x5651, + 0,0x5650, 0, 0,0x564F, 0, 0, 0, +0x4568,0x563A, 0, 0, 0,0x5657, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x5653, 0, 0, 0, 0,0x5652, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5654, 0,0x5655, 0, 0, 0, 0, + 0, 0, 0, 0,0x5658, 0, 0,0x4E66, + 0,0x5659,0x5656, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x565A, 0, + 0,0x3460,0x565B, 0, 0, 0, 0,0x565D, +0x565C, 0, 0,0x565E, 0, 0, 0, 0, +0x565F, 0,0x406E,0x3D23, 0, 0,0x3D64, 0, +0x4163, 0,0x3929,0x3A38,0x392A,0x3570, 0, 0, +0x5660, 0, 0,0x3A39, 0, 0,0x384A,0x5661, +0x4C26,0x4743,0x5662, 0,0x392B, 0, 0, 0, +0x342C, 0,0x4327,0x3652, 0, 0, 0,0x3B54, +0x495B, 0, 0,0x4841, 0, 0, 0, 0, +0x5663,0x3475, 0, 0, 0, 0,0x5666, 0, + 0, 0, 0,0x4421, 0, 0,0x5665,0x5664, +0x5667, 0,0x446B, 0, 0, 0, 0, 0, + 0, 0,0x3F63, 0, 0, 0, 0, 0, +0x3B55, 0,0x404A, 0,0x4253,0x3522, 0, 0, +0x4422, 0, 0,0x5668,0x5669,0x3E6F, 0, 0, + 0, 0,0x4B39, 0, 0,0x566C, 0, 0, +0x566B,0x566A,0x497D, 0,0x5673, 0, 0, 0, + 0,0x4B5A, 0,0x566D, 0, 0, 0, 0, + 0,0x566F,0x4B6B, 0,0x566E, 0, 0, 0, + 0, 0, 0, 0,0x5670, 0,0x4828,0x5671, +0x4A3E,0x5672, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3433, +0x4A3F,0x472F,0x5674,0x5675, 0,0x392C,0x3434,0x5676, +0x3838,0x4D44,0x4D29,0x3476,0x5678, 0,0x4423, 0, +0x392D,0x3E31, 0, 0,0x485F, 0, 0,0x3E32, + 0, 0, 0, 0,0x3D78, 0, 0, 0, + 0, 0,0x446C,0x4A79,0x4539, 0, 0,0x392E, + 0,0x495C, 0, 0, 0,0x5679, 0, 0, + 0, 0, 0,0x4559,0x3A42, 0, 0, 0, +0x384B, 0,0x446D, 0, 0, 0, 0, 0, + 0, 0,0x3043,0x3D6E,0x392F,0x4D47, 0, 0, + 0, 0, 0, 0, 0, 0,0x567A,0x567B, +0x4751, 0, 0, 0, 0,0x567C,0x4E77,0x4F2D, + 0, 0, 0, 0,0x567E,0x567D, 0, 0, +0x3347, 0, 0,0x5721, 0, 0, 0,0x5724, +0x5725, 0,0x5723, 0,0x4940,0x3E33,0x5727,0x5726, +0x5722, 0, 0, 0, 0,0x5728,0x5729, 0, + 0,0x572A, 0, 0, 0,0x572D,0x572B, 0, +0x572C,0x572E, 0,0x3164,0x446E,0x572F, 0,0x377A, +0x3276,0x4736, 0,0x5730,0x467B, 0,0x4A5B, 0, +0x5731,0x4F2E, 0, 0, 0, 0,0x5732,0x4A40, +0x5735,0x5021,0x5031, 0,0x3C30,0x4675,0x5736, 0, +0x355D,0x4424,0x307A,0x5737,0x4A26,0x3930, 0, 0, +0x4350, 0, 0, 0,0x446F, 0, 0, 0, + 0, 0,0x4C6F,0x3839,0x384C, 0,0x5738, 0, + 0, 0,0x5739, 0,0x573F, 0,0x3C65, 0, + 0, 0,0x4425, 0,0x362F,0x573A, 0, 0, + 0,0x492B, 0,0x4346, 0, 0,0x573B, 0, + 0, 0, 0, 0, 0,0x573C, 0,0x3630, + 0,0x573D, 0,0x573E, 0, 0,0x5740, 0, +0x4576, 0, 0,0x5741,0x5742, 0,0x5743, 0, + 0,0x5734,0x5733, 0, 0, 0,0x5744,0x3741, + 0, 0, 0,0x4927, 0, 0,0x3A4C,0x4937, +0x4426,0x494B,0x5745, 0, 0,0x3E34,0x3146, 0, +0x5746, 0, 0, 0,0x5747, 0,0x4C72, 0, + 0,0x4860, 0, 0,0x574A,0x317D,0x402C,0x5749, +0x5748,0x3742,0x4254, 0,0x574E,0x574C, 0,0x574B, +0x4E27,0x3865, 0, 0, 0,0x3D79,0x574D,0x454C, +0x3D3E, 0, 0, 0,0x4640,0x5751,0x5750, 0, + 0, 0, 0,0x574F, 0,0x5752,0x3866, 0, + 0, 0, 0, 0, 0,0x5753,0x497C,0x3D5B, + 0, 0,0x5754,0x4879, 0, 0, 0, 0, +0x4641,0x4427, 0, 0, 0, 0,0x4530, 0, + 0,0x5755,0x352B, 0, 0, 0, 0, 0, +0x3F34, 0,0x492C, 0, 0, 0, 0, 0, + 0,0x3477,0x4726, 0, 0, 0, 0, 0, + 0, 0, 0,0x5756,0x3B56,0x4B3A,0x4B3B, 0, + 0,0x317E,0x575B, 0, 0,0x4369, 0, 0, + 0,0x5758, 0, 0, 0, 0, 0, 0, +0x3277, 0, 0, 0, 0,0x582D,0x575A, 0, + 0, 0,0x4730, 0, 0,0x5759, 0, 0, +0x5757, 0,0x397A, 0,0x575D, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x5763,0x5769,0x5761, 0,0x455C, + 0, 0,0x5766,0x495D, 0, 0,0x5760, 0, +0x5765,0x4E67,0x3B57, 0, 0,0x4255,0x575E, 0, + 0, 0,0x355E,0x5768,0x402D,0x3165,0x5762,0x3278, +0x5767, 0, 0, 0,0x3631, 0,0x5764, 0, + 0, 0, 0, 0, 0, 0, 0,0x576A, + 0, 0, 0, 0, 0, 0,0x576C,0x5776, +0x5774, 0, 0,0x5771, 0, 0, 0,0x5770, +0x4E78, 0,0x5772, 0, 0,0x3632, 0,0x3931, + 0, 0,0x3D7A, 0, 0, 0,0x5779,0x576B, + 0, 0, 0, 0,0x576F,0x575F, 0,0x327A, +0x5773,0x5775,0x4351, 0, 0,0x3A28,0x3238,0x576D, +0x5778,0x5777,0x3633, 0,0x4229,0x3366, 0, 0, + 0, 0,0x3743, 0,0x576E, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x577A, 0, +0x577D,0x5821, 0, 0, 0, 0,0x3C3D, 0, +0x5827,0x4470,0x577B, 0, 0, 0, 0,0x5825, + 0,0x3279, 0,0x5823,0x5824, 0, 0,0x577E, +0x5822, 0, 0, 0,0x3867,0x4D2A, 0, 0, +0x3435, 0, 0,0x3159,0x5826, 0,0x473A,0x302D, + 0, 0, 0, 0, 0, 0, 0,0x4861, +0x575C,0x582C,0x5830,0x4C65, 0,0x5829, 0, 0, + 0,0x4569,0x582E, 0, 0, 0, 0, 0, + 0, 0,0x3E70,0x582F,0x4657, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x4F47, 0, +0x582B, 0, 0, 0, 0,0x5831, 0,0x397B, + 0,0x404B, 0, 0,0x3054,0x582A,0x5828, 0, +0x415A, 0, 0, 0,0x577C,0x3B34, 0, 0, + 0, 0, 0, 0, 0,0x4246,0x583D, 0, +0x415B,0x5838, 0,0x5835,0x5836, 0,0x3C66,0x5839, +0x583C, 0, 0, 0, 0,0x5837,0x3D25, 0, +0x583A, 0, 0,0x5834, 0,0x4C7C,0x4C7B, 0, + 0, 0,0x583E,0x583F,0x3055, 0, 0, 0, + 0, 0,0x5833, 0, 0, 0, 0,0x3672, +0x3026, 0, 0, 0,0x3436, 0,0x583B, 0, + 0, 0, 0, 0,0x5843,0x5842, 0, 0, + 0,0x5847, 0, 0, 0, 0, 0, 0, + 0,0x5848, 0, 0, 0, 0, 0, 0, + 0,0x5846,0x5849,0x5841,0x5845, 0, 0,0x584A, + 0,0x584B, 0, 0,0x5840,0x3B7C, 0,0x5844, +0x4256,0x3932,0x5832,0x3F35, 0, 0, 0, 0, +0x5858, 0,0x4A69, 0, 0,0x584E,0x584F,0x5850, + 0, 0,0x5857, 0,0x5856, 0, 0,0x4B7D, +0x3437, 0,0x5854, 0,0x3745,0x3334, 0, 0, +0x5851, 0, 0,0x4E38,0x5853,0x3056,0x5855, 0, +0x584C,0x5852,0x5859,0x3744,0x584D, 0, 0, 0, + 0, 0, 0,0x4D5D, 0, 0, 0,0x4D2B, + 0, 0, 0, 0,0x585C, 0, 0,0x5860, + 0, 0, 0,0x417E, 0,0x4E79,0x5861, 0, + 0,0x585E, 0,0x585B, 0, 0,0x585A,0x585F, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x4A30, 0, 0,0x4634, 0,0x3746, 0, +0x5862,0x585D, 0,0x5863, 0, 0, 0,0x377B, + 0, 0, 0,0x3231, 0, 0, 0,0x586B, + 0, 0, 0,0x3438, 0, 0, 0, 0, +0x5869, 0, 0,0x586A,0x3A29,0x5868,0x5866,0x5865, +0x586C,0x5864,0x586E, 0, 0,0x327B, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5870, 0, 0,0x586F, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x4428, + 0,0x5873, 0,0x5871,0x5867,0x377C, 0,0x5872, + 0,0x5876,0x5875,0x5877,0x5874,0x5878, 0, 0, + 0, 0, 0, 0, 0,0x5879,0x587A,0x4A6A, + 0,0x587C,0x587B,0x3D3F, 0,0x402E,0x3266,0x327C, + 0,0x587D, 0,0x303F, 0, 0, 0,0x404C, +0x587E, 0,0x6C43,0x5921,0x3761, 0,0x5922, 0, + 0, 0, 0,0x406F, 0, 0, 0,0x5923, + 0, 0, 0,0x5924,0x353A,0x5925, 0,0x5926, +0x5927,0x4257, 0, 0, 0,0x384D, 0, 0, +0x4C61, 0, 0, 0,0x4B3C,0x3D6A,0x5928, 0, + 0, 0, 0, 0,0x4070,0x6E3D,0x4862, 0, +0x3C6A, 0,0x3A4D,0x5929, 0, 0, 0, 0, +0x4247, 0,0x4A27, 0, 0,0x4271, 0, 0, +0x592C, 0, 0,0x592A, 0,0x592D, 0, 0, +0x592B, 0, 0, 0, 0,0x592E, 0, 0, + 0, 0, 0,0x4A31, 0, 0,0x3037, 0, + 0, 0, 0,0x495E, 0, 0,0x4863, 0, + 0,0x592F, 0,0x5932,0x3E35,0x353B, 0,0x5930, +0x5937,0x3E36, 0, 0, 0, 0,0x5931,0x4744, + 0, 0, 0, 0, 0, 0,0x4D5E,0x5933, +0x5934,0x5938,0x456A,0x5935,0x3933,0x405E, 0, 0, +0x5946,0x4834, 0,0x4272, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4864,0x5A2D, 0, 0, 0, 0,0x4A7A, 0, + 0, 0,0x4471, 0, 0, 0,0x4B75, 0, +0x593B,0x3221,0x436A, 0, 0, 0, 0,0x5944, + 0, 0,0x4334,0x593E,0x5945,0x5940,0x5947,0x5943, + 0,0x5942,0x476F, 0,0x593C,0x327D,0x593A,0x3571, +0x4273,0x5936, 0, 0,0x5939,0x3934,0x405B, 0, +0x3E37,0x5941,0x4752, 0, 0,0x3572,0x3348, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x3367,0x3F21,0x5949,0x594E, 0,0x594A, 0, +0x377D, 0,0x594F,0x3B22,0x3969, 0, 0, 0, + 0, 0, 0,0x3D26,0x593D, 0,0x3B7D,0x594C, + 0, 0, 0, 0,0x3B58,0x594D,0x3044, 0, + 0,0x5948, 0, 0, 0, 0,0x4429, 0, + 0, 0, 0, 0, 0, 0,0x3573, 0, + 0, 0, 0, 0,0x3634, 0, 0, 0, + 0, 0, 0, 0,0x594B,0x3027, 0, 0, +0x3A43, 0, 0, 0,0x3F36, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x4472, + 0, 0,0x4854,0x5951,0x415E, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x422A, 0, + 0,0x3B2B,0x5952, 0,0x5954,0x5950, 0, 0, + 0, 0,0x4A61, 0,0x443D, 0, 0, 0, + 0,0x415C, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x4A7B,0x3C4E,0x5960, 0, +0x595F, 0, 0,0x3F78, 0, 0, 0,0x377E, + 0, 0, 0,0x5959,0x3E39, 0, 0,0x4668, +0x4731, 0, 0, 0, 0,0x5957, 0, 0, +0x415D, 0, 0, 0, 0,0x3C78,0x595C, 0, + 0,0x3E38, 0,0x5956,0x595B, 0, 0,0x4753, + 0, 0, 0,0x5955, 0,0x3721, 0, 0, +0x335D, 0, 0, 0,0x595D,0x4E2B,0x3A4E,0x4335, +0x595A, 0,0x405C, 0,0x3935,0x3F64,0x3166,0x413C, +0x5958,0x3545, 0, 0, 0, 0, 0,0x3747, + 0,0x444F,0x595E, 0, 0, 0, 0, 0, +0x415F, 0, 0,0x5961, 0,0x5963, 0, 0, +0x4237,0x5969, 0,0x5964, 0, 0,0x5966, 0, + 0, 0, 0, 0,0x4941,0x4473, 0,0x5967, + 0, 0, 0,0x4D2C, 0, 0, 0,0x4D48, +0x3439, 0, 0, 0, 0, 0,0x302E, 0, +0x5965, 0, 0, 0, 0, 0,0x5962, 0, + 0, 0, 0,0x3478, 0, 0, 0, 0, + 0,0x3167, 0,0x5968, 0, 0, 0,0x4D49, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x596C, 0, 0, 0, 0, + 0, 0,0x423B, 0,0x5973, 0, 0, 0, +0x596D, 0, 0,0x596A,0x5971, 0, 0, 0, + 0,0x5953, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x596E, 0,0x5972, 0, 0, + 0,0x4842,0x456B, 0, 0, 0, 0, 0, + 0,0x596B, 0,0x596F, 0, 0, 0,0x3748, + 0, 0, 0,0x3A71, 0, 0, 0,0x405D, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x5977, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x4526, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x5974, 0,0x4B60, 0, + 0, 0, 0, 0,0x5975, 0, 0, 0, + 0, 0, 0,0x5976, 0,0x4C4E, 0,0x4022, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3762, 0, 0, 0, 0,0x597D, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3B35, +0x597A, 0,0x5979, 0, 0, 0, 0,0x4732, + 0, 0, 0,0x4635, 0, 0, 0, 0, + 0,0x4531,0x597B, 0, 0, 0,0x597C, 0, +0x496F, 0,0x4745,0x3B23, 0,0x4071, 0,0x4B50, + 0, 0, 0, 0, 0, 0,0x3349, 0, +0x5A25,0x597E, 0, 0, 0, 0,0x4D4A,0x5A27, + 0, 0,0x5A23, 0,0x5A24, 0, 0, 0, + 0, 0,0x4160, 0, 0, 0, 0,0x5A22, + 0,0x593F, 0, 0, 0,0x5A26, 0,0x5A21, + 0, 0, 0, 0, 0,0x5A2B,0x5A2C,0x4527, +0x5A2E, 0, 0,0x3B24,0x5A29, 0, 0, 0, + 0,0x353C, 0, 0,0x5A2F, 0,0x5A28,0x5A33, + 0,0x5A32, 0,0x5A31, 0, 0, 0,0x5A34, + 0, 0,0x5A36,0x3E71, 0,0x5A35, 0, 0, + 0, 0,0x5A39, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x5A37, 0, 0, + 0,0x5A38,0x5970, 0, 0, 0, 0, 0, +0x5A3B,0x5A3A, 0, 0, 0, 0, 0,0x5978, +0x5A3C,0x5A30, 0, 0,0x3B59, 0, 0, 0, + 0,0x5A3D,0x5A3E,0x5A40,0x5A3F,0x5A41,0x327E, 0, +0x3936, 0, 0,0x4A7C,0x402F, 0, 0, 0, + 0, 0,0x384E, 0, 0,0x5A43, 0, 0, + 0, 0,0x5A46, 0,0x4952, 0,0x355F, 0, + 0, 0,0x5A45,0x5A44,0x4754,0x5A47,0x3635, 0, + 0, 0,0x5A49,0x5A48, 0, 0, 0,0x343A, +0x3B36, 0, 0,0x4658, 0, 0, 0, 0, + 0,0x3749, 0, 0, 0,0x3F74, 0,0x5A4A, + 0,0x4030,0x4528, 0,0x495F,0x5A4B, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x5A4C, +0x5A4D, 0, 0, 0,0x4A38,0x555D,0x4046, 0, + 0,0x494C, 0,0x3A58, 0,0x4865,0x4843, 0, + 0, 0, 0, 0,0x454D, 0,0x4E41, 0, +0x5A4F,0x3C50, 0, 0,0x5A50, 0,0x3036, 0, + 0,0x3654,0x404D, 0,0x4960, 0, 0, 0, +0x5A51,0x3B42,0x4347, 0,0x3B5B,0x3F37, 0, 0, + 0, 0, 0, 0,0x5A52, 0,0x4A7D, 0, + 0,0x3177,0x3B5C, 0, 0, 0,0x5A55, 0, +0x5A53,0x5A56,0x4E39,0x5A54, 0, 0, 0, 0, +0x407B,0x5A57, 0, 0,0x4232, 0, 0,0x5A58, + 0, 0, 0, 0,0x347A, 0,0x5A5A, 0, +0x5A59, 0, 0, 0, 0,0x5A5B,0x5A5C,0x347B, + 0, 0,0x467C,0x4336,0x356C,0x3B5D,0x4161, 0, + 0,0x3D5C,0x3030, 0, 0, 0,0x5A5D, 0, + 0, 0, 0, 0, 0, 0, 0,0x3222, +0x5A61, 0, 0, 0, 0, 0, 0,0x3937, +0x5A60, 0, 0,0x3A2B,0x3E3A, 0, 0,0x5A5F, + 0,0x3E3B, 0,0x4C40,0x3A2A, 0, 0, 0, +0x3057,0x404E, 0, 0, 0, 0, 0, 0, + 0,0x5A66, 0, 0,0x4031,0x3147, 0, 0, + 0, 0,0x3D55, 0,0x4B66,0x3A72, 0, 0, + 0, 0,0x3E3C, 0,0x4027, 0, 0, 0, + 0,0x5A65,0x5A63,0x5A64, 0, 0, 0, 0, + 0,0x436B, 0, 0,0x5B26, 0,0x5A6A,0x3B7E, +0x3938,0x5A68, 0, 0, 0, 0,0x5A69, 0, +0x3F38, 0, 0, 0,0x5A67, 0, 0,0x3B2F, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x5A6C,0x5A6B,0x5A70, 0, 0,0x5A71, + 0,0x5A6D, 0,0x3322,0x5A6E,0x5A6F,0x4855, 0, + 0, 0, 0,0x4961,0x374A,0x5A72, 0, 0, + 0,0x4032, 0,0x3E3D, 0, 0, 0,0x4352, + 0, 0, 0, 0, 0, 0,0x3647, 0, +0x5A73,0x5A77, 0, 0,0x324B,0x5A74,0x5A76, 0, + 0, 0, 0,0x5A75, 0, 0,0x3D6B, 0, + 0, 0, 0,0x4348,0x3045,0x5A78, 0, 0, + 0, 0,0x5A79, 0, 0, 0, 0,0x442A, + 0, 0, 0,0x4E71, 0, 0, 0, 0, +0x3B43, 0, 0,0x4A6B, 0, 0, 0, 0, + 0,0x4B3D, 0, 0, 0,0x5B22,0x5A7B, 0, + 0,0x5A7E, 0,0x5A7D, 0, 0,0x5A7A, 0, + 0,0x5B21, 0, 0,0x465E, 0,0x5A7C, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x5B23, 0, 0,0x3D6C,0x5B24, + 0,0x4D4B,0x4778, 0, 0,0x5B25, 0, 0, + 0, 0, 0,0x5B27, 0, 0,0x5B28, 0, + 0, 0, 0, 0, 0,0x5B29, 0,0x364A, +0x3148,0x3939,0x5B2A, 0,0x5B2B,0x3D71,0x4162, 0, + 0,0x5258,0x413E,0x413D,0x4258,0x3A47, 0, 0, +0x5072, 0, 0, 0, 0,0x376E,0x4D2D, 0, +0x4A7E, 0,0x497E, 0,0x5B2C, 0, 0, 0, + 0,0x3A73,0x443F,0x5B2D,0x4F2F, 0, 0, 0, +0x4B3E, 0,0x442B,0x5B2E,0x347C, 0, 0, 0, + 0, 0, 0,0x5B2F,0x5B30,0x4C5A, 0,0x4C24, +0x4B76,0x4B5C,0x3B25,0x5B32, 0, 0,0x3C6B, 0, + 0,0x4B51, 0,0x5B34,0x5B37,0x5B36, 0,0x3479, + 0, 0,0x3560, 0,0x5B33, 0,0x5B35, 0, + 0, 0, 0,0x5B38, 0, 0,0x3F79, 0, + 0, 0, 0,0x4D7B,0x3049,0x3A60,0x423C, 0, +0x3C5D, 0, 0,0x3E73, 0, 0,0x5B3B, 0, + 0,0x454E, 0,0x5B39,0x422B,0x5B3A,0x3E72,0x4C5D, +0x5B3C,0x5B3D,0x4D68, 0, 0, 0, 0,0x5B42, + 0, 0,0x393A, 0,0x4755,0x5B3F,0x456C,0x5A5E, +0x5A62, 0,0x354F, 0,0x4747, 0, 0, 0, + 0,0x5B41, 0,0x3E3E,0x4844, 0, 0, 0, + 0, 0,0x5B47, 0,0x487A, 0,0x5B3E, 0, +0x5B44,0x5B43, 0, 0, 0,0x404F, 0, 0, + 0, 0,0x4B6D, 0,0x4E53, 0, 0,0x4B67, + 0,0x324C,0x3B5E, 0, 0,0x4F48,0x5B46,0x3F75, + 0, 0, 0,0x5B45, 0, 0,0x5B40, 0, + 0, 0, 0, 0,0x384F, 0, 0, 0, +0x5B4C,0x5B4A, 0,0x324D,0x5B48,0x5B4E,0x5B54, 0, + 0, 0, 0, 0, 0, 0,0x4248, 0, + 0,0x4A41, 0,0x5B56, 0, 0, 0,0x4922, + 0, 0, 0,0x5B55,0x4770,0x4B3F,0x343B, 0, +0x4077,0x3D40, 0, 0, 0,0x4453, 0,0x4D2E, + 0, 0,0x5B51,0x5B50, 0, 0, 0,0x5B52, + 0,0x5B4F, 0, 0,0x5B57, 0,0x5B4D, 0, + 0,0x5B4B, 0,0x5B53,0x5B49, 0,0x436C, 0, +0x4C78,0x3C46,0x3A74, 0, 0, 0, 0, 0, +0x3A3A, 0, 0,0x4B6F,0x3341, 0, 0,0x444E, +0x464A,0x3149, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4072, 0, 0,0x4034,0x372A, 0, 0, 0, + 0, 0, 0,0x5B59, 0, 0,0x393B,0x337C, + 0, 0, 0, 0, 0, 0,0x5B5B,0x3374, +0x5B61, 0, 0, 0, 0, 0, 0,0x5B5E, + 0,0x4073, 0, 0, 0,0x334B,0x3A2C, 0, + 0,0x334A,0x3A4F, 0, 0,0x5B5C,0x3765,0x374B, +0x456D, 0, 0,0x5B5A, 0,0x3046, 0, 0, + 0, 0,0x5B5D,0x5B5F, 0,0x364D,0x372C, 0, +0x343C,0x354B, 0, 0, 0, 0,0x5B62, 0, + 0,0x3A79,0x4B71, 0,0x3B37, 0, 0, 0, +0x5B63, 0, 0, 0,0x4930, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5B6F, 0,0x3233,0x5B64, 0, 0, 0, + 0, 0, 0,0x5B75,0x5B65, 0,0x4E42, 0, +0x5B6C, 0,0x475F, 0, 0, 0, 0, 0, + 0, 0,0x5B74, 0,0x5B67, 0, 0, 0, +0x3034,0x5B69, 0, 0,0x393C, 0, 0, 0, +0x5B6B, 0,0x5B6A, 0,0x5B66,0x5B71, 0,0x3E3F, + 0, 0, 0,0x546D,0x3868,0x4D7C, 0, 0, + 0, 0,0x5B68, 0,0x4474,0x3323,0x3A2D, 0, +0x5B60, 0,0x5B70,0x3361, 0, 0,0x5B6E,0x5B72, + 0,0x456E, 0, 0, 0, 0, 0, 0, + 0,0x347E, 0,0x5C32, 0, 0,0x4C49,0x5B77, +0x347D, 0,0x5B7E, 0, 0, 0, 0,0x4B40, + 0,0x5C21,0x5C23, 0,0x5C27,0x5B79, 0,0x432A, + 0, 0, 0, 0,0x456F,0x5C2B,0x5B7C, 0, +0x5C28, 0, 0, 0,0x5C22, 0, 0, 0, + 0, 0, 0,0x3F39,0x5C2C, 0, 0,0x4033, + 0, 0, 0, 0, 0, 0,0x5C2A,0x343D, + 0, 0, 0, 0, 0,0x4F50,0x5B76, 0, + 0,0x5C26,0x3058, 0, 0,0x5B78, 0, 0, +0x4C3A,0x5B7D,0x3F22,0x4447,0x5B73, 0, 0,0x5C25, + 0, 0, 0, 0, 0, 0,0x3F7A,0x5C2F, +0x3371,0x3821, 0, 0, 0, 0,0x5C31,0x5B7A, +0x5C30, 0,0x5C29,0x5B7B, 0,0x5C2D, 0,0x5C2E, + 0, 0, 0, 0, 0,0x5C3F, 0, 0, + 0,0x464E, 0,0x5C24, 0, 0,0x5C3B, 0, + 0, 0,0x5C3D, 0,0x4458, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x4D4C, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4976,0x5C38,0x424A, 0, 0, 0,0x5C3E,0x413F, + 0,0x5C35,0x5C42,0x5C41, 0,0x466F,0x5C40,0x466A, + 0, 0, 0, 0, 0, 0, 0,0x5C44, +0x5C37, 0,0x3648,0x5C3A,0x3D5D, 0, 0, 0, +0x4760,0x5C3C,0x364B, 0,0x5C34,0x5C36,0x5C33, 0, + 0,0x4F30,0x335A,0x5C39, 0, 0,0x5C43,0x3335, + 0, 0, 0, 0, 0, 0, 0,0x3A67, + 0, 0, 0,0x315D, 0, 0,0x5C54, 0, + 0,0x4F31,0x5C57, 0, 0, 0, 0, 0, +0x3F3A,0x5C56, 0, 0, 0,0x5C55, 0, 0, + 0, 0, 0, 0,0x5C52, 0, 0, 0, + 0, 0, 0,0x5C46, 0, 0,0x5C63,0x5C45, + 0,0x5C58, 0, 0, 0, 0, 0, 0, +0x5C50, 0, 0,0x5C4B,0x5C48, 0,0x5C49, 0, +0x5C51, 0, 0, 0,0x7422, 0, 0,0x5C4E, +0x393D,0x4448,0x4164,0x5C4C, 0,0x5C47, 0, 0, +0x5C4A, 0, 0, 0, 0,0x4D4D,0x4B6A, 0, + 0, 0,0x5C4F,0x5C59, 0, 0, 0, 0, + 0, 0, 0, 0,0x5C61,0x5C5A, 0, 0, +0x5C67, 0,0x5C65, 0, 0, 0, 0,0x5C60, + 0, 0, 0, 0, 0, 0,0x5C5F, 0, +0x4450, 0,0x4165, 0,0x5C5D, 0, 0,0x5C5B, + 0, 0,0x5C62, 0, 0, 0, 0,0x5C68, +0x4875,0x5C6E, 0, 0, 0, 0, 0,0x5C69, +0x5C6C,0x5C66, 0, 0,0x4374, 0,0x4938, 0, +0x5C5C, 0, 0,0x5C64,0x3E40, 0,0x4C4F,0x5C78, +0x5C6B, 0, 0, 0, 0, 0,0x3822,0x3223, +0x335F, 0, 0,0x5C53, 0, 0, 0, 0, + 0, 0,0x3E41,0x5C70, 0,0x5C77,0x3C79,0x3372, + 0, 0,0x432E, 0, 0, 0, 0, 0, + 0,0x5C6D, 0, 0,0x5C72,0x5C76, 0, 0, +0x3636, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x354C,0x5C74, 0, + 0, 0, 0, 0,0x3521, 0,0x464B,0x5C73, + 0, 0, 0,0x5C75, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x5C6F, + 0, 0, 0, 0, 0,0x5C71, 0, 0, + 0, 0, 0, 0,0x3360,0x4349, 0, 0, + 0,0x5C7C, 0, 0, 0, 0, 0, 0, + 0, 0,0x5C7A,0x3869, 0,0x5C79, 0, 0, + 0, 0, 0, 0,0x5D21, 0, 0, 0, + 0,0x5B58, 0, 0, 0,0x5C7B, 0,0x5C7D, +0x5C7E, 0, 0, 0, 0, 0, 0,0x5D2C, + 0,0x5D28, 0,0x5B6D, 0, 0, 0, 0, +0x5D27, 0, 0, 0, 0,0x5D26, 0, 0, +0x5D23, 0, 0, 0, 0, 0,0x5C6A,0x5D25, +0x5D24, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x5D2A, 0, +0x4F26, 0, 0, 0, 0, 0, 0,0x5D2D, +0x367B, 0, 0,0x5D29,0x5D2B, 0, 0, 0, + 0, 0, 0, 0, 0,0x4827, 0,0x5D2E, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x5D32, +0x5D2F, 0, 0, 0, 0, 0, 0, 0, + 0,0x4D73,0x5D30, 0, 0, 0, 0,0x5C5E, + 0, 0, 0, 0, 0, 0, 0,0x5D33, + 0, 0, 0,0x5D34, 0, 0, 0, 0, + 0, 0,0x3135, 0,0x5D36,0x3767,0x3C21, 0, +0x3655, 0, 0, 0,0x3224, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x4D5F, + 0, 0, 0, 0,0x5D38,0x5D37,0x5D3A,0x353D, + 0, 0,0x3656,0x343E, 0, 0, 0, 0, +0x5D3D, 0, 0, 0,0x5D3C, 0,0x5D3E, 0, + 0,0x324E, 0,0x4337, 0,0x5D3F, 0, 0, +0x343F,0x5D41, 0, 0, 0, 0,0x5D40, 0, +0x5D42, 0, 0, 0,0x5D43, 0,0x5D44,0x3B5F, +0x4035,0x3A21, 0,0x4970, 0, 0,0x4A62,0x4F44, + 0, 0, 0, 0,0x3B75, 0, 0, 0, +0x3A50,0x4E72, 0, 0, 0,0x5D45,0x5D46, 0, +0x3B60, 0, 0, 0,0x5D47,0x5D48, 0, 0, +0x5D4A,0x5D49, 0,0x4B58, 0, 0,0x3D5E,0x3C6C, +0x3B44, 0,0x5D4B, 0, 0, 0, 0, 0, + 0, 0,0x5D4D,0x3F23, 0,0x5D4C, 0, 0, + 0, 0, 0,0x5D4E, 0, 0, 0, 0, + 0,0x5D4F, 0, 0, 0, 0, 0,0x5D50, +0x5D51, 0, 0, 0,0x5D52, 0,0x5D54,0x5D53, +0x5D55,0x3225,0x434A, 0,0x5D56, 0, 0,0x3B26, +0x334C,0x5D57, 0, 0,0x4542,0x544C, 0, 0, + 0, 0,0x3523,0x5D58, 0, 0, 0, 0, +0x5D59, 0,0x4A6C,0x4B68, 0, 0, 0,0x4647, +0x5D5A,0x4866, 0, 0, 0,0x487B, 0, 0, +0x4C53, 0, 0, 0,0x5D5B, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5D5D,0x5D5C, 0, 0,0x5D5F, 0, 0, 0, +0x5D5E}; + +/* page 30 0x6C08-0x6CF3 */ +static uint16 tab_uni_jisx020830[]={ +0x5D61, 0, 0, 0, 0, 0, 0,0x3B61, + 0,0x4C31, 0,0x5D62,0x5D63, 0, 0,0x3524, + 0, 0, 0,0x5D64, 0, 0, 0, 0, + 0, 0, 0,0x5D66,0x5D65, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x3F65, 0, 0,0x4939, +0x314A, 0, 0, 0, 0, 0,0x4845, 0, +0x4475,0x3D41,0x3561, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x4846, 0, +0x3C2E, 0, 0, 0, 0,0x5D68, 0,0x3440, + 0, 0,0x3178, 0, 0,0x4672,0x5D67,0x393E, +0x4353, 0,0x5D69, 0, 0, 0, 0, 0, +0x5D71, 0,0x5D6A, 0, 0, 0, 0, 0, +0x4241, 0,0x3562,0x5D72, 0, 0, 0, 0, + 0, 0,0x3768, 0, 0,0x3525,0x5D70, 0, + 0,0x5D6E,0x5D6B,0x4D60, 0, 0, 0, 0, +0x4440, 0, 0, 0,0x4659,0x5D6C, 0, 0, +0x5D74, 0,0x5D73,0x3723, 0, 0,0x322D, 0, + 0,0x3A3B,0x5D6D,0x5D6F, 0, 0, 0, 0, + 0,0x4B57,0x4274, 0, 0, 0, 0, 0, + 0, 0, 0,0x4B77, 0, 0,0x5D7C, 0, + 0,0x5D7D, 0,0x324F, 0, 0, 0, 0, +0x4A28,0x4C7D,0x5E21,0x3C23,0x3E42,0x5D78,0x5D7E,0x3168, + 0,0x3637, 0, 0,0x5D75,0x5D7A, 0, 0, + 0,0x4074,0x4771, 0,0x4867, 0, 0, 0, + 0, 0, 0,0x5D77, 0,0x4B21, 0,0x5D79, + 0,0x5E24, 0,0x5E22, 0,0x5D7B, 0, 0, + 0,0x4B22,0x4748,0x3563, 0,0x4525, 0, 0, +0x436D, 0,0x5E25, 0, 0, 0, 0,0x5E23, +0x4259,0x5D76, 0,0x314B}; + +/* page 31 0x6D0B-0x7409 */ +static uint16 tab_uni_jisx020831[]={ +0x4D4E,0x5E30, 0, 0, 0, 0, 0,0x5E2F, + 0, 0, 0, 0,0x4076, 0,0x5E2C, 0, +0x4D6C, 0, 0,0x4636,0x5E26, 0, 0, 0, + 0, 0,0x4445, 0, 0, 0,0x314C,0x393F, +0x5E29, 0, 0, 0, 0, 0, 0,0x3D27, +0x5E2E, 0,0x5E2D,0x5E28, 0,0x5E2B, 0, 0, +0x3368, 0,0x5E2A,0x4749, 0, 0,0x4E2E, 0, + 0,0x3E74,0x4075, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x5E36,0x5E34, + 0,0x494D, 0, 0, 0, 0, 0, 0, +0x5E31,0x5E33, 0,0x313A, 0, 0,0x3940,0x4F32, + 0,0x333D, 0,0x4962, 0, 0, 0, 0, + 0,0x4D61, 0, 0,0x3324,0x3F3B,0x5E35, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x5E3A, 0, 0,0x3E43, 0, 0, + 0,0x4D30, 0,0x5E37, 0, 0, 0, 0, +0x5E32, 0,0x5E38, 0, 0, 0,0x4E5E, 0, +0x4573,0x4642, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x3336, 0, 0,0x3155, + 0, 0,0x5E3E, 0, 0,0x5E41, 0, 0, + 0,0x4E43, 0, 0, 0,0x4D64, 0, 0, + 0, 0,0x5E48,0x5E42,0x5E3F, 0, 0, 0, +0x4E54,0x5E45, 0, 0, 0, 0,0x3D4A,0x5E47, + 0, 0,0x5E4C, 0, 0,0x4571,0x5E4A, 0, + 0, 0, 0,0x5E44, 0, 0,0x4338, 0, + 0,0x5E4B, 0,0x5E40, 0,0x5E46, 0,0x5E4D, +0x307C,0x5E43, 0,0x5E4E, 0, 0,0x3F3C, 0, +0x3D5F, 0,0x4A25, 0,0x3A2E, 0,0x5E3B,0x5E49, +0x453A, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x4036, 0,0x3369,0x3A51,0x3E44,0x5E3D, +0x3D42, 0, 0, 0, 0, 0, 0, 0, +0x374C, 0,0x5E3C, 0, 0, 0,0x5E52,0x3D6D, +0x383A, 0,0x5E61, 0,0x5E5B,0x3574,0x454F, 0, +0x5E56,0x5E5F,0x302F,0x3132, 0, 0,0x3239, 0, +0x5E58,0x422C,0x5E4F,0x5E51,0x3941, 0, 0, 0, + 0, 0, 0, 0, 0,0x5E62, 0,0x5E5D, + 0, 0, 0,0x5E55, 0, 0, 0, 0, +0x5E5C, 0, 0, 0, 0, 0, 0,0x4C2B, + 0, 0,0x5E5A,0x5E5E, 0, 0, 0, 0, + 0, 0, 0,0x3850, 0,0x3E45, 0, 0, +0x4339, 0, 0, 0,0x5E54, 0, 0, 0, + 0, 0, 0, 0,0x4D2F, 0, 0, 0, +0x5E57, 0, 0,0x5E50,0x4572, 0, 0,0x5E53, + 0, 0, 0,0x5E59, 0, 0, 0, 0, + 0, 0, 0,0x4F51,0x3C3E,0x4B7E, 0,0x5E63, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x482E, 0, 0,0x5E6F,0x383B, 0, 0, + 0, 0, 0,0x3D60, 0,0x5E65, 0, 0, + 0,0x4E2F,0x3942, 0,0x5E72, 0, 0,0x306E, + 0, 0,0x5E70, 0, 0, 0, 0,0x5E64, + 0, 0, 0, 0,0x5E6A, 0, 0,0x5E6C, + 0, 0, 0,0x4D4F,0x5E67, 0, 0,0x452E, + 0, 0,0x5E69, 0, 0, 0, 0,0x5E71, + 0,0x5E6B,0x4C47, 0, 0, 0,0x5E66, 0, +0x3C22,0x5E7E, 0, 0, 0, 0,0x336A, 0, +0x5E68,0x5E6D,0x5E6E, 0, 0, 0, 0, 0, + 0, 0,0x426C,0x425A, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5E76, 0, 0,0x5E7C, 0, 0,0x5E7A, + 0,0x4529, 0, 0,0x5F23,0x5E77, 0, 0, + 0, 0, 0,0x5E78,0x5E60, 0,0x3579,0x493A, + 0, 0, 0,0x3C3F, 0, 0,0x3977, 0, + 0, 0, 0, 0,0x4F33, 0,0x5E74, 0, +0x5F22,0x3169,0x4166, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x4779, 0,0x3441, +0x4E7A, 0, 0, 0, 0, 0, 0, 0, +0x4C21,0x4452, 0, 0, 0, 0,0x5E7B,0x5E7D, + 0, 0, 0, 0, 0,0x4132, 0, 0, + 0, 0, 0,0x5F21,0x5E79, 0,0x5E73, 0, + 0, 0,0x3443, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x3769, 0, 0, 0,0x5F2F, 0, 0, +0x5F2A,0x4078, 0, 0,0x3363, 0, 0, 0, + 0,0x3D61, 0,0x5F33, 0, 0, 0, 0, + 0, 0,0x5F2C,0x442C,0x5F29,0x4459, 0, 0, + 0,0x5F4C, 0, 0, 0,0x5F26, 0,0x5F25, + 0,0x5F2E, 0, 0, 0,0x5F28,0x5F27,0x5F2D, + 0,0x4021, 0,0x5F24, 0, 0, 0, 0, + 0, 0, 0,0x5F30, 0, 0,0x5F31, 0, + 0, 0, 0, 0,0x3442, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x5F36, 0, +0x5F35,0x5F37, 0, 0, 0, 0, 0,0x5F3A, + 0, 0, 0, 0, 0, 0,0x4543, 0, +0x5F34, 0, 0, 0, 0, 0,0x5F38, 0, + 0, 0, 0, 0, 0,0x3763,0x4279,0x5F32, +0x473B, 0, 0,0x5F39, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5F3E,0x5F3C, 0, 0,0x5F3F, 0, 0, +0x5F42, 0, 0, 0,0x5F3B,0x396A,0x4728, 0, + 0,0x5E39, 0, 0, 0, 0, 0, 0, +0x4D74,0x5F3D, 0,0x5F41,0x4275, 0,0x5F40, 0, +0x5F2B, 0, 0,0x6F69, 0, 0, 0,0x5F45, + 0, 0, 0,0x5F49, 0, 0,0x5F47, 0, + 0, 0, 0, 0, 0, 0,0x5F43, 0, +0x5F44, 0, 0, 0,0x5F48, 0,0x5F46, 0, + 0, 0,0x494E, 0, 0,0x5F4E, 0,0x5F4B, +0x5F4A, 0,0x5F4D,0x4654,0x5F4F, 0, 0, 0, + 0, 0, 0,0x4375,0x426D, 0, 0, 0, + 0,0x4025, 0, 0, 0,0x5F50, 0,0x5F52, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x5F51, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5E75, 0, 0, 0, 0,0x5F53, 0, + 0, 0, 0, 0, 0,0x4667, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5F54, 0, 0, 0, 0, 0, 0, 0, +0x3250, 0, 0, 0,0x4574,0x3325, 0, 0, + 0, 0, 0, 0, 0,0x3564, 0, 0, + 0,0x3C5E,0x3A52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x4F27,0x3F66, + 0, 0, 0,0x316A, 0, 0, 0,0x5F56, + 0, 0, 0, 0, 0, 0,0x5F55, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5F59,0x433A,0x5F5C,0x5F57, 0, 0, 0, +0x5F5B, 0, 0, 0, 0,0x5F5A,0x4540,0x3059, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x4E75, 0, 0, +0x5F5E, 0, 0, 0,0x3128, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x5F60, 0, + 0, 0,0x5F5F, 0,0x5F5D, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x5F58, 0, + 0, 0, 0, 0, 0, 0,0x4B23, 0, + 0, 0,0x5F62, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x5F61, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x316B, 0, 0, 0, 0,0x5F64,0x4A32, + 0,0x5F63, 0, 0, 0, 0,0x4C35, 0, + 0, 0, 0,0x3E47, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x4133, 0, 0, 0, 0, + 0,0x3E46, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x4E7B, 0, + 0,0x5F6A, 0,0x4079, 0, 0, 0, 0, + 0, 0,0x5F66,0x5F6B, 0, 0,0x316C, 0, + 0, 0, 0, 0, 0, 0, 0,0x5F69, + 0,0x4761,0x5F65,0x5F68,0x3E48, 0,0x4851, 0, + 0,0x5F6C, 0,0x3C51, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x407A, 0, 0, 0, 0, 0, + 0,0x5F6F, 0, 0, 0,0x5F67, 0,0x3727, + 0, 0, 0, 0,0x5F6D, 0, 0, 0, + 0,0x4D50,0x5F70, 0, 0, 0,0x7426, 0, + 0, 0, 0, 0,0x3D4F, 0, 0, 0, + 0, 0, 0, 0, 0,0x5F71, 0, 0, + 0,0x5F72, 0, 0, 0, 0,0x472E, 0, + 0, 0, 0, 0, 0, 0,0x5F74, 0, + 0, 0, 0,0x5F75, 0, 0, 0, 0, +0x4733, 0, 0, 0, 0,0x4575,0x5F77, 0, + 0, 0, 0,0x5F79, 0,0x4E55, 0,0x5F76, + 0,0x5F78,0x316D, 0,0x5F73, 0, 0, 0, + 0, 0, 0, 0,0x535B,0x5F7A, 0, 0, + 0, 0,0x4167,0x3B38,0x5F7C, 0, 0, 0, + 0,0x5F7B,0x3F24,0x5259, 0, 0, 0, 0, + 0, 0,0x5F7D, 0, 0, 0,0x6021, 0, +0x5F6E,0x5F7E, 0, 0,0x6022, 0, 0, 0, + 0, 0, 0,0x477A, 0, 0, 0, 0, + 0, 0,0x6023, 0, 0,0x6024, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6025, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x6026, 0,0x445E, + 0,0x6028,0x6027, 0, 0,0x6029, 0,0x602A, + 0, 0,0x3C5F,0x4963, 0, 0, 0,0x4C6C, +0x602B,0x602C,0x4156,0x3C24,0x602D,0x602E, 0, 0, + 0, 0, 0,0x602F,0x4A52,0x4847, 0, 0, +0x6030,0x4757, 0, 0, 0, 0, 0,0x442D, + 0, 0, 0, 0, 0,0x6031,0x3267, 0, +0x356D, 0,0x4C46, 0,0x4C36, 0,0x3234,0x4F34, + 0, 0, 0, 0,0x4B52, 0,0x4A2A, 0, + 0, 0, 0, 0, 0, 0, 0,0x4037, + 0,0x6032, 0, 0, 0, 0,0x4643, 0, + 0, 0,0x3823,0x6033, 0,0x3A54,0x6035,0x6034, + 0, 0, 0, 0,0x6036, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x6037, + 0, 0, 0,0x6038, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x353E, 0,0x6039, + 0, 0, 0, 0,0x603A, 0, 0, 0, + 0,0x3824, 0, 0,0x4848, 0, 0,0x603C, + 0, 0, 0,0x3E75, 0, 0,0x603B, 0, + 0, 0, 0, 0, 0, 0, 0,0x3638, +0x603D,0x603F, 0,0x603E, 0, 0, 0, 0, + 0, 0, 0,0x6040, 0,0x3851, 0,0x6041, + 0, 0, 0, 0,0x3669, 0,0x4140, 0, +0x397D, 0, 0, 0, 0,0x6043,0x6044,0x6042, + 0, 0, 0, 0, 0, 0,0x3C6D, 0, + 0,0x4648,0x3639, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x6046,0x432C,0x6045, 0, + 0,0x4F35,0x4762, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x6049, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x604B,0x6048, 0, 0, 0, +0x4C54,0x604A,0x604C, 0,0x4E44, 0, 0, 0, + 0, 0,0x6050, 0, 0, 0,0x604F,0x4376, +0x472D, 0, 0,0x3825,0x604E, 0, 0, 0, + 0,0x604D, 0,0x4D31,0x4D32, 0, 0, 0, + 0, 0, 0,0x6051,0x316E, 0, 0, 0, + 0,0x3976,0x3B62, 0, 0, 0, 0, 0, + 0, 0, 0,0x6052,0x6053, 0, 0, 0, + 0, 0, 0, 0,0x6055, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3D43, 0, 0, 0, 0,0x6057, 0,0x6056, + 0, 0, 0, 0, 0,0x6058, 0,0x334D, + 0, 0,0x605A, 0, 0,0x6059, 0,0x605C, +0x605B, 0, 0, 0, 0, 0, 0, 0, + 0,0x383C, 0, 0,0x4E28, 0,0x364C, 0, +0x3226, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x366A, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x3461, 0, + 0, 0, 0, 0, 0, 0, 0,0x4E68, +0x605E, 0, 0, 0, 0, 0, 0, 0, +0x6060, 0, 0, 0, 0,0x6061, 0,0x3251, + 0, 0, 0, 0, 0,0x605D, 0,0x3B39, + 0, 0,0x4441,0x605F, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x6064, 0,0x3C6E, 0, 0, + 0, 0,0x6062, 0, 0, 0, 0,0x373E, + 0, 0,0x4849,0x6063, 0, 0,0x607E, 0, + 0, 0, 0, 0, 0,0x6069, 0, 0, + 0, 0, 0,0x383D, 0, 0, 0, 0, +0x3565, 0,0x6066,0x4D7D, 0, 0,0x4E30}; + +/* page 32 0x7422-0x7845 */ +static uint16 tab_uni_jisx020832[]={ +0x4276, 0, 0,0x6068, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x606A,0x4E56,0x3657,0x487C,0x474A, 0, 0, 0, +0x606B, 0, 0, 0, 0,0x606D, 0,0x6070, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x606C, 0, 0, 0,0x606F, +0x386A,0x314D,0x6071, 0,0x3F70,0x606E,0x4E5C, 0, + 0,0x6074,0x7424, 0, 0, 0, 0,0x6072, +0x6075, 0, 0, 0, 0,0x6067,0x6073, 0, + 0,0x3A3C, 0, 0,0x6076, 0, 0, 0, + 0, 0, 0, 0,0x6077, 0, 0, 0, + 0,0x4D7E, 0, 0, 0, 0, 0, 0, + 0,0x6078, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x6079, 0, 0, 0, +0x6065, 0, 0, 0, 0,0x607A, 0, 0, + 0, 0, 0, 0, 0, 0,0x3444, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x3C25, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x607B, 0, 0, 0, 0,0x607C, 0, 0, + 0, 0,0x607D, 0, 0, 0, 0, 0, + 0, 0,0x313B, 0, 0, 0,0x6121, 0, +0x493B,0x6122, 0, 0,0x3424,0x6123, 0,0x6124, + 0, 0, 0, 0,0x6125, 0,0x6127,0x6128, +0x6126, 0, 0, 0,0x4953,0x612A,0x6129, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x612C,0x612B,0x612D, 0, 0, 0, 0, + 0, 0,0x612E,0x6130,0x612F, 0, 0,0x3979, + 0,0x6132, 0,0x6131, 0, 0,0x3445, 0, +0x3F53, 0,0x453C, 0,0x6133,0x4038, 0, 0, + 0,0x3B3A, 0,0x3179,0x6134, 0,0x4D51, 0, + 0,0x4A63,0x6135, 0, 0, 0,0x4544,0x4D33, +0x3943,0x3F3D, 0, 0, 0,0x434B,0x5234, 0, +0x442E,0x3268,0x6136, 0, 0, 0, 0, 0, + 0, 0,0x6137, 0,0x613C, 0, 0,0x613A, +0x6139,0x5A42,0x3326,0x6138, 0,0x305A, 0,0x482A, + 0, 0,0x484A, 0, 0, 0, 0,0x4E31, +0x613D,0x613B,0x435C,0x4026, 0, 0,0x482B, 0, +0x492D, 0,0x613F,0x4E2C,0x374D,0x6140, 0,0x613E, +0x4856,0x6141, 0,0x6142, 0, 0,0x305B, 0, + 0,0x3E76,0x6147, 0,0x6144,0x466D,0x6143, 0, + 0, 0, 0, 0, 0,0x3526, 0, 0, +0x614A, 0, 0, 0,0x6145,0x6146, 0,0x6149, +0x6148,0x4925, 0, 0,0x4142,0x4141, 0,0x353F, + 0, 0,0x614B, 0, 0, 0, 0, 0, +0x614C, 0, 0,0x614D, 0, 0, 0, 0, + 0,0x614F, 0,0x614E, 0, 0, 0, 0, + 0,0x3156, 0, 0, 0, 0, 0,0x6157, +0x4868,0x6151, 0,0x6153, 0, 0,0x6155,0x3F3E, + 0, 0,0x6156,0x6154,0x3C40, 0, 0, 0, +0x6150,0x6152, 0,0x4942, 0,0x3E49, 0, 0, +0x6159, 0, 0,0x6158, 0, 0, 0, 0, +0x615A, 0,0x3C26,0x3A2F, 0, 0,0x4577,0x615B, + 0,0x444B, 0, 0,0x615D, 0, 0, 0, +0x4E21,0x615C, 0, 0, 0, 0, 0,0x4169, + 0, 0, 0, 0, 0, 0,0x6162, 0, +0x6164,0x6165,0x4354, 0, 0, 0, 0, 0, +0x6163, 0,0x6160, 0,0x615E,0x615F, 0,0x6161, + 0, 0, 0, 0, 0, 0, 0,0x6168, + 0,0x6166, 0,0x6167, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x6169,0x616B,0x616C, +0x616D, 0,0x616E, 0, 0,0x616A, 0, 0, + 0, 0, 0, 0, 0, 0,0x6170, 0, + 0, 0,0x616F, 0, 0, 0, 0, 0, + 0,0x6171, 0, 0, 0, 0, 0, 0, +0x4E45, 0, 0, 0,0x6174,0x6172,0x6173, 0, + 0, 0,0x3462, 0, 0, 0, 0, 0, +0x4C7E, 0, 0, 0,0x4A4A, 0,0x6176, 0, + 0, 0,0x6175, 0, 0, 0, 0,0x6177, +0x6178, 0, 0, 0, 0,0x617C,0x6179,0x617A, +0x617B, 0,0x617D, 0, 0, 0,0x617E, 0, +0x6221, 0, 0, 0,0x6222, 0,0x6223, 0, +0x482F,0x4550,0x6224,0x4772,0x4934, 0,0x6225, 0, + 0,0x6226,0x452A, 0,0x3327,0x3944,0x6227, 0, + 0,0x6228, 0, 0,0x6229, 0,0x3B29, 0, + 0,0x622B, 0, 0,0x622A, 0, 0,0x622C, +0x622D, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x4869, 0,0x622E, 0, + 0, 0,0x622F, 0, 0,0x7369,0x6230,0x6231, +0x6232, 0, 0, 0, 0,0x3B2E, 0, 0, +0x6233,0x4756, 0, 0,0x4B5F, 0,0x314E, 0, +0x3157, 0, 0,0x6234, 0, 0, 0, 0, +0x6236, 0, 0, 0,0x6235,0x4570, 0, 0, + 0,0x4039,0x5D39, 0,0x6237,0x4C41, 0,0x6238, + 0,0x3446,0x4857,0x6239, 0,0x623A, 0, 0, +0x623B, 0, 0, 0,0x4C5C, 0, 0, 0, +0x4C55, 0,0x443E, 0, 0, 0,0x416A, 0, + 0,0x623D, 0, 0,0x3D62, 0, 0,0x3E4A, + 0, 0,0x6240, 0, 0,0x623F,0x623E,0x487D, + 0,0x3447,0x3829, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6246, 0, 0,0x6243,0x3F3F,0x4C32, 0, + 0, 0,0x6242,0x6244,0x6245, 0, 0,0x6241, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x6247,0x6248, 0, +0x442F, 0,0x3463, 0, 0, 0,0x4365, 0, + 0, 0, 0, 0, 0,0x6249, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x624A,0x624D, 0, 0, 0, 0, 0,0x3F67, + 0,0x4644, 0,0x624E,0x4B53, 0,0x624B, 0, + 0,0x624C, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x6251, + 0, 0, 0, 0,0x6250,0x624F, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6253, 0, 0,0x6252, 0, 0,0x6254, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x6256, 0,0x6255, 0, + 0, 0, 0,0x4A4D, 0, 0, 0, 0, + 0, 0,0x3D56,0x4E46, 0, 0,0x6257, 0, + 0,0x4637, 0, 0,0x6258, 0, 0,0x6259, + 0,0x625D,0x625B,0x625C, 0,0x625A, 0, 0, + 0, 0, 0, 0, 0,0x625E, 0, 0, + 0, 0, 0,0x625F, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x6260, 0, 0, +0x6261,0x4C37,0x6262, 0, 0, 0, 0, 0, +0x4C70,0x6263, 0,0x434E, 0,0x476A, 0,0x366B, + 0, 0, 0,0x433B,0x6264,0x363A, 0, 0, + 0,0x4050, 0, 0, 0, 0, 0, 0, + 0, 0,0x6265, 0, 0, 0, 0, 0, +0x3A3D, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x6266, 0, 0, 0, 0, 0, +0x6267, 0,0x3826,0x3A55, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x6269, 0, + 0, 0, 0,0x4556,0x3A56,0x354E, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4B24, 0,0x474B, 0, 0, 0, 0, 0, +0x4557, 0, 0, 0, 0,0x395C, 0, 0, + 0, 0, 0,0x626B}; + +/* page 33 0x785D-0x7E9C */ +static uint16 tab_uni_jisx020833[]={ +0x3E4B, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x4E32,0x3945, + 0, 0,0x3827, 0, 0,0x4823, 0,0x626D, + 0, 0, 0, 0, 0, 0, 0,0x626F, + 0, 0, 0, 0,0x386B, 0, 0, 0, + 0,0x626E,0x4476, 0, 0, 0, 0,0x6271, +0x3337,0x626C, 0, 0,0x486A, 0,0x3130, 0, +0x3A6C, 0,0x4F52, 0, 0,0x6270, 0, 0, + 0, 0, 0, 0, 0, 0,0x6272, 0, + 0, 0,0x4A4B, 0,0x4059,0x6274, 0, 0, + 0, 0,0x6275, 0, 0, 0, 0, 0, +0x6273, 0, 0, 0, 0,0x334E, 0,0x627B, + 0,0x627A, 0, 0,0x3C27, 0, 0, 0, +0x627C,0x6277, 0, 0, 0,0x627D,0x6278, 0, + 0, 0, 0,0x4858,0x6276, 0, 0,0x6279, + 0, 0, 0, 0, 0,0x6322, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x6321,0x4B61, 0, 0, 0,0x627E, + 0, 0,0x306B, 0, 0, 0, 0,0x6324, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6323, 0, 0, 0,0x3E4C, 0, 0, 0, + 0, 0,0x6325, 0, 0, 0, 0, 0, + 0,0x4143, 0, 0,0x6327,0x6326, 0, 0, + 0, 0, 0, 0,0x6328, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6268, 0, 0, 0,0x626A,0x632A,0x6329, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x3C28, 0,0x4E69, + 0,0x3C52, 0,0x632B,0x3737, 0, 0, 0, + 0, 0,0x3540,0x3527,0x3B63, 0, 0, 0, + 0, 0, 0,0x4D34, 0, 0,0x6331, 0, +0x6330,0x4144,0x632D, 0, 0,0x632F, 0, 0, +0x3D4B,0x3F40,0x632E,0x632C, 0,0x472A, 0, 0, +0x3E4D, 0, 0,0x493C, 0, 0, 0, 0, +0x3A57, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x4578, 0, 0,0x6332, 0, 0, + 0, 0,0x6333,0x6349,0x3658, 0, 0,0x4F3D, +0x4135, 0, 0, 0, 0,0x6334, 0, 0, +0x3252,0x4477,0x4A21, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6335, 0, 0, 0, 0, 0, 0, 0, + 0,0x357A,0x6336, 0, 0,0x6338, 0, 0, + 0,0x6339, 0,0x4729, 0, 0,0x633A, 0, + 0, 0, 0, 0,0x633B,0x633C, 0, 0, +0x3659,0x3253,0x4645,0x3D28,0x3B64, 0, 0, 0, + 0, 0, 0, 0,0x633D, 0,0x3D29, 0, + 0, 0, 0, 0,0x324A,0x4943, 0, 0, +0x633E, 0, 0,0x486B, 0, 0, 0, 0, + 0, 0,0x4145, 0,0x6341, 0,0x6342,0x4769, + 0,0x3F41,0x633F, 0,0x4361, 0, 0,0x6340, + 0, 0, 0,0x3E4E, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x305C, 0, + 0, 0, 0,0x3529, 0, 0, 0, 0, + 0, 0, 0,0x6343, 0, 0,0x4478, 0, +0x6344,0x4047, 0, 0, 0, 0, 0,0x4C2D, + 0, 0,0x4923,0x6345,0x6346,0x4355, 0,0x4E47, + 0, 0,0x6348,0x6347, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x3C6F, 0, 0,0x634A,0x3070, 0, 0, + 0, 0,0x634D, 0, 0, 0,0x634B,0x3254, +0x374E,0x634C,0x3946,0x3972, 0,0x4A66,0x634E, 0, + 0,0x4B54, 0, 0,0x6350, 0, 0, 0, +0x4051,0x314F,0x323A,0x302C, 0, 0, 0, 0, + 0, 0,0x634F, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x6351,0x6352,0x3E77, 0, + 0, 0, 0, 0,0x6353, 0,0x334F, 0, + 0, 0, 0,0x6355, 0, 0, 0,0x376A, + 0,0x3566, 0, 0,0x6356,0x3675, 0, 0, +0x6357, 0,0x407C, 0,0x464D, 0,0x4060,0x3A75, + 0, 0, 0,0x6358, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x4362,0x416B, 0, +0x635A,0x635C,0x6359,0x635B, 0, 0, 0, 0, + 0, 0,0x3722, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x635D,0x3726, 0, 0, + 0,0x3567,0x4D52,0x635F, 0, 0, 0, 0, + 0,0x6360, 0, 0, 0,0x312E, 0, 0, + 0, 0,0x6363, 0, 0, 0,0x3376,0x6362, +0x6361, 0,0x6365,0x635E, 0,0x6366,0x4E29, 0, +0x6367, 0,0x6368, 0, 0,0x5474,0x636A, 0, +0x6369, 0, 0, 0,0x636B,0x636C, 0,0x4E35, +0x636D, 0,0x706F,0x3E4F,0x636E,0x636F,0x3D57, 0, +0x4638,0x6370, 0, 0, 0,0x4328, 0, 0, +0x6371, 0,0x433C,0x6372, 0, 0, 0, 0, + 0,0x3625, 0,0x513F,0x435D,0x3C33, 0, 0, + 0, 0,0x3448, 0, 0,0x6373, 0,0x6422, + 0,0x6376, 0,0x3568, 0,0x6375,0x6424, 0, + 0, 0,0x6374, 0,0x3E50, 0, 0, 0, + 0, 0, 0,0x6378,0x6379, 0,0x452B, 0, + 0,0x637A, 0,0x335E, 0, 0, 0, 0, +0x3F5A,0x4964, 0,0x637C, 0, 0, 0,0x4268, + 0, 0, 0, 0, 0, 0,0x6377, 0, +0x637B,0x637D, 0, 0,0x3A7B, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6426,0x492E, 0,0x4826,0x4579, 0,0x365A,0x6425, +0x6423, 0,0x4835,0x637E,0x435E,0x457B, 0,0x457A, + 0,0x3A76, 0, 0, 0, 0, 0, 0, +0x6438, 0, 0, 0, 0, 0, 0, 0, +0x6428, 0,0x642A, 0, 0, 0, 0,0x642D, + 0,0x642E, 0,0x642B,0x642C, 0, 0,0x6429, +0x6427, 0, 0, 0, 0,0x6421, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x4A4F,0x3255, 0, 0, 0,0x6435, 0, +0x6432, 0,0x6437, 0, 0,0x6436, 0,0x4773, +0x4C27, 0,0x3B3B,0x6430,0x6439,0x6434, 0,0x6433, +0x642F, 0,0x6431, 0,0x3449, 0, 0, 0, + 0, 0, 0, 0, 0,0x433D, 0, 0, +0x407D, 0, 0, 0,0x4822, 0, 0,0x643E, + 0, 0, 0,0x4824, 0, 0, 0, 0, + 0, 0, 0,0x4061,0x643B, 0, 0,0x484F, + 0,0x643F,0x4A53, 0,0x435B, 0,0x643A,0x643C, + 0, 0,0x643D, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6440, 0, 0,0x3C44, 0, 0, 0,0x4646, +0x6445,0x6444, 0, 0,0x6441, 0, 0, 0, +0x4F36, 0, 0, 0, 0, 0,0x644A, 0, + 0,0x644E,0x644B, 0, 0, 0, 0, 0, + 0, 0, 0,0x6447, 0, 0, 0, 0, + 0, 0,0x6448, 0, 0, 0, 0, 0, +0x644D, 0, 0, 0,0x6442,0x5255,0x6449,0x6443, + 0, 0,0x644C, 0, 0, 0, 0, 0, + 0, 0,0x6452, 0,0x344A, 0,0x644F, 0, + 0, 0,0x6450, 0, 0,0x6451,0x6454, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x6453,0x4876, 0, 0, 0, 0, +0x6455,0x4E7C,0x4A6D,0x645A, 0, 0,0x6457, 0, + 0, 0, 0, 0, 0, 0, 0,0x6456, +0x4052, 0,0x6459,0x645B, 0, 0, 0,0x6458, + 0,0x645F, 0,0x645C, 0, 0, 0, 0, + 0, 0,0x645D,0x6446, 0, 0, 0,0x645E, +0x6460, 0, 0, 0, 0, 0, 0,0x6461, + 0, 0, 0, 0, 0, 0,0x4A46, 0, +0x6462, 0, 0, 0, 0, 0, 0, 0, + 0,0x4C62, 0, 0,0x364E,0x3729,0x6463, 0, + 0, 0, 0, 0,0x4A34, 0,0x3F68, 0, +0x4C30, 0, 0,0x6464, 0,0x4E33, 0, 0, +0x4774, 0,0x4146,0x4734, 0, 0,0x3D4D, 0, + 0, 0,0x3040, 0,0x6469,0x6467, 0,0x6465, +0x3421, 0,0x3E51,0x646A, 0, 0,0x6468, 0, +0x6466,0x646E, 0, 0,0x646D,0x646C,0x646B, 0, + 0, 0, 0, 0,0x646F, 0, 0, 0, +0x6470,0x403A, 0,0x6471, 0,0x6473, 0, 0, +0x6472, 0, 0, 0, 0,0x3852, 0, 0, + 0,0x4138, 0, 0, 0,0x6475, 0, 0, + 0,0x457C, 0,0x6474, 0, 0, 0,0x6476, + 0,0x4A35,0x416C,0x3947, 0,0x6477, 0, 0, + 0, 0,0x4E48, 0, 0, 0, 0, 0, + 0, 0,0x6479, 0, 0,0x647A, 0,0x647B, + 0,0x647C, 0,0x3B65, 0,0x647D,0x374F, 0, + 0,0x356A, 0,0x352A, 0,0x6521, 0,0x4C73, +0x3948,0x647E, 0, 0, 0,0x6524,0x4C66, 0, +0x473C, 0, 0,0x4933, 0, 0, 0,0x3D63, +0x6523, 0,0x3C53,0x3949,0x3B66,0x3569,0x4A36,0x6522, + 0, 0, 0,0x4147,0x4B42,0x3A77, 0, 0, + 0, 0, 0, 0, 0, 0,0x3B67,0x445D, + 0,0x6527,0x4E5F,0x3A59, 0,0x6528,0x3F42, 0, +0x652A, 0, 0, 0,0x3E52,0x3A30, 0, 0, + 0, 0,0x6529, 0, 0,0x3D2A,0x383E,0x4148, +0x6525,0x652B, 0, 0, 0, 0,0x6526,0x3750, + 0,0x652E,0x6532,0x376B, 0, 0, 0, 0, + 0,0x652D, 0, 0, 0, 0,0x6536, 0, + 0,0x394A, 0, 0,0x4D6D,0x303C,0x6533, 0, + 0,0x356B, 0,0x6530, 0, 0, 0, 0, + 0,0x6531, 0, 0,0x457D,0x652F,0x652C, 0, +0x3328,0x4064, 0, 0,0x3828, 0, 0, 0, +0x6538, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x6535, 0, 0, 0, + 0, 0,0x6537, 0, 0, 0,0x6534, 0, + 0, 0, 0, 0,0x3751,0x4233,0x6539,0x416E, + 0, 0,0x6546, 0, 0,0x6542,0x653C, 0, + 0, 0, 0, 0, 0, 0,0x6540,0x3C7A, +0x305D,0x653B,0x6543,0x6547,0x394B,0x4C56, 0,0x4456, +0x653D, 0, 0,0x6545, 0,0x653A,0x433E, 0, +0x653F,0x303D,0x4C4A, 0, 0, 0, 0, 0, + 0, 0,0x653E, 0, 0,0x365B,0x486C, 0, + 0, 0,0x416D, 0,0x4E50,0x3D6F, 0, 0, +0x656E, 0, 0,0x6548, 0,0x407E, 0,0x6544, +0x6549,0x654B, 0,0x4479,0x654E, 0, 0,0x654A, + 0, 0, 0,0x4A54,0x344B, 0, 0,0x4C4B, + 0, 0,0x305E, 0, 0,0x654D, 0,0x4E7D, + 0, 0, 0, 0, 0, 0,0x654C, 0, + 0, 0, 0, 0,0x316F, 0, 0,0x466C, +0x654F, 0, 0, 0,0x6556,0x6550,0x6557, 0, + 0, 0, 0, 0, 0,0x6553, 0, 0, + 0, 0, 0, 0, 0, 0,0x477B, 0, + 0,0x3C4A,0x6555, 0,0x6552,0x6558,0x6551, 0, + 0,0x3D44, 0, 0, 0, 0,0x4B25, 0, + 0,0x3D4C, 0, 0,0x6554,0x6560, 0, 0, +0x655C, 0,0x655F, 0,0x655D,0x6561,0x655B, 0, +0x6541,0x4053, 0, 0,0x484B, 0,0x655E, 0, + 0,0x6559, 0, 0, 0,0x4121,0x3752, 0, +0x3D2B, 0, 0, 0, 0, 0, 0,0x3F25, +0x4136,0x6564, 0, 0,0x6566,0x6567, 0, 0, +0x6563,0x6565, 0, 0, 0, 0, 0, 0, + 0,0x655A,0x6562, 0,0x656A,0x6569, 0, 0, +0x4B7A, 0, 0,0x372B, 0, 0, 0, 0, + 0, 0, 0, 0,0x6568, 0,0x656C,0x656B, +0x656F, 0,0x6571, 0, 0,0x3B3C,0x656D, 0, + 0, 0, 0,0x6572,0x6573, 0, 0,0x6574, + 0,0x657A,0x453B,0x6576, 0,0x6575,0x6577,0x6578, + 0,0x6579, 0, 0, 0, 0,0x657B,0x657C +}; + +/* page 34 0x7F36-0x8358 */ +static uint16 tab_uni_jisx020834[]={ +0x344C, 0,0x657D, 0,0x657E, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x6621, + 0, 0, 0, 0, 0, 0,0x6622,0x6623, +0x6624, 0,0x6625,0x6626, 0, 0,0x6628,0x6627, + 0, 0,0x6629, 0, 0, 0, 0, 0, + 0,0x662A,0x662B, 0, 0, 0, 0, 0, + 0,0x662E,0x662C,0x662D,0x3A61,0x3753, 0, 0, +0x4356, 0,0x4833, 0,0x3D70, 0, 0,0x474D, + 0,0x486D,0x662F,0x586D, 0, 0, 0, 0, + 0, 0, 0, 0,0x6630,0x6632, 0,0x4D65, +0x6631,0x6634,0x6633, 0,0x4D53, 0,0x6635, 0, +0x487E, 0, 0, 0, 0, 0,0x6636, 0, + 0, 0, 0, 0,0x6639, 0, 0,0x6638, +0x6637, 0, 0, 0, 0,0x663A,0x3732, 0, + 0, 0,0x4122,0x3541, 0, 0, 0, 0, +0x663E,0x663B, 0, 0,0x663C, 0, 0, 0, +0x663F, 0,0x6640,0x663D, 0, 0, 0,0x3129, + 0, 0, 0,0x3227, 0, 0, 0,0x6642, +0x6643, 0, 0, 0,0x6644, 0,0x4D62, 0, + 0, 0, 0, 0,0x3D2C, 0,0x6646,0x6645, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x3F69,0x6647, 0, 0, 0, 0, +0x6648, 0, 0,0x6649, 0,0x3465, 0, 0, + 0, 0,0x344D, 0, 0,0x664A, 0, 0, + 0, 0, 0,0x664B, 0,0x4B5D,0x4D63, 0, + 0, 0,0x4D54,0x4F37, 0,0x394D,0x664E,0x3C54, +0x664D, 0, 0, 0, 0,0x664F,0x3C29, 0, + 0, 0,0x4251, 0,0x6650, 0, 0,0x394C, + 0,0x4C57,0x6651,0x6652, 0, 0,0x6653, 0, + 0, 0, 0,0x6654, 0, 0, 0, 0, + 0, 0,0x6655, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x3C2A, 0, 0, +0x4C6D, 0, 0, 0, 0,0x6657, 0,0x433F, + 0,0x6656, 0, 0, 0, 0, 0, 0, +0x6659, 0, 0, 0,0x6658, 0, 0, 0, + 0, 0, 0, 0,0x665A, 0, 0, 0, +0x403B, 0,0x665B, 0,0x665C, 0, 0, 0, +0x4A39,0x665D, 0,0x416F,0x665E, 0, 0, 0, + 0, 0,0x665F, 0, 0, 0, 0, 0, + 0,0x4E7E,0x6662, 0,0x6661,0x6660,0x4430, 0, +0x6663,0x3F26, 0,0x6664, 0, 0, 0,0x6665, +0x4F38,0x6666, 0, 0, 0, 0,0x6667,0x6669, +0x6668,0x4825, 0,0x4679, 0,0x4F3E,0x4829, 0, + 0, 0, 0, 0, 0,0x666B, 0, 0, +0x3E53, 0,0x492A, 0,0x666C,0x666A, 0,0x344E, + 0, 0, 0,0x3854,0x3B68, 0, 0,0x486E, + 0, 0, 0,0x382A,0x4B43, 0,0x666F,0x666D, + 0,0x394E, 0,0x394F,0x3069, 0,0x3A68, 0, + 0, 0, 0, 0,0x4759, 0, 0, 0, + 0, 0, 0, 0, 0,0x305F,0x6674, 0, +0x4340, 0, 0, 0, 0, 0,0x4758, 0, +0x425B, 0, 0, 0, 0, 0, 0, 0, +0x6676, 0, 0,0x6672,0x6675,0x6670, 0,0x6673, +0x4B26, 0, 0,0x3855, 0, 0,0x307D,0x6671, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6678, 0,0x6679, 0, 0,0x4639, 0, + 0, 0,0x363B, 0, 0, 0,0x6726,0x473D, + 0, 0, 0, 0,0x3B69, 0, 0,0x363C, +0x4048,0x4F46,0x4C2E,0x6677,0x4054, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x3553,0x667A, 0, 0, + 0, 0, 0, 0, 0,0x667C, 0, 0, + 0, 0, 0,0x667B, 0, 0, 0, 0, + 0,0x667D, 0,0x4326, 0,0x473E, 0, 0, + 0, 0, 0,0x4431, 0, 0, 0, 0, +0x6723, 0, 0, 0, 0, 0, 0, 0, +0x6722, 0, 0, 0, 0,0x667E, 0, 0, +0x3F55, 0,0x4965,0x6725, 0,0x6724,0x3950,0x4F53, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6735, 0, 0, 0, 0, 0,0x6729, +0x672A, 0, 0, 0, 0,0x3C70, 0, 0, +0x6728, 0,0x3978,0x6727, 0, 0,0x672B, 0, + 0, 0,0x4432,0x4A22,0x4123, 0, 0, 0, + 0,0x425C,0x672F, 0,0x6730,0x672C, 0, 0, + 0, 0,0x672D, 0,0x672E, 0, 0, 0, + 0,0x3951, 0, 0, 0,0x6736, 0,0x6732, + 0, 0, 0, 0,0x4966, 0,0x4B6C,0x4928, + 0, 0,0x6731, 0, 0,0x6734,0x6733, 0, + 0, 0,0x4B44,0x6737, 0, 0, 0, 0, + 0, 0,0x6738, 0, 0,0x4137, 0,0x6739, + 0, 0,0x673B, 0,0x673F, 0, 0,0x673C, +0x673A,0x473F,0x673D, 0,0x673E, 0, 0, 0, +0x3232, 0,0x6745,0x6740, 0, 0, 0,0x6741, + 0, 0, 0,0x6742, 0,0x4221, 0, 0, + 0, 0,0x6744,0x6743,0x6746, 0, 0, 0, + 0,0x6747,0x6748, 0, 0,0x3F43, 0,0x3269, + 0,0x6749,0x4E57, 0,0x3C2B, 0, 0,0x3D2D, + 0, 0, 0, 0, 0,0x3B6A,0x4357, 0, + 0, 0, 0, 0,0x674A,0x674B,0x3131, 0, +0x674C, 0, 0,0x674D,0x674E, 0, 0,0x674F, + 0,0x6750,0x363D,0x5A2A,0x6751, 0,0x4065,0x6752, +0x3C4B, 0,0x6753, 0,0x5030, 0, 0, 0, +0x6754,0x4A5E,0x345C, 0, 0,0x4124,0x3D58, 0, +0x4971,0x3D2E, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x6755,0x3952,0x6756,0x484C, 0, +0x6764, 0, 0, 0, 0,0x6758, 0,0x4249, +0x4775,0x383F,0x6757,0x4125, 0, 0, 0, 0, + 0, 0,0x6759, 0, 0, 0, 0, 0, + 0,0x447A, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x675B,0x675A,0x675D, 0, 0,0x675C, + 0,0x675E, 0, 0,0x6760, 0,0x675F, 0, +0x344F, 0,0x6761, 0,0x6762,0x6763, 0, 0, +0x3A31,0x4E49, 0,0x6765,0x3F27, 0, 0, 0, +0x3170,0x6766,0x6767, 0, 0, 0, 0, 0, +0x6768, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x3072, 0,0x6769, + 0, 0, 0, 0,0x676A, 0, 0, 0, + 0, 0, 0,0x4967, 0, 0, 0,0x3C47, + 0,0x676C, 0, 0, 0, 0, 0,0x3329, +0x3032, 0, 0, 0, 0,0x676B,0x676E,0x474E, + 0,0x3F44, 0,0x3256, 0,0x4B27, 0, 0, + 0, 0,0x375D,0x365C, 0,0x676D, 0,0x326A, + 0, 0, 0, 0, 0, 0, 0,0x3423, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x3171,0x6772,0x4E6A,0x425D, 0, + 0,0x4944, 0,0x677E, 0,0x3257,0x677C, 0, +0x677A,0x6771, 0,0x676F, 0,0x6770, 0,0x3C63, +0x366C,0x4377, 0, 0, 0,0x4651, 0, 0, + 0, 0, 0,0x3151, 0,0x6774,0x6773, 0, + 0, 0, 0,0x6779,0x6775,0x6778, 0, 0, + 0, 0, 0, 0,0x4C50,0x6777,0x3258,0x337D, +0x677B, 0, 0,0x677D, 0, 0, 0, 0, +0x3754, 0, 0, 0, 0, 0, 0, 0, +0x6823,0x682C,0x682D, 0, 0, 0,0x302B, 0, + 0, 0, 0, 0, 0,0x6834, 0, 0, + 0, 0,0x3071, 0, 0,0x682B, 0, 0, + 0,0x682A, 0,0x6825,0x6824, 0,0x6822,0x6821, +0x4363, 0,0x427B,0x6827, 0, 0, 0, 0, + 0, 0,0x6826, 0, 0, 0, 0,0x6829, + 0, 0, 0,0x4170,0x3755, 0, 0, 0, + 0,0x3141,0x6828, 0,0x3953, 0, 0, 0, + 0, 0,0x4171}; + +/* page 35 0x8373-0x8B9A */ +static uint16 tab_uni_jisx020835[]={ +0x683A, 0,0x683B, 0,0x3259, 0, 0, 0, +0x322E,0x6838, 0, 0, 0, 0, 0, 0, + 0, 0,0x682E, 0,0x6836, 0,0x683D,0x6837, + 0, 0, 0,0x6835, 0, 0, 0, 0, +0x6776, 0, 0,0x6833, 0, 0, 0,0x682F, + 0, 0, 0,0x3450,0x6831,0x683C, 0,0x6832, + 0, 0, 0, 0, 0,0x683E, 0,0x6830, +0x477C, 0, 0, 0, 0, 0,0x4D69, 0, + 0, 0,0x6839, 0, 0, 0, 0, 0, + 0, 0,0x684F, 0, 0, 0,0x6847, 0, + 0, 0,0x3F7B, 0, 0, 0, 0,0x3546, + 0,0x365D, 0,0x6842, 0, 0, 0, 0, +0x325B, 0, 0,0x3E54, 0,0x6845, 0, 0, + 0,0x3A5A, 0, 0,0x4551,0x684A, 0, 0, + 0, 0, 0, 0, 0, 0,0x4A6E, 0, +0x6841, 0, 0, 0,0x325A,0x3856,0x4929,0x684B, + 0,0x683F, 0, 0,0x6848, 0, 0, 0, +0x6852, 0,0x6843, 0, 0, 0, 0, 0, +0x6844,0x463A, 0, 0,0x6849, 0, 0, 0, +0x6846,0x4B28,0x684C,0x3060, 0, 0, 0, 0, +0x6840, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x684E, 0,0x684D, + 0, 0, 0, 0, 0, 0,0x476B,0x6854, + 0,0x685F, 0, 0, 0, 0,0x337E, 0, + 0, 0,0x6862, 0, 0,0x6850, 0, 0, + 0,0x6855,0x4D6E, 0, 0, 0, 0, 0, + 0, 0, 0,0x685E, 0, 0,0x4D55, 0, + 0, 0, 0,0x4E2A, 0, 0, 0, 0, + 0, 0, 0, 0,0x4378, 0, 0, 0, +0x336B, 0, 0, 0, 0, 0,0x4972,0x6864, +0x4621, 0, 0,0x3031, 0, 0,0x685D, 0, +0x6859,0x4172,0x6853,0x685B,0x6860, 0,0x472C, 0, + 0, 0,0x302A, 0,0x6858, 0,0x6861,0x4978, + 0, 0, 0, 0, 0, 0, 0,0x685C, + 0,0x6857, 0, 0, 0, 0, 0, 0, +0x3E55, 0, 0, 0, 0,0x3D2F, 0, 0, + 0,0x3C2C, 0, 0, 0, 0,0x4C58, 0, + 0,0x4947, 0, 0,0x6867, 0,0x6870, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x685A, 0, 0, 0, 0,0x3377, + 0, 0, 0, 0, 0,0x3E78,0x6865, 0, +0x686A,0x4173, 0, 0,0x6866, 0,0x686D, 0, + 0,0x435F, 0,0x686E, 0, 0,0x4D56,0x6863, +0x3338, 0,0x6869, 0, 0,0x686C,0x4C2C, 0, + 0, 0, 0,0x686F, 0, 0,0x6868,0x686B, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x4B29, 0,0x4F21, 0, 0, 0, 0, + 0,0x6873, 0, 0, 0, 0, 0, 0, + 0,0x687A, 0, 0,0x6872,0x3C43, 0, 0, + 0, 0, 0,0x6851, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x4A4E, 0, +0x4C22,0x6879,0x6878, 0,0x6874,0x6875, 0,0x3136, + 0, 0, 0, 0,0x6877, 0,0x6871, 0, + 0, 0, 0,0x4455, 0, 0, 0, 0, + 0,0x6876,0x307E, 0, 0, 0, 0, 0, + 0, 0,0x4222, 0, 0, 0, 0, 0, + 0, 0,0x4A43, 0, 0,0x687B,0x6921, 0, +0x4859, 0, 0, 0, 0,0x687E,0x3E56,0x3C49, +0x6923, 0, 0,0x363E, 0, 0, 0, 0, + 0, 0,0x6924, 0,0x4979,0x687D, 0,0x6856, + 0, 0, 0, 0, 0, 0, 0, 0, +0x687C, 0, 0, 0, 0,0x4F4F,0x4622,0x4973, + 0, 0,0x692B, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x6931, 0, 0, 0, + 0, 0, 0,0x6932, 0,0x6925, 0, 0, + 0,0x4776, 0, 0,0x692F,0x6927, 0,0x6929, + 0, 0, 0, 0, 0,0x6933,0x6928, 0, + 0,0x692C, 0, 0,0x3172, 0,0x4665, 0, +0x692D,0x6930, 0, 0, 0, 0, 0, 0, + 0,0x6926, 0,0x4126, 0,0x692A,0x3B27,0x3F45, +0x3730,0x4C74, 0,0x4C79,0x3D72, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x6937,0x6935, + 0, 0, 0, 0, 0, 0,0x4F4E, 0, + 0, 0, 0, 0, 0, 0,0x6934, 0, + 0, 0,0x4D75, 0,0x6936,0x6938, 0, 0, + 0, 0,0x6939, 0, 0, 0, 0, 0, + 0,0x693C,0x693A, 0, 0, 0, 0, 0, + 0,0x4623,0x693B, 0, 0, 0,0x484D,0x692E, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x3D73, 0,0x693D,0x6942, +0x4174, 0, 0,0x6941, 0, 0, 0,0x6922, + 0, 0, 0,0x6943,0x4149, 0, 0,0x693E, +0x6940, 0, 0, 0, 0, 0, 0, 0, +0x693F, 0, 0,0x5D31,0x5D22, 0, 0,0x6945, + 0, 0, 0, 0, 0, 0, 0,0x6944, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x4D76, 0,0x623C,0x6946, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x6947, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x6948,0x3857, 0,0x3554, 0, 0, + 0,0x694A,0x515D, 0, 0, 0, 0,0x3575, + 0,0x4E3A, 0,0x3673,0x694B, 0, 0, 0, + 0, 0, 0, 0,0x694C, 0, 0, 0, +0x436E, 0, 0, 0, 0, 0,0x694D, 0, + 0, 0, 0, 0, 0, 0,0x467A, 0, +0x303A, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3263, +0x6952,0x6953, 0, 0, 0, 0, 0, 0, +0x694E, 0,0x3B3D, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x694F,0x4742, 0, 0, 0, 0,0x6950,0x6951, +0x695B, 0, 0, 0,0x6955,0x6958, 0, 0, + 0, 0, 0,0x6954, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6956, 0,0x6957,0x3C58, 0,0x6959, 0, +0x4341, 0,0x3756,0x3342, 0, 0, 0, 0, + 0,0x695C, 0, 0, 0, 0,0x333F, 0, +0x6961, 0, 0,0x695D,0x6960, 0, 0, 0, + 0,0x483A, 0, 0, 0, 0,0x695E, 0, + 0,0x695F,0x4948,0x485A,0x6962, 0, 0, 0, + 0, 0, 0, 0, 0,0x427D,0x696C, 0, +0x6968, 0, 0,0x326B, 0,0x6966, 0,0x4B2A, +0x6967, 0, 0,0x6964, 0,0x6965,0x696A,0x696D, + 0, 0,0x696B, 0, 0, 0,0x6969,0x6963, + 0, 0, 0, 0, 0,0x4358, 0,0x6974, + 0,0x4C2A, 0, 0, 0, 0, 0, 0, + 0, 0,0x6972, 0, 0, 0,0x6973, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x696E, 0, 0,0x6970, 0, 0, 0, +0x6971, 0, 0, 0,0x696F, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x4066, 0, +0x4F39,0x6978, 0,0x6979, 0, 0, 0, 0, +0x6A21, 0,0x3F2A, 0,0x697B, 0,0x697E, 0, + 0, 0, 0, 0,0x6976,0x6975, 0, 0, +0x6A22, 0, 0,0x325C, 0,0x697C, 0,0x6A23, + 0, 0, 0,0x697D, 0, 0, 0, 0, + 0,0x697A, 0,0x4433, 0,0x6977, 0, 0, + 0, 0, 0, 0,0x4768, 0, 0,0x6A27, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x4D3B, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x6A26, 0, 0,0x6A25, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6A2E, 0, 0, 0,0x6A28, 0, 0, 0, +0x6A30, 0, 0, 0, 0, 0, 0,0x4D66, +0x6A33, 0,0x6A2A, 0, 0,0x6A2B, 0, 0, + 0,0x6A2F, 0,0x6A32,0x6A31, 0, 0, 0, +0x6A29, 0, 0, 0, 0,0x6A2C, 0,0x6A3D, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x6A36, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x6A34, 0, 0,0x6A35, + 0, 0, 0,0x6A3A,0x6A3B, 0,0x332A, 0, +0x3542, 0, 0,0x6A39, 0, 0, 0, 0, + 0, 0,0x6A24, 0, 0, 0, 0, 0, + 0, 0,0x6A38,0x6A3C,0x6A37, 0,0x6A3E, 0, + 0, 0,0x6A40,0x6A3F, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x6A42,0x6A41, +0x695A, 0, 0, 0,0x6A46, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x6A43, 0, + 0, 0, 0,0x6A44, 0, 0,0x6A45, 0, +0x6A47, 0, 0, 0, 0,0x376C, 0,0x6A49, + 0,0x6A48, 0,0x3D30, 0, 0, 0, 0, + 0,0x3954,0x5E27, 0, 0, 0, 0,0x6A4A, +0x3D51, 0, 0, 0,0x3339, 0,0x6A4B, 0, +0x3152, 0,0x3E57,0x6A4C, 0, 0,0x3955,0x6A4D, +0x3061, 0, 0, 0, 0,0x493D, 0, 0, +0x6A4E, 0, 0, 0, 0,0x3F6A, 0,0x6A55, + 0, 0,0x6A52, 0,0x436F, 0, 0, 0, + 0, 0,0x6A53,0x6A50,0x365E, 0,0x6A4F,0x6A56, + 0, 0, 0, 0, 0,0x3736, 0, 0, +0x425E, 0,0x6A5C, 0, 0, 0, 0,0x6A58, + 0, 0, 0,0x4235,0x6A57, 0,0x6A5A, 0, + 0, 0, 0,0x6A51, 0, 0, 0,0x6A5B, + 0,0x6A5D, 0, 0, 0, 0, 0, 0, +0x486F, 0, 0,0x6A59, 0,0x6A5E,0x6A60, 0, + 0,0x3853,0x6A54, 0,0x3041, 0, 0, 0, + 0, 0, 0, 0,0x6A5F, 0,0x3A5B,0x4E76, +0x6A61,0x6A62,0x4175, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x4E22, 0, 0, 0, + 0,0x6A63,0x4D35, 0, 0,0x6A64,0x6A65, 0, + 0,0x4A64,0x6A66, 0,0x3A40, 0,0x4E23, 0, + 0, 0, 0, 0, 0,0x6A6B, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x6A6C, +0x3E58,0x6A6A, 0, 0, 0,0x4D67,0x6A67, 0, + 0,0x6A69,0x403D,0x3F7E, 0, 0, 0,0x6A68, + 0,0x6A6D, 0, 0,0x4A23, 0, 0,0x6A6F, + 0,0x6A6E, 0, 0, 0,0x336C, 0,0x4B2B, +0x6A70, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x6A7C,0x6A72, 0, 0, 0, 0, + 0, 0,0x6A73, 0, 0, 0, 0,0x6A74, +0x6A75, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x6A79, 0,0x6A7A, 0, 0, +0x6A78, 0, 0, 0, 0, 0,0x6A76, 0, +0x6A71,0x6A77, 0, 0, 0, 0, 0, 0, + 0,0x6A7B,0x7037, 0, 0, 0, 0, 0, + 0, 0, 0,0x3228, 0, 0, 0, 0, + 0, 0, 0,0x6A7E,0x365F,0x6A7D, 0, 0, + 0,0x6B22, 0,0x6B21, 0, 0, 0,0x6B24, + 0, 0,0x6B23, 0,0x6B25, 0, 0,0x3D31, + 0,0x6B26, 0, 0,0x6B27, 0, 0, 0, + 0, 0, 0,0x6B28,0x403E, 0,0x4D57, 0, +0x6B29, 0, 0,0x4A24,0x4746,0x6B2A, 0,0x6B2B, +0x382B, 0, 0, 0,0x352C, 0, 0, 0, +0x6B2C, 0, 0,0x3B6B,0x4741,0x6B2D, 0,0x3350, + 0, 0, 0, 0, 0, 0,0x6B2E, 0, + 0, 0, 0,0x6B30,0x4D77, 0,0x6B2F,0x3F46, + 0,0x6B31, 0, 0,0x6B32, 0, 0,0x6B33, +0x3451, 0, 0, 0, 0, 0, 0,0x6B34, + 0, 0,0x6B35, 0,0x6B36,0x6B37, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3351, + 0, 0, 0, 0, 0, 0, 0,0x6B38, + 0,0x6B39,0x6B3A, 0, 0, 0, 0, 0, +0x3272, 0, 0,0x3F28,0x6B3B, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6B3C, 0, 0, 0,0x6B3D, 0, 0, + 0, 0, 0, 0, 0,0x3840, 0,0x447B, +0x6B3E, 0, 0, 0, 0,0x3757, 0,0x3F56, + 0,0x6B41, 0,0x4624, 0,0x6B40, 0, 0, +0x3731, 0, 0,0x6B3F,0x4277,0x352D, 0, 0, +0x6B42, 0,0x6B43, 0,0x3E59, 0, 0, 0, +0x376D, 0,0x6B44, 0, 0, 0, 0,0x4B2C, + 0, 0,0x405F, 0, 0, 0,0x3576, 0, +0x4C75,0x414A, 0,0x6B45, 0, 0, 0,0x3F47, +0x4370,0x3E5A, 0, 0, 0, 0,0x6B46, 0, + 0, 0, 0,0x6B49, 0,0x6B4A, 0, 0, + 0, 0, 0, 0, 0,0x3A3E,0x4242,0x6B48, + 0,0x3E5B,0x493E, 0, 0, 0, 0, 0, +0x6B47, 0, 0,0x3B6C, 0,0x3153, 0,0x6B4E, +0x3758, 0, 0,0x3B6E, 0, 0,0x3B6D, 0, +0x4F4D,0x6B4D,0x6B4C,0x4127, 0,0x354D,0x4F43,0x333A, +0x3E5C, 0, 0, 0, 0, 0, 0, 0, + 0,0x6B4B, 0, 0, 0, 0, 0,0x6B50, + 0,0x6B51,0x6B4F, 0,0x3858, 0,0x4D40, 0, + 0,0x3B6F,0x4727, 0, 0, 0,0x6B54, 0, +0x4040, 0,0x4342, 0, 0,0x4D36, 0,0x6B57, + 0, 0, 0,0x386C, 0,0x403F,0x6B53, 0, +0x6B58,0x386D,0x6B55,0x6B56, 0,0x6B52, 0, 0, + 0,0x4062,0x4649, 0, 0,0x432F, 0,0x325D, + 0, 0, 0, 0, 0, 0,0x4870, 0, + 0,0x3543, 0, 0,0x4434, 0, 0,0x6B5B, + 0,0x6B59, 0, 0,0x434C, 0, 0, 0, +0x4041,0x3452,0x6B5A, 0,0x3F5B, 0, 0,0x4E4A, + 0, 0, 0,0x4F40, 0, 0, 0,0x6B5C, +0x6B67,0x4435, 0,0x6B66, 0,0x6B63,0x6B6B,0x6B64, + 0,0x6B60, 0,0x447C,0x6B5F, 0, 0, 0, +0x6B5D, 0,0x4D21,0x3B70, 0, 0,0x6B61, 0, +0x6B5E, 0, 0, 0,0x6B65,0x3D74, 0,0x3841, + 0, 0, 0,0x427A, 0,0x4B45,0x315A,0x3062, + 0,0x4625, 0, 0,0x6B69, 0, 0, 0, + 0,0x6B68, 0,0x4666, 0,0x6B6D, 0, 0, + 0,0x6B62, 0,0x6B6C,0x6B6E, 0,0x382C,0x6B6A, +0x3956, 0,0x3C55, 0, 0,0x6B6F,0x4D58, 0, + 0, 0, 0,0x6B72, 0,0x6B75, 0, 0, +0x6B73,0x4935, 0, 0, 0, 0, 0, 0, +0x6B70, 0, 0, 0, 0, 0,0x3660, 0, + 0, 0, 0,0x6B74, 0, 0,0x6B76, 0, + 0, 0, 0, 0, 0, 0,0x6B7A, 0, + 0,0x6B77, 0,0x6B79,0x6B78, 0, 0, 0, + 0, 0, 0,0x6B7B, 0,0x3C31, 0,0x6B7D, +0x6B7C,0x4968, 0, 0,0x6C21, 0, 0, 0, + 0, 0, 0,0x3759, 0, 0, 0, 0, +0x6B7E,0x6C22, 0, 0,0x6C23,0x3544,0x6641,0x3E79, + 0,0x6C24, 0, 0,0x386E, 0, 0, 0, + 0, 0,0x6C25, 0, 0,0x6C26, 0, 0, +0x3B3E, 0, 0, 0, 0, 0, 0,0x5A4E, + 0,0x6C27, 0,0x6C28, 0,0x3D32, 0,0x6C29, +0x6C2A, 0, 0,0x6C2B, 0, 0,0x6C2C,0x6C2D +}; + +/* page 36 0x8C37-0x8D16 */ +static uint16 tab_uni_jisx020836[]={ +0x432B, 0, 0,0x6C2E, 0, 0, 0, 0, +0x6C30, 0,0x6C2F, 0, 0, 0, 0,0x4626, + 0,0x6C31, 0,0x4B2D, 0,0x6C32, 0,0x6C33, + 0,0x6C34, 0, 0, 0, 0,0x6C35, 0, + 0, 0, 0,0x465A, 0, 0, 0, 0, + 0, 0,0x3E5D,0x6C36, 0, 0, 0, 0, + 0, 0, 0,0x396B,0x502E,0x6C37, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6C38,0x493F,0x6C39, 0,0x6C41, 0, 0, + 0, 0, 0,0x6C3A, 0, 0,0x6C3C, 0, + 0, 0,0x6C3B,0x6C3D, 0,0x4B46,0x6C3E,0x6C3F, + 0, 0, 0, 0, 0,0x6C40, 0, 0, + 0,0x6C42, 0, 0, 0, 0,0x332D,0x4467, + 0,0x4969,0x3A62,0x3957, 0, 0, 0, 0, +0x494F,0x325F,0x484E,0x6C45,0x3453,0x4055,0x6C44,0x6C49, +0x4379,0x4C63, 0,0x6C47,0x6C48,0x352E, 0,0x6C4A, +0x4763,0x425F, 0, 0,0x4871,0x453D,0x6C46, 0, +0x4B47,0x326C,0x6C4C,0x4F28,0x4442,0x4F45, 0, 0, +0x3B71,0x6C4B, 0,0x4231, 0, 0,0x6C5C,0x4128, + 0, 0,0x4678, 0,0x4950, 0, 0, 0, + 0, 0, 0,0x6C4F,0x3B3F,0x3B72, 0,0x3E5E, + 0,0x4765, 0,0x382D,0x6C4E,0x6C4D, 0,0x496A, + 0, 0, 0,0x3C41, 0, 0,0x4552, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x6C51,0x6C52,0x3958,0x6C50, 0, + 0, 0, 0, 0, 0,0x6C53,0x6C54, 0, +0x6C56,0x4223, 0,0x6C55,0x3466, 0,0x6C58, 0, +0x6C57,0x6C59, 0, 0,0x6C5B,0x6C5D, 0,0x6C5E +}; + +/* page 37 0x8D64-0x8F64 */ +static uint16 tab_uni_jisx020837[]={ +0x4056, 0,0x3C4F,0x6C5F, 0, 0, 0,0x3352, + 0,0x6C60, 0, 0,0x4176,0x6C61, 0,0x6C62, +0x496B, 0, 0,0x352F, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x6C63, 0, 0, + 0,0x4436, 0, 0, 0, 0,0x315B, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x6C64, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3C71, + 0, 0, 0, 0,0x3F76, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x422D, + 0, 0, 0, 0, 0, 0,0x6C67, 0, + 0, 0,0x6C66, 0, 0, 0,0x6C65, 0, + 0, 0, 0, 0, 0, 0, 0,0x6C6D, +0x6C6B, 0, 0,0x6C68, 0, 0, 0, 0, + 0, 0,0x6C6A, 0, 0, 0,0x6C69,0x6C6C, + 0,0x3577, 0,0x6C70, 0,0x4057, 0,0x6C71, + 0, 0, 0, 0,0x3859, 0,0x6C6E,0x6C6F, + 0, 0, 0,0x4F29, 0, 0, 0,0x4437, + 0,0x4129, 0, 0, 0, 0, 0, 0, +0x6C72, 0, 0,0x6C75, 0, 0, 0, 0, + 0, 0, 0, 0,0x6C73,0x6C74,0x4D59, 0, + 0, 0, 0,0x4627,0x6C78, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6C76,0x6C77,0x6C79, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x6D29, 0, + 0, 0, 0, 0,0x6C7C, 0, 0, 0, +0x6C7D,0x6C7B, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x6C7A, 0, +0x447D, 0, 0,0x6D21,0x6D25,0x6D22,0x6C7E, 0, +0x6D23, 0, 0, 0,0x6D24, 0, 0, 0, + 0,0x6D2B, 0, 0, 0,0x6D26, 0, 0, + 0, 0, 0,0x4058,0x6D28, 0, 0,0x6D2A, +0x6D27, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x6D2D, 0, +0x3D33, 0,0x6D2C, 0, 0, 0, 0, 0, +0x6D2E, 0, 0, 0, 0,0x6D2F, 0, 0, +0x6D32,0x6D31, 0,0x6D30, 0, 0,0x6D34,0x6D33, + 0,0x4C76, 0, 0, 0,0x6D36, 0,0x6D35, +0x6D37, 0, 0, 0, 0,0x6D38, 0, 0, + 0, 0, 0, 0, 0,0x6D3A, 0, 0, + 0, 0, 0, 0, 0, 0,0x6D39,0x3F48, +0x6D3B, 0, 0,0x366D,0x6D3C,0x6D3E, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x6D3F, 0, 0, 0, 0, 0, + 0,0x6D40,0x6D3D, 0,0x6D41, 0,0x3C56,0x6D42, +0x3530,0x3733, 0, 0, 0, 0,0x382E, 0, + 0, 0, 0, 0, 0, 0, 0,0x6D43, + 0, 0, 0,0x4670, 0, 0,0x453E,0x6D44, + 0, 0, 0, 0, 0, 0, 0,0x6D47, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x3C34, 0, 0,0x6D46, +0x6D45,0x375A,0x6D48, 0, 0, 0, 0,0x3353, + 0,0x6D4A, 0, 0, 0,0x3A5C,0x6D49, 0, +0x6D52, 0, 0, 0, 0, 0,0x6D4C,0x6D4E, +0x4A65,0x6D4B, 0, 0, 0,0x6D4D, 0,0x6D51, +0x6D4F,0x3531, 0,0x6D50, 0, 0, 0, 0, + 0, 0,0x6D53, 0, 0,0x475A,0x4E58, 0, + 0, 0, 0,0x3D34, 0, 0, 0,0x6D54, + 0, 0, 0, 0,0x4D22,0x6D56, 0,0x6D55, + 0, 0,0x6D59,0x4D41, 0, 0,0x6D58, 0, +0x336D,0x6D57,0x6D5C, 0, 0,0x6D5B, 0, 0, +0x6D5A,0x4532,0x6D5D, 0, 0, 0, 0, 0, + 0, 0, 0,0x6D5E, 0, 0, 0, 0, +0x6D5F, 0, 0,0x396C, 0,0x3725,0x6D60,0x6D61, +0x6D62}; + +/* page 38 0x8F9B-0x9132 */ +static uint16 tab_uni_jisx020838[]={ +0x3F49,0x6D63, 0,0x3C2D,0x6D64, 0, 0, 0, +0x6D65, 0, 0, 0,0x5221,0x517E, 0, 0, + 0, 0,0x6D66,0x6570,0x6D67,0x4324,0x3F2B,0x4740, + 0, 0, 0, 0,0x6D68, 0, 0,0x4A55, +0x4454,0x397E, 0, 0,0x4329, 0, 0,0x312A, + 0,0x4B78,0x3F57, 0, 0, 0, 0, 0, + 0, 0, 0,0x375E, 0, 0,0x3661, 0, + 0,0x4A56, 0, 0, 0, 0, 0,0x6D69, + 0, 0, 0, 0, 0, 0, 0,0x6D6B, + 0, 0,0x6D6A,0x3260, 0, 0,0x4676,0x6D6C, +0x4777, 0,0x4533, 0,0x6D6D,0x3D52, 0, 0, + 0,0x6D6F, 0, 0,0x4C42,0x6D7E,0x6D71,0x6D72, + 0, 0,0x4449, 0, 0,0x4260,0x4177, 0, +0x4628, 0,0x6D70,0x3555, 0, 0, 0, 0, +0x6D79, 0,0x6D76,0x6E25,0x4629,0x4360,0x6D73, 0, +0x447E,0x4553,0x6D74,0x6D78,0x3F60, 0,0x4767,0x444C, + 0, 0,0x4042,0x6D77,0x422E,0x4224,0x6D75,0x3029, +0x4F22, 0, 0, 0,0x6D7A, 0, 0, 0, + 0, 0, 0,0x4261, 0, 0,0x3D35,0x3F4A, + 0, 0,0x6D7C,0x6D7B, 0,0x306F,0x6D7D, 0, + 0,0x492F, 0,0x6E27, 0, 0,0x465B,0x3F6B, + 0, 0,0x4359, 0,0x3678, 0,0x6E26,0x4D37, +0x313F, 0,0x4A57,0x3261,0x6E21,0x6E22,0x6E23,0x6E24, +0x463B,0x4323,0x3063,0x6E28, 0,0x6E29,0x7423, 0, + 0,0x423D, 0,0x6E2A, 0,0x3173,0x414C, 0, +0x382F, 0,0x4D5A, 0, 0,0x6E2B,0x452C, 0, + 0, 0,0x4178,0x3C57,0x6E2C, 0, 0,0x6E2F, + 0, 0,0x3D65,0x6E2D,0x412B,0x412A, 0,0x3064, + 0,0x4E4B,0x6E31, 0,0x4872,0x6E33,0x6E32,0x6E30, +0x6364,0x3454, 0, 0,0x6D6E, 0,0x6E35,0x6E34, + 0, 0, 0, 0,0x6E36, 0,0x4D38, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4661, 0, 0,0x4B2E, 0,0x6E37, 0,0x3C59, + 0, 0, 0, 0,0x6E38, 0,0x6E39, 0, + 0, 0,0x6E3A, 0, 0,0x4521, 0, 0, + 0, 0, 0, 0, 0, 0,0x306A, 0, + 0, 0, 0, 0, 0, 0, 0,0x3959, + 0, 0, 0,0x4F3A, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6E3E, 0, 0, 0, 0, 0,0x3734,0x6E3B, + 0,0x6E3C, 0, 0, 0,0x4974, 0, 0, + 0, 0,0x3354, 0, 0, 0, 0, 0, + 0, 0,0x4D39, 0,0x363F, 0, 0, 0, + 0, 0,0x4554, 0, 0, 0, 0,0x6E3F, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x6E40, + 0, 0, 0, 0, 0, 0,0x6E41, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x4522, 0, 0,0x6E43, 0,0x6E42 +}; + +/* page 39 0x9149-0x92B9 */ +static uint16 tab_uni_jisx020839[]={ +0x4653,0x6E44,0x3D36,0x3C60,0x475B,0x4371, 0, 0, + 0,0x3C72, 0,0x3F6C, 0,0x6E45, 0,0x6E46, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x3F5D,0x6E47, 0,0x6E48, 0, 0, 0, +0x6E49,0x4D6F, 0,0x3D37, 0, 0, 0, 0, + 0,0x6E4B,0x6E4A, 0,0x395A, 0,0x3973,0x3B40, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6E4E, 0, 0, 0, 0,0x3D66, 0, +0x6E4D, 0,0x6E4C, 0,0x4269, 0, 0,0x386F, + 0,0x4043, 0, 0, 0, 0,0x4830, 0, + 0, 0, 0,0x3D39, 0, 0, 0, 0, + 0,0x6E4F, 0,0x3E5F, 0, 0, 0, 0, + 0,0x6E52,0x6E50, 0, 0, 0,0x6E51, 0, + 0, 0, 0,0x6E54,0x6E53, 0, 0,0x3E7A, + 0,0x6E55, 0, 0, 0, 0, 0,0x6E56, +0x6E57, 0, 0, 0, 0,0x4850,0x3A53,0x3C61, +0x6E58, 0,0x6E59,0x4E24,0x3D45,0x4C6E,0x4E4C,0x6E5A, +0x3662, 0, 0, 0, 0,0x6E5B, 0,0x4523, + 0, 0,0x6E5E,0x3378,0x3F4B, 0,0x6E5C, 0, +0x6E5D, 0,0x4460, 0, 0,0x4B55,0x367C, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x6E60,0x6E61, 0, 0, + 0, 0, 0,0x6E5F, 0, 0,0x6E63, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x465F,0x3343, 0, 0, +0x6E67, 0, 0,0x6E64,0x6E66, 0, 0, 0, + 0, 0, 0, 0, 0,0x6E62, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6F4F, 0, 0,0x6E65, 0, 0, 0, 0, + 0, 0, 0,0x4E6B, 0, 0,0x385A, 0, + 0, 0, 0, 0, 0, 0,0x6E6F, 0, + 0, 0, 0,0x4534,0x6E6A, 0, 0,0x6E6D, +0x6E6B, 0,0x6E70, 0, 0, 0, 0,0x6E71, + 0, 0, 0, 0, 0, 0,0x6E69, 0, + 0,0x6E76,0x3174, 0, 0,0x6E68, 0, 0, + 0,0x482D, 0,0x6E6C, 0,0x3E60, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x395B, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x4B48, 0,0x3664, + 0, 0,0x3D46, 0,0x463C, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x412D, 0,0x6E74, 0,0x6E6E,0x6E73, 0,0x4C43, + 0,0x4438,0x6E75,0x6E72, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x412C, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x6E79, 0, +0x6E78}; + +/* page 40 0x92CF-0x93E8 */ +static uint16 tab_uni_jisx020840[]={ +0x6E77, 0, 0,0x4B2F, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x3D7B, 0, 0, + 0, 0,0x6E7A,0x4A5F, 0, 0,0x3154, 0, + 0, 0, 0,0x4946,0x4372, 0, 0, 0, + 0,0x3578, 0,0x6E7C, 0,0x395D, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3B2C, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6E7B,0x3F6D, 0, 0, 0, 0, 0, 0, + 0,0x3F6E,0x6F21,0x6F23, 0, 0, 0, 0, + 0,0x3E7B, 0,0x6F22,0x6F24, 0, 0,0x3653, + 0,0x4945, 0, 0,0x3C62,0x4F23, 0,0x6E7E, +0x3A78, 0, 0,0x4F3F, 0, 0,0x6F26, 0, + 0, 0, 0,0x6F25,0x6F27, 0, 0, 0, + 0, 0, 0, 0, 0,0x6E7D, 0, 0, + 0, 0, 0, 0,0x4669, 0,0x4555, 0, + 0, 0, 0, 0, 0,0x4457, 0,0x6F2C, + 0, 0, 0, 0,0x4343,0x6F28, 0, 0, + 0,0x6F29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x372D, 0,0x6F2B, + 0, 0, 0, 0, 0, 0,0x3830, 0, + 0, 0, 0, 0, 0,0x6F2A, 0,0x3E61, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x3379, 0, 0, + 0, 0, 0, 0, 0,0x6F30, 0,0x3A3F, +0x4179, 0, 0,0x444A, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x333B, 0, 0, 0, 0,0x6F2E,0x6F2F,0x4443, + 0,0x6F2D, 0, 0, 0, 0, 0, 0, + 0, 0,0x6F31, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x6F37, 0, 0, 0, + 0,0x6F3A, 0, 0, 0, 0, 0, 0, + 0,0x6F39,0x452D, 0, 0, 0, 0,0x6F32, +0x6F33,0x6F36, 0, 0, 0, 0,0x6F38, 0, + 0, 0,0x3640, 0, 0,0x6F3B,0x6F35, 0, + 0,0x6F34}; + +/* page 41 0x9403-0x9481 */ +static uint16 tab_uni_jisx020841[]={ +0x6F3F, 0, 0, 0,0x6F40, 0, 0, 0, + 0, 0, 0, 0, 0,0x6F41, 0, 0, +0x6F3E,0x6F3D, 0, 0, 0,0x3E62,0x462A,0x6F3C, + 0, 0, 0, 0, 0, 0,0x6F45, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6F43, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x6F44,0x6F42, 0,0x4278, 0,0x6F46, + 0, 0, 0, 0, 0, 0,0x6F47, 0, + 0,0x6F49, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x3455,0x6F48, +0x4C7A, 0, 0, 0, 0, 0, 0,0x6F54, +0x6F4A, 0, 0,0x6F4D, 0,0x6F4B, 0,0x6F4C, + 0, 0, 0, 0, 0, 0, 0,0x6F4E, + 0, 0, 0, 0, 0,0x6F50, 0, 0, + 0, 0,0x6F51, 0,0x6F52, 0, 0, 0, + 0,0x6F55,0x6F53,0x6F56,0x6F58, 0,0x6F57}; + +/* page 42 0x9577-0x95E5 */ +static uint16 tab_uni_jisx020842[]={ +0x4439, 0, 0, 0, 0, 0, 0, 0, + 0,0x4C67, 0,0x6F59,0x412E, 0, 0, 0, +0x6F5A, 0,0x4A44,0x6F5B,0x332B, 0, 0, 0, +0x313C, 0,0x3457, 0,0x3456,0x6F5C, 0,0x6F5D, + 0,0x6F5E,0x6F5F, 0, 0, 0, 0, 0, + 0,0x6F60, 0,0x3458,0x3355,0x395E,0x4836, 0, +0x6F62,0x6F61, 0, 0, 0, 0,0x6F63, 0, + 0, 0, 0,0x315C, 0, 0, 0, 0, + 0, 0,0x6F66, 0,0x6F65,0x6F64, 0,0x6F67, + 0, 0, 0, 0,0x6F6A, 0, 0, 0, +0x3047, 0, 0,0x6F68, 0,0x6F6C,0x6F6B, 0, + 0, 0, 0, 0, 0,0x6F6E,0x6F6D,0x6F6F, + 0,0x462E, 0, 0, 0,0x6F70, 0, 0, + 0, 0,0x6F71,0x6F73, 0, 0,0x6F72}; + +/* page 43 0x961C-0x9874 */ +static uint16 tab_uni_jisx020843[]={ +0x496C, 0, 0, 0, 0,0x6F74, 0, 0, + 0, 0, 0, 0,0x6F75, 0,0x3A65, 0, + 0, 0,0x6F76,0x6F77, 0, 0,0x4B49, 0, + 0, 0, 0, 0, 0, 0, 0,0x414B, + 0, 0, 0,0x3024,0x424B, 0,0x6F78, 0, +0x496D, 0, 0, 0, 0, 0, 0,0x6F7B, +0x6F79,0x395F, 0,0x6F7A,0x3842, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x4A45, +0x6F7D,0x7021,0x6F7E,0x7022, 0, 0,0x3121,0x3F58, +0x3D7C,0x3459,0x7023, 0, 0, 0,0x4766, 0, +0x7025, 0, 0, 0,0x3122, 0,0x7024,0x4444, + 0,0x4E4D,0x462B,0x6F7C,0x4E26, 0,0x3831, 0, + 0,0x4D5B, 0, 0, 0, 0, 0, 0, + 0,0x3679,0x4E34, 0,0x3728, 0,0x4262,0x6721, + 0,0x7026,0x332C,0x3F6F, 0, 0, 0, 0, +0x3356,0x7028, 0,0x7029,0x7027,0x3764, 0,0x3A5D, +0x3E63, 0, 0, 0,0x3123, 0, 0,0x4E59, + 0, 0, 0,0x702B,0x6E2E, 0,0x702A, 0, + 0, 0, 0, 0,0x702E,0x702C,0x702D, 0, +0x702F, 0,0x7030,0x4E6C,0x7031,0x7032, 0,0x4049, +0x483B, 0, 0, 0,0x3F7D,0x3467, 0, 0, +0x4D3A,0x326D,0x3D38,0x385B, 0,0x7035, 0,0x7034, +0x3B73,0x7036,0x7033, 0, 0,0x3B28, 0, 0, + 0,0x703A,0x6A2D, 0, 0,0x5256, 0,0x3F77, +0x7038, 0, 0, 0, 0, 0,0x4E25,0x4671, + 0, 0, 0, 0,0x312B, 0,0x4063,0x3C36, + 0, 0, 0, 0,0x4A37, 0,0x3140, 0, + 0, 0,0x4E6D,0x4D6B, 0,0x703B, 0,0x4545, + 0, 0, 0, 0,0x3C7B, 0, 0, 0, +0x703C, 0,0x703D,0x3F4C,0x703E, 0,0x4E6E, 0, + 0,0x7039,0x7040,0x7042, 0,0x7041, 0,0x703F, + 0, 0,0x7043, 0, 0,0x7044, 0, 0, +0x417A, 0,0x3262, 0, 0, 0, 0, 0, +0x7045, 0, 0,0x4C38, 0, 0,0x7046, 0, + 0, 0, 0, 0,0x7047, 0,0x4F2A, 0, + 0, 0, 0, 0,0x5B31,0x7048, 0, 0, + 0,0x7049,0x704A, 0, 0, 0,0x704E, 0, +0x704B, 0,0x704C, 0,0x704D,0x704F, 0, 0, + 0, 0, 0, 0, 0, 0,0x4044, 0, + 0, 0,0x4C77, 0, 0,0x4045, 0, 0, +0x7050, 0,0x4873, 0,0x7051,0x7353,0x4C4C, 0, +0x7052, 0,0x7053, 0,0x7054,0x3357, 0,0x7056, + 0,0x3F59, 0, 0, 0,0x7057, 0, 0, +0x3724, 0, 0, 0, 0,0x7058,0x705C, 0, +0x705A, 0, 0, 0, 0,0x705B, 0, 0, +0x3373,0x7059,0x705D, 0, 0, 0, 0,0x705E, + 0,0x3048, 0,0x705F,0x7060, 0, 0, 0, + 0, 0, 0, 0,0x3E64, 0, 0, 0, +0x7061, 0, 0, 0,0x3547, 0, 0,0x7064, + 0, 0,0x7063, 0,0x7062, 0, 0,0x6B71, + 0,0x4A5C, 0, 0, 0, 0, 0,0x7065, +0x7066, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x7067, + 0, 0,0x7068, 0,0x7069, 0, 0,0x706A, + 0, 0, 0, 0, 0, 0, 0,0x345A, + 0, 0, 0, 0, 0, 0, 0, 0, +0x706B, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x706C,0x4723, 0, 0, 0,0x706E,0x323B, + 0,0x7071,0x7070, 0, 0, 0, 0,0x3124, + 0, 0, 0,0x3641, 0,0x4A47,0x443A,0x3A22, + 0,0x3960,0x3D67, 0,0x3F5C, 0, 0, 0, +0x7073, 0, 0,0x7072,0x4D42,0x3468,0x4852,0x465C, + 0, 0, 0,0x3F7C,0x4E4E, 0,0x375B, 0, + 0, 0, 0, 0, 0,0x7076, 0, 0, +0x7075, 0, 0, 0, 0, 0, 0, 0, +0x4B4B,0x462C, 0, 0, 0, 0, 0, 0, +0x3150, 0, 0,0x7077,0x7074, 0, 0,0x4951, +0x4D6A,0x7078, 0, 0, 0, 0, 0, 0, + 0, 0,0x7079, 0, 0, 0, 0,0x707B, +0x426A,0x335B,0x335C,0x707A, 0, 0, 0, 0, +0x3469,0x3832, 0, 0,0x346A, 0, 0,0x453F, + 0, 0,0x4E60, 0, 0, 0, 0, 0, + 0, 0, 0,0x385C, 0, 0, 0,0x707C, + 0, 0, 0,0x707D,0x707E,0x7121, 0,0x7123, +0x7122}; + +/* page 44 0x98A8-0x98C6 */ +static uint16 tab_uni_jisx020844[]={ +0x4977, 0,0x7124, 0, 0, 0, 0,0x7125, + 0,0x7126, 0, 0, 0, 0,0x7127, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x7129,0x7128, 0,0x712A}; + +/* page 45 0x98DB-0x9957 */ +static uint16 tab_uni_jisx020845[]={ +0x4874,0x664C, 0, 0,0x3F29, 0, 0,0x3532, + 0, 0, 0, 0, 0, 0,0x712B, 0, +0x712C, 0,0x522C,0x5D3B,0x4853, 0, 0,0x307B, + 0,0x303B, 0, 0, 0, 0, 0, 0, + 0,0x3B74,0x4B30,0x3E7E, 0, 0, 0, 0, +0x712D, 0,0x4C5F, 0, 0, 0,0x712E,0x4D5C, + 0,0x3142, 0, 0, 0,0x3B41, 0,0x712F, +0x326E,0x7130, 0, 0, 0,0x7131, 0, 0, + 0, 0,0x7133,0x7134, 0,0x7136,0x7132, 0, + 0,0x7135, 0, 0, 0,0x345B, 0, 0, + 0,0x7137, 0,0x7138, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x7139,0x713A, 0, 0, 0,0x713B, + 0, 0,0x713D, 0, 0, 0,0x713C, 0, +0x713F,0x7142, 0, 0, 0,0x713E,0x7140,0x7141, + 0, 0,0x7143, 0,0x3642}; + +/* page 46 0x9996-0x9A6B */ +static uint16 tab_uni_jisx020846[]={ +0x3C73,0x7144,0x7145,0x3961, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x7146, + 0, 0,0x333E, 0, 0, 0,0x474F,0x7147, +0x7148, 0, 0, 0, 0,0x435A,0x466B, 0, + 0, 0, 0, 0, 0, 0,0x7149, 0, + 0, 0, 0,0x477D, 0, 0,0x424C,0x3158, +0x366E, 0,0x366F, 0, 0, 0, 0, 0, + 0, 0,0x4373,0x714E,0x3670, 0, 0,0x326F, + 0, 0,0x714D, 0, 0,0x714B, 0,0x714C, + 0,0x714A, 0, 0,0x7158, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x714F, +0x7150, 0, 0,0x7151,0x7152, 0, 0, 0, + 0, 0,0x7154, 0, 0,0x7153, 0, 0, + 0,0x3D59, 0,0x7155, 0, 0, 0,0x7157, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3533,0x7156, 0, 0,0x417B,0x3833, 0, 0, + 0, 0, 0,0x7159, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x424D, 0, 0,0x715A, 0, 0, + 0, 0,0x462D, 0, 0, 0, 0, 0, + 0,0x715B, 0, 0, 0, 0, 0, 0, +0x7160, 0,0x715E, 0,0x715D,0x715F, 0,0x715C, + 0, 0, 0, 0, 0, 0, 0,0x7162, + 0, 0, 0, 0, 0, 0, 0,0x7161, + 0,0x7164, 0, 0,0x3643,0x7163, 0, 0, + 0,0x7165, 0, 0,0x7166, 0,0x7168,0x7167, + 0, 0, 0,0x7169,0x716B,0x716A}; + +/* page 47 0x9AA8-0x9B5A */ +static uint16 tab_uni_jisx020847[]={ +0x397C, 0, 0, 0, 0,0x716C, 0, 0, +0x716D, 0, 0, 0, 0, 0, 0, 0, +0x333C, 0, 0, 0,0x716E, 0, 0, 0, +0x716F, 0, 0, 0,0x3F71, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x7170, + 0,0x7171, 0,0x7172,0x7173, 0, 0, 0, +0x3962, 0, 0, 0, 0, 0,0x7174,0x7175, + 0, 0,0x7176,0x7177, 0, 0,0x7178, 0, + 0, 0,0x4831,0x717A, 0,0x4926,0x717B,0x7179, + 0,0x717D, 0, 0,0x717C, 0, 0,0x717E, + 0, 0, 0,0x7221, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x7222, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7223, 0,0x7224, 0, 0, 0, 0,0x7225, + 0, 0,0x7226,0x7227, 0,0x7228, 0,0x7229, +0x722A,0x722B,0x722C, 0, 0, 0,0x722D,0x722E, + 0,0x5D35,0x722F, 0, 0, 0, 0, 0, + 0, 0, 0,0x6478,0x3534, 0, 0, 0, + 0,0x3321,0x3A32,0x7231,0x7230,0x4C25, 0, 0, + 0, 0, 0, 0, 0,0x7233,0x7234,0x7232, + 0,0x7235, 0, 0,0x4B62, 0, 0, 0, +0x7236, 0,0x357B}; + +/* page 48 0x9B6F-0x9C78 */ +static uint16 tab_uni_jisx020848[]={ +0x4F25, 0, 0, 0, 0,0x7237, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x7239, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x303E, + 0, 0,0x723A,0x4A2B,0x7238, 0, 0,0x723B, +0x723C, 0, 0, 0, 0, 0, 0, 0, +0x723D,0x723E, 0, 0, 0, 0, 0, 0, + 0,0x723F, 0,0x4B6E,0x3B2D, 0,0x3A7A,0x412F, + 0, 0, 0, 0, 0,0x7240, 0, 0, + 0, 0,0x7243, 0, 0, 0, 0, 0, + 0,0x7241, 0, 0, 0, 0, 0,0x7244, + 0, 0,0x3871,0x7242, 0, 0, 0, 0, +0x7245, 0,0x7246,0x7247, 0,0x724B, 0,0x3B2A, + 0, 0, 0, 0,0x4264, 0, 0, 0, + 0, 0,0x724C,0x7249,0x7248,0x724A, 0, 0, + 0,0x375F, 0, 0, 0, 0, 0, 0, + 0,0x7250,0x724F,0x724E, 0, 0,0x3033, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x725A, 0,0x7256, + 0,0x7257,0x7253,0x7259, 0,0x7255,0x3362, 0, + 0,0x4F4C, 0,0x7258,0x7254,0x7252,0x7251, 0, + 0, 0, 0, 0,0x725C, 0, 0, 0, + 0, 0,0x725F, 0, 0,0x725E,0x725D, 0, + 0, 0, 0, 0, 0, 0,0x4949,0x725B, +0x3073,0x7260, 0,0x7262, 0, 0, 0, 0, + 0, 0,0x336F,0x724D,0x3137, 0, 0,0x7264, + 0, 0, 0, 0, 0, 0, 0,0x7263, +0x7261,0x432D, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x4B70, 0, 0, 0, 0, +0x4E5A, 0, 0,0x7265, 0, 0, 0, 0, + 0,0x7266, 0, 0, 0, 0, 0, 0, +0x7267, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x7268, + 0,0x7269}; + +/* page 49 0x9CE5-0x9DFD */ +static uint16 tab_uni_jisx020849[]={ +0x443B, 0,0x726A, 0,0x4837, 0,0x726F,0x726B, + 0, 0, 0,0x726C, 0, 0,0x4B31,0x4C44, + 0,0x4650, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x7270, 0, + 0,0x7271,0x463E,0x726E,0x726D, 0, 0, 0, + 0,0x322A, 0, 0, 0,0x7279, 0, 0, +0x7278, 0, 0, 0, 0, 0,0x3175, 0, + 0, 0,0x7276, 0, 0, 0,0x7275, 0, + 0,0x7273, 0,0x337B, 0,0x7272,0x3C32,0x3229, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x3963, 0, + 0,0x727C,0x727B, 0,0x727A, 0, 0,0x7277, + 0,0x727D, 0,0x727E, 0, 0, 0, 0, + 0, 0, 0,0x7325,0x7324, 0, 0, 0, + 0, 0, 0, 0,0x7326, 0, 0,0x312D, +0x7321,0x7322, 0,0x3974,0x4C39, 0, 0,0x7323, + 0, 0, 0, 0, 0, 0, 0,0x4B32, + 0, 0,0x732B, 0, 0,0x7327, 0, 0, + 0, 0, 0, 0, 0,0x732C, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x7329, 0,0x7328, 0, 0, 0, + 0, 0,0x375C, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x732D, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x732E, + 0, 0, 0, 0,0x732F, 0,0x732A, 0, + 0, 0,0x7274, 0, 0,0x7330, 0,0x4461, + 0, 0, 0,0x7334, 0,0x7335,0x7333, 0, + 0, 0, 0, 0,0x7332,0x7338, 0,0x7331, + 0,0x7336, 0, 0, 0, 0, 0, 0, + 0, 0,0x7337, 0, 0, 0,0x733A, 0, + 0, 0, 0, 0,0x7339, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x733C, 0, 0, 0, 0, 0, 0, +0x733D, 0,0x733E, 0, 0,0x4F49, 0, 0, + 0, 0, 0,0x733B,0x426B,0x3A6D, 0, 0, +0x733F}; + +/* page 50 0x9E1A-0x9E1E */ +static uint16 tab_uni_jisx020850[]={ +0x7340,0x7341, 0, 0,0x7342}; + +/* page 51 0x9E75-0x9F77 */ +static uint16 tab_uni_jisx020851[]={ +0x7343, 0, 0,0x3834,0x7344, 0, 0, 0, +0x7345, 0,0x3C2F, 0,0x7346, 0, 0, 0, + 0, 0, 0,0x7347, 0, 0,0x7348,0x7349, + 0, 0, 0, 0,0x734C,0x734A,0x4F3C, 0, +0x734B, 0,0x4E6F, 0, 0, 0, 0, 0, +0x734D, 0,0x4E5B, 0, 0, 0, 0, 0, +0x734E,0x477E, 0, 0,0x734F,0x7351, 0, 0, +0x7352, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x7350,0x396D,0x4C4D,0x4B63,0x5677, + 0,0x5D60,0x4B7B, 0, 0, 0, 0,0x322B, + 0, 0, 0, 0, 0, 0, 0,0x7354, +0x3550,0x7355,0x7356,0x7357, 0,0x3975, 0,0x7358, + 0, 0, 0,0x6054,0x4C5B, 0,0x4263,0x7359, +0x735B,0x735A, 0,0x735C, 0, 0, 0, 0, +0x735D, 0, 0,0x735E, 0, 0, 0, 0, + 0, 0,0x735F, 0, 0, 0, 0,0x7360, + 0,0x7361,0x7362, 0,0x7363, 0,0x7364,0x7365, +0x7366, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x7367,0x7368, 0, 0, 0, 0, + 0,0x4524, 0, 0, 0, 0,0x385D, 0, +0x736A, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x414D,0x736B, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x736C, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x4921, 0, + 0,0x736D, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x736E,0x6337, 0, + 0,0x6C5A,0x706D, 0, 0,0x736F, 0,0x7370, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x7372,0x7373,0x7374,0x4E70,0x7371, 0, + 0,0x7375,0x7376, 0, 0,0x7378, 0,0x7377, + 0, 0, 0, 0, 0,0x737A, 0, 0, + 0,0x737B,0x7379}; + +/* page 52 0x9F8D-0x9FA0 */ +static uint16 tab_uni_jisx020852[]={ +0x4E36, 0, 0, 0, 0, 0, 0, 0, +0x737C, 0, 0, 0, 0, 0, 0,0x737D, +0x6354, 0, 0,0x737E}; + +/* page 53 0xFF01-0xFF5D */ +static uint16 tab_uni_jisx020853[]={ +0x212A, 0,0x2174,0x2170,0x2173,0x2175, 0,0x214A, +0x214B,0x2176,0x215C,0x2124, 0,0x2125,0x213F,0x2330, +0x2331,0x2332,0x2333,0x2334,0x2335,0x2336,0x2337,0x2338, +0x2339,0x2127,0x2128,0x2163,0x2161,0x2164,0x2129,0x2177, +0x2341,0x2342,0x2343,0x2344,0x2345,0x2346,0x2347,0x2348, +0x2349,0x234A,0x234B,0x234C,0x234D,0x234E,0x234F,0x2350, +0x2351,0x2352,0x2353,0x2354,0x2355,0x2356,0x2357,0x2358, +0x2359,0x235A,0x214E, 0,0x214F,0x2130,0x2132,0x212E, +0x2361,0x2362,0x2363,0x2364,0x2365,0x2366,0x2367,0x2368, +0x2369,0x236A,0x236B,0x236C,0x236D,0x236E,0x236F,0x2370, +0x2371,0x2372,0x2373,0x2374,0x2375,0x2376,0x2377,0x2378, +0x2379,0x237A,0x2150,0x2143,0x2151}; + +/* page 54 0xFFE3-0xFFE5 */ +static uint16 tab_uni_jisx020854[]={ +0x2131, 0,0x216F}; + +static int +my_uni_jisx0208_onechar(int code){ + if ((code>=0x005C)&&(code<=0x005C)) + return(tab_uni_jisx02080[code-0x005C]); + if ((code>=0x00A2)&&(code<=0x00B6)) + return(tab_uni_jisx02081[code-0x00A2]); + if ((code>=0x00D7)&&(code<=0x00D7)) + return(tab_uni_jisx02082[code-0x00D7]); + if ((code>=0x00F7)&&(code<=0x00F7)) + return(tab_uni_jisx02083[code-0x00F7]); + if ((code>=0x0391)&&(code<=0x03C9)) + return(tab_uni_jisx02084[code-0x0391]); + if ((code>=0x0401)&&(code<=0x0451)) + return(tab_uni_jisx02085[code-0x0401]); + if ((code>=0x2010)&&(code<=0x203B)) + return(tab_uni_jisx02086[code-0x2010]); + if ((code>=0x2103)&&(code<=0x2103)) + return(tab_uni_jisx02087[code-0x2103]); + if ((code>=0x212B)&&(code<=0x212B)) + return(tab_uni_jisx02088[code-0x212B]); + if ((code>=0x2190)&&(code<=0x2193)) + return(tab_uni_jisx02089[code-0x2190]); + if ((code>=0x21D2)&&(code<=0x21D4)) + return(tab_uni_jisx020810[code-0x21D2]); + if ((code>=0x2200)&&(code<=0x223D)) + return(tab_uni_jisx020811[code-0x2200]); + if ((code>=0x2252)&&(code<=0x226B)) + return(tab_uni_jisx020812[code-0x2252]); + if ((code>=0x2282)&&(code<=0x2287)) + return(tab_uni_jisx020813[code-0x2282]); + if ((code>=0x22A5)&&(code<=0x22A5)) + return(tab_uni_jisx020814[code-0x22A5]); + if ((code>=0x2312)&&(code<=0x2312)) + return(tab_uni_jisx020815[code-0x2312]); + if ((code>=0x2500)&&(code<=0x254B)) + return(tab_uni_jisx020816[code-0x2500]); + if ((code>=0x25A0)&&(code<=0x25CF)) + return(tab_uni_jisx020817[code-0x25A0]); + if ((code>=0x25EF)&&(code<=0x25EF)) + return(tab_uni_jisx020818[code-0x25EF]); + if ((code>=0x2605)&&(code<=0x2606)) + return(tab_uni_jisx020819[code-0x2605]); + if ((code>=0x2640)&&(code<=0x2642)) + return(tab_uni_jisx020820[code-0x2640]); + if ((code>=0x266A)&&(code<=0x266F)) + return(tab_uni_jisx020821[code-0x266A]); + if ((code>=0x3000)&&(code<=0x301C)) + return(tab_uni_jisx020822[code-0x3000]); + if ((code>=0x3041)&&(code<=0x30FE)) + return(tab_uni_jisx020823[code-0x3041]); + if ((code>=0x4E00)&&(code<=0x5516)) + return(tab_uni_jisx020824[code-0x4E00]); + if ((code>=0x552E)&&(code<=0x5563)) + return(tab_uni_jisx020825[code-0x552E]); + if ((code>=0x557B)&&(code<=0x576A)) + return(tab_uni_jisx020826[code-0x557B]); + if ((code>=0x577F)&&(code<=0x5A9B)) + return(tab_uni_jisx020827[code-0x577F]); + if ((code>=0x5ABC)&&(code<=0x5D29)) + return(tab_uni_jisx020828[code-0x5ABC]); + if ((code>=0x5D4B)&&(code<=0x6BF3)) + return(tab_uni_jisx020829[code-0x5D4B]); + if ((code>=0x6C08)&&(code<=0x6CF3)) + return(tab_uni_jisx020830[code-0x6C08]); + if ((code>=0x6D0B)&&(code<=0x7409)) + return(tab_uni_jisx020831[code-0x6D0B]); + if ((code>=0x7422)&&(code<=0x7845)) + return(tab_uni_jisx020832[code-0x7422]); + if ((code>=0x785D)&&(code<=0x7E9C)) + return(tab_uni_jisx020833[code-0x785D]); + if ((code>=0x7F36)&&(code<=0x8358)) + return(tab_uni_jisx020834[code-0x7F36]); + if ((code>=0x8373)&&(code<=0x8B9A)) + return(tab_uni_jisx020835[code-0x8373]); + if ((code>=0x8C37)&&(code<=0x8D16)) + return(tab_uni_jisx020836[code-0x8C37]); + if ((code>=0x8D64)&&(code<=0x8F64)) + return(tab_uni_jisx020837[code-0x8D64]); + if ((code>=0x8F9B)&&(code<=0x9132)) + return(tab_uni_jisx020838[code-0x8F9B]); + if ((code>=0x9149)&&(code<=0x92B9)) + return(tab_uni_jisx020839[code-0x9149]); + if ((code>=0x92CF)&&(code<=0x93E8)) + return(tab_uni_jisx020840[code-0x92CF]); + if ((code>=0x9403)&&(code<=0x9481)) + return(tab_uni_jisx020841[code-0x9403]); + if ((code>=0x9577)&&(code<=0x95E5)) + return(tab_uni_jisx020842[code-0x9577]); + if ((code>=0x961C)&&(code<=0x9874)) + return(tab_uni_jisx020843[code-0x961C]); + if ((code>=0x98A8)&&(code<=0x98C6)) + return(tab_uni_jisx020844[code-0x98A8]); + if ((code>=0x98DB)&&(code<=0x9957)) + return(tab_uni_jisx020845[code-0x98DB]); + if ((code>=0x9996)&&(code<=0x9A6B)) + return(tab_uni_jisx020846[code-0x9996]); + if ((code>=0x9AA8)&&(code<=0x9B5A)) + return(tab_uni_jisx020847[code-0x9AA8]); + if ((code>=0x9B6F)&&(code<=0x9C78)) + return(tab_uni_jisx020848[code-0x9B6F]); + if ((code>=0x9CE5)&&(code<=0x9DFD)) + return(tab_uni_jisx020849[code-0x9CE5]); + if ((code>=0x9E1A)&&(code<=0x9E1E)) + return(tab_uni_jisx020850[code-0x9E1A]); + if ((code>=0x9E75)&&(code<=0x9F77)) + return(tab_uni_jisx020851[code-0x9E75]); + if ((code>=0x9F8D)&&(code<=0x9FA0)) + return(tab_uni_jisx020852[code-0x9F8D]); + if ((code>=0xFF01)&&(code<=0xFF5D)) + return(tab_uni_jisx020853[code-0xFF01]); + if ((code>=0xFFE3)&&(code<=0xFFE5)) + return(tab_uni_jisx020854[code-0xFFE3]); + return(0); +} + + + +/* page 0 0x007E-0x007E */ +static uint16 tab_uni_jisx02120[]={ +0x2237}; + +/* page 1 0x00A1-0x017E */ +static uint16 tab_uni_jisx02121[]={ +0x2242, 0, 0,0x2270, 0,0x2243, 0, 0, +0x226D,0x226C, 0, 0, 0,0x226E,0x2234, 0, + 0, 0, 0, 0, 0, 0, 0,0x2231, + 0,0x226B, 0, 0, 0, 0,0x2244,0x2A22, +0x2A21,0x2A24,0x2A2A,0x2A23,0x2A29,0x2921,0x2A2E,0x2A32, +0x2A31,0x2A34,0x2A33,0x2A40,0x2A3F,0x2A42,0x2A41, 0, +0x2A50,0x2A52,0x2A51,0x2A54,0x2A58,0x2A53, 0,0x292C, +0x2A63,0x2A62,0x2A65,0x2A64,0x2A72,0x2930,0x294E,0x2B22, +0x2B21,0x2B24,0x2B2A,0x2B23,0x2B29,0x2941,0x2B2E,0x2B32, +0x2B31,0x2B34,0x2B33,0x2B40,0x2B3F,0x2B42,0x2B41,0x2943, +0x2B50,0x2B52,0x2B51,0x2B54,0x2B58,0x2B53, 0,0x294C, +0x2B63,0x2B62,0x2B65,0x2B64,0x2B72,0x2950,0x2B73,0x2A27, +0x2B27,0x2A25,0x2B25,0x2A28,0x2B28,0x2A2B,0x2B2B,0x2A2C, +0x2B2C,0x2A2F,0x2B2F,0x2A2D,0x2B2D,0x2A30,0x2B30,0x2922, +0x2942,0x2A37,0x2B37, 0, 0,0x2A36,0x2B36,0x2A38, +0x2B38,0x2A35,0x2B35,0x2A3A,0x2B3A,0x2A3B,0x2B3B,0x2A3D, +0x2B3D,0x2A3C, 0,0x2A3E,0x2B3E,0x2924,0x2944,0x2A47, +0x2B47,0x2A45,0x2B45, 0, 0,0x2A46,0x2B46,0x2A44, +0x2945,0x2926,0x2946,0x2A48,0x2B48,0x2A49,0x2B49,0x2947, +0x2A4A,0x2B4A,0x2A4C,0x2B4C,0x2A4B,0x2B4B,0x2929,0x2949, +0x2928,0x2948,0x2A4D,0x2B4D,0x2A4F,0x2B4F,0x2A4E,0x2B4E, +0x294A,0x292B,0x294B,0x2A57,0x2B57, 0, 0,0x2A56, +0x2B56,0x292D,0x294D,0x2A59,0x2B59,0x2A5B,0x2B5B,0x2A5A, +0x2B5A,0x2A5C,0x2B5C,0x2A5D,0x2B5D,0x2A5F,0x2B5F,0x2A5E, +0x2B5E,0x2A61,0x2B61,0x2A60,0x2B60,0x292F,0x294F,0x2A6C, +0x2B6C,0x2A69,0x2B69,0x2A66,0x2B66,0x2A6B,0x2B6B,0x2A68, +0x2B68,0x2A6A,0x2B6A,0x2A71,0x2B71,0x2A74,0x2B74,0x2A73, +0x2A75,0x2B75,0x2A77,0x2B77,0x2A76,0x2B76}; + +/* page 2 0x01CD-0x01DC */ +static uint16 tab_uni_jisx02122[]={ +0x2A26,0x2B26,0x2A43,0x2B43,0x2A55,0x2B55,0x2A67,0x2B67, +0x2A70,0x2B70,0x2A6D,0x2B6D,0x2A6F,0x2B6F,0x2A6E,0x2B6E +}; + +/* page 3 0x01F5-0x01F5 */ +static uint16 tab_uni_jisx02123[]={ +0x2B39}; + +/* page 4 0x02C7-0x02DD */ +static uint16 tab_uni_jisx02124[]={ +0x2230, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x222F,0x2232,0x2236,0x2235, 0,0x2233}; + +/* page 5 0x0384-0x0390 */ +static uint16 tab_uni_jisx02125[]={ +0x2238,0x2239,0x2661, 0,0x2662,0x2663,0x2664, 0, +0x2667, 0,0x2669,0x266C,0x2676}; + +/* page 6 0x03AA-0x03CE */ +static uint16 tab_uni_jisx02126[]={ +0x2665,0x266A,0x2671,0x2672,0x2673,0x2674,0x267B, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x2678, 0, 0, 0, 0, 0, 0, 0, +0x2675,0x267A,0x2677,0x2679,0x267C}; + +/* page 7 0x0402-0x040F */ +static uint16 tab_uni_jisx02127[]={ +0x2742,0x2743,0x2744,0x2745,0x2746,0x2747,0x2748,0x2749, +0x274A,0x274B,0x274C, 0,0x274D,0x274E}; + +/* page 8 0x0452-0x045F */ +static uint16 tab_uni_jisx02128[]={ +0x2772,0x2773,0x2774,0x2775,0x2776,0x2777,0x2778,0x2779, +0x277A,0x277B,0x277C, 0,0x277D,0x277E}; + +/* page 9 0x2116-0x2122 */ +static uint16 tab_uni_jisx02129[]={ +0x2271, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x226F}; + +/* page 10 0x4E02-0x4F19 */ +static uint16 tab_uni_jisx021210[]={ +0x3021, 0,0x3022,0x3023, 0, 0, 0, 0, + 0, 0,0x3024, 0, 0, 0, 0, 0, +0x3025, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x3026, 0, 0, + 0,0x3027,0x3028, 0, 0, 0,0x3029, 0, + 0,0x302A, 0, 0,0x302B,0x302C,0x302D, 0, + 0, 0, 0,0x302E, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x302F,0x3030, + 0, 0,0x3031, 0, 0,0x3032, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3033, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3034, 0,0x3035, 0, 0, 0, 0, 0, + 0,0x3036, 0, 0, 0, 0,0x3037,0x3038, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x3039,0x303A, 0, 0, 0,0x303B, + 0, 0, 0, 0, 0,0x303C, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x303D, 0, 0, 0, 0, + 0, 0, 0, 0,0x303E,0x303F, 0, 0, + 0, 0, 0,0x3040, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x3041, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3042, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x3043, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x3044, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3045,0x3046, 0, 0, 0, 0,0x3047,0x3048, +0x3049, 0, 0, 0, 0, 0,0x304A, 0, + 0, 0, 0, 0, 0,0x304B, 0,0x304C, + 0,0x304D, 0,0x304E, 0, 0, 0, 0, + 0, 0, 0,0x304F,0x3050,0x3051,0x3052, 0, +0x3053,0x3054, 0, 0, 0, 0,0x3055, 0, + 0,0x3056,0x3057, 0, 0, 0, 0, 0, +0x3058, 0, 0,0x3059,0x305A,0x305B, 0,0x305C +}; + +/* page 11 0x4F2E-0x5166 */ +static uint16 tab_uni_jisx021211[]={ +0x305D, 0, 0,0x305E, 0,0x3060, 0,0x3061, + 0,0x3062, 0,0x3063, 0,0x3064, 0, 0, +0x3065, 0,0x3066, 0,0x3067, 0, 0, 0, + 0, 0,0x3068,0x3069, 0,0x306A,0x306B, 0, + 0, 0, 0, 0,0x306C, 0,0x306D, 0, +0x306E, 0,0x306F, 0, 0, 0, 0, 0, + 0,0x3070,0x305F, 0, 0,0x3071, 0, 0, + 0, 0, 0, 0,0x3072, 0,0x3073, 0, +0x3074, 0, 0,0x3075, 0, 0, 0, 0, + 0,0x3076,0x3077,0x3078,0x3079, 0, 0,0x307A, +0x307B, 0, 0,0x307C,0x307D, 0,0x307E,0x3121, + 0, 0, 0,0x3122,0x3123, 0,0x3124, 0, +0x3125, 0,0x3126, 0,0x3127,0x3128,0x3129, 0, + 0,0x312A, 0,0x312B,0x312C, 0, 0, 0, +0x312D,0x312E, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x312F, 0, 0, 0, + 0,0x3130, 0,0x3131, 0,0x3132,0x3133,0x3134, +0x3135, 0,0x3136,0x3137, 0, 0, 0,0x3138, +0x3139, 0,0x313A,0x313B, 0,0x313C,0x313D,0x313E, + 0,0x313F, 0, 0,0x3140, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x3141, 0, + 0, 0,0x3142, 0,0x3143, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x3144, 0,0x3145, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x3146,0x3147, + 0,0x3148,0x3149,0x314A, 0, 0,0x314B, 0, + 0,0x314C, 0, 0,0x314D, 0,0x314E, 0, +0x314F, 0,0x3150, 0, 0,0x3151, 0, 0, + 0,0x3152,0x3153, 0, 0,0x3154,0x3155,0x3156, +0x3157, 0, 0, 0,0x3158, 0, 0, 0, + 0,0x3159, 0, 0, 0, 0, 0, 0, +0x315A, 0,0x315B, 0,0x315C,0x315D, 0,0x315E, + 0, 0, 0, 0, 0,0x3176, 0, 0, + 0, 0,0x315F,0x3160,0x3161, 0, 0,0x3162, +0x3163, 0, 0, 0,0x3164, 0,0x3165, 0, +0x3166, 0, 0,0x3167,0x3168,0x3169, 0, 0, + 0,0x316A, 0,0x316B, 0, 0, 0, 0, + 0,0x316C,0x316D, 0,0x316E,0x316F, 0, 0, +0x3170,0x3171, 0, 0,0x3172, 0, 0,0x3173, + 0, 0,0x3174,0x3175, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x3177, 0,0x3178,0x3179, 0, +0x317A, 0, 0, 0,0x317B, 0, 0, 0, +0x317C,0x317D,0x317E, 0,0x3221,0x3222,0x3223, 0, +0x3224, 0, 0, 0, 0,0x3225,0x3226, 0, +0x3227,0x3228,0x3229,0x322A,0x322B, 0, 0, 0, + 0, 0, 0, 0,0x322C, 0, 0, 0, + 0,0x322D,0x322E, 0, 0, 0, 0, 0, + 0, 0, 0,0x322F,0x3230, 0, 0,0x3231, + 0, 0,0x3232, 0, 0,0x3233,0x3234, 0, + 0,0x3235, 0, 0, 0, 0,0x3236, 0, +0x3237, 0,0x3238, 0, 0,0x3239,0x323A, 0, + 0, 0,0x323B, 0, 0, 0,0x323C,0x323D, + 0,0x323E, 0, 0,0x323F, 0,0x3240, 0, +0x3241, 0,0x3242,0x3243, 0, 0, 0, 0, + 0,0x3244, 0,0x3245,0x3251, 0, 0, 0, +0x3246, 0, 0, 0,0x3247, 0, 0, 0, +0x3248, 0, 0, 0, 0,0x3249, 0, 0, +0x324A,0x324B,0x324C, 0, 0,0x324D,0x324E,0x324F, +0x3250, 0,0x3252, 0, 0, 0, 0, 0, + 0,0x3253, 0,0x3254, 0,0x3255,0x3256,0x3257, +0x3258, 0, 0, 0, 0,0x3259, 0, 0, + 0,0x325A,0x325B, 0, 0, 0,0x325C,0x325D, + 0,0x325E, 0,0x325F, 0,0x3260,0x3261,0x3262, + 0, 0,0x3263,0x3264, 0, 0, 0, 0, + 0, 0, 0, 0,0x3265, 0, 0, 0, + 0, 0, 0, 0,0x3266, 0, 0, 0, + 0,0x3267, 0, 0, 0,0x3268, 0,0x3269, + 0,0x326A,0x326B, 0, 0, 0, 0, 0, + 0,0x326C, 0, 0, 0, 0,0x326D, 0, +0x326E}; + +/* page 12 0x517E-0x5515 */ +static uint16 tab_uni_jisx021212[]={ +0x326F, 0, 0, 0, 0,0x3270,0x3271, 0, + 0, 0, 0, 0, 0,0x3272, 0, 0, +0x3273, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x3274, 0, 0, 0, 0,0x3275, + 0, 0, 0,0x3276, 0,0x3277, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3278, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x3279, 0,0x327A, 0,0x327B, 0, +0x327C,0x327D, 0, 0,0x327E, 0, 0, 0, + 0, 0,0x3321, 0, 0, 0, 0, 0, + 0,0x3322, 0,0x3323,0x3324,0x3325, 0,0x3326, + 0, 0,0x3327, 0, 0, 0, 0, 0, +0x3328, 0, 0, 0,0x3329, 0, 0,0x332A, + 0, 0, 0, 0, 0, 0, 0, 0, +0x332B, 0, 0, 0,0x332C,0x332D,0x332E, 0, + 0,0x332F, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x3330,0x3331, 0, 0,0x3332, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x3333,0x3334, 0,0x3335, +0x3336, 0,0x3337, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x3338, 0, 0, 0, + 0, 0,0x3339, 0, 0, 0, 0, 0, + 0, 0, 0,0x333A,0x333B, 0, 0,0x333C, + 0, 0, 0, 0, 0, 0,0x333D, 0, + 0, 0, 0, 0, 0, 0, 0,0x333E, + 0, 0, 0,0x333F, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3340, + 0,0x3341,0x3342, 0,0x3343, 0,0x3344, 0, + 0,0x3345,0x3346,0x3347, 0, 0, 0, 0, +0x3348, 0, 0, 0, 0, 0, 0, 0, +0x3349, 0, 0, 0, 0, 0, 0, 0, + 0,0x334A,0x334B,0x334C, 0, 0, 0, 0, + 0, 0,0x334D, 0,0x334E, 0, 0,0x334F, + 0, 0, 0, 0,0x3350, 0,0x3351, 0, + 0, 0, 0, 0, 0,0x3352, 0,0x3353, +0x3354,0x3355,0x3356, 0,0x3357, 0,0x3358, 0, + 0, 0, 0, 0, 0, 0,0x3359,0x335A, +0x335B,0x335C, 0, 0, 0, 0, 0, 0, + 0,0x335D,0x335E, 0, 0, 0, 0, 0, +0x335F,0x3360,0x3361, 0,0x3362,0x3363, 0,0x3364, + 0, 0,0x3365, 0, 0, 0,0x3366, 0, +0x3367, 0,0x3368, 0, 0, 0,0x3369, 0, + 0,0x336A, 0,0x336B, 0, 0,0x336C, 0, +0x336D, 0, 0, 0, 0,0x336E,0x336F, 0, + 0, 0, 0,0x3370, 0, 0, 0,0x3371, + 0, 0,0x3372,0x3373,0x3374, 0,0x3375, 0, + 0, 0,0x3376,0x3377, 0, 0,0x3378, 0, +0x3379,0x337A, 0, 0, 0, 0, 0, 0, + 0, 0,0x337B, 0, 0,0x337C, 0, 0, + 0, 0, 0, 0,0x337D,0x337E,0x3421, 0, + 0, 0, 0,0x3422, 0,0x3423, 0, 0, + 0, 0,0x3424, 0, 0,0x3425,0x3426, 0, +0x3427,0x3428, 0, 0, 0, 0, 0,0x3429, + 0,0x342A,0x342B,0x342C, 0,0x342D,0x342E,0x342F, + 0, 0,0x3430, 0,0x3431, 0, 0,0x3432, + 0, 0, 0, 0, 0, 0,0x3433,0x3434, +0x3435, 0, 0, 0,0x3436, 0, 0, 0, + 0, 0, 0, 0, 0,0x3438,0x3437, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x3439, 0,0x343A, 0, 0, + 0, 0, 0,0x343B, 0,0x343C, 0,0x343D, + 0, 0, 0, 0, 0, 0,0x343E,0x343F, + 0, 0, 0, 0,0x3440, 0, 0, 0, + 0, 0, 0,0x3441, 0, 0, 0, 0, +0x3442, 0, 0, 0, 0,0x3443, 0, 0, + 0,0x3444,0x3445, 0, 0, 0, 0, 0, +0x3446, 0, 0, 0, 0,0x3447,0x3448, 0, + 0, 0, 0,0x3449, 0, 0, 0,0x344A, + 0, 0, 0,0x344B, 0, 0,0x344C, 0, + 0, 0, 0, 0,0x344D,0x344E, 0, 0, + 0,0x344F, 0, 0,0x3450, 0,0x3451,0x3452, + 0,0x3453,0x3454, 0,0x3455, 0, 0,0x3456, + 0, 0,0x3457, 0, 0, 0, 0,0x3458, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x3459, 0, 0,0x345A,0x345B, 0,0x345C, + 0, 0, 0, 0,0x345D, 0, 0,0x345E, +0x345F, 0,0x3460, 0, 0, 0, 0, 0, +0x3461,0x3462, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3463, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x3464, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x3465, 0, 0, + 0, 0, 0, 0,0x3466, 0, 0, 0, + 0, 0, 0,0x3467, 0, 0, 0, 0, + 0,0x3468,0x3469, 0,0x346A, 0, 0, 0, + 0,0x346B, 0,0x346C, 0, 0,0x346D,0x346E, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x346F,0x3470, 0, + 0,0x3471, 0, 0, 0, 0, 0,0x3472, + 0,0x3473, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3474, 0, 0, 0,0x3475, 0,0x3476, 0, +0x3477,0x3478, 0,0x3479, 0,0x347A, 0,0x347B, +0x347C, 0, 0, 0, 0, 0,0x347D, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x347E, 0,0x3521, 0,0x3522, 0,0x3523, + 0, 0,0x3524,0x3525, 0, 0, 0,0x3526, + 0, 0, 0,0x3527, 0, 0, 0,0x3528, +0x3529, 0, 0, 0, 0, 0,0x352A, 0, + 0,0x352B, 0,0x352C, 0, 0, 0, 0, +0x352D,0x352E, 0,0x352F,0x3530, 0, 0,0x3531, +0x3532, 0, 0,0x3533, 0, 0, 0, 0, + 0,0x3534, 0,0x3535,0x3536,0x3537, 0, 0, + 0,0x3538, 0, 0, 0, 0, 0, 0, +0x3539, 0, 0, 0,0x353A, 0, 0,0x353B, +0x353C, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x353D, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x353E, 0,0x353F, 0, + 0,0x3540, 0, 0, 0, 0, 0, 0, +0x3541, 0, 0, 0, 0, 0,0x3542, 0, +0x3543,0x3544,0x3545,0x3546, 0, 0, 0,0x3547, + 0, 0,0x3548,0x3549, 0, 0,0x354A,0x354B, +0x354C, 0, 0, 0, 0, 0, 0,0x354D +}; + +/* page 13 0x552A-0x5566 */ +static uint16 tab_uni_jisx021213[]={ +0x354E,0x354F, 0, 0, 0, 0, 0, 0, +0x3550, 0, 0,0x3551,0x3552, 0, 0, 0, + 0,0x3553,0x3554,0x3555, 0, 0, 0,0x3556, + 0, 0, 0, 0, 0,0x3557, 0,0x3558, +0x3559, 0, 0,0x355A, 0, 0,0x355B,0x355C, + 0, 0, 0, 0, 0, 0,0x355D, 0, +0x355E,0x355F, 0, 0,0x3560, 0,0x3561,0x3562, + 0, 0,0x3563, 0,0x3564}; + +/* page 14 0x557F-0x5C36 */ +static uint16 tab_uni_jisx021214[]={ +0x3565, 0,0x3566,0x3567, 0, 0, 0,0x3568, + 0,0x3569, 0, 0, 0, 0, 0,0x356A, +0x356B, 0,0x356C,0x356D,0x356E,0x356F, 0, 0, +0x3570, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x3571,0x3572, 0, 0, + 0, 0, 0, 0, 0, 0,0x3573, 0, + 0, 0, 0,0x3574, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3575, 0,0x3576, 0,0x3577, 0, 0,0x3578, + 0, 0,0x3579, 0,0x357A,0x357B, 0,0x357C, + 0, 0,0x357D,0x357E,0x3621, 0, 0, 0, +0x3622,0x3623, 0, 0,0x3624, 0, 0,0x3625, + 0, 0, 0,0x3626, 0, 0, 0, 0, + 0, 0,0x3627, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3628, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3629, 0, 0, 0, 0, 0,0x362A, 0, + 0,0x362B, 0,0x362C, 0, 0,0x362D,0x362E, +0x362F,0x3630,0x3631,0x3632, 0, 0, 0, 0, + 0, 0,0x3633, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x3634, 0, 0, + 0,0x3635, 0, 0,0x3636, 0,0x3637, 0, +0x3638, 0,0x3639, 0,0x363A,0x363B,0x363C, 0, +0x363D,0x363E,0x363F, 0,0x3640,0x3641, 0,0x3642, + 0, 0,0x3643, 0,0x3644, 0,0x3645, 0, +0x3646, 0, 0, 0, 0,0x3647, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3648, + 0,0x3649,0x364A,0x364B,0x364C, 0, 0,0x364D, + 0, 0,0x364E, 0, 0, 0,0x364F, 0, +0x3650, 0,0x3651,0x3652, 0, 0,0x3653, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x3654,0x3655, 0, + 0,0x3656, 0, 0,0x3657,0x3658, 0, 0, + 0, 0, 0, 0, 0, 0,0x3659, 0, + 0, 0,0x365A,0x365B, 0, 0,0x365C,0x365D, +0x365E, 0, 0, 0, 0, 0, 0,0x365F, +0x3660,0x3661,0x3662, 0,0x3663,0x3664,0x3665, 0, + 0, 0,0x3666, 0,0x3667, 0, 0, 0, +0x3668, 0, 0, 0, 0, 0, 0,0x3669, + 0, 0, 0, 0, 0, 0,0x366A, 0, + 0, 0,0x366B,0x366C,0x366D,0x3670,0x3671, 0, +0x366E,0x366F, 0, 0, 0, 0, 0, 0, + 0, 0,0x3672, 0, 0,0x3673,0x3674, 0, +0x3675, 0,0x3676, 0, 0,0x3677,0x3678,0x3679, +0x367A,0x367B, 0, 0,0x367D, 0,0x367E, 0, + 0, 0,0x367C, 0, 0, 0, 0,0x3721, +0x3722, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x3723,0x3724, 0, 0, 0, 0, +0x3725, 0, 0,0x3726, 0,0x3727, 0, 0, + 0, 0,0x3728, 0, 0, 0,0x3729, 0, + 0, 0, 0,0x372A,0x372B, 0,0x372C, 0, + 0,0x372D, 0,0x372E,0x372F,0x3730,0x3731, 0, + 0, 0,0x3732,0x3733, 0,0x3734, 0,0x3735, +0x3736, 0, 0, 0,0x3737,0x3738, 0, 0, + 0, 0, 0, 0, 0, 0,0x3739,0x373A, +0x373B, 0, 0, 0, 0, 0,0x373C,0x373D, + 0, 0, 0, 0, 0,0x373E,0x373F, 0, + 0, 0, 0,0x3740, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x3741, 0, 0,0x3742, 0, +0x3743,0x3744, 0, 0,0x3745, 0,0x3746,0x3747, +0x3748,0x3749,0x374A, 0,0x374B,0x374C,0x374D, 0, +0x374E, 0,0x374F,0x3750,0x3751,0x3752, 0,0x3753, + 0, 0,0x3754, 0,0x3755, 0, 0, 0, + 0, 0, 0, 0, 0,0x3756, 0, 0, + 0, 0, 0, 0, 0,0x3757,0x3760, 0, +0x3758, 0,0x3759,0x375A, 0,0x375B,0x375C,0x375D, +0x375E, 0,0x375F, 0, 0, 0, 0, 0, +0x3761,0x3762,0x3763, 0, 0,0x3764, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x3765, 0, 0, 0, 0,0x3766, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3767,0x3768, 0, 0, 0,0x3769, 0, 0, +0x376A, 0, 0, 0, 0, 0,0x376B, 0, + 0, 0, 0, 0, 0, 0,0x376C,0x376D, + 0, 0,0x377E, 0, 0,0x376E, 0,0x376F, +0x3770, 0,0x3771, 0, 0, 0,0x3772, 0, + 0,0x3773, 0, 0, 0, 0,0x3774,0x3775, + 0,0x3776, 0, 0, 0, 0,0x3777,0x3778, +0x3779, 0, 0, 0,0x377A,0x377B, 0, 0, + 0,0x377C,0x377D, 0, 0,0x3821,0x3822, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x3823, 0, 0,0x3824, +0x3825,0x3826, 0, 0, 0, 0, 0,0x3827, +0x3828, 0, 0, 0, 0, 0,0x3829, 0, + 0, 0, 0,0x382A, 0, 0, 0, 0, + 0, 0,0x382B, 0, 0, 0, 0, 0, +0x382C, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x382D, 0, 0,0x382E,0x382F, 0, +0x3830,0x3831, 0, 0, 0, 0,0x3832, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3833, 0,0x3834, 0, 0,0x3835, 0, 0, +0x3836,0x3837, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x3838, 0, 0, 0,0x3839, 0, 0, +0x383A,0x383B,0x383C, 0, 0, 0, 0, 0, +0x383D,0x383E,0x383F,0x3840, 0,0x3841,0x3842, 0, +0x3843,0x3844, 0, 0, 0,0x3845, 0,0x3846, + 0, 0, 0, 0, 0, 0,0x3847, 0, + 0,0x3848,0x3849,0x384A, 0, 0, 0,0x384B, + 0, 0,0x384C, 0, 0, 0, 0, 0, + 0, 0,0x384D,0x384E, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x3850, 0, 0, + 0, 0, 0,0x3851, 0,0x384F, 0, 0, + 0,0x3852, 0, 0, 0, 0,0x3853,0x3854, + 0,0x3855, 0,0x3856, 0,0x3857, 0,0x3858, + 0, 0, 0,0x3859, 0, 0,0x385A, 0, + 0, 0,0x385B,0x385C, 0, 0, 0, 0, + 0, 0,0x385D, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x385E, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x385F,0x3860, + 0, 0, 0, 0,0x3861,0x3862, 0, 0, + 0, 0, 0,0x3863,0x3864,0x3865, 0, 0, + 0, 0, 0, 0, 0, 0,0x3867, 0, + 0, 0,0x3868, 0,0x3869,0x386A, 0, 0, + 0,0x386B, 0, 0, 0, 0, 0, 0, +0x386C,0x386D, 0, 0,0x386E, 0,0x386F,0x3870, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3871, 0, 0, 0,0x3872, 0, 0,0x3873, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x3874,0x3875, 0, 0, 0, + 0, 0,0x3876, 0,0x3877, 0,0x3878,0x3879, +0x387A, 0,0x387B, 0,0x387C, 0, 0, 0, + 0, 0, 0, 0,0x387D, 0,0x387E, 0, +0x3921, 0, 0,0x3922, 0, 0,0x3923,0x3924, + 0, 0,0x3925, 0,0x3926,0x3927, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x3928,0x3929, 0,0x392A, + 0, 0, 0,0x392B, 0, 0,0x392C, 0, +0x392D, 0, 0, 0, 0, 0, 0, 0, +0x392E, 0, 0, 0, 0,0x392F, 0, 0, +0x3930, 0, 0, 0, 0, 0,0x3931,0x3932, +0x3933,0x3934, 0, 0,0x3935, 0, 0, 0, +0x3936, 0, 0,0x3937, 0,0x3938, 0, 0, + 0, 0,0x3939, 0,0x393A,0x393B, 0, 0, + 0,0x393C, 0,0x393D, 0, 0,0x393E, 0, + 0, 0, 0,0x393F, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x3940,0x3941, +0x3942, 0, 0, 0,0x3943,0x3944, 0, 0, +0x3945, 0, 0, 0, 0, 0, 0,0x3946, +0x3947, 0,0x3948,0x3949, 0,0x394A, 0, 0, +0x394B, 0, 0, 0, 0, 0, 0, 0, + 0,0x394C, 0, 0, 0,0x394D, 0, 0, + 0, 0, 0, 0, 0,0x394E,0x394F,0x3950, + 0, 0, 0,0x3951,0x3952, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3953, + 0, 0, 0, 0,0x3954,0x3955, 0, 0, +0x3956,0x3957, 0,0x3958, 0, 0,0x3959, 0, + 0,0x395A, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x395B,0x395C, 0, +0x395D,0x395E, 0, 0, 0,0x395F, 0, 0, + 0,0x3960, 0, 0, 0, 0,0x3961, 0, + 0, 0, 0, 0, 0, 0, 0,0x3962, + 0, 0, 0, 0,0x3963, 0,0x3964, 0, +0x3965, 0, 0, 0, 0, 0,0x3966, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3967, 0, 0,0x3968,0x3969, 0, 0,0x396A, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x396B, 0, 0, 0, + 0,0x396C, 0, 0,0x396D, 0, 0,0x396E, + 0, 0,0x396F, 0, 0,0x3970, 0,0x3971, +0x3972,0x3973, 0,0x3974, 0, 0, 0, 0, +0x3975, 0, 0, 0, 0,0x3976, 0, 0, + 0, 0,0x3977,0x3978,0x3979, 0,0x397A, 0, + 0,0x397B, 0,0x397C,0x397D, 0, 0, 0, +0x397E, 0, 0, 0, 0,0x3A21, 0,0x3A22, + 0,0x3A23, 0, 0, 0, 0, 0, 0, +0x3A24, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x3A25, 0,0x3A26, 0, 0, + 0,0x3A27, 0, 0, 0, 0,0x3A28, 0, + 0, 0, 0,0x3A29, 0, 0, 0,0x3A2A, + 0, 0, 0, 0, 0, 0,0x3A2B,0x3A2C, + 0, 0, 0, 0, 0, 0,0x3A2D, 0, + 0,0x3A2E,0x3A2F, 0, 0, 0, 0, 0, + 0,0x3A30, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3A31, 0,0x3A33, 0,0x3A34, 0,0x3A35, 0, + 0, 0,0x3A36, 0, 0, 0,0x3A37, 0, + 0, 0, 0, 0, 0, 0,0x3A38, 0, + 0, 0, 0, 0, 0,0x3A32, 0, 0, + 0,0x3A39, 0, 0, 0, 0, 0, 0, + 0, 0,0x3A3A, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x3A3B,0x3A3C, 0, 0, + 0, 0, 0,0x3A3D, 0, 0, 0,0x3A3E, + 0, 0, 0, 0, 0, 0, 0,0x3A3F, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x3A40, 0, 0, 0, 0, 0,0x3A41, +0x3A42, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x3A43,0x3A44,0x3A45, +0x3A46, 0,0x3A47, 0, 0,0x3A48, 0,0x3A49, + 0, 0, 0,0x3A4A, 0, 0, 0,0x3A4B, + 0,0x3A4C,0x3A4D, 0,0x3A4E,0x3A4F, 0,0x3A50, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x3A51,0x3A52, 0, 0,0x3A53,0x3A54, 0, +0x3A55, 0,0x3A56,0x3A57, 0, 0, 0, 0, +0x3A58, 0, 0,0x3A59, 0,0x3A5A, 0, 0, + 0,0x3A5B,0x3A5C, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x3A5D, 0, +0x3A5E, 0, 0, 0, 0, 0, 0,0x3A5F, +0x3A60,0x3A61,0x3A62,0x3A63, 0, 0, 0, 0, + 0,0x3A64, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3A65, 0,0x3A66, 0, 0,0x3A67, 0, 0, + 0, 0, 0, 0, 0, 0,0x3A68, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x3A69, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3A6A, 0, 0, 0, 0, 0, 0,0x3A6B, +0x3A6C, 0, 0, 0,0x3A6D, 0, 0,0x3A6E, + 0, 0,0x3A6F, 0,0x3A70,0x3A71, 0,0x3A72, + 0,0x3A73, 0,0x3A74, 0, 0,0x3A75,0x3A76 +}; + +/* page 15 0x5C59-0x5EEB */ +static uint16 tab_uni_jisx021215[]={ +0x3A77,0x3A78, 0,0x3A79, 0, 0, 0, 0, + 0,0x3A7A,0x3A7B, 0, 0, 0,0x3A7C,0x3A7D, +0x3A7E, 0, 0, 0,0x3B21, 0, 0,0x3B22, + 0, 0, 0,0x3B23,0x3B24, 0, 0, 0, + 0,0x3B25,0x3B26,0x3B27,0x3B28, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x3B29,0x3B2A, + 0,0x3B2B, 0, 0, 0, 0,0x3B2C, 0, + 0,0x3B2D, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x3B2E, 0,0x3B2F,0x3B30, + 0,0x3B31,0x3B32, 0, 0,0x3B33, 0, 0, + 0,0x3B34, 0, 0, 0, 0, 0, 0, + 0,0x3B35, 0,0x3B36,0x3B37, 0, 0, 0, + 0,0x3B38, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3B39, 0,0x3B3A, 0, 0, 0, 0, 0, + 0,0x3B3B, 0, 0, 0, 0,0x3B3D, 0, + 0, 0, 0, 0,0x3B3C, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x3B3E, 0, 0, +0x3B3F,0x3B40, 0,0x3B41, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3B42, 0, 0, 0, 0,0x3B43, 0, 0, + 0, 0, 0, 0,0x3B44, 0, 0, 0, + 0,0x3B45, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x3B47,0x3B48, 0,0x3B49,0x3B4A, 0, + 0, 0,0x3B46, 0, 0, 0, 0, 0, +0x3B4B, 0, 0,0x3B4C, 0, 0, 0, 0, +0x3B4D, 0, 0, 0,0x3B4E, 0,0x3B4F, 0, + 0,0x3B50,0x3B51, 0, 0,0x3B52, 0,0x3B53, + 0,0x3B57, 0, 0, 0, 0, 0, 0, +0x3B55, 0, 0, 0,0x3B54, 0, 0, 0, +0x3B56, 0, 0, 0, 0, 0,0x3B58,0x3B59, +0x3B5A,0x3B5B, 0,0x3B5C, 0, 0, 0, 0, + 0,0x3B5D, 0, 0,0x3B5E, 0, 0,0x3B5F, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3B60,0x3B61, 0, 0, 0,0x3B62,0x3B63, 0, +0x3B64, 0,0x3B65, 0, 0, 0, 0,0x3B66, + 0,0x3B67, 0, 0, 0, 0, 0, 0, + 0,0x3B68,0x3B69,0x3B6A,0x3B6B, 0, 0, 0, +0x3B6C, 0,0x3B6D, 0, 0, 0,0x3B6E,0x3B6F, + 0, 0, 0, 0, 0, 0,0x3B70, 0, + 0, 0,0x3B71, 0, 0, 0, 0,0x3B72, + 0,0x6674, 0,0x3B73, 0, 0, 0,0x3B74, +0x3B75, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x3B76, 0, 0, 0,0x3B77, 0, + 0, 0,0x3B78, 0, 0,0x3B7A, 0,0x3B79, + 0, 0, 0, 0, 0, 0, 0,0x3B7B, +0x3B7C, 0, 0, 0, 0, 0, 0,0x3B7D, + 0, 0, 0,0x3B7E, 0, 0, 0, 0, +0x3C21, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3C22, +0x3C23, 0, 0, 0, 0, 0, 0,0x3C24, + 0, 0, 0, 0, 0, 0,0x3C25, 0, + 0, 0, 0, 0,0x3C26, 0, 0, 0, + 0,0x3C27, 0,0x3C28,0x3C29, 0, 0,0x3C2A, + 0, 0, 0, 0, 0, 0,0x3C2B,0x3C2C, + 0, 0, 0, 0, 0, 0, 0,0x3C2E, + 0, 0, 0, 0, 0,0x3C2D, 0, 0, + 0,0x3C2F, 0, 0,0x3C30, 0, 0, 0, + 0, 0, 0, 0, 0,0x3C31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3C34, 0,0x3C32, 0, 0, 0, 0,0x3C33, +0x3C35, 0, 0, 0, 0,0x3C36, 0,0x3C37, + 0, 0,0x3C38,0x3C39, 0,0x3C3A, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3C3B, + 0,0x3C3C,0x3C3D,0x3C3E,0x3C3F,0x3C40, 0,0x3C41, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3C42, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x3C43, 0, 0,0x3C44, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x3C45, 0,0x3C46,0x3C47, 0, 0,0x3C48, + 0,0x3C49, 0,0x3C4A, 0, 0, 0, 0, +0x3C4B, 0,0x3C4C, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x3C4D,0x3C4E,0x3C4F, 0, + 0, 0, 0, 0, 0,0x3C50, 0, 0, + 0, 0,0x3C52,0x3C51, 0,0x3C53, 0, 0, +0x3C54,0x3C55, 0,0x3C56,0x3C57, 0, 0, 0, + 0, 0, 0,0x3C58, 0,0x3C59, 0, 0, + 0, 0, 0, 0,0x3C5A, 0, 0, 0, + 0, 0,0x3C5B}; + +/* page 16 0x5F02-0x6149 */ +static uint16 tab_uni_jisx021216[]={ +0x3C5C, 0, 0, 0,0x3C5D,0x3C5E,0x3C5F, 0, + 0, 0, 0, 0,0x3C60, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3C61, + 0, 0,0x3C62,0x3C63, 0, 0, 0,0x3C64, +0x3C65,0x3C66,0x3C67, 0, 0, 0,0x3C68, 0, + 0,0x3C69,0x3C6A, 0,0x3C6B, 0,0x3C6C, 0, + 0, 0,0x3C6D, 0,0x3C6E, 0, 0, 0, + 0,0x3C6F, 0,0x3C70, 0,0x3C71,0x3C72, 0, + 0, 0,0x3C73,0x3C74, 0,0x3C75, 0, 0, + 0, 0, 0,0x3C76, 0, 0,0x3C77, 0, + 0, 0,0x3C78, 0, 0, 0,0x3C79, 0, + 0,0x3C7A, 0, 0, 0, 0,0x3C7B, 0, + 0,0x3C7C,0x3C7D, 0, 0,0x3C7E, 0, 0, + 0, 0, 0, 0, 0,0x3D21, 0, 0, +0x3D22, 0,0x3D23,0x3D24, 0, 0,0x3D25, 0, +0x3D26, 0, 0,0x3D27,0x3D28, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3D29, + 0, 0, 0,0x3D2A, 0,0x3D2B, 0, 0, + 0, 0, 0, 0,0x3D2C, 0, 0, 0, + 0, 0,0x3D2D,0x3D2E, 0, 0, 0, 0, +0x3D2F, 0,0x3D32, 0, 0,0x3D30, 0, 0, + 0,0x3D31,0x3D33, 0, 0,0x3D34,0x3D35,0x3D36, + 0, 0, 0, 0, 0, 0,0x3D37, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x3D38, 0, 0,0x3D39,0x3D3A,0x3D3B, + 0,0x3D3C, 0, 0, 0, 0,0x3D3D,0x3D3E, +0x3D3F,0x3D40,0x3D41, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x3D42, 0, 0,0x3D43, +0x3D44, 0, 0, 0, 0, 0,0x3D45,0x3D46, +0x3D47, 0,0x3D48,0x3D49,0x3D4A,0x3D4B, 0, 0, +0x3D4C,0x3D4D, 0, 0,0x3D4E, 0, 0, 0, +0x3D4F, 0,0x3D50, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x3D51, 0, 0, +0x3D52, 0, 0,0x3D53, 0, 0, 0, 0, + 0,0x3D54,0x3D55, 0, 0,0x3D56,0x3D57, 0, +0x3D58, 0, 0, 0, 0,0x3D59, 0, 0, + 0, 0,0x3D5A, 0, 0, 0, 0, 0, + 0, 0, 0,0x3D5B, 0, 0, 0, 0, + 0,0x3D5C, 0,0x3D5D, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x3D5E, 0, + 0, 0, 0, 0, 0,0x3D5F,0x3D60,0x3D61, + 0, 0,0x3D62, 0, 0, 0, 0,0x3D63, + 0, 0,0x3D64, 0,0x3D65,0x3D66, 0, 0, + 0, 0, 0,0x3D67, 0, 0, 0,0x3D68, + 0, 0, 0, 0, 0,0x3D69, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3D6A, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x3D6B,0x3D6C, 0, 0, +0x3D6D, 0, 0, 0,0x3D6E, 0,0x3D6F, 0, +0x3D70, 0, 0, 0,0x3D71, 0, 0,0x3D72, + 0,0x3D73, 0,0x3D74, 0, 0,0x3D75, 0, + 0, 0, 0,0x3D76,0x3D77, 0, 0, 0, +0x3D78, 0,0x3D79,0x3D7A, 0, 0,0x3D7B, 0, + 0, 0, 0, 0, 0, 0,0x3D7C,0x3D7D, + 0, 0, 0, 0, 0,0x3D7E, 0, 0, + 0,0x3E21, 0, 0,0x3E22, 0, 0, 0, +0x3E23, 0,0x3E24, 0, 0, 0,0x3E25,0x3E26, +0x3E27,0x3E28, 0, 0,0x3E29,0x3E2A, 0, 0, + 0, 0,0x3E2B,0x3E2C, 0, 0, 0,0x3E2D, + 0,0x3E2E, 0,0x3E2F,0x3E30, 0, 0, 0, +0x3E31, 0, 0,0x3E32, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3E33, 0, 0,0x3E34, 0, 0,0x3E35, 0, + 0, 0,0x3E36,0x3E37, 0, 0, 0, 0, +0x3E38, 0, 0, 0, 0,0x3E39, 0, 0, +0x3E3A, 0,0x3E3B, 0, 0, 0,0x3E3C,0x3E3D, +0x3E3E,0x3E3F,0x3E40, 0,0x3E41,0x3E42, 0,0x3E43, + 0, 0,0x3E44, 0,0x3E45, 0, 0, 0, +0x3E46, 0, 0, 0, 0, 0, 0, 0, +0x3E47,0x3E48, 0, 0, 0, 0,0x3E49,0x3E4A, + 0, 0, 0,0x3E4B,0x3E4C,0x3E4D, 0,0x3E4E, + 0, 0, 0, 0, 0, 0, 0,0x3E4F, + 0, 0, 0,0x3E50,0x3E51, 0, 0,0x3E52 +}; + +/* page 17 0x615E-0x6290 */ +static uint16 tab_uni_jisx021217[]={ +0x3E53, 0,0x3E54, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x3E55, 0, + 0, 0, 0, 0,0x3E56, 0, 0, 0, + 0, 0,0x3E57, 0, 0,0x3E58,0x3E59, 0, + 0,0x3E5A,0x3E5B,0x3E5C, 0,0x3E5D,0x3E5E, 0, + 0, 0, 0, 0, 0,0x3E5F, 0,0x3E60, + 0, 0, 0, 0,0x3E61,0x3E62, 0, 0, + 0,0x3E63,0x3E64, 0, 0, 0,0x3E65,0x3E66, + 0,0x3E67,0x3E68, 0, 0, 0, 0,0x3E69, + 0, 0,0x3E6A, 0,0x3E6B, 0, 0,0x3E6C, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x3E6D,0x3E6E, 0, 0,0x3E6F, 0, + 0, 0,0x3E70,0x3E71,0x3E72, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3E73,0x3E74, 0, 0, 0, 0, 0,0x3E75, + 0, 0, 0, 0, 0, 0,0x3E76,0x3E77, +0x3E78,0x3E79, 0,0x3E7A,0x3E7B, 0, 0,0x3E7E, + 0,0x3E7C, 0,0x3E7D, 0, 0,0x3F21,0x3F22, + 0,0x3F23, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x3F24, 0,0x3F25,0x3F26, 0, + 0,0x3F27, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x3F28, 0,0x3F29, + 0, 0, 0, 0, 0, 0,0x3F2A, 0, + 0, 0,0x3F2B, 0,0x3F2C,0x3F2D, 0, 0, + 0,0x3F2E, 0,0x3F2F, 0,0x3F30, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x3F31, 0, 0, 0,0x3F32, + 0, 0, 0, 0,0x3F33,0x3F34,0x3F35, 0, +0x3F36, 0, 0, 0, 0, 0,0x3F37, 0, + 0, 0,0x3F38,0x3F39,0x3F3A, 0,0x3F3B, 0, +0x3F3C, 0, 0, 0,0x3F3D, 0,0x3F3E, 0, + 0, 0, 0, 0, 0, 0,0x3F3F, 0, + 0, 0, 0, 0, 0, 0, 0,0x3F40, + 0,0x3F41, 0, 0, 0,0x3F42, 0, 0, + 0, 0, 0, 0,0x3F43, 0, 0,0x3F44, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3F45, +0x3F46,0x3F47,0x3F48}; + +/* page 18 0x62A6-0x679B */ +static uint16 tab_uni_jisx021218[]={ +0x3F49, 0,0x3F4A, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x3F4B, 0, 0, +0x3F4C,0x3F4D, 0, 0,0x3F4E, 0, 0, 0, +0x3F4F,0x3F50, 0, 0, 0, 0,0x3F51, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3F52, 0, 0, 0, 0, 0, 0,0x3F53, +0x3F54, 0, 0, 0,0x3F55, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x3F56, 0, 0, 0, + 0, 0, 0, 0,0x3F57, 0,0x3F58, 0, + 0, 0, 0, 0, 0, 0,0x3F59,0x3F5A, + 0, 0, 0, 0, 0,0x3F5B,0x3F5C, 0, + 0, 0, 0, 0,0x3F5D,0x3F5E, 0,0x3F5F, + 0, 0,0x3F60, 0, 0,0x3F61, 0, 0, +0x3F62, 0,0x3F63, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x3F64,0x3F65, 0, 0,0x3F66, + 0, 0, 0, 0, 0, 0, 0,0x3F67, +0x3F68, 0, 0,0x3F69, 0, 0,0x3F6A, 0, + 0, 0, 0,0x3F6B,0x3F6C,0x3F6D,0x3F6E, 0, +0x3F6F, 0, 0, 0,0x3F70,0x3F71, 0, 0, +0x3F72, 0, 0, 0,0x3F73,0x3F74,0x3F75, 0, + 0, 0,0x3F76, 0, 0,0x3F77, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3F78, +0x3F79, 0, 0, 0, 0, 0,0x3F7A,0x3F7B, + 0, 0, 0,0x3F7C, 0, 0,0x3F7D,0x3F7E, + 0, 0,0x4021, 0, 0, 0,0x4022,0x4023, + 0,0x4024, 0, 0,0x4025, 0,0x4026, 0, + 0,0x4027, 0, 0,0x4028, 0, 0, 0, + 0, 0,0x4029, 0, 0, 0,0x402A,0x402B, + 0, 0, 0,0x402C,0x402D, 0, 0, 0, +0x402E, 0, 0, 0, 0, 0,0x402F, 0, +0x4030, 0, 0, 0, 0, 0, 0,0x4031, +0x4032,0x4033, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x4034, + 0, 0, 0,0x4035, 0, 0, 0,0x4036, + 0, 0,0x4037, 0, 0, 0, 0, 0, +0x4038, 0, 0,0x4039, 0,0x403A,0x403B,0x403C, + 0, 0, 0, 0, 0, 0,0x403D, 0, + 0, 0,0x403E, 0, 0, 0, 0,0x403F, + 0, 0, 0, 0,0x4040, 0,0x4041, 0, + 0, 0, 0, 0,0x4042,0x4043, 0,0x4044, + 0, 0,0x4045,0x4046, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x4047,0x4048, 0, 0, 0, + 0, 0,0x4049, 0,0x404A, 0,0x404B, 0, + 0, 0,0x404C, 0, 0, 0, 0, 0, +0x404D, 0,0x404E, 0,0x404F, 0,0x4050,0x4051, + 0, 0, 0,0x4052,0x4053, 0, 0, 0, + 0,0x4054,0x4055, 0, 0, 0, 0,0x4056, + 0, 0, 0, 0, 0, 0, 0,0x4057, + 0,0x4058, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x4059, 0, 0, + 0,0x405A, 0,0x405B,0x405C,0x405D,0x405E, 0, + 0, 0, 0, 0,0x405F,0x4060,0x4061,0x4062, + 0,0x4063,0x4064,0x4065, 0,0x4066, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x4067, + 0, 0, 0, 0, 0,0x4068,0x4069, 0, + 0, 0, 0, 0, 0,0x406A, 0,0x406B, + 0, 0, 0, 0, 0, 0, 0,0x406C, + 0,0x406D, 0, 0, 0, 0, 0, 0, + 0,0x406E,0x406F,0x4070, 0, 0, 0, 0, + 0, 0,0x4071,0x4072, 0,0x4073, 0,0x4074, + 0,0x4075, 0,0x4076, 0,0x4077, 0, 0, +0x4078, 0,0x4079, 0, 0, 0,0x407A, 0, + 0, 0, 0, 0, 0,0x407B, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x407C, +0x407D,0x407E, 0, 0, 0, 0,0x4121, 0, + 0, 0, 0,0x4122,0x4123,0x4124,0x4125, 0, +0x4126, 0,0x4127,0x4128, 0, 0, 0,0x4129, + 0,0x412A, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x412B,0x412C, + 0, 0, 0,0x412D,0x412E, 0, 0,0x412F, + 0, 0,0x4130, 0, 0, 0, 0,0x4131, + 0,0x4132, 0, 0, 0,0x4133, 0, 0, + 0,0x4134, 0,0x4135, 0, 0,0x4136, 0, + 0, 0,0x4137,0x4138,0x4139, 0, 0, 0, + 0,0x413A, 0, 0, 0,0x413B,0x413C, 0, +0x413D, 0, 0,0x413E, 0,0x413F, 0, 0, +0x4140,0x4141, 0, 0,0x4142, 0, 0, 0, +0x4143, 0, 0,0x4144, 0, 0, 0, 0, +0x4145, 0, 0,0x4146, 0, 0, 0, 0, + 0, 0, 0, 0,0x4147, 0,0x4148,0x4149, + 0, 0, 0, 0, 0,0x414A, 0, 0, + 0,0x414B, 0,0x414C, 0, 0, 0, 0, + 0, 0,0x414D, 0,0x414E, 0,0x414F, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x4150,0x4151, 0, 0, 0, 0, 0, + 0,0x4152, 0, 0, 0,0x4153, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x4154, 0, 0,0x4155, + 0, 0, 0,0x4156, 0, 0, 0,0x4157, + 0, 0, 0, 0,0x4158, 0, 0, 0, + 0, 0, 0, 0,0x4159, 0, 0,0x415A, + 0, 0,0x415B, 0, 0, 0, 0,0x415C, + 0, 0,0x415D, 0, 0,0x415E, 0, 0, +0x415F, 0, 0, 0, 0, 0, 0, 0, +0x4160, 0, 0, 0,0x4161,0x4162,0x4163, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x4164, 0, 0,0x4165, 0, 0, 0, + 0, 0,0x4166,0x4167, 0, 0, 0, 0, +0x4168, 0,0x4169, 0, 0, 0,0x416A, 0, +0x416B, 0,0x416C, 0, 0, 0, 0, 0, + 0,0x416D, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x416E, 0,0x416F, 0,0x4170,0x4171, + 0, 0, 0,0x4172, 0, 0, 0, 0, +0x4173,0x4174,0x4175, 0, 0, 0,0x4176, 0, + 0, 0,0x4177,0x4178, 0, 0, 0,0x4179, + 0, 0, 0,0x417A,0x417B, 0, 0,0x417C, +0x417D, 0, 0, 0, 0, 0, 0,0x417E, +0x4221, 0, 0,0x4222,0x4223,0x4224,0x4225, 0, +0x4226, 0, 0,0x4227,0x4228,0x4229,0x422A, 0, +0x422B, 0,0x422C,0x422D, 0,0x422E, 0, 0, + 0,0x4230, 0,0x422F, 0, 0, 0, 0, + 0, 0,0x4231, 0, 0, 0, 0,0x4232, +0x4233, 0, 0, 0,0x4234, 0,0x4235, 0, +0x4237, 0, 0,0x4236, 0, 0, 0, 0, + 0,0x4238,0x4239,0x423A, 0,0x423B,0x423C, 0, + 0, 0,0x423D,0x423E, 0, 0, 0, 0, + 0, 0, 0, 0,0x4240,0x4241,0x4242, 0, + 0, 0, 0, 0, 0,0x4244, 0,0x4245, + 0,0x4247,0x4248,0x4249, 0,0x424A,0x424C, 0, +0x4243,0x4246,0x424B, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x424D,0x424E,0x424F, + 0, 0,0x4250, 0,0x4251, 0, 0, 0, + 0, 0, 0,0x4252,0x4253,0x4254,0x4255, 0, + 0,0x4256,0x4257, 0, 0, 0,0x4258, 0, + 0, 0, 0, 0, 0, 0, 0,0x4259, + 0, 0, 0,0x425A,0x425B, 0, 0,0x425C, + 0, 0, 0, 0, 0,0x425D, 0, 0, + 0,0x425E,0x425F, 0,0x4260,0x4261, 0, 0, + 0, 0,0x4262, 0, 0, 0,0x4263, 0, +0x4264,0x4265, 0, 0, 0, 0,0x4266, 0, + 0, 0, 0, 0, 0,0x4267, 0, 0, + 0,0x4268, 0, 0, 0, 0, 0, 0, + 0, 0,0x4269, 0, 0,0x426A,0x426B, 0, +0x426C, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x426D,0x423F, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x426E, + 0,0x426F, 0, 0, 0, 0, 0, 0, +0x4270, 0, 0, 0, 0,0x4271, 0, 0, + 0, 0, 0,0x4272, 0, 0,0x4273, 0, + 0, 0,0x4274, 0,0x4275, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x4276, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4277, 0, 0, 0, 0, 0, 0,0x4278, + 0,0x4279,0x427A, 0, 0, 0,0x427B, 0, + 0, 0, 0, 0, 0, 0,0x427C,0x427D, + 0, 0, 0, 0, 0, 0, 0,0x427E, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4321, 0, 0, 0, 0, 0,0x4322, 0, +0x4323, 0, 0, 0, 0, 0,0x4324, 0, +0x4325, 0, 0, 0, 0,0x4326, 0, 0, + 0, 0, 0,0x4327, 0, 0,0x4328, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4329,0x432A, 0,0x432B, 0,0x432C, 0, 0, +0x432D, 0,0x432E,0x432F, 0,0x4330}; + +/* page 19 0x67B0-0x67F9 */ +static uint16 tab_uni_jisx021219[]={ +0x4331,0x4332,0x4333, 0, 0,0x4334, 0, 0, + 0, 0, 0,0x4335,0x4336,0x4337, 0, 0, +0x4339, 0,0x433A,0x433B, 0,0x433C, 0, 0, +0x433D,0x433E, 0, 0, 0, 0, 0, 0, + 0, 0,0x433F, 0, 0, 0, 0,0x4340, + 0,0x4341, 0, 0,0x4342, 0, 0, 0, + 0,0x4343, 0, 0, 0, 0,0x4344, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4345, 0,0x4346, 0, 0, 0,0x4347,0x4348, + 0,0x4338}; + +/* page 20 0x6814-0x6917 */ +static uint16 tab_uni_jisx021220[]={ +0x434A, 0, 0, 0, 0,0x434B, 0, 0, + 0,0x434C, 0,0x434D, 0, 0, 0, 0, + 0, 0, 0,0x434F,0x434E, 0, 0, 0, +0x4350,0x4351, 0,0x4352,0x4353,0x4354, 0,0x4355, + 0, 0, 0, 0, 0, 0, 0,0x4356, + 0, 0, 0,0x4357, 0, 0, 0, 0, +0x4358,0x4359, 0, 0, 0, 0,0x435A, 0, +0x435B, 0, 0, 0, 0, 0,0x4349, 0, + 0,0x435C, 0,0x435D,0x435E, 0, 0,0x435F, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x4360, + 0, 0,0x4361,0x4362,0x4363,0x4364,0x4365, 0, + 0,0x4366, 0, 0, 0,0x4367,0x4368,0x4369, +0x436A, 0, 0, 0, 0, 0,0x436B, 0, +0x436C, 0,0x436D, 0,0x436E, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x436F, 0,0x4370, 0,0x4371, 0, +0x4372, 0, 0, 0, 0,0x4373, 0,0x4374, + 0,0x4375, 0, 0, 0,0x4376,0x4377, 0, + 0, 0,0x4378, 0, 0, 0,0x4379, 0, + 0, 0, 0, 0, 0, 0, 0,0x437A, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x437B, 0, 0,0x437C, 0, 0, 0, +0x437D, 0, 0,0x437E,0x4421,0x4422, 0,0x4423, + 0, 0,0x4424, 0, 0,0x4425, 0, 0, +0x4426,0x4427, 0, 0, 0, 0, 0, 0, + 0,0x4428, 0, 0,0x4429, 0,0x442A,0x442B, +0x442C,0x442D, 0, 0,0x442E,0x442F, 0, 0, + 0,0x4430,0x4431, 0, 0, 0, 0,0x4432, +0x4433,0x4434, 0, 0, 0, 0, 0, 0, + 0, 0,0x4435, 0, 0,0x4436,0x4437, 0, + 0, 0, 0, 0,0x4438,0x4439, 0,0x443A, + 0, 0,0x443B,0x443C}; + +/* page 21 0x6931-0x6D3F */ +static uint16 tab_uni_jisx021221[]={ +0x443D, 0,0x443E, 0,0x443F, 0, 0,0x4440, + 0, 0,0x4441, 0, 0, 0, 0, 0, + 0,0x4442, 0, 0,0x4443, 0, 0, 0, +0x4444, 0, 0, 0, 0,0x4445, 0, 0, + 0, 0, 0, 0, 0, 0,0x4446, 0, + 0, 0,0x4447, 0, 0, 0, 0, 0, + 0, 0,0x4448,0x4449,0x444A,0x444B, 0,0x444C, +0x444D, 0, 0,0x444E, 0, 0, 0,0x444F, +0x4450,0x4451, 0, 0, 0, 0, 0, 0, + 0,0x4452,0x4453, 0, 0, 0,0x4454,0x4455, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x4456, 0, 0, 0, + 0,0x4457, 0, 0, 0,0x4458, 0,0x4459, + 0, 0, 0, 0, 0, 0, 0, 0, +0x445A, 0, 0, 0,0x445B,0x445C, 0,0x445D, + 0, 0,0x445E, 0,0x445F, 0,0x4460, 0, + 0, 0, 0, 0, 0, 0,0x4461,0x4462, + 0,0x4463, 0,0x4464, 0, 0, 0, 0, + 0, 0, 0, 0,0x4465, 0, 0,0x4466, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4467, 0, 0, 0, 0,0x4468,0x4469, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x446A, 0, 0,0x446B, 0, 0, 0, + 0, 0, 0, 0, 0,0x446C,0x446D, 0, +0x446E, 0,0x446F, 0,0x4470, 0, 0, 0, + 0, 0, 0, 0, 0,0x4471, 0,0x4472, +0x4473, 0,0x4474, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x4475, 0, +0x4476, 0, 0, 0,0x4477, 0, 0, 0, + 0,0x4478, 0, 0,0x4479, 0, 0,0x447A, + 0, 0, 0,0x447B, 0, 0, 0,0x447C, + 0, 0, 0, 0, 0, 0, 0,0x447D, + 0,0x447E, 0,0x4521, 0, 0,0x4522, 0, + 0, 0,0x4523, 0, 0,0x4524,0x4525, 0, + 0, 0, 0, 0,0x4526,0x4527, 0, 0, +0x4528,0x4529, 0, 0, 0,0x452A, 0,0x452B, +0x452C,0x452D, 0, 0,0x452E,0x452F, 0, 0, + 0, 0,0x4530, 0, 0, 0, 0, 0, + 0, 0, 0,0x4531, 0, 0,0x4532, 0, + 0,0x4533, 0, 0, 0, 0, 0, 0, +0x4534, 0,0x4535, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x4536, 0, 0, +0x4537, 0,0x4538, 0, 0,0x4539,0x453A, 0, +0x453B, 0,0x453C, 0, 0, 0, 0, 0, +0x453D, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x453E, 0,0x453F,0x4540,0x4541, 0, + 0, 0, 0, 0,0x4542, 0, 0, 0, + 0, 0,0x4543, 0, 0, 0,0x4544,0x4545, +0x4546, 0, 0,0x4547, 0, 0, 0, 0, + 0, 0, 0, 0,0x4548,0x4549,0x454A, 0, + 0, 0, 0, 0, 0,0x454B, 0,0x454D, +0x454C, 0, 0,0x454E, 0, 0, 0,0x454F, + 0, 0, 0,0x4550,0x4551,0x4552, 0, 0, + 0, 0, 0,0x4553,0x4554, 0, 0, 0, + 0, 0, 0,0x4555, 0, 0,0x4556, 0, + 0, 0, 0,0x4557, 0, 0, 0,0x4558, +0x4559,0x455A, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x455B,0x455C, 0, 0, 0, + 0,0x455D,0x455E, 0, 0,0x455F,0x4560, 0, +0x4561, 0, 0, 0, 0, 0,0x4562,0x4563, +0x4564, 0, 0, 0, 0, 0,0x4565, 0, + 0, 0,0x4566, 0, 0,0x4567, 0, 0, + 0, 0, 0,0x4568, 0, 0, 0,0x4569, + 0, 0,0x456A,0x456B, 0, 0,0x456C, 0, + 0, 0, 0, 0,0x456D,0x456E, 0, 0, + 0, 0,0x456F, 0, 0, 0,0x4570, 0, + 0, 0, 0, 0, 0,0x4571, 0, 0, + 0,0x4572, 0, 0,0x4573, 0, 0, 0, + 0,0x4574, 0, 0, 0,0x4575, 0,0x4576, + 0, 0, 0, 0,0x4577, 0, 0,0x4578, + 0, 0, 0, 0, 0, 0,0x4579, 0, + 0, 0,0x457A, 0, 0,0x457B, 0,0x457C, + 0, 0, 0, 0,0x457D, 0, 0, 0, + 0, 0, 0, 0,0x457E,0x4621, 0, 0, + 0,0x4622, 0, 0,0x4623, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x4624, 0, + 0, 0,0x4625, 0, 0, 0,0x4626,0x4627, + 0,0x4628,0x4629, 0, 0, 0, 0,0x462A, +0x462B, 0, 0,0x462C,0x462D,0x462E, 0,0x462F, + 0, 0, 0, 0, 0, 0, 0,0x4630, +0x4631, 0, 0, 0,0x4632,0x4633, 0, 0, + 0, 0,0x4634,0x4635, 0, 0, 0, 0, +0x4636, 0, 0,0x4637, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x4638, 0, 0, + 0,0x4639, 0, 0, 0, 0, 0, 0, +0x463A, 0,0x463B, 0, 0,0x463C,0x463D, 0, + 0, 0, 0, 0, 0,0x463E, 0, 0, +0x463F, 0, 0, 0, 0, 0,0x4640, 0, +0x4641, 0, 0, 0, 0, 0,0x4642, 0, + 0,0x4643, 0,0x4644,0x4645, 0, 0, 0, +0x4646, 0, 0, 0,0x4647,0x4648, 0,0x4649, + 0,0x464A, 0, 0, 0, 0, 0, 0, +0x464B, 0, 0, 0, 0, 0,0x464C, 0, + 0, 0, 0, 0, 0,0x464D,0x464E,0x464F, + 0, 0, 0,0x4650, 0,0x4651, 0, 0, + 0, 0,0x4652, 0,0x4653,0x4654, 0, 0, + 0,0x4655,0x4656, 0, 0, 0,0x4657, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x4658,0x4659, 0,0x465A, 0,0x465B, 0, + 0,0x465C, 0,0x465D, 0, 0, 0, 0, +0x465E, 0,0x465F,0x4660, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x4736, 0, + 0, 0,0x4661, 0,0x4662, 0,0x4663, 0, + 0, 0, 0,0x4664, 0,0x4665, 0,0x4666, +0x4667, 0,0x4668, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x4669,0x466A,0x466B, 0, +0x466C, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x466D,0x466E, 0,0x466F,0x4670, + 0, 0, 0,0x4671, 0, 0,0x4672, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x4673, + 0,0x4674, 0,0x4675, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x4676, 0, 0, 0,0x4677, 0, 0, + 0, 0, 0, 0,0x4678, 0,0x4679,0x467A, +0x467B,0x467C, 0,0x467D, 0,0x467E, 0, 0, + 0,0x4721, 0,0x4722, 0, 0, 0,0x4723, + 0, 0, 0, 0, 0, 0,0x4724, 0, +0x4725, 0,0x4726,0x4727, 0,0x4728, 0, 0, + 0,0x4729, 0,0x472A, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x472B, 0, 0,0x472C, 0, + 0,0x472D, 0, 0, 0,0x472E,0x472F, 0, +0x4730, 0,0x4731, 0, 0, 0, 0, 0, + 0,0x4732, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x4733,0x4734,0x4735, + 0, 0, 0, 0, 0,0x4737,0x4738, 0, +0x4739, 0, 0, 0, 0, 0, 0, 0, +0x473A, 0, 0,0x473B, 0, 0,0x473C}; + +/* page 22 0x6D57-0x6E04 */ +static uint16 tab_uni_jisx021222[]={ +0x473D, 0, 0, 0, 0, 0, 0,0x473E, +0x473F, 0,0x4740, 0, 0, 0,0x4741, 0, +0x4742, 0, 0, 0, 0, 0, 0, 0, +0x4743,0x4744, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x4745, 0, 0, + 0, 0, 0,0x4746, 0, 0, 0, 0, +0x4747, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x4748,0x4749, 0,0x474A, 0,0x474B, +0x474C,0x474D, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x474E, 0,0x474F, 0, 0, + 0, 0, 0, 0, 0,0x4750, 0, 0, +0x4751, 0,0x4752, 0, 0, 0,0x4753, 0, +0x4754, 0, 0, 0, 0,0x4755, 0, 0, + 0,0x4756, 0,0x4757, 0, 0, 0,0x4758, +0x4759, 0, 0, 0, 0, 0, 0,0x475A, + 0, 0, 0, 0,0x475B, 0,0x475C, 0, +0x475D,0x475E, 0,0x475F, 0, 0,0x4760, 0, + 0, 0,0x4761, 0, 0, 0, 0, 0, +0x4762,0x4763, 0, 0, 0,0x4764, 0,0x4765, + 0, 0, 0, 0, 0,0x4766, 0, 0, + 0,0x4767, 0, 0, 0,0x4768}; + +/* page 23 0x6E1E-0x6ECF */ +static uint16 tab_uni_jisx021223[]={ +0x4769, 0, 0, 0,0x476A, 0, 0, 0, + 0,0x476B, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x476C, 0, 0, 0, +0x476D, 0, 0,0x476E, 0,0x476F,0x4770, 0, + 0, 0, 0, 0, 0, 0,0x4771,0x4772, + 0, 0,0x4773,0x4774, 0,0x4775, 0, 0, + 0,0x4776, 0,0x4777,0x4778,0x4779,0x477A, 0, + 0,0x477B, 0, 0, 0, 0,0x477C,0x477D, +0x477E, 0, 0, 0,0x4821,0x4822, 0, 0, + 0, 0,0x4823, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x4824, 0, 0, + 0, 0, 0, 0, 0,0x4825, 0,0x4826, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x4827, + 0, 0, 0, 0, 0,0x4828, 0, 0, + 0, 0, 0,0x4829, 0, 0, 0, 0, + 0, 0,0x482A, 0, 0, 0, 0, 0, + 0,0x482B, 0, 0, 0, 0, 0,0x482C, +0x482D, 0, 0,0x482E, 0,0x482F, 0, 0, + 0, 0, 0, 0, 0,0x4830, 0, 0, + 0,0x4831,0x4832,0x4833, 0,0x4834, 0, 0, + 0,0x4835,0x4836, 0,0x4837, 0, 0,0x4838, +0x4839,0x483A}; + +/* page 24 0x6EEB-0x70E4 */ +static uint16 tab_uni_jisx021224[]={ +0x483B, 0,0x483C,0x483D, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x483E, 0, +0x483F, 0,0x4840, 0, 0, 0, 0, 0, + 0,0x4841, 0, 0, 0,0x4842, 0,0x4843, + 0,0x4844,0x4845, 0, 0, 0, 0, 0, + 0, 0, 0,0x4846, 0,0x4847, 0,0x4848, +0x4849, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x484A, 0, 0,0x484B,0x484C, + 0, 0,0x4853, 0,0x484D,0x484E, 0, 0, +0x484F, 0, 0,0x4850, 0, 0, 0, 0, +0x4851,0x4852, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x4854, 0,0x4855,0x4856, +0x4857, 0, 0, 0,0x4858, 0,0x4859,0x485A, + 0, 0,0x485B,0x485C, 0, 0,0x485D,0x485E, + 0, 0, 0, 0, 0,0x485F, 0, 0, + 0,0x4860, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x4861,0x4862, 0, 0, 0, 0, +0x4863, 0, 0, 0,0x4864,0x4865, 0, 0, +0x4866,0x4867,0x4868, 0, 0,0x4869, 0,0x486A, +0x486B,0x486C, 0,0x486D, 0, 0, 0,0x486E, + 0, 0, 0, 0,0x486F,0x4870, 0, 0, + 0, 0,0x4871,0x4872,0x4873,0x4874, 0, 0, + 0, 0, 0,0x4875,0x4876,0x4877, 0, 0, + 0, 0,0x4878,0x4879, 0, 0, 0, 0, + 0,0x487A, 0, 0, 0, 0, 0, 0, + 0, 0,0x487B, 0,0x487C,0x487D, 0,0x487E, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x4921, + 0, 0, 0,0x4922, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x4923,0x4924, 0, + 0, 0, 0, 0, 0,0x4925, 0, 0, + 0, 0,0x4926, 0, 0, 0,0x4927, 0, + 0,0x4928,0x4929, 0, 0,0x492A, 0, 0, + 0, 0,0x492B,0x492C,0x492D, 0, 0, 0, + 0, 0,0x492E, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x492F, 0, 0, 0, + 0, 0, 0, 0, 0,0x4930, 0, 0, +0x4931, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x4932, 0, 0, 0, + 0,0x4933, 0, 0,0x4934, 0,0x4935, 0, + 0,0x4936, 0, 0, 0, 0, 0, 0, +0x4937,0x4938, 0, 0, 0,0x4939,0x493A,0x493B, +0x493C, 0, 0,0x4941, 0, 0, 0, 0, + 0,0x493D,0x493E, 0, 0, 0, 0, 0, + 0, 0,0x493F,0x4940, 0, 0, 0, 0, + 0,0x4942,0x4943, 0, 0, 0, 0, 0, + 0,0x4944, 0,0x4945, 0, 0, 0, 0, + 0, 0,0x4946,0x4947, 0, 0, 0, 0, + 0, 0, 0,0x4948, 0, 0,0x4949, 0, + 0, 0,0x494A,0x494B, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x494C,0x494D,0x494E,0x494F,0x4950, 0, 0, +0x4951, 0, 0, 0, 0, 0, 0, 0, + 0,0x4952, 0, 0, 0, 0, 0, 0, +0x4953, 0, 0, 0, 0,0x4954,0x4955, 0, + 0,0x4956, 0, 0,0x4957, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x4958, + 0, 0, 0, 0, 0, 0,0x4959, 0, +0x495A,0x495B,0x495C,0x495D, 0,0x495E, 0, 0, + 0,0x495F, 0, 0, 0, 0, 0, 0, + 0,0x4960}; + +/* page 25 0x70FA-0x71DC */ +static uint16 tab_uni_jisx021225[]={ +0x4961, 0, 0, 0, 0, 0, 0, 0, + 0,0x4962,0x4963,0x4964,0x4965,0x4966, 0, 0, + 0,0x4967,0x4968, 0, 0,0x4969, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x496A, 0,0x496B, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x496C, 0,0x496D, 0,0x496E,0x496F,0x4970, + 0, 0, 0, 0, 0, 0,0x4971, 0, + 0, 0, 0, 0, 0, 0, 0,0x4972, + 0, 0, 0,0x4973,0x4974,0x4975, 0, 0, +0x4976,0x4977, 0, 0, 0, 0,0x4978, 0, +0x4979, 0, 0, 0, 0,0x497A, 0, 0, +0x497B, 0,0x497C, 0,0x497D, 0,0x497E, 0, + 0, 0, 0, 0, 0, 0,0x4A21, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x4A22, + 0, 0, 0, 0, 0, 0,0x4A23, 0, + 0, 0, 0,0x4A24, 0,0x4A25, 0, 0, + 0, 0,0x4A26, 0, 0, 0, 0, 0, +0x4A27, 0, 0, 0, 0, 0, 0, 0, +0x4A28,0x4A29, 0, 0, 0, 0,0x4A2A, 0, +0x4A2B, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x4A2C,0x4A2D, 0, +0x4A2E,0x4A2F, 0, 0, 0, 0, 0, 0, +0x4A30, 0, 0, 0, 0,0x4A31,0x4A32,0x4A33, + 0, 0,0x4A34, 0, 0, 0, 0, 0, + 0,0x4A35,0x4A36, 0, 0, 0, 0, 0, + 0,0x4A37, 0, 0,0x4A38, 0, 0,0x4A39, +0x4A3A, 0,0x4A3B}; + +/* page 26 0x71F8-0x7E9E */ +static uint16 tab_uni_jisx021226[]={ +0x4A3C, 0, 0, 0, 0, 0,0x4A3D, 0, +0x4A3E, 0, 0, 0, 0, 0, 0,0x4A3F, +0x4A40,0x4A41, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x4A42, 0, 0, 0,0x4A43, + 0, 0,0x4A44, 0, 0,0x4A45, 0,0x4A46, + 0, 0, 0, 0,0x4A47, 0, 0, 0, + 0, 0, 0,0x4A48, 0, 0, 0,0x4A49, + 0, 0, 0, 0,0x4A4A, 0, 0, 0, +0x4A4B,0x4A4C, 0, 0, 0, 0, 0, 0, + 0,0x4A4D,0x4A4E,0x4A4F, 0,0x4A50, 0, 0, + 0, 0, 0, 0, 0, 0,0x4A51,0x4A52, +0x4A53, 0, 0,0x4A54, 0,0x4A55,0x4A56, 0, + 0, 0,0x4A57, 0,0x4A58, 0,0x4A59, 0, +0x4A5A, 0, 0,0x4A5B, 0, 0, 0, 0, +0x4A5C, 0, 0,0x4A5D, 0, 0,0x4A5E,0x4A5F, + 0,0x4A60, 0, 0, 0, 0, 0,0x4A61, +0x4A62, 0, 0,0x4A63,0x4A64, 0, 0,0x4A65, + 0, 0, 0, 0,0x4A66, 0, 0, 0, + 0,0x4A67, 0, 0, 0,0x4A68,0x4A69, 0, + 0, 0, 0,0x4A6A, 0, 0, 0, 0, + 0, 0, 0,0x4A6B, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4A6C, 0, 0, 0, 0,0x4A6D,0x4A6E, 0, + 0,0x4A6F, 0, 0,0x4A70, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x4A71, 0, + 0,0x4A72, 0, 0, 0, 0, 0,0x4A73, + 0,0x4A74, 0, 0,0x4A75, 0, 0, 0, + 0, 0, 0, 0, 0,0x4A76,0x4A77, 0, +0x4A78, 0, 0, 0, 0, 0, 0,0x4A79, + 0, 0, 0, 0, 0,0x4A7A, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x4A7B,0x4A7C, 0, 0, 0, + 0, 0,0x4A7D,0x4A7E, 0, 0,0x4B21, 0, + 0, 0,0x4B22, 0,0x4B23,0x4B24, 0,0x4B25, + 0, 0, 0,0x4B26, 0,0x4B27, 0, 0, + 0, 0,0x4B28,0x4B29, 0, 0, 0, 0, +0x4B2A,0x4B2B, 0, 0, 0, 0,0x4B2C, 0, + 0, 0,0x4B2D, 0,0x4B2E, 0, 0,0x4B2F, +0x4B30, 0, 0, 0,0x4B31, 0, 0, 0, + 0,0x4B32,0x4B33, 0, 0,0x4B34, 0, 0, + 0, 0,0x4B35,0x4B36, 0,0x4B37, 0, 0, + 0, 0, 0,0x4B38, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x4B39, 0, 0, +0x4B3A, 0,0x4B3B, 0, 0, 0,0x4B3C, 0, +0x4B3D, 0, 0, 0, 0,0x4B3E,0x4B3F,0x4B40, +0x4B41, 0, 0, 0, 0, 0,0x4B42,0x4B43, + 0,0x4B44, 0,0x4B45,0x4B46, 0,0x4B47,0x4B48, + 0,0x4B49, 0, 0, 0, 0, 0,0x4B4A, + 0,0x4B4B, 0, 0,0x4B4C, 0, 0, 0, +0x4B4D,0x4B4E, 0,0x4B4F, 0,0x4B50,0x4B51, 0, + 0, 0, 0, 0, 0, 0,0x4B52, 0, +0x4B53, 0, 0,0x4B54, 0,0x4B55, 0,0x4B56, +0x4B57, 0, 0, 0,0x4B58, 0,0x4B59,0x4B5A, +0x4B5B, 0,0x4B5C, 0, 0,0x4B5D,0x4B5E, 0, + 0, 0,0x4B5F,0x4B60, 0,0x4B61, 0, 0, + 0, 0, 0, 0, 0,0x4B62, 0,0x4B63, + 0,0x4B64, 0, 0,0x4B65,0x4B66, 0,0x4B67, + 0, 0, 0, 0, 0,0x4B68,0x4B69, 0, + 0,0x4B6A, 0,0x4B6B,0x4B6C, 0, 0,0x4B6D, + 0, 0,0x4B6E,0x4B6F, 0, 0,0x4B70, 0, + 0,0x4B71, 0, 0, 0,0x4B72, 0, 0, + 0,0x4B73, 0,0x4B74, 0, 0,0x4B75,0x4B76, + 0,0x4B77, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x4B78,0x4B79, 0,0x4B7A, + 0,0x4B7B,0x4B7C,0x4B7D, 0,0x4B7E, 0,0x4C21, +0x4C22,0x4C23, 0, 0,0x4C24, 0, 0,0x4C25, + 0, 0,0x4C26, 0, 0, 0, 0, 0, + 0,0x4C27, 0, 0, 0, 0, 0, 0, + 0, 0,0x4C28,0x4C29, 0, 0, 0, 0, + 0, 0, 0, 0,0x4C2A, 0,0x4C2B, 0, +0x4C2C,0x4C2D,0x4C2E,0x4C2F,0x4C30,0x4C31,0x4C32,0x4C33, +0x4C34,0x4C35, 0, 0, 0, 0, 0, 0, + 0,0x4C36, 0, 0, 0, 0, 0, 0, +0x4C37, 0, 0,0x4C38,0x4C39, 0,0x4C3A,0x4C3B, + 0, 0, 0,0x4C3C, 0,0x4C3D, 0, 0, + 0,0x4C3E,0x4C3F, 0, 0, 0, 0,0x4C40, + 0, 0, 0, 0, 0,0x4C41, 0, 0, + 0, 0,0x4C42, 0, 0, 0,0x4C43,0x4C44, +0x4C45, 0, 0,0x4C46, 0,0x4C47,0x4C48, 0, + 0,0x4C49,0x4C4A, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4C4B,0x4C4C, 0, 0, 0,0x4C4D,0x4C4E,0x4C4F, + 0,0x4C50, 0, 0, 0, 0, 0,0x4C51, +0x4C52,0x4C53,0x4C54, 0, 0, 0, 0, 0, +0x4C55,0x4C56,0x4C57, 0,0x4C58, 0, 0,0x4C59, +0x4C5A,0x4C5B, 0,0x4C5C, 0, 0,0x4C5D, 0, +0x4C5E,0x4C5F,0x4C60,0x4C61, 0, 0,0x4C62,0x4C63, + 0,0x4C64,0x4C65, 0, 0,0x4C66, 0, 0, + 0,0x4C67, 0,0x4C68, 0, 0, 0,0x4C69, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4C6A,0x4C6B, 0, 0,0x4C6C, 0, 0, 0, +0x4C6D, 0, 0,0x4C6E, 0, 0, 0, 0, +0x4C6F, 0,0x4C70,0x4C71, 0, 0,0x4C72,0x4C73, + 0, 0, 0, 0,0x4C74, 0, 0, 0, +0x4C75, 0,0x4C76,0x4C77, 0, 0, 0,0x4C78, + 0, 0, 0, 0,0x4C79, 0, 0, 0, + 0, 0,0x4C7A,0x4C7B,0x4C7C, 0, 0,0x4C7D, + 0, 0, 0, 0, 0, 0,0x4C7E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x4D21, 0, 0, 0,0x4D22,0x4D23, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4D24,0x4D25, 0, 0,0x4D26, 0, 0,0x4D27, + 0,0x4D28,0x4D29, 0, 0, 0, 0,0x4D2A, + 0, 0, 0, 0, 0, 0,0x4D2B, 0, + 0,0x4D2C, 0, 0, 0,0x4D2D,0x4D2E,0x4D2F, +0x4D30, 0, 0,0x4D31, 0, 0, 0,0x4D32, +0x4D33, 0, 0, 0, 0, 0,0x4D34, 0, +0x4D35, 0,0x4D36, 0, 0, 0, 0,0x4D37, + 0, 0, 0, 0, 0, 0,0x4D38,0x4D39, + 0,0x4D3A, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x4D3B, + 0,0x4D3C, 0, 0, 0, 0, 0, 0, + 0,0x4D3D,0x4D3E,0x4D3F,0x4D40,0x4D41,0x4D42, 0, + 0,0x4D43, 0, 0, 0,0x4D44, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4D45, 0,0x4D46,0x4D47, 0,0x4D48, 0, 0, + 0,0x4D49, 0, 0,0x4D4A, 0, 0, 0, + 0, 0,0x4D4B, 0,0x4D4C, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x4D4D, 0, 0, 0, + 0, 0,0x4D4E, 0, 0, 0, 0,0x4D4F, +0x4D50,0x4D51, 0, 0,0x4D52, 0,0x4D53, 0, + 0, 0, 0, 0,0x4D54, 0,0x4D55,0x4D56, + 0, 0, 0, 0, 0, 0, 0,0x4D57, + 0, 0, 0, 0,0x4D58, 0, 0,0x4D59, +0x4D5A,0x4D5B, 0, 0,0x4D5C, 0, 0,0x4D5D, + 0, 0, 0, 0,0x4D5E, 0,0x4D5F,0x4D60, + 0,0x4D61, 0, 0, 0, 0, 0, 0, + 0,0x4D62, 0, 0, 0, 0, 0, 0, +0x4D63, 0,0x4D64,0x4D65,0x4D66, 0, 0,0x4D67, +0x4D68, 0,0x4D69, 0,0x4D6A, 0, 0,0x4D6B, + 0, 0,0x4D6C,0x4D6D, 0,0x4D6E,0x4D6F, 0, + 0,0x4D70, 0,0x4D71,0x4D72,0x4D73,0x4D74, 0, + 0, 0, 0,0x4D75, 0,0x4D76,0x4D77, 0, + 0,0x4D78, 0, 0, 0,0x4D79, 0, 0, + 0, 0,0x4D7A,0x4D7B, 0,0x4D7C, 0, 0, +0x4D7D,0x4D7E,0x4E21, 0,0x4E22, 0, 0, 0, +0x4E24,0x4E25, 0,0x4E26,0x4E27,0x4E28, 0, 0, + 0,0x4E29,0x4E23,0x4E2A, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x4E2B, 0, 0, + 0,0x4E2C, 0, 0, 0, 0, 0,0x4E2D, + 0, 0, 0, 0,0x4E2E,0x4E2F, 0, 0, + 0, 0, 0, 0, 0,0x4E30,0x4E31,0x4E32, + 0,0x4E33, 0, 0,0x4E34, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x4E35, 0, 0, 0,0x4E36, 0, 0, + 0, 0, 0, 0,0x4E37,0x4E38, 0, 0, + 0, 0, 0, 0, 0,0x4E39, 0, 0, + 0, 0, 0,0x4E3A,0x4E3B,0x4E3C, 0,0x4E3D, +0x4E3E, 0,0x4E3F,0x4E40,0x4E41,0x4E42,0x4E43,0x4E44, +0x4E45, 0,0x4E46, 0, 0,0x4E47, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x4E48, 0, 0, + 0,0x4E49, 0, 0, 0,0x4E4A, 0, 0, + 0,0x4E4B, 0,0x4E4C,0x4E4D, 0,0x4E4E, 0, + 0, 0, 0, 0,0x4E4F, 0, 0, 0, + 0,0x4E50, 0, 0, 0, 0, 0, 0, +0x4E51, 0, 0, 0, 0, 0,0x4E52, 0, +0x4E53, 0, 0, 0,0x4E54, 0, 0, 0, +0x4E55,0x4E56, 0, 0, 0, 0,0x4E57, 0, + 0,0x4E58, 0, 0,0x4E59, 0, 0, 0, +0x4E5A, 0, 0, 0, 0, 0,0x4E5B, 0, + 0, 0,0x4E5C, 0, 0, 0,0x4E5D, 0, + 0, 0,0x4E5E, 0,0x4E5F,0x4E60, 0,0x4E61, + 0,0x4E62,0x4E63, 0,0x4E64, 0, 0, 0, + 0, 0,0x4E65, 0, 0, 0, 0, 0, +0x4E66, 0, 0, 0, 0,0x4E67,0x4E68,0x4E69, + 0, 0, 0, 0,0x4E6A,0x4E6B,0x4E6C, 0, + 0,0x4E6D, 0, 0, 0,0x4E6E,0x4E6F, 0, + 0, 0,0x4E70, 0, 0,0x4E71,0x4E72, 0, + 0, 0,0x4E73, 0, 0,0x4E74,0x4E75,0x4E76, + 0, 0,0x4E77, 0, 0, 0,0x4E78,0x4E79, + 0, 0, 0, 0,0x4E7A, 0,0x4E7B,0x4E7C, +0x4E7D, 0,0x4E7E, 0,0x4F21, 0, 0,0x4F22, + 0, 0,0x4F23, 0,0x4F24, 0, 0, 0, +0x4F25, 0,0x4F26,0x4F27,0x4F28, 0, 0, 0, + 0, 0,0x4F29, 0, 0,0x4F2A, 0, 0, +0x4F2B, 0, 0, 0,0x4F2C, 0, 0, 0, + 0, 0, 0, 0,0x4F2D,0x4F2E, 0, 0, + 0, 0, 0, 0,0x4F2F,0x4F30,0x4F31, 0, + 0, 0,0x4F32, 0, 0, 0, 0,0x4F33, + 0, 0,0x4F34, 0, 0, 0, 0,0x4F35, + 0, 0,0x4F36, 0, 0, 0,0x4F37,0x4F38, + 0,0x4F39, 0, 0, 0,0x4F3A, 0, 0, + 0, 0, 0, 0, 0, 0,0x4F3B, 0, + 0, 0, 0,0x4F3C, 0, 0, 0, 0, + 0,0x4F3D, 0, 0, 0, 0, 0, 0, + 0,0x4F3E,0x4F3F, 0, 0,0x4F40, 0, 0, + 0,0x4F41, 0, 0, 0, 0,0x4F42,0x4F43, +0x4F44, 0, 0, 0,0x4F45, 0,0x4F46, 0, + 0, 0,0x4F47, 0,0x4F48, 0, 0, 0, +0x4F49,0x4F4A, 0, 0,0x4F4B, 0, 0, 0, +0x4F4C, 0, 0,0x4F4D, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x4F4E,0x4F4F, 0, + 0,0x4F50, 0, 0, 0,0x4F51,0x4F52, 0, + 0,0x4F53, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x4F54, 0, 0, + 0,0x4F55,0x4F56,0x4F57, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x4F58,0x4F59, 0, +0x4F5A, 0, 0, 0, 0,0x4F5B, 0,0x4F5C, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x4F5D,0x4F5E, 0, 0,0x4F5F, +0x4F60, 0, 0, 0,0x4F61, 0,0x4F62, 0, + 0, 0,0x4F63, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x4F64, 0,0x4F65, 0, +0x4F66,0x4F67, 0,0x4F68,0x4F69, 0, 0, 0, +0x4F6A, 0,0x4F6B, 0, 0, 0,0x4F6C, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x4F6D, 0, 0, 0,0x4F6E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x4F6F, 0, 0, 0, 0,0x4F70, + 0, 0, 0, 0,0x4F71, 0, 0, 0, +0x4F72, 0, 0, 0, 0,0x4F74,0x4F75,0x4F76, + 0,0x4F73, 0, 0,0x4F77, 0, 0, 0, +0x4F78, 0, 0, 0,0x4F79,0x4F7A, 0, 0, +0x4F7B,0x4F7C,0x4F7D,0x4F7E, 0, 0, 0, 0, + 0, 0, 0,0x5021, 0,0x5022, 0,0x5023, + 0, 0, 0, 0, 0, 0, 0,0x5024, +0x5025,0x5026, 0, 0,0x5027, 0,0x5028, 0, + 0, 0,0x5029,0x502A, 0,0x502B,0x502C, 0, + 0, 0, 0,0x502E, 0, 0, 0,0x502F, +0x5030,0x5031, 0, 0,0x502D, 0,0x5032, 0, + 0, 0,0x5033, 0, 0, 0, 0, 0, + 0, 0,0x5034,0x5035, 0, 0,0x5037,0x5038, + 0, 0,0x5039,0x503A, 0, 0, 0,0x503B, +0x5036, 0, 0, 0, 0, 0,0x503C, 0, + 0, 0, 0, 0,0x503D, 0, 0, 0, +0x503E, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x503F, 0,0x5040, 0,0x5041,0x5042, +0x5043, 0, 0, 0, 0,0x5044, 0,0x5045, + 0,0x5046, 0, 0, 0,0x5047, 0, 0, + 0,0x5048, 0, 0,0x5049,0x504A, 0, 0, + 0, 0, 0,0x504B, 0,0x504C, 0,0x504D, + 0, 0, 0, 0,0x504E,0x504F,0x5050, 0, + 0, 0,0x5051,0x5052, 0, 0, 0,0x5053, + 0,0x5054, 0, 0,0x5055, 0, 0, 0, +0x5056, 0, 0,0x5057,0x5058, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x5059, + 0,0x505A, 0,0x505B, 0, 0, 0, 0, + 0, 0,0x505C, 0, 0, 0, 0, 0, + 0,0x505D, 0,0x505E,0x505F, 0,0x5060, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x5061,0x5062, 0, 0, 0, + 0,0x5063, 0,0x5064,0x5065,0x5066,0x5067, 0, +0x5068, 0, 0,0x5069,0x506A, 0, 0, 0, + 0,0x506B, 0, 0, 0, 0, 0, 0, +0x506C,0x506D, 0,0x506E, 0, 0, 0,0x506F, + 0,0x5070, 0, 0,0x5071, 0, 0, 0, +0x5072, 0, 0,0x5073, 0, 0, 0, 0, + 0, 0,0x5074, 0,0x5075, 0, 0,0x5076, +0x5077, 0,0x5078, 0, 0, 0, 0,0x5079, + 0, 0, 0, 0,0x507A, 0,0x507B, 0, + 0, 0,0x507C, 0, 0,0x507D,0x507E, 0, +0x5121, 0,0x5122, 0, 0,0x5123, 0, 0, + 0, 0,0x5124,0x5125, 0,0x5126, 0, 0, + 0,0x5127, 0, 0, 0, 0, 0, 0, +0x5128, 0, 0, 0,0x5129, 0, 0, 0, + 0, 0,0x512A,0x512B, 0, 0, 0,0x512C, + 0,0x512D,0x512E, 0,0x512F, 0, 0, 0, + 0,0x5130, 0, 0, 0,0x5131, 0, 0, + 0, 0, 0,0x5132, 0, 0,0x5133, 0, + 0,0x5134, 0, 0, 0, 0, 0,0x5135, + 0, 0, 0,0x5136, 0,0x5137, 0,0x5138, +0x5139, 0, 0, 0,0x513A,0x513B, 0, 0, +0x513C,0x513D,0x513E, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x513F,0x5140, 0,0x5141, +0x5142, 0, 0, 0,0x5143, 0, 0, 0, + 0, 0, 0, 0, 0,0x5144,0x5145, 0, + 0,0x5146, 0, 0,0x5147,0x5148, 0,0x5149, +0x514A, 0, 0, 0, 0,0x514B, 0,0x514C, + 0, 0,0x514D, 0, 0,0x514E, 0, 0, + 0, 0, 0, 0, 0,0x514F, 0, 0, +0x5150, 0, 0, 0, 0, 0,0x5151, 0, +0x5152, 0,0x5153, 0, 0,0x5154,0x5155, 0, + 0, 0,0x5156,0x5157, 0, 0, 0, 0, +0x5158,0x5159, 0, 0,0x515A, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x515B, 0, +0x515C, 0, 0,0x515D, 0, 0, 0, 0, + 0, 0, 0, 0,0x515E, 0, 0, 0, + 0, 0, 0,0x515F, 0,0x5160, 0, 0, + 0,0x5161, 0,0x5162,0x5163, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x5164, 0, + 0,0x5165, 0, 0,0x5166, 0,0x5167, 0, + 0,0x5168, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x5169, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x516A,0x516B, 0,0x516C,0x516D, 0, 0, 0, + 0,0x516E, 0, 0,0x516F, 0, 0, 0, + 0, 0, 0,0x5170, 0,0x5171,0x5172, 0, + 0, 0, 0, 0, 0, 0, 0,0x5173, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x5174, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x5175, + 0, 0, 0,0x5176, 0, 0, 0,0x5177, + 0,0x5178,0x5179,0x517A, 0,0x517B,0x517C,0x517D, +0x517E,0x5221, 0, 0,0x5222, 0, 0, 0, + 0, 0, 0, 0, 0,0x5223, 0,0x5224, +0x5225,0x5226, 0, 0, 0, 0, 0,0x5227, + 0, 0, 0, 0, 0, 0,0x5228, 0, + 0, 0, 0, 0, 0,0x5229, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x522A, 0, 0, 0,0x522B, 0,0x522C, 0, + 0,0x522D,0x522E, 0, 0,0x522F, 0,0x5230, + 0, 0,0x5231,0x5232, 0, 0, 0,0x5233, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x5234, 0, 0, 0, + 0,0x5235, 0, 0, 0, 0,0x5236, 0, +0x5237,0x5238, 0, 0, 0, 0,0x5239, 0, + 0, 0, 0,0x523A, 0, 0,0x523B, 0, +0x523C, 0, 0, 0, 0,0x523D, 0, 0, + 0, 0, 0, 0,0x523E, 0, 0,0x523F, +0x5240, 0,0x5241, 0, 0,0x5242,0x5243, 0, + 0, 0,0x5244,0x5245,0x5246,0x5247, 0, 0, + 0, 0,0x5248, 0, 0,0x5249, 0, 0, +0x524A, 0,0x524B, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x524C, 0,0x524D,0x524E, + 0,0x524F,0x5250,0x5251, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5252, 0,0x5253, 0, 0, 0, 0, 0, + 0, 0,0x5254, 0,0x5255,0x5256, 0, 0, +0x5257,0x5258,0x5259, 0,0x525A, 0,0x525B, 0, + 0,0x525C,0x525D,0x525E,0x525F, 0,0x5260, 0, + 0,0x5261, 0,0x5262,0x5263, 0,0x5264,0x5265, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5266, 0,0x5267, 0, 0, 0, 0, +0x5268, 0, 0, 0, 0,0x5269,0x526A, 0, +0x526B, 0, 0, 0,0x526C, 0, 0, 0, + 0,0x526D, 0,0x526E,0x526F, 0,0x5270, 0, + 0,0x5271,0x5272, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x5273, 0, + 0, 0,0x5274, 0, 0, 0, 0, 0, + 0,0x5276,0x5277,0x5278, 0,0x5275, 0, 0, + 0,0x5279,0x527A,0x527B,0x527C,0x527D,0x527E, 0, + 0,0x5321, 0,0x5322, 0, 0, 0,0x5323, + 0,0x5324, 0, 0, 0,0x5325,0x5326, 0, +0x5327, 0,0x5328, 0, 0, 0, 0, 0, + 0,0x5329, 0, 0,0x532A,0x532B, 0, 0, + 0, 0, 0, 0, 0, 0,0x532C,0x532D, + 0, 0, 0, 0, 0, 0, 0,0x532E, + 0, 0, 0, 0,0x532F, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x5330, 0, +0x5331, 0, 0, 0, 0, 0,0x5332, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5333, 0, 0, 0, 0, 0,0x5334,0x5335, + 0, 0,0x5336,0x5337,0x5338, 0, 0,0x5339, + 0, 0, 0, 0,0x533A, 0, 0,0x533B, +0x533C,0x533D, 0, 0, 0,0x533E, 0,0x533F, + 0, 0, 0,0x5340,0x5341,0x5342, 0,0x5343, + 0,0x5344,0x5345, 0, 0,0x5346, 0, 0, + 0, 0, 0, 0, 0, 0,0x5347, 0, + 0,0x5348, 0,0x5349, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x534A, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x534B, 0, 0, 0,0x534C, +0x534D,0x534E, 0, 0, 0, 0, 0,0x534F, + 0,0x5350,0x5351,0x5352, 0, 0,0x5353, 0, + 0, 0, 0, 0, 0,0x5354,0x5355, 0, + 0, 0, 0,0x5356, 0, 0,0x5357, 0, + 0, 0,0x5358, 0, 0,0x5359, 0, 0, + 0,0x535A, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x535B,0x535C,0x535D, 0, +0x535E,0x535F, 0, 0, 0, 0, 0,0x5360, +0x5361, 0, 0, 0, 0,0x5362, 0, 0, + 0,0x5363, 0,0x5364, 0, 0, 0,0x5365, + 0,0x5366,0x5367, 0,0x5368,0x5369, 0, 0, + 0, 0, 0, 0, 0,0x536A, 0,0x536B, + 0, 0,0x536C, 0, 0, 0, 0, 0, +0x536D, 0, 0, 0, 0, 0, 0, 0, +0x536E, 0,0x536F,0x5370, 0, 0, 0,0x5371, + 0,0x5372,0x5373,0x5374, 0,0x5375,0x5376, 0, +0x5377, 0, 0,0x5378,0x5379,0x537A, 0, 0, + 0,0x537B, 0, 0, 0, 0,0x537C,0x537D, + 0, 0, 0, 0, 0,0x537E,0x5421, 0, + 0, 0, 0, 0, 0, 0,0x5422,0x5423, + 0, 0,0x5424, 0, 0, 0, 0, 0, + 0, 0, 0,0x5425, 0, 0,0x5426,0x5427, + 0,0x5428, 0, 0, 0, 0, 0, 0, + 0, 0,0x5429,0x542A,0x542B,0x542C,0x542D, 0, + 0, 0, 0, 0,0x542E,0x542F,0x5430, 0, + 0, 0, 0, 0, 0, 0, 0,0x5431, + 0,0x5432, 0, 0, 0, 0, 0, 0, + 0, 0,0x5434, 0, 0,0x5435,0x5436, 0, + 0, 0,0x5437,0x5438, 0,0x5439, 0, 0, + 0,0x543A, 0, 0, 0,0x543B,0x543C, 0, + 0,0x543D,0x543E, 0, 0, 0, 0, 0, +0x5433, 0, 0, 0, 0, 0, 0, 0, +0x543F, 0, 0, 0, 0, 0, 0, 0, +0x5440,0x5441, 0, 0, 0,0x5442, 0,0x5443, + 0, 0, 0, 0,0x5444,0x5445, 0, 0, +0x5446, 0, 0, 0, 0, 0, 0,0x5447, +0x5448, 0, 0, 0,0x5449,0x544A, 0,0x544B, + 0, 0, 0,0x544C, 0, 0,0x544D, 0, + 0, 0, 0, 0, 0, 0, 0,0x544E, + 0, 0, 0, 0,0x544F,0x5450, 0,0x5451, + 0, 0, 0, 0, 0, 0,0x5452, 0, +0x5453, 0,0x5454, 0, 0, 0, 0, 0, +0x5455, 0, 0, 0, 0, 0, 0,0x5456, + 0,0x5457,0x5458, 0, 0,0x5459, 0, 0, + 0, 0, 0,0x545A, 0, 0,0x545B,0x545C, + 0, 0, 0,0x545D, 0, 0, 0, 0, +0x545E, 0, 0, 0, 0, 0,0x545F, 0, + 0,0x5460, 0, 0, 0, 0,0x5461,0x5462, + 0, 0,0x5463, 0, 0,0x5464, 0, 0, + 0,0x5465, 0, 0, 0,0x5466, 0, 0, +0x5467, 0,0x5468, 0, 0,0x5469,0x546A}; + +/* page 27 0x7F3B-0x8044 */ +static uint16 tab_uni_jisx021227[]={ +0x546C,0x546B,0x546D,0x546E,0x546F, 0, 0, 0, +0x5470,0x5471, 0, 0,0x5472, 0, 0, 0, + 0, 0, 0, 0,0x5473, 0, 0,0x5474, +0x5475, 0, 0, 0, 0, 0, 0, 0, +0x5476,0x5477,0x5478, 0, 0, 0,0x5479, 0, +0x547A,0x547B,0x547C,0x547D, 0, 0, 0, 0, + 0, 0,0x547E, 0, 0, 0,0x5521, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x5522,0x5523,0x5524,0x5525, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5526, 0,0x5527, 0,0x5528,0x5529,0x552A, 0, + 0, 0, 0,0x552B,0x552C, 0, 0, 0, + 0,0x552D, 0, 0, 0, 0,0x552E,0x552F, + 0, 0, 0,0x5530, 0, 0, 0,0x5531, + 0, 0,0x5532, 0, 0, 0, 0, 0, + 0,0x5533, 0, 0, 0, 0, 0, 0, + 0,0x5534, 0, 0,0x5535,0x5536, 0, 0, +0x5537, 0, 0, 0, 0,0x5538, 0, 0, + 0, 0, 0,0x5539,0x553A, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x553B, 0, 0, 0,0x553C, 0, 0, 0, +0x553D, 0,0x553E, 0, 0,0x553F, 0, 0, + 0,0x5540, 0,0x5541,0x5542, 0, 0,0x5543, + 0, 0, 0, 0, 0, 0, 0,0x5544, + 0, 0,0x5545,0x5546,0x5547, 0, 0, 0, + 0, 0, 0, 0,0x5548,0x5549, 0,0x554A, + 0, 0,0x554B,0x554C,0x554D, 0,0x554E, 0, +0x554F,0x5550, 0,0x5551, 0, 0, 0, 0, + 0, 0,0x5552,0x5553,0x5554,0x5555, 0, 0, + 0,0x5556, 0,0x5557, 0, 0, 0, 0, + 0,0x5558, 0,0x5559, 0,0x555A, 0, 0, + 0,0x555B,0x555C, 0,0x555D, 0,0x555E,0x555F, + 0,0x5560, 0,0x5561, 0,0x5562, 0, 0, + 0,0x5563}; + +/* page 28 0x8060-0x8357 */ +static uint16 tab_uni_jisx021228[]={ +0x5564, 0, 0, 0,0x5565, 0,0x5566, 0, + 0, 0, 0, 0, 0,0x5567, 0, 0, + 0,0x5568, 0, 0, 0,0x5569, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x556A, 0, 0, 0, 0, 0, 0, +0x556B, 0, 0, 0, 0, 0,0x556C, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x556D, 0,0x556E, 0, + 0, 0, 0, 0, 0, 0,0x556F,0x5570, + 0, 0, 0,0x5571, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5572,0x5573, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5574, 0, 0, 0, 0,0x5575, 0,0x5576, + 0, 0,0x5577, 0,0x5578,0x5579, 0,0x557A, +0x557B, 0, 0, 0, 0, 0, 0, 0, +0x557C, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x557D,0x557E, 0, +0x5621, 0,0x5622,0x5623, 0, 0,0x5624, 0, + 0,0x5625,0x5626, 0, 0, 0,0x5627, 0, + 0, 0, 0,0x5628, 0, 0, 0, 0, + 0, 0, 0,0x5629, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x562A,0x562B, +0x562C, 0, 0, 0,0x562D, 0,0x562E, 0, +0x562F, 0, 0, 0,0x5630, 0, 0,0x5631, + 0, 0, 0, 0,0x5632, 0, 0, 0, +0x5633, 0, 0, 0, 0,0x5634, 0, 0, + 0, 0,0x5635, 0,0x5636, 0, 0, 0, + 0, 0, 0, 0, 0,0x5637, 0,0x5638, + 0, 0,0x5639, 0,0x563A, 0, 0, 0, + 0, 0,0x563B, 0, 0, 0, 0,0x563C, + 0, 0, 0, 0, 0, 0, 0, 0, +0x563D,0x563E, 0, 0, 0, 0, 0,0x563F, +0x5640,0x5641, 0, 0, 0,0x5642, 0,0x5643, + 0, 0, 0, 0, 0, 0, 0,0x5644, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5645, 0, 0,0x5647,0x5648,0x5649, 0, + 0, 0, 0,0x564A, 0, 0,0x564B, 0, +0x5646, 0, 0, 0, 0, 0,0x564C, 0, +0x564D, 0, 0,0x564E, 0, 0,0x564F, 0, + 0, 0,0x5650, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x5651, 0, + 0, 0,0x5652, 0,0x5653, 0, 0, 0, + 0, 0, 0,0x5654, 0, 0, 0, 0, + 0, 0, 0,0x5656, 0,0x5657, 0, 0, + 0, 0,0x5658,0x5655, 0, 0,0x5659,0x565A, + 0, 0, 0, 0, 0,0x565B, 0,0x565C, + 0, 0, 0,0x565D, 0,0x565E,0x565F, 0, + 0,0x5660, 0, 0,0x5661, 0, 0, 0, + 0, 0, 0,0x5662,0x5663, 0, 0, 0, +0x5664,0x5665,0x5666, 0, 0,0x5667,0x5668, 0, +0x5669,0x566A, 0, 0, 0,0x566B, 0,0x566C, +0x566D, 0, 0,0x566E, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x566F, + 0, 0, 0,0x5670,0x5671, 0, 0, 0, + 0,0x5672,0x5673, 0, 0,0x5674, 0, 0, + 0,0x5675,0x5676, 0, 0, 0, 0, 0, +0x5677, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x5678, 0,0x5679, 0, 0, 0, + 0, 0,0x567A, 0, 0, 0, 0, 0, + 0, 0, 0,0x567B,0x567C,0x567D,0x567E, 0, + 0, 0, 0,0x5721, 0, 0,0x5722,0x5723, + 0,0x5724, 0, 0, 0, 0,0x5725, 0, + 0, 0, 0, 0,0x5726, 0, 0, 0, +0x5727, 0, 0,0x5728, 0, 0, 0,0x5729, + 0, 0, 0, 0, 0,0x572A, 0, 0, + 0, 0, 0, 0,0x572B, 0, 0, 0, + 0, 0, 0,0x572C, 0,0x572D, 0,0x572E, +0x572F,0x5730, 0,0x5731,0x5732, 0, 0,0x5733, + 0,0x5734,0x5735, 0, 0, 0,0x5736, 0, + 0,0x5737, 0, 0,0x5738, 0,0x5739, 0, +0x573A, 0,0x573B,0x573C, 0, 0, 0, 0, +0x573D,0x573E, 0,0x573F,0x5740, 0, 0,0x5741, +0x5742,0x5743,0x5744, 0, 0, 0,0x5745, 0, +0x5746, 0,0x5747, 0,0x5748, 0, 0,0x5749, + 0, 0,0x574A, 0,0x574B, 0,0x574C,0x574D, + 0, 0, 0, 0, 0, 0,0x574E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x574F, 0, 0, 0, 0,0x5750, 0, 0, + 0, 0,0x5751, 0, 0, 0, 0, 0, +0x5752, 0,0x5753, 0,0x5754, 0, 0, 0, +0x5755, 0,0x5756, 0, 0,0x5757, 0,0x5758, + 0, 0, 0, 0, 0, 0,0x5759,0x575A, + 0, 0, 0, 0, 0,0x575B,0x575C, 0, +0x575D,0x575E, 0, 0, 0, 0, 0,0x575F, +0x5760, 0,0x5761,0x5762, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x5764, 0,0x5765,0x5766,0x5767, + 0,0x5768,0x5769, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x576A,0x576B,0x576C, 0, +0x576D, 0, 0,0x576E, 0, 0, 0,0x576F, + 0, 0,0x5770, 0,0x5771,0x5772, 0, 0, + 0, 0,0x5773,0x5774,0x5775, 0, 0,0x5776, + 0, 0, 0, 0, 0,0x5777,0x5778, 0, + 0,0x5779, 0,0x583E,0x5763,0x577A,0x577B,0x577C +}; + +/* page 29 0x8370-0x8419 */ +static uint16 tab_uni_jisx021229[]={ +0x577D, 0, 0, 0, 0, 0, 0, 0, +0x577E, 0, 0, 0, 0,0x5821, 0,0x5822, +0x5823, 0,0x5824, 0,0x5825, 0,0x5826, 0, + 0, 0, 0, 0, 0,0x5827, 0, 0, + 0, 0,0x5828, 0,0x5829,0x582A, 0, 0, +0x582B,0x582C, 0,0x582D,0x582E,0x582F, 0, 0, + 0, 0, 0, 0, 0, 0,0x5830,0x5831, + 0,0x5832, 0, 0,0x5833,0x584C, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x5834,0x5835, +0x5836, 0, 0, 0, 0, 0, 0,0x5837, + 0,0x5838, 0, 0, 0, 0, 0,0x5839, +0x583A,0x583B, 0, 0,0x583C, 0, 0, 0, + 0, 0, 0, 0, 0,0x583D, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x583F, 0,0x5840, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x5841, 0, +0x5842,0x5843, 0, 0,0x5844, 0, 0, 0, + 0,0x5845, 0, 0, 0, 0,0x5846, 0, + 0, 0,0x5847, 0, 0, 0, 0,0x5848, + 0,0x5849, 0, 0, 0,0x584A, 0, 0, + 0,0x584B}; + +/* page 30 0x842F-0x8880 */ +static uint16 tab_uni_jisx021230[]={ +0x584D, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x584E, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x584F, 0, +0x5850,0x5851, 0,0x5852, 0, 0,0x5853, 0, +0x5854, 0,0x5855,0x5856, 0, 0, 0,0x5857, + 0,0x5858,0x5859,0x585A, 0,0x585B, 0, 0, + 0,0x585C, 0, 0, 0,0x585D,0x585E, 0, +0x585F, 0, 0,0x5860, 0, 0, 0, 0, + 0,0x5861, 0, 0,0x5862,0x5863, 0,0x5864, + 0,0x5865, 0, 0, 0,0x5866,0x5867, 0, + 0, 0,0x5868, 0, 0, 0,0x5869, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x586A,0x586B, 0,0x586C, 0, + 0, 0, 0, 0, 0, 0, 0,0x586D, + 0, 0, 0, 0, 0, 0, 0,0x586E, + 0,0x586F,0x5870,0x5871, 0, 0, 0, 0, +0x5872, 0,0x5873, 0, 0,0x5874, 0, 0, + 0, 0, 0,0x5875, 0, 0,0x5876,0x5877, + 0,0x5878, 0,0x5879, 0, 0, 0, 0, +0x587A,0x587B, 0, 0, 0,0x587C, 0, 0, +0x587D, 0, 0, 0,0x587E, 0, 0, 0, + 0, 0, 0, 0, 0,0x5921, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5922, 0, 0,0x5923, 0, 0, 0, 0, +0x5924,0x5925,0x5926,0x5927, 0, 0, 0, 0, +0x5928, 0, 0,0x592A,0x592B, 0,0x592C, 0, + 0, 0, 0,0x592D,0x592E, 0, 0, 0, +0x592F, 0, 0, 0, 0,0x5930, 0,0x5931, + 0,0x5932, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x5933, 0,0x5934, + 0, 0, 0,0x5935,0x5936,0x5937,0x5938, 0, +0x5939, 0, 0,0x593A,0x593B, 0, 0, 0, +0x593C, 0, 0,0x5929,0x593D,0x593E, 0,0x593F, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5940, 0, 0, 0, 0, 0, 0,0x5941, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5942,0x5943,0x5944,0x5945,0x5946, 0, 0,0x5947, + 0, 0,0x5948, 0, 0,0x5949,0x594A,0x594B, +0x594C,0x594D,0x594E,0x594F, 0,0x5950, 0, 0, + 0, 0, 0, 0,0x5951, 0, 0, 0, +0x5952, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x5953,0x5954,0x5955, 0,0x5956, 0, +0x5957, 0,0x5958, 0, 0, 0,0x5959,0x595A, + 0, 0,0x595B, 0,0x595C,0x595D, 0, 0, +0x595E, 0, 0, 0,0x595F, 0, 0, 0, + 0,0x5960, 0, 0, 0, 0,0x5961, 0, +0x5962,0x5963, 0,0x5964, 0, 0,0x5965, 0, +0x5966, 0, 0, 0, 0, 0,0x5974, 0, + 0, 0, 0, 0, 0,0x5967, 0,0x5968, +0x5969,0x596A, 0, 0, 0,0x596B,0x596C,0x596D, +0x596E, 0, 0,0x596F, 0, 0, 0, 0, +0x5970, 0, 0,0x5971,0x5972, 0, 0,0x5973, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5975, 0,0x5976, 0, 0, 0, 0, +0x5977,0x5978, 0, 0, 0, 0, 0,0x5979, + 0,0x597A, 0, 0, 0, 0,0x597B, 0, + 0, 0, 0, 0,0x597C, 0, 0,0x597D, + 0, 0, 0, 0, 0,0x597E, 0, 0, +0x5A21,0x5A22, 0, 0, 0,0x5A23,0x5A24, 0, + 0, 0, 0, 0, 0, 0,0x5A25,0x5A26, + 0,0x5A27,0x5A28,0x5A29, 0, 0, 0, 0, + 0,0x5A2A,0x5A2B, 0,0x5A2C, 0, 0,0x5A2D, + 0, 0,0x5A2E, 0, 0, 0, 0, 0, +0x5A2F, 0,0x5A30, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x5A31, + 0,0x5A32, 0,0x5A33, 0,0x5A34,0x5A35, 0, + 0,0x5A36,0x3866,0x5A37, 0, 0, 0,0x5A38, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x5A39,0x5A3A, 0, 0,0x5A3B, +0x5A3C,0x5A3D,0x5A3E, 0, 0, 0,0x5A3F, 0, + 0,0x5A40,0x5A41,0x5A42,0x5A43,0x5A44, 0, 0, + 0, 0,0x5A45, 0, 0,0x5A46, 0, 0, +0x5A47, 0, 0, 0, 0, 0,0x5A48,0x5A49, +0x5A4A, 0, 0,0x5A4B, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5A6D, 0, 0, 0, 0,0x5A4C, 0, + 0, 0,0x5A4D, 0, 0, 0, 0,0x5A4E, + 0,0x5A4F, 0,0x5A50, 0,0x5A51, 0, 0, + 0, 0,0x5A52, 0, 0, 0, 0,0x5A53, +0x5A54,0x5A55, 0, 0, 0, 0,0x5A56, 0, + 0, 0,0x5A57, 0,0x5A58,0x5A59,0x5A5A, 0, +0x5A5B,0x5A5C,0x5A5D, 0, 0, 0, 0, 0, +0x5A5E,0x5A5F,0x5A60, 0,0x5A61, 0,0x5A62, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x5A63,0x5A64, 0, 0,0x5A65, 0, +0x5A66, 0, 0,0x5A67, 0,0x5A68, 0, 0, + 0,0x5A69, 0, 0,0x5A6A, 0,0x5A6B, 0, +0x5A6C, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x5A6E, 0,0x5A6F,0x5A70, 0, + 0, 0, 0, 0, 0,0x5A71,0x5A72, 0, +0x5A73, 0, 0, 0,0x5A74, 0, 0,0x5A75, +0x5A76,0x5A77, 0, 0,0x5A78,0x5A79, 0, 0, + 0, 0,0x5A7A, 0, 0, 0, 0,0x5A7B, +0x5A7C, 0,0x5A7D, 0,0x5A7E, 0, 0, 0, + 0,0x5B21, 0, 0, 0, 0, 0,0x5B22, +0x5B23, 0,0x5B24,0x5B25, 0, 0, 0, 0, + 0, 0,0x5B26,0x5B27, 0,0x5B28,0x5B29,0x5B2A, + 0,0x5B2B, 0, 0,0x5B2C, 0,0x5B2D, 0, + 0, 0, 0, 0, 0, 0,0x5B2E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5B2F, 0, 0, 0, 0,0x5B30, 0, + 0, 0,0x5B31, 0, 0,0x5B32,0x5B33, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5B34, 0,0x5B35,0x5B36, 0, 0, 0, 0, + 0, 0, 0, 0,0x5B37, 0, 0, 0, + 0, 0, 0, 0,0x5B38,0x5B39,0x5B3A,0x5B3B, +0x5B3C,0x5B3D,0x5B3E, 0,0x5B3F,0x5B40, 0, 0, + 0,0x5B41, 0, 0,0x5B42, 0,0x5B43, 0, +0x5B44,0x5B45,0x5B46, 0, 0, 0, 0,0x5B47, + 0,0x5B48, 0, 0,0x5B49, 0, 0, 0, +0x5B4A, 0, 0, 0, 0,0x5B4B,0x5B4C,0x5B4D, + 0, 0,0x5B4E, 0, 0, 0,0x5B4F, 0, + 0, 0, 0, 0, 0, 0, 0,0x5B50, +0x5B51, 0,0x5B52, 0, 0, 0, 0, 0, + 0,0x5B53,0x5B54,0x5B55, 0, 0, 0,0x5B56, + 0, 0, 0, 0, 0, 0,0x5B57,0x5B58, + 0, 0,0x5B59,0x5B5A, 0,0x5B5B, 0, 0, +0x5B5C, 0, 0,0x5B5D,0x5B5E,0x5B5F, 0, 0, + 0, 0, 0,0x5B60,0x5B61, 0,0x5B62, 0, + 0, 0,0x5B63, 0,0x5B64, 0, 0, 0, + 0,0x5B65, 0,0x5B66, 0, 0, 0, 0, +0x5B67, 0,0x5B68, 0,0x5B69, 0, 0,0x5B6A, + 0, 0,0x5B6B,0x5B6C,0x5B6D, 0, 0, 0, + 0,0x5B6E, 0,0x5B70,0x5B71,0x5B72, 0, 0, + 0,0x5B73,0x5B6F,0x5B74,0x5B75,0x5B76, 0,0x5B77, +0x5B78, 0, 0, 0, 0, 0, 0, 0, + 0,0x5B79, 0, 0, 0, 0,0x5B7A,0x5B7B, + 0,0x5B7C, 0,0x5B7D, 0, 0,0x5B7E, 0, + 0, 0, 0,0x5C21, 0,0x5C22, 0, 0, + 0, 0,0x5C23, 0,0x5C24, 0,0x5C25, 0, + 0,0x5C26,0x5C27,0x5C28,0x5C29, 0, 0,0x5C2A, + 0, 0,0x5C2B, 0, 0, 0,0x5C2C,0x5C2D, + 0,0x5C2E, 0,0x5C2F, 0,0x5C30, 0, 0, +0x5C31,0x5C32, 0, 0, 0,0x5C33, 0, 0, + 0, 0,0x5C34, 0, 0, 0, 0, 0, + 0, 0,0x5C35, 0, 0, 0, 0, 0, + 0, 0,0x5C36, 0,0x5C37, 0, 0, 0, + 0,0x5C38}; + +/* page 31 0x8898-0x89BC */ +static uint16 tab_uni_jisx021231[]={ +0x5C39, 0,0x5C3A,0x5C3B,0x5C3C, 0, 0,0x5C3D, +0x5C3E, 0, 0, 0, 0, 0, 0, 0, +0x5C3F, 0,0x5C40, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x5C41, 0, 0,0x5C42,0x5C43, 0, +0x5C44, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x5C45,0x5C46,0x5C47,0x5C48,0x5C49, 0, + 0,0x5C4A,0x5C4B,0x5C4C, 0, 0, 0, 0, + 0, 0, 0,0x5C4D, 0, 0,0x5C4E, 0, + 0, 0, 0, 0, 0, 0, 0,0x5C4F, + 0, 0, 0, 0, 0, 0, 0,0x5C50, +0x5C51,0x5C52, 0, 0, 0,0x5C53, 0,0x5C54, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5C55, 0, 0, 0, 0,0x5C56, 0, + 0, 0, 0, 0, 0,0x5C57,0x5C58,0x5C59, + 0, 0, 0, 0, 0,0x5C5A,0x5C5B, 0, +0x5C5C,0x5C5D,0x5C5E, 0,0x5C5F, 0, 0, 0, +0x5C60, 0, 0, 0, 0, 0,0x5C61,0x5C62, +0x5C63, 0, 0, 0, 0, 0, 0, 0, +0x5C64,0x5C65,0x5C66, 0, 0,0x5C67, 0, 0, + 0,0x5C68,0x5C69, 0, 0, 0,0x5C6A, 0, +0x5C6B, 0,0x5C6C, 0, 0,0x5C6D,0x5C6E, 0, + 0,0x5C6F, 0, 0, 0, 0, 0,0x5C70, + 0, 0,0x5C71, 0, 0, 0, 0,0x5C72, + 0, 0,0x5C73,0x5C74,0x5C75, 0, 0, 0, + 0,0x5C76,0x5C77,0x5C78, 0, 0, 0, 0, + 0, 0, 0,0x5C79, 0, 0,0x5C7A, 0, +0x5C7B, 0, 0,0x5C7C, 0,0x5C7D, 0, 0, + 0, 0,0x5C7E,0x5D21,0x5D22,0x5D23, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5D24, 0, 0, 0,0x5D25, 0, 0, +0x5D26, 0, 0, 0,0x5D27,0x5D28, 0, 0, + 0, 0, 0,0x5D29,0x5D2A, 0, 0,0x5D2B, +0x5D2C, 0, 0, 0, 0,0x5D2D, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5D2E, 0, 0, 0,0x5D2F,0x5D30,0x5D31,0x5D32, + 0, 0, 0, 0,0x5D33}; + +/* page 32 0x89D4-0x8B9F */ +static uint16 tab_uni_jisx021232[]={ +0x5D34,0x5D35,0x5D36,0x5D37,0x5D38, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5D39, 0, 0, 0,0x5D3A, 0,0x5D3B, + 0,0x5D3C, 0, 0, 0,0x5D3D, 0,0x5D3E, + 0, 0,0x5D3F, 0, 0,0x5D40, 0, 0, + 0,0x5D41, 0,0x5D42, 0, 0, 0, 0, +0x5D43,0x5D44, 0,0x5D45, 0, 0, 0, 0, + 0, 0, 0,0x5D46, 0,0x5D47,0x5D48, 0, +0x5D49,0x5D4A, 0, 0, 0, 0, 0, 0, + 0, 0,0x5D4B, 0,0x5D4C, 0,0x5D4D, 0, +0x5D4E, 0,0x5D4F, 0, 0, 0, 0,0x5D50, +0x5D51, 0, 0,0x5D52, 0, 0, 0, 0, + 0,0x5D53, 0,0x5D54, 0, 0, 0, 0, + 0,0x5D55,0x5D56, 0,0x5D57, 0, 0,0x5D58, + 0,0x5D59, 0,0x5D5A, 0,0x5D5B, 0, 0, + 0,0x5D5C,0x5D5D, 0, 0, 0, 0,0x5D5E, + 0, 0,0x5D5F,0x5D60,0x5D61, 0, 0, 0, +0x5D62,0x5D63, 0, 0, 0,0x5D64, 0, 0, + 0,0x5D65, 0,0x5D66, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5D67,0x5D68,0x5D69, 0,0x5D6A,0x5D6B,0x5D6C, + 0, 0,0x5D6D,0x5D6E,0x5D6F, 0, 0,0x5D70, + 0, 0,0x5D71, 0, 0, 0, 0,0x5D72, + 0, 0, 0,0x5D73,0x5D74, 0,0x5D75, 0, + 0, 0,0x5D76,0x5D77, 0,0x5D78, 0, 0, + 0, 0, 0,0x5D79, 0, 0, 0, 0, + 0, 0, 0,0x5D7A, 0,0x5D7B, 0, 0, + 0, 0,0x5D7C,0x5D7D, 0, 0, 0,0x5D7E, + 0, 0,0x5E21,0x5E22, 0, 0, 0,0x5E23, + 0, 0,0x5E24, 0, 0, 0, 0,0x5E25, + 0, 0,0x5E26, 0,0x5E27,0x5E28,0x5E29, 0, + 0, 0, 0, 0, 0,0x5E2A, 0,0x5E2B, +0x5E2C,0x5E2D, 0,0x5E2E, 0, 0, 0, 0, + 0,0x5E2F, 0,0x5E30, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5E31, 0, 0, 0,0x5E32, 0, 0, 0, +0x5E33,0x5E34,0x5E35, 0, 0, 0, 0, 0, +0x5E36, 0, 0,0x5E37, 0, 0, 0, 0, + 0,0x5E38,0x5E39, 0, 0, 0,0x5E3F,0x5E3A, + 0, 0, 0, 0, 0,0x5E3B, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5E3C, 0,0x5E3D,0x5E3E, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5E40, 0, 0,0x5E41, 0, 0, 0, + 0, 0, 0,0x5E42, 0, 0, 0, 0, +0x5E43, 0, 0, 0, 0, 0,0x5E44,0x5E45, +0x5E46,0x5E47,0x5E48, 0,0x5E49, 0, 0, 0, + 0,0x5E4E, 0, 0, 0, 0,0x5E4A,0x5E4B, +0x5E4C, 0, 0, 0, 0,0x5E4D, 0, 0, + 0, 0,0x5E4F, 0, 0, 0, 0,0x5E50, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5E51, 0, 0, 0, 0, 0, 0, + 0, 0,0x5E52, 0,0x5E53,0x5E54, 0, 0, +0x5E55, 0,0x5E56, 0, 0,0x5E57, 0, 0, +0x5E58,0x5E59, 0, 0, 0, 0, 0,0x5E5A, + 0,0x5E5B, 0,0x5E5C, 0, 0, 0, 0, +0x5E5D,0x5E5E, 0, 0, 0, 0, 0, 0, +0x5E5F, 0,0x5E60,0x5E61}; + +/* page 33 0x8C38-0x8CA4 */ +static uint16 tab_uni_jisx021233[]={ +0x5E62,0x5E63, 0, 0, 0,0x5E64,0x5E65, 0, + 0, 0, 0, 0, 0,0x5E66, 0,0x5E67, + 0,0x5E68, 0,0x5E69, 0, 0, 0,0x5E6A, + 0,0x5E6B, 0,0x5E6C,0x5E6D, 0, 0,0x5E6E, +0x5E6F,0x5E72, 0,0x5E70, 0,0x5E71, 0, 0, + 0, 0, 0,0x5E73,0x5E74, 0,0x5E75, 0, +0x5E76,0x5E77, 0, 0, 0,0x5E78, 0, 0, + 0, 0, 0,0x5E79, 0,0x5E7A,0x5E7B, 0, + 0, 0, 0,0x5E7C, 0, 0,0x5E7D, 0, + 0, 0, 0, 0, 0, 0,0x5E7E,0x5F21, + 0, 0, 0,0x5F22, 0, 0, 0, 0, +0x5F23, 0,0x5F24,0x5F25, 0, 0, 0, 0, + 0,0x5F26, 0,0x5F27,0x5F28, 0, 0, 0, + 0, 0, 0, 0,0x5F29}; + +/* page 34 0x8CB9-0x8D1B */ +static uint16 tab_uni_jisx021234[]={ +0x5F2A,0x5F2B, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x5F2C,0x5F2D, 0, 0, +0x5F2E, 0,0x5F2F, 0, 0, 0,0x5F30, 0, + 0, 0, 0, 0,0x5F32,0x5F31, 0, 0, +0x5F33, 0, 0, 0,0x5F34, 0, 0, 0, +0x5F35, 0, 0, 0, 0, 0, 0,0x5F36, + 0, 0, 0,0x5F37, 0, 0,0x5F38,0x5F39, + 0,0x5F3A, 0, 0,0x5F3B, 0,0x5F3C,0x5F3D, + 0, 0, 0, 0, 0,0x5F3E,0x5F3F, 0, +0x5F40, 0,0x5F41, 0, 0, 0, 0, 0, +0x5F42, 0, 0, 0, 0, 0, 0, 0, + 0,0x5F43, 0, 0, 0, 0,0x5F44, 0, + 0, 0,0x5F45}; + +/* page 35 0x8D65-0x8F65 */ +static uint16 tab_uni_jisx021235[]={ +0x5F46, 0, 0, 0,0x5F47, 0, 0,0x5F48, + 0,0x5F49, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x5F4A, 0, 0,0x5F4B, 0,0x5F4C, + 0, 0, 0,0x5F4D, 0, 0, 0, 0, +0x5F4E, 0, 0,0x5F4F,0x5F50, 0, 0, 0, +0x5F51, 0, 0, 0, 0, 0, 0, 0, + 0,0x5F52,0x5F53,0x5F54, 0, 0, 0, 0, + 0,0x5F55, 0, 0, 0, 0,0x5F56,0x5F57, + 0, 0,0x5F58, 0, 0,0x5F59, 0, 0, +0x5F5A, 0,0x5F5B, 0,0x5F5C, 0,0x5F5D,0x5F6F, + 0, 0, 0,0x5F5E, 0, 0, 0, 0, +0x5F5F,0x5F60,0x5F61,0x5F62, 0,0x5F63, 0, 0, + 0,0x5F64, 0, 0,0x5F65, 0, 0,0x5F66, +0x5F67, 0,0x5F68, 0,0x5F69, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x5F6A, +0x5F6B, 0,0x5F6C, 0, 0, 0, 0,0x5F6D, + 0, 0, 0,0x5F6E,0x5F70,0x5F71, 0,0x5F72, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5F73, 0, 0, 0,0x5F74, 0, 0,0x5F75, +0x5F76,0x5F77, 0, 0, 0, 0,0x5F78, 0, + 0, 0, 0, 0,0x5F79, 0, 0,0x5F7A, + 0,0x5F7B, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x5F7C,0x5F7D,0x5F7E,0x6021, 0, + 0,0x6022,0x6023, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x6024, 0,0x6025, 0, + 0,0x6026,0x6027,0x6028,0x6029, 0, 0, 0, +0x602A, 0, 0,0x602B,0x602C, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x602D, 0, +0x602E,0x602F,0x6030, 0, 0, 0, 0,0x6031, + 0, 0, 0, 0, 0, 0,0x6032,0x6033, +0x6034,0x6035, 0, 0,0x6036,0x6037, 0, 0, + 0, 0, 0, 0,0x6038, 0, 0,0x6039, +0x603A, 0,0x603B,0x603C,0x603D, 0, 0, 0, + 0, 0, 0, 0,0x603E,0x603F,0x6040, 0, + 0, 0, 0, 0, 0,0x6041,0x6042, 0, + 0, 0, 0, 0,0x6043, 0, 0, 0, + 0, 0, 0,0x6044, 0,0x6045, 0, 0, +0x6046, 0, 0, 0, 0,0x6047,0x6048, 0, +0x6049,0x604A, 0, 0, 0,0x604B, 0, 0, + 0, 0,0x604C, 0,0x604D, 0, 0, 0, +0x604E,0x604F, 0, 0, 0, 0,0x6050, 0, +0x6051, 0, 0, 0, 0,0x6052,0x6053, 0, + 0, 0, 0,0x6054,0x6055, 0,0x6056,0x6057, + 0, 0,0x6058, 0, 0, 0, 0, 0, + 0, 0,0x6059, 0,0x605A, 0, 0,0x605B, + 0, 0, 0, 0, 0, 0, 0,0x605C, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x605D, 0, 0, 0, 0, +0x6064,0x605E, 0,0x605F,0x6060, 0, 0, 0, + 0, 0,0x6061, 0,0x6062,0x6063, 0, 0, + 0, 0, 0,0x6065, 0,0x6066, 0, 0, + 0, 0,0x6067,0x6068, 0, 0, 0, 0, + 0, 0,0x6069,0x606A, 0, 0, 0, 0, + 0,0x606B,0x606C,0x606D, 0, 0, 0, 0, + 0,0x606E, 0,0x606F,0x6070, 0,0x6071, 0, +0x6072, 0,0x6073,0x6074, 0, 0, 0,0x6075, +0x6076,0x6077, 0, 0, 0, 0, 0,0x6078, +0x6079,0x607A,0x607B, 0, 0,0x607C, 0, 0, + 0, 0, 0,0x607D,0x607E, 0,0x6121, 0, + 0, 0,0x6122, 0, 0, 0, 0, 0, + 0, 0,0x6123, 0,0x6124,0x6125,0x6126,0x6127, +0x6128, 0, 0,0x6129, 0, 0, 0, 0, +0x612A,0x612B, 0, 0, 0, 0, 0, 0, +0x612C}; + +/* page 36 0x8F9D-0x9484 */ +static uint16 tab_uni_jisx021236[]={ +0x612D, 0, 0,0x612E,0x612F, 0, 0,0x6130, +0x6131,0x6132, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6133,0x6134, 0,0x6135, 0, 0, 0, 0, + 0,0x6136, 0,0x6137,0x6138, 0, 0, 0, + 0,0x6139, 0, 0, 0,0x613A,0x613B, 0, +0x613C, 0, 0,0x613D, 0,0x613E,0x613F, 0, +0x6140, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x6141, 0, 0,0x6142,0x6143, + 0, 0, 0,0x6144, 0, 0, 0, 0, + 0,0x6145, 0, 0,0x6146, 0, 0, 0, +0x6147,0x6148, 0, 0, 0, 0,0x6149, 0, + 0,0x614A, 0, 0, 0,0x614B, 0,0x614C, + 0, 0, 0,0x614D, 0, 0, 0,0x614E, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x614F, 0, 0,0x6150, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x6151,0x6152,0x6154, 0,0x6155, +0x6156, 0,0x6153, 0, 0, 0,0x6157,0x6158, + 0, 0,0x6159, 0, 0, 0, 0, 0, + 0, 0,0x615A, 0, 0, 0,0x615B,0x615C, + 0, 0, 0, 0, 0, 0, 0,0x615D, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x615E, 0, +0x615F, 0, 0, 0, 0,0x6160, 0, 0, + 0,0x6161,0x6162, 0, 0, 0, 0,0x6163, + 0, 0, 0,0x6164, 0, 0, 0,0x6165, + 0, 0, 0, 0,0x6166, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6167, 0, 0,0x6168, 0, 0,0x6169,0x616A, + 0,0x616B, 0,0x616C, 0, 0, 0, 0, +0x616D, 0,0x616E,0x616F,0x6170, 0,0x6171, 0, + 0, 0, 0,0x6172,0x6173,0x6174, 0, 0, +0x6175, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x6176, 0,0x6177,0x6178,0x6179, + 0,0x617A, 0, 0, 0, 0, 0, 0, +0x617B,0x617D, 0, 0, 0, 0,0x617E,0x6221, +0x6222, 0,0x6223,0x6224, 0, 0, 0,0x617C, + 0, 0, 0, 0, 0,0x622D, 0, 0, +0x6225, 0,0x6226,0x6227,0x6228, 0, 0,0x6229, +0x622A, 0,0x622B, 0, 0, 0, 0, 0, +0x622C, 0, 0, 0, 0, 0,0x622F, 0, + 0, 0,0x6230,0x6231, 0, 0, 0,0x6232, + 0,0x622E, 0, 0, 0, 0, 0, 0, + 0,0x6233,0x6234,0x6235, 0, 0, 0,0x6236, +0x6237,0x6238, 0,0x6239, 0, 0, 0, 0, +0x623A, 0, 0,0x623B, 0, 0, 0,0x623C, + 0,0x623D,0x623E,0x623F, 0,0x6240, 0,0x6241, + 0,0x6242, 0,0x6243, 0,0x6245,0x6246, 0, +0x6244, 0,0x6247, 0,0x6248, 0, 0, 0, + 0,0x6249,0x624A, 0,0x624B, 0, 0,0x624C, + 0,0x624D,0x624E, 0,0x624F,0x6250, 0,0x6251, +0x6252, 0, 0, 0, 0, 0,0x6253, 0, + 0, 0,0x6254,0x6255, 0, 0, 0, 0, + 0, 0,0x6256, 0, 0, 0,0x6257, 0, + 0, 0,0x6258, 0,0x6259,0x625A,0x625B, 0, + 0, 0, 0, 0,0x625C, 0, 0,0x625D, + 0, 0,0x625E, 0, 0, 0, 0, 0, +0x625F, 0, 0, 0, 0, 0, 0,0x6260, + 0, 0, 0, 0,0x6261,0x6262,0x6263, 0, + 0, 0, 0, 0,0x6264, 0,0x6265, 0, +0x6266,0x6267, 0, 0, 0,0x6268, 0, 0, + 0,0x6269, 0, 0,0x626A, 0,0x626B,0x626C, +0x626D, 0, 0,0x626E, 0, 0, 0, 0, + 0,0x626F, 0, 0,0x6270, 0, 0, 0, + 0,0x6271, 0,0x6272, 0, 0, 0,0x6273, +0x6274,0x6275, 0,0x6276,0x6277,0x6278,0x6279, 0, + 0,0x627A, 0, 0, 0, 0,0x627B,0x627C, +0x627D, 0,0x627E, 0, 0,0x6321,0x6322, 0, +0x6323, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x6324,0x6325, + 0, 0,0x6326, 0,0x6327,0x6328, 0, 0, + 0,0x6329, 0, 0, 0, 0, 0,0x632A, +0x632B, 0, 0, 0,0x632C,0x632D, 0,0x632E, +0x632F,0x6330,0x6331,0x6332,0x6333, 0, 0, 0, + 0, 0,0x6334, 0,0x6335, 0,0x6336, 0, +0x6337, 0, 0,0x6338,0x6339, 0, 0,0x633A, +0x633B,0x633C,0x633D, 0,0x633E,0x633F, 0,0x6340, + 0, 0, 0,0x6341, 0,0x6342,0x6343, 0, + 0,0x6344, 0,0x6345, 0, 0, 0,0x6346, +0x6347, 0, 0, 0, 0, 0,0x6348,0x6349, +0x634A,0x634B, 0,0x634C, 0, 0, 0, 0, + 0,0x634D,0x634E,0x634F, 0, 0,0x6350, 0, +0x6351,0x6352, 0,0x6353,0x6354,0x6355, 0,0x6356, + 0,0x6357, 0,0x6358, 0,0x6359,0x635A, 0, + 0,0x635B,0x635C, 0, 0,0x635D, 0, 0, +0x635E,0x635F,0x6360, 0,0x6361, 0, 0, 0, + 0, 0, 0,0x6362,0x6363, 0, 0,0x6364, +0x6365, 0, 0,0x6366,0x6367, 0, 0, 0, +0x6368, 0,0x6369,0x636A,0x636B, 0, 0, 0, + 0,0x636C,0x636D,0x636E, 0, 0, 0, 0, +0x636F,0x6370,0x6371,0x6372,0x6373, 0,0x6374,0x6375, +0x6376, 0,0x6377, 0, 0, 0, 0, 0, + 0, 0, 0,0x6378,0x6379,0x637A, 0, 0, +0x637B,0x637C, 0, 0, 0,0x637D, 0, 0, + 0, 0,0x637E, 0,0x6421, 0, 0, 0, + 0, 0,0x6422,0x6423, 0, 0, 0,0x6424, +0x6425, 0,0x6426,0x6427, 0, 0,0x6428, 0, + 0, 0,0x6429, 0, 0,0x642A, 0, 0, + 0,0x642B, 0,0x642C, 0,0x642D,0x642E,0x642F, +0x6430, 0,0x6431,0x6432,0x6433,0x6434,0x6435, 0, +0x6436,0x6437,0x6438,0x6439, 0, 0,0x643A,0x643B, +0x643C,0x643D, 0,0x643E, 0, 0,0x643F, 0, +0x6440, 0,0x6441,0x6442,0x6443, 0, 0,0x6444, +0x6445, 0,0x6446,0x6447,0x6448, 0,0x6449, 0, +0x644A, 0,0x644B,0x644C, 0, 0, 0,0x644D, + 0,0x644E, 0,0x644F, 0, 0, 0, 0, + 0, 0, 0, 0,0x6450, 0,0x6451, 0, + 0, 0,0x6452,0x6453, 0,0x6454, 0, 0, + 0, 0, 0,0x6455, 0, 0, 0, 0, +0x6456, 0, 0, 0,0x6457, 0, 0,0x6458, +0x6459, 0, 0, 0, 0, 0, 0,0x645A, +0x645B,0x645C,0x645D, 0,0x645E, 0, 0,0x645F, +0x6460, 0,0x6461, 0,0x6462,0x6463, 0, 0, + 0, 0, 0, 0, 0, 0,0x6464,0x6465, + 0,0x6466,0x6467, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x6468,0x6469,0x646A, 0, 0, 0, + 0, 0, 0,0x646B,0x646C,0x646D, 0, 0, +0x646E, 0,0x646F,0x6470, 0,0x6471, 0, 0, + 0,0x6472, 0, 0, 0, 0, 0,0x6473, +0x6474, 0,0x6475, 0,0x6476,0x6477, 0, 0, +0x6478, 0,0x6479,0x647A,0x647B, 0,0x647C,0x647D, + 0,0x647E, 0, 0, 0,0x6521, 0, 0, +0x6522, 0,0x6523,0x6524,0x6525,0x6526, 0, 0, + 0, 0, 0,0x6527, 0,0x6528,0x6529, 0, +0x652A, 0,0x652B, 0, 0,0x652C, 0, 0, +0x652D, 0, 0,0x652E, 0, 0,0x652F, 0, + 0,0x6530, 0, 0,0x6531, 0,0x6532,0x6533, + 0,0x6534, 0,0x6535,0x653B, 0,0x6536, 0, + 0, 0, 0, 0, 0, 0, 0,0x6537, +0x6538,0x6539, 0, 0, 0,0x653A, 0, 0, + 0, 0, 0, 0,0x653C, 0, 0,0x653D, +0x653E,0x653F,0x6540, 0,0x6541,0x6542,0x6543,0x6544, +0x6545, 0, 0, 0, 0, 0,0x6546, 0, + 0, 0, 0, 0,0x6547, 0, 0,0x6548, + 0,0x6549,0x654A, 0, 0,0x654B, 0, 0, + 0,0x654C,0x654D, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x654F,0x6550,0x654E,0x6551,0x6552, 0, +0x6553, 0, 0, 0,0x6554,0x6555, 0,0x6556, + 0, 0, 0,0x6557,0x6558, 0, 0, 0, +0x6559,0x655A,0x655B, 0, 0, 0, 0, 0, +0x655C,0x655D,0x655E, 0, 0, 0, 0, 0, + 0, 0,0x655F, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6560,0x6561, 0,0x6562,0x6563,0x6564,0x6565, + 0, 0, 0, 0, 0, 0,0x6566, 0, +0x6568, 0,0x6567, 0, 0, 0,0x6569, 0, +0x656A, 0, 0,0x656B, 0,0x656C, 0,0x656D, + 0, 0, 0, 0, 0, 0, 0, 0, +0x656E, 0, 0, 0,0x656F, 0, 0,0x6570, + 0, 0,0x6571, 0,0x6572, 0,0x6573, 0, + 0, 0, 0,0x6574, 0, 0,0x6575, 0, +0x6576,0x6577,0x6578, 0,0x6579,0x657A, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x657C,0x657B +}; + +/* page 37 0x9578-0x95E6 */ +static uint16 tab_uni_jisx021237[]={ +0x657D,0x657E, 0, 0, 0, 0,0x6621, 0, + 0, 0, 0, 0,0x6622, 0, 0, 0, +0x6623, 0, 0, 0,0x6624,0x6625,0x6626, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x6627,0x6628,0x6629, + 0,0x662A, 0, 0, 0, 0,0x662B, 0, + 0,0x662C, 0,0x662D,0x662E, 0, 0, 0, + 0, 0, 0, 0,0x662F, 0,0x6630, 0, + 0, 0,0x6631, 0, 0,0x6632, 0,0x6633, + 0, 0, 0, 0, 0, 0,0x6634, 0, +0x6635,0x6636, 0,0x6637, 0, 0, 0, 0, +0x6638,0x6639,0x663A,0x663B, 0, 0, 0, 0, + 0,0x663C,0x663D, 0, 0,0x663E,0x663F,0x6640, +0x6641, 0, 0, 0,0x6642, 0,0x6643}; + +/* page 38 0x961D-0x986C */ +static uint16 tab_uni_jisx021238[]={ +0x6644,0x6645, 0, 0, 0,0x6646, 0,0x6647, +0x6648,0x6649, 0, 0, 0, 0, 0,0x664A, + 0, 0, 0, 0,0x664B, 0,0x664C, 0, + 0, 0,0x664D,0x664E,0x664F,0x6650, 0,0x6651, +0x6652, 0, 0, 0,0x6653, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x6654, 0,0x6655, + 0,0x6656,0x6657,0x6658, 0, 0, 0, 0, + 0, 0, 0, 0,0x6659, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x665A, 0, 0, 0, 0, 0,0x665B, + 0, 0, 0, 0, 0, 0,0x665C,0x665D, + 0,0x665E,0x665F, 0,0x6660,0x6661,0x6662,0x6663, + 0, 0, 0, 0,0x6664, 0, 0, 0, + 0, 0, 0, 0,0x6665, 0, 0, 0, + 0,0x6666, 0, 0, 0,0x6667, 0, 0, +0x6668, 0,0x6669, 0, 0, 0, 0,0x666A, +0x666B,0x666C, 0, 0,0x666D, 0, 0, 0, + 0,0x666E,0x666F, 0, 0, 0,0x6670, 0, + 0, 0, 0, 0, 0,0x6671, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x6672, 0, 0, + 0, 0, 0, 0, 0,0x6673, 0, 0, + 0, 0, 0,0x6675, 0,0x6676, 0, 0, +0x6677,0x6678,0x6679, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x667A, 0, 0, 0, + 0, 0,0x667B, 0,0x667C, 0, 0, 0, + 0, 0, 0, 0, 0,0x667D, 0, 0, + 0, 0, 0, 0, 0,0x667E,0x6721, 0, +0x6722, 0, 0, 0,0x6723, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x6724,0x6725, 0, +0x6726, 0, 0, 0,0x6727,0x6728,0x6729, 0, + 0, 0, 0,0x672A, 0, 0, 0, 0, + 0, 0, 0, 0,0x672B, 0,0x672C, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x672D, 0,0x672E, 0, + 0, 0, 0, 0, 0,0x672F, 0, 0, + 0,0x6730,0x6731, 0, 0, 0, 0, 0, +0x6732, 0,0x6733,0x6734, 0,0x6735,0x6736, 0, + 0, 0, 0, 0, 0, 0,0x6737, 0, + 0, 0,0x6738, 0, 0,0x6739, 0, 0, + 0,0x673A, 0, 0, 0, 0,0x673B, 0, + 0,0x673C,0x673D,0x673E, 0, 0,0x673F, 0, +0x6740, 0,0x6741,0x6742, 0, 0, 0, 0, + 0, 0, 0, 0,0x6743, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6744,0x6745,0x6746, 0,0x6747,0x6748, 0, 0, + 0,0x6749,0x674A, 0, 0,0x674B, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x674C, + 0,0x674D, 0, 0,0x674E,0x674F, 0, 0, +0x6750,0x6751, 0,0x6752,0x6753,0x6754, 0,0x6755, + 0,0x6756,0x6757, 0,0x6758, 0, 0,0x6759, +0x675A, 0,0x675B, 0,0x675C,0x675D, 0,0x675E, +0x675F,0x6760, 0,0x6761,0x6762, 0, 0,0x6763, + 0, 0,0x6764,0x6765,0x6766, 0,0x676A, 0, +0x6767,0x6768, 0,0x6769,0x676B, 0, 0,0x676C, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x676D, 0,0x676E, 0, 0,0x676F, + 0, 0,0x6770,0x6771, 0,0x6772, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x6773, 0, 0,0x6774, 0, 0, +0x6776,0x6777, 0, 0, 0, 0, 0,0x6778, + 0,0x6779, 0, 0,0x6775, 0, 0,0x677A, + 0,0x677B, 0,0x677C, 0, 0,0x677D, 0, +0x6828,0x677E, 0, 0, 0, 0,0x6821, 0, + 0,0x6822,0x6823,0x6824, 0,0x6825,0x6826, 0, +0x6827, 0, 0, 0, 0, 0, 0, 0, + 0,0x6829, 0, 0, 0, 0, 0,0x682A, + 0, 0,0x682B, 0, 0,0x682C, 0, 0, + 0, 0, 0, 0,0x682D,0x682E,0x682F, 0, + 0,0x6830,0x6831, 0,0x6832,0x6833, 0, 0, + 0, 0, 0, 0, 0,0x6834,0x6835, 0, +0x6836,0x6837, 0, 0, 0,0x6838, 0,0x6839 +}; + +/* page 39 0x98AB-0x98CC */ +static uint16 tab_uni_jisx021239[]={ +0x683A, 0,0x683B,0x683C, 0,0x683D, 0, 0, + 0,0x683E, 0, 0,0x683F,0x6840, 0,0x6841, +0x6842, 0, 0, 0,0x6843, 0, 0,0x6844, + 0, 0,0x6845, 0, 0,0x6846, 0, 0, + 0,0x6847}; + +/* page 40 0x98E1-0x9960 */ +static uint16 tab_uni_jisx021240[]={ +0x6848, 0,0x6849, 0,0x684A,0x684B,0x684C, 0, + 0,0x684D, 0, 0, 0, 0, 0, 0, + 0, 0,0x684E, 0, 0,0x684F, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6850, 0, 0, 0, 0,0x6851,0x6852, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6853, 0, 0, 0,0x6854,0x6855,0x6856, 0, + 0,0x6857,0x6858,0x6859, 0, 0,0x685A, 0, + 0,0x685B, 0, 0, 0,0x685C,0x685D, 0, + 0, 0,0x685E, 0, 0, 0, 0, 0, +0x685F,0x6860,0x6861,0x6862,0x6863, 0, 0, 0, +0x6864,0x6865,0x6866,0x6867, 0, 0, 0,0x6868, +0x6869, 0, 0, 0, 0,0x686A,0x686B,0x686C, + 0, 0, 0, 0,0x686D,0x686E, 0, 0, + 0, 0, 0,0x686F, 0, 0, 0,0x6870, +0x6871, 0,0x6872,0x6873, 0,0x6874,0x6875,0x6876 +}; + +/* page 41 0x999B-0x9A5D */ +static uint16 tab_uni_jisx021241[]={ +0x6877, 0,0x6878, 0,0x6879, 0, 0, 0, + 0, 0, 0,0x687A, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x687B,0x687C,0x687D, + 0, 0,0x687E, 0, 0, 0,0x6921,0x6922, + 0, 0,0x6923, 0,0x6924, 0, 0, 0, +0x6925, 0, 0, 0, 0, 0,0x6926, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6927,0x6928, 0, 0, 0, 0,0x6929,0x692A, + 0,0x692B, 0,0x692C, 0, 0, 0, 0, + 0, 0, 0, 0,0x692D, 0, 0,0x692E, +0x692F,0x6930, 0, 0, 0,0x6931, 0, 0, + 0,0x6932,0x6933, 0, 0, 0,0x6934, 0, + 0, 0,0x6935,0x6936, 0, 0, 0,0x6937, +0x6938,0x6939, 0, 0, 0, 0, 0, 0, +0x693A,0x693B, 0, 0, 0,0x693C,0x693D, 0, + 0, 0, 0,0x693E, 0, 0, 0, 0, + 0, 0, 0,0x693F, 0,0x6940, 0,0x6941, +0x6942,0x6943, 0, 0,0x6944, 0, 0, 0, + 0, 0,0x6945,0x6946, 0, 0, 0, 0, +0x6947, 0,0x6948,0x6949, 0,0x694A, 0, 0, + 0, 0, 0, 0, 0, 0,0x694C, 0, + 0,0x694D, 0, 0,0x694B, 0, 0,0x694E, +0x694F,0x6950, 0,0x6951, 0, 0,0x6952, 0, + 0,0x6953, 0,0x6954, 0, 0, 0, 0, + 0, 0,0x6955}; + +/* page 42 0x9AAA-0x9C7B */ +static uint16 tab_uni_jisx021242[]={ +0x6956, 0,0x6957, 0,0x6958,0x6959, 0, 0, +0x695A, 0,0x695B,0x695C,0x695D, 0, 0,0x695E, + 0,0x695F, 0, 0,0x6960,0x6961, 0,0x6962, + 0,0x6963, 0, 0,0x6964, 0,0x6965, 0, + 0, 0, 0, 0,0x6966, 0,0x6967, 0, +0x6968, 0, 0,0x6969,0x696A,0x696B, 0, 0, + 0,0x696C,0x696D, 0, 0, 0,0x696E, 0, + 0, 0,0x696F,0x6970, 0,0x6971, 0,0x6972, + 0, 0,0x6973, 0, 0, 0, 0, 0, +0x6974,0x6975, 0,0x6976, 0, 0, 0,0x6977, +0x6978, 0, 0,0x6979, 0,0x697A,0x697B,0x697C, +0x697D,0x697E,0x6A21,0x6A22, 0, 0,0x6A23,0x6A24, + 0,0x6A25,0x6A26,0x6A27,0x6A28, 0,0x6A29, 0, +0x6A2A, 0, 0, 0,0x6A2B, 0, 0,0x6A2C, + 0,0x6A2D,0x6A2E, 0, 0, 0,0x6A2F, 0, + 0, 0, 0, 0,0x6A30, 0, 0, 0, + 0,0x6A31, 0,0x6A32, 0, 0, 0, 0, + 0,0x6A33,0x6A34,0x6A35, 0,0x6A36, 0,0x6A37, +0x6A38, 0, 0,0x6A39, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x6A3A, 0, + 0,0x6A3B,0x6A3C, 0, 0, 0, 0, 0, + 0, 0, 0,0x6A3D,0x6A3E,0x6A3F, 0, 0, + 0,0x6A40, 0, 0,0x6A41, 0, 0,0x6A42, + 0,0x6A43, 0,0x6A44,0x6A45, 0,0x6A46, 0, +0x6A47,0x6A48,0x6A49,0x6A4A,0x6A4B, 0, 0, 0, + 0,0x6A4C, 0,0x6A4D, 0,0x6A4E,0x6A4F,0x6A50, + 0, 0, 0, 0, 0,0x6A51,0x6A52, 0, + 0, 0,0x6A53,0x6A54,0x6A55,0x6A56, 0,0x6A57, +0x6A58,0x6A59, 0,0x6A5A, 0,0x6A5B,0x6A5C, 0, + 0, 0,0x6A5D, 0, 0, 0, 0, 0, +0x6A5E, 0, 0,0x6A5F,0x6A60, 0, 0, 0, + 0, 0, 0, 0,0x6A61,0x6A62, 0,0x6A63, + 0, 0,0x6A64, 0, 0, 0,0x6A65,0x6A66, +0x6A67, 0, 0, 0, 0,0x6A68,0x6A69, 0, + 0,0x6A6A,0x6A6B, 0,0x6A6C,0x6A6D, 0,0x6A6E, + 0, 0, 0, 0, 0,0x6A6F,0x6A70, 0, + 0, 0, 0, 0,0x6A71, 0,0x6A72, 0, + 0, 0, 0, 0, 0,0x6A73,0x6A74, 0, + 0, 0, 0,0x6A75, 0,0x6A76, 0, 0, + 0, 0, 0,0x6A77, 0,0x6A78, 0, 0, +0x6A79,0x6A7A, 0, 0, 0,0x6A7B, 0, 0, + 0,0x6A7C, 0, 0, 0,0x6A7D,0x6A7E,0x6B21, +0x6B22, 0, 0,0x6B23, 0,0x6B24,0x6B25, 0, +0x6B26, 0, 0, 0, 0, 0, 0, 0, + 0,0x6B27, 0, 0, 0,0x6B28, 0,0x6B29, + 0, 0, 0, 0,0x6B2A, 0,0x6B2B,0x6B2C, +0x6B2D, 0,0x6B2E, 0,0x6B2F, 0, 0, 0, +0x6B30,0x6B31, 0, 0,0x6B32,0x6B33,0x6B34,0x6B35, +0x6B36, 0, 0, 0, 0, 0, 0,0x6B37, + 0, 0, 0,0x6B38,0x6B39,0x6B3A, 0, 0, + 0, 0, 0,0x6B3B, 0, 0, 0,0x6B3C, + 0,0x6B3D,0x6B3E,0x6B3F, 0, 0, 0,0x6B40, +0x6B41, 0, 0, 0,0x6B42,0x6B43,0x6B44, 0, + 0,0x6B45,0x6B46, 0,0x6B47, 0,0x6B48, 0, + 0,0x6B49,0x6B50,0x6B4A,0x6B4B,0x6B4C, 0, 0, + 0,0x6B4D, 0, 0, 0, 0,0x6B52,0x6B4E, +0x6B4F,0x6B51, 0, 0,0x6B53, 0,0x6B54, 0, +0x6B55, 0, 0,0x6B56, 0,0x6B57, 0, 0, + 0,0x6B58}; + +/* page 43 0x9CE6-0x9E1D */ +static uint16 tab_uni_jisx021243[]={ +0x6B59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x6B5A, 0, 0, 0, + 0,0x6B5B, 0,0x6B5C, 0, 0, 0, 0, + 0, 0, 0, 0,0x6B5E, 0, 0, 0, + 0, 0, 0, 0, 0,0x6B5D, 0, 0, + 0, 0, 0,0x6B5F, 0, 0, 0, 0, + 0,0x6B60,0x6B61, 0, 0, 0,0x6B62,0x6B63, +0x6B64, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6B65,0x6B66, 0,0x6B67,0x6B68,0x6B69, 0, + 0, 0, 0, 0,0x6B6A, 0,0x6B6B,0x6B6D, + 0, 0, 0, 0,0x6B6E,0x6B6F, 0,0x6B6C, + 0,0x6B70, 0, 0,0x6B71, 0, 0, 0, + 0, 0, 0, 0, 0,0x6B72,0x6B73, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6B74, 0, 0,0x6B76,0x6B75, 0,0x6B77, + 0, 0, 0,0x6B78,0x6B79,0x6B7A, 0, 0, + 0, 0,0x6B7B, 0, 0, 0, 0, 0, +0x6B7C,0x6B7D, 0, 0, 0,0x6B7E,0x6C21, 0, +0x6C22, 0, 0, 0, 0,0x6C23,0x6C24, 0, +0x6C25, 0, 0, 0,0x6C26, 0, 0,0x6C27, +0x6C28, 0, 0, 0,0x6C29,0x6C2A, 0,0x6C2B, +0x6C2C,0x6C2D,0x6C2E, 0, 0, 0, 0, 0, + 0, 0, 0,0x6C2F, 0, 0, 0, 0, + 0, 0, 0, 0,0x6C30, 0,0x6C31, 0, +0x6C32, 0, 0,0x6C33, 0, 0, 0,0x6C34, + 0, 0, 0,0x6C35, 0, 0,0x6C36, 0, + 0,0x6C37, 0, 0, 0,0x6C38, 0, 0, + 0,0x6C39, 0,0x6C3A,0x6C3B, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x6C3C,0x6C3D, +0x6C3E,0x6C3F, 0, 0,0x6C40, 0, 0, 0, +0x6C41,0x6C42,0x6C43, 0, 0, 0, 0,0x6C44, + 0,0x6C45, 0,0x6C46, 0,0x6C47, 0, 0, +0x6C48, 0,0x6C49, 0, 0,0x6C4A,0x6C4B, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6C4C, 0, 0, 0,0x6C4E, 0, 0, 0, + 0,0x6C4F, 0, 0,0x6C4D, 0, 0, 0, +0x6C50, 0,0x6C51,0x6C52,0x6C53, 0, 0,0x6C54, +0x6C55, 0, 0,0x6C56, 0, 0,0x6C57,0x6C58 +}; + +/* page 44 0x9E7A-0x9FA5 */ +static uint16 tab_uni_jisx021244[]={ +0x6C59,0x6C5A,0x6C5B, 0, 0, 0,0x6C5C, 0, +0x6C5D,0x6C5E,0x6C5F,0x6C60, 0,0x6C61, 0, 0, + 0, 0, 0, 0,0x6C62,0x6C63, 0, 0, + 0, 0, 0, 0,0x6C64, 0,0x6C65, 0, + 0,0x6C66, 0, 0,0x6C67, 0, 0, 0, + 0, 0,0x6C68, 0, 0, 0,0x6C69, 0, + 0, 0,0x6C6A, 0,0x6C6B,0x6C6C,0x6C6D, 0, + 0,0x6C6E,0x6C6F,0x6C70, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x6C71, 0,0x6C72, 0, + 0,0x6C73, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x6C74, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x6C75, 0, 0, + 0, 0,0x6C76, 0, 0,0x6C77, 0, 0, + 0, 0,0x6C78,0x6C79,0x6C7A, 0,0x6C7B,0x6C7C, +0x6C7D, 0, 0,0x6C7E, 0, 0,0x6D21, 0, + 0, 0, 0, 0, 0,0x6D22, 0, 0, +0x6D23,0x6D24, 0, 0, 0, 0, 0,0x6D25, + 0, 0, 0, 0, 0,0x6D26,0x6D27,0x6D28, +0x6D29, 0,0x6D2A, 0,0x6D2B,0x6D2C, 0,0x6D2D, +0x6D2E,0x6D2F, 0, 0, 0,0x6D30, 0, 0, +0x6D31, 0, 0, 0,0x6D32, 0, 0, 0, +0x6D33,0x6D34, 0, 0, 0,0x6D35, 0,0x6D36, +0x6D37, 0,0x6D38, 0, 0,0x6D39, 0,0x6D3A, +0x6D3B, 0,0x6D3C,0x6D3D, 0,0x6D3E, 0,0x6D3F, + 0,0x6D40,0x6D41,0x6D42,0x6D43,0x6D44, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6D45, 0,0x6D46,0x6D47,0x6D48,0x6D49, 0, +0x6D4A, 0, 0,0x6D4B,0x6D4C, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x6D4D,0x6D4E, + 0, 0, 0,0x6D4F,0x6D50,0x6D51,0x6D52,0x6D53, + 0,0x6D54, 0,0x6D55, 0, 0, 0, 0, +0x6D56, 0, 0,0x6D57, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x6D58,0x6D59,0x6D5A, +0x6D5B, 0,0x6D5C, 0,0x6D5D,0x6D5E, 0, 0, + 0, 0, 0, 0,0x6D5F, 0, 0,0x6D60, +0x6D61,0x6D62, 0,0x6D63}; + +static int +my_uni_jisx0212_onechar(int code){ + if ((code>=0x007E)&&(code<=0x007E)) + return(tab_uni_jisx02120[code-0x007E]); + if ((code>=0x00A1)&&(code<=0x017E)) + return(tab_uni_jisx02121[code-0x00A1]); + if ((code>=0x01CD)&&(code<=0x01DC)) + return(tab_uni_jisx02122[code-0x01CD]); + if ((code>=0x01F5)&&(code<=0x01F5)) + return(tab_uni_jisx02123[code-0x01F5]); + if ((code>=0x02C7)&&(code<=0x02DD)) + return(tab_uni_jisx02124[code-0x02C7]); + if ((code>=0x0384)&&(code<=0x0390)) + return(tab_uni_jisx02125[code-0x0384]); + if ((code>=0x03AA)&&(code<=0x03CE)) + return(tab_uni_jisx02126[code-0x03AA]); + if ((code>=0x0402)&&(code<=0x040F)) + return(tab_uni_jisx02127[code-0x0402]); + if ((code>=0x0452)&&(code<=0x045F)) + return(tab_uni_jisx02128[code-0x0452]); + if ((code>=0x2116)&&(code<=0x2122)) + return(tab_uni_jisx02129[code-0x2116]); + if ((code>=0x4E02)&&(code<=0x4F19)) + return(tab_uni_jisx021210[code-0x4E02]); + if ((code>=0x4F2E)&&(code<=0x5166)) + return(tab_uni_jisx021211[code-0x4F2E]); + if ((code>=0x517E)&&(code<=0x5515)) + return(tab_uni_jisx021212[code-0x517E]); + if ((code>=0x552A)&&(code<=0x5566)) + return(tab_uni_jisx021213[code-0x552A]); + if ((code>=0x557F)&&(code<=0x5C36)) + return(tab_uni_jisx021214[code-0x557F]); + if ((code>=0x5C59)&&(code<=0x5EEB)) + return(tab_uni_jisx021215[code-0x5C59]); + if ((code>=0x5F02)&&(code<=0x6149)) + return(tab_uni_jisx021216[code-0x5F02]); + if ((code>=0x615E)&&(code<=0x6290)) + return(tab_uni_jisx021217[code-0x615E]); + if ((code>=0x62A6)&&(code<=0x679B)) + return(tab_uni_jisx021218[code-0x62A6]); + if ((code>=0x67B0)&&(code<=0x67F9)) + return(tab_uni_jisx021219[code-0x67B0]); + if ((code>=0x6814)&&(code<=0x6917)) + return(tab_uni_jisx021220[code-0x6814]); + if ((code>=0x6931)&&(code<=0x6D3F)) + return(tab_uni_jisx021221[code-0x6931]); + if ((code>=0x6D57)&&(code<=0x6E04)) + return(tab_uni_jisx021222[code-0x6D57]); + if ((code>=0x6E1E)&&(code<=0x6ECF)) + return(tab_uni_jisx021223[code-0x6E1E]); + if ((code>=0x6EEB)&&(code<=0x70E4)) + return(tab_uni_jisx021224[code-0x6EEB]); + if ((code>=0x70FA)&&(code<=0x71DC)) + return(tab_uni_jisx021225[code-0x70FA]); + if ((code>=0x71F8)&&(code<=0x7E9E)) + return(tab_uni_jisx021226[code-0x71F8]); + if ((code>=0x7F3B)&&(code<=0x8044)) + return(tab_uni_jisx021227[code-0x7F3B]); + if ((code>=0x8060)&&(code<=0x8357)) + return(tab_uni_jisx021228[code-0x8060]); + if ((code>=0x8370)&&(code<=0x8419)) + return(tab_uni_jisx021229[code-0x8370]); + if ((code>=0x842F)&&(code<=0x8880)) + return(tab_uni_jisx021230[code-0x842F]); + if ((code>=0x8898)&&(code<=0x89BC)) + return(tab_uni_jisx021231[code-0x8898]); + if ((code>=0x89D4)&&(code<=0x8B9F)) + return(tab_uni_jisx021232[code-0x89D4]); + if ((code>=0x8C38)&&(code<=0x8CA4)) + return(tab_uni_jisx021233[code-0x8C38]); + if ((code>=0x8CB9)&&(code<=0x8D1B)) + return(tab_uni_jisx021234[code-0x8CB9]); + if ((code>=0x8D65)&&(code<=0x8F65)) + return(tab_uni_jisx021235[code-0x8D65]); + if ((code>=0x8F9D)&&(code<=0x9484)) + return(tab_uni_jisx021236[code-0x8F9D]); + if ((code>=0x9578)&&(code<=0x95E6)) + return(tab_uni_jisx021237[code-0x9578]); + if ((code>=0x961D)&&(code<=0x986C)) + return(tab_uni_jisx021238[code-0x961D]); + if ((code>=0x98AB)&&(code<=0x98CC)) + return(tab_uni_jisx021239[code-0x98AB]); + if ((code>=0x98E1)&&(code<=0x9960)) + return(tab_uni_jisx021240[code-0x98E1]); + if ((code>=0x999B)&&(code<=0x9A5D)) + return(tab_uni_jisx021241[code-0x999B]); + if ((code>=0x9AAA)&&(code<=0x9C7B)) + return(tab_uni_jisx021242[code-0x9AAA]); + if ((code>=0x9CE6)&&(code<=0x9E1D)) + return(tab_uni_jisx021243[code-0x9CE6]); + if ((code>=0x9E7A)&&(code<=0x9FA5)) + return(tab_uni_jisx021244[code-0x9E7A]); + return(0); +} + + +/* page 0 0x222F-0x2244 */ +static uint16 tab_jisx0212_uni0[]={ +0x02D8,0x02C7,0x00B8,0x02D9,0x02DD,0x00AF,0x02DB,0x02DA, +0x007E,0x0384,0x0385, 0, 0, 0, 0, 0, + 0, 0, 0,0x00A1,0x00A6,0x00BF}; + +/* page 1 0x226B-0x2271 */ +static uint16 tab_jisx0212_uni1[]={ +0x00BA,0x00AA,0x00A9,0x00AE,0x2122,0x00A4,0x2116}; + +/* page 2 0x2661-0x267C */ +static uint16 tab_jisx0212_uni2[]={ +0x0386,0x0388,0x0389,0x038A,0x03AA, 0,0x038C, 0, +0x038E,0x03AB, 0,0x038F, 0, 0, 0, 0, +0x03AC,0x03AD,0x03AE,0x03AF,0x03CA,0x0390,0x03CC,0x03C2, +0x03CD,0x03CB,0x03B0,0x03CE}; + +/* page 3 0x2742-0x274E */ +static uint16 tab_jisx0212_uni3[]={ +0x0402,0x0403,0x0404,0x0405,0x0406,0x0407,0x0408,0x0409, +0x040A,0x040B,0x040C,0x040E,0x040F}; + +/* page 4 0x2772-0x277E */ +static uint16 tab_jisx0212_uni4[]={ +0x0452,0x0453,0x0454,0x0455,0x0456,0x0457,0x0458,0x0459, +0x045A,0x045B,0x045C,0x045E,0x045F}; + +/* page 5 0x2921-0x2950 */ +static uint16 tab_jisx0212_uni5[]={ +0x00C6,0x0110, 0,0x0126, 0,0x0132, 0,0x0141, +0x013F, 0,0x014A,0x00D8,0x0152, 0,0x0166,0x00DE, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x00E6,0x0111,0x00F0,0x0127,0x0131,0x0133,0x0138,0x0142, +0x0140,0x0149,0x014B,0x00F8,0x0153,0x00DF,0x0167,0x00FE +}; + +/* page 6 0x2A21-0x2A77 */ +static uint16 tab_jisx0212_uni6[]={ +0x00C1,0x00C0,0x00C4,0x00C2,0x0102,0x01CD,0x0100,0x0104, +0x00C5,0x00C3,0x0106,0x0108,0x010C,0x00C7,0x010A,0x010E, +0x00C9,0x00C8,0x00CB,0x00CA,0x011A,0x0116,0x0112,0x0118, + 0,0x011C,0x011E,0x0122,0x0120,0x0124,0x00CD,0x00CC, +0x00CF,0x00CE,0x01CF,0x0130,0x012A,0x012E,0x0128,0x0134, +0x0136,0x0139,0x013D,0x013B,0x0143,0x0147,0x0145,0x00D1, +0x00D3,0x00D2,0x00D6,0x00D4,0x01D1,0x0150,0x014C,0x00D5, +0x0154,0x0158,0x0156,0x015A,0x015C,0x0160,0x015E,0x0164, +0x0162,0x00DA,0x00D9,0x00DC,0x00DB,0x016C,0x01D3,0x0170, +0x016A,0x0172,0x016E,0x0168,0x01D7,0x01DB,0x01D9,0x01D5, +0x0174,0x00DD,0x0178,0x0176,0x0179,0x017D,0x017B}; + +/* page 7 0x2B21-0x2B77 */ +static uint16 tab_jisx0212_uni7[]={ +0x00E1,0x00E0,0x00E4,0x00E2,0x0103,0x01CE,0x0101,0x0105, +0x00E5,0x00E3,0x0107,0x0109,0x010D,0x00E7,0x010B,0x010F, +0x00E9,0x00E8,0x00EB,0x00EA,0x011B,0x0117,0x0113,0x0119, +0x01F5,0x011D,0x011F, 0,0x0121,0x0125,0x00ED,0x00EC, +0x00EF,0x00EE,0x01D0, 0,0x012B,0x012F,0x0129,0x0135, +0x0137,0x013A,0x013E,0x013C,0x0144,0x0148,0x0146,0x00F1, +0x00F3,0x00F2,0x00F6,0x00F4,0x01D2,0x0151,0x014D,0x00F5, +0x0155,0x0159,0x0157,0x015B,0x015D,0x0161,0x015F,0x0165, +0x0163,0x00FA,0x00F9,0x00FC,0x00FB,0x016D,0x01D4,0x0171, +0x016B,0x0173,0x016F,0x0169,0x01D8,0x01DC,0x01DA,0x01D6, +0x0175,0x00FD,0x00FF,0x0177,0x017A,0x017E,0x017C}; + +/* page 8 0x3021-0x307E */ +static uint16 tab_jisx0212_uni8[]={ +0x4E02,0x4E04,0x4E05,0x4E0C,0x4E12,0x4E1F,0x4E23,0x4E24, +0x4E28,0x4E2B,0x4E2E,0x4E2F,0x4E30,0x4E35,0x4E40,0x4E41, +0x4E44,0x4E47,0x4E51,0x4E5A,0x4E5C,0x4E63,0x4E68,0x4E69, +0x4E74,0x4E75,0x4E79,0x4E7F,0x4E8D,0x4E96,0x4E97,0x4E9D, +0x4EAF,0x4EB9,0x4EC3,0x4ED0,0x4EDA,0x4EDB,0x4EE0,0x4EE1, +0x4EE2,0x4EE8,0x4EEF,0x4EF1,0x4EF3,0x4EF5,0x4EFD,0x4EFE, +0x4EFF,0x4F00,0x4F02,0x4F03,0x4F08,0x4F0B,0x4F0C,0x4F12, +0x4F15,0x4F16,0x4F17,0x4F19,0x4F2E,0x4F31,0x4F60,0x4F33, +0x4F35,0x4F37,0x4F39,0x4F3B,0x4F3E,0x4F40,0x4F42,0x4F48, +0x4F49,0x4F4B,0x4F4C,0x4F52,0x4F54,0x4F56,0x4F58,0x4F5F, +0x4F63,0x4F6A,0x4F6C,0x4F6E,0x4F71,0x4F77,0x4F78,0x4F79, +0x4F7A,0x4F7D,0x4F7E,0x4F81,0x4F82,0x4F84}; + +/* page 9 0x3121-0x317E */ +static uint16 tab_jisx0212_uni9[]={ +0x4F85,0x4F89,0x4F8A,0x4F8C,0x4F8E,0x4F90,0x4F92,0x4F93, +0x4F94,0x4F97,0x4F99,0x4F9A,0x4F9E,0x4F9F,0x4FB2,0x4FB7, +0x4FB9,0x4FBB,0x4FBC,0x4FBD,0x4FBE,0x4FC0,0x4FC1,0x4FC5, +0x4FC6,0x4FC8,0x4FC9,0x4FCB,0x4FCC,0x4FCD,0x4FCF,0x4FD2, +0x4FDC,0x4FE0,0x4FE2,0x4FF0,0x4FF2,0x4FFC,0x4FFD,0x4FFF, +0x5000,0x5001,0x5004,0x5007,0x500A,0x500C,0x500E,0x5010, +0x5013,0x5017,0x5018,0x501B,0x501C,0x501D,0x501E,0x5022, +0x5027,0x502E,0x5030,0x5032,0x5033,0x5035,0x5040,0x5041, +0x5042,0x5045,0x5046,0x504A,0x504C,0x504E,0x5051,0x5052, +0x5053,0x5057,0x5059,0x505F,0x5060,0x5062,0x5063,0x5066, +0x5067,0x506A,0x506D,0x5070,0x5071,0x503B,0x5081,0x5083, +0x5084,0x5086,0x508A,0x508E,0x508F,0x5090}; + +/* page 10 0x3221-0x327E */ +static uint16 tab_jisx0212_uni10[]={ +0x5092,0x5093,0x5094,0x5096,0x509B,0x509C,0x509E,0x509F, +0x50A0,0x50A1,0x50A2,0x50AA,0x50AF,0x50B0,0x50B9,0x50BA, +0x50BD,0x50C0,0x50C3,0x50C4,0x50C7,0x50CC,0x50CE,0x50D0, +0x50D3,0x50D4,0x50D8,0x50DC,0x50DD,0x50DF,0x50E2,0x50E4, +0x50E6,0x50E8,0x50E9,0x50EF,0x50F1,0x50F6,0x50FA,0x50FE, +0x5103,0x5106,0x5107,0x5108,0x510B,0x510C,0x510D,0x510E, +0x50F2,0x5110,0x5117,0x5119,0x511B,0x511C,0x511D,0x511E, +0x5123,0x5127,0x5128,0x512C,0x512D,0x512F,0x5131,0x5133, +0x5134,0x5135,0x5138,0x5139,0x5142,0x514A,0x514F,0x5153, +0x5155,0x5157,0x5158,0x515F,0x5164,0x5166,0x517E,0x5183, +0x5184,0x518B,0x518E,0x5198,0x519D,0x51A1,0x51A3,0x51AD, +0x51B8,0x51BA,0x51BC,0x51BE,0x51BF,0x51C2}; + +/* page 11 0x3321-0x337E */ +static uint16 tab_jisx0212_uni11[]={ +0x51C8,0x51CF,0x51D1,0x51D2,0x51D3,0x51D5,0x51D8,0x51DE, +0x51E2,0x51E5,0x51EE,0x51F2,0x51F3,0x51F4,0x51F7,0x5201, +0x5202,0x5205,0x5212,0x5213,0x5215,0x5216,0x5218,0x5222, +0x5228,0x5231,0x5232,0x5235,0x523C,0x5245,0x5249,0x5255, +0x5257,0x5258,0x525A,0x525C,0x525F,0x5260,0x5261,0x5266, +0x526E,0x5277,0x5278,0x5279,0x5280,0x5282,0x5285,0x528A, +0x528C,0x5293,0x5295,0x5296,0x5297,0x5298,0x529A,0x529C, +0x52A4,0x52A5,0x52A6,0x52A7,0x52AF,0x52B0,0x52B6,0x52B7, +0x52B8,0x52BA,0x52BB,0x52BD,0x52C0,0x52C4,0x52C6,0x52C8, +0x52CC,0x52CF,0x52D1,0x52D4,0x52D6,0x52DB,0x52DC,0x52E1, +0x52E5,0x52E8,0x52E9,0x52EA,0x52EC,0x52F0,0x52F1,0x52F4, +0x52F6,0x52F7,0x5300,0x5303,0x530A,0x530B}; + +/* page 12 0x3421-0x347E */ +static uint16 tab_jisx0212_uni12[]={ +0x530C,0x5311,0x5313,0x5318,0x531B,0x531C,0x531E,0x531F, +0x5325,0x5327,0x5328,0x5329,0x532B,0x532C,0x532D,0x5330, +0x5332,0x5335,0x533C,0x533D,0x533E,0x5342,0x534C,0x534B, +0x5359,0x535B,0x5361,0x5363,0x5365,0x536C,0x536D,0x5372, +0x5379,0x537E,0x5383,0x5387,0x5388,0x538E,0x5393,0x5394, +0x5399,0x539D,0x53A1,0x53A4,0x53AA,0x53AB,0x53AF,0x53B2, +0x53B4,0x53B5,0x53B7,0x53B8,0x53BA,0x53BD,0x53C0,0x53C5, +0x53CF,0x53D2,0x53D3,0x53D5,0x53DA,0x53DD,0x53DE,0x53E0, +0x53E6,0x53E7,0x53F5,0x5402,0x5413,0x541A,0x5421,0x5427, +0x5428,0x542A,0x542F,0x5431,0x5434,0x5435,0x5443,0x5444, +0x5447,0x544D,0x544F,0x545E,0x5462,0x5464,0x5466,0x5467, +0x5469,0x546B,0x546D,0x546E,0x5474,0x547F}; + +/* page 13 0x3521-0x357E */ +static uint16 tab_jisx0212_uni13[]={ +0x5481,0x5483,0x5485,0x5488,0x5489,0x548D,0x5491,0x5495, +0x5496,0x549C,0x549F,0x54A1,0x54A6,0x54A7,0x54A9,0x54AA, +0x54AD,0x54AE,0x54B1,0x54B7,0x54B9,0x54BA,0x54BB,0x54BF, +0x54C6,0x54CA,0x54CD,0x54CE,0x54E0,0x54EA,0x54EC,0x54EF, +0x54F6,0x54FC,0x54FE,0x54FF,0x5500,0x5501,0x5505,0x5508, +0x5509,0x550C,0x550D,0x550E,0x5515,0x552A,0x552B,0x5532, +0x5535,0x5536,0x553B,0x553C,0x553D,0x5541,0x5547,0x5549, +0x554A,0x554D,0x5550,0x5551,0x5558,0x555A,0x555B,0x555E, +0x5560,0x5561,0x5564,0x5566,0x557F,0x5581,0x5582,0x5586, +0x5588,0x558E,0x558F,0x5591,0x5592,0x5593,0x5594,0x5597, +0x55A3,0x55A4,0x55AD,0x55B2,0x55BF,0x55C1,0x55C3,0x55C6, +0x55C9,0x55CB,0x55CC,0x55CE,0x55D1,0x55D2}; + +/* page 14 0x3621-0x367E */ +static uint16 tab_jisx0212_uni14[]={ +0x55D3,0x55D7,0x55D8,0x55DB,0x55DE,0x55E2,0x55E9,0x55F6, +0x55FF,0x5605,0x5608,0x560A,0x560D,0x560E,0x560F,0x5610, +0x5611,0x5612,0x5619,0x562C,0x5630,0x5633,0x5635,0x5637, +0x5639,0x563B,0x563C,0x563D,0x563F,0x5640,0x5641,0x5643, +0x5644,0x5646,0x5649,0x564B,0x564D,0x564F,0x5654,0x565E, +0x5660,0x5661,0x5662,0x5663,0x5666,0x5669,0x566D,0x566F, +0x5671,0x5672,0x5675,0x5684,0x5685,0x5688,0x568B,0x568C, +0x5695,0x5699,0x569A,0x569D,0x569E,0x569F,0x56A6,0x56A7, +0x56A8,0x56A9,0x56AB,0x56AC,0x56AD,0x56B1,0x56B3,0x56B7, +0x56BE,0x56C5,0x56C9,0x56CA,0x56CB,0x56CF,0x56D0,0x56CC, +0x56CD,0x56D9,0x56DC,0x56DD,0x56DF,0x56E1,0x56E4,0x56E5, +0x56E6,0x56E7,0x56E8,0x56F1,0x56EB,0x56ED}; + +/* page 15 0x3721-0x377E */ +static uint16 tab_jisx0212_uni15[]={ +0x56F6,0x56F7,0x5701,0x5702,0x5707,0x570A,0x570C,0x5711, +0x5715,0x571A,0x571B,0x571D,0x5720,0x5722,0x5723,0x5724, +0x5725,0x5729,0x572A,0x572C,0x572E,0x572F,0x5733,0x5734, +0x573D,0x573E,0x573F,0x5745,0x5746,0x574C,0x574D,0x5752, +0x5762,0x5765,0x5767,0x5768,0x576B,0x576D,0x576E,0x576F, +0x5770,0x5771,0x5773,0x5774,0x5775,0x5777,0x5779,0x577A, +0x577B,0x577C,0x577E,0x5781,0x5783,0x578C,0x5794,0x5797, +0x5799,0x579A,0x579C,0x579D,0x579E,0x579F,0x57A1,0x5795, +0x57A7,0x57A8,0x57A9,0x57AC,0x57B8,0x57BD,0x57C7,0x57C8, +0x57CC,0x57CF,0x57D5,0x57DD,0x57DE,0x57E4,0x57E6,0x57E7, +0x57E9,0x57ED,0x57F0,0x57F5,0x57F6,0x57F8,0x57FD,0x57FE, +0x57FF,0x5803,0x5804,0x5808,0x5809,0x57E1}; + +/* page 16 0x3821-0x387E */ +static uint16 tab_jisx0212_uni16[]={ +0x580C,0x580D,0x581B,0x581E,0x581F,0x5820,0x5826,0x5827, +0x582D,0x5832,0x5839,0x583F,0x5849,0x584C,0x584D,0x584F, +0x5850,0x5855,0x585F,0x5861,0x5864,0x5867,0x5868,0x5878, +0x587C,0x587F,0x5880,0x5881,0x5887,0x5888,0x5889,0x588A, +0x588C,0x588D,0x588F,0x5890,0x5894,0x5896,0x589D,0x58A0, +0x58A1,0x58A2,0x58A6,0x58A9,0x58B1,0x58B2,0x58C4,0x58BC, +0x58C2,0x58C8,0x58CD,0x58CE,0x58D0,0x58D2,0x58D4,0x58D6, +0x58DA,0x58DD,0x58E1,0x58E2,0x58E9,0x58F3,0x5905,0x5906, +0x590B,0x590C,0x5912,0x5913,0x5914,0x8641,0x591D,0x5921, +0x5923,0x5924,0x5928,0x592F,0x5930,0x5933,0x5935,0x5936, +0x593F,0x5943,0x5946,0x5952,0x5953,0x5959,0x595B,0x595D, +0x595E,0x595F,0x5961,0x5963,0x596B,0x596D}; + +/* page 17 0x3921-0x397E */ +static uint16 tab_jisx0212_uni17[]={ +0x596F,0x5972,0x5975,0x5976,0x5979,0x597B,0x597C,0x598B, +0x598C,0x598E,0x5992,0x5995,0x5997,0x599F,0x59A4,0x59A7, +0x59AD,0x59AE,0x59AF,0x59B0,0x59B3,0x59B7,0x59BA,0x59BC, +0x59C1,0x59C3,0x59C4,0x59C8,0x59CA,0x59CD,0x59D2,0x59DD, +0x59DE,0x59DF,0x59E3,0x59E4,0x59E7,0x59EE,0x59EF,0x59F1, +0x59F2,0x59F4,0x59F7,0x5A00,0x5A04,0x5A0C,0x5A0D,0x5A0E, +0x5A12,0x5A13,0x5A1E,0x5A23,0x5A24,0x5A27,0x5A28,0x5A2A, +0x5A2D,0x5A30,0x5A44,0x5A45,0x5A47,0x5A48,0x5A4C,0x5A50, +0x5A55,0x5A5E,0x5A63,0x5A65,0x5A67,0x5A6D,0x5A77,0x5A7A, +0x5A7B,0x5A7E,0x5A8B,0x5A90,0x5A93,0x5A96,0x5A99,0x5A9C, +0x5A9E,0x5A9F,0x5AA0,0x5AA2,0x5AA7,0x5AAC,0x5AB1,0x5AB2, +0x5AB3,0x5AB5,0x5AB8,0x5ABA,0x5ABB,0x5ABF}; + +/* page 18 0x3A21-0x3A7E */ +static uint16 tab_jisx0212_uni18[]={ +0x5AC4,0x5AC6,0x5AC8,0x5ACF,0x5ADA,0x5ADC,0x5AE0,0x5AE5, +0x5AEA,0x5AEE,0x5AF5,0x5AF6,0x5AFD,0x5B00,0x5B01,0x5B08, +0x5B17,0x5B34,0x5B19,0x5B1B,0x5B1D,0x5B21,0x5B25,0x5B2D, +0x5B38,0x5B41,0x5B4B,0x5B4C,0x5B52,0x5B56,0x5B5E,0x5B68, +0x5B6E,0x5B6F,0x5B7C,0x5B7D,0x5B7E,0x5B7F,0x5B81,0x5B84, +0x5B86,0x5B8A,0x5B8E,0x5B90,0x5B91,0x5B93,0x5B94,0x5B96, +0x5BA8,0x5BA9,0x5BAC,0x5BAD,0x5BAF,0x5BB1,0x5BB2,0x5BB7, +0x5BBA,0x5BBC,0x5BC0,0x5BC1,0x5BCD,0x5BCF,0x5BD6,0x5BD7, +0x5BD8,0x5BD9,0x5BDA,0x5BE0,0x5BEF,0x5BF1,0x5BF4,0x5BFD, +0x5C0C,0x5C17,0x5C1E,0x5C1F,0x5C23,0x5C26,0x5C29,0x5C2B, +0x5C2C,0x5C2E,0x5C30,0x5C32,0x5C35,0x5C36,0x5C59,0x5C5A, +0x5C5C,0x5C62,0x5C63,0x5C67,0x5C68,0x5C69}; + +/* page 19 0x3B21-0x3B7E */ +static uint16 tab_jisx0212_uni19[]={ +0x5C6D,0x5C70,0x5C74,0x5C75,0x5C7A,0x5C7B,0x5C7C,0x5C7D, +0x5C87,0x5C88,0x5C8A,0x5C8F,0x5C92,0x5C9D,0x5C9F,0x5CA0, +0x5CA2,0x5CA3,0x5CA6,0x5CAA,0x5CB2,0x5CB4,0x5CB5,0x5CBA, +0x5CC9,0x5CCB,0x5CD2,0x5CDD,0x5CD7,0x5CEE,0x5CF1,0x5CF2, +0x5CF4,0x5D01,0x5D06,0x5D0D,0x5D12,0x5D2B,0x5D23,0x5D24, +0x5D26,0x5D27,0x5D31,0x5D34,0x5D39,0x5D3D,0x5D3F,0x5D42, +0x5D43,0x5D46,0x5D48,0x5D55,0x5D51,0x5D59,0x5D4A,0x5D5F, +0x5D60,0x5D61,0x5D62,0x5D64,0x5D6A,0x5D6D,0x5D70,0x5D79, +0x5D7A,0x5D7E,0x5D7F,0x5D81,0x5D83,0x5D88,0x5D8A,0x5D92, +0x5D93,0x5D94,0x5D95,0x5D99,0x5D9B,0x5D9F,0x5DA0,0x5DA7, +0x5DAB,0x5DB0,0x5DB4,0x5DB8,0x5DB9,0x5DC3,0x5DC7,0x5DCB, +0x5DD0,0x5DCE,0x5DD8,0x5DD9,0x5DE0,0x5DE4}; + +/* page 20 0x3C21-0x3C7E */ +static uint16 tab_jisx0212_uni20[]={ +0x5DE9,0x5DF8,0x5DF9,0x5E00,0x5E07,0x5E0D,0x5E12,0x5E14, +0x5E15,0x5E18,0x5E1F,0x5E20,0x5E2E,0x5E28,0x5E32,0x5E35, +0x5E3E,0x5E4B,0x5E50,0x5E49,0x5E51,0x5E56,0x5E58,0x5E5B, +0x5E5C,0x5E5E,0x5E68,0x5E6A,0x5E6B,0x5E6C,0x5E6D,0x5E6E, +0x5E70,0x5E80,0x5E8B,0x5E8E,0x5EA2,0x5EA4,0x5EA5,0x5EA8, +0x5EAA,0x5EAC,0x5EB1,0x5EB3,0x5EBD,0x5EBE,0x5EBF,0x5EC6, +0x5ECC,0x5ECB,0x5ECE,0x5ED1,0x5ED2,0x5ED4,0x5ED5,0x5EDC, +0x5EDE,0x5EE5,0x5EEB,0x5F02,0x5F06,0x5F07,0x5F08,0x5F0E, +0x5F19,0x5F1C,0x5F1D,0x5F21,0x5F22,0x5F23,0x5F24,0x5F28, +0x5F2B,0x5F2C,0x5F2E,0x5F30,0x5F34,0x5F36,0x5F3B,0x5F3D, +0x5F3F,0x5F40,0x5F44,0x5F45,0x5F47,0x5F4D,0x5F50,0x5F54, +0x5F58,0x5F5B,0x5F60,0x5F63,0x5F64,0x5F67}; + +/* page 21 0x3D21-0x3D7E */ +static uint16 tab_jisx0212_uni21[]={ +0x5F6F,0x5F72,0x5F74,0x5F75,0x5F78,0x5F7A,0x5F7D,0x5F7E, +0x5F89,0x5F8D,0x5F8F,0x5F96,0x5F9C,0x5F9D,0x5FA2,0x5FA7, +0x5FAB,0x5FA4,0x5FAC,0x5FAF,0x5FB0,0x5FB1,0x5FB8,0x5FC4, +0x5FC7,0x5FC8,0x5FC9,0x5FCB,0x5FD0,0x5FD1,0x5FD2,0x5FD3, +0x5FD4,0x5FDE,0x5FE1,0x5FE2,0x5FE8,0x5FE9,0x5FEA,0x5FEC, +0x5FED,0x5FEE,0x5FEF,0x5FF2,0x5FF3,0x5FF6,0x5FFA,0x5FFC, +0x6007,0x600A,0x600D,0x6013,0x6014,0x6017,0x6018,0x601A, +0x601F,0x6024,0x602D,0x6033,0x6035,0x6040,0x6047,0x6048, +0x6049,0x604C,0x6051,0x6054,0x6056,0x6057,0x605D,0x6061, +0x6067,0x6071,0x607E,0x607F,0x6082,0x6086,0x6088,0x608A, +0x608E,0x6091,0x6093,0x6095,0x6098,0x609D,0x609E,0x60A2, +0x60A4,0x60A5,0x60A8,0x60B0,0x60B1,0x60B7}; + +/* page 22 0x3E21-0x3E7E */ +static uint16 tab_jisx0212_uni22[]={ +0x60BB,0x60BE,0x60C2,0x60C4,0x60C8,0x60C9,0x60CA,0x60CB, +0x60CE,0x60CF,0x60D4,0x60D5,0x60D9,0x60DB,0x60DD,0x60DE, +0x60E2,0x60E5,0x60F2,0x60F5,0x60F8,0x60FC,0x60FD,0x6102, +0x6107,0x610A,0x610C,0x6110,0x6111,0x6112,0x6113,0x6114, +0x6116,0x6117,0x6119,0x611C,0x611E,0x6122,0x612A,0x612B, +0x6130,0x6131,0x6135,0x6136,0x6137,0x6139,0x6141,0x6145, +0x6146,0x6149,0x615E,0x6160,0x616C,0x6172,0x6178,0x617B, +0x617C,0x617F,0x6180,0x6181,0x6183,0x6184,0x618B,0x618D, +0x6192,0x6193,0x6197,0x6198,0x619C,0x619D,0x619F,0x61A0, +0x61A5,0x61A8,0x61AA,0x61AD,0x61B8,0x61B9,0x61BC,0x61C0, +0x61C1,0x61C2,0x61CE,0x61CF,0x61D5,0x61DC,0x61DD,0x61DE, +0x61DF,0x61E1,0x61E2,0x61E7,0x61E9,0x61E5}; + +/* page 23 0x3F21-0x3F7E */ +static uint16 tab_jisx0212_uni23[]={ +0x61EC,0x61ED,0x61EF,0x6201,0x6203,0x6204,0x6207,0x6213, +0x6215,0x621C,0x6220,0x6222,0x6223,0x6227,0x6229,0x622B, +0x6239,0x623D,0x6242,0x6243,0x6244,0x6246,0x624C,0x6250, +0x6251,0x6252,0x6254,0x6256,0x625A,0x625C,0x6264,0x626D, +0x626F,0x6273,0x627A,0x627D,0x628D,0x628E,0x628F,0x6290, +0x62A6,0x62A8,0x62B3,0x62B6,0x62B7,0x62BA,0x62BE,0x62BF, +0x62C4,0x62CE,0x62D5,0x62D6,0x62DA,0x62EA,0x62F2,0x62F4, +0x62FC,0x62FD,0x6303,0x6304,0x630A,0x630B,0x630D,0x6310, +0x6313,0x6316,0x6318,0x6329,0x632A,0x632D,0x6335,0x6336, +0x6339,0x633C,0x6341,0x6342,0x6343,0x6344,0x6346,0x634A, +0x634B,0x634E,0x6352,0x6353,0x6354,0x6358,0x635B,0x6365, +0x6366,0x636C,0x636D,0x6371,0x6374,0x6375}; + +/* page 24 0x4021-0x407E */ +static uint16 tab_jisx0212_uni24[]={ +0x6378,0x637C,0x637D,0x637F,0x6382,0x6384,0x6387,0x638A, +0x6390,0x6394,0x6395,0x6399,0x639A,0x639E,0x63A4,0x63A6, +0x63AD,0x63AE,0x63AF,0x63BD,0x63C1,0x63C5,0x63C8,0x63CE, +0x63D1,0x63D3,0x63D4,0x63D5,0x63DC,0x63E0,0x63E5,0x63EA, +0x63EC,0x63F2,0x63F3,0x63F5,0x63F8,0x63F9,0x6409,0x640A, +0x6410,0x6412,0x6414,0x6418,0x641E,0x6420,0x6422,0x6424, +0x6425,0x6429,0x642A,0x642F,0x6430,0x6435,0x643D,0x643F, +0x644B,0x644F,0x6451,0x6452,0x6453,0x6454,0x645A,0x645B, +0x645C,0x645D,0x645F,0x6460,0x6461,0x6463,0x646D,0x6473, +0x6474,0x647B,0x647D,0x6485,0x6487,0x648F,0x6490,0x6491, +0x6498,0x6499,0x649B,0x649D,0x649F,0x64A1,0x64A3,0x64A6, +0x64A8,0x64AC,0x64B3,0x64BD,0x64BE,0x64BF}; + +/* page 25 0x4121-0x417E */ +static uint16 tab_jisx0212_uni25[]={ +0x64C4,0x64C9,0x64CA,0x64CB,0x64CC,0x64CE,0x64D0,0x64D1, +0x64D5,0x64D7,0x64E4,0x64E5,0x64E9,0x64EA,0x64ED,0x64F0, +0x64F5,0x64F7,0x64FB,0x64FF,0x6501,0x6504,0x6508,0x6509, +0x650A,0x650F,0x6513,0x6514,0x6516,0x6519,0x651B,0x651E, +0x651F,0x6522,0x6526,0x6529,0x652E,0x6531,0x653A,0x653C, +0x653D,0x6543,0x6547,0x6549,0x6550,0x6552,0x6554,0x655F, +0x6560,0x6567,0x656B,0x657A,0x657D,0x6581,0x6585,0x658A, +0x6592,0x6595,0x6598,0x659D,0x65A0,0x65A3,0x65A6,0x65AE, +0x65B2,0x65B3,0x65B4,0x65BF,0x65C2,0x65C8,0x65C9,0x65CE, +0x65D0,0x65D4,0x65D6,0x65D8,0x65DF,0x65F0,0x65F2,0x65F4, +0x65F5,0x65F9,0x65FE,0x65FF,0x6600,0x6604,0x6608,0x6609, +0x660D,0x6611,0x6612,0x6615,0x6616,0x661D}; + +/* page 26 0x4221-0x427E */ +static uint16 tab_jisx0212_uni26[]={ +0x661E,0x6621,0x6622,0x6623,0x6624,0x6626,0x6629,0x662A, +0x662B,0x662C,0x662E,0x6630,0x6631,0x6633,0x6639,0x6637, +0x6640,0x6645,0x6646,0x664A,0x664C,0x6651,0x664E,0x6657, +0x6658,0x6659,0x665B,0x665C,0x6660,0x6661,0x66FB,0x666A, +0x666B,0x666C,0x667E,0x6673,0x6675,0x667F,0x6677,0x6678, +0x6679,0x667B,0x6680,0x667C,0x668B,0x668C,0x668D,0x6690, +0x6692,0x6699,0x669A,0x669B,0x669C,0x669F,0x66A0,0x66A4, +0x66AD,0x66B1,0x66B2,0x66B5,0x66BB,0x66BF,0x66C0,0x66C2, +0x66C3,0x66C8,0x66CC,0x66CE,0x66CF,0x66D4,0x66DB,0x66DF, +0x66E8,0x66EB,0x66EC,0x66EE,0x66FA,0x6705,0x6707,0x670E, +0x6713,0x6719,0x671C,0x6720,0x6722,0x6733,0x673E,0x6745, +0x6747,0x6748,0x674C,0x6754,0x6755,0x675D}; + +/* page 27 0x4321-0x437E */ +static uint16 tab_jisx0212_uni27[]={ +0x6766,0x676C,0x676E,0x6774,0x6776,0x677B,0x6781,0x6784, +0x678E,0x678F,0x6791,0x6793,0x6796,0x6798,0x6799,0x679B, +0x67B0,0x67B1,0x67B2,0x67B5,0x67BB,0x67BC,0x67BD,0x67F9, +0x67C0,0x67C2,0x67C3,0x67C5,0x67C8,0x67C9,0x67D2,0x67D7, +0x67D9,0x67DC,0x67E1,0x67E6,0x67F0,0x67F2,0x67F6,0x67F7, +0x6852,0x6814,0x6819,0x681D,0x681F,0x6828,0x6827,0x682C, +0x682D,0x682F,0x6830,0x6831,0x6833,0x683B,0x683F,0x6844, +0x6845,0x684A,0x684C,0x6855,0x6857,0x6858,0x685B,0x686B, +0x686E,0x686F,0x6870,0x6871,0x6872,0x6875,0x6879,0x687A, +0x687B,0x687C,0x6882,0x6884,0x6886,0x6888,0x6896,0x6898, +0x689A,0x689C,0x68A1,0x68A3,0x68A5,0x68A9,0x68AA,0x68AE, +0x68B2,0x68BB,0x68C5,0x68C8,0x68CC,0x68CF}; + +/* page 28 0x4421-0x447E */ +static uint16 tab_jisx0212_uni28[]={ +0x68D0,0x68D1,0x68D3,0x68D6,0x68D9,0x68DC,0x68DD,0x68E5, +0x68E8,0x68EA,0x68EB,0x68EC,0x68ED,0x68F0,0x68F1,0x68F5, +0x68F6,0x68FB,0x68FC,0x68FD,0x6906,0x6909,0x690A,0x6910, +0x6911,0x6913,0x6916,0x6917,0x6931,0x6933,0x6935,0x6938, +0x693B,0x6942,0x6945,0x6949,0x694E,0x6957,0x695B,0x6963, +0x6964,0x6965,0x6966,0x6968,0x6969,0x696C,0x6970,0x6971, +0x6972,0x697A,0x697B,0x697F,0x6980,0x698D,0x6992,0x6996, +0x6998,0x69A1,0x69A5,0x69A6,0x69A8,0x69AB,0x69AD,0x69AF, +0x69B7,0x69B8,0x69BA,0x69BC,0x69C5,0x69C8,0x69D1,0x69D6, +0x69D7,0x69E2,0x69E5,0x69EE,0x69EF,0x69F1,0x69F3,0x69F5, +0x69FE,0x6A00,0x6A01,0x6A03,0x6A0F,0x6A11,0x6A15,0x6A1A, +0x6A1D,0x6A20,0x6A24,0x6A28,0x6A30,0x6A32}; + +/* page 29 0x4521-0x457E */ +static uint16 tab_jisx0212_uni29[]={ +0x6A34,0x6A37,0x6A3B,0x6A3E,0x6A3F,0x6A45,0x6A46,0x6A49, +0x6A4A,0x6A4E,0x6A50,0x6A51,0x6A52,0x6A55,0x6A56,0x6A5B, +0x6A64,0x6A67,0x6A6A,0x6A71,0x6A73,0x6A7E,0x6A81,0x6A83, +0x6A86,0x6A87,0x6A89,0x6A8B,0x6A91,0x6A9B,0x6A9D,0x6A9E, +0x6A9F,0x6AA5,0x6AAB,0x6AAF,0x6AB0,0x6AB1,0x6AB4,0x6ABD, +0x6ABE,0x6ABF,0x6AC6,0x6AC9,0x6AC8,0x6ACC,0x6AD0,0x6AD4, +0x6AD5,0x6AD6,0x6ADC,0x6ADD,0x6AE4,0x6AE7,0x6AEC,0x6AF0, +0x6AF1,0x6AF2,0x6AFC,0x6AFD,0x6B02,0x6B03,0x6B06,0x6B07, +0x6B09,0x6B0F,0x6B10,0x6B11,0x6B17,0x6B1B,0x6B1E,0x6B24, +0x6B28,0x6B2B,0x6B2C,0x6B2F,0x6B35,0x6B36,0x6B3B,0x6B3F, +0x6B46,0x6B4A,0x6B4D,0x6B52,0x6B56,0x6B58,0x6B5D,0x6B60, +0x6B67,0x6B6B,0x6B6E,0x6B70,0x6B75,0x6B7D}; + +/* page 30 0x4621-0x467E */ +static uint16 tab_jisx0212_uni30[]={ +0x6B7E,0x6B82,0x6B85,0x6B97,0x6B9B,0x6B9F,0x6BA0,0x6BA2, +0x6BA3,0x6BA8,0x6BA9,0x6BAC,0x6BAD,0x6BAE,0x6BB0,0x6BB8, +0x6BB9,0x6BBD,0x6BBE,0x6BC3,0x6BC4,0x6BC9,0x6BCC,0x6BD6, +0x6BDA,0x6BE1,0x6BE3,0x6BE6,0x6BE7,0x6BEE,0x6BF1,0x6BF7, +0x6BF9,0x6BFF,0x6C02,0x6C04,0x6C05,0x6C09,0x6C0D,0x6C0E, +0x6C10,0x6C12,0x6C19,0x6C1F,0x6C26,0x6C27,0x6C28,0x6C2C, +0x6C2E,0x6C33,0x6C35,0x6C36,0x6C3A,0x6C3B,0x6C3F,0x6C4A, +0x6C4B,0x6C4D,0x6C4F,0x6C52,0x6C54,0x6C59,0x6C5B,0x6C5C, +0x6C6B,0x6C6D,0x6C6F,0x6C74,0x6C76,0x6C78,0x6C79,0x6C7B, +0x6C85,0x6C86,0x6C87,0x6C89,0x6C94,0x6C95,0x6C97,0x6C98, +0x6C9C,0x6C9F,0x6CB0,0x6CB2,0x6CB4,0x6CC2,0x6CC6,0x6CCD, +0x6CCF,0x6CD0,0x6CD1,0x6CD2,0x6CD4,0x6CD6}; + +/* page 31 0x4721-0x477E */ +static uint16 tab_jisx0212_uni31[]={ +0x6CDA,0x6CDC,0x6CE0,0x6CE7,0x6CE9,0x6CEB,0x6CEC,0x6CEE, +0x6CF2,0x6CF4,0x6D04,0x6D07,0x6D0A,0x6D0E,0x6D0F,0x6D11, +0x6D13,0x6D1A,0x6D26,0x6D27,0x6D28,0x6C67,0x6D2E,0x6D2F, +0x6D31,0x6D39,0x6D3C,0x6D3F,0x6D57,0x6D5E,0x6D5F,0x6D61, +0x6D65,0x6D67,0x6D6F,0x6D70,0x6D7C,0x6D82,0x6D87,0x6D91, +0x6D92,0x6D94,0x6D96,0x6D97,0x6D98,0x6DAA,0x6DAC,0x6DB4, +0x6DB7,0x6DB9,0x6DBD,0x6DBF,0x6DC4,0x6DC8,0x6DCA,0x6DCE, +0x6DCF,0x6DD6,0x6DDB,0x6DDD,0x6DDF,0x6DE0,0x6DE2,0x6DE5, +0x6DE9,0x6DEF,0x6DF0,0x6DF4,0x6DF6,0x6DFC,0x6E00,0x6E04, +0x6E1E,0x6E22,0x6E27,0x6E32,0x6E36,0x6E39,0x6E3B,0x6E3C, +0x6E44,0x6E45,0x6E48,0x6E49,0x6E4B,0x6E4F,0x6E51,0x6E52, +0x6E53,0x6E54,0x6E57,0x6E5C,0x6E5D,0x6E5E}; + +/* page 32 0x4821-0x487E */ +static uint16 tab_jisx0212_uni32[]={ +0x6E62,0x6E63,0x6E68,0x6E73,0x6E7B,0x6E7D,0x6E8D,0x6E93, +0x6E99,0x6EA0,0x6EA7,0x6EAD,0x6EAE,0x6EB1,0x6EB3,0x6EBB, +0x6EBF,0x6EC0,0x6EC1,0x6EC3,0x6EC7,0x6EC8,0x6ECA,0x6ECD, +0x6ECE,0x6ECF,0x6EEB,0x6EED,0x6EEE,0x6EF9,0x6EFB,0x6EFD, +0x6F04,0x6F08,0x6F0A,0x6F0C,0x6F0D,0x6F16,0x6F18,0x6F1A, +0x6F1B,0x6F26,0x6F29,0x6F2A,0x6F2F,0x6F30,0x6F33,0x6F36, +0x6F3B,0x6F3C,0x6F2D,0x6F4F,0x6F51,0x6F52,0x6F53,0x6F57, +0x6F59,0x6F5A,0x6F5D,0x6F5E,0x6F61,0x6F62,0x6F68,0x6F6C, +0x6F7D,0x6F7E,0x6F83,0x6F87,0x6F88,0x6F8B,0x6F8C,0x6F8D, +0x6F90,0x6F92,0x6F93,0x6F94,0x6F96,0x6F9A,0x6F9F,0x6FA0, +0x6FA5,0x6FA6,0x6FA7,0x6FA8,0x6FAE,0x6FAF,0x6FB0,0x6FB5, +0x6FB6,0x6FBC,0x6FC5,0x6FC7,0x6FC8,0x6FCA}; + +/* page 33 0x4921-0x497E */ +static uint16 tab_jisx0212_uni33[]={ +0x6FDA,0x6FDE,0x6FE8,0x6FE9,0x6FF0,0x6FF5,0x6FF9,0x6FFC, +0x6FFD,0x7000,0x7005,0x7006,0x7007,0x700D,0x7017,0x7020, +0x7023,0x702F,0x7034,0x7037,0x7039,0x703C,0x7043,0x7044, +0x7048,0x7049,0x704A,0x704B,0x7054,0x7055,0x705D,0x705E, +0x704E,0x7064,0x7065,0x706C,0x706E,0x7075,0x7076,0x707E, +0x7081,0x7085,0x7086,0x7094,0x7095,0x7096,0x7097,0x7098, +0x709B,0x70A4,0x70AB,0x70B0,0x70B1,0x70B4,0x70B7,0x70CA, +0x70D1,0x70D3,0x70D4,0x70D5,0x70D6,0x70D8,0x70DC,0x70E4, +0x70FA,0x7103,0x7104,0x7105,0x7106,0x7107,0x710B,0x710C, +0x710F,0x711E,0x7120,0x712B,0x712D,0x712F,0x7130,0x7131, +0x7138,0x7141,0x7145,0x7146,0x7147,0x714A,0x714B,0x7150, +0x7152,0x7157,0x715A,0x715C,0x715E,0x7160}; + +/* page 34 0x4A21-0x4A7E */ +static uint16 tab_jisx0212_uni34[]={ +0x7168,0x7179,0x7180,0x7185,0x7187,0x718C,0x7192,0x719A, +0x719B,0x71A0,0x71A2,0x71AF,0x71B0,0x71B2,0x71B3,0x71BA, +0x71BF,0x71C0,0x71C1,0x71C4,0x71CB,0x71CC,0x71D3,0x71D6, +0x71D9,0x71DA,0x71DC,0x71F8,0x71FE,0x7200,0x7207,0x7208, +0x7209,0x7213,0x7217,0x721A,0x721D,0x721F,0x7224,0x722B, +0x722F,0x7234,0x7238,0x7239,0x7241,0x7242,0x7243,0x7245, +0x724E,0x724F,0x7250,0x7253,0x7255,0x7256,0x725A,0x725C, +0x725E,0x7260,0x7263,0x7268,0x726B,0x726E,0x726F,0x7271, +0x7277,0x7278,0x727B,0x727C,0x727F,0x7284,0x7289,0x728D, +0x728E,0x7293,0x729B,0x72A8,0x72AD,0x72AE,0x72B1,0x72B4, +0x72BE,0x72C1,0x72C7,0x72C9,0x72CC,0x72D5,0x72D6,0x72D8, +0x72DF,0x72E5,0x72F3,0x72F4,0x72FA,0x72FB}; + +/* page 35 0x4B21-0x4B7E */ +static uint16 tab_jisx0212_uni35[]={ +0x72FE,0x7302,0x7304,0x7305,0x7307,0x730B,0x730D,0x7312, +0x7313,0x7318,0x7319,0x731E,0x7322,0x7324,0x7327,0x7328, +0x732C,0x7331,0x7332,0x7335,0x733A,0x733B,0x733D,0x7343, +0x734D,0x7350,0x7352,0x7356,0x7358,0x735D,0x735E,0x735F, +0x7360,0x7366,0x7367,0x7369,0x736B,0x736C,0x736E,0x736F, +0x7371,0x7377,0x7379,0x737C,0x7380,0x7381,0x7383,0x7385, +0x7386,0x738E,0x7390,0x7393,0x7395,0x7397,0x7398,0x739C, +0x739E,0x739F,0x73A0,0x73A2,0x73A5,0x73A6,0x73AA,0x73AB, +0x73AD,0x73B5,0x73B7,0x73B9,0x73BC,0x73BD,0x73BF,0x73C5, +0x73C6,0x73C9,0x73CB,0x73CC,0x73CF,0x73D2,0x73D3,0x73D6, +0x73D9,0x73DD,0x73E1,0x73E3,0x73E6,0x73E7,0x73E9,0x73F4, +0x73F5,0x73F7,0x73F9,0x73FA,0x73FB,0x73FD}; + +/* page 36 0x4C21-0x4C7E */ +static uint16 tab_jisx0212_uni36[]={ +0x73FF,0x7400,0x7401,0x7404,0x7407,0x740A,0x7411,0x741A, +0x741B,0x7424,0x7426,0x7428,0x7429,0x742A,0x742B,0x742C, +0x742D,0x742E,0x742F,0x7430,0x7431,0x7439,0x7440,0x7443, +0x7444,0x7446,0x7447,0x744B,0x744D,0x7451,0x7452,0x7457, +0x745D,0x7462,0x7466,0x7467,0x7468,0x746B,0x746D,0x746E, +0x7471,0x7472,0x7480,0x7481,0x7485,0x7486,0x7487,0x7489, +0x748F,0x7490,0x7491,0x7492,0x7498,0x7499,0x749A,0x749C, +0x749F,0x74A0,0x74A1,0x74A3,0x74A6,0x74A8,0x74A9,0x74AA, +0x74AB,0x74AE,0x74AF,0x74B1,0x74B2,0x74B5,0x74B9,0x74BB, +0x74BF,0x74C8,0x74C9,0x74CC,0x74D0,0x74D3,0x74D8,0x74DA, +0x74DB,0x74DE,0x74DF,0x74E4,0x74E8,0x74EA,0x74EB,0x74EF, +0x74F4,0x74FA,0x74FB,0x74FC,0x74FF,0x7506}; + +/* page 37 0x4D21-0x4D7E */ +static uint16 tab_jisx0212_uni37[]={ +0x7512,0x7516,0x7517,0x7520,0x7521,0x7524,0x7527,0x7529, +0x752A,0x752F,0x7536,0x7539,0x753D,0x753E,0x753F,0x7540, +0x7543,0x7547,0x7548,0x754E,0x7550,0x7552,0x7557,0x755E, +0x755F,0x7561,0x756F,0x7571,0x7579,0x757A,0x757B,0x757C, +0x757D,0x757E,0x7581,0x7585,0x7590,0x7592,0x7593,0x7595, +0x7599,0x759C,0x75A2,0x75A4,0x75B4,0x75BA,0x75BF,0x75C0, +0x75C1,0x75C4,0x75C6,0x75CC,0x75CE,0x75CF,0x75D7,0x75DC, +0x75DF,0x75E0,0x75E1,0x75E4,0x75E7,0x75EC,0x75EE,0x75EF, +0x75F1,0x75F9,0x7600,0x7602,0x7603,0x7604,0x7607,0x7608, +0x760A,0x760C,0x760F,0x7612,0x7613,0x7615,0x7616,0x7619, +0x761B,0x761C,0x761D,0x761E,0x7623,0x7625,0x7626,0x7629, +0x762D,0x7632,0x7633,0x7635,0x7638,0x7639}; + +/* page 38 0x4E21-0x4E7E */ +static uint16 tab_jisx0212_uni38[]={ +0x763A,0x763C,0x764A,0x7640,0x7641,0x7643,0x7644,0x7645, +0x7649,0x764B,0x7655,0x7659,0x765F,0x7664,0x7665,0x766D, +0x766E,0x766F,0x7671,0x7674,0x7681,0x7685,0x768C,0x768D, +0x7695,0x769B,0x769C,0x769D,0x769F,0x76A0,0x76A2,0x76A3, +0x76A4,0x76A5,0x76A6,0x76A7,0x76A8,0x76AA,0x76AD,0x76BD, +0x76C1,0x76C5,0x76C9,0x76CB,0x76CC,0x76CE,0x76D4,0x76D9, +0x76E0,0x76E6,0x76E8,0x76EC,0x76F0,0x76F1,0x76F6,0x76F9, +0x76FC,0x7700,0x7706,0x770A,0x770E,0x7712,0x7714,0x7715, +0x7717,0x7719,0x771A,0x771C,0x7722,0x7728,0x772D,0x772E, +0x772F,0x7734,0x7735,0x7736,0x7739,0x773D,0x773E,0x7742, +0x7745,0x7746,0x774A,0x774D,0x774E,0x774F,0x7752,0x7756, +0x7757,0x775C,0x775E,0x775F,0x7760,0x7762}; + +/* page 39 0x4F21-0x4F7E */ +static uint16 tab_jisx0212_uni39[]={ +0x7764,0x7767,0x776A,0x776C,0x7770,0x7772,0x7773,0x7774, +0x777A,0x777D,0x7780,0x7784,0x778C,0x778D,0x7794,0x7795, +0x7796,0x779A,0x779F,0x77A2,0x77A7,0x77AA,0x77AE,0x77AF, +0x77B1,0x77B5,0x77BE,0x77C3,0x77C9,0x77D1,0x77D2,0x77D5, +0x77D9,0x77DE,0x77DF,0x77E0,0x77E4,0x77E6,0x77EA,0x77EC, +0x77F0,0x77F1,0x77F4,0x77F8,0x77FB,0x7805,0x7806,0x7809, +0x780D,0x780E,0x7811,0x781D,0x7821,0x7822,0x7823,0x782D, +0x782E,0x7830,0x7835,0x7837,0x7843,0x7844,0x7847,0x7848, +0x784C,0x784E,0x7852,0x785C,0x785E,0x7860,0x7861,0x7863, +0x7864,0x7868,0x786A,0x786E,0x787A,0x787E,0x788A,0x788F, +0x7894,0x7898,0x78A1,0x789D,0x789E,0x789F,0x78A4,0x78A8, +0x78AC,0x78AD,0x78B0,0x78B1,0x78B2,0x78B3}; + +/* page 40 0x5021-0x507E */ +static uint16 tab_jisx0212_uni40[]={ +0x78BB,0x78BD,0x78BF,0x78C7,0x78C8,0x78C9,0x78CC,0x78CE, +0x78D2,0x78D3,0x78D5,0x78D6,0x78E4,0x78DB,0x78DF,0x78E0, +0x78E1,0x78E6,0x78EA,0x78F2,0x78F3,0x7900,0x78F6,0x78F7, +0x78FA,0x78FB,0x78FF,0x7906,0x790C,0x7910,0x791A,0x791C, +0x791E,0x791F,0x7920,0x7925,0x7927,0x7929,0x792D,0x7931, +0x7934,0x7935,0x793B,0x793D,0x793F,0x7944,0x7945,0x7946, +0x794A,0x794B,0x794F,0x7951,0x7954,0x7958,0x795B,0x795C, +0x7967,0x7969,0x796B,0x7972,0x7979,0x797B,0x797C,0x797E, +0x798B,0x798C,0x7991,0x7993,0x7994,0x7995,0x7996,0x7998, +0x799B,0x799C,0x79A1,0x79A8,0x79A9,0x79AB,0x79AF,0x79B1, +0x79B4,0x79B8,0x79BB,0x79C2,0x79C4,0x79C7,0x79C8,0x79CA, +0x79CF,0x79D4,0x79D6,0x79DA,0x79DD,0x79DE}; + +/* page 41 0x5121-0x517E */ +static uint16 tab_jisx0212_uni41[]={ +0x79E0,0x79E2,0x79E5,0x79EA,0x79EB,0x79ED,0x79F1,0x79F8, +0x79FC,0x7A02,0x7A03,0x7A07,0x7A09,0x7A0A,0x7A0C,0x7A11, +0x7A15,0x7A1B,0x7A1E,0x7A21,0x7A27,0x7A2B,0x7A2D,0x7A2F, +0x7A30,0x7A34,0x7A35,0x7A38,0x7A39,0x7A3A,0x7A44,0x7A45, +0x7A47,0x7A48,0x7A4C,0x7A55,0x7A56,0x7A59,0x7A5C,0x7A5D, +0x7A5F,0x7A60,0x7A65,0x7A67,0x7A6A,0x7A6D,0x7A75,0x7A78, +0x7A7E,0x7A80,0x7A82,0x7A85,0x7A86,0x7A8A,0x7A8B,0x7A90, +0x7A91,0x7A94,0x7A9E,0x7AA0,0x7AA3,0x7AAC,0x7AB3,0x7AB5, +0x7AB9,0x7ABB,0x7ABC,0x7AC6,0x7AC9,0x7ACC,0x7ACE,0x7AD1, +0x7ADB,0x7AE8,0x7AE9,0x7AEB,0x7AEC,0x7AF1,0x7AF4,0x7AFB, +0x7AFD,0x7AFE,0x7B07,0x7B14,0x7B1F,0x7B23,0x7B27,0x7B29, +0x7B2A,0x7B2B,0x7B2D,0x7B2E,0x7B2F,0x7B30}; + +/* page 42 0x5221-0x527E */ +static uint16 tab_jisx0212_uni42[]={ +0x7B31,0x7B34,0x7B3D,0x7B3F,0x7B40,0x7B41,0x7B47,0x7B4E, +0x7B55,0x7B60,0x7B64,0x7B66,0x7B69,0x7B6A,0x7B6D,0x7B6F, +0x7B72,0x7B73,0x7B77,0x7B84,0x7B89,0x7B8E,0x7B90,0x7B91, +0x7B96,0x7B9B,0x7B9E,0x7BA0,0x7BA5,0x7BAC,0x7BAF,0x7BB0, +0x7BB2,0x7BB5,0x7BB6,0x7BBA,0x7BBB,0x7BBC,0x7BBD,0x7BC2, +0x7BC5,0x7BC8,0x7BCA,0x7BD4,0x7BD6,0x7BD7,0x7BD9,0x7BDA, +0x7BDB,0x7BE8,0x7BEA,0x7BF2,0x7BF4,0x7BF5,0x7BF8,0x7BF9, +0x7BFA,0x7BFC,0x7BFE,0x7C01,0x7C02,0x7C03,0x7C04,0x7C06, +0x7C09,0x7C0B,0x7C0C,0x7C0E,0x7C0F,0x7C19,0x7C1B,0x7C20, +0x7C25,0x7C26,0x7C28,0x7C2C,0x7C31,0x7C33,0x7C34,0x7C36, +0x7C39,0x7C3A,0x7C46,0x7C4A,0x7C55,0x7C51,0x7C52,0x7C53, +0x7C59,0x7C5A,0x7C5B,0x7C5C,0x7C5D,0x7C5E}; + +/* page 43 0x5321-0x537E */ +static uint16 tab_jisx0212_uni43[]={ +0x7C61,0x7C63,0x7C67,0x7C69,0x7C6D,0x7C6E,0x7C70,0x7C72, +0x7C79,0x7C7C,0x7C7D,0x7C86,0x7C87,0x7C8F,0x7C94,0x7C9E, +0x7CA0,0x7CA6,0x7CB0,0x7CB6,0x7CB7,0x7CBA,0x7CBB,0x7CBC, +0x7CBF,0x7CC4,0x7CC7,0x7CC8,0x7CC9,0x7CCD,0x7CCF,0x7CD3, +0x7CD4,0x7CD5,0x7CD7,0x7CD9,0x7CDA,0x7CDD,0x7CE6,0x7CE9, +0x7CEB,0x7CF5,0x7D03,0x7D07,0x7D08,0x7D09,0x7D0F,0x7D11, +0x7D12,0x7D13,0x7D16,0x7D1D,0x7D1E,0x7D23,0x7D26,0x7D2A, +0x7D2D,0x7D31,0x7D3C,0x7D3D,0x7D3E,0x7D40,0x7D41,0x7D47, +0x7D48,0x7D4D,0x7D51,0x7D53,0x7D57,0x7D59,0x7D5A,0x7D5C, +0x7D5D,0x7D65,0x7D67,0x7D6A,0x7D70,0x7D78,0x7D7A,0x7D7B, +0x7D7F,0x7D81,0x7D82,0x7D83,0x7D85,0x7D86,0x7D88,0x7D8B, +0x7D8C,0x7D8D,0x7D91,0x7D96,0x7D97,0x7D9D}; + +/* page 44 0x5421-0x547E */ +static uint16 tab_jisx0212_uni44[]={ +0x7D9E,0x7DA6,0x7DA7,0x7DAA,0x7DB3,0x7DB6,0x7DB7,0x7DB9, +0x7DC2,0x7DC3,0x7DC4,0x7DC5,0x7DC6,0x7DCC,0x7DCD,0x7DCE, +0x7DD7,0x7DD9,0x7E00,0x7DE2,0x7DE5,0x7DE6,0x7DEA,0x7DEB, +0x7DED,0x7DF1,0x7DF5,0x7DF6,0x7DF9,0x7DFA,0x7E08,0x7E10, +0x7E11,0x7E15,0x7E17,0x7E1C,0x7E1D,0x7E20,0x7E27,0x7E28, +0x7E2C,0x7E2D,0x7E2F,0x7E33,0x7E36,0x7E3F,0x7E44,0x7E45, +0x7E47,0x7E4E,0x7E50,0x7E52,0x7E58,0x7E5F,0x7E61,0x7E62, +0x7E65,0x7E6B,0x7E6E,0x7E6F,0x7E73,0x7E78,0x7E7E,0x7E81, +0x7E86,0x7E87,0x7E8A,0x7E8D,0x7E91,0x7E95,0x7E98,0x7E9A, +0x7E9D,0x7E9E,0x7F3C,0x7F3B,0x7F3D,0x7F3E,0x7F3F,0x7F43, +0x7F44,0x7F47,0x7F4F,0x7F52,0x7F53,0x7F5B,0x7F5C,0x7F5D, +0x7F61,0x7F63,0x7F64,0x7F65,0x7F66,0x7F6D}; + +/* page 45 0x5521-0x557E */ +static uint16 tab_jisx0212_uni45[]={ +0x7F71,0x7F7D,0x7F7E,0x7F7F,0x7F80,0x7F8B,0x7F8D,0x7F8F, +0x7F90,0x7F91,0x7F96,0x7F97,0x7F9C,0x7FA1,0x7FA2,0x7FA6, +0x7FAA,0x7FAD,0x7FB4,0x7FBC,0x7FBF,0x7FC0,0x7FC3,0x7FC8, +0x7FCE,0x7FCF,0x7FDB,0x7FDF,0x7FE3,0x7FE5,0x7FE8,0x7FEC, +0x7FEE,0x7FEF,0x7FF2,0x7FFA,0x7FFD,0x7FFE,0x7FFF,0x8007, +0x8008,0x800A,0x800D,0x800E,0x800F,0x8011,0x8013,0x8014, +0x8016,0x801D,0x801E,0x801F,0x8020,0x8024,0x8026,0x802C, +0x802E,0x8030,0x8034,0x8035,0x8037,0x8039,0x803A,0x803C, +0x803E,0x8040,0x8044,0x8060,0x8064,0x8066,0x806D,0x8071, +0x8075,0x8081,0x8088,0x808E,0x809C,0x809E,0x80A6,0x80A7, +0x80AB,0x80B8,0x80B9,0x80C8,0x80CD,0x80CF,0x80D2,0x80D4, +0x80D5,0x80D7,0x80D8,0x80E0,0x80ED,0x80EE}; + +/* page 46 0x5621-0x567E */ +static uint16 tab_jisx0212_uni46[]={ +0x80F0,0x80F2,0x80F3,0x80F6,0x80F9,0x80FA,0x80FE,0x8103, +0x810B,0x8116,0x8117,0x8118,0x811C,0x811E,0x8120,0x8124, +0x8127,0x812C,0x8130,0x8135,0x813A,0x813C,0x8145,0x8147, +0x814A,0x814C,0x8152,0x8157,0x8160,0x8161,0x8167,0x8168, +0x8169,0x816D,0x816F,0x8177,0x8181,0x8190,0x8184,0x8185, +0x8186,0x818B,0x818E,0x8196,0x8198,0x819B,0x819E,0x81A2, +0x81AE,0x81B2,0x81B4,0x81BB,0x81CB,0x81C3,0x81C5,0x81CA, +0x81CE,0x81CF,0x81D5,0x81D7,0x81DB,0x81DD,0x81DE,0x81E1, +0x81E4,0x81EB,0x81EC,0x81F0,0x81F1,0x81F2,0x81F5,0x81F6, +0x81F8,0x81F9,0x81FD,0x81FF,0x8200,0x8203,0x820F,0x8213, +0x8214,0x8219,0x821A,0x821D,0x8221,0x8222,0x8228,0x8232, +0x8234,0x823A,0x8243,0x8244,0x8245,0x8246}; + +/* page 47 0x5721-0x577E */ +static uint16 tab_jisx0212_uni47[]={ +0x824B,0x824E,0x824F,0x8251,0x8256,0x825C,0x8260,0x8263, +0x8267,0x826D,0x8274,0x827B,0x827D,0x827F,0x8280,0x8281, +0x8283,0x8284,0x8287,0x8289,0x828A,0x828E,0x8291,0x8294, +0x8296,0x8298,0x829A,0x829B,0x82A0,0x82A1,0x82A3,0x82A4, +0x82A7,0x82A8,0x82A9,0x82AA,0x82AE,0x82B0,0x82B2,0x82B4, +0x82B7,0x82BA,0x82BC,0x82BE,0x82BF,0x82C6,0x82D0,0x82D5, +0x82DA,0x82E0,0x82E2,0x82E4,0x82E8,0x82EA,0x82ED,0x82EF, +0x82F6,0x82F7,0x82FD,0x82FE,0x8300,0x8301,0x8307,0x8308, +0x830A,0x830B,0x8354,0x831B,0x831D,0x831E,0x831F,0x8321, +0x8322,0x832C,0x832D,0x832E,0x8330,0x8333,0x8337,0x833A, +0x833C,0x833D,0x8342,0x8343,0x8344,0x8347,0x834D,0x834E, +0x8351,0x8355,0x8356,0x8357,0x8370,0x8378}; + +/* page 48 0x5821-0x587E */ +static uint16 tab_jisx0212_uni48[]={ +0x837D,0x837F,0x8380,0x8382,0x8384,0x8386,0x838D,0x8392, +0x8394,0x8395,0x8398,0x8399,0x839B,0x839C,0x839D,0x83A6, +0x83A7,0x83A9,0x83AC,0x83BE,0x83BF,0x83C0,0x83C7,0x83C9, +0x83CF,0x83D0,0x83D1,0x83D4,0x83DD,0x8353,0x83E8,0x83EA, +0x83F6,0x83F8,0x83F9,0x83FC,0x8401,0x8406,0x840A,0x840F, +0x8411,0x8415,0x8419,0x83AD,0x842F,0x8439,0x8445,0x8447, +0x8448,0x844A,0x844D,0x844F,0x8451,0x8452,0x8456,0x8458, +0x8459,0x845A,0x845C,0x8460,0x8464,0x8465,0x8467,0x846A, +0x8470,0x8473,0x8474,0x8476,0x8478,0x847C,0x847D,0x8481, +0x8485,0x8492,0x8493,0x8495,0x849E,0x84A6,0x84A8,0x84A9, +0x84AA,0x84AF,0x84B1,0x84B4,0x84BA,0x84BD,0x84BE,0x84C0, +0x84C2,0x84C7,0x84C8,0x84CC,0x84CF,0x84D3}; + +/* page 49 0x5921-0x597E */ +static uint16 tab_jisx0212_uni49[]={ +0x84DC,0x84E7,0x84EA,0x84EF,0x84F0,0x84F1,0x84F2,0x84F7, +0x8532,0x84FA,0x84FB,0x84FD,0x8502,0x8503,0x8507,0x850C, +0x850E,0x8510,0x851C,0x851E,0x8522,0x8523,0x8524,0x8525, +0x8527,0x852A,0x852B,0x852F,0x8533,0x8534,0x8536,0x853F, +0x8546,0x854F,0x8550,0x8551,0x8552,0x8553,0x8556,0x8559, +0x855C,0x855D,0x855E,0x855F,0x8560,0x8561,0x8562,0x8564, +0x856B,0x856F,0x8579,0x857A,0x857B,0x857D,0x857F,0x8581, +0x8585,0x8586,0x8589,0x858B,0x858C,0x858F,0x8593,0x8598, +0x859D,0x859F,0x85A0,0x85A2,0x85A5,0x85A7,0x85B4,0x85B6, +0x85B7,0x85B8,0x85BC,0x85BD,0x85BE,0x85BF,0x85C2,0x85C7, +0x85CA,0x85CB,0x85CE,0x85AD,0x85D8,0x85DA,0x85DF,0x85E0, +0x85E6,0x85E8,0x85ED,0x85F3,0x85F6,0x85FC}; + +/* page 50 0x5A21-0x5A7E */ +static uint16 tab_jisx0212_uni50[]={ +0x85FF,0x8600,0x8604,0x8605,0x860D,0x860E,0x8610,0x8611, +0x8612,0x8618,0x8619,0x861B,0x861E,0x8621,0x8627,0x8629, +0x8636,0x8638,0x863A,0x863C,0x863D,0x8640,0x8642,0x8646, +0x8652,0x8653,0x8656,0x8657,0x8658,0x8659,0x865D,0x8660, +0x8661,0x8662,0x8663,0x8664,0x8669,0x866C,0x866F,0x8675, +0x8676,0x8677,0x867A,0x868D,0x8691,0x8696,0x8698,0x869A, +0x869C,0x86A1,0x86A6,0x86A7,0x86A8,0x86AD,0x86B1,0x86B3, +0x86B4,0x86B5,0x86B7,0x86B8,0x86B9,0x86BF,0x86C0,0x86C1, +0x86C3,0x86C5,0x86D1,0x86D2,0x86D5,0x86D7,0x86DA,0x86DC, +0x86E0,0x86E3,0x86E5,0x86E7,0x8688,0x86FA,0x86FC,0x86FD, +0x8704,0x8705,0x8707,0x870B,0x870E,0x870F,0x8710,0x8713, +0x8714,0x8719,0x871E,0x871F,0x8721,0x8723}; + +/* page 51 0x5B21-0x5B7E */ +static uint16 tab_jisx0212_uni51[]={ +0x8728,0x872E,0x872F,0x8731,0x8732,0x8739,0x873A,0x873C, +0x873D,0x873E,0x8740,0x8743,0x8745,0x874D,0x8758,0x875D, +0x8761,0x8764,0x8765,0x876F,0x8771,0x8772,0x877B,0x8783, +0x8784,0x8785,0x8786,0x8787,0x8788,0x8789,0x878B,0x878C, +0x8790,0x8793,0x8795,0x8797,0x8798,0x8799,0x879E,0x87A0, +0x87A3,0x87A7,0x87AC,0x87AD,0x87AE,0x87B1,0x87B5,0x87BE, +0x87BF,0x87C1,0x87C8,0x87C9,0x87CA,0x87CE,0x87D5,0x87D6, +0x87D9,0x87DA,0x87DC,0x87DF,0x87E2,0x87E3,0x87E4,0x87EA, +0x87EB,0x87ED,0x87F1,0x87F3,0x87F8,0x87FA,0x87FF,0x8801, +0x8803,0x8806,0x8809,0x880A,0x880B,0x8810,0x8819,0x8812, +0x8813,0x8814,0x8818,0x881A,0x881B,0x881C,0x881E,0x881F, +0x8828,0x882D,0x882E,0x8830,0x8832,0x8835}; + +/* page 52 0x5C21-0x5C7E */ +static uint16 tab_jisx0212_uni52[]={ +0x883A,0x883C,0x8841,0x8843,0x8845,0x8848,0x8849,0x884A, +0x884B,0x884E,0x8851,0x8855,0x8856,0x8858,0x885A,0x885C, +0x885F,0x8860,0x8864,0x8869,0x8871,0x8879,0x887B,0x8880, +0x8898,0x889A,0x889B,0x889C,0x889F,0x88A0,0x88A8,0x88AA, +0x88BA,0x88BD,0x88BE,0x88C0,0x88CA,0x88CB,0x88CC,0x88CD, +0x88CE,0x88D1,0x88D2,0x88D3,0x88DB,0x88DE,0x88E7,0x88EF, +0x88F0,0x88F1,0x88F5,0x88F7,0x8901,0x8906,0x890D,0x890E, +0x890F,0x8915,0x8916,0x8918,0x8919,0x891A,0x891C,0x8920, +0x8926,0x8927,0x8928,0x8930,0x8931,0x8932,0x8935,0x8939, +0x893A,0x893E,0x8940,0x8942,0x8945,0x8946,0x8949,0x894F, +0x8952,0x8957,0x895A,0x895B,0x895C,0x8961,0x8962,0x8963, +0x896B,0x896E,0x8970,0x8973,0x8975,0x897A}; + +/* page 53 0x5D21-0x5D7E */ +static uint16 tab_jisx0212_uni53[]={ +0x897B,0x897C,0x897D,0x8989,0x898D,0x8990,0x8994,0x8995, +0x899B,0x899C,0x899F,0x89A0,0x89A5,0x89B0,0x89B4,0x89B5, +0x89B6,0x89B7,0x89BC,0x89D4,0x89D5,0x89D6,0x89D7,0x89D8, +0x89E5,0x89E9,0x89EB,0x89ED,0x89F1,0x89F3,0x89F6,0x89F9, +0x89FD,0x89FF,0x8A04,0x8A05,0x8A07,0x8A0F,0x8A11,0x8A12, +0x8A14,0x8A15,0x8A1E,0x8A20,0x8A22,0x8A24,0x8A26,0x8A2B, +0x8A2C,0x8A2F,0x8A35,0x8A37,0x8A3D,0x8A3E,0x8A40,0x8A43, +0x8A45,0x8A47,0x8A49,0x8A4D,0x8A4E,0x8A53,0x8A56,0x8A57, +0x8A58,0x8A5C,0x8A5D,0x8A61,0x8A65,0x8A67,0x8A75,0x8A76, +0x8A77,0x8A79,0x8A7A,0x8A7B,0x8A7E,0x8A7F,0x8A80,0x8A83, +0x8A86,0x8A8B,0x8A8F,0x8A90,0x8A92,0x8A96,0x8A97,0x8A99, +0x8A9F,0x8AA7,0x8AA9,0x8AAE,0x8AAF,0x8AB3}; + +/* page 54 0x5E21-0x5E7E */ +static uint16 tab_jisx0212_uni54[]={ +0x8AB6,0x8AB7,0x8ABB,0x8ABE,0x8AC3,0x8AC6,0x8AC8,0x8AC9, +0x8ACA,0x8AD1,0x8AD3,0x8AD4,0x8AD5,0x8AD7,0x8ADD,0x8ADF, +0x8AEC,0x8AF0,0x8AF4,0x8AF5,0x8AF6,0x8AFC,0x8AFF,0x8B05, +0x8B06,0x8B0B,0x8B11,0x8B1C,0x8B1E,0x8B1F,0x8B0A,0x8B2D, +0x8B30,0x8B37,0x8B3C,0x8B42,0x8B43,0x8B44,0x8B45,0x8B46, +0x8B48,0x8B52,0x8B53,0x8B54,0x8B59,0x8B4D,0x8B5E,0x8B63, +0x8B6D,0x8B76,0x8B78,0x8B79,0x8B7C,0x8B7E,0x8B81,0x8B84, +0x8B85,0x8B8B,0x8B8D,0x8B8F,0x8B94,0x8B95,0x8B9C,0x8B9E, +0x8B9F,0x8C38,0x8C39,0x8C3D,0x8C3E,0x8C45,0x8C47,0x8C49, +0x8C4B,0x8C4F,0x8C51,0x8C53,0x8C54,0x8C57,0x8C58,0x8C5B, +0x8C5D,0x8C59,0x8C63,0x8C64,0x8C66,0x8C68,0x8C69,0x8C6D, +0x8C73,0x8C75,0x8C76,0x8C7B,0x8C7E,0x8C86}; + +/* page 55 0x5F21-0x5F7E */ +static uint16 tab_jisx0212_uni55[]={ +0x8C87,0x8C8B,0x8C90,0x8C92,0x8C93,0x8C99,0x8C9B,0x8C9C, +0x8CA4,0x8CB9,0x8CBA,0x8CC5,0x8CC6,0x8CC9,0x8CCB,0x8CCF, +0x8CD6,0x8CD5,0x8CD9,0x8CDD,0x8CE1,0x8CE8,0x8CEC,0x8CEF, +0x8CF0,0x8CF2,0x8CF5,0x8CF7,0x8CF8,0x8CFE,0x8CFF,0x8D01, +0x8D03,0x8D09,0x8D12,0x8D17,0x8D1B,0x8D65,0x8D69,0x8D6C, +0x8D6E,0x8D7F,0x8D82,0x8D84,0x8D88,0x8D8D,0x8D90,0x8D91, +0x8D95,0x8D9E,0x8D9F,0x8DA0,0x8DA6,0x8DAB,0x8DAC,0x8DAF, +0x8DB2,0x8DB5,0x8DB7,0x8DB9,0x8DBB,0x8DC0,0x8DC5,0x8DC6, +0x8DC7,0x8DC8,0x8DCA,0x8DCE,0x8DD1,0x8DD4,0x8DD5,0x8DD7, +0x8DD9,0x8DE4,0x8DE5,0x8DE7,0x8DEC,0x8DF0,0x8DBC,0x8DF1, +0x8DF2,0x8DF4,0x8DFD,0x8E01,0x8E04,0x8E05,0x8E06,0x8E0B, +0x8E11,0x8E14,0x8E16,0x8E20,0x8E21,0x8E22}; + +/* page 56 0x6021-0x607E */ +static uint16 tab_jisx0212_uni56[]={ +0x8E23,0x8E26,0x8E27,0x8E31,0x8E33,0x8E36,0x8E37,0x8E38, +0x8E39,0x8E3D,0x8E40,0x8E41,0x8E4B,0x8E4D,0x8E4E,0x8E4F, +0x8E54,0x8E5B,0x8E5C,0x8E5D,0x8E5E,0x8E61,0x8E62,0x8E69, +0x8E6C,0x8E6D,0x8E6F,0x8E70,0x8E71,0x8E79,0x8E7A,0x8E7B, +0x8E82,0x8E83,0x8E89,0x8E90,0x8E92,0x8E95,0x8E9A,0x8E9B, +0x8E9D,0x8E9E,0x8EA2,0x8EA7,0x8EA9,0x8EAD,0x8EAE,0x8EB3, +0x8EB5,0x8EBA,0x8EBB,0x8EC0,0x8EC1,0x8EC3,0x8EC4,0x8EC7, +0x8ECF,0x8ED1,0x8ED4,0x8EDC,0x8EE8,0x8EEE,0x8EF0,0x8EF1, +0x8EF7,0x8EF9,0x8EFA,0x8EED,0x8F00,0x8F02,0x8F07,0x8F08, +0x8F0F,0x8F10,0x8F16,0x8F17,0x8F18,0x8F1E,0x8F20,0x8F21, +0x8F23,0x8F25,0x8F27,0x8F28,0x8F2C,0x8F2D,0x8F2E,0x8F34, +0x8F35,0x8F36,0x8F37,0x8F3A,0x8F40,0x8F41}; + +/* page 57 0x6121-0x617E */ +static uint16 tab_jisx0212_uni57[]={ +0x8F43,0x8F47,0x8F4F,0x8F51,0x8F52,0x8F53,0x8F54,0x8F55, +0x8F58,0x8F5D,0x8F5E,0x8F65,0x8F9D,0x8FA0,0x8FA1,0x8FA4, +0x8FA5,0x8FA6,0x8FB5,0x8FB6,0x8FB8,0x8FBE,0x8FC0,0x8FC1, +0x8FC6,0x8FCA,0x8FCB,0x8FCD,0x8FD0,0x8FD2,0x8FD3,0x8FD5, +0x8FE0,0x8FE3,0x8FE4,0x8FE8,0x8FEE,0x8FF1,0x8FF5,0x8FF6, +0x8FFB,0x8FFE,0x9002,0x9004,0x9008,0x900C,0x9018,0x901B, +0x9028,0x9029,0x902F,0x902A,0x902C,0x902D,0x9033,0x9034, +0x9037,0x903F,0x9043,0x9044,0x904C,0x905B,0x905D,0x9062, +0x9066,0x9067,0x906C,0x9070,0x9074,0x9079,0x9085,0x9088, +0x908B,0x908C,0x908E,0x9090,0x9095,0x9097,0x9098,0x9099, +0x909B,0x90A0,0x90A1,0x90A2,0x90A5,0x90B0,0x90B2,0x90B3, +0x90B4,0x90B6,0x90BD,0x90CC,0x90BE,0x90C3}; + +/* page 58 0x6221-0x627E */ +static uint16 tab_jisx0212_uni58[]={ +0x90C4,0x90C5,0x90C7,0x90C8,0x90D5,0x90D7,0x90D8,0x90D9, +0x90DC,0x90DD,0x90DF,0x90E5,0x90D2,0x90F6,0x90EB,0x90EF, +0x90F0,0x90F4,0x90FE,0x90FF,0x9100,0x9104,0x9105,0x9106, +0x9108,0x910D,0x9110,0x9114,0x9116,0x9117,0x9118,0x911A, +0x911C,0x911E,0x9120,0x9125,0x9122,0x9123,0x9127,0x9129, +0x912E,0x912F,0x9131,0x9134,0x9136,0x9137,0x9139,0x913A, +0x913C,0x913D,0x9143,0x9147,0x9148,0x914F,0x9153,0x9157, +0x9159,0x915A,0x915B,0x9161,0x9164,0x9167,0x916D,0x9174, +0x9179,0x917A,0x917B,0x9181,0x9183,0x9185,0x9186,0x918A, +0x918E,0x9191,0x9193,0x9194,0x9195,0x9198,0x919E,0x91A1, +0x91A6,0x91A8,0x91AC,0x91AD,0x91AE,0x91B0,0x91B1,0x91B2, +0x91B3,0x91B6,0x91BB,0x91BC,0x91BD,0x91BF}; + +/* page 59 0x6321-0x637E */ +static uint16 tab_jisx0212_uni59[]={ +0x91C2,0x91C3,0x91C5,0x91D3,0x91D4,0x91D7,0x91D9,0x91DA, +0x91DE,0x91E4,0x91E5,0x91E9,0x91EA,0x91EC,0x91ED,0x91EE, +0x91EF,0x91F0,0x91F1,0x91F7,0x91F9,0x91FB,0x91FD,0x9200, +0x9201,0x9204,0x9205,0x9206,0x9207,0x9209,0x920A,0x920C, +0x9210,0x9212,0x9213,0x9216,0x9218,0x921C,0x921D,0x9223, +0x9224,0x9225,0x9226,0x9228,0x922E,0x922F,0x9230,0x9233, +0x9235,0x9236,0x9238,0x9239,0x923A,0x923C,0x923E,0x9240, +0x9242,0x9243,0x9246,0x9247,0x924A,0x924D,0x924E,0x924F, +0x9251,0x9258,0x9259,0x925C,0x925D,0x9260,0x9261,0x9265, +0x9267,0x9268,0x9269,0x926E,0x926F,0x9270,0x9275,0x9276, +0x9277,0x9278,0x9279,0x927B,0x927C,0x927D,0x927F,0x9288, +0x9289,0x928A,0x928D,0x928E,0x9292,0x9297}; + +/* page 60 0x6421-0x647E */ +static uint16 tab_jisx0212_uni60[]={ +0x9299,0x929F,0x92A0,0x92A4,0x92A5,0x92A7,0x92A8,0x92AB, +0x92AF,0x92B2,0x92B6,0x92B8,0x92BA,0x92BB,0x92BC,0x92BD, +0x92BF,0x92C0,0x92C1,0x92C2,0x92C3,0x92C5,0x92C6,0x92C7, +0x92C8,0x92CB,0x92CC,0x92CD,0x92CE,0x92D0,0x92D3,0x92D5, +0x92D7,0x92D8,0x92D9,0x92DC,0x92DD,0x92DF,0x92E0,0x92E1, +0x92E3,0x92E5,0x92E7,0x92E8,0x92EC,0x92EE,0x92F0,0x92F9, +0x92FB,0x92FF,0x9300,0x9302,0x9308,0x930D,0x9311,0x9314, +0x9315,0x931C,0x931D,0x931E,0x931F,0x9321,0x9324,0x9325, +0x9327,0x9329,0x932A,0x9333,0x9334,0x9336,0x9337,0x9347, +0x9348,0x9349,0x9350,0x9351,0x9352,0x9355,0x9357,0x9358, +0x935A,0x935E,0x9364,0x9365,0x9367,0x9369,0x936A,0x936D, +0x936F,0x9370,0x9371,0x9373,0x9374,0x9376}; + +/* page 61 0x6521-0x657E */ +static uint16 tab_jisx0212_uni61[]={ +0x937A,0x937D,0x937F,0x9380,0x9381,0x9382,0x9388,0x938A, +0x938B,0x938D,0x938F,0x9392,0x9395,0x9398,0x939B,0x939E, +0x93A1,0x93A3,0x93A4,0x93A6,0x93A8,0x93AB,0x93B4,0x93B5, +0x93B6,0x93BA,0x93A9,0x93C1,0x93C4,0x93C5,0x93C6,0x93C7, +0x93C9,0x93CA,0x93CB,0x93CC,0x93CD,0x93D3,0x93D9,0x93DC, +0x93DE,0x93DF,0x93E2,0x93E6,0x93E7,0x93F9,0x93F7,0x93F8, +0x93FA,0x93FB,0x93FD,0x9401,0x9402,0x9404,0x9408,0x9409, +0x940D,0x940E,0x940F,0x9415,0x9416,0x9417,0x941F,0x942E, +0x942F,0x9431,0x9432,0x9433,0x9434,0x943B,0x943F,0x943D, +0x9443,0x9445,0x9448,0x944A,0x944C,0x9455,0x9459,0x945C, +0x945F,0x9461,0x9463,0x9468,0x946B,0x946D,0x946E,0x946F, +0x9471,0x9472,0x9484,0x9483,0x9578,0x9579}; + +/* page 62 0x6621-0x667E */ +static uint16 tab_jisx0212_uni62[]={ +0x957E,0x9584,0x9588,0x958C,0x958D,0x958E,0x959D,0x959E, +0x959F,0x95A1,0x95A6,0x95A9,0x95AB,0x95AC,0x95B4,0x95B6, +0x95BA,0x95BD,0x95BF,0x95C6,0x95C8,0x95C9,0x95CB,0x95D0, +0x95D1,0x95D2,0x95D3,0x95D9,0x95DA,0x95DD,0x95DE,0x95DF, +0x95E0,0x95E4,0x95E6,0x961D,0x961E,0x9622,0x9624,0x9625, +0x9626,0x962C,0x9631,0x9633,0x9637,0x9638,0x9639,0x963A, +0x963C,0x963D,0x9641,0x9652,0x9654,0x9656,0x9657,0x9658, +0x9661,0x966E,0x9674,0x967B,0x967C,0x967E,0x967F,0x9681, +0x9682,0x9683,0x9684,0x9689,0x9691,0x9696,0x969A,0x969D, +0x969F,0x96A4,0x96A5,0x96A6,0x96A9,0x96AE,0x96AF,0x96B3, +0x96BA,0x96CA,0x96D2,0x5DB2,0x96D8,0x96DA,0x96DD,0x96DE, +0x96DF,0x96E9,0x96EF,0x96F1,0x96FA,0x9702}; + +/* page 63 0x6721-0x677E */ +static uint16 tab_jisx0212_uni63[]={ +0x9703,0x9705,0x9709,0x971A,0x971B,0x971D,0x9721,0x9722, +0x9723,0x9728,0x9731,0x9733,0x9741,0x9743,0x974A,0x974E, +0x974F,0x9755,0x9757,0x9758,0x975A,0x975B,0x9763,0x9767, +0x976A,0x976E,0x9773,0x9776,0x9777,0x9778,0x977B,0x977D, +0x977F,0x9780,0x9789,0x9795,0x9796,0x9797,0x9799,0x979A, +0x979E,0x979F,0x97A2,0x97AC,0x97AE,0x97B1,0x97B2,0x97B5, +0x97B6,0x97B8,0x97B9,0x97BA,0x97BC,0x97BE,0x97BF,0x97C1, +0x97C4,0x97C5,0x97C7,0x97C9,0x97CA,0x97CC,0x97CD,0x97CE, +0x97D0,0x97D1,0x97D4,0x97D7,0x97D8,0x97D9,0x97DD,0x97DE, +0x97E0,0x97DB,0x97E1,0x97E4,0x97EF,0x97F1,0x97F4,0x97F7, +0x97F8,0x97FA,0x9807,0x980A,0x9819,0x980D,0x980E,0x9814, +0x9816,0x981C,0x981E,0x9820,0x9823,0x9826}; + +/* page 64 0x6821-0x687E */ +static uint16 tab_jisx0212_uni64[]={ +0x982B,0x982E,0x982F,0x9830,0x9832,0x9833,0x9835,0x9825, +0x983E,0x9844,0x9847,0x984A,0x9851,0x9852,0x9853,0x9856, +0x9857,0x9859,0x985A,0x9862,0x9863,0x9865,0x9866,0x986A, +0x986C,0x98AB,0x98AD,0x98AE,0x98B0,0x98B4,0x98B7,0x98B8, +0x98BA,0x98BB,0x98BF,0x98C2,0x98C5,0x98C8,0x98CC,0x98E1, +0x98E3,0x98E5,0x98E6,0x98E7,0x98EA,0x98F3,0x98F6,0x9902, +0x9907,0x9908,0x9911,0x9915,0x9916,0x9917,0x991A,0x991B, +0x991C,0x991F,0x9922,0x9926,0x9927,0x992B,0x9931,0x9932, +0x9933,0x9934,0x9935,0x9939,0x993A,0x993B,0x993C,0x9940, +0x9941,0x9946,0x9947,0x9948,0x994D,0x994E,0x9954,0x9958, +0x9959,0x995B,0x995C,0x995E,0x995F,0x9960,0x999B,0x999D, +0x999F,0x99A6,0x99B0,0x99B1,0x99B2,0x99B5}; + +/* page 65 0x6921-0x697E */ +static uint16 tab_jisx0212_uni65[]={ +0x99B9,0x99BA,0x99BD,0x99BF,0x99C3,0x99C9,0x99D3,0x99D4, +0x99D9,0x99DA,0x99DC,0x99DE,0x99E7,0x99EA,0x99EB,0x99EC, +0x99F0,0x99F4,0x99F5,0x99F9,0x99FD,0x99FE,0x9A02,0x9A03, +0x9A04,0x9A0B,0x9A0C,0x9A10,0x9A11,0x9A16,0x9A1E,0x9A20, +0x9A22,0x9A23,0x9A24,0x9A27,0x9A2D,0x9A2E,0x9A33,0x9A35, +0x9A36,0x9A38,0x9A47,0x9A41,0x9A44,0x9A4A,0x9A4B,0x9A4C, +0x9A4E,0x9A51,0x9A54,0x9A56,0x9A5D,0x9AAA,0x9AAC,0x9AAE, +0x9AAF,0x9AB2,0x9AB4,0x9AB5,0x9AB6,0x9AB9,0x9ABB,0x9ABE, +0x9ABF,0x9AC1,0x9AC3,0x9AC6,0x9AC8,0x9ACE,0x9AD0,0x9AD2, +0x9AD5,0x9AD6,0x9AD7,0x9ADB,0x9ADC,0x9AE0,0x9AE4,0x9AE5, +0x9AE7,0x9AE9,0x9AEC,0x9AF2,0x9AF3,0x9AF5,0x9AF9,0x9AFA, +0x9AFD,0x9AFF,0x9B00,0x9B01,0x9B02,0x9B03}; + +/* page 66 0x6A21-0x6A7E */ +static uint16 tab_jisx0212_uni66[]={ +0x9B04,0x9B05,0x9B08,0x9B09,0x9B0B,0x9B0C,0x9B0D,0x9B0E, +0x9B10,0x9B12,0x9B16,0x9B19,0x9B1B,0x9B1C,0x9B20,0x9B26, +0x9B2B,0x9B2D,0x9B33,0x9B34,0x9B35,0x9B37,0x9B39,0x9B3A, +0x9B3D,0x9B48,0x9B4B,0x9B4C,0x9B55,0x9B56,0x9B57,0x9B5B, +0x9B5E,0x9B61,0x9B63,0x9B65,0x9B66,0x9B68,0x9B6A,0x9B6B, +0x9B6C,0x9B6D,0x9B6E,0x9B73,0x9B75,0x9B77,0x9B78,0x9B79, +0x9B7F,0x9B80,0x9B84,0x9B85,0x9B86,0x9B87,0x9B89,0x9B8A, +0x9B8B,0x9B8D,0x9B8F,0x9B90,0x9B94,0x9B9A,0x9B9D,0x9B9E, +0x9BA6,0x9BA7,0x9BA9,0x9BAC,0x9BB0,0x9BB1,0x9BB2,0x9BB7, +0x9BB8,0x9BBB,0x9BBC,0x9BBE,0x9BBF,0x9BC1,0x9BC7,0x9BC8, +0x9BCE,0x9BD0,0x9BD7,0x9BD8,0x9BDD,0x9BDF,0x9BE5,0x9BE7, +0x9BEA,0x9BEB,0x9BEF,0x9BF3,0x9BF7,0x9BF8}; + +/* page 67 0x6B21-0x6B7E */ +static uint16 tab_jisx0212_uni67[]={ +0x9BF9,0x9BFA,0x9BFD,0x9BFF,0x9C00,0x9C02,0x9C0B,0x9C0F, +0x9C11,0x9C16,0x9C18,0x9C19,0x9C1A,0x9C1C,0x9C1E,0x9C22, +0x9C23,0x9C26,0x9C27,0x9C28,0x9C29,0x9C2A,0x9C31,0x9C35, +0x9C36,0x9C37,0x9C3D,0x9C41,0x9C43,0x9C44,0x9C45,0x9C49, +0x9C4A,0x9C4E,0x9C4F,0x9C50,0x9C53,0x9C54,0x9C56,0x9C58, +0x9C5B,0x9C5D,0x9C5E,0x9C5F,0x9C63,0x9C69,0x9C6A,0x9C5C, +0x9C6B,0x9C68,0x9C6E,0x9C70,0x9C72,0x9C75,0x9C77,0x9C7B, +0x9CE6,0x9CF2,0x9CF7,0x9CF9,0x9D0B,0x9D02,0x9D11,0x9D17, +0x9D18,0x9D1C,0x9D1D,0x9D1E,0x9D2F,0x9D30,0x9D32,0x9D33, +0x9D34,0x9D3A,0x9D3C,0x9D45,0x9D3D,0x9D42,0x9D43,0x9D47, +0x9D4A,0x9D53,0x9D54,0x9D5F,0x9D63,0x9D62,0x9D65,0x9D69, +0x9D6A,0x9D6B,0x9D70,0x9D76,0x9D77,0x9D7B}; + +/* page 68 0x6C21-0x6C7E */ +static uint16 tab_jisx0212_uni68[]={ +0x9D7C,0x9D7E,0x9D83,0x9D84,0x9D86,0x9D8A,0x9D8D,0x9D8E, +0x9D92,0x9D93,0x9D95,0x9D96,0x9D97,0x9D98,0x9DA1,0x9DAA, +0x9DAC,0x9DAE,0x9DB1,0x9DB5,0x9DB9,0x9DBC,0x9DBF,0x9DC3, +0x9DC7,0x9DC9,0x9DCA,0x9DD4,0x9DD5,0x9DD6,0x9DD7,0x9DDA, +0x9DDE,0x9DDF,0x9DE0,0x9DE5,0x9DE7,0x9DE9,0x9DEB,0x9DEE, +0x9DF0,0x9DF3,0x9DF4,0x9DFE,0x9E0A,0x9E02,0x9E07,0x9E0E, +0x9E10,0x9E11,0x9E12,0x9E15,0x9E16,0x9E19,0x9E1C,0x9E1D, +0x9E7A,0x9E7B,0x9E7C,0x9E80,0x9E82,0x9E83,0x9E84,0x9E85, +0x9E87,0x9E8E,0x9E8F,0x9E96,0x9E98,0x9E9B,0x9E9E,0x9EA4, +0x9EA8,0x9EAC,0x9EAE,0x9EAF,0x9EB0,0x9EB3,0x9EB4,0x9EB5, +0x9EC6,0x9EC8,0x9ECB,0x9ED5,0x9EDF,0x9EE4,0x9EE7,0x9EEC, +0x9EED,0x9EEE,0x9EF0,0x9EF1,0x9EF2,0x9EF5}; + +/* page 69 0x6D21-0x6D63 */ +static uint16 tab_jisx0212_uni69[]={ +0x9EF8,0x9EFF,0x9F02,0x9F03,0x9F09,0x9F0F,0x9F10,0x9F11, +0x9F12,0x9F14,0x9F16,0x9F17,0x9F19,0x9F1A,0x9F1B,0x9F1F, +0x9F22,0x9F26,0x9F2A,0x9F2B,0x9F2F,0x9F31,0x9F32,0x9F34, +0x9F37,0x9F39,0x9F3A,0x9F3C,0x9F3D,0x9F3F,0x9F41,0x9F43, +0x9F44,0x9F45,0x9F46,0x9F47,0x9F53,0x9F55,0x9F56,0x9F57, +0x9F58,0x9F5A,0x9F5D,0x9F5E,0x9F68,0x9F69,0x9F6D,0x9F6E, +0x9F6F,0x9F70,0x9F71,0x9F73,0x9F75,0x9F7A,0x9F7D,0x9F8F, +0x9F90,0x9F91,0x9F92,0x9F94,0x9F96,0x9F97,0x9F9E,0x9FA1, +0x9FA2,0x9FA3,0x9FA5}; + +static int +my_jisx0212_uni_onechar(int code){ + if ((code>=0x222F)&&(code<=0x2244)) + return(tab_jisx0212_uni0[code-0x222F]); + if ((code>=0x226B)&&(code<=0x2271)) + return(tab_jisx0212_uni1[code-0x226B]); + if ((code>=0x2661)&&(code<=0x267C)) + return(tab_jisx0212_uni2[code-0x2661]); + if ((code>=0x2742)&&(code<=0x274E)) + return(tab_jisx0212_uni3[code-0x2742]); + if ((code>=0x2772)&&(code<=0x277E)) + return(tab_jisx0212_uni4[code-0x2772]); + if ((code>=0x2921)&&(code<=0x2950)) + return(tab_jisx0212_uni5[code-0x2921]); + if ((code>=0x2A21)&&(code<=0x2A77)) + return(tab_jisx0212_uni6[code-0x2A21]); + if ((code>=0x2B21)&&(code<=0x2B77)) + return(tab_jisx0212_uni7[code-0x2B21]); + if ((code>=0x3021)&&(code<=0x307E)) + return(tab_jisx0212_uni8[code-0x3021]); + if ((code>=0x3121)&&(code<=0x317E)) + return(tab_jisx0212_uni9[code-0x3121]); + if ((code>=0x3221)&&(code<=0x327E)) + return(tab_jisx0212_uni10[code-0x3221]); + if ((code>=0x3321)&&(code<=0x337E)) + return(tab_jisx0212_uni11[code-0x3321]); + if ((code>=0x3421)&&(code<=0x347E)) + return(tab_jisx0212_uni12[code-0x3421]); + if ((code>=0x3521)&&(code<=0x357E)) + return(tab_jisx0212_uni13[code-0x3521]); + if ((code>=0x3621)&&(code<=0x367E)) + return(tab_jisx0212_uni14[code-0x3621]); + if ((code>=0x3721)&&(code<=0x377E)) + return(tab_jisx0212_uni15[code-0x3721]); + if ((code>=0x3821)&&(code<=0x387E)) + return(tab_jisx0212_uni16[code-0x3821]); + if ((code>=0x3921)&&(code<=0x397E)) + return(tab_jisx0212_uni17[code-0x3921]); + if ((code>=0x3A21)&&(code<=0x3A7E)) + return(tab_jisx0212_uni18[code-0x3A21]); + if ((code>=0x3B21)&&(code<=0x3B7E)) + return(tab_jisx0212_uni19[code-0x3B21]); + if ((code>=0x3C21)&&(code<=0x3C7E)) + return(tab_jisx0212_uni20[code-0x3C21]); + if ((code>=0x3D21)&&(code<=0x3D7E)) + return(tab_jisx0212_uni21[code-0x3D21]); + if ((code>=0x3E21)&&(code<=0x3E7E)) + return(tab_jisx0212_uni22[code-0x3E21]); + if ((code>=0x3F21)&&(code<=0x3F7E)) + return(tab_jisx0212_uni23[code-0x3F21]); + if ((code>=0x4021)&&(code<=0x407E)) + return(tab_jisx0212_uni24[code-0x4021]); + if ((code>=0x4121)&&(code<=0x417E)) + return(tab_jisx0212_uni25[code-0x4121]); + if ((code>=0x4221)&&(code<=0x427E)) + return(tab_jisx0212_uni26[code-0x4221]); + if ((code>=0x4321)&&(code<=0x437E)) + return(tab_jisx0212_uni27[code-0x4321]); + if ((code>=0x4421)&&(code<=0x447E)) + return(tab_jisx0212_uni28[code-0x4421]); + if ((code>=0x4521)&&(code<=0x457E)) + return(tab_jisx0212_uni29[code-0x4521]); + if ((code>=0x4621)&&(code<=0x467E)) + return(tab_jisx0212_uni30[code-0x4621]); + if ((code>=0x4721)&&(code<=0x477E)) + return(tab_jisx0212_uni31[code-0x4721]); + if ((code>=0x4821)&&(code<=0x487E)) + return(tab_jisx0212_uni32[code-0x4821]); + if ((code>=0x4921)&&(code<=0x497E)) + return(tab_jisx0212_uni33[code-0x4921]); + if ((code>=0x4A21)&&(code<=0x4A7E)) + return(tab_jisx0212_uni34[code-0x4A21]); + if ((code>=0x4B21)&&(code<=0x4B7E)) + return(tab_jisx0212_uni35[code-0x4B21]); + if ((code>=0x4C21)&&(code<=0x4C7E)) + return(tab_jisx0212_uni36[code-0x4C21]); + if ((code>=0x4D21)&&(code<=0x4D7E)) + return(tab_jisx0212_uni37[code-0x4D21]); + if ((code>=0x4E21)&&(code<=0x4E7E)) + return(tab_jisx0212_uni38[code-0x4E21]); + if ((code>=0x4F21)&&(code<=0x4F7E)) + return(tab_jisx0212_uni39[code-0x4F21]); + if ((code>=0x5021)&&(code<=0x507E)) + return(tab_jisx0212_uni40[code-0x5021]); + if ((code>=0x5121)&&(code<=0x517E)) + return(tab_jisx0212_uni41[code-0x5121]); + if ((code>=0x5221)&&(code<=0x527E)) + return(tab_jisx0212_uni42[code-0x5221]); + if ((code>=0x5321)&&(code<=0x537E)) + return(tab_jisx0212_uni43[code-0x5321]); + if ((code>=0x5421)&&(code<=0x547E)) + return(tab_jisx0212_uni44[code-0x5421]); + if ((code>=0x5521)&&(code<=0x557E)) + return(tab_jisx0212_uni45[code-0x5521]); + if ((code>=0x5621)&&(code<=0x567E)) + return(tab_jisx0212_uni46[code-0x5621]); + if ((code>=0x5721)&&(code<=0x577E)) + return(tab_jisx0212_uni47[code-0x5721]); + if ((code>=0x5821)&&(code<=0x587E)) + return(tab_jisx0212_uni48[code-0x5821]); + if ((code>=0x5921)&&(code<=0x597E)) + return(tab_jisx0212_uni49[code-0x5921]); + if ((code>=0x5A21)&&(code<=0x5A7E)) + return(tab_jisx0212_uni50[code-0x5A21]); + if ((code>=0x5B21)&&(code<=0x5B7E)) + return(tab_jisx0212_uni51[code-0x5B21]); + if ((code>=0x5C21)&&(code<=0x5C7E)) + return(tab_jisx0212_uni52[code-0x5C21]); + if ((code>=0x5D21)&&(code<=0x5D7E)) + return(tab_jisx0212_uni53[code-0x5D21]); + if ((code>=0x5E21)&&(code<=0x5E7E)) + return(tab_jisx0212_uni54[code-0x5E21]); + if ((code>=0x5F21)&&(code<=0x5F7E)) + return(tab_jisx0212_uni55[code-0x5F21]); + if ((code>=0x6021)&&(code<=0x607E)) + return(tab_jisx0212_uni56[code-0x6021]); + if ((code>=0x6121)&&(code<=0x617E)) + return(tab_jisx0212_uni57[code-0x6121]); + if ((code>=0x6221)&&(code<=0x627E)) + return(tab_jisx0212_uni58[code-0x6221]); + if ((code>=0x6321)&&(code<=0x637E)) + return(tab_jisx0212_uni59[code-0x6321]); + if ((code>=0x6421)&&(code<=0x647E)) + return(tab_jisx0212_uni60[code-0x6421]); + if ((code>=0x6521)&&(code<=0x657E)) + return(tab_jisx0212_uni61[code-0x6521]); + if ((code>=0x6621)&&(code<=0x667E)) + return(tab_jisx0212_uni62[code-0x6621]); + if ((code>=0x6721)&&(code<=0x677E)) + return(tab_jisx0212_uni63[code-0x6721]); + if ((code>=0x6821)&&(code<=0x687E)) + return(tab_jisx0212_uni64[code-0x6821]); + if ((code>=0x6921)&&(code<=0x697E)) + return(tab_jisx0212_uni65[code-0x6921]); + if ((code>=0x6A21)&&(code<=0x6A7E)) + return(tab_jisx0212_uni66[code-0x6A21]); + if ((code>=0x6B21)&&(code<=0x6B7E)) + return(tab_jisx0212_uni67[code-0x6B21]); + if ((code>=0x6C21)&&(code<=0x6C7E)) + return(tab_jisx0212_uni68[code-0x6C21]); + if ((code>=0x6D21)&&(code<=0x6D63)) + return(tab_jisx0212_uni69[code-0x6D21]); + return(0); +} + + + +/* + EUC-JP encoding subcomponents: + [x00-x7F] # ASCII/JIS-Roman (one-byte/character) + [x8E][xA0-xDF] # half-width katakana (two bytes/char) + [x8F][xA1-xFE][xA1-xFE] # JIS X 0212-1990 (three bytes/char) + [xA1-xFE][xA1-xFE] # JIS X 0208:1997 (two bytes/char) +*/ + +int +my_mb_wc_euc_jp(CHARSET_INFO *cs,my_wc_t *pwc, const uchar *s, const uchar *e) +{ + int c1,c2,c3; + + if (s>e) + return MY_CS_TOOFEW(0); + + c1=s[0]; + + /* Ascii code set */ + if (c1<=0x7F) + { + *pwc=c1; + return 1; + } + + if (s+2>e) + return MY_CS_TOOFEW(0); + + c2=s[1]; + + + /* JIS X 0208 code set */ + if (c1>=0xA1 && c1<=0xFE) + { + if (c2 < 0xA1 || c2 >0xFE) + return MY_CS_ILSEQ; + + if (c1 < 0xF5) + { + pwc[0]=my_jisx0208_uni_onechar( ((c1-0x80) << 8) + (c2-0x80)); + if (!pwc[0]) + return MY_CS_ILSEQ; + } + else + { + /* User defined range */ + pwc[0]=0xE000 + 94*(c1-0xF5) +(c2-0xA1); + } + return 2; + } + + /* JIS X 0201 code set (Half Width Tatakana) */ + if (c1==0x8E) + { + int ret; + + if (c2<0xA1 || c2>0xDF) + return MY_CS_ILSEQ; + + ret = my_mb_wc_jisx0201(cs,pwc,s+1,e); + if (ret!=1) + return ret; + return 2; + } + + /* JIS X 0212 code set */ + if (c1==0x8F) + { + if (c2<0xA1 || c2>=0xFF) + return MY_CS_ILSEQ; + + if (s+3>e) + return MY_CS_TOOFEW(0); + + c3=s[2]; + if (c3 < 0xA1 || c3>=0xFF) + return MY_CS_ILSEQ; + + if (c2<0xF5) + { + pwc[0]=my_jisx0212_uni_onechar((c2-0x80)*256 + (c3-0x80)); + if (!pwc) + return MY_CS_ILSEQ; + } + else + { + /* User defined range */ + pwc[0]= 0xE3AC + 94*(c2-0xF5) + (c3-0xA1); + } + return 3; + } + + return MY_CS_ILSEQ; +} + +int +my_wc_mb_euc_jp(CHARSET_INFO *c,my_wc_t wc, unsigned char *s, unsigned char *e) +{ + unsigned char buf[2]; + unsigned char c1; + int ret,jp; + + if (wc<0x80) + { + if (s>e) + return MY_CS_TOOSMALL; + + *s=wc; + return 1; + } + + if ((jp=my_uni_jisx0208_onechar(wc))) + { + if (s+2>e) + return MY_CS_TOOSMALL; + + jp+=0x8080; + s[0]=jp>>8; + s[1]=jp&0xFF; + return 2; + } + + ret=my_wc_mb_jisx0201(c,wc,buf,buf+2); + if (ret==1) + { + if (s+1>e) + return MY_CS_TOOSMALL; + + s[0]=0x8E; + s[1]=buf[0]; + return 1; + } + + + if ((jp=my_uni_jisx0212_onechar(wc))) + { + if (s+2>e) + return MY_CS_TOOSMALL; + + jp+=0x8080; + s[0]=0x8F; + s[1]=jp>>8; + s[2]=jp&0xFF; + return 3; + } + + + /* User defined range */ + if (wc>=0xE000 && wc<0xE3AC) + { + if (s+2>e) + return MY_CS_TOOSMALL; + + c1=((unsigned)(wc-0xE000)/94)+0xF5; + s[0]=c1; + c1=((unsigned)(wc-0xE000)%94)+0xa1; + s[1]=c1; + return 2; + } + + + /* User defined range */ + if (wc>=0xE3AC && wc<0xE758) + { + if (s+3>e) + return MY_CS_TOOSMALL; + + s[0]=0x8F; + c1=((unsigned)(wc-0xE3AC)/94)+0xF5; + s[1]=c1; + c1=((unsigned)(wc-0xE3AC)%94)+0xa1; + s[2]=c1; + return 3; + } + + return MY_CS_ILUNI; +} + + #endif diff --git a/strings/ctype.c b/strings/ctype.c index d3c8ccdf9b9..3be959e4f45 100644 --- a/strings/ctype.c +++ b/strings/ctype.c @@ -3582,24 +3582,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_ujis { - 12, /* number */ - "ujis", /* name */ + 12, /* number */ + "ujis", /* name */ ctype_ujis, to_lower_ujis, to_upper_ujis, sort_order_ujis, - NULL, /* tab_to_uni */ - NULL, /* tab_from_uni */ - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 3, /* mbmaxlen */ + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 3, /* mbmaxlen */ ismbchar_ujis, ismbhead_ujis, mbcharlen_ujis, - NULL, /* mb_wc */ - NULL, /* wc_mb */ + my_mb_wc_euc_jp, /* mb_wc */ + my_wc_mb_euc_jp, /* wc_mb */ my_caseup_str_mb, my_casedn_str_mb, my_caseup_mb, @@ -3612,24 +3612,24 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_utf8 { - 33, /* number */ - "utf8", /* name */ - ctype_utf8, /* ctype */ - to_lower_utf8, /* to_lower */ - to_upper_utf8, /* to_upper */ - to_upper_utf8, /* sort_order */ + 33, /* number */ + "utf8", /* name */ + ctype_utf8, /* ctype */ + to_lower_utf8, /* to_lower */ + to_upper_utf8, /* to_upper */ + to_upper_utf8, /* sort_order */ NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ 1, /* strxfrm_multiply */ - my_strnncoll_utf8, /* strnncoll */ - my_strnxfrm_utf8, /* strnxfrm */ - NULL, /* like_range */ - 6, /* mbmaxlen */ - my_ismbchar_utf8, /* ismbchar */ - my_ismbhead_utf8, /* ismbhead */ - my_mbcharlen_utf8, /* mbcharlen */ - my_utf8_uni, /* mb_wc */ - my_uni_utf8, /* wc_mb */ + my_strnncoll_utf8, /* strnncoll */ + my_strnxfrm_utf8, /* strnxfrm */ + NULL, /* like_range */ + 6, /* mbmaxlen */ + my_ismbchar_utf8, /* ismbchar */ + my_ismbhead_utf8, /* ismbhead */ + my_mbcharlen_utf8, /* mbcharlen */ + my_utf8_uni, /* mb_wc */ + my_uni_utf8, /* wc_mb */ my_caseup_str_utf8, my_casedn_str_utf8, my_caseup_utf8, -- cgit v1.2.1 From ad494a211ca565bcb6b7a64a9f7f41d4fbc5c4d4 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 29 Mar 2002 20:27:53 +0400 Subject: item_strfunc.cc: Fix for possible bug when string length is more than 64K sql/item_strfunc.cc: Fix for possible bug when string length is more than 64K --- sql/item_strfunc.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index df238a6c331..9c1daf2edb3 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1782,7 +1782,7 @@ String *Item_func_conv_charset::val_str(String *str) int cnvres; const uchar *s, *se; uchar *d, *d0, *de; - uint dmaxlen; + uint32 dmaxlen; String *arg= args[0]->val_str(str); CHARSET_INFO *from,*to; @@ -1833,7 +1833,7 @@ outp: break; }; - str->length((uint) (d-d0)); + str->length((uint32) (d-d0)); str->set_charset(to); return str; } @@ -1850,7 +1850,7 @@ String *Item_func_conv_charset3::val_str(String *str) int cnvres; const uchar *s, *se; uchar *d, *d0, *de; - uint dmaxlen; + uint32 dmaxlen; String *arg= args[0]->val_str(str); String *to_cs= args[1]->val_str(str); String *from_cs= args[2]->val_str(str); @@ -1905,7 +1905,7 @@ outp: break; }; - str->length((uint) (d-d0)); + str->length((uint32) (d-d0)); str->set_charset(to_charset); return str; } -- cgit v1.2.1 From 6fae288eeaf4425aa62074c791e62eccb9936144 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 29 Mar 2002 20:41:21 +0400 Subject: EUC-KR conversion routines --- strings/ctype-euc_kr.c | 8433 ++++++++++++++++++++++++++++++++++++++++++++++++ strings/ctype.c | 4 +- 2 files changed, 8435 insertions(+), 2 deletions(-) diff --git a/strings/ctype-euc_kr.c b/strings/ctype-euc_kr.c index b54c80ffe99..736a06f8139 100644 --- a/strings/ctype-euc_kr.c +++ b/strings/ctype-euc_kr.c @@ -201,4 +201,8437 @@ int mbcharlen_euc_kr(CHARSET_INFO *cs __attribute__((unused)),uint c) return (iseuc_kr(c) ? 2 : 0); } + +/* page 0 0x8141-0xC8FE */ +static uint16 tab_ksc5601_uni0[]={ +0xAC02,0xAC03,0xAC05,0xAC06,0xAC0B,0xAC0C,0xAC0D,0xAC0E, +0xAC0F,0xAC18,0xAC1E,0xAC1F,0xAC21,0xAC22,0xAC23,0xAC25, +0xAC26,0xAC27,0xAC28,0xAC29,0xAC2A,0xAC2B,0xAC2E,0xAC32, +0xAC33,0xAC34, 0, 0, 0, 0, 0, 0, +0xAC35,0xAC36,0xAC37,0xAC3A,0xAC3B,0xAC3D,0xAC3E,0xAC3F, +0xAC41,0xAC42,0xAC43,0xAC44,0xAC45,0xAC46,0xAC47,0xAC48, +0xAC49,0xAC4A,0xAC4C,0xAC4E,0xAC4F,0xAC50,0xAC51,0xAC52, +0xAC53,0xAC55, 0, 0, 0, 0, 0, 0, +0xAC56,0xAC57,0xAC59,0xAC5A,0xAC5B,0xAC5D,0xAC5E,0xAC5F, +0xAC60,0xAC61,0xAC62,0xAC63,0xAC64,0xAC65,0xAC66,0xAC67, +0xAC68,0xAC69,0xAC6A,0xAC6B,0xAC6C,0xAC6D,0xAC6E,0xAC6F, +0xAC72,0xAC73,0xAC75,0xAC76,0xAC79,0xAC7B,0xAC7C,0xAC7D, +0xAC7E,0xAC7F,0xAC82,0xAC87,0xAC88,0xAC8D,0xAC8E,0xAC8F, +0xAC91,0xAC92,0xAC93,0xAC95,0xAC96,0xAC97,0xAC98,0xAC99, +0xAC9A,0xAC9B,0xAC9E,0xACA2,0xACA3,0xACA4,0xACA5,0xACA6, +0xACA7,0xACAB,0xACAD,0xACAE,0xACB1,0xACB2,0xACB3,0xACB4, +0xACB5,0xACB6,0xACB7,0xACBA,0xACBE,0xACBF,0xACC0,0xACC2, +0xACC3,0xACC5,0xACC6,0xACC7,0xACC9,0xACCA,0xACCB,0xACCD, +0xACCE,0xACCF,0xACD0,0xACD1,0xACD2,0xACD3,0xACD4,0xACD6, +0xACD8,0xACD9,0xACDA,0xACDB,0xACDC,0xACDD,0xACDE,0xACDF, +0xACE2,0xACE3,0xACE5,0xACE6,0xACE9,0xACEB,0xACED,0xACEE, +0xACF2,0xACF4,0xACF7,0xACF8,0xACF9,0xACFA,0xACFB,0xACFE, +0xACFF,0xAD01,0xAD02,0xAD03,0xAD05,0xAD07,0xAD08,0xAD09, +0xAD0A,0xAD0B,0xAD0E,0xAD10,0xAD12,0xAD13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xAD14,0xAD15,0xAD16,0xAD17,0xAD19,0xAD1A,0xAD1B,0xAD1D, +0xAD1E,0xAD1F,0xAD21,0xAD22,0xAD23,0xAD24,0xAD25,0xAD26, +0xAD27,0xAD28,0xAD2A,0xAD2B,0xAD2E,0xAD2F,0xAD30,0xAD31, +0xAD32,0xAD33, 0, 0, 0, 0, 0, 0, +0xAD36,0xAD37,0xAD39,0xAD3A,0xAD3B,0xAD3D,0xAD3E,0xAD3F, +0xAD40,0xAD41,0xAD42,0xAD43,0xAD46,0xAD48,0xAD4A,0xAD4B, +0xAD4C,0xAD4D,0xAD4E,0xAD4F,0xAD51,0xAD52,0xAD53,0xAD55, +0xAD56,0xAD57, 0, 0, 0, 0, 0, 0, +0xAD59,0xAD5A,0xAD5B,0xAD5C,0xAD5D,0xAD5E,0xAD5F,0xAD60, +0xAD62,0xAD64,0xAD65,0xAD66,0xAD67,0xAD68,0xAD69,0xAD6A, +0xAD6B,0xAD6E,0xAD6F,0xAD71,0xAD72,0xAD77,0xAD78,0xAD79, +0xAD7A,0xAD7E,0xAD80,0xAD83,0xAD84,0xAD85,0xAD86,0xAD87, +0xAD8A,0xAD8B,0xAD8D,0xAD8E,0xAD8F,0xAD91,0xAD92,0xAD93, +0xAD94,0xAD95,0xAD96,0xAD97,0xAD98,0xAD99,0xAD9A,0xAD9B, +0xAD9E,0xAD9F,0xADA0,0xADA1,0xADA2,0xADA3,0xADA5,0xADA6, +0xADA7,0xADA8,0xADA9,0xADAA,0xADAB,0xADAC,0xADAD,0xADAE, +0xADAF,0xADB0,0xADB1,0xADB2,0xADB3,0xADB4,0xADB5,0xADB6, +0xADB8,0xADB9,0xADBA,0xADBB,0xADBC,0xADBD,0xADBE,0xADBF, +0xADC2,0xADC3,0xADC5,0xADC6,0xADC7,0xADC9,0xADCA,0xADCB, +0xADCC,0xADCD,0xADCE,0xADCF,0xADD2,0xADD4,0xADD5,0xADD6, +0xADD7,0xADD8,0xADD9,0xADDA,0xADDB,0xADDD,0xADDE,0xADDF, +0xADE1,0xADE2,0xADE3,0xADE5,0xADE6,0xADE7,0xADE8,0xADE9, +0xADEA,0xADEB,0xADEC,0xADED,0xADEE,0xADEF,0xADF0,0xADF1, +0xADF2,0xADF3,0xADF4,0xADF5,0xADF6,0xADF7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xADFA,0xADFB,0xADFD,0xADFE,0xAE02,0xAE03,0xAE04,0xAE05, +0xAE06,0xAE07,0xAE0A,0xAE0C,0xAE0E,0xAE0F,0xAE10,0xAE11, +0xAE12,0xAE13,0xAE15,0xAE16,0xAE17,0xAE18,0xAE19,0xAE1A, +0xAE1B,0xAE1C, 0, 0, 0, 0, 0, 0, +0xAE1D,0xAE1E,0xAE1F,0xAE20,0xAE21,0xAE22,0xAE23,0xAE24, +0xAE25,0xAE26,0xAE27,0xAE28,0xAE29,0xAE2A,0xAE2B,0xAE2C, +0xAE2D,0xAE2E,0xAE2F,0xAE32,0xAE33,0xAE35,0xAE36,0xAE39, +0xAE3B,0xAE3C, 0, 0, 0, 0, 0, 0, +0xAE3D,0xAE3E,0xAE3F,0xAE42,0xAE44,0xAE47,0xAE48,0xAE49, +0xAE4B,0xAE4F,0xAE51,0xAE52,0xAE53,0xAE55,0xAE57,0xAE58, +0xAE59,0xAE5A,0xAE5B,0xAE5E,0xAE62,0xAE63,0xAE64,0xAE66, +0xAE67,0xAE6A,0xAE6B,0xAE6D,0xAE6E,0xAE6F,0xAE71,0xAE72, +0xAE73,0xAE74,0xAE75,0xAE76,0xAE77,0xAE7A,0xAE7E,0xAE7F, +0xAE80,0xAE81,0xAE82,0xAE83,0xAE86,0xAE87,0xAE88,0xAE89, +0xAE8A,0xAE8B,0xAE8D,0xAE8E,0xAE8F,0xAE90,0xAE91,0xAE92, +0xAE93,0xAE94,0xAE95,0xAE96,0xAE97,0xAE98,0xAE99,0xAE9A, +0xAE9B,0xAE9C,0xAE9D,0xAE9E,0xAE9F,0xAEA0,0xAEA1,0xAEA2, +0xAEA3,0xAEA4,0xAEA5,0xAEA6,0xAEA7,0xAEA8,0xAEA9,0xAEAA, +0xAEAB,0xAEAC,0xAEAD,0xAEAE,0xAEAF,0xAEB0,0xAEB1,0xAEB2, +0xAEB3,0xAEB4,0xAEB5,0xAEB6,0xAEB7,0xAEB8,0xAEB9,0xAEBA, +0xAEBB,0xAEBF,0xAEC1,0xAEC2,0xAEC3,0xAEC5,0xAEC6,0xAEC7, +0xAEC8,0xAEC9,0xAECA,0xAECB,0xAECE,0xAED2,0xAED3,0xAED4, +0xAED5,0xAED6,0xAED7,0xAEDA,0xAEDB,0xAEDD,0xAEDE,0xAEDF, +0xAEE0,0xAEE1,0xAEE2,0xAEE3,0xAEE4,0xAEE5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xAEE6,0xAEE7,0xAEE9,0xAEEA,0xAEEC,0xAEEE,0xAEEF,0xAEF0, +0xAEF1,0xAEF2,0xAEF3,0xAEF5,0xAEF6,0xAEF7,0xAEF9,0xAEFA, +0xAEFB,0xAEFD,0xAEFE,0xAEFF,0xAF00,0xAF01,0xAF02,0xAF03, +0xAF04,0xAF05, 0, 0, 0, 0, 0, 0, +0xAF06,0xAF09,0xAF0A,0xAF0B,0xAF0C,0xAF0E,0xAF0F,0xAF11, +0xAF12,0xAF13,0xAF14,0xAF15,0xAF16,0xAF17,0xAF18,0xAF19, +0xAF1A,0xAF1B,0xAF1C,0xAF1D,0xAF1E,0xAF1F,0xAF20,0xAF21, +0xAF22,0xAF23, 0, 0, 0, 0, 0, 0, +0xAF24,0xAF25,0xAF26,0xAF27,0xAF28,0xAF29,0xAF2A,0xAF2B, +0xAF2E,0xAF2F,0xAF31,0xAF33,0xAF35,0xAF36,0xAF37,0xAF38, +0xAF39,0xAF3A,0xAF3B,0xAF3E,0xAF40,0xAF44,0xAF45,0xAF46, +0xAF47,0xAF4A,0xAF4B,0xAF4C,0xAF4D,0xAF4E,0xAF4F,0xAF51, +0xAF52,0xAF53,0xAF54,0xAF55,0xAF56,0xAF57,0xAF58,0xAF59, +0xAF5A,0xAF5B,0xAF5E,0xAF5F,0xAF60,0xAF61,0xAF62,0xAF63, +0xAF66,0xAF67,0xAF68,0xAF69,0xAF6A,0xAF6B,0xAF6C,0xAF6D, +0xAF6E,0xAF6F,0xAF70,0xAF71,0xAF72,0xAF73,0xAF74,0xAF75, +0xAF76,0xAF77,0xAF78,0xAF7A,0xAF7B,0xAF7C,0xAF7D,0xAF7E, +0xAF7F,0xAF81,0xAF82,0xAF83,0xAF85,0xAF86,0xAF87,0xAF89, +0xAF8A,0xAF8B,0xAF8C,0xAF8D,0xAF8E,0xAF8F,0xAF92,0xAF93, +0xAF94,0xAF96,0xAF97,0xAF98,0xAF99,0xAF9A,0xAF9B,0xAF9D, +0xAF9E,0xAF9F,0xAFA0,0xAFA1,0xAFA2,0xAFA3,0xAFA4,0xAFA5, +0xAFA6,0xAFA7,0xAFA8,0xAFA9,0xAFAA,0xAFAB,0xAFAC,0xAFAD, +0xAFAE,0xAFAF,0xAFB0,0xAFB1,0xAFB2,0xAFB3,0xAFB4,0xAFB5, +0xAFB6,0xAFB7,0xAFBA,0xAFBB,0xAFBD,0xAFBE, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xAFBF,0xAFC1,0xAFC2,0xAFC3,0xAFC4,0xAFC5,0xAFC6,0xAFCA, +0xAFCC,0xAFCF,0xAFD0,0xAFD1,0xAFD2,0xAFD3,0xAFD5,0xAFD6, +0xAFD7,0xAFD8,0xAFD9,0xAFDA,0xAFDB,0xAFDD,0xAFDE,0xAFDF, +0xAFE0,0xAFE1, 0, 0, 0, 0, 0, 0, +0xAFE2,0xAFE3,0xAFE4,0xAFE5,0xAFE6,0xAFE7,0xAFEA,0xAFEB, +0xAFEC,0xAFED,0xAFEE,0xAFEF,0xAFF2,0xAFF3,0xAFF5,0xAFF6, +0xAFF7,0xAFF9,0xAFFA,0xAFFB,0xAFFC,0xAFFD,0xAFFE,0xAFFF, +0xB002,0xB003, 0, 0, 0, 0, 0, 0, +0xB005,0xB006,0xB007,0xB008,0xB009,0xB00A,0xB00B,0xB00D, +0xB00E,0xB00F,0xB011,0xB012,0xB013,0xB015,0xB016,0xB017, +0xB018,0xB019,0xB01A,0xB01B,0xB01E,0xB01F,0xB020,0xB021, +0xB022,0xB023,0xB024,0xB025,0xB026,0xB027,0xB029,0xB02A, +0xB02B,0xB02C,0xB02D,0xB02E,0xB02F,0xB030,0xB031,0xB032, +0xB033,0xB034,0xB035,0xB036,0xB037,0xB038,0xB039,0xB03A, +0xB03B,0xB03C,0xB03D,0xB03E,0xB03F,0xB040,0xB041,0xB042, +0xB043,0xB046,0xB047,0xB049,0xB04B,0xB04D,0xB04F,0xB050, +0xB051,0xB052,0xB056,0xB058,0xB05A,0xB05B,0xB05C,0xB05E, +0xB05F,0xB060,0xB061,0xB062,0xB063,0xB064,0xB065,0xB066, +0xB067,0xB068,0xB069,0xB06A,0xB06B,0xB06C,0xB06D,0xB06E, +0xB06F,0xB070,0xB071,0xB072,0xB073,0xB074,0xB075,0xB076, +0xB077,0xB078,0xB079,0xB07A,0xB07B,0xB07E,0xB07F,0xB081, +0xB082,0xB083,0xB085,0xB086,0xB087,0xB088,0xB089,0xB08A, +0xB08B,0xB08E,0xB090,0xB092,0xB093,0xB094,0xB095,0xB096, +0xB097,0xB09B,0xB09D,0xB09E,0xB0A3,0xB0A4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xB0A5,0xB0A6,0xB0A7,0xB0AA,0xB0B0,0xB0B2,0xB0B6,0xB0B7, +0xB0B9,0xB0BA,0xB0BB,0xB0BD,0xB0BE,0xB0BF,0xB0C0,0xB0C1, +0xB0C2,0xB0C3,0xB0C6,0xB0CA,0xB0CB,0xB0CC,0xB0CD,0xB0CE, +0xB0CF,0xB0D2, 0, 0, 0, 0, 0, 0, +0xB0D3,0xB0D5,0xB0D6,0xB0D7,0xB0D9,0xB0DA,0xB0DB,0xB0DC, +0xB0DD,0xB0DE,0xB0DF,0xB0E1,0xB0E2,0xB0E3,0xB0E4,0xB0E6, +0xB0E7,0xB0E8,0xB0E9,0xB0EA,0xB0EB,0xB0EC,0xB0ED,0xB0EE, +0xB0EF,0xB0F0, 0, 0, 0, 0, 0, 0, +0xB0F1,0xB0F2,0xB0F3,0xB0F4,0xB0F5,0xB0F6,0xB0F7,0xB0F8, +0xB0F9,0xB0FA,0xB0FB,0xB0FC,0xB0FD,0xB0FE,0xB0FF,0xB100, +0xB101,0xB102,0xB103,0xB104,0xB105,0xB106,0xB107,0xB10A, +0xB10D,0xB10E,0xB10F,0xB111,0xB114,0xB115,0xB116,0xB117, +0xB11A,0xB11E,0xB11F,0xB120,0xB121,0xB122,0xB126,0xB127, +0xB129,0xB12A,0xB12B,0xB12D,0xB12E,0xB12F,0xB130,0xB131, +0xB132,0xB133,0xB136,0xB13A,0xB13B,0xB13C,0xB13D,0xB13E, +0xB13F,0xB142,0xB143,0xB145,0xB146,0xB147,0xB149,0xB14A, +0xB14B,0xB14C,0xB14D,0xB14E,0xB14F,0xB152,0xB153,0xB156, +0xB157,0xB159,0xB15A,0xB15B,0xB15D,0xB15E,0xB15F,0xB161, +0xB162,0xB163,0xB164,0xB165,0xB166,0xB167,0xB168,0xB169, +0xB16A,0xB16B,0xB16C,0xB16D,0xB16E,0xB16F,0xB170,0xB171, +0xB172,0xB173,0xB174,0xB175,0xB176,0xB177,0xB17A,0xB17B, +0xB17D,0xB17E,0xB17F,0xB181,0xB183,0xB184,0xB185,0xB186, +0xB187,0xB18A,0xB18C,0xB18E,0xB18F,0xB190,0xB191,0xB195, +0xB196,0xB197,0xB199,0xB19A,0xB19B,0xB19D, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xB19E,0xB19F,0xB1A0,0xB1A1,0xB1A2,0xB1A3,0xB1A4,0xB1A5, +0xB1A6,0xB1A7,0xB1A9,0xB1AA,0xB1AB,0xB1AC,0xB1AD,0xB1AE, +0xB1AF,0xB1B0,0xB1B1,0xB1B2,0xB1B3,0xB1B4,0xB1B5,0xB1B6, +0xB1B7,0xB1B8, 0, 0, 0, 0, 0, 0, +0xB1B9,0xB1BA,0xB1BB,0xB1BC,0xB1BD,0xB1BE,0xB1BF,0xB1C0, +0xB1C1,0xB1C2,0xB1C3,0xB1C4,0xB1C5,0xB1C6,0xB1C7,0xB1C8, +0xB1C9,0xB1CA,0xB1CB,0xB1CD,0xB1CE,0xB1CF,0xB1D1,0xB1D2, +0xB1D3,0xB1D5, 0, 0, 0, 0, 0, 0, +0xB1D6,0xB1D7,0xB1D8,0xB1D9,0xB1DA,0xB1DB,0xB1DE,0xB1E0, +0xB1E1,0xB1E2,0xB1E3,0xB1E4,0xB1E5,0xB1E6,0xB1E7,0xB1EA, +0xB1EB,0xB1ED,0xB1EE,0xB1EF,0xB1F1,0xB1F2,0xB1F3,0xB1F4, +0xB1F5,0xB1F6,0xB1F7,0xB1F8,0xB1FA,0xB1FC,0xB1FE,0xB1FF, +0xB200,0xB201,0xB202,0xB203,0xB206,0xB207,0xB209,0xB20A, +0xB20D,0xB20E,0xB20F,0xB210,0xB211,0xB212,0xB213,0xB216, +0xB218,0xB21A,0xB21B,0xB21C,0xB21D,0xB21E,0xB21F,0xB221, +0xB222,0xB223,0xB224,0xB225,0xB226,0xB227,0xB228,0xB229, +0xB22A,0xB22B,0xB22C,0xB22D,0xB22E,0xB22F,0xB230,0xB231, +0xB232,0xB233,0xB235,0xB236,0xB237,0xB238,0xB239,0xB23A, +0xB23B,0xB23D,0xB23E,0xB23F,0xB240,0xB241,0xB242,0xB243, +0xB244,0xB245,0xB246,0xB247,0xB248,0xB249,0xB24A,0xB24B, +0xB24C,0xB24D,0xB24E,0xB24F,0xB250,0xB251,0xB252,0xB253, +0xB254,0xB255,0xB256,0xB257,0xB259,0xB25A,0xB25B,0xB25D, +0xB25E,0xB25F,0xB261,0xB262,0xB263,0xB264,0xB265,0xB266, +0xB267,0xB26A,0xB26B,0xB26C,0xB26D,0xB26E, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xB26F,0xB270,0xB271,0xB272,0xB273,0xB276,0xB277,0xB278, +0xB279,0xB27A,0xB27B,0xB27D,0xB27E,0xB27F,0xB280,0xB281, +0xB282,0xB283,0xB286,0xB287,0xB288,0xB28A,0xB28B,0xB28C, +0xB28D,0xB28E, 0, 0, 0, 0, 0, 0, +0xB28F,0xB292,0xB293,0xB295,0xB296,0xB297,0xB29B,0xB29C, +0xB29D,0xB29E,0xB29F,0xB2A2,0xB2A4,0xB2A7,0xB2A8,0xB2A9, +0xB2AB,0xB2AD,0xB2AE,0xB2AF,0xB2B1,0xB2B2,0xB2B3,0xB2B5, +0xB2B6,0xB2B7, 0, 0, 0, 0, 0, 0, +0xB2B8,0xB2B9,0xB2BA,0xB2BB,0xB2BC,0xB2BD,0xB2BE,0xB2BF, +0xB2C0,0xB2C1,0xB2C2,0xB2C3,0xB2C4,0xB2C5,0xB2C6,0xB2C7, +0xB2CA,0xB2CB,0xB2CD,0xB2CE,0xB2CF,0xB2D1,0xB2D3,0xB2D4, +0xB2D5,0xB2D6,0xB2D7,0xB2DA,0xB2DC,0xB2DE,0xB2DF,0xB2E0, +0xB2E1,0xB2E3,0xB2E7,0xB2E9,0xB2EA,0xB2F0,0xB2F1,0xB2F2, +0xB2F6,0xB2FC,0xB2FD,0xB2FE,0xB302,0xB303,0xB305,0xB306, +0xB307,0xB309,0xB30A,0xB30B,0xB30C,0xB30D,0xB30E,0xB30F, +0xB312,0xB316,0xB317,0xB318,0xB319,0xB31A,0xB31B,0xB31D, +0xB31E,0xB31F,0xB320,0xB321,0xB322,0xB323,0xB324,0xB325, +0xB326,0xB327,0xB328,0xB329,0xB32A,0xB32B,0xB32C,0xB32D, +0xB32E,0xB32F,0xB330,0xB331,0xB332,0xB333,0xB334,0xB335, +0xB336,0xB337,0xB338,0xB339,0xB33A,0xB33B,0xB33C,0xB33D, +0xB33E,0xB33F,0xB340,0xB341,0xB342,0xB343,0xB344,0xB345, +0xB346,0xB347,0xB348,0xB349,0xB34A,0xB34B,0xB34C,0xB34D, +0xB34E,0xB34F,0xB350,0xB351,0xB352,0xB353,0xB357,0xB359, +0xB35A,0xB35D,0xB360,0xB361,0xB362,0xB363, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xB366,0xB368,0xB36A,0xB36C,0xB36D,0xB36F,0xB372,0xB373, +0xB375,0xB376,0xB377,0xB379,0xB37A,0xB37B,0xB37C,0xB37D, +0xB37E,0xB37F,0xB382,0xB386,0xB387,0xB388,0xB389,0xB38A, +0xB38B,0xB38D, 0, 0, 0, 0, 0, 0, +0xB38E,0xB38F,0xB391,0xB392,0xB393,0xB395,0xB396,0xB397, +0xB398,0xB399,0xB39A,0xB39B,0xB39C,0xB39D,0xB39E,0xB39F, +0xB3A2,0xB3A3,0xB3A4,0xB3A5,0xB3A6,0xB3A7,0xB3A9,0xB3AA, +0xB3AB,0xB3AD, 0, 0, 0, 0, 0, 0, +0xB3AE,0xB3AF,0xB3B0,0xB3B1,0xB3B2,0xB3B3,0xB3B4,0xB3B5, +0xB3B6,0xB3B7,0xB3B8,0xB3B9,0xB3BA,0xB3BB,0xB3BC,0xB3BD, +0xB3BE,0xB3BF,0xB3C0,0xB3C1,0xB3C2,0xB3C3,0xB3C6,0xB3C7, +0xB3C9,0xB3CA,0xB3CD,0xB3CF,0xB3D1,0xB3D2,0xB3D3,0xB3D6, +0xB3D8,0xB3DA,0xB3DC,0xB3DE,0xB3DF,0xB3E1,0xB3E2,0xB3E3, +0xB3E5,0xB3E6,0xB3E7,0xB3E9,0xB3EA,0xB3EB,0xB3EC,0xB3ED, +0xB3EE,0xB3EF,0xB3F0,0xB3F1,0xB3F2,0xB3F3,0xB3F4,0xB3F5, +0xB3F6,0xB3F7,0xB3F8,0xB3F9,0xB3FA,0xB3FB,0xB3FD,0xB3FE, +0xB3FF,0xB400,0xB401,0xB402,0xB403,0xB404,0xB405,0xB406, +0xB407,0xB408,0xB409,0xB40A,0xB40B,0xB40C,0xB40D,0xB40E, +0xB40F,0xB411,0xB412,0xB413,0xB414,0xB415,0xB416,0xB417, +0xB419,0xB41A,0xB41B,0xB41D,0xB41E,0xB41F,0xB421,0xB422, +0xB423,0xB424,0xB425,0xB426,0xB427,0xB42A,0xB42C,0xB42D, +0xB42E,0xB42F,0xB430,0xB431,0xB432,0xB433,0xB435,0xB436, +0xB437,0xB438,0xB439,0xB43A,0xB43B,0xB43C,0xB43D,0xB43E, +0xB43F,0xB440,0xB441,0xB442,0xB443,0xB444, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xB445,0xB446,0xB447,0xB448,0xB449,0xB44A,0xB44B,0xB44C, +0xB44D,0xB44E,0xB44F,0xB452,0xB453,0xB455,0xB456,0xB457, +0xB459,0xB45A,0xB45B,0xB45C,0xB45D,0xB45E,0xB45F,0xB462, +0xB464,0xB466, 0, 0, 0, 0, 0, 0, +0xB467,0xB468,0xB469,0xB46A,0xB46B,0xB46D,0xB46E,0xB46F, +0xB470,0xB471,0xB472,0xB473,0xB474,0xB475,0xB476,0xB477, +0xB478,0xB479,0xB47A,0xB47B,0xB47C,0xB47D,0xB47E,0xB47F, +0xB481,0xB482, 0, 0, 0, 0, 0, 0, +0xB483,0xB484,0xB485,0xB486,0xB487,0xB489,0xB48A,0xB48B, +0xB48C,0xB48D,0xB48E,0xB48F,0xB490,0xB491,0xB492,0xB493, +0xB494,0xB495,0xB496,0xB497,0xB498,0xB499,0xB49A,0xB49B, +0xB49C,0xB49E,0xB49F,0xB4A0,0xB4A1,0xB4A2,0xB4A3,0xB4A5, +0xB4A6,0xB4A7,0xB4A9,0xB4AA,0xB4AB,0xB4AD,0xB4AE,0xB4AF, +0xB4B0,0xB4B1,0xB4B2,0xB4B3,0xB4B4,0xB4B6,0xB4B8,0xB4BA, +0xB4BB,0xB4BC,0xB4BD,0xB4BE,0xB4BF,0xB4C1,0xB4C2,0xB4C3, +0xB4C5,0xB4C6,0xB4C7,0xB4C9,0xB4CA,0xB4CB,0xB4CC,0xB4CD, +0xB4CE,0xB4CF,0xB4D1,0xB4D2,0xB4D3,0xB4D4,0xB4D6,0xB4D7, +0xB4D8,0xB4D9,0xB4DA,0xB4DB,0xB4DE,0xB4DF,0xB4E1,0xB4E2, +0xB4E5,0xB4E7,0xB4E8,0xB4E9,0xB4EA,0xB4EB,0xB4EE,0xB4F0, +0xB4F2,0xB4F3,0xB4F4,0xB4F5,0xB4F6,0xB4F7,0xB4F9,0xB4FA, +0xB4FB,0xB4FC,0xB4FD,0xB4FE,0xB4FF,0xB500,0xB501,0xB502, +0xB503,0xB504,0xB505,0xB506,0xB507,0xB508,0xB509,0xB50A, +0xB50B,0xB50C,0xB50D,0xB50E,0xB50F,0xB510,0xB511,0xB512, +0xB513,0xB516,0xB517,0xB519,0xB51A,0xB51D, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xB51E,0xB51F,0xB520,0xB521,0xB522,0xB523,0xB526,0xB52B, +0xB52C,0xB52D,0xB52E,0xB52F,0xB532,0xB533,0xB535,0xB536, +0xB537,0xB539,0xB53A,0xB53B,0xB53C,0xB53D,0xB53E,0xB53F, +0xB542,0xB546, 0, 0, 0, 0, 0, 0, +0xB547,0xB548,0xB549,0xB54A,0xB54E,0xB54F,0xB551,0xB552, +0xB553,0xB555,0xB556,0xB557,0xB558,0xB559,0xB55A,0xB55B, +0xB55E,0xB562,0xB563,0xB564,0xB565,0xB566,0xB567,0xB568, +0xB569,0xB56A, 0, 0, 0, 0, 0, 0, +0xB56B,0xB56C,0xB56D,0xB56E,0xB56F,0xB570,0xB571,0xB572, +0xB573,0xB574,0xB575,0xB576,0xB577,0xB578,0xB579,0xB57A, +0xB57B,0xB57C,0xB57D,0xB57E,0xB57F,0xB580,0xB581,0xB582, +0xB583,0xB584,0xB585,0xB586,0xB587,0xB588,0xB589,0xB58A, +0xB58B,0xB58C,0xB58D,0xB58E,0xB58F,0xB590,0xB591,0xB592, +0xB593,0xB594,0xB595,0xB596,0xB597,0xB598,0xB599,0xB59A, +0xB59B,0xB59C,0xB59D,0xB59E,0xB59F,0xB5A2,0xB5A3,0xB5A5, +0xB5A6,0xB5A7,0xB5A9,0xB5AC,0xB5AD,0xB5AE,0xB5AF,0xB5B2, +0xB5B6,0xB5B7,0xB5B8,0xB5B9,0xB5BA,0xB5BE,0xB5BF,0xB5C1, +0xB5C2,0xB5C3,0xB5C5,0xB5C6,0xB5C7,0xB5C8,0xB5C9,0xB5CA, +0xB5CB,0xB5CE,0xB5D2,0xB5D3,0xB5D4,0xB5D5,0xB5D6,0xB5D7, +0xB5D9,0xB5DA,0xB5DB,0xB5DC,0xB5DD,0xB5DE,0xB5DF,0xB5E0, +0xB5E1,0xB5E2,0xB5E3,0xB5E4,0xB5E5,0xB5E6,0xB5E7,0xB5E8, +0xB5E9,0xB5EA,0xB5EB,0xB5ED,0xB5EE,0xB5EF,0xB5F0,0xB5F1, +0xB5F2,0xB5F3,0xB5F4,0xB5F5,0xB5F6,0xB5F7,0xB5F8,0xB5F9, +0xB5FA,0xB5FB,0xB5FC,0xB5FD,0xB5FE,0xB5FF, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xB600,0xB601,0xB602,0xB603,0xB604,0xB605,0xB606,0xB607, +0xB608,0xB609,0xB60A,0xB60B,0xB60C,0xB60D,0xB60E,0xB60F, +0xB612,0xB613,0xB615,0xB616,0xB617,0xB619,0xB61A,0xB61B, +0xB61C,0xB61D, 0, 0, 0, 0, 0, 0, +0xB61E,0xB61F,0xB620,0xB621,0xB622,0xB623,0xB624,0xB626, +0xB627,0xB628,0xB629,0xB62A,0xB62B,0xB62D,0xB62E,0xB62F, +0xB630,0xB631,0xB632,0xB633,0xB635,0xB636,0xB637,0xB638, +0xB639,0xB63A, 0, 0, 0, 0, 0, 0, +0xB63B,0xB63C,0xB63D,0xB63E,0xB63F,0xB640,0xB641,0xB642, +0xB643,0xB644,0xB645,0xB646,0xB647,0xB649,0xB64A,0xB64B, +0xB64C,0xB64D,0xB64E,0xB64F,0xB650,0xB651,0xB652,0xB653, +0xB654,0xB655,0xB656,0xB657,0xB658,0xB659,0xB65A,0xB65B, +0xB65C,0xB65D,0xB65E,0xB65F,0xB660,0xB661,0xB662,0xB663, +0xB665,0xB666,0xB667,0xB669,0xB66A,0xB66B,0xB66C,0xB66D, +0xB66E,0xB66F,0xB670,0xB671,0xB672,0xB673,0xB674,0xB675, +0xB676,0xB677,0xB678,0xB679,0xB67A,0xB67B,0xB67C,0xB67D, +0xB67E,0xB67F,0xB680,0xB681,0xB682,0xB683,0xB684,0xB685, +0xB686,0xB687,0xB688,0xB689,0xB68A,0xB68B,0xB68C,0xB68D, +0xB68E,0xB68F,0xB690,0xB691,0xB692,0xB693,0xB694,0xB695, +0xB696,0xB697,0xB698,0xB699,0xB69A,0xB69B,0xB69E,0xB69F, +0xB6A1,0xB6A2,0xB6A3,0xB6A5,0xB6A6,0xB6A7,0xB6A8,0xB6A9, +0xB6AA,0xB6AD,0xB6AE,0xB6AF,0xB6B0,0xB6B2,0xB6B3,0xB6B4, +0xB6B5,0xB6B6,0xB6B7,0xB6B8,0xB6B9,0xB6BA,0xB6BB,0xB6BC, +0xB6BD,0xB6BE,0xB6BF,0xB6C0,0xB6C1,0xB6C2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xB6C3,0xB6C4,0xB6C5,0xB6C6,0xB6C7,0xB6C8,0xB6C9,0xB6CA, +0xB6CB,0xB6CC,0xB6CD,0xB6CE,0xB6CF,0xB6D0,0xB6D1,0xB6D2, +0xB6D3,0xB6D5,0xB6D6,0xB6D7,0xB6D8,0xB6D9,0xB6DA,0xB6DB, +0xB6DC,0xB6DD, 0, 0, 0, 0, 0, 0, +0xB6DE,0xB6DF,0xB6E0,0xB6E1,0xB6E2,0xB6E3,0xB6E4,0xB6E5, +0xB6E6,0xB6E7,0xB6E8,0xB6E9,0xB6EA,0xB6EB,0xB6EC,0xB6ED, +0xB6EE,0xB6EF,0xB6F1,0xB6F2,0xB6F3,0xB6F5,0xB6F6,0xB6F7, +0xB6F9,0xB6FA, 0, 0, 0, 0, 0, 0, +0xB6FB,0xB6FC,0xB6FD,0xB6FE,0xB6FF,0xB702,0xB703,0xB704, +0xB706,0xB707,0xB708,0xB709,0xB70A,0xB70B,0xB70C,0xB70D, +0xB70E,0xB70F,0xB710,0xB711,0xB712,0xB713,0xB714,0xB715, +0xB716,0xB717,0xB718,0xB719,0xB71A,0xB71B,0xB71C,0xB71D, +0xB71E,0xB71F,0xB720,0xB721,0xB722,0xB723,0xB724,0xB725, +0xB726,0xB727,0xB72A,0xB72B,0xB72D,0xB72E,0xB731,0xB732, +0xB733,0xB734,0xB735,0xB736,0xB737,0xB73A,0xB73C,0xB73D, +0xB73E,0xB73F,0xB740,0xB741,0xB742,0xB743,0xB745,0xB746, +0xB747,0xB749,0xB74A,0xB74B,0xB74D,0xB74E,0xB74F,0xB750, +0xB751,0xB752,0xB753,0xB756,0xB757,0xB758,0xB759,0xB75A, +0xB75B,0xB75C,0xB75D,0xB75E,0xB75F,0xB761,0xB762,0xB763, +0xB765,0xB766,0xB767,0xB769,0xB76A,0xB76B,0xB76C,0xB76D, +0xB76E,0xB76F,0xB772,0xB774,0xB776,0xB777,0xB778,0xB779, +0xB77A,0xB77B,0xB77E,0xB77F,0xB781,0xB782,0xB783,0xB785, +0xB786,0xB787,0xB788,0xB789,0xB78A,0xB78B,0xB78E,0xB793, +0xB794,0xB795,0xB79A,0xB79B,0xB79D,0xB79E, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xB79F,0xB7A1,0xB7A2,0xB7A3,0xB7A4,0xB7A5,0xB7A6,0xB7A7, +0xB7AA,0xB7AE,0xB7AF,0xB7B0,0xB7B1,0xB7B2,0xB7B3,0xB7B6, +0xB7B7,0xB7B9,0xB7BA,0xB7BB,0xB7BC,0xB7BD,0xB7BE,0xB7BF, +0xB7C0,0xB7C1, 0, 0, 0, 0, 0, 0, +0xB7C2,0xB7C3,0xB7C4,0xB7C5,0xB7C6,0xB7C8,0xB7CA,0xB7CB, +0xB7CC,0xB7CD,0xB7CE,0xB7CF,0xB7D0,0xB7D1,0xB7D2,0xB7D3, +0xB7D4,0xB7D5,0xB7D6,0xB7D7,0xB7D8,0xB7D9,0xB7DA,0xB7DB, +0xB7DC,0xB7DD, 0, 0, 0, 0, 0, 0, +0xB7DE,0xB7DF,0xB7E0,0xB7E1,0xB7E2,0xB7E3,0xB7E4,0xB7E5, +0xB7E6,0xB7E7,0xB7E8,0xB7E9,0xB7EA,0xB7EB,0xB7EE,0xB7EF, +0xB7F1,0xB7F2,0xB7F3,0xB7F5,0xB7F6,0xB7F7,0xB7F8,0xB7F9, +0xB7FA,0xB7FB,0xB7FE,0xB802,0xB803,0xB804,0xB805,0xB806, +0xB80A,0xB80B,0xB80D,0xB80E,0xB80F,0xB811,0xB812,0xB813, +0xB814,0xB815,0xB816,0xB817,0xB81A,0xB81C,0xB81E,0xB81F, +0xB820,0xB821,0xB822,0xB823,0xB826,0xB827,0xB829,0xB82A, +0xB82B,0xB82D,0xB82E,0xB82F,0xB830,0xB831,0xB832,0xB833, +0xB836,0xB83A,0xB83B,0xB83C,0xB83D,0xB83E,0xB83F,0xB841, +0xB842,0xB843,0xB845,0xB846,0xB847,0xB848,0xB849,0xB84A, +0xB84B,0xB84C,0xB84D,0xB84E,0xB84F,0xB850,0xB852,0xB854, +0xB855,0xB856,0xB857,0xB858,0xB859,0xB85A,0xB85B,0xB85E, +0xB85F,0xB861,0xB862,0xB863,0xB865,0xB866,0xB867,0xB868, +0xB869,0xB86A,0xB86B,0xB86E,0xB870,0xB872,0xB873,0xB874, +0xB875,0xB876,0xB877,0xB879,0xB87A,0xB87B,0xB87D,0xB87E, +0xB87F,0xB880,0xB881,0xB882,0xB883,0xB884, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xB885,0xB886,0xB887,0xB888,0xB889,0xB88A,0xB88B,0xB88C, +0xB88E,0xB88F,0xB890,0xB891,0xB892,0xB893,0xB894,0xB895, +0xB896,0xB897,0xB898,0xB899,0xB89A,0xB89B,0xB89C,0xB89D, +0xB89E,0xB89F, 0, 0, 0, 0, 0, 0, +0xB8A0,0xB8A1,0xB8A2,0xB8A3,0xB8A4,0xB8A5,0xB8A6,0xB8A7, +0xB8A9,0xB8AA,0xB8AB,0xB8AC,0xB8AD,0xB8AE,0xB8AF,0xB8B1, +0xB8B2,0xB8B3,0xB8B5,0xB8B6,0xB8B7,0xB8B9,0xB8BA,0xB8BB, +0xB8BC,0xB8BD, 0, 0, 0, 0, 0, 0, +0xB8BE,0xB8BF,0xB8C2,0xB8C4,0xB8C6,0xB8C7,0xB8C8,0xB8C9, +0xB8CA,0xB8CB,0xB8CD,0xB8CE,0xB8CF,0xB8D1,0xB8D2,0xB8D3, +0xB8D5,0xB8D6,0xB8D7,0xB8D8,0xB8D9,0xB8DA,0xB8DB,0xB8DC, +0xB8DE,0xB8E0,0xB8E2,0xB8E3,0xB8E4,0xB8E5,0xB8E6,0xB8E7, +0xB8EA,0xB8EB,0xB8ED,0xB8EE,0xB8EF,0xB8F1,0xB8F2,0xB8F3, +0xB8F4,0xB8F5,0xB8F6,0xB8F7,0xB8FA,0xB8FC,0xB8FE,0xB8FF, +0xB900,0xB901,0xB902,0xB903,0xB905,0xB906,0xB907,0xB908, +0xB909,0xB90A,0xB90B,0xB90C,0xB90D,0xB90E,0xB90F,0xB910, +0xB911,0xB912,0xB913,0xB914,0xB915,0xB916,0xB917,0xB919, +0xB91A,0xB91B,0xB91C,0xB91D,0xB91E,0xB91F,0xB921,0xB922, +0xB923,0xB924,0xB925,0xB926,0xB927,0xB928,0xB929,0xB92A, +0xB92B,0xB92C,0xB92D,0xB92E,0xB92F,0xB930,0xB931,0xB932, +0xB933,0xB934,0xB935,0xB936,0xB937,0xB938,0xB939,0xB93A, +0xB93B,0xB93E,0xB93F,0xB941,0xB942,0xB943,0xB945,0xB946, +0xB947,0xB948,0xB949,0xB94A,0xB94B,0xB94D,0xB94E,0xB950, +0xB952,0xB953,0xB954,0xB955,0xB956,0xB957, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xB95A,0xB95B,0xB95D,0xB95E,0xB95F,0xB961,0xB962,0xB963, +0xB964,0xB965,0xB966,0xB967,0xB96A,0xB96C,0xB96E,0xB96F, +0xB970,0xB971,0xB972,0xB973,0xB976,0xB977,0xB979,0xB97A, +0xB97B,0xB97D, 0, 0, 0, 0, 0, 0, +0xB97E,0xB97F,0xB980,0xB981,0xB982,0xB983,0xB986,0xB988, +0xB98B,0xB98C,0xB98F,0xB990,0xB991,0xB992,0xB993,0xB994, +0xB995,0xB996,0xB997,0xB998,0xB999,0xB99A,0xB99B,0xB99C, +0xB99D,0xB99E, 0, 0, 0, 0, 0, 0, +0xB99F,0xB9A0,0xB9A1,0xB9A2,0xB9A3,0xB9A4,0xB9A5,0xB9A6, +0xB9A7,0xB9A8,0xB9A9,0xB9AA,0xB9AB,0xB9AE,0xB9AF,0xB9B1, +0xB9B2,0xB9B3,0xB9B5,0xB9B6,0xB9B7,0xB9B8,0xB9B9,0xB9BA, +0xB9BB,0xB9BE,0xB9C0,0xB9C2,0xB9C3,0xB9C4,0xB9C5,0xB9C6, +0xB9C7,0xB9CA,0xB9CB,0xB9CD,0xB9D3,0xB9D4,0xB9D5,0xB9D6, +0xB9D7,0xB9DA,0xB9DC,0xB9DF,0xB9E0,0xB9E2,0xB9E6,0xB9E7, +0xB9E9,0xB9EA,0xB9EB,0xB9ED,0xB9EE,0xB9EF,0xB9F0,0xB9F1, +0xB9F2,0xB9F3,0xB9F6,0xB9FB,0xB9FC,0xB9FD,0xB9FE,0xB9FF, +0xBA02,0xBA03,0xBA04,0xBA05,0xBA06,0xBA07,0xBA09,0xBA0A, +0xBA0B,0xBA0C,0xBA0D,0xBA0E,0xBA0F,0xBA10,0xBA11,0xBA12, +0xBA13,0xBA14,0xBA16,0xBA17,0xBA18,0xBA19,0xBA1A,0xBA1B, +0xBA1C,0xBA1D,0xBA1E,0xBA1F,0xBA20,0xBA21,0xBA22,0xBA23, +0xBA24,0xBA25,0xBA26,0xBA27,0xBA28,0xBA29,0xBA2A,0xBA2B, +0xBA2C,0xBA2D,0xBA2E,0xBA2F,0xBA30,0xBA31,0xBA32,0xBA33, +0xBA34,0xBA35,0xBA36,0xBA37,0xBA3A,0xBA3B,0xBA3D,0xBA3E, +0xBA3F,0xBA41,0xBA43,0xBA44,0xBA45,0xBA46, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xBA47,0xBA4A,0xBA4C,0xBA4F,0xBA50,0xBA51,0xBA52,0xBA56, +0xBA57,0xBA59,0xBA5A,0xBA5B,0xBA5D,0xBA5E,0xBA5F,0xBA60, +0xBA61,0xBA62,0xBA63,0xBA66,0xBA6A,0xBA6B,0xBA6C,0xBA6D, +0xBA6E,0xBA6F, 0, 0, 0, 0, 0, 0, +0xBA72,0xBA73,0xBA75,0xBA76,0xBA77,0xBA79,0xBA7A,0xBA7B, +0xBA7C,0xBA7D,0xBA7E,0xBA7F,0xBA80,0xBA81,0xBA82,0xBA86, +0xBA88,0xBA89,0xBA8A,0xBA8B,0xBA8D,0xBA8E,0xBA8F,0xBA90, +0xBA91,0xBA92, 0, 0, 0, 0, 0, 0, +0xBA93,0xBA94,0xBA95,0xBA96,0xBA97,0xBA98,0xBA99,0xBA9A, +0xBA9B,0xBA9C,0xBA9D,0xBA9E,0xBA9F,0xBAA0,0xBAA1,0xBAA2, +0xBAA3,0xBAA4,0xBAA5,0xBAA6,0xBAA7,0xBAAA,0xBAAD,0xBAAE, +0xBAAF,0xBAB1,0xBAB3,0xBAB4,0xBAB5,0xBAB6,0xBAB7,0xBABA, +0xBABC,0xBABE,0xBABF,0xBAC0,0xBAC1,0xBAC2,0xBAC3,0xBAC5, +0xBAC6,0xBAC7,0xBAC9,0xBACA,0xBACB,0xBACC,0xBACD,0xBACE, +0xBACF,0xBAD0,0xBAD1,0xBAD2,0xBAD3,0xBAD4,0xBAD5,0xBAD6, +0xBAD7,0xBADA,0xBADB,0xBADC,0xBADD,0xBADE,0xBADF,0xBAE0, +0xBAE1,0xBAE2,0xBAE3,0xBAE4,0xBAE5,0xBAE6,0xBAE7,0xBAE8, +0xBAE9,0xBAEA,0xBAEB,0xBAEC,0xBAED,0xBAEE,0xBAEF,0xBAF0, +0xBAF1,0xBAF2,0xBAF3,0xBAF4,0xBAF5,0xBAF6,0xBAF7,0xBAF8, +0xBAF9,0xBAFA,0xBAFB,0xBAFD,0xBAFE,0xBAFF,0xBB01,0xBB02, +0xBB03,0xBB05,0xBB06,0xBB07,0xBB08,0xBB09,0xBB0A,0xBB0B, +0xBB0C,0xBB0E,0xBB10,0xBB12,0xBB13,0xBB14,0xBB15,0xBB16, +0xBB17,0xBB19,0xBB1A,0xBB1B,0xBB1D,0xBB1E,0xBB1F,0xBB21, +0xBB22,0xBB23,0xBB24,0xBB25,0xBB26,0xBB27, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xBB28,0xBB2A,0xBB2C,0xBB2D,0xBB2E,0xBB2F,0xBB30,0xBB31, +0xBB32,0xBB33,0xBB37,0xBB39,0xBB3A,0xBB3F,0xBB40,0xBB41, +0xBB42,0xBB43,0xBB46,0xBB48,0xBB4A,0xBB4B,0xBB4C,0xBB4E, +0xBB51,0xBB52, 0, 0, 0, 0, 0, 0, +0xBB53,0xBB55,0xBB56,0xBB57,0xBB59,0xBB5A,0xBB5B,0xBB5C, +0xBB5D,0xBB5E,0xBB5F,0xBB60,0xBB62,0xBB64,0xBB65,0xBB66, +0xBB67,0xBB68,0xBB69,0xBB6A,0xBB6B,0xBB6D,0xBB6E,0xBB6F, +0xBB70,0xBB71, 0, 0, 0, 0, 0, 0, +0xBB72,0xBB73,0xBB74,0xBB75,0xBB76,0xBB77,0xBB78,0xBB79, +0xBB7A,0xBB7B,0xBB7C,0xBB7D,0xBB7E,0xBB7F,0xBB80,0xBB81, +0xBB82,0xBB83,0xBB84,0xBB85,0xBB86,0xBB87,0xBB89,0xBB8A, +0xBB8B,0xBB8D,0xBB8E,0xBB8F,0xBB91,0xBB92,0xBB93,0xBB94, +0xBB95,0xBB96,0xBB97,0xBB98,0xBB99,0xBB9A,0xBB9B,0xBB9C, +0xBB9D,0xBB9E,0xBB9F,0xBBA0,0xBBA1,0xBBA2,0xBBA3,0xBBA5, +0xBBA6,0xBBA7,0xBBA9,0xBBAA,0xBBAB,0xBBAD,0xBBAE,0xBBAF, +0xBBB0,0xBBB1,0xBBB2,0xBBB3,0xBBB5,0xBBB6,0xBBB8,0xBBB9, +0xBBBA,0xBBBB,0xBBBC,0xBBBD,0xBBBE,0xBBBF,0xBBC1,0xBBC2, +0xBBC3,0xBBC5,0xBBC6,0xBBC7,0xBBC9,0xBBCA,0xBBCB,0xBBCC, +0xBBCD,0xBBCE,0xBBCF,0xBBD1,0xBBD2,0xBBD4,0xBBD5,0xBBD6, +0xBBD7,0xBBD8,0xBBD9,0xBBDA,0xBBDB,0xBBDC,0xBBDD,0xBBDE, +0xBBDF,0xBBE0,0xBBE1,0xBBE2,0xBBE3,0xBBE4,0xBBE5,0xBBE6, +0xBBE7,0xBBE8,0xBBE9,0xBBEA,0xBBEB,0xBBEC,0xBBED,0xBBEE, +0xBBEF,0xBBF0,0xBBF1,0xBBF2,0xBBF3,0xBBF4,0xBBF5,0xBBF6, +0xBBF7,0xBBFA,0xBBFB,0xBBFD,0xBBFE,0xBC01, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xBC03,0xBC04,0xBC05,0xBC06,0xBC07,0xBC0A,0xBC0E,0xBC10, +0xBC12,0xBC13,0xBC19,0xBC1A,0xBC20,0xBC21,0xBC22,0xBC23, +0xBC26,0xBC28,0xBC2A,0xBC2B,0xBC2C,0xBC2E,0xBC2F,0xBC32, +0xBC33,0xBC35, 0, 0, 0, 0, 0, 0, +0xBC36,0xBC37,0xBC39,0xBC3A,0xBC3B,0xBC3C,0xBC3D,0xBC3E, +0xBC3F,0xBC42,0xBC46,0xBC47,0xBC48,0xBC4A,0xBC4B,0xBC4E, +0xBC4F,0xBC51,0xBC52,0xBC53,0xBC54,0xBC55,0xBC56,0xBC57, +0xBC58,0xBC59, 0, 0, 0, 0, 0, 0, +0xBC5A,0xBC5B,0xBC5C,0xBC5E,0xBC5F,0xBC60,0xBC61,0xBC62, +0xBC63,0xBC64,0xBC65,0xBC66,0xBC67,0xBC68,0xBC69,0xBC6A, +0xBC6B,0xBC6C,0xBC6D,0xBC6E,0xBC6F,0xBC70,0xBC71,0xBC72, +0xBC73,0xBC74,0xBC75,0xBC76,0xBC77,0xBC78,0xBC79,0xBC7A, +0xBC7B,0xBC7C,0xBC7D,0xBC7E,0xBC7F,0xBC80,0xBC81,0xBC82, +0xBC83,0xBC86,0xBC87,0xBC89,0xBC8A,0xBC8D,0xBC8F,0xBC90, +0xBC91,0xBC92,0xBC93,0xBC96,0xBC98,0xBC9B,0xBC9C,0xBC9D, +0xBC9E,0xBC9F,0xBCA2,0xBCA3,0xBCA5,0xBCA6,0xBCA9,0xBCAA, +0xBCAB,0xBCAC,0xBCAD,0xBCAE,0xBCAF,0xBCB2,0xBCB6,0xBCB7, +0xBCB8,0xBCB9,0xBCBA,0xBCBB,0xBCBE,0xBCBF,0xBCC1,0xBCC2, +0xBCC3,0xBCC5,0xBCC6,0xBCC7,0xBCC8,0xBCC9,0xBCCA,0xBCCB, +0xBCCC,0xBCCE,0xBCD2,0xBCD3,0xBCD4,0xBCD6,0xBCD7,0xBCD9, +0xBCDA,0xBCDB,0xBCDD,0xBCDE,0xBCDF,0xBCE0,0xBCE1,0xBCE2, +0xBCE3,0xBCE4,0xBCE5,0xBCE6,0xBCE7,0xBCE8,0xBCE9,0xBCEA, +0xBCEB,0xBCEC,0xBCED,0xBCEE,0xBCEF,0xBCF0,0xBCF1,0xBCF2, +0xBCF3,0xBCF7,0xBCF9,0xBCFA,0xBCFB,0xBCFD, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xBCFE,0xBCFF,0xBD00,0xBD01,0xBD02,0xBD03,0xBD06,0xBD08, +0xBD0A,0xBD0B,0xBD0C,0xBD0D,0xBD0E,0xBD0F,0xBD11,0xBD12, +0xBD13,0xBD15,0xBD16,0xBD17,0xBD18,0xBD19,0xBD1A,0xBD1B, +0xBD1C,0xBD1D, 0, 0, 0, 0, 0, 0, +0xBD1E,0xBD1F,0xBD20,0xBD21,0xBD22,0xBD23,0xBD25,0xBD26, +0xBD27,0xBD28,0xBD29,0xBD2A,0xBD2B,0xBD2D,0xBD2E,0xBD2F, +0xBD30,0xBD31,0xBD32,0xBD33,0xBD34,0xBD35,0xBD36,0xBD37, +0xBD38,0xBD39, 0, 0, 0, 0, 0, 0, +0xBD3A,0xBD3B,0xBD3C,0xBD3D,0xBD3E,0xBD3F,0xBD41,0xBD42, +0xBD43,0xBD44,0xBD45,0xBD46,0xBD47,0xBD4A,0xBD4B,0xBD4D, +0xBD4E,0xBD4F,0xBD51,0xBD52,0xBD53,0xBD54,0xBD55,0xBD56, +0xBD57,0xBD5A,0xBD5B,0xBD5C,0xBD5D,0xBD5E,0xBD5F,0xBD60, +0xBD61,0xBD62,0xBD63,0xBD65,0xBD66,0xBD67,0xBD69,0xBD6A, +0xBD6B,0xBD6C,0xBD6D,0xBD6E,0xBD6F,0xBD70,0xBD71,0xBD72, +0xBD73,0xBD74,0xBD75,0xBD76,0xBD77,0xBD78,0xBD79,0xBD7A, +0xBD7B,0xBD7C,0xBD7D,0xBD7E,0xBD7F,0xBD82,0xBD83,0xBD85, +0xBD86,0xBD8B,0xBD8C,0xBD8D,0xBD8E,0xBD8F,0xBD92,0xBD94, +0xBD96,0xBD97,0xBD98,0xBD9B,0xBD9D,0xBD9E,0xBD9F,0xBDA0, +0xBDA1,0xBDA2,0xBDA3,0xBDA5,0xBDA6,0xBDA7,0xBDA8,0xBDA9, +0xBDAA,0xBDAB,0xBDAC,0xBDAD,0xBDAE,0xBDAF,0xBDB1,0xBDB2, +0xBDB3,0xBDB4,0xBDB5,0xBDB6,0xBDB7,0xBDB9,0xBDBA,0xBDBB, +0xBDBC,0xBDBD,0xBDBE,0xBDBF,0xBDC0,0xBDC1,0xBDC2,0xBDC3, +0xBDC4,0xBDC5,0xBDC6,0xBDC7,0xBDC8,0xBDC9,0xBDCA,0xBDCB, +0xBDCC,0xBDCD,0xBDCE,0xBDCF,0xBDD0,0xBDD1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xBDD2,0xBDD3,0xBDD6,0xBDD7,0xBDD9,0xBDDA,0xBDDB,0xBDDD, +0xBDDE,0xBDDF,0xBDE0,0xBDE1,0xBDE2,0xBDE3,0xBDE4,0xBDE5, +0xBDE6,0xBDE7,0xBDE8,0xBDEA,0xBDEB,0xBDEC,0xBDED,0xBDEE, +0xBDEF,0xBDF1, 0, 0, 0, 0, 0, 0, +0xBDF2,0xBDF3,0xBDF5,0xBDF6,0xBDF7,0xBDF9,0xBDFA,0xBDFB, +0xBDFC,0xBDFD,0xBDFE,0xBDFF,0xBE01,0xBE02,0xBE04,0xBE06, +0xBE07,0xBE08,0xBE09,0xBE0A,0xBE0B,0xBE0E,0xBE0F,0xBE11, +0xBE12,0xBE13, 0, 0, 0, 0, 0, 0, +0xBE15,0xBE16,0xBE17,0xBE18,0xBE19,0xBE1A,0xBE1B,0xBE1E, +0xBE20,0xBE21,0xBE22,0xBE23,0xBE24,0xBE25,0xBE26,0xBE27, +0xBE28,0xBE29,0xBE2A,0xBE2B,0xBE2C,0xBE2D,0xBE2E,0xBE2F, +0xBE30,0xBE31,0xBE32,0xBE33,0xBE34,0xBE35,0xBE36,0xBE37, +0xBE38,0xBE39,0xBE3A,0xBE3B,0xBE3C,0xBE3D,0xBE3E,0xBE3F, +0xBE40,0xBE41,0xBE42,0xBE43,0xBE46,0xBE47,0xBE49,0xBE4A, +0xBE4B,0xBE4D,0xBE4F,0xBE50,0xBE51,0xBE52,0xBE53,0xBE56, +0xBE58,0xBE5C,0xBE5D,0xBE5E,0xBE5F,0xBE62,0xBE63,0xBE65, +0xBE66,0xBE67,0xBE69,0xBE6B,0xBE6C,0xBE6D,0xBE6E,0xBE6F, +0xBE72,0xBE76,0xBE77,0xBE78,0xBE79,0xBE7A,0xBE7E,0xBE7F, +0xBE81,0xBE82,0xBE83,0xBE85,0xBE86,0xBE87,0xBE88,0xBE89, +0xBE8A,0xBE8B,0xBE8E,0xBE92,0xBE93,0xBE94,0xBE95,0xBE96, +0xBE97,0xBE9A,0xBE9B,0xBE9C,0xBE9D,0xBE9E,0xBE9F,0xBEA0, +0xBEA1,0xBEA2,0xBEA3,0xBEA4,0xBEA5,0xBEA6,0xBEA7,0xBEA9, +0xBEAA,0xBEAB,0xBEAC,0xBEAD,0xBEAE,0xBEAF,0xBEB0,0xBEB1, +0xBEB2,0xBEB3,0xBEB4,0xBEB5,0xBEB6,0xBEB7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xBEB8,0xBEB9,0xBEBA,0xBEBB,0xBEBC,0xBEBD,0xBEBE,0xBEBF, +0xBEC0,0xBEC1,0xBEC2,0xBEC3,0xBEC4,0xBEC5,0xBEC6,0xBEC7, +0xBEC8,0xBEC9,0xBECA,0xBECB,0xBECC,0xBECD,0xBECE,0xBECF, +0xBED2,0xBED3, 0, 0, 0, 0, 0, 0, +0xBED5,0xBED6,0xBED9,0xBEDA,0xBEDB,0xBEDC,0xBEDD,0xBEDE, +0xBEDF,0xBEE1,0xBEE2,0xBEE6,0xBEE7,0xBEE8,0xBEE9,0xBEEA, +0xBEEB,0xBEED,0xBEEE,0xBEEF,0xBEF0,0xBEF1,0xBEF2,0xBEF3, +0xBEF4,0xBEF5, 0, 0, 0, 0, 0, 0, +0xBEF6,0xBEF7,0xBEF8,0xBEF9,0xBEFA,0xBEFB,0xBEFC,0xBEFD, +0xBEFE,0xBEFF,0xBF00,0xBF02,0xBF03,0xBF04,0xBF05,0xBF06, +0xBF07,0xBF0A,0xBF0B,0xBF0C,0xBF0D,0xBF0E,0xBF0F,0xBF10, +0xBF11,0xBF12,0xBF13,0xBF14,0xBF15,0xBF16,0xBF17,0xBF1A, +0xBF1E,0xBF1F,0xBF20,0xBF21,0xBF22,0xBF23,0xBF24,0xBF25, +0xBF26,0xBF27,0xBF28,0xBF29,0xBF2A,0xBF2B,0xBF2C,0xBF2D, +0xBF2E,0xBF2F,0xBF30,0xBF31,0xBF32,0xBF33,0xBF34,0xBF35, +0xBF36,0xBF37,0xBF38,0xBF39,0xBF3A,0xBF3B,0xBF3C,0xBF3D, +0xBF3E,0xBF3F,0xBF42,0xBF43,0xBF45,0xBF46,0xBF47,0xBF49, +0xBF4A,0xBF4B,0xBF4C,0xBF4D,0xBF4E,0xBF4F,0xBF52,0xBF53, +0xBF54,0xBF56,0xBF57,0xBF58,0xBF59,0xBF5A,0xBF5B,0xBF5C, +0xBF5D,0xBF5E,0xBF5F,0xBF60,0xBF61,0xBF62,0xBF63,0xBF64, +0xBF65,0xBF66,0xBF67,0xBF68,0xBF69,0xBF6A,0xBF6B,0xBF6C, +0xBF6D,0xBF6E,0xBF6F,0xBF70,0xBF71,0xBF72,0xBF73,0xBF74, +0xBF75,0xBF76,0xBF77,0xBF78,0xBF79,0xBF7A,0xBF7B,0xBF7C, +0xBF7D,0xBF7E,0xBF7F,0xBF80,0xBF81,0xBF82, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xBF83,0xBF84,0xBF85,0xBF86,0xBF87,0xBF88,0xBF89,0xBF8A, +0xBF8B,0xBF8C,0xBF8D,0xBF8E,0xBF8F,0xBF90,0xBF91,0xBF92, +0xBF93,0xBF95,0xBF96,0xBF97,0xBF98,0xBF99,0xBF9A,0xBF9B, +0xBF9C,0xBF9D, 0, 0, 0, 0, 0, 0, +0xBF9E,0xBF9F,0xBFA0,0xBFA1,0xBFA2,0xBFA3,0xBFA4,0xBFA5, +0xBFA6,0xBFA7,0xBFA8,0xBFA9,0xBFAA,0xBFAB,0xBFAC,0xBFAD, +0xBFAE,0xBFAF,0xBFB1,0xBFB2,0xBFB3,0xBFB4,0xBFB5,0xBFB6, +0xBFB7,0xBFB8, 0, 0, 0, 0, 0, 0, +0xBFB9,0xBFBA,0xBFBB,0xBFBC,0xBFBD,0xBFBE,0xBFBF,0xBFC0, +0xBFC1,0xBFC2,0xBFC3,0xBFC4,0xBFC6,0xBFC7,0xBFC8,0xBFC9, +0xBFCA,0xBFCB,0xBFCE,0xBFCF,0xBFD1,0xBFD2,0xBFD3,0xBFD5, +0xBFD6,0xBFD7,0xBFD8,0xBFD9,0xBFDA,0xBFDB,0xBFDD,0xBFDE, +0xBFE0,0xBFE2,0xBFE3,0xBFE4,0xBFE5,0xBFE6,0xBFE7,0xBFE8, +0xBFE9,0xBFEA,0xBFEB,0xBFEC,0xBFED,0xBFEE,0xBFEF,0xBFF0, +0xBFF1,0xBFF2,0xBFF3,0xBFF4,0xBFF5,0xBFF6,0xBFF7,0xBFF8, +0xBFF9,0xBFFA,0xBFFB,0xBFFC,0xBFFD,0xBFFE,0xBFFF,0xC000, +0xC001,0xC002,0xC003,0xC004,0xC005,0xC006,0xC007,0xC008, +0xC009,0xC00A,0xC00B,0xC00C,0xC00D,0xC00E,0xC00F,0xC010, +0xC011,0xC012,0xC013,0xC014,0xC015,0xC016,0xC017,0xC018, +0xC019,0xC01A,0xC01B,0xC01C,0xC01D,0xC01E,0xC01F,0xC020, +0xC021,0xC022,0xC023,0xC024,0xC025,0xC026,0xC027,0xC028, +0xC029,0xC02A,0xC02B,0xC02C,0xC02D,0xC02E,0xC02F,0xC030, +0xC031,0xC032,0xC033,0xC034,0xC035,0xC036,0xC037,0xC038, +0xC039,0xC03A,0xC03B,0xC03D,0xC03E,0xC03F, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xC040,0xC041,0xC042,0xC043,0xC044,0xC045,0xC046,0xC047, +0xC048,0xC049,0xC04A,0xC04B,0xC04C,0xC04D,0xC04E,0xC04F, +0xC050,0xC052,0xC053,0xC054,0xC055,0xC056,0xC057,0xC059, +0xC05A,0xC05B, 0, 0, 0, 0, 0, 0, +0xC05D,0xC05E,0xC05F,0xC061,0xC062,0xC063,0xC064,0xC065, +0xC066,0xC067,0xC06A,0xC06B,0xC06C,0xC06D,0xC06E,0xC06F, +0xC070,0xC071,0xC072,0xC073,0xC074,0xC075,0xC076,0xC077, +0xC078,0xC079, 0, 0, 0, 0, 0, 0, +0xC07A,0xC07B,0xC07C,0xC07D,0xC07E,0xC07F,0xC080,0xC081, +0xC082,0xC083,0xC084,0xC085,0xC086,0xC087,0xC088,0xC089, +0xC08A,0xC08B,0xC08C,0xC08D,0xC08E,0xC08F,0xC092,0xC093, +0xC095,0xC096,0xC097,0xC099,0xC09A,0xC09B,0xC09C,0xC09D, +0xC09E,0xC09F,0xC0A2,0xC0A4,0xC0A6,0xC0A7,0xC0A8,0xC0A9, +0xC0AA,0xC0AB,0xC0AE,0xC0B1,0xC0B2,0xC0B7,0xC0B8,0xC0B9, +0xC0BA,0xC0BB,0xC0BE,0xC0C2,0xC0C3,0xC0C4,0xC0C6,0xC0C7, +0xC0CA,0xC0CB,0xC0CD,0xC0CE,0xC0CF,0xC0D1,0xC0D2,0xC0D3, +0xC0D4,0xC0D5,0xC0D6,0xC0D7,0xC0DA,0xC0DE,0xC0DF,0xC0E0, +0xC0E1,0xC0E2,0xC0E3,0xC0E6,0xC0E7,0xC0E9,0xC0EA,0xC0EB, +0xC0ED,0xC0EE,0xC0EF,0xC0F0,0xC0F1,0xC0F2,0xC0F3,0xC0F6, +0xC0F8,0xC0FA,0xC0FB,0xC0FC,0xC0FD,0xC0FE,0xC0FF,0xC101, +0xC102,0xC103,0xC105,0xC106,0xC107,0xC109,0xC10A,0xC10B, +0xC10C,0xC10D,0xC10E,0xC10F,0xC111,0xC112,0xC113,0xC114, +0xC116,0xC117,0xC118,0xC119,0xC11A,0xC11B,0xC121,0xC122, +0xC125,0xC128,0xC129,0xC12A,0xC12B,0xC12E, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xC132,0xC133,0xC134,0xC135,0xC137,0xC13A,0xC13B,0xC13D, +0xC13E,0xC13F,0xC141,0xC142,0xC143,0xC144,0xC145,0xC146, +0xC147,0xC14A,0xC14E,0xC14F,0xC150,0xC151,0xC152,0xC153, +0xC156,0xC157, 0, 0, 0, 0, 0, 0, +0xC159,0xC15A,0xC15B,0xC15D,0xC15E,0xC15F,0xC160,0xC161, +0xC162,0xC163,0xC166,0xC16A,0xC16B,0xC16C,0xC16D,0xC16E, +0xC16F,0xC171,0xC172,0xC173,0xC175,0xC176,0xC177,0xC179, +0xC17A,0xC17B, 0, 0, 0, 0, 0, 0, +0xC17C,0xC17D,0xC17E,0xC17F,0xC180,0xC181,0xC182,0xC183, +0xC184,0xC186,0xC187,0xC188,0xC189,0xC18A,0xC18B,0xC18F, +0xC191,0xC192,0xC193,0xC195,0xC197,0xC198,0xC199,0xC19A, +0xC19B,0xC19E,0xC1A0,0xC1A2,0xC1A3,0xC1A4,0xC1A6,0xC1A7, +0xC1AA,0xC1AB,0xC1AD,0xC1AE,0xC1AF,0xC1B1,0xC1B2,0xC1B3, +0xC1B4,0xC1B5,0xC1B6,0xC1B7,0xC1B8,0xC1B9,0xC1BA,0xC1BB, +0xC1BC,0xC1BE,0xC1BF,0xC1C0,0xC1C1,0xC1C2,0xC1C3,0xC1C5, +0xC1C6,0xC1C7,0xC1C9,0xC1CA,0xC1CB,0xC1CD,0xC1CE,0xC1CF, +0xC1D0,0xC1D1,0xC1D2,0xC1D3,0xC1D5,0xC1D6,0xC1D9,0xC1DA, +0xC1DB,0xC1DC,0xC1DD,0xC1DE,0xC1DF,0xC1E1,0xC1E2,0xC1E3, +0xC1E5,0xC1E6,0xC1E7,0xC1E9,0xC1EA,0xC1EB,0xC1EC,0xC1ED, +0xC1EE,0xC1EF,0xC1F2,0xC1F4,0xC1F5,0xC1F6,0xC1F7,0xC1F8, +0xC1F9,0xC1FA,0xC1FB,0xC1FE,0xC1FF,0xC201,0xC202,0xC203, +0xC205,0xC206,0xC207,0xC208,0xC209,0xC20A,0xC20B,0xC20E, +0xC210,0xC212,0xC213,0xC214,0xC215,0xC216,0xC217,0xC21A, +0xC21B,0xC21D,0xC21E,0xC221,0xC222,0xC223, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xC224,0xC225,0xC226,0xC227,0xC22A,0xC22C,0xC22E,0xC230, +0xC233,0xC235,0xC236,0xC237,0xC238,0xC239,0xC23A,0xC23B, +0xC23C,0xC23D,0xC23E,0xC23F,0xC240,0xC241,0xC242,0xC243, +0xC244,0xC245, 0, 0, 0, 0, 0, 0, +0xC246,0xC247,0xC249,0xC24A,0xC24B,0xC24C,0xC24D,0xC24E, +0xC24F,0xC252,0xC253,0xC255,0xC256,0xC257,0xC259,0xC25A, +0xC25B,0xC25C,0xC25D,0xC25E,0xC25F,0xC261,0xC262,0xC263, +0xC264,0xC266, 0, 0, 0, 0, 0, 0, +0xC267,0xC268,0xC269,0xC26A,0xC26B,0xC26E,0xC26F,0xC271, +0xC272,0xC273,0xC275,0xC276,0xC277,0xC278,0xC279,0xC27A, +0xC27B,0xC27E,0xC280,0xC282,0xC283,0xC284,0xC285,0xC286, +0xC287,0xC28A,0xC28B,0xC28C,0xC28D,0xC28E,0xC28F,0xC291, +0xC292,0xC293,0xC294,0xC295,0xC296,0xC297,0xC299,0xC29A, +0xC29C,0xC29E,0xC29F,0xC2A0,0xC2A1,0xC2A2,0xC2A3,0xC2A6, +0xC2A7,0xC2A9,0xC2AA,0xC2AB,0xC2AE,0xC2AF,0xC2B0,0xC2B1, +0xC2B2,0xC2B3,0xC2B6,0xC2B8,0xC2BA,0xC2BB,0xC2BC,0xC2BD, +0xC2BE,0xC2BF,0xC2C0,0xC2C1,0xC2C2,0xC2C3,0xC2C4,0xC2C5, +0xC2C6,0xC2C7,0xC2C8,0xC2C9,0xC2CA,0xC2CB,0xC2CC,0xC2CD, +0xC2CE,0xC2CF,0xC2D0,0xC2D1,0xC2D2,0xC2D3,0xC2D4,0xC2D5, +0xC2D6,0xC2D7,0xC2D8,0xC2D9,0xC2DA,0xC2DB,0xC2DE,0xC2DF, +0xC2E1,0xC2E2,0xC2E5,0xC2E6,0xC2E7,0xC2E8,0xC2E9,0xC2EA, +0xC2EE,0xC2F0,0xC2F2,0xC2F3,0xC2F4,0xC2F5,0xC2F7,0xC2FA, +0xC2FD,0xC2FE,0xC2FF,0xC301,0xC302,0xC303,0xC304,0xC305, +0xC306,0xC307,0xC30A,0xC30B,0xC30E,0xC30F, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xC310,0xC311,0xC312,0xC316,0xC317,0xC319,0xC31A,0xC31B, +0xC31D,0xC31E,0xC31F,0xC320,0xC321,0xC322,0xC323,0xC326, +0xC327,0xC32A,0xC32B,0xC32C,0xC32D,0xC32E,0xC32F,0xC330, +0xC331,0xC332, 0, 0, 0, 0, 0, 0, +0xC333,0xC334,0xC335,0xC336,0xC337,0xC338,0xC339,0xC33A, +0xC33B,0xC33C,0xC33D,0xC33E,0xC33F,0xC340,0xC341,0xC342, +0xC343,0xC344,0xC346,0xC347,0xC348,0xC349,0xC34A,0xC34B, +0xC34C,0xC34D, 0, 0, 0, 0, 0, 0, +0xC34E,0xC34F,0xC350,0xC351,0xC352,0xC353,0xC354,0xC355, +0xC356,0xC357,0xC358,0xC359,0xC35A,0xC35B,0xC35C,0xC35D, +0xC35E,0xC35F,0xC360,0xC361,0xC362,0xC363,0xC364,0xC365, +0xC366,0xC367,0xC36A,0xC36B,0xC36D,0xC36E,0xC36F,0xC371, +0xC373,0xC374,0xC375,0xC376,0xC377,0xC37A,0xC37B,0xC37E, +0xC37F,0xC380,0xC381,0xC382,0xC383,0xC385,0xC386,0xC387, +0xC389,0xC38A,0xC38B,0xC38D,0xC38E,0xC38F,0xC390,0xC391, +0xC392,0xC393,0xC394,0xC395,0xC396,0xC397,0xC398,0xC399, +0xC39A,0xC39B,0xC39C,0xC39D,0xC39E,0xC39F,0xC3A0,0xC3A1, +0xC3A2,0xC3A3,0xC3A4,0xC3A5,0xC3A6,0xC3A7,0xC3A8,0xC3A9, +0xC3AA,0xC3AB,0xC3AC,0xC3AD,0xC3AE,0xC3AF,0xC3B0,0xC3B1, +0xC3B2,0xC3B3,0xC3B4,0xC3B5,0xC3B6,0xC3B7,0xC3B8,0xC3B9, +0xC3BA,0xC3BB,0xC3BC,0xC3BD,0xC3BE,0xC3BF,0xC3C1,0xC3C2, +0xC3C3,0xC3C4,0xC3C5,0xC3C6,0xC3C7,0xC3C8,0xC3C9,0xC3CA, +0xC3CB,0xC3CC,0xC3CD,0xC3CE,0xC3CF,0xC3D0,0xC3D1,0xC3D2, +0xC3D3,0xC3D4,0xC3D5,0xC3D6,0xC3D7,0xC3DA, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xC3DB,0xC3DD,0xC3DE,0xC3E1,0xC3E3,0xC3E4,0xC3E5,0xC3E6, +0xC3E7,0xC3EA,0xC3EB,0xC3EC,0xC3EE,0xC3EF,0xC3F0,0xC3F1, +0xC3F2,0xC3F3,0xC3F6,0xC3F7,0xC3F9,0xC3FA,0xC3FB,0xC3FC, +0xC3FD,0xC3FE, 0, 0, 0, 0, 0, 0, +0xC3FF,0xC400,0xC401,0xC402,0xC403,0xC404,0xC405,0xC406, +0xC407,0xC409,0xC40A,0xC40B,0xC40C,0xC40D,0xC40E,0xC40F, +0xC411,0xC412,0xC413,0xC414,0xC415,0xC416,0xC417,0xC418, +0xC419,0xC41A, 0, 0, 0, 0, 0, 0, +0xC41B,0xC41C,0xC41D,0xC41E,0xC41F,0xC420,0xC421,0xC422, +0xC423,0xC425,0xC426,0xC427,0xC428,0xC429,0xC42A,0xC42B, +0xC42D,0xC42E,0xC42F,0xC431,0xC432,0xC433,0xC435,0xC436, +0xC437,0xC438,0xC439,0xC43A,0xC43B,0xC43E,0xC43F,0xC440, +0xC441,0xC442,0xC443,0xC444,0xC445,0xC446,0xC447,0xC449, +0xC44A,0xC44B,0xC44C,0xC44D,0xC44E,0xC44F,0xC450,0xC451, +0xC452,0xC453,0xC454,0xC455,0xC456,0xC457,0xC458,0xC459, +0xC45A,0xC45B,0xC45C,0xC45D,0xC45E,0xC45F,0xC460,0xC461, +0xC462,0xC463,0xC466,0xC467,0xC469,0xC46A,0xC46B,0xC46D, +0xC46E,0xC46F,0xC470,0xC471,0xC472,0xC473,0xC476,0xC477, +0xC478,0xC47A,0xC47B,0xC47C,0xC47D,0xC47E,0xC47F,0xC481, +0xC482,0xC483,0xC484,0xC485,0xC486,0xC487,0xC488,0xC489, +0xC48A,0xC48B,0xC48C,0xC48D,0xC48E,0xC48F,0xC490,0xC491, +0xC492,0xC493,0xC495,0xC496,0xC497,0xC498,0xC499,0xC49A, +0xC49B,0xC49D,0xC49E,0xC49F,0xC4A0,0xC4A1,0xC4A2,0xC4A3, +0xC4A4,0xC4A5,0xC4A6,0xC4A7,0xC4A8,0xC4A9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xC4AA,0xC4AB,0xC4AC,0xC4AD,0xC4AE,0xC4AF,0xC4B0,0xC4B1, +0xC4B2,0xC4B3,0xC4B4,0xC4B5,0xC4B6,0xC4B7,0xC4B9,0xC4BA, +0xC4BB,0xC4BD,0xC4BE,0xC4BF,0xC4C0,0xC4C1,0xC4C2,0xC4C3, +0xC4C4,0xC4C5, 0, 0, 0, 0, 0, 0, +0xC4C6,0xC4C7,0xC4C8,0xC4C9,0xC4CA,0xC4CB,0xC4CC,0xC4CD, +0xC4CE,0xC4CF,0xC4D0,0xC4D1,0xC4D2,0xC4D3,0xC4D4,0xC4D5, +0xC4D6,0xC4D7,0xC4D8,0xC4D9,0xC4DA,0xC4DB,0xC4DC,0xC4DD, +0xC4DE,0xC4DF, 0, 0, 0, 0, 0, 0, +0xC4E0,0xC4E1,0xC4E2,0xC4E3,0xC4E4,0xC4E5,0xC4E6,0xC4E7, +0xC4E8,0xC4EA,0xC4EB,0xC4EC,0xC4ED,0xC4EE,0xC4EF,0xC4F2, +0xC4F3,0xC4F5,0xC4F6,0xC4F7,0xC4F9,0xC4FB,0xC4FC,0xC4FD, +0xC4FE,0xC502,0xC503,0xC504,0xC505,0xC506,0xC507,0xC508, +0xC509,0xC50A,0xC50B,0xC50D,0xC50E,0xC50F,0xC511,0xC512, +0xC513,0xC515,0xC516,0xC517,0xC518,0xC519,0xC51A,0xC51B, +0xC51D,0xC51E,0xC51F,0xC520,0xC521,0xC522,0xC523,0xC524, +0xC525,0xC526,0xC527,0xC52A,0xC52B,0xC52D,0xC52E,0xC52F, +0xC531,0xC532,0xC533,0xC534,0xC535,0xC536,0xC537,0xC53A, +0xC53C,0xC53E,0xC53F,0xC540,0xC541,0xC542,0xC543,0xC546, +0xC547,0xC54B,0xC54F,0xC550,0xC551,0xC552,0xC556,0xC55A, +0xC55B,0xC55C,0xC55F,0xC562,0xC563,0xC565,0xC566,0xC567, +0xC569,0xC56A,0xC56B,0xC56C,0xC56D,0xC56E,0xC56F,0xC572, +0xC576,0xC577,0xC578,0xC579,0xC57A,0xC57B,0xC57E,0xC57F, +0xC581,0xC582,0xC583,0xC585,0xC586,0xC588,0xC589,0xC58A, +0xC58B,0xC58E,0xC590,0xC592,0xC593,0xC594, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xC596,0xC599,0xC59A,0xC59B,0xC59D,0xC59E,0xC59F,0xC5A1, +0xC5A2,0xC5A3,0xC5A4,0xC5A5,0xC5A6,0xC5A7,0xC5A8,0xC5AA, +0xC5AB,0xC5AC,0xC5AD,0xC5AE,0xC5AF,0xC5B0,0xC5B1,0xC5B2, +0xC5B3,0xC5B6, 0, 0, 0, 0, 0, 0, +0xC5B7,0xC5BA,0xC5BF,0xC5C0,0xC5C1,0xC5C2,0xC5C3,0xC5CB, +0xC5CD,0xC5CF,0xC5D2,0xC5D3,0xC5D5,0xC5D6,0xC5D7,0xC5D9, +0xC5DA,0xC5DB,0xC5DC,0xC5DD,0xC5DE,0xC5DF,0xC5E2,0xC5E4, +0xC5E6,0xC5E7, 0, 0, 0, 0, 0, 0, +0xC5E8,0xC5E9,0xC5EA,0xC5EB,0xC5EF,0xC5F1,0xC5F2,0xC5F3, +0xC5F5,0xC5F8,0xC5F9,0xC5FA,0xC5FB,0xC602,0xC603,0xC604, +0xC609,0xC60A,0xC60B,0xC60D,0xC60E,0xC60F,0xC611,0xC612, +0xC613,0xC614,0xC615,0xC616,0xC617,0xC61A,0xC61D,0xC61E, +0xC61F,0xC620,0xC621,0xC622,0xC623,0xC626,0xC627,0xC629, +0xC62A,0xC62B,0xC62F,0xC631,0xC632,0xC636,0xC638,0xC63A, +0xC63C,0xC63D,0xC63E,0xC63F,0xC642,0xC643,0xC645,0xC646, +0xC647,0xC649,0xC64A,0xC64B,0xC64C,0xC64D,0xC64E,0xC64F, +0xC652,0xC656,0xC657,0xC658,0xC659,0xC65A,0xC65B,0xC65E, +0xC65F,0xC661,0xC662,0xC663,0xC664,0xC665,0xC666,0xC667, +0xC668,0xC669,0xC66A,0xC66B,0xC66D,0xC66E,0xC670,0xC672, +0xC673,0xC674,0xC675,0xC676,0xC677,0xC67A,0xC67B,0xC67D, +0xC67E,0xC67F,0xC681,0xC682,0xC683,0xC684,0xC685,0xC686, +0xC687,0xC68A,0xC68C,0xC68E,0xC68F,0xC690,0xC691,0xC692, +0xC693,0xC696,0xC697,0xC699,0xC69A,0xC69B,0xC69D,0xC69E, +0xC69F,0xC6A0,0xC6A1,0xC6A2,0xC6A3,0xC6A6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xC6A8,0xC6AA,0xC6AB,0xC6AC,0xC6AD,0xC6AE,0xC6AF,0xC6B2, +0xC6B3,0xC6B5,0xC6B6,0xC6B7,0xC6BB,0xC6BC,0xC6BD,0xC6BE, +0xC6BF,0xC6C2,0xC6C4,0xC6C6,0xC6C7,0xC6C8,0xC6C9,0xC6CA, +0xC6CB,0xC6CE, 0, 0, 0, 0, 0, 0, +0xC6CF,0xC6D1,0xC6D2,0xC6D3,0xC6D5,0xC6D6,0xC6D7,0xC6D8, +0xC6D9,0xC6DA,0xC6DB,0xC6DE,0xC6DF,0xC6E2,0xC6E3,0xC6E4, +0xC6E5,0xC6E6,0xC6E7,0xC6EA,0xC6EB,0xC6ED,0xC6EE,0xC6EF, +0xC6F1,0xC6F2, 0, 0, 0, 0, 0, 0, +0xC6F3,0xC6F4,0xC6F5,0xC6F6,0xC6F7,0xC6FA,0xC6FB,0xC6FC, +0xC6FE,0xC6FF,0xC700,0xC701,0xC702,0xC703,0xC706,0xC707, +0xC709,0xC70A,0xC70B,0xC70D,0xC70E,0xC70F,0xC710,0xC711, +0xC712,0xC713,0xC716,0xC718,0xC71A,0xC71B,0xC71C,0xC71D, +0xC71E,0xC71F,0xC722,0xC723,0xC725,0xC726,0xC727,0xC729, +0xC72A,0xC72B,0xC72C,0xC72D,0xC72E,0xC72F,0xC732,0xC734, +0xC736,0xC738,0xC739,0xC73A,0xC73B,0xC73E,0xC73F,0xC741, +0xC742,0xC743,0xC745,0xC746,0xC747,0xC748,0xC749,0xC74B, +0xC74E,0xC750,0xC759,0xC75A,0xC75B,0xC75D,0xC75E,0xC75F, +0xC761,0xC762,0xC763,0xC764,0xC765,0xC766,0xC767,0xC769, +0xC76A,0xC76C,0xC76D,0xC76E,0xC76F,0xC770,0xC771,0xC772, +0xC773,0xC776,0xC777,0xC779,0xC77A,0xC77B,0xC77F,0xC780, +0xC781,0xC782,0xC786,0xC78B,0xC78C,0xC78D,0xC78F,0xC792, +0xC793,0xC795,0xC799,0xC79B,0xC79C,0xC79D,0xC79E,0xC79F, +0xC7A2,0xC7A7,0xC7A8,0xC7A9,0xC7AA,0xC7AB,0xC7AE,0xC7AF, +0xC7B1,0xC7B2,0xC7B3,0xC7B5,0xC7B6,0xC7B7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xC7B8,0xC7B9,0xC7BA,0xC7BB,0xC7BE,0xC7C2,0xC7C3,0xC7C4, +0xC7C5,0xC7C6,0xC7C7,0xC7CA,0xC7CB,0xC7CD,0xC7CF,0xC7D1, +0xC7D2,0xC7D3,0xC7D4,0xC7D5,0xC7D6,0xC7D7,0xC7D9,0xC7DA, +0xC7DB,0xC7DC, 0, 0, 0, 0, 0, 0, +0xC7DE,0xC7DF,0xC7E0,0xC7E1,0xC7E2,0xC7E3,0xC7E5,0xC7E6, +0xC7E7,0xC7E9,0xC7EA,0xC7EB,0xC7ED,0xC7EE,0xC7EF,0xC7F0, +0xC7F1,0xC7F2,0xC7F3,0xC7F4,0xC7F5,0xC7F6,0xC7F7,0xC7F8, +0xC7F9,0xC7FA, 0, 0, 0, 0, 0, 0, +0xC7FB,0xC7FC,0xC7FD,0xC7FE,0xC7FF,0xC802,0xC803,0xC805, +0xC806,0xC807,0xC809,0xC80B,0xC80C,0xC80D,0xC80E,0xC80F, +0xC812,0xC814,0xC817,0xC818,0xC819,0xC81A,0xC81B,0xC81E, +0xC81F,0xC821,0xC822,0xC823,0xC825,0xC826,0xC827,0xC828, +0xC829,0xC82A,0xC82B,0xC82E,0xC830,0xC832,0xC833,0xC834, +0xC835,0xC836,0xC837,0xC839,0xC83A,0xC83B,0xC83D,0xC83E, +0xC83F,0xC841,0xC842,0xC843,0xC844,0xC845,0xC846,0xC847, +0xC84A,0xC84B,0xC84E,0xC84F,0xC850,0xC851,0xC852,0xC853, +0xC855,0xC856,0xC857,0xC858,0xC859,0xC85A,0xC85B,0xC85C, +0xC85D,0xC85E,0xC85F,0xC860,0xC861,0xC862,0xC863,0xC864, +0xC865,0xC866,0xC867,0xC868,0xC869,0xC86A,0xC86B,0xC86C, +0xC86D,0xC86E,0xC86F,0xC872,0xC873,0xC875,0xC876,0xC877, +0xC879,0xC87B,0xC87C,0xC87D,0xC87E,0xC87F,0xC882,0xC884, +0xC888,0xC889,0xC88A,0xC88E,0xC88F,0xC890,0xC891,0xC892, +0xC893,0xC895,0xC896,0xC897,0xC898,0xC899,0xC89A,0xC89B, +0xC89C,0xC89E,0xC8A0,0xC8A2,0xC8A3,0xC8A4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xC8A5,0xC8A6,0xC8A7,0xC8A9,0xC8AA,0xC8AB,0xC8AC,0xC8AD, +0xC8AE,0xC8AF,0xC8B0,0xC8B1,0xC8B2,0xC8B3,0xC8B4,0xC8B5, +0xC8B6,0xC8B7,0xC8B8,0xC8B9,0xC8BA,0xC8BB,0xC8BE,0xC8BF, +0xC8C0,0xC8C1, 0, 0, 0, 0, 0, 0, +0xC8C2,0xC8C3,0xC8C5,0xC8C6,0xC8C7,0xC8C9,0xC8CA,0xC8CB, +0xC8CD,0xC8CE,0xC8CF,0xC8D0,0xC8D1,0xC8D2,0xC8D3,0xC8D6, +0xC8D8,0xC8DA,0xC8DB,0xC8DC,0xC8DD,0xC8DE,0xC8DF,0xC8E2, +0xC8E3,0xC8E5, 0, 0, 0, 0, 0, 0, +0xC8E6,0xC8E7,0xC8E8,0xC8E9,0xC8EA,0xC8EB,0xC8EC,0xC8ED, +0xC8EE,0xC8EF,0xC8F0,0xC8F1,0xC8F2,0xC8F3,0xC8F4,0xC8F6, +0xC8F7,0xC8F8,0xC8F9,0xC8FA,0xC8FB,0xC8FE,0xC8FF,0xC901, +0xC902,0xC903,0xC907,0xC908,0xC909,0xC90A,0xC90B,0xC90E, +0x3000,0x3001,0x3002,0x00B7,0x2025,0x2026,0x00A8,0x3003, +0x00AD,0x2015,0x2225,0xFF3C,0x223C,0x2018,0x2019,0x201C, +0x201D,0x3014,0x3015,0x3008,0x3009,0x300A,0x300B,0x300C, +0x300D,0x300E,0x300F,0x3010,0x3011,0x00B1,0x00D7,0x00F7, +0x2260,0x2264,0x2265,0x221E,0x2234,0x00B0,0x2032,0x2033, +0x2103,0x212B,0xFFE0,0xFFE1,0xFFE5,0x2642,0x2640,0x2220, +0x22A5,0x2312,0x2202,0x2207,0x2261,0x2252,0x00A7,0x203B, +0x2606,0x2605,0x25CB,0x25CF,0x25CE,0x25C7,0x25C6,0x25A1, +0x25A0,0x25B3,0x25B2,0x25BD,0x25BC,0x2192,0x2190,0x2191, +0x2193,0x2194,0x3013,0x226A,0x226B,0x221A,0x223D,0x221D, +0x2235,0x222B,0x222C,0x2208,0x220B,0x2286,0x2287,0x2282, +0x2283,0x222A,0x2229,0x2227,0x2228,0xFFE2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xC910,0xC912,0xC913,0xC914,0xC915,0xC916,0xC917,0xC919, +0xC91A,0xC91B,0xC91C,0xC91D,0xC91E,0xC91F,0xC920,0xC921, +0xC922,0xC923,0xC924,0xC925,0xC926,0xC927,0xC928,0xC929, +0xC92A,0xC92B, 0, 0, 0, 0, 0, 0, +0xC92D,0xC92E,0xC92F,0xC930,0xC931,0xC932,0xC933,0xC935, +0xC936,0xC937,0xC938,0xC939,0xC93A,0xC93B,0xC93C,0xC93D, +0xC93E,0xC93F,0xC940,0xC941,0xC942,0xC943,0xC944,0xC945, +0xC946,0xC947, 0, 0, 0, 0, 0, 0, +0xC948,0xC949,0xC94A,0xC94B,0xC94C,0xC94D,0xC94E,0xC94F, +0xC952,0xC953,0xC955,0xC956,0xC957,0xC959,0xC95A,0xC95B, +0xC95C,0xC95D,0xC95E,0xC95F,0xC962,0xC964,0xC965,0xC966, +0xC967,0xC968,0xC969,0xC96A,0xC96B,0xC96D,0xC96E,0xC96F, +0x21D2,0x21D4,0x2200,0x2203,0x00B4,0xFF5E,0x02C7,0x02D8, +0x02DD,0x02DA,0x02D9,0x00B8,0x02DB,0x00A1,0x00BF,0x02D0, +0x222E,0x2211,0x220F,0x00A4,0x2109,0x2030,0x25C1,0x25C0, +0x25B7,0x25B6,0x2664,0x2660,0x2661,0x2665,0x2667,0x2663, +0x2299,0x25C8,0x25A3,0x25D0,0x25D1,0x2592,0x25A4,0x25A5, +0x25A8,0x25A7,0x25A6,0x25A9,0x2668,0x260F,0x260E,0x261C, +0x261E,0x00B6,0x2020,0x2021,0x2195,0x2197,0x2199,0x2196, +0x2198,0x266D,0x2669,0x266A,0x266C,0x327F,0x321C,0x2116, +0x33C7,0x2122,0x33C2,0x33D8,0x2121, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xC971,0xC972,0xC973,0xC975,0xC976,0xC977,0xC978,0xC979, +0xC97A,0xC97B,0xC97D,0xC97E,0xC97F,0xC980,0xC981,0xC982, +0xC983,0xC984,0xC985,0xC986,0xC987,0xC98A,0xC98B,0xC98D, +0xC98E,0xC98F, 0, 0, 0, 0, 0, 0, +0xC991,0xC992,0xC993,0xC994,0xC995,0xC996,0xC997,0xC99A, +0xC99C,0xC99E,0xC99F,0xC9A0,0xC9A1,0xC9A2,0xC9A3,0xC9A4, +0xC9A5,0xC9A6,0xC9A7,0xC9A8,0xC9A9,0xC9AA,0xC9AB,0xC9AC, +0xC9AD,0xC9AE, 0, 0, 0, 0, 0, 0, +0xC9AF,0xC9B0,0xC9B1,0xC9B2,0xC9B3,0xC9B4,0xC9B5,0xC9B6, +0xC9B7,0xC9B8,0xC9B9,0xC9BA,0xC9BB,0xC9BC,0xC9BD,0xC9BE, +0xC9BF,0xC9C2,0xC9C3,0xC9C5,0xC9C6,0xC9C9,0xC9CB,0xC9CC, +0xC9CD,0xC9CE,0xC9CF,0xC9D2,0xC9D4,0xC9D7,0xC9D8,0xC9DB, +0xFF01,0xFF02,0xFF03,0xFF04,0xFF05,0xFF06,0xFF07,0xFF08, +0xFF09,0xFF0A,0xFF0B,0xFF0C,0xFF0D,0xFF0E,0xFF0F,0xFF10, +0xFF11,0xFF12,0xFF13,0xFF14,0xFF15,0xFF16,0xFF17,0xFF18, +0xFF19,0xFF1A,0xFF1B,0xFF1C,0xFF1D,0xFF1E,0xFF1F,0xFF20, +0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27,0xFF28, +0xFF29,0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F,0xFF30, +0xFF31,0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37,0xFF38, +0xFF39,0xFF3A,0xFF3B,0xFFE6,0xFF3D,0xFF3E,0xFF3F,0xFF40, +0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47,0xFF48, +0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F,0xFF50, +0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,0xFF56,0xFF57,0xFF58, +0xFF59,0xFF5A,0xFF5B,0xFF5C,0xFF5D,0xFFE3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xC9DE,0xC9DF,0xC9E1,0xC9E3,0xC9E5,0xC9E6,0xC9E8,0xC9E9, +0xC9EA,0xC9EB,0xC9EE,0xC9F2,0xC9F3,0xC9F4,0xC9F5,0xC9F6, +0xC9F7,0xC9FA,0xC9FB,0xC9FD,0xC9FE,0xC9FF,0xCA01,0xCA02, +0xCA03,0xCA04, 0, 0, 0, 0, 0, 0, +0xCA05,0xCA06,0xCA07,0xCA0A,0xCA0E,0xCA0F,0xCA10,0xCA11, +0xCA12,0xCA13,0xCA15,0xCA16,0xCA17,0xCA19,0xCA1A,0xCA1B, +0xCA1C,0xCA1D,0xCA1E,0xCA1F,0xCA20,0xCA21,0xCA22,0xCA23, +0xCA24,0xCA25, 0, 0, 0, 0, 0, 0, +0xCA26,0xCA27,0xCA28,0xCA2A,0xCA2B,0xCA2C,0xCA2D,0xCA2E, +0xCA2F,0xCA30,0xCA31,0xCA32,0xCA33,0xCA34,0xCA35,0xCA36, +0xCA37,0xCA38,0xCA39,0xCA3A,0xCA3B,0xCA3C,0xCA3D,0xCA3E, +0xCA3F,0xCA40,0xCA41,0xCA42,0xCA43,0xCA44,0xCA45,0xCA46, +0x3131,0x3132,0x3133,0x3134,0x3135,0x3136,0x3137,0x3138, +0x3139,0x313A,0x313B,0x313C,0x313D,0x313E,0x313F,0x3140, +0x3141,0x3142,0x3143,0x3144,0x3145,0x3146,0x3147,0x3148, +0x3149,0x314A,0x314B,0x314C,0x314D,0x314E,0x314F,0x3150, +0x3151,0x3152,0x3153,0x3154,0x3155,0x3156,0x3157,0x3158, +0x3159,0x315A,0x315B,0x315C,0x315D,0x315E,0x315F,0x3160, +0x3161,0x3162,0x3163,0x3164,0x3165,0x3166,0x3167,0x3168, +0x3169,0x316A,0x316B,0x316C,0x316D,0x316E,0x316F,0x3170, +0x3171,0x3172,0x3173,0x3174,0x3175,0x3176,0x3177,0x3178, +0x3179,0x317A,0x317B,0x317C,0x317D,0x317E,0x317F,0x3180, +0x3181,0x3182,0x3183,0x3184,0x3185,0x3186,0x3187,0x3188, +0x3189,0x318A,0x318B,0x318C,0x318D,0x318E, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xCA47,0xCA48,0xCA49,0xCA4A,0xCA4B,0xCA4E,0xCA4F,0xCA51, +0xCA52,0xCA53,0xCA55,0xCA56,0xCA57,0xCA58,0xCA59,0xCA5A, +0xCA5B,0xCA5E,0xCA62,0xCA63,0xCA64,0xCA65,0xCA66,0xCA67, +0xCA69,0xCA6A, 0, 0, 0, 0, 0, 0, +0xCA6B,0xCA6C,0xCA6D,0xCA6E,0xCA6F,0xCA70,0xCA71,0xCA72, +0xCA73,0xCA74,0xCA75,0xCA76,0xCA77,0xCA78,0xCA79,0xCA7A, +0xCA7B,0xCA7C,0xCA7E,0xCA7F,0xCA80,0xCA81,0xCA82,0xCA83, +0xCA85,0xCA86, 0, 0, 0, 0, 0, 0, +0xCA87,0xCA88,0xCA89,0xCA8A,0xCA8B,0xCA8C,0xCA8D,0xCA8E, +0xCA8F,0xCA90,0xCA91,0xCA92,0xCA93,0xCA94,0xCA95,0xCA96, +0xCA97,0xCA99,0xCA9A,0xCA9B,0xCA9C,0xCA9D,0xCA9E,0xCA9F, +0xCAA0,0xCAA1,0xCAA2,0xCAA3,0xCAA4,0xCAA5,0xCAA6,0xCAA7, +0x2170,0x2171,0x2172,0x2173,0x2174,0x2175,0x2176,0x2177, +0x2178,0x2179, 0, 0, 0, 0, 0,0x2160, +0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,0x2167,0x2168, +0x2169, 0, 0, 0, 0, 0, 0, 0, +0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398, +0x0399,0x039A,0x039B,0x039C,0x039D,0x039E,0x039F,0x03A0, +0x03A1,0x03A3,0x03A4,0x03A5,0x03A6,0x03A7,0x03A8,0x03A9, + 0, 0, 0, 0, 0, 0, 0, 0, +0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6,0x03B7,0x03B8, +0x03B9,0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF,0x03C0, +0x03C1,0x03C3,0x03C4,0x03C5,0x03C6,0x03C7,0x03C8,0x03C9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xCAA8,0xCAA9,0xCAAA,0xCAAB,0xCAAC,0xCAAD,0xCAAE,0xCAAF, +0xCAB0,0xCAB1,0xCAB2,0xCAB3,0xCAB4,0xCAB5,0xCAB6,0xCAB7, +0xCAB8,0xCAB9,0xCABA,0xCABB,0xCABE,0xCABF,0xCAC1,0xCAC2, +0xCAC3,0xCAC5, 0, 0, 0, 0, 0, 0, +0xCAC6,0xCAC7,0xCAC8,0xCAC9,0xCACA,0xCACB,0xCACE,0xCAD0, +0xCAD2,0xCAD4,0xCAD5,0xCAD6,0xCAD7,0xCADA,0xCADB,0xCADC, +0xCADD,0xCADE,0xCADF,0xCAE1,0xCAE2,0xCAE3,0xCAE4,0xCAE5, +0xCAE6,0xCAE7, 0, 0, 0, 0, 0, 0, +0xCAE8,0xCAE9,0xCAEA,0xCAEB,0xCAED,0xCAEE,0xCAEF,0xCAF0, +0xCAF1,0xCAF2,0xCAF3,0xCAF5,0xCAF6,0xCAF7,0xCAF8,0xCAF9, +0xCAFA,0xCAFB,0xCAFC,0xCAFD,0xCAFE,0xCAFF,0xCB00,0xCB01, +0xCB02,0xCB03,0xCB04,0xCB05,0xCB06,0xCB07,0xCB09,0xCB0A, +0x2500,0x2502,0x250C,0x2510,0x2518,0x2514,0x251C,0x252C, +0x2524,0x2534,0x253C,0x2501,0x2503,0x250F,0x2513,0x251B, +0x2517,0x2523,0x2533,0x252B,0x253B,0x254B,0x2520,0x252F, +0x2528,0x2537,0x253F,0x251D,0x2530,0x2525,0x2538,0x2542, +0x2512,0x2511,0x251A,0x2519,0x2516,0x2515,0x250E,0x250D, +0x251E,0x251F,0x2521,0x2522,0x2526,0x2527,0x2529,0x252A, +0x252D,0x252E,0x2531,0x2532,0x2535,0x2536,0x2539,0x253A, +0x253D,0x253E,0x2540,0x2541,0x2543,0x2544,0x2545,0x2546, +0x2547,0x2548,0x2549,0x254A, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xCB0B,0xCB0C,0xCB0D,0xCB0E,0xCB0F,0xCB11,0xCB12,0xCB13, +0xCB15,0xCB16,0xCB17,0xCB19,0xCB1A,0xCB1B,0xCB1C,0xCB1D, +0xCB1E,0xCB1F,0xCB22,0xCB23,0xCB24,0xCB25,0xCB26,0xCB27, +0xCB28,0xCB29, 0, 0, 0, 0, 0, 0, +0xCB2A,0xCB2B,0xCB2C,0xCB2D,0xCB2E,0xCB2F,0xCB30,0xCB31, +0xCB32,0xCB33,0xCB34,0xCB35,0xCB36,0xCB37,0xCB38,0xCB39, +0xCB3A,0xCB3B,0xCB3C,0xCB3D,0xCB3E,0xCB3F,0xCB40,0xCB42, +0xCB43,0xCB44, 0, 0, 0, 0, 0, 0, +0xCB45,0xCB46,0xCB47,0xCB4A,0xCB4B,0xCB4D,0xCB4E,0xCB4F, +0xCB51,0xCB52,0xCB53,0xCB54,0xCB55,0xCB56,0xCB57,0xCB5A, +0xCB5B,0xCB5C,0xCB5E,0xCB5F,0xCB60,0xCB61,0xCB62,0xCB63, +0xCB65,0xCB66,0xCB67,0xCB68,0xCB69,0xCB6A,0xCB6B,0xCB6C, +0x3395,0x3396,0x3397,0x2113,0x3398,0x33C4,0x33A3,0x33A4, +0x33A5,0x33A6,0x3399,0x339A,0x339B,0x339C,0x339D,0x339E, +0x339F,0x33A0,0x33A1,0x33A2,0x33CA,0x338D,0x338E,0x338F, +0x33CF,0x3388,0x3389,0x33C8,0x33A7,0x33A8,0x33B0,0x33B1, +0x33B2,0x33B3,0x33B4,0x33B5,0x33B6,0x33B7,0x33B8,0x33B9, +0x3380,0x3381,0x3382,0x3383,0x3384,0x33BA,0x33BB,0x33BC, +0x33BD,0x33BE,0x33BF,0x3390,0x3391,0x3392,0x3393,0x3394, +0x2126,0x33C0,0x33C1,0x338A,0x338B,0x338C,0x33D6,0x33C5, +0x33AD,0x33AE,0x33AF,0x33DB,0x33A9,0x33AA,0x33AB,0x33AC, +0x33DD,0x33D0,0x33D3,0x33C3,0x33C9,0x33DC,0x33C6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xCB6D,0xCB6E,0xCB6F,0xCB70,0xCB71,0xCB72,0xCB73,0xCB74, +0xCB75,0xCB76,0xCB77,0xCB7A,0xCB7B,0xCB7C,0xCB7D,0xCB7E, +0xCB7F,0xCB80,0xCB81,0xCB82,0xCB83,0xCB84,0xCB85,0xCB86, +0xCB87,0xCB88, 0, 0, 0, 0, 0, 0, +0xCB89,0xCB8A,0xCB8B,0xCB8C,0xCB8D,0xCB8E,0xCB8F,0xCB90, +0xCB91,0xCB92,0xCB93,0xCB94,0xCB95,0xCB96,0xCB97,0xCB98, +0xCB99,0xCB9A,0xCB9B,0xCB9D,0xCB9E,0xCB9F,0xCBA0,0xCBA1, +0xCBA2,0xCBA3, 0, 0, 0, 0, 0, 0, +0xCBA4,0xCBA5,0xCBA6,0xCBA7,0xCBA8,0xCBA9,0xCBAA,0xCBAB, +0xCBAC,0xCBAD,0xCBAE,0xCBAF,0xCBB0,0xCBB1,0xCBB2,0xCBB3, +0xCBB4,0xCBB5,0xCBB6,0xCBB7,0xCBB9,0xCBBA,0xCBBB,0xCBBC, +0xCBBD,0xCBBE,0xCBBF,0xCBC0,0xCBC1,0xCBC2,0xCBC3,0xCBC4, +0x00C6,0x00D0,0x00AA,0x0126, 0,0x0132, 0,0x013F, +0x0141,0x00D8,0x0152,0x00BA,0x00DE,0x0166,0x014A, 0, +0x3260,0x3261,0x3262,0x3263,0x3264,0x3265,0x3266,0x3267, +0x3268,0x3269,0x326A,0x326B,0x326C,0x326D,0x326E,0x326F, +0x3270,0x3271,0x3272,0x3273,0x3274,0x3275,0x3276,0x3277, +0x3278,0x3279,0x327A,0x327B,0x24D0,0x24D1,0x24D2,0x24D3, +0x24D4,0x24D5,0x24D6,0x24D7,0x24D8,0x24D9,0x24DA,0x24DB, +0x24DC,0x24DD,0x24DE,0x24DF,0x24E0,0x24E1,0x24E2,0x24E3, +0x24E4,0x24E5,0x24E6,0x24E7,0x24E8,0x24E9,0x2460,0x2461, +0x2462,0x2463,0x2464,0x2465,0x2466,0x2467,0x2468,0x2469, +0x246A,0x246B,0x246C,0x246D,0x246E,0x00BD,0x2153,0x2154, +0x00BC,0x00BE,0x215B,0x215C,0x215D,0x215E, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xCBC5,0xCBC6,0xCBC7,0xCBC8,0xCBC9,0xCBCA,0xCBCB,0xCBCC, +0xCBCD,0xCBCE,0xCBCF,0xCBD0,0xCBD1,0xCBD2,0xCBD3,0xCBD5, +0xCBD6,0xCBD7,0xCBD8,0xCBD9,0xCBDA,0xCBDB,0xCBDC,0xCBDD, +0xCBDE,0xCBDF, 0, 0, 0, 0, 0, 0, +0xCBE0,0xCBE1,0xCBE2,0xCBE3,0xCBE5,0xCBE6,0xCBE8,0xCBEA, +0xCBEB,0xCBEC,0xCBED,0xCBEE,0xCBEF,0xCBF0,0xCBF1,0xCBF2, +0xCBF3,0xCBF4,0xCBF5,0xCBF6,0xCBF7,0xCBF8,0xCBF9,0xCBFA, +0xCBFB,0xCBFC, 0, 0, 0, 0, 0, 0, +0xCBFD,0xCBFE,0xCBFF,0xCC00,0xCC01,0xCC02,0xCC03,0xCC04, +0xCC05,0xCC06,0xCC07,0xCC08,0xCC09,0xCC0A,0xCC0B,0xCC0E, +0xCC0F,0xCC11,0xCC12,0xCC13,0xCC15,0xCC16,0xCC17,0xCC18, +0xCC19,0xCC1A,0xCC1B,0xCC1E,0xCC1F,0xCC20,0xCC23,0xCC24, +0x00E6,0x0111,0x00F0,0x0127,0x0131,0x0133,0x0138,0x0140, +0x0142,0x00F8,0x0153,0x00DF,0x00FE,0x0167,0x014B,0x0149, +0x3200,0x3201,0x3202,0x3203,0x3204,0x3205,0x3206,0x3207, +0x3208,0x3209,0x320A,0x320B,0x320C,0x320D,0x320E,0x320F, +0x3210,0x3211,0x3212,0x3213,0x3214,0x3215,0x3216,0x3217, +0x3218,0x3219,0x321A,0x321B,0x249C,0x249D,0x249E,0x249F, +0x24A0,0x24A1,0x24A2,0x24A3,0x24A4,0x24A5,0x24A6,0x24A7, +0x24A8,0x24A9,0x24AA,0x24AB,0x24AC,0x24AD,0x24AE,0x24AF, +0x24B0,0x24B1,0x24B2,0x24B3,0x24B4,0x24B5,0x2474,0x2475, +0x2476,0x2477,0x2478,0x2479,0x247A,0x247B,0x247C,0x247D, +0x247E,0x247F,0x2480,0x2481,0x2482,0x00B9,0x00B2,0x00B3, +0x2074,0x207F,0x2081,0x2082,0x2083,0x2084, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xCC25,0xCC26,0xCC2A,0xCC2B,0xCC2D,0xCC2F,0xCC31,0xCC32, +0xCC33,0xCC34,0xCC35,0xCC36,0xCC37,0xCC3A,0xCC3F,0xCC40, +0xCC41,0xCC42,0xCC43,0xCC46,0xCC47,0xCC49,0xCC4A,0xCC4B, +0xCC4D,0xCC4E, 0, 0, 0, 0, 0, 0, +0xCC4F,0xCC50,0xCC51,0xCC52,0xCC53,0xCC56,0xCC5A,0xCC5B, +0xCC5C,0xCC5D,0xCC5E,0xCC5F,0xCC61,0xCC62,0xCC63,0xCC65, +0xCC67,0xCC69,0xCC6A,0xCC6B,0xCC6C,0xCC6D,0xCC6E,0xCC6F, +0xCC71,0xCC72, 0, 0, 0, 0, 0, 0, +0xCC73,0xCC74,0xCC76,0xCC77,0xCC78,0xCC79,0xCC7A,0xCC7B, +0xCC7C,0xCC7D,0xCC7E,0xCC7F,0xCC80,0xCC81,0xCC82,0xCC83, +0xCC84,0xCC85,0xCC86,0xCC87,0xCC88,0xCC89,0xCC8A,0xCC8B, +0xCC8C,0xCC8D,0xCC8E,0xCC8F,0xCC90,0xCC91,0xCC92,0xCC93, +0x3041,0x3042,0x3043,0x3044,0x3045,0x3046,0x3047,0x3048, +0x3049,0x304A,0x304B,0x304C,0x304D,0x304E,0x304F,0x3050, +0x3051,0x3052,0x3053,0x3054,0x3055,0x3056,0x3057,0x3058, +0x3059,0x305A,0x305B,0x305C,0x305D,0x305E,0x305F,0x3060, +0x3061,0x3062,0x3063,0x3064,0x3065,0x3066,0x3067,0x3068, +0x3069,0x306A,0x306B,0x306C,0x306D,0x306E,0x306F,0x3070, +0x3071,0x3072,0x3073,0x3074,0x3075,0x3076,0x3077,0x3078, +0x3079,0x307A,0x307B,0x307C,0x307D,0x307E,0x307F,0x3080, +0x3081,0x3082,0x3083,0x3084,0x3085,0x3086,0x3087,0x3088, +0x3089,0x308A,0x308B,0x308C,0x308D,0x308E,0x308F,0x3090, +0x3091,0x3092,0x3093, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xCC94,0xCC95,0xCC96,0xCC97,0xCC9A,0xCC9B,0xCC9D,0xCC9E, +0xCC9F,0xCCA1,0xCCA2,0xCCA3,0xCCA4,0xCCA5,0xCCA6,0xCCA7, +0xCCAA,0xCCAE,0xCCAF,0xCCB0,0xCCB1,0xCCB2,0xCCB3,0xCCB6, +0xCCB7,0xCCB9, 0, 0, 0, 0, 0, 0, +0xCCBA,0xCCBB,0xCCBD,0xCCBE,0xCCBF,0xCCC0,0xCCC1,0xCCC2, +0xCCC3,0xCCC6,0xCCC8,0xCCCA,0xCCCB,0xCCCC,0xCCCD,0xCCCE, +0xCCCF,0xCCD1,0xCCD2,0xCCD3,0xCCD5,0xCCD6,0xCCD7,0xCCD8, +0xCCD9,0xCCDA, 0, 0, 0, 0, 0, 0, +0xCCDB,0xCCDC,0xCCDD,0xCCDE,0xCCDF,0xCCE0,0xCCE1,0xCCE2, +0xCCE3,0xCCE5,0xCCE6,0xCCE7,0xCCE8,0xCCE9,0xCCEA,0xCCEB, +0xCCED,0xCCEE,0xCCEF,0xCCF1,0xCCF2,0xCCF3,0xCCF4,0xCCF5, +0xCCF6,0xCCF7,0xCCF8,0xCCF9,0xCCFA,0xCCFB,0xCCFC,0xCCFD, +0x30A1,0x30A2,0x30A3,0x30A4,0x30A5,0x30A6,0x30A7,0x30A8, +0x30A9,0x30AA,0x30AB,0x30AC,0x30AD,0x30AE,0x30AF,0x30B0, +0x30B1,0x30B2,0x30B3,0x30B4,0x30B5,0x30B6,0x30B7,0x30B8, +0x30B9,0x30BA,0x30BB,0x30BC,0x30BD,0x30BE,0x30BF,0x30C0, +0x30C1,0x30C2,0x30C3,0x30C4,0x30C5,0x30C6,0x30C7,0x30C8, +0x30C9,0x30CA,0x30CB,0x30CC,0x30CD,0x30CE,0x30CF,0x30D0, +0x30D1,0x30D2,0x30D3,0x30D4,0x30D5,0x30D6,0x30D7,0x30D8, +0x30D9,0x30DA,0x30DB,0x30DC,0x30DD,0x30DE,0x30DF,0x30E0, +0x30E1,0x30E2,0x30E3,0x30E4,0x30E5,0x30E6,0x30E7,0x30E8, +0x30E9,0x30EA,0x30EB,0x30EC,0x30ED,0x30EE,0x30EF,0x30F0, +0x30F1,0x30F2,0x30F3,0x30F4,0x30F5,0x30F6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xCCFE,0xCCFF,0xCD00,0xCD02,0xCD03,0xCD04,0xCD05,0xCD06, +0xCD07,0xCD0A,0xCD0B,0xCD0D,0xCD0E,0xCD0F,0xCD11,0xCD12, +0xCD13,0xCD14,0xCD15,0xCD16,0xCD17,0xCD1A,0xCD1C,0xCD1E, +0xCD1F,0xCD20, 0, 0, 0, 0, 0, 0, +0xCD21,0xCD22,0xCD23,0xCD25,0xCD26,0xCD27,0xCD29,0xCD2A, +0xCD2B,0xCD2D,0xCD2E,0xCD2F,0xCD30,0xCD31,0xCD32,0xCD33, +0xCD34,0xCD35,0xCD36,0xCD37,0xCD38,0xCD3A,0xCD3B,0xCD3C, +0xCD3D,0xCD3E, 0, 0, 0, 0, 0, 0, +0xCD3F,0xCD40,0xCD41,0xCD42,0xCD43,0xCD44,0xCD45,0xCD46, +0xCD47,0xCD48,0xCD49,0xCD4A,0xCD4B,0xCD4C,0xCD4D,0xCD4E, +0xCD4F,0xCD50,0xCD51,0xCD52,0xCD53,0xCD54,0xCD55,0xCD56, +0xCD57,0xCD58,0xCD59,0xCD5A,0xCD5B,0xCD5D,0xCD5E,0xCD5F, +0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0401,0x0416, +0x0417,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E, +0x041F,0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426, +0x0427,0x0428,0x0429,0x042A,0x042B,0x042C,0x042D,0x042E, +0x042F, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0451,0x0436, +0x0437,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E, +0x043F,0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446, +0x0447,0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E, +0x044F, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xCD61,0xCD62,0xCD63,0xCD65,0xCD66,0xCD67,0xCD68,0xCD69, +0xCD6A,0xCD6B,0xCD6E,0xCD70,0xCD72,0xCD73,0xCD74,0xCD75, +0xCD76,0xCD77,0xCD79,0xCD7A,0xCD7B,0xCD7C,0xCD7D,0xCD7E, +0xCD7F,0xCD80, 0, 0, 0, 0, 0, 0, +0xCD81,0xCD82,0xCD83,0xCD84,0xCD85,0xCD86,0xCD87,0xCD89, +0xCD8A,0xCD8B,0xCD8C,0xCD8D,0xCD8E,0xCD8F,0xCD90,0xCD91, +0xCD92,0xCD93,0xCD96,0xCD97,0xCD99,0xCD9A,0xCD9B,0xCD9D, +0xCD9E,0xCD9F, 0, 0, 0, 0, 0, 0, +0xCDA0,0xCDA1,0xCDA2,0xCDA3,0xCDA6,0xCDA8,0xCDAA,0xCDAB, +0xCDAC,0xCDAD,0xCDAE,0xCDAF,0xCDB1,0xCDB2,0xCDB3,0xCDB4, +0xCDB5,0xCDB6,0xCDB7,0xCDB8,0xCDB9,0xCDBA,0xCDBB,0xCDBC, +0xCDBD,0xCDBE,0xCDBF,0xCDC0,0xCDC1,0xCDC2,0xCDC3,0xCDC5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xCDC6,0xCDC7,0xCDC8,0xCDC9,0xCDCA,0xCDCB,0xCDCD,0xCDCE, +0xCDCF,0xCDD1,0xCDD2,0xCDD3,0xCDD4,0xCDD5,0xCDD6,0xCDD7, +0xCDD8,0xCDD9,0xCDDA,0xCDDB,0xCDDC,0xCDDD,0xCDDE,0xCDDF, +0xCDE0,0xCDE1, 0, 0, 0, 0, 0, 0, +0xCDE2,0xCDE3,0xCDE4,0xCDE5,0xCDE6,0xCDE7,0xCDE9,0xCDEA, +0xCDEB,0xCDED,0xCDEE,0xCDEF,0xCDF1,0xCDF2,0xCDF3,0xCDF4, +0xCDF5,0xCDF6,0xCDF7,0xCDFA,0xCDFC,0xCDFE,0xCDFF,0xCE00, +0xCE01,0xCE02, 0, 0, 0, 0, 0, 0, +0xCE03,0xCE05,0xCE06,0xCE07,0xCE09,0xCE0A,0xCE0B,0xCE0D, +0xCE0E,0xCE0F,0xCE10,0xCE11,0xCE12,0xCE13,0xCE15,0xCE16, +0xCE17,0xCE18,0xCE1A,0xCE1B,0xCE1C,0xCE1D,0xCE1E,0xCE1F, +0xCE22,0xCE23,0xCE25,0xCE26,0xCE27,0xCE29,0xCE2A,0xCE2B, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xCE2C,0xCE2D,0xCE2E,0xCE2F,0xCE32,0xCE34,0xCE36,0xCE37, +0xCE38,0xCE39,0xCE3A,0xCE3B,0xCE3C,0xCE3D,0xCE3E,0xCE3F, +0xCE40,0xCE41,0xCE42,0xCE43,0xCE44,0xCE45,0xCE46,0xCE47, +0xCE48,0xCE49, 0, 0, 0, 0, 0, 0, +0xCE4A,0xCE4B,0xCE4C,0xCE4D,0xCE4E,0xCE4F,0xCE50,0xCE51, +0xCE52,0xCE53,0xCE54,0xCE55,0xCE56,0xCE57,0xCE5A,0xCE5B, +0xCE5D,0xCE5E,0xCE62,0xCE63,0xCE64,0xCE65,0xCE66,0xCE67, +0xCE6A,0xCE6C, 0, 0, 0, 0, 0, 0, +0xCE6E,0xCE6F,0xCE70,0xCE71,0xCE72,0xCE73,0xCE76,0xCE77, +0xCE79,0xCE7A,0xCE7B,0xCE7D,0xCE7E,0xCE7F,0xCE80,0xCE81, +0xCE82,0xCE83,0xCE86,0xCE88,0xCE8A,0xCE8B,0xCE8C,0xCE8D, +0xCE8E,0xCE8F,0xCE92,0xCE93,0xCE95,0xCE96,0xCE97,0xCE99, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xCE9A,0xCE9B,0xCE9C,0xCE9D,0xCE9E,0xCE9F,0xCEA2,0xCEA6, +0xCEA7,0xCEA8,0xCEA9,0xCEAA,0xCEAB,0xCEAE,0xCEAF,0xCEB0, +0xCEB1,0xCEB2,0xCEB3,0xCEB4,0xCEB5,0xCEB6,0xCEB7,0xCEB8, +0xCEB9,0xCEBA, 0, 0, 0, 0, 0, 0, +0xCEBB,0xCEBC,0xCEBD,0xCEBE,0xCEBF,0xCEC0,0xCEC2,0xCEC3, +0xCEC4,0xCEC5,0xCEC6,0xCEC7,0xCEC8,0xCEC9,0xCECA,0xCECB, +0xCECC,0xCECD,0xCECE,0xCECF,0xCED0,0xCED1,0xCED2,0xCED3, +0xCED4,0xCED5, 0, 0, 0, 0, 0, 0, +0xCED6,0xCED7,0xCED8,0xCED9,0xCEDA,0xCEDB,0xCEDC,0xCEDD, +0xCEDE,0xCEDF,0xCEE0,0xCEE1,0xCEE2,0xCEE3,0xCEE6,0xCEE7, +0xCEE9,0xCEEA,0xCEED,0xCEEE,0xCEEF,0xCEF0,0xCEF1,0xCEF2, +0xCEF3,0xCEF6,0xCEFA,0xCEFB,0xCEFC,0xCEFD,0xCEFE,0xCEFF, +0xAC00,0xAC01,0xAC04,0xAC07,0xAC08,0xAC09,0xAC0A,0xAC10, +0xAC11,0xAC12,0xAC13,0xAC14,0xAC15,0xAC16,0xAC17,0xAC19, +0xAC1A,0xAC1B,0xAC1C,0xAC1D,0xAC20,0xAC24,0xAC2C,0xAC2D, +0xAC2F,0xAC30,0xAC31,0xAC38,0xAC39,0xAC3C,0xAC40,0xAC4B, +0xAC4D,0xAC54,0xAC58,0xAC5C,0xAC70,0xAC71,0xAC74,0xAC77, +0xAC78,0xAC7A,0xAC80,0xAC81,0xAC83,0xAC84,0xAC85,0xAC86, +0xAC89,0xAC8A,0xAC8B,0xAC8C,0xAC90,0xAC94,0xAC9C,0xAC9D, +0xAC9F,0xACA0,0xACA1,0xACA8,0xACA9,0xACAA,0xACAC,0xACAF, +0xACB0,0xACB8,0xACB9,0xACBB,0xACBC,0xACBD,0xACC1,0xACC4, +0xACC8,0xACCC,0xACD5,0xACD7,0xACE0,0xACE1,0xACE4,0xACE7, +0xACE8,0xACEA,0xACEC,0xACEF,0xACF0,0xACF1,0xACF3,0xACF5, +0xACF6,0xACFC,0xACFD,0xAD00,0xAD04,0xAD06, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xCF02,0xCF03,0xCF05,0xCF06,0xCF07,0xCF09,0xCF0A,0xCF0B, +0xCF0C,0xCF0D,0xCF0E,0xCF0F,0xCF12,0xCF14,0xCF16,0xCF17, +0xCF18,0xCF19,0xCF1A,0xCF1B,0xCF1D,0xCF1E,0xCF1F,0xCF21, +0xCF22,0xCF23, 0, 0, 0, 0, 0, 0, +0xCF25,0xCF26,0xCF27,0xCF28,0xCF29,0xCF2A,0xCF2B,0xCF2E, +0xCF32,0xCF33,0xCF34,0xCF35,0xCF36,0xCF37,0xCF39,0xCF3A, +0xCF3B,0xCF3C,0xCF3D,0xCF3E,0xCF3F,0xCF40,0xCF41,0xCF42, +0xCF43,0xCF44, 0, 0, 0, 0, 0, 0, +0xCF45,0xCF46,0xCF47,0xCF48,0xCF49,0xCF4A,0xCF4B,0xCF4C, +0xCF4D,0xCF4E,0xCF4F,0xCF50,0xCF51,0xCF52,0xCF53,0xCF56, +0xCF57,0xCF59,0xCF5A,0xCF5B,0xCF5D,0xCF5E,0xCF5F,0xCF60, +0xCF61,0xCF62,0xCF63,0xCF66,0xCF68,0xCF6A,0xCF6B,0xCF6C, +0xAD0C,0xAD0D,0xAD0F,0xAD11,0xAD18,0xAD1C,0xAD20,0xAD29, +0xAD2C,0xAD2D,0xAD34,0xAD35,0xAD38,0xAD3C,0xAD44,0xAD45, +0xAD47,0xAD49,0xAD50,0xAD54,0xAD58,0xAD61,0xAD63,0xAD6C, +0xAD6D,0xAD70,0xAD73,0xAD74,0xAD75,0xAD76,0xAD7B,0xAD7C, +0xAD7D,0xAD7F,0xAD81,0xAD82,0xAD88,0xAD89,0xAD8C,0xAD90, +0xAD9C,0xAD9D,0xADA4,0xADB7,0xADC0,0xADC1,0xADC4,0xADC8, +0xADD0,0xADD1,0xADD3,0xADDC,0xADE0,0xADE4,0xADF8,0xADF9, +0xADFC,0xADFF,0xAE00,0xAE01,0xAE08,0xAE09,0xAE0B,0xAE0D, +0xAE14,0xAE30,0xAE31,0xAE34,0xAE37,0xAE38,0xAE3A,0xAE40, +0xAE41,0xAE43,0xAE45,0xAE46,0xAE4A,0xAE4C,0xAE4D,0xAE4E, +0xAE50,0xAE54,0xAE56,0xAE5C,0xAE5D,0xAE5F,0xAE60,0xAE61, +0xAE65,0xAE68,0xAE69,0xAE6C,0xAE70,0xAE78, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xCF6D,0xCF6E,0xCF6F,0xCF72,0xCF73,0xCF75,0xCF76,0xCF77, +0xCF79,0xCF7A,0xCF7B,0xCF7C,0xCF7D,0xCF7E,0xCF7F,0xCF81, +0xCF82,0xCF83,0xCF84,0xCF86,0xCF87,0xCF88,0xCF89,0xCF8A, +0xCF8B,0xCF8D, 0, 0, 0, 0, 0, 0, +0xCF8E,0xCF8F,0xCF90,0xCF91,0xCF92,0xCF93,0xCF94,0xCF95, +0xCF96,0xCF97,0xCF98,0xCF99,0xCF9A,0xCF9B,0xCF9C,0xCF9D, +0xCF9E,0xCF9F,0xCFA0,0xCFA2,0xCFA3,0xCFA4,0xCFA5,0xCFA6, +0xCFA7,0xCFA9, 0, 0, 0, 0, 0, 0, +0xCFAA,0xCFAB,0xCFAC,0xCFAD,0xCFAE,0xCFAF,0xCFB1,0xCFB2, +0xCFB3,0xCFB4,0xCFB5,0xCFB6,0xCFB7,0xCFB8,0xCFB9,0xCFBA, +0xCFBB,0xCFBC,0xCFBD,0xCFBE,0xCFBF,0xCFC0,0xCFC1,0xCFC2, +0xCFC3,0xCFC5,0xCFC6,0xCFC7,0xCFC8,0xCFC9,0xCFCA,0xCFCB, +0xAE79,0xAE7B,0xAE7C,0xAE7D,0xAE84,0xAE85,0xAE8C,0xAEBC, +0xAEBD,0xAEBE,0xAEC0,0xAEC4,0xAECC,0xAECD,0xAECF,0xAED0, +0xAED1,0xAED8,0xAED9,0xAEDC,0xAEE8,0xAEEB,0xAEED,0xAEF4, +0xAEF8,0xAEFC,0xAF07,0xAF08,0xAF0D,0xAF10,0xAF2C,0xAF2D, +0xAF30,0xAF32,0xAF34,0xAF3C,0xAF3D,0xAF3F,0xAF41,0xAF42, +0xAF43,0xAF48,0xAF49,0xAF50,0xAF5C,0xAF5D,0xAF64,0xAF65, +0xAF79,0xAF80,0xAF84,0xAF88,0xAF90,0xAF91,0xAF95,0xAF9C, +0xAFB8,0xAFB9,0xAFBC,0xAFC0,0xAFC7,0xAFC8,0xAFC9,0xAFCB, +0xAFCD,0xAFCE,0xAFD4,0xAFDC,0xAFE8,0xAFE9,0xAFF0,0xAFF1, +0xAFF4,0xAFF8,0xB000,0xB001,0xB004,0xB00C,0xB010,0xB014, +0xB01C,0xB01D,0xB028,0xB044,0xB045,0xB048,0xB04A,0xB04C, +0xB04E,0xB053,0xB054,0xB055,0xB057,0xB059, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xCFCC,0xCFCD,0xCFCE,0xCFCF,0xCFD0,0xCFD1,0xCFD2,0xCFD3, +0xCFD4,0xCFD5,0xCFD6,0xCFD7,0xCFD8,0xCFD9,0xCFDA,0xCFDB, +0xCFDC,0xCFDD,0xCFDE,0xCFDF,0xCFE2,0xCFE3,0xCFE5,0xCFE6, +0xCFE7,0xCFE9, 0, 0, 0, 0, 0, 0, +0xCFEA,0xCFEB,0xCFEC,0xCFED,0xCFEE,0xCFEF,0xCFF2,0xCFF4, +0xCFF6,0xCFF7,0xCFF8,0xCFF9,0xCFFA,0xCFFB,0xCFFD,0xCFFE, +0xCFFF,0xD001,0xD002,0xD003,0xD005,0xD006,0xD007,0xD008, +0xD009,0xD00A, 0, 0, 0, 0, 0, 0, +0xD00B,0xD00C,0xD00D,0xD00E,0xD00F,0xD010,0xD012,0xD013, +0xD014,0xD015,0xD016,0xD017,0xD019,0xD01A,0xD01B,0xD01C, +0xD01D,0xD01E,0xD01F,0xD020,0xD021,0xD022,0xD023,0xD024, +0xD025,0xD026,0xD027,0xD028,0xD029,0xD02A,0xD02B,0xD02C, +0xB05D,0xB07C,0xB07D,0xB080,0xB084,0xB08C,0xB08D,0xB08F, +0xB091,0xB098,0xB099,0xB09A,0xB09C,0xB09F,0xB0A0,0xB0A1, +0xB0A2,0xB0A8,0xB0A9,0xB0AB,0xB0AC,0xB0AD,0xB0AE,0xB0AF, +0xB0B1,0xB0B3,0xB0B4,0xB0B5,0xB0B8,0xB0BC,0xB0C4,0xB0C5, +0xB0C7,0xB0C8,0xB0C9,0xB0D0,0xB0D1,0xB0D4,0xB0D8,0xB0E0, +0xB0E5,0xB108,0xB109,0xB10B,0xB10C,0xB110,0xB112,0xB113, +0xB118,0xB119,0xB11B,0xB11C,0xB11D,0xB123,0xB124,0xB125, +0xB128,0xB12C,0xB134,0xB135,0xB137,0xB138,0xB139,0xB140, +0xB141,0xB144,0xB148,0xB150,0xB151,0xB154,0xB155,0xB158, +0xB15C,0xB160,0xB178,0xB179,0xB17C,0xB180,0xB182,0xB188, +0xB189,0xB18B,0xB18D,0xB192,0xB193,0xB194,0xB198,0xB19C, +0xB1A8,0xB1CC,0xB1D0,0xB1D4,0xB1DC,0xB1DD, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD02E,0xD02F,0xD030,0xD031,0xD032,0xD033,0xD036,0xD037, +0xD039,0xD03A,0xD03B,0xD03D,0xD03E,0xD03F,0xD040,0xD041, +0xD042,0xD043,0xD046,0xD048,0xD04A,0xD04B,0xD04C,0xD04D, +0xD04E,0xD04F, 0, 0, 0, 0, 0, 0, +0xD051,0xD052,0xD053,0xD055,0xD056,0xD057,0xD059,0xD05A, +0xD05B,0xD05C,0xD05D,0xD05E,0xD05F,0xD061,0xD062,0xD063, +0xD064,0xD065,0xD066,0xD067,0xD068,0xD069,0xD06A,0xD06B, +0xD06E,0xD06F, 0, 0, 0, 0, 0, 0, +0xD071,0xD072,0xD073,0xD075,0xD076,0xD077,0xD078,0xD079, +0xD07A,0xD07B,0xD07E,0xD07F,0xD080,0xD082,0xD083,0xD084, +0xD085,0xD086,0xD087,0xD088,0xD089,0xD08A,0xD08B,0xD08C, +0xD08D,0xD08E,0xD08F,0xD090,0xD091,0xD092,0xD093,0xD094, +0xB1DF,0xB1E8,0xB1E9,0xB1EC,0xB1F0,0xB1F9,0xB1FB,0xB1FD, +0xB204,0xB205,0xB208,0xB20B,0xB20C,0xB214,0xB215,0xB217, +0xB219,0xB220,0xB234,0xB23C,0xB258,0xB25C,0xB260,0xB268, +0xB269,0xB274,0xB275,0xB27C,0xB284,0xB285,0xB289,0xB290, +0xB291,0xB294,0xB298,0xB299,0xB29A,0xB2A0,0xB2A1,0xB2A3, +0xB2A5,0xB2A6,0xB2AA,0xB2AC,0xB2B0,0xB2B4,0xB2C8,0xB2C9, +0xB2CC,0xB2D0,0xB2D2,0xB2D8,0xB2D9,0xB2DB,0xB2DD,0xB2E2, +0xB2E4,0xB2E5,0xB2E6,0xB2E8,0xB2EB,0xB2EC,0xB2ED,0xB2EE, +0xB2EF,0xB2F3,0xB2F4,0xB2F5,0xB2F7,0xB2F8,0xB2F9,0xB2FA, +0xB2FB,0xB2FF,0xB300,0xB301,0xB304,0xB308,0xB310,0xB311, +0xB313,0xB314,0xB315,0xB31C,0xB354,0xB355,0xB356,0xB358, +0xB35B,0xB35C,0xB35E,0xB35F,0xB364,0xB365, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD095,0xD096,0xD097,0xD098,0xD099,0xD09A,0xD09B,0xD09C, +0xD09D,0xD09E,0xD09F,0xD0A0,0xD0A1,0xD0A2,0xD0A3,0xD0A6, +0xD0A7,0xD0A9,0xD0AA,0xD0AB,0xD0AD,0xD0AE,0xD0AF,0xD0B0, +0xD0B1,0xD0B2, 0, 0, 0, 0, 0, 0, +0xD0B3,0xD0B6,0xD0B8,0xD0BA,0xD0BB,0xD0BC,0xD0BD,0xD0BE, +0xD0BF,0xD0C2,0xD0C3,0xD0C5,0xD0C6,0xD0C7,0xD0CA,0xD0CB, +0xD0CC,0xD0CD,0xD0CE,0xD0CF,0xD0D2,0xD0D6,0xD0D7,0xD0D8, +0xD0D9,0xD0DA, 0, 0, 0, 0, 0, 0, +0xD0DB,0xD0DE,0xD0DF,0xD0E1,0xD0E2,0xD0E3,0xD0E5,0xD0E6, +0xD0E7,0xD0E8,0xD0E9,0xD0EA,0xD0EB,0xD0EE,0xD0F2,0xD0F3, +0xD0F4,0xD0F5,0xD0F6,0xD0F7,0xD0F9,0xD0FA,0xD0FB,0xD0FC, +0xD0FD,0xD0FE,0xD0FF,0xD100,0xD101,0xD102,0xD103,0xD104, +0xB367,0xB369,0xB36B,0xB36E,0xB370,0xB371,0xB374,0xB378, +0xB380,0xB381,0xB383,0xB384,0xB385,0xB38C,0xB390,0xB394, +0xB3A0,0xB3A1,0xB3A8,0xB3AC,0xB3C4,0xB3C5,0xB3C8,0xB3CB, +0xB3CC,0xB3CE,0xB3D0,0xB3D4,0xB3D5,0xB3D7,0xB3D9,0xB3DB, +0xB3DD,0xB3E0,0xB3E4,0xB3E8,0xB3FC,0xB410,0xB418,0xB41C, +0xB420,0xB428,0xB429,0xB42B,0xB434,0xB450,0xB451,0xB454, +0xB458,0xB460,0xB461,0xB463,0xB465,0xB46C,0xB480,0xB488, +0xB49D,0xB4A4,0xB4A8,0xB4AC,0xB4B5,0xB4B7,0xB4B9,0xB4C0, +0xB4C4,0xB4C8,0xB4D0,0xB4D5,0xB4DC,0xB4DD,0xB4E0,0xB4E3, +0xB4E4,0xB4E6,0xB4EC,0xB4ED,0xB4EF,0xB4F1,0xB4F8,0xB514, +0xB515,0xB518,0xB51B,0xB51C,0xB524,0xB525,0xB527,0xB528, +0xB529,0xB52A,0xB530,0xB531,0xB534,0xB538, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD105,0xD106,0xD107,0xD108,0xD109,0xD10A,0xD10B,0xD10C, +0xD10E,0xD10F,0xD110,0xD111,0xD112,0xD113,0xD114,0xD115, +0xD116,0xD117,0xD118,0xD119,0xD11A,0xD11B,0xD11C,0xD11D, +0xD11E,0xD11F, 0, 0, 0, 0, 0, 0, +0xD120,0xD121,0xD122,0xD123,0xD124,0xD125,0xD126,0xD127, +0xD128,0xD129,0xD12A,0xD12B,0xD12C,0xD12D,0xD12E,0xD12F, +0xD132,0xD133,0xD135,0xD136,0xD137,0xD139,0xD13B,0xD13C, +0xD13D,0xD13E, 0, 0, 0, 0, 0, 0, +0xD13F,0xD142,0xD146,0xD147,0xD148,0xD149,0xD14A,0xD14B, +0xD14E,0xD14F,0xD151,0xD152,0xD153,0xD155,0xD156,0xD157, +0xD158,0xD159,0xD15A,0xD15B,0xD15E,0xD160,0xD162,0xD163, +0xD164,0xD165,0xD166,0xD167,0xD169,0xD16A,0xD16B,0xD16D, +0xB540,0xB541,0xB543,0xB544,0xB545,0xB54B,0xB54C,0xB54D, +0xB550,0xB554,0xB55C,0xB55D,0xB55F,0xB560,0xB561,0xB5A0, +0xB5A1,0xB5A4,0xB5A8,0xB5AA,0xB5AB,0xB5B0,0xB5B1,0xB5B3, +0xB5B4,0xB5B5,0xB5BB,0xB5BC,0xB5BD,0xB5C0,0xB5C4,0xB5CC, +0xB5CD,0xB5CF,0xB5D0,0xB5D1,0xB5D8,0xB5EC,0xB610,0xB611, +0xB614,0xB618,0xB625,0xB62C,0xB634,0xB648,0xB664,0xB668, +0xB69C,0xB69D,0xB6A0,0xB6A4,0xB6AB,0xB6AC,0xB6B1,0xB6D4, +0xB6F0,0xB6F4,0xB6F8,0xB700,0xB701,0xB705,0xB728,0xB729, +0xB72C,0xB72F,0xB730,0xB738,0xB739,0xB73B,0xB744,0xB748, +0xB74C,0xB754,0xB755,0xB760,0xB764,0xB768,0xB770,0xB771, +0xB773,0xB775,0xB77C,0xB77D,0xB780,0xB784,0xB78C,0xB78D, +0xB78F,0xB790,0xB791,0xB792,0xB796,0xB797, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD16E,0xD16F,0xD170,0xD171,0xD172,0xD173,0xD174,0xD175, +0xD176,0xD177,0xD178,0xD179,0xD17A,0xD17B,0xD17D,0xD17E, +0xD17F,0xD180,0xD181,0xD182,0xD183,0xD185,0xD186,0xD187, +0xD189,0xD18A, 0, 0, 0, 0, 0, 0, +0xD18B,0xD18C,0xD18D,0xD18E,0xD18F,0xD190,0xD191,0xD192, +0xD193,0xD194,0xD195,0xD196,0xD197,0xD198,0xD199,0xD19A, +0xD19B,0xD19C,0xD19D,0xD19E,0xD19F,0xD1A2,0xD1A3,0xD1A5, +0xD1A6,0xD1A7, 0, 0, 0, 0, 0, 0, +0xD1A9,0xD1AA,0xD1AB,0xD1AC,0xD1AD,0xD1AE,0xD1AF,0xD1B2, +0xD1B4,0xD1B6,0xD1B7,0xD1B8,0xD1B9,0xD1BB,0xD1BD,0xD1BE, +0xD1BF,0xD1C1,0xD1C2,0xD1C3,0xD1C4,0xD1C5,0xD1C6,0xD1C7, +0xD1C8,0xD1C9,0xD1CA,0xD1CB,0xD1CC,0xD1CD,0xD1CE,0xD1CF, +0xB798,0xB799,0xB79C,0xB7A0,0xB7A8,0xB7A9,0xB7AB,0xB7AC, +0xB7AD,0xB7B4,0xB7B5,0xB7B8,0xB7C7,0xB7C9,0xB7EC,0xB7ED, +0xB7F0,0xB7F4,0xB7FC,0xB7FD,0xB7FF,0xB800,0xB801,0xB807, +0xB808,0xB809,0xB80C,0xB810,0xB818,0xB819,0xB81B,0xB81D, +0xB824,0xB825,0xB828,0xB82C,0xB834,0xB835,0xB837,0xB838, +0xB839,0xB840,0xB844,0xB851,0xB853,0xB85C,0xB85D,0xB860, +0xB864,0xB86C,0xB86D,0xB86F,0xB871,0xB878,0xB87C,0xB88D, +0xB8A8,0xB8B0,0xB8B4,0xB8B8,0xB8C0,0xB8C1,0xB8C3,0xB8C5, +0xB8CC,0xB8D0,0xB8D4,0xB8DD,0xB8DF,0xB8E1,0xB8E8,0xB8E9, +0xB8EC,0xB8F0,0xB8F8,0xB8F9,0xB8FB,0xB8FD,0xB904,0xB918, +0xB920,0xB93C,0xB93D,0xB940,0xB944,0xB94C,0xB94F,0xB951, +0xB958,0xB959,0xB95C,0xB960,0xB968,0xB969, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD1D0,0xD1D1,0xD1D2,0xD1D3,0xD1D4,0xD1D5,0xD1D6,0xD1D7, +0xD1D9,0xD1DA,0xD1DB,0xD1DC,0xD1DD,0xD1DE,0xD1DF,0xD1E0, +0xD1E1,0xD1E2,0xD1E3,0xD1E4,0xD1E5,0xD1E6,0xD1E7,0xD1E8, +0xD1E9,0xD1EA, 0, 0, 0, 0, 0, 0, +0xD1EB,0xD1EC,0xD1ED,0xD1EE,0xD1EF,0xD1F0,0xD1F1,0xD1F2, +0xD1F3,0xD1F5,0xD1F6,0xD1F7,0xD1F9,0xD1FA,0xD1FB,0xD1FC, +0xD1FD,0xD1FE,0xD1FF,0xD200,0xD201,0xD202,0xD203,0xD204, +0xD205,0xD206, 0, 0, 0, 0, 0, 0, +0xD208,0xD20A,0xD20B,0xD20C,0xD20D,0xD20E,0xD20F,0xD211, +0xD212,0xD213,0xD214,0xD215,0xD216,0xD217,0xD218,0xD219, +0xD21A,0xD21B,0xD21C,0xD21D,0xD21E,0xD21F,0xD220,0xD221, +0xD222,0xD223,0xD224,0xD225,0xD226,0xD227,0xD228,0xD229, +0xB96B,0xB96D,0xB974,0xB975,0xB978,0xB97C,0xB984,0xB985, +0xB987,0xB989,0xB98A,0xB98D,0xB98E,0xB9AC,0xB9AD,0xB9B0, +0xB9B4,0xB9BC,0xB9BD,0xB9BF,0xB9C1,0xB9C8,0xB9C9,0xB9CC, +0xB9CE,0xB9CF,0xB9D0,0xB9D1,0xB9D2,0xB9D8,0xB9D9,0xB9DB, +0xB9DD,0xB9DE,0xB9E1,0xB9E3,0xB9E4,0xB9E5,0xB9E8,0xB9EC, +0xB9F4,0xB9F5,0xB9F7,0xB9F8,0xB9F9,0xB9FA,0xBA00,0xBA01, +0xBA08,0xBA15,0xBA38,0xBA39,0xBA3C,0xBA40,0xBA42,0xBA48, +0xBA49,0xBA4B,0xBA4D,0xBA4E,0xBA53,0xBA54,0xBA55,0xBA58, +0xBA5C,0xBA64,0xBA65,0xBA67,0xBA68,0xBA69,0xBA70,0xBA71, +0xBA74,0xBA78,0xBA83,0xBA84,0xBA85,0xBA87,0xBA8C,0xBAA8, +0xBAA9,0xBAAB,0xBAAC,0xBAB0,0xBAB2,0xBAB8,0xBAB9,0xBABB, +0xBABD,0xBAC4,0xBAC8,0xBAD8,0xBAD9,0xBAFC, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD22A,0xD22B,0xD22E,0xD22F,0xD231,0xD232,0xD233,0xD235, +0xD236,0xD237,0xD238,0xD239,0xD23A,0xD23B,0xD23E,0xD240, +0xD242,0xD243,0xD244,0xD245,0xD246,0xD247,0xD249,0xD24A, +0xD24B,0xD24C, 0, 0, 0, 0, 0, 0, +0xD24D,0xD24E,0xD24F,0xD250,0xD251,0xD252,0xD253,0xD254, +0xD255,0xD256,0xD257,0xD258,0xD259,0xD25A,0xD25B,0xD25D, +0xD25E,0xD25F,0xD260,0xD261,0xD262,0xD263,0xD265,0xD266, +0xD267,0xD268, 0, 0, 0, 0, 0, 0, +0xD269,0xD26A,0xD26B,0xD26C,0xD26D,0xD26E,0xD26F,0xD270, +0xD271,0xD272,0xD273,0xD274,0xD275,0xD276,0xD277,0xD278, +0xD279,0xD27A,0xD27B,0xD27C,0xD27D,0xD27E,0xD27F,0xD282, +0xD283,0xD285,0xD286,0xD287,0xD289,0xD28A,0xD28B,0xD28C, +0xBB00,0xBB04,0xBB0D,0xBB0F,0xBB11,0xBB18,0xBB1C,0xBB20, +0xBB29,0xBB2B,0xBB34,0xBB35,0xBB36,0xBB38,0xBB3B,0xBB3C, +0xBB3D,0xBB3E,0xBB44,0xBB45,0xBB47,0xBB49,0xBB4D,0xBB4F, +0xBB50,0xBB54,0xBB58,0xBB61,0xBB63,0xBB6C,0xBB88,0xBB8C, +0xBB90,0xBBA4,0xBBA8,0xBBAC,0xBBB4,0xBBB7,0xBBC0,0xBBC4, +0xBBC8,0xBBD0,0xBBD3,0xBBF8,0xBBF9,0xBBFC,0xBBFF,0xBC00, +0xBC02,0xBC08,0xBC09,0xBC0B,0xBC0C,0xBC0D,0xBC0F,0xBC11, +0xBC14,0xBC15,0xBC16,0xBC17,0xBC18,0xBC1B,0xBC1C,0xBC1D, +0xBC1E,0xBC1F,0xBC24,0xBC25,0xBC27,0xBC29,0xBC2D,0xBC30, +0xBC31,0xBC34,0xBC38,0xBC40,0xBC41,0xBC43,0xBC44,0xBC45, +0xBC49,0xBC4C,0xBC4D,0xBC50,0xBC5D,0xBC84,0xBC85,0xBC88, +0xBC8B,0xBC8C,0xBC8E,0xBC94,0xBC95,0xBC97, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD28D,0xD28E,0xD28F,0xD292,0xD293,0xD294,0xD296,0xD297, +0xD298,0xD299,0xD29A,0xD29B,0xD29D,0xD29E,0xD29F,0xD2A1, +0xD2A2,0xD2A3,0xD2A5,0xD2A6,0xD2A7,0xD2A8,0xD2A9,0xD2AA, +0xD2AB,0xD2AD, 0, 0, 0, 0, 0, 0, +0xD2AE,0xD2AF,0xD2B0,0xD2B2,0xD2B3,0xD2B4,0xD2B5,0xD2B6, +0xD2B7,0xD2BA,0xD2BB,0xD2BD,0xD2BE,0xD2C1,0xD2C3,0xD2C4, +0xD2C5,0xD2C6,0xD2C7,0xD2CA,0xD2CC,0xD2CD,0xD2CE,0xD2CF, +0xD2D0,0xD2D1, 0, 0, 0, 0, 0, 0, +0xD2D2,0xD2D3,0xD2D5,0xD2D6,0xD2D7,0xD2D9,0xD2DA,0xD2DB, +0xD2DD,0xD2DE,0xD2DF,0xD2E0,0xD2E1,0xD2E2,0xD2E3,0xD2E6, +0xD2E7,0xD2E8,0xD2E9,0xD2EA,0xD2EB,0xD2EC,0xD2ED,0xD2EE, +0xD2EF,0xD2F2,0xD2F3,0xD2F5,0xD2F6,0xD2F7,0xD2F9,0xD2FA, +0xBC99,0xBC9A,0xBCA0,0xBCA1,0xBCA4,0xBCA7,0xBCA8,0xBCB0, +0xBCB1,0xBCB3,0xBCB4,0xBCB5,0xBCBC,0xBCBD,0xBCC0,0xBCC4, +0xBCCD,0xBCCF,0xBCD0,0xBCD1,0xBCD5,0xBCD8,0xBCDC,0xBCF4, +0xBCF5,0xBCF6,0xBCF8,0xBCFC,0xBD04,0xBD05,0xBD07,0xBD09, +0xBD10,0xBD14,0xBD24,0xBD2C,0xBD40,0xBD48,0xBD49,0xBD4C, +0xBD50,0xBD58,0xBD59,0xBD64,0xBD68,0xBD80,0xBD81,0xBD84, +0xBD87,0xBD88,0xBD89,0xBD8A,0xBD90,0xBD91,0xBD93,0xBD95, +0xBD99,0xBD9A,0xBD9C,0xBDA4,0xBDB0,0xBDB8,0xBDD4,0xBDD5, +0xBDD8,0xBDDC,0xBDE9,0xBDF0,0xBDF4,0xBDF8,0xBE00,0xBE03, +0xBE05,0xBE0C,0xBE0D,0xBE10,0xBE14,0xBE1C,0xBE1D,0xBE1F, +0xBE44,0xBE45,0xBE48,0xBE4C,0xBE4E,0xBE54,0xBE55,0xBE57, +0xBE59,0xBE5A,0xBE5B,0xBE60,0xBE61,0xBE64, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD2FB,0xD2FC,0xD2FD,0xD2FE,0xD2FF,0xD302,0xD304,0xD306, +0xD307,0xD308,0xD309,0xD30A,0xD30B,0xD30F,0xD311,0xD312, +0xD313,0xD315,0xD317,0xD318,0xD319,0xD31A,0xD31B,0xD31E, +0xD322,0xD323, 0, 0, 0, 0, 0, 0, +0xD324,0xD326,0xD327,0xD32A,0xD32B,0xD32D,0xD32E,0xD32F, +0xD331,0xD332,0xD333,0xD334,0xD335,0xD336,0xD337,0xD33A, +0xD33E,0xD33F,0xD340,0xD341,0xD342,0xD343,0xD346,0xD347, +0xD348,0xD349, 0, 0, 0, 0, 0, 0, +0xD34A,0xD34B,0xD34C,0xD34D,0xD34E,0xD34F,0xD350,0xD351, +0xD352,0xD353,0xD354,0xD355,0xD356,0xD357,0xD358,0xD359, +0xD35A,0xD35B,0xD35C,0xD35D,0xD35E,0xD35F,0xD360,0xD361, +0xD362,0xD363,0xD364,0xD365,0xD366,0xD367,0xD368,0xD369, +0xBE68,0xBE6A,0xBE70,0xBE71,0xBE73,0xBE74,0xBE75,0xBE7B, +0xBE7C,0xBE7D,0xBE80,0xBE84,0xBE8C,0xBE8D,0xBE8F,0xBE90, +0xBE91,0xBE98,0xBE99,0xBEA8,0xBED0,0xBED1,0xBED4,0xBED7, +0xBED8,0xBEE0,0xBEE3,0xBEE4,0xBEE5,0xBEEC,0xBF01,0xBF08, +0xBF09,0xBF18,0xBF19,0xBF1B,0xBF1C,0xBF1D,0xBF40,0xBF41, +0xBF44,0xBF48,0xBF50,0xBF51,0xBF55,0xBF94,0xBFB0,0xBFC5, +0xBFCC,0xBFCD,0xBFD0,0xBFD4,0xBFDC,0xBFDF,0xBFE1,0xC03C, +0xC051,0xC058,0xC05C,0xC060,0xC068,0xC069,0xC090,0xC091, +0xC094,0xC098,0xC0A0,0xC0A1,0xC0A3,0xC0A5,0xC0AC,0xC0AD, +0xC0AF,0xC0B0,0xC0B3,0xC0B4,0xC0B5,0xC0B6,0xC0BC,0xC0BD, +0xC0BF,0xC0C0,0xC0C1,0xC0C5,0xC0C8,0xC0C9,0xC0CC,0xC0D0, +0xC0D8,0xC0D9,0xC0DB,0xC0DC,0xC0DD,0xC0E4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD36A,0xD36B,0xD36C,0xD36D,0xD36E,0xD36F,0xD370,0xD371, +0xD372,0xD373,0xD374,0xD375,0xD376,0xD377,0xD378,0xD379, +0xD37A,0xD37B,0xD37E,0xD37F,0xD381,0xD382,0xD383,0xD385, +0xD386,0xD387, 0, 0, 0, 0, 0, 0, +0xD388,0xD389,0xD38A,0xD38B,0xD38E,0xD392,0xD393,0xD394, +0xD395,0xD396,0xD397,0xD39A,0xD39B,0xD39D,0xD39E,0xD39F, +0xD3A1,0xD3A2,0xD3A3,0xD3A4,0xD3A5,0xD3A6,0xD3A7,0xD3AA, +0xD3AC,0xD3AE, 0, 0, 0, 0, 0, 0, +0xD3AF,0xD3B0,0xD3B1,0xD3B2,0xD3B3,0xD3B5,0xD3B6,0xD3B7, +0xD3B9,0xD3BA,0xD3BB,0xD3BD,0xD3BE,0xD3BF,0xD3C0,0xD3C1, +0xD3C2,0xD3C3,0xD3C6,0xD3C7,0xD3CA,0xD3CB,0xD3CC,0xD3CD, +0xD3CE,0xD3CF,0xD3D1,0xD3D2,0xD3D3,0xD3D4,0xD3D5,0xD3D6, +0xC0E5,0xC0E8,0xC0EC,0xC0F4,0xC0F5,0xC0F7,0xC0F9,0xC100, +0xC104,0xC108,0xC110,0xC115,0xC11C,0xC11D,0xC11E,0xC11F, +0xC120,0xC123,0xC124,0xC126,0xC127,0xC12C,0xC12D,0xC12F, +0xC130,0xC131,0xC136,0xC138,0xC139,0xC13C,0xC140,0xC148, +0xC149,0xC14B,0xC14C,0xC14D,0xC154,0xC155,0xC158,0xC15C, +0xC164,0xC165,0xC167,0xC168,0xC169,0xC170,0xC174,0xC178, +0xC185,0xC18C,0xC18D,0xC18E,0xC190,0xC194,0xC196,0xC19C, +0xC19D,0xC19F,0xC1A1,0xC1A5,0xC1A8,0xC1A9,0xC1AC,0xC1B0, +0xC1BD,0xC1C4,0xC1C8,0xC1CC,0xC1D4,0xC1D7,0xC1D8,0xC1E0, +0xC1E4,0xC1E8,0xC1F0,0xC1F1,0xC1F3,0xC1FC,0xC1FD,0xC200, +0xC204,0xC20C,0xC20D,0xC20F,0xC211,0xC218,0xC219,0xC21C, +0xC21F,0xC220,0xC228,0xC229,0xC22B,0xC22D, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD3D7,0xD3D9,0xD3DA,0xD3DB,0xD3DC,0xD3DD,0xD3DE,0xD3DF, +0xD3E0,0xD3E2,0xD3E4,0xD3E5,0xD3E6,0xD3E7,0xD3E8,0xD3E9, +0xD3EA,0xD3EB,0xD3EE,0xD3EF,0xD3F1,0xD3F2,0xD3F3,0xD3F5, +0xD3F6,0xD3F7, 0, 0, 0, 0, 0, 0, +0xD3F8,0xD3F9,0xD3FA,0xD3FB,0xD3FE,0xD400,0xD402,0xD403, +0xD404,0xD405,0xD406,0xD407,0xD409,0xD40A,0xD40B,0xD40C, +0xD40D,0xD40E,0xD40F,0xD410,0xD411,0xD412,0xD413,0xD414, +0xD415,0xD416, 0, 0, 0, 0, 0, 0, +0xD417,0xD418,0xD419,0xD41A,0xD41B,0xD41C,0xD41E,0xD41F, +0xD420,0xD421,0xD422,0xD423,0xD424,0xD425,0xD426,0xD427, +0xD428,0xD429,0xD42A,0xD42B,0xD42C,0xD42D,0xD42E,0xD42F, +0xD430,0xD431,0xD432,0xD433,0xD434,0xD435,0xD436,0xD437, +0xC22F,0xC231,0xC232,0xC234,0xC248,0xC250,0xC251,0xC254, +0xC258,0xC260,0xC265,0xC26C,0xC26D,0xC270,0xC274,0xC27C, +0xC27D,0xC27F,0xC281,0xC288,0xC289,0xC290,0xC298,0xC29B, +0xC29D,0xC2A4,0xC2A5,0xC2A8,0xC2AC,0xC2AD,0xC2B4,0xC2B5, +0xC2B7,0xC2B9,0xC2DC,0xC2DD,0xC2E0,0xC2E3,0xC2E4,0xC2EB, +0xC2EC,0xC2ED,0xC2EF,0xC2F1,0xC2F6,0xC2F8,0xC2F9,0xC2FB, +0xC2FC,0xC300,0xC308,0xC309,0xC30C,0xC30D,0xC313,0xC314, +0xC315,0xC318,0xC31C,0xC324,0xC325,0xC328,0xC329,0xC345, +0xC368,0xC369,0xC36C,0xC370,0xC372,0xC378,0xC379,0xC37C, +0xC37D,0xC384,0xC388,0xC38C,0xC3C0,0xC3D8,0xC3D9,0xC3DC, +0xC3DF,0xC3E0,0xC3E2,0xC3E8,0xC3E9,0xC3ED,0xC3F4,0xC3F5, +0xC3F8,0xC408,0xC410,0xC424,0xC42C,0xC430, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD438,0xD439,0xD43A,0xD43B,0xD43C,0xD43D,0xD43E,0xD43F, +0xD441,0xD442,0xD443,0xD445,0xD446,0xD447,0xD448,0xD449, +0xD44A,0xD44B,0xD44C,0xD44D,0xD44E,0xD44F,0xD450,0xD451, +0xD452,0xD453, 0, 0, 0, 0, 0, 0, +0xD454,0xD455,0xD456,0xD457,0xD458,0xD459,0xD45A,0xD45B, +0xD45D,0xD45E,0xD45F,0xD461,0xD462,0xD463,0xD465,0xD466, +0xD467,0xD468,0xD469,0xD46A,0xD46B,0xD46C,0xD46E,0xD470, +0xD471,0xD472, 0, 0, 0, 0, 0, 0, +0xD473,0xD474,0xD475,0xD476,0xD477,0xD47A,0xD47B,0xD47D, +0xD47E,0xD481,0xD483,0xD484,0xD485,0xD486,0xD487,0xD48A, +0xD48C,0xD48E,0xD48F,0xD490,0xD491,0xD492,0xD493,0xD495, +0xD496,0xD497,0xD498,0xD499,0xD49A,0xD49B,0xD49C,0xD49D, +0xC434,0xC43C,0xC43D,0xC448,0xC464,0xC465,0xC468,0xC46C, +0xC474,0xC475,0xC479,0xC480,0xC494,0xC49C,0xC4B8,0xC4BC, +0xC4E9,0xC4F0,0xC4F1,0xC4F4,0xC4F8,0xC4FA,0xC4FF,0xC500, +0xC501,0xC50C,0xC510,0xC514,0xC51C,0xC528,0xC529,0xC52C, +0xC530,0xC538,0xC539,0xC53B,0xC53D,0xC544,0xC545,0xC548, +0xC549,0xC54A,0xC54C,0xC54D,0xC54E,0xC553,0xC554,0xC555, +0xC557,0xC558,0xC559,0xC55D,0xC55E,0xC560,0xC561,0xC564, +0xC568,0xC570,0xC571,0xC573,0xC574,0xC575,0xC57C,0xC57D, +0xC580,0xC584,0xC587,0xC58C,0xC58D,0xC58F,0xC591,0xC595, +0xC597,0xC598,0xC59C,0xC5A0,0xC5A9,0xC5B4,0xC5B5,0xC5B8, +0xC5B9,0xC5BB,0xC5BC,0xC5BD,0xC5BE,0xC5C4,0xC5C5,0xC5C6, +0xC5C7,0xC5C8,0xC5C9,0xC5CA,0xC5CC,0xC5CE, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD49E,0xD49F,0xD4A0,0xD4A1,0xD4A2,0xD4A3,0xD4A4,0xD4A5, +0xD4A6,0xD4A7,0xD4A8,0xD4AA,0xD4AB,0xD4AC,0xD4AD,0xD4AE, +0xD4AF,0xD4B0,0xD4B1,0xD4B2,0xD4B3,0xD4B4,0xD4B5,0xD4B6, +0xD4B7,0xD4B8, 0, 0, 0, 0, 0, 0, +0xD4B9,0xD4BA,0xD4BB,0xD4BC,0xD4BD,0xD4BE,0xD4BF,0xD4C0, +0xD4C1,0xD4C2,0xD4C3,0xD4C4,0xD4C5,0xD4C6,0xD4C7,0xD4C8, +0xD4C9,0xD4CA,0xD4CB,0xD4CD,0xD4CE,0xD4CF,0xD4D1,0xD4D2, +0xD4D3,0xD4D5, 0, 0, 0, 0, 0, 0, +0xD4D6,0xD4D7,0xD4D8,0xD4D9,0xD4DA,0xD4DB,0xD4DD,0xD4DE, +0xD4E0,0xD4E1,0xD4E2,0xD4E3,0xD4E4,0xD4E5,0xD4E6,0xD4E7, +0xD4E9,0xD4EA,0xD4EB,0xD4ED,0xD4EE,0xD4EF,0xD4F1,0xD4F2, +0xD4F3,0xD4F4,0xD4F5,0xD4F6,0xD4F7,0xD4F9,0xD4FA,0xD4FC, +0xC5D0,0xC5D1,0xC5D4,0xC5D8,0xC5E0,0xC5E1,0xC5E3,0xC5E5, +0xC5EC,0xC5ED,0xC5EE,0xC5F0,0xC5F4,0xC5F6,0xC5F7,0xC5FC, +0xC5FD,0xC5FE,0xC5FF,0xC600,0xC601,0xC605,0xC606,0xC607, +0xC608,0xC60C,0xC610,0xC618,0xC619,0xC61B,0xC61C,0xC624, +0xC625,0xC628,0xC62C,0xC62D,0xC62E,0xC630,0xC633,0xC634, +0xC635,0xC637,0xC639,0xC63B,0xC640,0xC641,0xC644,0xC648, +0xC650,0xC651,0xC653,0xC654,0xC655,0xC65C,0xC65D,0xC660, +0xC66C,0xC66F,0xC671,0xC678,0xC679,0xC67C,0xC680,0xC688, +0xC689,0xC68B,0xC68D,0xC694,0xC695,0xC698,0xC69C,0xC6A4, +0xC6A5,0xC6A7,0xC6A9,0xC6B0,0xC6B1,0xC6B4,0xC6B8,0xC6B9, +0xC6BA,0xC6C0,0xC6C1,0xC6C3,0xC6C5,0xC6CC,0xC6CD,0xC6D0, +0xC6D4,0xC6DC,0xC6DD,0xC6E0,0xC6E1,0xC6E8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD4FE,0xD4FF,0xD500,0xD501,0xD502,0xD503,0xD505,0xD506, +0xD507,0xD509,0xD50A,0xD50B,0xD50D,0xD50E,0xD50F,0xD510, +0xD511,0xD512,0xD513,0xD516,0xD518,0xD519,0xD51A,0xD51B, +0xD51C,0xD51D, 0, 0, 0, 0, 0, 0, +0xD51E,0xD51F,0xD520,0xD521,0xD522,0xD523,0xD524,0xD525, +0xD526,0xD527,0xD528,0xD529,0xD52A,0xD52B,0xD52C,0xD52D, +0xD52E,0xD52F,0xD530,0xD531,0xD532,0xD533,0xD534,0xD535, +0xD536,0xD537, 0, 0, 0, 0, 0, 0, +0xD538,0xD539,0xD53A,0xD53B,0xD53E,0xD53F,0xD541,0xD542, +0xD543,0xD545,0xD546,0xD547,0xD548,0xD549,0xD54A,0xD54B, +0xD54E,0xD550,0xD552,0xD553,0xD554,0xD555,0xD556,0xD557, +0xD55A,0xD55B,0xD55D,0xD55E,0xD55F,0xD561,0xD562,0xD563, +0xC6E9,0xC6EC,0xC6F0,0xC6F8,0xC6F9,0xC6FD,0xC704,0xC705, +0xC708,0xC70C,0xC714,0xC715,0xC717,0xC719,0xC720,0xC721, +0xC724,0xC728,0xC730,0xC731,0xC733,0xC735,0xC737,0xC73C, +0xC73D,0xC740,0xC744,0xC74A,0xC74C,0xC74D,0xC74F,0xC751, +0xC752,0xC753,0xC754,0xC755,0xC756,0xC757,0xC758,0xC75C, +0xC760,0xC768,0xC76B,0xC774,0xC775,0xC778,0xC77C,0xC77D, +0xC77E,0xC783,0xC784,0xC785,0xC787,0xC788,0xC789,0xC78A, +0xC78E,0xC790,0xC791,0xC794,0xC796,0xC797,0xC798,0xC79A, +0xC7A0,0xC7A1,0xC7A3,0xC7A4,0xC7A5,0xC7A6,0xC7AC,0xC7AD, +0xC7B0,0xC7B4,0xC7BC,0xC7BD,0xC7BF,0xC7C0,0xC7C1,0xC7C8, +0xC7C9,0xC7CC,0xC7CE,0xC7D0,0xC7D8,0xC7DD,0xC7E4,0xC7E8, +0xC7EC,0xC800,0xC801,0xC804,0xC808,0xC80A, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD564,0xD566,0xD567,0xD56A,0xD56C,0xD56E,0xD56F,0xD570, +0xD571,0xD572,0xD573,0xD576,0xD577,0xD579,0xD57A,0xD57B, +0xD57D,0xD57E,0xD57F,0xD580,0xD581,0xD582,0xD583,0xD586, +0xD58A,0xD58B, 0, 0, 0, 0, 0, 0, +0xD58C,0xD58D,0xD58E,0xD58F,0xD591,0xD592,0xD593,0xD594, +0xD595,0xD596,0xD597,0xD598,0xD599,0xD59A,0xD59B,0xD59C, +0xD59D,0xD59E,0xD59F,0xD5A0,0xD5A1,0xD5A2,0xD5A3,0xD5A4, +0xD5A6,0xD5A7, 0, 0, 0, 0, 0, 0, +0xD5A8,0xD5A9,0xD5AA,0xD5AB,0xD5AC,0xD5AD,0xD5AE,0xD5AF, +0xD5B0,0xD5B1,0xD5B2,0xD5B3,0xD5B4,0xD5B5,0xD5B6,0xD5B7, +0xD5B8,0xD5B9,0xD5BA,0xD5BB,0xD5BC,0xD5BD,0xD5BE,0xD5BF, +0xD5C0,0xD5C1,0xD5C2,0xD5C3,0xD5C4,0xD5C5,0xD5C6,0xD5C7, +0xC810,0xC811,0xC813,0xC815,0xC816,0xC81C,0xC81D,0xC820, +0xC824,0xC82C,0xC82D,0xC82F,0xC831,0xC838,0xC83C,0xC840, +0xC848,0xC849,0xC84C,0xC84D,0xC854,0xC870,0xC871,0xC874, +0xC878,0xC87A,0xC880,0xC881,0xC883,0xC885,0xC886,0xC887, +0xC88B,0xC88C,0xC88D,0xC894,0xC89D,0xC89F,0xC8A1,0xC8A8, +0xC8BC,0xC8BD,0xC8C4,0xC8C8,0xC8CC,0xC8D4,0xC8D5,0xC8D7, +0xC8D9,0xC8E0,0xC8E1,0xC8E4,0xC8F5,0xC8FC,0xC8FD,0xC900, +0xC904,0xC905,0xC906,0xC90C,0xC90D,0xC90F,0xC911,0xC918, +0xC92C,0xC934,0xC950,0xC951,0xC954,0xC958,0xC960,0xC961, +0xC963,0xC96C,0xC970,0xC974,0xC97C,0xC988,0xC989,0xC98C, +0xC990,0xC998,0xC999,0xC99B,0xC99D,0xC9C0,0xC9C1,0xC9C4, +0xC9C7,0xC9C8,0xC9CA,0xC9D0,0xC9D1,0xC9D3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD5CA,0xD5CB,0xD5CD,0xD5CE,0xD5CF,0xD5D1,0xD5D3,0xD5D4, +0xD5D5,0xD5D6,0xD5D7,0xD5DA,0xD5DC,0xD5DE,0xD5DF,0xD5E0, +0xD5E1,0xD5E2,0xD5E3,0xD5E6,0xD5E7,0xD5E9,0xD5EA,0xD5EB, +0xD5ED,0xD5EE, 0, 0, 0, 0, 0, 0, +0xD5EF,0xD5F0,0xD5F1,0xD5F2,0xD5F3,0xD5F6,0xD5F8,0xD5FA, +0xD5FB,0xD5FC,0xD5FD,0xD5FE,0xD5FF,0xD602,0xD603,0xD605, +0xD606,0xD607,0xD609,0xD60A,0xD60B,0xD60C,0xD60D,0xD60E, +0xD60F,0xD612, 0, 0, 0, 0, 0, 0, +0xD616,0xD617,0xD618,0xD619,0xD61A,0xD61B,0xD61D,0xD61E, +0xD61F,0xD621,0xD622,0xD623,0xD625,0xD626,0xD627,0xD628, +0xD629,0xD62A,0xD62B,0xD62C,0xD62E,0xD62F,0xD630,0xD631, +0xD632,0xD633,0xD634,0xD635,0xD636,0xD637,0xD63A,0xD63B, +0xC9D5,0xC9D6,0xC9D9,0xC9DA,0xC9DC,0xC9DD,0xC9E0,0xC9E2, +0xC9E4,0xC9E7,0xC9EC,0xC9ED,0xC9EF,0xC9F0,0xC9F1,0xC9F8, +0xC9F9,0xC9FC,0xCA00,0xCA08,0xCA09,0xCA0B,0xCA0C,0xCA0D, +0xCA14,0xCA18,0xCA29,0xCA4C,0xCA4D,0xCA50,0xCA54,0xCA5C, +0xCA5D,0xCA5F,0xCA60,0xCA61,0xCA68,0xCA7D,0xCA84,0xCA98, +0xCABC,0xCABD,0xCAC0,0xCAC4,0xCACC,0xCACD,0xCACF,0xCAD1, +0xCAD3,0xCAD8,0xCAD9,0xCAE0,0xCAEC,0xCAF4,0xCB08,0xCB10, +0xCB14,0xCB18,0xCB20,0xCB21,0xCB41,0xCB48,0xCB49,0xCB4C, +0xCB50,0xCB58,0xCB59,0xCB5D,0xCB64,0xCB78,0xCB79,0xCB9C, +0xCBB8,0xCBD4,0xCBE4,0xCBE7,0xCBE9,0xCC0C,0xCC0D,0xCC10, +0xCC14,0xCC1C,0xCC1D,0xCC21,0xCC22,0xCC27,0xCC28,0xCC29, +0xCC2C,0xCC2E,0xCC30,0xCC38,0xCC39,0xCC3B, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD63D,0xD63E,0xD63F,0xD641,0xD642,0xD643,0xD644,0xD646, +0xD647,0xD64A,0xD64C,0xD64E,0xD64F,0xD650,0xD652,0xD653, +0xD656,0xD657,0xD659,0xD65A,0xD65B,0xD65D,0xD65E,0xD65F, +0xD660,0xD661, 0, 0, 0, 0, 0, 0, +0xD662,0xD663,0xD664,0xD665,0xD666,0xD668,0xD66A,0xD66B, +0xD66C,0xD66D,0xD66E,0xD66F,0xD672,0xD673,0xD675,0xD676, +0xD677,0xD678,0xD679,0xD67A,0xD67B,0xD67C,0xD67D,0xD67E, +0xD67F,0xD680, 0, 0, 0, 0, 0, 0, +0xD681,0xD682,0xD684,0xD686,0xD687,0xD688,0xD689,0xD68A, +0xD68B,0xD68E,0xD68F,0xD691,0xD692,0xD693,0xD695,0xD696, +0xD697,0xD698,0xD699,0xD69A,0xD69B,0xD69C,0xD69E,0xD6A0, +0xD6A2,0xD6A3,0xD6A4,0xD6A5,0xD6A6,0xD6A7,0xD6A9,0xD6AA, +0xCC3C,0xCC3D,0xCC3E,0xCC44,0xCC45,0xCC48,0xCC4C,0xCC54, +0xCC55,0xCC57,0xCC58,0xCC59,0xCC60,0xCC64,0xCC66,0xCC68, +0xCC70,0xCC75,0xCC98,0xCC99,0xCC9C,0xCCA0,0xCCA8,0xCCA9, +0xCCAB,0xCCAC,0xCCAD,0xCCB4,0xCCB5,0xCCB8,0xCCBC,0xCCC4, +0xCCC5,0xCCC7,0xCCC9,0xCCD0,0xCCD4,0xCCE4,0xCCEC,0xCCF0, +0xCD01,0xCD08,0xCD09,0xCD0C,0xCD10,0xCD18,0xCD19,0xCD1B, +0xCD1D,0xCD24,0xCD28,0xCD2C,0xCD39,0xCD5C,0xCD60,0xCD64, +0xCD6C,0xCD6D,0xCD6F,0xCD71,0xCD78,0xCD88,0xCD94,0xCD95, +0xCD98,0xCD9C,0xCDA4,0xCDA5,0xCDA7,0xCDA9,0xCDB0,0xCDC4, +0xCDCC,0xCDD0,0xCDE8,0xCDEC,0xCDF0,0xCDF8,0xCDF9,0xCDFB, +0xCDFD,0xCE04,0xCE08,0xCE0C,0xCE14,0xCE19,0xCE20,0xCE21, +0xCE24,0xCE28,0xCE30,0xCE31,0xCE33,0xCE35, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD6AB,0xD6AD,0xD6AE,0xD6AF,0xD6B1,0xD6B2,0xD6B3,0xD6B4, +0xD6B5,0xD6B6,0xD6B7,0xD6B8,0xD6BA,0xD6BC,0xD6BD,0xD6BE, +0xD6BF,0xD6C0,0xD6C1,0xD6C2,0xD6C3,0xD6C6,0xD6C7,0xD6C9, +0xD6CA,0xD6CB, 0, 0, 0, 0, 0, 0, +0xD6CD,0xD6CE,0xD6CF,0xD6D0,0xD6D2,0xD6D3,0xD6D5,0xD6D6, +0xD6D8,0xD6DA,0xD6DB,0xD6DC,0xD6DD,0xD6DE,0xD6DF,0xD6E1, +0xD6E2,0xD6E3,0xD6E5,0xD6E6,0xD6E7,0xD6E9,0xD6EA,0xD6EB, +0xD6EC,0xD6ED, 0, 0, 0, 0, 0, 0, +0xD6EE,0xD6EF,0xD6F1,0xD6F2,0xD6F3,0xD6F4,0xD6F6,0xD6F7, +0xD6F8,0xD6F9,0xD6FA,0xD6FB,0xD6FE,0xD6FF,0xD701,0xD702, +0xD703,0xD705,0xD706,0xD707,0xD708,0xD709,0xD70A,0xD70B, +0xD70C,0xD70D,0xD70E,0xD70F,0xD710,0xD712,0xD713,0xD714, +0xCE58,0xCE59,0xCE5C,0xCE5F,0xCE60,0xCE61,0xCE68,0xCE69, +0xCE6B,0xCE6D,0xCE74,0xCE75,0xCE78,0xCE7C,0xCE84,0xCE85, +0xCE87,0xCE89,0xCE90,0xCE91,0xCE94,0xCE98,0xCEA0,0xCEA1, +0xCEA3,0xCEA4,0xCEA5,0xCEAC,0xCEAD,0xCEC1,0xCEE4,0xCEE5, +0xCEE8,0xCEEB,0xCEEC,0xCEF4,0xCEF5,0xCEF7,0xCEF8,0xCEF9, +0xCF00,0xCF01,0xCF04,0xCF08,0xCF10,0xCF11,0xCF13,0xCF15, +0xCF1C,0xCF20,0xCF24,0xCF2C,0xCF2D,0xCF2F,0xCF30,0xCF31, +0xCF38,0xCF54,0xCF55,0xCF58,0xCF5C,0xCF64,0xCF65,0xCF67, +0xCF69,0xCF70,0xCF71,0xCF74,0xCF78,0xCF80,0xCF85,0xCF8C, +0xCFA1,0xCFA8,0xCFB0,0xCFC4,0xCFE0,0xCFE1,0xCFE4,0xCFE8, +0xCFF0,0xCFF1,0xCFF3,0xCFF5,0xCFFC,0xD000,0xD004,0xD011, +0xD018,0xD02D,0xD034,0xD035,0xD038,0xD03C, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD715,0xD716,0xD717,0xD71A,0xD71B,0xD71D,0xD71E,0xD71F, +0xD721,0xD722,0xD723,0xD724,0xD725,0xD726,0xD727,0xD72A, +0xD72C,0xD72E,0xD72F,0xD730,0xD731,0xD732,0xD733,0xD736, +0xD737,0xD739, 0, 0, 0, 0, 0, 0, +0xD73A,0xD73B,0xD73D,0xD73E,0xD73F,0xD740,0xD741,0xD742, +0xD743,0xD745,0xD746,0xD748,0xD74A,0xD74B,0xD74C,0xD74D, +0xD74E,0xD74F,0xD752,0xD753,0xD755,0xD75A,0xD75B,0xD75C, +0xD75D,0xD75E, 0, 0, 0, 0, 0, 0, +0xD75F,0xD762,0xD764,0xD766,0xD767,0xD768,0xD76A,0xD76B, +0xD76D,0xD76E,0xD76F,0xD771,0xD772,0xD773,0xD775,0xD776, +0xD777,0xD778,0xD779,0xD77A,0xD77B,0xD77E,0xD77F,0xD780, +0xD782,0xD783,0xD784,0xD785,0xD786,0xD787,0xD78A,0xD78B, +0xD044,0xD045,0xD047,0xD049,0xD050,0xD054,0xD058,0xD060, +0xD06C,0xD06D,0xD070,0xD074,0xD07C,0xD07D,0xD081,0xD0A4, +0xD0A5,0xD0A8,0xD0AC,0xD0B4,0xD0B5,0xD0B7,0xD0B9,0xD0C0, +0xD0C1,0xD0C4,0xD0C8,0xD0C9,0xD0D0,0xD0D1,0xD0D3,0xD0D4, +0xD0D5,0xD0DC,0xD0DD,0xD0E0,0xD0E4,0xD0EC,0xD0ED,0xD0EF, +0xD0F0,0xD0F1,0xD0F8,0xD10D,0xD130,0xD131,0xD134,0xD138, +0xD13A,0xD140,0xD141,0xD143,0xD144,0xD145,0xD14C,0xD14D, +0xD150,0xD154,0xD15C,0xD15D,0xD15F,0xD161,0xD168,0xD16C, +0xD17C,0xD184,0xD188,0xD1A0,0xD1A1,0xD1A4,0xD1A8,0xD1B0, +0xD1B1,0xD1B3,0xD1B5,0xD1BA,0xD1BC,0xD1C0,0xD1D8,0xD1F4, +0xD1F8,0xD207,0xD209,0xD210,0xD22C,0xD22D,0xD230,0xD234, +0xD23C,0xD23D,0xD23F,0xD241,0xD248,0xD25C, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD78D,0xD78E,0xD78F,0xD791,0xD792,0xD793,0xD794,0xD795, +0xD796,0xD797,0xD79A,0xD79C,0xD79E,0xD79F,0xD7A0,0xD7A1, +0xD7A2,0xD7A3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD264,0xD280,0xD281,0xD284,0xD288,0xD290,0xD291,0xD295, +0xD29C,0xD2A0,0xD2A4,0xD2AC,0xD2B1,0xD2B8,0xD2B9,0xD2BC, +0xD2BF,0xD2C0,0xD2C2,0xD2C8,0xD2C9,0xD2CB,0xD2D4,0xD2D8, +0xD2DC,0xD2E4,0xD2E5,0xD2F0,0xD2F1,0xD2F4,0xD2F8,0xD300, +0xD301,0xD303,0xD305,0xD30C,0xD30D,0xD30E,0xD310,0xD314, +0xD316,0xD31C,0xD31D,0xD31F,0xD320,0xD321,0xD325,0xD328, +0xD329,0xD32C,0xD330,0xD338,0xD339,0xD33B,0xD33C,0xD33D, +0xD344,0xD345,0xD37C,0xD37D,0xD380,0xD384,0xD38C,0xD38D, +0xD38F,0xD390,0xD391,0xD398,0xD399,0xD39C,0xD3A0,0xD3A8, +0xD3A9,0xD3AB,0xD3AD,0xD3B4,0xD3B8,0xD3BC,0xD3C4,0xD3C5, +0xD3C8,0xD3C9,0xD3D0,0xD3D8,0xD3E1,0xD3E3,0xD3EC,0xD3ED, +0xD3F0,0xD3F4,0xD3FC,0xD3FD,0xD3FF,0xD401, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD408,0xD41D,0xD440,0xD444,0xD45C,0xD460,0xD464,0xD46D, +0xD46F,0xD478,0xD479,0xD47C,0xD47F,0xD480,0xD482,0xD488, +0xD489,0xD48B,0xD48D,0xD494,0xD4A9,0xD4CC,0xD4D0,0xD4D4, +0xD4DC,0xD4DF,0xD4E8,0xD4EC,0xD4F0,0xD4F8,0xD4FB,0xD4FD, +0xD504,0xD508,0xD50C,0xD514,0xD515,0xD517,0xD53C,0xD53D, +0xD540,0xD544,0xD54C,0xD54D,0xD54F,0xD551,0xD558,0xD559, +0xD55C,0xD560,0xD565,0xD568,0xD569,0xD56B,0xD56D,0xD574, +0xD575,0xD578,0xD57C,0xD584,0xD585,0xD587,0xD588,0xD589, +0xD590,0xD5A5,0xD5C8,0xD5C9,0xD5CC,0xD5D0,0xD5D2,0xD5D8, +0xD5D9,0xD5DB,0xD5DD,0xD5E4,0xD5E5,0xD5E8,0xD5EC,0xD5F4, +0xD5F5,0xD5F7,0xD5F9,0xD600,0xD601,0xD604,0xD608,0xD610, +0xD611,0xD613,0xD614,0xD615,0xD61C,0xD620, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD624,0xD62D,0xD638,0xD639,0xD63C,0xD640,0xD645,0xD648, +0xD649,0xD64B,0xD64D,0xD651,0xD654,0xD655,0xD658,0xD65C, +0xD667,0xD669,0xD670,0xD671,0xD674,0xD683,0xD685,0xD68C, +0xD68D,0xD690,0xD694,0xD69D,0xD69F,0xD6A1,0xD6A8,0xD6AC, +0xD6B0,0xD6B9,0xD6BB,0xD6C4,0xD6C5,0xD6C8,0xD6CC,0xD6D1, +0xD6D4,0xD6D7,0xD6D9,0xD6E0,0xD6E4,0xD6E8,0xD6F0,0xD6F5, +0xD6FC,0xD6FD,0xD700,0xD704,0xD711,0xD718,0xD719,0xD71C, +0xD720,0xD728,0xD729,0xD72B,0xD72D,0xD734,0xD735,0xD738, +0xD73C,0xD744,0xD747,0xD749,0xD750,0xD751,0xD754,0xD756, +0xD757,0xD758,0xD759,0xD760,0xD761,0xD763,0xD765,0xD769, +0xD76C,0xD770,0xD774,0xD77C,0xD77D,0xD781,0xD788,0xD789, +0xD78C,0xD790,0xD798,0xD799,0xD79B,0xD79D}; + +/* page 1 0xCAA1-0xFDFE */ +static uint16 tab_ksc5601_uni1[]={ +0x4F3D,0x4F73,0x5047,0x50F9,0x52A0,0x53EF,0x5475,0x54E5, +0x5609,0x5AC1,0x5BB6,0x6687,0x67B6,0x67B7,0x67EF,0x6B4C, +0x73C2,0x75C2,0x7A3C,0x82DB,0x8304,0x8857,0x8888,0x8A36, +0x8CC8,0x8DCF,0x8EFB,0x8FE6,0x99D5,0x523B,0x5374,0x5404, +0x606A,0x6164,0x6BBC,0x73CF,0x811A,0x89BA,0x89D2,0x95A3, +0x4F83,0x520A,0x58BE,0x5978,0x59E6,0x5E72,0x5E79,0x61C7, +0x63C0,0x6746,0x67EC,0x687F,0x6F97,0x764E,0x770B,0x78F5, +0x7A08,0x7AFF,0x7C21,0x809D,0x826E,0x8271,0x8AEB,0x9593, +0x4E6B,0x559D,0x66F7,0x6E34,0x78A3,0x7AED,0x845B,0x8910, +0x874E,0x97A8,0x52D8,0x574E,0x582A,0x5D4C,0x611F,0x61BE, +0x6221,0x6562,0x67D1,0x6A44,0x6E1B,0x7518,0x75B3,0x76E3, +0x77B0,0x7D3A,0x90AF,0x9451,0x9452,0x9F95, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5323,0x5CAC,0x7532,0x80DB,0x9240,0x9598,0x525B,0x5808, +0x59DC,0x5CA1,0x5D17,0x5EB7,0x5F3A,0x5F4A,0x6177,0x6C5F, +0x757A,0x7586,0x7CE0,0x7D73,0x7DB1,0x7F8C,0x8154,0x8221, +0x8591,0x8941,0x8B1B,0x92FC,0x964D,0x9C47,0x4ECB,0x4EF7, +0x500B,0x51F1,0x584F,0x6137,0x613E,0x6168,0x6539,0x69EA, +0x6F11,0x75A5,0x7686,0x76D6,0x7B87,0x82A5,0x84CB,0xF900, +0x93A7,0x958B,0x5580,0x5BA2,0x5751,0xF901,0x7CB3,0x7FB9, +0x91B5,0x5028,0x53BB,0x5C45,0x5DE8,0x62D2,0x636E,0x64DA, +0x64E7,0x6E20,0x70AC,0x795B,0x8DDD,0x8E1E,0xF902,0x907D, +0x9245,0x92F8,0x4E7E,0x4EF6,0x5065,0x5DFE,0x5EFA,0x6106, +0x6957,0x8171,0x8654,0x8E47,0x9375,0x9A2B,0x4E5E,0x5091, +0x6770,0x6840,0x5109,0x528D,0x5292,0x6AA2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x77BC,0x9210,0x9ED4,0x52AB,0x602F,0x8FF2,0x5048,0x61A9, +0x63ED,0x64CA,0x683C,0x6A84,0x6FC0,0x8188,0x89A1,0x9694, +0x5805,0x727D,0x72AC,0x7504,0x7D79,0x7E6D,0x80A9,0x898B, +0x8B74,0x9063,0x9D51,0x6289,0x6C7A,0x6F54,0x7D50,0x7F3A, +0x8A23,0x517C,0x614A,0x7B9D,0x8B19,0x9257,0x938C,0x4EAC, +0x4FD3,0x501E,0x50BE,0x5106,0x52C1,0x52CD,0x537F,0x5770, +0x5883,0x5E9A,0x5F91,0x6176,0x61AC,0x64CE,0x656C,0x666F, +0x66BB,0x66F4,0x6897,0x6D87,0x7085,0x70F1,0x749F,0x74A5, +0x74CA,0x75D9,0x786C,0x78EC,0x7ADF,0x7AF6,0x7D45,0x7D93, +0x8015,0x803F,0x811B,0x8396,0x8B66,0x8F15,0x9015,0x93E1, +0x9803,0x9838,0x9A5A,0x9BE8,0x4FC2,0x5553,0x583A,0x5951, +0x5B63,0x5C46,0x60B8,0x6212,0x6842,0x68B0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x68E8,0x6EAA,0x754C,0x7678,0x78CE,0x7A3D,0x7CFB,0x7E6B, +0x7E7C,0x8A08,0x8AA1,0x8C3F,0x968E,0x9DC4,0x53E4,0x53E9, +0x544A,0x5471,0x56FA,0x59D1,0x5B64,0x5C3B,0x5EAB,0x62F7, +0x6537,0x6545,0x6572,0x66A0,0x67AF,0x69C1,0x6CBD,0x75FC, +0x7690,0x777E,0x7A3F,0x7F94,0x8003,0x80A1,0x818F,0x82E6, +0x82FD,0x83F0,0x85C1,0x8831,0x88B4,0x8AA5,0xF903,0x8F9C, +0x932E,0x96C7,0x9867,0x9AD8,0x9F13,0x54ED,0x659B,0x66F2, +0x688F,0x7A40,0x8C37,0x9D60,0x56F0,0x5764,0x5D11,0x6606, +0x68B1,0x68CD,0x6EFE,0x7428,0x889E,0x9BE4,0x6C68,0xF904, +0x9AA8,0x4F9B,0x516C,0x5171,0x529F,0x5B54,0x5DE5,0x6050, +0x606D,0x62F1,0x63A7,0x653B,0x73D9,0x7A7A,0x86A3,0x8CA2, +0x978F,0x4E32,0x5BE1,0x6208,0x679C,0x74DC, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x79D1,0x83D3,0x8A87,0x8AB2,0x8DE8,0x904E,0x934B,0x9846, +0x5ED3,0x69E8,0x85FF,0x90ED,0xF905,0x51A0,0x5B98,0x5BEC, +0x6163,0x68FA,0x6B3E,0x704C,0x742F,0x74D8,0x7BA1,0x7F50, +0x83C5,0x89C0,0x8CAB,0x95DC,0x9928,0x522E,0x605D,0x62EC, +0x9002,0x4F8A,0x5149,0x5321,0x58D9,0x5EE3,0x66E0,0x6D38, +0x709A,0x72C2,0x73D6,0x7B50,0x80F1,0x945B,0x5366,0x639B, +0x7F6B,0x4E56,0x5080,0x584A,0x58DE,0x602A,0x6127,0x62D0, +0x69D0,0x9B41,0x5B8F,0x7D18,0x80B1,0x8F5F,0x4EA4,0x50D1, +0x54AC,0x55AC,0x5B0C,0x5DA0,0x5DE7,0x652A,0x654E,0x6821, +0x6A4B,0x72E1,0x768E,0x77EF,0x7D5E,0x7FF9,0x81A0,0x854E, +0x86DF,0x8F03,0x8F4E,0x90CA,0x9903,0x9A55,0x9BAB,0x4E18, +0x4E45,0x4E5D,0x4EC7,0x4FF1,0x5177,0x52FE, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5340,0x53E3,0x53E5,0x548E,0x5614,0x5775,0x57A2,0x5BC7, +0x5D87,0x5ED0,0x61FC,0x62D8,0x6551,0x67B8,0x67E9,0x69CB, +0x6B50,0x6BC6,0x6BEC,0x6C42,0x6E9D,0x7078,0x72D7,0x7396, +0x7403,0x77BF,0x77E9,0x7A76,0x7D7F,0x8009,0x81FC,0x8205, +0x820A,0x82DF,0x8862,0x8B33,0x8CFC,0x8EC0,0x9011,0x90B1, +0x9264,0x92B6,0x99D2,0x9A45,0x9CE9,0x9DD7,0x9F9C,0x570B, +0x5C40,0x83CA,0x97A0,0x97AB,0x9EB4,0x541B,0x7A98,0x7FA4, +0x88D9,0x8ECD,0x90E1,0x5800,0x5C48,0x6398,0x7A9F,0x5BAE, +0x5F13,0x7A79,0x7AAE,0x828E,0x8EAC,0x5026,0x5238,0x52F8, +0x5377,0x5708,0x62F3,0x6372,0x6B0A,0x6DC3,0x7737,0x53A5, +0x7357,0x8568,0x8E76,0x95D5,0x673A,0x6AC3,0x6F70,0x8A6D, +0x8ECC,0x994B,0xF906,0x6677,0x6B78,0x8CB4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9B3C,0xF907,0x53EB,0x572D,0x594E,0x63C6,0x69FB,0x73EA, +0x7845,0x7ABA,0x7AC5,0x7CFE,0x8475,0x898F,0x8D73,0x9035, +0x95A8,0x52FB,0x5747,0x7547,0x7B60,0x83CC,0x921E,0xF908, +0x6A58,0x514B,0x524B,0x5287,0x621F,0x68D8,0x6975,0x9699, +0x50C5,0x52A4,0x52E4,0x61C3,0x65A4,0x6839,0x69FF,0x747E, +0x7B4B,0x82B9,0x83EB,0x89B2,0x8B39,0x8FD1,0x9949,0xF909, +0x4ECA,0x5997,0x64D2,0x6611,0x6A8E,0x7434,0x7981,0x79BD, +0x82A9,0x887E,0x887F,0x895F,0xF90A,0x9326,0x4F0B,0x53CA, +0x6025,0x6271,0x6C72,0x7D1A,0x7D66,0x4E98,0x5162,0x77DC, +0x80AF,0x4F01,0x4F0E,0x5176,0x5180,0x55DC,0x5668,0x573B, +0x57FA,0x57FC,0x5914,0x5947,0x5993,0x5BC4,0x5C90,0x5D0E, +0x5DF1,0x5E7E,0x5FCC,0x6280,0x65D7,0x65E3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x671E,0x671F,0x675E,0x68CB,0x68C4,0x6A5F,0x6B3A,0x6C23, +0x6C7D,0x6C82,0x6DC7,0x7398,0x7426,0x742A,0x7482,0x74A3, +0x7578,0x757F,0x7881,0x78EF,0x7941,0x7947,0x7948,0x797A, +0x7B95,0x7D00,0x7DBA,0x7F88,0x8006,0x802D,0x808C,0x8A18, +0x8B4F,0x8C48,0x8D77,0x9321,0x9324,0x98E2,0x9951,0x9A0E, +0x9A0F,0x9A65,0x9E92,0x7DCA,0x4F76,0x5409,0x62EE,0x6854, +0x91D1,0x55AB,0x513A,0xF90B,0xF90C,0x5A1C,0x61E6,0xF90D, +0x62CF,0x62FF,0xF90E,0xF90F,0xF910,0xF911,0xF912,0xF913, +0x90A3,0xF914,0xF915,0xF916,0xF917,0xF918,0x8AFE,0xF919, +0xF91A,0xF91B,0xF91C,0x6696,0xF91D,0x7156,0xF91E,0xF91F, +0x96E3,0xF920,0x634F,0x637A,0x5357,0xF921,0x678F,0x6960, +0x6E73,0xF922,0x7537,0xF923,0xF924,0xF925, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7D0D,0xF926,0xF927,0x8872,0x56CA,0x5A18,0xF928,0xF929, +0xF92A,0xF92B,0xF92C,0x4E43,0xF92D,0x5167,0x5948,0x67F0, +0x8010,0xF92E,0x5973,0x5E74,0x649A,0x79CA,0x5FF5,0x606C, +0x62C8,0x637B,0x5BE7,0x5BD7,0x52AA,0xF92F,0x5974,0x5F29, +0x6012,0xF930,0xF931,0xF932,0x7459,0xF933,0xF934,0xF935, +0xF936,0xF937,0xF938,0x99D1,0xF939,0xF93A,0xF93B,0xF93C, +0xF93D,0xF93E,0xF93F,0xF940,0xF941,0xF942,0xF943,0x6FC3, +0xF944,0xF945,0x81BF,0x8FB2,0x60F1,0xF946,0xF947,0x8166, +0xF948,0xF949,0x5C3F,0xF94A,0xF94B,0xF94C,0xF94D,0xF94E, +0xF94F,0xF950,0xF951,0x5AE9,0x8A25,0x677B,0x7D10,0xF952, +0xF953,0xF954,0xF955,0xF956,0xF957,0x80FD,0xF958,0xF959, +0x5C3C,0x6CE5,0x533F,0x6EBA,0x591A,0x8336, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4E39,0x4EB6,0x4F46,0x55AE,0x5718,0x58C7,0x5F56,0x65B7, +0x65E6,0x6A80,0x6BB5,0x6E4D,0x77ED,0x7AEF,0x7C1E,0x7DDE, +0x86CB,0x8892,0x9132,0x935B,0x64BB,0x6FBE,0x737A,0x75B8, +0x9054,0x5556,0x574D,0x61BA,0x64D4,0x66C7,0x6DE1,0x6E5B, +0x6F6D,0x6FB9,0x75F0,0x8043,0x81BD,0x8541,0x8983,0x8AC7, +0x8B5A,0x931F,0x6C93,0x7553,0x7B54,0x8E0F,0x905D,0x5510, +0x5802,0x5858,0x5E62,0x6207,0x649E,0x68E0,0x7576,0x7CD6, +0x87B3,0x9EE8,0x4EE3,0x5788,0x576E,0x5927,0x5C0D,0x5CB1, +0x5E36,0x5F85,0x6234,0x64E1,0x73B3,0x81FA,0x888B,0x8CB8, +0x968A,0x9EDB,0x5B85,0x5FB7,0x60B3,0x5012,0x5200,0x5230, +0x5716,0x5835,0x5857,0x5C0E,0x5C60,0x5CF6,0x5D8B,0x5EA6, +0x5F92,0x60BC,0x6311,0x6389,0x6417,0x6843, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x68F9,0x6AC2,0x6DD8,0x6E21,0x6ED4,0x6FE4,0x71FE,0x76DC, +0x7779,0x79B1,0x7A3B,0x8404,0x89A9,0x8CED,0x8DF3,0x8E48, +0x9003,0x9014,0x9053,0x90FD,0x934D,0x9676,0x97DC,0x6BD2, +0x7006,0x7258,0x72A2,0x7368,0x7763,0x79BF,0x7BE4,0x7E9B, +0x8B80,0x58A9,0x60C7,0x6566,0x65FD,0x66BE,0x6C8C,0x711E, +0x71C9,0x8C5A,0x9813,0x4E6D,0x7A81,0x4EDD,0x51AC,0x51CD, +0x52D5,0x540C,0x61A7,0x6771,0x6850,0x68DF,0x6D1E,0x6F7C, +0x75BC,0x77B3,0x7AE5,0x80F4,0x8463,0x9285,0x515C,0x6597, +0x675C,0x6793,0x75D8,0x7AC7,0x8373,0xF95A,0x8C46,0x9017, +0x982D,0x5C6F,0x81C0,0x829A,0x9041,0x906F,0x920D,0x5F97, +0x5D9D,0x6A59,0x71C8,0x767B,0x7B49,0x85E4,0x8B04,0x9127, +0x9A30,0x5587,0x61F6,0xF95B,0x7669,0x7F85, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x863F,0x87BA,0x88F8,0x908F,0xF95C,0x6D1B,0x70D9,0x73DE, +0x7D61,0x843D,0xF95D,0x916A,0x99F1,0xF95E,0x4E82,0x5375, +0x6B04,0x6B12,0x703E,0x721B,0x862D,0x9E1E,0x524C,0x8FA3, +0x5D50,0x64E5,0x652C,0x6B16,0x6FEB,0x7C43,0x7E9C,0x85CD, +0x8964,0x89BD,0x62C9,0x81D8,0x881F,0x5ECA,0x6717,0x6D6A, +0x72FC,0x7405,0x746F,0x8782,0x90DE,0x4F86,0x5D0D,0x5FA0, +0x840A,0x51B7,0x63A0,0x7565,0x4EAE,0x5006,0x5169,0x51C9, +0x6881,0x6A11,0x7CAE,0x7CB1,0x7CE7,0x826F,0x8AD2,0x8F1B, +0x91CF,0x4FB6,0x5137,0x52F5,0x5442,0x5EEC,0x616E,0x623E, +0x65C5,0x6ADA,0x6FFE,0x792A,0x85DC,0x8823,0x95AD,0x9A62, +0x9A6A,0x9E97,0x9ECE,0x529B,0x66C6,0x6B77,0x701D,0x792B, +0x8F62,0x9742,0x6190,0x6200,0x6523,0x6F23, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7149,0x7489,0x7DF4,0x806F,0x84EE,0x8F26,0x9023,0x934A, +0x51BD,0x5217,0x52A3,0x6D0C,0x70C8,0x88C2,0x5EC9,0x6582, +0x6BAE,0x6FC2,0x7C3E,0x7375,0x4EE4,0x4F36,0x56F9,0xF95F, +0x5CBA,0x5DBA,0x601C,0x73B2,0x7B2D,0x7F9A,0x7FCE,0x8046, +0x901E,0x9234,0x96F6,0x9748,0x9818,0x9F61,0x4F8B,0x6FA7, +0x79AE,0x91B4,0x96B7,0x52DE,0xF960,0x6488,0x64C4,0x6AD3, +0x6F5E,0x7018,0x7210,0x76E7,0x8001,0x8606,0x865C,0x8DEF, +0x8F05,0x9732,0x9B6F,0x9DFA,0x9E75,0x788C,0x797F,0x7DA0, +0x83C9,0x9304,0x9E7F,0x9E93,0x8AD6,0x58DF,0x5F04,0x6727, +0x7027,0x74CF,0x7C60,0x807E,0x5121,0x7028,0x7262,0x78CA, +0x8CC2,0x8CDA,0x8CF4,0x96F7,0x4E86,0x50DA,0x5BEE,0x5ED6, +0x6599,0x71CE,0x7642,0x77AD,0x804A,0x84FC, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x907C,0x9B27,0x9F8D,0x58D8,0x5A41,0x5C62,0x6A13,0x6DDA, +0x6F0F,0x763B,0x7D2F,0x7E37,0x851E,0x8938,0x93E4,0x964B, +0x5289,0x65D2,0x67F3,0x69B4,0x6D41,0x6E9C,0x700F,0x7409, +0x7460,0x7559,0x7624,0x786B,0x8B2C,0x985E,0x516D,0x622E, +0x9678,0x4F96,0x502B,0x5D19,0x6DEA,0x7DB8,0x8F2A,0x5F8B, +0x6144,0x6817,0xF961,0x9686,0x52D2,0x808B,0x51DC,0x51CC, +0x695E,0x7A1C,0x7DBE,0x83F1,0x9675,0x4FDA,0x5229,0x5398, +0x540F,0x550E,0x5C65,0x60A7,0x674E,0x68A8,0x6D6C,0x7281, +0x72F8,0x7406,0x7483,0xF962,0x75E2,0x7C6C,0x7F79,0x7FB8, +0x8389,0x88CF,0x88E1,0x91CC,0x91D0,0x96E2,0x9BC9,0x541D, +0x6F7E,0x71D0,0x7498,0x85FA,0x8EAA,0x96A3,0x9C57,0x9E9F, +0x6797,0x6DCB,0x7433,0x81E8,0x9716,0x782C, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7ACB,0x7B20,0x7C92,0x6469,0x746A,0x75F2,0x78BC,0x78E8, +0x99AC,0x9B54,0x9EBB,0x5BDE,0x5E55,0x6F20,0x819C,0x83AB, +0x9088,0x4E07,0x534D,0x5A29,0x5DD2,0x5F4E,0x6162,0x633D, +0x6669,0x66FC,0x6EFF,0x6F2B,0x7063,0x779E,0x842C,0x8513, +0x883B,0x8F13,0x9945,0x9C3B,0x551C,0x62B9,0x672B,0x6CAB, +0x8309,0x896A,0x977A,0x4EA1,0x5984,0x5FD8,0x5FD9,0x671B, +0x7DB2,0x7F54,0x8292,0x832B,0x83BD,0x8F1E,0x9099,0x57CB, +0x59B9,0x5A92,0x5BD0,0x6627,0x679A,0x6885,0x6BCF,0x7164, +0x7F75,0x8CB7,0x8CE3,0x9081,0x9B45,0x8108,0x8C8A,0x964C, +0x9A40,0x9EA5,0x5B5F,0x6C13,0x731B,0x76F2,0x76DF,0x840C, +0x51AA,0x8993,0x514D,0x5195,0x52C9,0x68C9,0x6C94,0x7704, +0x7720,0x7DBF,0x7DEC,0x9762,0x9EB5,0x6EC5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8511,0x51A5,0x540D,0x547D,0x660E,0x669D,0x6927,0x6E9F, +0x76BF,0x7791,0x8317,0x84C2,0x879F,0x9169,0x9298,0x9CF4, +0x8882,0x4FAE,0x5192,0x52DF,0x59C6,0x5E3D,0x6155,0x6478, +0x6479,0x66AE,0x67D0,0x6A21,0x6BCD,0x6BDB,0x725F,0x7261, +0x7441,0x7738,0x77DB,0x8017,0x82BC,0x8305,0x8B00,0x8B28, +0x8C8C,0x6728,0x6C90,0x7267,0x76EE,0x7766,0x7A46,0x9DA9, +0x6B7F,0x6C92,0x5922,0x6726,0x8499,0x536F,0x5893,0x5999, +0x5EDF,0x63CF,0x6634,0x6773,0x6E3A,0x732B,0x7AD7,0x82D7, +0x9328,0x52D9,0x5DEB,0x61AE,0x61CB,0x620A,0x62C7,0x64AB, +0x65E0,0x6959,0x6B66,0x6BCB,0x7121,0x73F7,0x755D,0x7E46, +0x821E,0x8302,0x856A,0x8AA3,0x8CBF,0x9727,0x9D61,0x58A8, +0x9ED8,0x5011,0x520E,0x543B,0x554F,0x6587, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6C76,0x7D0A,0x7D0B,0x805E,0x868A,0x9580,0x96EF,0x52FF, +0x6C95,0x7269,0x5473,0x5A9A,0x5C3E,0x5D4B,0x5F4C,0x5FAE, +0x672A,0x68B6,0x6963,0x6E3C,0x6E44,0x7709,0x7C73,0x7F8E, +0x8587,0x8B0E,0x8FF7,0x9761,0x9EF4,0x5CB7,0x60B6,0x610D, +0x61AB,0x654F,0x65FB,0x65FC,0x6C11,0x6CEF,0x739F,0x73C9, +0x7DE1,0x9594,0x5BC6,0x871C,0x8B10,0x525D,0x535A,0x62CD, +0x640F,0x64B2,0x6734,0x6A38,0x6CCA,0x73C0,0x749E,0x7B94, +0x7C95,0x7E1B,0x818A,0x8236,0x8584,0x8FEB,0x96F9,0x99C1, +0x4F34,0x534A,0x53CD,0x53DB,0x62CC,0x642C,0x6500,0x6591, +0x69C3,0x6CEE,0x6F58,0x73ED,0x7554,0x7622,0x76E4,0x76FC, +0x78D0,0x78FB,0x792C,0x7D46,0x822C,0x87E0,0x8FD4,0x9812, +0x98EF,0x52C3,0x62D4,0x64A5,0x6E24,0x6F51, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x767C,0x8DCB,0x91B1,0x9262,0x9AEE,0x9B43,0x5023,0x508D, +0x574A,0x59A8,0x5C28,0x5E47,0x5F77,0x623F,0x653E,0x65B9, +0x65C1,0x6609,0x678B,0x699C,0x6EC2,0x78C5,0x7D21,0x80AA, +0x8180,0x822B,0x82B3,0x84A1,0x868C,0x8A2A,0x8B17,0x90A6, +0x9632,0x9F90,0x500D,0x4FF3,0xF963,0x57F9,0x5F98,0x62DC, +0x6392,0x676F,0x6E43,0x7119,0x76C3,0x80CC,0x80DA,0x88F4, +0x88F5,0x8919,0x8CE0,0x8F29,0x914D,0x966A,0x4F2F,0x4F70, +0x5E1B,0x67CF,0x6822,0x767D,0x767E,0x9B44,0x5E61,0x6A0A, +0x7169,0x71D4,0x756A,0xF964,0x7E41,0x8543,0x85E9,0x98DC, +0x4F10,0x7B4F,0x7F70,0x95A5,0x51E1,0x5E06,0x68B5,0x6C3E, +0x6C4E,0x6CDB,0x72AF,0x7BC4,0x8303,0x6CD5,0x743A,0x50FB, +0x5288,0x58C1,0x64D8,0x6A97,0x74A7,0x7656, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x78A7,0x8617,0x95E2,0x9739,0xF965,0x535E,0x5F01,0x8B8A, +0x8FA8,0x8FAF,0x908A,0x5225,0x77A5,0x9C49,0x9F08,0x4E19, +0x5002,0x5175,0x5C5B,0x5E77,0x661E,0x663A,0x67C4,0x68C5, +0x70B3,0x7501,0x75C5,0x79C9,0x7ADD,0x8F27,0x9920,0x9A08, +0x4FDD,0x5821,0x5831,0x5BF6,0x666E,0x6B65,0x6D11,0x6E7A, +0x6F7D,0x73E4,0x752B,0x83E9,0x88DC,0x8913,0x8B5C,0x8F14, +0x4F0F,0x50D5,0x5310,0x535C,0x5B93,0x5FA9,0x670D,0x798F, +0x8179,0x832F,0x8514,0x8907,0x8986,0x8F39,0x8F3B,0x99A5, +0x9C12,0x672C,0x4E76,0x4FF8,0x5949,0x5C01,0x5CEF,0x5CF0, +0x6367,0x68D2,0x70FD,0x71A2,0x742B,0x7E2B,0x84EC,0x8702, +0x9022,0x92D2,0x9CF3,0x4E0D,0x4ED8,0x4FEF,0x5085,0x5256, +0x526F,0x5426,0x5490,0x57E0,0x592B,0x5A66, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5B5A,0x5B75,0x5BCC,0x5E9C,0xF966,0x6276,0x6577,0x65A7, +0x6D6E,0x6EA5,0x7236,0x7B26,0x7C3F,0x7F36,0x8150,0x8151, +0x819A,0x8240,0x8299,0x83A9,0x8A03,0x8CA0,0x8CE6,0x8CFB, +0x8D74,0x8DBA,0x90E8,0x91DC,0x961C,0x9644,0x99D9,0x9CE7, +0x5317,0x5206,0x5429,0x5674,0x58B3,0x5954,0x596E,0x5FFF, +0x61A4,0x626E,0x6610,0x6C7E,0x711A,0x76C6,0x7C89,0x7CDE, +0x7D1B,0x82AC,0x8CC1,0x96F0,0xF967,0x4F5B,0x5F17,0x5F7F, +0x62C2,0x5D29,0x670B,0x68DA,0x787C,0x7E43,0x9D6C,0x4E15, +0x5099,0x5315,0x532A,0x5351,0x5983,0x5A62,0x5E87,0x60B2, +0x618A,0x6249,0x6279,0x6590,0x6787,0x69A7,0x6BD4,0x6BD6, +0x6BD7,0x6BD8,0x6CB8,0xF968,0x7435,0x75FA,0x7812,0x7891, +0x79D5,0x79D8,0x7C83,0x7DCB,0x7FE1,0x80A5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x813E,0x81C2,0x83F2,0x871A,0x88E8,0x8AB9,0x8B6C,0x8CBB, +0x9119,0x975E,0x98DB,0x9F3B,0x56AC,0x5B2A,0x5F6C,0x658C, +0x6AB3,0x6BAF,0x6D5C,0x6FF1,0x7015,0x725D,0x73AD,0x8CA7, +0x8CD3,0x983B,0x6191,0x6C37,0x8058,0x9A01,0x4E4D,0x4E8B, +0x4E9B,0x4ED5,0x4F3A,0x4F3C,0x4F7F,0x4FDF,0x50FF,0x53F2, +0x53F8,0x5506,0x55E3,0x56DB,0x58EB,0x5962,0x5A11,0x5BEB, +0x5BFA,0x5C04,0x5DF3,0x5E2B,0x5F99,0x601D,0x6368,0x659C, +0x65AF,0x67F6,0x67FB,0x68AD,0x6B7B,0x6C99,0x6CD7,0x6E23, +0x7009,0x7345,0x7802,0x793E,0x7940,0x7960,0x79C1,0x7BE9, +0x7D17,0x7D72,0x8086,0x820D,0x838E,0x84D1,0x86C7,0x88DF, +0x8A50,0x8A5E,0x8B1D,0x8CDC,0x8D66,0x8FAD,0x90AA,0x98FC, +0x99DF,0x9E9D,0x524A,0xF969,0x6714,0xF96A, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5098,0x522A,0x5C71,0x6563,0x6C55,0x73CA,0x7523,0x759D, +0x7B97,0x849C,0x9178,0x9730,0x4E77,0x6492,0x6BBA,0x715E, +0x85A9,0x4E09,0xF96B,0x6749,0x68EE,0x6E17,0x829F,0x8518, +0x886B,0x63F7,0x6F81,0x9212,0x98AF,0x4E0A,0x50B7,0x50CF, +0x511F,0x5546,0x55AA,0x5617,0x5B40,0x5C19,0x5CE0,0x5E38, +0x5E8A,0x5EA0,0x5EC2,0x60F3,0x6851,0x6A61,0x6E58,0x723D, +0x7240,0x72C0,0x76F8,0x7965,0x7BB1,0x7FD4,0x88F3,0x89F4, +0x8A73,0x8C61,0x8CDE,0x971C,0x585E,0x74BD,0x8CFD,0x55C7, +0xF96C,0x7A61,0x7D22,0x8272,0x7272,0x751F,0x7525,0xF96D, +0x7B19,0x5885,0x58FB,0x5DBC,0x5E8F,0x5EB6,0x5F90,0x6055, +0x6292,0x637F,0x654D,0x6691,0x66D9,0x66F8,0x6816,0x68F2, +0x7280,0x745E,0x7B6E,0x7D6E,0x7DD6,0x7F72, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x80E5,0x8212,0x85AF,0x897F,0x8A93,0x901D,0x92E4,0x9ECD, +0x9F20,0x5915,0x596D,0x5E2D,0x60DC,0x6614,0x6673,0x6790, +0x6C50,0x6DC5,0x6F5F,0x77F3,0x78A9,0x84C6,0x91CB,0x932B, +0x4ED9,0x50CA,0x5148,0x5584,0x5B0B,0x5BA3,0x6247,0x657E, +0x65CB,0x6E32,0x717D,0x7401,0x7444,0x7487,0x74BF,0x766C, +0x79AA,0x7DDA,0x7E55,0x7FA8,0x817A,0x81B3,0x8239,0x861A, +0x87EC,0x8A75,0x8DE3,0x9078,0x9291,0x9425,0x994D,0x9BAE, +0x5368,0x5C51,0x6954,0x6CC4,0x6D29,0x6E2B,0x820C,0x859B, +0x893B,0x8A2D,0x8AAA,0x96EA,0x9F67,0x5261,0x66B9,0x6BB2, +0x7E96,0x87FE,0x8D0D,0x9583,0x965D,0x651D,0x6D89,0x71EE, +0xF96E,0x57CE,0x59D3,0x5BAC,0x6027,0x60FA,0x6210,0x661F, +0x665F,0x7329,0x73F9,0x76DB,0x7701,0x7B6C, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8056,0x8072,0x8165,0x8AA0,0x9192,0x4E16,0x52E2,0x6B72, +0x6D17,0x7A05,0x7B39,0x7D30,0xF96F,0x8CB0,0x53EC,0x562F, +0x5851,0x5BB5,0x5C0F,0x5C11,0x5DE2,0x6240,0x6383,0x6414, +0x662D,0x68B3,0x6CBC,0x6D88,0x6EAF,0x701F,0x70A4,0x71D2, +0x7526,0x758F,0x758E,0x7619,0x7B11,0x7BE0,0x7C2B,0x7D20, +0x7D39,0x852C,0x856D,0x8607,0x8A34,0x900D,0x9061,0x90B5, +0x92B7,0x97F6,0x9A37,0x4FD7,0x5C6C,0x675F,0x6D91,0x7C9F, +0x7E8C,0x8B16,0x8D16,0x901F,0x5B6B,0x5DFD,0x640D,0x84C0, +0x905C,0x98E1,0x7387,0x5B8B,0x609A,0x677E,0x6DDE,0x8A1F, +0x8AA6,0x9001,0x980C,0x5237,0xF970,0x7051,0x788E,0x9396, +0x8870,0x91D7,0x4FEE,0x53D7,0x55FD,0x56DA,0x5782,0x58FD, +0x5AC2,0x5B88,0x5CAB,0x5CC0,0x5E25,0x6101, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x620D,0x624B,0x6388,0x641C,0x6536,0x6578,0x6A39,0x6B8A, +0x6C34,0x6D19,0x6F31,0x71E7,0x72E9,0x7378,0x7407,0x74B2, +0x7626,0x7761,0x79C0,0x7A57,0x7AEA,0x7CB9,0x7D8F,0x7DAC, +0x7E61,0x7F9E,0x8129,0x8331,0x8490,0x84DA,0x85EA,0x8896, +0x8AB0,0x8B90,0x8F38,0x9042,0x9083,0x916C,0x9296,0x92B9, +0x968B,0x96A7,0x96A8,0x96D6,0x9700,0x9808,0x9996,0x9AD3, +0x9B1A,0x53D4,0x587E,0x5919,0x5B70,0x5BBF,0x6DD1,0x6F5A, +0x719F,0x7421,0x74B9,0x8085,0x83FD,0x5DE1,0x5F87,0x5FAA, +0x6042,0x65EC,0x6812,0x696F,0x6A53,0x6B89,0x6D35,0x6DF3, +0x73E3,0x76FE,0x77AC,0x7B4D,0x7D14,0x8123,0x821C,0x8340, +0x84F4,0x8563,0x8A62,0x8AC4,0x9187,0x931E,0x9806,0x99B4, +0x620C,0x8853,0x8FF0,0x9265,0x5D07,0x5D27, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5D69,0x745F,0x819D,0x8768,0x6FD5,0x62FE,0x7FD2,0x8936, +0x8972,0x4E1E,0x4E58,0x50E7,0x52DD,0x5347,0x627F,0x6607, +0x7E69,0x8805,0x965E,0x4F8D,0x5319,0x5636,0x59CB,0x5AA4, +0x5C38,0x5C4E,0x5C4D,0x5E02,0x5F11,0x6043,0x65BD,0x662F, +0x6642,0x67BE,0x67F4,0x731C,0x77E2,0x793A,0x7FC5,0x8494, +0x84CD,0x8996,0x8A66,0x8A69,0x8AE1,0x8C55,0x8C7A,0x57F4, +0x5BD4,0x5F0F,0x606F,0x62ED,0x690D,0x6B96,0x6E5C,0x7184, +0x7BD2,0x8755,0x8B58,0x8EFE,0x98DF,0x98FE,0x4F38,0x4F81, +0x4FE1,0x547B,0x5A20,0x5BB8,0x613C,0x65B0,0x6668,0x71FC, +0x7533,0x795E,0x7D33,0x814E,0x81E3,0x8398,0x85AA,0x85CE, +0x8703,0x8A0A,0x8EAB,0x8F9B,0xF971,0x8FC5,0x5931,0x5BA4, +0x5BE6,0x6089,0x5BE9,0x5C0B,0x5FC3,0x6C81, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xF972,0x6DF1,0x700B,0x751A,0x82AF,0x8AF6,0x4EC0,0x5341, +0xF973,0x96D9,0x6C0F,0x4E9E,0x4FC4,0x5152,0x555E,0x5A25, +0x5CE8,0x6211,0x7259,0x82BD,0x83AA,0x86FE,0x8859,0x8A1D, +0x963F,0x96C5,0x9913,0x9D09,0x9D5D,0x580A,0x5CB3,0x5DBD, +0x5E44,0x60E1,0x6115,0x63E1,0x6A02,0x6E25,0x9102,0x9354, +0x984E,0x9C10,0x9F77,0x5B89,0x5CB8,0x6309,0x664F,0x6848, +0x773C,0x96C1,0x978D,0x9854,0x9B9F,0x65A1,0x8B01,0x8ECB, +0x95BC,0x5535,0x5CA9,0x5DD6,0x5EB5,0x6697,0x764C,0x83F4, +0x95C7,0x58D3,0x62BC,0x72CE,0x9D28,0x4EF0,0x592E,0x600F, +0x663B,0x6B83,0x79E7,0x9D26,0x5393,0x54C0,0x57C3,0x5D16, +0x611B,0x66D6,0x6DAF,0x788D,0x827E,0x9698,0x9744,0x5384, +0x627C,0x6396,0x6DB2,0x7E0A,0x814B,0x984D, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6AFB,0x7F4C,0x9DAF,0x9E1A,0x4E5F,0x503B,0x51B6,0x591C, +0x60F9,0x63F6,0x6930,0x723A,0x8036,0xF974,0x91CE,0x5F31, +0xF975,0xF976,0x7D04,0x82E5,0x846F,0x84BB,0x85E5,0x8E8D, +0xF977,0x4F6F,0xF978,0xF979,0x58E4,0x5B43,0x6059,0x63DA, +0x6518,0x656D,0x6698,0xF97A,0x694A,0x6A23,0x6D0B,0x7001, +0x716C,0x75D2,0x760D,0x79B3,0x7A70,0xF97B,0x7F8A,0xF97C, +0x8944,0xF97D,0x8B93,0x91C0,0x967D,0xF97E,0x990A,0x5704, +0x5FA1,0x65BC,0x6F01,0x7600,0x79A6,0x8A9E,0x99AD,0x9B5A, +0x9F6C,0x5104,0x61B6,0x6291,0x6A8D,0x81C6,0x5043,0x5830, +0x5F66,0x7109,0x8A00,0x8AFA,0x5B7C,0x8616,0x4FFA,0x513C, +0x56B4,0x5944,0x63A9,0x6DF9,0x5DAA,0x696D,0x5186,0x4E88, +0x4F59,0xF97F,0xF980,0xF981,0x5982,0xF982, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xF983,0x6B5F,0x6C5D,0xF984,0x74B5,0x7916,0xF985,0x8207, +0x8245,0x8339,0x8F3F,0x8F5D,0xF986,0x9918,0xF987,0xF988, +0xF989,0x4EA6,0xF98A,0x57DF,0x5F79,0x6613,0xF98B,0xF98C, +0x75AB,0x7E79,0x8B6F,0xF98D,0x9006,0x9A5B,0x56A5,0x5827, +0x59F8,0x5A1F,0x5BB4,0xF98E,0x5EF6,0xF98F,0xF990,0x6350, +0x633B,0xF991,0x693D,0x6C87,0x6CBF,0x6D8E,0x6D93,0x6DF5, +0x6F14,0xF992,0x70DF,0x7136,0x7159,0xF993,0x71C3,0x71D5, +0xF994,0x784F,0x786F,0xF995,0x7B75,0x7DE3,0xF996,0x7E2F, +0xF997,0x884D,0x8EDF,0xF998,0xF999,0xF99A,0x925B,0xF99B, +0x9CF6,0xF99C,0xF99D,0xF99E,0x6085,0x6D85,0xF99F,0x71B1, +0xF9A0,0xF9A1,0x95B1,0x53AD,0xF9A2,0xF9A3,0xF9A4,0x67D3, +0xF9A5,0x708E,0x7130,0x7430,0x8276,0x82D2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xF9A6,0x95BB,0x9AE5,0x9E7D,0x66C4,0xF9A7,0x71C1,0x8449, +0xF9A8,0xF9A9,0x584B,0xF9AA,0xF9AB,0x5DB8,0x5F71,0xF9AC, +0x6620,0x668E,0x6979,0x69AE,0x6C38,0x6CF3,0x6E36,0x6F41, +0x6FDA,0x701B,0x702F,0x7150,0x71DF,0x7370,0xF9AD,0x745B, +0xF9AE,0x74D4,0x76C8,0x7A4E,0x7E93,0xF9AF,0xF9B0,0x82F1, +0x8A60,0x8FCE,0xF9B1,0x9348,0xF9B2,0x9719,0xF9B3,0xF9B4, +0x4E42,0x502A,0xF9B5,0x5208,0x53E1,0x66F3,0x6C6D,0x6FCA, +0x730A,0x777F,0x7A62,0x82AE,0x85DD,0x8602,0xF9B6,0x88D4, +0x8A63,0x8B7D,0x8C6B,0xF9B7,0x92B3,0xF9B8,0x9713,0x9810, +0x4E94,0x4F0D,0x4FC9,0x50B2,0x5348,0x543E,0x5433,0x55DA, +0x5862,0x58BA,0x5967,0x5A1B,0x5BE4,0x609F,0xF9B9,0x61CA, +0x6556,0x65FF,0x6664,0x68A7,0x6C5A,0x6FB3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x70CF,0x71AC,0x7352,0x7B7D,0x8708,0x8AA4,0x9C32,0x9F07, +0x5C4B,0x6C83,0x7344,0x7389,0x923A,0x6EAB,0x7465,0x761F, +0x7A69,0x7E15,0x860A,0x5140,0x58C5,0x64C1,0x74EE,0x7515, +0x7670,0x7FC1,0x9095,0x96CD,0x9954,0x6E26,0x74E6,0x7AA9, +0x7AAA,0x81E5,0x86D9,0x8778,0x8A1B,0x5A49,0x5B8C,0x5B9B, +0x68A1,0x6900,0x6D63,0x73A9,0x7413,0x742C,0x7897,0x7DE9, +0x7FEB,0x8118,0x8155,0x839E,0x8C4C,0x962E,0x9811,0x66F0, +0x5F80,0x65FA,0x6789,0x6C6A,0x738B,0x502D,0x5A03,0x6B6A, +0x77EE,0x5916,0x5D6C,0x5DCD,0x7325,0x754F,0xF9BA,0xF9BB, +0x50E5,0x51F9,0x582F,0x592D,0x5996,0x59DA,0x5BE5,0xF9BC, +0xF9BD,0x5DA2,0x62D7,0x6416,0x6493,0x64FE,0xF9BE,0x66DC, +0xF9BF,0x6A48,0xF9C0,0x71FF,0x7464,0xF9C1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7A88,0x7AAF,0x7E47,0x7E5E,0x8000,0x8170,0xF9C2,0x87EF, +0x8981,0x8B20,0x9059,0xF9C3,0x9080,0x9952,0x617E,0x6B32, +0x6D74,0x7E1F,0x8925,0x8FB1,0x4FD1,0x50AD,0x5197,0x52C7, +0x57C7,0x5889,0x5BB9,0x5EB8,0x6142,0x6995,0x6D8C,0x6E67, +0x6EB6,0x7194,0x7462,0x7528,0x752C,0x8073,0x8338,0x84C9, +0x8E0A,0x9394,0x93DE,0xF9C4,0x4E8E,0x4F51,0x5076,0x512A, +0x53C8,0x53CB,0x53F3,0x5B87,0x5BD3,0x5C24,0x611A,0x6182, +0x65F4,0x725B,0x7397,0x7440,0x76C2,0x7950,0x7991,0x79B9, +0x7D06,0x7FBD,0x828B,0x85D5,0x865E,0x8FC2,0x9047,0x90F5, +0x91EA,0x9685,0x96E8,0x96E9,0x52D6,0x5F67,0x65ED,0x6631, +0x682F,0x715C,0x7A36,0x90C1,0x980A,0x4E91,0xF9C5,0x6A52, +0x6B9E,0x6F90,0x7189,0x8018,0x82B8,0x8553, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x904B,0x9695,0x96F2,0x97FB,0x851A,0x9B31,0x4E90,0x718A, +0x96C4,0x5143,0x539F,0x54E1,0x5713,0x5712,0x57A3,0x5A9B, +0x5AC4,0x5BC3,0x6028,0x613F,0x63F4,0x6C85,0x6D39,0x6E72, +0x6E90,0x7230,0x733F,0x7457,0x82D1,0x8881,0x8F45,0x9060, +0xF9C6,0x9662,0x9858,0x9D1B,0x6708,0x8D8A,0x925E,0x4F4D, +0x5049,0x50DE,0x5371,0x570D,0x59D4,0x5A01,0x5C09,0x6170, +0x6690,0x6E2D,0x7232,0x744B,0x7DEF,0x80C3,0x840E,0x8466, +0x853F,0x875F,0x885B,0x8918,0x8B02,0x9055,0x97CB,0x9B4F, +0x4E73,0x4F91,0x5112,0x516A,0xF9C7,0x552F,0x55A9,0x5B7A, +0x5BA5,0x5E7C,0x5E7D,0x5EBE,0x60A0,0x60DF,0x6108,0x6109, +0x63C4,0x6538,0x6709,0xF9C8,0x67D4,0x67DA,0xF9C9,0x6961, +0x6962,0x6CB9,0x6D27,0xF9CA,0x6E38,0xF9CB, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6FE1,0x7336,0x7337,0xF9CC,0x745C,0x7531,0xF9CD,0x7652, +0xF9CE,0xF9CF,0x7DAD,0x81FE,0x8438,0x88D5,0x8A98,0x8ADB, +0x8AED,0x8E30,0x8E42,0x904A,0x903E,0x907A,0x9149,0x91C9, +0x936E,0xF9D0,0xF9D1,0x5809,0xF9D2,0x6BD3,0x8089,0x80B2, +0xF9D3,0xF9D4,0x5141,0x596B,0x5C39,0xF9D5,0xF9D6,0x6F64, +0x73A7,0x80E4,0x8D07,0xF9D7,0x9217,0x958F,0xF9D8,0xF9D9, +0xF9DA,0xF9DB,0x807F,0x620E,0x701C,0x7D68,0x878D,0xF9DC, +0x57A0,0x6069,0x6147,0x6BB7,0x8ABE,0x9280,0x96B1,0x4E59, +0x541F,0x6DEB,0x852D,0x9670,0x97F3,0x98EE,0x63D6,0x6CE3, +0x9091,0x51DD,0x61C9,0x81BA,0x9DF9,0x4F9D,0x501A,0x5100, +0x5B9C,0x610F,0x61FF,0x64EC,0x6905,0x6BC5,0x7591,0x77E3, +0x7FA9,0x8264,0x858F,0x87FB,0x8863,0x8ABC, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8B70,0x91AB,0x4E8C,0x4EE5,0x4F0A,0xF9DD,0xF9DE,0x5937, +0x59E8,0xF9DF,0x5DF2,0x5F1B,0x5F5B,0x6021,0xF9E0,0xF9E1, +0xF9E2,0xF9E3,0x723E,0x73E5,0xF9E4,0x7570,0x75CD,0xF9E5, +0x79FB,0xF9E6,0x800C,0x8033,0x8084,0x82E1,0x8351,0xF9E7, +0xF9E8,0x8CBD,0x8CB3,0x9087,0xF9E9,0xF9EA,0x98F4,0x990C, +0xF9EB,0xF9EC,0x7037,0x76CA,0x7FCA,0x7FCC,0x7FFC,0x8B1A, +0x4EBA,0x4EC1,0x5203,0x5370,0xF9ED,0x54BD,0x56E0,0x59FB, +0x5BC5,0x5F15,0x5FCD,0x6E6E,0xF9EE,0xF9EF,0x7D6A,0x8335, +0xF9F0,0x8693,0x8A8D,0xF9F1,0x976D,0x9777,0xF9F2,0xF9F3, +0x4E00,0x4F5A,0x4F7E,0x58F9,0x65E5,0x6EA2,0x9038,0x93B0, +0x99B9,0x4EFB,0x58EC,0x598A,0x59D9,0x6041,0xF9F4,0xF9F5, +0x7A14,0xF9F6,0x834F,0x8CC3,0x5165,0x5344, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xF9F7,0xF9F8,0xF9F9,0x4ECD,0x5269,0x5B55,0x82BF,0x4ED4, +0x523A,0x54A8,0x59C9,0x59FF,0x5B50,0x5B57,0x5B5C,0x6063, +0x6148,0x6ECB,0x7099,0x716E,0x7386,0x74F7,0x75B5,0x78C1, +0x7D2B,0x8005,0x81EA,0x8328,0x8517,0x85C9,0x8AEE,0x8CC7, +0x96CC,0x4F5C,0x52FA,0x56BC,0x65AB,0x6628,0x707C,0x70B8, +0x7235,0x7DBD,0x828D,0x914C,0x96C0,0x9D72,0x5B71,0x68E7, +0x6B98,0x6F7A,0x76DE,0x5C91,0x66AB,0x6F5B,0x7BB4,0x7C2A, +0x8836,0x96DC,0x4E08,0x4ED7,0x5320,0x5834,0x58BB,0x58EF, +0x596C,0x5C07,0x5E33,0x5E84,0x5F35,0x638C,0x66B2,0x6756, +0x6A1F,0x6AA3,0x6B0C,0x6F3F,0x7246,0xF9FA,0x7350,0x748B, +0x7AE0,0x7CA7,0x8178,0x81DF,0x81E7,0x838A,0x846C,0x8523, +0x8594,0x85CF,0x88DD,0x8D13,0x91AC,0x9577, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x969C,0x518D,0x54C9,0x5728,0x5BB0,0x624D,0x6750,0x683D, +0x6893,0x6E3D,0x6ED3,0x707D,0x7E21,0x88C1,0x8CA1,0x8F09, +0x9F4B,0x9F4E,0x722D,0x7B8F,0x8ACD,0x931A,0x4F47,0x4F4E, +0x5132,0x5480,0x59D0,0x5E95,0x62B5,0x6775,0x696E,0x6A17, +0x6CAE,0x6E1A,0x72D9,0x732A,0x75BD,0x7BB8,0x7D35,0x82E7, +0x83F9,0x8457,0x85F7,0x8A5B,0x8CAF,0x8E87,0x9019,0x90B8, +0x96CE,0x9F5F,0x52E3,0x540A,0x5AE1,0x5BC2,0x6458,0x6575, +0x6EF4,0x72C4,0xF9FB,0x7684,0x7A4D,0x7B1B,0x7C4D,0x7E3E, +0x7FDF,0x837B,0x8B2B,0x8CCA,0x8D64,0x8DE1,0x8E5F,0x8FEA, +0x8FF9,0x9069,0x93D1,0x4F43,0x4F7A,0x50B3,0x5168,0x5178, +0x524D,0x526A,0x5861,0x587C,0x5960,0x5C08,0x5C55,0x5EDB, +0x609B,0x6230,0x6813,0x6BBF,0x6C08,0x6FB1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x714E,0x7420,0x7530,0x7538,0x7551,0x7672,0x7B4C,0x7B8B, +0x7BAD,0x7BC6,0x7E8F,0x8A6E,0x8F3E,0x8F49,0x923F,0x9293, +0x9322,0x942B,0x96FB,0x985A,0x986B,0x991E,0x5207,0x622A, +0x6298,0x6D59,0x7664,0x7ACA,0x7BC0,0x7D76,0x5360,0x5CBE, +0x5E97,0x6F38,0x70B9,0x7C98,0x9711,0x9B8E,0x9EDE,0x63A5, +0x647A,0x8776,0x4E01,0x4E95,0x4EAD,0x505C,0x5075,0x5448, +0x59C3,0x5B9A,0x5E40,0x5EAD,0x5EF7,0x5F81,0x60C5,0x633A, +0x653F,0x6574,0x65CC,0x6676,0x6678,0x67FE,0x6968,0x6A89, +0x6B63,0x6C40,0x6DC0,0x6DE8,0x6E1F,0x6E5E,0x701E,0x70A1, +0x738E,0x73FD,0x753A,0x775B,0x7887,0x798E,0x7A0B,0x7A7D, +0x7CBE,0x7D8E,0x8247,0x8A02,0x8AEA,0x8C9E,0x912D,0x914A, +0x91D8,0x9266,0x92CC,0x9320,0x9706,0x9756, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x975C,0x9802,0x9F0E,0x5236,0x5291,0x557C,0x5824,0x5E1D, +0x5F1F,0x608C,0x63D0,0x68AF,0x6FDF,0x796D,0x7B2C,0x81CD, +0x85BA,0x88FD,0x8AF8,0x8E44,0x918D,0x9664,0x969B,0x973D, +0x984C,0x9F4A,0x4FCE,0x5146,0x51CB,0x52A9,0x5632,0x5F14, +0x5F6B,0x63AA,0x64CD,0x65E9,0x6641,0x66FA,0x66F9,0x671D, +0x689D,0x68D7,0x69FD,0x6F15,0x6F6E,0x7167,0x71E5,0x722A, +0x74AA,0x773A,0x7956,0x795A,0x79DF,0x7A20,0x7A95,0x7C97, +0x7CDF,0x7D44,0x7E70,0x8087,0x85FB,0x86A4,0x8A54,0x8ABF, +0x8D99,0x8E81,0x9020,0x906D,0x91E3,0x963B,0x96D5,0x9CE5, +0x65CF,0x7C07,0x8DB3,0x93C3,0x5B58,0x5C0A,0x5352,0x62D9, +0x731D,0x5027,0x5B97,0x5F9E,0x60B0,0x616B,0x68D5,0x6DD9, +0x742E,0x7A2E,0x7D42,0x7D9C,0x7E31,0x816B, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8E2A,0x8E35,0x937E,0x9418,0x4F50,0x5750,0x5DE6,0x5EA7, +0x632B,0x7F6A,0x4E3B,0x4F4F,0x4F8F,0x505A,0x59DD,0x80C4, +0x546A,0x5468,0x55FE,0x594F,0x5B99,0x5DDE,0x5EDA,0x665D, +0x6731,0x67F1,0x682A,0x6CE8,0x6D32,0x6E4A,0x6F8D,0x70B7, +0x73E0,0x7587,0x7C4C,0x7D02,0x7D2C,0x7DA2,0x821F,0x86DB, +0x8A3B,0x8A85,0x8D70,0x8E8A,0x8F33,0x9031,0x914E,0x9152, +0x9444,0x99D0,0x7AF9,0x7CA5,0x4FCA,0x5101,0x51C6,0x57C8, +0x5BEF,0x5CFB,0x6659,0x6A3D,0x6D5A,0x6E96,0x6FEC,0x710C, +0x756F,0x7AE3,0x8822,0x9021,0x9075,0x96CB,0x99FF,0x8301, +0x4E2D,0x4EF2,0x8846,0x91CD,0x537D,0x6ADB,0x696B,0x6C41, +0x847A,0x589E,0x618E,0x66FE,0x62EF,0x70DD,0x7511,0x75C7, +0x7E52,0x84B8,0x8B49,0x8D08,0x4E4B,0x53EA, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x54AB,0x5730,0x5740,0x5FD7,0x6301,0x6307,0x646F,0x652F, +0x65E8,0x667A,0x679D,0x67B3,0x6B62,0x6C60,0x6C9A,0x6F2C, +0x77E5,0x7825,0x7949,0x7957,0x7D19,0x80A2,0x8102,0x81F3, +0x829D,0x82B7,0x8718,0x8A8C,0xF9FC,0x8D04,0x8DBE,0x9072, +0x76F4,0x7A19,0x7A37,0x7E54,0x8077,0x5507,0x55D4,0x5875, +0x632F,0x6422,0x6649,0x664B,0x686D,0x699B,0x6B84,0x6D25, +0x6EB1,0x73CD,0x7468,0x74A1,0x755B,0x75B9,0x76E1,0x771E, +0x778B,0x79E6,0x7E09,0x7E1D,0x81FB,0x852F,0x8897,0x8A3A, +0x8CD1,0x8EEB,0x8FB0,0x9032,0x93AD,0x9663,0x9673,0x9707, +0x4F84,0x53F1,0x59EA,0x5AC9,0x5E19,0x684E,0x74C6,0x75BE, +0x79E9,0x7A92,0x81A3,0x86ED,0x8CEA,0x8DCC,0x8FED,0x659F, +0x6715,0xF9FD,0x57F7,0x6F57,0x7DDD,0x8F2F, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x93F6,0x96C6,0x5FB5,0x61F2,0x6F84,0x4E14,0x4F98,0x501F, +0x53C9,0x55DF,0x5D6F,0x5DEE,0x6B21,0x6B64,0x78CB,0x7B9A, +0xF9FE,0x8E49,0x8ECA,0x906E,0x6349,0x643E,0x7740,0x7A84, +0x932F,0x947F,0x9F6A,0x64B0,0x6FAF,0x71E6,0x74A8,0x74DA, +0x7AC4,0x7C12,0x7E82,0x7CB2,0x7E98,0x8B9A,0x8D0A,0x947D, +0x9910,0x994C,0x5239,0x5BDF,0x64E6,0x672D,0x7D2E,0x50ED, +0x53C3,0x5879,0x6158,0x6159,0x61FA,0x65AC,0x7AD9,0x8B92, +0x8B96,0x5009,0x5021,0x5275,0x5531,0x5A3C,0x5EE0,0x5F70, +0x6134,0x655E,0x660C,0x6636,0x66A2,0x69CD,0x6EC4,0x6F32, +0x7316,0x7621,0x7A93,0x8139,0x8259,0x83D6,0x84BC,0x50B5, +0x57F0,0x5BC0,0x5BE8,0x5F69,0x63A1,0x7826,0x7DB5,0x83DC, +0x8521,0x91C7,0x91F5,0x518A,0x67F5,0x7B56, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8CAC,0x51C4,0x59BB,0x60BD,0x8655,0x501C,0xF9FF,0x5254, +0x5C3A,0x617D,0x621A,0x62D3,0x64F2,0x65A5,0x6ECC,0x7620, +0x810A,0x8E60,0x965F,0x96BB,0x4EDF,0x5343,0x5598,0x5929, +0x5DDD,0x64C5,0x6CC9,0x6DFA,0x7394,0x7A7F,0x821B,0x85A6, +0x8CE4,0x8E10,0x9077,0x91E7,0x95E1,0x9621,0x97C6,0x51F8, +0x54F2,0x5586,0x5FB9,0x64A4,0x6F88,0x7DB4,0x8F1F,0x8F4D, +0x9435,0x50C9,0x5C16,0x6CBE,0x6DFB,0x751B,0x77BB,0x7C3D, +0x7C64,0x8A79,0x8AC2,0x581E,0x59BE,0x5E16,0x6377,0x7252, +0x758A,0x776B,0x8ADC,0x8CBC,0x8F12,0x5EF3,0x6674,0x6DF8, +0x807D,0x83C1,0x8ACB,0x9751,0x9BD6,0xFA00,0x5243,0x66FF, +0x6D95,0x6EEF,0x7DE0,0x8AE6,0x902E,0x905E,0x9AD4,0x521D, +0x527F,0x54E8,0x6194,0x6284,0x62DB,0x68A2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6912,0x695A,0x6A35,0x7092,0x7126,0x785D,0x7901,0x790E, +0x79D2,0x7A0D,0x8096,0x8278,0x82D5,0x8349,0x8549,0x8C82, +0x8D85,0x9162,0x918B,0x91AE,0x4FC3,0x56D1,0x71ED,0x77D7, +0x8700,0x89F8,0x5BF8,0x5FD6,0x6751,0x90A8,0x53E2,0x585A, +0x5BF5,0x60A4,0x6181,0x6460,0x7E3D,0x8070,0x8525,0x9283, +0x64AE,0x50AC,0x5D14,0x6700,0x589C,0x62BD,0x63A8,0x690E, +0x6978,0x6A1E,0x6E6B,0x76BA,0x79CB,0x82BB,0x8429,0x8ACF, +0x8DA8,0x8FFD,0x9112,0x914B,0x919C,0x9310,0x9318,0x939A, +0x96DB,0x9A36,0x9C0D,0x4E11,0x755C,0x795D,0x7AFA,0x7B51, +0x7BC9,0x7E2E,0x84C4,0x8E59,0x8E74,0x8EF8,0x9010,0x6625, +0x693F,0x7443,0x51FA,0x672E,0x9EDC,0x5145,0x5FE0,0x6C96, +0x87F2,0x885D,0x8877,0x60B4,0x81B5,0x8403, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8D05,0x53D6,0x5439,0x5634,0x5A36,0x5C31,0x708A,0x7FE0, +0x805A,0x8106,0x81ED,0x8DA3,0x9189,0x9A5F,0x9DF2,0x5074, +0x4EC4,0x53A0,0x60FB,0x6E2C,0x5C64,0x4F88,0x5024,0x55E4, +0x5CD9,0x5E5F,0x6065,0x6894,0x6CBB,0x6DC4,0x71BE,0x75D4, +0x75F4,0x7661,0x7A1A,0x7A49,0x7DC7,0x7DFB,0x7F6E,0x81F4, +0x86A9,0x8F1C,0x96C9,0x99B3,0x9F52,0x5247,0x52C5,0x98ED, +0x89AA,0x4E03,0x67D2,0x6F06,0x4FB5,0x5BE2,0x6795,0x6C88, +0x6D78,0x741B,0x7827,0x91DD,0x937C,0x87C4,0x79E4,0x7A31, +0x5FEB,0x4ED6,0x54A4,0x553E,0x58AE,0x59A5,0x60F0,0x6253, +0x62D6,0x6736,0x6955,0x8235,0x9640,0x99B1,0x99DD,0x502C, +0x5353,0x5544,0x577C,0xFA01,0x6258,0xFA02,0x64E2,0x666B, +0x67DD,0x6FC1,0x6FEF,0x7422,0x7438,0x8A17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9438,0x5451,0x5606,0x5766,0x5F48,0x619A,0x6B4E,0x7058, +0x70AD,0x7DBB,0x8A95,0x596A,0x812B,0x63A2,0x7708,0x803D, +0x8CAA,0x5854,0x642D,0x69BB,0x5B95,0x5E11,0x6E6F,0xFA03, +0x8569,0x514C,0x53F0,0x592A,0x6020,0x614B,0x6B86,0x6C70, +0x6CF0,0x7B1E,0x80CE,0x82D4,0x8DC6,0x90B0,0x98B1,0xFA04, +0x64C7,0x6FA4,0x6491,0x6504,0x514E,0x5410,0x571F,0x8A0E, +0x615F,0x6876,0xFA05,0x75DB,0x7B52,0x7D71,0x901A,0x5806, +0x69CC,0x817F,0x892A,0x9000,0x9839,0x5078,0x5957,0x59AC, +0x6295,0x900F,0x9B2A,0x615D,0x7279,0x95D6,0x5761,0x5A46, +0x5DF4,0x628A,0x64AD,0x64FA,0x6777,0x6CE2,0x6D3E,0x722C, +0x7436,0x7834,0x7F77,0x82AD,0x8DDB,0x9817,0x5224,0x5742, +0x677F,0x7248,0x74E3,0x8CA9,0x8FA6,0x9211, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x962A,0x516B,0x53ED,0x634C,0x4F69,0x5504,0x6096,0x6557, +0x6C9B,0x6D7F,0x724C,0x72FD,0x7A17,0x8987,0x8C9D,0x5F6D, +0x6F8E,0x70F9,0x81A8,0x610E,0x4FBF,0x504F,0x6241,0x7247, +0x7BC7,0x7DE8,0x7FE9,0x904D,0x97AD,0x9A19,0x8CB6,0x576A, +0x5E73,0x67B0,0x840D,0x8A55,0x5420,0x5B16,0x5E63,0x5EE2, +0x5F0A,0x6583,0x80BA,0x853D,0x9589,0x965B,0x4F48,0x5305, +0x530D,0x530F,0x5486,0x54FA,0x5703,0x5E03,0x6016,0x629B, +0x62B1,0x6355,0xFA06,0x6CE1,0x6D66,0x75B1,0x7832,0x80DE, +0x812F,0x82DE,0x8461,0x84B2,0x888D,0x8912,0x900B,0x92EA, +0x98FD,0x9B91,0x5E45,0x66B4,0x66DD,0x7011,0x7206,0xFA07, +0x4FF5,0x527D,0x5F6A,0x6153,0x6753,0x6A19,0x6F02,0x74E2, +0x7968,0x8868,0x8C79,0x98C7,0x98C4,0x9A43, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x54C1,0x7A1F,0x6953,0x8AF7,0x8C4A,0x98A8,0x99AE,0x5F7C, +0x62AB,0x75B2,0x76AE,0x88AB,0x907F,0x9642,0x5339,0x5F3C, +0x5FC5,0x6CCC,0x73CC,0x7562,0x758B,0x7B46,0x82FE,0x999D, +0x4E4F,0x903C,0x4E0B,0x4F55,0x53A6,0x590F,0x5EC8,0x6630, +0x6CB3,0x7455,0x8377,0x8766,0x8CC0,0x9050,0x971E,0x9C15, +0x58D1,0x5B78,0x8650,0x8B14,0x9DB4,0x5BD2,0x6068,0x608D, +0x65F1,0x6C57,0x6F22,0x6FA3,0x701A,0x7F55,0x7FF0,0x9591, +0x9592,0x9650,0x97D3,0x5272,0x8F44,0x51FD,0x542B,0x54B8, +0x5563,0x558A,0x6ABB,0x6DB5,0x7DD8,0x8266,0x929C,0x9677, +0x9E79,0x5408,0x54C8,0x76D2,0x86E4,0x95A4,0x95D4,0x965C, +0x4EA2,0x4F09,0x59EE,0x5AE6,0x5DF7,0x6052,0x6297,0x676D, +0x6841,0x6C86,0x6E2F,0x7F38,0x809B,0x822A, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xFA08,0xFA09,0x9805,0x4EA5,0x5055,0x54B3,0x5793,0x595A, +0x5B69,0x5BB3,0x61C8,0x6977,0x6D77,0x7023,0x87F9,0x89E3, +0x8A72,0x8AE7,0x9082,0x99ED,0x9AB8,0x52BE,0x6838,0x5016, +0x5E78,0x674F,0x8347,0x884C,0x4EAB,0x5411,0x56AE,0x73E6, +0x9115,0x97FF,0x9909,0x9957,0x9999,0x5653,0x589F,0x865B, +0x8A31,0x61B2,0x6AF6,0x737B,0x8ED2,0x6B47,0x96AA,0x9A57, +0x5955,0x7200,0x8D6B,0x9769,0x4FD4,0x5CF4,0x5F26,0x61F8, +0x665B,0x6CEB,0x70AB,0x7384,0x73B9,0x73FE,0x7729,0x774D, +0x7D43,0x7D62,0x7E23,0x8237,0x8852,0xFA0A,0x8CE2,0x9249, +0x986F,0x5B51,0x7A74,0x8840,0x9801,0x5ACC,0x4FE0,0x5354, +0x593E,0x5CFD,0x633E,0x6D79,0x72F9,0x8105,0x8107,0x83A2, +0x92CF,0x9830,0x4EA8,0x5144,0x5211,0x578B, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5F62,0x6CC2,0x6ECE,0x7005,0x7050,0x70AF,0x7192,0x73E9, +0x7469,0x834A,0x87A2,0x8861,0x9008,0x90A2,0x93A3,0x99A8, +0x516E,0x5F57,0x60E0,0x6167,0x66B3,0x8559,0x8E4A,0x91AF, +0x978B,0x4E4E,0x4E92,0x547C,0x58D5,0x58FA,0x597D,0x5CB5, +0x5F27,0x6236,0x6248,0x660A,0x6667,0x6BEB,0x6D69,0x6DCF, +0x6E56,0x6EF8,0x6F94,0x6FE0,0x6FE9,0x705D,0x72D0,0x7425, +0x745A,0x74E0,0x7693,0x795C,0x7CCA,0x7E1E,0x80E1,0x82A6, +0x846B,0x84BF,0x864E,0x865F,0x8774,0x8B77,0x8C6A,0x93AC, +0x9800,0x9865,0x60D1,0x6216,0x9177,0x5A5A,0x660F,0x6DF7, +0x6E3E,0x743F,0x9B42,0x5FFD,0x60DA,0x7B0F,0x54C4,0x5F18, +0x6C5E,0x6CD3,0x6D2A,0x70D8,0x7D05,0x8679,0x8A0C,0x9D3B, +0x5316,0x548C,0x5B05,0x6A3A,0x706B,0x7575, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x798D,0x79BE,0x82B1,0x83EF,0x8A71,0x8B41,0x8CA8,0x9774, +0xFA0B,0x64F4,0x652B,0x78BA,0x78BB,0x7A6B,0x4E38,0x559A, +0x5950,0x5BA6,0x5E7B,0x60A3,0x63DB,0x6B61,0x6665,0x6853, +0x6E19,0x7165,0x74B0,0x7D08,0x9084,0x9A69,0x9C25,0x6D3B, +0x6ED1,0x733E,0x8C41,0x95CA,0x51F0,0x5E4C,0x5FA8,0x604D, +0x60F6,0x6130,0x614C,0x6643,0x6644,0x69A5,0x6CC1,0x6E5F, +0x6EC9,0x6F62,0x714C,0x749C,0x7687,0x7BC1,0x7C27,0x8352, +0x8757,0x9051,0x968D,0x9EC3,0x532F,0x56DE,0x5EFB,0x5F8A, +0x6062,0x6094,0x61F7,0x6666,0x6703,0x6A9C,0x6DEE,0x6FAE, +0x7070,0x736A,0x7E6A,0x81BE,0x8334,0x86D4,0x8AA8,0x8CC4, +0x5283,0x7372,0x5B96,0x6A6B,0x9404,0x54EE,0x5686,0x5B5D, +0x6548,0x6585,0x66C9,0x689F,0x6D8D,0x6DC6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x723B,0x80B4,0x9175,0x9A4D,0x4FAF,0x5019,0x539A,0x540E, +0x543C,0x5589,0x55C5,0x5E3F,0x5F8C,0x673D,0x7166,0x73DD, +0x9005,0x52DB,0x52F3,0x5864,0x58CE,0x7104,0x718F,0x71FB, +0x85B0,0x8A13,0x6688,0x85A8,0x55A7,0x6684,0x714A,0x8431, +0x5349,0x5599,0x6BC1,0x5F59,0x5FBD,0x63EE,0x6689,0x7147, +0x8AF1,0x8F1D,0x9EBE,0x4F11,0x643A,0x70CB,0x7566,0x8667, +0x6064,0x8B4E,0x9DF8,0x5147,0x51F6,0x5308,0x6D36,0x80F8, +0x9ED1,0x6615,0x6B23,0x7098,0x75D5,0x5403,0x5C79,0x7D07, +0x8A16,0x6B20,0x6B3D,0x6B46,0x5438,0x6070,0x6D3D,0x7FD5, +0x8208,0x50D6,0x51DE,0x559C,0x566B,0x56CD,0x59EC,0x5B09, +0x5E0C,0x6199,0x6198,0x6231,0x665E,0x66E6,0x7199,0x71B9, +0x71BA,0x72A7,0x79A7,0x7A00,0x7FB2,0x8A70}; + +static int func_ksc5601_uni_onechar(int code){ + if ((code>=0x8141)&&(code<=0xC8FE)) + return(tab_ksc5601_uni0[code-0x8141]); + if ((code>=0xCAA1)&&(code<=0xFDFE)) + return(tab_ksc5601_uni1[code-0xCAA1]); + return(0); +} +/* page 0 0x00A1-0x0167 */ +static uint16 tab_uni_ksc56010[]={ +0xA2AE, 0, 0,0xA2B4, 0, 0,0xA1D7,0xA1A7, + 0,0xA8A3, 0, 0,0xA1A9, 0, 0,0xA1C6, +0xA1BE,0xA9F7,0xA9F8,0xA2A5, 0,0xA2D2,0xA1A4,0xA2AC, +0xA9F6,0xA8AC, 0,0xA8F9,0xA8F6,0xA8FA,0xA2AF, 0, + 0, 0, 0, 0, 0,0xA8A1, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xA8A2, + 0, 0, 0, 0, 0, 0,0xA1BF,0xA8AA, + 0, 0, 0, 0, 0,0xA8AD,0xA9AC, 0, + 0, 0, 0, 0, 0,0xA9A1, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xA9A3, + 0, 0, 0, 0, 0, 0,0xA1C0,0xA9AA, + 0, 0, 0, 0, 0,0xA9AD, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA9A2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xA8A4,0xA9A4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA9A5,0xA8A6,0xA9A6, 0, 0, 0, 0,0xA9A7, + 0, 0, 0, 0, 0, 0,0xA8A8,0xA9A8, +0xA8A9,0xA9A9, 0, 0, 0, 0, 0, 0, +0xA9B0,0xA8AF,0xA9AF, 0, 0, 0, 0, 0, + 0,0xA8AB,0xA9AB, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xA8AE,0xA9AE}; + +/* page 1 0x02C7-0x0451 */ +static uint16 tab_uni_ksc56011[]={ +0xA2A7, 0, 0, 0, 0, 0, 0, 0, + 0,0xA2B0, 0, 0, 0, 0, 0, 0, + 0,0xA2A8,0xA2AB,0xA2AA,0xA2AD, 0,0xA2A9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xA5C1,0xA5C2,0xA5C3,0xA5C4,0xA5C5,0xA5C6, +0xA5C7,0xA5C8,0xA5C9,0xA5CA,0xA5CB,0xA5CC,0xA5CD,0xA5CE, +0xA5CF,0xA5D0,0xA5D1, 0,0xA5D2,0xA5D3,0xA5D4,0xA5D5, +0xA5D6,0xA5D7,0xA5D8, 0, 0, 0, 0, 0, + 0, 0,0xA5E1,0xA5E2,0xA5E3,0xA5E4,0xA5E5,0xA5E6, +0xA5E7,0xA5E8,0xA5E9,0xA5EA,0xA5EB,0xA5EC,0xA5ED,0xA5EE, +0xA5EF,0xA5F0,0xA5F1, 0,0xA5F2,0xA5F3,0xA5F4,0xA5F5, +0xA5F6,0xA5F7,0xA5F8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xACA7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xACA1,0xACA2,0xACA3,0xACA4,0xACA5,0xACA6,0xACA8, +0xACA9,0xACAA,0xACAB,0xACAC,0xACAD,0xACAE,0xACAF,0xACB0, +0xACB1,0xACB2,0xACB3,0xACB4,0xACB5,0xACB6,0xACB7,0xACB8, +0xACB9,0xACBA,0xACBB,0xACBC,0xACBD,0xACBE,0xACBF,0xACC0, +0xACC1,0xACD1,0xACD2,0xACD3,0xACD4,0xACD5,0xACD6,0xACD8, +0xACD9,0xACDA,0xACDB,0xACDC,0xACDD,0xACDE,0xACDF,0xACE0, +0xACE1,0xACE2,0xACE3,0xACE4,0xACE5,0xACE6,0xACE7,0xACE8, +0xACE9,0xACEA,0xACEB,0xACEC,0xACED,0xACEE,0xACEF,0xACF0, +0xACF1, 0,0xACD7}; + +/* page 2 0x2015-0x2312 */ +static uint16 tab_uni_ksc56012[]={ +0xA1AA, 0, 0,0xA1AE,0xA1AF, 0, 0,0xA1B0, +0xA1B1, 0, 0,0xA2D3,0xA2D4, 0, 0, 0, +0xA1A5,0xA1A6, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xA2B6, 0,0xA1C7,0xA1C8, 0, + 0, 0, 0, 0, 0, 0,0xA1D8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xA9F9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xA9FA, 0,0xA9FB,0xA9FC,0xA9FD,0xA9FE, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xA1C9, 0, + 0, 0, 0, 0,0xA2B5, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xA7A4, 0, + 0,0xA2E0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xA2E5,0xA2E2, 0, 0, + 0,0xA7D9, 0, 0, 0, 0,0xA1CA, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xA8F7,0xA8F8, + 0, 0, 0, 0, 0, 0,0xA8FB,0xA8FC, +0xA8FD,0xA8FE, 0,0xA5B0,0xA5B1,0xA5B2,0xA5B3,0xA5B4, +0xA5B5,0xA5B6,0xA5B7,0xA5B8,0xA5B9, 0, 0, 0, + 0, 0, 0,0xA5A1,0xA5A2,0xA5A3,0xA5A4,0xA5A5, +0xA5A6,0xA5A7,0xA5A8,0xA5A9,0xA5AA, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xA1E7,0xA1E8,0xA1E6,0xA1E9,0xA1EA, +0xA2D5,0xA2D8,0xA2D6,0xA2D9,0xA2D7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xA2A1, 0,0xA2A2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xA2A3, 0,0xA1D3,0xA2A4, 0, + 0, 0,0xA1D4,0xA1F4, 0, 0,0xA1F5, 0, + 0, 0,0xA2B3, 0,0xA2B2, 0, 0, 0, + 0, 0, 0, 0, 0,0xA1EE, 0, 0, +0xA1F0,0xA1C4, 0,0xA1D0, 0, 0, 0, 0, +0xA1AB, 0,0xA1FC,0xA1FD,0xA1FB,0xA1FA,0xA1F2,0xA1F3, + 0,0xA2B1, 0, 0, 0, 0, 0,0xA1C5, +0xA1F1, 0, 0, 0, 0, 0, 0,0xA1AD, +0xA1EF, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xA1D6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xA1C1,0xA1D5, 0, 0,0xA1C2, +0xA1C3, 0, 0, 0, 0,0xA1EC,0xA1ED, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xA1F8,0xA1F9, 0, + 0,0xA1F6,0xA1F7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xA2C1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA1D1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xA1D2}; + +/* page 3 0x2460-0x266D */ +static uint16 tab_uni_ksc56013[]={ +0xA8E7,0xA8E8,0xA8E9,0xA8EA,0xA8EB,0xA8EC,0xA8ED,0xA8EE, +0xA8EF,0xA8F0,0xA8F1,0xA8F2,0xA8F3,0xA8F4,0xA8F5, 0, + 0, 0, 0, 0,0xA9E7,0xA9E8,0xA9E9,0xA9EA, +0xA9EB,0xA9EC,0xA9ED,0xA9EE,0xA9EF,0xA9F0,0xA9F1,0xA9F2, +0xA9F3,0xA9F4,0xA9F5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xA9CD,0xA9CE,0xA9CF,0xA9D0, +0xA9D1,0xA9D2,0xA9D3,0xA9D4,0xA9D5,0xA9D6,0xA9D7,0xA9D8, +0xA9D9,0xA9DA,0xA9DB,0xA9DC,0xA9DD,0xA9DE,0xA9DF,0xA9E0, +0xA9E1,0xA9E2,0xA9E3,0xA9E4,0xA9E5,0xA9E6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA8CD,0xA8CE,0xA8CF,0xA8D0,0xA8D1,0xA8D2,0xA8D3,0xA8D4, +0xA8D5,0xA8D6,0xA8D7,0xA8D8,0xA8D9,0xA8DA,0xA8DB,0xA8DC, +0xA8DD,0xA8DE,0xA8DF,0xA8E0,0xA8E1,0xA8E2,0xA8E3,0xA8E4, +0xA8E5,0xA8E6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA6A1,0xA6AC,0xA6A2,0xA6AD, 0, 0, 0, 0, + 0, 0, 0, 0,0xA6A3,0xA6C8,0xA6C7,0xA6AE, +0xA6A4,0xA6C2,0xA6C1,0xA6AF,0xA6A6,0xA6C6,0xA6C5,0xA6B1, +0xA6A5,0xA6C4,0xA6C3,0xA6B0,0xA6A7,0xA6BC,0xA6C9,0xA6CA, +0xA6B7,0xA6CB,0xA6CC,0xA6B2,0xA6A9,0xA6BE,0xA6CD,0xA6CE, +0xA6B9,0xA6CF,0xA6D0,0xA6B4,0xA6A8,0xA6D1,0xA6D2,0xA6B8, +0xA6BD,0xA6D3,0xA6D4,0xA6B3,0xA6AA,0xA6D5,0xA6D6,0xA6BA, +0xA6BF,0xA6D7,0xA6D8,0xA6B5,0xA6AB,0xA6D9,0xA6DA,0xA6BB, +0xA6DB,0xA6DC,0xA6C0,0xA6DD,0xA6DE,0xA6DF,0xA6E0,0xA6E1, +0xA6E2,0xA6E3,0xA6E4,0xA6B6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xA2C6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA1E1,0xA1E0, 0,0xA2C3,0xA2C7,0xA2C8,0xA2CB,0xA2CA, +0xA2C9,0xA2CC, 0, 0, 0, 0, 0, 0, + 0, 0,0xA1E3,0xA1E2, 0, 0,0xA2BA,0xA2B9, + 0, 0, 0, 0,0xA1E5,0xA1E4, 0, 0, +0xA2B8,0xA2B7, 0, 0, 0, 0,0xA1DF,0xA1DE, +0xA2C2, 0, 0,0xA1DB, 0, 0,0xA1DD,0xA1DC, +0xA2C4,0xA2C5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xA1DA,0xA1D9, 0, + 0, 0, 0, 0, 0, 0,0xA2CF,0xA2CE, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xA2D0, 0,0xA2D1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA1CF, 0,0xA1CE, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA2BC,0xA2BD, 0,0xA2C0,0xA2BB,0xA2BE, 0,0xA2BF, +0xA2CD,0xA2DB,0xA2DC, 0,0xA2DD,0xA2DA}; + +/* page 4 0x3000-0x327F */ +static uint16 tab_uni_ksc56014[]={ +0xA1A1,0xA1A2,0xA1A3,0xA1A8, 0, 0, 0, 0, +0xA1B4,0xA1B5,0xA1B6,0xA1B7,0xA1B8,0xA1B9,0xA1BA,0xA1BB, +0xA1BC,0xA1BD, 0,0xA1EB,0xA1B2,0xA1B3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xAAA1,0xAAA2,0xAAA3,0xAAA4,0xAAA5,0xAAA6,0xAAA7, +0xAAA8,0xAAA9,0xAAAA,0xAAAB,0xAAAC,0xAAAD,0xAAAE,0xAAAF, +0xAAB0,0xAAB1,0xAAB2,0xAAB3,0xAAB4,0xAAB5,0xAAB6,0xAAB7, +0xAAB8,0xAAB9,0xAABA,0xAABB,0xAABC,0xAABD,0xAABE,0xAABF, +0xAAC0,0xAAC1,0xAAC2,0xAAC3,0xAAC4,0xAAC5,0xAAC6,0xAAC7, +0xAAC8,0xAAC9,0xAACA,0xAACB,0xAACC,0xAACD,0xAACE,0xAACF, +0xAAD0,0xAAD1,0xAAD2,0xAAD3,0xAAD4,0xAAD5,0xAAD6,0xAAD7, +0xAAD8,0xAAD9,0xAADA,0xAADB,0xAADC,0xAADD,0xAADE,0xAADF, +0xAAE0,0xAAE1,0xAAE2,0xAAE3,0xAAE4,0xAAE5,0xAAE6,0xAAE7, +0xAAE8,0xAAE9,0xAAEA,0xAAEB,0xAAEC,0xAAED,0xAAEE,0xAAEF, +0xAAF0,0xAAF1,0xAAF2,0xAAF3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xABA1,0xABA2,0xABA3,0xABA4,0xABA5,0xABA6,0xABA7, +0xABA8,0xABA9,0xABAA,0xABAB,0xABAC,0xABAD,0xABAE,0xABAF, +0xABB0,0xABB1,0xABB2,0xABB3,0xABB4,0xABB5,0xABB6,0xABB7, +0xABB8,0xABB9,0xABBA,0xABBB,0xABBC,0xABBD,0xABBE,0xABBF, +0xABC0,0xABC1,0xABC2,0xABC3,0xABC4,0xABC5,0xABC6,0xABC7, +0xABC8,0xABC9,0xABCA,0xABCB,0xABCC,0xABCD,0xABCE,0xABCF, +0xABD0,0xABD1,0xABD2,0xABD3,0xABD4,0xABD5,0xABD6,0xABD7, +0xABD8,0xABD9,0xABDA,0xABDB,0xABDC,0xABDD,0xABDE,0xABDF, +0xABE0,0xABE1,0xABE2,0xABE3,0xABE4,0xABE5,0xABE6,0xABE7, +0xABE8,0xABE9,0xABEA,0xABEB,0xABEC,0xABED,0xABEE,0xABEF, +0xABF0,0xABF1,0xABF2,0xABF3,0xABF4,0xABF5,0xABF6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xA4A1,0xA4A2,0xA4A3,0xA4A4,0xA4A5,0xA4A6,0xA4A7, +0xA4A8,0xA4A9,0xA4AA,0xA4AB,0xA4AC,0xA4AD,0xA4AE,0xA4AF, +0xA4B0,0xA4B1,0xA4B2,0xA4B3,0xA4B4,0xA4B5,0xA4B6,0xA4B7, +0xA4B8,0xA4B9,0xA4BA,0xA4BB,0xA4BC,0xA4BD,0xA4BE,0xA4BF, +0xA4C0,0xA4C1,0xA4C2,0xA4C3,0xA4C4,0xA4C5,0xA4C6,0xA4C7, +0xA4C8,0xA4C9,0xA4CA,0xA4CB,0xA4CC,0xA4CD,0xA4CE,0xA4CF, +0xA4D0,0xA4D1,0xA4D2,0xA4D3,0xA4D4,0xA4D5,0xA4D6,0xA4D7, +0xA4D8,0xA4D9,0xA4DA,0xA4DB,0xA4DC,0xA4DD,0xA4DE,0xA4DF, +0xA4E0,0xA4E1,0xA4E2,0xA4E3,0xA4E4,0xA4E5,0xA4E6,0xA4E7, +0xA4E8,0xA4E9,0xA4EA,0xA4EB,0xA4EC,0xA4ED,0xA4EE,0xA4EF, +0xA4F0,0xA4F1,0xA4F2,0xA4F3,0xA4F4,0xA4F5,0xA4F6,0xA4F7, +0xA4F8,0xA4F9,0xA4FA,0xA4FB,0xA4FC,0xA4FD,0xA4FE, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA9B1,0xA9B2,0xA9B3,0xA9B4,0xA9B5,0xA9B6,0xA9B7,0xA9B8, +0xA9B9,0xA9BA,0xA9BB,0xA9BC,0xA9BD,0xA9BE,0xA9BF,0xA9C0, +0xA9C1,0xA9C2,0xA9C3,0xA9C4,0xA9C5,0xA9C6,0xA9C7,0xA9C8, +0xA9C9,0xA9CA,0xA9CB,0xA9CC,0xA2DF, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA8B1,0xA8B2,0xA8B3,0xA8B4,0xA8B5,0xA8B6,0xA8B7,0xA8B8, +0xA8B9,0xA8BA,0xA8BB,0xA8BC,0xA8BD,0xA8BE,0xA8BF,0xA8C0, +0xA8C1,0xA8C2,0xA8C3,0xA8C4,0xA8C5,0xA8C6,0xA8C7,0xA8C8, +0xA8C9,0xA8CA,0xA8CB,0xA8CC, 0, 0, 0,0xA2DE +}; + +/* page 5 0x3380-0x33DD */ +static uint16 tab_uni_ksc56015[]={ +0xA7C9,0xA7CA,0xA7CB,0xA7CC,0xA7CD, 0, 0, 0, +0xA7BA,0xA7BB,0xA7DC,0xA7DD,0xA7DE,0xA7B6,0xA7B7,0xA7B8, +0xA7D4,0xA7D5,0xA7D6,0xA7D7,0xA7D8,0xA7A1,0xA7A2,0xA7A3, +0xA7A5,0xA7AB,0xA7AC,0xA7AD,0xA7AE,0xA7AF,0xA7B0,0xA7B1, +0xA7B2,0xA7B3,0xA7B4,0xA7A7,0xA7A8,0xA7A9,0xA7AA,0xA7BD, +0xA7BE,0xA7E5,0xA7E6,0xA7E7,0xA7E8,0xA7E1,0xA7E2,0xA7E3, +0xA7BF,0xA7C0,0xA7C1,0xA7C2,0xA7C3,0xA7C4,0xA7C5,0xA7C6, +0xA7C7,0xA7C8,0xA7CE,0xA7CF,0xA7D0,0xA7D1,0xA7D2,0xA7D3, +0xA7DA,0xA7DB,0xA2E3,0xA7EC,0xA7A6,0xA7E0,0xA7EF,0xA2E1, +0xA7BC,0xA7ED,0xA7B5, 0, 0, 0, 0,0xA7B9, +0xA7EA, 0, 0,0xA7EB, 0, 0,0xA7DF, 0, +0xA2E4, 0, 0,0xA7E4,0xA7EE,0xA7E9}; + +/* page 6 0x4E00-0x947F */ +static uint16 tab_uni_ksc56016[]={ +0xECE9,0xEFCB, 0,0xF6D2, 0, 0, 0,0xD8B2, +0xEDDB,0xDFB2,0xDFBE,0xF9BB, 0,0xDCF4, 0, 0, + 0,0xF5E4, 0, 0,0xF3A6,0xDDE0,0xE1A6, 0, +0xCEF8,0xDCB0, 0, 0, 0, 0,0xE3AA, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xF1E9, 0, 0, + 0, 0,0xCDFA, 0, 0, 0, 0, 0, +0xFCAF,0xD3A1, 0,0xF1AB, 0, 0, 0, 0, + 0, 0,0xE7D1,0xD2AC, 0,0xCEF9, 0, 0, + 0, 0, 0,0xF1FD, 0,0xDEBF,0xFBBA,0xF9B9, + 0, 0, 0, 0, 0, 0,0xCED2, 0, +0xE3AB,0xEBE0, 0, 0, 0,0xCEFA,0xCBF7,0xE5A5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xCAE1, 0,0xD4CC, 0, 0, + 0, 0, 0,0xEAE1, 0, 0,0xDCE3,0xDFAD, + 0, 0, 0, 0, 0, 0,0xCBEB, 0, + 0, 0,0xD5AF, 0, 0, 0,0xD6F5, 0, +0xE5F8, 0, 0,0xDEC0,0xECA3, 0,0xE9CD, 0, +0xEAA7,0xE9F6,0xFBBB, 0,0xE7E9,0xEFCC, 0, 0, +0xD0E6, 0, 0,0xDEC1, 0, 0,0xE4AC, 0, + 0,0xD8CC,0xF9F1, 0,0xCEDF,0xFAA4,0xE6B2, 0, +0xFAFB, 0, 0,0xFABD,0xCCC8,0xEFCD,0xD5D5, 0, + 0, 0, 0, 0, 0, 0,0xD3A2, 0, + 0, 0,0xECD1, 0, 0, 0, 0, 0, +0xE4A7,0xECD2, 0, 0,0xF6B1, 0, 0,0xCEFB, + 0, 0,0xD0D1,0xCBBF, 0,0xEDA4, 0, 0, + 0, 0, 0, 0,0xEDA8,0xDEC2,0xF6E2,0xEDDC, +0xDCF5,0xE0B9, 0, 0, 0,0xD4CE, 0,0xF4B5, + 0, 0, 0,0xD3DB,0xD6B5,0xECA4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE4E6, 0,0xF1EA, 0, 0, 0,0xCBEC,0xCBC0, + 0, 0, 0,0xECF2, 0, 0, 0, 0, + 0,0xD0EA, 0, 0, 0, 0, 0, 0, + 0,0xF9F2,0xECA5,0xD0DF, 0,0xE7EA,0xD0EB,0xDCD1, +0xDBE9,0xFDCC, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xDBD7, + 0, 0, 0, 0,0xDAE1, 0,0xD6B6, 0, +0xE3DF, 0,0xDEC3, 0,0xDEC4,0xCAA1, 0, 0, + 0, 0, 0,0xEEEC, 0, 0,0xD3A3,0xEEB7, +0xF8CF, 0, 0, 0, 0,0xEAC8,0xEEB8,0xF1AC, +0xF1A5,0xE9CE, 0, 0, 0,0xF9BC, 0, 0, + 0,0xE5F9,0xECEA,0xDDD6,0xEDC2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xF8A5, 0, 0, 0, 0, 0,0xE5BA, +0xDBD8, 0, 0,0xCAA2, 0, 0,0xD1CD, 0, + 0, 0,0xEEED, 0, 0, 0,0xECEB,0xDEC5, + 0,0xE3E0, 0,0xCAC9,0xF2E9, 0,0xD5CE, 0, +0xF6B6, 0,0xCEC2,0xD6C7, 0,0xE3B4, 0,0xF1AD, + 0,0xEAE2, 0, 0, 0, 0,0xD7C2, 0, +0xF3A7, 0, 0,0xCDEA, 0,0xEBEE, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xD9B2,0xFDA5, + 0, 0, 0, 0, 0,0xF6D5,0xD5E2, 0, + 0, 0, 0, 0, 0, 0, 0,0xF8B5, + 0, 0,0xCCF5,0xF5B5,0xE4AD, 0, 0, 0, + 0,0xE7EB,0xF1D5, 0, 0, 0,0xF0BB, 0, + 0,0xE9B5, 0,0xCCC9,0xFAD5, 0, 0,0xE1D4, + 0, 0,0xD7D6, 0, 0,0xDCC1, 0,0xDEC6, +0xFAEF,0xE3E1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE1F3,0xDCF6, + 0,0xCEFC, 0,0xDBC4, 0,0xF8F1, 0, 0, +0xDCE4, 0,0xE5EF, 0, 0, 0, 0, 0, + 0, 0,0xDCB1, 0, 0, 0,0xD5D6, 0, + 0,0xF3DA, 0,0xCBC1, 0,0xDBC3, 0, 0, + 0,0xD9FA,0xD3EE, 0, 0, 0,0xFAB8, 0, + 0,0xFDA6,0xEBEF, 0,0xF4A6, 0,0xCCCA,0xF3A8, + 0,0xF3DB, 0,0xDBA7,0xF6B7, 0,0xCFE6,0xF0F2, +0xCBDA, 0,0xE7D2,0xD7C3,0xF6F0,0xE8DE, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE5A6, 0, 0, 0, 0, + 0, 0, 0,0xE5E7, 0, 0, 0,0xCAA3, +0xCCA7,0xEAC9, 0, 0, 0, 0, 0,0xF8B6, + 0, 0, 0, 0, 0,0xFAA5, 0, 0, + 0, 0,0xF1AE, 0,0xEFCE, 0, 0, 0, + 0, 0, 0, 0, 0,0xCBED, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xF6B0,0xEFCF,0xE9CF, 0, +0xF7DE, 0, 0, 0, 0, 0, 0, 0, +0xCED3, 0, 0, 0, 0,0xDCF7, 0, 0, + 0, 0, 0, 0, 0,0xDBA8, 0, 0, + 0,0xCBF8, 0, 0, 0, 0, 0, 0, +0xDFA1,0xDDE1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xF5CA,0xE9B6, 0, 0, + 0, 0,0xE7EC,0xEEEE, 0,0xF3F0, 0,0xDFBF, + 0, 0, 0, 0, 0, 0,0xCCCB, 0, + 0, 0, 0, 0, 0,0xD0C1, 0, 0, + 0,0xF4D2,0xE0BA, 0, 0, 0, 0,0xDFC0, + 0,0xCEE0, 0, 0, 0,0xDCD2,0xFDEA, 0, + 0, 0,0xD6F6, 0, 0, 0,0xEACA, 0, + 0, 0, 0, 0, 0,0xE8E9, 0,0xE3AC, + 0, 0, 0, 0, 0,0xF3D0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xCAA4, 0,0xDBF8, 0, 0, 0,0xDEC7, +0xEBF0,0xF1D6, 0, 0,0xE5E2, 0,0xCCCC, 0, + 0,0xCBFB, 0, 0, 0, 0, 0, 0, + 0, 0,0xEAE3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xDFC1, + 0,0xD6ED, 0, 0, 0, 0, 0, 0, + 0, 0,0xE9D0, 0, 0, 0, 0, 0, + 0, 0,0xEEB9, 0, 0, 0, 0,0xD5E3, + 0, 0,0xD1D3, 0,0xE5F0, 0, 0, 0, +0xE8B4,0xEBC3, 0,0xEAAA,0xFAFC,0xF5F6,0xF0BC,0xFDD4, +0xE0BB,0xCEC3, 0,0xD0BA,0xF7BA,0xD8F3,0xF7CD, 0, + 0, 0,0xE4AE, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xD4DF, 0, 0, 0, + 0, 0,0xD0E7, 0, 0,0xECFD, 0,0xD2AE, +0xEEEF,0xD5D7,0xEAE4,0xF8A2,0xCDEB,0xD7BF,0xFBB1, 0, + 0,0xCDEC, 0, 0, 0,0xDCB2,0xD0EC,0xCEFD, +0xEEF0, 0, 0, 0,0xCCC2, 0, 0, 0, +0xD0ED, 0, 0, 0, 0, 0,0xE5F7, 0, + 0, 0,0xF3FC, 0, 0,0xEEA2, 0, 0, + 0, 0,0xD9B3, 0, 0,0xD8F4, 0,0xE9B7, + 0, 0, 0, 0, 0, 0, 0, 0, +0xCEAE, 0, 0, 0, 0,0xD9A2, 0, 0, + 0, 0,0xD8F1, 0,0xD4CF, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE5A7,0xD5D2, + 0, 0, 0, 0, 0,0xD6A9, 0, 0, + 0, 0, 0, 0,0xF4A2, 0,0xF1D7, 0, + 0,0xD5D8, 0,0xF0BD,0xD7D0,0xD4D0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xD7CF,0xEBEA,0xFDEB, 0, + 0,0xDBED, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xFCC5,0xCBC2, 0, 0, 0, 0,0xFDD5, 0, +0xF4C8,0xE8EA,0xF5F3, 0, 0,0xF9DE, 0, 0, +0xD3EF, 0, 0,0xECD3, 0, 0,0xDDC2,0xEFB7, +0xE7D4, 0,0xCACA, 0, 0, 0,0xD9FB, 0, + 0,0xFAFD, 0, 0, 0, 0, 0,0xD6AA, + 0, 0, 0, 0, 0,0xF4F8, 0, 0, + 0, 0, 0, 0,0xF7F7,0xDCAC, 0, 0, + 0,0xD7D7,0xDFA2, 0, 0, 0,0xCEBE, 0, +0xD3F0, 0, 0, 0, 0, 0,0xF0A4,0xE1EC, +0xCFE7,0xF3CB,0xEDA9,0xCABE, 0, 0, 0, 0, + 0, 0, 0,0xF4EF, 0, 0, 0,0xF6CE, + 0, 0,0xDEFB,0xD0BB,0xD5B7,0xEEF1, 0, 0, + 0, 0, 0, 0,0xF4A8, 0,0xDCF8, 0, + 0, 0, 0,0xCBA7, 0,0xDACE, 0, 0, + 0,0xE0E6, 0, 0, 0, 0, 0, 0, + 0,0xEDA5,0xEEF2, 0, 0, 0, 0,0xDCF9, + 0, 0,0xF9DC, 0, 0,0xF3DC, 0, 0, + 0, 0, 0, 0, 0,0xF8F2, 0,0xF4F9, + 0, 0, 0,0xFCF1, 0, 0, 0,0xD0BC, +0xDBF9,0xD7B1, 0, 0, 0,0xCBFC, 0, 0, + 0,0xF0A5,0xCBFD, 0, 0, 0, 0, 0, + 0, 0, 0,0xD5F4, 0, 0, 0,0xCDED, +0xCAA5, 0, 0,0xD6AB,0xD0C2, 0, 0, 0, + 0,0xF0BE,0xD2BD,0xCCA4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xFAB6, 0, + 0,0xCCCD, 0,0xDAFA, 0,0xF6CF, 0,0xE9B8, + 0,0xD8F5, 0, 0, 0,0xCCCE, 0, 0, + 0, 0,0xD7CD, 0, 0,0xD4D1,0xE9ED, 0, +0xCAEB,0xD9E2, 0,0xFDB2, 0,0xE3AD,0xD6CC,0xD9B4, + 0, 0,0xE1A7,0xEED3,0xD0C3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xFDB3, 0,0xD5E4, 0, 0, +0xCFE8, 0,0xEDC3,0xD0B2, 0, 0,0xCEFE,0xDAA8, + 0, 0, 0, 0, 0,0xF8D0, 0, 0, +0xFDD6, 0, 0, 0, 0,0xF8D1, 0,0xF8D2, +0xDCD3, 0, 0, 0, 0,0xDDE2,0xFBF9,0xDDC1, + 0,0xE3B5, 0, 0, 0, 0, 0, 0, +0xEDDD,0xCEC4, 0,0xCBA1, 0, 0, 0, 0, + 0, 0,0xDDE3, 0, 0, 0, 0,0xFCDD, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xF9AF, 0, 0, 0, 0, 0,0xD2FB, +0xCFA1,0xE4A8, 0,0xF4B6,0xECFE, 0, 0,0xE3AE, +0xE7ED,0xFDC1,0xDAE2, 0, 0,0xD8B3, 0, 0, + 0,0xDDE4,0xF0EF,0xF6F1,0xFAF0, 0, 0,0xD1F5, + 0, 0,0xDACF, 0,0xDCD4, 0,0xDCA6, 0, +0xEFBF, 0, 0, 0, 0, 0,0xCECF, 0, +0xE0D9, 0, 0, 0, 0, 0, 0,0xD9D6, +0xECD4,0xEACB, 0, 0,0xCABF,0xD5B0, 0,0xCFE9, + 0, 0, 0, 0, 0,0xF1ED, 0,0xCCCF, + 0, 0, 0, 0,0xE4F8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE4ED, 0, 0, 0, 0, +0xD7D8, 0,0xFDA7, 0, 0, 0, 0,0xEAAB, +0xF6B2, 0, 0, 0, 0,0xCFF0,0xF9BD, 0, + 0, 0, 0, 0, 0,0xE6F4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xCBDB, 0, 0, 0, 0, + 0, 0, 0,0xF3D1, 0, 0, 0, 0, +0xE9D1,0xF3A9,0xD0E0,0xE9D2, 0,0xDAE3, 0, 0, + 0, 0, 0, 0,0xE2D2, 0,0xF6A2,0xE1F4, + 0, 0, 0,0xDAE4, 0, 0, 0, 0, + 0,0xE7D5,0xF5BF,0xCFA2,0xCDAF,0xCFA3, 0, 0, + 0,0xCDB0,0xF1FE,0xD0A3,0xE1AF,0xF8A3, 0,0xCAA6, +0xF7BB,0xF2EA,0xDEC8,0xE9D3, 0, 0, 0, 0, +0xDEC9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xFDDE,0xCAC0, 0, 0, 0, +0xF9EA,0xD1CE,0xEED4, 0,0xD4D2,0xD9A3,0xFDA8,0xD7D9, +0xF7CE,0xFABE, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xCFD6, 0,0xD7F0, 0,0xEBE1, +0xF8C5, 0, 0, 0, 0, 0,0xDCFA, 0, + 0,0xDDC3, 0,0xF9DF, 0, 0, 0, 0, + 0, 0, 0,0xE7EF, 0, 0, 0, 0, +0xFDE5,0xF6A3, 0,0xD9FC,0xFDA9, 0,0xE7EE, 0, + 0, 0,0xD5E5, 0, 0, 0, 0, 0, +0xEFD0, 0,0xCDB1, 0, 0, 0, 0, 0, + 0,0xF7A2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xF1B2, 0,0xF1B1, 0, 0, 0, 0, 0, + 0,0xCDB2, 0,0xDAAB, 0,0xCAA7, 0, 0, + 0, 0, 0,0xE3E2,0xFBBC,0xD9A4, 0, 0, +0xEEBA, 0, 0, 0, 0, 0,0xF8D3, 0, + 0, 0, 0, 0,0xFBFA, 0,0xCFA4, 0, +0xDCFB, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xF6E3, 0, 0, 0, +0xEDAA, 0, 0,0xF2A1,0xCEE1, 0, 0, 0, + 0, 0, 0,0xFAA6, 0, 0, 0, 0, +0xF9E0, 0, 0, 0, 0,0xECD6, 0, 0, +0xE4EE,0xF9A1, 0, 0,0xFBEF, 0, 0, 0, +0xF9EB,0xEEA3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xEAAC, 0, 0, 0,0xCAA8, 0, 0, +0xF4FA, 0, 0, 0, 0,0xCDD6,0xFCF6, 0, + 0, 0,0xF4C9, 0, 0, 0, 0, 0, + 0, 0,0xF8D4, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xF8A6, 0,0xDECA,0xF2C6, + 0, 0, 0, 0, 0, 0,0xD7DA, 0, +0xD3D0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xD8C5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xEAE6, + 0,0xF3DD, 0, 0, 0,0xE4DA, 0, 0, + 0, 0, 0, 0, 0, 0,0xF6E4, 0, + 0, 0, 0, 0,0xF6F2, 0,0xDFC2, 0, + 0, 0, 0, 0, 0, 0, 0,0xD9FD, + 0, 0, 0,0xCCF6, 0, 0,0xD3BA, 0, + 0, 0, 0, 0, 0, 0,0xE4AF, 0, + 0, 0, 0,0xF9E1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xF0A6, 0, 0, 0, +0xCBD3, 0, 0, 0,0xE0BC, 0,0xF4CA,0xD4FA, + 0,0xFDAA,0xF9E2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xF4B7,0xFDC2,0xFCB0, 0,0xFDEC,0xCAE2, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xFDBD, + 0,0xEAE7,0xDFC3,0xD1D2,0xCEE2, 0,0xD3A4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xFDAB, 0,0xDFE0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xF2C7, 0, 0, 0, + 0, 0,0xE7F0, 0,0xD0EE, 0, 0,0xF3AA, + 0, 0, 0,0xDECB,0xF6B8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE1F5,0xF1B3, 0, + 0, 0, 0, 0, 0, 0,0xF7A3, 0, + 0,0xCAA9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xCFA5, 0, 0,0xDFC4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE1B0, + 0, 0,0xF0BF, 0,0xF6A4, 0,0xE3B6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xFAC6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD0EF, 0, 0,0xFDED, 0, 0, 0, 0, + 0, 0, 0, 0,0xDDC4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xFCF7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE6BF, 0, 0, + 0, 0, 0, 0,0xDEAD, 0,0xFABF, 0, + 0, 0, 0, 0,0xE5F1, 0, 0, 0, + 0, 0, 0, 0,0xEDC4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xD2A5, 0, 0,0xFDEE, 0, 0, + 0,0xF5B6, 0, 0, 0, 0, 0, 0, + 0, 0,0xE1F6,0xDECC, 0, 0,0xFCDE, 0, +0xECD7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xCDDD, 0, 0, 0, 0, 0, 0, 0, + 0,0xD6B7,0xCDB3, 0, 0, 0, 0, 0, + 0, 0, 0,0xF8D5,0xE5D8, 0, 0, 0, +0xCFEA, 0, 0,0xCFD0, 0,0xEACC, 0, 0, + 0, 0,0xEAAE,0xEAAD, 0, 0,0xD3F1, 0, +0xD3A5, 0, 0, 0, 0, 0, 0,0xF7CF, + 0, 0, 0, 0, 0, 0, 0, 0, +0xEEA4, 0, 0, 0, 0,0xD0A4, 0, 0, +0xF2A2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xD0F0, 0, 0, 0, 0, +0xF2A3, 0,0xF7F8, 0, 0, 0, 0,0xD0B3, + 0, 0,0xDBA9, 0, 0,0xD3BB,0xCAEC, 0, +0xF1A6,0xCBD5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xF7E7, 0, 0,0xCDDE, 0,0xF7A4, 0, + 0, 0,0xF8C0, 0, 0, 0,0xD3DD, 0, +0xCCD0, 0, 0, 0, 0,0xCFA6, 0, 0, + 0, 0, 0, 0,0xF6F3, 0, 0, 0, + 0, 0,0xE1F7, 0, 0, 0, 0, 0, +0xD3DC, 0, 0,0xFAFE, 0, 0, 0, 0, + 0, 0, 0,0xFAA7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xEBD9, 0,0xCFA7,0xEAAF, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE4EF, 0, 0, 0,0xE9B9, +0xF1D8, 0, 0,0xD8D8, 0, 0,0xE0F2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE6B4, +0xDCFC, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xF3F1, 0, 0, 0,0xE3D0, 0, 0,0xF2FB, + 0,0xDBC6,0xD0F1, 0,0xD0F2, 0, 0, 0, +0xCFDC, 0,0xD3D1, 0, 0,0xCCB1,0xF7D8, 0, +0xCBA8,0xEBBC,0xE4BE, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xF4DC, 0, + 0,0xDCC2, 0, 0,0xF0A7, 0, 0,0xE6C0, + 0, 0,0xCAED, 0, 0, 0, 0,0xE8EB, +0xE5E8,0xDCC3, 0, 0,0xEDDE,0xD3F2, 0, 0, + 0, 0,0xCCF7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xCED4,0xE7AB, 0, 0, 0,0xCBC3, + 0,0xE1B1, 0, 0,0xF7B2, 0, 0,0xD3F3, +0xD3D2, 0,0xF5C0, 0, 0, 0,0xDFDD, 0, + 0,0xEEF3,0xE7F1, 0,0xFDB4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xF2C8, 0, 0, + 0,0xF3D2, 0, 0,0xEEF4, 0,0xE2D3, 0, + 0, 0, 0,0xCCD1, 0,0xDFEA, 0, 0, + 0,0xE9BA, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xD9D7, 0, 0, 0, 0, + 0, 0, 0, 0,0xF5CD, 0,0xF1F2,0xFAC7, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD9F8,0xD4C2, 0, 0, 0, 0,0xF6E5, 0, + 0, 0, 0,0xDDC5, 0, 0, 0, 0, + 0, 0,0xE7F2,0xEDDF, 0, 0,0xCACB, 0, + 0,0xDBFA, 0, 0, 0,0xE8B5, 0,0xD3A6, + 0, 0, 0, 0, 0, 0,0xFDB5, 0, + 0,0xF9C9, 0,0xE4E2, 0,0xFBBD, 0, 0, +0xD7A4,0xCEC5, 0, 0, 0, 0,0xCED5,0xD6E6, + 0, 0, 0, 0,0xE5BD, 0, 0, 0, + 0, 0, 0,0xDECD,0xECF3, 0, 0,0xEDE0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xECEC,0xFBBE,0xDFEB, 0,0xE1F8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xF9BE, + 0, 0, 0, 0,0xD0F3,0xE0AA,0xE8E2, 0, + 0,0xE2D4,0xD2FD, 0,0xE5A8, 0, 0, 0, + 0, 0,0xD9D3, 0, 0, 0, 0,0xD3DE, + 0,0xF4B8,0xF7BC,0xDCFD, 0,0xE8EC,0xE4E7, 0, + 0,0xE3F7, 0, 0, 0, 0, 0,0xECA8, + 0, 0, 0, 0, 0, 0,0xFAF1, 0, + 0, 0, 0, 0,0xE5F2, 0, 0,0xD0F4, +0xD2AF,0xDCE5, 0, 0, 0, 0,0xD0A5,0xF1B4, +0xFCB1,0xCCF8, 0, 0,0xDDC6,0xFAD1, 0,0xF7DF, + 0, 0,0xFAA8, 0, 0, 0, 0, 0, +0xEEF5, 0,0xDECE, 0, 0, 0, 0,0xE7F3, + 0, 0,0xF7AC,0xEBC4,0xEDE1,0xE0AB,0xDDC7, 0, + 0, 0, 0,0xD2B3,0xD2BF, 0, 0, 0, +0xCACC, 0, 0, 0, 0,0xFBBF, 0, 0, + 0, 0,0xE5FD,0xDDE5,0xD8CD, 0, 0, 0, + 0, 0,0xECF4, 0, 0, 0, 0, 0, + 0, 0, 0,0xD0F5, 0, 0,0xE8ED,0xD0D2, + 0,0xD9D8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xF6E6, 0, 0, +0xDBAA, 0, 0, 0,0xF7E0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xD8D9, 0,0xF4A3, 0, 0,0xF4DD, 0, + 0, 0, 0,0xEFD1, 0, 0,0xD9B5, 0, + 0,0xEDAB, 0,0xE3B7, 0, 0, 0, 0, +0xEEBB,0xCDB4, 0,0xE0F3,0xEACD, 0, 0, 0, + 0,0xECF5,0xE8EE, 0,0xCBA9,0xF1AF, 0, 0, + 0, 0, 0, 0, 0, 0,0xCACD, 0, +0xECA9, 0,0xF2EB, 0,0xFDEF, 0,0xF9F3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE6C1, 0, 0,0xECD8, 0, 0, 0,0xEDAC, + 0,0xEACE, 0,0xE8DF, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xDECF, 0, 0, 0, 0, 0, 0, +0xD2A6, 0, 0,0xE7F4,0xD1D6, 0, 0,0xE6C2, +0xE3E3, 0, 0, 0, 0,0xE4B0, 0, 0, + 0,0xD8B4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xF6A5, 0, + 0, 0, 0, 0,0xF3DE, 0, 0, 0, + 0,0xD7A5, 0, 0, 0, 0,0xF7E8, 0, + 0,0xE8C6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xFBE6, 0, 0, 0, 0, 0, + 0, 0,0xDDE6, 0, 0, 0,0xDCFE, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xD8DA, 0, 0, 0, 0, 0, + 0, 0,0xDAAC,0xEAB0, 0, 0, 0, 0, + 0, 0, 0, 0,0xE3B8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xCAAA,0xE1F9, 0,0xEAB1, 0, 0, 0, + 0,0xF2EC, 0, 0,0xFAEE, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xEED5, 0, 0, 0, 0,0xF9F4, 0, + 0,0xD2EC, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xFBFB, 0, 0, + 0,0xFDF0, 0,0xE0BD,0xCEE3, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xF8C6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xDEAE, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xDFC5, 0, 0,0xE5BE, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xEDAD,0xFAEA, 0, 0,0xCDEE,0xEDA6, 0,0xEDAE, +0xF0ED, 0,0xDDA1, 0,0xEDAF,0xFCF8, 0,0xD8EB, + 0, 0, 0,0xCCF9,0xCDB5, 0, 0, 0, + 0,0xFAA9, 0,0xE1DD, 0, 0, 0, 0, +0xE2D5,0xEDCF, 0, 0, 0,0xDDA2, 0, 0, +0xF9CA, 0,0xEAE8, 0,0xE5ED, 0, 0, 0, + 0, 0, 0, 0, 0,0xD3EB, 0,0xE9D4, +0xE1FA,0xE4CC, 0,0xE1E4,0xE8C7, 0, 0,0xCEDB, + 0, 0, 0,0xDCD5, 0,0xF7B5,0xFCF3,0xF0F3, +0xCEAF,0xF1B5,0xEFD2,0xE8C8,0xEBF1, 0, 0, 0, + 0, 0,0xCBD4,0xE0BE,0xE3F8,0xEAE9,0xFCB2, 0, + 0, 0, 0, 0,0xE0F4, 0,0xCFE0, 0, +0xEEA5, 0, 0,0xFAAA,0xE6C3,0xE1B2,0xCAAB, 0, +0xE3E4,0xE9BB, 0, 0, 0, 0, 0,0xE2D6, +0xF3F2, 0,0xEED6,0xEAB2,0xD0F6,0xECD9,0xDACB,0xCFA8, + 0, 0, 0, 0,0xDDA3, 0, 0, 0, +0xD8DB, 0,0xF9CE,0xE9D5,0xE3D1, 0, 0,0xD2BC, + 0, 0, 0, 0, 0, 0,0xD8AC,0xF3CC, + 0,0xCDFB,0xF6D6, 0,0xE7F5,0xE8EF,0xE3F9,0xD2BB, +0xF3F3,0xE3FB, 0,0xDED0,0xCEB0, 0,0xD6F7,0xF1D9, + 0, 0, 0, 0, 0,0xF5C1,0xDCC4, 0, +0xF5BB, 0,0xDED1, 0, 0, 0, 0, 0, + 0,0xDCE6, 0, 0,0xDED2, 0, 0,0xEDE2, +0xEEF6,0xEACF,0xF0EE,0xE3FC, 0,0xD3DF,0xD3F4,0xE1B3, + 0,0xE1B4, 0, 0, 0, 0,0xF4D3, 0, + 0,0xDFC6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xE9D6, 0, 0, 0, +0xDBAB, 0, 0, 0, 0, 0, 0, 0, + 0,0xF6A6, 0, 0, 0, 0, 0, 0, +0xE3B9,0xEBC5,0xF4A9,0xCDB6,0xD2F9, 0,0xDAAD,0xD2E3, +0xCFD1, 0, 0, 0, 0,0xCBDC,0xCCFA, 0, +0xCFDD, 0, 0,0xE8A9, 0,0xE3BB,0xE3BA, 0, + 0,0xE0DA, 0, 0, 0,0xEEF7, 0, 0, + 0, 0, 0,0xDCB3, 0, 0, 0, 0, +0xD3F5, 0,0xD7A6, 0,0xF6B5,0xD7DB, 0, 0, + 0, 0, 0, 0,0xE1D5, 0, 0,0xD4EA, + 0,0xDFA3, 0, 0, 0, 0, 0, 0, + 0,0xFDDF, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD0F7,0xEDD4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xCBAA, 0, 0, 0, 0, 0, 0, + 0,0xE4DB, 0,0xE1FB,0xCBA2, 0, 0, 0, + 0,0xD3E0, 0,0xE4BF, 0,0xFBC0, 0,0xDABE, +0xE4CD, 0,0xD6B9, 0, 0, 0,0xEFC0, 0, +0xE1FC, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xF6B9, 0, 0, 0, 0, 0, 0, +0xDFC7, 0, 0, 0, 0, 0, 0, 0, +0xE4B1, 0, 0, 0, 0, 0, 0,0xDCE7, +0xDCE8, 0, 0, 0,0xFAD6, 0,0xD3F6, 0, + 0, 0, 0,0xF1DA, 0,0xFAF2, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE2FD, + 0, 0, 0, 0, 0,0xD5CF,0xD0F8, 0, + 0,0xCDDF, 0, 0,0xF5CB, 0,0xE4F0,0xCBAB, + 0,0xD7C4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE2FE, + 0,0xDDDA, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xDAAE,0xCAEE, 0, 0, 0, +0xD5B9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xE3A1, 0, 0,0xE8E3, 0, 0,0xF3AB, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xCFA9, + 0, 0, 0,0xD3F7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xD4F1, 0, 0, +0xCEE4, 0,0xE8F2, 0, 0, 0, 0, 0, + 0, 0,0xE5F5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE7AE, 0,0xD6BA, 0,0xDFEC,0xE4C0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE8E4, 0, 0, + 0, 0,0xD8B5, 0, 0, 0,0xE4DC, 0, + 0, 0, 0, 0, 0,0xF4B9,0xF1B6, 0, + 0,0xE2DE,0xE1B5, 0, 0,0xCDEF,0xF1A7,0xCEE5, +0xCBDD, 0, 0,0xD9E3, 0, 0,0xF3AC, 0, + 0,0xD0F9,0xECAB,0xDED3,0xF7E9, 0, 0,0xF9F5, + 0, 0, 0, 0, 0,0xE1DE,0xCBEE, 0, + 0, 0,0xE3BC,0xF8D6, 0, 0,0xDBEE, 0, + 0, 0, 0, 0,0xFDF1, 0, 0, 0, + 0,0xF7B6, 0, 0, 0, 0,0xF4DE, 0, + 0,0xF2ED, 0,0xDBD9, 0,0xF0A8, 0, 0, + 0, 0, 0, 0, 0,0xE1FD, 0, 0, + 0, 0, 0,0xDED4, 0,0xE0AC, 0, 0, + 0, 0, 0,0xEDE3, 0, 0,0xD3E1, 0, +0xDFC8, 0, 0, 0, 0,0xD9B6, 0,0xFDAC, +0xEFD3, 0, 0, 0,0xE4C1,0xF8EB, 0,0xDBAC, + 0, 0, 0, 0,0xFCC6, 0, 0, 0, + 0, 0, 0, 0, 0,0xD8AD, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xF6BA, + 0,0xDBDF,0xD3D3,0xF8C7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xCACE,0xF8C1,0xD2B4, 0, 0,0xDCB4, +0xFAB9,0xCACF, 0,0xFCB3,0xEAEA,0xEAEB,0xD0FA, 0, + 0, 0, 0, 0,0xEDE4, 0, 0,0xDDE7, + 0, 0,0xDFC9, 0, 0, 0, 0,0xDFED, + 0, 0, 0, 0, 0,0xEEBC, 0,0xEFC1, + 0, 0,0xCCD2, 0,0xDDA4, 0, 0, 0, +0xDFCA, 0, 0, 0, 0, 0,0xD3F8,0xF1A8, + 0, 0, 0,0xCDB7, 0,0xEFD4, 0, 0, + 0, 0, 0, 0, 0,0xE4DD,0xDFEE,0xCBAC, +0xE9BC, 0, 0, 0, 0, 0,0xEAEC, 0, + 0, 0,0xDFCB, 0, 0, 0, 0, 0, +0xF9BF,0xD6AF,0xD5C6, 0, 0, 0, 0, 0, +0xCFAA, 0, 0,0xCEA9, 0, 0,0xD6F8, 0, + 0, 0,0xF1B7,0xEEF8, 0, 0, 0,0xD9D9, +0xF3DF, 0,0xF8C8,0xCEC6, 0, 0, 0, 0, + 0, 0, 0, 0,0xD5E6, 0, 0, 0, + 0, 0, 0,0xF4E6, 0, 0,0xE6C5,0xEFD5, + 0, 0,0xCBEF,0xFCDF, 0, 0, 0, 0, + 0,0xDCA7, 0, 0,0xD6E7, 0, 0, 0, + 0, 0,0xF8C9, 0, 0, 0, 0,0xE3D2, + 0,0xE3BD, 0,0xCFE1,0xF0C0,0xECDA, 0,0xDDD7, +0xFBF0, 0, 0,0xECAC, 0, 0, 0,0xF0A9, + 0, 0, 0, 0, 0, 0,0xFAD7,0xFBC1, + 0,0xD2C0, 0, 0, 0, 0, 0, 0, + 0,0xE5B0, 0, 0, 0,0xEDE5, 0, 0, + 0, 0,0xCBAD, 0,0xF9B0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xF7A5, 0,0xCBAE, 0,0xDAAF, 0,0xD8B6, 0, + 0, 0, 0, 0, 0, 0,0xD3A7,0xFBB2, + 0,0xFDC4, 0,0xECAD, 0, 0, 0, 0, + 0, 0,0xFBA1, 0, 0, 0,0xE5E9,0xE9EE, + 0,0xF3F4,0xF8F3,0xF0C1,0xDEAF,0xF8B0, 0, 0, +0xF3E0,0xE7AF, 0, 0, 0, 0, 0,0xDBAD, + 0,0xE6B5, 0, 0,0xF9A8, 0, 0,0xDDD8, +0xE8D9,0xEFD6, 0, 0, 0,0xD3E2, 0,0xE2DF, + 0, 0,0xFCE0,0xD7C8,0xFDAD, 0, 0, 0, +0xDFEF,0xCCD3,0xD3F9, 0, 0, 0, 0,0xD4F0, +0xDBC7,0xDED5, 0, 0, 0, 0,0xF0F4, 0, +0xD5D0,0xE5D9, 0, 0, 0, 0, 0, 0, +0xFCC7,0xDCD6,0xE2E0, 0, 0, 0,0xDAB0, 0, + 0, 0, 0, 0, 0,0xF3A3, 0,0xD3EC, + 0,0xF4CB, 0, 0, 0,0xFDC5, 0, 0, + 0, 0, 0,0xE3FD, 0,0xF9B1, 0, 0, + 0, 0, 0, 0,0xD0FB,0xECDB, 0, 0, + 0, 0, 0, 0, 0, 0,0xF5BC,0xF2A4, +0xD8CE,0xD8CF, 0, 0, 0, 0, 0, 0, +0xF5F7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xF6E1, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xD2B7, 0, 0, + 0, 0, 0, 0, 0,0xFBEC, 0,0xDDC8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE4E8, + 0, 0,0xD2C1, 0, 0, 0,0xF8D7, 0, + 0, 0, 0, 0,0xD6BB,0xDED6, 0, 0, +0xF7BD,0xECAE, 0, 0, 0,0xD0E1, 0,0xE0F5, +0xEAB3, 0,0xCED6, 0, 0, 0, 0,0xCCA5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xECF6,0xE2E1,0xE3BE, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xFCC8, 0, 0, +0xCDF0, 0,0xF9F6, 0, 0,0xDFF0, 0, 0, + 0,0xE5BF, 0, 0, 0,0xCEBF, 0, 0, + 0, 0,0xFCE1,0xEDB0,0xFDD1,0xF6BB, 0, 0, +0xF9CF,0xEBDA,0xCAC1, 0,0xD2B8,0xCDF1, 0,0xE3D3, +0xFDE6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE6ED, 0, 0, + 0,0xE3FA, 0, 0,0xF0AA,0xF9D0, 0, 0, + 0, 0, 0, 0,0xFCE2, 0,0xF8A7, 0, + 0, 0,0xE1E5,0xEEF9, 0, 0, 0,0xE7F6, +0xEAED, 0, 0,0xFCB4,0xF5C2, 0, 0,0xD7DC, + 0, 0, 0, 0, 0, 0, 0, 0, +0xF0F5, 0,0xDDE8,0xD3ED,0xF5FC, 0,0xDABF, 0, +0xCCFB, 0, 0, 0,0xD3FA,0xF4A4, 0, 0, + 0, 0, 0, 0, 0,0xEFD7, 0,0xD4C3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xFBE3, 0, 0, 0, 0, 0, 0, + 0, 0,0xFBED, 0,0xE0AD, 0, 0,0xEAEE, +0xFBB3,0xE4C2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xF6E7,0xD2DD, 0,0xDFCC, 0, 0,0xFCC9, 0, + 0,0xE5A9,0xE0F6,0xF6B3, 0, 0, 0, 0, + 0,0xE1FE, 0, 0, 0, 0,0xCBF0, 0, +0xEAEF,0xEAF0, 0, 0, 0,0xDAC0,0xF8B4,0xEBF2, + 0, 0, 0, 0, 0,0xE4C3, 0, 0, + 0, 0,0xE9D7,0xE4F1, 0, 0, 0,0xCAEF, + 0, 0, 0, 0, 0, 0, 0,0xCED7, + 0, 0, 0, 0, 0, 0, 0, 0, +0xFCCA, 0, 0, 0,0xF3E1, 0, 0,0xCBC4, + 0, 0, 0, 0,0xE3E5, 0,0xCBC5,0xEAB4, + 0, 0,0xE9BD, 0,0xD7C9, 0, 0,0xEBDB, +0xEDB1, 0,0xCCC3,0xF7BE,0xFCCB, 0, 0, 0, + 0, 0, 0,0xF8F4, 0,0xD9B7, 0, 0, +0xF3D3,0xF3D4, 0, 0, 0,0xF7E4, 0,0xF7D1, + 0, 0,0xD8B7,0xCEB1,0xCAC2, 0, 0,0xFBB4, +0xCBC6, 0, 0,0xF0F6, 0, 0,0xD5E7, 0, +0xEAD0, 0, 0, 0, 0, 0,0xCCD4,0xCBAF, + 0, 0, 0, 0, 0,0xF4AA,0xE9AF, 0, + 0,0xF5C3,0xE9D8, 0, 0, 0, 0, 0, + 0, 0,0xDDE9, 0, 0, 0,0xF1F3, 0, +0xD5FB,0xDEBB, 0, 0,0xF4FB, 0, 0, 0, +0xFDF3,0xFDF2,0xF7A6, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xDDC9, 0, 0,0xD4D3, + 0,0xCCA8, 0,0xDAC1,0xCCD5, 0,0xD9E4, 0, + 0, 0,0xFACA, 0, 0, 0,0xE5E3, 0, + 0, 0,0xD3BC, 0, 0, 0,0xCAF0, 0, + 0, 0, 0,0xD0C4, 0, 0, 0,0xCAD0, +0xFAAB,0xEBEB,0xE7F8,0xD9E5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xD1D7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xF3A4, 0, 0, 0,0xD4FB,0xFCE3, +0xFAD8, 0,0xF3D5, 0,0xCFAB, 0, 0,0xEBF3, +0xD5FC, 0, 0, 0, 0, 0, 0,0xD3D4, +0xCDFC, 0,0xD9E6, 0,0xE2F9,0xE2A1,0xEBD4, 0, +0xE0F7,0xE4B2,0xCCFC, 0, 0, 0,0xFBE4, 0, + 0, 0,0xF4AB, 0, 0, 0, 0,0xD0BD, + 0,0xCAF1, 0, 0, 0, 0, 0, 0, + 0, 0,0xEFB8, 0, 0, 0,0xD7C0, 0, +0xEEFA,0xFDF4, 0, 0,0xD3E3, 0,0xFBC2, 0, + 0, 0, 0, 0, 0, 0,0xD5E8,0xDBAE, +0xE1B6,0xF8B7, 0, 0, 0, 0, 0,0xE0BF, +0xFBC3,0xDDEA, 0,0xE2A2, 0,0xEEA6, 0, 0, + 0, 0, 0,0xF6E8, 0, 0, 0, 0, +0xF6F5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xDDCA, 0, + 0,0xD0E2, 0, 0, 0, 0,0xDDA6, 0, + 0,0xDDEB, 0, 0,0xE4F9, 0, 0,0xE3AF, +0xD0FC, 0, 0, 0,0xF4FC, 0, 0, 0, + 0,0xCCBC,0xF7EA, 0, 0, 0, 0, 0, + 0,0xE5E4,0xDFF1, 0, 0,0xF7E1, 0,0xF9F7, +0xEFB9, 0, 0,0xF8D8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xF9A9, 0, 0, 0, 0, + 0,0xF8D9, 0, 0, 0,0xEEBD, 0, 0, + 0,0xD8C6, 0, 0,0xE4E3,0xF5CE, 0, 0, + 0, 0,0xDDD9, 0, 0, 0, 0,0xD9E7, +0xD2B9,0xD5C3, 0, 0,0xDAE5,0xDAD0, 0,0xD1D9, +0xCED8, 0,0xCBDE,0xF4AC,0xDAFB, 0,0xF6E9,0xE8F3, +0xCFAC,0xF0F0, 0,0xF4FD,0xDBC8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xCEC0,0xE3D4,0xD1CF,0xF1F5, + 0,0xCDF2, 0,0xCFEB, 0, 0, 0,0xCDB8, + 0, 0, 0, 0, 0, 0,0xE3A6,0xD1DA, + 0,0xF2A5, 0, 0, 0, 0, 0,0xF2A6, + 0,0xE4CE, 0, 0, 0, 0, 0, 0, + 0,0xD3FB, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xF1A9, 0, 0, 0,0xF2C9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xEFD8,0xE6C9, 0,0xD8B8,0xFAF3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xF3B5, 0, 0,0xF8A4, 0, 0,0xD1F3, +0xE6C8, 0, 0, 0, 0,0xF8DA, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xDCE9, +0xDED7, 0, 0, 0, 0, 0,0xCBDF, 0, + 0, 0,0xCFEC, 0, 0, 0, 0,0xF4DF, + 0, 0,0xD1F4,0xD2BA, 0, 0, 0,0xDFF2, + 0, 0, 0,0xE1B7, 0, 0, 0, 0, +0xE2A3,0xD3FC, 0, 0,0xEDE6, 0, 0, 0, + 0, 0,0xDBC9, 0, 0, 0,0xE4FA, 0, +0xCFDE, 0, 0,0xCED0, 0, 0, 0, 0, +0xD5D3,0xF3F5,0xF7AE, 0, 0,0xEFC8, 0,0xCDF3, +0xF5CF,0xE5F3,0xF0C2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xCAD1, 0, 0, 0,0xEAF1, 0,0xD0A6, 0, + 0, 0, 0, 0, 0, 0, 0,0xD9DA, +0xF0AB, 0, 0, 0, 0, 0,0xEBE7, 0, + 0, 0,0xE5C0,0xFCB5, 0, 0, 0, 0, + 0,0xE4C4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xCCA9,0xFDC6, 0, + 0, 0, 0, 0,0xEAB5, 0,0xE5AA,0xDFBA, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE1DF, 0,0xDAD1, + 0, 0, 0, 0,0xE1B8, 0,0xE8F4,0xD3FD, + 0, 0, 0, 0,0xE2A4, 0, 0, 0, + 0, 0,0xF2CA, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xDAE6,0xF7B3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xFDCD, 0, 0, 0,0xF3B6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xEED7, 0, 0, 0, 0, 0, 0, 0, +0xF5C4, 0, 0, 0, 0, 0, 0, 0, + 0,0xD8A4, 0, 0, 0, 0, 0,0xF2A7, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD9B8,0xD9B9,0xEFC9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD6CE, 0, 0, 0, 0, 0, 0, 0, + 0,0xF7CB,0xDFAE,0xE8F5, 0, 0, 0, 0, + 0, 0,0xD2B5, 0, 0, 0,0xD3D5, 0, + 0, 0, 0, 0,0xF4CC,0xDAFC, 0, 0, + 0, 0, 0,0xD9E8, 0,0xF7EB,0xF5C9, 0, +0xF3BC, 0,0xDAD2, 0, 0, 0, 0, 0, + 0, 0, 0,0xD3B5, 0, 0, 0, 0, + 0,0xE8B6, 0, 0,0xD6CF,0xF4BA, 0,0xF7C9, + 0, 0,0xCCAA, 0, 0,0xF0C3,0xCCD6, 0, + 0, 0,0xD0D3, 0,0xD3BD, 0, 0, 0, +0xDBFB, 0,0xCBE0, 0, 0, 0, 0, 0, + 0,0xD3E4,0xF6F7, 0, 0,0xD5BA,0xF3CD,0xCBE1, + 0, 0, 0, 0,0xEBF4, 0, 0, 0, + 0, 0,0xF4AD, 0,0xFCAA, 0, 0, 0, + 0, 0,0xF7EC, 0, 0, 0,0xE8F6, 0, +0xDAE7, 0, 0, 0,0xF7CC, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE5C1, 0, 0, 0, 0,0xE0EE, 0, 0, + 0, 0, 0,0xD5FD, 0, 0, 0, 0, + 0, 0,0xCEE6,0xFCAB,0xD5BB, 0, 0,0xF2A8, + 0, 0, 0, 0, 0, 0,0xE2A5,0xCDB9, +0xEAF2,0xCBC7, 0,0xCDF4, 0, 0,0xDBAF,0xEFD9, + 0, 0, 0, 0, 0,0xCDBA, 0, 0, +0xFCF9, 0, 0, 0, 0,0xDFF3,0xCEE7,0xDAC2, + 0,0xCFAD, 0, 0, 0, 0,0xE7F9,0xF8A8, + 0, 0, 0, 0, 0, 0,0xF3E2, 0, + 0, 0,0xCAF2,0xDFA4, 0, 0,0xD4C4, 0, + 0, 0, 0, 0,0xCCD7,0xE5C2, 0, 0, + 0, 0,0xCDBB, 0,0xEFDA,0xEED8, 0,0xDDA7, +0xE2A6, 0, 0, 0, 0, 0,0xE0C0, 0, + 0, 0,0xD6B0,0xF8CA, 0,0xFCFA, 0,0xD9FE, + 0, 0, 0, 0,0xDEB0, 0, 0, 0, +0xDDEC,0xDAE8, 0, 0, 0, 0, 0,0xD4E0, + 0,0xD6F9, 0,0xCDD7,0xDED8, 0, 0,0xF2F8, + 0,0xE4D6, 0, 0,0xD0C5,0xF4AE, 0,0xDDA8, + 0, 0, 0,0xEDC5,0xF3D6, 0, 0,0xDED9, +0xE3E6, 0, 0, 0, 0, 0, 0,0xD3A8, + 0,0xDBB0, 0, 0,0xE5DA,0xE3BF, 0, 0, + 0,0xDBB1, 0, 0, 0,0xD5E9, 0, 0, + 0, 0, 0,0xE0C1,0xEFDB, 0, 0,0xF0E9, + 0, 0,0xD7B2, 0, 0, 0, 0,0xD0FD, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD9E9, 0, 0,0xD0FE, 0,0xECED,0xD3A9, 0, +0xF2A9,0xF0C4, 0, 0,0xE2E2,0xE9EF, 0, 0, + 0,0xF9D1, 0, 0,0xE9D9, 0, 0, 0, + 0, 0,0xE8DA,0xDAC3,0xDAC4,0xD4C5, 0,0xE7FA, + 0, 0, 0, 0, 0, 0,0xCDE0,0xE3B0, + 0,0xDBB2,0xFBC4, 0,0xF3E3, 0,0xD9A5,0xFBE7, +0xDDCB,0xD0D4, 0,0xE6B6,0xE0AE,0xFDDA, 0, 0, + 0, 0, 0, 0, 0, 0,0xDCB5,0xE0F8, +0xE7B1, 0, 0, 0, 0,0xF5F0, 0,0xD8DC, +0xEDC6, 0, 0, 0, 0,0xE1B9, 0,0xE3C0, +0xF9C0,0xE9F0, 0, 0,0xD9DB, 0,0xF3E4, 0, + 0, 0,0xDCB6,0xE4E9, 0, 0, 0, 0, + 0,0xF0C5,0xE3C1,0xFCCC,0xFCCD, 0, 0, 0, + 0,0xF2CB, 0,0xF2CC, 0, 0, 0,0xE4CF, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xF1DB, 0,0xFAD9, 0,0xF1B8,0xFDF5,0xE0F9, + 0, 0, 0, 0,0xE7FB,0xFCB7,0xFCE4,0xFBC5, +0xE3E7,0xD8B9, 0,0xF6F8, 0, 0,0xDCC5,0xCCD8, + 0, 0, 0,0xE0AF,0xF4E7, 0,0xEFDC,0xCFFC, +0xEFDD, 0,0xF2AA, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xFDBE, 0, 0,0xCAAC, +0xFDBB,0xFDC7, 0, 0, 0, 0,0xE7B2, 0, +0xEAD1,0xDFF4, 0, 0, 0, 0,0xD1EC,0xE4DE, +0xE5C3, 0, 0, 0, 0,0xD9A6, 0, 0, +0xCDBC, 0,0xF3E5, 0, 0, 0, 0, 0, + 0, 0, 0,0xEDD5, 0, 0,0xD9BA, 0, + 0, 0,0xEDE7,0xFBB5,0xF8EC, 0, 0, 0, + 0,0xE0E7, 0,0xCCD9, 0, 0,0xD4C6, 0, + 0, 0, 0, 0,0xE7A5, 0,0xD5F5,0xD3BE, + 0,0xFCFB, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE4F2, 0, + 0,0xDFF5, 0, 0,0xE8F8,0xF8ED, 0, 0, +0xCEC7, 0, 0, 0, 0, 0,0xFDF6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE8D8, 0,0xCDD8,0xE7D6,0xCCDA, 0, 0,0xCAE3, +0xDFF6,0xF0C7,0xF0C6, 0,0xD8BA, 0,0xF1F4,0xF4F0, +0xF5CC, 0, 0,0xFCE5, 0, 0, 0, 0, +0xEAC5,0xEAF3, 0,0xDDDB, 0,0xDCD7, 0, 0, + 0, 0, 0, 0,0xDEFD,0xF2F9, 0,0xD5C7, + 0, 0, 0,0xD8D0, 0,0xF0C8,0xD1A1,0xD1A2, + 0, 0, 0, 0, 0, 0,0xD9D4,0xD6E8, +0xD9CA, 0,0xDAB1,0xD8C7,0xDCE2,0xF3CE,0xF5F4, 0, + 0,0xF1B9, 0, 0,0xDAD3, 0,0xF6EA, 0, + 0, 0,0xCFF5, 0, 0,0xFDAE, 0, 0, + 0, 0, 0, 0, 0, 0,0xCAD2, 0, + 0,0xDFB4, 0, 0, 0, 0,0xD7DD,0xFABA, +0xEEA7,0xF5BD, 0,0xF8F5, 0, 0,0xEDE8, 0, + 0, 0, 0, 0,0xD4E1, 0,0xD1A3,0xE1D6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xF9F8, 0,0xDBCA, +0xCBF9,0xD4D4, 0,0xD9DC, 0,0xEEBE, 0,0xF7ED, + 0, 0, 0,0xD2EE, 0, 0,0xE1E6,0xF7F9, + 0, 0, 0, 0, 0, 0, 0,0xDDED, + 0,0xE8DB, 0,0xDBB3, 0, 0, 0,0xD1F7, +0xE0B0, 0, 0,0xD4E2, 0,0xF6D7, 0,0xD7F9, + 0, 0,0xD8DD, 0,0xCDFD,0xF2AB, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xCDBD, +0xF8C2, 0, 0,0xF2AC, 0, 0,0xCAAD,0xCAAE, +0xCFAE, 0, 0, 0, 0, 0,0xE3C2, 0, + 0, 0, 0, 0,0xDCB7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xDBDA, +0xD9BB,0xCAF3,0xF6D3,0xE6F8,0xEAF5, 0, 0, 0, + 0, 0,0xEAF6, 0, 0,0xF6F9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xCFAF, 0, 0,0xCAD3, 0, 0,0xCAAF, +0xD2B0,0xF1BA, 0,0xD7B3,0xE3C3,0xF3FD,0xDEDA, 0, + 0, 0, 0,0xDEDB, 0, 0,0xEFDE, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xE2E3,0xEEFB, 0, 0,0xDFF7,0xD7CA, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xCEE8,0xDBDB, 0, 0, 0, 0, 0, + 0, 0,0xF1BB, 0, 0, 0, 0,0xE9F1, + 0, 0, 0, 0, 0, 0, 0, 0, +0xFAB7,0xD0C6, 0, 0,0xCCAB,0xEEA8, 0, 0, +0xCBFA,0xF9F9,0xCCFD,0xD3FE, 0, 0, 0, 0, +0xE4D0, 0, 0, 0, 0, 0,0xF2EE, 0, +0xD4D5,0xDFCD, 0,0xFCB8,0xD1D0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xF2CD, 0, 0, + 0, 0, 0, 0, 0, 0,0xF7D2, 0, + 0, 0, 0, 0, 0, 0, 0,0xCAD4, + 0,0xD5D9, 0, 0, 0,0xD8DE, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xCDD9, + 0, 0, 0,0xEEA9,0xF6BC, 0, 0,0xCCDB, + 0, 0, 0, 0, 0,0xF0C9, 0,0xFCFC, + 0,0xE8C9,0xF4FE, 0, 0, 0, 0,0xE7FC, +0xD7DE, 0, 0, 0, 0,0xDEDC, 0,0xF0AC, +0xCCFE,0xCDE1, 0,0xE1BA, 0,0xDBEF,0xDAB2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xD1A5,0xDCB8, 0, 0, + 0,0xD8F6, 0,0xD1A4, 0,0xCDE2, 0, 0, + 0, 0,0xDCEA, 0, 0,0xF0F7, 0,0xF0CA, +0xD0BE, 0,0xDDDC, 0, 0, 0, 0,0xD4D6, +0xD3D6, 0, 0, 0, 0, 0, 0,0xEDD0, +0xCDA1, 0, 0, 0, 0, 0,0xDFB5, 0, + 0, 0,0xDFF8, 0, 0, 0, 0, 0, + 0,0xD4A1,0xCEB2, 0, 0, 0, 0, 0, +0xE8CA, 0, 0, 0, 0,0xEBF5, 0, 0, + 0, 0, 0, 0, 0,0xE3D5,0xF5D0, 0, + 0, 0,0xF5A1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xD9A7, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE5AB, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE6CB, 0,0xF5F1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xE5C5, 0, 0, 0, 0, 0, + 0, 0, 0,0xF9A3,0xE0DB,0xF6EB, 0,0xCBF1, + 0,0xD9EA,0xF5A2, 0, 0, 0,0xD7D1, 0, +0xD1F8,0xEAF8,0xEAF9,0xDAB3, 0, 0, 0, 0, +0xEFDF, 0, 0,0xF1EF, 0,0xE5F6,0xEEBF,0xE2E4, + 0, 0, 0, 0, 0,0xD0BF, 0,0xFAAC, +0xF5D1,0xE7B3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE9BE, 0, 0, + 0, 0, 0,0xF2CE,0xDBB4, 0, 0, 0, + 0, 0, 0, 0, 0,0xFCCE, 0,0xDDEE, + 0, 0, 0, 0, 0, 0,0xE7B4, 0, + 0, 0, 0, 0,0xD7B4, 0, 0, 0, + 0, 0, 0,0xF7B4, 0, 0, 0, 0, + 0,0xCDBE, 0,0xDAE9, 0, 0, 0, 0, + 0, 0, 0,0xCFB0,0xF7D9,0xF3E6, 0, 0, +0xCED9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xCEAA, 0,0xCBC8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xD0A7, 0,0xF0CB, 0,0xD0C7, + 0, 0,0xE4C5, 0, 0, 0, 0, 0, + 0, 0,0xDBE0, 0, 0, 0, 0, 0, + 0,0xD5DA, 0,0xD7A7, 0, 0, 0,0xEEC0, + 0,0xF8F6, 0, 0, 0, 0,0xF5D2,0xEDE9, + 0,0xD9BC, 0,0xE5C6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xF5A3, 0, 0, +0xDAD4,0xE2A7,0xFBFC, 0, 0,0xF1DC, 0, 0, + 0, 0, 0, 0,0xCAF4, 0, 0, 0, +0xE8FA, 0, 0,0xCEE9, 0, 0, 0, 0, + 0, 0,0xE9F8,0xE2E5, 0, 0, 0, 0, +0xD0B9,0xD4F2, 0, 0, 0, 0, 0,0xD1A6, + 0,0xDFCE, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xFCF4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD3AA, 0, 0, 0,0xCCAC, 0, 0, 0, + 0,0xEFE0, 0, 0, 0,0xE5E5,0xD0D5, 0, + 0, 0, 0, 0, 0, 0, 0,0xDBFC, + 0, 0, 0, 0,0xFCE6, 0, 0, 0, + 0, 0,0xCBFE,0xEDEA, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xDEB1, 0, 0, 0, 0, + 0, 0, 0,0xF9E3, 0, 0, 0, 0, + 0, 0,0xD4A2,0xCFF6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xD6D0, 0, 0, 0, 0, + 0, 0,0xD5EA,0xF1EE, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xFACB, 0, + 0, 0, 0,0xE5A1, 0, 0, 0, 0, + 0, 0, 0, 0,0xD5B1, 0, 0, 0, + 0, 0,0xCFED, 0,0xEDEB, 0, 0, 0, + 0, 0,0xD5B2, 0, 0, 0,0xD5BC, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xFDE2,0xF3AD, 0,0xFDDB, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xE9B0, 0, 0, 0, 0, 0, + 0, 0,0xD1A7, 0, 0,0xFDE3,0xCEB3, 0, + 0, 0, 0, 0, 0, 0,0xFDE4,0xFACE, + 0, 0, 0, 0,0xCAB0, 0,0xF7A7, 0, +0xCFB1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE6A2, + 0,0xFCB6,0xF2AD,0xEFE1,0xF3AE,0xDCC6,0xD9EB, 0, + 0, 0,0xE8E0, 0, 0, 0, 0, 0, + 0, 0,0xE1A8, 0, 0, 0, 0,0xD5F6, +0xCFFD, 0, 0,0xDEDD, 0, 0, 0,0xD9D1, + 0, 0, 0,0xE4EA,0xF2CF, 0,0xF7BF, 0, + 0,0xE2E6,0xE2A8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE3D6, 0, +0xEDD1, 0, 0, 0, 0, 0,0xE9F9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xD6B1,0xDEB2, + 0, 0,0xE0E8, 0, 0,0xD3AB, 0,0xEBDC, + 0, 0,0xDFAF, 0,0xCAC3, 0, 0,0xEEFC, + 0,0xFDC3, 0, 0, 0,0xEBF6,0xCFB2, 0, + 0, 0, 0,0xD9EC, 0,0xD9BD, 0,0xD8DF, + 0, 0,0xD4B8,0xEBBE,0xDDEF, 0,0xDDF0,0xDDF1, +0xDDF2, 0, 0,0xD9BE, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xFBC6,0xCFB3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xEEFD, 0, 0, 0, 0, 0, 0,0xE4AB, + 0,0xDAC5, 0,0xD8EC, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xD1A8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xE2A9, 0, 0,0xDEBC, +0xE7B5, 0, 0, 0, 0, 0,0xDBF0, 0, +0xEFE2,0xF1F0,0xCFB4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xDBF1, 0, +0xE0B1, 0, 0, 0, 0,0xDFA5, 0,0xF9D2, + 0, 0,0xE7FD, 0, 0,0xE6A3,0xFBF1,0xCBB0, +0xF2AE, 0, 0, 0, 0, 0, 0, 0, +0xCDE7, 0,0xE8DC, 0, 0,0xE7D7, 0, 0, +0xF7C0, 0,0xD0E3, 0, 0, 0,0xDAA1, 0, + 0, 0,0xCCBD, 0, 0,0xD1A9,0xDDCC, 0, + 0,0xE3FE,0xD1AA,0xE8AA, 0,0xEAB6,0xF9FA,0xE6CC, +0xF6D8, 0, 0, 0,0xD4C7, 0, 0, 0, +0xD9CB, 0,0xD9D2,0xD3CB,0xD8F7,0xDAA9,0xF5F8, 0, + 0,0xDEDE,0xF2AF,0xF8A9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xD8C8, 0, 0,0xEEC1, 0, + 0, 0, 0,0xF9C1, 0, 0, 0, 0, +0xDDF3,0xEAFA, 0,0xF6BD,0xE1BB,0xCDBF,0xF4D4,0xE6CD, + 0,0xFCCF,0xFBA2, 0,0xE0DC, 0, 0, 0, + 0,0xF4BB,0xDAD5, 0,0xF9B2, 0, 0, 0, + 0, 0, 0,0xFBF2, 0,0xDBF6, 0,0xDEDF, + 0, 0, 0,0xDBF2, 0, 0, 0, 0, + 0,0xF8DC,0xF7EE,0xEBE8, 0,0xD2FA, 0, 0, +0xF1BC, 0, 0,0xFADA, 0, 0,0xDAEA,0xDAC6, +0xF7C1, 0, 0,0xE7B6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE5C7,0xD6AC, 0, 0, 0, + 0,0xDCC7, 0, 0, 0, 0, 0,0xE1A9, + 0,0xE2AA, 0,0xD5A6, 0, 0,0xD4D7, 0, + 0, 0, 0, 0, 0,0xF2D0, 0,0xEAFB, + 0,0xE0DD,0xFBF3, 0, 0, 0, 0, 0, + 0, 0,0xF1BD, 0, 0,0xE2E7,0xFDD7, 0, +0xCEC8,0xEAB7, 0,0xFCC0, 0,0xFDE7,0xF7EF, 0, + 0,0xD7B5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xEFBA,0xF1DD, 0,0xDEB3, 0, 0, 0, + 0, 0, 0,0xE8CB, 0, 0,0xF8DD, 0, + 0,0xFBC7,0xD5C8, 0,0xD7DF, 0,0xDDA9, 0, + 0, 0, 0, 0,0xE9B1, 0, 0,0xFAAD, +0xF6D9,0xFAF4, 0, 0, 0, 0, 0,0xF8AA, + 0, 0, 0, 0, 0,0xE6EE, 0,0xCCDC, +0xE1BC,0xE0EF, 0, 0,0xE9BF,0xFCFD,0xE6CE, 0, + 0,0xE1D7, 0,0xE6CF, 0,0xF4F1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE4F3, + 0, 0,0xE4FB, 0, 0,0xF9E4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xEFE3, 0, 0,0xCFEE,0xF6BE,0xE0B2,0xFCFE,0xD1AB, + 0, 0, 0,0xD7FA, 0, 0, 0,0xFBC8, + 0,0xE2D7, 0, 0, 0, 0, 0, 0, +0xD4A3,0xF0F8,0xD7A8, 0, 0, 0,0xE1E7, 0, + 0,0xD3BF, 0, 0, 0, 0, 0, 0, +0xEFE4, 0,0xD7C5,0xEBE2, 0, 0,0xFCE7, 0, + 0,0xE4A2, 0,0xE2E8, 0,0xE6D0, 0,0xFBE8, +0xF4E8,0xE5F4,0xF4BC,0xF4D5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xDFB6, + 0,0xFCB9,0xEEC2,0xCAF5, 0, 0, 0,0xEFE5, +0xCBE2,0xD4A4, 0,0xDEE0,0xDAFD,0xE4C6,0xE8BE, 0, + 0, 0, 0,0xE0DE,0xF6B4,0xEAD2, 0,0xF9FB, + 0, 0,0xE0C2, 0,0xCAE4, 0,0xE7B7, 0, +0xEAFD, 0,0xD9DD, 0,0xDAB4,0xEEAA,0xFBE9, 0, + 0, 0, 0,0xDBCB,0xDAB5, 0, 0, 0, + 0, 0,0xF1BE, 0, 0,0xD3AC, 0, 0, + 0, 0, 0, 0, 0, 0,0xFBC9, 0, +0xDFCF, 0, 0,0xD3C0,0xE3D7, 0,0xEFE6,0xFCD0, + 0, 0, 0, 0, 0, 0, 0,0xE9C0, + 0, 0, 0,0xF5D3, 0, 0,0xECDC,0xF7B7, + 0, 0,0xEAB8,0xD1F9, 0, 0, 0, 0, + 0, 0,0xDCC8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xEAB9, 0, 0, 0, 0, 0,0xF1DE, 0, + 0, 0, 0, 0,0xD7B6,0xCFB5, 0,0xD9A8, + 0, 0,0xECEE, 0, 0,0xDDAA, 0, 0, + 0, 0,0xCDA2,0xE8AE, 0, 0, 0,0xE1BD, + 0,0xF2D1, 0, 0, 0, 0,0xE9C1, 0, + 0, 0,0xD2FC, 0, 0, 0, 0, 0, + 0, 0,0xDBB5, 0,0xF3E7,0xD8FE, 0, 0, + 0,0xFCD1, 0,0xEDB2,0xF4AF, 0,0xFBA3, 0, + 0,0xFCC1, 0,0xEEAB,0xD4A5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xF4F2, + 0, 0, 0, 0,0xEED9, 0, 0, 0, +0xFBCA, 0, 0, 0, 0, 0,0xCDE3,0xD8BB, + 0,0xE5DB,0xF8F7, 0, 0, 0,0xF6D4, 0, + 0, 0, 0, 0, 0, 0, 0,0xD7A9, + 0,0xCBC9, 0, 0,0xE6D1,0xF0CC, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD8AE, 0,0xF9D3,0xD5FE, 0, 0, 0, 0, + 0, 0, 0,0xD8BC,0xF2B0, 0, 0, 0, + 0,0xE2AB,0xF3E8, 0, 0, 0, 0, 0, +0xEFC2, 0, 0, 0, 0, 0, 0,0xEDEC, + 0,0xE7B8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xDAFE, 0, 0,0xCCBE, 0, 0,0xF2FC, +0xDAEB, 0,0xE2D8,0xEDD6, 0, 0,0xD6D1,0xE0B3, + 0, 0,0xFCD2, 0,0xEBC8, 0, 0, 0, + 0, 0, 0, 0, 0,0xD3C1,0xF0CD, 0, +0xCFF7, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xEDD2, 0,0xD4D8,0xDCC9,0xD7F1, 0, + 0,0xDFBB, 0, 0,0xF3A5, 0, 0, 0, +0xF4CD, 0, 0, 0, 0,0xF1BF,0xF8B1, 0, +0xE9FA, 0, 0, 0,0xFBCB, 0, 0,0xCAD5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xF9D4,0xF7CA, 0, 0,0xD6C8, + 0, 0, 0, 0, 0, 0,0xFCE8,0xF3BD, + 0,0xEEFE, 0,0xE7FE, 0, 0, 0, 0, + 0,0xD3C2, 0, 0, 0, 0,0xD3B6, 0, +0xCCAD,0xF6FA,0xD6B2,0xD2D8, 0, 0, 0, 0, + 0, 0,0xE7D8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE3A5, 0, 0, + 0, 0,0xE7B9, 0, 0, 0, 0,0xF0AD, +0xFBCC,0xEBA1, 0, 0,0xD4A6, 0, 0, 0, + 0,0xFBCD, 0,0xD5BD,0xF1DF, 0, 0,0xF6FB, + 0,0xDEB4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xD5EB, 0, + 0,0xE5C8, 0, 0, 0,0xFBA4,0xD4B9, 0, + 0,0xDEE1, 0,0xE4A3, 0, 0, 0,0xD7B7, + 0,0xF8EE, 0, 0, 0,0xDEB5, 0, 0, +0xD6D2, 0,0xF9D5,0xE7BA,0xEBD5,0xD5F7,0xEFE7,0xE1BE, + 0, 0, 0,0xFAAE, 0, 0, 0,0xD6E9, +0xD6EE, 0, 0, 0, 0, 0, 0,0xE7BB, + 0, 0, 0, 0, 0, 0, 0,0xECCB, + 0, 0, 0, 0, 0, 0,0xD5B3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xCEB4, 0, 0, 0, +0xFBA5,0xE1EE, 0, 0, 0, 0, 0, 0, +0xF7A8, 0, 0, 0, 0,0xFBCE, 0, 0, + 0, 0, 0,0xD8BD, 0, 0, 0, 0, + 0, 0, 0,0xFBFD, 0, 0, 0, 0, +0xFCE9, 0, 0, 0, 0, 0, 0, 0, +0xCFB6, 0, 0, 0,0xEDC7,0xEEAC, 0, 0, + 0, 0, 0, 0, 0,0xCCDD, 0, 0, + 0, 0,0xF6A7, 0, 0, 0,0xE6FA, 0, + 0, 0,0xF5A4, 0, 0, 0, 0, 0, +0xFDDC,0xEDB3,0xCEC9, 0, 0, 0, 0, 0, + 0,0xEFE8, 0, 0,0xE1BF, 0, 0, 0, + 0, 0, 0,0xFADB,0xCBE3,0xF7A9, 0,0xFBA6, + 0, 0, 0,0xDCB9, 0, 0, 0,0xF1C0, +0xEDC8,0xEFC3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD6AD, 0, 0,0xFDCE, 0, 0, 0,0xE8A1, + 0, 0, 0, 0, 0, 0, 0, 0, +0xFBF4,0xD5A7, 0, 0, 0,0xF1F6, 0,0xE6D3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xCCDE, 0, 0, 0, 0, 0, 0, + 0,0xF8B2, 0, 0, 0,0xDCEB, 0, 0, + 0, 0, 0, 0,0xFDB6, 0, 0, 0, + 0,0xE5EA, 0, 0,0xF1E0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xDBCC,0xDDCD, 0, 0, 0,0xD4C8, 0, + 0,0xD9ED, 0, 0, 0, 0,0xF5A5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE6FB, 0, 0, 0, 0, 0,0xE6D4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xFDC8, + 0,0xD6A1,0xFDBF, 0,0xFCD3, 0,0xEFA1, 0, +0xE7BC, 0, 0, 0, 0, 0,0xD1EE, 0, + 0,0xE6D5, 0, 0,0xE9F2, 0,0xDFB0, 0, + 0, 0, 0, 0,0xD8E0,0xFCBA,0xFDAF,0xF0CE, + 0,0xDBE1, 0, 0,0xE5C9, 0,0xEDB4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE0C3, 0, 0, + 0, 0, 0, 0,0xE3D8, 0, 0, 0, + 0,0xE9FB,0xEAA8, 0, 0, 0, 0,0xFDB7, + 0, 0,0xFBA7, 0,0xE9C2, 0, 0, 0, + 0,0xFDF7, 0, 0, 0, 0, 0,0xE2D9, + 0, 0,0xDCEC, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xE8A2, 0, 0, 0, + 0,0xE6F0, 0, 0, 0, 0, 0, 0, + 0,0xFDF8,0xFDF9, 0, 0, 0,0xF6BF, 0, + 0,0xE7A7, 0,0xE6D7, 0, 0, 0, 0, +0xD4F3,0xD4C9, 0, 0, 0, 0,0xD6FA, 0, +0xD7F2, 0,0xE1C0, 0,0xDBE2,0xE6D8, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE7BD, + 0, 0, 0, 0, 0,0xF0CF,0xF3BE,0xE2AC, + 0, 0, 0, 0, 0,0xF5B7,0xE0F0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xFDB8,0xE3E8, 0,0xD4A7,0xE8FC, +0xFAD2, 0, 0, 0, 0, 0,0xF8EF, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD6D3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xD5B4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xF0D0, 0,0xF7F0,0xEEB3, 0, 0, +0xEABA, 0,0xEAD3, 0, 0,0xEDC9,0xDDAB, 0, + 0, 0,0xE5AC,0xFDA1, 0,0xDFD0,0xECB3, 0, +0xDFD1, 0, 0, 0, 0, 0,0xEDED,0xF8B8, +0xF7FA, 0, 0, 0,0xF8AB, 0, 0, 0, + 0, 0,0xF4E0, 0, 0, 0, 0, 0, +0xD4BA,0xE4B3, 0,0xE9DA, 0,0xDEB6, 0,0xD9BF, + 0,0xD9C0,0xD6EF, 0, 0, 0, 0,0xD9CC, + 0,0xDAAA, 0, 0, 0, 0, 0, 0, + 0, 0,0xDFE5, 0, 0, 0, 0, 0, + 0,0xF7E5, 0, 0, 0,0xCCB2, 0, 0, +0xDFF9,0xD7E0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xD4BB, 0, 0, 0, 0,0xFDFA, + 0, 0, 0, 0,0xCCB3, 0, 0,0xDBF3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xDFD2, 0,0xCECA, 0,0xEEDA, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE4E4, 0, +0xFBCF, 0, 0, 0, 0, 0, 0,0xCFB7, + 0,0xEEC3, 0, 0, 0, 0, 0, 0, + 0,0xCEEA, 0, 0, 0, 0, 0, 0, + 0,0xE2AD, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD7E1,0xFAF5, 0, 0,0xD5C9,0xF8AC, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xE7D9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xF3E9, 0, + 0, 0, 0,0xD8ED,0xE3C4,0xF0F1, 0, 0, + 0, 0, 0, 0, 0,0xE8E5, 0, 0, + 0,0xE0FA,0xEEC4,0xD9DE, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xEBA2,0xEBA3, + 0, 0, 0, 0, 0, 0,0xFCC2,0xEABB, + 0, 0, 0, 0,0xE8AB,0xDEE2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xEDEF, 0,0xE8A3, 0, 0, 0, 0,0xCFF1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD4BC, 0,0xFCEA, 0, 0, 0, 0, 0, +0xE7BE, 0,0xFCF2, 0, 0,0xD6B4, 0, 0, +0xE2AE, 0,0xD3B7,0xFACC, 0, 0, 0, 0, + 0, 0, 0, 0,0xFADC, 0,0xEDB5,0xE1E3, + 0,0xE8AC, 0,0xE8DD, 0, 0,0xEFE9, 0, + 0, 0, 0, 0,0xF4BD, 0,0xCFB8,0xE9DB, +0xD1AC, 0, 0, 0, 0, 0, 0,0xDAC7, + 0, 0, 0, 0, 0, 0, 0,0xEBC9, + 0,0xE8CC, 0, 0, 0,0xDEB7, 0, 0, + 0, 0,0xD6BC,0xD3E5, 0, 0, 0, 0, + 0,0xFADD, 0, 0, 0, 0, 0, 0, +0xDAD6, 0,0xCAB1, 0, 0, 0, 0, 0, + 0,0xDAC8,0xDFA6, 0,0xF9B3,0xF2D2, 0,0xCAC4, + 0, 0, 0, 0, 0, 0,0xCECB, 0, + 0,0xCDF5, 0, 0, 0,0xFDB0,0xD5A8, 0, +0xF1C1, 0, 0,0xE2E9,0xDCCA,0xECB4,0xFAC0, 0, + 0,0xFBA8,0xD0A8, 0, 0,0xDAEC, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xD9EE, + 0,0xE0FB, 0, 0, 0,0xEFEA,0xFADE, 0, + 0,0xE0C4, 0,0xCFB9, 0,0xD5CA,0xD7E2,0xE2AF, + 0,0xD7B8, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE8CD, 0, 0, 0, 0, + 0, 0, 0,0xF6DA, 0, 0, 0, 0, +0xEFA2,0xE2DA,0xF6FC, 0, 0,0xFBD0,0xD1AD, 0, +0xCDE4, 0,0xD1AE,0xDCED,0xE8CE, 0,0xF0F9,0xCEB5, +0xE6FC, 0, 0,0xD7FB,0xD0D6,0xDDF5,0xF7F1, 0, +0xF6FD, 0,0xDBF7, 0, 0, 0, 0,0xFBEA, +0xE9DC,0xD9C1, 0,0xF5F2,0xE0C5, 0, 0, 0, + 0, 0, 0,0xEAD4, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xF9C2, 0,0xEABC, + 0,0xD2C5,0xFBD1,0xE7C0,0xEBA5, 0,0xDFFA,0xE3A2, +0xD7B9, 0,0xE9C3, 0,0xE8FD,0xE8AF, 0, 0, +0xF2D3,0xFBA9,0xD8A5, 0, 0, 0, 0,0xD5CB, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xD0C8, 0, + 0, 0,0xD1AF,0xD7E3, 0, 0, 0,0xE0C6, + 0,0xD6A2, 0,0xEDF0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD7F3, 0, 0, 0,0xFCD4, 0,0xDAD7,0xCCDF, + 0,0xF2D4, 0,0xD1B0, 0,0xCCE0, 0,0xDBFD, +0xF3BF, 0,0xF0D1, 0, 0, 0, 0, 0, +0xFCBB, 0,0xE2B0, 0, 0,0xE6A5, 0, 0, + 0,0xE2DB, 0, 0, 0,0xDFDE, 0,0xE0C7, + 0, 0, 0, 0, 0, 0,0xF2EF, 0, + 0, 0,0xCCE1, 0, 0, 0, 0,0xD6EA, + 0, 0, 0, 0,0xE7C2, 0, 0, 0, +0xCEB6, 0,0xF3C0, 0,0xCDFE, 0, 0, 0, +0xFBD2, 0,0xF8F8,0xF7FB, 0, 0,0xE8BF, 0, + 0, 0, 0, 0, 0, 0,0xE8B7, 0, + 0, 0, 0, 0, 0, 0, 0,0xEDB6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xDCBA, 0, 0,0xCCB4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xF1F7, 0, 0, 0,0xE8B8, 0, 0, +0xCAF6, 0,0xE4A4,0xF4D6, 0, 0, 0,0xDFE6, + 0, 0, 0,0xDFA7, 0,0xDFE7,0xE1C1, 0, +0xE9C4, 0, 0,0xDCCB,0xE9C5, 0, 0, 0, +0xEFA3,0xEBA6,0xCBA3,0xE3E9, 0, 0, 0,0xD1FB, +0xEFA4, 0,0xEFEB, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xD0B4, + 0, 0, 0, 0,0xCDA3, 0, 0,0xE8E6, + 0,0xEFA5, 0,0xD3CC,0xDAED, 0, 0, 0, + 0,0xD7BA, 0,0xF2D5,0xF5E5,0xD9EF, 0, 0, + 0, 0,0xF9B4, 0, 0,0xD5D4,0xFDCF, 0, + 0, 0,0xDBE3, 0, 0, 0, 0,0xF1E1, +0xECB6, 0, 0, 0, 0,0xFBFE,0xD3D7, 0, +0xD1B1, 0,0xCBB1, 0, 0, 0, 0,0xD1B2, + 0, 0, 0, 0, 0, 0,0xCBB2,0xF1C2, + 0, 0,0xF4E1,0xF9B5, 0, 0,0xE1C3,0xE1C2, + 0,0xEBF7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xDFA8, 0, 0, + 0, 0, 0, 0, 0,0xCBCA, 0, 0, + 0, 0, 0,0xE6B9, 0, 0, 0, 0, + 0,0xF8DE,0xF9AA,0xCAF7, 0,0xEDB7, 0, 0, +0xD3B8,0xF2D6, 0, 0,0xD4D9,0xEEC5,0xF2F0, 0, + 0, 0,0xCAB2, 0, 0,0xDCBB, 0,0xF1F8, + 0, 0, 0, 0, 0,0xECB7, 0, 0, + 0, 0,0xE5CA, 0,0xF6C0,0xFDDD, 0, 0, +0xD4E3,0xCCE2, 0,0xF7D4, 0, 0, 0, 0, + 0, 0,0xD7E5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD3C3, 0,0xD8A6, 0,0xF6C1, 0, 0, 0, + 0, 0,0xDDF6, 0,0xCDC0, 0, 0, 0, +0xE5DC, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE5CB, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xE1C4, 0, 0, 0, 0, 0,0xE8B0, +0xF4B0,0xF3EA,0xDAEE, 0,0xD7BB, 0,0xE2B1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xD7AA, 0, 0, 0, 0, + 0, 0,0xD6FB, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xE4DF, 0,0xCAD6, 0, + 0, 0,0xEBA8, 0, 0, 0,0xDBFE, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xF6C2, 0, 0,0xEFBB, 0, 0, 0, + 0,0xD4FD, 0, 0,0xE0C8, 0, 0, 0, +0xE8B9, 0,0xEFA6, 0, 0, 0, 0, 0, +0xCDA4, 0, 0,0xD4F4,0xDBA1,0xDBDC,0xDBDD, 0, + 0, 0, 0, 0,0xEEDC, 0,0xCBCB,0xFCD5, + 0, 0, 0, 0, 0, 0,0xCEEB, 0, +0xCDC1, 0, 0,0xFBD3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xF9AB, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xF5D4, 0, 0, 0, 0,0xD9A9, + 0, 0,0xE9DD,0xDBCD, 0, 0,0xDDCE, 0, +0xE7C3, 0,0xECCC, 0, 0, 0, 0, 0, + 0, 0,0xF9EC, 0, 0, 0,0xCBCC, 0, + 0, 0, 0,0xE0FC,0xD4A8, 0,0xEDD3,0xD8EF, + 0,0xF2D7, 0,0xCAF8,0xDAEF, 0, 0,0xD6D4, + 0, 0, 0, 0, 0, 0,0xD9CD, 0, + 0, 0,0xD8EE, 0,0xF2C1, 0, 0, 0, +0xDFD3, 0, 0, 0,0xDAF0, 0,0xE2EA, 0, + 0,0xE0FD, 0, 0,0xD8F8, 0, 0, 0, +0xF7AF,0xDAB6, 0,0xCAD7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xF2D8, 0, +0xD8F9, 0, 0, 0, 0, 0, 0, 0, + 0,0xFADF, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xCFEF, +0xD9C2, 0,0xF0D2, 0,0xE4D1, 0, 0, 0, +0xF3B7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xFAE0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xEFEC, 0, 0, 0, 0, + 0,0xE2B2, 0,0xD4BD, 0, 0,0xD9CE, 0, + 0, 0, 0,0xF4E2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xD4A9, 0, 0, 0, 0,0xCDC2,0xE7DA, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xF2D9, 0, 0, 0, 0, + 0,0xD9AA, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xD8BE, 0, + 0, 0, 0, 0, 0,0xDCAD, 0, 0, + 0, 0, 0, 0,0xE2EB,0xD6FC, 0, 0, +0xCAF9, 0, 0,0xD4DA, 0, 0, 0, 0, + 0, 0, 0,0xF4D7,0xCCA1, 0, 0,0xCFBA, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xF5B8, + 0, 0, 0,0xD9C3,0xD0E8, 0, 0, 0, + 0, 0,0xE3C5,0xEBF8, 0,0xF2B1, 0, 0, + 0,0xCFBB, 0, 0, 0,0xD3AD,0xE8E1,0xCEEC, + 0, 0, 0,0xE0B4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xDEE3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xDDF7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xF2B2,0xF3F6,0xF6DB, + 0, 0, 0, 0,0xD7FE, 0, 0, 0, + 0, 0,0xF8DF, 0,0xF7F2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xD0A9, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE6DA, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xF5A6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xD7BC,0xCCE3, 0, 0,0xE6DB, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xDDDD, 0, 0, 0, + 0,0xD1B3, 0, 0, 0, 0, 0,0xEFED, + 0, 0, 0, 0,0xD6DE,0xE4F4,0xE1EF, 0, + 0,0xDDF8, 0, 0, 0, 0, 0,0xE8CF, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xCAE5, 0, 0, 0,0xDCA1, + 0,0xE0B5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xFCAC,0xFCAD,0xD8A7, 0, 0, 0, + 0,0xEDB8, 0, 0, 0,0xDBB6, 0, 0, + 0, 0,0xD6F0,0xF3AF, 0, 0,0xCDA5, 0, +0xDAF1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD8A8, 0, 0, 0,0xCCE4, 0, 0,0xD1B4, + 0, 0, 0, 0, 0,0xCAD8, 0, 0, + 0, 0, 0,0xDAF2, 0, 0, 0, 0, + 0,0xF5A7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xF5A8, 0, + 0, 0, 0, 0, 0, 0,0xE6A6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xD5EC,0xD5F8,0xDAF3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xE3C6, 0, 0, 0,0xDEE4, 0, +0xDEE5,0xD1B5, 0, 0, 0, 0, 0,0xD1B6, +0xD1B7,0xF2B3, 0, 0, 0, 0, 0, 0, +0xE9DE, 0, 0, 0, 0, 0,0xF0D3,0xF2B4, + 0, 0,0xF0D4,0xCBE4,0xFBD4,0xF5E6,0xE3EA, 0, +0xDEE6, 0, 0, 0, 0,0xDFD4, 0, 0, +0xF8F9, 0, 0, 0, 0,0xF0AE, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xD1B8, 0, 0, 0, 0,0xD6DF, + 0,0xD0D7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xFCA1,0xEFEE,0xDCD8, + 0,0xE9DF, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE5DD,0xFDFB, + 0, 0,0xE0C9, 0, 0, 0,0xD6C9, 0, + 0,0xD4AA, 0,0xE5CC, 0, 0, 0, 0, + 0,0xE9E0, 0, 0, 0,0xD0D8,0xFCA2,0xD4BE, +0xE2B3,0xDEE7, 0, 0, 0, 0, 0, 0, + 0,0xDCBC,0xD2B6,0xF5D5, 0, 0, 0, 0, + 0,0xCEA1,0xF5A9, 0, 0,0xDDF9, 0, 0, +0xDDFA, 0, 0, 0, 0, 0, 0,0xF0D5, + 0, 0, 0, 0,0xF6DF, 0,0xF2DA,0xE4EB, + 0,0xF2F1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xECB9, 0, 0, 0, 0, +0xFDFC, 0, 0, 0, 0,0xE1AA, 0, 0, +0xCAD9, 0, 0,0xEFEF, 0,0xF5AA, 0, 0, + 0, 0, 0, 0,0xECF9, 0, 0,0xF8AD, + 0,0xF2C2,0xF6C3, 0,0xD7D2, 0, 0,0xF9A2, +0xF0D6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xF0FA, 0, + 0,0xF6E0, 0, 0, 0, 0,0xE9F3,0xF2C3, + 0, 0, 0,0xD4AB,0xCAB3,0xCDA6, 0,0xCDC3, +0xCDDA, 0, 0, 0, 0, 0,0xD9CF, 0, + 0,0xF6C4, 0, 0, 0,0xEEDD,0xE7C4, 0, + 0, 0, 0, 0, 0, 0, 0,0xE2B4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xDFE2,0xE7DB, 0, 0, 0, 0, 0, + 0,0xE8B1, 0,0xFCAE, 0, 0, 0, 0, +0xE5CD, 0, 0, 0,0xFAEB, 0,0xCFBC, 0, + 0,0xCFE2,0xCDF6, 0, 0,0xEFF0, 0,0xF4BE, + 0,0xD4CD, 0, 0,0xF3B8, 0, 0, 0, +0xE9A1, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xF2F2,0xF3EB, 0,0xF0D7, 0, 0, +0xCFD7, 0, 0, 0, 0, 0, 0,0xCFDF, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xE8C0,0xE8C1, 0, 0, 0,0xCFE3,0xE9A2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xD0AA, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xF3C1,0xD0AB, 0,0xD4E4, + 0, 0,0xEFBC,0xD8A1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xD9DF, + 0,0xF3D7, 0, 0, 0,0xDCBD, 0,0xCCE5, +0xEDF1, 0, 0,0xF1E2, 0,0xD4DB, 0, 0, + 0, 0,0xE2B5, 0, 0,0xCAE6, 0,0xD3AE, + 0, 0, 0, 0, 0, 0,0xCCE6, 0, + 0,0xF1D3,0xF5E7, 0, 0, 0, 0,0xCADA, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xFBEE, + 0,0xE1C5, 0, 0, 0, 0, 0, 0, + 0,0xDFE9, 0,0xEEDE, 0, 0,0xF7C2, 0, +0xD8A2, 0, 0, 0, 0, 0,0xDDAC, 0, + 0, 0, 0, 0,0xF0AF,0xD6BD, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xE1AB, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xF9B6, 0, + 0,0xD4F5, 0,0xD0C9,0xEFA7,0xE2EC, 0,0xDBEA, +0xCECC,0xF5E8,0xF7D5, 0,0xD3CD, 0,0xF3FE, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD0B5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xE0FE, 0,0xDFFB, 0, + 0, 0, 0, 0, 0,0xE6DD, 0, 0, + 0, 0, 0, 0, 0,0xE8A4, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xCBCD, + 0, 0, 0,0xEFA8, 0, 0, 0,0xEEB4, + 0, 0, 0, 0,0xDAD8,0xD1B9, 0,0xDFA9, + 0, 0,0xF3B0, 0, 0,0xCCC4, 0, 0, + 0,0xCEB7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xEFA9, 0, 0, + 0,0xDFD5, 0, 0,0xEDD7, 0, 0, 0, +0xEEC6, 0, 0, 0, 0, 0, 0, 0, +0xEFBD,0xFCD6, 0, 0,0xDBF4, 0,0xEFAA,0xF8B9, + 0,0xF5E9, 0, 0, 0, 0, 0, 0, + 0, 0,0xE3D9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE1C6, 0, 0, 0,0xD4BF, 0, 0, 0, + 0,0xDEE8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xF0EA, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xF3C2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xD3AF, 0, + 0,0xCADB, 0, 0, 0, 0, 0,0xFCD7, + 0, 0,0xEDD8,0xE1C7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xF4D8,0xD6B3,0xDDAD, + 0, 0, 0,0xD5BE, 0, 0, 0, 0, + 0, 0, 0, 0,0xF1C3,0xEEDF, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD6EB, 0, 0, 0,0xF4D9, 0, 0, 0, + 0, 0, 0, 0,0xD7E6, 0, 0, 0, + 0, 0, 0,0xDAB7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xDDFB, 0, 0, 0, 0, + 0,0xDDCF, 0, 0, 0, 0, 0, 0, + 0, 0,0xD8A3, 0, 0,0xDAD9, 0,0xF0D8, +0xEFC4, 0, 0, 0, 0, 0, 0,0xE1D8, + 0, 0, 0, 0, 0,0xF1D4, 0,0xEDF2, + 0, 0, 0, 0, 0, 0,0xD5DB, 0, + 0,0xD5DC,0xF3C4,0xCBD7, 0, 0, 0, 0, + 0,0xE2B6, 0, 0, 0, 0,0xEFF1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xFBD5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xD3D8, 0, + 0, 0, 0, 0, 0, 0,0xDDD0,0xF0D9, +0xCBB3, 0, 0, 0, 0, 0, 0,0xD5DD, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xCDA7, 0, 0,0xD0AC, 0, +0xD1BA, 0,0xF1C4, 0,0xE5B3,0xFBF5,0xE9E1,0xFDE0, +0xFCBC, 0,0xDAA2,0xDAA3, 0,0xD2A1, 0, 0, +0xD2EF, 0, 0, 0,0xE2ED, 0, 0,0xDEE9, +0xCEDC,0xF2B5,0xD0E4,0xDDD1, 0, 0, 0, 0, +0xE1C8,0xDBB7,0xDFE3, 0, 0, 0, 0, 0, + 0, 0, 0,0xEDB9,0xF1C5, 0,0xF3CF,0xD7AB, +0xE1AC, 0, 0,0xE3EB, 0,0xEEC7, 0, 0, + 0,0xE1C9,0xCAFA, 0, 0, 0, 0, 0, + 0, 0,0xF0FB,0xFAE1,0xF0DA,0xCCE7,0xDAF4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xCCBF, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xCEED, 0, + 0,0xD5A9,0xFAE2, 0, 0, 0,0xD0E5, 0, +0xEBD6, 0,0xECDF, 0, 0, 0,0xDFFC, 0, + 0,0xF7D6,0xDEEA,0xCBB4, 0, 0,0xEFBE, 0, + 0,0xCCB5, 0, 0, 0, 0, 0,0xCFBD, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xEFF2,0xE2B7, + 0, 0, 0,0xCCE8, 0, 0, 0, 0, + 0, 0, 0, 0,0xF0FC, 0, 0, 0, +0xD6E0, 0,0xF1C6, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xE2B8,0xEBAB, 0, 0, + 0,0xCBB5,0xD8D1, 0,0xF4CE,0xF3F7, 0, 0, +0xD7C6, 0,0xD1BB,0xF7AA, 0,0xEDCA,0xD7D3,0xD8FA, + 0, 0, 0, 0, 0, 0, 0,0xF6C5, + 0, 0,0xD1CC,0xDDFC, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xDFFD, 0, +0xF9E5, 0,0xE0CA, 0, 0,0xF2FD,0xD3B0, 0, +0xF4F3,0xDAC9, 0,0xE6DE, 0, 0, 0, 0, +0xF8BA,0xE8D0, 0, 0,0xD8FB, 0, 0,0xEAD5, + 0, 0, 0, 0,0xD6A3, 0, 0, 0, + 0, 0, 0,0xF6C6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xF2DB,0xE4FC, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE8B2, 0, 0, + 0, 0, 0,0xDADA, 0,0xF2DC,0xFBD6,0xE9B2, + 0,0xEEAD, 0,0xFAE3, 0, 0, 0, 0, + 0, 0, 0,0xDCEE, 0, 0,0xF5EA,0xE6E0, + 0,0xF0FD, 0, 0, 0, 0, 0,0xD7AC, + 0, 0, 0, 0, 0,0xF5C5,0xEEE0, 0, + 0,0xDBE5, 0,0xDDDE, 0, 0,0xD9F0,0xE9A3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xF1F9, 0,0xF2C4,0xE0CB, 0, 0, + 0, 0, 0, 0, 0, 0,0xE9A4, 0, + 0,0xE2B9, 0, 0, 0, 0, 0, 0, + 0,0xE3B1,0xFCEB,0xCDA8, 0,0xCCB6, 0, 0, +0xF0DB, 0, 0, 0, 0, 0, 0, 0, + 0,0xE6BA, 0, 0,0xCDA9, 0, 0, 0, + 0, 0,0xF3C3, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xE1D9, 0, 0,0xEFAB, + 0, 0, 0,0xE7C5, 0, 0,0xE0E9, 0, +0xF3C5, 0, 0,0xD4C0,0xD5BF, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xDDAE, 0, +0xF9FC, 0,0xCCC0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xE5A2, 0, 0, 0, +0xCEB8, 0, 0, 0,0xD8D2,0xF9D6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xF1AA,0xCED1, 0, 0,0xF6C7, 0, +0xDBEB, 0,0xDFFE, 0, 0,0xD8E1, 0,0xF7F3, + 0,0xD7E7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xD4FE, 0, 0, +0xD1BC, 0,0xE5CF, 0,0xCBB6, 0,0xDAB8, 0, + 0, 0, 0, 0,0xCDC4, 0, 0, 0, + 0, 0,0xD6BE, 0, 0, 0,0xE2BA, 0, + 0, 0, 0, 0,0xCFD8, 0, 0, 0, +0xE0CC,0xEBF9, 0, 0, 0, 0, 0, 0, + 0, 0,0xFDFD, 0, 0, 0, 0, 0, +0xD7E8,0xCBD8, 0, 0, 0,0xE9E2, 0, 0, + 0,0xE8BA, 0, 0, 0,0xE3C7, 0, 0, + 0, 0,0xECCD, 0,0xECCE, 0,0xD6BF, 0, + 0, 0,0xE3A7, 0,0xDFD6,0xFDE8, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xEEE1, +0xF6A8,0xDDFD, 0, 0, 0, 0, 0, 0, + 0,0xF8BB, 0,0xE8D1, 0, 0, 0, 0, +0xF9D7, 0, 0, 0, 0, 0, 0, 0, + 0,0xCEEE, 0, 0,0xECCF, 0, 0, 0, +0xE9A5,0xD6D5, 0,0xCDC5, 0,0xEDBA,0xD1BD, 0, + 0,0xCFBE, 0, 0,0xECBB, 0, 0, 0, +0xD2B1, 0, 0, 0, 0,0xCCE9, 0,0xD9C4, +0xE9FC, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xD1BE, 0, 0, + 0, 0, 0,0xECBC, 0, 0,0xE5AD, 0, + 0, 0, 0, 0, 0,0xF7B0, 0,0xCCEA, + 0, 0, 0,0xD3C4, 0, 0,0xD6C0, 0, + 0, 0,0xD6FD, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE1A1, 0, +0xDEBD, 0,0xF6A9, 0, 0, 0,0xDAA4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xD6A4, +0xF5C6, 0,0xE1A2,0xE9C6, 0, 0, 0,0xF2C5, + 0, 0, 0, 0, 0,0xF4E9,0xD6EC,0xEBD3, + 0, 0, 0, 0,0xECBD,0xE2DC,0xDEEB,0xF0DC, + 0,0xEBBF, 0,0xD7CE,0xD1BF, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xF5AB, 0, + 0, 0, 0,0xF9FD, 0,0xCADC, 0, 0, + 0,0xCDC6,0xF2B6, 0, 0,0xDDFE, 0, 0, + 0,0xCCB7,0xDBB8, 0, 0, 0, 0,0xD0E9, + 0,0xCEDD,0xEBC0, 0,0xFDA2, 0, 0, 0, + 0, 0,0xF8CB, 0, 0, 0, 0, 0, + 0, 0, 0,0xEAD6,0xF1B0, 0, 0, 0, + 0, 0, 0, 0,0xDBCE, 0,0xF7C3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xDBCF,0xCBA4, 0, 0,0xF8E0, 0, + 0,0xFBD7, 0, 0,0xEBCA,0xE0A1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xCECD, 0, 0,0xD4DC, 0, 0, 0, +0xFDD8, 0, 0, 0, 0,0xD2F6, 0, 0, + 0, 0,0xF2B7, 0, 0,0xFAF6,0xF6AA,0xFAF7, +0xD8E6, 0,0xF4B1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE8D2, 0,0xCAC5,0xCCEB, 0, 0, 0, 0, + 0, 0, 0,0xE2EE, 0, 0, 0, 0, + 0,0xE2BB, 0,0xF7AD, 0, 0, 0,0xF8E1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xF3EC, 0, 0, 0, 0,0xDEA1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE4FD, 0, 0,0xE3EC, 0, +0xDDAF,0xDDB0, 0, 0,0xCBB7,0xE8D3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE1A3,0xD2E0, 0, + 0, 0, 0,0xF0FE, 0, 0, 0, 0, +0xE9A6,0xCBF2, 0, 0, 0, 0, 0, 0, +0xEDF3,0xDCD9,0xE0CD, 0, 0, 0, 0,0xF7DA, +0xDBB9, 0, 0, 0, 0, 0, 0, 0, +0xCCAE, 0,0xDADB, 0, 0, 0, 0,0xCDC7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xDDB1, 0,0xD8AF,0xE3A3, 0, 0, +0xCEEF, 0, 0,0xF2F3, 0, 0, 0, 0, +0xF8B3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE0CE, 0,0xF5FD, 0, 0, + 0, 0,0xEBEC, 0, 0,0xD3C5,0xFCEC,0xD2DB, +0xD4EB, 0,0xDEA2, 0, 0, 0,0xE5E6, 0, + 0, 0, 0, 0, 0,0xF0B0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD5C4, 0, 0, 0, 0, 0, 0,0xEDF4, + 0, 0, 0,0xE3ED, 0,0xE8C2, 0,0xEDF5, +0xD7FC, 0,0xEDBB, 0, 0,0xF6AB, 0, 0, + 0, 0, 0,0xF2B8,0xF6C8, 0, 0, 0, + 0, 0,0xD3E6,0xF2DD,0xCFBF, 0,0xEBAC, 0, + 0, 0, 0, 0, 0,0xCFC0, 0,0xE6A8, +0xFDE9, 0,0xCFC1, 0,0xE0DF,0xDEEC, 0, 0, + 0, 0,0xE0A2, 0, 0, 0, 0, 0, + 0, 0, 0,0xF4BF,0xE2EF, 0,0xD9F1,0xF1C7, + 0,0xCBB8, 0, 0, 0, 0, 0, 0, + 0, 0,0xF9FE,0xDBBA,0xDAF5, 0, 0, 0, + 0, 0, 0, 0, 0,0xF6EC,0xDADC,0xFAE4, + 0,0xE0CF, 0, 0, 0, 0, 0, 0, +0xDDB2, 0, 0, 0, 0,0xE6A9, 0,0xEFF3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xF3ED, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xEBFA, 0,0xF9E6, 0, + 0, 0, 0, 0, 0, 0,0xCADD,0xD5DE, + 0,0xCADE,0xDFE4, 0, 0, 0,0xE6FD, 0, +0xF5AC, 0, 0, 0, 0, 0,0xE4F5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE9E3, 0,0xEDCB,0xCFE4, 0, + 0, 0,0xD8D3, 0, 0, 0, 0, 0, + 0,0xDDB3,0xD4EC, 0, 0,0xF2B9, 0,0xDFB7, + 0, 0, 0, 0, 0,0xCBCE,0xFBD8, 0, + 0,0xD0D9, 0, 0,0xDDD2,0xF7F4,0xE7DC,0xE4A5, + 0,0xFCA3, 0,0xDBBB, 0, 0, 0,0xF2BA, +0xE9FD,0xD0CA, 0,0xF5D6,0xD9C5,0xE4B4, 0,0xEDA7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xEABD,0xE6FE, 0,0xF7C4,0xF5AD, 0,0xD9E0, + 0, 0, 0,0xCAB4, 0, 0,0xF8E2,0xCFC2, + 0,0xECBE, 0, 0, 0,0xE5B4,0xCDC8,0xEEC8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xE7C8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xCDC9,0xF9B7, 0, + 0,0xF1E8,0xD9F2,0xDBF5,0xCAB5,0xD9C6, 0, 0, + 0,0xD8C9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xD9AB, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xEDBC, 0, 0,0xD8D4, 0, 0, 0,0xDCDA, + 0,0xE2BC, 0, 0,0xFCED,0xECE0,0xD2FE, 0, +0xE9C7,0xE6AA, 0, 0, 0, 0, 0, 0, +0xE2F0, 0, 0, 0, 0, 0, 0,0xFABB, + 0,0xF5AE,0xFBAA, 0, 0, 0, 0,0xECFB, + 0,0xECBF,0xFCD8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xD4E5, 0, 0, 0,0xF9C3, + 0, 0, 0,0xEEE2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xD7E9,0xEDF6, 0, 0, 0,0xDEED, 0, + 0, 0, 0, 0, 0, 0,0xCCEC, 0, +0xE3EE, 0, 0, 0, 0, 0,0xE8D4, 0, + 0, 0,0xFAF8, 0, 0, 0, 0, 0, + 0,0xDDB4,0xE4B5,0xD8B0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xD8D5, 0, 0, + 0,0xF4EA, 0, 0, 0,0xCEB9, 0, 0, + 0,0xD6E1,0xCFD2, 0,0xD0B6, 0, 0, 0, + 0, 0, 0,0xCEA2, 0, 0,0xF3EE, 0, + 0, 0, 0, 0,0xF3F8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xDCCC, 0,0xD0CB, 0, 0, 0,0xFCA4, +0xCDCA,0xD7D4,0xDEA3, 0,0xE4E0, 0, 0, 0, + 0,0xEEC9, 0, 0, 0,0xE2DD, 0, 0, + 0, 0, 0,0xF5FE,0xD4AC, 0, 0, 0, + 0, 0,0xD5D1, 0,0xD8F0,0xF8C3,0xEAD7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xF5D7, 0, 0,0xD8BF, 0, 0, 0, + 0,0xFDC0, 0, 0, 0, 0, 0, 0, +0xEBAD, 0, 0, 0, 0,0xD5AA, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xE7A8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xEECA, + 0, 0, 0,0xCAE7, 0, 0, 0, 0, + 0,0xF8E3, 0,0xD4DD, 0, 0,0xEAD8, 0, + 0, 0, 0,0xFBD9,0xEDF7, 0, 0,0xE5B5, + 0, 0, 0, 0, 0,0xD0AD, 0, 0, + 0, 0,0xF1F1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE2BD, 0, 0, 0,0xE3C8, 0, 0, 0, + 0,0xD9D5, 0, 0,0xDFAA, 0, 0, 0, + 0,0xDBBC, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xF8E4, 0, 0, 0, 0, 0, +0xF1FA, 0, 0,0xE5B6,0xF3EF, 0, 0,0xFBDA, +0xE1E0, 0,0xD9AC, 0,0xF5EB, 0,0xE0B6, 0, + 0,0xE9C8, 0,0xCBCF, 0,0xE3C9, 0, 0, + 0,0xDEEE, 0, 0, 0, 0, 0, 0, + 0, 0,0xE2BE, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xDCEF, 0,0xD6A5, 0, + 0, 0, 0, 0,0xE2F1, 0, 0, 0, + 0, 0, 0, 0,0xD6FE, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xD9A1, 0,0xD8C0,0xDCDB, 0, 0,0xEDBD, +0xDFB8, 0,0xEAA5, 0, 0, 0,0xD7AD, 0, + 0,0xF3F9, 0,0xEDF8, 0,0xF5C7, 0, 0, + 0, 0, 0, 0,0xE1CA,0xEBE3, 0,0xF2DE, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xF8CC, 0,0xEAD9, + 0,0xD3C6, 0,0xDBE6, 0, 0, 0, 0, + 0,0xF5AF, 0, 0, 0, 0,0xCEF0, 0, + 0, 0, 0,0xE9FE, 0, 0, 0, 0, + 0,0xFBB6, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE2F2, 0, 0, 0, 0, +0xCFF2,0xF7B9,0xD9F3, 0, 0,0xE1CB, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xDADD, 0, 0,0xDAB9, + 0, 0, 0, 0, 0, 0, 0,0xEBFB, + 0,0xCBB9, 0, 0,0xEDF9, 0, 0, 0, + 0, 0, 0,0xE0E0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xF4C0, 0, +0xFDBC,0xDFB1,0xE3EF, 0, 0, 0, 0,0xE0A3, +0xFDB9, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xF0B1, 0, 0, 0, 0, 0, + 0,0xCDCB, 0, 0, 0, 0, 0, 0, + 0,0xEDBE, 0, 0, 0,0xD5C0,0xE3F0,0xEDFA, + 0, 0, 0, 0, 0,0xE9E4, 0, 0, + 0, 0, 0, 0,0xD5ED,0xE7DD, 0, 0, + 0, 0, 0, 0,0xD4F6,0xE5B7, 0, 0, + 0,0xDBE7,0xE2BF, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xEECB, + 0, 0,0xD7F4,0xF0DD, 0, 0, 0,0xCEAB, + 0, 0,0xE7DE, 0, 0, 0,0xD6D6,0xE1CC, + 0, 0,0xE8B3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE5EE,0xDCA2, + 0, 0,0xE0D0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xD5B5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xD5A1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xFBDB, 0, +0xF9CB, 0, 0, 0,0xCBF3,0xF4A5, 0, 0, + 0, 0, 0,0xFAC8,0xD6D7, 0,0xE9E5,0xFBDC, + 0, 0, 0, 0, 0, 0, 0,0xFDD0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xFBF6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xDAA5, 0,0xDBBD, 0, 0, 0, + 0, 0, 0,0xECE2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xCDF7,0xF0DE, 0, 0, 0, + 0,0xF6C9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xDEEF, + 0, 0, 0,0xD3B1, 0, 0, 0, 0, + 0, 0, 0, 0,0xFCEE, 0, 0, 0, + 0,0xE8C3, 0,0xF1C8, 0, 0, 0,0xCEF1, + 0, 0, 0, 0,0xF9ED, 0, 0, 0, + 0, 0, 0, 0, 0,0xF2F4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE4B6, 0, +0xF5B9, 0,0xDCF0,0xE3F1, 0, 0, 0, 0, +0xE8A5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xF2BB, 0,0xDEA4, 0,0xDACC, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xCAE9, 0, + 0, 0, 0, 0, 0,0xE3DA, 0,0xFCD9, + 0, 0, 0, 0, 0, 0, 0,0xEADA, + 0, 0, 0, 0, 0, 0,0xF9C4, 0, +0xE3A4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xFBDD, 0,0xEFCA, 0, +0xE8C4, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xD5CC, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xEBD7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xD9AD, + 0, 0,0xFBAB, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xD3D9, 0, 0, 0, 0, + 0, 0,0xD5A2, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xF6DE, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xDAF6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xE0D1, 0, 0,0xE9A8, + 0, 0,0xF5F9, 0, 0, 0, 0, 0, + 0,0xFAAF, 0,0xEBFC, 0, 0,0xE0EA, 0, + 0, 0, 0, 0, 0,0xE3B2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xD5C5, + 0, 0,0xF1E3,0xD5EE, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xCDCC, 0, 0, 0, 0,0xEDD9, 0, + 0, 0, 0,0xD8C1, 0, 0, 0, 0, +0xFAEC, 0, 0, 0, 0, 0,0xF1EB, 0, + 0, 0, 0, 0,0xFABC,0xE6E2, 0, 0, + 0, 0,0xFAE5,0xE2FA, 0, 0, 0,0xCAB6, + 0,0xE4B7, 0,0xEADB, 0,0xF5FA, 0, 0, + 0,0xFBAC,0xCFC3,0xEBFD, 0, 0, 0, 0, +0xF8FA, 0, 0,0xDFB9, 0, 0, 0, 0, +0xE1F1, 0,0xD2A4, 0, 0, 0, 0,0xF5FB, + 0, 0, 0, 0, 0, 0,0xD0DA,0xD0DB, + 0,0xEABE,0xD9B1, 0, 0, 0, 0, 0, +0xCAB7, 0, 0,0xD3E7, 0,0xF8E5, 0, 0, + 0, 0,0xD3B2, 0, 0, 0,0xE2C0,0xF2DF, + 0, 0, 0, 0, 0, 0,0xCDE5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xF9AC, 0, 0, 0, 0, + 0, 0, 0, 0,0xCDCD, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xEEAE,0xD6AE, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xD7EA, + 0, 0, 0, 0,0xE7E0,0xEBAE, 0, 0, + 0,0xCFD9, 0, 0,0xDCCD,0xEDFB, 0,0xDEF0, + 0,0xD7EB, 0, 0, 0, 0, 0, 0, +0xDEA5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xDFD7,0xDBD0,0xDBD1, 0, 0, +0xD5A3, 0, 0, 0, 0,0xF0B2, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xDCDC, + 0, 0, 0, 0, 0, 0, 0, 0, +0xCAE8, 0,0xF8E6,0xDCCE, 0, 0, 0, 0, +0xEADC,0xDBD2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE9B3, 0, 0, + 0, 0,0xF7DB, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE3A8, 0, +0xD7AE, 0, 0,0xE0E1, 0, 0, 0, 0, + 0,0xCBBA, 0, 0,0xE5D1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xD0DC, + 0, 0, 0, 0,0xD5C1, 0, 0, 0, + 0, 0,0xD8CA, 0, 0, 0, 0, 0, + 0, 0,0xE3A9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE0A4, + 0,0xE9A9, 0,0xD3C7, 0, 0,0xDCDD,0xF8AE, + 0, 0, 0,0xCCB8, 0, 0, 0,0xD0AE, + 0, 0, 0,0xD8F2, 0, 0,0xE3CA, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xCCAF, 0, 0, 0, 0, 0, 0, + 0,0xD4AD,0xF6D1, 0, 0, 0, 0, 0, + 0, 0,0xD0CC, 0, 0, 0, 0, 0, + 0, 0,0xCAC6, 0, 0,0xD5C2, 0, 0, +0xCEBA, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xCAC7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xFAB0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xDFD8, 0, 0, 0, +0xF5BA, 0, 0, 0, 0, 0, 0, 0, +0xE5EB, 0,0xEFF4,0xDDB5, 0, 0, 0, 0, +0xCDAA, 0,0xE3F2, 0,0xFBF7, 0,0xF7D0, 0, + 0, 0, 0,0xFDBA, 0, 0,0xFDE1,0xF6FE, +0xD1C0, 0, 0,0xE8C5, 0,0xE4B8, 0,0xE1E8, + 0, 0, 0,0xCCC1, 0,0xD2ED, 0, 0, + 0, 0,0xDBBE, 0, 0,0xE0E2, 0, 0, + 0,0xFAC9, 0, 0,0xE1CD, 0,0xCAB8, 0, + 0, 0,0xF2E0,0xF1C9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xDEF1, 0, 0, 0,0xF0DF,0xF8C4, 0, 0, + 0, 0, 0,0xEECC, 0, 0,0xDEF2, 0, +0xE7C9, 0,0xE2F3,0xE7E1, 0, 0,0xE3CB, 0, + 0,0xE3CC, 0, 0, 0,0xCFF8,0xEFAC, 0, +0xFDFE,0xFCA5,0xFAB1,0xDFD9, 0,0xE0D2, 0, 0, + 0,0xF4DA, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xF1CA, 0,0xCEA3, + 0, 0, 0, 0,0xF2BC,0xECE3, 0, 0, + 0, 0, 0,0xE0A5, 0,0xF7AB, 0, 0, +0xEBAF, 0, 0, 0, 0, 0,0xE5DE, 0, +0xE1A4,0xCDAB, 0,0xD9F4,0xE8A6,0xCDCE,0xE1E9, 0, +0xFCEF, 0,0xE0E3, 0, 0, 0, 0, 0, +0xE2C1, 0,0xCEA4, 0, 0, 0, 0, 0, + 0,0xDEA6, 0, 0,0xEBFE, 0,0xEBDD,0xF0E0, + 0, 0,0xF4DB, 0,0xE2F4, 0, 0,0xD3C8, + 0, 0, 0,0xF4EB, 0,0xEEB5, 0,0xF5D8, + 0, 0,0xD5DF, 0, 0, 0,0xD6E5, 0, + 0, 0, 0,0xEBB0,0xF4E3, 0, 0, 0, + 0,0xE3CD, 0, 0, 0, 0,0xF4F4,0xFAB2, + 0, 0,0xEFF5,0xCADF, 0,0xEBB1,0xEDBF, 0, + 0,0xFDC9, 0, 0, 0, 0,0xE4A6,0xF9A4, +0xF0B3, 0,0xE5EC, 0, 0, 0,0xD1E7, 0, +0xD9C7,0xE4D7,0xEADD, 0,0xD4F7, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xDABA, 0, +0xDACD, 0, 0, 0,0xF9CC, 0,0xE1DA,0xDBBF, + 0,0xCCC5,0xECD0,0xCBBB, 0,0xDEF3, 0, 0, +0xE9AA, 0, 0, 0, 0, 0, 0, 0, +0xD9C8, 0, 0,0xEEE3,0xD7BD, 0, 0, 0, + 0, 0, 0,0xCFC4, 0, 0, 0, 0, + 0,0xD0CD, 0, 0, 0, 0, 0, 0, + 0,0xFCA6, 0, 0, 0, 0, 0, 0, + 0,0xF1FB, 0, 0, 0, 0,0xFDD2,0xD1C1, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE3DB, 0,0xD3C9, 0,0xDCCF, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xCCED, 0, + 0, 0, 0, 0,0xDEA7, 0, 0,0xE6BB, +0xECA1, 0, 0, 0,0xCCB9, 0, 0,0xFBDE, + 0, 0, 0, 0, 0,0xE7E2, 0, 0, +0xD4C1, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xDCA8, 0, 0, 0, 0, 0, +0xE2C2, 0,0xF3D8,0xE5D3, 0, 0,0xF3D9, 0, + 0, 0,0xF3C6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xCDDB, + 0, 0, 0, 0, 0, 0, 0,0xCDAC, + 0,0xFCC3, 0, 0, 0, 0,0xD4E7, 0, +0xD1C2, 0,0xF9A5, 0,0xE8D5, 0, 0, 0, + 0, 0, 0, 0, 0,0xE3CE, 0, 0, + 0, 0,0xD4CA, 0, 0, 0, 0, 0, + 0,0xDFDA, 0, 0, 0, 0, 0, 0, + 0, 0,0xFBDF,0xE7E3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xF8FB,0xE3CF, 0, 0, 0, 0, 0, + 0, 0,0xF5B0, 0, 0, 0, 0, 0, + 0, 0,0xD8E7, 0,0xD9C9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xF8AF,0xEFF6, 0, +0xDDB6,0xEEAF,0xCDF8, 0, 0, 0, 0,0xDEB8, +0xFCA7,0xF7FC,0xF7B1,0xCEBB,0xF4A1, 0, 0,0xEECD, +0xE1AE, 0, 0,0xECC3,0xCFFE, 0,0xF8BF,0xD8E2, +0xD3E8, 0, 0,0xDEA8,0xF4E4,0xECC2, 0,0xD9F5, +0xF9C5,0xDDD3,0xD6F1,0xECFC,0xFCF0, 0, 0,0xEDC0, +0xCAB9, 0,0xEEE4, 0, 0, 0, 0, 0, + 0,0xF2E1, 0,0xDEB9, 0, 0, 0, 0, + 0, 0,0xD6F2, 0,0xDEF4, 0,0xDFDB, 0, +0xDBD3, 0,0xFAE7,0xD8E3,0xF4C1, 0,0xDDB7, 0, + 0, 0,0xF2F5, 0, 0,0xD4AE, 0, 0, + 0, 0, 0, 0,0xD6F3, 0, 0, 0, + 0, 0, 0,0xDDB8,0xCFC5,0xDFDF, 0, 0, + 0, 0, 0, 0,0xF2BE,0xF6A1, 0,0xEBCB, +0xF1FC, 0,0xF3C7, 0, 0,0xE0EB, 0, 0, + 0, 0, 0,0xEDFC, 0, 0,0xE1DB, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xEEE5, 0,0xDEF5, 0, + 0, 0, 0,0xFAD3, 0, 0, 0, 0, +0xF1CB, 0, 0,0xD0AF,0xDDB9, 0, 0,0xD1C3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xF5B1, 0, 0, + 0, 0,0xEAC6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xF0E1, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xF6AC, 0, 0, 0, 0, +0xF5D9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xF0EB, 0, 0, 0, 0, + 0, 0,0xDDBA, 0, 0, 0,0xF2BF, 0, + 0, 0, 0, 0, 0, 0,0xF7C5, 0, + 0, 0, 0,0xDBA2,0xF2F6, 0, 0,0xCABA, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xF7F5, 0,0xCBE5, 0, 0, + 0,0xEEE6, 0,0xE0D3, 0, 0, 0, 0, +0xCEA5, 0, 0, 0, 0, 0, 0,0xD6D8, + 0, 0, 0,0xD4AF, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xE9C9, 0, 0, 0, 0,0xD3CE, +0xF4C2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xCBE6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xF1A1, 0, 0, 0, 0, 0, +0xEBB2, 0, 0, 0, 0,0xF1A2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xEBB3, 0,0xF0B4, 0, 0,0xCBF4, +0xD4B0,0xF3B2,0xFBB7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xF5EC, 0, 0, 0, 0, 0,0xEEE7, +0xF4B2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xF5ED, 0,0xCFF3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xF0E2, 0, 0, 0, 0, 0,0xEECE, + 0, 0,0xF1CC, 0, 0,0xE5B8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xD7F5,0xE3F3,0xCFE5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xCFC6, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xF3B3,0xE4D8,0xCFF9,0xCFDA, 0, 0, + 0, 0,0xFACD, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE6E3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xF2E2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xF5EE, 0, 0,0xCABB, 0, 0,0xE3DC, 0, + 0, 0, 0,0xCEF2, 0,0xD6D9, 0, 0, + 0,0xEEB0, 0, 0, 0, 0, 0, 0, + 0, 0,0xF4E5,0xD8C2,0xDCD0,0xCCEE, 0, 0, + 0, 0, 0,0xD5E0,0xF6CA,0xFDCA,0xD8D6,0xF4CF, + 0, 0, 0, 0, 0, 0,0xD6A6,0xDCBE, + 0,0xDBD4,0xD7C7, 0, 0, 0, 0,0xF2FE, + 0, 0, 0,0xF1CD, 0, 0, 0, 0, +0xE2C3,0xDCDE, 0,0xDCDF, 0, 0,0xEFAD,0xE6AB, + 0, 0, 0, 0,0xF9DD,0xEABF, 0, 0, + 0,0xEFAE, 0, 0, 0,0xF4D0,0xCEF3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE6AC, 0,0xCEDE, + 0, 0,0xD5F9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE3F4,0xCDD0, 0, 0, 0, + 0, 0, 0,0xD5B8, 0, 0,0xF7FD, 0, +0xDCA9, 0, 0, 0, 0,0xDEF6, 0,0xDCAA, +0xF2E3,0xE9B4,0xD2DC, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xE9E6, 0, 0,0xE3F6, 0, 0, + 0, 0, 0, 0, 0, 0,0xE7CA, 0, + 0,0xD0CE, 0, 0,0xDAF7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xCABC, 0, + 0, 0,0xEEE8,0xDADE, 0,0xF2F7, 0, 0, +0xE2FB, 0,0xCCA6, 0, 0, 0, 0,0xDABB, + 0,0xEEE9, 0, 0, 0,0xF5DA, 0, 0, +0xF7DC,0xE1EA,0xCEC1,0xD4B1, 0,0xFDB1,0xE6BD, 0, +0xFBAD, 0, 0,0xF8E7, 0,0xE1CE, 0,0xF7E2, +0xF5EF,0xCFC7, 0, 0,0xD4B2,0xCCEF, 0,0xD4E8, + 0,0xEECF,0xF7D7, 0, 0,0xE0A6,0xD6C1,0xE1DC, +0xF0E3,0xF1E4,0xDCF1,0xD6A7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xF4F5, 0, + 0,0xF1CE,0xF2E4, 0, 0,0xD0B0, 0, 0, +0xECEF, 0, 0, 0,0xF9BA, 0,0xEBB5, 0, + 0,0xD4ED,0xE2C4, 0, 0, 0, 0,0xE9E7, + 0, 0,0xEBB4,0xEAA1, 0,0xF8BC,0xCEA6, 0, +0xF9C6,0xFCDA, 0,0xD4B3,0xD3B9,0xEADE, 0, 0, + 0,0xE9AB, 0, 0,0xE1E1,0xD3CF,0xF4F6, 0, +0xEAC0,0xE1CF, 0,0xCCBA, 0, 0, 0, 0, + 0,0xEEEA, 0, 0, 0,0xF0E4,0xF3B4,0xD4EE, + 0, 0,0xF2C0, 0, 0,0xF1E5, 0,0xF4C3, +0xE0D4, 0,0xEBB6, 0,0xD7A1,0xCBE8, 0,0xF9AD, +0xE9AD,0xD8E4,0xFAB3,0xE2C5,0xFCBD, 0, 0,0xECC4, +0xD8B1, 0,0xDCAB, 0, 0, 0, 0,0xD5A4, + 0,0xEBE9, 0, 0, 0,0xE8BB, 0, 0, + 0,0xD8D7, 0, 0, 0, 0, 0, 0, + 0, 0,0xFBAE,0xD1E1, 0, 0,0xDBC0, 0, +0xF5BE, 0,0xDEF7, 0, 0, 0, 0,0xCAFB, +0xF7C6,0xCFC8, 0, 0, 0,0xE1D0, 0, 0, +0xEED0, 0, 0, 0, 0, 0, 0, 0, + 0,0xE9F4, 0, 0, 0, 0, 0, 0, + 0, 0,0xCEF4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xD5CD, 0, + 0,0xCFDB, 0, 0, 0, 0, 0, 0, +0xDDBB, 0, 0, 0, 0,0xCEAC, 0, 0, + 0, 0, 0, 0, 0,0xE9E8, 0, 0, + 0, 0, 0, 0, 0,0xD4B4, 0, 0, + 0, 0,0xE4C7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xF5DB, 0, 0,0xFAC1, 0, 0, + 0,0xDEA9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xD4F8, + 0, 0, 0, 0, 0,0xEFF7, 0, 0, + 0, 0,0xD3B3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xEBB7,0xEFF8,0xF5DC,0xEDCC,0xDBD5,0xF1CF, 0, + 0, 0,0xF1D0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xF5B2, 0, 0, 0, 0, 0, + 0,0xD9AE,0xD5AC, 0,0xE2C6, 0, 0, 0, + 0, 0, 0, 0, 0,0xFDA3, 0,0xFBE5, +0xDFAB, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE2F5, + 0,0xF6AD, 0,0xF5B3, 0,0xF0B5, 0, 0, + 0, 0,0xE1A5, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xF5DD, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xECA2,0xEDFD, 0,0xF5B4,0xFBB8, + 0,0xDBA3, 0, 0,0xD6CA,0xCBD9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE5D4, 0, 0, 0, 0, 0, 0,0xF3FA, + 0,0xEBB8, 0,0xE0B7,0xD7EC,0xF1EC,0xE5AF,0xD5E1, +0xD7ED,0xD1D1, 0, 0, 0, 0, 0,0xE1F2, +0xEFF9, 0, 0, 0,0xDDBC,0xF6DC, 0, 0, + 0, 0, 0,0xF0E5, 0, 0, 0,0xF4C4, + 0, 0,0xE9E9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xF3FB, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xD4EF, 0, 0, +0xCCA2,0xF7FE,0xDFBC, 0, 0, 0, 0,0xEBCD, + 0, 0, 0, 0, 0, 0,0xD0B7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xD6C2, 0, 0, 0, + 0, 0,0xE8AD, 0, 0, 0, 0,0xEFAF, +0xCBA5, 0, 0, 0, 0,0xCBE9, 0, 0, + 0,0xFAE8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xCCC6, + 0, 0, 0,0xE6E7, 0, 0,0xEAC7, 0, + 0, 0,0xDBA4, 0,0xCFC9,0xE2FC,0xEFFA, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xEBDE, 0, 0,0xF5C8, 0,0xD4DE, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xE0D5, 0,0xEFB0, 0, 0,0xE2C7, 0, +0xD9AF, 0, 0, 0,0xF9E7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE7E5, 0, 0,0xCFCA,0xE1D1, + 0,0xE2C8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xEFFB, 0, 0,0xFAF9, + 0, 0,0xDCF2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xE0A7, 0, 0, 0, + 0, 0,0xF8E8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xCBEA, 0, 0, 0,0xCBBC, 0, 0, 0, + 0, 0, 0, 0,0xD6E2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xF5DE, 0, 0, 0, 0, 0, 0, 0, +0xF5DF, 0,0xEEB6, 0, 0, 0,0xE2F6,0xD3CA, +0xEFFC,0xD1C4,0xEFB1, 0,0xD1C5, 0,0xD0DE, 0, +0xD9E1, 0, 0,0xE0B8, 0, 0,0xCDD1,0xF3B9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE7CC, 0,0xD6A8,0xCEA7, 0,0xD4B5, 0, 0, + 0, 0, 0, 0,0xE4C8, 0, 0, 0, + 0, 0, 0,0xD3B4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xEBB9, 0, + 0, 0, 0, 0, 0,0xCBF5, 0, 0, + 0, 0, 0, 0,0xF6DD, 0,0xF1A3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xCCC7, 0, 0, 0, + 0, 0, 0, 0,0xE9CA, 0,0xE1F0, 0, + 0, 0,0xF5E0, 0, 0, 0, 0, 0, + 0, 0, 0,0xFBAF, 0, 0, 0,0xCBD1, + 0, 0, 0, 0,0xFBE0,0xF2E5, 0, 0, +0xECF0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xF0EC, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xEEEB, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE9CB, 0, + 0,0xCCF0, 0, 0,0xD7AF, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xF3A1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xFCF5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xF1A4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE0D6, 0, 0, + 0, 0, 0,0xEFB2, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xF4D1, 0, 0, +0xF7A1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xF1D1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xCAFC,0xCAFD, 0, 0, 0, 0, 0, + 0, 0, 0,0xCECE, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xF3C8, 0,0xF3BA +}; + +/* page 7 0x9577-0x9F9C */ +static uint16 tab_uni_ksc56017[]={ +0xEDFE, 0, 0, 0, 0, 0, 0, 0, + 0,0xDAA6, 0, 0,0xE0EC, 0, 0, 0, + 0, 0,0xF8CD, 0,0xCBD2, 0, 0, 0, +0xEBCE, 0,0xF9D8,0xF9D9,0xCAE0,0xDACA, 0, 0, + 0,0xCBA6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xCAC8,0xF9EE,0xDBEC, 0, + 0,0xD0B1, 0, 0, 0, 0,0xD5EF, 0, + 0, 0,0xE6F3, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xE7A2,0xE4D9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE4E1, 0, 0,0xFCC4, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xF9EF,0xCFF4,0xF7E6, + 0, 0, 0, 0, 0,0xCEBC, 0, 0, + 0, 0,0xF4C5,0xDCA3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xDDBD, 0, 0, + 0, 0,0xF4C6, 0, 0, 0, 0, 0, + 0, 0, 0,0xF8A1, 0, 0, 0,0xE8D6, + 0, 0, 0,0xDBC1, 0, 0, 0, 0, + 0, 0, 0, 0,0xF0E6, 0, 0, 0, +0xE4B9,0xF6ED, 0,0xF9AE, 0,0xDDBE, 0, 0, + 0, 0, 0, 0,0xD7B0,0xD8E8,0xCBBD, 0, + 0,0xF9DA, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xF8CE,0xF9F0,0xE0ED,0xE3B3, +0xF4B3, 0, 0,0xEAC2,0xF2E6,0xF0B6, 0, 0, + 0, 0, 0,0xDBD6, 0, 0, 0, 0, + 0,0xEBE4, 0, 0,0xF2E7, 0,0xD7D5,0xD4B6, +0xF9E8,0xD7C1, 0, 0, 0, 0,0xE5D5, 0, + 0, 0, 0, 0, 0, 0,0xE9EA,0xD7CC, + 0, 0, 0,0xD3E9,0xE2C9, 0,0xFCDB,0xCDAD, + 0, 0, 0, 0, 0,0xCCB0,0xEAA2, 0, + 0,0xE4F6,0xD0C0, 0,0xF0B7,0xEEA1, 0, 0, + 0, 0, 0, 0,0xD7F6, 0, 0, 0, +0xE2CA,0xE2CB, 0,0xFACF, 0, 0, 0, 0, + 0, 0,0xEBDF, 0, 0, 0, 0, 0, +0xD6CB, 0, 0, 0,0xF4B4, 0, 0, 0, + 0,0xEDCD,0xE4D2, 0, 0,0xEAA9,0xE4BA,0xF3A2, +0xCDD2, 0,0xF6CB, 0,0xF1E6,0xEDC1,0xE8BC,0xEED1, + 0, 0, 0, 0, 0, 0,0xF0E7,0xE2CC, + 0, 0,0xE4AA, 0,0xF5E1,0xEDDA, 0, 0, + 0, 0, 0,0xD7EE,0xD1F1, 0, 0, 0, + 0,0xE9EB,0xE9EC,0xE0E4, 0, 0, 0, 0, +0xDAA7,0xDDD4, 0,0xEAA3, 0, 0, 0,0xD6C3, +0xD6F4, 0,0xDADF, 0,0xEFB3, 0, 0, 0, + 0,0xE2CD, 0, 0, 0, 0, 0,0xEFFD, +0xF2E8, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xEFC5, 0,0xE7E7, 0, 0,0xD7FD, + 0, 0,0xE7CE, 0, 0,0xDFDC, 0,0xF9C7, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD9F6, 0, 0, 0, 0, 0, 0, 0, + 0,0xDFAC, 0,0xD6DA, 0, 0, 0, 0, + 0, 0,0xDCA4, 0, 0, 0,0xF0B8, 0, + 0, 0, 0,0xD5FA, 0,0xE4F7, 0, 0, + 0,0xD6C4, 0, 0, 0, 0, 0, 0, + 0, 0,0xF4EC, 0, 0, 0, 0,0xEFFE, + 0, 0, 0, 0, 0,0xF0A1, 0,0xDEAA, + 0, 0,0xDABC,0xD8FC, 0, 0, 0, 0, + 0, 0,0xFAD4, 0, 0, 0,0xECE5, 0, + 0, 0, 0, 0, 0,0xFCA8, 0, 0, +0xECE6, 0, 0,0xD8CB, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xFBB9, 0,0xE4D3, 0, +0xCDF9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xCFD3, 0, 0, 0, 0, 0, 0, + 0,0xCAEA, 0, 0,0xCFD4, 0,0xF8BD, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xF4C7, + 0, 0, 0, 0,0xEADF, 0, 0, 0, + 0, 0, 0, 0,0xF9DB, 0, 0, 0, + 0, 0, 0, 0, 0,0xD4B7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xEBE5, 0, 0,0xE1D2, + 0, 0, 0, 0,0xEAA4, 0, 0, 0, +0xFAC2,0xFBE1,0xFAED,0xF0A2,0xCCF1, 0,0xFAA3,0xE2F7, + 0,0xE2CE, 0,0xE9F5, 0,0xE1EB, 0, 0, + 0,0xE7E8,0xE8D7,0xDAF8,0xD4CB, 0, 0, 0, +0xF7F6,0xD6C5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xD4E9, 0, + 0,0xFAFA, 0, 0, 0, 0, 0, 0, + 0,0xCCF2,0xF7DD, 0,0xDEBA, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xCEA8, + 0, 0, 0, 0, 0,0xF0B9,0xE4FE,0xE4C9, + 0, 0, 0, 0, 0,0xE4D4, 0, 0, + 0,0xEAC3, 0,0xEFB4, 0, 0, 0,0xD7BE, + 0, 0, 0, 0, 0, 0,0xFBE2, 0, +0xCDD3, 0, 0, 0,0xEFB5, 0, 0, 0, +0xFAE9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xF9A6, 0, 0, 0, 0, 0, 0, +0xDFBD, 0,0xF7C7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xF8FD, 0, 0, +0xF8FC, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xDEAB,0xDBE8, 0, 0, +0xE3DD, 0,0xE1E2,0xD1C6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xF6D0,0xEBE6, +0xDAF9, 0, 0, 0, 0,0xECC7, 0, 0, + 0, 0, 0, 0, 0,0xDEF8,0xF8E9,0xE3DE, + 0, 0, 0, 0,0xCEF5, 0, 0, 0, + 0, 0,0xFAC3,0xE5D7, 0,0xECC8, 0, 0, + 0,0xF3C9, 0, 0,0xE4BB, 0, 0, 0, + 0,0xE6AE, 0, 0, 0, 0, 0,0xEFB6, + 0,0xDCBF, 0, 0, 0, 0, 0, 0, + 0,0xCEBD, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xD8C3, 0, + 0, 0,0xD0CF, 0,0xCFFA,0xF3CA,0xE0D7, 0, + 0, 0,0xD1C7,0xE9AE, 0,0xE8BD, 0, 0, +0xFAC4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE2CF, + 0, 0,0xFAC5, 0, 0, 0,0xF9B8, 0, + 0, 0, 0, 0, 0, 0,0xDCE0, 0, + 0,0xFBB0, 0, 0, 0,0xD8A9,0xE5DF,0xF9A7, + 0, 0,0xF6EE, 0,0xF6CC,0xE2F8, 0, 0, + 0, 0,0xECF1, 0, 0, 0, 0, 0, + 0, 0,0xDAE0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xF1D2,0xD2CC,0xCFCB, 0, 0,0xCABD, 0, + 0, 0,0xDDBF, 0, 0, 0,0xF6EF, 0, +0xDEF9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xFAB4, 0, + 0, 0,0xD5AD, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xF1E7, 0,0xDEBE, 0, 0, 0, 0, 0, + 0,0xDCC0, 0, 0, 0, 0, 0,0xD1C8, +0xD1C9, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xF8BE, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xCBF6, 0, 0, 0, + 0,0xD4F9, 0, 0, 0, 0, 0,0xF5E2, +0xE1D3, 0, 0, 0, 0, 0, 0, 0, + 0,0xD8E9, 0, 0,0xF8FE, 0,0xCFCC, 0, + 0, 0, 0, 0, 0, 0,0xFDA4, 0, + 0, 0, 0, 0, 0, 0,0xCEF6, 0, +0xFAD0, 0, 0,0xCCF3,0xE6BE, 0, 0, 0, +0xF6AE, 0, 0,0xD5F0, 0, 0,0xD1CA, 0, + 0, 0,0xFCBE,0xD5F1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xCDE9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xFAB5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xE2D0,0xF4F7, 0, 0, + 0,0xCDD4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE7A3, 0, + 0, 0, 0, 0, 0, 0, 0,0xDBA5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE2D1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD7A2, 0, 0,0xF7E3, 0, 0, 0, 0, + 0, 0,0xEAA6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xD0A1, 0, 0, + 0, 0,0xCEDA,0xFBEB,0xDBA6,0xDBDE,0xD8E5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xEAE0, 0, 0, 0, 0,0xD8AA, 0, 0, + 0, 0, 0,0xE5E0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD6DB, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xEFC6, + 0, 0,0xF8EA, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE4D5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xCEF7, 0, 0,0xE0D8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xD7EF, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xF4ED, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xCDE6, 0, 0, + 0,0xCCF4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xF5E3, 0, + 0,0xE4CA, 0,0xDCE1, 0, 0,0xF9C8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xFCBF, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE8A7, 0, 0, 0, 0, + 0, 0, 0, 0,0xD8C4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xCBBE, 0,0xDCAE, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xD7F7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xF0E8, 0, +0xDDC0, 0,0xCFCD, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xDCF3,0xD9B0, 0,0xE6E9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xE4BC, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xEAC4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE4EC, + 0,0xE4E5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xFBF8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xCCBB, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE4BD, 0, + 0,0xCDDC,0xD9F7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xDDDF, 0, 0, + 0, 0, 0,0xEDCE, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xD9D0, 0, 0, 0, 0, 0, +0xE5A3, 0, 0, 0, 0,0xF9CD, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xCDAE, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xCFCE, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xF6AF, 0, 0, 0, 0, + 0,0xFDD3,0xEBED,0xD6DC, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE5A4, 0, 0, 0,0xD5B6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xD6DD, 0, + 0, 0,0xF9E9, 0, 0, 0,0xE7A4, 0, +0xD6E3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xD1CB,0xD6E4, 0, 0, 0, +0xD5F2, 0, 0, 0, 0, 0,0xDEFA, 0, +0xD7F8, 0, 0, 0, 0, 0,0xD8EA, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xCFD5,0xD8FD, 0, + 0, 0, 0, 0,0xD8AB, 0, 0,0xFDCB, + 0, 0, 0, 0,0xFCDC, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE0A8,0xD5F3, + 0, 0,0xFDD9, 0, 0,0xCCA3, 0, 0, + 0,0xD9F9, 0, 0,0xD3EA,0xF5F5, 0,0xEFC7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xD3DA, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xDABD, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE8A8,0xDCAF, 0, 0, 0, 0, 0,0xF0A3, + 0, 0, 0, 0,0xCDD5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xE0A9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xDEAC, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xF0BA,0xEEB1, 0, 0,0xEEB2, + 0, 0, 0,0xF6CD, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xEED2, 0,0xD6C6, 0, 0, 0, 0, 0, +0xE0E5, 0, 0,0xF3BB, 0,0xE5E1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE4CB, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xD7A3, 0, + 0,0xDBC2, 0, 0, 0, 0,0xCAFE, 0, + 0, 0, 0, 0, 0,0xCFCF}; + +/* page 8 0xAC00-0xD7A3 */ +static uint16 tab_uni_ksc56018[]={ +0xB0A1,0xB0A2,0x8141,0x8142,0xB0A3,0x8143,0x8144,0xB0A4, +0xB0A5,0xB0A6,0xB0A7,0x8145,0x8146,0x8147,0x8148,0x8149, +0xB0A8,0xB0A9,0xB0AA,0xB0AB,0xB0AC,0xB0AD,0xB0AE,0xB0AF, +0x814A,0xB0B0,0xB0B1,0xB0B2,0xB0B3,0xB0B4,0x814B,0x814C, +0xB0B5,0x814D,0x814E,0x814F,0xB0B6,0x8150,0x8151,0x8152, +0x8153,0x8154,0x8155,0x8156,0xB0B7,0xB0B8,0x8157,0xB0B9, +0xB0BA,0xB0BB,0x8158,0x8159,0x815A,0x8161,0x8162,0x8163, +0xB0BC,0xB0BD,0x8164,0x8165,0xB0BE,0x8166,0x8167,0x8168, +0xB0BF,0x8169,0x816A,0x816B,0x816C,0x816D,0x816E,0x816F, +0x8170,0x8171,0x8172,0xB0C0,0x8173,0xB0C1,0x8174,0x8175, +0x8176,0x8177,0x8178,0x8179,0xB0C2,0x817A,0x8181,0x8182, +0xB0C3,0x8183,0x8184,0x8185,0xB0C4,0x8186,0x8187,0x8188, +0x8189,0x818A,0x818B,0x818C,0x818D,0x818E,0x818F,0x8190, +0x8191,0x8192,0x8193,0x8194,0x8195,0x8196,0x8197,0x8198, +0xB0C5,0xB0C6,0x8199,0x819A,0xB0C7,0x819B,0x819C,0xB0C8, +0xB0C9,0x819D,0xB0CA,0x819E,0x819F,0x81A0,0x81A1,0x81A2, +0xB0CB,0xB0CC,0x81A3,0xB0CD,0xB0CE,0xB0CF,0xB0D0,0x81A4, +0x81A5,0xB0D1,0xB0D2,0xB0D3,0xB0D4,0x81A6,0x81A7,0x81A8, +0xB0D5,0x81A9,0x81AA,0x81AB,0xB0D6,0x81AC,0x81AD,0x81AE, +0x81AF,0x81B0,0x81B1,0x81B2,0xB0D7,0xB0D8,0x81B3,0xB0D9, +0xB0DA,0xB0DB,0x81B4,0x81B5,0x81B6,0x81B7,0x81B8,0x81B9, +0xB0DC,0xB0DD,0xB0DE,0x81BA,0xB0DF,0x81BB,0x81BC,0xB0E0, +0xB0E1,0x81BD,0x81BE,0x81BF,0x81C0,0x81C1,0x81C2,0x81C3, +0xB0E2,0xB0E3,0x81C4,0xB0E4,0xB0E5,0xB0E6,0x81C5,0x81C6, +0x81C7,0xB0E7,0x81C8,0x81C9,0xB0E8,0x81CA,0x81CB,0x81CC, +0xB0E9,0x81CD,0x81CE,0x81CF,0xB0EA,0x81D0,0x81D1,0x81D2, +0x81D3,0x81D4,0x81D5,0x81D6,0x81D7,0xB0EB,0x81D8,0xB0EC, +0x81D9,0x81DA,0x81DB,0x81DC,0x81DD,0x81DE,0x81DF,0x81E0, +0xB0ED,0xB0EE,0x81E1,0x81E2,0xB0EF,0x81E3,0x81E4,0xB0F0, +0xB0F1,0x81E5,0xB0F2,0x81E6,0xB0F3,0x81E7,0x81E8,0xB0F4, +0xB0F5,0xB0F6,0x81E9,0xB0F7,0x81EA,0xB0F8,0xB0F9,0x81EB, +0x81EC,0x81ED,0x81EE,0x81EF,0xB0FA,0xB0FB,0x81F0,0x81F1, +0xB0FC,0x81F2,0x81F3,0x81F4,0xB0FD,0x81F5,0xB0FE,0x81F6, +0x81F7,0x81F8,0x81F9,0x81FA,0xB1A1,0xB1A2,0x81FB,0xB1A3, +0x81FC,0xB1A4,0x81FD,0x81FE,0x8241,0x8242,0x8243,0x8244, +0xB1A5,0x8245,0x8246,0x8247,0xB1A6,0x8248,0x8249,0x824A, +0xB1A7,0x824B,0x824C,0x824D,0x824E,0x824F,0x8250,0x8251, +0x8252,0xB1A8,0x8253,0x8254,0xB1A9,0xB1AA,0x8255,0x8256, +0x8257,0x8258,0x8259,0x825A,0xB1AB,0xB1AC,0x8261,0x8262, +0xB1AD,0x8263,0x8264,0x8265,0xB1AE,0x8266,0x8267,0x8268, +0x8269,0x826A,0x826B,0x826C,0xB1AF,0xB1B0,0x826D,0xB1B1, +0x826E,0xB1B2,0x826F,0x8270,0x8271,0x8272,0x8273,0x8274, +0xB1B3,0x8275,0x8276,0x8277,0xB1B4,0x8278,0x8279,0x827A, +0xB1B5,0x8281,0x8282,0x8283,0x8284,0x8285,0x8286,0x8287, +0x8288,0xB1B6,0x8289,0xB1B7,0x828A,0x828B,0x828C,0x828D, +0x828E,0x828F,0x8290,0x8291,0xB1B8,0xB1B9,0x8292,0x8293, +0xB1BA,0x8294,0x8295,0xB1BB,0xB1BC,0xB1BD,0xB1BE,0x8296, +0x8297,0x8298,0x8299,0xB1BF,0xB1C0,0xB1C1,0x829A,0xB1C2, +0x829B,0xB1C3,0xB1C4,0x829C,0x829D,0x829E,0x829F,0x82A0, +0xB1C5,0xB1C6,0x82A1,0x82A2,0xB1C7,0x82A3,0x82A4,0x82A5, +0xB1C8,0x82A6,0x82A7,0x82A8,0x82A9,0x82AA,0x82AB,0x82AC, +0x82AD,0x82AE,0x82AF,0x82B0,0xB1C9,0xB1CA,0x82B1,0x82B2, +0x82B3,0x82B4,0x82B5,0x82B6,0xB1CB,0x82B7,0x82B8,0x82B9, +0x82BA,0x82BB,0x82BC,0x82BD,0x82BE,0x82BF,0x82C0,0x82C1, +0x82C2,0x82C3,0x82C4,0x82C5,0x82C6,0x82C7,0x82C8,0xB1CC, +0x82C9,0x82CA,0x82CB,0x82CC,0x82CD,0x82CE,0x82CF,0x82D0, +0xB1CD,0xB1CE,0x82D1,0x82D2,0xB1CF,0x82D3,0x82D4,0x82D5, +0xB1D0,0x82D6,0x82D7,0x82D8,0x82D9,0x82DA,0x82DB,0x82DC, +0xB1D1,0xB1D2,0x82DD,0xB1D3,0x82DE,0x82DF,0x82E0,0x82E1, +0x82E2,0x82E3,0x82E4,0x82E5,0xB1D4,0x82E6,0x82E7,0x82E8, +0xB1D5,0x82E9,0x82EA,0x82EB,0xB1D6,0x82EC,0x82ED,0x82EE, +0x82EF,0x82F0,0x82F1,0x82F2,0x82F3,0x82F4,0x82F5,0x82F6, +0x82F7,0x82F8,0x82F9,0x82FA,0x82FB,0x82FC,0x82FD,0x82FE, +0xB1D7,0xB1D8,0x8341,0x8342,0xB1D9,0x8343,0x8344,0xB1DA, +0xB1DB,0xB1DC,0x8345,0x8346,0x8347,0x8348,0x8349,0x834A, +0xB1DD,0xB1DE,0x834B,0xB1DF,0x834C,0xB1E0,0x834D,0x834E, +0x834F,0x8350,0x8351,0x8352,0xB1E1,0x8353,0x8354,0x8355, +0x8356,0x8357,0x8358,0x8359,0x835A,0x8361,0x8362,0x8363, +0x8364,0x8365,0x8366,0x8367,0x8368,0x8369,0x836A,0x836B, +0x836C,0x836D,0x836E,0x836F,0x8370,0x8371,0x8372,0x8373, +0xB1E2,0xB1E3,0x8374,0x8375,0xB1E4,0x8376,0x8377,0xB1E5, +0xB1E6,0x8378,0xB1E7,0x8379,0x837A,0x8381,0x8382,0x8383, +0xB1E8,0xB1E9,0x8384,0xB1EA,0x8385,0xB1EB,0xB1EC,0x8386, +0x8387,0x8388,0xB1ED,0x8389,0xB1EE,0xB1EF,0xB1F0,0x838A, +0xB1F1,0x838B,0x838C,0x838D,0xB1F2,0x838E,0xB1F3,0x838F, +0x8390,0x8391,0x8392,0x8393,0xB1F4,0xB1F5,0x8394,0xB1F6, +0xB1F7,0xB1F8,0x8395,0x8396,0x8397,0xB1F9,0x8398,0x8399, +0xB1FA,0xB1FB,0x839A,0x839B,0xB1FC,0x839C,0x839D,0x839E, +0xB1FD,0x839F,0x83A0,0x83A1,0x83A2,0x83A3,0x83A4,0x83A5, +0xB1FE,0xB2A1,0x83A6,0xB2A2,0xB2A3,0xB2A4,0x83A7,0x83A8, +0x83A9,0x83AA,0x83AB,0x83AC,0xB2A5,0xB2A6,0x83AD,0x83AE, +0x83AF,0x83B0,0x83B1,0x83B2,0xB2A7,0x83B3,0x83B4,0x83B5, +0x83B6,0x83B7,0x83B8,0x83B9,0x83BA,0x83BB,0x83BC,0x83BD, +0x83BE,0x83BF,0x83C0,0x83C1,0x83C2,0x83C3,0x83C4,0x83C5, +0x83C6,0x83C7,0x83C8,0x83C9,0x83CA,0x83CB,0x83CC,0x83CD, +0x83CE,0x83CF,0x83D0,0x83D1,0x83D2,0x83D3,0x83D4,0x83D5, +0x83D6,0x83D7,0x83D8,0x83D9,0x83DA,0x83DB,0x83DC,0x83DD, +0x83DE,0x83DF,0x83E0,0x83E1,0xB2A8,0xB2A9,0xB2AA,0x83E2, +0xB2AB,0x83E3,0x83E4,0x83E5,0xB2AC,0x83E6,0x83E7,0x83E8, +0x83E9,0x83EA,0x83EB,0x83EC,0xB2AD,0xB2AE,0x83ED,0xB2AF, +0xB2B0,0xB2B1,0x83EE,0x83EF,0x83F0,0x83F1,0x83F2,0x83F3, +0xB2B2,0xB2B3,0x83F4,0x83F5,0xB2B4,0x83F6,0x83F7,0x83F8, +0x83F9,0x83FA,0x83FB,0x83FC,0x83FD,0x83FE,0x8441,0x8442, +0xB2B5,0x8443,0x8444,0xB2B6,0x8445,0xB2B7,0x8446,0x8447, +0x8448,0x8449,0x844A,0x844B,0xB2B8,0x844C,0x844D,0x844E, +0xB2B9,0x844F,0x8450,0x8451,0xB2BA,0x8452,0x8453,0x8454, +0x8455,0x8456,0x8457,0x8458,0x8459,0x845A,0x8461,0xB2BB, +0xB2BC,0x8462,0x8463,0x8464,0x8465,0xB2BD,0x8466,0x8467, +0xB2BE,0x8468,0x8469,0x846A,0x846B,0x846C,0x846D,0x846E, +0x846F,0x8470,0x8471,0x8472,0x8473,0x8474,0x8475,0x8476, +0x8477,0x8478,0x8479,0x847A,0x8481,0x8482,0x8483,0x8484, +0x8485,0x8486,0x8487,0x8488,0xB2BF,0xB2C0,0x8489,0x848A, +0xB2C1,0x848B,0xB2C2,0x848C,0xB2C3,0x848D,0x848E,0x848F, +0x8490,0x8491,0x8492,0x8493,0xB2C4,0xB2C5,0x8494,0xB2C6, +0x8495,0xB2C7,0xB2C8,0xB2C9,0x8496,0x8497,0x8498,0x8499, +0xB2CA,0xB2CB,0x849A,0x849B,0x849C,0x849D,0x849E,0x849F, +0xB2CC,0x84A0,0x84A1,0x84A2,0x84A3,0x84A4,0x84A5,0x84A6, +0x84A7,0x84A8,0x84A9,0x84AA,0xB2CD,0xB2CE,0x84AB,0x84AC, +0x84AD,0x84AE,0x84AF,0x84B0,0xB2CF,0xB2D0,0x84B1,0x84B2, +0x84B3,0x84B4,0x84B5,0x84B6,0x84B7,0x84B8,0x84B9,0x84BA, +0x84BB,0x84BC,0x84BD,0x84BE,0x84BF,0x84C0,0x84C1,0x84C2, +0x84C3,0xB2D1,0x84C4,0x84C5,0x84C6,0x84C7,0x84C8,0x84C9, +0xB2D2,0x84CA,0x84CB,0x84CC,0xB2D3,0x84CD,0x84CE,0x84CF, +0xB2D4,0x84D0,0x84D1,0x84D2,0x84D3,0x84D4,0x84D5,0x84D6, +0xB2D5,0xB2D6,0x84D7,0x84D8,0x84D9,0xB2D7,0x84DA,0x84DB, +0x84DC,0x84DD,0x84DE,0x84DF,0xB2D8,0x84E0,0x84E1,0x84E2, +0x84E3,0x84E4,0x84E5,0x84E6,0x84E7,0x84E8,0x84E9,0x84EA, +0x84EB,0x84EC,0x84ED,0x84EE,0x84EF,0x84F0,0x84F1,0x84F2, +0x84F3,0x84F4,0x84F5,0x84F6,0x84F7,0x84F8,0x84F9,0x84FA, +0xB2D9,0xB2DA,0x84FB,0x84FC,0xB2DB,0x84FD,0x84FE,0x8541, +0xB2DC,0x8542,0x8543,0x8544,0x8545,0x8546,0x8547,0xB2DD, +0xB2DE,0xB2DF,0x8548,0xB2E0,0x8549,0xB2E1,0xB2E2,0x854A, +0x854B,0x854C,0x854D,0x854E,0xB2E3,0x854F,0x8550,0x8551, +0x8552,0x8553,0x8554,0x8555,0xB2E4,0x8556,0x8557,0x8558, +0x8559,0x855A,0x8561,0x8562,0x8563,0x8564,0x8565,0x8566, +0xB2E5,0xB2E6,0x8567,0x8568,0x8569,0x856A,0x856B,0x856C, +0xB2E7,0xB2E8,0x856D,0x856E,0xB2E9,0x856F,0x8570,0x8571, +0xB2EA,0x8572,0x8573,0x8574,0x8575,0x8576,0x8577,0x8578, +0xB2EB,0xB2EC,0x8579,0x857A,0xB2ED,0x8581,0x8582,0x8583, +0x8584,0x8585,0x8586,0x8587,0xB2EE,0x8588,0x8589,0x858A, +0xB2EF,0x858B,0x858C,0x858D,0xB2F0,0x858E,0x858F,0x8590, +0x8591,0x8592,0x8593,0x8594,0xB2F1,0xB2F2,0x8595,0x8596, +0x8597,0x8598,0x8599,0x859A,0x859B,0x859C,0x859D,0x859E, +0xB2F3,0x859F,0x85A0,0x85A1,0x85A2,0x85A3,0x85A4,0x85A5, +0x85A6,0x85A7,0x85A8,0x85A9,0x85AA,0x85AB,0x85AC,0x85AD, +0x85AE,0x85AF,0x85B0,0x85B1,0x85B2,0x85B3,0x85B4,0x85B5, +0x85B6,0x85B7,0x85B8,0x85B9,0xB2F4,0xB2F5,0x85BA,0x85BB, +0xB2F6,0x85BC,0xB2F7,0x85BD,0xB2F8,0x85BE,0xB2F9,0x85BF, +0x85C0,0x85C1,0x85C2,0xB2FA,0xB2FB,0xB2FC,0x85C3,0xB2FD, +0x85C4,0xB2FE,0x85C5,0x85C6,0x85C7,0xB3A1,0x85C8,0x85C9, +0x85CA,0x85CB,0x85CC,0x85CD,0x85CE,0x85CF,0x85D0,0x85D1, +0x85D2,0x85D3,0x85D4,0x85D5,0x85D6,0x85D7,0x85D8,0x85D9, +0x85DA,0x85DB,0x85DC,0x85DD,0x85DE,0x85DF,0x85E0,0x85E1, +0x85E2,0x85E3,0x85E4,0x85E5,0xB3A2,0xB3A3,0x85E6,0x85E7, +0xB3A4,0x85E8,0x85E9,0x85EA,0xB3A5,0x85EB,0x85EC,0x85ED, +0x85EE,0x85EF,0x85F0,0x85F1,0xB3A6,0xB3A7,0x85F2,0xB3A8, +0x85F3,0xB3A9,0x85F4,0x85F5,0x85F6,0x85F7,0x85F8,0x85F9, +0xB3AA,0xB3AB,0xB3AC,0x85FA,0xB3AD,0x85FB,0x85FC,0xB3AE, +0xB3AF,0xB3B0,0xB3B1,0x85FD,0x85FE,0x8641,0x8642,0x8643, +0xB3B2,0xB3B3,0x8644,0xB3B4,0xB3B5,0xB3B6,0xB3B7,0xB3B8, +0x8645,0xB3B9,0x8646,0xB3BA,0xB3BB,0xB3BC,0x8647,0x8648, +0xB3BD,0x8649,0x864A,0x864B,0xB3BE,0x864C,0x864D,0x864E, +0x864F,0x8650,0x8651,0x8652,0xB3BF,0xB3C0,0x8653,0xB3C1, +0xB3C2,0xB3C3,0x8654,0x8655,0x8656,0x8657,0x8658,0x8659, +0xB3C4,0xB3C5,0x865A,0x8661,0xB3C6,0x8662,0x8663,0x8664, +0xB3C7,0x8665,0x8666,0x8667,0x8668,0x8669,0x866A,0x866B, +0xB3C8,0x866C,0x866D,0x866E,0x866F,0xB3C9,0x8670,0x8671, +0x8672,0x8673,0x8674,0x8675,0x8676,0x8677,0x8678,0x8679, +0x867A,0x8681,0x8682,0x8683,0x8684,0x8685,0x8686,0x8687, +0x8688,0x8689,0x868A,0x868B,0x868C,0x868D,0x868E,0x868F, +0x8690,0x8691,0x8692,0x8693,0x8694,0x8695,0x8696,0x8697, +0xB3CA,0xB3CB,0x8698,0xB3CC,0xB3CD,0x8699,0x869A,0x869B, +0xB3CE,0x869C,0xB3CF,0xB3D0,0x869D,0x869E,0x869F,0x86A0, +0xB3D1,0xB3D2,0x86A1,0xB3D3,0xB3D4,0xB3D5,0x86A2,0x86A3, +0x86A4,0x86A5,0x86A6,0xB3D6,0xB3D7,0xB3D8,0x86A7,0x86A8, +0xB3D9,0x86A9,0x86AA,0x86AB,0xB3DA,0x86AC,0x86AD,0x86AE, +0x86AF,0x86B0,0x86B1,0x86B2,0xB3DB,0xB3DC,0x86B3,0xB3DD, +0xB3DE,0xB3DF,0x86B4,0x86B5,0x86B6,0x86B7,0x86B8,0x86B9, +0xB3E0,0xB3E1,0x86BA,0x86BB,0xB3E2,0x86BC,0x86BD,0x86BE, +0xB3E3,0x86BF,0x86C0,0x86C1,0x86C2,0x86C3,0x86C4,0x86C5, +0xB3E4,0xB3E5,0x86C6,0x86C7,0xB3E6,0xB3E7,0x86C8,0x86C9, +0xB3E8,0x86CA,0x86CB,0x86CC,0xB3E9,0x86CD,0x86CE,0x86CF, +0xB3EA,0x86D0,0x86D1,0x86D2,0x86D3,0x86D4,0x86D5,0x86D6, +0x86D7,0x86D8,0x86D9,0x86DA,0x86DB,0x86DC,0x86DD,0x86DE, +0x86DF,0x86E0,0x86E1,0x86E2,0x86E3,0x86E4,0x86E5,0x86E6, +0xB3EB,0xB3EC,0x86E7,0x86E8,0xB3ED,0x86E9,0x86EA,0x86EB, +0xB3EE,0x86EC,0xB3EF,0x86ED,0x86EE,0x86EF,0x86F0,0x86F1, +0xB3F0,0xB3F1,0x86F2,0xB3F2,0x86F3,0xB3F3,0x86F4,0x86F5, +0x86F6,0x86F7,0xB3F4,0xB3F5,0xB3F6,0x86F8,0x86F9,0x86FA, +0xB3F7,0x86FB,0x86FC,0x86FD,0xB3F8,0x86FE,0x8741,0x8742, +0x8743,0x8744,0x8745,0x8746,0x8747,0x8748,0x8749,0x874A, +0xB3F9,0x874B,0x874C,0x874D,0x874E,0x874F,0x8750,0x8751, +0x8752,0x8753,0x8754,0x8755,0x8756,0x8757,0x8758,0x8759, +0x875A,0x8761,0x8762,0x8763,0x8764,0x8765,0x8766,0x8767, +0x8768,0x8769,0x876A,0x876B,0x876C,0x876D,0x876E,0x876F, +0x8770,0x8771,0x8772,0x8773,0xB3FA,0x8774,0x8775,0x8776, +0xB3FB,0x8777,0x8778,0x8779,0xB3FC,0x877A,0x8781,0x8782, +0x8783,0x8784,0x8785,0x8786,0xB3FD,0xB3FE,0x8787,0xB4A1, +0x8788,0x8789,0x878A,0x878B,0x878C,0x878D,0x878E,0x878F, +0xB4A2,0xB4A3,0x8790,0x8791,0xB4A4,0x8792,0x8793,0x8794, +0xB4A5,0x8795,0x8796,0x8797,0x8798,0x8799,0x879A,0x879B, +0x879C,0xB4A6,0x879D,0xB4A7,0x879E,0xB4A8,0x879F,0x87A0, +0x87A1,0x87A2,0x87A3,0x87A4,0xB4A9,0xB4AA,0x87A5,0x87A6, +0xB4AB,0x87A7,0x87A8,0xB4AC,0xB4AD,0x87A9,0x87AA,0x87AB, +0x87AC,0x87AD,0x87AE,0x87AF,0xB4AE,0xB4AF,0x87B0,0xB4B0, +0x87B1,0xB4B1,0x87B2,0x87B3,0x87B4,0x87B5,0x87B6,0x87B7, +0xB4B2,0x87B8,0x87B9,0x87BA,0x87BB,0x87BC,0x87BD,0x87BE, +0x87BF,0x87C0,0x87C1,0x87C2,0x87C3,0x87C4,0x87C5,0x87C6, +0x87C7,0x87C8,0x87C9,0x87CA,0xB4B3,0x87CB,0x87CC,0x87CD, +0x87CE,0x87CF,0x87D0,0x87D1,0xB4B4,0x87D2,0x87D3,0x87D4, +0x87D5,0x87D6,0x87D7,0x87D8,0x87D9,0x87DA,0x87DB,0x87DC, +0x87DD,0x87DE,0x87DF,0x87E0,0x87E1,0x87E2,0x87E3,0x87E4, +0x87E5,0x87E6,0x87E7,0x87E8,0x87E9,0x87EA,0x87EB,0x87EC, +0xB4B5,0x87ED,0x87EE,0x87EF,0xB4B6,0x87F0,0x87F1,0x87F2, +0xB4B7,0x87F3,0x87F4,0x87F5,0x87F6,0x87F7,0x87F8,0x87F9, +0xB4B8,0xB4B9,0x87FA,0x87FB,0x87FC,0x87FD,0x87FE,0x8841, +0x8842,0x8843,0x8844,0x8845,0xB4BA,0xB4BB,0x8846,0x8847, +0x8848,0x8849,0x884A,0x884B,0xB4BC,0x884C,0x884D,0x884E, +0x884F,0x8850,0x8851,0x8852,0xB4BD,0xB4BE,0x8853,0x8854, +0x8855,0xB4BF,0x8856,0x8857,0x8858,0x8859,0x885A,0x8861, +0xB4C0,0xB4C1,0x8862,0x8863,0xB4C2,0x8864,0x8865,0x8866, +0xB4C3,0xB4C4,0xB4C5,0x8867,0x8868,0x8869,0x886A,0x886B, +0xB4C6,0xB4C7,0x886C,0xB4C8,0x886D,0xB4C9,0xB4CA,0x886E, +0x886F,0x8870,0xB4CB,0x8871,0xB4CC,0x8872,0x8873,0x8874, +0xB4CD,0x8875,0x8876,0x8877,0xB4CE,0x8878,0x8879,0x887A, +0x8881,0x8882,0x8883,0x8884,0x8885,0x8886,0x8887,0x8888, +0x8889,0x888A,0x888B,0x888C,0x888D,0x888E,0x888F,0x8890, +0xB4CF,0xB4D0,0x8891,0x8892,0xB4D1,0x8893,0x8894,0x8895, +0xB4D2,0x8896,0xB4D3,0x8897,0x8898,0x8899,0x889A,0x889B, +0xB4D4,0xB4D5,0x889C,0xB4D6,0x889D,0xB4D7,0x889E,0x889F, +0x88A0,0x88A1,0xB4D8,0x88A2,0xB4D9,0xB4DA,0xB4DB,0x88A3, +0xB4DC,0x88A4,0x88A5,0xB4DD,0xB4DE,0xB4DF,0xB4E0,0xB4E1, +0x88A6,0x88A7,0x88A8,0xB4E2,0xB4E3,0xB4E4,0x88A9,0xB4E5, +0xB4E6,0xB4E7,0xB4E8,0xB4E9,0x88AA,0x88AB,0x88AC,0xB4EA, +0xB4EB,0xB4EC,0x88AD,0x88AE,0xB4ED,0x88AF,0x88B0,0x88B1, +0xB4EE,0x88B2,0x88B3,0x88B4,0x88B5,0x88B6,0x88B7,0x88B8, +0xB4EF,0xB4F0,0x88B9,0xB4F1,0xB4F2,0xB4F3,0x88BA,0x88BB, +0x88BC,0x88BD,0x88BE,0x88BF,0xB4F4,0x88C0,0x88C1,0x88C2, +0x88C3,0x88C4,0x88C5,0x88C6,0x88C7,0x88C8,0x88C9,0x88CA, +0x88CB,0x88CC,0x88CD,0x88CE,0x88CF,0x88D0,0x88D1,0x88D2, +0x88D3,0x88D4,0x88D5,0x88D6,0x88D7,0x88D8,0x88D9,0x88DA, +0x88DB,0x88DC,0x88DD,0x88DE,0x88DF,0x88E0,0x88E1,0x88E2, +0x88E3,0x88E4,0x88E5,0x88E6,0x88E7,0x88E8,0x88E9,0x88EA, +0x88EB,0x88EC,0x88ED,0x88EE,0x88EF,0x88F0,0x88F1,0x88F2, +0x88F3,0x88F4,0x88F5,0x88F6,0xB4F5,0xB4F6,0xB4F7,0x88F7, +0xB4F8,0x88F8,0x88F9,0xB4F9,0xB4FA,0x88FA,0xB4FB,0xB4FC, +0x88FB,0x88FC,0x88FD,0x88FE,0xB4FD,0xB4FE,0x8941,0xB5A1, +0x8942,0xB5A2,0x8943,0xB5A3,0x8944,0x8945,0xB5A4,0x8946, +0xB5A5,0xB5A6,0x8947,0x8948,0xB5A7,0x8949,0x894A,0x894B, +0xB5A8,0x894C,0x894D,0x894E,0x894F,0x8950,0x8951,0x8952, +0xB5A9,0xB5AA,0x8953,0xB5AB,0xB5AC,0xB5AD,0x8954,0x8955, +0x8956,0x8957,0x8958,0x8959,0xB5AE,0x895A,0x8961,0x8962, +0xB5AF,0x8963,0x8964,0x8965,0xB5B0,0x8966,0x8967,0x8968, +0x8969,0x896A,0x896B,0x896C,0x896D,0x896E,0x896F,0x8970, +0xB5B1,0xB5B2,0x8971,0x8972,0x8973,0x8974,0x8975,0x8976, +0xB5B3,0x8977,0x8978,0x8979,0xB5B4,0x897A,0x8981,0x8982, +0x8983,0x8984,0x8985,0x8986,0x8987,0x8988,0x8989,0x898A, +0x898B,0x898C,0x898D,0x898E,0x898F,0x8990,0x8991,0x8992, +0x8993,0x8994,0x8995,0x8996,0xB5B5,0xB5B6,0x8997,0x8998, +0xB5B7,0x8999,0x899A,0xB5B8,0xB5B9,0x899B,0xB5BA,0x899C, +0xB5BB,0x899D,0x899E,0x899F,0xB5BC,0xB5BD,0x89A0,0xB5BE, +0x89A1,0xB5BF,0x89A2,0xB5C0,0x89A3,0xB5C1,0x89A4,0x89A5, +0xB5C2,0x89A6,0x89A7,0x89A8,0xB5C3,0x89A9,0x89AA,0x89AB, +0xB5C4,0x89AC,0x89AD,0x89AE,0x89AF,0x89B0,0x89B1,0x89B2, +0x89B3,0x89B4,0x89B5,0x89B6,0x89B7,0x89B8,0x89B9,0x89BA, +0x89BB,0x89BC,0x89BD,0x89BE,0xB5C5,0x89BF,0x89C0,0x89C1, +0x89C2,0x89C3,0x89C4,0x89C5,0x89C6,0x89C7,0x89C8,0x89C9, +0x89CA,0x89CB,0x89CC,0x89CD,0x89CE,0x89CF,0x89D0,0x89D1, +0xB5C6,0x89D2,0x89D3,0x89D4,0x89D5,0x89D6,0x89D7,0x89D8, +0xB5C7,0x89D9,0x89DA,0x89DB,0xB5C8,0x89DC,0x89DD,0x89DE, +0xB5C9,0x89DF,0x89E0,0x89E1,0x89E2,0x89E3,0x89E4,0x89E5, +0xB5CA,0xB5CB,0x89E6,0xB5CC,0x89E7,0x89E8,0x89E9,0x89EA, +0x89EB,0x89EC,0x89ED,0x89EE,0xB5CD,0x89EF,0x89F0,0x89F1, +0x89F2,0x89F3,0x89F4,0x89F5,0x89F6,0x89F7,0x89F8,0x89F9, +0x89FA,0x89FB,0x89FC,0x89FD,0x89FE,0x8A41,0x8A42,0x8A43, +0x8A44,0x8A45,0x8A46,0x8A47,0x8A48,0x8A49,0x8A4A,0x8A4B, +0xB5CE,0xB5CF,0x8A4C,0x8A4D,0xB5D0,0x8A4E,0x8A4F,0x8A50, +0xB5D1,0x8A51,0x8A52,0x8A53,0x8A54,0x8A55,0x8A56,0x8A57, +0xB5D2,0xB5D3,0x8A58,0xB5D4,0x8A59,0xB5D5,0x8A5A,0x8A61, +0x8A62,0x8A63,0x8A64,0x8A65,0xB5D6,0x8A66,0x8A67,0x8A68, +0x8A69,0x8A6A,0x8A6B,0x8A6C,0x8A6D,0x8A6E,0x8A6F,0x8A70, +0x8A71,0x8A72,0x8A73,0x8A74,0x8A75,0x8A76,0x8A77,0x8A78, +0xB5D7,0x8A79,0x8A7A,0x8A81,0x8A82,0x8A83,0x8A84,0x8A85, +0xB5D8,0x8A86,0x8A87,0x8A88,0x8A89,0x8A8A,0x8A8B,0x8A8C, +0x8A8D,0x8A8E,0x8A8F,0x8A90,0x8A91,0x8A92,0x8A93,0x8A94, +0x8A95,0x8A96,0x8A97,0x8A98,0x8A99,0xB5D9,0x8A9A,0x8A9B, +0x8A9C,0x8A9D,0x8A9E,0x8A9F,0xB5DA,0x8AA0,0x8AA1,0x8AA2, +0xB5DB,0x8AA3,0x8AA4,0x8AA5,0xB5DC,0x8AA6,0x8AA7,0x8AA8, +0x8AA9,0x8AAA,0x8AAB,0x8AAC,0x8AAD,0xB5DD,0x8AAE,0xB5DE, +0x8AAF,0xB5DF,0x8AB0,0x8AB1,0x8AB2,0x8AB3,0x8AB4,0x8AB5, +0xB5E0,0x8AB6,0x8AB7,0x8AB8,0xB5E1,0x8AB9,0x8ABA,0x8ABB, +0xB5E2,0x8ABC,0x8ABD,0x8ABE,0x8ABF,0x8AC0,0x8AC1,0x8AC2, +0xB5E3,0x8AC3,0x8AC4,0x8AC5,0x8AC6,0xB5E4,0x8AC7,0x8AC8, +0x8AC9,0x8ACA,0x8ACB,0x8ACC,0xB5E5,0xB5E6,0x8ACD,0x8ACE, +0xB5E7,0x8ACF,0x8AD0,0xB5E8,0xB5E9,0x8AD1,0xB5EA,0x8AD2, +0x8AD3,0x8AD4,0x8AD5,0x8AD6,0xB5EB,0xB5EC,0x8AD7,0xB5ED, +0x8AD8,0xB5EE,0x8AD9,0x8ADA,0x8ADB,0x8ADC,0x8ADD,0x8ADE, +0xB5EF,0x8ADF,0x8AE0,0x8AE1,0x8AE2,0x8AE3,0x8AE4,0x8AE5, +0x8AE6,0x8AE7,0x8AE8,0x8AE9,0x8AEA,0x8AEB,0x8AEC,0x8AED, +0x8AEE,0x8AEF,0x8AF0,0x8AF1,0x8AF2,0x8AF3,0x8AF4,0x8AF5, +0x8AF6,0x8AF7,0x8AF8,0x8AF9,0xB5F0,0xB5F1,0x8AFA,0x8AFB, +0xB5F2,0x8AFC,0x8AFD,0xB5F3,0xB5F4,0x8AFE,0x8B41,0x8B42, +0x8B43,0x8B44,0x8B45,0x8B46,0xB5F5,0xB5F6,0x8B47,0xB5F7, +0xB5F8,0xB5F9,0xB5FA,0x8B48,0x8B49,0x8B4A,0x8B4B,0x8B4C, +0xB5FB,0xB5FC,0x8B4D,0x8B4E,0xB5FD,0x8B4F,0x8B50,0x8B51, +0xB5FE,0x8B52,0x8B53,0x8B54,0x8B55,0x8B56,0x8B57,0x8B58, +0xB6A1,0xB6A2,0x8B59,0xB6A3,0xB6A4,0xB6A5,0x8B5A,0x8B61, +0x8B62,0x8B63,0x8B64,0xB6A6,0xB6A7,0xB6A8,0x8B65,0x8B66, +0xB6A9,0x8B67,0x8B68,0x8B69,0xB6AA,0x8B6A,0x8B6B,0x8B6C, +0x8B6D,0x8B6E,0x8B6F,0x8B70,0xB6AB,0xB6AC,0x8B71,0xB6AD, +0xB6AE,0xB6AF,0x8B72,0x8B73,0x8B74,0x8B75,0x8B76,0x8B77, +0x8B78,0x8B79,0x8B7A,0x8B81,0x8B82,0x8B83,0x8B84,0x8B85, +0x8B86,0x8B87,0x8B88,0x8B89,0x8B8A,0x8B8B,0x8B8C,0x8B8D, +0x8B8E,0x8B8F,0x8B90,0x8B91,0x8B92,0x8B93,0x8B94,0x8B95, +0x8B96,0x8B97,0x8B98,0x8B99,0x8B9A,0x8B9B,0x8B9C,0x8B9D, +0x8B9E,0x8B9F,0x8BA0,0x8BA1,0x8BA2,0x8BA3,0x8BA4,0x8BA5, +0x8BA6,0x8BA7,0x8BA8,0x8BA9,0x8BAA,0x8BAB,0x8BAC,0x8BAD, +0x8BAE,0x8BAF,0x8BB0,0x8BB1,0x8BB2,0x8BB3,0x8BB4,0x8BB5, +0xB6B0,0xB6B1,0x8BB6,0x8BB7,0xB6B2,0x8BB8,0x8BB9,0x8BBA, +0xB6B3,0x8BBB,0xB6B4,0xB6B5,0x8BBC,0x8BBD,0x8BBE,0x8BBF, +0xB6B6,0xB6B7,0x8BC0,0xB6B8,0xB6B9,0xB6BA,0x8BC1,0x8BC2, +0x8BC3,0x8BC4,0x8BC5,0xB6BB,0xB6BC,0xB6BD,0x8BC6,0x8BC7, +0xB6BE,0x8BC8,0x8BC9,0x8BCA,0xB6BF,0x8BCB,0x8BCC,0x8BCD, +0x8BCE,0x8BCF,0x8BD0,0x8BD1,0xB6C0,0xB6C1,0x8BD2,0xB6C2, +0xB6C3,0xB6C4,0x8BD3,0x8BD4,0x8BD5,0x8BD6,0x8BD7,0x8BD8, +0xB6C5,0x8BD9,0x8BDA,0x8BDB,0x8BDC,0x8BDD,0x8BDE,0x8BDF, +0x8BE0,0x8BE1,0x8BE2,0x8BE3,0x8BE4,0x8BE5,0x8BE6,0x8BE7, +0x8BE8,0x8BE9,0x8BEA,0x8BEB,0xB6C6,0x8BEC,0x8BED,0x8BEE, +0x8BEF,0x8BF0,0x8BF1,0x8BF2,0x8BF3,0x8BF4,0x8BF5,0x8BF6, +0x8BF7,0x8BF8,0x8BF9,0x8BFA,0x8BFB,0x8BFC,0x8BFD,0x8BFE, +0x8C41,0x8C42,0x8C43,0x8C44,0x8C45,0x8C46,0x8C47,0x8C48, +0x8C49,0x8C4A,0x8C4B,0x8C4C,0x8C4D,0x8C4E,0x8C4F,0x8C50, +0xB6C7,0xB6C8,0x8C51,0x8C52,0xB6C9,0x8C53,0x8C54,0x8C55, +0xB6CA,0x8C56,0x8C57,0x8C58,0x8C59,0x8C5A,0x8C61,0x8C62, +0x8C63,0x8C64,0x8C65,0x8C66,0x8C67,0xB6CB,0x8C68,0x8C69, +0x8C6A,0x8C6B,0x8C6C,0x8C6D,0xB6CC,0x8C6E,0x8C6F,0x8C70, +0x8C71,0x8C72,0x8C73,0x8C74,0xB6CD,0x8C75,0x8C76,0x8C77, +0x8C78,0x8C79,0x8C7A,0x8C81,0x8C82,0x8C83,0x8C84,0x8C85, +0x8C86,0x8C87,0x8C88,0x8C89,0x8C8A,0x8C8B,0x8C8C,0x8C8D, +0xB6CE,0x8C8E,0x8C8F,0x8C90,0x8C91,0x8C92,0x8C93,0x8C94, +0x8C95,0x8C96,0x8C97,0x8C98,0x8C99,0x8C9A,0x8C9B,0x8C9C, +0x8C9D,0x8C9E,0x8C9F,0x8CA0,0x8CA1,0x8CA2,0x8CA3,0x8CA4, +0x8CA5,0x8CA6,0x8CA7,0x8CA8,0xB6CF,0x8CA9,0x8CAA,0x8CAB, +0xB6D0,0x8CAC,0x8CAD,0x8CAE,0x8CAF,0x8CB0,0x8CB1,0x8CB2, +0x8CB3,0x8CB4,0x8CB5,0x8CB6,0x8CB7,0x8CB8,0x8CB9,0x8CBA, +0x8CBB,0x8CBC,0x8CBD,0x8CBE,0x8CBF,0x8CC0,0x8CC1,0x8CC2, +0x8CC3,0x8CC4,0x8CC5,0x8CC6,0x8CC7,0x8CC8,0x8CC9,0x8CCA, +0x8CCB,0x8CCC,0x8CCD,0x8CCE,0x8CCF,0x8CD0,0x8CD1,0x8CD2, +0x8CD3,0x8CD4,0x8CD5,0x8CD6,0x8CD7,0x8CD8,0x8CD9,0x8CDA, +0x8CDB,0x8CDC,0x8CDD,0x8CDE,0xB6D1,0xB6D2,0x8CDF,0x8CE0, +0xB6D3,0x8CE1,0x8CE2,0x8CE3,0xB6D4,0x8CE4,0x8CE5,0x8CE6, +0x8CE7,0x8CE8,0x8CE9,0xB6D5,0xB6D6,0x8CEA,0x8CEB,0x8CEC, +0x8CED,0xB6D7,0x8CEE,0x8CEF,0x8CF0,0x8CF1,0x8CF2,0x8CF3, +0x8CF4,0x8CF5,0x8CF6,0x8CF7,0x8CF8,0x8CF9,0x8CFA,0x8CFB, +0x8CFC,0x8CFD,0x8CFE,0x8D41,0x8D42,0x8D43,0x8D44,0x8D45, +0x8D46,0x8D47,0x8D48,0x8D49,0x8D4A,0x8D4B,0x8D4C,0x8D4D, +0x8D4E,0x8D4F,0x8D50,0x8D51,0xB6D8,0x8D52,0x8D53,0x8D54, +0x8D55,0x8D56,0x8D57,0x8D58,0x8D59,0x8D5A,0x8D61,0x8D62, +0x8D63,0x8D64,0x8D65,0x8D66,0x8D67,0x8D68,0x8D69,0x8D6A, +0x8D6B,0x8D6C,0x8D6D,0x8D6E,0x8D6F,0x8D70,0x8D71,0x8D72, +0xB6D9,0x8D73,0x8D74,0x8D75,0xB6DA,0x8D76,0x8D77,0x8D78, +0xB6DB,0x8D79,0x8D7A,0x8D81,0x8D82,0x8D83,0x8D84,0x8D85, +0xB6DC,0xB6DD,0x8D86,0x8D87,0x8D88,0xB6DE,0x8D89,0x8D8A, +0x8D8B,0x8D8C,0x8D8D,0x8D8E,0x8D8F,0x8D90,0x8D91,0x8D92, +0x8D93,0x8D94,0x8D95,0x8D96,0x8D97,0x8D98,0x8D99,0x8D9A, +0x8D9B,0x8D9C,0x8D9D,0x8D9E,0x8D9F,0x8DA0,0x8DA1,0x8DA2, +0x8DA3,0x8DA4,0x8DA5,0x8DA6,0x8DA7,0x8DA8,0x8DA9,0x8DAA, +0xB6DF,0xB6E0,0x8DAB,0x8DAC,0xB6E1,0x8DAD,0x8DAE,0xB6E2, +0xB6E3,0x8DAF,0x8DB0,0x8DB1,0x8DB2,0x8DB3,0x8DB4,0x8DB5, +0xB6E4,0xB6E5,0x8DB6,0xB6E6,0x8DB7,0x8DB8,0x8DB9,0x8DBA, +0x8DBB,0x8DBC,0x8DBD,0x8DBE,0xB6E7,0x8DBF,0x8DC0,0x8DC1, +0xB6E8,0x8DC2,0x8DC3,0x8DC4,0xB6E9,0x8DC5,0x8DC6,0x8DC7, +0x8DC8,0x8DC9,0x8DCA,0x8DCB,0xB6EA,0xB6EB,0x8DCC,0x8DCD, +0x8DCE,0x8DCF,0x8DD0,0x8DD1,0x8DD2,0x8DD3,0x8DD4,0x8DD5, +0xB6EC,0x8DD6,0x8DD7,0x8DD8,0xB6ED,0x8DD9,0x8DDA,0x8DDB, +0xB6EE,0x8DDC,0x8DDD,0x8DDE,0x8DDF,0x8DE0,0x8DE1,0x8DE2, +0xB6EF,0xB6F0,0x8DE3,0xB6F1,0x8DE4,0xB6F2,0x8DE5,0x8DE6, +0x8DE7,0x8DE8,0x8DE9,0x8DEA,0xB6F3,0xB6F4,0x8DEB,0x8DEC, +0xB6F5,0x8DED,0x8DEE,0x8DEF,0xB6F6,0x8DF0,0x8DF1,0x8DF2, +0x8DF3,0x8DF4,0x8DF5,0x8DF6,0xB6F7,0xB6F8,0x8DF7,0xB6F9, +0xB6FA,0xB6FB,0xB6FC,0x8DF8,0x8DF9,0x8DFA,0xB6FD,0xB6FE, +0xB7A1,0xB7A2,0x8DFB,0x8DFC,0xB7A3,0x8DFD,0x8DFE,0x8E41, +0xB7A4,0x8E42,0x8E43,0x8E44,0x8E45,0x8E46,0x8E47,0x8E48, +0xB7A5,0xB7A6,0x8E49,0xB7A7,0xB7A8,0xB7A9,0x8E4A,0x8E4B, +0x8E4C,0x8E4D,0x8E4E,0x8E4F,0xB7AA,0xB7AB,0x8E50,0x8E51, +0xB7AC,0x8E52,0x8E53,0x8E54,0x8E55,0x8E56,0x8E57,0x8E58, +0x8E59,0x8E5A,0x8E61,0x8E62,0x8E63,0x8E64,0x8E65,0xB7AD, +0x8E66,0xB7AE,0x8E67,0x8E68,0x8E69,0x8E6A,0x8E6B,0x8E6C, +0x8E6D,0x8E6E,0x8E6F,0x8E70,0x8E71,0x8E72,0x8E73,0x8E74, +0x8E75,0x8E76,0x8E77,0x8E78,0x8E79,0x8E7A,0x8E81,0x8E82, +0x8E83,0x8E84,0x8E85,0x8E86,0x8E87,0x8E88,0x8E89,0x8E8A, +0x8E8B,0x8E8C,0x8E8D,0x8E8E,0xB7AF,0xB7B0,0x8E8F,0x8E90, +0xB7B1,0x8E91,0x8E92,0x8E93,0xB7B2,0x8E94,0x8E95,0x8E96, +0x8E97,0x8E98,0x8E99,0x8E9A,0xB7B3,0xB7B4,0x8E9B,0xB7B5, +0xB7B6,0xB7B7,0x8E9C,0x8E9D,0x8E9E,0x8E9F,0x8EA0,0xB7B8, +0xB7B9,0xB7BA,0x8EA1,0x8EA2,0xB7BB,0x8EA3,0x8EA4,0x8EA5, +0xB7BC,0x8EA6,0x8EA7,0x8EA8,0x8EA9,0x8EAA,0x8EAB,0x8EAC, +0xB7BD,0xB7BE,0x8EAD,0xB7BF,0x8EAE,0xB7C0,0x8EAF,0x8EB0, +0x8EB1,0x8EB2,0x8EB3,0x8EB4,0xB7C1,0xB7C2,0x8EB5,0x8EB6, +0xB7C3,0x8EB7,0x8EB8,0x8EB9,0xB7C4,0x8EBA,0x8EBB,0x8EBC, +0x8EBD,0x8EBE,0x8EBF,0x8EC0,0xB7C5,0xB7C6,0x8EC1,0xB7C7, +0xB7C8,0xB7C9,0x8EC2,0x8EC3,0x8EC4,0x8EC5,0x8EC6,0x8EC7, +0xB7CA,0x8EC8,0x8EC9,0x8ECA,0xB7CB,0x8ECB,0x8ECC,0x8ECD, +0x8ECE,0x8ECF,0x8ED0,0x8ED1,0x8ED2,0x8ED3,0x8ED4,0x8ED5, +0x8ED6,0xB7CC,0x8ED7,0xB7CD,0x8ED8,0x8ED9,0x8EDA,0x8EDB, +0x8EDC,0x8EDD,0x8EDE,0x8EDF,0xB7CE,0xB7CF,0x8EE0,0x8EE1, +0xB7D0,0x8EE2,0x8EE3,0x8EE4,0xB7D1,0x8EE5,0x8EE6,0x8EE7, +0x8EE8,0x8EE9,0x8EEA,0x8EEB,0xB7D2,0xB7D3,0x8EEC,0xB7D4, +0x8EED,0xB7D5,0x8EEE,0x8EEF,0x8EF0,0x8EF1,0x8EF2,0x8EF3, +0xB7D6,0x8EF4,0x8EF5,0x8EF6,0xB7D7,0x8EF7,0x8EF8,0x8EF9, +0x8EFA,0x8EFB,0x8EFC,0x8EFD,0x8EFE,0x8F41,0x8F42,0x8F43, +0x8F44,0x8F45,0x8F46,0x8F47,0x8F48,0xB7D8,0x8F49,0x8F4A, +0x8F4B,0x8F4C,0x8F4D,0x8F4E,0x8F4F,0x8F50,0x8F51,0x8F52, +0x8F53,0x8F54,0x8F55,0x8F56,0x8F57,0x8F58,0x8F59,0x8F5A, +0x8F61,0x8F62,0x8F63,0x8F64,0x8F65,0x8F66,0x8F67,0x8F68, +0xB7D9,0x8F69,0x8F6A,0x8F6B,0x8F6C,0x8F6D,0x8F6E,0x8F6F, +0xB7DA,0x8F70,0x8F71,0x8F72,0xB7DB,0x8F73,0x8F74,0x8F75, +0xB7DC,0x8F76,0x8F77,0x8F78,0x8F79,0x8F7A,0x8F81,0x8F82, +0xB7DD,0xB7DE,0x8F83,0xB7DF,0x8F84,0xB7E0,0x8F85,0x8F86, +0x8F87,0x8F88,0x8F89,0x8F8A,0xB7E1,0x8F8B,0x8F8C,0x8F8D, +0xB7E2,0x8F8E,0x8F8F,0x8F90,0xB7E3,0x8F91,0x8F92,0x8F93, +0x8F94,0x8F95,0x8F96,0x8F97,0x8F98,0xB7E4,0x8F99,0xB7E5, +0x8F9A,0xB7E6,0x8F9B,0x8F9C,0x8F9D,0x8F9E,0x8F9F,0x8FA0, +0xB7E7,0xB7E8,0x8FA1,0x8FA2,0xB7E9,0x8FA3,0x8FA4,0x8FA5, +0xB7EA,0x8FA6,0x8FA7,0x8FA8,0x8FA9,0x8FAA,0x8FAB,0x8FAC, +0xB7EB,0xB7EC,0x8FAD,0xB7ED,0x8FAE,0xB7EE,0x8FAF,0x8FB0, +0x8FB1,0x8FB2,0x8FB3,0x8FB4,0xB7EF,0x8FB5,0x8FB6,0x8FB7, +0x8FB8,0x8FB9,0x8FBA,0x8FBB,0x8FBC,0x8FBD,0x8FBE,0x8FBF, +0x8FC0,0x8FC1,0x8FC2,0x8FC3,0x8FC4,0x8FC5,0x8FC6,0x8FC7, +0xB7F0,0x8FC8,0x8FC9,0x8FCA,0x8FCB,0x8FCC,0x8FCD,0x8FCE, +0xB7F1,0x8FCF,0x8FD0,0x8FD1,0x8FD2,0x8FD3,0x8FD4,0x8FD5, +0x8FD6,0x8FD7,0x8FD8,0x8FD9,0x8FDA,0x8FDB,0x8FDC,0x8FDD, +0x8FDE,0x8FDF,0x8FE0,0x8FE1,0x8FE2,0x8FE3,0x8FE4,0x8FE5, +0x8FE6,0x8FE7,0x8FE8,0x8FE9,0xB7F2,0xB7F3,0x8FEA,0x8FEB, +0xB7F4,0x8FEC,0x8FED,0x8FEE,0xB7F5,0x8FEF,0x8FF0,0x8FF1, +0x8FF2,0x8FF3,0x8FF4,0x8FF5,0xB7F6,0x8FF6,0x8FF7,0xB7F7, +0x8FF8,0xB7F8,0x8FF9,0x8FFA,0x8FFB,0x8FFC,0x8FFD,0x8FFE, +0xB7F9,0xB7FA,0x9041,0x9042,0xB7FB,0x9043,0x9044,0x9045, +0xB7FC,0x9046,0x9047,0x9048,0x9049,0x904A,0x904B,0x904C, +0xB7FD,0xB7FE,0x904D,0xB8A1,0x904E,0xB8A2,0x904F,0x9050, +0x9051,0x9052,0x9053,0x9054,0xB8A3,0xB8A4,0x9055,0x9056, +0xB8A5,0x9057,0x9058,0x9059,0xB8A6,0x905A,0x9061,0x9062, +0x9063,0x9064,0x9065,0x9066,0xB8A7,0xB8A8,0x9067,0xB8A9, +0x9068,0xB8AA,0xB8AB,0x9069,0x906A,0xB8AC,0xB8AD,0x906B, +0x906C,0x906D,0x906E,0x906F,0x9070,0x9071,0x9072,0x9073, +0x9074,0x9075,0x9076,0x9077,0x9078,0x9079,0x907A,0x9081, +0x9082,0x9083,0x9084,0x9085,0x9086,0x9087,0x9088,0x9089, +0x908A,0x908B,0x908C,0x908D,0xB8AE,0xB8AF,0x908E,0x908F, +0xB8B0,0x9090,0x9091,0x9092,0xB8B1,0x9093,0x9094,0x9095, +0x9096,0x9097,0x9098,0x9099,0xB8B2,0xB8B3,0x909A,0xB8B4, +0x909B,0xB8B5,0x909C,0x909D,0x909E,0x909F,0x90A0,0x90A1, +0xB8B6,0xB8B7,0x90A2,0x90A3,0xB8B8,0x90A4,0xB8B9,0xB8BA, +0xB8BB,0xB8BC,0xB8BD,0x90A5,0x90A6,0x90A7,0x90A8,0x90A9, +0xB8BE,0xB8BF,0x90AA,0xB8C0,0x90AB,0xB8C1,0xB8C2,0x90AC, +0x90AD,0xB8C3,0x90AE,0xB8C4,0xB8C5,0xB8C6,0x90AF,0x90B0, +0xB8C7,0x90B1,0x90B2,0x90B3,0xB8C8,0x90B4,0x90B5,0x90B6, +0x90B7,0x90B8,0x90B9,0x90BA,0xB8C9,0xB8CA,0x90BB,0xB8CB, +0xB8CC,0xB8CD,0xB8CE,0x90BC,0x90BD,0x90BE,0x90BF,0x90C0, +0xB8CF,0xB8D0,0x90C1,0x90C2,0x90C3,0x90C4,0x90C5,0x90C6, +0xB8D1,0x90C7,0x90C8,0x90C9,0x90CA,0x90CB,0x90CC,0x90CD, +0x90CE,0x90CF,0x90D0,0x90D1,0x90D2,0xB8D2,0x90D3,0x90D4, +0x90D5,0x90D6,0x90D7,0x90D8,0x90D9,0x90DA,0x90DB,0x90DC, +0x90DD,0x90DE,0x90DF,0x90E0,0x90E1,0x90E2,0x90E3,0x90E4, +0x90E5,0x90E6,0x90E7,0x90E8,0x90E9,0x90EA,0x90EB,0x90EC, +0x90ED,0x90EE,0x90EF,0x90F0,0x90F1,0x90F2,0x90F3,0x90F4, +0xB8D3,0xB8D4,0x90F5,0x90F6,0xB8D5,0x90F7,0x90F8,0x90F9, +0xB8D6,0x90FA,0xB8D7,0x90FB,0x90FC,0x90FD,0x90FE,0x9141, +0xB8D8,0xB8D9,0x9142,0xB8DA,0x9143,0xB8DB,0xB8DC,0x9144, +0x9145,0x9146,0x9147,0xB8DD,0xB8DE,0xB8DF,0x9148,0x9149, +0xB8E0,0x914A,0x914B,0x914C,0xB8E1,0x914D,0x914E,0x914F, +0x9150,0x9151,0x9152,0x9153,0xB8E2,0xB8E3,0x9154,0xB8E4, +0xB8E5,0xB8E6,0x9155,0x9156,0x9157,0x9158,0x9159,0x915A, +0xB8E7,0xB8E8,0x9161,0x9162,0xB8E9,0x9163,0x9164,0x9165, +0xB8EA,0x9166,0x9167,0x9168,0x9169,0x916A,0x916B,0x916C, +0x916D,0x916E,0x916F,0xB8EB,0xB8EC,0xB8ED,0x9170,0xB8EE, +0x9171,0x9172,0x9173,0x9174,0xB8EF,0x9175,0x9176,0x9177, +0x9178,0x9179,0x917A,0x9181,0x9182,0x9183,0x9184,0x9185, +0x9186,0x9187,0x9188,0x9189,0x918A,0x918B,0x918C,0x918D, +0x918E,0x918F,0x9190,0x9191,0x9192,0x9193,0x9194,0x9195, +0xB8F0,0xB8F1,0x9196,0xB8F2,0xB8F3,0x9197,0x9198,0x9199, +0xB8F4,0x919A,0xB8F5,0x919B,0x919C,0x919D,0x919E,0x919F, +0xB8F6,0xB8F7,0x91A0,0xB8F8,0x91A1,0xB8F9,0x91A2,0x91A3, +0x91A4,0x91A5,0x91A6,0x91A7,0xB8FA,0x91A8,0x91A9,0x91AA, +0xB8FB,0x91AB,0x91AC,0x91AD,0x91AE,0x91AF,0x91B0,0x91B1, +0x91B2,0x91B3,0x91B4,0x91B5,0x91B6,0x91B7,0x91B8,0x91B9, +0xB8FC,0xB8FD,0x91BA,0x91BB,0x91BC,0x91BD,0x91BE,0x91BF, +0x91C0,0x91C1,0x91C2,0x91C3,0x91C4,0x91C5,0x91C6,0x91C7, +0x91C8,0x91C9,0x91CA,0x91CB,0x91CC,0x91CD,0x91CE,0x91CF, +0x91D0,0x91D1,0x91D2,0x91D3,0x91D4,0x91D5,0x91D6,0x91D7, +0x91D8,0x91D9,0x91DA,0x91DB,0xB8FE,0x91DC,0x91DD,0x91DE, +0xB9A1,0x91DF,0x91E0,0x91E1,0xB9A2,0x91E2,0x91E3,0x91E4, +0x91E5,0x91E6,0x91E7,0x91E8,0x91E9,0xB9A3,0x91EA,0xB9A4, +0x91EB,0xB9A5,0x91EC,0x91ED,0x91EE,0x91EF,0x91F0,0x91F1, +0xB9A6,0x91F2,0x91F3,0x91F4,0xB9A7,0x91F5,0x91F6,0x91F7, +0xB9A8,0x91F8,0x91F9,0x91FA,0x91FB,0x91FC,0x91FD,0x91FE, +0x9241,0xB9A9,0x9242,0xB9AA,0x9243,0x9244,0x9245,0x9246, +0x9247,0x9248,0x9249,0x924A,0xB9AB,0xB9AC,0xB9AD,0x924B, +0xB9AE,0x924C,0x924D,0xB9AF,0xB9B0,0xB9B1,0xB9B2,0x924E, +0x924F,0x9250,0x9251,0x9252,0xB9B3,0xB9B4,0x9253,0xB9B5, +0x9254,0xB9B6,0x9255,0x9256,0x9257,0xB9B7,0x9258,0xB9B8, +0xB9B9,0x9259,0x925A,0x9261,0xB9BA,0x9262,0x9263,0x9264, +0xB9BB,0x9265,0x9266,0x9267,0x9268,0x9269,0x926A,0x926B, +0x926C,0xB9BC,0x926D,0xB9BD,0x926E,0x926F,0x9270,0x9271, +0x9272,0x9273,0x9274,0x9275,0xB9BE,0x9276,0x9277,0x9278, +0x9279,0x927A,0x9281,0x9282,0x9283,0x9284,0x9285,0x9286, +0x9287,0x9288,0x9289,0x928A,0x928B,0x928C,0x928D,0x928E, +0x928F,0x9290,0x9291,0x9292,0x9293,0x9294,0x9295,0x9296, +0xB9BF,0x9297,0x9298,0x9299,0xB9C0,0x929A,0x929B,0x929C, +0xB9C1,0x929D,0x929E,0x929F,0x92A0,0x92A1,0x92A2,0x92A3, +0x92A4,0x92A5,0x92A6,0x92A7,0x92A8,0x92A9,0x92AA,0x92AB, +0x92AC,0x92AD,0x92AE,0x92AF,0xB9C2,0x92B0,0x92B1,0x92B2, +0xB9C3,0x92B3,0x92B4,0x92B5,0xB9C4,0x92B6,0x92B7,0x92B8, +0x92B9,0x92BA,0x92BB,0x92BC,0xB9C5,0x92BD,0x92BE,0xB9C6, +0x92BF,0x92C0,0x92C1,0x92C2,0x92C3,0x92C4,0x92C5,0x92C6, +0xB9C7,0x92C7,0x92C8,0x92C9,0xB9C8,0x92CA,0x92CB,0x92CC, +0xB9C9,0x92CD,0x92CE,0x92CF,0x92D0,0x92D1,0x92D2,0x92D3, +0xB9CA,0x92D4,0x92D5,0xB9CB,0x92D6,0x92D7,0x92D8,0x92D9, +0x92DA,0x92DB,0x92DC,0x92DD,0x92DE,0x92DF,0x92E0,0x92E1, +0x92E2,0x92E3,0x92E4,0x92E5,0x92E6,0x92E7,0x92E8,0x92E9, +0x92EA,0x92EB,0x92EC,0x92ED,0x92EE,0x92EF,0x92F0,0x92F1, +0x92F2,0x92F3,0x92F4,0x92F5,0x92F6,0x92F7,0x92F8,0x92F9, +0xB9CC,0xB9CD,0x92FA,0x92FB,0xB9CE,0x92FC,0x92FD,0xB9CF, +0xB9D0,0x92FE,0xB9D1,0x9341,0x9342,0x9343,0x9344,0x9345, +0xB9D2,0xB9D3,0x9346,0xB9D4,0xB9D5,0xB9D6,0x9347,0xB9D7, +0x9348,0xB9D8,0x9349,0x934A,0xB9D9,0xB9DA,0xB9DB,0xB9DC, +0xB9DD,0x934B,0x934C,0xB9DE,0xB9DF,0xB9E0,0xB9E1,0xB9E2, +0x934D,0x934E,0x934F,0x9350,0xB9E3,0xB9E4,0x9351,0xB9E5, +0x9352,0xB9E6,0x9353,0x9354,0x9355,0xB9E7,0x9356,0x9357, +0xB9E8,0xB9E9,0x9358,0x9359,0xB9EA,0x935A,0x9361,0x9362, +0xB9EB,0x9363,0x9364,0x9365,0x9366,0x9367,0x9368,0x9369, +0xB9EC,0xB9ED,0x936A,0xB9EE,0xB9EF,0xB9F0,0x936B,0x936C, +0x936D,0xB9F1,0x936E,0x936F,0xB9F2,0xB9F3,0x9370,0x9371, +0xB9F4,0x9372,0x9373,0x9374,0x9375,0x9376,0x9377,0x9378, +0x9379,0x937A,0x9381,0x9382,0x9383,0xB9F5,0x9384,0x9385, +0x9386,0x9387,0x9388,0x9389,0x938A,0x938B,0x938C,0x938D, +0x938E,0x938F,0x9390,0x9391,0x9392,0x9393,0x9394,0x9395, +0x9396,0x9397,0x9398,0x9399,0x939A,0x939B,0x939C,0x939D, +0x939E,0x939F,0x93A0,0x93A1,0x93A2,0x93A3,0x93A4,0x93A5, +0x93A6,0x93A7,0x93A8,0x93A9,0xB9F6,0xB9F7,0x93AA,0x93AB, +0xB9F8,0x93AC,0x93AD,0xB9F9,0xB9FA,0x93AE,0xB9FB,0x93AF, +0x93B0,0x93B1,0x93B2,0x93B3,0xB9FC,0xB9FD,0x93B4,0xB9FE, +0x93B5,0xBAA1,0xBAA2,0x93B6,0x93B7,0x93B8,0x93B9,0x93BA, +0xBAA3,0xBAA4,0x93BB,0x93BC,0xBAA5,0x93BD,0x93BE,0xBAA6, +0xBAA7,0x93BF,0x93C0,0x93C1,0x93C2,0x93C3,0x93C4,0x93C5, +0xBAA8,0xBAA9,0x93C6,0xBAAA,0xBAAB,0xBAAC,0x93C7,0x93C8, +0x93C9,0x93CA,0x93CB,0x93CC,0xBAAD,0xBAAE,0x93CD,0x93CE, +0xBAAF,0x93CF,0x93D0,0x93D1,0xBAB0,0x93D2,0x93D3,0x93D4, +0x93D5,0x93D6,0x93D7,0x93D8,0x93D9,0xBAB1,0x93DA,0xBAB2, +0xBAB3,0xBAB4,0x93DB,0x93DC,0x93DD,0xBAB5,0x93DE,0x93DF, +0xBAB6,0x93E0,0x93E1,0x93E2,0xBAB7,0x93E3,0x93E4,0x93E5, +0x93E6,0x93E7,0x93E8,0x93E9,0x93EA,0x93EB,0x93EC,0x93ED, +0x93EE,0x93EF,0x93F0,0x93F1,0x93F2,0x93F3,0x93F4,0x93F5, +0x93F6,0x93F7,0x93F8,0x93F9,0xBAB8,0xBAB9,0xBABA,0x93FA, +0xBABB,0x93FB,0x93FC,0x93FD,0xBABC,0x93FE,0x9441,0x9442, +0x9443,0x9444,0x9445,0x9446,0xBABD,0xBABE,0x9447,0xBABF, +0x9448,0xBAC0,0x9449,0x944A,0x944B,0x944C,0x944D,0x944E, +0xBAC1,0x944F,0x9450,0x9451,0xBAC2,0x9452,0x9453,0x9454, +0x9455,0x9456,0x9457,0x9458,0x9459,0x945A,0x9461,0x9462, +0x9463,0x9464,0x9465,0x9466,0xBAC3,0x9467,0x9468,0x9469, +0x946A,0x946B,0x946C,0x946D,0xBAC4,0x946E,0x946F,0x9470, +0x9471,0x9472,0x9473,0x9474,0x9475,0x9476,0x9477,0x9478, +0x9479,0x947A,0x9481,0x9482,0x9483,0x9484,0x9485,0x9486, +0xBAC5,0x9487,0x9488,0x9489,0x948A,0x948B,0x948C,0x948D, +0xBAC6,0xBAC7,0x948E,0x948F,0xBAC8,0x9490,0x9491,0x9492, +0xBAC9,0x9493,0x9494,0x9495,0x9496,0x9497,0x9498,0x9499, +0xBACA,0xBACB,0x949A,0x949B,0x949C,0x949D,0x949E,0x949F, +0x94A0,0x94A1,0x94A2,0x94A3,0xBACC,0x94A4,0x94A5,0x94A6, +0xBACD,0x94A7,0x94A8,0x94A9,0x94AA,0x94AB,0x94AC,0x94AD, +0x94AE,0x94AF,0x94B0,0x94B1,0x94B2,0x94B3,0x94B4,0x94B5, +0x94B6,0x94B7,0x94B8,0x94B9,0x94BA,0x94BB,0x94BC,0x94BD, +0xBACE,0xBACF,0x94BE,0x94BF,0xBAD0,0x94C0,0x94C1,0xBAD1, +0xBAD2,0xBAD3,0xBAD4,0x94C2,0x94C3,0x94C4,0x94C5,0x94C6, +0xBAD5,0xBAD6,0x94C7,0xBAD7,0x94C8,0xBAD8,0x94C9,0x94CA, +0x94CB,0xBAD9,0xBADA,0x94CC,0xBADB,0x94CD,0x94CE,0x94CF, +0x94D0,0x94D1,0x94D2,0x94D3,0xBADC,0x94D4,0x94D5,0x94D6, +0x94D7,0x94D8,0x94D9,0x94DA,0x94DB,0x94DC,0x94DD,0x94DE, +0xBADD,0x94DF,0x94E0,0x94E1,0x94E2,0x94E3,0x94E4,0x94E5, +0xBADE,0x94E6,0x94E7,0x94E8,0x94E9,0x94EA,0x94EB,0x94EC, +0x94ED,0x94EE,0x94EF,0x94F0,0x94F1,0x94F2,0x94F3,0x94F4, +0x94F5,0x94F6,0x94F7,0x94F8,0x94F9,0x94FA,0x94FB,0x94FC, +0x94FD,0x94FE,0x9541,0x9542,0xBADF,0xBAE0,0x9543,0x9544, +0xBAE1,0x9545,0x9546,0x9547,0xBAE2,0x9548,0x9549,0x954A, +0x954B,0x954C,0x954D,0x954E,0x954F,0x9550,0x9551,0x9552, +0x9553,0xBAE3,0x9554,0x9555,0x9556,0x9557,0x9558,0x9559, +0xBAE4,0x955A,0x9561,0x9562,0xBAE5,0x9563,0x9564,0x9565, +0xBAE6,0x9566,0x9567,0x9568,0x9569,0x956A,0x956B,0x956C, +0xBAE7,0x956D,0x956E,0xBAE8,0x956F,0xBAE9,0x9570,0x9571, +0x9572,0x9573,0x9574,0x9575,0xBAEA,0xBAEB,0x9576,0x9577, +0xBAEC,0x9578,0x9579,0x957A,0xBAED,0x9581,0x9582,0x9583, +0x9584,0x9585,0x9586,0x9587,0xBAEE,0xBAEF,0x9588,0xBAF0, +0x9589,0x958A,0x958B,0x958C,0x958D,0x958E,0x958F,0x9590, +0x9591,0x9592,0x9593,0x9594,0x9595,0x9596,0x9597,0x9598, +0x9599,0x959A,0x959B,0x959C,0x959D,0x959E,0x959F,0x95A0, +0x95A1,0x95A2,0x95A3,0x95A4,0x95A5,0x95A6,0x95A7,0x95A8, +0x95A9,0x95AA,0x95AB,0x95AC,0xBAF1,0xBAF2,0x95AD,0x95AE, +0xBAF3,0x95AF,0x95B0,0x95B1,0xBAF4,0x95B2,0xBAF5,0x95B3, +0x95B4,0x95B5,0x95B6,0x95B7,0xBAF6,0xBAF7,0x95B8,0xBAF8, +0x95B9,0xBAF9,0xBAFA,0xBAFB,0x95BA,0x95BB,0x95BC,0x95BD, +0xBAFC,0xBAFD,0x95BE,0x95BF,0xBAFE,0x95C0,0x95C1,0x95C2, +0xBBA1,0x95C3,0xBBA2,0x95C4,0x95C5,0x95C6,0x95C7,0x95C8, +0xBBA3,0xBBA4,0x95C9,0xBBA5,0xBBA6,0xBBA7,0x95CA,0x95CB, +0x95CC,0x95CD,0x95CE,0xBBA8,0xBBA9,0xBBAA,0x95CF,0x95D0, +0xBBAB,0x95D1,0x95D2,0x95D3,0xBBAC,0x95D4,0x95D5,0x95D6, +0x95D7,0x95D8,0x95D9,0x95DA,0xBBAD,0xBBAE,0x95DB,0xBBAF, +0xBBB0,0xBBB1,0x95DC,0x95DD,0x95DE,0x95DF,0x95E0,0x95E1, +0xBBB2,0xBBB3,0x95E2,0x95E3,0x95E4,0x95E5,0x95E6,0x95E7, +0x95E8,0x95E9,0x95EA,0x95EB,0x95EC,0x95ED,0x95EE,0x95EF, +0xBBB4,0x95F0,0x95F1,0x95F2,0x95F3,0x95F4,0x95F5,0x95F6, +0x95F7,0x95F8,0x95F9,0x95FA,0x95FB,0x95FC,0x95FD,0x95FE, +0x9641,0x9642,0x9643,0x9644,0x9645,0x9646,0x9647,0x9648, +0x9649,0x964A,0x964B,0x964C,0x964D,0x964E,0x964F,0x9650, +0x9651,0x9652,0x9653,0x9654,0x9655,0x9656,0x9657,0x9658, +0xBBB5,0xBBB6,0x9659,0x965A,0xBBB7,0x9661,0x9662,0xBBB8, +0xBBB9,0x9663,0x9664,0x9665,0x9666,0x9667,0x9668,0x9669, +0xBBBA,0x966A,0x966B,0xBBBB,0xBBBC,0xBBBD,0x966C,0x966D, +0x966E,0x966F,0x9670,0x9671,0xBBBE,0x9672,0x9673,0x9674, +0x9675,0x9676,0x9677,0x9678,0x9679,0x967A,0x9681,0x9682, +0x9683,0x9684,0x9685,0x9686,0x9687,0x9688,0x9689,0x968A, +0x968B,0xBBBF,0x968C,0x968D,0x968E,0x968F,0x9690,0x9691, +0xBBC0,0xBBC1,0x9692,0x9693,0x9694,0x9695,0x9696,0x9697, +0x9698,0x9699,0x969A,0x969B,0x969C,0x969D,0x969E,0x969F, +0xBBC2,0xBBC3,0x96A0,0xBBC4,0xBBC5,0xBBC6,0x96A1,0x96A2, +0x96A3,0x96A4,0x96A5,0x96A6,0x96A7,0x96A8,0x96A9,0x96AA, +0x96AB,0x96AC,0x96AD,0x96AE,0x96AF,0x96B0,0x96B1,0x96B2, +0x96B3,0x96B4,0x96B5,0x96B6,0x96B7,0x96B8,0x96B9,0x96BA, +0x96BB,0x96BC,0x96BD,0x96BE,0x96BF,0x96C0,0x96C1,0x96C2, +0xBBC7,0xBBC8,0x96C3,0x96C4,0xBBC9,0x96C5,0x96C6,0x96C7, +0xBBCA,0x96C8,0x96C9,0x96CA,0x96CB,0x96CC,0x96CD,0x96CE, +0xBBCB,0xBBCC,0x96CF,0x96D0,0x96D1,0xBBCD,0x96D2,0x96D3, +0x96D4,0x96D5,0x96D6,0x96D7,0x96D8,0x96D9,0x96DA,0x96DB, +0x96DC,0x96DD,0x96DE,0x96DF,0x96E0,0x96E1,0x96E2,0x96E3, +0x96E4,0x96E5,0x96E6,0x96E7,0x96E8,0x96E9,0x96EA,0x96EB, +0x96EC,0x96ED,0x96EE,0x96EF,0x96F0,0x96F1,0x96F2,0x96F3, +0x96F4,0x96F5,0x96F6,0x96F7,0x96F8,0x96F9,0x96FA,0x96FB, +0x96FC,0x96FD,0x96FE,0x9741,0x9742,0x9743,0x9744,0x9745, +0x9746,0x9747,0x9748,0x9749,0x974A,0x974B,0x974C,0x974D, +0x974E,0x974F,0x9750,0x9751,0xBBCE,0x9752,0x9753,0x9754, +0x9755,0x9756,0x9757,0x9758,0x9759,0x975A,0x9761,0x9762, +0x9763,0x9764,0x9765,0x9766,0x9767,0x9768,0x9769,0x976A, +0x976B,0x976C,0x976D,0x976E,0x976F,0x9770,0x9771,0x9772, +0xBBCF,0x9773,0x9774,0x9775,0x9776,0x9777,0x9778,0x9779, +0x977A,0x9781,0x9782,0x9783,0x9784,0x9785,0x9786,0x9787, +0x9788,0x9789,0x978A,0x978B,0x978C,0xBBD0,0x978D,0x978E, +0x978F,0x9790,0x9791,0x9792,0xBBD1,0xBBD2,0x9793,0x9794, +0xBBD3,0x9795,0x9796,0x9797,0xBBD4,0x9798,0x9799,0x979A, +0x979B,0x979C,0x979D,0x979E,0xBBD5,0x979F,0x97A0,0xBBD6, +0x97A1,0xBBD7,0x97A2,0x97A3,0x97A4,0x97A5,0x97A6,0x97A7, +0x97A8,0x97A9,0x97AA,0x97AB,0x97AC,0x97AD,0x97AE,0x97AF, +0x97B0,0x97B1,0x97B2,0x97B3,0x97B4,0x97B5,0x97B6,0x97B7, +0x97B8,0x97B9,0x97BA,0x97BB,0x97BC,0x97BD,0x97BE,0x97BF, +0x97C0,0x97C1,0x97C2,0x97C3,0x97C4,0x97C5,0x97C6,0x97C7, +0x97C8,0x97C9,0x97CA,0x97CB,0x97CC,0x97CD,0x97CE,0x97CF, +0x97D0,0x97D1,0x97D2,0x97D3,0x97D4,0x97D5,0x97D6,0x97D7, +0x97D8,0x97D9,0x97DA,0x97DB,0x97DC,0x97DD,0x97DE,0x97DF, +0x97E0,0x97E1,0x97E2,0x97E3,0x97E4,0x97E5,0x97E6,0x97E7, +0x97E8,0x97E9,0x97EA,0x97EB,0x97EC,0x97ED,0x97EE,0x97EF, +0x97F0,0x97F1,0x97F2,0x97F3,0x97F4,0x97F5,0x97F6,0x97F7, +0x97F8,0x97F9,0x97FA,0x97FB,0xBBD8,0x97FC,0x97FD,0x97FE, +0x9841,0x9842,0x9843,0x9844,0x9845,0x9846,0x9847,0x9848, +0x9849,0x984A,0x984B,0x984C,0x984D,0x984E,0x984F,0x9850, +0x9851,0xBBD9,0x9852,0x9853,0x9854,0x9855,0x9856,0x9857, +0xBBDA,0x9858,0x9859,0x985A,0xBBDB,0x9861,0x9862,0x9863, +0xBBDC,0x9864,0x9865,0x9866,0x9867,0x9868,0x9869,0x986A, +0xBBDD,0xBBDE,0x986B,0x986C,0x986D,0x986E,0x986F,0x9870, +0x9871,0x9872,0x9873,0x9874,0x9875,0x9876,0x9877,0x9878, +0x9879,0x987A,0x9881,0x9882,0x9883,0x9884,0x9885,0x9886, +0x9887,0x9888,0x9889,0x988A,0x988B,0x988C,0x988D,0x988E, +0x988F,0x9890,0x9891,0x9892,0x9893,0x9894,0x9895,0x9896, +0xBBDF,0xBBE0,0x9897,0x9898,0xBBE1,0x9899,0x989A,0x989B, +0xBBE2,0x989C,0x989D,0x989E,0x989F,0x98A0,0x98A1,0x98A2, +0xBBE3,0xBBE4,0x98A3,0xBBE5,0x98A4,0xBBE6,0x98A5,0x98A6, +0x98A7,0x98A8,0x98A9,0x98AA,0xBBE7,0xBBE8,0x98AB,0xBBE9, +0xBBEA,0x98AC,0x98AD,0xBBEB,0xBBEC,0xBBED,0xBBEE,0x98AE, +0x98AF,0x98B0,0x98B1,0x98B2,0xBBEF,0xBBF0,0x98B3,0xBBF1, +0xBBF2,0xBBF3,0x98B4,0x98B5,0x98B6,0xBBF4,0x98B7,0x98B8, +0xBBF5,0xBBF6,0x98B9,0x98BA,0xBBF7,0x98BB,0x98BC,0x98BD, +0xBBF8,0x98BE,0x98BF,0x98C0,0x98C1,0x98C2,0x98C3,0x98C4, +0xBBF9,0xBBFA,0x98C5,0xBBFB,0xBBFC,0xBBFD,0x98C6,0x98C7, +0x98C8,0x98C9,0x98CA,0x98CB,0xBBFE,0xBCA1,0x98CC,0x98CD, +0xBCA2,0x98CE,0x98CF,0x98D0,0xBCA3,0x98D1,0x98D2,0x98D3, +0x98D4,0x98D5,0x98D6,0x98D7,0xBCA4,0xBCA5,0x98D8,0xBCA6, +0x98D9,0xBCA7,0x98DA,0x98DB,0x98DC,0x98DD,0x98DE,0x98DF, +0xBCA8,0x98E0,0x98E1,0x98E2,0xBCA9,0x98E3,0x98E4,0x98E5, +0xBCAA,0x98E6,0x98E7,0x98E8,0x98E9,0x98EA,0x98EB,0x98EC, +0xBCAB,0x98ED,0x98EE,0x98EF,0x98F0,0xBCAC,0x98F1,0x98F2, +0x98F3,0x98F4,0x98F5,0x98F6,0xBCAD,0xBCAE,0xBCAF,0xBCB0, +0xBCB1,0x98F7,0x98F8,0xBCB2,0xBCB3,0x98F9,0xBCB4,0xBCB5, +0x98FA,0x98FB,0x98FC,0x98FD,0xBCB6,0xBCB7,0x98FE,0xBCB8, +0xBCB9,0xBCBA,0x9941,0x9942,0x9943,0x9944,0xBCBB,0x9945, +0xBCBC,0xBCBD,0x9946,0x9947,0xBCBE,0x9948,0x9949,0x994A, +0xBCBF,0x994B,0x994C,0x994D,0x994E,0x994F,0x9950,0x9951, +0xBCC0,0xBCC1,0x9952,0xBCC2,0xBCC3,0xBCC4,0x9953,0x9954, +0x9955,0x9956,0x9957,0x9958,0xBCC5,0xBCC6,0x9959,0x995A, +0xBCC7,0x9961,0x9962,0x9963,0xBCC8,0x9964,0x9965,0x9966, +0x9967,0x9968,0x9969,0x996A,0xBCC9,0xBCCA,0x996B,0xBCCB, +0xBCCC,0xBCCD,0x996C,0x996D,0x996E,0x996F,0x9970,0x9971, +0xBCCE,0x9972,0x9973,0x9974,0xBCCF,0x9975,0x9976,0x9977, +0xBCD0,0x9978,0x9979,0x997A,0x9981,0x9982,0x9983,0x9984, +0x9985,0x9986,0x9987,0x9988,0x9989,0xBCD1,0x998A,0x998B, +0x998C,0x998D,0x998E,0x998F,0xBCD2,0xBCD3,0xBCD4,0x9990, +0xBCD5,0x9991,0x9992,0x9993,0xBCD6,0x9994,0xBCD7,0x9995, +0x9996,0x9997,0x9998,0x9999,0xBCD8,0xBCD9,0x999A,0xBCDA, +0x999B,0xBCDB,0x999C,0x999D,0x999E,0xBCDC,0x999F,0x99A0, +0xBCDD,0xBCDE,0x99A1,0x99A2,0xBCDF,0x99A3,0x99A4,0x99A5, +0xBCE0,0x99A6,0x99A7,0x99A8,0x99A9,0x99AA,0x99AB,0x99AC, +0x99AD,0x99AE,0x99AF,0x99B0,0x99B1,0xBCE1,0x99B2,0x99B3, +0x99B4,0x99B5,0x99B6,0x99B7,0xBCE2,0x99B8,0x99B9,0x99BA, +0xBCE3,0x99BB,0x99BC,0x99BD,0xBCE4,0x99BE,0x99BF,0x99C0, +0x99C1,0x99C2,0x99C3,0x99C4,0xBCE5,0x99C5,0x99C6,0xBCE6, +0xBCE7,0x99C7,0x99C8,0x99C9,0x99CA,0x99CB,0x99CC,0x99CD, +0xBCE8,0x99CE,0x99CF,0x99D0,0xBCE9,0x99D1,0x99D2,0x99D3, +0xBCEA,0x99D4,0x99D5,0x99D6,0x99D7,0x99D8,0x99D9,0x99DA, +0xBCEB,0xBCEC,0x99DB,0xBCED,0x99DC,0x99DD,0x99DE,0x99DF, +0x99E0,0x99E1,0x99E2,0x99E3,0xBCEE,0xBCEF,0x99E4,0x99E5, +0xBCF0,0x99E6,0x99E7,0x99E8,0xBCF1,0x99E9,0x99EA,0x99EB, +0x99EC,0x99ED,0x99EE,0x99EF,0xBCF2,0xBCF3,0x99F0,0xBCF4, +0x99F1,0xBCF5,0x99F2,0x99F3,0x99F4,0x99F5,0x99F6,0x99F7, +0xBCF6,0xBCF7,0x99F8,0x99F9,0xBCF8,0x99FA,0x99FB,0xBCF9, +0xBCFA,0x99FC,0x99FD,0x99FE,0x9A41,0x9A42,0x9A43,0x9A44, +0xBCFB,0xBCFC,0x9A45,0xBCFD,0x9A46,0xBCFE,0x9A47,0xBDA1, +0x9A48,0xBDA2,0xBDA3,0x9A49,0xBDA4,0x9A4A,0x9A4B,0x9A4C, +0x9A4D,0x9A4E,0x9A4F,0x9A50,0x9A51,0x9A52,0x9A53,0x9A54, +0x9A55,0x9A56,0x9A57,0x9A58,0x9A59,0x9A5A,0x9A61,0x9A62, +0xBDA5,0x9A63,0x9A64,0x9A65,0x9A66,0x9A67,0x9A68,0x9A69, +0xBDA6,0xBDA7,0x9A6A,0x9A6B,0xBDA8,0x9A6C,0x9A6D,0x9A6E, +0xBDA9,0x9A6F,0x9A70,0x9A71,0x9A72,0x9A73,0x9A74,0x9A75, +0xBDAA,0x9A76,0x9A77,0x9A78,0x9A79,0xBDAB,0x9A7A,0x9A81, +0x9A82,0x9A83,0x9A84,0x9A85,0xBDAC,0xBDAD,0x9A86,0x9A87, +0xBDAE,0x9A88,0x9A89,0x9A8A,0xBDAF,0x9A8B,0x9A8C,0x9A8D, +0x9A8E,0x9A8F,0x9A90,0x9A91,0xBDB0,0xBDB1,0x9A92,0xBDB2, +0x9A93,0xBDB3,0x9A94,0x9A95,0x9A96,0x9A97,0x9A98,0x9A99, +0xBDB4,0xBDB5,0x9A9A,0x9A9B,0x9A9C,0x9A9D,0x9A9E,0x9A9F, +0xBDB6,0x9AA0,0x9AA1,0x9AA2,0x9AA3,0x9AA4,0x9AA5,0x9AA6, +0xBDB7,0x9AA7,0x9AA8,0xBDB8,0x9AA9,0xBDB9,0x9AAA,0x9AAB, +0x9AAC,0x9AAD,0x9AAE,0x9AAF,0xBDBA,0xBDBB,0x9AB0,0x9AB1, +0xBDBC,0x9AB2,0x9AB3,0x9AB4,0xBDBD,0xBDBE,0x9AB5,0x9AB6, +0x9AB7,0x9AB8,0x9AB9,0x9ABA,0xBDBF,0xBDC0,0x9ABB,0xBDC1, +0x9ABC,0xBDC2,0x9ABD,0x9ABE,0x9ABF,0x9AC0,0x9AC1,0x9AC2, +0x9AC3,0x9AC4,0x9AC5,0x9AC6,0x9AC7,0x9AC8,0x9AC9,0x9ACA, +0x9ACB,0x9ACC,0x9ACD,0x9ACE,0x9ACF,0x9AD0,0x9AD1,0x9AD2, +0x9AD3,0x9AD4,0x9AD5,0x9AD6,0x9AD7,0x9AD8,0x9AD9,0x9ADA, +0x9ADB,0x9ADC,0x9ADD,0x9ADE,0xBDC3,0xBDC4,0x9ADF,0x9AE0, +0xBDC5,0x9AE1,0x9AE2,0xBDC6,0xBDC7,0x9AE3,0x9AE4,0x9AE5, +0x9AE6,0x9AE7,0x9AE8,0xBDC8,0xBDC9,0xBDCA,0x9AE9,0xBDCB, +0x9AEA,0xBDCC,0x9AEB,0x9AEC,0x9AED,0x9AEE,0xBDCD,0x9AEF, +0xBDCE,0xBDCF,0x9AF0,0xBDD0,0xBDD1,0x9AF1,0x9AF2,0x9AF3, +0xBDD2,0x9AF4,0x9AF5,0x9AF6,0x9AF7,0x9AF8,0x9AF9,0x9AFA, +0xBDD3,0xBDD4,0x9AFB,0x9AFC,0xBDD5,0xBDD6,0x9AFD,0x9AFE, +0x9B41,0x9B42,0x9B43,0xBDD7,0xBDD8,0xBDD9,0x9B44,0x9B45, +0xBDDA,0x9B46,0x9B47,0x9B48,0xBDDB,0x9B49,0x9B4A,0x9B4B, +0x9B4C,0x9B4D,0x9B4E,0x9B4F,0xBDDC,0xBDDD,0x9B50,0x9B51, +0xBDDE,0xBDDF,0x9B52,0x9B53,0x9B54,0x9B55,0x9B56,0x9B57, +0x9B58,0x9B59,0x9B5A,0x9B61,0x9B62,0x9B63,0x9B64,0x9B65, +0x9B66,0x9B67,0x9B68,0x9B69,0x9B6A,0x9B6B,0x9B6C,0x9B6D, +0x9B6E,0x9B6F,0x9B70,0x9B71,0x9B72,0xBDE0,0x9B73,0x9B74, +0x9B75,0x9B76,0x9B77,0x9B78,0x9B79,0x9B7A,0x9B81,0x9B82, +0x9B83,0x9B84,0x9B85,0x9B86,0x9B87,0x9B88,0x9B89,0x9B8A, +0x9B8B,0x9B8C,0x9B8D,0x9B8E,0x9B8F,0x9B90,0x9B91,0x9B92, +0x9B93,0x9B94,0x9B95,0x9B96,0x9B97,0x9B98,0x9B99,0x9B9A, +0xBDE1,0xBDE2,0x9B9B,0x9B9C,0xBDE3,0x9B9D,0x9B9E,0x9B9F, +0xBDE4,0x9BA0,0xBDE5,0x9BA1,0x9BA2,0x9BA3,0x9BA4,0x9BA5, +0xBDE6,0xBDE7,0x9BA6,0x9BA7,0xBDE8,0xBDE9,0x9BA8,0x9BA9, +0x9BAA,0x9BAB,0x9BAC,0x9BAD,0xBDEA,0x9BAE,0x9BAF,0x9BB0, +0xBDEB,0x9BB1,0x9BB2,0x9BB3,0xBDEC,0x9BB4,0x9BB5,0x9BB6, +0x9BB7,0x9BB8,0x9BB9,0x9BBA,0x9BBB,0x9BBC,0x9BBD,0x9BBE, +0x9BBF,0x9BC0,0x9BC1,0x9BC2,0x9BC3,0x9BC4,0x9BC5,0x9BC6, +0x9BC7,0x9BC8,0x9BC9,0x9BCA,0x9BCB,0x9BCC,0x9BCD,0x9BCE, +0x9BCF,0x9BD0,0x9BD1,0x9BD2,0x9BD3,0x9BD4,0x9BD5,0x9BD6, +0x9BD7,0x9BD8,0x9BD9,0x9BDA,0x9BDB,0x9BDC,0x9BDD,0x9BDE, +0x9BDF,0x9BE0,0x9BE1,0x9BE2,0x9BE3,0x9BE4,0x9BE5,0x9BE6, +0xBDED,0x9BE7,0x9BE8,0x9BE9,0x9BEA,0x9BEB,0x9BEC,0x9BED, +0x9BEE,0x9BEF,0x9BF0,0x9BF1,0x9BF2,0x9BF3,0x9BF4,0x9BF5, +0x9BF6,0x9BF7,0x9BF8,0x9BF9,0x9BFA,0x9BFB,0x9BFC,0x9BFD, +0xBDEE,0xBDEF,0x9BFE,0x9C41,0xBDF0,0x9C42,0x9C43,0xBDF1, +0xBDF2,0x9C44,0xBDF3,0x9C45,0x9C46,0x9C47,0x9C48,0x9C49, +0xBDF4,0xBDF5,0x9C4A,0x9C4B,0x9C4C,0xBDF6,0x9C4D,0x9C4E, +0x9C4F,0x9C50,0x9C51,0x9C52,0xBDF7,0xBDF8,0x9C53,0x9C54, +0xBDF9,0x9C55,0x9C56,0x9C57,0x9C58,0x9C59,0x9C5A,0x9C61, +0x9C62,0x9C63,0x9C64,0x9C65,0x9C66,0x9C67,0x9C68,0x9C69, +0xBDFA,0x9C6A,0x9C6B,0x9C6C,0x9C6D,0x9C6E,0x9C6F,0x9C70, +0xBDFB,0x9C71,0x9C72,0x9C73,0x9C74,0x9C75,0x9C76,0x9C77, +0x9C78,0x9C79,0x9C7A,0x9C81,0x9C82,0x9C83,0x9C84,0x9C85, +0x9C86,0x9C87,0x9C88,0x9C89,0xBDFC,0x9C8A,0x9C8B,0x9C8C, +0x9C8D,0x9C8E,0x9C8F,0x9C90,0xBDFD,0x9C91,0x9C92,0x9C93, +0xBDFE,0x9C94,0x9C95,0x9C96,0xBEA1,0x9C97,0x9C98,0x9C99, +0x9C9A,0x9C9B,0x9C9C,0x9C9D,0xBEA2,0xBEA3,0x9C9E,0x9C9F, +0x9CA0,0x9CA1,0x9CA2,0x9CA3,0x9CA4,0x9CA5,0x9CA6,0x9CA7, +0xBEA4,0x9CA8,0x9CA9,0x9CAA,0x9CAB,0x9CAC,0x9CAD,0x9CAE, +0x9CAF,0x9CB0,0x9CB1,0x9CB2,0x9CB3,0x9CB4,0x9CB5,0x9CB6, +0x9CB7,0x9CB8,0x9CB9,0x9CBA,0x9CBB,0x9CBC,0x9CBD,0x9CBE, +0x9CBF,0x9CC0,0x9CC1,0x9CC2,0xBEA5,0xBEA6,0x9CC3,0x9CC4, +0xBEA7,0x9CC5,0x9CC6,0x9CC7,0xBEA8,0x9CC8,0x9CC9,0x9CCA, +0x9CCB,0x9CCC,0x9CCD,0x9CCE,0xBEA9,0xBEAA,0x9CCF,0x9CD0, +0x9CD1,0xBEAB,0x9CD2,0x9CD3,0x9CD4,0x9CD5,0x9CD6,0x9CD7, +0xBEAC,0x9CD8,0x9CD9,0x9CDA,0x9CDB,0x9CDC,0x9CDD,0x9CDE, +0x9CDF,0x9CE0,0x9CE1,0x9CE2,0x9CE3,0x9CE4,0x9CE5,0x9CE6, +0x9CE7,0x9CE8,0x9CE9,0x9CEA,0xBEAD,0x9CEB,0x9CEC,0x9CED, +0x9CEE,0x9CEF,0x9CF0,0x9CF1,0xBEAE,0x9CF2,0x9CF3,0x9CF4, +0x9CF5,0x9CF6,0x9CF7,0x9CF8,0x9CF9,0x9CFA,0x9CFB,0x9CFC, +0x9CFD,0x9CFE,0x9D41,0x9D42,0x9D43,0x9D44,0x9D45,0x9D46, +0x9D47,0x9D48,0x9D49,0x9D4A,0x9D4B,0x9D4C,0x9D4D,0x9D4E, +0xBEAF,0x9D4F,0x9D50,0x9D51,0xBEB0,0x9D52,0x9D53,0x9D54, +0x9D55,0x9D56,0x9D57,0x9D58,0x9D59,0x9D5A,0x9D61,0x9D62, +0x9D63,0x9D64,0x9D65,0x9D66,0x9D67,0x9D68,0x9D69,0x9D6A, +0x9D6B,0x9D6C,0x9D6D,0x9D6E,0x9D6F,0x9D70,0x9D71,0x9D72, +0x9D73,0x9D74,0x9D75,0x9D76,0x9D77,0x9D78,0x9D79,0x9D7A, +0x9D81,0x9D82,0x9D83,0x9D84,0x9D85,0x9D86,0x9D87,0x9D88, +0x9D89,0xBEB1,0x9D8A,0x9D8B,0x9D8C,0x9D8D,0x9D8E,0x9D8F, +0xBEB2,0xBEB3,0x9D90,0x9D91,0xBEB4,0x9D92,0x9D93,0x9D94, +0xBEB5,0x9D95,0xBEB6,0x9D96,0x9D97,0x9D98,0x9D99,0xBEB7, +0xBEB8,0xBEB9,0x9D9A,0x9D9B,0x9D9C,0x9D9D,0x9D9E,0x9D9F, +0x9DA0,0x9DA1,0x9DA2,0x9DA3,0xBEBA,0x9DA4,0x9DA5,0x9DA6, +0xBEBB,0x9DA7,0x9DA8,0x9DA9,0xBEBC,0x9DAA,0x9DAB,0x9DAC, +0x9DAD,0x9DAE,0x9DAF,0x9DB0,0xBEBD,0x9DB1,0x9DB2,0x9DB3, +0x9DB4,0x9DB5,0x9DB6,0x9DB7,0x9DB8,0x9DB9,0x9DBA,0x9DBB, +0xBEBE,0xBEBF,0x9DBC,0x9DBD,0xBEC0,0x9DBE,0x9DBF,0x9DC0, +0xBEC1,0x9DC1,0x9DC2,0x9DC3,0x9DC4,0x9DC5,0x9DC6,0x9DC7, +0xBEC2,0xBEC3,0x9DC8,0xBEC4,0x9DC9,0xBEC5,0x9DCA,0x9DCB, +0x9DCC,0x9DCD,0x9DCE,0x9DCF,0xBEC6,0xBEC7,0x9DD0,0x9DD1, +0xBEC8,0xBEC9,0xBECA,0x9DD2,0xBECB,0xBECC,0xBECD,0x9DD3, +0x9DD4,0x9DD5,0x9DD6,0xBECE,0xBECF,0xBED0,0x9DD7,0xBED1, +0xBED2,0xBED3,0x9DD8,0x9DD9,0x9DDA,0xBED4,0xBED5,0x9DDB, +0xBED6,0xBED7,0x9DDC,0x9DDD,0xBED8,0x9DDE,0x9DDF,0x9DE0, +0xBED9,0x9DE1,0x9DE2,0x9DE3,0x9DE4,0x9DE5,0x9DE6,0x9DE7, +0xBEDA,0xBEDB,0x9DE8,0xBEDC,0xBEDD,0xBEDE,0x9DE9,0x9DEA, +0x9DEB,0x9DEC,0x9DED,0x9DEE,0xBEDF,0xBEE0,0x9DEF,0x9DF0, +0xBEE1,0x9DF1,0x9DF2,0x9DF3,0xBEE2,0x9DF4,0x9DF5,0xBEE3, +0x9DF6,0x9DF7,0x9DF8,0x9DF9,0xBEE4,0xBEE5,0x9DFA,0xBEE6, +0x9DFB,0xBEE7,0x9DFC,0x9DFD,0x9DFE,0xBEE8,0x9E41,0xBEE9, +0xBEEA,0x9E42,0x9E43,0x9E44,0xBEEB,0x9E45,0x9E46,0x9E47, +0xBEEC,0x9E48,0x9E49,0x9E4A,0x9E4B,0x9E4C,0x9E4D,0x9E4E, +0x9E4F,0xBEED,0x9E50,0x9E51,0x9E52,0x9E53,0x9E54,0x9E55, +0x9E56,0x9E57,0x9E58,0x9E59,0xBEEE,0xBEEF,0x9E5A,0x9E61, +0xBEF0,0xBEF1,0x9E62,0xBEF2,0xBEF3,0xBEF4,0xBEF5,0x9E63, +0x9E64,0x9E65,0x9E66,0x9E67,0xBEF6,0xBEF7,0xBEF8,0xBEF9, +0xBEFA,0xBEFB,0xBEFC,0x9E68,0xBEFD,0x9E69,0xBEFE,0x9E6A, +0xBFA1,0xBFA2,0x9E6B,0x9E6C,0xBFA3,0x9E6D,0x9E6E,0x9E6F, +0xBFA4,0x9E70,0x9E71,0x9E72,0x9E73,0x9E74,0x9E75,0x9E76, +0xBFA5,0xBFA6,0x9E77,0xBFA7,0x9E78,0xBFA8,0x9E79,0x9E7A, +0x9E81,0x9E82,0x9E83,0x9E84,0xBFA9,0xBFAA,0xBFAB,0x9E85, +0xBFAC,0x9E86,0x9E87,0x9E88,0xBFAD,0x9E89,0xBFAE,0xBFAF, +0x9E8A,0x9E8B,0x9E8C,0x9E8D,0xBFB0,0xBFB1,0xBFB2,0xBFB3, +0xBFB4,0xBFB5,0x9E8E,0x9E8F,0x9E90,0xBFB6,0xBFB7,0xBFB8, +0xBFB9,0x9E91,0x9E92,0x9E93,0xBFBA,0x9E94,0x9E95,0x9E96, +0xBFBB,0x9E97,0x9E98,0x9E99,0x9E9A,0x9E9B,0x9E9C,0x9E9D, +0xBFBC,0xBFBD,0x9E9E,0xBFBE,0xBFBF,0x9E9F,0x9EA0,0x9EA1, +0x9EA2,0x9EA3,0x9EA4,0x9EA5,0xBFC0,0xBFC1,0x9EA6,0x9EA7, +0xBFC2,0x9EA8,0x9EA9,0x9EAA,0xBFC3,0xBFC4,0xBFC5,0x9EAB, +0xBFC6,0x9EAC,0x9EAD,0xBFC7,0xBFC8,0xBFC9,0x9EAE,0xBFCA, +0x9EAF,0xBFCB,0x9EB0,0xBFCC,0x9EB1,0x9EB2,0x9EB3,0x9EB4, +0xBFCD,0xBFCE,0x9EB5,0x9EB6,0xBFCF,0x9EB7,0x9EB8,0x9EB9, +0xBFD0,0x9EBA,0x9EBB,0x9EBC,0x9EBD,0x9EBE,0x9EBF,0x9EC0, +0xBFD1,0xBFD2,0x9EC1,0xBFD3,0xBFD4,0xBFD5,0x9EC2,0x9EC3, +0x9EC4,0x9EC5,0x9EC6,0x9EC7,0xBFD6,0xBFD7,0x9EC8,0x9EC9, +0xBFD8,0x9ECA,0x9ECB,0x9ECC,0x9ECD,0x9ECE,0x9ECF,0x9ED0, +0x9ED1,0x9ED2,0x9ED3,0x9ED4,0xBFD9,0x9ED5,0x9ED6,0xBFDA, +0x9ED7,0xBFDB,0x9ED8,0x9ED9,0x9EDA,0x9EDB,0x9EDC,0x9EDD, +0xBFDC,0xBFDD,0x9EDE,0x9EDF,0xBFDE,0x9EE0,0x9EE1,0x9EE2, +0xBFDF,0x9EE3,0x9EE4,0x9EE5,0x9EE6,0x9EE7,0x9EE8,0x9EE9, +0xBFE0,0xBFE1,0x9EEA,0xBFE2,0x9EEB,0xBFE3,0x9EEC,0x9EED, +0x9EEE,0x9EEF,0x9EF0,0x9EF1,0xBFE4,0xBFE5,0x9EF2,0x9EF3, +0xBFE6,0x9EF4,0x9EF5,0x9EF6,0xBFE7,0x9EF7,0x9EF8,0x9EF9, +0x9EFA,0x9EFB,0x9EFC,0x9EFD,0xBFE8,0xBFE9,0x9EFE,0xBFEA, +0x9F41,0xBFEB,0x9F42,0x9F43,0x9F44,0x9F45,0x9F46,0x9F47, +0xBFEC,0xBFED,0x9F48,0x9F49,0xBFEE,0x9F4A,0x9F4B,0x9F4C, +0xBFEF,0xBFF0,0xBFF1,0x9F4D,0x9F4E,0x9F4F,0x9F50,0x9F51, +0xBFF2,0xBFF3,0x9F52,0xBFF4,0x9F53,0xBFF5,0x9F54,0x9F55, +0x9F56,0x9F57,0x9F58,0x9F59,0xBFF6,0xBFF7,0x9F5A,0x9F61, +0xBFF8,0x9F62,0x9F63,0x9F64,0xBFF9,0x9F65,0x9F66,0x9F67, +0x9F68,0x9F69,0x9F6A,0x9F6B,0xBFFA,0xBFFB,0x9F6C,0x9F6D, +0xBFFC,0xBFFD,0x9F6E,0x9F6F,0x9F70,0x9F71,0x9F72,0x9F73, +0xBFFE,0xC0A1,0x9F74,0x9F75,0xC0A2,0x9F76,0x9F77,0x9F78, +0xC0A3,0x9F79,0x9F7A,0x9F81,0x9F82,0x9F83,0x9F84,0x9F85, +0xC0A4,0xC0A5,0x9F86,0x9F87,0x9F88,0xC0A6,0x9F89,0x9F8A, +0x9F8B,0x9F8C,0x9F8D,0x9F8E,0xC0A7,0xC0A8,0x9F8F,0x9F90, +0xC0A9,0x9F91,0x9F92,0x9F93,0xC0AA,0x9F94,0x9F95,0x9F96, +0x9F97,0x9F98,0x9F99,0x9F9A,0xC0AB,0xC0AC,0x9F9B,0xC0AD, +0x9F9C,0xC0AE,0x9F9D,0x9F9E,0x9F9F,0x9FA0,0x9FA1,0x9FA2, +0xC0AF,0xC0B0,0x9FA3,0x9FA4,0xC0B1,0x9FA5,0x9FA6,0x9FA7, +0xC0B2,0x9FA8,0x9FA9,0x9FAA,0x9FAB,0x9FAC,0x9FAD,0x9FAE, +0xC0B3,0xC0B4,0x9FAF,0xC0B5,0x9FB0,0xC0B6,0x9FB1,0xC0B7, +0x9FB2,0x9FB3,0x9FB4,0x9FB5,0xC0B8,0xC0B9,0x9FB6,0x9FB7, +0xC0BA,0x9FB8,0x9FB9,0x9FBA,0xC0BB,0x9FBB,0x9FBC,0x9FBD, +0x9FBE,0x9FBF,0xC0BC,0x9FC0,0xC0BD,0xC0BE,0x9FC1,0xC0BF, +0x9FC2,0xC0C0,0xC0C1,0xC0C2,0xC0C3,0xC0C4,0xC0C5,0xC0C6, +0xC0C7,0x9FC3,0x9FC4,0x9FC5,0xC0C8,0x9FC6,0x9FC7,0x9FC8, +0xC0C9,0x9FC9,0x9FCA,0x9FCB,0x9FCC,0x9FCD,0x9FCE,0x9FCF, +0xC0CA,0x9FD0,0x9FD1,0xC0CB,0x9FD2,0x9FD3,0x9FD4,0x9FD5, +0x9FD6,0x9FD7,0x9FD8,0x9FD9,0xC0CC,0xC0CD,0x9FDA,0x9FDB, +0xC0CE,0x9FDC,0x9FDD,0x9FDE,0xC0CF,0xC0D0,0xC0D1,0x9FDF, +0x9FE0,0x9FE1,0x9FE2,0xC0D2,0xC0D3,0xC0D4,0x9FE3,0xC0D5, +0xC0D6,0xC0D7,0xC0D8,0x9FE4,0x9FE5,0x9FE6,0xC0D9,0x9FE7, +0xC0DA,0xC0DB,0x9FE8,0x9FE9,0xC0DC,0x9FEA,0xC0DD,0xC0DE, +0xC0DF,0x9FEB,0xC0E0,0x9FEC,0x9FED,0x9FEE,0x9FEF,0x9FF0, +0xC0E1,0xC0E2,0x9FF1,0xC0E3,0xC0E4,0xC0E5,0xC0E6,0x9FF2, +0x9FF3,0x9FF4,0x9FF5,0x9FF6,0xC0E7,0xC0E8,0x9FF7,0x9FF8, +0xC0E9,0x9FF9,0x9FFA,0x9FFB,0xC0EA,0x9FFC,0x9FFD,0x9FFE, +0xA041,0xA042,0xA043,0xA044,0xC0EB,0xC0EC,0xA045,0xC0ED, +0xC0EE,0xC0EF,0xA046,0xA047,0xA048,0xA049,0xA04A,0xA04B, +0xC0F0,0xC0F1,0xA04C,0xA04D,0xC0F2,0xA04E,0xC0F3,0xA04F, +0xC0F4,0xA050,0xA051,0xA052,0xA053,0xA054,0xA055,0xA056, +0xC0F5,0xA057,0xA058,0xA059,0xA05A,0xC0F6,0xA061,0xA062, +0xA063,0xA064,0xA065,0xA066,0xC0F7,0xA067,0xA068,0xA069, +0xC0F8,0xA06A,0xA06B,0xA06C,0xC0F9,0xA06D,0xA06E,0xA06F, +0xA070,0xA071,0xA072,0xA073,0xA074,0xA075,0xA076,0xA077, +0xA078,0xA079,0xA07A,0xA081,0xA082,0xA083,0xA084,0xA085, +0xC0FA,0xC0FB,0xA086,0xA087,0xC0FC,0xA088,0xA089,0xA08A, +0xC0FD,0xA08B,0xC0FE,0xA08C,0xA08D,0xA08E,0xA08F,0xA090, +0xC1A1,0xC1A2,0xA091,0xC1A3,0xA092,0xC1A4,0xC1A5,0xA093, +0xA094,0xA095,0xA096,0xA097,0xC1A6,0xC1A7,0xA098,0xA099, +0xC1A8,0xA09A,0xA09B,0xA09C,0xC1A9,0xA09D,0xA09E,0xA09F, +0xA0A0,0xA0A1,0xA0A2,0xA0A3,0xC1AA,0xC1AB,0xA0A4,0xC1AC, +0xA0A5,0xC1AD,0xA0A6,0xA0A7,0xA0A8,0xA0A9,0xA0AA,0xA0AB, +0xC1AE,0xA0AC,0xA0AD,0xA0AE,0xC1AF,0xA0AF,0xA0B0,0xA0B1, +0xC1B0,0xA0B2,0xA0B3,0xA0B4,0xA0B5,0xA0B6,0xA0B7,0xA0B8, +0xC1B1,0xC1B2,0xA0B9,0xA0BA,0xC1B3,0xC1B4,0xA0BB,0xA0BC, +0xA0BD,0xA0BE,0xA0BF,0xA0C0,0xC1B5,0xA0C1,0xA0C2,0xA0C3, +0xA0C4,0xA0C5,0xA0C6,0xA0C7,0xA0C8,0xA0C9,0xA0CA,0xA0CB, +0xA0CC,0xA0CD,0xA0CE,0xA0CF,0xA0D0,0xA0D1,0xA0D2,0xA0D3, +0xA0D4,0xA0D5,0xA0D6,0xA0D7,0xA0D8,0xA0D9,0xA0DA,0xA0DB, +0xC1B6,0xC1B7,0xA0DC,0xA0DD,0xC1B8,0xA0DE,0xA0DF,0xA0E0, +0xC1B9,0xA0E1,0xC1BA,0xA0E2,0xA0E3,0xA0E4,0xA0E5,0xA0E6, +0xC1BB,0xC1BC,0xA0E7,0xC1BD,0xA0E8,0xC1BE,0xC1BF,0xC1C0, +0xA0E9,0xA0EA,0xA0EB,0xC1C1,0xC1C2,0xC1C3,0xA0EC,0xA0ED, +0xA0EE,0xA0EF,0xA0F0,0xA0F1,0xC1C4,0xA0F2,0xA0F3,0xA0F4, +0xA0F5,0xA0F6,0xA0F7,0xA0F8,0xA0F9,0xC1C5,0xA0FA,0xC1C6, +0xA0FB,0xC1C7,0xA0FC,0xA0FD,0xA0FE,0xA141,0xA142,0xA143, +0xC1C8,0xA144,0xA145,0xA146,0xA147,0xA148,0xA149,0xA14A, +0xA14B,0xA14C,0xA14D,0xA14E,0xA14F,0xA150,0xA151,0xA152, +0xA153,0xA154,0xA155,0xA156,0xC1C9,0xC1CA,0xA157,0xA158, +0xA159,0xA15A,0xA161,0xA162,0xC1CB,0xA163,0xA164,0xA165, +0xC1CC,0xA166,0xA167,0xA168,0xC1CD,0xA169,0xA16A,0xA16B, +0xA16C,0xA16D,0xA16E,0xA16F,0xC1CE,0xC1CF,0xA170,0xC1D0, +0xA171,0xC1D1,0xA172,0xA173,0xA174,0xA175,0xA176,0xA177, +0xC1D2,0xC1D3,0xA178,0xA179,0xC1D4,0xA17A,0xA181,0xA182, +0xA183,0xA184,0xA185,0xA186,0xA187,0xA188,0xA189,0xA18A, +0xA18B,0xA18C,0xA18D,0xA18E,0xA18F,0xC1D5,0xA190,0xA191, +0xA192,0xA193,0xA194,0xA195,0xC1D6,0xC1D7,0xA196,0xA197, +0xC1D8,0xA198,0xA199,0xA19A,0xC1D9,0xC1DA,0xC1DB,0xA19B, +0xA19C,0xA19D,0xA19E,0xA19F,0xC1DC,0xC1DD,0xA1A0,0xC1DE, +0xA241,0xC1DF,0xA242,0xA243,0xA244,0xA245,0xA246,0xA247, +0xC1E0,0xA248,0xA249,0xA24A,0xA24B,0xA24C,0xA24D,0xA24E, +0xA24F,0xA250,0xA251,0xA252,0xA253,0xA254,0xA255,0xA256, +0xA257,0xA258,0xA259,0xA25A,0xC1E1,0xA261,0xA262,0xA263, +0xA264,0xA265,0xA266,0xA267,0xC1E2,0xA268,0xA269,0xA26A, +0xA26B,0xA26C,0xA26D,0xA26E,0xA26F,0xA270,0xA271,0xA272, +0xA273,0xA274,0xA275,0xA276,0xA277,0xA278,0xA279,0xA27A, +0xA281,0xA282,0xA283,0xA284,0xA285,0xA286,0xA287,0xA288, +0xC1E3,0xC1E4,0xA289,0xA28A,0xC1E5,0xA28B,0xA28C,0xA28D, +0xC1E6,0xA28E,0xA28F,0xA290,0xA291,0xA292,0xA293,0xA294, +0xC1E7,0xC1E8,0xA295,0xC1E9,0xA296,0xA297,0xA298,0xA299, +0xA29A,0xA29B,0xA29C,0xA29D,0xC1EA,0xA29E,0xA29F,0xA2A0, +0xC1EB,0xA341,0xA342,0xA343,0xC1EC,0xA344,0xA345,0xA346, +0xA347,0xA348,0xA349,0xA34A,0xC1ED,0xA34B,0xA34C,0xA34D, +0xA34E,0xA34F,0xA350,0xA351,0xA352,0xA353,0xA354,0xA355, +0xC1EE,0xC1EF,0xA356,0xA357,0xC1F0,0xA358,0xA359,0xA35A, +0xC1F1,0xA361,0xA362,0xA363,0xA364,0xA365,0xA366,0xA367, +0xC1F2,0xC1F3,0xA368,0xC1F4,0xA369,0xC1F5,0xA36A,0xA36B, +0xA36C,0xA36D,0xA36E,0xA36F,0xA370,0xA371,0xA372,0xA373, +0xA374,0xA375,0xA376,0xA377,0xA378,0xA379,0xA37A,0xA381, +0xA382,0xA383,0xA384,0xA385,0xA386,0xA387,0xA388,0xA389, +0xA38A,0xA38B,0xA38C,0xA38D,0xA38E,0xA38F,0xA390,0xA391, +0xC1F6,0xC1F7,0xA392,0xA393,0xC1F8,0xA394,0xA395,0xC1F9, +0xC1FA,0xA396,0xC1FB,0xA397,0xA398,0xA399,0xA39A,0xA39B, +0xC1FC,0xC1FD,0xA39C,0xC1FE,0xA39D,0xC2A1,0xC2A2,0xA39E, +0xA39F,0xC2A3,0xC2A4,0xA3A0,0xC2A5,0xC2A6,0xA441,0xA442, +0xC2A7,0xA443,0xC2A8,0xA444,0xC2A9,0xA445,0xA446,0xC2AA, +0xA447,0xA448,0xA449,0xA44A,0xC2AB,0xC2AC,0xA44B,0xC2AD, +0xC2AE,0xC2AF,0xA44C,0xA44D,0xA44E,0xA44F,0xA450,0xA451, +0xC2B0,0xC2B1,0xA452,0xA453,0xC2B2,0xA454,0xA455,0xA456, +0xC2B3,0xA457,0xA458,0xA459,0xA45A,0xA461,0xA462,0xA463, +0xC2B4,0xC2B5,0xA464,0xC2B6,0xC2B7,0xC2B8,0xA465,0xA466, +0xA467,0xA468,0xA469,0xA46A,0xC2B9,0xA46B,0xA46C,0xA46D, +0xC2BA,0xA46E,0xA46F,0xA470,0xA471,0xA472,0xA473,0xA474, +0xA475,0xA476,0xA477,0xA478,0xA479,0xA47A,0xA481,0xA482, +0xA483,0xC2BB,0xA484,0xA485,0xA486,0xA487,0xA488,0xA489, +0xA48A,0xA48B,0xA48C,0xA48D,0xA48E,0xA48F,0xA490,0xA491, +0xA492,0xA493,0xA494,0xA495,0xA496,0xA497,0xA498,0xA499, +0xA49A,0xA49B,0xA49C,0xA49D,0xA49E,0xA49F,0xA4A0,0xA541, +0xA542,0xA543,0xA544,0xA545,0xC2BC,0xC2BD,0xA546,0xA547, +0xC2BE,0xA548,0xA549,0xA54A,0xC2BF,0xA54B,0xA54C,0xA54D, +0xA54E,0xA54F,0xA550,0xA551,0xC2C0,0xC2C1,0xA552,0xC2C2, +0xC2C3,0xC2C4,0xA553,0xA554,0xA555,0xA556,0xA557,0xA558, +0xC2C5,0xA559,0xA55A,0xA561,0xA562,0xA563,0xA564,0xA565, +0xA566,0xA567,0xA568,0xA569,0xA56A,0xA56B,0xA56C,0xA56D, +0xA56E,0xA56F,0xA570,0xA571,0xA572,0xC2C6,0xA573,0xA574, +0xA575,0xA576,0xA577,0xA578,0xC2C7,0xA579,0xA57A,0xA581, +0xA582,0xA583,0xA584,0xA585,0xA586,0xA587,0xA588,0xA589, +0xA58A,0xA58B,0xA58C,0xA58D,0xA58E,0xA58F,0xA590,0xA591, +0xC2C8,0xA592,0xA593,0xA594,0xA595,0xA596,0xA597,0xA598, +0xA599,0xA59A,0xA59B,0xA59C,0xA59D,0xA59E,0xA59F,0xA5A0, +0xA641,0xA642,0xA643,0xA644,0xA645,0xA646,0xA647,0xA648, +0xA649,0xA64A,0xA64B,0xA64C,0xA64D,0xA64E,0xA64F,0xA650, +0xA651,0xA652,0xA653,0xA654,0xC2C9,0xC2CA,0xA655,0xA656, +0xC2CB,0xA657,0xA658,0xA659,0xC2CC,0xA65A,0xA661,0xA662, +0xA663,0xA664,0xA665,0xA666,0xC2CD,0xC2CE,0xA667,0xC2CF, +0xA668,0xC2D0,0xA669,0xC2D1,0xA66A,0xA66B,0xA66C,0xA66D, +0xC2D2,0xC2D3,0xA66E,0xA66F,0xA670,0xA671,0xA672,0xA673, +0xC2D4,0xA674,0xA675,0xA676,0xA677,0xA678,0xA679,0xA67A, +0xA681,0xA682,0xA683,0xA684,0xC2D5,0xA685,0xA686,0xA687, +0xA688,0xA689,0xA68A,0xA68B,0xC2D6,0xA68C,0xA68D,0xA68E, +0xA68F,0xA690,0xA691,0xA692,0xA693,0xA694,0xA695,0xA696, +0xA697,0xA698,0xA699,0xA69A,0xA69B,0xA69C,0xA69D,0xA69E, +0xC2D7,0xA69F,0xA6A0,0xA741,0xA742,0xA743,0xA744,0xA745, +0xC2D8,0xA746,0xA747,0xA748,0xC2D9,0xA749,0xA74A,0xA74B, +0xC2DA,0xA74C,0xA74D,0xA74E,0xA74F,0xA750,0xA751,0xA752, +0xC2DB,0xC2DC,0xA753,0xA754,0xA755,0xA756,0xA757,0xA758, +0xA759,0xA75A,0xA761,0xA762,0xA763,0xA764,0xA765,0xA766, +0xA767,0xA768,0xA769,0xA76A,0xA76B,0xA76C,0xA76D,0xA76E, +0xA76F,0xA770,0xA771,0xA772,0xA773,0xA774,0xA775,0xA776, +0xA777,0xC2DD,0xA778,0xA779,0xA77A,0xA781,0xA782,0xA783, +0xC2DE,0xC2DF,0xA784,0xA785,0xC2E0,0xA786,0xA787,0xA788, +0xC2E1,0xA789,0xA78A,0xA78B,0xA78C,0xA78D,0xA78E,0xA78F, +0xC2E2,0xC2E3,0xA790,0xA791,0xA792,0xC2E4,0xA793,0xA794, +0xA795,0xA796,0xA797,0xA798,0xC2E5,0xA799,0xA79A,0xA79B, +0xA79C,0xA79D,0xA79E,0xA79F,0xA7A0,0xA841,0xA842,0xA843, +0xA844,0xA845,0xA846,0xA847,0xA848,0xA849,0xA84A,0xA84B, +0xC2E6,0xC2E7,0xA84C,0xA84D,0xA84E,0xA84F,0xA850,0xA851, +0xA852,0xA853,0xA854,0xA855,0xA856,0xA857,0xA858,0xA859, +0xA85A,0xA861,0xA862,0xA863,0xA864,0xA865,0xA866,0xA867, +0xA868,0xA869,0xA86A,0xA86B,0xA86C,0xA86D,0xA86E,0xA86F, +0xA870,0xA871,0xA872,0xA873,0xC2E8,0xA874,0xA875,0xA876, +0xA877,0xA878,0xA879,0xA87A,0xA881,0xA882,0xA883,0xA884, +0xA885,0xA886,0xA887,0xA888,0xA889,0xA88A,0xA88B,0xA88C, +0xA88D,0xA88E,0xA88F,0xA890,0xA891,0xA892,0xA893,0xA894, +0xC2E9,0xA895,0xA896,0xA897,0xA898,0xA899,0xA89A,0xA89B, +0xA89C,0xA89D,0xA89E,0xA89F,0xA8A0,0xA941,0xA942,0xA943, +0xA944,0xA945,0xA946,0xA947,0xA948,0xA949,0xA94A,0xA94B, +0xA94C,0xA94D,0xA94E,0xA94F,0xC2EA,0xA950,0xA951,0xA952, +0xA953,0xA954,0xA955,0xA956,0xA957,0xA958,0xA959,0xA95A, +0xA961,0xA962,0xA963,0xA964,0xC2EB,0xA965,0xA966,0xC2EC, +0xA967,0xC2ED,0xA968,0xA969,0xA96A,0xA96B,0xA96C,0xA96D, +0xA96E,0xA96F,0xA970,0xA971,0xA972,0xA973,0xA974,0xA975, +0xA976,0xA977,0xA978,0xA979,0xA97A,0xA981,0xA982,0xA983, +0xA984,0xA985,0xA986,0xA987,0xA988,0xA989,0xA98A,0xA98B, +0xA98C,0xA98D,0xA98E,0xA98F,0xC2EE,0xC2EF,0xA990,0xA991, +0xC2F0,0xA992,0xA993,0xA994,0xC2F1,0xA995,0xA996,0xA997, +0xA998,0xA999,0xA99A,0xA99B,0xC2F2,0xC2F3,0xA99C,0xA99D, +0xA99E,0xC2F4,0xC2F5,0xA99F,0xA9A0,0xAA41,0xAA42,0xC2F6, +0xC2F7,0xC2F8,0xAA43,0xAA44,0xC2F9,0xAA45,0xC2FA,0xAA46, +0xC2FB,0xAA47,0xAA48,0xAA49,0xAA4A,0xAA4B,0xAA4C,0xAA4D, +0xC2FC,0xC2FD,0xAA4E,0xC2FE,0xC3A1,0xC3A2,0xC3A3,0xAA4F, +0xAA50,0xAA51,0xAA52,0xAA53,0xC3A4,0xC3A5,0xAA54,0xAA55, +0xC3A6,0xAA56,0xAA57,0xAA58,0xC3A7,0xAA59,0xAA5A,0xAA61, +0xAA62,0xAA63,0xAA64,0xAA65,0xC3A8,0xC3A9,0xAA66,0xC3AA, +0xC3AB,0xC3AC,0xAA67,0xAA68,0xAA69,0xAA6A,0xAA6B,0xAA6C, +0xC3AD,0xAA6D,0xAA6E,0xAA6F,0xC3AE,0xAA70,0xC3AF,0xAA71, +0xC3B0,0xAA72,0xAA73,0xAA74,0xAA75,0xAA76,0xAA77,0xAA78, +0xC3B1,0xAA79,0xAA7A,0xAA81,0xAA82,0xC3B2,0xAA83,0xAA84, +0xAA85,0xAA86,0xAA87,0xAA88,0xAA89,0xAA8A,0xAA8B,0xAA8C, +0xAA8D,0xAA8E,0xAA8F,0xAA90,0xAA91,0xAA92,0xAA93,0xAA94, +0xAA95,0xAA96,0xAA97,0xAA98,0xAA99,0xAA9A,0xAA9B,0xAA9C, +0xAA9D,0xAA9E,0xAA9F,0xAAA0,0xAB41,0xAB42,0xAB43,0xAB44, +0xC3B3,0xC3B4,0xAB45,0xAB46,0xC3B5,0xAB47,0xAB48,0xAB49, +0xC3B6,0xAB4A,0xAB4B,0xAB4C,0xAB4D,0xAB4E,0xAB4F,0xAB50, +0xC3B7,0xC3B8,0xAB51,0xC3B9,0xC3BA,0xC3BB,0xAB52,0xAB53, +0xAB54,0xAB55,0xAB56,0xAB57,0xC3BC,0xC3BD,0xAB58,0xAB59, +0xC3BE,0xAB5A,0xAB61,0xAB62,0xC3BF,0xAB63,0xAB64,0xAB65, +0xAB66,0xAB67,0xAB68,0xAB69,0xC3C0,0xC3C1,0xAB6A,0xC3C2, +0xAB6B,0xC3C3,0xAB6C,0xAB6D,0xAB6E,0xAB6F,0xAB70,0xAB71, +0xC3C4,0xAB72,0xAB73,0xAB74,0xC3C5,0xAB75,0xAB76,0xAB77, +0xAB78,0xAB79,0xAB7A,0xAB81,0xAB82,0xAB83,0xAB84,0xAB85, +0xAB86,0xAB87,0xAB88,0xAB89,0xC3C6,0xAB8A,0xAB8B,0xAB8C, +0xAB8D,0xAB8E,0xAB8F,0xAB90,0xC3C7,0xAB91,0xAB92,0xAB93, +0xC3C8,0xAB94,0xAB95,0xAB96,0xAB97,0xAB98,0xAB99,0xAB9A, +0xAB9B,0xAB9C,0xAB9D,0xAB9E,0xAB9F,0xABA0,0xAC41,0xAC42, +0xAC43,0xC3C9,0xAC44,0xAC45,0xAC46,0xAC47,0xAC48,0xAC49, +0xC3CA,0xC3CB,0xAC4A,0xAC4B,0xC3CC,0xAC4C,0xAC4D,0xAC4E, +0xC3CD,0xAC4F,0xAC50,0xAC51,0xAC52,0xAC53,0xAC54,0xAC55, +0xC3CE,0xC3CF,0xAC56,0xC3D0,0xAC57,0xC3D1,0xAC58,0xAC59, +0xAC5A,0xAC61,0xAC62,0xAC63,0xC3D2,0xAC64,0xAC65,0xAC66, +0xC3D3,0xAC67,0xAC68,0xAC69,0xC3D4,0xAC6A,0xAC6B,0xAC6C, +0xAC6D,0xAC6E,0xAC6F,0xAC70,0xAC71,0xAC72,0xAC73,0xAC74, +0xAC75,0xC3D5,0xAC76,0xAC77,0xAC78,0xAC79,0xAC7A,0xAC81, +0xAC82,0xAC83,0xAC84,0xAC85,0xAC86,0xAC87,0xAC88,0xAC89, +0xAC8A,0xAC8B,0xAC8C,0xAC8D,0xAC8E,0xAC8F,0xAC90,0xAC91, +0xAC92,0xAC93,0xAC94,0xAC95,0xAC96,0xAC97,0xAC98,0xAC99, +0xAC9A,0xAC9B,0xAC9C,0xAC9D,0xC3D6,0xAC9E,0xAC9F,0xACA0, +0xC3D7,0xAD41,0xAD42,0xAD43,0xC3D8,0xAD44,0xAD45,0xAD46, +0xAD47,0xAD48,0xAD49,0xAD4A,0xC3D9,0xC3DA,0xAD4B,0xC3DB, +0xAD4C,0xC3DC,0xAD4D,0xAD4E,0xAD4F,0xAD50,0xAD51,0xAD52, +0xC3DD,0xAD53,0xAD54,0xAD55,0xAD56,0xAD57,0xAD58,0xAD59, +0xAD5A,0xAD61,0xAD62,0xAD63,0xAD64,0xAD65,0xAD66,0xAD67, +0xC3DE,0xAD68,0xAD69,0xAD6A,0xAD6B,0xAD6C,0xAD6D,0xAD6E, +0xAD6F,0xAD70,0xAD71,0xAD72,0xC3DF,0xC3E0,0xAD73,0xAD74, +0xC3E1,0xAD75,0xAD76,0xAD77,0xC3E2,0xAD78,0xAD79,0xAD7A, +0xAD81,0xAD82,0xAD83,0xAD84,0xC3E3,0xC3E4,0xAD85,0xC3E5, +0xAD86,0xC3E6,0xAD87,0xAD88,0xAD89,0xAD8A,0xAD8B,0xAD8C, +0xC3E7,0xAD8D,0xAD8E,0xAD8F,0xAD90,0xAD91,0xAD92,0xAD93, +0xAD94,0xAD95,0xAD96,0xAD97,0xAD98,0xAD99,0xAD9A,0xAD9B, +0xAD9C,0xAD9D,0xAD9E,0xAD9F,0xC3E8,0xADA0,0xAE41,0xAE42, +0xAE43,0xAE44,0xAE45,0xAE46,0xC3E9,0xAE47,0xAE48,0xAE49, +0xC3EA,0xAE4A,0xAE4B,0xAE4C,0xAE4D,0xAE4E,0xAE4F,0xAE50, +0xAE51,0xAE52,0xAE53,0xAE54,0xAE55,0xAE56,0xAE57,0xAE58, +0xAE59,0xAE5A,0xAE61,0xAE62,0xAE63,0xAE64,0xAE65,0xAE66, +0xC3EB,0xAE67,0xAE68,0xAE69,0xC3EC,0xAE6A,0xAE6B,0xAE6C, +0xC3ED,0xAE6D,0xAE6E,0xAE6F,0xAE70,0xAE71,0xAE72,0xAE73, +0xC3EE,0xC3EF,0xAE74,0xC3F0,0xAE75,0xC3F1,0xAE76,0xAE77, +0xAE78,0xAE79,0xAE7A,0xAE81,0xC3F2,0xAE82,0xAE83,0xAE84, +0xC3F3,0xAE85,0xAE86,0xAE87,0xC3F4,0xAE88,0xAE89,0xAE8A, +0xAE8B,0xAE8C,0xAE8D,0xAE8E,0xC3F5,0xAE8F,0xAE90,0xAE91, +0xAE92,0xC3F6,0xAE93,0xAE94,0xAE95,0xAE96,0xAE97,0xAE98, +0xC3F7,0xC3F8,0xAE99,0xAE9A,0xC3F9,0xAE9B,0xAE9C,0xAE9D, +0xC3FA,0xAE9E,0xAE9F,0xAEA0,0xAF41,0xAF42,0xAF43,0xAF44, +0xC3FB,0xC3FC,0xAF45,0xC3FD,0xAF46,0xC3FE,0xAF47,0xAF48, +0xAF49,0xAF4A,0xAF4B,0xAF4C,0xAF4D,0xAF4E,0xAF4F,0xAF50, +0xAF51,0xAF52,0xAF53,0xAF54,0xAF55,0xAF56,0xAF57,0xAF58, +0xAF59,0xAF5A,0xAF61,0xAF62,0xAF63,0xAF64,0xAF65,0xAF66, +0xAF67,0xAF68,0xAF69,0xAF6A,0xAF6B,0xAF6C,0xAF6D,0xAF6E, +0xC4A1,0xC4A2,0xAF6F,0xAF70,0xC4A3,0xAF71,0xAF72,0xC4A4, +0xC4A5,0xC4A6,0xAF73,0xAF74,0xAF75,0xAF76,0xAF77,0xAF78, +0xC4A7,0xC4A8,0xAF79,0xC4A9,0xAF7A,0xC4AA,0xAF81,0xAF82, +0xAF83,0xAF84,0xAF85,0xAF86,0xC4AB,0xC4AC,0xAF87,0xAF88, +0xC4AD,0xAF89,0xAF8A,0xAF8B,0xC4AE,0xAF8C,0xAF8D,0xAF8E, +0xAF8F,0xAF90,0xAF91,0xAF92,0xC4AF,0xC4B0,0xAF93,0xC4B1, +0xAF94,0xC4B2,0xAF95,0xAF96,0xAF97,0xAF98,0xAF99,0xAF9A, +0xC4B3,0xC4B4,0xAF9B,0xAF9C,0xC4B5,0xAF9D,0xAF9E,0xAF9F, +0xC4B6,0xAFA0,0xB041,0xB042,0xB043,0xB044,0xB045,0xB046, +0xC4B7,0xC4B8,0xB047,0xC4B9,0xC4BA,0xC4BB,0xB048,0xB049, +0xB04A,0xB04B,0xB04C,0xB04D,0xC4BC,0xC4BD,0xB04E,0xB04F, +0xB050,0xB051,0xB052,0xB053,0xB054,0xB055,0xB056,0xB057, +0xB058,0xB059,0xB05A,0xB061,0xB062,0xB063,0xB064,0xB065, +0xB066,0xC4BE,0xB067,0xB068,0xB069,0xB06A,0xB06B,0xB06C, +0xB06D,0xB06E,0xB06F,0xB070,0xB071,0xB072,0xB073,0xB074, +0xB075,0xB076,0xB077,0xB078,0xB079,0xB07A,0xB081,0xB082, +0xB083,0xB084,0xB085,0xB086,0xB087,0xB088,0xB089,0xB08A, +0xB08B,0xB08C,0xB08D,0xB08E,0xC4BF,0xC4C0,0xB08F,0xB090, +0xC4C1,0xB091,0xB092,0xC4C2,0xC4C3,0xB093,0xB094,0xB095, +0xB096,0xB097,0xB098,0xB099,0xC4C4,0xC4C5,0xB09A,0xC4C6, +0xC4C7,0xC4C8,0xB09B,0xB09C,0xB09D,0xB09E,0xB09F,0xB0A0, +0xC4C9,0xC4CA,0xB141,0xB142,0xC4CB,0xB143,0xB144,0xB145, +0xC4CC,0xB146,0xB147,0xB148,0xB149,0xB14A,0xB14B,0xB14C, +0xC4CD,0xC4CE,0xB14D,0xC4CF,0xB14E,0xC4D0,0xB14F,0xB150, +0xB151,0xB152,0xB153,0xB154,0xC4D1,0xB155,0xB156,0xB157, +0xC4D2,0xB158,0xB159,0xB15A,0xC4D3,0xB161,0xB162,0xB163, +0xB164,0xB165,0xB166,0xB167,0xC4D4,0xC4D5,0xB168,0xC4D6, +0xC4D7,0xC4D8,0xB169,0xB16A,0xB16B,0xB16C,0xB16D,0xB16E, +0xC4D9,0xB16F,0xB170,0xB171,0xB172,0xB173,0xB174,0xB175, +0xB176,0xB177,0xB178,0xB179,0xB17A,0xB181,0xB182,0xB183, +0xB184,0xB185,0xB186,0xB187,0xB188,0xB189,0xB18A,0xB18B, +0xB18C,0xB18D,0xB18E,0xB18F,0xC4DA,0xC4DB,0xB190,0xB191, +0xC4DC,0xB192,0xB193,0xB194,0xC4DD,0xB195,0xB196,0xB197, +0xB198,0xB199,0xB19A,0xB19B,0xC4DE,0xC4DF,0xB19C,0xC4E0, +0xB19D,0xC4E1,0xB19E,0xB19F,0xB1A0,0xB241,0xB242,0xB243, +0xC4E2,0xC4E3,0xB244,0xB245,0xC4E4,0xB246,0xB247,0xB248, +0xC4E5,0xB249,0xB24A,0xB24B,0xB24C,0xB24D,0xB24E,0xB24F, +0xC4E6,0xB250,0xB251,0xB252,0xB253,0xC4E7,0xB254,0xB255, +0xB256,0xB257,0xB258,0xB259,0xC4E8,0xB25A,0xB261,0xB262, +0xB263,0xB264,0xB265,0xB266,0xB267,0xB268,0xB269,0xB26A, +0xB26B,0xB26C,0xB26D,0xB26E,0xB26F,0xB270,0xB271,0xB272, +0xB273,0xC4E9,0xB274,0xB275,0xB276,0xB277,0xB278,0xB279, +0xC4EA,0xB27A,0xB281,0xB282,0xB283,0xB284,0xB285,0xB286, +0xC4EB,0xB287,0xB288,0xB289,0xB28A,0xB28B,0xB28C,0xB28D, +0xB28E,0xB28F,0xB290,0xB291,0xB292,0xB293,0xB294,0xB295, +0xB296,0xB297,0xB298,0xB299,0xC4EC,0xB29A,0xB29B,0xB29C, +0xB29D,0xB29E,0xB29F,0xB2A0,0xB341,0xB342,0xB343,0xB344, +0xB345,0xB346,0xB347,0xB348,0xB349,0xB34A,0xB34B,0xB34C, +0xB34D,0xB34E,0xB34F,0xB350,0xB351,0xB352,0xB353,0xB354, +0xC4ED,0xC4EE,0xB355,0xB356,0xC4EF,0xB357,0xB358,0xB359, +0xC4F0,0xB35A,0xB361,0xB362,0xB363,0xB364,0xB365,0xB366, +0xC4F1,0xC4F2,0xB367,0xC4F3,0xB368,0xC4F4,0xB369,0xB36A, +0xB36B,0xB36C,0xB36D,0xB36E,0xC4F5,0xB36F,0xB370,0xB371, +0xC4F6,0xB372,0xB373,0xB374,0xC4F7,0xB375,0xB376,0xB377, +0xB378,0xB379,0xB37A,0xB381,0xB382,0xB383,0xB384,0xB385, +0xB386,0xC4F8,0xB387,0xB388,0xB389,0xB38A,0xB38B,0xB38C, +0xC4F9,0xB38D,0xB38E,0xB38F,0xB390,0xB391,0xB392,0xB393, +0xB394,0xB395,0xB396,0xB397,0xB398,0xB399,0xB39A,0xB39B, +0xB39C,0xB39D,0xB39E,0xB39F,0xB3A0,0xC4FA,0xB441,0xB442, +0xB443,0xB444,0xB445,0xB446,0xC4FB,0xC4FC,0xB447,0xB448, +0xC4FD,0xB449,0xB44A,0xB44B,0xC4FE,0xB44C,0xB44D,0xB44E, +0xB44F,0xB450,0xB451,0xB452,0xC5A1,0xC5A2,0xB453,0xC5A3, +0xB454,0xC5A4,0xB455,0xB456,0xB457,0xB458,0xB459,0xB45A, +0xC5A5,0xB461,0xB462,0xB463,0xC5A6,0xB464,0xB465,0xB466, +0xC5A7,0xB467,0xB468,0xB469,0xB46A,0xB46B,0xB46C,0xB46D, +0xC5A8,0xB46E,0xB46F,0xB470,0xB471,0xB472,0xB473,0xB474, +0xB475,0xB476,0xB477,0xB478,0xC5A9,0xC5AA,0xB479,0xB47A, +0xC5AB,0xB481,0xB482,0xB483,0xC5AC,0xB484,0xB485,0xB486, +0xB487,0xB488,0xB489,0xB48A,0xC5AD,0xC5AE,0xB48B,0xB48C, +0xB48D,0xC5AF,0xB48E,0xB48F,0xB490,0xB491,0xB492,0xB493, +0xB494,0xB495,0xB496,0xB497,0xB498,0xB499,0xB49A,0xB49B, +0xB49C,0xB49D,0xB49E,0xB49F,0xB4A0,0xB541,0xB542,0xB543, +0xB544,0xB545,0xB546,0xB547,0xB548,0xB549,0xB54A,0xB54B, +0xB54C,0xB54D,0xB54E,0xB54F,0xC5B0,0xC5B1,0xB550,0xB551, +0xC5B2,0xB552,0xB553,0xB554,0xC5B3,0xB555,0xB556,0xB557, +0xB558,0xB559,0xB55A,0xB561,0xC5B4,0xC5B5,0xB562,0xC5B6, +0xB563,0xC5B7,0xB564,0xB565,0xB566,0xB567,0xB568,0xB569, +0xC5B8,0xC5B9,0xB56A,0xB56B,0xC5BA,0xB56C,0xB56D,0xB56E, +0xC5BB,0xC5BC,0xB56F,0xB570,0xB571,0xB572,0xB573,0xB574, +0xC5BD,0xC5BE,0xB575,0xC5BF,0xC5C0,0xC5C1,0xB576,0xB577, +0xB578,0xB579,0xB57A,0xB581,0xC5C2,0xC5C3,0xB582,0xB583, +0xC5C4,0xB584,0xB585,0xB586,0xC5C5,0xB587,0xB588,0xB589, +0xB58A,0xB58B,0xB58C,0xB58D,0xC5C6,0xC5C7,0xB58E,0xC5C8, +0xC5C9,0xC5CA,0xB58F,0xB590,0xB591,0xB592,0xB593,0xB594, +0xC5CB,0xB595,0xB596,0xB597,0xB598,0xB599,0xB59A,0xB59B, +0xB59C,0xB59D,0xB59E,0xB59F,0xB5A0,0xB641,0xB642,0xB643, +0xB644,0xB645,0xB646,0xB647,0xB648,0xC5CC,0xB649,0xB64A, +0xB64B,0xB64C,0xB64D,0xB64E,0xB64F,0xB650,0xB651,0xB652, +0xB653,0xB654,0xB655,0xB656,0xB657,0xB658,0xB659,0xB65A, +0xB661,0xB662,0xB663,0xB664,0xB665,0xB666,0xB667,0xB668, +0xB669,0xB66A,0xB66B,0xB66C,0xB66D,0xB66E,0xB66F,0xB670, +0xC5CD,0xC5CE,0xB671,0xB672,0xC5CF,0xB673,0xB674,0xB675, +0xC5D0,0xB676,0xC5D1,0xB677,0xB678,0xB679,0xB67A,0xB681, +0xC5D2,0xC5D3,0xB682,0xC5D4,0xC5D5,0xC5D6,0xB683,0xB684, +0xB685,0xB686,0xB687,0xB688,0xC5D7,0xC5D8,0xB689,0xB68A, +0xC5D9,0xB68B,0xB68C,0xB68D,0xC5DA,0xB68E,0xB68F,0xB690, +0xB691,0xB692,0xB693,0xB694,0xC5DB,0xC5DC,0xB695,0xC5DD, +0xB696,0xC5DE,0xB697,0xB698,0xB699,0xB69A,0xB69B,0xB69C, +0xC5DF,0xB69D,0xB69E,0xB69F,0xC5E0,0xB6A0,0xB741,0xB742, +0xB743,0xB744,0xB745,0xB746,0xB747,0xB748,0xB749,0xB74A, +0xB74B,0xB74C,0xB74D,0xB74E,0xC5E1,0xB74F,0xB750,0xB751, +0xB752,0xB753,0xB754,0xB755,0xC5E2,0xB756,0xB757,0xB758, +0xC5E3,0xB759,0xB75A,0xB761,0xB762,0xB763,0xB764,0xB765, +0xB766,0xB767,0xB768,0xB769,0xB76A,0xB76B,0xB76C,0xB76D, +0xB76E,0xB76F,0xB770,0xB771,0xB772,0xB773,0xB774,0xB775, +0xC5E4,0xC5E5,0xB776,0xB777,0xC5E6,0xB778,0xB779,0xB77A, +0xC5E7,0xB781,0xB782,0xB783,0xB784,0xB785,0xB786,0xB787, +0xC5E8,0xC5E9,0xB788,0xC5EA,0xB789,0xC5EB,0xB78A,0xB78B, +0xB78C,0xB78D,0xC5EC,0xB78E,0xC5ED,0xB78F,0xB790,0xB791, +0xC5EE,0xB792,0xB793,0xB794,0xB795,0xB796,0xB797,0xB798, +0xB799,0xB79A,0xB79B,0xB79C,0xB79D,0xB79E,0xB79F,0xB7A0, +0xB841,0xB842,0xB843,0xB844,0xB845,0xB846,0xB847,0xB848, +0xC5EF,0xB849,0xB84A,0xB84B,0xB84C,0xB84D,0xB84E,0xB84F, +0xB850,0xB851,0xB852,0xB853,0xB854,0xB855,0xB856,0xB857, +0xB858,0xB859,0xB85A,0xB861,0xB862,0xB863,0xB864,0xB865, +0xB866,0xB867,0xB868,0xB869,0xC5F0,0xB86A,0xB86B,0xB86C, +0xC5F1,0xB86D,0xB86E,0xB86F,0xB870,0xB871,0xB872,0xB873, +0xB874,0xB875,0xB876,0xB877,0xB878,0xB879,0xB87A,0xC5F2, +0xB881,0xC5F3,0xB882,0xB883,0xB884,0xB885,0xB886,0xB887, +0xC5F4,0xB888,0xB889,0xB88A,0xB88B,0xB88C,0xB88D,0xB88E, +0xB88F,0xB890,0xB891,0xB892,0xB893,0xB894,0xB895,0xB896, +0xB897,0xB898,0xB899,0xB89A,0xB89B,0xB89C,0xB89D,0xB89E, +0xB89F,0xB8A0,0xB941,0xB942,0xC5F5,0xC5F6,0xB943,0xB944, +0xC5F7,0xB945,0xB946,0xB947,0xC5F8,0xB948,0xB949,0xB94A, +0xB94B,0xB94C,0xB94D,0xB94E,0xC5F9,0xC5FA,0xB94F,0xC5FB, +0xB950,0xC5FC,0xB951,0xB952,0xB953,0xB954,0xB955,0xB956, +0xC5FD,0xB957,0xB958,0xB959,0xB95A,0xB961,0xB962,0xB963, +0xB964,0xB965,0xB966,0xB967,0xB968,0xB969,0xB96A,0xB96B, +0xB96C,0xB96D,0xB96E,0xB96F,0xC5FE,0xB970,0xB971,0xB972, +0xB973,0xB974,0xB975,0xB976,0xC6A1,0xB977,0xB978,0xB979, +0xB97A,0xB981,0xB982,0xB983,0xB984,0xB985,0xB986,0xB987, +0xB988,0xB989,0xB98A,0xB98B,0xB98C,0xB98D,0xB98E,0xB98F, +0xB990,0xB991,0xB992,0xB993,0xB994,0xB995,0xB996,0xB997, +0xC6A2,0xC6A3,0xB998,0xB999,0xC6A4,0xB99A,0xB99B,0xB99C, +0xC6A5,0xB99D,0xB99E,0xB99F,0xB9A0,0xBA41,0xBA42,0xBA43, +0xC6A6,0xC6A7,0xBA44,0xBA45,0xBA46,0xC6A8,0xBA47,0xBA48, +0xBA49,0xBA4A,0xBA4B,0xBA4C,0xC6A9,0xBA4D,0xBA4E,0xBA4F, +0xC6AA,0xBA50,0xBA51,0xBA52,0xC6AB,0xBA53,0xBA54,0xBA55, +0xBA56,0xBA57,0xBA58,0xBA59,0xC6AC,0xBA5A,0xBA61,0xBA62, +0xBA63,0xC6AD,0xBA64,0xBA65,0xBA66,0xBA67,0xBA68,0xBA69, +0xC6AE,0xC6AF,0xBA6A,0xBA6B,0xC6B0,0xBA6C,0xBA6D,0xC6B1, +0xC6B2,0xBA6E,0xC6B3,0xBA6F,0xBA70,0xBA71,0xBA72,0xBA73, +0xC6B4,0xC6B5,0xBA74,0xC6B6,0xBA75,0xBA76,0xBA77,0xBA78, +0xBA79,0xBA7A,0xBA81,0xBA82,0xC6B7,0xBA83,0xBA84,0xBA85, +0xC6B8,0xBA86,0xBA87,0xBA88,0xC6B9,0xBA89,0xBA8A,0xBA8B, +0xBA8C,0xBA8D,0xBA8E,0xBA8F,0xC6BA,0xC6BB,0xBA90,0xBA91, +0xBA92,0xBA93,0xBA94,0xBA95,0xBA96,0xBA97,0xBA98,0xBA99, +0xC6BC,0xC6BD,0xBA9A,0xBA9B,0xC6BE,0xBA9C,0xBA9D,0xBA9E, +0xC6BF,0xBA9F,0xBAA0,0xBB41,0xBB42,0xBB43,0xBB44,0xBB45, +0xC6C0,0xC6C1,0xBB46,0xC6C2,0xBB47,0xC6C3,0xBB48,0xBB49, +0xBB4A,0xBB4B,0xBB4C,0xBB4D,0xC6C4,0xC6C5,0xC6C6,0xBB4E, +0xC6C7,0xBB4F,0xBB50,0xBB51,0xC6C8,0xBB52,0xC6C9,0xBB53, +0xBB54,0xBB55,0xBB56,0xBB57,0xC6CA,0xC6CB,0xBB58,0xC6CC, +0xC6CD,0xC6CE,0xBB59,0xBB5A,0xBB61,0xC6CF,0xBB62,0xBB63, +0xC6D0,0xC6D1,0xBB64,0xBB65,0xC6D2,0xBB66,0xBB67,0xBB68, +0xC6D3,0xBB69,0xBB6A,0xBB6B,0xBB6C,0xBB6D,0xBB6E,0xBB6F, +0xC6D4,0xC6D5,0xBB70,0xC6D6,0xC6D7,0xC6D8,0xBB71,0xBB72, +0xBB73,0xBB74,0xBB75,0xBB76,0xC6D9,0xC6DA,0xBB77,0xBB78, +0xBB79,0xBB7A,0xBB81,0xBB82,0xBB83,0xBB84,0xBB85,0xBB86, +0xBB87,0xBB88,0xBB89,0xBB8A,0xBB8B,0xBB8C,0xBB8D,0xBB8E, +0xBB8F,0xBB90,0xBB91,0xBB92,0xBB93,0xBB94,0xBB95,0xBB96, +0xBB97,0xBB98,0xBB99,0xBB9A,0xBB9B,0xBB9C,0xBB9D,0xBB9E, +0xBB9F,0xBBA0,0xBC41,0xBC42,0xBC43,0xBC44,0xBC45,0xBC46, +0xBC47,0xBC48,0xBC49,0xBC4A,0xBC4B,0xBC4C,0xBC4D,0xBC4E, +0xBC4F,0xBC50,0xBC51,0xBC52,0xC6DB,0xC6DC,0xBC53,0xBC54, +0xC6DD,0xBC55,0xBC56,0xBC57,0xC6DE,0xBC58,0xBC59,0xBC5A, +0xBC61,0xBC62,0xBC63,0xBC64,0xC6DF,0xC6E0,0xBC65,0xC6E1, +0xC6E2,0xC6E3,0xBC66,0xBC67,0xBC68,0xBC69,0xBC6A,0xBC6B, +0xC6E4,0xC6E5,0xBC6C,0xBC6D,0xC6E6,0xBC6E,0xBC6F,0xBC70, +0xC6E7,0xBC71,0xBC72,0xBC73,0xBC74,0xBC75,0xBC76,0xBC77, +0xC6E8,0xC6E9,0xBC78,0xC6EA,0xBC79,0xC6EB,0xBC7A,0xBC81, +0xBC82,0xBC83,0xBC84,0xBC85,0xC6EC,0xBC86,0xBC87,0xBC88, +0xC6ED,0xBC89,0xBC8A,0xBC8B,0xC6EE,0xBC8C,0xBC8D,0xBC8E, +0xBC8F,0xBC90,0xBC91,0xBC92,0xC6EF,0xC6F0,0xBC93,0xBC94, +0xC6F1,0xC6F2,0xBC95,0xBC96,0xBC97,0xBC98,0xBC99,0xBC9A, +0xC6F3,0xBC9B,0xBC9C,0xBC9D,0xBC9E,0xBC9F,0xBCA0,0xBD41, +0xC6F4,0xBD42,0xBD43,0xBD44,0xBD45,0xBD46,0xBD47,0xBD48, +0xBD49,0xC6F5,0xBD4A,0xC6F6,0xBD4B,0xBD4C,0xBD4D,0xBD4E, +0xBD4F,0xBD50,0xBD51,0xBD52,0xC6F7,0xC6F8,0xBD53,0xBD54, +0xC6F9,0xBD55,0xBD56,0xBD57,0xC6FA,0xBD58,0xBD59,0xBD5A, +0xBD61,0xBD62,0xBD63,0xBD64,0xC6FB,0xC6FC,0xBD65,0xC6FD, +0xBD66,0xC6FE,0xBD67,0xBD68,0xBD69,0xBD6A,0xBD6B,0xBD6C, +0xC7A1,0xBD6D,0xBD6E,0xBD6F,0xBD70,0xBD71,0xBD72,0xBD73, +0xBD74,0xBD75,0xBD76,0xBD77,0xBD78,0xBD79,0xBD7A,0xBD81, +0xBD82,0xBD83,0xBD84,0xBD85,0xBD86,0xC7A2,0xBD87,0xBD88, +0xBD89,0xBD8A,0xBD8B,0xBD8C,0xBD8D,0xBD8E,0xBD8F,0xBD90, +0xBD91,0xBD92,0xBD93,0xBD94,0xBD95,0xBD96,0xBD97,0xBD98, +0xBD99,0xBD9A,0xBD9B,0xBD9C,0xBD9D,0xBD9E,0xBD9F,0xBDA0, +0xBE41,0xBE42,0xBE43,0xBE44,0xBE45,0xBE46,0xBE47,0xBE48, +0xC7A3,0xBE49,0xBE4A,0xBE4B,0xC7A4,0xBE4C,0xBE4D,0xBE4E, +0xBE4F,0xBE50,0xBE51,0xBE52,0xBE53,0xBE54,0xBE55,0xBE56, +0xBE57,0xBE58,0xBE59,0xBE5A,0xBE61,0xBE62,0xBE63,0xBE64, +0xBE65,0xBE66,0xBE67,0xBE68,0xC7A5,0xBE69,0xBE6A,0xBE6B, +0xC7A6,0xBE6C,0xBE6D,0xBE6E,0xC7A7,0xBE6F,0xBE70,0xBE71, +0xBE72,0xBE73,0xBE74,0xBE75,0xBE76,0xC7A8,0xBE77,0xC7A9, +0xBE78,0xBE79,0xBE7A,0xBE81,0xBE82,0xBE83,0xBE84,0xBE85, +0xC7AA,0xC7AB,0xBE86,0xBE87,0xC7AC,0xBE88,0xBE89,0xC7AD, +0xC7AE,0xBE8A,0xC7AF,0xBE8B,0xBE8C,0xBE8D,0xBE8E,0xBE8F, +0xC7B0,0xC7B1,0xBE90,0xC7B2,0xBE91,0xC7B3,0xBE92,0xBE93, +0xBE94,0xBE95,0xBE96,0xBE97,0xC7B4,0xBE98,0xBE99,0xBE9A, +0xBE9B,0xBE9C,0xBE9D,0xBE9E,0xBE9F,0xBEA0,0xBF41,0xBF42, +0xBF43,0xBF44,0xBF45,0xBF46,0xBF47,0xBF48,0xBF49,0xBF4A, +0xBF4B,0xC7B5,0xBF4C,0xBF4D,0xBF4E,0xBF4F,0xBF50,0xBF51, +0xBF52,0xBF53,0xBF54,0xBF55,0xBF56,0xBF57,0xBF58,0xBF59, +0xBF5A,0xBF61,0xBF62,0xBF63,0xBF64,0xBF65,0xBF66,0xBF67, +0xBF68,0xBF69,0xBF6A,0xBF6B,0xBF6C,0xBF6D,0xBF6E,0xBF6F, +0xBF70,0xBF71,0xBF72,0xBF73,0xC7B6,0xBF74,0xBF75,0xBF76, +0xC7B7,0xBF77,0xBF78,0xBF79,0xC7B8,0xBF7A,0xBF81,0xBF82, +0xBF83,0xBF84,0xBF85,0xBF86,0xC7B9,0xBF87,0xBF88,0xC7BA, +0xBF89,0xBF8A,0xBF8B,0xBF8C,0xBF8D,0xBF8E,0xBF8F,0xBF90, +0xC7BB,0xBF91,0xBF92,0xBF93,0xC7BC,0xBF94,0xBF95,0xBF96, +0xC7BD,0xBF97,0xBF98,0xBF99,0xBF9A,0xBF9B,0xBF9C,0xBF9D, +0xC7BE,0xBF9E,0xBF9F,0xC7BF,0xBFA0,0xC7C0,0xC041,0xC042, +0xC043,0xC044,0xC045,0xC046,0xC7C1,0xC047,0xC048,0xC049, +0xC7C2,0xC04A,0xC04B,0xC04C,0xC7C3,0xC04D,0xC04E,0xC04F, +0xC050,0xC051,0xC052,0xC053,0xC7C4,0xC7C5,0xC054,0xC7C6, +0xC055,0xC056,0xC057,0xC058,0xC059,0xC05A,0xC061,0xC062, +0xC063,0xC064,0xC065,0xC066,0xC067,0xC068,0xC069,0xC06A, +0xC06B,0xC06C,0xC06D,0xC06E,0xC06F,0xC070,0xC071,0xC072, +0xC073,0xC074,0xC075,0xC076,0xC077,0xC078,0xC079,0xC07A, +0xC081,0xC082,0xC083,0xC084,0xC7C7,0xC7C8,0xC085,0xC086, +0xC7C9,0xC087,0xC088,0xC089,0xC7CA,0xC08A,0xC08B,0xC08C, +0xC08D,0xC08E,0xC08F,0xC090,0xC7CB,0xC7CC,0xC091,0xC7CD, +0xC092,0xC7CE,0xC093,0xC094,0xC095,0xC096,0xC097,0xC098, +0xC7CF,0xC7D0,0xC099,0xC09A,0xC7D1,0xC09B,0xC09C,0xC09D, +0xC7D2,0xC09E,0xC09F,0xC0A0,0xC141,0xC7D3,0xC142,0xC143, +0xC7D4,0xC7D5,0xC144,0xC7D6,0xC145,0xC7D7,0xC146,0xC147, +0xC148,0xC149,0xC14A,0xC14B,0xC7D8,0xC7D9,0xC14C,0xC14D, +0xC7DA,0xC14E,0xC14F,0xC150,0xC7DB,0xC151,0xC152,0xC153, +0xC154,0xC155,0xC156,0xC157,0xC7DC,0xC7DD,0xC158,0xC7DE, +0xC7DF,0xC7E0,0xC159,0xC15A,0xC161,0xC162,0xC163,0xC164, +0xC7E1,0xC165,0xC166,0xC167,0xC168,0xC169,0xC16A,0xC16B, +0xC16C,0xC16D,0xC16E,0xC16F,0xC170,0xC171,0xC172,0xC173, +0xC174,0xC175,0xC176,0xC177,0xC178,0xC7E2,0xC179,0xC17A, +0xC181,0xC182,0xC183,0xC184,0xC185,0xC186,0xC187,0xC188, +0xC189,0xC18A,0xC18B,0xC18C,0xC18D,0xC18E,0xC18F,0xC190, +0xC191,0xC192,0xC193,0xC194,0xC195,0xC196,0xC197,0xC198, +0xC199,0xC19A,0xC19B,0xC19C,0xC19D,0xC19E,0xC19F,0xC1A0, +0xC7E3,0xC7E4,0xC241,0xC242,0xC7E5,0xC243,0xC244,0xC245, +0xC7E6,0xC246,0xC7E7,0xC247,0xC248,0xC249,0xC24A,0xC24B, +0xC7E8,0xC7E9,0xC24C,0xC7EA,0xC24D,0xC7EB,0xC24E,0xC24F, +0xC250,0xC251,0xC252,0xC253,0xC7EC,0xC7ED,0xC254,0xC255, +0xC7EE,0xC256,0xC257,0xC258,0xC7EF,0xC259,0xC25A,0xC261, +0xC262,0xC263,0xC264,0xC265,0xC7F0,0xC7F1,0xC266,0xC7F2, +0xC267,0xC7F3,0xC268,0xC269,0xC26A,0xC26B,0xC26C,0xC26D, +0xC7F4,0xC7F5,0xC26E,0xC26F,0xC7F6,0xC270,0xC271,0xC272, +0xC7F7,0xC273,0xC274,0xC275,0xC276,0xC277,0xC278,0xC279, +0xC7F8,0xC7F9,0xC27A,0xC7FA,0xC7FB,0xC7FC,0xC281,0xC282, +0xC283,0xC284,0xC285,0xC286,0xC7FD,0xC287,0xC288,0xC289, +0xC7FE,0xC28A,0xC28B,0xC28C,0xC8A1,0xC28D,0xC28E,0xC28F, +0xC290,0xC291,0xC292,0xC293,0xC294,0xC8A2,0xC295,0xC296, +0xC297,0xC298,0xC299,0xC29A,0xC29B,0xC29C,0xC29D,0xC29E, +0xC8A3,0xC8A4,0xC29F,0xC2A0,0xC8A5,0xC341,0xC342,0xC343, +0xC8A6,0xC344,0xC345,0xC346,0xC347,0xC8A7,0xC348,0xC349, +0xC8A8,0xC8A9,0xC34A,0xC8AA,0xC34B,0xC8AB,0xC34C,0xC34D, +0xC34E,0xC8AC,0xC34F,0xC350,0xC8AD,0xC8AE,0xC351,0xC352, +0xC8AF,0xC353,0xC354,0xC355,0xC8B0,0xC356,0xC357,0xC358, +0xC359,0xC35A,0xC361,0xC362,0xC363,0xC364,0xC365,0xC8B1, +0xC366,0xC8B2,0xC367,0xC368,0xC369,0xC36A,0xC36B,0xC36C, +0xC8B3,0xC8B4,0xC36D,0xC36E,0xC8B5,0xC36F,0xC370,0xC371, +0xC372,0xC373,0xC374,0xC375,0xC376,0xC377,0xC378,0xC379, +0xC37A,0xC381,0xC382,0xC8B6,0xC383,0xC8B7,0xC384,0xC385, +0xC386,0xC387,0xC388,0xC389,0xC8B8,0xC8B9,0xC38A,0xC38B, +0xC8BA,0xC38C,0xC38D,0xC38E,0xC8BB,0xC38F,0xC390,0xC391, +0xC392,0xC393,0xC394,0xC395,0xC396,0xC8BC,0xC397,0xC8BD, +0xC398,0xC8BE,0xC399,0xC39A,0xC39B,0xC39C,0xC39D,0xC39E, +0xC8BF,0xC39F,0xC3A0,0xC441,0xC8C0,0xC442,0xC443,0xC444, +0xC8C1,0xC445,0xC446,0xC447,0xC448,0xC449,0xC44A,0xC44B, +0xC44C,0xC8C2,0xC44D,0xC8C3,0xC44E,0xC44F,0xC450,0xC451, +0xC452,0xC453,0xC454,0xC455,0xC8C4,0xC8C5,0xC456,0xC457, +0xC8C6,0xC458,0xC459,0xC45A,0xC8C7,0xC461,0xC462,0xC463, +0xC464,0xC8C8,0xC465,0xC466,0xC8C9,0xC467,0xC468,0xC8CA, +0xC469,0xC8CB,0xC46A,0xC46B,0xC46C,0xC46D,0xC46E,0xC46F, +0xC8CC,0xC470,0xC471,0xC472,0xC8CD,0xC473,0xC474,0xC475, +0xC8CE,0xC476,0xC477,0xC478,0xC479,0xC47A,0xC481,0xC482, +0xC8CF,0xC483,0xC484,0xC485,0xC486,0xC8D0,0xC487,0xC488, +0xC489,0xC48A,0xC48B,0xC48C,0xC8D1,0xC8D2,0xC48D,0xC48E, +0xC8D3,0xC48F,0xC490,0xC491,0xC8D4,0xC492,0xC493,0xC494, +0xC495,0xC496,0xC497,0xC498,0xC499,0xC49A,0xC49B,0xC49C, +0xC49D,0xC8D5,0xC49E,0xC49F,0xC4A0,0xC541,0xC542,0xC543, +0xC8D6,0xC8D7,0xC544,0xC545,0xC8D8,0xC546,0xC547,0xC548, +0xC8D9,0xC549,0xC54A,0xC54B,0xC54C,0xC54D,0xC54E,0xC54F, +0xC8DA,0xC8DB,0xC550,0xC8DC,0xC551,0xC8DD,0xC552,0xC553, +0xC554,0xC555,0xC556,0xC557,0xC8DE,0xC8DF,0xC558,0xC559, +0xC8E0,0xC55A,0xC561,0xC562,0xC8E1,0xC563,0xC564,0xC565, +0xC566,0xC567,0xC568,0xC569,0xC8E2,0xC56A,0xC56B,0xC8E3, +0xC56C,0xC8E4,0xC56D,0xC56E,0xC56F,0xC570,0xC571,0xC572, +0xC8E5,0xC8E6,0xC573,0xC574,0xC8E7,0xC575,0xC8E8,0xC8E9, +0xC8EA,0xC8EB,0xC576,0xC577,0xC578,0xC579,0xC57A,0xC581, +0xC8EC,0xC8ED,0xC582,0xC8EE,0xC583,0xC8EF,0xC584,0xC585, +0xC586,0xC8F0,0xC587,0xC588,0xC8F1,0xC589,0xC58A,0xC58B, +0xC8F2,0xC58C,0xC58D,0xC58E,0xC8F3,0xC58F,0xC590,0xC591, +0xC592,0xC593,0xC594,0xC595,0xC8F4,0xC8F5,0xC596,0xC597, +0xC598,0xC8F6,0xC599,0xC59A,0xC59B,0xC59C,0xC59D,0xC59E, +0xC8F7,0xC8F8,0xC59F,0xC5A0,0xC8F9,0xC641,0xC642,0xC643, +0xC8FA,0xC644,0xC645,0xC646,0xC647,0xC648,0xC649,0xC64A, +0xC8FB,0xC8FC,0xC64B,0xC8FD,0xC64C,0xC8FE,0xC64D,0xC64E, +0xC64F,0xC650,0xC651,0xC652}; + +/* page 9 0xF900-0xFA0B */ +static uint16 tab_uni_ksc56019[]={ +0xCBD0,0xCBD6,0xCBE7,0xCDCF,0xCDE8,0xCEAD,0xCFFB,0xD0A2, +0xD0B8,0xD0D0,0xD0DD,0xD1D4,0xD1D5,0xD1D8,0xD1DB,0xD1DC, +0xD1DD,0xD1DE,0xD1DF,0xD1E0,0xD1E2,0xD1E3,0xD1E4,0xD1E5, +0xD1E6,0xD1E8,0xD1E9,0xD1EA,0xD1EB,0xD1ED,0xD1EF,0xD1F0, +0xD1F2,0xD1F6,0xD1FA,0xD1FC,0xD1FD,0xD1FE,0xD2A2,0xD2A3, +0xD2A7,0xD2A8,0xD2A9,0xD2AA,0xD2AB,0xD2AD,0xD2B2,0xD2BE, +0xD2C2,0xD2C3,0xD2C4,0xD2C6,0xD2C7,0xD2C8,0xD2C9,0xD2CA, +0xD2CB,0xD2CD,0xD2CE,0xD2CF,0xD2D0,0xD2D1,0xD2D2,0xD2D3, +0xD2D4,0xD2D5,0xD2D6,0xD2D7,0xD2D9,0xD2DA,0xD2DE,0xD2DF, +0xD2E1,0xD2E2,0xD2E4,0xD2E5,0xD2E6,0xD2E7,0xD2E8,0xD2E9, +0xD2EA,0xD2EB,0xD2F0,0xD2F1,0xD2F2,0xD2F3,0xD2F4,0xD2F5, +0xD2F7,0xD2F8,0xD4E6,0xD4FC,0xD5A5,0xD5AB,0xD5AE,0xD6B8, +0xD6CD,0xD7CB,0xD7E4,0xDBC5,0xDBE4,0xDCA5,0xDDA5,0xDDD5, +0xDDF4,0xDEFC,0xDEFE,0xDFB3,0xDFE1,0xDFE8,0xE0F1,0xE1AD, +0xE1ED,0xE3F5,0xE4A1,0xE4A9,0xE5AE,0xE5B1,0xE5B2,0xE5B9, +0xE5BB,0xE5BC,0xE5C4,0xE5CE,0xE5D0,0xE5D2,0xE5D6,0xE5FA, +0xE5FB,0xE5FC,0xE5FE,0xE6A1,0xE6A4,0xE6A7,0xE6AD,0xE6AF, +0xE6B0,0xE6B1,0xE6B3,0xE6B7,0xE6B8,0xE6BC,0xE6C4,0xE6C6, +0xE6C7,0xE6CA,0xE6D2,0xE6D6,0xE6D9,0xE6DC,0xE6DF,0xE6E1, +0xE6E4,0xE6E5,0xE6E6,0xE6E8,0xE6EA,0xE6EB,0xE6EC,0xE6EF, +0xE6F1,0xE6F2,0xE6F5,0xE6F6,0xE6F7,0xE6F9,0xE7A1,0xE7A6, +0xE7A9,0xE7AA,0xE7AC,0xE7AD,0xE7B0,0xE7BF,0xE7C1,0xE7C6, +0xE7C7,0xE7CB,0xE7CD,0xE7CF,0xE7D0,0xE7D3,0xE7DF,0xE7E4, +0xE7E6,0xE7F7,0xE8E7,0xE8E8,0xE8F0,0xE8F1,0xE8F7,0xE8F9, +0xE8FB,0xE8FE,0xE9A7,0xE9AC,0xE9CC,0xE9F7,0xEAC1,0xEAE5, +0xEAF4,0xEAF7,0xEAFC,0xEAFE,0xEBA4,0xEBA7,0xEBA9,0xEBAA, +0xEBBA,0xEBBB,0xEBBD,0xEBC1,0xEBC2,0xEBC6,0xEBC7,0xEBCC, +0xEBCF,0xEBD0,0xEBD1,0xEBD2,0xEBD8,0xECA6,0xECA7,0xECAA, +0xECAF,0xECB0,0xECB1,0xECB2,0xECB5,0xECB8,0xECBA,0xECC0, +0xECC1,0xECC5,0xECC6,0xECC9,0xECCA,0xECD5,0xECDD,0xECDE, +0xECE1,0xECE4,0xECE7,0xECE8,0xECF7,0xECF8,0xECFA,0xEDA1, +0xEDA2,0xEDA3,0xEDEE,0xEEDB,0xF2BD,0xF2FA,0xF3B1,0xF4A7, +0xF4EE,0xF6F4,0xF6F6,0xF7B8,0xF7C8,0xF7D3,0xF8DB,0xF8F0, +0xFAA1,0xFAA2,0xFAE6,0xFCA9}; + +/* page 10 0xFF01-0xFFE6 */ +static uint16 tab_uni_ksc560110[]={ +0xA3A1,0xA3A2,0xA3A3,0xA3A4,0xA3A5,0xA3A6,0xA3A7,0xA3A8, +0xA3A9,0xA3AA,0xA3AB,0xA3AC,0xA3AD,0xA3AE,0xA3AF,0xA3B0, +0xA3B1,0xA3B2,0xA3B3,0xA3B4,0xA3B5,0xA3B6,0xA3B7,0xA3B8, +0xA3B9,0xA3BA,0xA3BB,0xA3BC,0xA3BD,0xA3BE,0xA3BF,0xA3C0, +0xA3C1,0xA3C2,0xA3C3,0xA3C4,0xA3C5,0xA3C6,0xA3C7,0xA3C8, +0xA3C9,0xA3CA,0xA3CB,0xA3CC,0xA3CD,0xA3CE,0xA3CF,0xA3D0, +0xA3D1,0xA3D2,0xA3D3,0xA3D4,0xA3D5,0xA3D6,0xA3D7,0xA3D8, +0xA3D9,0xA3DA,0xA3DB,0xA1AC,0xA3DD,0xA3DE,0xA3DF,0xA3E0, +0xA3E1,0xA3E2,0xA3E3,0xA3E4,0xA3E5,0xA3E6,0xA3E7,0xA3E8, +0xA3E9,0xA3EA,0xA3EB,0xA3EC,0xA3ED,0xA3EE,0xA3EF,0xA3F0, +0xA3F1,0xA3F2,0xA3F3,0xA3F4,0xA3F5,0xA3F6,0xA3F7,0xA3F8, +0xA3F9,0xA3FA,0xA3FB,0xA3FC,0xA3FD,0xA2A6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xA1CB, +0xA1CC,0xA1FE,0xA3FE, 0,0xA1CD,0xA3DC}; + +static int func_uni_ksc5601_onechar(int code){ + if ((code>=0x00A1)&&(code<=0x0167)) + return(tab_uni_ksc56010[code-0x00A1]); + if ((code>=0x02C7)&&(code<=0x0451)) + return(tab_uni_ksc56011[code-0x02C7]); + if ((code>=0x2015)&&(code<=0x2312)) + return(tab_uni_ksc56012[code-0x2015]); + if ((code>=0x2460)&&(code<=0x266D)) + return(tab_uni_ksc56013[code-0x2460]); + if ((code>=0x3000)&&(code<=0x327F)) + return(tab_uni_ksc56014[code-0x3000]); + if ((code>=0x3380)&&(code<=0x33DD)) + return(tab_uni_ksc56015[code-0x3380]); + if ((code>=0x4E00)&&(code<=0x947F)) + return(tab_uni_ksc56016[code-0x4E00]); + if ((code>=0x9577)&&(code<=0x9F9C)) + return(tab_uni_ksc56017[code-0x9577]); + if ((code>=0xAC00)&&(code<=0xD7A3)) + return(tab_uni_ksc56018[code-0xAC00]); + if ((code>=0xF900)&&(code<=0xFA0B)) + return(tab_uni_ksc56019[code-0xF900]); + if ((code>=0xFF01)&&(code<=0xFFE6)) + return(tab_uni_ksc560110[code-0xFF01]); + return(0); +} + + +int +my_wc_mb_euc_kr(CHARSET_INFO *cs __attribute__((unused)), + my_wc_t wc, uchar *s, uchar *e) +{ + int code; + + if (wc<0x80) + { + s[0]=wc; + return 1; + } + + if (!(code=func_uni_ksc5601_onechar(wc))) + return MY_CS_ILUNI; + + if (s+2>e) + return MY_CS_TOOSMALL; + + s[0]=code>>8; + s[1]=code&0xFF; + + return 2; +} + +int +my_mb_wc_euc_kr(CHARSET_INFO *cs __attribute__((unused)), + my_wc_t *pwc, const uchar *s, const uchar *e) +{ + + int hi=s[0]; + + if (hi<0x80) + { + pwc[0]=hi; + return 1; + } + + if (s+2>e) + return MY_CS_TOOFEW(0); + + if (!(pwc[0]=func_ksc5601_uni_onechar((hi<<8)+s[1]))) + return MY_CS_ILSEQ; + + return 2; +} + + #endif diff --git a/strings/ctype.c b/strings/ctype.c index 3be959e4f45..4f81b5c3225 100644 --- a/strings/ctype.c +++ b/strings/ctype.c @@ -3118,8 +3118,8 @@ CHARSET_INFO compiled_charsets[] = { ismbchar_euc_kr, ismbhead_euc_kr, mbcharlen_euc_kr, - NULL, /* mb_wc */ - NULL, /* wc_mb */ + my_mb_wc_euc_kr, /* mb_wc */ + my_wc_mb_euc_kr, /* wc_mb */ my_caseup_str_mb, my_casedn_str_mb, my_caseup_mb, -- cgit v1.2.1 From f30a48cc72b437db5ef8c7f06f468c09fccf6d14 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 29 Mar 2002 21:00:50 +0400 Subject: gb2312, GBK and Shift-JIS conversion routines --- strings/ctype-gb2312.c | 5502 +++++++++++++++++++++++++++++++++++++ strings/ctype-gbk.c | 7151 ++++++++++++++++++++++++++++++++++++++++++++++++ strings/ctype-sjis.c | 4146 ++++++++++++++++++++++++++++ strings/ctype.c | 12 +- 4 files changed, 16805 insertions(+), 6 deletions(-) diff --git a/strings/ctype-gb2312.c b/strings/ctype-gb2312.c index 556bae0747c..7da86915fbd 100644 --- a/strings/ctype-gb2312.c +++ b/strings/ctype-gb2312.c @@ -182,4 +182,5506 @@ int mbcharlen_gb2312(CHARSET_INFO *cs __attribute__((unused)),uint c) return (isgb2312head(c)? 2:0); } + +/* page 0 0x2121-0x2658 */ +static uint16 tab_gb2312_uni0[]={ +0x3000,0x3001,0x3002,0x30FB,0x02C9,0x02C7,0x00A8,0x3003, +0x3005,0x2015,0xFF5E,0x2016,0x2026,0x2018,0x2019,0x201C, +0x201D,0x3014,0x3015,0x3008,0x3009,0x300A,0x300B,0x300C, +0x300D,0x300E,0x300F,0x3016,0x3017,0x3010,0x3011,0x00B1, +0x00D7,0x00F7,0x2236,0x2227,0x2228,0x2211,0x220F,0x222A, +0x2229,0x2208,0x2237,0x221A,0x22A5,0x2225,0x2220,0x2312, +0x2299,0x222B,0x222E,0x2261,0x224C,0x2248,0x223D,0x221D, +0x2260,0x226E,0x226F,0x2264,0x2265,0x221E,0x2235,0x2234, +0x2642,0x2640,0x00B0,0x2032,0x2033,0x2103,0xFF04,0x00A4, +0xFFE0,0xFFE1,0x2030,0x00A7,0x2116,0x2606,0x2605,0x25CB, +0x25CF,0x25CE,0x25C7,0x25C6,0x25A1,0x25A0,0x25B3,0x25B2, +0x203B,0x2192,0x2190,0x2191,0x2193,0x3013, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x2488,0x2489,0x248A,0x248B,0x248C,0x248D,0x248E,0x248F, +0x2490,0x2491,0x2492,0x2493,0x2494,0x2495,0x2496,0x2497, +0x2498,0x2499,0x249A,0x249B,0x2474,0x2475,0x2476,0x2477, +0x2478,0x2479,0x247A,0x247B,0x247C,0x247D,0x247E,0x247F, +0x2480,0x2481,0x2482,0x2483,0x2484,0x2485,0x2486,0x2487, +0x2460,0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,0x2467, +0x2468,0x2469, 0, 0,0x3220,0x3221,0x3222,0x3223, +0x3224,0x3225,0x3226,0x3227,0x3228,0x3229, 0, 0, +0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,0x2167, +0x2168,0x2169,0x216A,0x216B, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xFF01,0xFF02,0xFF03,0xFFE5,0xFF05,0xFF06,0xFF07,0xFF08, +0xFF09,0xFF0A,0xFF0B,0xFF0C,0xFF0D,0xFF0E,0xFF0F,0xFF10, +0xFF11,0xFF12,0xFF13,0xFF14,0xFF15,0xFF16,0xFF17,0xFF18, +0xFF19,0xFF1A,0xFF1B,0xFF1C,0xFF1D,0xFF1E,0xFF1F,0xFF20, +0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27,0xFF28, +0xFF29,0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F,0xFF30, +0xFF31,0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37,0xFF38, +0xFF39,0xFF3A,0xFF3B,0xFF3C,0xFF3D,0xFF3E,0xFF3F,0xFF40, +0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47,0xFF48, +0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F,0xFF50, +0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,0xFF56,0xFF57,0xFF58, +0xFF59,0xFF5A,0xFF5B,0xFF5C,0xFF5D,0xFFE3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3041,0x3042,0x3043,0x3044,0x3045,0x3046,0x3047,0x3048, +0x3049,0x304A,0x304B,0x304C,0x304D,0x304E,0x304F,0x3050, +0x3051,0x3052,0x3053,0x3054,0x3055,0x3056,0x3057,0x3058, +0x3059,0x305A,0x305B,0x305C,0x305D,0x305E,0x305F,0x3060, +0x3061,0x3062,0x3063,0x3064,0x3065,0x3066,0x3067,0x3068, +0x3069,0x306A,0x306B,0x306C,0x306D,0x306E,0x306F,0x3070, +0x3071,0x3072,0x3073,0x3074,0x3075,0x3076,0x3077,0x3078, +0x3079,0x307A,0x307B,0x307C,0x307D,0x307E,0x307F,0x3080, +0x3081,0x3082,0x3083,0x3084,0x3085,0x3086,0x3087,0x3088, +0x3089,0x308A,0x308B,0x308C,0x308D,0x308E,0x308F,0x3090, +0x3091,0x3092,0x3093, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x30A1,0x30A2,0x30A3,0x30A4,0x30A5,0x30A6,0x30A7,0x30A8, +0x30A9,0x30AA,0x30AB,0x30AC,0x30AD,0x30AE,0x30AF,0x30B0, +0x30B1,0x30B2,0x30B3,0x30B4,0x30B5,0x30B6,0x30B7,0x30B8, +0x30B9,0x30BA,0x30BB,0x30BC,0x30BD,0x30BE,0x30BF,0x30C0, +0x30C1,0x30C2,0x30C3,0x30C4,0x30C5,0x30C6,0x30C7,0x30C8, +0x30C9,0x30CA,0x30CB,0x30CC,0x30CD,0x30CE,0x30CF,0x30D0, +0x30D1,0x30D2,0x30D3,0x30D4,0x30D5,0x30D6,0x30D7,0x30D8, +0x30D9,0x30DA,0x30DB,0x30DC,0x30DD,0x30DE,0x30DF,0x30E0, +0x30E1,0x30E2,0x30E3,0x30E4,0x30E5,0x30E6,0x30E7,0x30E8, +0x30E9,0x30EA,0x30EB,0x30EC,0x30ED,0x30EE,0x30EF,0x30F0, +0x30F1,0x30F2,0x30F3,0x30F4,0x30F5,0x30F6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398, +0x0399,0x039A,0x039B,0x039C,0x039D,0x039E,0x039F,0x03A0, +0x03A1,0x03A3,0x03A4,0x03A5,0x03A6,0x03A7,0x03A8,0x03A9, + 0, 0, 0, 0, 0, 0, 0, 0, +0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6,0x03B7,0x03B8, +0x03B9,0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF,0x03C0, +0x03C1,0x03C3,0x03C4,0x03C5,0x03C6,0x03C7,0x03C8,0x03C9 +}; + +/* page 1 0x2721-0x296F */ +static uint16 tab_gb2312_uni1[]={ +0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0401,0x0416, +0x0417,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E, +0x041F,0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426, +0x0427,0x0428,0x0429,0x042A,0x042B,0x042C,0x042D,0x042E, +0x042F, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0451,0x0436, +0x0437,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E, +0x043F,0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446, +0x0447,0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E, +0x044F, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x0101,0x00E1,0x01CE,0x00E0,0x0113,0x00E9,0x011B,0x00E8, +0x012B,0x00ED,0x01D0,0x00EC,0x014D,0x00F3,0x01D2,0x00F2, +0x016B,0x00FA,0x01D4,0x00F9,0x01D6,0x01D8,0x01DA,0x01DC, +0x00FC,0x00EA, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x3105,0x3106,0x3107,0x3108, +0x3109,0x310A,0x310B,0x310C,0x310D,0x310E,0x310F,0x3110, +0x3111,0x3112,0x3113,0x3114,0x3115,0x3116,0x3117,0x3118, +0x3119,0x311A,0x311B,0x311C,0x311D,0x311E,0x311F,0x3120, +0x3121,0x3122,0x3123,0x3124,0x3125,0x3126,0x3127,0x3128, +0x3129, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x2500,0x2501,0x2502,0x2503,0x2504, +0x2505,0x2506,0x2507,0x2508,0x2509,0x250A,0x250B,0x250C, +0x250D,0x250E,0x250F,0x2510,0x2511,0x2512,0x2513,0x2514, +0x2515,0x2516,0x2517,0x2518,0x2519,0x251A,0x251B,0x251C, +0x251D,0x251E,0x251F,0x2520,0x2521,0x2522,0x2523,0x2524, +0x2525,0x2526,0x2527,0x2528,0x2529,0x252A,0x252B,0x252C, +0x252D,0x252E,0x252F,0x2530,0x2531,0x2532,0x2533,0x2534, +0x2535,0x2536,0x2537,0x2538,0x2539,0x253A,0x253B,0x253C, +0x253D,0x253E,0x253F,0x2540,0x2541,0x2542,0x2543,0x2544, +0x2545,0x2546,0x2547,0x2548,0x2549,0x254A,0x254B}; + +/* page 2 0x3021-0x777E */ +static uint16 tab_gb2312_uni2[]={ +0x554A,0x963F,0x57C3,0x6328,0x54CE,0x5509,0x54C0,0x7691, +0x764C,0x853C,0x77EE,0x827E,0x788D,0x7231,0x9698,0x978D, +0x6C28,0x5B89,0x4FFA,0x6309,0x6697,0x5CB8,0x80FA,0x6848, +0x80AE,0x6602,0x76CE,0x51F9,0x6556,0x71AC,0x7FF1,0x8884, +0x50B2,0x5965,0x61CA,0x6FB3,0x82AD,0x634C,0x6252,0x53ED, +0x5427,0x7B06,0x516B,0x75A4,0x5DF4,0x62D4,0x8DCB,0x9776, +0x628A,0x8019,0x575D,0x9738,0x7F62,0x7238,0x767D,0x67CF, +0x767E,0x6446,0x4F70,0x8D25,0x62DC,0x7A17,0x6591,0x73ED, +0x642C,0x6273,0x822C,0x9881,0x677F,0x7248,0x626E,0x62CC, +0x4F34,0x74E3,0x534A,0x529E,0x7ECA,0x90A6,0x5E2E,0x6886, +0x699C,0x8180,0x7ED1,0x68D2,0x78C5,0x868C,0x9551,0x508D, +0x8C24,0x82DE,0x80DE,0x5305,0x8912,0x5265, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8584,0x96F9,0x4FDD,0x5821,0x9971,0x5B9D,0x62B1,0x62A5, +0x66B4,0x8C79,0x9C8D,0x7206,0x676F,0x7891,0x60B2,0x5351, +0x5317,0x8F88,0x80CC,0x8D1D,0x94A1,0x500D,0x72C8,0x5907, +0x60EB,0x7119,0x88AB,0x5954,0x82EF,0x672C,0x7B28,0x5D29, +0x7EF7,0x752D,0x6CF5,0x8E66,0x8FF8,0x903C,0x9F3B,0x6BD4, +0x9119,0x7B14,0x5F7C,0x78A7,0x84D6,0x853D,0x6BD5,0x6BD9, +0x6BD6,0x5E01,0x5E87,0x75F9,0x95ED,0x655D,0x5F0A,0x5FC5, +0x8F9F,0x58C1,0x81C2,0x907F,0x965B,0x97AD,0x8FB9,0x7F16, +0x8D2C,0x6241,0x4FBF,0x53D8,0x535E,0x8FA8,0x8FA9,0x8FAB, +0x904D,0x6807,0x5F6A,0x8198,0x8868,0x9CD6,0x618B,0x522B, +0x762A,0x5F6C,0x658C,0x6FD2,0x6EE8,0x5BBE,0x6448,0x5175, +0x51B0,0x67C4,0x4E19,0x79C9,0x997C,0x70B3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x75C5,0x5E76,0x73BB,0x83E0,0x64AD,0x62E8,0x94B5,0x6CE2, +0x535A,0x52C3,0x640F,0x94C2,0x7B94,0x4F2F,0x5E1B,0x8236, +0x8116,0x818A,0x6E24,0x6CCA,0x9A73,0x6355,0x535C,0x54FA, +0x8865,0x57E0,0x4E0D,0x5E03,0x6B65,0x7C3F,0x90E8,0x6016, +0x64E6,0x731C,0x88C1,0x6750,0x624D,0x8D22,0x776C,0x8E29, +0x91C7,0x5F69,0x83DC,0x8521,0x9910,0x53C2,0x8695,0x6B8B, +0x60ED,0x60E8,0x707F,0x82CD,0x8231,0x4ED3,0x6CA7,0x85CF, +0x64CD,0x7CD9,0x69FD,0x66F9,0x8349,0x5395,0x7B56,0x4FA7, +0x518C,0x6D4B,0x5C42,0x8E6D,0x63D2,0x53C9,0x832C,0x8336, +0x67E5,0x78B4,0x643D,0x5BDF,0x5C94,0x5DEE,0x8BE7,0x62C6, +0x67F4,0x8C7A,0x6400,0x63BA,0x8749,0x998B,0x8C17,0x7F20, +0x94F2,0x4EA7,0x9610,0x98A4,0x660C,0x7316, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x573A,0x5C1D,0x5E38,0x957F,0x507F,0x80A0,0x5382,0x655E, +0x7545,0x5531,0x5021,0x8D85,0x6284,0x949E,0x671D,0x5632, +0x6F6E,0x5DE2,0x5435,0x7092,0x8F66,0x626F,0x64A4,0x63A3, +0x5F7B,0x6F88,0x90F4,0x81E3,0x8FB0,0x5C18,0x6668,0x5FF1, +0x6C89,0x9648,0x8D81,0x886C,0x6491,0x79F0,0x57CE,0x6A59, +0x6210,0x5448,0x4E58,0x7A0B,0x60E9,0x6F84,0x8BDA,0x627F, +0x901E,0x9A8B,0x79E4,0x5403,0x75F4,0x6301,0x5319,0x6C60, +0x8FDF,0x5F1B,0x9A70,0x803B,0x9F7F,0x4F88,0x5C3A,0x8D64, +0x7FC5,0x65A5,0x70BD,0x5145,0x51B2,0x866B,0x5D07,0x5BA0, +0x62BD,0x916C,0x7574,0x8E0C,0x7A20,0x6101,0x7B79,0x4EC7, +0x7EF8,0x7785,0x4E11,0x81ED,0x521D,0x51FA,0x6A71,0x53A8, +0x8E87,0x9504,0x96CF,0x6EC1,0x9664,0x695A, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7840,0x50A8,0x77D7,0x6410,0x89E6,0x5904,0x63E3,0x5DDD, +0x7A7F,0x693D,0x4F20,0x8239,0x5598,0x4E32,0x75AE,0x7A97, +0x5E62,0x5E8A,0x95EF,0x521B,0x5439,0x708A,0x6376,0x9524, +0x5782,0x6625,0x693F,0x9187,0x5507,0x6DF3,0x7EAF,0x8822, +0x6233,0x7EF0,0x75B5,0x8328,0x78C1,0x96CC,0x8F9E,0x6148, +0x74F7,0x8BCD,0x6B64,0x523A,0x8D50,0x6B21,0x806A,0x8471, +0x56F1,0x5306,0x4ECE,0x4E1B,0x51D1,0x7C97,0x918B,0x7C07, +0x4FC3,0x8E7F,0x7BE1,0x7A9C,0x6467,0x5D14,0x50AC,0x8106, +0x7601,0x7CB9,0x6DEC,0x7FE0,0x6751,0x5B58,0x5BF8,0x78CB, +0x64AE,0x6413,0x63AA,0x632B,0x9519,0x642D,0x8FBE,0x7B54, +0x7629,0x6253,0x5927,0x5446,0x6B79,0x50A3,0x6234,0x5E26, +0x6B86,0x4EE3,0x8D37,0x888B,0x5F85,0x902E, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6020,0x803D,0x62C5,0x4E39,0x5355,0x90F8,0x63B8,0x80C6, +0x65E6,0x6C2E,0x4F46,0x60EE,0x6DE1,0x8BDE,0x5F39,0x86CB, +0x5F53,0x6321,0x515A,0x8361,0x6863,0x5200,0x6363,0x8E48, +0x5012,0x5C9B,0x7977,0x5BFC,0x5230,0x7A3B,0x60BC,0x9053, +0x76D7,0x5FB7,0x5F97,0x7684,0x8E6C,0x706F,0x767B,0x7B49, +0x77AA,0x51F3,0x9093,0x5824,0x4F4E,0x6EF4,0x8FEA,0x654C, +0x7B1B,0x72C4,0x6DA4,0x7FDF,0x5AE1,0x62B5,0x5E95,0x5730, +0x8482,0x7B2C,0x5E1D,0x5F1F,0x9012,0x7F14,0x98A0,0x6382, +0x6EC7,0x7898,0x70B9,0x5178,0x975B,0x57AB,0x7535,0x4F43, +0x7538,0x5E97,0x60E6,0x5960,0x6DC0,0x6BBF,0x7889,0x53FC, +0x96D5,0x51CB,0x5201,0x6389,0x540A,0x9493,0x8C03,0x8DCC, +0x7239,0x789F,0x8776,0x8FED,0x8C0D,0x53E0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4E01,0x76EF,0x53EE,0x9489,0x9876,0x9F0E,0x952D,0x5B9A, +0x8BA2,0x4E22,0x4E1C,0x51AC,0x8463,0x61C2,0x52A8,0x680B, +0x4F97,0x606B,0x51BB,0x6D1E,0x515C,0x6296,0x6597,0x9661, +0x8C46,0x9017,0x75D8,0x90FD,0x7763,0x6BD2,0x728A,0x72EC, +0x8BFB,0x5835,0x7779,0x8D4C,0x675C,0x9540,0x809A,0x5EA6, +0x6E21,0x5992,0x7AEF,0x77ED,0x953B,0x6BB5,0x65AD,0x7F0E, +0x5806,0x5151,0x961F,0x5BF9,0x58A9,0x5428,0x8E72,0x6566, +0x987F,0x56E4,0x949D,0x76FE,0x9041,0x6387,0x54C6,0x591A, +0x593A,0x579B,0x8EB2,0x6735,0x8DFA,0x8235,0x5241,0x60F0, +0x5815,0x86FE,0x5CE8,0x9E45,0x4FC4,0x989D,0x8BB9,0x5A25, +0x6076,0x5384,0x627C,0x904F,0x9102,0x997F,0x6069,0x800C, +0x513F,0x8033,0x5C14,0x9975,0x6D31,0x4E8C, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8D30,0x53D1,0x7F5A,0x7B4F,0x4F10,0x4E4F,0x9600,0x6CD5, +0x73D0,0x85E9,0x5E06,0x756A,0x7FFB,0x6A0A,0x77FE,0x9492, +0x7E41,0x51E1,0x70E6,0x53CD,0x8FD4,0x8303,0x8D29,0x72AF, +0x996D,0x6CDB,0x574A,0x82B3,0x65B9,0x80AA,0x623F,0x9632, +0x59A8,0x4EFF,0x8BBF,0x7EBA,0x653E,0x83F2,0x975E,0x5561, +0x98DE,0x80A5,0x532A,0x8BFD,0x5420,0x80BA,0x5E9F,0x6CB8, +0x8D39,0x82AC,0x915A,0x5429,0x6C1B,0x5206,0x7EB7,0x575F, +0x711A,0x6C7E,0x7C89,0x594B,0x4EFD,0x5FFF,0x6124,0x7CAA, +0x4E30,0x5C01,0x67AB,0x8702,0x5CF0,0x950B,0x98CE,0x75AF, +0x70FD,0x9022,0x51AF,0x7F1D,0x8BBD,0x5949,0x51E4,0x4F5B, +0x5426,0x592B,0x6577,0x80A4,0x5B75,0x6276,0x62C2,0x8F90, +0x5E45,0x6C1F,0x7B26,0x4F0F,0x4FD8,0x670D, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6D6E,0x6DAA,0x798F,0x88B1,0x5F17,0x752B,0x629A,0x8F85, +0x4FEF,0x91DC,0x65A7,0x812F,0x8151,0x5E9C,0x8150,0x8D74, +0x526F,0x8986,0x8D4B,0x590D,0x5085,0x4ED8,0x961C,0x7236, +0x8179,0x8D1F,0x5BCC,0x8BA3,0x9644,0x5987,0x7F1A,0x5490, +0x5676,0x560E,0x8BE5,0x6539,0x6982,0x9499,0x76D6,0x6E89, +0x5E72,0x7518,0x6746,0x67D1,0x7AFF,0x809D,0x8D76,0x611F, +0x79C6,0x6562,0x8D63,0x5188,0x521A,0x94A2,0x7F38,0x809B, +0x7EB2,0x5C97,0x6E2F,0x6760,0x7BD9,0x768B,0x9AD8,0x818F, +0x7F94,0x7CD5,0x641E,0x9550,0x7A3F,0x544A,0x54E5,0x6B4C, +0x6401,0x6208,0x9E3D,0x80F3,0x7599,0x5272,0x9769,0x845B, +0x683C,0x86E4,0x9601,0x9694,0x94EC,0x4E2A,0x5404,0x7ED9, +0x6839,0x8DDF,0x8015,0x66F4,0x5E9A,0x7FB9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x57C2,0x803F,0x6897,0x5DE5,0x653B,0x529F,0x606D,0x9F9A, +0x4F9B,0x8EAC,0x516C,0x5BAB,0x5F13,0x5DE9,0x6C5E,0x62F1, +0x8D21,0x5171,0x94A9,0x52FE,0x6C9F,0x82DF,0x72D7,0x57A2, +0x6784,0x8D2D,0x591F,0x8F9C,0x83C7,0x5495,0x7B8D,0x4F30, +0x6CBD,0x5B64,0x59D1,0x9F13,0x53E4,0x86CA,0x9AA8,0x8C37, +0x80A1,0x6545,0x987E,0x56FA,0x96C7,0x522E,0x74DC,0x5250, +0x5BE1,0x6302,0x8902,0x4E56,0x62D0,0x602A,0x68FA,0x5173, +0x5B98,0x51A0,0x89C2,0x7BA1,0x9986,0x7F50,0x60EF,0x704C, +0x8D2F,0x5149,0x5E7F,0x901B,0x7470,0x89C4,0x572D,0x7845, +0x5F52,0x9F9F,0x95FA,0x8F68,0x9B3C,0x8BE1,0x7678,0x6842, +0x67DC,0x8DEA,0x8D35,0x523D,0x8F8A,0x6EDA,0x68CD,0x9505, +0x90ED,0x56FD,0x679C,0x88F9,0x8FC7,0x54C8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9AB8,0x5B69,0x6D77,0x6C26,0x4EA5,0x5BB3,0x9A87,0x9163, +0x61A8,0x90AF,0x97E9,0x542B,0x6DB5,0x5BD2,0x51FD,0x558A, +0x7F55,0x7FF0,0x64BC,0x634D,0x65F1,0x61BE,0x608D,0x710A, +0x6C57,0x6C49,0x592F,0x676D,0x822A,0x58D5,0x568E,0x8C6A, +0x6BEB,0x90DD,0x597D,0x8017,0x53F7,0x6D69,0x5475,0x559D, +0x8377,0x83CF,0x6838,0x79BE,0x548C,0x4F55,0x5408,0x76D2, +0x8C89,0x9602,0x6CB3,0x6DB8,0x8D6B,0x8910,0x9E64,0x8D3A, +0x563F,0x9ED1,0x75D5,0x5F88,0x72E0,0x6068,0x54FC,0x4EA8, +0x6A2A,0x8861,0x6052,0x8F70,0x54C4,0x70D8,0x8679,0x9E3F, +0x6D2A,0x5B8F,0x5F18,0x7EA2,0x5589,0x4FAF,0x7334,0x543C, +0x539A,0x5019,0x540E,0x547C,0x4E4E,0x5FFD,0x745A,0x58F6, +0x846B,0x80E1,0x8774,0x72D0,0x7CCA,0x6E56, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5F27,0x864E,0x552C,0x62A4,0x4E92,0x6CAA,0x6237,0x82B1, +0x54D7,0x534E,0x733E,0x6ED1,0x753B,0x5212,0x5316,0x8BDD, +0x69D0,0x5F8A,0x6000,0x6DEE,0x574F,0x6B22,0x73AF,0x6853, +0x8FD8,0x7F13,0x6362,0x60A3,0x5524,0x75EA,0x8C62,0x7115, +0x6DA3,0x5BA6,0x5E7B,0x8352,0x614C,0x9EC4,0x78FA,0x8757, +0x7C27,0x7687,0x51F0,0x60F6,0x714C,0x6643,0x5E4C,0x604D, +0x8C0E,0x7070,0x6325,0x8F89,0x5FBD,0x6062,0x86D4,0x56DE, +0x6BC1,0x6094,0x6167,0x5349,0x60E0,0x6666,0x8D3F,0x79FD, +0x4F1A,0x70E9,0x6C47,0x8BB3,0x8BF2,0x7ED8,0x8364,0x660F, +0x5A5A,0x9B42,0x6D51,0x6DF7,0x8C41,0x6D3B,0x4F19,0x706B, +0x83B7,0x6216,0x60D1,0x970D,0x8D27,0x7978,0x51FB,0x573E, +0x57FA,0x673A,0x7578,0x7A3D,0x79EF,0x7B95, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x808C,0x9965,0x8FF9,0x6FC0,0x8BA5,0x9E21,0x59EC,0x7EE9, +0x7F09,0x5409,0x6781,0x68D8,0x8F91,0x7C4D,0x96C6,0x53CA, +0x6025,0x75BE,0x6C72,0x5373,0x5AC9,0x7EA7,0x6324,0x51E0, +0x810A,0x5DF1,0x84DF,0x6280,0x5180,0x5B63,0x4F0E,0x796D, +0x5242,0x60B8,0x6D4E,0x5BC4,0x5BC2,0x8BA1,0x8BB0,0x65E2, +0x5FCC,0x9645,0x5993,0x7EE7,0x7EAA,0x5609,0x67B7,0x5939, +0x4F73,0x5BB6,0x52A0,0x835A,0x988A,0x8D3E,0x7532,0x94BE, +0x5047,0x7A3C,0x4EF7,0x67B6,0x9A7E,0x5AC1,0x6B7C,0x76D1, +0x575A,0x5C16,0x7B3A,0x95F4,0x714E,0x517C,0x80A9,0x8270, +0x5978,0x7F04,0x8327,0x68C0,0x67EC,0x78B1,0x7877,0x62E3, +0x6361,0x7B80,0x4FED,0x526A,0x51CF,0x8350,0x69DB,0x9274, +0x8DF5,0x8D31,0x89C1,0x952E,0x7BAD,0x4EF6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5065,0x8230,0x5251,0x996F,0x6E10,0x6E85,0x6DA7,0x5EFA, +0x50F5,0x59DC,0x5C06,0x6D46,0x6C5F,0x7586,0x848B,0x6868, +0x5956,0x8BB2,0x5320,0x9171,0x964D,0x8549,0x6912,0x7901, +0x7126,0x80F6,0x4EA4,0x90CA,0x6D47,0x9A84,0x5A07,0x56BC, +0x6405,0x94F0,0x77EB,0x4FA5,0x811A,0x72E1,0x89D2,0x997A, +0x7F34,0x7EDE,0x527F,0x6559,0x9175,0x8F7F,0x8F83,0x53EB, +0x7A96,0x63ED,0x63A5,0x7686,0x79F8,0x8857,0x9636,0x622A, +0x52AB,0x8282,0x6854,0x6770,0x6377,0x776B,0x7AED,0x6D01, +0x7ED3,0x89E3,0x59D0,0x6212,0x85C9,0x82A5,0x754C,0x501F, +0x4ECB,0x75A5,0x8BEB,0x5C4A,0x5DFE,0x7B4B,0x65A4,0x91D1, +0x4ECA,0x6D25,0x895F,0x7D27,0x9526,0x4EC5,0x8C28,0x8FDB, +0x9773,0x664B,0x7981,0x8FD1,0x70EC,0x6D78, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5C3D,0x52B2,0x8346,0x5162,0x830E,0x775B,0x6676,0x9CB8, +0x4EAC,0x60CA,0x7CBE,0x7CB3,0x7ECF,0x4E95,0x8B66,0x666F, +0x9888,0x9759,0x5883,0x656C,0x955C,0x5F84,0x75C9,0x9756, +0x7ADF,0x7ADE,0x51C0,0x70AF,0x7A98,0x63EA,0x7A76,0x7EA0, +0x7396,0x97ED,0x4E45,0x7078,0x4E5D,0x9152,0x53A9,0x6551, +0x65E7,0x81FC,0x8205,0x548E,0x5C31,0x759A,0x97A0,0x62D8, +0x72D9,0x75BD,0x5C45,0x9A79,0x83CA,0x5C40,0x5480,0x77E9, +0x4E3E,0x6CAE,0x805A,0x62D2,0x636E,0x5DE8,0x5177,0x8DDD, +0x8E1E,0x952F,0x4FF1,0x53E5,0x60E7,0x70AC,0x5267,0x6350, +0x9E43,0x5A1F,0x5026,0x7737,0x5377,0x7EE2,0x6485,0x652B, +0x6289,0x6398,0x5014,0x7235,0x89C9,0x51B3,0x8BC0,0x7EDD, +0x5747,0x83CC,0x94A7,0x519B,0x541B,0x5CFB, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4FCA,0x7AE3,0x6D5A,0x90E1,0x9A8F,0x5580,0x5496,0x5361, +0x54AF,0x5F00,0x63E9,0x6977,0x51EF,0x6168,0x520A,0x582A, +0x52D8,0x574E,0x780D,0x770B,0x5EB7,0x6177,0x7CE0,0x625B, +0x6297,0x4EA2,0x7095,0x8003,0x62F7,0x70E4,0x9760,0x5777, +0x82DB,0x67EF,0x68F5,0x78D5,0x9897,0x79D1,0x58F3,0x54B3, +0x53EF,0x6E34,0x514B,0x523B,0x5BA2,0x8BFE,0x80AF,0x5543, +0x57A6,0x6073,0x5751,0x542D,0x7A7A,0x6050,0x5B54,0x63A7, +0x62A0,0x53E3,0x6263,0x5BC7,0x67AF,0x54ED,0x7A9F,0x82E6, +0x9177,0x5E93,0x88E4,0x5938,0x57AE,0x630E,0x8DE8,0x80EF, +0x5757,0x7B77,0x4FA9,0x5FEB,0x5BBD,0x6B3E,0x5321,0x7B50, +0x72C2,0x6846,0x77FF,0x7736,0x65F7,0x51B5,0x4E8F,0x76D4, +0x5CBF,0x7AA5,0x8475,0x594E,0x9B41,0x5080, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9988,0x6127,0x6E83,0x5764,0x6606,0x6346,0x56F0,0x62EC, +0x6269,0x5ED3,0x9614,0x5783,0x62C9,0x5587,0x8721,0x814A, +0x8FA3,0x5566,0x83B1,0x6765,0x8D56,0x84DD,0x5A6A,0x680F, +0x62E6,0x7BEE,0x9611,0x5170,0x6F9C,0x8C30,0x63FD,0x89C8, +0x61D2,0x7F06,0x70C2,0x6EE5,0x7405,0x6994,0x72FC,0x5ECA, +0x90CE,0x6717,0x6D6A,0x635E,0x52B3,0x7262,0x8001,0x4F6C, +0x59E5,0x916A,0x70D9,0x6D9D,0x52D2,0x4E50,0x96F7,0x956D, +0x857E,0x78CA,0x7D2F,0x5121,0x5792,0x64C2,0x808B,0x7C7B, +0x6CEA,0x68F1,0x695E,0x51B7,0x5398,0x68A8,0x7281,0x9ECE, +0x7BF1,0x72F8,0x79BB,0x6F13,0x7406,0x674E,0x91CC,0x9CA4, +0x793C,0x8389,0x8354,0x540F,0x6817,0x4E3D,0x5389,0x52B1, +0x783E,0x5386,0x5229,0x5088,0x4F8B,0x4FD0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x75E2,0x7ACB,0x7C92,0x6CA5,0x96B6,0x529B,0x7483,0x54E9, +0x4FE9,0x8054,0x83B2,0x8FDE,0x9570,0x5EC9,0x601C,0x6D9F, +0x5E18,0x655B,0x8138,0x94FE,0x604B,0x70BC,0x7EC3,0x7CAE, +0x51C9,0x6881,0x7CB1,0x826F,0x4E24,0x8F86,0x91CF,0x667E, +0x4EAE,0x8C05,0x64A9,0x804A,0x50DA,0x7597,0x71CE,0x5BE5, +0x8FBD,0x6F66,0x4E86,0x6482,0x9563,0x5ED6,0x6599,0x5217, +0x88C2,0x70C8,0x52A3,0x730E,0x7433,0x6797,0x78F7,0x9716, +0x4E34,0x90BB,0x9CDE,0x6DCB,0x51DB,0x8D41,0x541D,0x62CE, +0x73B2,0x83F1,0x96F6,0x9F84,0x94C3,0x4F36,0x7F9A,0x51CC, +0x7075,0x9675,0x5CAD,0x9886,0x53E6,0x4EE4,0x6E9C,0x7409, +0x69B4,0x786B,0x998F,0x7559,0x5218,0x7624,0x6D41,0x67F3, +0x516D,0x9F99,0x804B,0x5499,0x7B3C,0x7ABF, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9686,0x5784,0x62E2,0x9647,0x697C,0x5A04,0x6402,0x7BD3, +0x6F0F,0x964B,0x82A6,0x5362,0x9885,0x5E90,0x7089,0x63B3, +0x5364,0x864F,0x9C81,0x9E93,0x788C,0x9732,0x8DEF,0x8D42, +0x9E7F,0x6F5E,0x7984,0x5F55,0x9646,0x622E,0x9A74,0x5415, +0x94DD,0x4FA3,0x65C5,0x5C65,0x5C61,0x7F15,0x8651,0x6C2F, +0x5F8B,0x7387,0x6EE4,0x7EFF,0x5CE6,0x631B,0x5B6A,0x6EE6, +0x5375,0x4E71,0x63A0,0x7565,0x62A1,0x8F6E,0x4F26,0x4ED1, +0x6CA6,0x7EB6,0x8BBA,0x841D,0x87BA,0x7F57,0x903B,0x9523, +0x7BA9,0x9AA1,0x88F8,0x843D,0x6D1B,0x9A86,0x7EDC,0x5988, +0x9EBB,0x739B,0x7801,0x8682,0x9A6C,0x9A82,0x561B,0x5417, +0x57CB,0x4E70,0x9EA6,0x5356,0x8FC8,0x8109,0x7792,0x9992, +0x86EE,0x6EE1,0x8513,0x66FC,0x6162,0x6F2B, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8C29,0x8292,0x832B,0x76F2,0x6C13,0x5FD9,0x83BD,0x732B, +0x8305,0x951A,0x6BDB,0x77DB,0x94C6,0x536F,0x8302,0x5192, +0x5E3D,0x8C8C,0x8D38,0x4E48,0x73AB,0x679A,0x6885,0x9176, +0x9709,0x7164,0x6CA1,0x7709,0x5A92,0x9541,0x6BCF,0x7F8E, +0x6627,0x5BD0,0x59B9,0x5A9A,0x95E8,0x95F7,0x4EEC,0x840C, +0x8499,0x6AAC,0x76DF,0x9530,0x731B,0x68A6,0x5B5F,0x772F, +0x919A,0x9761,0x7CDC,0x8FF7,0x8C1C,0x5F25,0x7C73,0x79D8, +0x89C5,0x6CCC,0x871C,0x5BC6,0x5E42,0x68C9,0x7720,0x7EF5, +0x5195,0x514D,0x52C9,0x5A29,0x7F05,0x9762,0x82D7,0x63CF, +0x7784,0x85D0,0x79D2,0x6E3A,0x5E99,0x5999,0x8511,0x706D, +0x6C11,0x62BF,0x76BF,0x654F,0x60AF,0x95FD,0x660E,0x879F, +0x9E23,0x94ED,0x540D,0x547D,0x8C2C,0x6478, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6479,0x8611,0x6A21,0x819C,0x78E8,0x6469,0x9B54,0x62B9, +0x672B,0x83AB,0x58A8,0x9ED8,0x6CAB,0x6F20,0x5BDE,0x964C, +0x8C0B,0x725F,0x67D0,0x62C7,0x7261,0x4EA9,0x59C6,0x6BCD, +0x5893,0x66AE,0x5E55,0x52DF,0x6155,0x6728,0x76EE,0x7766, +0x7267,0x7A46,0x62FF,0x54EA,0x5450,0x94A0,0x90A3,0x5A1C, +0x7EB3,0x6C16,0x4E43,0x5976,0x8010,0x5948,0x5357,0x7537, +0x96BE,0x56CA,0x6320,0x8111,0x607C,0x95F9,0x6DD6,0x5462, +0x9981,0x5185,0x5AE9,0x80FD,0x59AE,0x9713,0x502A,0x6CE5, +0x5C3C,0x62DF,0x4F60,0x533F,0x817B,0x9006,0x6EBA,0x852B, +0x62C8,0x5E74,0x78BE,0x64B5,0x637B,0x5FF5,0x5A18,0x917F, +0x9E1F,0x5C3F,0x634F,0x8042,0x5B7D,0x556E,0x954A,0x954D, +0x6D85,0x60A8,0x67E0,0x72DE,0x51DD,0x5B81, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x62E7,0x6CDE,0x725B,0x626D,0x94AE,0x7EBD,0x8113,0x6D53, +0x519C,0x5F04,0x5974,0x52AA,0x6012,0x5973,0x6696,0x8650, +0x759F,0x632A,0x61E6,0x7CEF,0x8BFA,0x54E6,0x6B27,0x9E25, +0x6BB4,0x85D5,0x5455,0x5076,0x6CA4,0x556A,0x8DB4,0x722C, +0x5E15,0x6015,0x7436,0x62CD,0x6392,0x724C,0x5F98,0x6E43, +0x6D3E,0x6500,0x6F58,0x76D8,0x78D0,0x76FC,0x7554,0x5224, +0x53DB,0x4E53,0x5E9E,0x65C1,0x802A,0x80D6,0x629B,0x5486, +0x5228,0x70AE,0x888D,0x8DD1,0x6CE1,0x5478,0x80DA,0x57F9, +0x88F4,0x8D54,0x966A,0x914D,0x4F69,0x6C9B,0x55B7,0x76C6, +0x7830,0x62A8,0x70F9,0x6F8E,0x5F6D,0x84EC,0x68DA,0x787C, +0x7BF7,0x81A8,0x670B,0x9E4F,0x6367,0x78B0,0x576F,0x7812, +0x9739,0x6279,0x62AB,0x5288,0x7435,0x6BD7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5564,0x813E,0x75B2,0x76AE,0x5339,0x75DE,0x50FB,0x5C41, +0x8B6C,0x7BC7,0x504F,0x7247,0x9A97,0x98D8,0x6F02,0x74E2, +0x7968,0x6487,0x77A5,0x62FC,0x9891,0x8D2B,0x54C1,0x8058, +0x4E52,0x576A,0x82F9,0x840D,0x5E73,0x51ED,0x74F6,0x8BC4, +0x5C4F,0x5761,0x6CFC,0x9887,0x5A46,0x7834,0x9B44,0x8FEB, +0x7C95,0x5256,0x6251,0x94FA,0x4EC6,0x8386,0x8461,0x83E9, +0x84B2,0x57D4,0x6734,0x5703,0x666E,0x6D66,0x8C31,0x66DD, +0x7011,0x671F,0x6B3A,0x6816,0x621A,0x59BB,0x4E03,0x51C4, +0x6F06,0x67D2,0x6C8F,0x5176,0x68CB,0x5947,0x6B67,0x7566, +0x5D0E,0x8110,0x9F50,0x65D7,0x7948,0x7941,0x9A91,0x8D77, +0x5C82,0x4E5E,0x4F01,0x542F,0x5951,0x780C,0x5668,0x6C14, +0x8FC4,0x5F03,0x6C7D,0x6CE3,0x8BAB,0x6390, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6070,0x6D3D,0x7275,0x6266,0x948E,0x94C5,0x5343,0x8FC1, +0x7B7E,0x4EDF,0x8C26,0x4E7E,0x9ED4,0x94B1,0x94B3,0x524D, +0x6F5C,0x9063,0x6D45,0x8C34,0x5811,0x5D4C,0x6B20,0x6B49, +0x67AA,0x545B,0x8154,0x7F8C,0x5899,0x8537,0x5F3A,0x62A2, +0x6A47,0x9539,0x6572,0x6084,0x6865,0x77A7,0x4E54,0x4FA8, +0x5DE7,0x9798,0x64AC,0x7FD8,0x5CED,0x4FCF,0x7A8D,0x5207, +0x8304,0x4E14,0x602F,0x7A83,0x94A6,0x4FB5,0x4EB2,0x79E6, +0x7434,0x52E4,0x82B9,0x64D2,0x79BD,0x5BDD,0x6C81,0x9752, +0x8F7B,0x6C22,0x503E,0x537F,0x6E05,0x64CE,0x6674,0x6C30, +0x60C5,0x9877,0x8BF7,0x5E86,0x743C,0x7A77,0x79CB,0x4E18, +0x90B1,0x7403,0x6C42,0x56DA,0x914B,0x6CC5,0x8D8B,0x533A, +0x86C6,0x66F2,0x8EAF,0x5C48,0x9A71,0x6E20, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x53D6,0x5A36,0x9F8B,0x8DA3,0x53BB,0x5708,0x98A7,0x6743, +0x919B,0x6CC9,0x5168,0x75CA,0x62F3,0x72AC,0x5238,0x529D, +0x7F3A,0x7094,0x7638,0x5374,0x9E4A,0x69B7,0x786E,0x96C0, +0x88D9,0x7FA4,0x7136,0x71C3,0x5189,0x67D3,0x74E4,0x58E4, +0x6518,0x56B7,0x8BA9,0x9976,0x6270,0x7ED5,0x60F9,0x70ED, +0x58EC,0x4EC1,0x4EBA,0x5FCD,0x97E7,0x4EFB,0x8BA4,0x5203, +0x598A,0x7EAB,0x6254,0x4ECD,0x65E5,0x620E,0x8338,0x84C9, +0x8363,0x878D,0x7194,0x6EB6,0x5BB9,0x7ED2,0x5197,0x63C9, +0x67D4,0x8089,0x8339,0x8815,0x5112,0x5B7A,0x5982,0x8FB1, +0x4E73,0x6C5D,0x5165,0x8925,0x8F6F,0x962E,0x854A,0x745E, +0x9510,0x95F0,0x6DA6,0x82E5,0x5F31,0x6492,0x6D12,0x8428, +0x816E,0x9CC3,0x585E,0x8D5B,0x4E09,0x53C1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4F1E,0x6563,0x6851,0x55D3,0x4E27,0x6414,0x9A9A,0x626B, +0x5AC2,0x745F,0x8272,0x6DA9,0x68EE,0x50E7,0x838E,0x7802, +0x6740,0x5239,0x6C99,0x7EB1,0x50BB,0x5565,0x715E,0x7B5B, +0x6652,0x73CA,0x82EB,0x6749,0x5C71,0x5220,0x717D,0x886B, +0x95EA,0x9655,0x64C5,0x8D61,0x81B3,0x5584,0x6C55,0x6247, +0x7F2E,0x5892,0x4F24,0x5546,0x8D4F,0x664C,0x4E0A,0x5C1A, +0x88F3,0x68A2,0x634E,0x7A0D,0x70E7,0x828D,0x52FA,0x97F6, +0x5C11,0x54E8,0x90B5,0x7ECD,0x5962,0x8D4A,0x86C7,0x820C, +0x820D,0x8D66,0x6444,0x5C04,0x6151,0x6D89,0x793E,0x8BBE, +0x7837,0x7533,0x547B,0x4F38,0x8EAB,0x6DF1,0x5A20,0x7EC5, +0x795E,0x6C88,0x5BA1,0x5A76,0x751A,0x80BE,0x614E,0x6E17, +0x58F0,0x751F,0x7525,0x7272,0x5347,0x7EF3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7701,0x76DB,0x5269,0x80DC,0x5723,0x5E08,0x5931,0x72EE, +0x65BD,0x6E7F,0x8BD7,0x5C38,0x8671,0x5341,0x77F3,0x62FE, +0x65F6,0x4EC0,0x98DF,0x8680,0x5B9E,0x8BC6,0x53F2,0x77E2, +0x4F7F,0x5C4E,0x9A76,0x59CB,0x5F0F,0x793A,0x58EB,0x4E16, +0x67FF,0x4E8B,0x62ED,0x8A93,0x901D,0x52BF,0x662F,0x55DC, +0x566C,0x9002,0x4ED5,0x4F8D,0x91CA,0x9970,0x6C0F,0x5E02, +0x6043,0x5BA4,0x89C6,0x8BD5,0x6536,0x624B,0x9996,0x5B88, +0x5BFF,0x6388,0x552E,0x53D7,0x7626,0x517D,0x852C,0x67A2, +0x68B3,0x6B8A,0x6292,0x8F93,0x53D4,0x8212,0x6DD1,0x758F, +0x4E66,0x8D4E,0x5B70,0x719F,0x85AF,0x6691,0x66D9,0x7F72, +0x8700,0x9ECD,0x9F20,0x5C5E,0x672F,0x8FF0,0x6811,0x675F, +0x620D,0x7AD6,0x5885,0x5EB6,0x6570,0x6F31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6055,0x5237,0x800D,0x6454,0x8870,0x7529,0x5E05,0x6813, +0x62F4,0x971C,0x53CC,0x723D,0x8C01,0x6C34,0x7761,0x7A0E, +0x542E,0x77AC,0x987A,0x821C,0x8BF4,0x7855,0x6714,0x70C1, +0x65AF,0x6495,0x5636,0x601D,0x79C1,0x53F8,0x4E1D,0x6B7B, +0x8086,0x5BFA,0x55E3,0x56DB,0x4F3A,0x4F3C,0x9972,0x5DF3, +0x677E,0x8038,0x6002,0x9882,0x9001,0x5B8B,0x8BBC,0x8BF5, +0x641C,0x8258,0x64DE,0x55FD,0x82CF,0x9165,0x4FD7,0x7D20, +0x901F,0x7C9F,0x50F3,0x5851,0x6EAF,0x5BBF,0x8BC9,0x8083, +0x9178,0x849C,0x7B97,0x867D,0x968B,0x968F,0x7EE5,0x9AD3, +0x788E,0x5C81,0x7A57,0x9042,0x96A7,0x795F,0x5B59,0x635F, +0x7B0B,0x84D1,0x68AD,0x5506,0x7F29,0x7410,0x7D22,0x9501, +0x6240,0x584C,0x4ED6,0x5B83,0x5979,0x5854, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x736D,0x631E,0x8E4B,0x8E0F,0x80CE,0x82D4,0x62AC,0x53F0, +0x6CF0,0x915E,0x592A,0x6001,0x6C70,0x574D,0x644A,0x8D2A, +0x762B,0x6EE9,0x575B,0x6A80,0x75F0,0x6F6D,0x8C2D,0x8C08, +0x5766,0x6BEF,0x8892,0x78B3,0x63A2,0x53F9,0x70AD,0x6C64, +0x5858,0x642A,0x5802,0x68E0,0x819B,0x5510,0x7CD6,0x5018, +0x8EBA,0x6DCC,0x8D9F,0x70EB,0x638F,0x6D9B,0x6ED4,0x7EE6, +0x8404,0x6843,0x9003,0x6DD8,0x9676,0x8BA8,0x5957,0x7279, +0x85E4,0x817E,0x75BC,0x8A8A,0x68AF,0x5254,0x8E22,0x9511, +0x63D0,0x9898,0x8E44,0x557C,0x4F53,0x66FF,0x568F,0x60D5, +0x6D95,0x5243,0x5C49,0x5929,0x6DFB,0x586B,0x7530,0x751C, +0x606C,0x8214,0x8146,0x6311,0x6761,0x8FE2,0x773A,0x8DF3, +0x8D34,0x94C1,0x5E16,0x5385,0x542C,0x70C3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6C40,0x5EF7,0x505C,0x4EAD,0x5EAD,0x633A,0x8247,0x901A, +0x6850,0x916E,0x77B3,0x540C,0x94DC,0x5F64,0x7AE5,0x6876, +0x6345,0x7B52,0x7EDF,0x75DB,0x5077,0x6295,0x5934,0x900F, +0x51F8,0x79C3,0x7A81,0x56FE,0x5F92,0x9014,0x6D82,0x5C60, +0x571F,0x5410,0x5154,0x6E4D,0x56E2,0x63A8,0x9893,0x817F, +0x8715,0x892A,0x9000,0x541E,0x5C6F,0x81C0,0x62D6,0x6258, +0x8131,0x9E35,0x9640,0x9A6E,0x9A7C,0x692D,0x59A5,0x62D3, +0x553E,0x6316,0x54C7,0x86D9,0x6D3C,0x5A03,0x74E6,0x889C, +0x6B6A,0x5916,0x8C4C,0x5F2F,0x6E7E,0x73A9,0x987D,0x4E38, +0x70F7,0x5B8C,0x7897,0x633D,0x665A,0x7696,0x60CB,0x5B9B, +0x5A49,0x4E07,0x8155,0x6C6A,0x738B,0x4EA1,0x6789,0x7F51, +0x5F80,0x65FA,0x671B,0x5FD8,0x5984,0x5A01, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5DCD,0x5FAE,0x5371,0x97E6,0x8FDD,0x6845,0x56F4,0x552F, +0x60DF,0x4E3A,0x6F4D,0x7EF4,0x82C7,0x840E,0x59D4,0x4F1F, +0x4F2A,0x5C3E,0x7EAC,0x672A,0x851A,0x5473,0x754F,0x80C3, +0x5582,0x9B4F,0x4F4D,0x6E2D,0x8C13,0x5C09,0x6170,0x536B, +0x761F,0x6E29,0x868A,0x6587,0x95FB,0x7EB9,0x543B,0x7A33, +0x7D0A,0x95EE,0x55E1,0x7FC1,0x74EE,0x631D,0x8717,0x6DA1, +0x7A9D,0x6211,0x65A1,0x5367,0x63E1,0x6C83,0x5DEB,0x545C, +0x94A8,0x4E4C,0x6C61,0x8BEC,0x5C4B,0x65E0,0x829C,0x68A7, +0x543E,0x5434,0x6BCB,0x6B66,0x4E94,0x6342,0x5348,0x821E, +0x4F0D,0x4FAE,0x575E,0x620A,0x96FE,0x6664,0x7269,0x52FF, +0x52A1,0x609F,0x8BEF,0x6614,0x7199,0x6790,0x897F,0x7852, +0x77FD,0x6670,0x563B,0x5438,0x9521,0x727A, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7A00,0x606F,0x5E0C,0x6089,0x819D,0x5915,0x60DC,0x7184, +0x70EF,0x6EAA,0x6C50,0x7280,0x6A84,0x88AD,0x5E2D,0x4E60, +0x5AB3,0x559C,0x94E3,0x6D17,0x7CFB,0x9699,0x620F,0x7EC6, +0x778E,0x867E,0x5323,0x971E,0x8F96,0x6687,0x5CE1,0x4FA0, +0x72ED,0x4E0B,0x53A6,0x590F,0x5413,0x6380,0x9528,0x5148, +0x4ED9,0x9C9C,0x7EA4,0x54B8,0x8D24,0x8854,0x8237,0x95F2, +0x6D8E,0x5F26,0x5ACC,0x663E,0x9669,0x73B0,0x732E,0x53BF, +0x817A,0x9985,0x7FA1,0x5BAA,0x9677,0x9650,0x7EBF,0x76F8, +0x53A2,0x9576,0x9999,0x7BB1,0x8944,0x6E58,0x4E61,0x7FD4, +0x7965,0x8BE6,0x60F3,0x54CD,0x4EAB,0x9879,0x5DF7,0x6A61, +0x50CF,0x5411,0x8C61,0x8427,0x785D,0x9704,0x524A,0x54EE, +0x56A3,0x9500,0x6D88,0x5BB5,0x6DC6,0x6653, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5C0F,0x5B5D,0x6821,0x8096,0x5578,0x7B11,0x6548,0x6954, +0x4E9B,0x6B47,0x874E,0x978B,0x534F,0x631F,0x643A,0x90AA, +0x659C,0x80C1,0x8C10,0x5199,0x68B0,0x5378,0x87F9,0x61C8, +0x6CC4,0x6CFB,0x8C22,0x5C51,0x85AA,0x82AF,0x950C,0x6B23, +0x8F9B,0x65B0,0x5FFB,0x5FC3,0x4FE1,0x8845,0x661F,0x8165, +0x7329,0x60FA,0x5174,0x5211,0x578B,0x5F62,0x90A2,0x884C, +0x9192,0x5E78,0x674F,0x6027,0x59D3,0x5144,0x51F6,0x80F8, +0x5308,0x6C79,0x96C4,0x718A,0x4F11,0x4FEE,0x7F9E,0x673D, +0x55C5,0x9508,0x79C0,0x8896,0x7EE3,0x589F,0x620C,0x9700, +0x865A,0x5618,0x987B,0x5F90,0x8BB8,0x84C4,0x9157,0x53D9, +0x65ED,0x5E8F,0x755C,0x6064,0x7D6E,0x5A7F,0x7EEA,0x7EED, +0x8F69,0x55A7,0x5BA3,0x60AC,0x65CB,0x7384, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9009,0x7663,0x7729,0x7EDA,0x9774,0x859B,0x5B66,0x7A74, +0x96EA,0x8840,0x52CB,0x718F,0x5FAA,0x65EC,0x8BE2,0x5BFB, +0x9A6F,0x5DE1,0x6B89,0x6C5B,0x8BAD,0x8BAF,0x900A,0x8FC5, +0x538B,0x62BC,0x9E26,0x9E2D,0x5440,0x4E2B,0x82BD,0x7259, +0x869C,0x5D16,0x8859,0x6DAF,0x96C5,0x54D1,0x4E9A,0x8BB6, +0x7109,0x54BD,0x9609,0x70DF,0x6DF9,0x76D0,0x4E25,0x7814, +0x8712,0x5CA9,0x5EF6,0x8A00,0x989C,0x960E,0x708E,0x6CBF, +0x5944,0x63A9,0x773C,0x884D,0x6F14,0x8273,0x5830,0x71D5, +0x538C,0x781A,0x96C1,0x5501,0x5F66,0x7130,0x5BB4,0x8C1A, +0x9A8C,0x6B83,0x592E,0x9E2F,0x79E7,0x6768,0x626C,0x4F6F, +0x75A1,0x7F8A,0x6D0B,0x9633,0x6C27,0x4EF0,0x75D2,0x517B, +0x6837,0x6F3E,0x9080,0x8170,0x5996,0x7476, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6447,0x5C27,0x9065,0x7A91,0x8C23,0x59DA,0x54AC,0x8200, +0x836F,0x8981,0x8000,0x6930,0x564E,0x8036,0x7237,0x91CE, +0x51B6,0x4E5F,0x9875,0x6396,0x4E1A,0x53F6,0x66F3,0x814B, +0x591C,0x6DB2,0x4E00,0x58F9,0x533B,0x63D6,0x94F1,0x4F9D, +0x4F0A,0x8863,0x9890,0x5937,0x9057,0x79FB,0x4EEA,0x80F0, +0x7591,0x6C82,0x5B9C,0x59E8,0x5F5D,0x6905,0x8681,0x501A, +0x5DF2,0x4E59,0x77E3,0x4EE5,0x827A,0x6291,0x6613,0x9091, +0x5C79,0x4EBF,0x5F79,0x81C6,0x9038,0x8084,0x75AB,0x4EA6, +0x88D4,0x610F,0x6BC5,0x5FC6,0x4E49,0x76CA,0x6EA2,0x8BE3, +0x8BAE,0x8C0A,0x8BD1,0x5F02,0x7FFC,0x7FCC,0x7ECE,0x8335, +0x836B,0x56E0,0x6BB7,0x97F3,0x9634,0x59FB,0x541F,0x94F6, +0x6DEB,0x5BC5,0x996E,0x5C39,0x5F15,0x9690, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5370,0x82F1,0x6A31,0x5A74,0x9E70,0x5E94,0x7F28,0x83B9, +0x8424,0x8425,0x8367,0x8747,0x8FCE,0x8D62,0x76C8,0x5F71, +0x9896,0x786C,0x6620,0x54DF,0x62E5,0x4F63,0x81C3,0x75C8, +0x5EB8,0x96CD,0x8E0A,0x86F9,0x548F,0x6CF3,0x6D8C,0x6C38, +0x607F,0x52C7,0x7528,0x5E7D,0x4F18,0x60A0,0x5FE7,0x5C24, +0x7531,0x90AE,0x94C0,0x72B9,0x6CB9,0x6E38,0x9149,0x6709, +0x53CB,0x53F3,0x4F51,0x91C9,0x8BF1,0x53C8,0x5E7C,0x8FC2, +0x6DE4,0x4E8E,0x76C2,0x6986,0x865E,0x611A,0x8206,0x4F59, +0x4FDE,0x903E,0x9C7C,0x6109,0x6E1D,0x6E14,0x9685,0x4E88, +0x5A31,0x96E8,0x4E0E,0x5C7F,0x79B9,0x5B87,0x8BED,0x7FBD, +0x7389,0x57DF,0x828B,0x90C1,0x5401,0x9047,0x55BB,0x5CEA, +0x5FA1,0x6108,0x6B32,0x72F1,0x80B2,0x8A89, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6D74,0x5BD3,0x88D5,0x9884,0x8C6B,0x9A6D,0x9E33,0x6E0A, +0x51A4,0x5143,0x57A3,0x8881,0x539F,0x63F4,0x8F95,0x56ED, +0x5458,0x5706,0x733F,0x6E90,0x7F18,0x8FDC,0x82D1,0x613F, +0x6028,0x9662,0x66F0,0x7EA6,0x8D8A,0x8DC3,0x94A5,0x5CB3, +0x7CA4,0x6708,0x60A6,0x9605,0x8018,0x4E91,0x90E7,0x5300, +0x9668,0x5141,0x8FD0,0x8574,0x915D,0x6655,0x97F5,0x5B55, +0x531D,0x7838,0x6742,0x683D,0x54C9,0x707E,0x5BB0,0x8F7D, +0x518D,0x5728,0x54B1,0x6512,0x6682,0x8D5E,0x8D43,0x810F, +0x846C,0x906D,0x7CDF,0x51FF,0x85FB,0x67A3,0x65E9,0x6FA1, +0x86A4,0x8E81,0x566A,0x9020,0x7682,0x7076,0x71E5,0x8D23, +0x62E9,0x5219,0x6CFD,0x8D3C,0x600E,0x589E,0x618E,0x66FE, +0x8D60,0x624E,0x55B3,0x6E23,0x672D,0x8F67, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x94E1,0x95F8,0x7728,0x6805,0x69A8,0x548B,0x4E4D,0x70B8, +0x8BC8,0x6458,0x658B,0x5B85,0x7A84,0x503A,0x5BE8,0x77BB, +0x6BE1,0x8A79,0x7C98,0x6CBE,0x76CF,0x65A9,0x8F97,0x5D2D, +0x5C55,0x8638,0x6808,0x5360,0x6218,0x7AD9,0x6E5B,0x7EFD, +0x6A1F,0x7AE0,0x5F70,0x6F33,0x5F20,0x638C,0x6DA8,0x6756, +0x4E08,0x5E10,0x8D26,0x4ED7,0x80C0,0x7634,0x969C,0x62DB, +0x662D,0x627E,0x6CBC,0x8D75,0x7167,0x7F69,0x5146,0x8087, +0x53EC,0x906E,0x6298,0x54F2,0x86F0,0x8F99,0x8005,0x9517, +0x8517,0x8FD9,0x6D59,0x73CD,0x659F,0x771F,0x7504,0x7827, +0x81FB,0x8D1E,0x9488,0x4FA6,0x6795,0x75B9,0x8BCA,0x9707, +0x632F,0x9547,0x9635,0x84B8,0x6323,0x7741,0x5F81,0x72F0, +0x4E89,0x6014,0x6574,0x62EF,0x6B63,0x653F, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5E27,0x75C7,0x90D1,0x8BC1,0x829D,0x679D,0x652F,0x5431, +0x8718,0x77E5,0x80A2,0x8102,0x6C41,0x4E4B,0x7EC7,0x804C, +0x76F4,0x690D,0x6B96,0x6267,0x503C,0x4F84,0x5740,0x6307, +0x6B62,0x8DBE,0x53EA,0x65E8,0x7EB8,0x5FD7,0x631A,0x63B7, +0x81F3,0x81F4,0x7F6E,0x5E1C,0x5CD9,0x5236,0x667A,0x79E9, +0x7A1A,0x8D28,0x7099,0x75D4,0x6EDE,0x6CBB,0x7A92,0x4E2D, +0x76C5,0x5FE0,0x949F,0x8877,0x7EC8,0x79CD,0x80BF,0x91CD, +0x4EF2,0x4F17,0x821F,0x5468,0x5DDE,0x6D32,0x8BCC,0x7CA5, +0x8F74,0x8098,0x5E1A,0x5492,0x76B1,0x5B99,0x663C,0x9AA4, +0x73E0,0x682A,0x86DB,0x6731,0x732A,0x8BF8,0x8BDB,0x9010, +0x7AF9,0x70DB,0x716E,0x62C4,0x77A9,0x5631,0x4E3B,0x8457, +0x67F1,0x52A9,0x86C0,0x8D2E,0x94F8,0x7B51, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4F4F,0x6CE8,0x795D,0x9A7B,0x6293,0x722A,0x62FD,0x4E13, +0x7816,0x8F6C,0x64B0,0x8D5A,0x7BC6,0x6869,0x5E84,0x88C5, +0x5986,0x649E,0x58EE,0x72B6,0x690E,0x9525,0x8FFD,0x8D58, +0x5760,0x7F00,0x8C06,0x51C6,0x6349,0x62D9,0x5353,0x684C, +0x7422,0x8301,0x914C,0x5544,0x7740,0x707C,0x6D4A,0x5179, +0x54A8,0x8D44,0x59FF,0x6ECB,0x6DC4,0x5B5C,0x7D2B,0x4ED4, +0x7C7D,0x6ED3,0x5B50,0x81EA,0x6E0D,0x5B57,0x9B03,0x68D5, +0x8E2A,0x5B97,0x7EFC,0x603B,0x7EB5,0x90B9,0x8D70,0x594F, +0x63CD,0x79DF,0x8DB3,0x5352,0x65CF,0x7956,0x8BC5,0x963B, +0x7EC4,0x94BB,0x7E82,0x5634,0x9189,0x6700,0x7F6A,0x5C0A, +0x9075,0x6628,0x5DE6,0x4F50,0x67DE,0x505A,0x4F5C,0x5750, +0x5EA7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4E8D,0x4E0C,0x5140,0x4E10,0x5EFF,0x5345,0x4E15,0x4E98, +0x4E1E,0x9B32,0x5B6C,0x5669,0x4E28,0x79BA,0x4E3F,0x5315, +0x4E47,0x592D,0x723B,0x536E,0x6C10,0x56DF,0x80E4,0x9997, +0x6BD3,0x777E,0x9F17,0x4E36,0x4E9F,0x9F10,0x4E5C,0x4E69, +0x4E93,0x8288,0x5B5B,0x556C,0x560F,0x4EC4,0x538D,0x539D, +0x53A3,0x53A5,0x53AE,0x9765,0x8D5D,0x531A,0x53F5,0x5326, +0x532E,0x533E,0x8D5C,0x5366,0x5363,0x5202,0x5208,0x520E, +0x522D,0x5233,0x523F,0x5240,0x524C,0x525E,0x5261,0x525C, +0x84AF,0x527D,0x5282,0x5281,0x5290,0x5293,0x5182,0x7F54, +0x4EBB,0x4EC3,0x4EC9,0x4EC2,0x4EE8,0x4EE1,0x4EEB,0x4EDE, +0x4F1B,0x4EF3,0x4F22,0x4F64,0x4EF5,0x4F25,0x4F27,0x4F09, +0x4F2B,0x4F5E,0x4F67,0x6538,0x4F5A,0x4F5D, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4F5F,0x4F57,0x4F32,0x4F3D,0x4F76,0x4F74,0x4F91,0x4F89, +0x4F83,0x4F8F,0x4F7E,0x4F7B,0x4FAA,0x4F7C,0x4FAC,0x4F94, +0x4FE6,0x4FE8,0x4FEA,0x4FC5,0x4FDA,0x4FE3,0x4FDC,0x4FD1, +0x4FDF,0x4FF8,0x5029,0x504C,0x4FF3,0x502C,0x500F,0x502E, +0x502D,0x4FFE,0x501C,0x500C,0x5025,0x5028,0x507E,0x5043, +0x5055,0x5048,0x504E,0x506C,0x507B,0x50A5,0x50A7,0x50A9, +0x50BA,0x50D6,0x5106,0x50ED,0x50EC,0x50E6,0x50EE,0x5107, +0x510B,0x4EDD,0x6C3D,0x4F58,0x4F65,0x4FCE,0x9FA0,0x6C46, +0x7C74,0x516E,0x5DFD,0x9EC9,0x9998,0x5181,0x5914,0x52F9, +0x530D,0x8A07,0x5310,0x51EB,0x5919,0x5155,0x4EA0,0x5156, +0x4EB3,0x886E,0x88A4,0x4EB5,0x8114,0x88D2,0x7980,0x5B34, +0x8803,0x7FB8,0x51AB,0x51B1,0x51BD,0x51BC, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x51C7,0x5196,0x51A2,0x51A5,0x8BA0,0x8BA6,0x8BA7,0x8BAA, +0x8BB4,0x8BB5,0x8BB7,0x8BC2,0x8BC3,0x8BCB,0x8BCF,0x8BCE, +0x8BD2,0x8BD3,0x8BD4,0x8BD6,0x8BD8,0x8BD9,0x8BDC,0x8BDF, +0x8BE0,0x8BE4,0x8BE8,0x8BE9,0x8BEE,0x8BF0,0x8BF3,0x8BF6, +0x8BF9,0x8BFC,0x8BFF,0x8C00,0x8C02,0x8C04,0x8C07,0x8C0C, +0x8C0F,0x8C11,0x8C12,0x8C14,0x8C15,0x8C16,0x8C19,0x8C1B, +0x8C18,0x8C1D,0x8C1F,0x8C20,0x8C21,0x8C25,0x8C27,0x8C2A, +0x8C2B,0x8C2E,0x8C2F,0x8C32,0x8C33,0x8C35,0x8C36,0x5369, +0x537A,0x961D,0x9622,0x9621,0x9631,0x962A,0x963D,0x963C, +0x9642,0x9649,0x9654,0x965F,0x9667,0x966C,0x9672,0x9674, +0x9688,0x968D,0x9697,0x96B0,0x9097,0x909B,0x909D,0x9099, +0x90AC,0x90A1,0x90B4,0x90B3,0x90B6,0x90BA, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x90B8,0x90B0,0x90CF,0x90C5,0x90BE,0x90D0,0x90C4,0x90C7, +0x90D3,0x90E6,0x90E2,0x90DC,0x90D7,0x90DB,0x90EB,0x90EF, +0x90FE,0x9104,0x9122,0x911E,0x9123,0x9131,0x912F,0x9139, +0x9143,0x9146,0x520D,0x5942,0x52A2,0x52AC,0x52AD,0x52BE, +0x54FF,0x52D0,0x52D6,0x52F0,0x53DF,0x71EE,0x77CD,0x5EF4, +0x51F5,0x51FC,0x9B2F,0x53B6,0x5F01,0x755A,0x5DEF,0x574C, +0x57A9,0x57A1,0x587E,0x58BC,0x58C5,0x58D1,0x5729,0x572C, +0x572A,0x5733,0x5739,0x572E,0x572F,0x575C,0x573B,0x5742, +0x5769,0x5785,0x576B,0x5786,0x577C,0x577B,0x5768,0x576D, +0x5776,0x5773,0x57AD,0x57A4,0x578C,0x57B2,0x57CF,0x57A7, +0x57B4,0x5793,0x57A0,0x57D5,0x57D8,0x57DA,0x57D9,0x57D2, +0x57B8,0x57F4,0x57EF,0x57F8,0x57E4,0x57DD, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x580B,0x580D,0x57FD,0x57ED,0x5800,0x581E,0x5819,0x5844, +0x5820,0x5865,0x586C,0x5881,0x5889,0x589A,0x5880,0x99A8, +0x9F19,0x61FF,0x8279,0x827D,0x827F,0x828F,0x828A,0x82A8, +0x8284,0x828E,0x8291,0x8297,0x8299,0x82AB,0x82B8,0x82BE, +0x82B0,0x82C8,0x82CA,0x82E3,0x8298,0x82B7,0x82AE,0x82CB, +0x82CC,0x82C1,0x82A9,0x82B4,0x82A1,0x82AA,0x829F,0x82C4, +0x82CE,0x82A4,0x82E1,0x8309,0x82F7,0x82E4,0x830F,0x8307, +0x82DC,0x82F4,0x82D2,0x82D8,0x830C,0x82FB,0x82D3,0x8311, +0x831A,0x8306,0x8314,0x8315,0x82E0,0x82D5,0x831C,0x8351, +0x835B,0x835C,0x8308,0x8392,0x833C,0x8334,0x8331,0x839B, +0x835E,0x832F,0x834F,0x8347,0x8343,0x835F,0x8340,0x8317, +0x8360,0x832D,0x833A,0x8333,0x8366,0x8365, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8368,0x831B,0x8369,0x836C,0x836A,0x836D,0x836E,0x83B0, +0x8378,0x83B3,0x83B4,0x83A0,0x83AA,0x8393,0x839C,0x8385, +0x837C,0x83B6,0x83A9,0x837D,0x83B8,0x837B,0x8398,0x839E, +0x83A8,0x83BA,0x83BC,0x83C1,0x8401,0x83E5,0x83D8,0x5807, +0x8418,0x840B,0x83DD,0x83FD,0x83D6,0x841C,0x8438,0x8411, +0x8406,0x83D4,0x83DF,0x840F,0x8403,0x83F8,0x83F9,0x83EA, +0x83C5,0x83C0,0x8426,0x83F0,0x83E1,0x845C,0x8451,0x845A, +0x8459,0x8473,0x8487,0x8488,0x847A,0x8489,0x8478,0x843C, +0x8446,0x8469,0x8476,0x848C,0x848E,0x8431,0x846D,0x84C1, +0x84CD,0x84D0,0x84E6,0x84BD,0x84D3,0x84CA,0x84BF,0x84BA, +0x84E0,0x84A1,0x84B9,0x84B4,0x8497,0x84E5,0x84E3,0x850C, +0x750D,0x8538,0x84F0,0x8539,0x851F,0x853A, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8556,0x853B,0x84FF,0x84FC,0x8559,0x8548,0x8568,0x8564, +0x855E,0x857A,0x77A2,0x8543,0x8572,0x857B,0x85A4,0x85A8, +0x8587,0x858F,0x8579,0x85AE,0x859C,0x8585,0x85B9,0x85B7, +0x85B0,0x85D3,0x85C1,0x85DC,0x85FF,0x8627,0x8605,0x8629, +0x8616,0x863C,0x5EFE,0x5F08,0x593C,0x5941,0x8037,0x5955, +0x595A,0x5958,0x530F,0x5C22,0x5C25,0x5C2C,0x5C34,0x624C, +0x626A,0x629F,0x62BB,0x62CA,0x62DA,0x62D7,0x62EE,0x6322, +0x62F6,0x6339,0x634B,0x6343,0x63AD,0x63F6,0x6371,0x637A, +0x638E,0x63B4,0x636D,0x63AC,0x638A,0x6369,0x63AE,0x63BC, +0x63F2,0x63F8,0x63E0,0x63FF,0x63C4,0x63DE,0x63CE,0x6452, +0x63C6,0x63BE,0x6445,0x6441,0x640B,0x641B,0x6420,0x640C, +0x6426,0x6421,0x645E,0x6484,0x646D,0x6496, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x647A,0x64B7,0x64B8,0x6499,0x64BA,0x64C0,0x64D0,0x64D7, +0x64E4,0x64E2,0x6509,0x6525,0x652E,0x5F0B,0x5FD2,0x7519, +0x5F11,0x535F,0x53F1,0x53FD,0x53E9,0x53E8,0x53FB,0x5412, +0x5416,0x5406,0x544B,0x5452,0x5453,0x5454,0x5456,0x5443, +0x5421,0x5457,0x5459,0x5423,0x5432,0x5482,0x5494,0x5477, +0x5471,0x5464,0x549A,0x549B,0x5484,0x5476,0x5466,0x549D, +0x54D0,0x54AD,0x54C2,0x54B4,0x54D2,0x54A7,0x54A6,0x54D3, +0x54D4,0x5472,0x54A3,0x54D5,0x54BB,0x54BF,0x54CC,0x54D9, +0x54DA,0x54DC,0x54A9,0x54AA,0x54A4,0x54DD,0x54CF,0x54DE, +0x551B,0x54E7,0x5520,0x54FD,0x5514,0x54F3,0x5522,0x5523, +0x550F,0x5511,0x5527,0x552A,0x5567,0x558F,0x55B5,0x5549, +0x556D,0x5541,0x5555,0x553F,0x5550,0x553C, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5537,0x5556,0x5575,0x5576,0x5577,0x5533,0x5530,0x555C, +0x558B,0x55D2,0x5583,0x55B1,0x55B9,0x5588,0x5581,0x559F, +0x557E,0x55D6,0x5591,0x557B,0x55DF,0x55BD,0x55BE,0x5594, +0x5599,0x55EA,0x55F7,0x55C9,0x561F,0x55D1,0x55EB,0x55EC, +0x55D4,0x55E6,0x55DD,0x55C4,0x55EF,0x55E5,0x55F2,0x55F3, +0x55CC,0x55CD,0x55E8,0x55F5,0x55E4,0x8F94,0x561E,0x5608, +0x560C,0x5601,0x5624,0x5623,0x55FE,0x5600,0x5627,0x562D, +0x5658,0x5639,0x5657,0x562C,0x564D,0x5662,0x5659,0x565C, +0x564C,0x5654,0x5686,0x5664,0x5671,0x566B,0x567B,0x567C, +0x5685,0x5693,0x56AF,0x56D4,0x56D7,0x56DD,0x56E1,0x56F5, +0x56EB,0x56F9,0x56FF,0x5704,0x570A,0x5709,0x571C,0x5E0F, +0x5E19,0x5E14,0x5E11,0x5E31,0x5E3B,0x5E3C, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5E37,0x5E44,0x5E54,0x5E5B,0x5E5E,0x5E61,0x5C8C,0x5C7A, +0x5C8D,0x5C90,0x5C96,0x5C88,0x5C98,0x5C99,0x5C91,0x5C9A, +0x5C9C,0x5CB5,0x5CA2,0x5CBD,0x5CAC,0x5CAB,0x5CB1,0x5CA3, +0x5CC1,0x5CB7,0x5CC4,0x5CD2,0x5CE4,0x5CCB,0x5CE5,0x5D02, +0x5D03,0x5D27,0x5D26,0x5D2E,0x5D24,0x5D1E,0x5D06,0x5D1B, +0x5D58,0x5D3E,0x5D34,0x5D3D,0x5D6C,0x5D5B,0x5D6F,0x5D5D, +0x5D6B,0x5D4B,0x5D4A,0x5D69,0x5D74,0x5D82,0x5D99,0x5D9D, +0x8C73,0x5DB7,0x5DC5,0x5F73,0x5F77,0x5F82,0x5F87,0x5F89, +0x5F8C,0x5F95,0x5F99,0x5F9C,0x5FA8,0x5FAD,0x5FB5,0x5FBC, +0x8862,0x5F61,0x72AD,0x72B0,0x72B4,0x72B7,0x72B8,0x72C3, +0x72C1,0x72CE,0x72CD,0x72D2,0x72E8,0x72EF,0x72E9,0x72F2, +0x72F4,0x72F7,0x7301,0x72F3,0x7303,0x72FA, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x72FB,0x7317,0x7313,0x7321,0x730A,0x731E,0x731D,0x7315, +0x7322,0x7339,0x7325,0x732C,0x7338,0x7331,0x7350,0x734D, +0x7357,0x7360,0x736C,0x736F,0x737E,0x821B,0x5925,0x98E7, +0x5924,0x5902,0x9963,0x9967,0x9968,0x9969,0x996A,0x996B, +0x996C,0x9974,0x9977,0x997D,0x9980,0x9984,0x9987,0x998A, +0x998D,0x9990,0x9991,0x9993,0x9994,0x9995,0x5E80,0x5E91, +0x5E8B,0x5E96,0x5EA5,0x5EA0,0x5EB9,0x5EB5,0x5EBE,0x5EB3, +0x8D53,0x5ED2,0x5ED1,0x5EDB,0x5EE8,0x5EEA,0x81BA,0x5FC4, +0x5FC9,0x5FD6,0x5FCF,0x6003,0x5FEE,0x6004,0x5FE1,0x5FE4, +0x5FFE,0x6005,0x6006,0x5FEA,0x5FED,0x5FF8,0x6019,0x6035, +0x6026,0x601B,0x600F,0x600D,0x6029,0x602B,0x600A,0x603F, +0x6021,0x6078,0x6079,0x607B,0x607A,0x6042, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x606A,0x607D,0x6096,0x609A,0x60AD,0x609D,0x6083,0x6092, +0x608C,0x609B,0x60EC,0x60BB,0x60B1,0x60DD,0x60D8,0x60C6, +0x60DA,0x60B4,0x6120,0x6126,0x6115,0x6123,0x60F4,0x6100, +0x610E,0x612B,0x614A,0x6175,0x61AC,0x6194,0x61A7,0x61B7, +0x61D4,0x61F5,0x5FDD,0x96B3,0x95E9,0x95EB,0x95F1,0x95F3, +0x95F5,0x95F6,0x95FC,0x95FE,0x9603,0x9604,0x9606,0x9608, +0x960A,0x960B,0x960C,0x960D,0x960F,0x9612,0x9615,0x9616, +0x9617,0x9619,0x961A,0x4E2C,0x723F,0x6215,0x6C35,0x6C54, +0x6C5C,0x6C4A,0x6CA3,0x6C85,0x6C90,0x6C94,0x6C8C,0x6C68, +0x6C69,0x6C74,0x6C76,0x6C86,0x6CA9,0x6CD0,0x6CD4,0x6CAD, +0x6CF7,0x6CF8,0x6CF1,0x6CD7,0x6CB2,0x6CE0,0x6CD6,0x6CFA, +0x6CEB,0x6CEE,0x6CB1,0x6CD3,0x6CEF,0x6CFE, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6D39,0x6D27,0x6D0C,0x6D43,0x6D48,0x6D07,0x6D04,0x6D19, +0x6D0E,0x6D2B,0x6D4D,0x6D2E,0x6D35,0x6D1A,0x6D4F,0x6D52, +0x6D54,0x6D33,0x6D91,0x6D6F,0x6D9E,0x6DA0,0x6D5E,0x6D93, +0x6D94,0x6D5C,0x6D60,0x6D7C,0x6D63,0x6E1A,0x6DC7,0x6DC5, +0x6DDE,0x6E0E,0x6DBF,0x6DE0,0x6E11,0x6DE6,0x6DDD,0x6DD9, +0x6E16,0x6DAB,0x6E0C,0x6DAE,0x6E2B,0x6E6E,0x6E4E,0x6E6B, +0x6EB2,0x6E5F,0x6E86,0x6E53,0x6E54,0x6E32,0x6E25,0x6E44, +0x6EDF,0x6EB1,0x6E98,0x6EE0,0x6F2D,0x6EE2,0x6EA5,0x6EA7, +0x6EBD,0x6EBB,0x6EB7,0x6ED7,0x6EB4,0x6ECF,0x6E8F,0x6EC2, +0x6E9F,0x6F62,0x6F46,0x6F47,0x6F24,0x6F15,0x6EF9,0x6F2F, +0x6F36,0x6F4B,0x6F74,0x6F2A,0x6F09,0x6F29,0x6F89,0x6F8D, +0x6F8C,0x6F78,0x6F72,0x6F7C,0x6F7A,0x6FD1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6FC9,0x6FA7,0x6FB9,0x6FB6,0x6FC2,0x6FE1,0x6FEE,0x6FDE, +0x6FE0,0x6FEF,0x701A,0x7023,0x701B,0x7039,0x7035,0x704F, +0x705E,0x5B80,0x5B84,0x5B95,0x5B93,0x5BA5,0x5BB8,0x752F, +0x9A9E,0x6434,0x5BE4,0x5BEE,0x8930,0x5BF0,0x8E47,0x8B07, +0x8FB6,0x8FD3,0x8FD5,0x8FE5,0x8FEE,0x8FE4,0x8FE9,0x8FE6, +0x8FF3,0x8FE8,0x9005,0x9004,0x900B,0x9026,0x9011,0x900D, +0x9016,0x9021,0x9035,0x9036,0x902D,0x902F,0x9044,0x9051, +0x9052,0x9050,0x9068,0x9058,0x9062,0x905B,0x66B9,0x9074, +0x907D,0x9082,0x9088,0x9083,0x908B,0x5F50,0x5F57,0x5F56, +0x5F58,0x5C3B,0x54AB,0x5C50,0x5C59,0x5B71,0x5C63,0x5C66, +0x7FBC,0x5F2A,0x5F29,0x5F2D,0x8274,0x5F3C,0x9B3B,0x5C6E, +0x5981,0x5983,0x598D,0x59A9,0x59AA,0x59A3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5997,0x59CA,0x59AB,0x599E,0x59A4,0x59D2,0x59B2,0x59AF, +0x59D7,0x59BE,0x5A05,0x5A06,0x59DD,0x5A08,0x59E3,0x59D8, +0x59F9,0x5A0C,0x5A09,0x5A32,0x5A34,0x5A11,0x5A23,0x5A13, +0x5A40,0x5A67,0x5A4A,0x5A55,0x5A3C,0x5A62,0x5A75,0x80EC, +0x5AAA,0x5A9B,0x5A77,0x5A7A,0x5ABE,0x5AEB,0x5AB2,0x5AD2, +0x5AD4,0x5AB8,0x5AE0,0x5AE3,0x5AF1,0x5AD6,0x5AE6,0x5AD8, +0x5ADC,0x5B09,0x5B17,0x5B16,0x5B32,0x5B37,0x5B40,0x5C15, +0x5C1C,0x5B5A,0x5B65,0x5B73,0x5B51,0x5B53,0x5B62,0x9A75, +0x9A77,0x9A78,0x9A7A,0x9A7F,0x9A7D,0x9A80,0x9A81,0x9A85, +0x9A88,0x9A8A,0x9A90,0x9A92,0x9A93,0x9A96,0x9A98,0x9A9B, +0x9A9C,0x9A9D,0x9A9F,0x9AA0,0x9AA2,0x9AA3,0x9AA5,0x9AA7, +0x7E9F,0x7EA1,0x7EA3,0x7EA5,0x7EA8,0x7EA9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7EAD,0x7EB0,0x7EBE,0x7EC0,0x7EC1,0x7EC2,0x7EC9,0x7ECB, +0x7ECC,0x7ED0,0x7ED4,0x7ED7,0x7EDB,0x7EE0,0x7EE1,0x7EE8, +0x7EEB,0x7EEE,0x7EEF,0x7EF1,0x7EF2,0x7F0D,0x7EF6,0x7EFA, +0x7EFB,0x7EFE,0x7F01,0x7F02,0x7F03,0x7F07,0x7F08,0x7F0B, +0x7F0C,0x7F0F,0x7F11,0x7F12,0x7F17,0x7F19,0x7F1C,0x7F1B, +0x7F1F,0x7F21,0x7F22,0x7F23,0x7F24,0x7F25,0x7F26,0x7F27, +0x7F2A,0x7F2B,0x7F2C,0x7F2D,0x7F2F,0x7F30,0x7F31,0x7F32, +0x7F33,0x7F35,0x5E7A,0x757F,0x5DDB,0x753E,0x9095,0x738E, +0x7391,0x73AE,0x73A2,0x739F,0x73CF,0x73C2,0x73D1,0x73B7, +0x73B3,0x73C0,0x73C9,0x73C8,0x73E5,0x73D9,0x987C,0x740A, +0x73E9,0x73E7,0x73DE,0x73BA,0x73F2,0x740F,0x742A,0x745B, +0x7426,0x7425,0x7428,0x7430,0x742E,0x742C, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x741B,0x741A,0x7441,0x745C,0x7457,0x7455,0x7459,0x7477, +0x746D,0x747E,0x749C,0x748E,0x7480,0x7481,0x7487,0x748B, +0x749E,0x74A8,0x74A9,0x7490,0x74A7,0x74D2,0x74BA,0x97EA, +0x97EB,0x97EC,0x674C,0x6753,0x675E,0x6748,0x6769,0x67A5, +0x6787,0x676A,0x6773,0x6798,0x67A7,0x6775,0x67A8,0x679E, +0x67AD,0x678B,0x6777,0x677C,0x67F0,0x6809,0x67D8,0x680A, +0x67E9,0x67B0,0x680C,0x67D9,0x67B5,0x67DA,0x67B3,0x67DD, +0x6800,0x67C3,0x67B8,0x67E2,0x680E,0x67C1,0x67FD,0x6832, +0x6833,0x6860,0x6861,0x684E,0x6862,0x6844,0x6864,0x6883, +0x681D,0x6855,0x6866,0x6841,0x6867,0x6840,0x683E,0x684A, +0x6849,0x6829,0x68B5,0x688F,0x6874,0x6877,0x6893,0x686B, +0x68C2,0x696E,0x68FC,0x691F,0x6920,0x68F9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6924,0x68F0,0x690B,0x6901,0x6957,0x68E3,0x6910,0x6971, +0x6939,0x6960,0x6942,0x695D,0x6984,0x696B,0x6980,0x6998, +0x6978,0x6934,0x69CC,0x6987,0x6988,0x69CE,0x6989,0x6966, +0x6963,0x6979,0x699B,0x69A7,0x69BB,0x69AB,0x69AD,0x69D4, +0x69B1,0x69C1,0x69CA,0x69DF,0x6995,0x69E0,0x698D,0x69FF, +0x6A2F,0x69ED,0x6A17,0x6A18,0x6A65,0x69F2,0x6A44,0x6A3E, +0x6AA0,0x6A50,0x6A5B,0x6A35,0x6A8E,0x6A79,0x6A3D,0x6A28, +0x6A58,0x6A7C,0x6A91,0x6A90,0x6AA9,0x6A97,0x6AAB,0x7337, +0x7352,0x6B81,0x6B82,0x6B87,0x6B84,0x6B92,0x6B93,0x6B8D, +0x6B9A,0x6B9B,0x6BA1,0x6BAA,0x8F6B,0x8F6D,0x8F71,0x8F72, +0x8F73,0x8F75,0x8F76,0x8F78,0x8F77,0x8F79,0x8F7A,0x8F7C, +0x8F7E,0x8F81,0x8F82,0x8F84,0x8F87,0x8F8B, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8F8D,0x8F8E,0x8F8F,0x8F98,0x8F9A,0x8ECE,0x620B,0x6217, +0x621B,0x621F,0x6222,0x6221,0x6225,0x6224,0x622C,0x81E7, +0x74EF,0x74F4,0x74FF,0x750F,0x7511,0x7513,0x6534,0x65EE, +0x65EF,0x65F0,0x660A,0x6619,0x6772,0x6603,0x6615,0x6600, +0x7085,0x66F7,0x661D,0x6634,0x6631,0x6636,0x6635,0x8006, +0x665F,0x6654,0x6641,0x664F,0x6656,0x6661,0x6657,0x6677, +0x6684,0x668C,0x66A7,0x669D,0x66BE,0x66DB,0x66DC,0x66E6, +0x66E9,0x8D32,0x8D33,0x8D36,0x8D3B,0x8D3D,0x8D40,0x8D45, +0x8D46,0x8D48,0x8D49,0x8D47,0x8D4D,0x8D55,0x8D59,0x89C7, +0x89CA,0x89CB,0x89CC,0x89CE,0x89CF,0x89D0,0x89D1,0x726E, +0x729F,0x725D,0x7266,0x726F,0x727E,0x727F,0x7284,0x728B, +0x728D,0x728F,0x7292,0x6308,0x6332,0x63B0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x643F,0x64D8,0x8004,0x6BEA,0x6BF3,0x6BFD,0x6BF5,0x6BF9, +0x6C05,0x6C07,0x6C06,0x6C0D,0x6C15,0x6C18,0x6C19,0x6C1A, +0x6C21,0x6C29,0x6C24,0x6C2A,0x6C32,0x6535,0x6555,0x656B, +0x724D,0x7252,0x7256,0x7230,0x8662,0x5216,0x809F,0x809C, +0x8093,0x80BC,0x670A,0x80BD,0x80B1,0x80AB,0x80AD,0x80B4, +0x80B7,0x80E7,0x80E8,0x80E9,0x80EA,0x80DB,0x80C2,0x80C4, +0x80D9,0x80CD,0x80D7,0x6710,0x80DD,0x80EB,0x80F1,0x80F4, +0x80ED,0x810D,0x810E,0x80F2,0x80FC,0x6715,0x8112,0x8C5A, +0x8136,0x811E,0x812C,0x8118,0x8132,0x8148,0x814C,0x8153, +0x8174,0x8159,0x815A,0x8171,0x8160,0x8169,0x817C,0x817D, +0x816D,0x8167,0x584D,0x5AB5,0x8188,0x8182,0x8191,0x6ED5, +0x81A3,0x81AA,0x81CC,0x6726,0x81CA,0x81BB, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x81C1,0x81A6,0x6B24,0x6B37,0x6B39,0x6B43,0x6B46,0x6B59, +0x98D1,0x98D2,0x98D3,0x98D5,0x98D9,0x98DA,0x6BB3,0x5F40, +0x6BC2,0x89F3,0x6590,0x9F51,0x6593,0x65BC,0x65C6,0x65C4, +0x65C3,0x65CC,0x65CE,0x65D2,0x65D6,0x7080,0x709C,0x7096, +0x709D,0x70BB,0x70C0,0x70B7,0x70AB,0x70B1,0x70E8,0x70CA, +0x7110,0x7113,0x7116,0x712F,0x7131,0x7173,0x715C,0x7168, +0x7145,0x7172,0x714A,0x7178,0x717A,0x7198,0x71B3,0x71B5, +0x71A8,0x71A0,0x71E0,0x71D4,0x71E7,0x71F9,0x721D,0x7228, +0x706C,0x7118,0x7166,0x71B9,0x623E,0x623D,0x6243,0x6248, +0x6249,0x793B,0x7940,0x7946,0x7949,0x795B,0x795C,0x7953, +0x795A,0x7962,0x7957,0x7960,0x796F,0x7967,0x797A,0x7985, +0x798A,0x799A,0x79A7,0x79B3,0x5FD1,0x5FD0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x603C,0x605D,0x605A,0x6067,0x6041,0x6059,0x6063,0x60AB, +0x6106,0x610D,0x615D,0x61A9,0x619D,0x61CB,0x61D1,0x6206, +0x8080,0x807F,0x6C93,0x6CF6,0x6DFC,0x77F6,0x77F8,0x7800, +0x7809,0x7817,0x7818,0x7811,0x65AB,0x782D,0x781C,0x781D, +0x7839,0x783A,0x783B,0x781F,0x783C,0x7825,0x782C,0x7823, +0x7829,0x784E,0x786D,0x7856,0x7857,0x7826,0x7850,0x7847, +0x784C,0x786A,0x789B,0x7893,0x789A,0x7887,0x789C,0x78A1, +0x78A3,0x78B2,0x78B9,0x78A5,0x78D4,0x78D9,0x78C9,0x78EC, +0x78F2,0x7905,0x78F4,0x7913,0x7924,0x791E,0x7934,0x9F9B, +0x9EF9,0x9EFB,0x9EFC,0x76F1,0x7704,0x770D,0x76F9,0x7707, +0x7708,0x771A,0x7722,0x7719,0x772D,0x7726,0x7735,0x7738, +0x7750,0x7751,0x7747,0x7743,0x775A,0x7768, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7762,0x7765,0x777F,0x778D,0x777D,0x7780,0x778C,0x7791, +0x779F,0x77A0,0x77B0,0x77B5,0x77BD,0x753A,0x7540,0x754E, +0x754B,0x7548,0x755B,0x7572,0x7579,0x7583,0x7F58,0x7F61, +0x7F5F,0x8A48,0x7F68,0x7F74,0x7F71,0x7F79,0x7F81,0x7F7E, +0x76CD,0x76E5,0x8832,0x9485,0x9486,0x9487,0x948B,0x948A, +0x948C,0x948D,0x948F,0x9490,0x9494,0x9497,0x9495,0x949A, +0x949B,0x949C,0x94A3,0x94A4,0x94AB,0x94AA,0x94AD,0x94AC, +0x94AF,0x94B0,0x94B2,0x94B4,0x94B6,0x94B7,0x94B8,0x94B9, +0x94BA,0x94BC,0x94BD,0x94BF,0x94C4,0x94C8,0x94C9,0x94CA, +0x94CB,0x94CC,0x94CD,0x94CE,0x94D0,0x94D1,0x94D2,0x94D5, +0x94D6,0x94D7,0x94D9,0x94D8,0x94DB,0x94DE,0x94DF,0x94E0, +0x94E2,0x94E4,0x94E5,0x94E7,0x94E8,0x94EA, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x94E9,0x94EB,0x94EE,0x94EF,0x94F3,0x94F4,0x94F5,0x94F7, +0x94F9,0x94FC,0x94FD,0x94FF,0x9503,0x9502,0x9506,0x9507, +0x9509,0x950A,0x950D,0x950E,0x950F,0x9512,0x9513,0x9514, +0x9515,0x9516,0x9518,0x951B,0x951D,0x951E,0x951F,0x9522, +0x952A,0x952B,0x9529,0x952C,0x9531,0x9532,0x9534,0x9536, +0x9537,0x9538,0x953C,0x953E,0x953F,0x9542,0x9535,0x9544, +0x9545,0x9546,0x9549,0x954C,0x954E,0x954F,0x9552,0x9553, +0x9554,0x9556,0x9557,0x9558,0x9559,0x955B,0x955E,0x955F, +0x955D,0x9561,0x9562,0x9564,0x9565,0x9566,0x9567,0x9568, +0x9569,0x956A,0x956B,0x956C,0x956F,0x9571,0x9572,0x9573, +0x953A,0x77E7,0x77EC,0x96C9,0x79D5,0x79ED,0x79E3,0x79EB, +0x7A06,0x5D47,0x7A03,0x7A02,0x7A1E,0x7A14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7A39,0x7A37,0x7A51,0x9ECF,0x99A5,0x7A70,0x7688,0x768E, +0x7693,0x7699,0x76A4,0x74DE,0x74E0,0x752C,0x9E20,0x9E22, +0x9E28,0x9E29,0x9E2A,0x9E2B,0x9E2C,0x9E32,0x9E31,0x9E36, +0x9E38,0x9E37,0x9E39,0x9E3A,0x9E3E,0x9E41,0x9E42,0x9E44, +0x9E46,0x9E47,0x9E48,0x9E49,0x9E4B,0x9E4C,0x9E4E,0x9E51, +0x9E55,0x9E57,0x9E5A,0x9E5B,0x9E5C,0x9E5E,0x9E63,0x9E66, +0x9E67,0x9E68,0x9E69,0x9E6A,0x9E6B,0x9E6C,0x9E71,0x9E6D, +0x9E73,0x7592,0x7594,0x7596,0x75A0,0x759D,0x75AC,0x75A3, +0x75B3,0x75B4,0x75B8,0x75C4,0x75B1,0x75B0,0x75C3,0x75C2, +0x75D6,0x75CD,0x75E3,0x75E8,0x75E6,0x75E4,0x75EB,0x75E7, +0x7603,0x75F1,0x75FC,0x75FF,0x7610,0x7600,0x7605,0x760C, +0x7617,0x760A,0x7625,0x7618,0x7615,0x7619, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x761B,0x763C,0x7622,0x7620,0x7640,0x762D,0x7630,0x763F, +0x7635,0x7643,0x763E,0x7633,0x764D,0x765E,0x7654,0x765C, +0x7656,0x766B,0x766F,0x7FCA,0x7AE6,0x7A78,0x7A79,0x7A80, +0x7A86,0x7A88,0x7A95,0x7AA6,0x7AA0,0x7AAC,0x7AA8,0x7AAD, +0x7AB3,0x8864,0x8869,0x8872,0x887D,0x887F,0x8882,0x88A2, +0x88C6,0x88B7,0x88BC,0x88C9,0x88E2,0x88CE,0x88E3,0x88E5, +0x88F1,0x891A,0x88FC,0x88E8,0x88FE,0x88F0,0x8921,0x8919, +0x8913,0x891B,0x890A,0x8934,0x892B,0x8936,0x8941,0x8966, +0x897B,0x758B,0x80E5,0x76B2,0x76B4,0x77DC,0x8012,0x8014, +0x8016,0x801C,0x8020,0x8022,0x8025,0x8026,0x8027,0x8029, +0x8028,0x8031,0x800B,0x8035,0x8043,0x8046,0x804D,0x8052, +0x8069,0x8071,0x8983,0x9878,0x9880,0x9883, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9889,0x988C,0x988D,0x988F,0x9894,0x989A,0x989B,0x989E, +0x989F,0x98A1,0x98A2,0x98A5,0x98A6,0x864D,0x8654,0x866C, +0x866E,0x867F,0x867A,0x867C,0x867B,0x86A8,0x868D,0x868B, +0x86AC,0x869D,0x86A7,0x86A3,0x86AA,0x8693,0x86A9,0x86B6, +0x86C4,0x86B5,0x86CE,0x86B0,0x86BA,0x86B1,0x86AF,0x86C9, +0x86CF,0x86B4,0x86E9,0x86F1,0x86F2,0x86ED,0x86F3,0x86D0, +0x8713,0x86DE,0x86F4,0x86DF,0x86D8,0x86D1,0x8703,0x8707, +0x86F8,0x8708,0x870A,0x870D,0x8709,0x8723,0x873B,0x871E, +0x8725,0x872E,0x871A,0x873E,0x8748,0x8734,0x8731,0x8729, +0x8737,0x873F,0x8782,0x8722,0x877D,0x877E,0x877B,0x8760, +0x8770,0x874C,0x876E,0x878B,0x8753,0x8763,0x877C,0x8764, +0x8759,0x8765,0x8793,0x87AF,0x87A8,0x87D2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x87C6,0x8788,0x8785,0x87AD,0x8797,0x8783,0x87AB,0x87E5, +0x87AC,0x87B5,0x87B3,0x87CB,0x87D3,0x87BD,0x87D1,0x87C0, +0x87CA,0x87DB,0x87EA,0x87E0,0x87EE,0x8816,0x8813,0x87FE, +0x880A,0x881B,0x8821,0x8839,0x883C,0x7F36,0x7F42,0x7F44, +0x7F45,0x8210,0x7AFA,0x7AFD,0x7B08,0x7B03,0x7B04,0x7B15, +0x7B0A,0x7B2B,0x7B0F,0x7B47,0x7B38,0x7B2A,0x7B19,0x7B2E, +0x7B31,0x7B20,0x7B25,0x7B24,0x7B33,0x7B3E,0x7B1E,0x7B58, +0x7B5A,0x7B45,0x7B75,0x7B4C,0x7B5D,0x7B60,0x7B6E,0x7B7B, +0x7B62,0x7B72,0x7B71,0x7B90,0x7BA6,0x7BA7,0x7BB8,0x7BAC, +0x7B9D,0x7BA8,0x7B85,0x7BAA,0x7B9C,0x7BA2,0x7BAB,0x7BB4, +0x7BD1,0x7BC1,0x7BCC,0x7BDD,0x7BDA,0x7BE5,0x7BE6,0x7BEA, +0x7C0C,0x7BFE,0x7BFC,0x7C0F,0x7C16,0x7C0B, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7C1F,0x7C2A,0x7C26,0x7C38,0x7C41,0x7C40,0x81FE,0x8201, +0x8202,0x8204,0x81EC,0x8844,0x8221,0x8222,0x8223,0x822D, +0x822F,0x8228,0x822B,0x8238,0x823B,0x8233,0x8234,0x823E, +0x8244,0x8249,0x824B,0x824F,0x825A,0x825F,0x8268,0x887E, +0x8885,0x8888,0x88D8,0x88DF,0x895E,0x7F9D,0x7F9F,0x7FA7, +0x7FAF,0x7FB0,0x7FB2,0x7C7C,0x6549,0x7C91,0x7C9D,0x7C9C, +0x7C9E,0x7CA2,0x7CB2,0x7CBC,0x7CBD,0x7CC1,0x7CC7,0x7CCC, +0x7CCD,0x7CC8,0x7CC5,0x7CD7,0x7CE8,0x826E,0x66A8,0x7FBF, +0x7FCE,0x7FD5,0x7FE5,0x7FE1,0x7FE6,0x7FE9,0x7FEE,0x7FF3, +0x7CF8,0x7D77,0x7DA6,0x7DAE,0x7E47,0x7E9B,0x9EB8,0x9EB4, +0x8D73,0x8D84,0x8D94,0x8D91,0x8DB1,0x8D67,0x8D6D,0x8C47, +0x8C49,0x914A,0x9150,0x914E,0x914F,0x9164, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9162,0x9161,0x9170,0x9169,0x916F,0x917D,0x917E,0x9172, +0x9174,0x9179,0x918C,0x9185,0x9190,0x918D,0x9191,0x91A2, +0x91A3,0x91AA,0x91AD,0x91AE,0x91AF,0x91B5,0x91B4,0x91BA, +0x8C55,0x9E7E,0x8DB8,0x8DEB,0x8E05,0x8E59,0x8E69,0x8DB5, +0x8DBF,0x8DBC,0x8DBA,0x8DC4,0x8DD6,0x8DD7,0x8DDA,0x8DDE, +0x8DCE,0x8DCF,0x8DDB,0x8DC6,0x8DEC,0x8DF7,0x8DF8,0x8DE3, +0x8DF9,0x8DFB,0x8DE4,0x8E09,0x8DFD,0x8E14,0x8E1D,0x8E1F, +0x8E2C,0x8E2E,0x8E23,0x8E2F,0x8E3A,0x8E40,0x8E39,0x8E35, +0x8E3D,0x8E31,0x8E49,0x8E41,0x8E42,0x8E51,0x8E52,0x8E4A, +0x8E70,0x8E76,0x8E7C,0x8E6F,0x8E74,0x8E85,0x8E8F,0x8E94, +0x8E90,0x8E9C,0x8E9E,0x8C78,0x8C82,0x8C8A,0x8C85,0x8C98, +0x8C94,0x659B,0x89D6,0x89DE,0x89DA,0x89DC, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x89E5,0x89EB,0x89EF,0x8A3E,0x8B26,0x9753,0x96E9,0x96F3, +0x96EF,0x9706,0x9701,0x9708,0x970F,0x970E,0x972A,0x972D, +0x9730,0x973E,0x9F80,0x9F83,0x9F85,0x9F86,0x9F87,0x9F88, +0x9F89,0x9F8A,0x9F8C,0x9EFE,0x9F0B,0x9F0D,0x96B9,0x96BC, +0x96BD,0x96CE,0x96D2,0x77BF,0x96E0,0x928E,0x92AE,0x92C8, +0x933E,0x936A,0x93CA,0x938F,0x943E,0x946B,0x9C7F,0x9C82, +0x9C85,0x9C86,0x9C87,0x9C88,0x7A23,0x9C8B,0x9C8E,0x9C90, +0x9C91,0x9C92,0x9C94,0x9C95,0x9C9A,0x9C9B,0x9C9E,0x9C9F, +0x9CA0,0x9CA1,0x9CA2,0x9CA3,0x9CA5,0x9CA6,0x9CA7,0x9CA8, +0x9CA9,0x9CAB,0x9CAD,0x9CAE,0x9CB0,0x9CB1,0x9CB2,0x9CB3, +0x9CB4,0x9CB5,0x9CB6,0x9CB7,0x9CBA,0x9CBB,0x9CBC,0x9CBD, +0x9CC4,0x9CC5,0x9CC6,0x9CC7,0x9CCA,0x9CCB, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9CCC,0x9CCD,0x9CCE,0x9CCF,0x9CD0,0x9CD3,0x9CD4,0x9CD5, +0x9CD7,0x9CD8,0x9CD9,0x9CDC,0x9CDD,0x9CDF,0x9CE2,0x977C, +0x9785,0x9791,0x9792,0x9794,0x97AF,0x97AB,0x97A3,0x97B2, +0x97B4,0x9AB1,0x9AB0,0x9AB7,0x9E58,0x9AB6,0x9ABA,0x9ABC, +0x9AC1,0x9AC0,0x9AC5,0x9AC2,0x9ACB,0x9ACC,0x9AD1,0x9B45, +0x9B43,0x9B47,0x9B49,0x9B48,0x9B4D,0x9B51,0x98E8,0x990D, +0x992E,0x9955,0x9954,0x9ADF,0x9AE1,0x9AE6,0x9AEF,0x9AEB, +0x9AFB,0x9AED,0x9AF9,0x9B08,0x9B0F,0x9B13,0x9B1F,0x9B23, +0x9EBD,0x9EBE,0x7E3B,0x9E82,0x9E87,0x9E88,0x9E8B,0x9E92, +0x93D6,0x9E9D,0x9E9F,0x9EDB,0x9EDC,0x9EDD,0x9EE0,0x9EDF, +0x9EE2,0x9EE9,0x9EE7,0x9EE5,0x9EEA,0x9EEF,0x9F22,0x9F2C, +0x9F2F,0x9F39,0x9F37,0x9F3D,0x9F3E,0x9F44}; + +static int func_gb2312_uni_onechar(int code){ + if ((code>=0x2121)&&(code<=0x2658)) + return(tab_gb2312_uni0[code-0x2121]); + if ((code>=0x2721)&&(code<=0x296F)) + return(tab_gb2312_uni1[code-0x2721]); + if ((code>=0x3021)&&(code<=0x777E)) + return(tab_gb2312_uni2[code-0x3021]); + return(0); +} + + +/* page 0 0x00A4-0x01DC */ +static uint16 tab_uni_gb23120[]={ +0x2168, 0, 0,0x216C,0x2127, 0, 0, 0, + 0, 0, 0, 0,0x2163,0x2140, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x2141, 0, 0, 0, 0, + 0, 0, 0, 0,0x2824,0x2822, 0, 0, + 0, 0, 0, 0,0x2828,0x2826,0x283A, 0, +0x282C,0x282A, 0, 0, 0, 0,0x2830,0x282E, + 0, 0, 0,0x2142, 0,0x2834,0x2832, 0, +0x2839, 0, 0, 0, 0,0x2821, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x2825, + 0, 0, 0, 0, 0, 0, 0,0x2827, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x2829, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x282D, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x2831, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x2823, 0,0x282B, 0,0x282F, 0, +0x2833, 0,0x2835, 0,0x2836, 0,0x2837, 0, +0x2838}; + +/* page 1 0x02C7-0x0451 */ +static uint16 tab_uni_gb23121[]={ +0x2126, 0,0x2125, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x2621,0x2622,0x2623,0x2624,0x2625,0x2626, +0x2627,0x2628,0x2629,0x262A,0x262B,0x262C,0x262D,0x262E, +0x262F,0x2630,0x2631, 0,0x2632,0x2633,0x2634,0x2635, +0x2636,0x2637,0x2638, 0, 0, 0, 0, 0, + 0, 0,0x2641,0x2642,0x2643,0x2644,0x2645,0x2646, +0x2647,0x2648,0x2649,0x264A,0x264B,0x264C,0x264D,0x264E, +0x264F,0x2650,0x2651, 0,0x2652,0x2653,0x2654,0x2655, +0x2656,0x2657,0x2658, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x2727, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x2721,0x2722,0x2723,0x2724,0x2725,0x2726,0x2728, +0x2729,0x272A,0x272B,0x272C,0x272D,0x272E,0x272F,0x2730, +0x2731,0x2732,0x2733,0x2734,0x2735,0x2736,0x2737,0x2738, +0x2739,0x273A,0x273B,0x273C,0x273D,0x273E,0x273F,0x2740, +0x2741,0x2751,0x2752,0x2753,0x2754,0x2755,0x2756,0x2758, +0x2759,0x275A,0x275B,0x275C,0x275D,0x275E,0x275F,0x2760, +0x2761,0x2762,0x2763,0x2764,0x2765,0x2766,0x2767,0x2768, +0x2769,0x276A,0x276B,0x276C,0x276D,0x276E,0x276F,0x2770, +0x2771, 0,0x2757}; + +/* page 2 0x2015-0x2312 */ +static uint16 tab_uni_gb23122[]={ +0x212A,0x212C, 0,0x212E,0x212F, 0, 0,0x2130, +0x2131, 0, 0, 0, 0, 0, 0, 0, + 0,0x212D, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x216B, 0,0x2164,0x2165, 0, + 0, 0, 0, 0, 0, 0,0x2179, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x2166, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x216D, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x2271,0x2272,0x2273,0x2274,0x2275, +0x2276,0x2277,0x2278,0x2279,0x227A,0x227B,0x227C, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x217B,0x217C,0x217A,0x217D, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x214A, 0, 0, 0, 0, + 0, 0,0x2147, 0,0x2146, 0, 0, 0, + 0, 0, 0, 0, 0,0x214C, 0, 0, +0x2158,0x215E, 0,0x214F, 0, 0, 0, 0, +0x214E, 0,0x2144,0x2145,0x2149,0x2148,0x2152, 0, + 0,0x2153, 0, 0, 0, 0, 0,0x2160, +0x215F,0x2143,0x214B, 0, 0, 0, 0, 0, +0x2157, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x2156, 0, 0, 0,0x2155, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x2159,0x2154, 0, 0,0x215C, +0x215D, 0, 0, 0, 0, 0, 0, 0, + 0,0x215A,0x215B, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x2151, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x214D, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x2150}; + +/* page 3 0x2460-0x2642 */ +static uint16 tab_uni_gb23123[]={ +0x2259,0x225A,0x225B,0x225C,0x225D,0x225E,0x225F,0x2260, +0x2261,0x2262, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x2245,0x2246,0x2247,0x2248, +0x2249,0x224A,0x224B,0x224C,0x224D,0x224E,0x224F,0x2250, +0x2251,0x2252,0x2253,0x2254,0x2255,0x2256,0x2257,0x2258, +0x2231,0x2232,0x2233,0x2234,0x2235,0x2236,0x2237,0x2238, +0x2239,0x223A,0x223B,0x223C,0x223D,0x223E,0x223F,0x2240, +0x2241,0x2242,0x2243,0x2244, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x2924,0x2925,0x2926,0x2927,0x2928,0x2929,0x292A,0x292B, +0x292C,0x292D,0x292E,0x292F,0x2930,0x2931,0x2932,0x2933, +0x2934,0x2935,0x2936,0x2937,0x2938,0x2939,0x293A,0x293B, +0x293C,0x293D,0x293E,0x293F,0x2940,0x2941,0x2942,0x2943, +0x2944,0x2945,0x2946,0x2947,0x2948,0x2949,0x294A,0x294B, +0x294C,0x294D,0x294E,0x294F,0x2950,0x2951,0x2952,0x2953, +0x2954,0x2955,0x2956,0x2957,0x2958,0x2959,0x295A,0x295B, +0x295C,0x295D,0x295E,0x295F,0x2960,0x2961,0x2962,0x2963, +0x2964,0x2965,0x2966,0x2967,0x2968,0x2969,0x296A,0x296B, +0x296C,0x296D,0x296E,0x296F, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x2176,0x2175, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x2178,0x2177, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x2174,0x2173, + 0, 0, 0,0x2170, 0, 0,0x2172,0x2171, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x216F,0x216E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x2162, 0,0x2161}; + +/* page 4 0x3000-0x3129 */ +static uint16 tab_uni_gb23124[]={ +0x2121,0x2122,0x2123,0x2128, 0,0x2129, 0, 0, +0x2134,0x2135,0x2136,0x2137,0x2138,0x2139,0x213A,0x213B, +0x213E,0x213F, 0,0x217E,0x2132,0x2133,0x213C,0x213D, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x2421,0x2422,0x2423,0x2424,0x2425,0x2426,0x2427, +0x2428,0x2429,0x242A,0x242B,0x242C,0x242D,0x242E,0x242F, +0x2430,0x2431,0x2432,0x2433,0x2434,0x2435,0x2436,0x2437, +0x2438,0x2439,0x243A,0x243B,0x243C,0x243D,0x243E,0x243F, +0x2440,0x2441,0x2442,0x2443,0x2444,0x2445,0x2446,0x2447, +0x2448,0x2449,0x244A,0x244B,0x244C,0x244D,0x244E,0x244F, +0x2450,0x2451,0x2452,0x2453,0x2454,0x2455,0x2456,0x2457, +0x2458,0x2459,0x245A,0x245B,0x245C,0x245D,0x245E,0x245F, +0x2460,0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,0x2467, +0x2468,0x2469,0x246A,0x246B,0x246C,0x246D,0x246E,0x246F, +0x2470,0x2471,0x2472,0x2473, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527, +0x2528,0x2529,0x252A,0x252B,0x252C,0x252D,0x252E,0x252F, +0x2530,0x2531,0x2532,0x2533,0x2534,0x2535,0x2536,0x2537, +0x2538,0x2539,0x253A,0x253B,0x253C,0x253D,0x253E,0x253F, +0x2540,0x2541,0x2542,0x2543,0x2544,0x2545,0x2546,0x2547, +0x2548,0x2549,0x254A,0x254B,0x254C,0x254D,0x254E,0x254F, +0x2550,0x2551,0x2552,0x2553,0x2554,0x2555,0x2556,0x2557, +0x2558,0x2559,0x255A,0x255B,0x255C,0x255D,0x255E,0x255F, +0x2560,0x2561,0x2562,0x2563,0x2564,0x2565,0x2566,0x2567, +0x2568,0x2569,0x256A,0x256B,0x256C,0x256D,0x256E,0x256F, +0x2570,0x2571,0x2572,0x2573,0x2574,0x2575,0x2576, 0, + 0, 0, 0,0x2124, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x2845,0x2846,0x2847, +0x2848,0x2849,0x284A,0x284B,0x284C,0x284D,0x284E,0x284F, +0x2850,0x2851,0x2852,0x2853,0x2854,0x2855,0x2856,0x2857, +0x2858,0x2859,0x285A,0x285B,0x285C,0x285D,0x285E,0x285F, +0x2860,0x2861,0x2862,0x2863,0x2864,0x2865,0x2866,0x2867, +0x2868,0x2869}; + +/* page 5 0x3220-0x3229 */ +static uint16 tab_uni_gb23125[]={ +0x2265,0x2266,0x2267,0x2268,0x2269,0x226A,0x226B,0x226C, +0x226D,0x226E}; + +/* page 6 0x4E00-0x9B54 */ +static uint16 tab_uni_gb23126[]={ +0x523B,0x3621, 0,0x465F, 0, 0, 0,0x4D72, +0x5549,0x487D,0x494F,0x4F42,0x5822,0x323B,0x536B, 0, +0x5824,0x3373, 0,0x5728,0x4752,0x5827,0x4A40, 0, +0x4770,0x317B,0x5235,0x3454,0x362B,0x4B3F,0x5829, 0, + 0, 0,0x362A, 0,0x413D,0x514F, 0,0x4925, +0x582D, 0,0x3876,0x513E,0x635C,0x5650, 0, 0, +0x3761, 0,0x342E, 0,0x4159, 0,0x583C, 0, +0x4D68,0x3524,0x4E2A,0x5677, 0,0x4076,0x3E59,0x582F, + 0, 0, 0,0x444B, 0,0x3E43, 0,0x5831, +0x4334,0x5265, 0,0x562E,0x4E5A,0x5527,0x3A75,0x3726, +0x4056, 0,0x4639,0x4552,0x4747, 0,0x3954, 0, +0x334B,0x5252, 0, 0,0x583F,0x3E45,0x4672,0x5232, +0x4F30,0x4F67, 0, 0, 0, 0,0x4A69, 0, + 0,0x5840, 0, 0, 0, 0, 0, 0, +0x4272,0x4252, 0,0x4869, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x472C, 0, + 0, 0, 0, 0, 0, 0,0x414B, 0, +0x5368,0x5579, 0,0x4A42,0x367E,0x5821,0x535A,0x3F77, + 0,0x5446,0x3B25,0x5841,0x4E65,0x3E2E, 0, 0, +0x5828, 0,0x5147,0x5029, 0, 0, 0,0x583D, +0x596F,0x4D76,0x3F3A, 0,0x3D3B,0x3A25,0x5260,0x327A, +0x3A60,0x4436, 0,0x4F6D,0x3E29,0x4D24,0x4141, 0, + 0, 0,0x4757,0x5971, 0,0x5974, 0, 0, + 0, 0,0x484B,0x5869, 0, 0, 0,0x525A, +0x4A32,0x484A,0x586C,0x586A,0x5846,0x3D76,0x464D,0x3370, + 0,0x586B,0x3D71,0x3D69, 0,0x4854,0x3453, 0, + 0,0x4258, 0,0x3256,0x5750,0x4A4B,0x4B7B,0x554C, +0x3836,0x4F49, 0, 0, 0,0x595A,0x5870,0x472A, + 0,0x586E, 0,0x347A,0x416E,0x5254, 0, 0, +0x586D, 0,0x5247,0x586F,0x4347, 0, 0, 0, +0x5176, 0,0x5659,0x5872, 0,0x5875,0x3C7E,0x3C5B, + 0, 0, 0,0x484E, 0,0x375D, 0,0x3742, + 0,0x4673, 0, 0, 0, 0, 0, 0, + 0,0x5878,0x5241, 0, 0,0x4E69,0x3C3F,0x377C, +0x3725,0x505D, 0, 0, 0, 0, 0,0x565A, +0x5345,0x3B6F,0x3B61,0x5871, 0, 0,0x4921,0x4E30, +0x342B, 0,0x5873, 0,0x494B,0x5876,0x4257,0x5877, + 0, 0,0x4E31,0x5879, 0, 0, 0,0x322E, +0x3940, 0,0x5923, 0,0x3069, 0,0x4166, 0, +0x496C, 0,0x4B45, 0,0x4B46,0x5924, 0, 0, + 0, 0, 0,0x3568, 0, 0,0x352B, 0, + 0, 0, 0, 0, 0,0x4E3B,0x354D,0x5721, +0x5774,0x5353, 0,0x4C65, 0,0x3A4E, 0,0x5922, +0x595C,0x5360,0x587D,0x3770,0x5777,0x587E,0x587A,0x5921, +0x4463, 0, 0,0x5336,0x5874,0x595D, 0,0x587B, + 0,0x4565, 0, 0,0x4050, 0, 0,0x5170, +0x305B, 0, 0,0x3C51,0x5926, 0,0x5925, 0, + 0, 0, 0,0x592C,0x592E, 0,0x592B,0x4A39, + 0, 0, 0,0x5929,0x5636, 0, 0, 0, +0x335E,0x5928, 0,0x407D, 0,0x4A4C, 0,0x592A, + 0,0x5927, 0, 0,0x5930, 0, 0,0x3631, + 0, 0, 0,0x3929, 0,0x5240, 0, 0, +0x4F40, 0, 0,0x4242, 0,0x3D44,0x556C,0x3260, +0x4748,0x3F6B,0x592D, 0,0x592F, 0,0x4E6A,0x3A6E, + 0, 0, 0, 0, 0,0x4756, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3163, + 0, 0, 0,0x3459,0x366D,0x5934, 0, 0, + 0, 0,0x3F21, 0, 0, 0,0x595E,0x474E, +0x407E,0x5938, 0, 0, 0, 0, 0,0x4B57, +0x377D, 0,0x5935, 0,0x5937,0x3123,0x5361,0x5939, + 0,0x5045, 0,0x5936, 0, 0,0x5931, 0, +0x5932,0x4129,0x5933, 0, 0,0x3C73,0x505E,0x3829, + 0,0x3E63, 0,0x593D, 0, 0, 0, 0, +0x593A, 0,0x3033, 0, 0, 0,0x5942, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x5944,0x3136, 0,0x593F, + 0, 0,0x3539, 0,0x3E73, 0, 0, 0, +0x4C48,0x3A72,0x5250, 0,0x5943, 0, 0,0x3D68, + 0,0x332B, 0, 0, 0,0x5945,0x3E6B, 0, +0x5946,0x593B,0x445F, 0,0x593E,0x5941,0x5940, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x552E, 0,0x5635, 0,0x4763, 0, + 0, 0, 0,0x5948, 0, 0, 0,0x3C59, +0x594A, 0, 0, 0,0x593C, 0,0x594B,0x462B, + 0, 0, 0, 0, 0,0x5949, 0, 0, + 0, 0,0x5776, 0,0x4D23, 0, 0, 0, + 0, 0, 0, 0, 0,0x3D21, 0, 0, + 0, 0, 0, 0,0x594C, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x453C,0x4D35, + 0, 0, 0,0x594D, 0, 0,0x5947,0x3325, +0x3F7E, 0, 0, 0, 0,0x3835, 0, 0, +0x407C, 0, 0, 0, 0,0x3078, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x3476, 0,0x594E, 0,0x594F, +0x3422,0x5950, 0, 0,0x345F, 0, 0, 0, + 0, 0,0x3041, 0, 0, 0, 0, 0, + 0, 0,0x5951,0x4935, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x4F71, + 0, 0, 0, 0, 0, 0,0x5952, 0, + 0, 0,0x4145, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x5956,0x492E, + 0, 0, 0, 0,0x5955,0x5954,0x5957, 0, + 0, 0, 0,0x4B5B, 0,0x3D29, 0, 0, + 0, 0, 0,0x4627, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x5953,0x5958, + 0, 0, 0,0x5959, 0, 0, 0, 0, + 0, 0,0x4865, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x405C, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3679, +0x5823,0x544A, 0,0x542A,0x5056,0x3364,0x5557, 0, +0x4F48,0x3962, 0,0x3F4B, 0,0x4362, 0, 0, + 0,0x3652, 0, 0,0x4D43,0x596E,0x5970, 0, + 0, 0,0x3533, 0,0x3635, 0, 0, 0, + 0, 0,0x3E24, 0, 0,0x486B, 0, 0, +0x482B, 0, 0,0x304B,0x392B,0x4179,0x5962, 0, +0x403C,0x3932, 0,0x3958,0x504B,0x3178,0x4664,0x3E5F, +0x3564,0x5748, 0,0x5178,0x3C66,0x4A5E, 0, 0, +0x3C3D,0x5966,0x5867, 0, 0,0x445A, 0, 0, +0x3854,0x483D, 0, 0,0x3261,0x5459, 0, 0, + 0, 0,0x4330, 0, 0,0x4361,0x5A22,0x485F, + 0,0x5034, 0,0x3E7C,0x4529, 0, 0, 0, +0x395A, 0,0x5A23, 0,0x5429,0x5A24, 0, 0, + 0, 0, 0,0x597B,0x362C, 0, 0,0x376B, +0x3179,0x597C,0x3365,0x3E76, 0,0x3F76,0x5231,0x4064, + 0, 0, 0,0x3633,0x597E,0x597D, 0, 0, +0x3E3B, 0, 0, 0,0x4660, 0,0x573C,0x5A21, + 0,0x4139, 0,0x3572,0x4168, 0, 0,0x3C75, + 0,0x3455, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x415D, 0,0x447D, 0, 0, +0x3C38,0x3732, 0, 0,0x376F, 0, 0, 0, + 0, 0, 0,0x596C, 0,0x463E, 0,0x3F2D, +0x3B4B, 0, 0,0x354A, 0,0x5B49,0x5057, 0, +0x4D39,0x303C,0x3376,0x3B77,0x5B4A,0x3A2F, 0,0x5464, +0x3536,0x3573,0x5856,0x4850, 0, 0,0x3756,0x4750, +0x5857, 0,0x3F2F, 0, 0,0x5B3B,0x5858, 0, + 0,0x504C,0x3B2E, 0, 0, 0,0x6B3E,0x4150, +0x4175,0x5472,0x3855,0x3434, 0,0x3375, 0, 0, +0x493E, 0, 0, 0,0x4550, 0, 0, 0, +0x4559,0x407B, 0,0x3170, 0,0x5859,0x394E, 0, +0x353D, 0, 0,0x585A, 0, 0,0x5646,0x4B22, +0x482F,0x4932,0x344C,0x3F4C, 0,0x3974, 0,0x585B, +0x585C,0x3667,0x3C41,0x4C6A, 0, 0, 0, 0, + 0, 0,0x4F77, 0,0x585D,0x4730, 0, 0, +0x3950,0x3D23, 0, 0,0x4C5E, 0,0x464A, 0, + 0, 0, 0, 0,0x5860, 0,0x585E, 0, + 0,0x585F, 0, 0, 0,0x307E, 0,0x3E67, + 0,0x4A23,0x3C74, 0, 0, 0, 0,0x3831, + 0, 0,0x386E, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x5862, 0,0x3D4B, + 0,0x5864,0x5863, 0, 0, 0, 0, 0, +0x457C, 0, 0, 0, 0, 0, 0, 0, +0x5865, 0, 0,0x5866, 0, 0, 0, 0, + 0, 0, 0,0x4126, 0,0x4830,0x306C,0x3926, +0x3C53,0x4E71,0x5B3D,0x4153, 0, 0, 0, 0, +0x362F,0x567A,0x452C,0x3D59,0x5B3E,0x5B3F, 0, 0, + 0,0x4078,0x3E22,0x404D, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x5B40,0x4A46, + 0, 0, 0,0x322A, 0, 0, 0,0x5342, + 0,0x4363, 0,0x512B, 0, 0, 0, 0, +0x5B42, 0,0x4055, 0, 0, 0,0x5B43, 0, +0x3F31, 0, 0, 0, 0, 0, 0,0x443C, + 0, 0, 0, 0,0x475A, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5B44, 0, 0, 0, 0, 0, 0, 0, + 0,0x5968,0x4957, 0, 0, 0,0x3934,0x4E70, +0x5448, 0, 0, 0, 0,0x307C,0x3452, 0, +0x5059, 0, 0, 0, 0,0x5969, 0,0x5E4B, +0x596B, 0, 0, 0, 0,0x5830,0x3B2F,0x3131, + 0,0x3357,0x584E, 0, 0,0x5451, 0, 0, +0x3D33,0x3F6F, 0,0x4F3B, 0, 0,0x5850, 0, + 0, 0,0x374B, 0, 0, 0,0x5851, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x4625,0x4778,0x523D, 0, 0,0x5852,0x4464, + 0,0x4A2E, 0,0x4727, 0,0x5826, 0,0x497D, +0x4E67,0x3B5C,0x306B, 0, 0, 0,0x3B2A,0x502D, + 0,0x3130,0x5764,0x573F, 0,0x3525,0x4274,0x444F, + 0, 0,0x3229, 0,0x3237, 0,0x3165,0x5F32, +0x553C,0x3F28,0x422C,0x5855,0x4231, 0,0x5854,0x4E54, + 0,0x5A60, 0,0x4E40, 0, 0,0x5834,0x432E, +0x5321,0x4E23, 0,0x3C34,0x4834,0x4251, 0,0x3E6D, +0x5036, 0,0x5A61, 0, 0, 0, 0,0x4764, + 0, 0,0x3327, 0,0x3672,0x4C7C,0x407A, 0, + 0,0x4077, 0,0x5139,0x5161,0x5847, 0, 0, + 0, 0, 0, 0, 0,0x325E, 0, 0, +0x4065, 0,0x3A71, 0, 0,0x5848, 0,0x542D, + 0, 0,0x4F61,0x5849, 0,0x584A,0x4F43, 0, +0x3378,0x3E47, 0, 0, 0, 0,0x584B, 0, + 0, 0, 0, 0, 0, 0,0x5B4C, 0, + 0, 0, 0,0x4825, 0, 0, 0,0x4F58, + 0,0x487E,0x324E, 0, 0, 0, 0, 0, +0x5356,0x3266,0x3C30,0x5351,0x4B2B,0x3734, 0, 0, + 0,0x3722, 0, 0,0x4A65, 0,0x4821,0x4A5C, +0x3164,0x5070, 0,0x4551, 0, 0, 0,0x5B45, +0x357E, 0, 0,0x3F5A,0x3945,0x3E64,0x416D, 0, +0x5F36,0x5F35,0x563B,0x3D50,0x5559,0x3048,0x3623,0x3F49, +0x4C28,0x5F33,0x4A37,0x5352, 0,0x584F,0x5236,0x3A45, +0x4B3E,0x4C3E, 0,0x5F37,0x3570,0x5F34, 0, 0, + 0,0x5375, 0,0x3354,0x3877, 0,0x5F3A, 0, +0x3A4F,0x3C2A,0x3575, 0,0x4D2C,0x437B,0x3A73,0x4074, +0x4D42,0x4F72,0x5F38,0x4F45, 0,0x4240,0x5F39,0x4270, + 0, 0, 0,0x3E7D, 0,0x415F,0x4D4C,0x5277, +0x374D,0x5F41, 0,0x5F44, 0, 0,0x3771,0x3049, +0x3656,0x3754, 0,0x3A2C,0x4C7D,0x3F54,0x4B31,0x4674, + 0,0x5628,0x5F45, 0,0x4E62,0x3333, 0, 0, +0x4E7C,0x3435, 0,0x4E47,0x3A70, 0,0x4E61, 0, +0x513D, 0, 0,0x5F40, 0, 0,0x3474, 0, +0x334A, 0,0x3866,0x5F3B, 0, 0, 0, 0, +0x4445, 0,0x5F3C,0x5F3D,0x5F3E,0x453B,0x5F3F,0x5F42, +0x5431,0x5F43, 0,0x473A,0x4E58, 0, 0, 0, + 0, 0,0x4458, 0,0x5F4A, 0,0x5F4F, 0, +0x565C, 0, 0, 0, 0, 0, 0, 0, + 0,0x5F49,0x5F5A,0x4E36, 0,0x3A47,0x5F4E,0x5F48, +0x455E, 0, 0,0x496B,0x3A74,0x437C, 0, 0, +0x3E57, 0,0x5F46, 0,0x5F4D, 0,0x4558, 0, + 0, 0, 0,0x5526,0x3A4D, 0,0x3E4C,0x533D, +0x3840, 0,0x5664, 0,0x5F47,0x393E,0x3F27, 0, + 0,0x417C,0x5F4B,0x5F4C, 0,0x5F50, 0, 0, + 0, 0, 0,0x5F5B,0x5F65, 0,0x5F57,0x5F56, +0x5749,0x5F63,0x5F64,0x656B,0x5227,0x5F52, 0,0x3F29, + 0,0x545B, 0,0x3F48,0x5F54, 0, 0, 0, +0x4F4C, 0, 0,0x5F5D, 0,0x514A, 0,0x5F5E, +0x3027,0x4637,0x5F53, 0,0x3A65, 0,0x365F,0x4D5B, +0x397E,0x5455, 0, 0,0x5F5F,0x4F6C,0x3025,0x5F67, +0x5F51,0x5146,0x5F55,0x5F58,0x5F59,0x5F5C, 0,0x3B29, + 0,0x5F60,0x5F61, 0,0x5F62,0x5F66,0x5F68,0x5334, + 0, 0, 0, 0, 0,0x3867,0x4536,0x5F6A, +0x495A,0x4128,0x4444, 0, 0,0x3F5E,0x4F78, 0, + 0, 0,0x555C,0x5F6E, 0, 0, 0, 0, + 0, 0,0x3238, 0,0x3A5F,0x5F6C, 0,0x5B41, + 0,0x5164, 0, 0, 0, 0,0x4B74,0x343D, + 0,0x3026, 0, 0, 0, 0, 0,0x5F71, +0x4C46,0x5F72, 0, 0,0x5F6D, 0, 0, 0, + 0, 0, 0,0x5F69, 0, 0, 0, 0, +0x5F6B, 0,0x5F6F,0x5F70,0x3B3D, 0, 0,0x5F73, + 0, 0,0x5F74, 0,0x3B23, 0,0x4A5B,0x4E28, +0x6027,0x332A, 0,0x6026, 0, 0, 0,0x6021, + 0, 0, 0, 0,0x5F7E, 0,0x4D59,0x5F7C, + 0,0x5F7A, 0,0x3F50,0x5744, 0,0x494C, 0, + 0,0x5F78,0x3021, 0, 0, 0, 0, 0, +0x5F7D, 0, 0, 0, 0,0x5F7B,0x6022, 0, + 0, 0, 0, 0,0x6028, 0, 0, 0, + 0,0x3748, 0, 0,0x4621,0x4936,0x4032,0x5F75, + 0, 0,0x453E, 0,0x5844,0x5F79,0x4476, 0, + 0, 0, 0, 0, 0,0x6023,0x6024,0x6025, +0x5025, 0, 0,0x6034,0x4C64, 0,0x6031, 0, +0x3F26,0x602F,0x4E39,0x602B,0x4946, 0, 0,0x402E, +0x602E,0x3A6D,0x3A30,0x6029, 0, 0, 0,0x5F76, + 0,0x6033, 0, 0,0x6038, 0, 0, 0, +0x342D,0x6039, 0, 0,0x4F32,0x3A48, 0,0x6030, + 0, 0, 0, 0, 0, 0, 0,0x507A, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x602C, 0,0x547B, 0,0x5F77, 0,0x4567, + 0,0x602D, 0,0x5377, 0,0x6036,0x6037, 0, + 0, 0, 0, 0,0x6044,0x5061, 0, 0, + 0,0x603C, 0, 0,0x6049,0x604A, 0, 0, + 0,0x603E,0x602A,0x4924,0x6041, 0,0x6032, 0, + 0, 0, 0, 0,0x4A48,0x6043, 0,0x6035, + 0,0x4E4B, 0,0x4B43,0x604D,0x6046,0x6042, 0, +0x604B, 0,0x603A,0x603F,0x6040, 0, 0,0x6045, + 0, 0,0x6047,0x6048, 0,0x604C, 0,0x603B, + 0, 0, 0, 0, 0,0x4B54,0x6055, 0, +0x6056,0x6052, 0, 0, 0, 0, 0, 0, +0x6050,0x3C4E, 0, 0,0x6051, 0,0x3842,0x5845, + 0, 0, 0, 0, 0, 0, 0, 0, +0x506A, 0, 0,0x426F, 0, 0,0x604F,0x603D, + 0, 0, 0,0x6054,0x6053, 0, 0,0x6057, + 0, 0, 0, 0,0x605C,0x6058, 0, 0, + 0,0x5676,0x3330, 0,0x576C, 0,0x4B3B, 0, + 0,0x605A, 0,0x4E7B, 0, 0, 0,0x3A59, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x6061,0x605D,0x522D, 0, + 0, 0, 0, 0,0x6062, 0, 0,0x605B, +0x6059,0x605F, 0, 0,0x6060, 0, 0, 0, + 0, 0,0x605E, 0,0x6064, 0, 0, 0, +0x4677,0x582C,0x546B,0x6066,0x4A49, 0, 0, 0, + 0,0x6065, 0, 0, 0, 0,0x3841, 0, + 0, 0, 0,0x6067,0x6068, 0, 0, 0, + 0, 0, 0, 0, 0,0x6069,0x6063, 0, + 0, 0, 0, 0, 0, 0,0x3A3F,0x4C67, + 0, 0, 0,0x606A, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x4F79, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x606B, + 0, 0, 0, 0, 0, 0, 0,0x4842, + 0, 0, 0, 0,0x3D40, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x4452, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x606C, 0, 0,0x606D, + 0, 0,0x4774,0x4B44, 0,0x606E,0x3B58,0x5836, +0x5272,0x606F,0x4D45, 0,0x365A, 0, 0, 0, + 0, 0, 0,0x6071, 0,0x5430, 0, 0, +0x4027,0x3451, 0, 0,0x4E27,0x6070, 0, 0, + 0,0x6072,0x394C, 0, 0,0x397A,0x4D3C,0x6073, + 0, 0, 0,0x4654,0x6074, 0,0x5432, 0, +0x4826,0x6076,0x6075, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x6077, 0, 0,0x4D41, + 0, 0, 0,0x4A25, 0, 0, 0, 0, +0x545A,0x5B57,0x5B59, 0,0x5B58,0x3967,0x5B5C,0x5B5D, +0x3558, 0, 0,0x5B5A, 0, 0, 0, 0, + 0,0x5B5B,0x3321,0x5B5F, 0, 0,0x3B78, 0, +0x5637, 0,0x5B60, 0, 0, 0, 0,0x3E79, + 0, 0,0x373B, 0,0x5B50,0x4C2E,0x3F32,0x3B35, +0x5778,0x3F53, 0, 0, 0, 0, 0,0x3F69, + 0, 0,0x3C61,0x4C33,0x5B5E,0x3053,0x4E6B,0x3758, +0x5739,0x4642, 0, 0,0x4024, 0,0x4C39, 0, +0x5B67,0x5B61,0x463A,0x5B63, 0,0x5B68, 0,0x4577, + 0, 0, 0,0x5B6A, 0, 0,0x5B69,0x3F40, + 0, 0, 0,0x5B66,0x5B65, 0, 0, 0, + 0, 0,0x3439,0x402C,0x4222,0x5B62,0x5B64, 0, + 0, 0, 0,0x504D,0x5B6D, 0, 0, 0, + 0, 0,0x405D,0x5B72, 0, 0, 0, 0, + 0, 0, 0,0x3662, 0, 0, 0, 0, +0x5B73,0x5B52,0x3938,0x542B,0x5B6C, 0,0x3F51,0x5B70, + 0,0x5B51, 0,0x3566, 0,0x5B6B,0x3F65, 0, + 0, 0,0x5B6E, 0,0x5B71, 0, 0, 0, +0x5B79, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x3921,0x3023, 0, 0, 0, 0, + 0, 0, 0,0x4271, 0, 0,0x3347,0x5B6F, + 0, 0,0x5B78, 0,0x4652,0x5B74, 0, 0, +0x5B75,0x5B77,0x5B76, 0, 0,0x5B7E, 0,0x5372, +0x323A, 0, 0, 0,0x5B7D, 0, 0, 0, + 0, 0, 0, 0, 0,0x5C24, 0,0x5B7B, + 0, 0, 0, 0,0x5B7A, 0, 0, 0, +0x5B7C,0x4560,0x3B79, 0, 0,0x5C23, 0, 0, +0x5C25, 0,0x4C43, 0, 0, 0,0x3651,0x5D40, + 0, 0, 0,0x5C21, 0,0x5C22, 0, 0, + 0,0x4735, 0, 0, 0,0x3669, 0, 0, + 0,0x5C27, 0, 0, 0, 0,0x5C26, 0, +0x5C29,0x3124, 0, 0,0x354C, 0, 0, 0, + 0, 0,0x3F30, 0, 0, 0, 0, 0, +0x515F, 0, 0, 0, 0,0x3642, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x5C28, 0, 0, 0, + 0, 0, 0, 0,0x4B7A,0x6B73, 0, 0, + 0,0x4B5C, 0, 0,0x4B7E, 0, 0, 0, +0x4C41, 0, 0, 0, 0, 0,0x487B, 0, + 0, 0, 0, 0, 0,0x5C2A, 0, 0, + 0, 0, 0,0x4C6E,0x5C2B, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x5B53, 0, +0x5C2F,0x5C2C, 0,0x3E33, 0,0x4A7B, 0, 0, + 0,0x5C2D, 0, 0, 0, 0, 0, 0, + 0, 0,0x494A,0x4439, 0, 0, 0, 0, + 0,0x473D,0x5C2E, 0, 0, 0,0x5476,0x5066, + 0, 0, 0, 0, 0, 0, 0, 0, +0x442B,0x3655, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x5B54, 0, 0, 0, + 0,0x315A, 0, 0, 0,0x5B55, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5B56, 0, 0, 0,0x3A3E, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x4840, 0, 0, 0, + 0, 0, 0,0x4A3F,0x4849, 0,0x5733, 0, +0x4979, 0, 0,0x3F47, 0, 0,0x3A78, 0, + 0,0x523C, 0, 0, 0, 0, 0, 0, + 0, 0,0x623A, 0,0x3426, 0, 0,0x3138, + 0, 0, 0, 0, 0,0x3834, 0,0x4F44, + 0, 0, 0, 0,0x5967,0x4F26,0x4D62, 0, + 0,0x596D,0x3660, 0,0x5239, 0, 0,0x393B, + 0, 0, 0, 0,0x6239,0x6237, 0,0x3473, + 0,0x4C6C,0x4C2B,0x3772, 0,0x5832,0x516B,0x3A3B, + 0,0x4A27, 0, 0,0x4D37, 0, 0,0x5244, +0x3F64,0x3C50,0x3661, 0,0x5E45, 0, 0, 0, + 0,0x5E46,0x5B3C, 0,0x5159, 0, 0,0x4666, +0x444E,0x376E, 0,0x375C, 0, 0,0x3F7C,0x5760, + 0,0x4675, 0, 0,0x313C,0x5E48,0x3D31,0x4C57, +0x5E4A, 0,0x5E49, 0, 0, 0, 0, 0, +0x356C, 0,0x495D, 0, 0,0x3042, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x452E,0x452B, 0,0x444C, 0, +0x3C69,0x4B7D, 0, 0, 0,0x3A43, 0, 0, + 0,0x6579,0x4867,0x657A,0x4D7D, 0,0x5731,0x383E, +0x4268, 0,0x4851, 0, 0,0x657B, 0, 0, + 0, 0,0x364A,0x3C4B, 0, 0,0x517D,0x6621, + 0,0x436E, 0, 0, 0, 0,0x6624, 0, + 0, 0, 0,0x657E,0x6625,0x4D57, 0, 0, +0x3741,0x657C,0x657D,0x6623, 0, 0,0x445D,0x6628, + 0, 0,0x6627, 0, 0, 0, 0, 0, + 0,0x4343, 0,0x465E, 0, 0,0x662A, 0, + 0, 0, 0, 0, 0, 0,0x4437, 0, + 0, 0,0x6622,0x4A3C, 0, 0, 0, 0, +0x3D63,0x3943,0x6626,0x5055,0x4E2F, 0, 0,0x6629, +0x6630, 0,0x5226, 0,0x3D2A,0x662D, 0, 0, + 0, 0, 0,0x662F, 0,0x4051, 0, 0, +0x524C, 0, 0, 0,0x3C27, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6631, 0,0x5276, 0, 0, 0,0x574B, + 0,0x4D7E, 0,0x4D5E,0x4226,0x662B,0x662C,0x3D3F, +0x662E,0x6633, 0, 0,0x6632, 0, 0, 0, + 0,0x6636, 0,0x6638, 0, 0, 0, 0, +0x446F, 0, 0, 0,0x4448, 0, 0,0x3E6A, +0x496F, 0, 0,0x6637, 0,0x3670, 0, 0, + 0,0x4364, 0, 0, 0, 0, 0, 0, + 0,0x5369,0x6634, 0,0x6635, 0,0x4822, 0, + 0, 0, 0, 0,0x663D, 0, 0, 0, +0x6639, 0, 0, 0, 0, 0,0x4645, 0, + 0,0x4D71,0x663B, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x663C, 0, 0, + 0, 0,0x3B69, 0, 0, 0, 0, 0, + 0, 0,0x663E, 0, 0, 0, 0,0x663A, + 0, 0,0x4037, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x5324,0x663F,0x4974,0x6643, + 0, 0,0x6644, 0, 0, 0, 0,0x5076, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x433D, 0, 0, 0, 0, 0, + 0, 0,0x4344,0x6642, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x6641, 0, 0, 0, 0, 0, + 0, 0,0x6647,0x4F31, 0,0x6B74, 0, 0, +0x664A, 0, 0, 0, 0, 0,0x6645, 0, + 0,0x3C5E,0x4929, 0, 0, 0, 0, 0, + 0,0x3C35, 0, 0,0x4F53, 0, 0, 0, + 0, 0,0x6648, 0,0x6649, 0,0x664E, 0, +0x6650, 0, 0, 0,0x6651, 0, 0, 0, +0x664B,0x3555, 0,0x664C, 0, 0,0x664F, 0, + 0,0x445B, 0,0x6646, 0, 0, 0, 0, + 0,0x664D, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6652, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x6654,0x6653, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x6655, 0,0x5978, 0, 0,0x6656, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6657, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5753,0x665D, 0,0x665E,0x3F57,0x5450, 0,0x5756, +0x3466,0x4B6F,0x665A,0x5843,0x574E,0x5022, 0,0x434F, + 0, 0,0x665F,0x3C3E,0x3942,0x665B,0x5127, 0, + 0,0x3A22,0x424F, 0,0x582B, 0, 0, 0, +0x4A6B,0x656E, 0,0x665C, 0,0x3775, 0, 0, + 0, 0,0x4866, 0, 0,0x4475, 0, 0, +0x6532,0x447E, 0,0x4B7C,0x6533,0x552C, 0,0x536E, +0x4A58,0x3032, 0,0x4B4E,0x4D6A, 0, 0,0x3A6A, + 0, 0, 0,0x6535, 0,0x6534, 0,0x575A, +0x3959,0x5666,0x3628,0x4D70,0x524B,0x3126,0x4A35, 0, +0x3368,0x4973,0x3F4D,0x507B,0x4A52,0x6536,0x3B42, 0, + 0, 0,0x4F5C,0x392C, 0, 0, 0, 0, +0x5457, 0, 0,0x3A26,0x5167,0x4F7C,0x3C52, 0, +0x6537,0x485D, 0, 0, 0,0x3F6D,0x3176,0x4B5E, + 0, 0,0x3C45, 0,0x3C44,0x527A,0x435C,0x3F5C, + 0, 0, 0, 0,0x383B, 0, 0, 0, +0x4342, 0,0x3A2E,0x5422, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x475E,0x442F,0x326C, + 0,0x3951, 0, 0,0x653B,0x4148, 0, 0, +0x552F, 0, 0, 0, 0, 0,0x653C, 0, +0x653E, 0, 0, 0, 0, 0, 0, 0, +0x3467,0x3654,0x4B42,0x5130,0x353C, 0, 0,0x4A59, + 0,0x3762, 0, 0,0x4964, 0,0x3D2B, 0, + 0,0x4E3E,0x5770, 0, 0, 0, 0,0x5021, + 0,0x4959, 0, 0,0x367B,0x6658,0x3C62, 0, +0x333E, 0,0x4950, 0,0x6659,0x3322, 0, 0, + 0, 0,0x5E4C, 0,0x5348,0x5E4D, 0,0x5222, + 0, 0, 0, 0,0x5E4E, 0, 0, 0, + 0,0x3E4D, 0, 0,0x5E4F, 0, 0, 0, +0x4A2C,0x527C,0x335F,0x656A,0x4461,0x3E21,0x4E32,0x4472, +0x3E56,0x4628,0x3263, 0, 0,0x3E53, 0, 0, +0x477C,0x4C6B,0x3D6C,0x4E5D, 0, 0,0x4A3A,0x4641, +0x656C,0x503C, 0, 0, 0,0x5539, 0, 0, + 0,0x656D, 0, 0, 0, 0,0x4A74, 0, +0x4D40,0x4245, 0,0x656F, 0,0x4244,0x6570, 0, + 0, 0, 0, 0, 0, 0,0x6578,0x4D4D, + 0,0x493D, 0, 0, 0, 0, 0, 0, + 0,0x5259,0x6128, 0, 0, 0, 0,0x536C, + 0,0x4B6A,0x4671, 0, 0, 0, 0, 0, +0x612C, 0, 0, 0,0x6127,0x6129, 0, 0, +0x612A,0x612F, 0, 0,0x326D, 0,0x612B,0x385A, +0x612D,0x612E,0x6130,0x353A,0x6131, 0, 0, 0, + 0, 0,0x6133,0x6138, 0, 0, 0, 0, + 0,0x5152, 0,0x6136,0x6135,0x416B, 0, 0, + 0,0x6137, 0,0x5440, 0,0x6132, 0,0x613A, +0x3036, 0, 0, 0, 0,0x6134, 0,0x3F79, + 0,0x6139, 0, 0,0x613B, 0, 0, 0, + 0, 0, 0,0x613E, 0, 0, 0, 0, + 0, 0,0x613C, 0, 0, 0, 0, 0, + 0,0x5645, 0, 0, 0, 0, 0, 0, + 0,0x4F3F, 0, 0,0x613D,0x613F,0x424D, 0, +0x366B, 0,0x5378, 0, 0,0x474D, 0, 0, +0x3765, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x3E7E, 0, 0, 0, 0, + 0, 0,0x6140,0x6141, 0, 0,0x6147,0x3367, + 0, 0, 0, 0, 0, 0,0x4669, 0, + 0, 0, 0, 0,0x345E, 0,0x5142, 0, + 0, 0, 0,0x6148, 0, 0,0x6146, 0, + 0, 0, 0, 0,0x6145, 0,0x6143,0x6142, + 0,0x3140, 0, 0, 0,0x5538,0x6144, 0, + 0, 0, 0, 0,0x614B, 0, 0, 0, + 0, 0, 0, 0, 0,0x614C,0x614A, 0, + 0, 0, 0, 0, 0, 0, 0,0x6F7A, + 0, 0,0x6153,0x6152,0x4736, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6149, 0, 0,0x614E, 0,0x6150, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6154, 0,0x6151,0x614D, 0, 0,0x614F, + 0, 0, 0, 0,0x6155, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x6156, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6157, 0, 0, 0,0x6158, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x615A, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x615B, 0, 0, + 0, 0, 0, 0, 0,0x4E21, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x675D, 0,0x3428,0x565D, 0, + 0,0x5132,0x3332, 0, 0,0x3924,0x5773,0x4749, +0x3E5E,0x392E, 0,0x4E57, 0, 0,0x326E,0x5B4F, + 0,0x3C3A,0x5251,0x4B48,0x304D, 0, 0,0x4F6F, + 0, 0, 0, 0, 0,0x5963,0x3D6D, 0, + 0,0x3152,0x4A50,0x323C, 0,0x4B27,0x372B, 0, +0x4A26, 0, 0, 0,0x4F23, 0, 0,0x6078, +0x554A,0x607B, 0, 0,0x607A,0x4541,0x4C7B, 0, +0x4131,0x6079,0x5663,0x322F,0x5644,0x355B, 0, 0, + 0, 0, 0, 0, 0, 0,0x3478,0x5621, + 0, 0, 0, 0, 0,0x4F2F,0x306F, 0, + 0,0x607C, 0, 0, 0, 0, 0,0x6121, +0x3323, 0, 0,0x607D,0x607E,0x4331, 0, 0, + 0, 0,0x435D, 0,0x6122,0x3779, 0, 0, + 0, 0, 0, 0,0x3B4F, 0, 0, 0, + 0, 0, 0, 0,0x6123,0x443B, 0, 0, + 0, 0, 0,0x6124, 0, 0,0x6125, 0, + 0,0x6126,0x3431, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x3849,0x463D,0x446A, 0,0x3222, 0, +0x5052, 0,0x675B,0x3B43,0x5357,0x5344, 0,0x3963, +0x624F, 0, 0, 0,0x572F, 0,0x476C,0x3153, + 0, 0,0x3432,0x6251, 0, 0, 0,0x5072, +0x422E,0x6250, 0,0x3F62,0x5326,0x3557,0x6252,0x356A, + 0,0x436D,0x387D, 0,0x382E, 0,0x4553,0x374F, +0x6254, 0, 0, 0, 0,0x6253,0x3648,0x5779, + 0, 0, 0, 0, 0,0x4D25, 0, 0, + 0, 0, 0,0x6258, 0,0x6256,0x4A7C,0x3F35, +0x5339,0x6255, 0, 0, 0, 0,0x6257, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x412E,0x4048, 0, 0, 0, 0, 0, + 0,0x625B,0x625A,0x402A, 0, 0,0x414E, 0, + 0, 0, 0,0x625C, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x625D, 0,0x625E, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x5B48, 0,0x5153,0x4D22, + 0, 0,0x3D28, 0, 0, 0,0x5E43,0x5825, +0x3F2A,0x5B4D,0x526C,0x467A,0x452A, 0, 0, 0, +0x5E44, 0,0x3157,0x5F2E, 0, 0, 0,0x4A3D, + 0,0x5F31, 0,0x392D, 0,0x527D, 0,0x3825, +0x3A6B, 0, 0,0x335A, 0, 0, 0,0x355C, +0x5545, 0, 0, 0, 0,0x4356,0x4F52,0x3B21, + 0,0x6573,0x6572, 0, 0,0x6574, 0,0x4D64, + 0,0x4875, 0, 0, 0, 0, 0, 0, + 0,0x352F,0x473F, 0,0x6576, 0, 0, 0, +0x6C30, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6566, 0,0x3969,0x3531, 0,0x423C,0x6568,0x6567, +0x6569, 0, 0, 0, 0,0x524D, 0, 0, + 0,0x616A,0x504E, 0,0x4D2E, 0,0x5165, 0, + 0,0x324A,0x316B, 0,0x3172,0x456D, 0, 0, +0x5543,0x5330, 0,0x615C, 0, 0, 0,0x615D, + 0,0x525B, 0,0x3339,0x314B, 0, 0, 0, +0x4D79,0x5577,0x615E, 0,0x3E36,0x347D, 0,0x615F, +0x3A5C,0x6160,0x3B32,0x4249,0x6161, 0, 0, 0, +0x506C, 0,0x4D3D, 0, 0,0x6162, 0,0x3543, +0x4547,0x6163, 0, 0,0x6164, 0, 0, 0, + 0,0x5379, 0, 0, 0, 0, 0, 0, +0x6165, 0,0x512D, 0, 0,0x6166,0x4E22, 0, + 0, 0, 0, 0, 0,0x6167, 0,0x3542, + 0, 0, 0, 0,0x6168,0x3B55, 0, 0, + 0, 0, 0,0x5044,0x6260,0x3158,0x5264, 0, + 0,0x6261, 0, 0,0x3C49,0x484C, 0,0x6263, +0x6C7E,0x6C7D,0x5F2F, 0, 0, 0,0x6262,0x563E, +0x4D7C,0x4326, 0, 0, 0,0x6343, 0, 0, +0x5652,0x6267, 0, 0,0x6268, 0, 0,0x5347, + 0, 0,0x626C,0x3F6C, 0,0x626D,0x6265, 0, + 0,0x3340, 0, 0, 0,0x446E, 0, 0, +0x626E, 0, 0,0x5043, 0,0x3A76,0x6269,0x375E, +0x3B33,0x4C2C,0x4B4B,0x6264,0x6266,0x626A,0x626B, 0, + 0, 0,0x6277, 0, 0,0x6274,0x5475,0x6273, + 0, 0,0x452D, 0,0x557A,0x4542,0x3240, 0, + 0,0x626F, 0,0x6272,0x412F,0x4B3C, 0, 0, +0x3521,0x6279, 0, 0, 0,0x3C31,0x6271,0x5054, +0x5439,0x6275,0x3956,0x6276, 0, 0, 0,0x4753, + 0, 0, 0, 0, 0,0x6270, 0, 0, + 0, 0, 0,0x575C,0x6D21, 0, 0,0x6278, + 0,0x6D25,0x627E,0x4A51, 0, 0, 0, 0, + 0, 0, 0,0x4135, 0,0x3B50, 0, 0, +0x3F56, 0,0x3A63, 0, 0,0x4B21, 0, 0, + 0,0x6D26,0x6D23, 0, 0,0x6D22, 0, 0, + 0, 0,0x3B56,0x6D27,0x5074, 0, 0,0x6D24, +0x3A5E,0x3677,0x6321,0x3632,0x4C71,0x3927, 0,0x4F22, +0x4721, 0, 0,0x3F52, 0, 0,0x3671, 0, +0x627A,0x627B,0x627D,0x627C,0x4455,0x6322, 0,0x5341, + 0, 0, 0,0x6327,0x4744, 0, 0, 0, + 0,0x4F24, 0, 0,0x6329,0x3A37, 0, 0, + 0, 0,0x6328, 0,0x3B5A, 0,0x6323, 0, + 0, 0,0x6324,0x632A, 0,0x6326, 0,0x4E72, +0x5346, 0, 0,0x3B3C, 0, 0,0x5443, 0, +0x447A, 0, 0,0x6D28,0x507C,0x6325, 0,0x4375, + 0,0x632D,0x312F, 0,0x6332, 0, 0, 0, +0x3C42, 0, 0,0x632C,0x353F, 0, 0, 0, + 0, 0, 0, 0, 0,0x4769,0x6330, 0, + 0, 0,0x3E2A,0x4D6F, 0, 0, 0, 0, + 0,0x3B73, 0, 0, 0,0x4C68, 0, 0, +0x632F, 0,0x6331, 0,0x4F27,0x632E, 0,0x4E29, +0x3B5D, 0, 0, 0, 0, 0,0x356B,0x3E65, +0x3252,0x334D, 0,0x3139,0x632B,0x3251,0x352C,0x395F, +0x3668, 0, 0,0x4F6B,0x6337, 0,0x3B4C, 0, + 0,0x4847,0x504A, 0, 0, 0, 0, 0, +0x6338,0x336E, 0, 0, 0, 0,0x6D29, 0, +0x537A,0x5364, 0, 0, 0,0x6D2A,0x6339,0x5262, + 0, 0, 0, 0, 0,0x6335, 0, 0, + 0, 0,0x535E, 0, 0, 0, 0,0x3850, +0x6333, 0, 0,0x6336,0x375F, 0,0x6334,0x4022, + 0, 0, 0,0x633A, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x5438, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3448, 0,0x633B, 0,0x3B45, 0,0x4977, 0, + 0,0x4965, 0, 0, 0,0x443D, 0, 0, + 0, 0, 0, 0, 0,0x6D2B, 0, 0, + 0, 0,0x427D, 0, 0, 0, 0,0x3B5B, +0x3F2E, 0, 0, 0, 0, 0, 0, 0, +0x4E3F, 0, 0, 0, 0,0x633C, 0,0x3F36, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x316F, 0, 0,0x5477, 0, + 0, 0, 0, 0,0x633E, 0, 0, 0, + 0, 0, 0, 0, 0,0x6D2D, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x633F, +0x3A29,0x6D2C, 0, 0,0x633D, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x6340, + 0, 0, 0, 0, 0, 0,0x3A36, 0, + 0, 0,0x362E, 0, 0, 0, 0, 0, +0x5038, 0,0x3043,0x6D2E, 0, 0, 0, 0, + 0,0x6D2F,0x4041, 0,0x6341, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x4533, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x6342, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x5C32, + 0, 0, 0, 0, 0, 0,0x6D30, 0, +0x386A, 0,0x4E6C,0x6A27,0x5067,0x4A79,0x4856,0x4F37, +0x3349,0x4E52,0x3D64, 0, 0,0x635E,0x3B72,0x6A28, +0x553D, 0,0x465D,0x6A29, 0, 0, 0,0x6A2A, + 0,0x6A2C,0x6A2B, 0,0x6A2E,0x6A2D, 0, 0, + 0, 0,0x3D58, 0,0x6A2F, 0,0x423E, 0, + 0, 0, 0,0x3441,0x3477, 0, 0,0x3B27, + 0, 0, 0, 0, 0,0x6C66,0x6C65,0x373F, +0x4B79,0x3162, 0,0x6C67, 0, 0, 0,0x4948, +0x6C68,0x6C69, 0,0x4A56,0x5E50,0x3245,0x547A, 0, + 0,0x464B,0x3047,0x3472,0x4853, 0, 0, 0, +0x4D50, 0, 0,0x3F38, 0, 0, 0, 0, + 0, 0, 0,0x3F5B, 0, 0,0x4724,0x5634, + 0,0x4029,0x5E51,0x4928,0x516F,0x4524,0x3067,0x3336, +0x4845, 0, 0,0x3062, 0, 0,0x3776, 0, + 0,0x457A, 0, 0,0x3673, 0,0x5552,0x3350, +0x3C3C, 0, 0, 0,0x332D, 0, 0, 0, + 0,0x3E71,0x3051, 0, 0, 0, 0, 0, + 0,0x5256,0x4A63,0x5725, 0,0x4D36,0x3636,0x3F39, +0x555B, 0,0x3827,0x4557, 0, 0, 0,0x5E52, +0x3F59,0x4255,0x4740, 0,0x3B24,0x3128, 0, 0, +0x456A, 0, 0,0x457B,0x4C27, 0, 0, 0, + 0,0x3127, 0, 0, 0,0x3556, 0, 0, + 0,0x4428, 0,0x5E53,0x513A,0x3369, 0,0x4372, + 0, 0,0x3777, 0,0x5674,0x3523,0x3270,0x4434, +0x4469,0x402D,0x5E54, 0,0x3068,0x4544,0x4160, 0, +0x3955, 0,0x3E5C,0x4D58,0x304E, 0,0x4D4F,0x5E56, +0x3E50,0x573E,0x5E55,0x5550,0x305D, 0, 0,0x4462, + 0, 0,0x4223,0x3C70, 0,0x5335,0x4039,0x4521, +0x3226,0x5471, 0, 0,0x4028,0x4A43,0x5E57,0x557C, + 0,0x3930, 0,0x482D,0x4B29, 0,0x5E59,0x3F3D, + 0, 0, 0, 0,0x4634,0x5727,0x4A30,0x4443, + 0,0x3356,0x3952, 0, 0, 0, 0,0x5638, +0x6A7C,0x3034, 0, 0, 0, 0,0x3F66, 0, + 0,0x4C74, 0, 0, 0, 0,0x4D5A, 0, + 0, 0,0x563F,0x424E, 0,0x4E4E,0x4C22,0x502E, +0x4453,0x3532,0x5E58,0x5575,0x3C37,0x3B53, 0, 0, +0x3024, 0,0x4532,0x346C, 0, 0, 0,0x5571, + 0, 0,0x6A7D, 0, 0, 0, 0, 0, + 0,0x5E5A,0x4D26, 0, 0,0x4D6C, 0, 0, + 0, 0,0x4E66,0x5E5C, 0,0x4D31,0x4026, 0, + 0,0x573D, 0,0x5E5B,0x3046,0x3A34,0x4953,0x4473, +0x3E68, 0, 0, 0, 0,0x3236, 0, 0, + 0, 0, 0, 0, 0, 0,0x404C,0x4B70, + 0,0x3C71,0x3B3B,0x3537, 0, 0, 0,0x4575, + 0,0x5E66, 0, 0, 0,0x5E63,0x3E5D, 0, + 0,0x5E5F, 0, 0, 0, 0,0x3437,0x3D5D, + 0, 0,0x5E60,0x446D, 0, 0, 0, 0, +0x4F46, 0,0x3560, 0, 0, 0, 0,0x365E, +0x4A5A,0x3574,0x5E65, 0,0x5546, 0,0x5E61,0x4C4D, +0x467E, 0,0x4545, 0, 0, 0,0x5234, 0, +0x3E72, 0, 0, 0, 0, 0, 0, 0, +0x4253, 0,0x4C3D,0x3338, 0,0x3D53, 0,0x3F58, +0x4D46,0x515A,0x346B, 0,0x5E64,0x5E5D,0x5E67, 0, +0x6A7E, 0, 0,0x4230,0x5E62, 0, 0,0x5640, +0x3527, 0,0x3274, 0,0x5E68, 0,0x5E72, 0, + 0, 0, 0, 0,0x5E6D, 0,0x5E71, 0, + 0,0x4860, 0, 0, 0,0x5761,0x5E6F,0x4368, +0x4C61, 0,0x3265, 0, 0, 0,0x523E, 0, + 0, 0, 0, 0, 0, 0,0x5E6E, 0, +0x5E6B,0x4E55, 0,0x3427, 0, 0, 0, 0, + 0,0x3F2B,0x3E3E, 0, 0,0x3D52, 0, 0, + 0, 0,0x5E69, 0,0x542E, 0,0x5E5E, 0, +0x5E6A, 0, 0, 0, 0,0x403F, 0,0x5E6C, +0x3273,0x3869,0x4227, 0, 0,0x3D41, 0, 0, + 0, 0, 0,0x5E75,0x5E78, 0, 0,0x322B, +0x3424, 0, 0,0x346A,0x4926, 0, 0, 0, + 0, 0, 0,0x5E76,0x4B51, 0,0x3863, 0, +0x5E77,0x5E7A, 0, 0, 0, 0,0x5E79, 0, + 0, 0,0x4C42, 0,0x3061,0x346E, 0, 0, + 0, 0, 0, 0,0x653A, 0, 0, 0, + 0, 0,0x502F, 0, 0,0x326B, 0,0x6B21, + 0,0x5E74, 0, 0,0x4963,0x5E73,0x305A,0x5221, +0x3177, 0,0x4C2F, 0, 0, 0, 0, 0, + 0, 0,0x5E70, 0,0x4B24, 0, 0, 0, +0x552A, 0, 0, 0, 0, 0,0x5E7B, 0, + 0, 0, 0, 0, 0, 0, 0,0x345D, + 0,0x4426, 0, 0, 0,0x5E7D, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x437E,0x4421,0x5F21, 0, 0, 0, 0, 0, + 0, 0,0x414C, 0,0x5E7C,0x3E6F, 0,0x4632, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x3345,0x4876, 0, 0,0x4B3A,0x5E7E, 0, + 0,0x5F24, 0, 0, 0, 0,0x5732, 0, + 0, 0, 0, 0,0x3337, 0, 0, 0, + 0,0x4143, 0, 0,0x474B,0x3225,0x3469, 0, +0x572B, 0, 0, 0, 0,0x446C, 0,0x5F22, +0x5F23, 0,0x5F25, 0,0x3A33, 0, 0, 0, +0x5F26, 0,0x405E, 0, 0,0x4943, 0, 0, + 0, 0, 0, 0, 0,0x3259,0x4766, 0, +0x5F27, 0,0x475C, 0, 0, 0, 0,0x5F28, +0x6B22, 0, 0, 0, 0, 0,0x4B53, 0, + 0, 0,0x5F2A, 0,0x5F29, 0,0x3241, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x454A, 0, 0, 0, 0, 0, 0, 0, + 0,0x5F2B, 0, 0, 0, 0, 0, 0, + 0, 0,0x545C, 0, 0, 0, 0, 0, +0x4841, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x5F2C, 0, 0, + 0, 0, 0,0x3E70, 0, 0,0x5F2D,0x5627, + 0, 0, 0, 0,0x6A37,0x6B36,0x4A55, 0, +0x587C,0x3844, 0,0x3925, 0, 0,0x3745,0x557E, + 0, 0, 0, 0, 0,0x394A, 0, 0, +0x5027,0x744D, 0, 0,0x3550, 0, 0,0x4374, + 0,0x3E48, 0, 0, 0,0x6B37,0x303D, 0, + 0,0x3D4C, 0,0x4132, 0,0x3156,0x3328, 0, + 0, 0,0x3852,0x4922, 0, 0,0x3658, 0, + 0, 0, 0,0x6B38,0x3E34, 0, 0, 0, +0x4A7D, 0,0x4743, 0,0x557B, 0, 0,0x3773, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x4E44, + 0, 0, 0,0x552B,0x3173, 0, 0, 0, +0x6C33,0x305F, 0,0x6C35, 0, 0, 0,0x3637, + 0,0x414F, 0,0x757A,0x5031, 0, 0,0x5565, + 0,0x4E53, 0, 0,0x3D6F,0x3362, 0,0x382B, + 0,0x5536, 0,0x6D3D, 0,0x364F, 0,0x4B39, +0x5042, 0, 0, 0, 0, 0, 0, 0, + 0,0x373D, 0, 0,0x6C36,0x4A29, 0, 0, + 0,0x4554, 0,0x6C39,0x6C38,0x4243,0x6C37, 0, + 0, 0, 0,0x507D,0x6C3A, 0,0x6C3B,0x5765, + 0, 0,0x6C3C, 0, 0, 0,0x6C3D,0x466C, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4E5E, 0,0x3C48, 0, 0,0x4855,0x3529,0x3E49, +0x563C,0x5467, 0, 0,0x512E,0x5071,0x6A38,0x6A39, +0x6A3A,0x3A35, 0, 0, 0, 0,0x4A31,0x3F75, + 0, 0,0x4D7A, 0, 0, 0, 0, 0, +0x6A40, 0,0x303A,0x6A3E, 0, 0,0x4025, 0, + 0, 0,0x6A3B, 0,0x327D, 0,0x4377,0x3B68, + 0, 0, 0,0x5257,0x4E74,0x6A3F, 0, 0, + 0,0x6A3C, 0, 0, 0,0x6A43, 0,0x5047, +0x5333, 0, 0, 0, 0,0x343A, 0,0x4341, +0x5772, 0, 0, 0, 0,0x5551, 0,0x4A47, + 0,0x6A45, 0, 0,0x6A44,0x6A47,0x6A46, 0, + 0, 0, 0, 0,0x5667, 0,0x4F54, 0, + 0,0x6A4B, 0,0x3B4E, 0, 0, 0, 0, + 0, 0, 0,0x3D7A,0x494E, 0, 0,0x6A4C, + 0, 0,0x4939,0x4F7E,0x6A4A,0x544E,0x6A4D,0x6A4F, + 0, 0,0x4D6D, 0, 0, 0, 0,0x6A49, + 0,0x6A4E, 0, 0,0x4E6E, 0,0x3B5E, 0, +0x333F, 0, 0, 0, 0, 0,0x4655,0x3E30, +0x4E7A, 0, 0, 0,0x4767, 0,0x3E27,0x6A50, + 0, 0,0x5647, 0, 0, 0,0x4140, 0, + 0, 0,0x545D, 0,0x6A51, 0, 0,0x4F3E, + 0, 0, 0, 0,0x6A52, 0, 0, 0, + 0,0x4A6E, 0, 0, 0, 0,0x452F,0x3035, + 0, 0, 0, 0, 0,0x6A54, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x6A53, +0x745F, 0, 0, 0, 0, 0,0x443A, 0, + 0, 0, 0, 0,0x3129, 0, 0, 0, + 0,0x655F, 0, 0, 0, 0,0x6A55, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x4A6F, 0,0x6A56,0x6A57,0x4658, 0, 0, + 0, 0, 0, 0, 0, 0,0x6A58, 0, + 0,0x6A59, 0, 0, 0, 0, 0, 0, +0x543B, 0,0x477A,0x5237,0x387C, 0, 0,0x6A42, + 0,0x325C, 0, 0,0x427C, 0,0x5478,0x4C66, +0x576E, 0, 0, 0, 0, 0, 0, 0, +0x5442,0x5350,0x6B43,0x4573, 0,0x377E, 0, 0, +0x6B54, 0, 0, 0,0x4B37,0x6B5E, 0,0x404A, + 0, 0, 0,0x4D7B, 0,0x332F, 0,0x465A, + 0, 0, 0, 0, 0, 0,0x6B7C, 0, +0x443E, 0,0x4E34,0x4429,0x313E,0x547D, 0,0x4A75, + 0,0x566C, 0, 0,0x4653,0x3664, 0, 0, + 0, 0,0x3B7A, 0, 0,0x5060, 0, 0, +0x4931, 0,0x5453,0x4828, 0, 0,0x384B, 0, +0x683E,0x493C, 0, 0,0x683B, 0,0x406E,0x5053, +0x3244,0x3465, 0,0x683C, 0, 0,0x5548, 0, + 0, 0, 0, 0,0x3645, 0,0x683D,0x4A78, +0x385C,0x4C75, 0, 0, 0,0x4034, 0, 0, +0x516E,0x683F,0x6842, 0, 0,0x3A3C, 0,0x312D, +0x3D5C, 0,0x6A3D,0x6843, 0,0x6846, 0,0x684B, + 0, 0, 0, 0,0x684C, 0,0x4B49,0x3065, + 0,0x3C2B, 0, 0,0x3939, 0, 0,0x6841, + 0,0x4D77, 0,0x684A, 0, 0, 0, 0, +0x4E76, 0, 0, 0, 0,0x556D, 0,0x4156, +0x6844, 0,0x4336, 0,0x397B,0x5626,0x6848, 0, + 0, 0,0x4A60,0x5466, 0,0x6840, 0,0x6845, +0x6847, 0,0x4739,0x3763, 0,0x6849, 0,0x3F5D, +0x6852, 0, 0,0x6857, 0,0x6855,0x3C5C,0x3C4F, +0x685B, 0, 0, 0, 0, 0, 0, 0, + 0,0x685E, 0,0x685A,0x317A, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3058, +0x4433,0x384C,0x4662,0x483E,0x4861, 0, 0, 0, +0x684F,0x6854,0x6856, 0,0x3971,0x6858,0x5775, 0, +0x447B, 0,0x685C, 0, 0,0x3269, 0, 0, + 0,0x6851, 0, 0,0x3C6D, 0, 0,0x3F42, +0x684D,0x5679, 0,0x4178,0x3271, 0, 0, 0, + 0, 0, 0, 0, 0,0x685F, 0,0x4A41, +0x6859, 0, 0, 0, 0,0x5524, 0,0x316A, +0x553B,0x684E,0x6850,0x3630,0x6853, 0,0x685D,0x4038, + 0,0x4A77, 0,0x4B28, 0, 0,0x465C,0x4075, + 0, 0, 0, 0, 0,0x6869, 0, 0, + 0,0x5023, 0, 0, 0, 0, 0, 0, + 0,0x6872,0x566A, 0, 0, 0, 0, 0, + 0, 0,0x6860,0x6861, 0, 0, 0,0x5179, +0x3A4B,0x3879, 0, 0,0x3871,0x5454,0x686F, 0, +0x686E,0x686C,0x3970,0x4C52,0x6866,0x4E26,0x3F72, 0, +0x3038,0x6871,0x6870, 0,0x5740, 0,0x6864, 0, +0x4D29,0x4923, 0,0x3B38,0x3D5B,0x686A, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6862,0x6863,0x6865,0x3535,0x6867,0x4745,0x686B,0x686D, +0x3D30,0x572E, 0,0x6878, 0, 0, 0, 0, + 0, 0, 0, 0,0x6875, 0,0x4D30,0x6876, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x413A, 0,0x6868, 0,0x4337,0x3070, 0, + 0, 0, 0, 0, 0, 0, 0,0x6874, + 0, 0, 0,0x6877, 0, 0, 0,0x3923, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x4952, 0, 0, 0,0x434E,0x4E60, +0x4066, 0, 0, 0, 0,0x4B73, 0,0x4C5D, +0x5035, 0, 0,0x4A61, 0,0x6873, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3C6C, 0,0x6879, 0, 0, 0, 0, 0, + 0,0x435E, 0,0x4665, 0,0x3977, 0, 0, + 0, 0,0x3074, 0, 0,0x5758, 0, 0, +0x3C2C, 0,0x456F, 0, 0, 0, 0, 0, +0x4C44, 0, 0,0x6926, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x492D, 0, +0x6922,0x4062, 0, 0, 0,0x3F43, 0, 0, + 0,0x687E,0x3957, 0,0x687B, 0, 0, 0, + 0,0x6924, 0, 0, 0,0x524E, 0, 0, + 0, 0, 0,0x6923, 0,0x5632,0x5735, 0, +0x6927, 0,0x3D37, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x687C, +0x687D, 0, 0, 0,0x6921, 0, 0, 0, + 0, 0, 0, 0, 0,0x4D56, 0, 0, +0x522C, 0, 0, 0,0x6932, 0, 0, 0, + 0,0x6929, 0, 0, 0,0x342A, 0,0x343B, + 0, 0,0x692B, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x5028, 0, 0,0x6925, + 0, 0,0x337E, 0, 0,0x692C,0x4063, 0, +0x692A, 0, 0,0x6939, 0, 0,0x6938, 0, + 0, 0, 0,0x692E, 0, 0,0x687A, 0, + 0,0x6928, 0, 0, 0, 0, 0,0x3F2C, +0x6931,0x693A, 0, 0,0x4225, 0, 0, 0, +0x692F, 0,0x3845, 0,0x692D, 0,0x535C,0x6934, +0x6935,0x6937, 0, 0, 0,0x6947, 0, 0, + 0, 0, 0, 0,0x4046,0x6945, 0, 0, +0x6930, 0, 0,0x693B,0x3071, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x693C, +0x5525, 0, 0,0x693E, 0,0x693F, 0, 0, + 0,0x6941, 0, 0,0x4171, 0, 0,0x4836, + 0, 0, 0,0x693D, 0, 0, 0, 0, + 0,0x6942, 0, 0, 0, 0, 0, 0, + 0, 0,0x6943, 0,0x6933, 0,0x6936, 0, +0x3B31, 0, 0, 0,0x6940, 0, 0, 0, + 0, 0, 0,0x3C77, 0, 0, 0,0x6944, +0x6946, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x694A, 0, 0, + 0, 0,0x694E, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x325B, 0,0x6948, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x372E, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x694B, +0x694C, 0, 0, 0, 0, 0, 0,0x5541, + 0,0x4423, 0, 0, 0, 0, 0, 0, +0x6958, 0,0x3A61, 0, 0, 0, 0,0x6949, + 0,0x5323, 0, 0, 0,0x6954, 0, 0, + 0, 0, 0, 0, 0,0x6957,0x6950, 0, + 0, 0, 0, 0,0x694F, 0, 0,0x4741, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6952, 0, 0, 0, 0, 0, 0, 0, +0x6959,0x3348, 0,0x6953, 0, 0, 0, 0, + 0,0x4F70, 0, 0, 0,0x694D, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x3377, 0, 0, 0, 0, 0, 0, + 0,0x6956, 0, 0,0x695A, 0, 0, 0, +0x4C34, 0, 0, 0,0x4F2D, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x6955, 0, +0x695C,0x695B, 0, 0, 0, 0, 0,0x695E, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6951, 0, 0, 0, 0, 0, 0, 0, + 0,0x695D, 0,0x695F,0x434A, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4737,0x344E,0x3B36,0x5040,0x6C23, 0, 0,0x4537, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x537B, 0, 0, 0, 0,0x6C24, + 0,0x6C25,0x465B, 0, 0, 0,0x3F6E, 0, + 0, 0, 0,0x6C26, 0, 0,0x6C27,0x502A, + 0,0x4738, 0, 0,0x3868, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6C28, 0, 0, 0, 0, 0, 0, + 0, 0,0x5639,0x557D,0x344B,0x323D,0x4E64,0x4667, + 0, 0,0x4D61, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x3475, 0,0x4B40,0x3C5F, 0, 0, 0, + 0,0x6962,0x6963,0x516A,0x6965, 0,0x3479,0x6964, + 0,0x5133,0x4A62,0x3250, 0,0x6968, 0, 0, + 0, 0,0x6966,0x6967, 0, 0,0x5633, 0, + 0, 0,0x6969,0x696A, 0, 0, 0, 0, + 0,0x696B, 0, 0, 0, 0, 0, 0, + 0, 0,0x696C, 0, 0, 0, 0, 0, + 0, 0, 0,0x6C2F,0x4539,0x364E, 0,0x5273, + 0, 0, 0, 0, 0, 0, 0,0x356E, + 0,0x3B59,0x6C31, 0, 0,0x5263, 0, 0, + 0, 0, 0,0x4E63, 0,0x4438, 0,0x433F, + 0, 0,0x363E,0x5839,0x3148,0x314F,0x3151,0x457E, + 0,0x3150, 0,0x432B, 0, 0, 0, 0, + 0,0x5531, 0, 0, 0, 0, 0, 0, + 0, 0,0x6B24,0x3A41, 0, 0, 0,0x4C3A, + 0, 0, 0,0x6B25, 0,0x6B27, 0, 0, + 0,0x6B28, 0, 0, 0,0x6B26, 0, 0, + 0, 0, 0, 0, 0,0x6B29,0x6B2B,0x6B2A, + 0, 0, 0, 0, 0,0x6B2C, 0,0x4A4F, +0x5835,0x4371, 0,0x4325,0x4678,0x6B2D,0x444A, 0, +0x6B2E,0x6B2F,0x6B30,0x3755, 0, 0, 0,0x377A, + 0,0x6B31,0x4762, 0,0x6B33, 0,0x3A24,0x5175, +0x3031,0x6B32,0x6B34, 0, 0, 0,0x352A,0x4248, +0x4768, 0,0x6B35, 0,0x4B2E,0x635F, 0, 0, +0x5340, 0, 0, 0, 0,0x595B, 0, 0, +0x4D21,0x562D,0x4773, 0, 0, 0,0x5960,0x3B63, + 0,0x3A3A,0x6362, 0, 0, 0, 0, 0, +0x4F2B, 0, 0, 0,0x6360,0x4947, 0,0x3A39, + 0, 0, 0,0x5134,0x6361,0x486A,0x392F,0x3D2D, +0x3358,0x4E5B, 0, 0,0x4C40, 0, 0, 0, +0x6368,0x6369,0x4D74, 0, 0, 0, 0, 0, +0x4C2D, 0,0x3C33, 0,0x636A, 0,0x636B, 0, + 0,0x505A, 0, 0, 0,0x467B,0x375A, 0, + 0,0x475F,0x524A,0x4E56, 0,0x6364,0x636C, 0, +0x4972,0x3341, 0, 0,0x6367, 0, 0,0x4663, +0x6365, 0, 0,0x6D33,0x6366, 0, 0, 0, + 0,0x4933, 0,0x4566, 0, 0, 0,0x3935, + 0,0x433B, 0,0x6363,0x453D,0x4124,0x4259,0x3257, + 0,0x636D,0x3B26,0x442D, 0,0x6370,0x3E5A, 0, + 0,0x637B,0x6375,0x3A53, 0, 0, 0, 0, +0x3750,0x534D, 0,0x564E,0x5553,0x3941,0x5534,0x5158, + 0, 0, 0, 0,0x5039,0x4776, 0, 0, + 0,0x482A,0x3234, 0,0x435A, 0, 0, 0, +0x636E, 0, 0,0x637C,0x636F,0x3728,0x6377,0x6374, + 0, 0, 0,0x373A, 0, 0,0x4522, 0, +0x6376,0x455D,0x3228,0x467C, 0,0x4460, 0, 0, +0x5722, 0,0x4061,0x6379, 0, 0,0x637A,0x637D, +0x4C29,0x6373, 0,0x533E, 0,0x3143,0x6D34,0x6371, +0x6372, 0,0x6378,0x503A,0x4643,0x5473,0x637E, 0, + 0,0x3D60, 0, 0,0x6427, 0, 0,0x6426, + 0, 0, 0,0x5173,0x6423, 0,0x6429, 0, + 0, 0,0x4877, 0, 0, 0, 0,0x4F34, + 0,0x6428,0x642E,0x4265, 0, 0,0x3634, 0, + 0, 0, 0, 0, 0,0x3D72, 0,0x6422, + 0, 0,0x3A69,0x642A, 0, 0,0x642C, 0, + 0,0x367D,0x565E,0x6432, 0,0x642D, 0, 0, + 0,0x6421, 0,0x3B6E,0x4D5D,0x4722,0x4549, 0, + 0,0x4177, 0,0x6424, 0,0x4733,0x3D2C,0x3D3D, +0x6425, 0,0x5747,0x3262, 0,0x642B,0x3C43,0x642F, + 0,0x3B6B,0x6430,0x4528,0x6431, 0, 0, 0, + 0,0x5563,0x3F23, 0,0x643A, 0,0x6437, 0, +0x643B, 0, 0,0x643D, 0, 0,0x4656, 0, + 0,0x3A46,0x404B, 0, 0, 0,0x3821,0x6434, + 0, 0, 0, 0,0x5421, 0, 0,0x3A23, +0x3D7E, 0, 0, 0,0x643C, 0, 0, 0, + 0, 0,0x4D3F, 0, 0,0x4479, 0, 0, +0x4F7B,0x4966, 0, 0,0x533F, 0,0x4F51, 0, + 0,0x6433, 0,0x6438,0x6439,0x4C69, 0, 0, + 0, 0, 0,0x4C4E, 0,0x4054,0x6435,0x4130, +0x6436,0x4E50, 0,0x3B41,0x3553, 0,0x4873,0x3D27, +0x5547,0x492C,0x3822,0x644A, 0, 0,0x644C,0x5144, + 0, 0,0x523A, 0, 0,0x3A2D, 0, 0, +0x3A54, 0, 0, 0, 0, 0, 0,0x6443, +0x356D, 0, 0, 0,0x574D,0x6440,0x4F7D,0x643F, + 0, 0, 0,0x415C,0x4C4A, 0, 0, 0, + 0,0x4A67, 0, 0, 0, 0,0x4457, 0, +0x4C54,0x6448, 0, 0, 0,0x6447,0x6441, 0, +0x6444,0x352D, 0, 0,0x5359, 0,0x6446, 0, + 0, 0, 0,0x5279,0x3463, 0,0x3B34, 0, + 0,0x496E, 0,0x343E, 0, 0, 0,0x3B6C, + 0,0x514D, 0,0x4C6D,0x6D35, 0, 0, 0, + 0, 0, 0, 0, 0,0x4765, 0, 0, + 0, 0,0x5428, 0,0x644B,0x5755,0x6442, 0, +0x3D25,0x6445, 0, 0,0x5366, 0,0x6449,0x4978, + 0, 0,0x643E, 0, 0,0x5365, 0, 0, +0x477E,0x3649, 0,0x547C,0x3233,0x6457, 0, 0, + 0,0x4E42, 0,0x644D, 0,0x4E3C, 0,0x385B, + 0, 0,0x6456, 0,0x3F4A, 0, 0, 0, +0x534E, 0,0x436C, 0, 0, 0, 0, 0, + 0, 0, 0,0x4548,0x6458, 0, 0, 0, + 0, 0, 0, 0, 0,0x4D44,0x644F, 0, + 0, 0, 0,0x6454,0x6455, 0,0x3A7E, 0, +0x4F66, 0, 0,0x553F, 0, 0, 0,0x6452, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x6450, 0, 0,0x644E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x4D65,0x4A2A, + 0, 0, 0,0x4023, 0,0x3D26,0x6453, 0, + 0,0x3848, 0, 0, 0, 0, 0,0x6467, +0x5434, 0, 0, 0, 0, 0, 0, 0, +0x645B, 0, 0, 0,0x416F, 0, 0,0x6469, + 0, 0,0x5267, 0, 0,0x645F, 0,0x6460, + 0, 0,0x4F2A, 0, 0, 0, 0,0x4B5D, + 0,0x645A,0x6451, 0,0x6465, 0,0x485C,0x6463, + 0, 0,0x4467,0x6462, 0,0x6461, 0, 0, + 0,0x337C,0x6468, 0, 0, 0, 0,0x3561, + 0, 0, 0,0x574C, 0, 0, 0,0x6466, + 0,0x3B2C, 0,0x5752,0x4C4F,0x6B78, 0,0x6464, + 0, 0,0x3976, 0, 0, 0,0x564D,0x6459, +0x645C,0x427A,0x645E, 0,0x424B,0x4044,0x4250, 0, +0x3175,0x4C32, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x354E, 0, 0, 0, + 0,0x646F, 0, 0, 0, 0, 0, 0, + 0, 0,0x462F, 0, 0, 0,0x4661, 0, + 0,0x6475, 0, 0, 0, 0, 0,0x4229, + 0, 0, 0,0x406C,0x515D,0x646E, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x442E, 0, 0, 0,0x646D, 0, 0, 0, + 0,0x6476,0x6474,0x427E, 0,0x645D, 0,0x6470, + 0,0x4A7E, 0,0x5544, 0, 0,0x6471, 0, + 0, 0, 0, 0, 0, 0,0x517A, 0, + 0, 0, 0, 0, 0, 0,0x646B,0x646C, + 0, 0, 0,0x6472, 0,0x4E2B, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x454B, 0, 0, 0,0x4731, 0,0x423A, 0, + 0, 0,0x646A, 0, 0, 0,0x414A, 0, + 0, 0, 0, 0, 0,0x4C36,0x3331, 0, + 0, 0,0x647B, 0,0x6473, 0, 0, 0, +0x647A, 0,0x647D, 0,0x647C, 0, 0, 0, + 0, 0, 0, 0,0x334E, 0, 0, 0, +0x333A,0x6477, 0, 0,0x6479,0x6478,0x456C, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x403D, 0, 0, 0, + 0,0x5468, 0, 0, 0, 0, 0,0x6522, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x3044, 0, 0,0x6524, 0, + 0,0x6523, 0, 0, 0, 0, 0, 0, +0x3C24, 0,0x6525, 0, 0, 0, 0, 0, + 0,0x6521, 0, 0, 0, 0, 0, 0, + 0,0x647E,0x3174, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x6528, 0, +0x6529,0x6526, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x6527,0x652A, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x4659, 0, 0, 0, 0, 0, 0, + 0, 0,0x652B,0x652D, 0, 0, 0, 0, + 0, 0, 0,0x652C, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x652F, 0, 0, + 0,0x652E, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x3960, 0, 0,0x6530, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x6531, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x3B70,0x6C61,0x4370, 0,0x3546, +0x3B52, 0, 0, 0, 0,0x4169,0x546E, 0, +0x3E44, 0, 0, 0,0x5746, 0,0x5456,0x3253, +0x6C3E, 0, 0, 0, 0,0x6A41, 0, 0, + 0,0x422F,0x3436, 0, 0, 0,0x5157, 0, + 0, 0,0x3334, 0,0x4832,0x3F3B,0x6C40, 0, + 0,0x564B, 0, 0,0x6C3F,0x6C41, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x6C45,0x3E66,0x4C3F,0x455A,0x3E3C, + 0,0x6C46, 0,0x317E, 0, 0, 0,0x6C44, +0x5528,0x3563, 0,0x6C42,0x4136,0x3363, 0, 0, +0x6C43,0x4B38,0x4043,0x4C7E, 0, 0, 0, 0, +0x4152, 0,0x6C48, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3A66,0x4053, 0,0x5672, 0, 0, 0,0x514C, + 0, 0, 0, 0,0x3F3E, 0,0x3733,0x4955, +0x6C47,0x3B62, 0,0x4C4C,0x3D7D,0x4848, 0,0x4F29, + 0, 0, 0, 0, 0, 0, 0,0x4D69, + 0,0x456B, 0, 0, 0,0x3769, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5149,0x3A38, 0, 0, 0, 0, 0, +0x6C49, 0, 0,0x6C4A, 0,0x3B40,0x6C4B, 0, +0x6C62,0x313A,0x3759, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x3D39, 0, + 0, 0, 0, 0, 0, 0, 0,0x6C4C, +0x5166,0x6C4D, 0, 0, 0, 0,0x483B, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x6C51, 0, 0, + 0, 0,0x6C53, 0,0x3B4D, 0,0x3C65, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x6C4F, 0,0x4937, 0, + 0, 0, 0, 0,0x433A, 0,0x6C63,0x5555, +0x6C50, 0, 0, 0, 0, 0,0x5673, 0, + 0, 0,0x6C52,0x6C4E, 0, 0, 0, 0, +0x6C54, 0,0x6C55, 0, 0,0x493F, 0, 0, + 0, 0, 0, 0,0x4F28, 0, 0, 0, + 0, 0,0x505C, 0, 0, 0, 0,0x512C, + 0, 0, 0, 0,0x485B, 0, 0, 0, +0x6C56,0x4E75, 0, 0, 0, 0, 0,0x4A6C, +0x6C5A, 0, 0, 0, 0, 0, 0, 0, +0x6C59, 0, 0, 0,0x303E, 0, 0, 0, + 0, 0, 0,0x6C57, 0,0x6C58, 0, 0, + 0,0x6C64, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x483C, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x4147, 0, + 0, 0, 0, 0,0x6C5C,0x5160, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6C5B, 0, 0, 0, 0,0x546F, 0,0x6C5D, + 0, 0, 0, 0, 0, 0,0x5B46, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6C5E, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x312C, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x6C5F, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6C60, 0,0x5726, 0,0x4540, 0, 0, 0, +0x6B3C,0x302E, 0, 0, 0,0x3E74,0x3838,0x522F, +0x3056,0x3579, 0,0x5833, 0,0x4B2C, 0,0x635D, + 0, 0, 0, 0, 0, 0, 0,0x462C, +0x3066, 0, 0, 0,0x4546,0x6B39, 0, 0, + 0, 0,0x6B3A, 0, 0, 0,0x6B3B, 0, + 0,0x5140, 0,0x4523, 0,0x6A72, 0,0x4432, + 0,0x4435,0x404E, 0, 0, 0,0x6A73,0x4441, + 0,0x4E6F, 0, 0, 0, 0,0x6A70,0x6A74, + 0, 0,0x497C, 0, 0,0x4723, 0, 0, + 0,0x4C58,0x4E7E, 0, 0, 0,0x6A75,0x6A76, +0x4F2C,0x4067, 0, 0,0x6A77, 0, 0, 0, + 0, 0,0x363F,0x6A78, 0,0x6A79, 0,0x6A7A, + 0, 0,0x6A7B, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x6A71, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x482E,0x616B, 0,0x3738, +0x616C, 0, 0, 0,0x616D, 0,0x5734,0x616E, +0x616F,0x534C, 0, 0, 0, 0, 0, 0, + 0,0x6171,0x3F71,0x6170,0x3552, 0, 0, 0, +0x3137, 0, 0, 0, 0,0x6173,0x6172, 0, +0x3A7C, 0,0x6174, 0, 0, 0, 0,0x3937, + 0,0x3E51, 0, 0, 0, 0,0x447C, 0, +0x3A5D,0x3D46, 0, 0, 0, 0, 0, 0, +0x6175,0x6177, 0, 0,0x3640,0x4F41,0x4A28,0x6176, +0x5578,0x537C,0x6178,0x617C,0x6179, 0, 0,0x617A, +0x406A, 0,0x617E,0x6221,0x4047, 0, 0, 0, + 0,0x617B, 0,0x617D, 0, 0, 0, 0, + 0, 0,0x6225, 0, 0, 0,0x4154, 0, + 0, 0, 0,0x6223, 0,0x6228,0x327E,0x6222, + 0, 0, 0,0x434D,0x3242,0x6227,0x6226, 0, + 0,0x6224,0x6229, 0, 0,0x622B, 0, 0, + 0,0x5049,0x566D,0x4328,0x622C, 0,0x4F57, 0, + 0,0x622E, 0, 0,0x3A6F, 0, 0,0x6960, +0x622D,0x622A, 0, 0, 0, 0,0x3B2B,0x5433, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x6230, 0, 0, +0x622F, 0,0x6961, 0, 0, 0, 0,0x6231, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6232, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x6233,0x4C21, 0,0x6234, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x6235, 0, + 0, 0, 0, 0,0x507E, 0, 0,0x424A, + 0,0x5371, 0,0x4D75, 0, 0,0x6760, 0, + 0,0x6761, 0, 0, 0, 0,0x3E41, 0, + 0, 0, 0,0x426A, 0, 0, 0,0x6764, + 0, 0,0x6763, 0, 0, 0, 0, 0, + 0,0x4D66, 0,0x4335, 0, 0,0x6762,0x3B37, +0x4F56, 0,0x4161,0x6769, 0, 0, 0,0x6768, + 0, 0,0x6774,0x3223, 0, 0, 0, 0, +0x676A, 0,0x6766, 0, 0, 0, 0, 0, +0x676C,0x676B,0x493A, 0, 0,0x5564, 0,0x6765, +0x3729,0x6767, 0, 0, 0, 0, 0, 0, + 0,0x676E, 0, 0, 0, 0,0x6773, 0, +0x5669, 0, 0, 0, 0,0x676D, 0,0x6772, + 0,0x6771, 0, 0, 0,0x3060, 0, 0, + 0, 0,0x6775, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x4772, 0,0x4045,0x406D, 0, + 0,0x4170,0x6770, 0, 0, 0, 0,0x6776, +0x4B76, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x6822,0x6821, 0, 0, 0, 0, + 0, 0,0x5741, 0, 0,0x677A,0x6779, 0, +0x677B, 0,0x6777, 0,0x677E, 0,0x677D, 0, +0x677C, 0, 0,0x4155,0x4759,0x457D,0x4543, 0, + 0, 0, 0, 0,0x476D, 0, 0, 0, + 0,0x6823, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x6826, 0,0x6825, + 0,0x6827,0x3A77,0x6778,0x6824, 0,0x4870,0x492A, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x6829, 0, 0, +0x3965, 0, 0, 0, 0, 0,0x517E,0x6828, + 0, 0, 0, 0, 0, 0,0x682A, 0, +0x682D,0x682E, 0,0x4127, 0, 0, 0,0x682F, + 0, 0, 0,0x6830, 0, 0,0x682C, 0, +0x6834, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x682B, 0,0x6831, 0, + 0, 0, 0, 0, 0, 0, 0,0x6835, +0x6832,0x6833, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x6837, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x6836, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x394F, 0,0x702C, 0, +0x702D, 0,0x4630,0x306A,0x483F, 0,0x4D5F, 0, + 0, 0, 0, 0, 0, 0,0x4E4D,0x6A31, + 0, 0, 0, 0,0x6A32, 0,0x463F,0x3449, + 0, 0, 0, 0, 0, 0, 0,0x6A33, + 0, 0, 0, 0,0x5567, 0, 0, 0, + 0, 0, 0, 0, 0,0x5D79, 0,0x6A34, + 0,0x6A35, 0,0x6A36, 0, 0, 0, 0, +0x384A,0x5F30,0x4975, 0,0x4C70, 0, 0,0x497A, + 0, 0, 0, 0, 0,0x497B, 0, 0, +0x5343,0x4B26, 0,0x3826,0x702E,0x3142, 0,0x6538, +0x4C6F,0x5349,0x3C57,0x496A, 0,0x3567, 0,0x4450, +0x3569, 0,0x6E2E,0x3B2D, 0, 0,0x675E, 0, +0x6E2F, 0, 0, 0, 0,0x3329, 0, 0, +0x6E32, 0, 0,0x6E31,0x3D67, 0,0x6E30,0x4E37, + 0, 0, 0, 0,0x454F, 0, 0, 0, + 0,0x4174,0x5B4E,0x6E33,0x5073, 0, 0, 0, + 0, 0, 0, 0, 0,0x4254,0x4668, 0, + 0, 0,0x372C, 0, 0, 0, 0, 0, + 0, 0,0x6E34, 0,0x336B, 0, 0, 0, +0x3B7B,0x6E35, 0, 0, 0, 0, 0,0x675C, + 0, 0, 0,0x6E36, 0, 0,0x3D2E, 0, + 0, 0, 0,0x7162, 0, 0, 0,0x4A68, + 0,0x5249,0x705A, 0,0x705B, 0,0x705C,0x4146, + 0,0x386D,0x3E4E, 0, 0,0x705E, 0,0x4531, +0x705D,0x5171, 0,0x7060,0x304C,0x3D6A, 0, 0, + 0, 0, 0,0x525F,0x705F, 0,0x342F,0x3768, +0x7066,0x7065,0x4623,0x7061,0x7062,0x3443, 0, 0, +0x7063,0x556E, 0, 0,0x4C5B,0x3E52,0x3C32, 0, + 0, 0,0x7068,0x7067,0x7064,0x3221, 0,0x5622, +0x5338,0x3E37,0x482C, 0, 0,0x706A, 0, 0, + 0, 0,0x5177, 0,0x564C,0x3A5B,0x7069, 0, +0x363B, 0, 0,0x4D34, 0, 0,0x4626, 0, + 0, 0,0x4121,0x706B,0x706E, 0,0x706D,0x7070, +0x706C, 0,0x3B3E,0x706F, 0, 0, 0, 0, +0x4C35,0x7072, 0, 0,0x3355, 0, 0, 0, + 0,0x3154, 0, 0,0x7073, 0, 0,0x7074, +0x7076,0x3461, 0,0x7071, 0,0x7077, 0, 0, + 0, 0,0x707A, 0,0x7078, 0, 0, 0, +0x7075, 0, 0, 0, 0,0x707D, 0,0x7079, +0x707C,0x707E, 0,0x7121, 0, 0, 0,0x4E41, +0x7124, 0,0x7123, 0,0x4176,0x707B,0x4A5D, 0, + 0,0x3471,0x3171,0x4C31, 0,0x7126, 0, 0, +0x7127, 0, 0,0x712C,0x554E,0x7129, 0, 0, +0x4833, 0, 0, 0,0x7122, 0,0x712B,0x7128, +0x7125, 0, 0,0x712A, 0, 0, 0, 0, + 0, 0, 0, 0,0x3029,0x712D, 0, 0, + 0, 0, 0, 0,0x712F, 0,0x7131, 0, + 0, 0, 0, 0,0x7130, 0,0x712E, 0, + 0, 0, 0,0x5122, 0, 0, 0, 0, + 0, 0, 0,0x7132, 0, 0, 0,0x7133, + 0, 0, 0, 0, 0, 0, 0, 0, +0x396F, 0, 0,0x3547, 0,0x3057,0x3059, 0, + 0, 0,0x546D, 0,0x3544, 0,0x3D54,0x3B4A, +0x7027, 0, 0,0x385E, 0, 0,0x7028, 0, + 0,0x3028, 0,0x7029, 0, 0,0x4D6E, 0, + 0,0x702A, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x702B, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x4624, 0, + 0,0x5665,0x7164, 0,0x7165, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x4373, + 0, 0,0x535B, 0, 0,0x5651,0x4568, 0, +0x532F, 0,0x5266, 0, 0,0x6E41,0x303B,0x5535, +0x514E,0x3C60,0x3A50, 0,0x3F78, 0,0x3847,0x3541, +0x454C, 0, 0,0x4A22, 0, 0, 0,0x434B, + 0, 0, 0, 0, 0,0x6E42, 0, 0, + 0, 0, 0, 0, 0, 0,0x443F,0x3622, + 0,0x6D6C,0x4324, 0,0x5631, 0, 0, 0, +0x4F60,0x6D6F, 0, 0,0x454E, 0,0x365C, 0, + 0,0x4A21, 0, 0,0x6D6D, 0, 0,0x6D70, +0x6D71,0x433C, 0,0x3F34, 0,0x6D6E, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6D74,0x6D72, 0, 0, 0, 0,0x5566, +0x435F, 0,0x6D73, 0, 0, 0,0x6D76, 0, +0x5523,0x5123, 0, 0, 0,0x6D75, 0,0x4350, + 0, 0, 0, 0, 0,0x6D77,0x3F74,0x3E6C, +0x6D78, 0,0x4C77, 0,0x515B, 0, 0, 0, +0x5745,0x5576, 0,0x6D7C, 0, 0, 0,0x6D7B, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6D79,0x6D7A, 0, 0, 0, 0, 0, 0, + 0, 0,0x6D7D,0x3E26, 0, 0, 0, 0, + 0,0x4B2F,0x6E21,0x363D, 0,0x6E22,0x4440, 0, +0x6D7E, 0, 0,0x3D5E,0x3247, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x3643, 0, 0, 0,0x6E25,0x583A,0x6E23, +0x6E26, 0, 0, 0,0x4369,0x3372, 0, 0, + 0, 0, 0, 0,0x6E27,0x6E24,0x4F39, 0, + 0,0x6E28,0x4277, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x6E29, +0x6E2A, 0,0x5E2B, 0, 0,0x4633, 0,0x4746, + 0,0x5675,0x3549, 0,0x4B32, 0, 0, 0, +0x6E2B, 0, 0,0x4D2B, 0,0x6E2C, 0, 0, + 0, 0, 0,0x5530, 0,0x6E2D, 0,0x7644, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x5B47, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3423, + 0, 0, 0,0x432C,0x7166, 0, 0, 0, + 0, 0,0x4A38,0x5253, 0,0x562A, 0,0x6F72, + 0,0x3E58, 0,0x3D43,0x6F73,0x364C,0x302B, 0, + 0, 0, 0,0x4A2F, 0, 0,0x6D36, 0, +0x6D37, 0, 0, 0, 0,0x4E79,0x372F,0x3F73, +0x6D38,0x426B,0x4930, 0, 0, 0, 0, 0, + 0,0x6D39, 0, 0,0x4676,0x3F33, 0, 0, + 0,0x6D3C,0x4578, 0,0x5150, 0,0x5729,0x6D3A, +0x6D3B, 0,0x5162, 0,0x6D3F,0x6D40, 0,0x6D44, + 0, 0, 0,0x6D48, 0,0x6D46,0x6D4E,0x5568, + 0,0x6D49, 0, 0,0x6D47,0x6D3E, 0, 0, +0x4569, 0, 0, 0,0x4646, 0, 0,0x4969, +0x5452,0x6D41,0x6D42,0x6D43,0x6D45, 0,0x4079, 0, +0x3421, 0, 0, 0, 0,0x3968, 0,0x6D50, + 0, 0, 0, 0,0x6D51, 0,0x6D4A, 0, +0x6D4F, 0,0x4E78, 0, 0,0x4B36,0x6D4C,0x6D4D, + 0, 0, 0, 0, 0,0x4F75, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x6D52,0x4172,0x5332,0x6D4B,0x4837, 0, + 0, 0, 0, 0, 0, 0, 0,0x3C6F, + 0, 0, 0, 0,0x4570, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x6D56, + 0,0x356F, 0, 0,0x4235,0x302D,0x4B69, 0, + 0,0x312E, 0,0x6D54, 0, 0, 0,0x4D6B, +0x3562, 0,0x6D55,0x6D53,0x6D57, 0, 0,0x357A, + 0,0x6D58, 0,0x6D59, 0,0x6D5C, 0,0x314C, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4576,0x3C6E,0x6D5A,0x4C3C,0x326A, 0, 0, 0, + 0,0x6D5B, 0, 0, 0, 0,0x446B, 0, + 0,0x3445, 0, 0, 0,0x3075, 0, 0, + 0,0x6D5F,0x405A,0x3468, 0, 0, 0, 0, +0x454D, 0, 0, 0,0x6D5D,0x3F44, 0, 0, + 0,0x6D5E, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4425, 0, 0, 0,0x6D60, 0, 0, 0, + 0, 0,0x6D61, 0,0x6D63, 0, 0,0x4157, + 0, 0,0x3B47, 0, 0, 0, 0, 0, + 0,0x3D38, 0, 0, 0,0x6D62, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x6D64, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x6D66, 0, + 0, 0, 0, 0,0x6D65, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x6D67, 0, 0, 0, + 0, 0,0x4A3E,0x6C6A,0x4071, 0,0x4967, 0, +0x6C6B,0x466E, 0, 0, 0, 0,0x6C6C, 0, +0x466D,0x6C6D, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x6C70, 0, 0,0x5766,0x6C73, + 0, 0,0x6C71,0x6C6E,0x6C6F,0x5723,0x4971,0x4B6E, +0x6C74, 0,0x6C72, 0, 0,0x4F69, 0,0x6C76, +0x4631, 0, 0, 0, 0,0x3C40, 0,0x6C75, + 0, 0, 0, 0, 0, 0, 0,0x353B, +0x3B76, 0,0x6C77, 0, 0, 0, 0, 0, +0x5977,0x3D7B, 0, 0,0x423B,0x6C78, 0, 0, + 0, 0,0x6C79, 0, 0, 0, 0,0x3823, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x6C7A, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x6C7B, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x6C7C, 0, 0, 0, 0, + 0,0x536D,0x582E,0x406B, 0,0x475D,0x3A4C, 0, +0x5063,0x4B3D, 0,0x4D3A, 0, 0,0x3851, 0, + 0,0x317C, 0,0x476F, 0,0x5656, 0, 0, + 0,0x3F46,0x436B, 0, 0,0x6F75, 0, 0, +0x4358, 0, 0, 0, 0, 0, 0,0x5762, + 0, 0, 0,0x6F77,0x3353, 0,0x4758,0x516D, + 0,0x5648, 0,0x6F78, 0,0x6F76, 0,0x3B7D, +0x3346, 0, 0, 0, 0, 0, 0, 0, +0x3D55, 0, 0,0x5246, 0,0x3B60, 0, 0, +0x4F21, 0,0x6F7C,0x6F7B, 0, 0,0x6F79, 0, + 0, 0, 0,0x334C, 0,0x4954,0x4B30, 0, + 0, 0, 0, 0,0x6F7E, 0, 0,0x305E, + 0, 0,0x5649, 0, 0, 0,0x6F7D, 0, +0x336D, 0, 0,0x7655, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x4E48, 0, 0, 0,0x7022, + 0,0x7021, 0,0x353E,0x3C5A,0x3B7C, 0,0x3865, + 0, 0, 0, 0, 0, 0,0x4442, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x7023, 0, 0, 0, 0, 0,0x4B6B, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7026, 0, 0, 0,0x5128, 0,0x3E3F,0x476E, +0x7136,0x7137,0x3F55, 0, 0, 0, 0,0x3429, +0x7138,0x4D3B, 0,0x4754,0x552D, 0,0x7139, 0, +0x713A, 0, 0, 0, 0,0x474F, 0, 0, + 0,0x5224,0x564F, 0, 0,0x713B,0x3D51,0x3430, +0x3E3D, 0, 0, 0,0x345C,0x4E51, 0,0x3F5F, +0x713D, 0, 0, 0, 0,0x3F7A,0x713C, 0, +0x713F, 0, 0, 0,0x713E,0x7140, 0, 0, + 0, 0, 0,0x7141, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x417E, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x4122, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x4A7A, 0, + 0,0x553E, 0, 0, 0, 0,0x3E3A,0x3E39, +0x5542, 0, 0,0x3F22, 0,0x4D2F,0x7135, 0, + 0, 0, 0, 0, 0,0x3D5F, 0,0x364B, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5671,0x7343, 0, 0,0x7344, 0,0x384D, + 0, 0, 0,0x7346,0x7347, 0,0x304A, 0, +0x7345, 0,0x7349,0x4B71, 0, 0, 0,0x734B, + 0,0x5026, 0, 0,0x314A,0x7348, 0, 0, + 0,0x734F, 0,0x3551, 0, 0,0x7357, 0, +0x7352, 0, 0, 0,0x7354,0x7353,0x377B, 0, +0x313F, 0,0x734E,0x734A,0x355A, 0,0x7350, 0, + 0,0x7351, 0,0x7355, 0, 0, 0, 0, +0x734D, 0,0x3C63, 0,0x417D, 0,0x7356, 0, + 0, 0, 0, 0, 0,0x735A, 0,0x734C, + 0,0x3548, 0,0x3D6E,0x735C, 0, 0,0x3724, +0x3F70,0x567E,0x4D32, 0,0x3470, 0,0x325F, 0, +0x7358, 0,0x7359,0x4938, 0,0x735D, 0, 0, +0x735E, 0,0x7361, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x735F, 0, + 0,0x7363,0x7362, 0, 0,0x735B, 0,0x3F6A, + 0,0x336F, 0,0x7360, 0, 0,0x4729, 0, +0x3C72, 0, 0, 0, 0,0x736B, 0, 0, + 0, 0, 0, 0, 0,0x393F, 0, 0, +0x7364, 0, 0, 0,0x322D,0x3B7E, 0,0x4B63, + 0, 0, 0, 0,0x736D,0x7369, 0, 0, + 0,0x395C,0x736E, 0, 0, 0,0x7365,0x7366, +0x736A,0x4261,0x736C,0x736F,0x7368,0x3C7D, 0, 0, + 0,0x4F64, 0, 0,0x7370, 0, 0, 0, +0x7367, 0, 0, 0, 0, 0, 0, 0, + 0,0x7372, 0, 0, 0, 0,0x572D,0x462A, + 0, 0, 0, 0,0x7373, 0, 0, 0, + 0,0x7371, 0,0x4228, 0, 0, 0, 0, + 0,0x385D,0x7375, 0, 0,0x7374, 0, 0, + 0,0x345B, 0, 0, 0,0x7376,0x7377, 0, + 0, 0,0x7378, 0, 0, 0,0x403A, 0, + 0,0x4069, 0, 0, 0, 0, 0,0x4571, + 0, 0, 0, 0,0x737B, 0,0x737A, 0, + 0, 0, 0, 0, 0, 0, 0,0x3458, + 0, 0, 0,0x737E,0x7379, 0, 0,0x737C, + 0, 0, 0, 0, 0, 0,0x737D, 0, + 0, 0, 0, 0, 0, 0, 0,0x7421, + 0, 0, 0, 0, 0, 0,0x7423,0x3B49, + 0, 0,0x7422, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7424, 0, 0, 0, 0, 0, 0,0x323E, +0x7426,0x7425, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x3C2E, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x4357,0x5961, 0, 0, 0, + 0, 0, 0,0x4060,0x744C,0x5751, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x375B, 0, 0, 0, 0, 0, 0, + 0,0x744E,0x4123, 0, 0,0x4649, 0,0x3456, +0x5533, 0, 0, 0,0x7450,0x744F,0x7451,0x4B5A, + 0, 0,0x7452, 0,0x5441,0x5660, 0, 0, + 0, 0,0x3760, 0, 0, 0,0x4138, 0, + 0,0x413B,0x7453,0x3E2C, 0, 0, 0, 0, + 0,0x3462, 0, 0,0x7454,0x7455,0x3E2B, 0, + 0,0x7456, 0, 0, 0,0x745B, 0,0x7457, +0x745A, 0,0x3A7D, 0,0x7458,0x7459, 0, 0, + 0, 0, 0, 0, 0,0x3862,0x4C47,0x745C, + 0,0x325A, 0, 0,0x4353, 0, 0,0x5463, +0x3F37, 0, 0, 0, 0, 0, 0, 0, +0x745D, 0, 0, 0, 0, 0, 0,0x4534, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7469, 0, 0,0x4F35, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x4E49, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4B58, 0,0x4B77, 0, 0, 0, 0,0x3D74, + 0, 0, 0,0x574F, 0, 0, 0,0x405B, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x5075, 0, + 0, 0, 0, 0, 0, 0, 0,0x746A, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x746B, 0, + 0, 0, 0, 0, 0, 0,0x746C, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x7763, 0, 0, 0, 0, + 0,0x3731, 0, 0, 0, 0, 0,0x746D, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x576B, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x746E, 0, 0, 0,0x6679, +0x3E40,0x667A,0x3A6C,0x667B,0x4F4B,0x667C,0x543C,0x3C36, +0x667D,0x667E,0x3C4D,0x4852,0x4E33,0x6721, 0,0x343F, +0x6722,0x4934,0x3859,0x4449, 0,0x575D,0x425A,0x3757, +0x563D,0x4E46,0x3744, 0, 0,0x4526,0x6723,0x4F5F, +0x6724,0x6725,0x6726,0x4137,0x5769,0x4970,0x4F38,0x562F, +0x5655,0x6727,0x306D,0x6728,0x6729,0x495C,0x526F,0x3E2D, +0x672A,0x3073,0x485E,0x3D61,0x672B,0x4846, 0,0x672C, +0x3B66,0x3878,0x5124,0x672D,0x4267,0x3E78,0x3D4A,0x4D33, +0x672E,0x672F,0x3E6E,0x5065, 0,0x4B67,0x4C50,0x3C4C, +0x6730,0x3C28,0x5077,0x6731, 0,0x5078,0x6732,0x6733, +0x3442,0x6734,0x6735,0x497E,0x4E2C,0x4360,0x6737,0x3141, +0x3371, 0,0x6738,0x6739,0x575B,0x5540,0x673A,0x424C, +0x573A,0x673B,0x673C,0x673D,0x3C6A,0x4365,0x4042,0x673E, +0x673F,0x3C29, 0,0x6740,0x6741,0x6736,0x3650,0x6742, + 0,0x6743,0x6744,0x3B3A,0x355E,0x4246,0x3160,0x6745, +0x5435,0x6746,0x383F,0x6748,0x6747,0x376C, 0,0x6749, +0x3278,0x674A,0x674B,0x674C,0x674D,0x674E,0x674F,0x6750, +0x5327,0x4B75,0x6751,0x6752,0x6753,0x6754,0x4949,0x6755, +0x6756,0x6757,0x6758,0x6759,0x3D49,0x675A,0x733E, 0, +0x3857, 0,0x4831, 0, 0, 0, 0, 0, + 0, 0,0x733F, 0,0x7340,0x7341, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x395E,0x4D78, 0, 0,0x5868,0x3A31, 0,0x425E, +0x6E37, 0,0x3723, 0, 0, 0, 0,0x6E39, + 0,0x6E38,0x3055, 0, 0, 0, 0, 0, +0x6E3B,0x5556,0x576F, 0, 0, 0,0x5643, 0, + 0,0x6E3D,0x4A70, 0,0x6E3C, 0, 0, 0, + 0,0x6E3E, 0, 0, 0, 0,0x6E40, 0, + 0,0x6E3F, 0, 0, 0, 0, 0, 0, + 0, 0,0x5172, 0,0x473C, 0,0x4340, 0, + 0, 0, 0, 0,0x3861, 0, 0, 0, + 0, 0,0x4167, 0, 0,0x7446,0x505F,0x7447, + 0,0x4F5B, 0, 0,0x483A, 0, 0,0x7448, + 0, 0, 0, 0, 0, 0, 0,0x7449, +0x744A, 0,0x744B, 0, 0, 0, 0, 0, +0x597A,0x387E, 0, 0,0x6571,0x5370, 0,0x7460, + 0,0x4E4C, 0, 0, 0,0x3361, 0, 0, + 0, 0,0x7134, 0,0x526E, 0,0x7461, 0, + 0, 0, 0, 0,0x4F68,0x7462, 0, 0, +0x474C, 0, 0, 0, 0, 0, 0,0x3554, +0x3464,0x7464, 0, 0, 0,0x7463,0x7465, 0, + 0,0x7466, 0, 0, 0, 0,0x7467, 0, +0x3A32,0x303F, 0,0x7468, 0, 0, 0, 0, + 0, 0, 0,0x372D,0x526D, 0, 0, 0, +0x522B,0x404F, 0,0x3F3C,0x6B23,0x555F,0x6A48, 0, + 0, 0, 0,0x7173,0x3678,0x4B23, 0, 0, +0x444D, 0,0x7167, 0,0x7168,0x387B,0x7169,0x3A44, +0x5445,0x3052, 0, 0,0x716A, 0, 0, 0, +0x716B, 0,0x716C, 0, 0,0x716D,0x716E,0x716F, +0x7171,0x7170,0x4555, 0, 0, 0, 0, 0, + 0,0x7172, 0,0x367A, 0,0x7174,0x522E,0x5E47, +0x4B4A, 0, 0,0x335C, 0,0x3522, 0,0x3922, + 0, 0,0x4474,0x7175, 0, 0,0x7176, 0, + 0, 0,0x4144,0x417B,0x5630,0x7177, 0, 0, + 0, 0,0x7178, 0,0x412A, 0, 0, 0, +0x4638, 0,0x3E5B, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x7179,0x344F, 0, 0, 0, 0, 0, + 0,0x717A, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x6D32, +0x6D31, 0, 0,0x4B60,0x525E, 0,0x4B41,0x5558, + 0,0x4862, 0,0x405F,0x3C21, 0, 0, 0, + 0, 0, 0,0x6B41, 0, 0,0x5024, 0, +0x5662, 0,0x3647,0x3858,0x6B40,0x384E, 0,0x6B3F, +0x3326,0x3949,0x562B, 0,0x3774,0x374A, 0, 0, + 0,0x3C67,0x373E,0x6B46, 0,0x6B47,0x3039,0x3F4F, + 0,0x6B45,0x537D, 0,0x6B48, 0, 0,0x6B49, + 0, 0,0x374E, 0,0x6B42,0x6B44,0x4976,0x5657, +0x554D,0x5032,0x6B4F,0x4E38,0x6B50, 0,0x3528, 0, + 0, 0, 0, 0,0x3133,0x6B52,0x4C25, 0, + 0, 0, 0, 0, 0, 0,0x4556,0x6B53, + 0,0x6B51,0x455F,0x6B4E,0x4A24,0x6B55,0x307B, 0, + 0,0x3A7A, 0, 0,0x5837,0x7163, 0,0x6B4A, +0x6B4B,0x6B4C,0x6B4D,0x6B56,0x6640,0x6B59, 0,0x3F68, +0x5248,0x6B57,0x6B5C,0x386C,0x6B58, 0,0x3D3A, 0, +0x5058, 0,0x3037, 0,0x6B5D,0x445C, 0, 0, + 0, 0,0x562C, 0, 0, 0,0x3460, 0, + 0,0x4276,0x3C39, 0, 0,0x6B5A,0x6B5B,0x5460, +0x466A,0x4454,0x6B5F,0x4527,0x5975, 0,0x3231, 0, +0x6B64, 0,0x3D45, 0, 0, 0,0x6B62, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x6B63, 0, 0,0x382C, + 0,0x4D51,0x6B65, 0, 0, 0,0x6B61, 0, +0x4133, 0, 0, 0, 0, 0,0x4622, 0, + 0, 0, 0, 0, 0, 0,0x4C73, 0, +0x6B66, 0,0x4030,0x5238,0x6B67, 0, 0, 0, +0x382F,0x382D, 0,0x6B68,0x473B,0x4D73, 0, 0, + 0,0x6B6A,0x6B6B, 0, 0, 0, 0, 0, +0x6B6D, 0, 0, 0, 0,0x5048, 0,0x6B72, + 0,0x6B6E, 0, 0, 0,0x6B71,0x4879, 0, +0x517C,0x6B6C, 0, 0,0x6B69, 0, 0, 0, + 0,0x3839,0x4F59,0x4465,0x6B6F,0x6B70,0x4C5A,0x4D48, +0x3072, 0,0x6B76, 0, 0, 0, 0, 0, +0x6B75, 0,0x3232, 0, 0, 0, 0,0x3860, + 0,0x6B77, 0, 0, 0, 0, 0, 0, +0x316C, 0, 0,0x4C45,0x4424,0x4F25, 0, 0, + 0, 0, 0,0x6B79, 0, 0,0x6C22, 0, +0x4572, 0,0x6B7A, 0, 0, 0, 0, 0, + 0, 0, 0,0x4945, 0, 0, 0, 0, + 0, 0,0x625F,0x6B7E, 0, 0, 0, 0, +0x4D4E,0x6C21,0x315B,0x5337, 0, 0,0x525C, 0, + 0, 0,0x6B7D, 0,0x6B7B, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x333C, 0, 0, 0,0x6A30, + 0, 0,0x5754, 0,0x742B,0x3374, 0, 0, + 0, 0, 0,0x5641,0x5642, 0, 0, 0, + 0, 0, 0,0x5569,0x3E4A, 0,0x7427, 0, +0x5228,0x7428,0x7429, 0,0x742A,0x3E4B,0x535F, 0, + 0, 0, 0, 0,0x4960,0x4961, 0, 0, +0x7342, 0,0x4A66, 0,0x4C72, 0, 0, 0, + 0, 0, 0,0x6236,0x4B34, 0,0x4E68,0x565B, + 0,0x742D,0x742E,0x742F, 0, 0, 0, 0, +0x7432, 0,0x3A3D,0x7433,0x3063,0x7430, 0,0x7431, +0x3D22,0x3255, 0,0x7436,0x7437,0x3666,0x3230,0x4F4F, +0x7434,0x342C, 0,0x7435, 0, 0,0x7438, 0, + 0, 0, 0, 0,0x7439, 0, 0,0x4D27, + 0,0x743A, 0,0x743B, 0, 0, 0,0x743C, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4B52, 0,0x743D, 0, 0, 0, 0,0x743E, + 0, 0, 0, 0, 0, 0, 0, 0, +0x743F, 0, 0, 0, 0, 0,0x745E,0x413C, +0x3C68, 0,0x492B,0x515E,0x6575, 0, 0, 0, + 0,0x5C33,0x5255, 0, 0,0x5C34,0x302C,0x5C35, + 0, 0,0x3D5A, 0,0x5C39, 0, 0, 0, +0x5842, 0,0x5C37,0x5373, 0,0x4956,0x5C3A,0x5C36, + 0,0x5C3B,0x4322, 0, 0, 0, 0,0x5C3C, +0x5C45,0x5C3D, 0, 0,0x4E5F,0x5625, 0,0x5C4F, + 0,0x5C4D, 0, 0,0x5C52,0x3D66,0x422B, 0, +0x5C38,0x5C4B,0x5C4E,0x5C3E,0x3752,0x3045,0x5C47,0x503E, +0x5C41,0x3B28, 0,0x373C,0x5C4C, 0, 0,0x5C46, +0x5C3F,0x475B, 0, 0, 0,0x513F,0x5C40, 0, + 0,0x5C4A, 0, 0,0x5C50, 0, 0,0x4E2D, +0x5C42, 0,0x5C43,0x5C48,0x5C49,0x3254,0x5C51,0x4B55, + 0,0x5437,0x5C5B,0x5C5F,0x4C26,0x5C66, 0,0x4367, +0x5C5C, 0, 0,0x3F41,0x5C59, 0,0x307A,0x3936, +0x5C65,0x5C53, 0,0x5C44,0x5C56,0x4874,0x3F60, 0, + 0, 0, 0,0x493B, 0, 0, 0,0x313D, + 0,0x5322, 0, 0,0x5C5A, 0, 0,0x5C55, + 0,0x463B, 0,0x5C5E, 0, 0, 0, 0, + 0,0x5742,0x432F,0x3736,0x4751,0x4329,0x5C62,0x5C58, +0x5C6B,0x5C54, 0, 0,0x5C5D, 0,0x3E25,0x5C57, + 0,0x5C60, 0, 0,0x5C63,0x5C64, 0,0x5C78, + 0, 0,0x5C61,0x5D22,0x5C67, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3C6B, +0x3444, 0, 0,0x4323,0x3267,0x5C7A, 0,0x5C72, + 0,0x5C6F, 0,0x5C7C,0x5C6E,0x5270,0x3268, 0, +0x4857,0x4863,0x5C7B, 0,0x5C6D, 0, 0, 0, +0x5C77, 0, 0,0x5C75, 0, 0,0x3E23,0x5C74, + 0,0x325D, 0, 0, 0, 0, 0,0x5C73, +0x3C76,0x5C68,0x3B44, 0,0x4073, 0, 0, 0, + 0, 0,0x3C54,0x5C69,0x5C6A, 0,0x5C71,0x5C76, +0x5C79,0x3534, 0,0x4859,0x3B67,0x5C7E,0x5C7D,0x532B, +0x5D21,0x5D23,0x5D25,0x5271,0x5D24,0x5D26,0x5D27,0x5229, + 0, 0, 0, 0, 0, 0, 0,0x3A49, +0x5D29, 0, 0,0x5D36,0x5D31,0x5D34, 0, 0, + 0, 0, 0, 0, 0,0x5D30,0x464E, 0, + 0,0x4072, 0, 0, 0, 0,0x492F, 0, + 0, 0,0x5C6C,0x5D2E, 0, 0, 0, 0, +0x5D37, 0, 0,0x5C70,0x5D2F, 0,0x5D38, 0, +0x5D2C, 0, 0, 0, 0, 0, 0, 0, +0x5D39,0x5D33,0x5D2D,0x442A, 0, 0, 0, 0, +0x5D28,0x4033,0x412B,0x5D2A,0x5D2B, 0,0x5D32,0x3B71, +0x5D35,0x5328,0x5D3A, 0,0x5D3B,0x4327, 0, 0, +0x5D52,0x5D3C, 0, 0, 0,0x5D51, 0,0x393D, + 0, 0,0x3E55, 0,0x3E7A, 0, 0,0x3A4A, + 0, 0, 0, 0,0x5D4A, 0,0x5D45, 0, +0x5D3F, 0, 0, 0,0x324B,0x5D43, 0,0x5D4B, +0x3224,0x5D55, 0, 0, 0,0x5D3E, 0, 0, + 0,0x4650,0x5D50, 0, 0, 0, 0, 0, +0x5D54,0x4162,0x3746, 0, 0, 0, 0, 0, +0x5D4E,0x5D4F, 0, 0, 0,0x5D44, 0, 0, + 0,0x5D3D, 0,0x5D4D,0x4C51, 0,0x5D49, 0, + 0, 0, 0,0x5D42,0x4348,0x463C,0x4E2E,0x5D4C, + 0,0x5D48, 0, 0, 0, 0, 0, 0, +0x5D41, 0, 0, 0,0x5D46,0x425C, 0, 0, + 0, 0, 0, 0,0x5329,0x532A,0x5D53,0x4F74, +0x4878, 0, 0, 0, 0, 0, 0, 0, + 0,0x5D66, 0, 0, 0, 0, 0, 0, +0x5D47, 0, 0, 0,0x5D60,0x4264, 0, 0, + 0, 0, 0, 0, 0, 0,0x5D61, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5D57, 0, 0, 0, 0, 0,0x5678, + 0,0x5D59,0x5D58,0x3870,0x5D56, 0, 0, 0, + 0,0x464F, 0,0x362D, 0, 0, 0, 0, + 0,0x5D62, 0,0x3A79,0x5461,0x5D67, 0, 0, + 0,0x3450, 0,0x5D5A, 0,0x3F7B,0x5D63, 0, +0x5D5F, 0,0x5D5D, 0, 0, 0, 0, 0, + 0, 0,0x3559, 0, 0, 0, 0,0x5D5B, +0x5D5C,0x5D5E, 0,0x3D2F,0x5D64, 0,0x5D65, 0, + 0, 0, 0, 0, 0, 0, 0,0x5D75, + 0,0x4349, 0, 0,0x4B62, 0, 0, 0, + 0,0x5D72, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x5861, + 0, 0,0x4651, 0,0x5D74, 0, 0, 0, +0x5574,0x5D73,0x5D70, 0, 0,0x5D6C, 0,0x5D6F, + 0,0x5D68, 0, 0,0x506E, 0, 0, 0, + 0,0x4858,0x5D6E, 0, 0,0x5D69, 0, 0, +0x5D6A,0x4B72, 0,0x5D6D, 0, 0,0x314D, 0, + 0, 0, 0, 0, 0,0x4036, 0,0x3C3B, +0x5D71, 0, 0,0x5D77, 0,0x5D76,0x5D6B, 0, + 0, 0, 0, 0,0x456E, 0, 0, 0, +0x5D7B, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x5E24, 0, 0,0x5E23, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x5D78, 0, 0, 0, + 0,0x436F, 0,0x427B, 0, 0, 0,0x5561, + 0, 0,0x4E35, 0, 0, 0, 0,0x5D7D, + 0,0x324C, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x4468,0x4A5F, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x473E, +0x5D7A,0x5D7C,0x5D7E,0x5E22,0x302A,0x314E, 0, 0, + 0, 0, 0,0x5E2C, 0, 0, 0, 0, +0x5E26,0x3D36,0x486F, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x5E21, 0, + 0,0x5E25, 0, 0, 0, 0,0x5E29, 0, + 0, 0, 0, 0,0x5E28, 0, 0, 0, +0x5E27, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x5E2D, 0,0x544C, 0, 0, 0, + 0,0x5E33,0x5E2A,0x5E2E, 0, 0,0x4059, 0, + 0, 0, 0, 0,0x3121,0x5E36, 0,0x5E31, + 0, 0, 0, 0, 0, 0, 0,0x5E32, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x5126,0x5E35, 0, 0, 0, + 0, 0, 0, 0,0x5E2F, 0, 0, 0, +0x5E30, 0,0x503D, 0, 0, 0,0x5E34,0x4A6D, +0x5E39, 0, 0, 0, 0, 0, 0,0x5E38, + 0,0x5E37, 0, 0, 0, 0, 0, 0, + 0,0x5E3B, 0, 0, 0, 0, 0, 0, + 0,0x3D65, 0, 0, 0, 0, 0,0x3258, +0x436A, 0, 0,0x5E3A, 0,0x453A, 0, 0, + 0, 0, 0, 0,0x5E3C, 0, 0, 0, + 0, 0, 0, 0,0x4C59, 0, 0, 0, + 0,0x372A, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x5465, 0, 0, 0,0x5E3D, + 0, 0, 0, 0, 0,0x5E3F, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x4422, 0, 0, 0, 0,0x5E41, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x5E3E, + 0,0x5E40, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x553A, 0, 0, 0,0x5E42, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x722E,0x3B22,0x4232, +0x4530,0x4247, 0, 0,0x722F, 0, 0, 0, + 0, 0,0x5069, 0, 0, 0,0x535D, 0, + 0, 0,0x6B3D, 0, 0, 0, 0, 0, + 0, 0, 0,0x3366,0x7230, 0,0x7231, 0, + 0,0x4A2D, 0, 0, 0, 0, 0, 0, + 0,0x3A67,0x7233,0x7235,0x7234,0x4B64,0x4F3A,0x7232, +0x4A34,0x524F,0x426C, 0, 0, 0, 0, 0, + 0, 0,0x4E43,0x7238,0x3076,0x7237, 0, 0, + 0, 0, 0,0x723E, 0,0x324F, 0, 0, + 0, 0, 0, 0,0x5141,0x723A, 0, 0, + 0, 0, 0,0x723C,0x5469, 0, 0,0x723B, +0x7236,0x723F,0x723D, 0,0x7239, 0, 0,0x7247, +0x7244,0x7246, 0, 0,0x724A,0x7242,0x7240, 0, + 0, 0,0x7245, 0, 0, 0, 0, 0, +0x567B, 0, 0, 0,0x7241, 0,0x4779,0x495F, + 0,0x7248,0x3946,0x3530, 0, 0,0x7243,0x7249, +0x7250,0x7256, 0, 0,0x3B57, 0, 0, 0, +0x7255,0x4D5C, 0,0x566B, 0, 0,0x7252,0x7254, + 0, 0, 0, 0,0x3872, 0, 0, 0, + 0,0x724B, 0, 0, 0,0x724E,0x4279, 0, +0x555D,0x724C,0x724D,0x724F,0x7253, 0, 0, 0, +0x7259,0x533C, 0, 0, 0, 0,0x366A, 0, +0x4A71, 0,0x3764,0x7257, 0, 0, 0,0x7258, +0x725A,0x725D,0x725B, 0, 0,0x725C, 0, 0, + 0, 0,0x5151,0x7251, 0,0x4D49, 0,0x4E4F, +0x5629, 0,0x7263, 0,0x435B, 0,0x7260, 0, + 0,0x402F,0x726C,0x725E, 0,0x7261, 0, 0, + 0,0x7268, 0, 0, 0, 0,0x7262, 0, + 0,0x7267, 0, 0,0x7266, 0, 0,0x7269, + 0, 0, 0,0x725F, 0, 0,0x7264,0x726A, + 0, 0, 0, 0, 0, 0, 0,0x532C, +0x7265,0x3275, 0, 0,0x7272, 0,0x502B, 0, + 0, 0, 0,0x7275, 0, 0, 0,0x3B48, + 0,0x7279, 0, 0, 0, 0, 0, 0, +0x7270, 0, 0,0x7276,0x7278,0x727A, 0, 0, + 0, 0, 0, 0, 0, 0,0x7273, 0, +0x7271, 0, 0, 0,0x3A7B, 0,0x357B, 0, + 0, 0, 0,0x726F,0x7277,0x726D,0x726E, 0, + 0, 0,0x726B,0x7326, 0,0x7323, 0, 0, +0x7322, 0, 0,0x7274, 0,0x485A, 0, 0, + 0, 0, 0,0x727B, 0, 0, 0,0x7325, + 0, 0, 0, 0, 0, 0, 0,0x4378, + 0, 0, 0, 0, 0, 0, 0, 0, +0x727D, 0, 0,0x7327,0x7329,0x7324, 0,0x727C, + 0, 0, 0,0x732B, 0,0x732A, 0, 0, + 0, 0,0x425D, 0, 0,0x732E, 0, 0, +0x7330, 0, 0, 0, 0, 0,0x7321, 0, + 0, 0,0x7331,0x732C, 0, 0, 0, 0, + 0,0x732F,0x727E,0x732D, 0, 0, 0, 0, + 0, 0, 0,0x7332, 0, 0, 0, 0, +0x7334, 0, 0, 0, 0,0x7328, 0, 0, + 0, 0,0x7333, 0, 0, 0,0x7335, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5037, 0, 0, 0, 0,0x7338, 0, + 0, 0, 0,0x5979, 0, 0, 0, 0, + 0, 0,0x7339, 0, 0, 0, 0, 0, + 0, 0, 0,0x7337, 0,0x4864,0x7336, 0, + 0, 0, 0,0x733A, 0, 0, 0, 0, + 0,0x733B,0x3440, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x6E43, 0, 0, 0, 0, 0, + 0,0x733C, 0, 0,0x733D, 0, 0, 0, +0x512A, 0, 0, 0,0x742C,0x5046, 0, 0, + 0, 0, 0, 0,0x5050,0x515C, 0, 0, + 0, 0, 0, 0,0x4F4E, 0, 0,0x3D56, + 0,0x5143, 0, 0, 0, 0, 0, 0, + 0,0x3A62,0x6169,0x5242,0x7142,0x3239, 0, 0, +0x316D,0x7143, 0,0x4940,0x3344, 0,0x5972, 0, +0x4B25, 0,0x7144, 0, 0, 0, 0,0x5654, + 0, 0, 0, 0, 0,0x7145,0x7440,0x7146, + 0,0x542C,0x7147, 0,0x3040,0x7441, 0, 0, +0x7442, 0, 0,0x347C, 0,0x455B, 0, 0, + 0, 0,0x4C3B, 0, 0, 0,0x5064, 0, + 0, 0, 0, 0,0x4D60, 0, 0, 0, + 0, 0,0x7148, 0,0x5973, 0, 0, 0, + 0, 0, 0,0x313B, 0,0x4F2E, 0, 0, + 0,0x3824, 0, 0, 0, 0, 0,0x714A, + 0, 0, 0, 0,0x714B, 0, 0, 0, + 0,0x3243,0x4151, 0, 0,0x5730,0x7149, 0, + 0,0x714C, 0, 0, 0, 0,0x714E, 0, + 0, 0,0x5976, 0,0x5261,0x5423, 0, 0, +0x7443,0x4839, 0, 0, 0, 0, 0,0x7444, + 0, 0,0x714D,0x714F,0x3F63,0x7150, 0, 0, +0x7154, 0, 0, 0, 0, 0, 0, 0, +0x7156,0x7151, 0,0x4951,0x4561, 0, 0, 0, +0x4263,0x397C, 0, 0,0x7153, 0,0x7155, 0, + 0, 0,0x3953, 0, 0, 0, 0, 0, + 0, 0,0x715B, 0, 0, 0, 0, 0, +0x3A56, 0,0x307D,0x7159, 0, 0, 0, 0, + 0,0x7158,0x7152,0x715A, 0, 0, 0, 0, + 0,0x7157, 0, 0, 0,0x486C, 0, 0, + 0, 0,0x4D4A,0x715D, 0, 0, 0, 0, +0x653D, 0, 0, 0,0x715C, 0,0x715E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x715F, 0, 0,0x4F65, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x7445,0x3D73, + 0, 0, 0, 0, 0, 0,0x7160, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x7161, 0, 0, 0,0x4E77, + 0,0x522A, 0,0x717B, 0, 0,0x3832, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x3C7B,0x395B, 0,0x3966,0x4359,0x4A53,0x6A68, +0x4040,0x3E75,0x6A69,0x6A6A,0x6A6B, 0,0x6A6C,0x6A6D, +0x6A6E,0x6A6F,0x3D47, 0, 0, 0,0x757B, 0, + 0, 0,0x757D, 0,0x757E, 0,0x757C, 0, + 0, 0, 0,0x3D62, 0,0x7621,0x3425, 0, + 0, 0, 0,0x7622, 0, 0, 0,0x7623, + 0, 0, 0,0x6C32, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5154, 0, 0, 0, 0, 0, 0,0x596A, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x7624, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6E3A, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5532, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x537E,0x4C5C, 0, 0, 0, 0, 0, + 0, 0, 0,0x4A44, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x6540, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x7625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x3E2F, 0, + 0, 0, 0, 0,0x4629, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5A25,0x3C46,0x3629,0x383C,0x484F,0x3C25,0x5A26,0x5A27, +0x4C56,0x4843,0x5A28,0x467D, 0,0x5135,0x5269,0x5136, +0x3C47, 0,0x3D32,0x3B64,0x5A29,0x5A2A,0x5148,0x5A2B, +0x506D,0x366F,0x425B, 0,0x4B4F,0x376D,0x4968,0x3743, +0x3E77,0x5624,0x5A2C,0x5A2D,0x4640,0x5767,0x4A36, 0, +0x5529,0x4B5F,0x556F,0x5A2E,0x565F,0x344A,0x5A30,0x5A2F, + 0,0x526B,0x5A31,0x5A32,0x5A33,0x4A54,0x5A34,0x4A2B, +0x5A35,0x5A36,0x334F,0x566F,0x5A37,0x3B30,0x352E,0x5A38, +0x5A39,0x396E,0x512F,0x5268,0x5A3A,0x3843,0x4F6A,0x326F, +0x5A3B,0x5A3C, 0,0x3D6B,0x4E5C,0x536F,0x5A3D,0x4E73, +0x5A3E,0x5355,0x3B65,0x5A3F,0x4B35,0x4B50,0x5A40,0x476B, +0x566E,0x5A41,0x4535,0x3641,0x5A42,0x374C,0x3F4E,0x5A43, +0x5A44,0x4B2D,0x5A45,0x3577,0x5A46,0x4142,0x573B,0x5A47, +0x4C38, 0,0x526A,0x4431,0x5A48,0x357D,0x3B51,0x5A49, +0x5033,0x5A4A,0x5A4B,0x4E3D,0x5A4C,0x5A4D,0x5A4E,0x3277, +0x5A51,0x5A4F,0x5168,0x5A50,0x4355,0x5A52, 0,0x5A53, +0x5A54,0x5A55,0x503B,0x5225,0x3079,0x5A56,0x472B,0x5A57, +0x3D77,0x4321,0x5A58,0x5A59,0x437D,0x4C37,0x5A5A,0x5A5B, +0x403E,0x4657,0x5A5C,0x5A5D,0x4734,0x5A5E,0x5A5F,0x3948, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x3B6D, 0, 0, 0, 0,0x3639,0x7478, + 0,0x7479, 0, 0,0x4D63, 0, 0, 0, + 0, 0, 0, 0, 0,0x7539, 0, 0, + 0, 0,0x6B60, 0, 0, 0, 0, 0, + 0,0x4F73,0x3B3F, 0, 0, 0, 0, 0, + 0, 0,0x3A40,0x5425, 0, 0, 0, 0, + 0, 0, 0,0x6159, 0, 0, 0, 0, +0x7574,0x312A,0x3272, 0, 0, 0, 0, 0, + 0, 0,0x7575, 0, 0,0x7577, 0, 0, + 0,0x3A51,0x7576, 0,0x4332, 0, 0, 0, + 0, 0, 0, 0,0x7579, 0, 0, 0, +0x7578, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x3134,0x556A,0x383A, + 0,0x3931,0x3246,0x5470,0x4F4D,0x305C,0x554B,0x3B75, +0x564A,0x3737,0x4C30,0x4636,0x3161,0x393A,0x567C,0x3961, +0x3721,0x3C7A,0x6A5A,0x6A5B,0x4C79,0x3973,0x6A5C,0x347B, +0x4333,0x3751,0x3A58,0x6A5D,0x5474,0x6A5E,0x3C56,0x3B5F, +0x6A5F,0x415E,0x4238,0x545F,0x574A,0x6A60,0x6A61,0x6A64, +0x6A62,0x6A63,0x495E,0x3833,0x3644,0x6A65,0x4A6A,0x494D, +0x344D, 0, 0,0x6259,0x4562,0x6A66,0x4035, 0, +0x5738,0x6A67,0x572C,0x487C,0x5853,0x584D,0x545E, 0, +0x5479,0x4944,0x532E,0x3853,0x3360, 0,0x4962,0x7476, + 0, 0, 0,0x3A55, 0,0x7477, 0, 0, +0x575F, 0, 0,0x7471,0x3830,0x5554,0x384F,0x4670, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x3343, 0, 0,0x7472,0x332C, 0, 0, + 0, 0,0x543D,0x4777, 0, 0, 0, 0, + 0,0x7474, 0, 0,0x7473, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x4C4B, + 0, 0, 0,0x4824, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x7475, 0,0x5763,0x453F,0x7540, 0, 0, +0x753B, 0,0x7543, 0,0x7542, 0,0x563A,0x7541, + 0, 0, 0,0x543E,0x7544, 0,0x754C, 0, + 0, 0, 0,0x304F,0x3578, 0,0x7549,0x754A, + 0,0x455C, 0, 0, 0, 0,0x7545,0x7546, + 0, 0,0x7547,0x754B, 0,0x3E60,0x7548,0x387A, + 0, 0, 0,0x7550,0x7553, 0, 0, 0, +0x3F67, 0,0x3972,0x753C,0x754D, 0, 0,0x4237, + 0, 0, 0,0x4C78, 0,0x3C79, 0,0x754E, +0x754F,0x7551,0x3665,0x7552, 0,0x7555, 0, 0, + 0, 0, 0, 0, 0,0x753D, 0, 0, + 0,0x7554,0x533B, 0,0x336C, 0, 0,0x4C24, + 0, 0, 0, 0,0x7556, 0, 0, 0, + 0, 0, 0, 0, 0,0x7557,0x3E61,0x7558, + 0, 0,0x4C5F,0x755B, 0, 0, 0, 0, + 0,0x3248,0x5759, 0,0x7559, 0,0x755A,0x755C, + 0,0x7562, 0, 0, 0,0x7560, 0, 0, + 0,0x755F,0x755D, 0, 0,0x7561, 0, 0, +0x755E,0x7564,0x7565, 0,0x4C63, 0, 0,0x653F, +0x3538,0x7563,0x7568,0x4C23, 0, 0, 0, 0, + 0,0x7566,0x7567, 0, 0, 0, 0, 0, + 0,0x753E, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x3144, 0, + 0,0x753F, 0, 0,0x3545,0x3264, 0,0x756C, +0x7569, 0,0x3657, 0,0x756D, 0,0x756A, 0, + 0, 0, 0, 0,0x756B, 0, 0,0x345A, + 0,0x546A, 0, 0, 0,0x756E, 0,0x3379, + 0, 0, 0, 0, 0, 0, 0,0x756F, +0x7571, 0, 0, 0,0x7570, 0, 0, 0, + 0, 0, 0, 0,0x7572, 0,0x7573, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x496D,0x392A, 0, 0,0x477B, + 0, 0,0x3663, 0, 0, 0, 0, 0, + 0, 0,0x4C49, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x6A26, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x3335,0x547E, +0x396C,0x5079, 0,0x696D,0x572A,0x696E,0x4256,0x486D, +0x3A64,0x696F,0x6970,0x6971,0x5661,0x6972,0x6973,0x6975, +0x6974,0x6976,0x6977,0x4761,0x6978,0x5458,0x6979,0x3D4E, + 0,0x697A,0x697B,0x3D4F,0x697C,0x3828,0x413E,0x697D, +0x3132,0x3B54,0x3975,0x697E, 0,0x6A21,0x6A22,0x6A23, +0x3778,0x3C2D, 0,0x4A64,0x604E,0x542F,0x4F3D,0x5537, +0x6A24,0x555E,0x6A25,0x5041,0x393C, 0,0x3447,0x3159, + 0, 0, 0,0x4031, 0, 0, 0, 0, +0x3166,0x3167, 0,0x3168, 0, 0, 0, 0, +0x333D,0x4868, 0, 0, 0, 0,0x6541, 0, + 0,0x315F, 0, 0, 0,0x4149,0x346F, 0, + 0,0x4728,0x5358, 0,0x4679,0x5138, 0,0x397D, +0x4275, 0, 0, 0, 0, 0,0x532D, 0, +0x544B,0x3D7C, 0,0x6542,0x3735,0x6543, 0, 0, +0x3B39,0x5562, 0,0x3D78,0x5436,0x4E25,0x412C,0x3359, + 0, 0,0x4C76, 0,0x6546,0x6544,0x6548, 0, +0x654A,0x6547,0x354F,0x4648, 0,0x357C,0x6545, 0, +0x4A76, 0, 0,0x6549, 0, 0, 0,0x4354, +0x3145,0x3C23, 0, 0, 0,0x5737, 0, 0, +0x4D4B,0x4B4D,0x4A4A,0x4C53,0x654C,0x654B,0x4466, 0, + 0,0x5121,0x5137,0x654D, 0,0x6550, 0,0x4D38, +0x5670,0x654F,0x355D, 0,0x4D3E, 0,0x6551,0x363A, + 0, 0,0x4D28,0x3964, 0,0x4A45,0x3351,0x4B59, +0x546C,0x6552,0x376A, 0, 0, 0,0x654E, 0, + 0, 0, 0, 0, 0,0x6555,0x347E,0x6556, + 0, 0, 0, 0, 0,0x6553,0x6554, 0, +0x525D, 0, 0,0x425F,0x3146, 0,0x5362, 0, + 0,0x365D,0x4B6C, 0,0x6557, 0, 0,0x5376, + 0, 0, 0, 0, 0,0x3169, 0,0x3674, +0x655A,0x6558,0x6559,0x3540, 0, 0, 0,0x5245, +0x655C, 0, 0,0x655E, 0, 0, 0, 0, + 0, 0,0x655D,0x4732, 0,0x5223, 0, 0, +0x655B, 0, 0, 0, 0,0x5462,0x555A, 0, + 0, 0, 0, 0,0x6560,0x5771, 0, 0, + 0, 0, 0, 0, 0,0x6561, 0,0x315C, +0x517B, 0,0x6562,0x6564, 0, 0, 0, 0, +0x6563, 0, 0,0x6565, 0, 0, 0, 0, + 0,0x5258, 0,0x354B, 0,0x675F, 0,0x5A75, + 0,0x5A78, 0,0x5A76, 0,0x5A77, 0, 0, + 0,0x5A7A,0x504F,0x4447, 0, 0,0x306E, 0, + 0, 0,0x5030, 0,0x5A79, 0,0x534A,0x3A2A, +0x5B22,0x4771, 0,0x5A7C,0x5A7B,0x495B,0x5A7D, 0, +0x5B21,0x575E,0x5A7E,0x415A, 0, 0,0x5B25, 0, + 0,0x5374, 0, 0,0x5B27,0x5B24, 0,0x5B28, + 0, 0,0x3D3C, 0, 0, 0,0x4049,0x5B23, +0x5B26,0x5623, 0,0x5B29, 0, 0, 0,0x5B2D, + 0, 0, 0,0x5B2E,0x5B2C,0x3A42, 0, 0, + 0,0x3F24,0x5B2B, 0, 0, 0,0x5B2A,0x5447, +0x323F, 0, 0,0x5B2F, 0,0x3979, 0,0x5B30, + 0, 0, 0, 0,0x333B, 0, 0, 0, +0x3526, 0, 0, 0, 0,0x363C,0x5B31, 0, + 0, 0,0x3675, 0,0x5B32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x3149, 0, 0, 0, 0,0x5B34, 0, + 0, 0,0x5B33,0x5B35, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x5B37, + 0,0x5B36, 0, 0, 0, 0, 0, 0, + 0,0x5B38, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x5B39, 0, 0,0x5B3A, 0, + 0,0x534F,0x747A,0x4775,0x5743,0x4564,0x747C,0x747D, +0x747B, 0,0x3E46, 0, 0, 0, 0,0x506F, + 0, 0,0x3753, 0, 0,0x544D,0x4C2A, 0, + 0,0x7522,0x7521,0x3A28,0x747E,0x4B56, 0, 0, + 0,0x7524,0x4052, 0,0x336A, 0,0x4D2A,0x7525, +0x7523,0x3D34,0x7528, 0,0x7529,0x3D4D,0x4338,0x3F61, +0x4B61,0x752A, 0, 0, 0,0x7526,0x7527,0x4470, + 0, 0, 0, 0, 0,0x752C, 0,0x343C, + 0,0x576D, 0,0x3457,0x752B,0x752E, 0, 0, +0x752D,0x752F,0x5051, 0, 0, 0, 0, 0, + 0, 0,0x4351,0x4829, 0, 0, 0, 0, + 0, 0,0x7530,0x7531, 0, 0, 0, 0, + 0, 0,0x7532, 0, 0,0x7533,0x7534,0x7535, + 0, 0, 0, 0,0x7537,0x7536, 0, 0, + 0, 0,0x7538, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x3249, + 0,0x5354,0x4A4D, 0,0x406F,0x5658,0x5230,0x413F, + 0,0x3D70, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x382A, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x3C78, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x7646, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x7647, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7648, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x7649, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x764A, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x764C, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x764B, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x7769, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x764D, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x764E, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x6E44,0x6E45,0x6E46, +0x556B,0x3624,0x6E48,0x6E47,0x6E49,0x6E4A,0x4725,0x6E4B, +0x6E4C, 0,0x3730,0x3576,0x6E4D,0x6E4F, 0,0x6E4E, + 0,0x3846,0x6E50,0x6E51,0x6E52,0x365B,0x332E,0x5653, +0x4446,0x3135,0x3856,0x6E53,0x6E54,0x543F,0x4755,0x3E7B, +0x4E59,0x3933,0x6E56,0x6E55,0x6E58,0x6E57,0x4525,0x6E59, +0x6E5A,0x472E,0x6E5B,0x472F,0x6E5C,0x3227,0x6E5D,0x6E5E, +0x6E5F,0x6E60,0x6E61,0x576A,0x6E62,0x6E63,0x3C58,0x6E64, +0x534B,0x4C7A,0x322C,0x4165,0x6E65,0x4726,0x432D, 0, +0x6E66,0x6E67,0x6E68,0x6E69,0x6E6A,0x6E6B,0x6E6C, 0, +0x6E6D,0x6E6E,0x6E6F, 0, 0,0x6E70,0x6E71,0x6E72, +0x6E74,0x6E73, 0,0x6E75,0x4D2D,0x4241,0x6E76,0x6E77, +0x6E78,0x5521,0x6E79,0x4F33,0x6E7A,0x6E7B, 0,0x6E7C, +0x6E7D,0x6F21,0x6E7E,0x6F22,0x3875,0x437A,0x6F23,0x6F24, +0x3D42,0x523F,0x3279,0x6F25,0x6F26,0x6F27,0x5278,0x6F28, +0x567D,0x6F29,0x464C, 0,0x6F2A,0x6F2B,0x4134,0x6F2C, +0x4F7A,0x4B78,0x6F2E,0x6F2D,0x337A,0x3978,0x6F2F,0x6F30, +0x5062,0x6F31,0x6F32,0x3766,0x503F,0x6F33,0x6F34,0x6F35, +0x4871,0x4C60,0x6F36,0x6F37,0x6F38,0x6F39,0x6F3A,0x5560, +0x6F3B,0x346D,0x432A,0x6F3C, 0,0x6F3D,0x6F3E,0x6F3F, + 0,0x4E7D,0x6F40,0x4260,0x3438,0x5736,0x3D75, 0, +0x4F47,0x6F43,0x6F41,0x6F42,0x6F44,0x3627,0x3C7C,0x3E62, +0x434C,0x6F45,0x6F46, 0,0x6F47,0x6F4F,0x6F48,0x6F49, +0x6F4A,0x4742,0x6F71,0x364D,0x6F4B, 0,0x6F4C,0x6F4D, +0x3646,0x433E,0x6F4E, 0,0x6F50,0x6F51,0x6F52,0x5572, + 0,0x6F53,0x4477, 0,0x6F54,0x4478,0x6F55,0x6F56, +0x3864,0x3077,0x6F57,0x6F58,0x6F59, 0,0x6F5A,0x6F5B, +0x6F5C,0x6F5D, 0,0x6F5E,0x3E35,0x6F61,0x6F5F,0x6F60, + 0,0x6F62,0x6F63,0x414D,0x6F64,0x6F65,0x6F66,0x6F67, +0x6F68,0x6F69,0x6F6A,0x6F6B,0x6F6C,0x4058, 0,0x6F6D, +0x412D,0x6F6E,0x6F6F,0x6F70, 0, 0,0x4F62, 0, + 0, 0, 0, 0, 0, 0, 0,0x3324, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4345,0x6345,0x4941,0x6346, 0,0x3155,0x4E4A,0x3433, +0x4872,0x6347,0x4F50,0x6348,0x3C64,0x6349,0x634A,0x4346, +0x5522,0x4456,0x396B,0x4E45,0x634B,0x4376,0x634C, 0, +0x3727,0x3873,0x3A52,0x634D,0x634E,0x5444,0x634F, 0, +0x6350,0x514B,0x6351,0x6352,0x6353,0x6354,0x5156,0x6355, +0x327B,0x403B,0x6356, 0,0x402B,0x6357,0x6358,0x6359, + 0,0x635A,0x635B, 0,0x3837,0x5A62, 0,0x3653, + 0,0x5A64,0x5A63, 0, 0, 0, 0, 0, + 0, 0,0x5A66, 0, 0, 0,0x486E, 0, + 0,0x5A65,0x3740,0x5174,0x5275,0x5573,0x3D57, 0, + 0, 0, 0,0x5768,0x5A68,0x5A67, 0,0x3022, +0x4D53, 0,0x5A69, 0,0x383D,0x3C4A,0x423D,0x4224, +0x3342,0x5A6A, 0,0x422A,0x4430,0x3D35, 0, 0, +0x4F5E, 0, 0, 0,0x5A6B,0x4942, 0, 0, + 0, 0, 0,0x315D, 0, 0, 0,0x5A6C, + 0,0x3638,0x543A, 0,0x337D, 0, 0,0x5A6D, +0x5449,0x4F55,0x4563, 0,0x5A6E, 0, 0, 0, + 0, 0,0x5A6F, 0,0x5A70,0x416A,0x4C55,0x4F5D, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x5367,0x4221, 0, +0x5A71, 0, 0,0x4B65, 0,0x5A72, 0,0x4B66, +0x527E, 0, 0, 0,0x3874, 0, 0,0x5A73, +0x302F,0x4F36, 0, 0,0x554F, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x4B6D, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5A74, 0, 0,0x6344, 0, 0,0x4125, 0, + 0,0x763F, 0, 0,0x7640,0x7641,0x4451, 0, +0x4838,0x5163, 0, 0,0x505B,0x5145,0x3C2F,0x394D, + 0,0x6F74, 0, 0,0x3446,0x533A,0x7642,0x337B, + 0, 0,0x7643, 0, 0,0x3571, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7645, 0, 0, 0, 0, 0, 0, 0, +0x536A,0x7627,0x5129, 0, 0, 0, 0,0x7629, + 0, 0, 0,0x7628, 0, 0,0x4163,0x4057, + 0,0x3122, 0, 0, 0, 0,0x4E6D, 0, +0x5068,0x762B, 0, 0,0x4F76, 0,0x762A,0x5570, +0x762C,0x4339, 0, 0, 0,0x3B74,0x762E,0x762D, + 0, 0, 0,0x445E, 0, 0,0x4158, 0, + 0, 0, 0, 0,0x4B2A, 0,0x4F3C, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x762F, 0, 0,0x7630, 0, 0, +0x7631, 0,0x4236, 0, 0, 0, 0, 0, +0x3054,0x4579, 0, 0, 0, 0,0x7632, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x4760,0x7626, 0, 0,0x3E38, 0, + 0,0x3E32, 0,0x3565, 0, 0,0x3747, 0, +0x3F3F,0x4352,0x4366, 0, 0,0x584C, 0, 0, + 0,0x386F, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x3D79,0x5125, 0,0x3050, 0, + 0, 0, 0, 0,0x7730, 0, 0, 0, + 0, 0, 0, 0, 0,0x7731, 0, 0, + 0, 0, 0,0x502C, 0,0x3030, 0, 0, + 0,0x7732,0x7733, 0,0x7734, 0, 0, 0, +0x474A, 0, 0, 0, 0, 0, 0, 0, +0x3E4F, 0, 0,0x7737, 0, 0, 0, 0, + 0, 0, 0,0x7736, 0,0x315E, 0,0x7735, + 0, 0,0x7738, 0,0x7739, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x4E24,0x484D, + 0,0x3A2B,0x6838,0x6839,0x683A,0x3E42, 0, 0, + 0, 0, 0,0x5274, 0,0x544F,0x4958, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x5233,0x3625,0x476A, +0x717C,0x4F6E,0x4B33,0x506B,0x676F,0x4D67,0x394B,0x3659, +0x717D,0x3064,0x4B4C,0x717E,0x5424,0x422D,0x416C,0x4644, +0x3E31,0x7221,0x3C55, 0,0x7222,0x7223, 0,0x7224, +0x5243,0x4635, 0,0x4D47,0x7225, 0,0x5331,0x3F45, +0x4C62, 0,0x7226,0x7227,0x5155,0x366E,0x7228,0x7229, +0x355F,0x722A,0x722B, 0,0x327C,0x722C,0x722D,0x4827, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x3767, 0, + 0,0x6C29,0x6C2A,0x6C2B, 0,0x6C2C, 0, 0, +0x462E,0x6C2D,0x6C2E, 0, 0, 0,0x3749,0x4A33, + 0, 0, 0, 0, 0, 0, 0,0x6238, +0x774F, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x7750, 0, 0, +0x324D, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x7751, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x7753,0x7752, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x623B, 0,0x3C22, 0,0x623C, +0x623D,0x623E,0x623F,0x6240,0x6241,0x3739,0x527B,0x3D24, +0x4A4E,0x3125,0x4B47, 0,0x6242,0x367C,0x4844,0x6243, + 0, 0,0x3D48, 0,0x317D,0x6244, 0,0x3676, +0x6245,0x4459, 0, 0,0x6246,0x4F5A,0x395D,0x6247, +0x4021, 0,0x6248,0x3276, 0,0x6249, 0,0x4173, +0x624A,0x624B,0x4278,0x624C,0x624D,0x624E,0x4A57,0x5838, +0x5965,0x4F63, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x7025, 0, 0, +0x5C30, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x426D,0x5426,0x4D54,0x5131, +0x335B,0x477D, 0,0x3235,0x423F,0x6660,0x4A3B,0x6661, +0x6662,0x3E54,0x6663,0x5724,0x4D55,0x6665,0x3C5D,0x6664, +0x6666,0x6667,0x426E, 0,0x3D3E,0x6668,0x4266,0x3A27, +0x6669, 0,0x666A,0x3352,0x5169, 0, 0,0x3F25, +0x666B,0x466F,0x666C,0x666D, 0, 0,0x666E,0x462D, +0x666F, 0,0x4927,0x6670,0x6671,0x6672,0x6539,0x6673, +0x6674,0x4262,0x6675,0x6676,0x5668,0x6677, 0,0x6678, +0x3947, 0, 0, 0, 0, 0, 0, 0, +0x773B,0x773A, 0, 0, 0, 0,0x773E,0x773C, +0x3A21, 0,0x773F, 0,0x7740, 0, 0, 0, +0x7742,0x7741,0x7744, 0, 0,0x7743, 0, 0, + 0, 0, 0,0x7745,0x7746, 0, 0, 0, + 0,0x7747, 0,0x4B68, 0, 0, 0, 0, +0x385F, 0, 0, 0, 0, 0, 0,0x7754, + 0,0x7755, 0, 0, 0, 0,0x7756, 0, + 0, 0, 0,0x7758, 0,0x775A, 0,0x7757, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x775B, 0,0x7759, 0, 0, 0, 0, + 0, 0, 0,0x5757, 0, 0, 0, 0, +0x775C, 0, 0, 0, 0, 0, 0,0x775D, + 0, 0, 0,0x775E, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x775F, + 0, 0, 0,0x7760, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x5B4B, + 0, 0,0x582A, 0, 0, 0, 0, 0, + 0, 0, 0,0x6577,0x396D, 0, 0, 0, + 0,0x3F7D,0x3B6A,0x7749,0x4647,0x7748, 0,0x774A, +0x774C,0x774B, 0, 0, 0,0x774D, 0,0x4E3A, + 0,0x774E, 0, 0,0x4427}; + +/* page 7 0x9C7C-0x9CE2 */ +static uint16 tab_uni_gb23127[]={ +0x5363, 0, 0,0x764F, 0,0x4233,0x7650, 0, + 0,0x7651,0x7652,0x7653,0x7654, 0, 0,0x7656, + 0,0x312B,0x7657, 0,0x7658,0x7659,0x765A, 0, +0x765B,0x765C, 0, 0, 0, 0,0x765D,0x765E, +0x4F4A, 0,0x765F,0x7660,0x7661,0x7662,0x7663,0x7664, +0x4070,0x7665,0x7666,0x7667,0x7668,0x7669, 0,0x766A, + 0,0x766B,0x766C, 0,0x766D,0x766E,0x766F,0x7670, +0x7671,0x7672,0x7673,0x7674,0x3E28, 0,0x7675,0x7676, +0x7677,0x7678, 0, 0, 0, 0, 0,0x487A, +0x7679,0x767A,0x767B,0x767C, 0, 0,0x767D,0x767E, +0x7721,0x7722,0x7723,0x7724,0x7725, 0, 0,0x7726, +0x7727,0x7728,0x316E,0x7729,0x772A,0x772B, 0, 0, +0x772C,0x772D,0x415B,0x772E, 0, 0,0x772F}; + +/* page 8 0x9E1F-0x9FA0 */ +static uint16 tab_uni_gb23128[]={ +0x4471,0x702F,0x3C26,0x7030,0x4379, 0,0x4538,0x513B, + 0,0x7031,0x7032,0x7033,0x7034,0x7035,0x513C, 0, +0x516C, 0,0x7037,0x7036,0x5427, 0,0x4D52,0x7038, +0x703A,0x7039,0x703B,0x703C, 0, 0,0x386B,0x703D, +0x3A68, 0,0x703E,0x703F,0x3E69,0x7040,0x366C,0x7041, +0x7042,0x7043,0x7044,0x4835,0x7045,0x7046, 0,0x7047, +0x4574, 0,0x7048, 0, 0, 0,0x7049, 0, +0x704A,0x773D, 0,0x704B,0x704C,0x704D, 0,0x704E, + 0, 0, 0, 0,0x704F,0x3A57, 0,0x7050, +0x7051,0x7052,0x7053,0x7054,0x7055,0x7056,0x7058, 0, + 0,0x5325,0x7057, 0,0x7059, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x753A, +0x4239, 0, 0,0x7764, 0, 0, 0, 0, +0x7765,0x7766, 0, 0,0x7767, 0, 0, 0, + 0, 0, 0,0x7768,0x4234, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x776A, 0, +0x776B, 0, 0, 0, 0, 0, 0,0x4273, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x7470, 0, 0, + 0,0x746F, 0, 0,0x4269, 0,0x7761,0x7762, + 0, 0, 0, 0, 0,0x3B46, 0, 0, + 0, 0,0x5964, 0, 0, 0,0x4A72,0x4068, +0x7024, 0,0x3A5A, 0, 0,0x472D, 0, 0, + 0,0x442C, 0, 0,0x776C,0x776D,0x776E, 0, +0x7770,0x776F, 0,0x7771, 0, 0,0x7774, 0, +0x7773, 0,0x7772,0x7775, 0, 0, 0, 0, +0x7776, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x6D69, 0,0x6D6A,0x6D6B, 0,0x763C, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x763D, 0,0x763E,0x3626, + 0,0x583E, 0, 0,0x3944, 0, 0, 0, +0x583B, 0,0x5C31, 0, 0, 0, 0, 0, + 0,0x4A73, 0,0x7777, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x7778, 0, 0, +0x7779, 0, 0, 0, 0, 0, 0, 0, +0x777B, 0,0x777A, 0,0x3147, 0,0x777C,0x777D, + 0, 0, 0, 0, 0,0x777E, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x466B,0x6C34, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x335D,0x7633, 0, 0,0x7634,0x4164,0x7635,0x7636, +0x7637,0x7638,0x7639,0x763A,0x4823,0x763B, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x417A,0x3928,0x6D68, 0, 0, 0, +0x396A,0x595F}; + +/* page 9 0xFF01-0xFFE5 */ +static uint16 tab_uni_gb23129[]={ +0x2321,0x2322,0x2323,0x2167,0x2325,0x2326,0x2327,0x2328, +0x2329,0x232A,0x232B,0x232C,0x232D,0x232E,0x232F,0x2330, +0x2331,0x2332,0x2333,0x2334,0x2335,0x2336,0x2337,0x2338, +0x2339,0x233A,0x233B,0x233C,0x233D,0x233E,0x233F,0x2340, +0x2341,0x2342,0x2343,0x2344,0x2345,0x2346,0x2347,0x2348, +0x2349,0x234A,0x234B,0x234C,0x234D,0x234E,0x234F,0x2350, +0x2351,0x2352,0x2353,0x2354,0x2355,0x2356,0x2357,0x2358, +0x2359,0x235A,0x235B,0x235C,0x235D,0x235E,0x235F,0x2360, +0x2361,0x2362,0x2363,0x2364,0x2365,0x2366,0x2367,0x2368, +0x2369,0x236A,0x236B,0x236C,0x236D,0x236E,0x236F,0x2370, +0x2371,0x2372,0x2373,0x2374,0x2375,0x2376,0x2377,0x2378, +0x2379,0x237A,0x237B,0x237C,0x237D,0x212B, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x2169, +0x216A, 0,0x237E, 0,0x2324}; + +static int func_uni_gb2312_onechar(int code){ + if ((code>=0x00A4)&&(code<=0x01DC)) + return(tab_uni_gb23120[code-0x00A4]); + if ((code>=0x02C7)&&(code<=0x0451)) + return(tab_uni_gb23121[code-0x02C7]); + if ((code>=0x2015)&&(code<=0x2312)) + return(tab_uni_gb23122[code-0x2015]); + if ((code>=0x2460)&&(code<=0x2642)) + return(tab_uni_gb23123[code-0x2460]); + if ((code>=0x3000)&&(code<=0x3129)) + return(tab_uni_gb23124[code-0x3000]); + if ((code>=0x3220)&&(code<=0x3229)) + return(tab_uni_gb23125[code-0x3220]); + if ((code>=0x4E00)&&(code<=0x9B54)) + return(tab_uni_gb23126[code-0x4E00]); + if ((code>=0x9C7C)&&(code<=0x9CE2)) + return(tab_uni_gb23127[code-0x9C7C]); + if ((code>=0x9E1F)&&(code<=0x9FA0)) + return(tab_uni_gb23128[code-0x9E1F]); + if ((code>=0xFF01)&&(code<=0xFFE5)) + return(tab_uni_gb23129[code-0xFF01]); + return(0); +} + + +int +my_wc_mb_gb2312(CHARSET_INFO *cs __attribute__((unused)), + my_wc_t wc, uchar *s, uchar *e) +{ + int code; + + if (wc<0x80) + { + s[0]=wc; + return 1; + } + + if (!(code=func_uni_gb2312_onechar(wc))) + return MY_CS_ILUNI; + + if(s+2>e) + return MY_CS_TOOSMALL; + + code|=0x8080; + s[0]=code>>8; + s[1]=code&0xFF; + return 2; +} + +int +my_mb_wc_gb2312(CHARSET_INFO *cs __attribute__((unused)), + my_wc_t *pwc, const uchar *s, const uchar *e){ + int hi; + + hi=s[0]; + + if(hi<0x80) + { + pwc[0]=hi; + return 1; + } + + if(s+2>e) + return MY_CS_TOOFEW(0); + + if(!(pwc[0]=func_gb2312_uni_onechar(((hi<<8)+s[1])&0x7F7F))) + return MY_CS_ILSEQ; + + return 2; +} + + #endif diff --git a/strings/ctype-gbk.c b/strings/ctype-gbk.c index 68ee90651d6..79e74b5f434 100644 --- a/strings/ctype-gbk.c +++ b/strings/ctype-gbk.c @@ -2720,4 +2720,7155 @@ int mbcharlen_gbk(CHARSET_INFO *cs __attribute__((unused)),uint c) return (isgbkhead(c)? 2:0); } +/* page 0 0x8140-0xFE4F */ +static uint16 tab_gbk_uni0[]={ +0x4E02,0x4E04,0x4E05,0x4E06,0x4E0F,0x4E12,0x4E17,0x4E1F, +0x4E20,0x4E21,0x4E23,0x4E26,0x4E29,0x4E2E,0x4E2F,0x4E31, +0x4E33,0x4E35,0x4E37,0x4E3C,0x4E40,0x4E41,0x4E42,0x4E44, +0x4E46,0x4E4A,0x4E51,0x4E55,0x4E57,0x4E5A,0x4E5B,0x4E62, +0x4E63,0x4E64,0x4E65,0x4E67,0x4E68,0x4E6A,0x4E6B,0x4E6C, +0x4E6D,0x4E6E,0x4E6F,0x4E72,0x4E74,0x4E75,0x4E76,0x4E77, +0x4E78,0x4E79,0x4E7A,0x4E7B,0x4E7C,0x4E7D,0x4E7F,0x4E80, +0x4E81,0x4E82,0x4E83,0x4E84,0x4E85,0x4E87,0x4E8A, 0, +0x4E90,0x4E96,0x4E97,0x4E99,0x4E9C,0x4E9D,0x4E9E,0x4EA3, +0x4EAA,0x4EAF,0x4EB0,0x4EB1,0x4EB4,0x4EB6,0x4EB7,0x4EB8, +0x4EB9,0x4EBC,0x4EBD,0x4EBE,0x4EC8,0x4ECC,0x4ECF,0x4ED0, +0x4ED2,0x4EDA,0x4EDB,0x4EDC,0x4EE0,0x4EE2,0x4EE6,0x4EE7, +0x4EE9,0x4EED,0x4EEE,0x4EEF,0x4EF1,0x4EF4,0x4EF8,0x4EF9, +0x4EFA,0x4EFC,0x4EFE,0x4F00,0x4F02,0x4F03,0x4F04,0x4F05, +0x4F06,0x4F07,0x4F08,0x4F0B,0x4F0C,0x4F12,0x4F13,0x4F14, +0x4F15,0x4F16,0x4F1C,0x4F1D,0x4F21,0x4F23,0x4F28,0x4F29, +0x4F2C,0x4F2D,0x4F2E,0x4F31,0x4F33,0x4F35,0x4F37,0x4F39, +0x4F3B,0x4F3E,0x4F3F,0x4F40,0x4F41,0x4F42,0x4F44,0x4F45, +0x4F47,0x4F48,0x4F49,0x4F4A,0x4F4B,0x4F4C,0x4F52,0x4F54, +0x4F56,0x4F61,0x4F62,0x4F66,0x4F68,0x4F6A,0x4F6B,0x4F6D, +0x4F6E,0x4F71,0x4F72,0x4F75,0x4F77,0x4F78,0x4F79,0x4F7A, +0x4F7D,0x4F80,0x4F81,0x4F82,0x4F85,0x4F86,0x4F87,0x4F8A, +0x4F8C,0x4F8E,0x4F90,0x4F92,0x4F93,0x4F95,0x4F96,0x4F98, +0x4F99,0x4F9A,0x4F9C,0x4F9E,0x4F9F,0x4FA1,0x4FA2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x4FA4,0x4FAB,0x4FAD,0x4FB0,0x4FB1,0x4FB2,0x4FB3,0x4FB4, +0x4FB6,0x4FB7,0x4FB8,0x4FB9,0x4FBA,0x4FBB,0x4FBC,0x4FBD, +0x4FBE,0x4FC0,0x4FC1,0x4FC2,0x4FC6,0x4FC7,0x4FC8,0x4FC9, +0x4FCB,0x4FCC,0x4FCD,0x4FD2,0x4FD3,0x4FD4,0x4FD5,0x4FD6, +0x4FD9,0x4FDB,0x4FE0,0x4FE2,0x4FE4,0x4FE5,0x4FE7,0x4FEB, +0x4FEC,0x4FF0,0x4FF2,0x4FF4,0x4FF5,0x4FF6,0x4FF7,0x4FF9, +0x4FFB,0x4FFC,0x4FFD,0x4FFF,0x5000,0x5001,0x5002,0x5003, +0x5004,0x5005,0x5006,0x5007,0x5008,0x5009,0x500A, 0, +0x500B,0x500E,0x5010,0x5011,0x5013,0x5015,0x5016,0x5017, +0x501B,0x501D,0x501E,0x5020,0x5022,0x5023,0x5024,0x5027, +0x502B,0x502F,0x5030,0x5031,0x5032,0x5033,0x5034,0x5035, +0x5036,0x5037,0x5038,0x5039,0x503B,0x503D,0x503F,0x5040, +0x5041,0x5042,0x5044,0x5045,0x5046,0x5049,0x504A,0x504B, +0x504D,0x5050,0x5051,0x5052,0x5053,0x5054,0x5056,0x5057, +0x5058,0x5059,0x505B,0x505D,0x505E,0x505F,0x5060,0x5061, +0x5062,0x5063,0x5064,0x5066,0x5067,0x5068,0x5069,0x506A, +0x506B,0x506D,0x506E,0x506F,0x5070,0x5071,0x5072,0x5073, +0x5074,0x5075,0x5078,0x5079,0x507A,0x507C,0x507D,0x5081, +0x5082,0x5083,0x5084,0x5086,0x5087,0x5089,0x508A,0x508B, +0x508C,0x508E,0x508F,0x5090,0x5091,0x5092,0x5093,0x5094, +0x5095,0x5096,0x5097,0x5098,0x5099,0x509A,0x509B,0x509C, +0x509D,0x509E,0x509F,0x50A0,0x50A1,0x50A2,0x50A4,0x50A6, +0x50AA,0x50AB,0x50AD,0x50AE,0x50AF,0x50B0,0x50B1,0x50B3, +0x50B4,0x50B5,0x50B6,0x50B7,0x50B8,0x50B9,0x50BC, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x50BD,0x50BE,0x50BF,0x50C0,0x50C1,0x50C2,0x50C3,0x50C4, +0x50C5,0x50C6,0x50C7,0x50C8,0x50C9,0x50CA,0x50CB,0x50CC, +0x50CD,0x50CE,0x50D0,0x50D1,0x50D2,0x50D3,0x50D4,0x50D5, +0x50D7,0x50D8,0x50D9,0x50DB,0x50DC,0x50DD,0x50DE,0x50DF, +0x50E0,0x50E1,0x50E2,0x50E3,0x50E4,0x50E5,0x50E8,0x50E9, +0x50EA,0x50EB,0x50EF,0x50F0,0x50F1,0x50F2,0x50F4,0x50F6, +0x50F7,0x50F8,0x50F9,0x50FA,0x50FC,0x50FD,0x50FE,0x50FF, +0x5100,0x5101,0x5102,0x5103,0x5104,0x5105,0x5108, 0, +0x5109,0x510A,0x510C,0x510D,0x510E,0x510F,0x5110,0x5111, +0x5113,0x5114,0x5115,0x5116,0x5117,0x5118,0x5119,0x511A, +0x511B,0x511C,0x511D,0x511E,0x511F,0x5120,0x5122,0x5123, +0x5124,0x5125,0x5126,0x5127,0x5128,0x5129,0x512A,0x512B, +0x512C,0x512D,0x512E,0x512F,0x5130,0x5131,0x5132,0x5133, +0x5134,0x5135,0x5136,0x5137,0x5138,0x5139,0x513A,0x513B, +0x513C,0x513D,0x513E,0x5142,0x5147,0x514A,0x514C,0x514E, +0x514F,0x5150,0x5152,0x5153,0x5157,0x5158,0x5159,0x515B, +0x515D,0x515E,0x515F,0x5160,0x5161,0x5163,0x5164,0x5166, +0x5167,0x5169,0x516A,0x516F,0x5172,0x517A,0x517E,0x517F, +0x5183,0x5184,0x5186,0x5187,0x518A,0x518B,0x518E,0x518F, +0x5190,0x5191,0x5193,0x5194,0x5198,0x519A,0x519D,0x519E, +0x519F,0x51A1,0x51A3,0x51A6,0x51A7,0x51A8,0x51A9,0x51AA, +0x51AD,0x51AE,0x51B4,0x51B8,0x51B9,0x51BA,0x51BE,0x51BF, +0x51C1,0x51C2,0x51C3,0x51C5,0x51C8,0x51CA,0x51CD,0x51CE, +0x51D0,0x51D2,0x51D3,0x51D4,0x51D5,0x51D6,0x51D7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x51D8,0x51D9,0x51DA,0x51DC,0x51DE,0x51DF,0x51E2,0x51E3, +0x51E5,0x51E6,0x51E7,0x51E8,0x51E9,0x51EA,0x51EC,0x51EE, +0x51F1,0x51F2,0x51F4,0x51F7,0x51FE,0x5204,0x5205,0x5209, +0x520B,0x520C,0x520F,0x5210,0x5213,0x5214,0x5215,0x521C, +0x521E,0x521F,0x5221,0x5222,0x5223,0x5225,0x5226,0x5227, +0x522A,0x522C,0x522F,0x5231,0x5232,0x5234,0x5235,0x523C, +0x523E,0x5244,0x5245,0x5246,0x5247,0x5248,0x5249,0x524B, +0x524E,0x524F,0x5252,0x5253,0x5255,0x5257,0x5258, 0, +0x5259,0x525A,0x525B,0x525D,0x525F,0x5260,0x5262,0x5263, +0x5264,0x5266,0x5268,0x526B,0x526C,0x526D,0x526E,0x5270, +0x5271,0x5273,0x5274,0x5275,0x5276,0x5277,0x5278,0x5279, +0x527A,0x527B,0x527C,0x527E,0x5280,0x5283,0x5284,0x5285, +0x5286,0x5287,0x5289,0x528A,0x528B,0x528C,0x528D,0x528E, +0x528F,0x5291,0x5292,0x5294,0x5295,0x5296,0x5297,0x5298, +0x5299,0x529A,0x529C,0x52A4,0x52A5,0x52A6,0x52A7,0x52AE, +0x52AF,0x52B0,0x52B4,0x52B5,0x52B6,0x52B7,0x52B8,0x52B9, +0x52BA,0x52BB,0x52BC,0x52BD,0x52C0,0x52C1,0x52C2,0x52C4, +0x52C5,0x52C6,0x52C8,0x52CA,0x52CC,0x52CD,0x52CE,0x52CF, +0x52D1,0x52D3,0x52D4,0x52D5,0x52D7,0x52D9,0x52DA,0x52DB, +0x52DC,0x52DD,0x52DE,0x52E0,0x52E1,0x52E2,0x52E3,0x52E5, +0x52E6,0x52E7,0x52E8,0x52E9,0x52EA,0x52EB,0x52EC,0x52ED, +0x52EE,0x52EF,0x52F1,0x52F2,0x52F3,0x52F4,0x52F5,0x52F6, +0x52F7,0x52F8,0x52FB,0x52FC,0x52FD,0x5301,0x5302,0x5303, +0x5304,0x5307,0x5309,0x530A,0x530B,0x530C,0x530E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5311,0x5312,0x5313,0x5314,0x5318,0x531B,0x531C,0x531E, +0x531F,0x5322,0x5324,0x5325,0x5327,0x5328,0x5329,0x532B, +0x532C,0x532D,0x532F,0x5330,0x5331,0x5332,0x5333,0x5334, +0x5335,0x5336,0x5337,0x5338,0x533C,0x533D,0x5340,0x5342, +0x5344,0x5346,0x534B,0x534C,0x534D,0x5350,0x5354,0x5358, +0x5359,0x535B,0x535D,0x5365,0x5368,0x536A,0x536C,0x536D, +0x5372,0x5376,0x5379,0x537B,0x537C,0x537D,0x537E,0x5380, +0x5381,0x5383,0x5387,0x5388,0x538A,0x538E,0x538F, 0, +0x5390,0x5391,0x5392,0x5393,0x5394,0x5396,0x5397,0x5399, +0x539B,0x539C,0x539E,0x53A0,0x53A1,0x53A4,0x53A7,0x53AA, +0x53AB,0x53AC,0x53AD,0x53AF,0x53B0,0x53B1,0x53B2,0x53B3, +0x53B4,0x53B5,0x53B7,0x53B8,0x53B9,0x53BA,0x53BC,0x53BD, +0x53BE,0x53C0,0x53C3,0x53C4,0x53C5,0x53C6,0x53C7,0x53CE, +0x53CF,0x53D0,0x53D2,0x53D3,0x53D5,0x53DA,0x53DC,0x53DD, +0x53DE,0x53E1,0x53E2,0x53E7,0x53F4,0x53FA,0x53FE,0x53FF, +0x5400,0x5402,0x5405,0x5407,0x540B,0x5414,0x5418,0x5419, +0x541A,0x541C,0x5422,0x5424,0x5425,0x542A,0x5430,0x5433, +0x5436,0x5437,0x543A,0x543D,0x543F,0x5441,0x5442,0x5444, +0x5445,0x5447,0x5449,0x544C,0x544D,0x544E,0x544F,0x5451, +0x545A,0x545D,0x545E,0x545F,0x5460,0x5461,0x5463,0x5465, +0x5467,0x5469,0x546A,0x546B,0x546C,0x546D,0x546E,0x546F, +0x5470,0x5474,0x5479,0x547A,0x547E,0x547F,0x5481,0x5483, +0x5485,0x5487,0x5488,0x5489,0x548A,0x548D,0x5491,0x5493, +0x5497,0x5498,0x549C,0x549E,0x549F,0x54A0,0x54A1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x54A2,0x54A5,0x54AE,0x54B0,0x54B2,0x54B5,0x54B6,0x54B7, +0x54B9,0x54BA,0x54BC,0x54BE,0x54C3,0x54C5,0x54CA,0x54CB, +0x54D6,0x54D8,0x54DB,0x54E0,0x54E1,0x54E2,0x54E3,0x54E4, +0x54EB,0x54EC,0x54EF,0x54F0,0x54F1,0x54F4,0x54F5,0x54F6, +0x54F7,0x54F8,0x54F9,0x54FB,0x54FE,0x5500,0x5502,0x5503, +0x5504,0x5505,0x5508,0x550A,0x550B,0x550C,0x550D,0x550E, +0x5512,0x5513,0x5515,0x5516,0x5517,0x5518,0x5519,0x551A, +0x551C,0x551D,0x551E,0x551F,0x5521,0x5525,0x5526, 0, +0x5528,0x5529,0x552B,0x552D,0x5532,0x5534,0x5535,0x5536, +0x5538,0x5539,0x553A,0x553B,0x553D,0x5540,0x5542,0x5545, +0x5547,0x5548,0x554B,0x554C,0x554D,0x554E,0x554F,0x5551, +0x5552,0x5553,0x5554,0x5557,0x5558,0x5559,0x555A,0x555B, +0x555D,0x555E,0x555F,0x5560,0x5562,0x5563,0x5568,0x5569, +0x556B,0x556F,0x5570,0x5571,0x5572,0x5573,0x5574,0x5579, +0x557A,0x557D,0x557F,0x5585,0x5586,0x558C,0x558D,0x558E, +0x5590,0x5592,0x5593,0x5595,0x5596,0x5597,0x559A,0x559B, +0x559E,0x55A0,0x55A1,0x55A2,0x55A3,0x55A4,0x55A5,0x55A6, +0x55A8,0x55A9,0x55AA,0x55AB,0x55AC,0x55AD,0x55AE,0x55AF, +0x55B0,0x55B2,0x55B4,0x55B6,0x55B8,0x55BA,0x55BC,0x55BF, +0x55C0,0x55C1,0x55C2,0x55C3,0x55C6,0x55C7,0x55C8,0x55CA, +0x55CB,0x55CE,0x55CF,0x55D0,0x55D5,0x55D7,0x55D8,0x55D9, +0x55DA,0x55DB,0x55DE,0x55E0,0x55E2,0x55E7,0x55E9,0x55ED, +0x55EE,0x55F0,0x55F1,0x55F4,0x55F6,0x55F8,0x55F9,0x55FA, +0x55FB,0x55FC,0x55FF,0x5602,0x5603,0x5604,0x5605, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5606,0x5607,0x560A,0x560B,0x560D,0x5610,0x5611,0x5612, +0x5613,0x5614,0x5615,0x5616,0x5617,0x5619,0x561A,0x561C, +0x561D,0x5620,0x5621,0x5622,0x5625,0x5626,0x5628,0x5629, +0x562A,0x562B,0x562E,0x562F,0x5630,0x5633,0x5635,0x5637, +0x5638,0x563A,0x563C,0x563D,0x563E,0x5640,0x5641,0x5642, +0x5643,0x5644,0x5645,0x5646,0x5647,0x5648,0x5649,0x564A, +0x564B,0x564F,0x5650,0x5651,0x5652,0x5653,0x5655,0x5656, +0x565A,0x565B,0x565D,0x565E,0x565F,0x5660,0x5661, 0, +0x5663,0x5665,0x5666,0x5667,0x566D,0x566E,0x566F,0x5670, +0x5672,0x5673,0x5674,0x5675,0x5677,0x5678,0x5679,0x567A, +0x567D,0x567E,0x567F,0x5680,0x5681,0x5682,0x5683,0x5684, +0x5687,0x5688,0x5689,0x568A,0x568B,0x568C,0x568D,0x5690, +0x5691,0x5692,0x5694,0x5695,0x5696,0x5697,0x5698,0x5699, +0x569A,0x569B,0x569C,0x569D,0x569E,0x569F,0x56A0,0x56A1, +0x56A2,0x56A4,0x56A5,0x56A6,0x56A7,0x56A8,0x56A9,0x56AA, +0x56AB,0x56AC,0x56AD,0x56AE,0x56B0,0x56B1,0x56B2,0x56B3, +0x56B4,0x56B5,0x56B6,0x56B8,0x56B9,0x56BA,0x56BB,0x56BD, +0x56BE,0x56BF,0x56C0,0x56C1,0x56C2,0x56C3,0x56C4,0x56C5, +0x56C6,0x56C7,0x56C8,0x56C9,0x56CB,0x56CC,0x56CD,0x56CE, +0x56CF,0x56D0,0x56D1,0x56D2,0x56D3,0x56D5,0x56D6,0x56D8, +0x56D9,0x56DC,0x56E3,0x56E5,0x56E6,0x56E7,0x56E8,0x56E9, +0x56EA,0x56EC,0x56EE,0x56EF,0x56F2,0x56F3,0x56F6,0x56F7, +0x56F8,0x56FB,0x56FC,0x5700,0x5701,0x5702,0x5705,0x5707, +0x570B,0x570C,0x570D,0x570E,0x570F,0x5710,0x5711, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5712,0x5713,0x5714,0x5715,0x5716,0x5717,0x5718,0x5719, +0x571A,0x571B,0x571D,0x571E,0x5720,0x5721,0x5722,0x5724, +0x5725,0x5726,0x5727,0x572B,0x5731,0x5732,0x5734,0x5735, +0x5736,0x5737,0x5738,0x573C,0x573D,0x573F,0x5741,0x5743, +0x5744,0x5745,0x5746,0x5748,0x5749,0x574B,0x5752,0x5753, +0x5754,0x5755,0x5756,0x5758,0x5759,0x5762,0x5763,0x5765, +0x5767,0x576C,0x576E,0x5770,0x5771,0x5772,0x5774,0x5775, +0x5778,0x5779,0x577A,0x577D,0x577E,0x577F,0x5780, 0, +0x5781,0x5787,0x5788,0x5789,0x578A,0x578D,0x578E,0x578F, +0x5790,0x5791,0x5794,0x5795,0x5796,0x5797,0x5798,0x5799, +0x579A,0x579C,0x579D,0x579E,0x579F,0x57A5,0x57A8,0x57AA, +0x57AC,0x57AF,0x57B0,0x57B1,0x57B3,0x57B5,0x57B6,0x57B7, +0x57B9,0x57BA,0x57BB,0x57BC,0x57BD,0x57BE,0x57BF,0x57C0, +0x57C1,0x57C4,0x57C5,0x57C6,0x57C7,0x57C8,0x57C9,0x57CA, +0x57CC,0x57CD,0x57D0,0x57D1,0x57D3,0x57D6,0x57D7,0x57DB, +0x57DC,0x57DE,0x57E1,0x57E2,0x57E3,0x57E5,0x57E6,0x57E7, +0x57E8,0x57E9,0x57EA,0x57EB,0x57EC,0x57EE,0x57F0,0x57F1, +0x57F2,0x57F3,0x57F5,0x57F6,0x57F7,0x57FB,0x57FC,0x57FE, +0x57FF,0x5801,0x5803,0x5804,0x5805,0x5808,0x5809,0x580A, +0x580C,0x580E,0x580F,0x5810,0x5812,0x5813,0x5814,0x5816, +0x5817,0x5818,0x581A,0x581B,0x581C,0x581D,0x581F,0x5822, +0x5823,0x5825,0x5826,0x5827,0x5828,0x5829,0x582B,0x582C, +0x582D,0x582E,0x582F,0x5831,0x5832,0x5833,0x5834,0x5836, +0x5837,0x5838,0x5839,0x583A,0x583B,0x583C,0x583D, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x583E,0x583F,0x5840,0x5841,0x5842,0x5843,0x5845,0x5846, +0x5847,0x5848,0x5849,0x584A,0x584B,0x584E,0x584F,0x5850, +0x5852,0x5853,0x5855,0x5856,0x5857,0x5859,0x585A,0x585B, +0x585C,0x585D,0x585F,0x5860,0x5861,0x5862,0x5863,0x5864, +0x5866,0x5867,0x5868,0x5869,0x586A,0x586D,0x586E,0x586F, +0x5870,0x5871,0x5872,0x5873,0x5874,0x5875,0x5876,0x5877, +0x5878,0x5879,0x587A,0x587B,0x587C,0x587D,0x587F,0x5882, +0x5884,0x5886,0x5887,0x5888,0x588A,0x588B,0x588C, 0, +0x588D,0x588E,0x588F,0x5890,0x5891,0x5894,0x5895,0x5896, +0x5897,0x5898,0x589B,0x589C,0x589D,0x58A0,0x58A1,0x58A2, +0x58A3,0x58A4,0x58A5,0x58A6,0x58A7,0x58AA,0x58AB,0x58AC, +0x58AD,0x58AE,0x58AF,0x58B0,0x58B1,0x58B2,0x58B3,0x58B4, +0x58B5,0x58B6,0x58B7,0x58B8,0x58B9,0x58BA,0x58BB,0x58BD, +0x58BE,0x58BF,0x58C0,0x58C2,0x58C3,0x58C4,0x58C6,0x58C7, +0x58C8,0x58C9,0x58CA,0x58CB,0x58CC,0x58CD,0x58CE,0x58CF, +0x58D0,0x58D2,0x58D3,0x58D4,0x58D6,0x58D7,0x58D8,0x58D9, +0x58DA,0x58DB,0x58DC,0x58DD,0x58DE,0x58DF,0x58E0,0x58E1, +0x58E2,0x58E3,0x58E5,0x58E6,0x58E7,0x58E8,0x58E9,0x58EA, +0x58ED,0x58EF,0x58F1,0x58F2,0x58F4,0x58F5,0x58F7,0x58F8, +0x58FA,0x58FB,0x58FC,0x58FD,0x58FE,0x58FF,0x5900,0x5901, +0x5903,0x5905,0x5906,0x5908,0x5909,0x590A,0x590B,0x590C, +0x590E,0x5910,0x5911,0x5912,0x5913,0x5917,0x5918,0x591B, +0x591D,0x591E,0x5920,0x5921,0x5922,0x5923,0x5926,0x5928, +0x592C,0x5930,0x5932,0x5933,0x5935,0x5936,0x593B, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x593D,0x593E,0x593F,0x5940,0x5943,0x5945,0x5946,0x594A, +0x594C,0x594D,0x5950,0x5952,0x5953,0x5959,0x595B,0x595C, +0x595D,0x595E,0x595F,0x5961,0x5963,0x5964,0x5966,0x5967, +0x5968,0x5969,0x596A,0x596B,0x596C,0x596D,0x596E,0x596F, +0x5970,0x5971,0x5972,0x5975,0x5977,0x597A,0x597B,0x597C, +0x597E,0x597F,0x5980,0x5985,0x5989,0x598B,0x598C,0x598E, +0x598F,0x5990,0x5991,0x5994,0x5995,0x5998,0x599A,0x599B, +0x599C,0x599D,0x599F,0x59A0,0x59A1,0x59A2,0x59A6, 0, +0x59A7,0x59AC,0x59AD,0x59B0,0x59B1,0x59B3,0x59B4,0x59B5, +0x59B6,0x59B7,0x59B8,0x59BA,0x59BC,0x59BD,0x59BF,0x59C0, +0x59C1,0x59C2,0x59C3,0x59C4,0x59C5,0x59C7,0x59C8,0x59C9, +0x59CC,0x59CD,0x59CE,0x59CF,0x59D5,0x59D6,0x59D9,0x59DB, +0x59DE,0x59DF,0x59E0,0x59E1,0x59E2,0x59E4,0x59E6,0x59E7, +0x59E9,0x59EA,0x59EB,0x59ED,0x59EE,0x59EF,0x59F0,0x59F1, +0x59F2,0x59F3,0x59F4,0x59F5,0x59F6,0x59F7,0x59F8,0x59FA, +0x59FC,0x59FD,0x59FE,0x5A00,0x5A02,0x5A0A,0x5A0B,0x5A0D, +0x5A0E,0x5A0F,0x5A10,0x5A12,0x5A14,0x5A15,0x5A16,0x5A17, +0x5A19,0x5A1A,0x5A1B,0x5A1D,0x5A1E,0x5A21,0x5A22,0x5A24, +0x5A26,0x5A27,0x5A28,0x5A2A,0x5A2B,0x5A2C,0x5A2D,0x5A2E, +0x5A2F,0x5A30,0x5A33,0x5A35,0x5A37,0x5A38,0x5A39,0x5A3A, +0x5A3B,0x5A3D,0x5A3E,0x5A3F,0x5A41,0x5A42,0x5A43,0x5A44, +0x5A45,0x5A47,0x5A48,0x5A4B,0x5A4C,0x5A4D,0x5A4E,0x5A4F, +0x5A50,0x5A51,0x5A52,0x5A53,0x5A54,0x5A56,0x5A57,0x5A58, +0x5A59,0x5A5B,0x5A5C,0x5A5D,0x5A5E,0x5A5F,0x5A60, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5A61,0x5A63,0x5A64,0x5A65,0x5A66,0x5A68,0x5A69,0x5A6B, +0x5A6C,0x5A6D,0x5A6E,0x5A6F,0x5A70,0x5A71,0x5A72,0x5A73, +0x5A78,0x5A79,0x5A7B,0x5A7C,0x5A7D,0x5A7E,0x5A80,0x5A81, +0x5A82,0x5A83,0x5A84,0x5A85,0x5A86,0x5A87,0x5A88,0x5A89, +0x5A8A,0x5A8B,0x5A8C,0x5A8D,0x5A8E,0x5A8F,0x5A90,0x5A91, +0x5A93,0x5A94,0x5A95,0x5A96,0x5A97,0x5A98,0x5A99,0x5A9C, +0x5A9D,0x5A9E,0x5A9F,0x5AA0,0x5AA1,0x5AA2,0x5AA3,0x5AA4, +0x5AA5,0x5AA6,0x5AA7,0x5AA8,0x5AA9,0x5AAB,0x5AAC, 0, +0x5AAD,0x5AAE,0x5AAF,0x5AB0,0x5AB1,0x5AB4,0x5AB6,0x5AB7, +0x5AB9,0x5ABA,0x5ABB,0x5ABC,0x5ABD,0x5ABF,0x5AC0,0x5AC3, +0x5AC4,0x5AC5,0x5AC6,0x5AC7,0x5AC8,0x5ACA,0x5ACB,0x5ACD, +0x5ACE,0x5ACF,0x5AD0,0x5AD1,0x5AD3,0x5AD5,0x5AD7,0x5AD9, +0x5ADA,0x5ADB,0x5ADD,0x5ADE,0x5ADF,0x5AE2,0x5AE4,0x5AE5, +0x5AE7,0x5AE8,0x5AEA,0x5AEC,0x5AED,0x5AEE,0x5AEF,0x5AF0, +0x5AF2,0x5AF3,0x5AF4,0x5AF5,0x5AF6,0x5AF7,0x5AF8,0x5AF9, +0x5AFA,0x5AFB,0x5AFC,0x5AFD,0x5AFE,0x5AFF,0x5B00,0x5B01, +0x5B02,0x5B03,0x5B04,0x5B05,0x5B06,0x5B07,0x5B08,0x5B0A, +0x5B0B,0x5B0C,0x5B0D,0x5B0E,0x5B0F,0x5B10,0x5B11,0x5B12, +0x5B13,0x5B14,0x5B15,0x5B18,0x5B19,0x5B1A,0x5B1B,0x5B1C, +0x5B1D,0x5B1E,0x5B1F,0x5B20,0x5B21,0x5B22,0x5B23,0x5B24, +0x5B25,0x5B26,0x5B27,0x5B28,0x5B29,0x5B2A,0x5B2B,0x5B2C, +0x5B2D,0x5B2E,0x5B2F,0x5B30,0x5B31,0x5B33,0x5B35,0x5B36, +0x5B38,0x5B39,0x5B3A,0x5B3B,0x5B3C,0x5B3D,0x5B3E,0x5B3F, +0x5B41,0x5B42,0x5B43,0x5B44,0x5B45,0x5B46,0x5B47, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5B48,0x5B49,0x5B4A,0x5B4B,0x5B4C,0x5B4D,0x5B4E,0x5B4F, +0x5B52,0x5B56,0x5B5E,0x5B60,0x5B61,0x5B67,0x5B68,0x5B6B, +0x5B6D,0x5B6E,0x5B6F,0x5B72,0x5B74,0x5B76,0x5B77,0x5B78, +0x5B79,0x5B7B,0x5B7C,0x5B7E,0x5B7F,0x5B82,0x5B86,0x5B8A, +0x5B8D,0x5B8E,0x5B90,0x5B91,0x5B92,0x5B94,0x5B96,0x5B9F, +0x5BA7,0x5BA8,0x5BA9,0x5BAC,0x5BAD,0x5BAE,0x5BAF,0x5BB1, +0x5BB2,0x5BB7,0x5BBA,0x5BBB,0x5BBC,0x5BC0,0x5BC1,0x5BC3, +0x5BC8,0x5BC9,0x5BCA,0x5BCB,0x5BCD,0x5BCE,0x5BCF, 0, +0x5BD1,0x5BD4,0x5BD5,0x5BD6,0x5BD7,0x5BD8,0x5BD9,0x5BDA, +0x5BDB,0x5BDC,0x5BE0,0x5BE2,0x5BE3,0x5BE6,0x5BE7,0x5BE9, +0x5BEA,0x5BEB,0x5BEC,0x5BED,0x5BEF,0x5BF1,0x5BF2,0x5BF3, +0x5BF4,0x5BF5,0x5BF6,0x5BF7,0x5BFD,0x5BFE,0x5C00,0x5C02, +0x5C03,0x5C05,0x5C07,0x5C08,0x5C0B,0x5C0C,0x5C0D,0x5C0E, +0x5C10,0x5C12,0x5C13,0x5C17,0x5C19,0x5C1B,0x5C1E,0x5C1F, +0x5C20,0x5C21,0x5C23,0x5C26,0x5C28,0x5C29,0x5C2A,0x5C2B, +0x5C2D,0x5C2E,0x5C2F,0x5C30,0x5C32,0x5C33,0x5C35,0x5C36, +0x5C37,0x5C43,0x5C44,0x5C46,0x5C47,0x5C4C,0x5C4D,0x5C52, +0x5C53,0x5C54,0x5C56,0x5C57,0x5C58,0x5C5A,0x5C5B,0x5C5C, +0x5C5D,0x5C5F,0x5C62,0x5C64,0x5C67,0x5C68,0x5C69,0x5C6A, +0x5C6B,0x5C6C,0x5C6D,0x5C70,0x5C72,0x5C73,0x5C74,0x5C75, +0x5C76,0x5C77,0x5C78,0x5C7B,0x5C7C,0x5C7D,0x5C7E,0x5C80, +0x5C83,0x5C84,0x5C85,0x5C86,0x5C87,0x5C89,0x5C8A,0x5C8B, +0x5C8E,0x5C8F,0x5C92,0x5C93,0x5C95,0x5C9D,0x5C9E,0x5C9F, +0x5CA0,0x5CA1,0x5CA4,0x5CA5,0x5CA6,0x5CA7,0x5CA8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5CAA,0x5CAE,0x5CAF,0x5CB0,0x5CB2,0x5CB4,0x5CB6,0x5CB9, +0x5CBA,0x5CBB,0x5CBC,0x5CBE,0x5CC0,0x5CC2,0x5CC3,0x5CC5, +0x5CC6,0x5CC7,0x5CC8,0x5CC9,0x5CCA,0x5CCC,0x5CCD,0x5CCE, +0x5CCF,0x5CD0,0x5CD1,0x5CD3,0x5CD4,0x5CD5,0x5CD6,0x5CD7, +0x5CD8,0x5CDA,0x5CDB,0x5CDC,0x5CDD,0x5CDE,0x5CDF,0x5CE0, +0x5CE2,0x5CE3,0x5CE7,0x5CE9,0x5CEB,0x5CEC,0x5CEE,0x5CEF, +0x5CF1,0x5CF2,0x5CF3,0x5CF4,0x5CF5,0x5CF6,0x5CF7,0x5CF8, +0x5CF9,0x5CFA,0x5CFC,0x5CFD,0x5CFE,0x5CFF,0x5D00, 0, +0x5D01,0x5D04,0x5D05,0x5D08,0x5D09,0x5D0A,0x5D0B,0x5D0C, +0x5D0D,0x5D0F,0x5D10,0x5D11,0x5D12,0x5D13,0x5D15,0x5D17, +0x5D18,0x5D19,0x5D1A,0x5D1C,0x5D1D,0x5D1F,0x5D20,0x5D21, +0x5D22,0x5D23,0x5D25,0x5D28,0x5D2A,0x5D2B,0x5D2C,0x5D2F, +0x5D30,0x5D31,0x5D32,0x5D33,0x5D35,0x5D36,0x5D37,0x5D38, +0x5D39,0x5D3A,0x5D3B,0x5D3C,0x5D3F,0x5D40,0x5D41,0x5D42, +0x5D43,0x5D44,0x5D45,0x5D46,0x5D48,0x5D49,0x5D4D,0x5D4E, +0x5D4F,0x5D50,0x5D51,0x5D52,0x5D53,0x5D54,0x5D55,0x5D56, +0x5D57,0x5D59,0x5D5A,0x5D5C,0x5D5E,0x5D5F,0x5D60,0x5D61, +0x5D62,0x5D63,0x5D64,0x5D65,0x5D66,0x5D67,0x5D68,0x5D6A, +0x5D6D,0x5D6E,0x5D70,0x5D71,0x5D72,0x5D73,0x5D75,0x5D76, +0x5D77,0x5D78,0x5D79,0x5D7A,0x5D7B,0x5D7C,0x5D7D,0x5D7E, +0x5D7F,0x5D80,0x5D81,0x5D83,0x5D84,0x5D85,0x5D86,0x5D87, +0x5D88,0x5D89,0x5D8A,0x5D8B,0x5D8C,0x5D8D,0x5D8E,0x5D8F, +0x5D90,0x5D91,0x5D92,0x5D93,0x5D94,0x5D95,0x5D96,0x5D97, +0x5D98,0x5D9A,0x5D9B,0x5D9C,0x5D9E,0x5D9F,0x5DA0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5DA1,0x5DA2,0x5DA3,0x5DA4,0x5DA5,0x5DA6,0x5DA7,0x5DA8, +0x5DA9,0x5DAA,0x5DAB,0x5DAC,0x5DAD,0x5DAE,0x5DAF,0x5DB0, +0x5DB1,0x5DB2,0x5DB3,0x5DB4,0x5DB5,0x5DB6,0x5DB8,0x5DB9, +0x5DBA,0x5DBB,0x5DBC,0x5DBD,0x5DBE,0x5DBF,0x5DC0,0x5DC1, +0x5DC2,0x5DC3,0x5DC4,0x5DC6,0x5DC7,0x5DC8,0x5DC9,0x5DCA, +0x5DCB,0x5DCC,0x5DCE,0x5DCF,0x5DD0,0x5DD1,0x5DD2,0x5DD3, +0x5DD4,0x5DD5,0x5DD6,0x5DD7,0x5DD8,0x5DD9,0x5DDA,0x5DDC, +0x5DDF,0x5DE0,0x5DE3,0x5DE4,0x5DEA,0x5DEC,0x5DED, 0, +0x5DF0,0x5DF5,0x5DF6,0x5DF8,0x5DF9,0x5DFA,0x5DFB,0x5DFC, +0x5DFF,0x5E00,0x5E04,0x5E07,0x5E09,0x5E0A,0x5E0B,0x5E0D, +0x5E0E,0x5E12,0x5E13,0x5E17,0x5E1E,0x5E1F,0x5E20,0x5E21, +0x5E22,0x5E23,0x5E24,0x5E25,0x5E28,0x5E29,0x5E2A,0x5E2B, +0x5E2C,0x5E2F,0x5E30,0x5E32,0x5E33,0x5E34,0x5E35,0x5E36, +0x5E39,0x5E3A,0x5E3E,0x5E3F,0x5E40,0x5E41,0x5E43,0x5E46, +0x5E47,0x5E48,0x5E49,0x5E4A,0x5E4B,0x5E4D,0x5E4E,0x5E4F, +0x5E50,0x5E51,0x5E52,0x5E53,0x5E56,0x5E57,0x5E58,0x5E59, +0x5E5A,0x5E5C,0x5E5D,0x5E5F,0x5E60,0x5E63,0x5E64,0x5E65, +0x5E66,0x5E67,0x5E68,0x5E69,0x5E6A,0x5E6B,0x5E6C,0x5E6D, +0x5E6E,0x5E6F,0x5E70,0x5E71,0x5E75,0x5E77,0x5E79,0x5E7E, +0x5E81,0x5E82,0x5E83,0x5E85,0x5E88,0x5E89,0x5E8C,0x5E8D, +0x5E8E,0x5E92,0x5E98,0x5E9B,0x5E9D,0x5EA1,0x5EA2,0x5EA3, +0x5EA4,0x5EA8,0x5EA9,0x5EAA,0x5EAB,0x5EAC,0x5EAE,0x5EAF, +0x5EB0,0x5EB1,0x5EB2,0x5EB4,0x5EBA,0x5EBB,0x5EBC,0x5EBD, +0x5EBF,0x5EC0,0x5EC1,0x5EC2,0x5EC3,0x5EC4,0x5EC5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5EC6,0x5EC7,0x5EC8,0x5ECB,0x5ECC,0x5ECD,0x5ECE,0x5ECF, +0x5ED0,0x5ED4,0x5ED5,0x5ED7,0x5ED8,0x5ED9,0x5EDA,0x5EDC, +0x5EDD,0x5EDE,0x5EDF,0x5EE0,0x5EE1,0x5EE2,0x5EE3,0x5EE4, +0x5EE5,0x5EE6,0x5EE7,0x5EE9,0x5EEB,0x5EEC,0x5EED,0x5EEE, +0x5EEF,0x5EF0,0x5EF1,0x5EF2,0x5EF3,0x5EF5,0x5EF8,0x5EF9, +0x5EFB,0x5EFC,0x5EFD,0x5F05,0x5F06,0x5F07,0x5F09,0x5F0C, +0x5F0D,0x5F0E,0x5F10,0x5F12,0x5F14,0x5F16,0x5F19,0x5F1A, +0x5F1C,0x5F1D,0x5F1E,0x5F21,0x5F22,0x5F23,0x5F24, 0, +0x5F28,0x5F2B,0x5F2C,0x5F2E,0x5F30,0x5F32,0x5F33,0x5F34, +0x5F35,0x5F36,0x5F37,0x5F38,0x5F3B,0x5F3D,0x5F3E,0x5F3F, +0x5F41,0x5F42,0x5F43,0x5F44,0x5F45,0x5F46,0x5F47,0x5F48, +0x5F49,0x5F4A,0x5F4B,0x5F4C,0x5F4D,0x5F4E,0x5F4F,0x5F51, +0x5F54,0x5F59,0x5F5A,0x5F5B,0x5F5C,0x5F5E,0x5F5F,0x5F60, +0x5F63,0x5F65,0x5F67,0x5F68,0x5F6B,0x5F6E,0x5F6F,0x5F72, +0x5F74,0x5F75,0x5F76,0x5F78,0x5F7A,0x5F7D,0x5F7E,0x5F7F, +0x5F83,0x5F86,0x5F8D,0x5F8E,0x5F8F,0x5F91,0x5F93,0x5F94, +0x5F96,0x5F9A,0x5F9B,0x5F9D,0x5F9E,0x5F9F,0x5FA0,0x5FA2, +0x5FA3,0x5FA4,0x5FA5,0x5FA6,0x5FA7,0x5FA9,0x5FAB,0x5FAC, +0x5FAF,0x5FB0,0x5FB1,0x5FB2,0x5FB3,0x5FB4,0x5FB6,0x5FB8, +0x5FB9,0x5FBA,0x5FBB,0x5FBE,0x5FBF,0x5FC0,0x5FC1,0x5FC2, +0x5FC7,0x5FC8,0x5FCA,0x5FCB,0x5FCE,0x5FD3,0x5FD4,0x5FD5, +0x5FDA,0x5FDB,0x5FDC,0x5FDE,0x5FDF,0x5FE2,0x5FE3,0x5FE5, +0x5FE6,0x5FE8,0x5FE9,0x5FEC,0x5FEF,0x5FF0,0x5FF2,0x5FF3, +0x5FF4,0x5FF6,0x5FF7,0x5FF9,0x5FFA,0x5FFC,0x6007, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6008,0x6009,0x600B,0x600C,0x6010,0x6011,0x6013,0x6017, +0x6018,0x601A,0x601E,0x601F,0x6022,0x6023,0x6024,0x602C, +0x602D,0x602E,0x6030,0x6031,0x6032,0x6033,0x6034,0x6036, +0x6037,0x6038,0x6039,0x603A,0x603D,0x603E,0x6040,0x6044, +0x6045,0x6046,0x6047,0x6048,0x6049,0x604A,0x604C,0x604E, +0x604F,0x6051,0x6053,0x6054,0x6056,0x6057,0x6058,0x605B, +0x605C,0x605E,0x605F,0x6060,0x6061,0x6065,0x6066,0x606E, +0x6071,0x6072,0x6074,0x6075,0x6077,0x607E,0x6080, 0, +0x6081,0x6082,0x6085,0x6086,0x6087,0x6088,0x608A,0x608B, +0x608E,0x608F,0x6090,0x6091,0x6093,0x6095,0x6097,0x6098, +0x6099,0x609C,0x609E,0x60A1,0x60A2,0x60A4,0x60A5,0x60A7, +0x60A9,0x60AA,0x60AE,0x60B0,0x60B3,0x60B5,0x60B6,0x60B7, +0x60B9,0x60BA,0x60BD,0x60BE,0x60BF,0x60C0,0x60C1,0x60C2, +0x60C3,0x60C4,0x60C7,0x60C8,0x60C9,0x60CC,0x60CD,0x60CE, +0x60CF,0x60D0,0x60D2,0x60D3,0x60D4,0x60D6,0x60D7,0x60D9, +0x60DB,0x60DE,0x60E1,0x60E2,0x60E3,0x60E4,0x60E5,0x60EA, +0x60F1,0x60F2,0x60F5,0x60F7,0x60F8,0x60FB,0x60FC,0x60FD, +0x60FE,0x60FF,0x6102,0x6103,0x6104,0x6105,0x6107,0x610A, +0x610B,0x610C,0x6110,0x6111,0x6112,0x6113,0x6114,0x6116, +0x6117,0x6118,0x6119,0x611B,0x611C,0x611D,0x611E,0x6121, +0x6122,0x6125,0x6128,0x6129,0x612A,0x612C,0x612D,0x612E, +0x612F,0x6130,0x6131,0x6132,0x6133,0x6134,0x6135,0x6136, +0x6137,0x6138,0x6139,0x613A,0x613B,0x613C,0x613D,0x613E, +0x6140,0x6141,0x6142,0x6143,0x6144,0x6145,0x6146, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6147,0x6149,0x614B,0x614D,0x614F,0x6150,0x6152,0x6153, +0x6154,0x6156,0x6157,0x6158,0x6159,0x615A,0x615B,0x615C, +0x615E,0x615F,0x6160,0x6161,0x6163,0x6164,0x6165,0x6166, +0x6169,0x616A,0x616B,0x616C,0x616D,0x616E,0x616F,0x6171, +0x6172,0x6173,0x6174,0x6176,0x6178,0x6179,0x617A,0x617B, +0x617C,0x617D,0x617E,0x617F,0x6180,0x6181,0x6182,0x6183, +0x6184,0x6185,0x6186,0x6187,0x6188,0x6189,0x618A,0x618C, +0x618D,0x618F,0x6190,0x6191,0x6192,0x6193,0x6195, 0, +0x6196,0x6197,0x6198,0x6199,0x619A,0x619B,0x619C,0x619E, +0x619F,0x61A0,0x61A1,0x61A2,0x61A3,0x61A4,0x61A5,0x61A6, +0x61AA,0x61AB,0x61AD,0x61AE,0x61AF,0x61B0,0x61B1,0x61B2, +0x61B3,0x61B4,0x61B5,0x61B6,0x61B8,0x61B9,0x61BA,0x61BB, +0x61BC,0x61BD,0x61BF,0x61C0,0x61C1,0x61C3,0x61C4,0x61C5, +0x61C6,0x61C7,0x61C9,0x61CC,0x61CD,0x61CE,0x61CF,0x61D0, +0x61D3,0x61D5,0x61D6,0x61D7,0x61D8,0x61D9,0x61DA,0x61DB, +0x61DC,0x61DD,0x61DE,0x61DF,0x61E0,0x61E1,0x61E2,0x61E3, +0x61E4,0x61E5,0x61E7,0x61E8,0x61E9,0x61EA,0x61EB,0x61EC, +0x61ED,0x61EE,0x61EF,0x61F0,0x61F1,0x61F2,0x61F3,0x61F4, +0x61F6,0x61F7,0x61F8,0x61F9,0x61FA,0x61FB,0x61FC,0x61FD, +0x61FE,0x6200,0x6201,0x6202,0x6203,0x6204,0x6205,0x6207, +0x6209,0x6213,0x6214,0x6219,0x621C,0x621D,0x621E,0x6220, +0x6223,0x6226,0x6227,0x6228,0x6229,0x622B,0x622D,0x622F, +0x6230,0x6231,0x6232,0x6235,0x6236,0x6238,0x6239,0x623A, +0x623B,0x623C,0x6242,0x6244,0x6245,0x6246,0x624A, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x624F,0x6250,0x6255,0x6256,0x6257,0x6259,0x625A,0x625C, +0x625D,0x625E,0x625F,0x6260,0x6261,0x6262,0x6264,0x6265, +0x6268,0x6271,0x6272,0x6274,0x6275,0x6277,0x6278,0x627A, +0x627B,0x627D,0x6281,0x6282,0x6283,0x6285,0x6286,0x6287, +0x6288,0x628B,0x628C,0x628D,0x628E,0x628F,0x6290,0x6294, +0x6299,0x629C,0x629D,0x629E,0x62A3,0x62A6,0x62A7,0x62A9, +0x62AA,0x62AD,0x62AE,0x62AF,0x62B0,0x62B2,0x62B3,0x62B4, +0x62B6,0x62B7,0x62B8,0x62BA,0x62BE,0x62C0,0x62C1, 0, +0x62C3,0x62CB,0x62CF,0x62D1,0x62D5,0x62DD,0x62DE,0x62E0, +0x62E1,0x62E4,0x62EA,0x62EB,0x62F0,0x62F2,0x62F5,0x62F8, +0x62F9,0x62FA,0x62FB,0x6300,0x6303,0x6304,0x6305,0x6306, +0x630A,0x630B,0x630C,0x630D,0x630F,0x6310,0x6312,0x6313, +0x6314,0x6315,0x6317,0x6318,0x6319,0x631C,0x6326,0x6327, +0x6329,0x632C,0x632D,0x632E,0x6330,0x6331,0x6333,0x6334, +0x6335,0x6336,0x6337,0x6338,0x633B,0x633C,0x633E,0x633F, +0x6340,0x6341,0x6344,0x6347,0x6348,0x634A,0x6351,0x6352, +0x6353,0x6354,0x6356,0x6357,0x6358,0x6359,0x635A,0x635B, +0x635C,0x635D,0x6360,0x6364,0x6365,0x6366,0x6368,0x636A, +0x636B,0x636C,0x636F,0x6370,0x6372,0x6373,0x6374,0x6375, +0x6378,0x6379,0x637C,0x637D,0x637E,0x637F,0x6381,0x6383, +0x6384,0x6385,0x6386,0x638B,0x638D,0x6391,0x6393,0x6394, +0x6395,0x6397,0x6399,0x639A,0x639B,0x639C,0x639D,0x639E, +0x639F,0x63A1,0x63A4,0x63A6,0x63AB,0x63AF,0x63B1,0x63B2, +0x63B5,0x63B6,0x63B9,0x63BB,0x63BD,0x63BF,0x63C0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x63C1,0x63C2,0x63C3,0x63C5,0x63C7,0x63C8,0x63CA,0x63CB, +0x63CC,0x63D1,0x63D3,0x63D4,0x63D5,0x63D7,0x63D8,0x63D9, +0x63DA,0x63DB,0x63DC,0x63DD,0x63DF,0x63E2,0x63E4,0x63E5, +0x63E6,0x63E7,0x63E8,0x63EB,0x63EC,0x63EE,0x63EF,0x63F0, +0x63F1,0x63F3,0x63F5,0x63F7,0x63F9,0x63FA,0x63FB,0x63FC, +0x63FE,0x6403,0x6404,0x6406,0x6407,0x6408,0x6409,0x640A, +0x640D,0x640E,0x6411,0x6412,0x6415,0x6416,0x6417,0x6418, +0x6419,0x641A,0x641D,0x641F,0x6422,0x6423,0x6424, 0, +0x6425,0x6427,0x6428,0x6429,0x642B,0x642E,0x642F,0x6430, +0x6431,0x6432,0x6433,0x6435,0x6436,0x6437,0x6438,0x6439, +0x643B,0x643C,0x643E,0x6440,0x6442,0x6443,0x6449,0x644B, +0x644C,0x644D,0x644E,0x644F,0x6450,0x6451,0x6453,0x6455, +0x6456,0x6457,0x6459,0x645A,0x645B,0x645C,0x645D,0x645F, +0x6460,0x6461,0x6462,0x6463,0x6464,0x6465,0x6466,0x6468, +0x646A,0x646B,0x646C,0x646E,0x646F,0x6470,0x6471,0x6472, +0x6473,0x6474,0x6475,0x6476,0x6477,0x647B,0x647C,0x647D, +0x647E,0x647F,0x6480,0x6481,0x6483,0x6486,0x6488,0x6489, +0x648A,0x648B,0x648C,0x648D,0x648E,0x648F,0x6490,0x6493, +0x6494,0x6497,0x6498,0x649A,0x649B,0x649C,0x649D,0x649F, +0x64A0,0x64A1,0x64A2,0x64A3,0x64A5,0x64A6,0x64A7,0x64A8, +0x64AA,0x64AB,0x64AF,0x64B1,0x64B2,0x64B3,0x64B4,0x64B6, +0x64B9,0x64BB,0x64BD,0x64BE,0x64BF,0x64C1,0x64C3,0x64C4, +0x64C6,0x64C7,0x64C8,0x64C9,0x64CA,0x64CB,0x64CC,0x64CF, +0x64D1,0x64D3,0x64D4,0x64D5,0x64D6,0x64D9,0x64DA, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x64DB,0x64DC,0x64DD,0x64DF,0x64E0,0x64E1,0x64E3,0x64E5, +0x64E7,0x64E8,0x64E9,0x64EA,0x64EB,0x64EC,0x64ED,0x64EE, +0x64EF,0x64F0,0x64F1,0x64F2,0x64F3,0x64F4,0x64F5,0x64F6, +0x64F7,0x64F8,0x64F9,0x64FA,0x64FB,0x64FC,0x64FD,0x64FE, +0x64FF,0x6501,0x6502,0x6503,0x6504,0x6505,0x6506,0x6507, +0x6508,0x650A,0x650B,0x650C,0x650D,0x650E,0x650F,0x6510, +0x6511,0x6513,0x6514,0x6515,0x6516,0x6517,0x6519,0x651A, +0x651B,0x651C,0x651D,0x651E,0x651F,0x6520,0x6521, 0, +0x6522,0x6523,0x6524,0x6526,0x6527,0x6528,0x6529,0x652A, +0x652C,0x652D,0x6530,0x6531,0x6532,0x6533,0x6537,0x653A, +0x653C,0x653D,0x6540,0x6541,0x6542,0x6543,0x6544,0x6546, +0x6547,0x654A,0x654B,0x654D,0x654E,0x6550,0x6552,0x6553, +0x6554,0x6557,0x6558,0x655A,0x655C,0x655F,0x6560,0x6561, +0x6564,0x6565,0x6567,0x6568,0x6569,0x656A,0x656D,0x656E, +0x656F,0x6571,0x6573,0x6575,0x6576,0x6578,0x6579,0x657A, +0x657B,0x657C,0x657D,0x657E,0x657F,0x6580,0x6581,0x6582, +0x6583,0x6584,0x6585,0x6586,0x6588,0x6589,0x658A,0x658D, +0x658E,0x658F,0x6592,0x6594,0x6595,0x6596,0x6598,0x659A, +0x659D,0x659E,0x65A0,0x65A2,0x65A3,0x65A6,0x65A8,0x65AA, +0x65AC,0x65AE,0x65B1,0x65B2,0x65B3,0x65B4,0x65B5,0x65B6, +0x65B7,0x65B8,0x65BA,0x65BB,0x65BE,0x65BF,0x65C0,0x65C2, +0x65C7,0x65C8,0x65C9,0x65CA,0x65CD,0x65D0,0x65D1,0x65D3, +0x65D4,0x65D5,0x65D8,0x65D9,0x65DA,0x65DB,0x65DC,0x65DD, +0x65DE,0x65DF,0x65E1,0x65E3,0x65E4,0x65EA,0x65EB, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x65F2,0x65F3,0x65F4,0x65F5,0x65F8,0x65F9,0x65FB,0x65FC, +0x65FD,0x65FE,0x65FF,0x6601,0x6604,0x6605,0x6607,0x6608, +0x6609,0x660B,0x660D,0x6610,0x6611,0x6612,0x6616,0x6617, +0x6618,0x661A,0x661B,0x661C,0x661E,0x6621,0x6622,0x6623, +0x6624,0x6626,0x6629,0x662A,0x662B,0x662C,0x662E,0x6630, +0x6632,0x6633,0x6637,0x6638,0x6639,0x663A,0x663B,0x663D, +0x663F,0x6640,0x6642,0x6644,0x6645,0x6646,0x6647,0x6648, +0x6649,0x664A,0x664D,0x664E,0x6650,0x6651,0x6658, 0, +0x6659,0x665B,0x665C,0x665D,0x665E,0x6660,0x6662,0x6663, +0x6665,0x6667,0x6669,0x666A,0x666B,0x666C,0x666D,0x6671, +0x6672,0x6673,0x6675,0x6678,0x6679,0x667B,0x667C,0x667D, +0x667F,0x6680,0x6681,0x6683,0x6685,0x6686,0x6688,0x6689, +0x668A,0x668B,0x668D,0x668E,0x668F,0x6690,0x6692,0x6693, +0x6694,0x6695,0x6698,0x6699,0x669A,0x669B,0x669C,0x669E, +0x669F,0x66A0,0x66A1,0x66A2,0x66A3,0x66A4,0x66A5,0x66A6, +0x66A9,0x66AA,0x66AB,0x66AC,0x66AD,0x66AF,0x66B0,0x66B1, +0x66B2,0x66B3,0x66B5,0x66B6,0x66B7,0x66B8,0x66BA,0x66BB, +0x66BC,0x66BD,0x66BF,0x66C0,0x66C1,0x66C2,0x66C3,0x66C4, +0x66C5,0x66C6,0x66C7,0x66C8,0x66C9,0x66CA,0x66CB,0x66CC, +0x66CD,0x66CE,0x66CF,0x66D0,0x66D1,0x66D2,0x66D3,0x66D4, +0x66D5,0x66D6,0x66D7,0x66D8,0x66DA,0x66DE,0x66DF,0x66E0, +0x66E1,0x66E2,0x66E3,0x66E4,0x66E5,0x66E7,0x66E8,0x66EA, +0x66EB,0x66EC,0x66ED,0x66EE,0x66EF,0x66F1,0x66F5,0x66F6, +0x66F8,0x66FA,0x66FB,0x66FD,0x6701,0x6702,0x6703, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6704,0x6705,0x6706,0x6707,0x670C,0x670E,0x670F,0x6711, +0x6712,0x6713,0x6716,0x6718,0x6719,0x671A,0x671C,0x671E, +0x6720,0x6721,0x6722,0x6723,0x6724,0x6725,0x6727,0x6729, +0x672E,0x6730,0x6732,0x6733,0x6736,0x6737,0x6738,0x6739, +0x673B,0x673C,0x673E,0x673F,0x6741,0x6744,0x6745,0x6747, +0x674A,0x674B,0x674D,0x6752,0x6754,0x6755,0x6757,0x6758, +0x6759,0x675A,0x675B,0x675D,0x6762,0x6763,0x6764,0x6766, +0x6767,0x676B,0x676C,0x676E,0x6771,0x6774,0x6776, 0, +0x6778,0x6779,0x677A,0x677B,0x677D,0x6780,0x6782,0x6783, +0x6785,0x6786,0x6788,0x678A,0x678C,0x678D,0x678E,0x678F, +0x6791,0x6792,0x6793,0x6794,0x6796,0x6799,0x679B,0x679F, +0x67A0,0x67A1,0x67A4,0x67A6,0x67A9,0x67AC,0x67AE,0x67B1, +0x67B2,0x67B4,0x67B9,0x67BA,0x67BB,0x67BC,0x67BD,0x67BE, +0x67BF,0x67C0,0x67C2,0x67C5,0x67C6,0x67C7,0x67C8,0x67C9, +0x67CA,0x67CB,0x67CC,0x67CD,0x67CE,0x67D5,0x67D6,0x67D7, +0x67DB,0x67DF,0x67E1,0x67E3,0x67E4,0x67E6,0x67E7,0x67E8, +0x67EA,0x67EB,0x67ED,0x67EE,0x67F2,0x67F5,0x67F6,0x67F7, +0x67F8,0x67F9,0x67FA,0x67FB,0x67FC,0x67FE,0x6801,0x6802, +0x6803,0x6804,0x6806,0x680D,0x6810,0x6812,0x6814,0x6815, +0x6818,0x6819,0x681A,0x681B,0x681C,0x681E,0x681F,0x6820, +0x6822,0x6823,0x6824,0x6825,0x6826,0x6827,0x6828,0x682B, +0x682C,0x682D,0x682E,0x682F,0x6830,0x6831,0x6834,0x6835, +0x6836,0x683A,0x683B,0x683F,0x6847,0x684B,0x684D,0x684F, +0x6852,0x6856,0x6857,0x6858,0x6859,0x685A,0x685B, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x685C,0x685D,0x685E,0x685F,0x686A,0x686C,0x686D,0x686E, +0x686F,0x6870,0x6871,0x6872,0x6873,0x6875,0x6878,0x6879, +0x687A,0x687B,0x687C,0x687D,0x687E,0x687F,0x6880,0x6882, +0x6884,0x6887,0x6888,0x6889,0x688A,0x688B,0x688C,0x688D, +0x688E,0x6890,0x6891,0x6892,0x6894,0x6895,0x6896,0x6898, +0x6899,0x689A,0x689B,0x689C,0x689D,0x689E,0x689F,0x68A0, +0x68A1,0x68A3,0x68A4,0x68A5,0x68A9,0x68AA,0x68AB,0x68AC, +0x68AE,0x68B1,0x68B2,0x68B4,0x68B6,0x68B7,0x68B8, 0, +0x68B9,0x68BA,0x68BB,0x68BC,0x68BD,0x68BE,0x68BF,0x68C1, +0x68C3,0x68C4,0x68C5,0x68C6,0x68C7,0x68C8,0x68CA,0x68CC, +0x68CE,0x68CF,0x68D0,0x68D1,0x68D3,0x68D4,0x68D6,0x68D7, +0x68D9,0x68DB,0x68DC,0x68DD,0x68DE,0x68DF,0x68E1,0x68E2, +0x68E4,0x68E5,0x68E6,0x68E7,0x68E8,0x68E9,0x68EA,0x68EB, +0x68EC,0x68ED,0x68EF,0x68F2,0x68F3,0x68F4,0x68F6,0x68F7, +0x68F8,0x68FB,0x68FD,0x68FE,0x68FF,0x6900,0x6902,0x6903, +0x6904,0x6906,0x6907,0x6908,0x6909,0x690A,0x690C,0x690F, +0x6911,0x6913,0x6914,0x6915,0x6916,0x6917,0x6918,0x6919, +0x691A,0x691B,0x691C,0x691D,0x691E,0x6921,0x6922,0x6923, +0x6925,0x6926,0x6927,0x6928,0x6929,0x692A,0x692B,0x692C, +0x692E,0x692F,0x6931,0x6932,0x6933,0x6935,0x6936,0x6937, +0x6938,0x693A,0x693B,0x693C,0x693E,0x6940,0x6941,0x6943, +0x6944,0x6945,0x6946,0x6947,0x6948,0x6949,0x694A,0x694B, +0x694C,0x694D,0x694E,0x694F,0x6950,0x6951,0x6952,0x6953, +0x6955,0x6956,0x6958,0x6959,0x695B,0x695C,0x695F, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6961,0x6962,0x6964,0x6965,0x6967,0x6968,0x6969,0x696A, +0x696C,0x696D,0x696F,0x6970,0x6972,0x6973,0x6974,0x6975, +0x6976,0x697A,0x697B,0x697D,0x697E,0x697F,0x6981,0x6983, +0x6985,0x698A,0x698B,0x698C,0x698E,0x698F,0x6990,0x6991, +0x6992,0x6993,0x6996,0x6997,0x6999,0x699A,0x699D,0x699E, +0x699F,0x69A0,0x69A1,0x69A2,0x69A3,0x69A4,0x69A5,0x69A6, +0x69A9,0x69AA,0x69AC,0x69AE,0x69AF,0x69B0,0x69B2,0x69B3, +0x69B5,0x69B6,0x69B8,0x69B9,0x69BA,0x69BC,0x69BD, 0, +0x69BE,0x69BF,0x69C0,0x69C2,0x69C3,0x69C4,0x69C5,0x69C6, +0x69C7,0x69C8,0x69C9,0x69CB,0x69CD,0x69CF,0x69D1,0x69D2, +0x69D3,0x69D5,0x69D6,0x69D7,0x69D8,0x69D9,0x69DA,0x69DC, +0x69DD,0x69DE,0x69E1,0x69E2,0x69E3,0x69E4,0x69E5,0x69E6, +0x69E7,0x69E8,0x69E9,0x69EA,0x69EB,0x69EC,0x69EE,0x69EF, +0x69F0,0x69F1,0x69F3,0x69F4,0x69F5,0x69F6,0x69F7,0x69F8, +0x69F9,0x69FA,0x69FB,0x69FC,0x69FE,0x6A00,0x6A01,0x6A02, +0x6A03,0x6A04,0x6A05,0x6A06,0x6A07,0x6A08,0x6A09,0x6A0B, +0x6A0C,0x6A0D,0x6A0E,0x6A0F,0x6A10,0x6A11,0x6A12,0x6A13, +0x6A14,0x6A15,0x6A16,0x6A19,0x6A1A,0x6A1B,0x6A1C,0x6A1D, +0x6A1E,0x6A20,0x6A22,0x6A23,0x6A24,0x6A25,0x6A26,0x6A27, +0x6A29,0x6A2B,0x6A2C,0x6A2D,0x6A2E,0x6A30,0x6A32,0x6A33, +0x6A34,0x6A36,0x6A37,0x6A38,0x6A39,0x6A3A,0x6A3B,0x6A3C, +0x6A3F,0x6A40,0x6A41,0x6A42,0x6A43,0x6A45,0x6A46,0x6A48, +0x6A49,0x6A4A,0x6A4B,0x6A4C,0x6A4D,0x6A4E,0x6A4F,0x6A51, +0x6A52,0x6A53,0x6A54,0x6A55,0x6A56,0x6A57,0x6A5A, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6A5C,0x6A5D,0x6A5E,0x6A5F,0x6A60,0x6A62,0x6A63,0x6A64, +0x6A66,0x6A67,0x6A68,0x6A69,0x6A6A,0x6A6B,0x6A6C,0x6A6D, +0x6A6E,0x6A6F,0x6A70,0x6A72,0x6A73,0x6A74,0x6A75,0x6A76, +0x6A77,0x6A78,0x6A7A,0x6A7B,0x6A7D,0x6A7E,0x6A7F,0x6A81, +0x6A82,0x6A83,0x6A85,0x6A86,0x6A87,0x6A88,0x6A89,0x6A8A, +0x6A8B,0x6A8C,0x6A8D,0x6A8F,0x6A92,0x6A93,0x6A94,0x6A95, +0x6A96,0x6A98,0x6A99,0x6A9A,0x6A9B,0x6A9C,0x6A9D,0x6A9E, +0x6A9F,0x6AA1,0x6AA2,0x6AA3,0x6AA4,0x6AA5,0x6AA6, 0, +0x6AA7,0x6AA8,0x6AAA,0x6AAD,0x6AAE,0x6AAF,0x6AB0,0x6AB1, +0x6AB2,0x6AB3,0x6AB4,0x6AB5,0x6AB6,0x6AB7,0x6AB8,0x6AB9, +0x6ABA,0x6ABB,0x6ABC,0x6ABD,0x6ABE,0x6ABF,0x6AC0,0x6AC1, +0x6AC2,0x6AC3,0x6AC4,0x6AC5,0x6AC6,0x6AC7,0x6AC8,0x6AC9, +0x6ACA,0x6ACB,0x6ACC,0x6ACD,0x6ACE,0x6ACF,0x6AD0,0x6AD1, +0x6AD2,0x6AD3,0x6AD4,0x6AD5,0x6AD6,0x6AD7,0x6AD8,0x6AD9, +0x6ADA,0x6ADB,0x6ADC,0x6ADD,0x6ADE,0x6ADF,0x6AE0,0x6AE1, +0x6AE2,0x6AE3,0x6AE4,0x6AE5,0x6AE6,0x6AE7,0x6AE8,0x6AE9, +0x6AEA,0x6AEB,0x6AEC,0x6AED,0x6AEE,0x6AEF,0x6AF0,0x6AF1, +0x6AF2,0x6AF3,0x6AF4,0x6AF5,0x6AF6,0x6AF7,0x6AF8,0x6AF9, +0x6AFA,0x6AFB,0x6AFC,0x6AFD,0x6AFE,0x6AFF,0x6B00,0x6B01, +0x6B02,0x6B03,0x6B04,0x6B05,0x6B06,0x6B07,0x6B08,0x6B09, +0x6B0A,0x6B0B,0x6B0C,0x6B0D,0x6B0E,0x6B0F,0x6B10,0x6B11, +0x6B12,0x6B13,0x6B14,0x6B15,0x6B16,0x6B17,0x6B18,0x6B19, +0x6B1A,0x6B1B,0x6B1C,0x6B1D,0x6B1E,0x6B1F,0x6B25,0x6B26, +0x6B28,0x6B29,0x6B2A,0x6B2B,0x6B2C,0x6B2D,0x6B2E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6B2F,0x6B30,0x6B31,0x6B33,0x6B34,0x6B35,0x6B36,0x6B38, +0x6B3B,0x6B3C,0x6B3D,0x6B3F,0x6B40,0x6B41,0x6B42,0x6B44, +0x6B45,0x6B48,0x6B4A,0x6B4B,0x6B4D,0x6B4E,0x6B4F,0x6B50, +0x6B51,0x6B52,0x6B53,0x6B54,0x6B55,0x6B56,0x6B57,0x6B58, +0x6B5A,0x6B5B,0x6B5C,0x6B5D,0x6B5E,0x6B5F,0x6B60,0x6B61, +0x6B68,0x6B69,0x6B6B,0x6B6C,0x6B6D,0x6B6E,0x6B6F,0x6B70, +0x6B71,0x6B72,0x6B73,0x6B74,0x6B75,0x6B76,0x6B77,0x6B78, +0x6B7A,0x6B7D,0x6B7E,0x6B7F,0x6B80,0x6B85,0x6B88, 0, +0x6B8C,0x6B8E,0x6B8F,0x6B90,0x6B91,0x6B94,0x6B95,0x6B97, +0x6B98,0x6B99,0x6B9C,0x6B9D,0x6B9E,0x6B9F,0x6BA0,0x6BA2, +0x6BA3,0x6BA4,0x6BA5,0x6BA6,0x6BA7,0x6BA8,0x6BA9,0x6BAB, +0x6BAC,0x6BAD,0x6BAE,0x6BAF,0x6BB0,0x6BB1,0x6BB2,0x6BB6, +0x6BB8,0x6BB9,0x6BBA,0x6BBB,0x6BBC,0x6BBD,0x6BBE,0x6BC0, +0x6BC3,0x6BC4,0x6BC6,0x6BC7,0x6BC8,0x6BC9,0x6BCA,0x6BCC, +0x6BCE,0x6BD0,0x6BD1,0x6BD8,0x6BDA,0x6BDC,0x6BDD,0x6BDE, +0x6BDF,0x6BE0,0x6BE2,0x6BE3,0x6BE4,0x6BE5,0x6BE6,0x6BE7, +0x6BE8,0x6BE9,0x6BEC,0x6BED,0x6BEE,0x6BF0,0x6BF1,0x6BF2, +0x6BF4,0x6BF6,0x6BF7,0x6BF8,0x6BFA,0x6BFB,0x6BFC,0x6BFE, +0x6BFF,0x6C00,0x6C01,0x6C02,0x6C03,0x6C04,0x6C08,0x6C09, +0x6C0A,0x6C0B,0x6C0C,0x6C0E,0x6C12,0x6C17,0x6C1C,0x6C1D, +0x6C1E,0x6C20,0x6C23,0x6C25,0x6C2B,0x6C2C,0x6C2D,0x6C31, +0x6C33,0x6C36,0x6C37,0x6C39,0x6C3A,0x6C3B,0x6C3C,0x6C3E, +0x6C3F,0x6C43,0x6C44,0x6C45,0x6C48,0x6C4B,0x6C4C,0x6C4D, +0x6C4E,0x6C4F,0x6C51,0x6C52,0x6C53,0x6C56,0x6C58, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6C59,0x6C5A,0x6C62,0x6C63,0x6C65,0x6C66,0x6C67,0x6C6B, +0x6C6C,0x6C6D,0x6C6E,0x6C6F,0x6C71,0x6C73,0x6C75,0x6C77, +0x6C78,0x6C7A,0x6C7B,0x6C7C,0x6C7F,0x6C80,0x6C84,0x6C87, +0x6C8A,0x6C8B,0x6C8D,0x6C8E,0x6C91,0x6C92,0x6C95,0x6C96, +0x6C97,0x6C98,0x6C9A,0x6C9C,0x6C9D,0x6C9E,0x6CA0,0x6CA2, +0x6CA8,0x6CAC,0x6CAF,0x6CB0,0x6CB4,0x6CB5,0x6CB6,0x6CB7, +0x6CBA,0x6CC0,0x6CC1,0x6CC2,0x6CC3,0x6CC6,0x6CC7,0x6CC8, +0x6CCB,0x6CCD,0x6CCE,0x6CCF,0x6CD1,0x6CD2,0x6CD8, 0, +0x6CD9,0x6CDA,0x6CDC,0x6CDD,0x6CDF,0x6CE4,0x6CE6,0x6CE7, +0x6CE9,0x6CEC,0x6CED,0x6CF2,0x6CF4,0x6CF9,0x6CFF,0x6D00, +0x6D02,0x6D03,0x6D05,0x6D06,0x6D08,0x6D09,0x6D0A,0x6D0D, +0x6D0F,0x6D10,0x6D11,0x6D13,0x6D14,0x6D15,0x6D16,0x6D18, +0x6D1C,0x6D1D,0x6D1F,0x6D20,0x6D21,0x6D22,0x6D23,0x6D24, +0x6D26,0x6D28,0x6D29,0x6D2C,0x6D2D,0x6D2F,0x6D30,0x6D34, +0x6D36,0x6D37,0x6D38,0x6D3A,0x6D3F,0x6D40,0x6D42,0x6D44, +0x6D49,0x6D4C,0x6D50,0x6D55,0x6D56,0x6D57,0x6D58,0x6D5B, +0x6D5D,0x6D5F,0x6D61,0x6D62,0x6D64,0x6D65,0x6D67,0x6D68, +0x6D6B,0x6D6C,0x6D6D,0x6D70,0x6D71,0x6D72,0x6D73,0x6D75, +0x6D76,0x6D79,0x6D7A,0x6D7B,0x6D7D,0x6D7E,0x6D7F,0x6D80, +0x6D81,0x6D83,0x6D84,0x6D86,0x6D87,0x6D8A,0x6D8B,0x6D8D, +0x6D8F,0x6D90,0x6D92,0x6D96,0x6D97,0x6D98,0x6D99,0x6D9A, +0x6D9C,0x6DA2,0x6DA5,0x6DAC,0x6DAD,0x6DB0,0x6DB1,0x6DB3, +0x6DB4,0x6DB6,0x6DB7,0x6DB9,0x6DBA,0x6DBB,0x6DBC,0x6DBD, +0x6DBE,0x6DC1,0x6DC2,0x6DC3,0x6DC8,0x6DC9,0x6DCA, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6DCD,0x6DCE,0x6DCF,0x6DD0,0x6DD2,0x6DD3,0x6DD4,0x6DD5, +0x6DD7,0x6DDA,0x6DDB,0x6DDC,0x6DDF,0x6DE2,0x6DE3,0x6DE5, +0x6DE7,0x6DE8,0x6DE9,0x6DEA,0x6DED,0x6DEF,0x6DF0,0x6DF2, +0x6DF4,0x6DF5,0x6DF6,0x6DF8,0x6DFA,0x6DFD,0x6DFE,0x6DFF, +0x6E00,0x6E01,0x6E02,0x6E03,0x6E04,0x6E06,0x6E07,0x6E08, +0x6E09,0x6E0B,0x6E0F,0x6E12,0x6E13,0x6E15,0x6E18,0x6E19, +0x6E1B,0x6E1C,0x6E1E,0x6E1F,0x6E22,0x6E26,0x6E27,0x6E28, +0x6E2A,0x6E2C,0x6E2E,0x6E30,0x6E31,0x6E33,0x6E35, 0, +0x6E36,0x6E37,0x6E39,0x6E3B,0x6E3C,0x6E3D,0x6E3E,0x6E3F, +0x6E40,0x6E41,0x6E42,0x6E45,0x6E46,0x6E47,0x6E48,0x6E49, +0x6E4A,0x6E4B,0x6E4C,0x6E4F,0x6E50,0x6E51,0x6E52,0x6E55, +0x6E57,0x6E59,0x6E5A,0x6E5C,0x6E5D,0x6E5E,0x6E60,0x6E61, +0x6E62,0x6E63,0x6E64,0x6E65,0x6E66,0x6E67,0x6E68,0x6E69, +0x6E6A,0x6E6C,0x6E6D,0x6E6F,0x6E70,0x6E71,0x6E72,0x6E73, +0x6E74,0x6E75,0x6E76,0x6E77,0x6E78,0x6E79,0x6E7A,0x6E7B, +0x6E7C,0x6E7D,0x6E80,0x6E81,0x6E82,0x6E84,0x6E87,0x6E88, +0x6E8A,0x6E8B,0x6E8C,0x6E8D,0x6E8E,0x6E91,0x6E92,0x6E93, +0x6E94,0x6E95,0x6E96,0x6E97,0x6E99,0x6E9A,0x6E9B,0x6E9D, +0x6E9E,0x6EA0,0x6EA1,0x6EA3,0x6EA4,0x6EA6,0x6EA8,0x6EA9, +0x6EAB,0x6EAC,0x6EAD,0x6EAE,0x6EB0,0x6EB3,0x6EB5,0x6EB8, +0x6EB9,0x6EBC,0x6EBE,0x6EBF,0x6EC0,0x6EC3,0x6EC4,0x6EC5, +0x6EC6,0x6EC8,0x6EC9,0x6ECA,0x6ECC,0x6ECD,0x6ECE,0x6ED0, +0x6ED2,0x6ED6,0x6ED8,0x6ED9,0x6EDB,0x6EDC,0x6EDD,0x6EE3, +0x6EE7,0x6EEA,0x6EEB,0x6EEC,0x6EED,0x6EEE,0x6EEF, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6EF0,0x6EF1,0x6EF2,0x6EF3,0x6EF5,0x6EF6,0x6EF7,0x6EF8, +0x6EFA,0x6EFB,0x6EFC,0x6EFD,0x6EFE,0x6EFF,0x6F00,0x6F01, +0x6F03,0x6F04,0x6F05,0x6F07,0x6F08,0x6F0A,0x6F0B,0x6F0C, +0x6F0D,0x6F0E,0x6F10,0x6F11,0x6F12,0x6F16,0x6F17,0x6F18, +0x6F19,0x6F1A,0x6F1B,0x6F1C,0x6F1D,0x6F1E,0x6F1F,0x6F21, +0x6F22,0x6F23,0x6F25,0x6F26,0x6F27,0x6F28,0x6F2C,0x6F2E, +0x6F30,0x6F32,0x6F34,0x6F35,0x6F37,0x6F38,0x6F39,0x6F3A, +0x6F3B,0x6F3C,0x6F3D,0x6F3F,0x6F40,0x6F41,0x6F42, 0, +0x6F43,0x6F44,0x6F45,0x6F48,0x6F49,0x6F4A,0x6F4C,0x6F4E, +0x6F4F,0x6F50,0x6F51,0x6F52,0x6F53,0x6F54,0x6F55,0x6F56, +0x6F57,0x6F59,0x6F5A,0x6F5B,0x6F5D,0x6F5F,0x6F60,0x6F61, +0x6F63,0x6F64,0x6F65,0x6F67,0x6F68,0x6F69,0x6F6A,0x6F6B, +0x6F6C,0x6F6F,0x6F70,0x6F71,0x6F73,0x6F75,0x6F76,0x6F77, +0x6F79,0x6F7B,0x6F7D,0x6F7E,0x6F7F,0x6F80,0x6F81,0x6F82, +0x6F83,0x6F85,0x6F86,0x6F87,0x6F8A,0x6F8B,0x6F8F,0x6F90, +0x6F91,0x6F92,0x6F93,0x6F94,0x6F95,0x6F96,0x6F97,0x6F98, +0x6F99,0x6F9A,0x6F9B,0x6F9D,0x6F9E,0x6F9F,0x6FA0,0x6FA2, +0x6FA3,0x6FA4,0x6FA5,0x6FA6,0x6FA8,0x6FA9,0x6FAA,0x6FAB, +0x6FAC,0x6FAD,0x6FAE,0x6FAF,0x6FB0,0x6FB1,0x6FB2,0x6FB4, +0x6FB5,0x6FB7,0x6FB8,0x6FBA,0x6FBB,0x6FBC,0x6FBD,0x6FBE, +0x6FBF,0x6FC1,0x6FC3,0x6FC4,0x6FC5,0x6FC6,0x6FC7,0x6FC8, +0x6FCA,0x6FCB,0x6FCC,0x6FCD,0x6FCE,0x6FCF,0x6FD0,0x6FD3, +0x6FD4,0x6FD5,0x6FD6,0x6FD7,0x6FD8,0x6FD9,0x6FDA,0x6FDB, +0x6FDC,0x6FDD,0x6FDF,0x6FE2,0x6FE3,0x6FE4,0x6FE5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x6FE6,0x6FE7,0x6FE8,0x6FE9,0x6FEA,0x6FEB,0x6FEC,0x6FED, +0x6FF0,0x6FF1,0x6FF2,0x6FF3,0x6FF4,0x6FF5,0x6FF6,0x6FF7, +0x6FF8,0x6FF9,0x6FFA,0x6FFB,0x6FFC,0x6FFD,0x6FFE,0x6FFF, +0x7000,0x7001,0x7002,0x7003,0x7004,0x7005,0x7006,0x7007, +0x7008,0x7009,0x700A,0x700B,0x700C,0x700D,0x700E,0x700F, +0x7010,0x7012,0x7013,0x7014,0x7015,0x7016,0x7017,0x7018, +0x7019,0x701C,0x701D,0x701E,0x701F,0x7020,0x7021,0x7022, +0x7024,0x7025,0x7026,0x7027,0x7028,0x7029,0x702A, 0, +0x702B,0x702C,0x702D,0x702E,0x702F,0x7030,0x7031,0x7032, +0x7033,0x7034,0x7036,0x7037,0x7038,0x703A,0x703B,0x703C, +0x703D,0x703E,0x703F,0x7040,0x7041,0x7042,0x7043,0x7044, +0x7045,0x7046,0x7047,0x7048,0x7049,0x704A,0x704B,0x704D, +0x704E,0x7050,0x7051,0x7052,0x7053,0x7054,0x7055,0x7056, +0x7057,0x7058,0x7059,0x705A,0x705B,0x705C,0x705D,0x705F, +0x7060,0x7061,0x7062,0x7063,0x7064,0x7065,0x7066,0x7067, +0x7068,0x7069,0x706A,0x706E,0x7071,0x7072,0x7073,0x7074, +0x7077,0x7079,0x707A,0x707B,0x707D,0x7081,0x7082,0x7083, +0x7084,0x7086,0x7087,0x7088,0x708B,0x708C,0x708D,0x708F, +0x7090,0x7091,0x7093,0x7097,0x7098,0x709A,0x709B,0x709E, +0x709F,0x70A0,0x70A1,0x70A2,0x70A3,0x70A4,0x70A5,0x70A6, +0x70A7,0x70A8,0x70A9,0x70AA,0x70B0,0x70B2,0x70B4,0x70B5, +0x70B6,0x70BA,0x70BE,0x70BF,0x70C4,0x70C5,0x70C6,0x70C7, +0x70C9,0x70CB,0x70CC,0x70CD,0x70CE,0x70CF,0x70D0,0x70D1, +0x70D2,0x70D3,0x70D4,0x70D5,0x70D6,0x70D7,0x70DA, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x70DC,0x70DD,0x70DE,0x70E0,0x70E1,0x70E2,0x70E3,0x70E5, +0x70EA,0x70EE,0x70F0,0x70F1,0x70F2,0x70F3,0x70F4,0x70F5, +0x70F6,0x70F8,0x70FA,0x70FB,0x70FC,0x70FE,0x70FF,0x7100, +0x7101,0x7102,0x7103,0x7104,0x7105,0x7106,0x7107,0x7108, +0x710B,0x710C,0x710D,0x710E,0x710F,0x7111,0x7112,0x7114, +0x7117,0x711B,0x711C,0x711D,0x711E,0x711F,0x7120,0x7121, +0x7122,0x7123,0x7124,0x7125,0x7127,0x7128,0x7129,0x712A, +0x712B,0x712C,0x712D,0x712E,0x7132,0x7133,0x7134, 0, +0x7135,0x7137,0x7138,0x7139,0x713A,0x713B,0x713C,0x713D, +0x713E,0x713F,0x7140,0x7141,0x7142,0x7143,0x7144,0x7146, +0x7147,0x7148,0x7149,0x714B,0x714D,0x714F,0x7150,0x7151, +0x7152,0x7153,0x7154,0x7155,0x7156,0x7157,0x7158,0x7159, +0x715A,0x715B,0x715D,0x715F,0x7160,0x7161,0x7162,0x7163, +0x7165,0x7169,0x716A,0x716B,0x716C,0x716D,0x716F,0x7170, +0x7171,0x7174,0x7175,0x7176,0x7177,0x7179,0x717B,0x717C, +0x717E,0x717F,0x7180,0x7181,0x7182,0x7183,0x7185,0x7186, +0x7187,0x7188,0x7189,0x718B,0x718C,0x718D,0x718E,0x7190, +0x7191,0x7192,0x7193,0x7195,0x7196,0x7197,0x719A,0x719B, +0x719C,0x719D,0x719E,0x71A1,0x71A2,0x71A3,0x71A4,0x71A5, +0x71A6,0x71A7,0x71A9,0x71AA,0x71AB,0x71AD,0x71AE,0x71AF, +0x71B0,0x71B1,0x71B2,0x71B4,0x71B6,0x71B7,0x71B8,0x71BA, +0x71BB,0x71BC,0x71BD,0x71BE,0x71BF,0x71C0,0x71C1,0x71C2, +0x71C4,0x71C5,0x71C6,0x71C7,0x71C8,0x71C9,0x71CA,0x71CB, +0x71CC,0x71CD,0x71CF,0x71D0,0x71D1,0x71D2,0x71D3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x71D6,0x71D7,0x71D8,0x71D9,0x71DA,0x71DB,0x71DC,0x71DD, +0x71DE,0x71DF,0x71E1,0x71E2,0x71E3,0x71E4,0x71E6,0x71E8, +0x71E9,0x71EA,0x71EB,0x71EC,0x71ED,0x71EF,0x71F0,0x71F1, +0x71F2,0x71F3,0x71F4,0x71F5,0x71F6,0x71F7,0x71F8,0x71FA, +0x71FB,0x71FC,0x71FD,0x71FE,0x71FF,0x7200,0x7201,0x7202, +0x7203,0x7204,0x7205,0x7207,0x7208,0x7209,0x720A,0x720B, +0x720C,0x720D,0x720E,0x720F,0x7210,0x7211,0x7212,0x7213, +0x7214,0x7215,0x7216,0x7217,0x7218,0x7219,0x721A, 0, +0x721B,0x721C,0x721E,0x721F,0x7220,0x7221,0x7222,0x7223, +0x7224,0x7225,0x7226,0x7227,0x7229,0x722B,0x722D,0x722E, +0x722F,0x7232,0x7233,0x7234,0x723A,0x723C,0x723E,0x7240, +0x7241,0x7242,0x7243,0x7244,0x7245,0x7246,0x7249,0x724A, +0x724B,0x724E,0x724F,0x7250,0x7251,0x7253,0x7254,0x7255, +0x7257,0x7258,0x725A,0x725C,0x725E,0x7260,0x7263,0x7264, +0x7265,0x7268,0x726A,0x726B,0x726C,0x726D,0x7270,0x7271, +0x7273,0x7274,0x7276,0x7277,0x7278,0x727B,0x727C,0x727D, +0x7282,0x7283,0x7285,0x7286,0x7287,0x7288,0x7289,0x728C, +0x728E,0x7290,0x7291,0x7293,0x7294,0x7295,0x7296,0x7297, +0x7298,0x7299,0x729A,0x729B,0x729C,0x729D,0x729E,0x72A0, +0x72A1,0x72A2,0x72A3,0x72A4,0x72A5,0x72A6,0x72A7,0x72A8, +0x72A9,0x72AA,0x72AB,0x72AE,0x72B1,0x72B2,0x72B3,0x72B5, +0x72BA,0x72BB,0x72BC,0x72BD,0x72BE,0x72BF,0x72C0,0x72C5, +0x72C6,0x72C7,0x72C9,0x72CA,0x72CB,0x72CC,0x72CF,0x72D1, +0x72D3,0x72D4,0x72D5,0x72D6,0x72D8,0x72DA,0x72DB, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x3000,0x3001,0x3002,0x00B7,0x02C9,0x02C7,0x00A8, +0x3003,0x3005,0x2014,0xFF5E,0x2016,0x2026,0x2018,0x2019, +0x201C,0x201D,0x3014,0x3015,0x3008,0x3009,0x300A,0x300B, +0x300C,0x300D,0x300E,0x300F,0x3016,0x3017,0x3010,0x3011, +0x00B1,0x00D7,0x00F7,0x2236,0x2227,0x2228,0x2211,0x220F, +0x222A,0x2229,0x2208,0x2237,0x221A,0x22A5,0x2225,0x2220, +0x2312,0x2299,0x222B,0x222E,0x2261,0x224C,0x2248,0x223D, +0x221D,0x2260,0x226E,0x226F,0x2264,0x2265,0x221E,0x2235, +0x2234,0x2642,0x2640,0x00B0,0x2032,0x2033,0x2103,0xFF04, +0x00A4,0xFFE0,0xFFE1,0x2030,0x00A7,0x2116,0x2606,0x2605, +0x25CB,0x25CF,0x25CE,0x25C7,0x25C6,0x25A1,0x25A0,0x25B3, +0x25B2,0x203B,0x2192,0x2190,0x2191,0x2193,0x3013, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x2170,0x2171,0x2172,0x2173,0x2174,0x2175,0x2176, +0x2177,0x2178,0x2179, 0, 0, 0, 0, 0, + 0,0x2488,0x2489,0x248A,0x248B,0x248C,0x248D,0x248E, +0x248F,0x2490,0x2491,0x2492,0x2493,0x2494,0x2495,0x2496, +0x2497,0x2498,0x2499,0x249A,0x249B,0x2474,0x2475,0x2476, +0x2477,0x2478,0x2479,0x247A,0x247B,0x247C,0x247D,0x247E, +0x247F,0x2480,0x2481,0x2482,0x2483,0x2484,0x2485,0x2486, +0x2487,0x2460,0x2461,0x2462,0x2463,0x2464,0x2465,0x2466, +0x2467,0x2468,0x2469, 0, 0,0x3220,0x3221,0x3222, +0x3223,0x3224,0x3225,0x3226,0x3227,0x3228,0x3229, 0, + 0,0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166, +0x2167,0x2168,0x2169,0x216A,0x216B, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xFF01,0xFF02,0xFF03,0xFFE5,0xFF05,0xFF06,0xFF07, +0xFF08,0xFF09,0xFF0A,0xFF0B,0xFF0C,0xFF0D,0xFF0E,0xFF0F, +0xFF10,0xFF11,0xFF12,0xFF13,0xFF14,0xFF15,0xFF16,0xFF17, +0xFF18,0xFF19,0xFF1A,0xFF1B,0xFF1C,0xFF1D,0xFF1E,0xFF1F, +0xFF20,0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27, +0xFF28,0xFF29,0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F, +0xFF30,0xFF31,0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37, +0xFF38,0xFF39,0xFF3A,0xFF3B,0xFF3C,0xFF3D,0xFF3E,0xFF3F, +0xFF40,0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47, +0xFF48,0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F, +0xFF50,0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,0xFF56,0xFF57, +0xFF58,0xFF59,0xFF5A,0xFF5B,0xFF5C,0xFF5D,0xFFE3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x3041,0x3042,0x3043,0x3044,0x3045,0x3046,0x3047, +0x3048,0x3049,0x304A,0x304B,0x304C,0x304D,0x304E,0x304F, +0x3050,0x3051,0x3052,0x3053,0x3054,0x3055,0x3056,0x3057, +0x3058,0x3059,0x305A,0x305B,0x305C,0x305D,0x305E,0x305F, +0x3060,0x3061,0x3062,0x3063,0x3064,0x3065,0x3066,0x3067, +0x3068,0x3069,0x306A,0x306B,0x306C,0x306D,0x306E,0x306F, +0x3070,0x3071,0x3072,0x3073,0x3074,0x3075,0x3076,0x3077, +0x3078,0x3079,0x307A,0x307B,0x307C,0x307D,0x307E,0x307F, +0x3080,0x3081,0x3082,0x3083,0x3084,0x3085,0x3086,0x3087, +0x3088,0x3089,0x308A,0x308B,0x308C,0x308D,0x308E,0x308F, +0x3090,0x3091,0x3092,0x3093, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x30A1,0x30A2,0x30A3,0x30A4,0x30A5,0x30A6,0x30A7, +0x30A8,0x30A9,0x30AA,0x30AB,0x30AC,0x30AD,0x30AE,0x30AF, +0x30B0,0x30B1,0x30B2,0x30B3,0x30B4,0x30B5,0x30B6,0x30B7, +0x30B8,0x30B9,0x30BA,0x30BB,0x30BC,0x30BD,0x30BE,0x30BF, +0x30C0,0x30C1,0x30C2,0x30C3,0x30C4,0x30C5,0x30C6,0x30C7, +0x30C8,0x30C9,0x30CA,0x30CB,0x30CC,0x30CD,0x30CE,0x30CF, +0x30D0,0x30D1,0x30D2,0x30D3,0x30D4,0x30D5,0x30D6,0x30D7, +0x30D8,0x30D9,0x30DA,0x30DB,0x30DC,0x30DD,0x30DE,0x30DF, +0x30E0,0x30E1,0x30E2,0x30E3,0x30E4,0x30E5,0x30E6,0x30E7, +0x30E8,0x30E9,0x30EA,0x30EB,0x30EC,0x30ED,0x30EE,0x30EF, +0x30F0,0x30F1,0x30F2,0x30F3,0x30F4,0x30F5,0x30F6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397, +0x0398,0x0399,0x039A,0x039B,0x039C,0x039D,0x039E,0x039F, +0x03A0,0x03A1,0x03A3,0x03A4,0x03A5,0x03A6,0x03A7,0x03A8, +0x03A9, 0, 0, 0, 0, 0, 0, 0, + 0,0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6,0x03B7, +0x03B8,0x03B9,0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF, +0x03C0,0x03C1,0x03C3,0x03C4,0x03C5,0x03C6,0x03C7,0x03C8, +0x03C9, 0, 0, 0, 0, 0, 0, 0, +0xFE35,0xFE36,0xFE39,0xFE3A,0xFE3F,0xFE40,0xFE3D,0xFE3E, +0xFE41,0xFE42,0xFE43,0xFE44, 0, 0,0xFE3B,0xFE3C, +0xFE37,0xFE38,0xFE31, 0,0xFE33,0xFE34, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0401, +0x0416,0x0417,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D, +0x041E,0x041F,0x0420,0x0421,0x0422,0x0423,0x0424,0x0425, +0x0426,0x0427,0x0428,0x0429,0x042A,0x042B,0x042C,0x042D, +0x042E,0x042F, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0451, +0x0436,0x0437,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D, +0x043E,0x043F,0x0440,0x0441,0x0442,0x0443,0x0444,0x0445, +0x0446,0x0447,0x0448,0x0449,0x044A,0x044B,0x044C,0x044D, +0x044E,0x044F, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x02CA,0x02CB,0x02D9,0x2013,0x2015,0x2025,0x2035,0x2105, +0x2109,0x2196,0x2197,0x2198,0x2199,0x2215,0x221F,0x2223, +0x2252,0x2266,0x2267,0x22BF,0x2550,0x2551,0x2552,0x2553, +0x2554,0x2555,0x2556,0x2557,0x2558,0x2559,0x255A,0x255B, +0x255C,0x255D,0x255E,0x255F,0x2560,0x2561,0x2562,0x2563, +0x2564,0x2565,0x2566,0x2567,0x2568,0x2569,0x256A,0x256B, +0x256C,0x256D,0x256E,0x256F,0x2570,0x2571,0x2572,0x2573, +0x2581,0x2582,0x2583,0x2584,0x2585,0x2586,0x2587, 0, +0x2588,0x2589,0x258A,0x258B,0x258C,0x258D,0x258E,0x258F, +0x2593,0x2594,0x2595,0x25BC,0x25BD,0x25E2,0x25E3,0x25E4, +0x25E5,0x2609,0x2295,0x3012,0x301D,0x301E, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x0101,0x00E1,0x01CE,0x00E0,0x0113,0x00E9,0x011B, +0x00E8,0x012B,0x00ED,0x01D0,0x00EC,0x014D,0x00F3,0x01D2, +0x00F2,0x016B,0x00FA,0x01D4,0x00F9,0x01D6,0x01D8,0x01DA, +0x01DC,0x00FC,0x00EA,0x0251, 0,0x0144,0x0148, 0, +0x0261, 0, 0, 0, 0,0x3105,0x3106,0x3107, +0x3108,0x3109,0x310A,0x310B,0x310C,0x310D,0x310E,0x310F, +0x3110,0x3111,0x3112,0x3113,0x3114,0x3115,0x3116,0x3117, +0x3118,0x3119,0x311A,0x311B,0x311C,0x311D,0x311E,0x311F, +0x3120,0x3121,0x3122,0x3123,0x3124,0x3125,0x3126,0x3127, +0x3128,0x3129, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x3021,0x3022,0x3023,0x3024,0x3025,0x3026,0x3027,0x3028, +0x3029,0x32A3,0x338E,0x338F,0x339C,0x339D,0x339E,0x33A1, +0x33C4,0x33CE,0x33D1,0x33D2,0x33D5,0xFE30,0xFFE2,0xFFE4, + 0,0x2121,0x3231, 0,0x2010, 0, 0, 0, +0x30FC,0x309B,0x309C,0x30FD,0x30FE,0x3006,0x309D,0x309E, +0xFE49,0xFE4A,0xFE4B,0xFE4C,0xFE4D,0xFE4E,0xFE4F,0xFE50, +0xFE51,0xFE52,0xFE54,0xFE55,0xFE56,0xFE57,0xFE59,0xFE5A, +0xFE5B,0xFE5C,0xFE5D,0xFE5E,0xFE5F,0xFE60,0xFE61, 0, +0xFE62,0xFE63,0xFE64,0xFE65,0xFE66,0xFE68,0xFE69,0xFE6A, +0xFE6B, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x3007, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x2500,0x2501,0x2502,0x2503, +0x2504,0x2505,0x2506,0x2507,0x2508,0x2509,0x250A,0x250B, +0x250C,0x250D,0x250E,0x250F,0x2510,0x2511,0x2512,0x2513, +0x2514,0x2515,0x2516,0x2517,0x2518,0x2519,0x251A,0x251B, +0x251C,0x251D,0x251E,0x251F,0x2520,0x2521,0x2522,0x2523, +0x2524,0x2525,0x2526,0x2527,0x2528,0x2529,0x252A,0x252B, +0x252C,0x252D,0x252E,0x252F,0x2530,0x2531,0x2532,0x2533, +0x2534,0x2535,0x2536,0x2537,0x2538,0x2539,0x253A,0x253B, +0x253C,0x253D,0x253E,0x253F,0x2540,0x2541,0x2542,0x2543, +0x2544,0x2545,0x2546,0x2547,0x2548,0x2549,0x254A,0x254B, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x72DC,0x72DD,0x72DF,0x72E2,0x72E3,0x72E4,0x72E5,0x72E6, +0x72E7,0x72EA,0x72EB,0x72F5,0x72F6,0x72F9,0x72FD,0x72FE, +0x72FF,0x7300,0x7302,0x7304,0x7305,0x7306,0x7307,0x7308, +0x7309,0x730B,0x730C,0x730D,0x730F,0x7310,0x7311,0x7312, +0x7314,0x7318,0x7319,0x731A,0x731F,0x7320,0x7323,0x7324, +0x7326,0x7327,0x7328,0x732D,0x732F,0x7330,0x7332,0x7333, +0x7335,0x7336,0x733A,0x733B,0x733C,0x733D,0x7340,0x7341, +0x7342,0x7343,0x7344,0x7345,0x7346,0x7347,0x7348, 0, +0x7349,0x734A,0x734B,0x734C,0x734E,0x734F,0x7351,0x7353, +0x7354,0x7355,0x7356,0x7358,0x7359,0x735A,0x735B,0x735C, +0x735D,0x735E,0x735F,0x7361,0x7362,0x7363,0x7364,0x7365, +0x7366,0x7367,0x7368,0x7369,0x736A,0x736B,0x736E,0x7370, +0x7371, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7372,0x7373,0x7374,0x7375,0x7376,0x7377,0x7378,0x7379, +0x737A,0x737B,0x737C,0x737D,0x737F,0x7380,0x7381,0x7382, +0x7383,0x7385,0x7386,0x7388,0x738A,0x738C,0x738D,0x738F, +0x7390,0x7392,0x7393,0x7394,0x7395,0x7397,0x7398,0x7399, +0x739A,0x739C,0x739D,0x739E,0x73A0,0x73A1,0x73A3,0x73A4, +0x73A5,0x73A6,0x73A7,0x73A8,0x73AA,0x73AC,0x73AD,0x73B1, +0x73B4,0x73B5,0x73B6,0x73B8,0x73B9,0x73BC,0x73BD,0x73BE, +0x73BF,0x73C1,0x73C3,0x73C4,0x73C5,0x73C6,0x73C7, 0, +0x73CB,0x73CC,0x73CE,0x73D2,0x73D3,0x73D4,0x73D5,0x73D6, +0x73D7,0x73D8,0x73DA,0x73DB,0x73DC,0x73DD,0x73DF,0x73E1, +0x73E2,0x73E3,0x73E4,0x73E6,0x73E8,0x73EA,0x73EB,0x73EC, +0x73EE,0x73EF,0x73F0,0x73F1,0x73F3,0x73F4,0x73F5,0x73F6, +0x73F7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x73F8,0x73F9,0x73FA,0x73FB,0x73FC,0x73FD,0x73FE,0x73FF, +0x7400,0x7401,0x7402,0x7404,0x7407,0x7408,0x740B,0x740C, +0x740D,0x740E,0x7411,0x7412,0x7413,0x7414,0x7415,0x7416, +0x7417,0x7418,0x7419,0x741C,0x741D,0x741E,0x741F,0x7420, +0x7421,0x7423,0x7424,0x7427,0x7429,0x742B,0x742D,0x742F, +0x7431,0x7432,0x7437,0x7438,0x7439,0x743A,0x743B,0x743D, +0x743E,0x743F,0x7440,0x7442,0x7443,0x7444,0x7445,0x7446, +0x7447,0x7448,0x7449,0x744A,0x744B,0x744C,0x744D, 0, +0x744E,0x744F,0x7450,0x7451,0x7452,0x7453,0x7454,0x7456, +0x7458,0x745D,0x7460,0x7461,0x7462,0x7463,0x7464,0x7465, +0x7466,0x7467,0x7468,0x7469,0x746A,0x746B,0x746C,0x746E, +0x746F,0x7471,0x7472,0x7473,0x7474,0x7475,0x7478,0x7479, +0x747A, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x747B,0x747C,0x747D,0x747F,0x7482,0x7484,0x7485,0x7486, +0x7488,0x7489,0x748A,0x748C,0x748D,0x748F,0x7491,0x7492, +0x7493,0x7494,0x7495,0x7496,0x7497,0x7498,0x7499,0x749A, +0x749B,0x749D,0x749F,0x74A0,0x74A1,0x74A2,0x74A3,0x74A4, +0x74A5,0x74A6,0x74AA,0x74AB,0x74AC,0x74AD,0x74AE,0x74AF, +0x74B0,0x74B1,0x74B2,0x74B3,0x74B4,0x74B5,0x74B6,0x74B7, +0x74B8,0x74B9,0x74BB,0x74BC,0x74BD,0x74BE,0x74BF,0x74C0, +0x74C1,0x74C2,0x74C3,0x74C4,0x74C5,0x74C6,0x74C7, 0, +0x74C8,0x74C9,0x74CA,0x74CB,0x74CC,0x74CD,0x74CE,0x74CF, +0x74D0,0x74D1,0x74D3,0x74D4,0x74D5,0x74D6,0x74D7,0x74D8, +0x74D9,0x74DA,0x74DB,0x74DD,0x74DF,0x74E1,0x74E5,0x74E7, +0x74E8,0x74E9,0x74EA,0x74EB,0x74EC,0x74ED,0x74F0,0x74F1, +0x74F2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x74F3,0x74F5,0x74F8,0x74F9,0x74FA,0x74FB,0x74FC,0x74FD, +0x74FE,0x7500,0x7501,0x7502,0x7503,0x7505,0x7506,0x7507, +0x7508,0x7509,0x750A,0x750B,0x750C,0x750E,0x7510,0x7512, +0x7514,0x7515,0x7516,0x7517,0x751B,0x751D,0x751E,0x7520, +0x7521,0x7522,0x7523,0x7524,0x7526,0x7527,0x752A,0x752E, +0x7534,0x7536,0x7539,0x753C,0x753D,0x753F,0x7541,0x7542, +0x7543,0x7544,0x7546,0x7547,0x7549,0x754A,0x754D,0x7550, +0x7551,0x7552,0x7553,0x7555,0x7556,0x7557,0x7558, 0, +0x755D,0x755E,0x755F,0x7560,0x7561,0x7562,0x7563,0x7564, +0x7567,0x7568,0x7569,0x756B,0x756C,0x756D,0x756E,0x756F, +0x7570,0x7571,0x7573,0x7575,0x7576,0x7577,0x757A,0x757B, +0x757C,0x757D,0x757E,0x7580,0x7581,0x7582,0x7584,0x7585, +0x7587, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7588,0x7589,0x758A,0x758C,0x758D,0x758E,0x7590,0x7593, +0x7595,0x7598,0x759B,0x759C,0x759E,0x75A2,0x75A6,0x75A7, +0x75A8,0x75A9,0x75AA,0x75AD,0x75B6,0x75B7,0x75BA,0x75BB, +0x75BF,0x75C0,0x75C1,0x75C6,0x75CB,0x75CC,0x75CE,0x75CF, +0x75D0,0x75D1,0x75D3,0x75D7,0x75D9,0x75DA,0x75DC,0x75DD, +0x75DF,0x75E0,0x75E1,0x75E5,0x75E9,0x75EC,0x75ED,0x75EE, +0x75EF,0x75F2,0x75F3,0x75F5,0x75F6,0x75F7,0x75F8,0x75FA, +0x75FB,0x75FD,0x75FE,0x7602,0x7604,0x7606,0x7607, 0, +0x7608,0x7609,0x760B,0x760D,0x760E,0x760F,0x7611,0x7612, +0x7613,0x7614,0x7616,0x761A,0x761C,0x761D,0x761E,0x7621, +0x7623,0x7627,0x7628,0x762C,0x762E,0x762F,0x7631,0x7632, +0x7636,0x7637,0x7639,0x763A,0x763B,0x763D,0x7641,0x7642, +0x7644, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7645,0x7646,0x7647,0x7648,0x7649,0x764A,0x764B,0x764E, +0x764F,0x7650,0x7651,0x7652,0x7653,0x7655,0x7657,0x7658, +0x7659,0x765A,0x765B,0x765D,0x765F,0x7660,0x7661,0x7662, +0x7664,0x7665,0x7666,0x7667,0x7668,0x7669,0x766A,0x766C, +0x766D,0x766E,0x7670,0x7671,0x7672,0x7673,0x7674,0x7675, +0x7676,0x7677,0x7679,0x767A,0x767C,0x767F,0x7680,0x7681, +0x7683,0x7685,0x7689,0x768A,0x768C,0x768D,0x768F,0x7690, +0x7692,0x7694,0x7695,0x7697,0x7698,0x769A,0x769B, 0, +0x769C,0x769D,0x769E,0x769F,0x76A0,0x76A1,0x76A2,0x76A3, +0x76A5,0x76A6,0x76A7,0x76A8,0x76A9,0x76AA,0x76AB,0x76AC, +0x76AD,0x76AF,0x76B0,0x76B3,0x76B5,0x76B6,0x76B7,0x76B8, +0x76B9,0x76BA,0x76BB,0x76BC,0x76BD,0x76BE,0x76C0,0x76C1, +0x76C3,0x554A,0x963F,0x57C3,0x6328,0x54CE,0x5509,0x54C0, +0x7691,0x764C,0x853C,0x77EE,0x827E,0x788D,0x7231,0x9698, +0x978D,0x6C28,0x5B89,0x4FFA,0x6309,0x6697,0x5CB8,0x80FA, +0x6848,0x80AE,0x6602,0x76CE,0x51F9,0x6556,0x71AC,0x7FF1, +0x8884,0x50B2,0x5965,0x61CA,0x6FB3,0x82AD,0x634C,0x6252, +0x53ED,0x5427,0x7B06,0x516B,0x75A4,0x5DF4,0x62D4,0x8DCB, +0x9776,0x628A,0x8019,0x575D,0x9738,0x7F62,0x7238,0x767D, +0x67CF,0x767E,0x6446,0x4F70,0x8D25,0x62DC,0x7A17,0x6591, +0x73ED,0x642C,0x6273,0x822C,0x9881,0x677F,0x7248,0x626E, +0x62CC,0x4F34,0x74E3,0x534A,0x529E,0x7ECA,0x90A6,0x5E2E, +0x6886,0x699C,0x8180,0x7ED1,0x68D2,0x78C5,0x868C,0x9551, +0x508D,0x8C24,0x82DE,0x80DE,0x5305,0x8912,0x5265, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x76C4,0x76C7,0x76C9,0x76CB,0x76CC,0x76D3,0x76D5,0x76D9, +0x76DA,0x76DC,0x76DD,0x76DE,0x76E0,0x76E1,0x76E2,0x76E3, +0x76E4,0x76E6,0x76E7,0x76E8,0x76E9,0x76EA,0x76EB,0x76EC, +0x76ED,0x76F0,0x76F3,0x76F5,0x76F6,0x76F7,0x76FA,0x76FB, +0x76FD,0x76FF,0x7700,0x7702,0x7703,0x7705,0x7706,0x770A, +0x770C,0x770E,0x770F,0x7710,0x7711,0x7712,0x7713,0x7714, +0x7715,0x7716,0x7717,0x7718,0x771B,0x771C,0x771D,0x771E, +0x7721,0x7723,0x7724,0x7725,0x7727,0x772A,0x772B, 0, +0x772C,0x772E,0x7730,0x7731,0x7732,0x7733,0x7734,0x7739, +0x773B,0x773D,0x773E,0x773F,0x7742,0x7744,0x7745,0x7746, +0x7748,0x7749,0x774A,0x774B,0x774C,0x774D,0x774E,0x774F, +0x7752,0x7753,0x7754,0x7755,0x7756,0x7757,0x7758,0x7759, +0x775C,0x8584,0x96F9,0x4FDD,0x5821,0x9971,0x5B9D,0x62B1, +0x62A5,0x66B4,0x8C79,0x9C8D,0x7206,0x676F,0x7891,0x60B2, +0x5351,0x5317,0x8F88,0x80CC,0x8D1D,0x94A1,0x500D,0x72C8, +0x5907,0x60EB,0x7119,0x88AB,0x5954,0x82EF,0x672C,0x7B28, +0x5D29,0x7EF7,0x752D,0x6CF5,0x8E66,0x8FF8,0x903C,0x9F3B, +0x6BD4,0x9119,0x7B14,0x5F7C,0x78A7,0x84D6,0x853D,0x6BD5, +0x6BD9,0x6BD6,0x5E01,0x5E87,0x75F9,0x95ED,0x655D,0x5F0A, +0x5FC5,0x8F9F,0x58C1,0x81C2,0x907F,0x965B,0x97AD,0x8FB9, +0x7F16,0x8D2C,0x6241,0x4FBF,0x53D8,0x535E,0x8FA8,0x8FA9, +0x8FAB,0x904D,0x6807,0x5F6A,0x8198,0x8868,0x9CD6,0x618B, +0x522B,0x762A,0x5F6C,0x658C,0x6FD2,0x6EE8,0x5BBE,0x6448, +0x5175,0x51B0,0x67C4,0x4E19,0x79C9,0x997C,0x70B3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x775D,0x775E,0x775F,0x7760,0x7764,0x7767,0x7769,0x776A, +0x776D,0x776E,0x776F,0x7770,0x7771,0x7772,0x7773,0x7774, +0x7775,0x7776,0x7777,0x7778,0x777A,0x777B,0x777C,0x7781, +0x7782,0x7783,0x7786,0x7787,0x7788,0x7789,0x778A,0x778B, +0x778F,0x7790,0x7793,0x7794,0x7795,0x7796,0x7797,0x7798, +0x7799,0x779A,0x779B,0x779C,0x779D,0x779E,0x77A1,0x77A3, +0x77A4,0x77A6,0x77A8,0x77AB,0x77AD,0x77AE,0x77AF,0x77B1, +0x77B2,0x77B4,0x77B6,0x77B7,0x77B8,0x77B9,0x77BA, 0, +0x77BC,0x77BE,0x77C0,0x77C1,0x77C2,0x77C3,0x77C4,0x77C5, +0x77C6,0x77C7,0x77C8,0x77C9,0x77CA,0x77CB,0x77CC,0x77CE, +0x77CF,0x77D0,0x77D1,0x77D2,0x77D3,0x77D4,0x77D5,0x77D6, +0x77D8,0x77D9,0x77DA,0x77DD,0x77DE,0x77DF,0x77E0,0x77E1, +0x77E4,0x75C5,0x5E76,0x73BB,0x83E0,0x64AD,0x62E8,0x94B5, +0x6CE2,0x535A,0x52C3,0x640F,0x94C2,0x7B94,0x4F2F,0x5E1B, +0x8236,0x8116,0x818A,0x6E24,0x6CCA,0x9A73,0x6355,0x535C, +0x54FA,0x8865,0x57E0,0x4E0D,0x5E03,0x6B65,0x7C3F,0x90E8, +0x6016,0x64E6,0x731C,0x88C1,0x6750,0x624D,0x8D22,0x776C, +0x8E29,0x91C7,0x5F69,0x83DC,0x8521,0x9910,0x53C2,0x8695, +0x6B8B,0x60ED,0x60E8,0x707F,0x82CD,0x8231,0x4ED3,0x6CA7, +0x85CF,0x64CD,0x7CD9,0x69FD,0x66F9,0x8349,0x5395,0x7B56, +0x4FA7,0x518C,0x6D4B,0x5C42,0x8E6D,0x63D2,0x53C9,0x832C, +0x8336,0x67E5,0x78B4,0x643D,0x5BDF,0x5C94,0x5DEE,0x8BE7, +0x62C6,0x67F4,0x8C7A,0x6400,0x63BA,0x8749,0x998B,0x8C17, +0x7F20,0x94F2,0x4EA7,0x9610,0x98A4,0x660C,0x7316, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x77E6,0x77E8,0x77EA,0x77EF,0x77F0,0x77F1,0x77F2,0x77F4, +0x77F5,0x77F7,0x77F9,0x77FA,0x77FB,0x77FC,0x7803,0x7804, +0x7805,0x7806,0x7807,0x7808,0x780A,0x780B,0x780E,0x780F, +0x7810,0x7813,0x7815,0x7819,0x781B,0x781E,0x7820,0x7821, +0x7822,0x7824,0x7828,0x782A,0x782B,0x782E,0x782F,0x7831, +0x7832,0x7833,0x7835,0x7836,0x783D,0x783F,0x7841,0x7842, +0x7843,0x7844,0x7846,0x7848,0x7849,0x784A,0x784B,0x784D, +0x784F,0x7851,0x7853,0x7854,0x7858,0x7859,0x785A, 0, +0x785B,0x785C,0x785E,0x785F,0x7860,0x7861,0x7862,0x7863, +0x7864,0x7865,0x7866,0x7867,0x7868,0x7869,0x786F,0x7870, +0x7871,0x7872,0x7873,0x7874,0x7875,0x7876,0x7878,0x7879, +0x787A,0x787B,0x787D,0x787E,0x787F,0x7880,0x7881,0x7882, +0x7883,0x573A,0x5C1D,0x5E38,0x957F,0x507F,0x80A0,0x5382, +0x655E,0x7545,0x5531,0x5021,0x8D85,0x6284,0x949E,0x671D, +0x5632,0x6F6E,0x5DE2,0x5435,0x7092,0x8F66,0x626F,0x64A4, +0x63A3,0x5F7B,0x6F88,0x90F4,0x81E3,0x8FB0,0x5C18,0x6668, +0x5FF1,0x6C89,0x9648,0x8D81,0x886C,0x6491,0x79F0,0x57CE, +0x6A59,0x6210,0x5448,0x4E58,0x7A0B,0x60E9,0x6F84,0x8BDA, +0x627F,0x901E,0x9A8B,0x79E4,0x5403,0x75F4,0x6301,0x5319, +0x6C60,0x8FDF,0x5F1B,0x9A70,0x803B,0x9F7F,0x4F88,0x5C3A, +0x8D64,0x7FC5,0x65A5,0x70BD,0x5145,0x51B2,0x866B,0x5D07, +0x5BA0,0x62BD,0x916C,0x7574,0x8E0C,0x7A20,0x6101,0x7B79, +0x4EC7,0x7EF8,0x7785,0x4E11,0x81ED,0x521D,0x51FA,0x6A71, +0x53A8,0x8E87,0x9504,0x96CF,0x6EC1,0x9664,0x695A, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7884,0x7885,0x7886,0x7888,0x788A,0x788B,0x788F,0x7890, +0x7892,0x7894,0x7895,0x7896,0x7899,0x789D,0x789E,0x78A0, +0x78A2,0x78A4,0x78A6,0x78A8,0x78A9,0x78AA,0x78AB,0x78AC, +0x78AD,0x78AE,0x78AF,0x78B5,0x78B6,0x78B7,0x78B8,0x78BA, +0x78BB,0x78BC,0x78BD,0x78BF,0x78C0,0x78C2,0x78C3,0x78C4, +0x78C6,0x78C7,0x78C8,0x78CC,0x78CD,0x78CE,0x78CF,0x78D1, +0x78D2,0x78D3,0x78D6,0x78D7,0x78D8,0x78DA,0x78DB,0x78DC, +0x78DD,0x78DE,0x78DF,0x78E0,0x78E1,0x78E2,0x78E3, 0, +0x78E4,0x78E5,0x78E6,0x78E7,0x78E9,0x78EA,0x78EB,0x78ED, +0x78EE,0x78EF,0x78F0,0x78F1,0x78F3,0x78F5,0x78F6,0x78F8, +0x78F9,0x78FB,0x78FC,0x78FD,0x78FE,0x78FF,0x7900,0x7902, +0x7903,0x7904,0x7906,0x7907,0x7908,0x7909,0x790A,0x790B, +0x790C,0x7840,0x50A8,0x77D7,0x6410,0x89E6,0x5904,0x63E3, +0x5DDD,0x7A7F,0x693D,0x4F20,0x8239,0x5598,0x4E32,0x75AE, +0x7A97,0x5E62,0x5E8A,0x95EF,0x521B,0x5439,0x708A,0x6376, +0x9524,0x5782,0x6625,0x693F,0x9187,0x5507,0x6DF3,0x7EAF, +0x8822,0x6233,0x7EF0,0x75B5,0x8328,0x78C1,0x96CC,0x8F9E, +0x6148,0x74F7,0x8BCD,0x6B64,0x523A,0x8D50,0x6B21,0x806A, +0x8471,0x56F1,0x5306,0x4ECE,0x4E1B,0x51D1,0x7C97,0x918B, +0x7C07,0x4FC3,0x8E7F,0x7BE1,0x7A9C,0x6467,0x5D14,0x50AC, +0x8106,0x7601,0x7CB9,0x6DEC,0x7FE0,0x6751,0x5B58,0x5BF8, +0x78CB,0x64AE,0x6413,0x63AA,0x632B,0x9519,0x642D,0x8FBE, +0x7B54,0x7629,0x6253,0x5927,0x5446,0x6B79,0x50A3,0x6234, +0x5E26,0x6B86,0x4EE3,0x8D37,0x888B,0x5F85,0x902E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x790D,0x790E,0x790F,0x7910,0x7911,0x7912,0x7914,0x7915, +0x7916,0x7917,0x7918,0x7919,0x791A,0x791B,0x791C,0x791D, +0x791F,0x7920,0x7921,0x7922,0x7923,0x7925,0x7926,0x7927, +0x7928,0x7929,0x792A,0x792B,0x792C,0x792D,0x792E,0x792F, +0x7930,0x7931,0x7932,0x7933,0x7935,0x7936,0x7937,0x7938, +0x7939,0x793D,0x793F,0x7942,0x7943,0x7944,0x7945,0x7947, +0x794A,0x794B,0x794C,0x794D,0x794E,0x794F,0x7950,0x7951, +0x7952,0x7954,0x7955,0x7958,0x7959,0x7961,0x7963, 0, +0x7964,0x7966,0x7969,0x796A,0x796B,0x796C,0x796E,0x7970, +0x7971,0x7972,0x7973,0x7974,0x7975,0x7976,0x7979,0x797B, +0x797C,0x797D,0x797E,0x797F,0x7982,0x7983,0x7986,0x7987, +0x7988,0x7989,0x798B,0x798C,0x798D,0x798E,0x7990,0x7991, +0x7992,0x6020,0x803D,0x62C5,0x4E39,0x5355,0x90F8,0x63B8, +0x80C6,0x65E6,0x6C2E,0x4F46,0x60EE,0x6DE1,0x8BDE,0x5F39, +0x86CB,0x5F53,0x6321,0x515A,0x8361,0x6863,0x5200,0x6363, +0x8E48,0x5012,0x5C9B,0x7977,0x5BFC,0x5230,0x7A3B,0x60BC, +0x9053,0x76D7,0x5FB7,0x5F97,0x7684,0x8E6C,0x706F,0x767B, +0x7B49,0x77AA,0x51F3,0x9093,0x5824,0x4F4E,0x6EF4,0x8FEA, +0x654C,0x7B1B,0x72C4,0x6DA4,0x7FDF,0x5AE1,0x62B5,0x5E95, +0x5730,0x8482,0x7B2C,0x5E1D,0x5F1F,0x9012,0x7F14,0x98A0, +0x6382,0x6EC7,0x7898,0x70B9,0x5178,0x975B,0x57AB,0x7535, +0x4F43,0x7538,0x5E97,0x60E6,0x5960,0x6DC0,0x6BBF,0x7889, +0x53FC,0x96D5,0x51CB,0x5201,0x6389,0x540A,0x9493,0x8C03, +0x8DCC,0x7239,0x789F,0x8776,0x8FED,0x8C0D,0x53E0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7993,0x7994,0x7995,0x7996,0x7997,0x7998,0x7999,0x799B, +0x799C,0x799D,0x799E,0x799F,0x79A0,0x79A1,0x79A2,0x79A3, +0x79A4,0x79A5,0x79A6,0x79A8,0x79A9,0x79AA,0x79AB,0x79AC, +0x79AD,0x79AE,0x79AF,0x79B0,0x79B1,0x79B2,0x79B4,0x79B5, +0x79B6,0x79B7,0x79B8,0x79BC,0x79BF,0x79C2,0x79C4,0x79C5, +0x79C7,0x79C8,0x79CA,0x79CC,0x79CE,0x79CF,0x79D0,0x79D3, +0x79D4,0x79D6,0x79D7,0x79D9,0x79DA,0x79DB,0x79DC,0x79DD, +0x79DE,0x79E0,0x79E1,0x79E2,0x79E5,0x79E8,0x79EA, 0, +0x79EC,0x79EE,0x79F1,0x79F2,0x79F3,0x79F4,0x79F5,0x79F6, +0x79F7,0x79F9,0x79FA,0x79FC,0x79FE,0x79FF,0x7A01,0x7A04, +0x7A05,0x7A07,0x7A08,0x7A09,0x7A0A,0x7A0C,0x7A0F,0x7A10, +0x7A11,0x7A12,0x7A13,0x7A15,0x7A16,0x7A18,0x7A19,0x7A1B, +0x7A1C,0x4E01,0x76EF,0x53EE,0x9489,0x9876,0x9F0E,0x952D, +0x5B9A,0x8BA2,0x4E22,0x4E1C,0x51AC,0x8463,0x61C2,0x52A8, +0x680B,0x4F97,0x606B,0x51BB,0x6D1E,0x515C,0x6296,0x6597, +0x9661,0x8C46,0x9017,0x75D8,0x90FD,0x7763,0x6BD2,0x728A, +0x72EC,0x8BFB,0x5835,0x7779,0x8D4C,0x675C,0x9540,0x809A, +0x5EA6,0x6E21,0x5992,0x7AEF,0x77ED,0x953B,0x6BB5,0x65AD, +0x7F0E,0x5806,0x5151,0x961F,0x5BF9,0x58A9,0x5428,0x8E72, +0x6566,0x987F,0x56E4,0x949D,0x76FE,0x9041,0x6387,0x54C6, +0x591A,0x593A,0x579B,0x8EB2,0x6735,0x8DFA,0x8235,0x5241, +0x60F0,0x5815,0x86FE,0x5CE8,0x9E45,0x4FC4,0x989D,0x8BB9, +0x5A25,0x6076,0x5384,0x627C,0x904F,0x9102,0x997F,0x6069, +0x800C,0x513F,0x8033,0x5C14,0x9975,0x6D31,0x4E8C, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7A1D,0x7A1F,0x7A21,0x7A22,0x7A24,0x7A25,0x7A26,0x7A27, +0x7A28,0x7A29,0x7A2A,0x7A2B,0x7A2C,0x7A2D,0x7A2E,0x7A2F, +0x7A30,0x7A31,0x7A32,0x7A34,0x7A35,0x7A36,0x7A38,0x7A3A, +0x7A3E,0x7A40,0x7A41,0x7A42,0x7A43,0x7A44,0x7A45,0x7A47, +0x7A48,0x7A49,0x7A4A,0x7A4B,0x7A4C,0x7A4D,0x7A4E,0x7A4F, +0x7A50,0x7A52,0x7A53,0x7A54,0x7A55,0x7A56,0x7A58,0x7A59, +0x7A5A,0x7A5B,0x7A5C,0x7A5D,0x7A5E,0x7A5F,0x7A60,0x7A61, +0x7A62,0x7A63,0x7A64,0x7A65,0x7A66,0x7A67,0x7A68, 0, +0x7A69,0x7A6A,0x7A6B,0x7A6C,0x7A6D,0x7A6E,0x7A6F,0x7A71, +0x7A72,0x7A73,0x7A75,0x7A7B,0x7A7C,0x7A7D,0x7A7E,0x7A82, +0x7A85,0x7A87,0x7A89,0x7A8A,0x7A8B,0x7A8C,0x7A8E,0x7A8F, +0x7A90,0x7A93,0x7A94,0x7A99,0x7A9A,0x7A9B,0x7A9E,0x7AA1, +0x7AA2,0x8D30,0x53D1,0x7F5A,0x7B4F,0x4F10,0x4E4F,0x9600, +0x6CD5,0x73D0,0x85E9,0x5E06,0x756A,0x7FFB,0x6A0A,0x77FE, +0x9492,0x7E41,0x51E1,0x70E6,0x53CD,0x8FD4,0x8303,0x8D29, +0x72AF,0x996D,0x6CDB,0x574A,0x82B3,0x65B9,0x80AA,0x623F, +0x9632,0x59A8,0x4EFF,0x8BBF,0x7EBA,0x653E,0x83F2,0x975E, +0x5561,0x98DE,0x80A5,0x532A,0x8BFD,0x5420,0x80BA,0x5E9F, +0x6CB8,0x8D39,0x82AC,0x915A,0x5429,0x6C1B,0x5206,0x7EB7, +0x575F,0x711A,0x6C7E,0x7C89,0x594B,0x4EFD,0x5FFF,0x6124, +0x7CAA,0x4E30,0x5C01,0x67AB,0x8702,0x5CF0,0x950B,0x98CE, +0x75AF,0x70FD,0x9022,0x51AF,0x7F1D,0x8BBD,0x5949,0x51E4, +0x4F5B,0x5426,0x592B,0x6577,0x80A4,0x5B75,0x6276,0x62C2, +0x8F90,0x5E45,0x6C1F,0x7B26,0x4F0F,0x4FD8,0x670D, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7AA3,0x7AA4,0x7AA7,0x7AA9,0x7AAA,0x7AAB,0x7AAE,0x7AAF, +0x7AB0,0x7AB1,0x7AB2,0x7AB4,0x7AB5,0x7AB6,0x7AB7,0x7AB8, +0x7AB9,0x7ABA,0x7ABB,0x7ABC,0x7ABD,0x7ABE,0x7AC0,0x7AC1, +0x7AC2,0x7AC3,0x7AC4,0x7AC5,0x7AC6,0x7AC7,0x7AC8,0x7AC9, +0x7ACA,0x7ACC,0x7ACD,0x7ACE,0x7ACF,0x7AD0,0x7AD1,0x7AD2, +0x7AD3,0x7AD4,0x7AD5,0x7AD7,0x7AD8,0x7ADA,0x7ADB,0x7ADC, +0x7ADD,0x7AE1,0x7AE2,0x7AE4,0x7AE7,0x7AE8,0x7AE9,0x7AEA, +0x7AEB,0x7AEC,0x7AEE,0x7AF0,0x7AF1,0x7AF2,0x7AF3, 0, +0x7AF4,0x7AF5,0x7AF6,0x7AF7,0x7AF8,0x7AFB,0x7AFC,0x7AFE, +0x7B00,0x7B01,0x7B02,0x7B05,0x7B07,0x7B09,0x7B0C,0x7B0D, +0x7B0E,0x7B10,0x7B12,0x7B13,0x7B16,0x7B17,0x7B18,0x7B1A, +0x7B1C,0x7B1D,0x7B1F,0x7B21,0x7B22,0x7B23,0x7B27,0x7B29, +0x7B2D,0x6D6E,0x6DAA,0x798F,0x88B1,0x5F17,0x752B,0x629A, +0x8F85,0x4FEF,0x91DC,0x65A7,0x812F,0x8151,0x5E9C,0x8150, +0x8D74,0x526F,0x8986,0x8D4B,0x590D,0x5085,0x4ED8,0x961C, +0x7236,0x8179,0x8D1F,0x5BCC,0x8BA3,0x9644,0x5987,0x7F1A, +0x5490,0x5676,0x560E,0x8BE5,0x6539,0x6982,0x9499,0x76D6, +0x6E89,0x5E72,0x7518,0x6746,0x67D1,0x7AFF,0x809D,0x8D76, +0x611F,0x79C6,0x6562,0x8D63,0x5188,0x521A,0x94A2,0x7F38, +0x809B,0x7EB2,0x5C97,0x6E2F,0x6760,0x7BD9,0x768B,0x9AD8, +0x818F,0x7F94,0x7CD5,0x641E,0x9550,0x7A3F,0x544A,0x54E5, +0x6B4C,0x6401,0x6208,0x9E3D,0x80F3,0x7599,0x5272,0x9769, +0x845B,0x683C,0x86E4,0x9601,0x9694,0x94EC,0x4E2A,0x5404, +0x7ED9,0x6839,0x8DDF,0x8015,0x66F4,0x5E9A,0x7FB9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7B2F,0x7B30,0x7B32,0x7B34,0x7B35,0x7B36,0x7B37,0x7B39, +0x7B3B,0x7B3D,0x7B3F,0x7B40,0x7B41,0x7B42,0x7B43,0x7B44, +0x7B46,0x7B48,0x7B4A,0x7B4D,0x7B4E,0x7B53,0x7B55,0x7B57, +0x7B59,0x7B5C,0x7B5E,0x7B5F,0x7B61,0x7B63,0x7B64,0x7B65, +0x7B66,0x7B67,0x7B68,0x7B69,0x7B6A,0x7B6B,0x7B6C,0x7B6D, +0x7B6F,0x7B70,0x7B73,0x7B74,0x7B76,0x7B78,0x7B7A,0x7B7C, +0x7B7D,0x7B7F,0x7B81,0x7B82,0x7B83,0x7B84,0x7B86,0x7B87, +0x7B88,0x7B89,0x7B8A,0x7B8B,0x7B8C,0x7B8E,0x7B8F, 0, +0x7B91,0x7B92,0x7B93,0x7B96,0x7B98,0x7B99,0x7B9A,0x7B9B, +0x7B9E,0x7B9F,0x7BA0,0x7BA3,0x7BA4,0x7BA5,0x7BAE,0x7BAF, +0x7BB0,0x7BB2,0x7BB3,0x7BB5,0x7BB6,0x7BB7,0x7BB9,0x7BBA, +0x7BBB,0x7BBC,0x7BBD,0x7BBE,0x7BBF,0x7BC0,0x7BC2,0x7BC3, +0x7BC4,0x57C2,0x803F,0x6897,0x5DE5,0x653B,0x529F,0x606D, +0x9F9A,0x4F9B,0x8EAC,0x516C,0x5BAB,0x5F13,0x5DE9,0x6C5E, +0x62F1,0x8D21,0x5171,0x94A9,0x52FE,0x6C9F,0x82DF,0x72D7, +0x57A2,0x6784,0x8D2D,0x591F,0x8F9C,0x83C7,0x5495,0x7B8D, +0x4F30,0x6CBD,0x5B64,0x59D1,0x9F13,0x53E4,0x86CA,0x9AA8, +0x8C37,0x80A1,0x6545,0x987E,0x56FA,0x96C7,0x522E,0x74DC, +0x5250,0x5BE1,0x6302,0x8902,0x4E56,0x62D0,0x602A,0x68FA, +0x5173,0x5B98,0x51A0,0x89C2,0x7BA1,0x9986,0x7F50,0x60EF, +0x704C,0x8D2F,0x5149,0x5E7F,0x901B,0x7470,0x89C4,0x572D, +0x7845,0x5F52,0x9F9F,0x95FA,0x8F68,0x9B3C,0x8BE1,0x7678, +0x6842,0x67DC,0x8DEA,0x8D35,0x523D,0x8F8A,0x6EDA,0x68CD, +0x9505,0x90ED,0x56FD,0x679C,0x88F9,0x8FC7,0x54C8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7BC5,0x7BC8,0x7BC9,0x7BCA,0x7BCB,0x7BCD,0x7BCE,0x7BCF, +0x7BD0,0x7BD2,0x7BD4,0x7BD5,0x7BD6,0x7BD7,0x7BD8,0x7BDB, +0x7BDC,0x7BDE,0x7BDF,0x7BE0,0x7BE2,0x7BE3,0x7BE4,0x7BE7, +0x7BE8,0x7BE9,0x7BEB,0x7BEC,0x7BED,0x7BEF,0x7BF0,0x7BF2, +0x7BF3,0x7BF4,0x7BF5,0x7BF6,0x7BF8,0x7BF9,0x7BFA,0x7BFB, +0x7BFD,0x7BFF,0x7C00,0x7C01,0x7C02,0x7C03,0x7C04,0x7C05, +0x7C06,0x7C08,0x7C09,0x7C0A,0x7C0D,0x7C0E,0x7C10,0x7C11, +0x7C12,0x7C13,0x7C14,0x7C15,0x7C17,0x7C18,0x7C19, 0, +0x7C1A,0x7C1B,0x7C1C,0x7C1D,0x7C1E,0x7C20,0x7C21,0x7C22, +0x7C23,0x7C24,0x7C25,0x7C28,0x7C29,0x7C2B,0x7C2C,0x7C2D, +0x7C2E,0x7C2F,0x7C30,0x7C31,0x7C32,0x7C33,0x7C34,0x7C35, +0x7C36,0x7C37,0x7C39,0x7C3A,0x7C3B,0x7C3C,0x7C3D,0x7C3E, +0x7C42,0x9AB8,0x5B69,0x6D77,0x6C26,0x4EA5,0x5BB3,0x9A87, +0x9163,0x61A8,0x90AF,0x97E9,0x542B,0x6DB5,0x5BD2,0x51FD, +0x558A,0x7F55,0x7FF0,0x64BC,0x634D,0x65F1,0x61BE,0x608D, +0x710A,0x6C57,0x6C49,0x592F,0x676D,0x822A,0x58D5,0x568E, +0x8C6A,0x6BEB,0x90DD,0x597D,0x8017,0x53F7,0x6D69,0x5475, +0x559D,0x8377,0x83CF,0x6838,0x79BE,0x548C,0x4F55,0x5408, +0x76D2,0x8C89,0x9602,0x6CB3,0x6DB8,0x8D6B,0x8910,0x9E64, +0x8D3A,0x563F,0x9ED1,0x75D5,0x5F88,0x72E0,0x6068,0x54FC, +0x4EA8,0x6A2A,0x8861,0x6052,0x8F70,0x54C4,0x70D8,0x8679, +0x9E3F,0x6D2A,0x5B8F,0x5F18,0x7EA2,0x5589,0x4FAF,0x7334, +0x543C,0x539A,0x5019,0x540E,0x547C,0x4E4E,0x5FFD,0x745A, +0x58F6,0x846B,0x80E1,0x8774,0x72D0,0x7CCA,0x6E56, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7C43,0x7C44,0x7C45,0x7C46,0x7C47,0x7C48,0x7C49,0x7C4A, +0x7C4B,0x7C4C,0x7C4E,0x7C4F,0x7C50,0x7C51,0x7C52,0x7C53, +0x7C54,0x7C55,0x7C56,0x7C57,0x7C58,0x7C59,0x7C5A,0x7C5B, +0x7C5C,0x7C5D,0x7C5E,0x7C5F,0x7C60,0x7C61,0x7C62,0x7C63, +0x7C64,0x7C65,0x7C66,0x7C67,0x7C68,0x7C69,0x7C6A,0x7C6B, +0x7C6C,0x7C6D,0x7C6E,0x7C6F,0x7C70,0x7C71,0x7C72,0x7C75, +0x7C76,0x7C77,0x7C78,0x7C79,0x7C7A,0x7C7E,0x7C7F,0x7C80, +0x7C81,0x7C82,0x7C83,0x7C84,0x7C85,0x7C86,0x7C87, 0, +0x7C88,0x7C8A,0x7C8B,0x7C8C,0x7C8D,0x7C8E,0x7C8F,0x7C90, +0x7C93,0x7C94,0x7C96,0x7C99,0x7C9A,0x7C9B,0x7CA0,0x7CA1, +0x7CA3,0x7CA6,0x7CA7,0x7CA8,0x7CA9,0x7CAB,0x7CAC,0x7CAD, +0x7CAF,0x7CB0,0x7CB4,0x7CB5,0x7CB6,0x7CB7,0x7CB8,0x7CBA, +0x7CBB,0x5F27,0x864E,0x552C,0x62A4,0x4E92,0x6CAA,0x6237, +0x82B1,0x54D7,0x534E,0x733E,0x6ED1,0x753B,0x5212,0x5316, +0x8BDD,0x69D0,0x5F8A,0x6000,0x6DEE,0x574F,0x6B22,0x73AF, +0x6853,0x8FD8,0x7F13,0x6362,0x60A3,0x5524,0x75EA,0x8C62, +0x7115,0x6DA3,0x5BA6,0x5E7B,0x8352,0x614C,0x9EC4,0x78FA, +0x8757,0x7C27,0x7687,0x51F0,0x60F6,0x714C,0x6643,0x5E4C, +0x604D,0x8C0E,0x7070,0x6325,0x8F89,0x5FBD,0x6062,0x86D4, +0x56DE,0x6BC1,0x6094,0x6167,0x5349,0x60E0,0x6666,0x8D3F, +0x79FD,0x4F1A,0x70E9,0x6C47,0x8BB3,0x8BF2,0x7ED8,0x8364, +0x660F,0x5A5A,0x9B42,0x6D51,0x6DF7,0x8C41,0x6D3B,0x4F19, +0x706B,0x83B7,0x6216,0x60D1,0x970D,0x8D27,0x7978,0x51FB, +0x573E,0x57FA,0x673A,0x7578,0x7A3D,0x79EF,0x7B95, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7CBF,0x7CC0,0x7CC2,0x7CC3,0x7CC4,0x7CC6,0x7CC9,0x7CCB, +0x7CCE,0x7CCF,0x7CD0,0x7CD1,0x7CD2,0x7CD3,0x7CD4,0x7CD8, +0x7CDA,0x7CDB,0x7CDD,0x7CDE,0x7CE1,0x7CE2,0x7CE3,0x7CE4, +0x7CE5,0x7CE6,0x7CE7,0x7CE9,0x7CEA,0x7CEB,0x7CEC,0x7CED, +0x7CEE,0x7CF0,0x7CF1,0x7CF2,0x7CF3,0x7CF4,0x7CF5,0x7CF6, +0x7CF7,0x7CF9,0x7CFA,0x7CFC,0x7CFD,0x7CFE,0x7CFF,0x7D00, +0x7D01,0x7D02,0x7D03,0x7D04,0x7D05,0x7D06,0x7D07,0x7D08, +0x7D09,0x7D0B,0x7D0C,0x7D0D,0x7D0E,0x7D0F,0x7D10, 0, +0x7D11,0x7D12,0x7D13,0x7D14,0x7D15,0x7D16,0x7D17,0x7D18, +0x7D19,0x7D1A,0x7D1B,0x7D1C,0x7D1D,0x7D1E,0x7D1F,0x7D21, +0x7D23,0x7D24,0x7D25,0x7D26,0x7D28,0x7D29,0x7D2A,0x7D2C, +0x7D2D,0x7D2E,0x7D30,0x7D31,0x7D32,0x7D33,0x7D34,0x7D35, +0x7D36,0x808C,0x9965,0x8FF9,0x6FC0,0x8BA5,0x9E21,0x59EC, +0x7EE9,0x7F09,0x5409,0x6781,0x68D8,0x8F91,0x7C4D,0x96C6, +0x53CA,0x6025,0x75BE,0x6C72,0x5373,0x5AC9,0x7EA7,0x6324, +0x51E0,0x810A,0x5DF1,0x84DF,0x6280,0x5180,0x5B63,0x4F0E, +0x796D,0x5242,0x60B8,0x6D4E,0x5BC4,0x5BC2,0x8BA1,0x8BB0, +0x65E2,0x5FCC,0x9645,0x5993,0x7EE7,0x7EAA,0x5609,0x67B7, +0x5939,0x4F73,0x5BB6,0x52A0,0x835A,0x988A,0x8D3E,0x7532, +0x94BE,0x5047,0x7A3C,0x4EF7,0x67B6,0x9A7E,0x5AC1,0x6B7C, +0x76D1,0x575A,0x5C16,0x7B3A,0x95F4,0x714E,0x517C,0x80A9, +0x8270,0x5978,0x7F04,0x8327,0x68C0,0x67EC,0x78B1,0x7877, +0x62E3,0x6361,0x7B80,0x4FED,0x526A,0x51CF,0x8350,0x69DB, +0x9274,0x8DF5,0x8D31,0x89C1,0x952E,0x7BAD,0x4EF6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7D37,0x7D38,0x7D39,0x7D3A,0x7D3B,0x7D3C,0x7D3D,0x7D3E, +0x7D3F,0x7D40,0x7D41,0x7D42,0x7D43,0x7D44,0x7D45,0x7D46, +0x7D47,0x7D48,0x7D49,0x7D4A,0x7D4B,0x7D4C,0x7D4D,0x7D4E, +0x7D4F,0x7D50,0x7D51,0x7D52,0x7D53,0x7D54,0x7D55,0x7D56, +0x7D57,0x7D58,0x7D59,0x7D5A,0x7D5B,0x7D5C,0x7D5D,0x7D5E, +0x7D5F,0x7D60,0x7D61,0x7D62,0x7D63,0x7D64,0x7D65,0x7D66, +0x7D67,0x7D68,0x7D69,0x7D6A,0x7D6B,0x7D6C,0x7D6D,0x7D6F, +0x7D70,0x7D71,0x7D72,0x7D73,0x7D74,0x7D75,0x7D76, 0, +0x7D78,0x7D79,0x7D7A,0x7D7B,0x7D7C,0x7D7D,0x7D7E,0x7D7F, +0x7D80,0x7D81,0x7D82,0x7D83,0x7D84,0x7D85,0x7D86,0x7D87, +0x7D88,0x7D89,0x7D8A,0x7D8B,0x7D8C,0x7D8D,0x7D8E,0x7D8F, +0x7D90,0x7D91,0x7D92,0x7D93,0x7D94,0x7D95,0x7D96,0x7D97, +0x7D98,0x5065,0x8230,0x5251,0x996F,0x6E10,0x6E85,0x6DA7, +0x5EFA,0x50F5,0x59DC,0x5C06,0x6D46,0x6C5F,0x7586,0x848B, +0x6868,0x5956,0x8BB2,0x5320,0x9171,0x964D,0x8549,0x6912, +0x7901,0x7126,0x80F6,0x4EA4,0x90CA,0x6D47,0x9A84,0x5A07, +0x56BC,0x6405,0x94F0,0x77EB,0x4FA5,0x811A,0x72E1,0x89D2, +0x997A,0x7F34,0x7EDE,0x527F,0x6559,0x9175,0x8F7F,0x8F83, +0x53EB,0x7A96,0x63ED,0x63A5,0x7686,0x79F8,0x8857,0x9636, +0x622A,0x52AB,0x8282,0x6854,0x6770,0x6377,0x776B,0x7AED, +0x6D01,0x7ED3,0x89E3,0x59D0,0x6212,0x85C9,0x82A5,0x754C, +0x501F,0x4ECB,0x75A5,0x8BEB,0x5C4A,0x5DFE,0x7B4B,0x65A4, +0x91D1,0x4ECA,0x6D25,0x895F,0x7D27,0x9526,0x4EC5,0x8C28, +0x8FDB,0x9773,0x664B,0x7981,0x8FD1,0x70EC,0x6D78, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7D99,0x7D9A,0x7D9B,0x7D9C,0x7D9D,0x7D9E,0x7D9F,0x7DA0, +0x7DA1,0x7DA2,0x7DA3,0x7DA4,0x7DA5,0x7DA7,0x7DA8,0x7DA9, +0x7DAA,0x7DAB,0x7DAC,0x7DAD,0x7DAF,0x7DB0,0x7DB1,0x7DB2, +0x7DB3,0x7DB4,0x7DB5,0x7DB6,0x7DB7,0x7DB8,0x7DB9,0x7DBA, +0x7DBB,0x7DBC,0x7DBD,0x7DBE,0x7DBF,0x7DC0,0x7DC1,0x7DC2, +0x7DC3,0x7DC4,0x7DC5,0x7DC6,0x7DC7,0x7DC8,0x7DC9,0x7DCA, +0x7DCB,0x7DCC,0x7DCD,0x7DCE,0x7DCF,0x7DD0,0x7DD1,0x7DD2, +0x7DD3,0x7DD4,0x7DD5,0x7DD6,0x7DD7,0x7DD8,0x7DD9, 0, +0x7DDA,0x7DDB,0x7DDC,0x7DDD,0x7DDE,0x7DDF,0x7DE0,0x7DE1, +0x7DE2,0x7DE3,0x7DE4,0x7DE5,0x7DE6,0x7DE7,0x7DE8,0x7DE9, +0x7DEA,0x7DEB,0x7DEC,0x7DED,0x7DEE,0x7DEF,0x7DF0,0x7DF1, +0x7DF2,0x7DF3,0x7DF4,0x7DF5,0x7DF6,0x7DF7,0x7DF8,0x7DF9, +0x7DFA,0x5C3D,0x52B2,0x8346,0x5162,0x830E,0x775B,0x6676, +0x9CB8,0x4EAC,0x60CA,0x7CBE,0x7CB3,0x7ECF,0x4E95,0x8B66, +0x666F,0x9888,0x9759,0x5883,0x656C,0x955C,0x5F84,0x75C9, +0x9756,0x7ADF,0x7ADE,0x51C0,0x70AF,0x7A98,0x63EA,0x7A76, +0x7EA0,0x7396,0x97ED,0x4E45,0x7078,0x4E5D,0x9152,0x53A9, +0x6551,0x65E7,0x81FC,0x8205,0x548E,0x5C31,0x759A,0x97A0, +0x62D8,0x72D9,0x75BD,0x5C45,0x9A79,0x83CA,0x5C40,0x5480, +0x77E9,0x4E3E,0x6CAE,0x805A,0x62D2,0x636E,0x5DE8,0x5177, +0x8DDD,0x8E1E,0x952F,0x4FF1,0x53E5,0x60E7,0x70AC,0x5267, +0x6350,0x9E43,0x5A1F,0x5026,0x7737,0x5377,0x7EE2,0x6485, +0x652B,0x6289,0x6398,0x5014,0x7235,0x89C9,0x51B3,0x8BC0, +0x7EDD,0x5747,0x83CC,0x94A7,0x519B,0x541B,0x5CFB, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7DFB,0x7DFC,0x7DFD,0x7DFE,0x7DFF,0x7E00,0x7E01,0x7E02, +0x7E03,0x7E04,0x7E05,0x7E06,0x7E07,0x7E08,0x7E09,0x7E0A, +0x7E0B,0x7E0C,0x7E0D,0x7E0E,0x7E0F,0x7E10,0x7E11,0x7E12, +0x7E13,0x7E14,0x7E15,0x7E16,0x7E17,0x7E18,0x7E19,0x7E1A, +0x7E1B,0x7E1C,0x7E1D,0x7E1E,0x7E1F,0x7E20,0x7E21,0x7E22, +0x7E23,0x7E24,0x7E25,0x7E26,0x7E27,0x7E28,0x7E29,0x7E2A, +0x7E2B,0x7E2C,0x7E2D,0x7E2E,0x7E2F,0x7E30,0x7E31,0x7E32, +0x7E33,0x7E34,0x7E35,0x7E36,0x7E37,0x7E38,0x7E39, 0, +0x7E3A,0x7E3C,0x7E3D,0x7E3E,0x7E3F,0x7E40,0x7E42,0x7E43, +0x7E44,0x7E45,0x7E46,0x7E48,0x7E49,0x7E4A,0x7E4B,0x7E4C, +0x7E4D,0x7E4E,0x7E4F,0x7E50,0x7E51,0x7E52,0x7E53,0x7E54, +0x7E55,0x7E56,0x7E57,0x7E58,0x7E59,0x7E5A,0x7E5B,0x7E5C, +0x7E5D,0x4FCA,0x7AE3,0x6D5A,0x90E1,0x9A8F,0x5580,0x5496, +0x5361,0x54AF,0x5F00,0x63E9,0x6977,0x51EF,0x6168,0x520A, +0x582A,0x52D8,0x574E,0x780D,0x770B,0x5EB7,0x6177,0x7CE0, +0x625B,0x6297,0x4EA2,0x7095,0x8003,0x62F7,0x70E4,0x9760, +0x5777,0x82DB,0x67EF,0x68F5,0x78D5,0x9897,0x79D1,0x58F3, +0x54B3,0x53EF,0x6E34,0x514B,0x523B,0x5BA2,0x8BFE,0x80AF, +0x5543,0x57A6,0x6073,0x5751,0x542D,0x7A7A,0x6050,0x5B54, +0x63A7,0x62A0,0x53E3,0x6263,0x5BC7,0x67AF,0x54ED,0x7A9F, +0x82E6,0x9177,0x5E93,0x88E4,0x5938,0x57AE,0x630E,0x8DE8, +0x80EF,0x5757,0x7B77,0x4FA9,0x5FEB,0x5BBD,0x6B3E,0x5321, +0x7B50,0x72C2,0x6846,0x77FF,0x7736,0x65F7,0x51B5,0x4E8F, +0x76D4,0x5CBF,0x7AA5,0x8475,0x594E,0x9B41,0x5080, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7E5E,0x7E5F,0x7E60,0x7E61,0x7E62,0x7E63,0x7E64,0x7E65, +0x7E66,0x7E67,0x7E68,0x7E69,0x7E6A,0x7E6B,0x7E6C,0x7E6D, +0x7E6E,0x7E6F,0x7E70,0x7E71,0x7E72,0x7E73,0x7E74,0x7E75, +0x7E76,0x7E77,0x7E78,0x7E79,0x7E7A,0x7E7B,0x7E7C,0x7E7D, +0x7E7E,0x7E7F,0x7E80,0x7E81,0x7E83,0x7E84,0x7E85,0x7E86, +0x7E87,0x7E88,0x7E89,0x7E8A,0x7E8B,0x7E8C,0x7E8D,0x7E8E, +0x7E8F,0x7E90,0x7E91,0x7E92,0x7E93,0x7E94,0x7E95,0x7E96, +0x7E97,0x7E98,0x7E99,0x7E9A,0x7E9C,0x7E9D,0x7E9E, 0, +0x7EAE,0x7EB4,0x7EBB,0x7EBC,0x7ED6,0x7EE4,0x7EEC,0x7EF9, +0x7F0A,0x7F10,0x7F1E,0x7F37,0x7F39,0x7F3B,0x7F3C,0x7F3D, +0x7F3E,0x7F3F,0x7F40,0x7F41,0x7F43,0x7F46,0x7F47,0x7F48, +0x7F49,0x7F4A,0x7F4B,0x7F4C,0x7F4D,0x7F4E,0x7F4F,0x7F52, +0x7F53,0x9988,0x6127,0x6E83,0x5764,0x6606,0x6346,0x56F0, +0x62EC,0x6269,0x5ED3,0x9614,0x5783,0x62C9,0x5587,0x8721, +0x814A,0x8FA3,0x5566,0x83B1,0x6765,0x8D56,0x84DD,0x5A6A, +0x680F,0x62E6,0x7BEE,0x9611,0x5170,0x6F9C,0x8C30,0x63FD, +0x89C8,0x61D2,0x7F06,0x70C2,0x6EE5,0x7405,0x6994,0x72FC, +0x5ECA,0x90CE,0x6717,0x6D6A,0x635E,0x52B3,0x7262,0x8001, +0x4F6C,0x59E5,0x916A,0x70D9,0x6D9D,0x52D2,0x4E50,0x96F7, +0x956D,0x857E,0x78CA,0x7D2F,0x5121,0x5792,0x64C2,0x808B, +0x7C7B,0x6CEA,0x68F1,0x695E,0x51B7,0x5398,0x68A8,0x7281, +0x9ECE,0x7BF1,0x72F8,0x79BB,0x6F13,0x7406,0x674E,0x91CC, +0x9CA4,0x793C,0x8389,0x8354,0x540F,0x6817,0x4E3D,0x5389, +0x52B1,0x783E,0x5386,0x5229,0x5088,0x4F8B,0x4FD0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7F56,0x7F59,0x7F5B,0x7F5C,0x7F5D,0x7F5E,0x7F60,0x7F63, +0x7F64,0x7F65,0x7F66,0x7F67,0x7F6B,0x7F6C,0x7F6D,0x7F6F, +0x7F70,0x7F73,0x7F75,0x7F76,0x7F77,0x7F78,0x7F7A,0x7F7B, +0x7F7C,0x7F7D,0x7F7F,0x7F80,0x7F82,0x7F83,0x7F84,0x7F85, +0x7F86,0x7F87,0x7F88,0x7F89,0x7F8B,0x7F8D,0x7F8F,0x7F90, +0x7F91,0x7F92,0x7F93,0x7F95,0x7F96,0x7F97,0x7F98,0x7F99, +0x7F9B,0x7F9C,0x7FA0,0x7FA2,0x7FA3,0x7FA5,0x7FA6,0x7FA8, +0x7FA9,0x7FAA,0x7FAB,0x7FAC,0x7FAD,0x7FAE,0x7FB1, 0, +0x7FB3,0x7FB4,0x7FB5,0x7FB6,0x7FB7,0x7FBA,0x7FBB,0x7FBE, +0x7FC0,0x7FC2,0x7FC3,0x7FC4,0x7FC6,0x7FC7,0x7FC8,0x7FC9, +0x7FCB,0x7FCD,0x7FCF,0x7FD0,0x7FD1,0x7FD2,0x7FD3,0x7FD6, +0x7FD7,0x7FD9,0x7FDA,0x7FDB,0x7FDC,0x7FDD,0x7FDE,0x7FE2, +0x7FE3,0x75E2,0x7ACB,0x7C92,0x6CA5,0x96B6,0x529B,0x7483, +0x54E9,0x4FE9,0x8054,0x83B2,0x8FDE,0x9570,0x5EC9,0x601C, +0x6D9F,0x5E18,0x655B,0x8138,0x94FE,0x604B,0x70BC,0x7EC3, +0x7CAE,0x51C9,0x6881,0x7CB1,0x826F,0x4E24,0x8F86,0x91CF, +0x667E,0x4EAE,0x8C05,0x64A9,0x804A,0x50DA,0x7597,0x71CE, +0x5BE5,0x8FBD,0x6F66,0x4E86,0x6482,0x9563,0x5ED6,0x6599, +0x5217,0x88C2,0x70C8,0x52A3,0x730E,0x7433,0x6797,0x78F7, +0x9716,0x4E34,0x90BB,0x9CDE,0x6DCB,0x51DB,0x8D41,0x541D, +0x62CE,0x73B2,0x83F1,0x96F6,0x9F84,0x94C3,0x4F36,0x7F9A, +0x51CC,0x7075,0x9675,0x5CAD,0x9886,0x53E6,0x4EE4,0x6E9C, +0x7409,0x69B4,0x786B,0x998F,0x7559,0x5218,0x7624,0x6D41, +0x67F3,0x516D,0x9F99,0x804B,0x5499,0x7B3C,0x7ABF, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7FE4,0x7FE7,0x7FE8,0x7FEA,0x7FEB,0x7FEC,0x7FED,0x7FEF, +0x7FF2,0x7FF4,0x7FF5,0x7FF6,0x7FF7,0x7FF8,0x7FF9,0x7FFA, +0x7FFD,0x7FFE,0x7FFF,0x8002,0x8007,0x8008,0x8009,0x800A, +0x800E,0x800F,0x8011,0x8013,0x801A,0x801B,0x801D,0x801E, +0x801F,0x8021,0x8023,0x8024,0x802B,0x802C,0x802D,0x802E, +0x802F,0x8030,0x8032,0x8034,0x8039,0x803A,0x803C,0x803E, +0x8040,0x8041,0x8044,0x8045,0x8047,0x8048,0x8049,0x804E, +0x804F,0x8050,0x8051,0x8053,0x8055,0x8056,0x8057, 0, +0x8059,0x805B,0x805C,0x805D,0x805E,0x805F,0x8060,0x8061, +0x8062,0x8063,0x8064,0x8065,0x8066,0x8067,0x8068,0x806B, +0x806C,0x806D,0x806E,0x806F,0x8070,0x8072,0x8073,0x8074, +0x8075,0x8076,0x8077,0x8078,0x8079,0x807A,0x807B,0x807C, +0x807D,0x9686,0x5784,0x62E2,0x9647,0x697C,0x5A04,0x6402, +0x7BD3,0x6F0F,0x964B,0x82A6,0x5362,0x9885,0x5E90,0x7089, +0x63B3,0x5364,0x864F,0x9C81,0x9E93,0x788C,0x9732,0x8DEF, +0x8D42,0x9E7F,0x6F5E,0x7984,0x5F55,0x9646,0x622E,0x9A74, +0x5415,0x94DD,0x4FA3,0x65C5,0x5C65,0x5C61,0x7F15,0x8651, +0x6C2F,0x5F8B,0x7387,0x6EE4,0x7EFF,0x5CE6,0x631B,0x5B6A, +0x6EE6,0x5375,0x4E71,0x63A0,0x7565,0x62A1,0x8F6E,0x4F26, +0x4ED1,0x6CA6,0x7EB6,0x8BBA,0x841D,0x87BA,0x7F57,0x903B, +0x9523,0x7BA9,0x9AA1,0x88F8,0x843D,0x6D1B,0x9A86,0x7EDC, +0x5988,0x9EBB,0x739B,0x7801,0x8682,0x9A6C,0x9A82,0x561B, +0x5417,0x57CB,0x4E70,0x9EA6,0x5356,0x8FC8,0x8109,0x7792, +0x9992,0x86EE,0x6EE1,0x8513,0x66FC,0x6162,0x6F2B, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x807E,0x8081,0x8082,0x8085,0x8088,0x808A,0x808D,0x808E, +0x808F,0x8090,0x8091,0x8092,0x8094,0x8095,0x8097,0x8099, +0x809E,0x80A3,0x80A6,0x80A7,0x80A8,0x80AC,0x80B0,0x80B3, +0x80B5,0x80B6,0x80B8,0x80B9,0x80BB,0x80C5,0x80C7,0x80C8, +0x80C9,0x80CA,0x80CB,0x80CF,0x80D0,0x80D1,0x80D2,0x80D3, +0x80D4,0x80D5,0x80D8,0x80DF,0x80E0,0x80E2,0x80E3,0x80E6, +0x80EE,0x80F5,0x80F7,0x80F9,0x80FB,0x80FE,0x80FF,0x8100, +0x8101,0x8103,0x8104,0x8105,0x8107,0x8108,0x810B, 0, +0x810C,0x8115,0x8117,0x8119,0x811B,0x811C,0x811D,0x811F, +0x8120,0x8121,0x8122,0x8123,0x8124,0x8125,0x8126,0x8127, +0x8128,0x8129,0x812A,0x812B,0x812D,0x812E,0x8130,0x8133, +0x8134,0x8135,0x8137,0x8139,0x813A,0x813B,0x813C,0x813D, +0x813F,0x8C29,0x8292,0x832B,0x76F2,0x6C13,0x5FD9,0x83BD, +0x732B,0x8305,0x951A,0x6BDB,0x77DB,0x94C6,0x536F,0x8302, +0x5192,0x5E3D,0x8C8C,0x8D38,0x4E48,0x73AB,0x679A,0x6885, +0x9176,0x9709,0x7164,0x6CA1,0x7709,0x5A92,0x9541,0x6BCF, +0x7F8E,0x6627,0x5BD0,0x59B9,0x5A9A,0x95E8,0x95F7,0x4EEC, +0x840C,0x8499,0x6AAC,0x76DF,0x9530,0x731B,0x68A6,0x5B5F, +0x772F,0x919A,0x9761,0x7CDC,0x8FF7,0x8C1C,0x5F25,0x7C73, +0x79D8,0x89C5,0x6CCC,0x871C,0x5BC6,0x5E42,0x68C9,0x7720, +0x7EF5,0x5195,0x514D,0x52C9,0x5A29,0x7F05,0x9762,0x82D7, +0x63CF,0x7784,0x85D0,0x79D2,0x6E3A,0x5E99,0x5999,0x8511, +0x706D,0x6C11,0x62BF,0x76BF,0x654F,0x60AF,0x95FD,0x660E, +0x879F,0x9E23,0x94ED,0x540D,0x547D,0x8C2C,0x6478, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8140,0x8141,0x8142,0x8143,0x8144,0x8145,0x8147,0x8149, +0x814D,0x814E,0x814F,0x8152,0x8156,0x8157,0x8158,0x815B, +0x815C,0x815D,0x815E,0x815F,0x8161,0x8162,0x8163,0x8164, +0x8166,0x8168,0x816A,0x816B,0x816C,0x816F,0x8172,0x8173, +0x8175,0x8176,0x8177,0x8178,0x8181,0x8183,0x8184,0x8185, +0x8186,0x8187,0x8189,0x818B,0x818C,0x818D,0x818E,0x8190, +0x8192,0x8193,0x8194,0x8195,0x8196,0x8197,0x8199,0x819A, +0x819E,0x819F,0x81A0,0x81A1,0x81A2,0x81A4,0x81A5, 0, +0x81A7,0x81A9,0x81AB,0x81AC,0x81AD,0x81AE,0x81AF,0x81B0, +0x81B1,0x81B2,0x81B4,0x81B5,0x81B6,0x81B7,0x81B8,0x81B9, +0x81BC,0x81BD,0x81BE,0x81BF,0x81C4,0x81C5,0x81C7,0x81C8, +0x81C9,0x81CB,0x81CD,0x81CE,0x81CF,0x81D0,0x81D1,0x81D2, +0x81D3,0x6479,0x8611,0x6A21,0x819C,0x78E8,0x6469,0x9B54, +0x62B9,0x672B,0x83AB,0x58A8,0x9ED8,0x6CAB,0x6F20,0x5BDE, +0x964C,0x8C0B,0x725F,0x67D0,0x62C7,0x7261,0x4EA9,0x59C6, +0x6BCD,0x5893,0x66AE,0x5E55,0x52DF,0x6155,0x6728,0x76EE, +0x7766,0x7267,0x7A46,0x62FF,0x54EA,0x5450,0x94A0,0x90A3, +0x5A1C,0x7EB3,0x6C16,0x4E43,0x5976,0x8010,0x5948,0x5357, +0x7537,0x96BE,0x56CA,0x6320,0x8111,0x607C,0x95F9,0x6DD6, +0x5462,0x9981,0x5185,0x5AE9,0x80FD,0x59AE,0x9713,0x502A, +0x6CE5,0x5C3C,0x62DF,0x4F60,0x533F,0x817B,0x9006,0x6EBA, +0x852B,0x62C8,0x5E74,0x78BE,0x64B5,0x637B,0x5FF5,0x5A18, +0x917F,0x9E1F,0x5C3F,0x634F,0x8042,0x5B7D,0x556E,0x954A, +0x954D,0x6D85,0x60A8,0x67E0,0x72DE,0x51DD,0x5B81, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x81D4,0x81D5,0x81D6,0x81D7,0x81D8,0x81D9,0x81DA,0x81DB, +0x81DC,0x81DD,0x81DE,0x81DF,0x81E0,0x81E1,0x81E2,0x81E4, +0x81E5,0x81E6,0x81E8,0x81E9,0x81EB,0x81EE,0x81EF,0x81F0, +0x81F1,0x81F2,0x81F5,0x81F6,0x81F7,0x81F8,0x81F9,0x81FA, +0x81FD,0x81FF,0x8203,0x8207,0x8208,0x8209,0x820A,0x820B, +0x820E,0x820F,0x8211,0x8213,0x8215,0x8216,0x8217,0x8218, +0x8219,0x821A,0x821D,0x8220,0x8224,0x8225,0x8226,0x8227, +0x8229,0x822E,0x8232,0x823A,0x823C,0x823D,0x823F, 0, +0x8240,0x8241,0x8242,0x8243,0x8245,0x8246,0x8248,0x824A, +0x824C,0x824D,0x824E,0x8250,0x8251,0x8252,0x8253,0x8254, +0x8255,0x8256,0x8257,0x8259,0x825B,0x825C,0x825D,0x825E, +0x8260,0x8261,0x8262,0x8263,0x8264,0x8265,0x8266,0x8267, +0x8269,0x62E7,0x6CDE,0x725B,0x626D,0x94AE,0x7EBD,0x8113, +0x6D53,0x519C,0x5F04,0x5974,0x52AA,0x6012,0x5973,0x6696, +0x8650,0x759F,0x632A,0x61E6,0x7CEF,0x8BFA,0x54E6,0x6B27, +0x9E25,0x6BB4,0x85D5,0x5455,0x5076,0x6CA4,0x556A,0x8DB4, +0x722C,0x5E15,0x6015,0x7436,0x62CD,0x6392,0x724C,0x5F98, +0x6E43,0x6D3E,0x6500,0x6F58,0x76D8,0x78D0,0x76FC,0x7554, +0x5224,0x53DB,0x4E53,0x5E9E,0x65C1,0x802A,0x80D6,0x629B, +0x5486,0x5228,0x70AE,0x888D,0x8DD1,0x6CE1,0x5478,0x80DA, +0x57F9,0x88F4,0x8D54,0x966A,0x914D,0x4F69,0x6C9B,0x55B7, +0x76C6,0x7830,0x62A8,0x70F9,0x6F8E,0x5F6D,0x84EC,0x68DA, +0x787C,0x7BF7,0x81A8,0x670B,0x9E4F,0x6367,0x78B0,0x576F, +0x7812,0x9739,0x6279,0x62AB,0x5288,0x7435,0x6BD7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x826A,0x826B,0x826C,0x826D,0x8271,0x8275,0x8276,0x8277, +0x8278,0x827B,0x827C,0x8280,0x8281,0x8283,0x8285,0x8286, +0x8287,0x8289,0x828C,0x8290,0x8293,0x8294,0x8295,0x8296, +0x829A,0x829B,0x829E,0x82A0,0x82A2,0x82A3,0x82A7,0x82B2, +0x82B5,0x82B6,0x82BA,0x82BB,0x82BC,0x82BF,0x82C0,0x82C2, +0x82C3,0x82C5,0x82C6,0x82C9,0x82D0,0x82D6,0x82D9,0x82DA, +0x82DD,0x82E2,0x82E7,0x82E8,0x82E9,0x82EA,0x82EC,0x82ED, +0x82EE,0x82F0,0x82F2,0x82F3,0x82F5,0x82F6,0x82F8, 0, +0x82FA,0x82FC,0x82FD,0x82FE,0x82FF,0x8300,0x830A,0x830B, +0x830D,0x8310,0x8312,0x8313,0x8316,0x8318,0x8319,0x831D, +0x831E,0x831F,0x8320,0x8321,0x8322,0x8323,0x8324,0x8325, +0x8326,0x8329,0x832A,0x832E,0x8330,0x8332,0x8337,0x833B, +0x833D,0x5564,0x813E,0x75B2,0x76AE,0x5339,0x75DE,0x50FB, +0x5C41,0x8B6C,0x7BC7,0x504F,0x7247,0x9A97,0x98D8,0x6F02, +0x74E2,0x7968,0x6487,0x77A5,0x62FC,0x9891,0x8D2B,0x54C1, +0x8058,0x4E52,0x576A,0x82F9,0x840D,0x5E73,0x51ED,0x74F6, +0x8BC4,0x5C4F,0x5761,0x6CFC,0x9887,0x5A46,0x7834,0x9B44, +0x8FEB,0x7C95,0x5256,0x6251,0x94FA,0x4EC6,0x8386,0x8461, +0x83E9,0x84B2,0x57D4,0x6734,0x5703,0x666E,0x6D66,0x8C31, +0x66DD,0x7011,0x671F,0x6B3A,0x6816,0x621A,0x59BB,0x4E03, +0x51C4,0x6F06,0x67D2,0x6C8F,0x5176,0x68CB,0x5947,0x6B67, +0x7566,0x5D0E,0x8110,0x9F50,0x65D7,0x7948,0x7941,0x9A91, +0x8D77,0x5C82,0x4E5E,0x4F01,0x542F,0x5951,0x780C,0x5668, +0x6C14,0x8FC4,0x5F03,0x6C7D,0x6CE3,0x8BAB,0x6390, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x833E,0x833F,0x8341,0x8342,0x8344,0x8345,0x8348,0x834A, +0x834B,0x834C,0x834D,0x834E,0x8353,0x8355,0x8356,0x8357, +0x8358,0x8359,0x835D,0x8362,0x8370,0x8371,0x8372,0x8373, +0x8374,0x8375,0x8376,0x8379,0x837A,0x837E,0x837F,0x8380, +0x8381,0x8382,0x8383,0x8384,0x8387,0x8388,0x838A,0x838B, +0x838C,0x838D,0x838F,0x8390,0x8391,0x8394,0x8395,0x8396, +0x8397,0x8399,0x839A,0x839D,0x839F,0x83A1,0x83A2,0x83A3, +0x83A4,0x83A5,0x83A6,0x83A7,0x83AC,0x83AD,0x83AE, 0, +0x83AF,0x83B5,0x83BB,0x83BE,0x83BF,0x83C2,0x83C3,0x83C4, +0x83C6,0x83C8,0x83C9,0x83CB,0x83CD,0x83CE,0x83D0,0x83D1, +0x83D2,0x83D3,0x83D5,0x83D7,0x83D9,0x83DA,0x83DB,0x83DE, +0x83E2,0x83E3,0x83E4,0x83E6,0x83E7,0x83E8,0x83EB,0x83EC, +0x83ED,0x6070,0x6D3D,0x7275,0x6266,0x948E,0x94C5,0x5343, +0x8FC1,0x7B7E,0x4EDF,0x8C26,0x4E7E,0x9ED4,0x94B1,0x94B3, +0x524D,0x6F5C,0x9063,0x6D45,0x8C34,0x5811,0x5D4C,0x6B20, +0x6B49,0x67AA,0x545B,0x8154,0x7F8C,0x5899,0x8537,0x5F3A, +0x62A2,0x6A47,0x9539,0x6572,0x6084,0x6865,0x77A7,0x4E54, +0x4FA8,0x5DE7,0x9798,0x64AC,0x7FD8,0x5CED,0x4FCF,0x7A8D, +0x5207,0x8304,0x4E14,0x602F,0x7A83,0x94A6,0x4FB5,0x4EB2, +0x79E6,0x7434,0x52E4,0x82B9,0x64D2,0x79BD,0x5BDD,0x6C81, +0x9752,0x8F7B,0x6C22,0x503E,0x537F,0x6E05,0x64CE,0x6674, +0x6C30,0x60C5,0x9877,0x8BF7,0x5E86,0x743C,0x7A77,0x79CB, +0x4E18,0x90B1,0x7403,0x6C42,0x56DA,0x914B,0x6CC5,0x8D8B, +0x533A,0x86C6,0x66F2,0x8EAF,0x5C48,0x9A71,0x6E20, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x83EE,0x83EF,0x83F3,0x83F4,0x83F5,0x83F6,0x83F7,0x83FA, +0x83FB,0x83FC,0x83FE,0x83FF,0x8400,0x8402,0x8405,0x8407, +0x8408,0x8409,0x840A,0x8410,0x8412,0x8413,0x8414,0x8415, +0x8416,0x8417,0x8419,0x841A,0x841B,0x841E,0x841F,0x8420, +0x8421,0x8422,0x8423,0x8429,0x842A,0x842B,0x842C,0x842D, +0x842E,0x842F,0x8430,0x8432,0x8433,0x8434,0x8435,0x8436, +0x8437,0x8439,0x843A,0x843B,0x843E,0x843F,0x8440,0x8441, +0x8442,0x8443,0x8444,0x8445,0x8447,0x8448,0x8449, 0, +0x844A,0x844B,0x844C,0x844D,0x844E,0x844F,0x8450,0x8452, +0x8453,0x8454,0x8455,0x8456,0x8458,0x845D,0x845E,0x845F, +0x8460,0x8462,0x8464,0x8465,0x8466,0x8467,0x8468,0x846A, +0x846E,0x846F,0x8470,0x8472,0x8474,0x8477,0x8479,0x847B, +0x847C,0x53D6,0x5A36,0x9F8B,0x8DA3,0x53BB,0x5708,0x98A7, +0x6743,0x919B,0x6CC9,0x5168,0x75CA,0x62F3,0x72AC,0x5238, +0x529D,0x7F3A,0x7094,0x7638,0x5374,0x9E4A,0x69B7,0x786E, +0x96C0,0x88D9,0x7FA4,0x7136,0x71C3,0x5189,0x67D3,0x74E4, +0x58E4,0x6518,0x56B7,0x8BA9,0x9976,0x6270,0x7ED5,0x60F9, +0x70ED,0x58EC,0x4EC1,0x4EBA,0x5FCD,0x97E7,0x4EFB,0x8BA4, +0x5203,0x598A,0x7EAB,0x6254,0x4ECD,0x65E5,0x620E,0x8338, +0x84C9,0x8363,0x878D,0x7194,0x6EB6,0x5BB9,0x7ED2,0x5197, +0x63C9,0x67D4,0x8089,0x8339,0x8815,0x5112,0x5B7A,0x5982, +0x8FB1,0x4E73,0x6C5D,0x5165,0x8925,0x8F6F,0x962E,0x854A, +0x745E,0x9510,0x95F0,0x6DA6,0x82E5,0x5F31,0x6492,0x6D12, +0x8428,0x816E,0x9CC3,0x585E,0x8D5B,0x4E09,0x53C1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x847D,0x847E,0x847F,0x8480,0x8481,0x8483,0x8484,0x8485, +0x8486,0x848A,0x848D,0x848F,0x8490,0x8491,0x8492,0x8493, +0x8494,0x8495,0x8496,0x8498,0x849A,0x849B,0x849D,0x849E, +0x849F,0x84A0,0x84A2,0x84A3,0x84A4,0x84A5,0x84A6,0x84A7, +0x84A8,0x84A9,0x84AA,0x84AB,0x84AC,0x84AD,0x84AE,0x84B0, +0x84B1,0x84B3,0x84B5,0x84B6,0x84B7,0x84BB,0x84BC,0x84BE, +0x84C0,0x84C2,0x84C3,0x84C5,0x84C6,0x84C7,0x84C8,0x84CB, +0x84CC,0x84CE,0x84CF,0x84D2,0x84D4,0x84D5,0x84D7, 0, +0x84D8,0x84D9,0x84DA,0x84DB,0x84DC,0x84DE,0x84E1,0x84E2, +0x84E4,0x84E7,0x84E8,0x84E9,0x84EA,0x84EB,0x84ED,0x84EE, +0x84EF,0x84F1,0x84F2,0x84F3,0x84F4,0x84F5,0x84F6,0x84F7, +0x84F8,0x84F9,0x84FA,0x84FB,0x84FD,0x84FE,0x8500,0x8501, +0x8502,0x4F1E,0x6563,0x6851,0x55D3,0x4E27,0x6414,0x9A9A, +0x626B,0x5AC2,0x745F,0x8272,0x6DA9,0x68EE,0x50E7,0x838E, +0x7802,0x6740,0x5239,0x6C99,0x7EB1,0x50BB,0x5565,0x715E, +0x7B5B,0x6652,0x73CA,0x82EB,0x6749,0x5C71,0x5220,0x717D, +0x886B,0x95EA,0x9655,0x64C5,0x8D61,0x81B3,0x5584,0x6C55, +0x6247,0x7F2E,0x5892,0x4F24,0x5546,0x8D4F,0x664C,0x4E0A, +0x5C1A,0x88F3,0x68A2,0x634E,0x7A0D,0x70E7,0x828D,0x52FA, +0x97F6,0x5C11,0x54E8,0x90B5,0x7ECD,0x5962,0x8D4A,0x86C7, +0x820C,0x820D,0x8D66,0x6444,0x5C04,0x6151,0x6D89,0x793E, +0x8BBE,0x7837,0x7533,0x547B,0x4F38,0x8EAB,0x6DF1,0x5A20, +0x7EC5,0x795E,0x6C88,0x5BA1,0x5A76,0x751A,0x80BE,0x614E, +0x6E17,0x58F0,0x751F,0x7525,0x7272,0x5347,0x7EF3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8503,0x8504,0x8505,0x8506,0x8507,0x8508,0x8509,0x850A, +0x850B,0x850D,0x850E,0x850F,0x8510,0x8512,0x8514,0x8515, +0x8516,0x8518,0x8519,0x851B,0x851C,0x851D,0x851E,0x8520, +0x8522,0x8523,0x8524,0x8525,0x8526,0x8527,0x8528,0x8529, +0x852A,0x852D,0x852E,0x852F,0x8530,0x8531,0x8532,0x8533, +0x8534,0x8535,0x8536,0x853E,0x853F,0x8540,0x8541,0x8542, +0x8544,0x8545,0x8546,0x8547,0x854B,0x854C,0x854D,0x854E, +0x854F,0x8550,0x8551,0x8552,0x8553,0x8554,0x8555, 0, +0x8557,0x8558,0x855A,0x855B,0x855C,0x855D,0x855F,0x8560, +0x8561,0x8562,0x8563,0x8565,0x8566,0x8567,0x8569,0x856A, +0x856B,0x856C,0x856D,0x856E,0x856F,0x8570,0x8571,0x8573, +0x8575,0x8576,0x8577,0x8578,0x857C,0x857D,0x857F,0x8580, +0x8581,0x7701,0x76DB,0x5269,0x80DC,0x5723,0x5E08,0x5931, +0x72EE,0x65BD,0x6E7F,0x8BD7,0x5C38,0x8671,0x5341,0x77F3, +0x62FE,0x65F6,0x4EC0,0x98DF,0x8680,0x5B9E,0x8BC6,0x53F2, +0x77E2,0x4F7F,0x5C4E,0x9A76,0x59CB,0x5F0F,0x793A,0x58EB, +0x4E16,0x67FF,0x4E8B,0x62ED,0x8A93,0x901D,0x52BF,0x662F, +0x55DC,0x566C,0x9002,0x4ED5,0x4F8D,0x91CA,0x9970,0x6C0F, +0x5E02,0x6043,0x5BA4,0x89C6,0x8BD5,0x6536,0x624B,0x9996, +0x5B88,0x5BFF,0x6388,0x552E,0x53D7,0x7626,0x517D,0x852C, +0x67A2,0x68B3,0x6B8A,0x6292,0x8F93,0x53D4,0x8212,0x6DD1, +0x758F,0x4E66,0x8D4E,0x5B70,0x719F,0x85AF,0x6691,0x66D9, +0x7F72,0x8700,0x9ECD,0x9F20,0x5C5E,0x672F,0x8FF0,0x6811, +0x675F,0x620D,0x7AD6,0x5885,0x5EB6,0x6570,0x6F31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8582,0x8583,0x8586,0x8588,0x8589,0x858A,0x858B,0x858C, +0x858D,0x858E,0x8590,0x8591,0x8592,0x8593,0x8594,0x8595, +0x8596,0x8597,0x8598,0x8599,0x859A,0x859D,0x859E,0x859F, +0x85A0,0x85A1,0x85A2,0x85A3,0x85A5,0x85A6,0x85A7,0x85A9, +0x85AB,0x85AC,0x85AD,0x85B1,0x85B2,0x85B3,0x85B4,0x85B5, +0x85B6,0x85B8,0x85BA,0x85BB,0x85BC,0x85BD,0x85BE,0x85BF, +0x85C0,0x85C2,0x85C3,0x85C4,0x85C5,0x85C6,0x85C7,0x85C8, +0x85CA,0x85CB,0x85CC,0x85CD,0x85CE,0x85D1,0x85D2, 0, +0x85D4,0x85D6,0x85D7,0x85D8,0x85D9,0x85DA,0x85DB,0x85DD, +0x85DE,0x85DF,0x85E0,0x85E1,0x85E2,0x85E3,0x85E5,0x85E6, +0x85E7,0x85E8,0x85EA,0x85EB,0x85EC,0x85ED,0x85EE,0x85EF, +0x85F0,0x85F1,0x85F2,0x85F3,0x85F4,0x85F5,0x85F6,0x85F7, +0x85F8,0x6055,0x5237,0x800D,0x6454,0x8870,0x7529,0x5E05, +0x6813,0x62F4,0x971C,0x53CC,0x723D,0x8C01,0x6C34,0x7761, +0x7A0E,0x542E,0x77AC,0x987A,0x821C,0x8BF4,0x7855,0x6714, +0x70C1,0x65AF,0x6495,0x5636,0x601D,0x79C1,0x53F8,0x4E1D, +0x6B7B,0x8086,0x5BFA,0x55E3,0x56DB,0x4F3A,0x4F3C,0x9972, +0x5DF3,0x677E,0x8038,0x6002,0x9882,0x9001,0x5B8B,0x8BBC, +0x8BF5,0x641C,0x8258,0x64DE,0x55FD,0x82CF,0x9165,0x4FD7, +0x7D20,0x901F,0x7C9F,0x50F3,0x5851,0x6EAF,0x5BBF,0x8BC9, +0x8083,0x9178,0x849C,0x7B97,0x867D,0x968B,0x968F,0x7EE5, +0x9AD3,0x788E,0x5C81,0x7A57,0x9042,0x96A7,0x795F,0x5B59, +0x635F,0x7B0B,0x84D1,0x68AD,0x5506,0x7F29,0x7410,0x7D22, +0x9501,0x6240,0x584C,0x4ED6,0x5B83,0x5979,0x5854, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x85F9,0x85FA,0x85FC,0x85FD,0x85FE,0x8600,0x8601,0x8602, +0x8603,0x8604,0x8606,0x8607,0x8608,0x8609,0x860A,0x860B, +0x860C,0x860D,0x860E,0x860F,0x8610,0x8612,0x8613,0x8614, +0x8615,0x8617,0x8618,0x8619,0x861A,0x861B,0x861C,0x861D, +0x861E,0x861F,0x8620,0x8621,0x8622,0x8623,0x8624,0x8625, +0x8626,0x8628,0x862A,0x862B,0x862C,0x862D,0x862E,0x862F, +0x8630,0x8631,0x8632,0x8633,0x8634,0x8635,0x8636,0x8637, +0x8639,0x863A,0x863B,0x863D,0x863E,0x863F,0x8640, 0, +0x8641,0x8642,0x8643,0x8644,0x8645,0x8646,0x8647,0x8648, +0x8649,0x864A,0x864B,0x864C,0x8652,0x8653,0x8655,0x8656, +0x8657,0x8658,0x8659,0x865B,0x865C,0x865D,0x865F,0x8660, +0x8661,0x8663,0x8664,0x8665,0x8666,0x8667,0x8668,0x8669, +0x866A,0x736D,0x631E,0x8E4B,0x8E0F,0x80CE,0x82D4,0x62AC, +0x53F0,0x6CF0,0x915E,0x592A,0x6001,0x6C70,0x574D,0x644A, +0x8D2A,0x762B,0x6EE9,0x575B,0x6A80,0x75F0,0x6F6D,0x8C2D, +0x8C08,0x5766,0x6BEF,0x8892,0x78B3,0x63A2,0x53F9,0x70AD, +0x6C64,0x5858,0x642A,0x5802,0x68E0,0x819B,0x5510,0x7CD6, +0x5018,0x8EBA,0x6DCC,0x8D9F,0x70EB,0x638F,0x6D9B,0x6ED4, +0x7EE6,0x8404,0x6843,0x9003,0x6DD8,0x9676,0x8BA8,0x5957, +0x7279,0x85E4,0x817E,0x75BC,0x8A8A,0x68AF,0x5254,0x8E22, +0x9511,0x63D0,0x9898,0x8E44,0x557C,0x4F53,0x66FF,0x568F, +0x60D5,0x6D95,0x5243,0x5C49,0x5929,0x6DFB,0x586B,0x7530, +0x751C,0x606C,0x8214,0x8146,0x6311,0x6761,0x8FE2,0x773A, +0x8DF3,0x8D34,0x94C1,0x5E16,0x5385,0x542C,0x70C3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x866D,0x866F,0x8670,0x8672,0x8673,0x8674,0x8675,0x8676, +0x8677,0x8678,0x8683,0x8684,0x8685,0x8686,0x8687,0x8688, +0x8689,0x868E,0x868F,0x8690,0x8691,0x8692,0x8694,0x8696, +0x8697,0x8698,0x8699,0x869A,0x869B,0x869E,0x869F,0x86A0, +0x86A1,0x86A2,0x86A5,0x86A6,0x86AB,0x86AD,0x86AE,0x86B2, +0x86B3,0x86B7,0x86B8,0x86B9,0x86BB,0x86BC,0x86BD,0x86BE, +0x86BF,0x86C1,0x86C2,0x86C3,0x86C5,0x86C8,0x86CC,0x86CD, +0x86D2,0x86D3,0x86D5,0x86D6,0x86D7,0x86DA,0x86DC, 0, +0x86DD,0x86E0,0x86E1,0x86E2,0x86E3,0x86E5,0x86E6,0x86E7, +0x86E8,0x86EA,0x86EB,0x86EC,0x86EF,0x86F5,0x86F6,0x86F7, +0x86FA,0x86FB,0x86FC,0x86FD,0x86FF,0x8701,0x8704,0x8705, +0x8706,0x870B,0x870C,0x870E,0x870F,0x8710,0x8711,0x8714, +0x8716,0x6C40,0x5EF7,0x505C,0x4EAD,0x5EAD,0x633A,0x8247, +0x901A,0x6850,0x916E,0x77B3,0x540C,0x94DC,0x5F64,0x7AE5, +0x6876,0x6345,0x7B52,0x7EDF,0x75DB,0x5077,0x6295,0x5934, +0x900F,0x51F8,0x79C3,0x7A81,0x56FE,0x5F92,0x9014,0x6D82, +0x5C60,0x571F,0x5410,0x5154,0x6E4D,0x56E2,0x63A8,0x9893, +0x817F,0x8715,0x892A,0x9000,0x541E,0x5C6F,0x81C0,0x62D6, +0x6258,0x8131,0x9E35,0x9640,0x9A6E,0x9A7C,0x692D,0x59A5, +0x62D3,0x553E,0x6316,0x54C7,0x86D9,0x6D3C,0x5A03,0x74E6, +0x889C,0x6B6A,0x5916,0x8C4C,0x5F2F,0x6E7E,0x73A9,0x987D, +0x4E38,0x70F7,0x5B8C,0x7897,0x633D,0x665A,0x7696,0x60CB, +0x5B9B,0x5A49,0x4E07,0x8155,0x6C6A,0x738B,0x4EA1,0x6789, +0x7F51,0x5F80,0x65FA,0x671B,0x5FD8,0x5984,0x5A01, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8719,0x871B,0x871D,0x871F,0x8720,0x8724,0x8726,0x8727, +0x8728,0x872A,0x872B,0x872C,0x872D,0x872F,0x8730,0x8732, +0x8733,0x8735,0x8736,0x8738,0x8739,0x873A,0x873C,0x873D, +0x8740,0x8741,0x8742,0x8743,0x8744,0x8745,0x8746,0x874A, +0x874B,0x874D,0x874F,0x8750,0x8751,0x8752,0x8754,0x8755, +0x8756,0x8758,0x875A,0x875B,0x875C,0x875D,0x875E,0x875F, +0x8761,0x8762,0x8766,0x8767,0x8768,0x8769,0x876A,0x876B, +0x876C,0x876D,0x876F,0x8771,0x8772,0x8773,0x8775, 0, +0x8777,0x8778,0x8779,0x877A,0x877F,0x8780,0x8781,0x8784, +0x8786,0x8787,0x8789,0x878A,0x878C,0x878E,0x878F,0x8790, +0x8791,0x8792,0x8794,0x8795,0x8796,0x8798,0x8799,0x879A, +0x879B,0x879C,0x879D,0x879E,0x87A0,0x87A1,0x87A2,0x87A3, +0x87A4,0x5DCD,0x5FAE,0x5371,0x97E6,0x8FDD,0x6845,0x56F4, +0x552F,0x60DF,0x4E3A,0x6F4D,0x7EF4,0x82C7,0x840E,0x59D4, +0x4F1F,0x4F2A,0x5C3E,0x7EAC,0x672A,0x851A,0x5473,0x754F, +0x80C3,0x5582,0x9B4F,0x4F4D,0x6E2D,0x8C13,0x5C09,0x6170, +0x536B,0x761F,0x6E29,0x868A,0x6587,0x95FB,0x7EB9,0x543B, +0x7A33,0x7D0A,0x95EE,0x55E1,0x7FC1,0x74EE,0x631D,0x8717, +0x6DA1,0x7A9D,0x6211,0x65A1,0x5367,0x63E1,0x6C83,0x5DEB, +0x545C,0x94A8,0x4E4C,0x6C61,0x8BEC,0x5C4B,0x65E0,0x829C, +0x68A7,0x543E,0x5434,0x6BCB,0x6B66,0x4E94,0x6342,0x5348, +0x821E,0x4F0D,0x4FAE,0x575E,0x620A,0x96FE,0x6664,0x7269, +0x52FF,0x52A1,0x609F,0x8BEF,0x6614,0x7199,0x6790,0x897F, +0x7852,0x77FD,0x6670,0x563B,0x5438,0x9521,0x727A, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x87A5,0x87A6,0x87A7,0x87A9,0x87AA,0x87AE,0x87B0,0x87B1, +0x87B2,0x87B4,0x87B6,0x87B7,0x87B8,0x87B9,0x87BB,0x87BC, +0x87BE,0x87BF,0x87C1,0x87C2,0x87C3,0x87C4,0x87C5,0x87C7, +0x87C8,0x87C9,0x87CC,0x87CD,0x87CE,0x87CF,0x87D0,0x87D4, +0x87D5,0x87D6,0x87D7,0x87D8,0x87D9,0x87DA,0x87DC,0x87DD, +0x87DE,0x87DF,0x87E1,0x87E2,0x87E3,0x87E4,0x87E6,0x87E7, +0x87E8,0x87E9,0x87EB,0x87EC,0x87ED,0x87EF,0x87F0,0x87F1, +0x87F2,0x87F3,0x87F4,0x87F5,0x87F6,0x87F7,0x87F8, 0, +0x87FA,0x87FB,0x87FC,0x87FD,0x87FF,0x8800,0x8801,0x8802, +0x8804,0x8805,0x8806,0x8807,0x8808,0x8809,0x880B,0x880C, +0x880D,0x880E,0x880F,0x8810,0x8811,0x8812,0x8814,0x8817, +0x8818,0x8819,0x881A,0x881C,0x881D,0x881E,0x881F,0x8820, +0x8823,0x7A00,0x606F,0x5E0C,0x6089,0x819D,0x5915,0x60DC, +0x7184,0x70EF,0x6EAA,0x6C50,0x7280,0x6A84,0x88AD,0x5E2D, +0x4E60,0x5AB3,0x559C,0x94E3,0x6D17,0x7CFB,0x9699,0x620F, +0x7EC6,0x778E,0x867E,0x5323,0x971E,0x8F96,0x6687,0x5CE1, +0x4FA0,0x72ED,0x4E0B,0x53A6,0x590F,0x5413,0x6380,0x9528, +0x5148,0x4ED9,0x9C9C,0x7EA4,0x54B8,0x8D24,0x8854,0x8237, +0x95F2,0x6D8E,0x5F26,0x5ACC,0x663E,0x9669,0x73B0,0x732E, +0x53BF,0x817A,0x9985,0x7FA1,0x5BAA,0x9677,0x9650,0x7EBF, +0x76F8,0x53A2,0x9576,0x9999,0x7BB1,0x8944,0x6E58,0x4E61, +0x7FD4,0x7965,0x8BE6,0x60F3,0x54CD,0x4EAB,0x9879,0x5DF7, +0x6A61,0x50CF,0x5411,0x8C61,0x8427,0x785D,0x9704,0x524A, +0x54EE,0x56A3,0x9500,0x6D88,0x5BB5,0x6DC6,0x6653, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8824,0x8825,0x8826,0x8827,0x8828,0x8829,0x882A,0x882B, +0x882C,0x882D,0x882E,0x882F,0x8830,0x8831,0x8833,0x8834, +0x8835,0x8836,0x8837,0x8838,0x883A,0x883B,0x883D,0x883E, +0x883F,0x8841,0x8842,0x8843,0x8846,0x8847,0x8848,0x8849, +0x884A,0x884B,0x884E,0x884F,0x8850,0x8851,0x8852,0x8853, +0x8855,0x8856,0x8858,0x885A,0x885B,0x885C,0x885D,0x885E, +0x885F,0x8860,0x8866,0x8867,0x886A,0x886D,0x886F,0x8871, +0x8873,0x8874,0x8875,0x8876,0x8878,0x8879,0x887A, 0, +0x887B,0x887C,0x8880,0x8883,0x8886,0x8887,0x8889,0x888A, +0x888C,0x888E,0x888F,0x8890,0x8891,0x8893,0x8894,0x8895, +0x8897,0x8898,0x8899,0x889A,0x889B,0x889D,0x889E,0x889F, +0x88A0,0x88A1,0x88A3,0x88A5,0x88A6,0x88A7,0x88A8,0x88A9, +0x88AA,0x5C0F,0x5B5D,0x6821,0x8096,0x5578,0x7B11,0x6548, +0x6954,0x4E9B,0x6B47,0x874E,0x978B,0x534F,0x631F,0x643A, +0x90AA,0x659C,0x80C1,0x8C10,0x5199,0x68B0,0x5378,0x87F9, +0x61C8,0x6CC4,0x6CFB,0x8C22,0x5C51,0x85AA,0x82AF,0x950C, +0x6B23,0x8F9B,0x65B0,0x5FFB,0x5FC3,0x4FE1,0x8845,0x661F, +0x8165,0x7329,0x60FA,0x5174,0x5211,0x578B,0x5F62,0x90A2, +0x884C,0x9192,0x5E78,0x674F,0x6027,0x59D3,0x5144,0x51F6, +0x80F8,0x5308,0x6C79,0x96C4,0x718A,0x4F11,0x4FEE,0x7F9E, +0x673D,0x55C5,0x9508,0x79C0,0x8896,0x7EE3,0x589F,0x620C, +0x9700,0x865A,0x5618,0x987B,0x5F90,0x8BB8,0x84C4,0x9157, +0x53D9,0x65ED,0x5E8F,0x755C,0x6064,0x7D6E,0x5A7F,0x7EEA, +0x7EED,0x8F69,0x55A7,0x5BA3,0x60AC,0x65CB,0x7384, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x88AC,0x88AE,0x88AF,0x88B0,0x88B2,0x88B3,0x88B4,0x88B5, +0x88B6,0x88B8,0x88B9,0x88BA,0x88BB,0x88BD,0x88BE,0x88BF, +0x88C0,0x88C3,0x88C4,0x88C7,0x88C8,0x88CA,0x88CB,0x88CC, +0x88CD,0x88CF,0x88D0,0x88D1,0x88D3,0x88D6,0x88D7,0x88DA, +0x88DB,0x88DC,0x88DD,0x88DE,0x88E0,0x88E1,0x88E6,0x88E7, +0x88E9,0x88EA,0x88EB,0x88EC,0x88ED,0x88EE,0x88EF,0x88F2, +0x88F5,0x88F6,0x88F7,0x88FA,0x88FB,0x88FD,0x88FF,0x8900, +0x8901,0x8903,0x8904,0x8905,0x8906,0x8907,0x8908, 0, +0x8909,0x890B,0x890C,0x890D,0x890E,0x890F,0x8911,0x8914, +0x8915,0x8916,0x8917,0x8918,0x891C,0x891D,0x891E,0x891F, +0x8920,0x8922,0x8923,0x8924,0x8926,0x8927,0x8928,0x8929, +0x892C,0x892D,0x892E,0x892F,0x8931,0x8932,0x8933,0x8935, +0x8937,0x9009,0x7663,0x7729,0x7EDA,0x9774,0x859B,0x5B66, +0x7A74,0x96EA,0x8840,0x52CB,0x718F,0x5FAA,0x65EC,0x8BE2, +0x5BFB,0x9A6F,0x5DE1,0x6B89,0x6C5B,0x8BAD,0x8BAF,0x900A, +0x8FC5,0x538B,0x62BC,0x9E26,0x9E2D,0x5440,0x4E2B,0x82BD, +0x7259,0x869C,0x5D16,0x8859,0x6DAF,0x96C5,0x54D1,0x4E9A, +0x8BB6,0x7109,0x54BD,0x9609,0x70DF,0x6DF9,0x76D0,0x4E25, +0x7814,0x8712,0x5CA9,0x5EF6,0x8A00,0x989C,0x960E,0x708E, +0x6CBF,0x5944,0x63A9,0x773C,0x884D,0x6F14,0x8273,0x5830, +0x71D5,0x538C,0x781A,0x96C1,0x5501,0x5F66,0x7130,0x5BB4, +0x8C1A,0x9A8C,0x6B83,0x592E,0x9E2F,0x79E7,0x6768,0x626C, +0x4F6F,0x75A1,0x7F8A,0x6D0B,0x9633,0x6C27,0x4EF0,0x75D2, +0x517B,0x6837,0x6F3E,0x9080,0x8170,0x5996,0x7476, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8938,0x8939,0x893A,0x893B,0x893C,0x893D,0x893E,0x893F, +0x8940,0x8942,0x8943,0x8945,0x8946,0x8947,0x8948,0x8949, +0x894A,0x894B,0x894C,0x894D,0x894E,0x894F,0x8950,0x8951, +0x8952,0x8953,0x8954,0x8955,0x8956,0x8957,0x8958,0x8959, +0x895A,0x895B,0x895C,0x895D,0x8960,0x8961,0x8962,0x8963, +0x8964,0x8965,0x8967,0x8968,0x8969,0x896A,0x896B,0x896C, +0x896D,0x896E,0x896F,0x8970,0x8971,0x8972,0x8973,0x8974, +0x8975,0x8976,0x8977,0x8978,0x8979,0x897A,0x897C, 0, +0x897D,0x897E,0x8980,0x8982,0x8984,0x8985,0x8987,0x8988, +0x8989,0x898A,0x898B,0x898C,0x898D,0x898E,0x898F,0x8990, +0x8991,0x8992,0x8993,0x8994,0x8995,0x8996,0x8997,0x8998, +0x8999,0x899A,0x899B,0x899C,0x899D,0x899E,0x899F,0x89A0, +0x89A1,0x6447,0x5C27,0x9065,0x7A91,0x8C23,0x59DA,0x54AC, +0x8200,0x836F,0x8981,0x8000,0x6930,0x564E,0x8036,0x7237, +0x91CE,0x51B6,0x4E5F,0x9875,0x6396,0x4E1A,0x53F6,0x66F3, +0x814B,0x591C,0x6DB2,0x4E00,0x58F9,0x533B,0x63D6,0x94F1, +0x4F9D,0x4F0A,0x8863,0x9890,0x5937,0x9057,0x79FB,0x4EEA, +0x80F0,0x7591,0x6C82,0x5B9C,0x59E8,0x5F5D,0x6905,0x8681, +0x501A,0x5DF2,0x4E59,0x77E3,0x4EE5,0x827A,0x6291,0x6613, +0x9091,0x5C79,0x4EBF,0x5F79,0x81C6,0x9038,0x8084,0x75AB, +0x4EA6,0x88D4,0x610F,0x6BC5,0x5FC6,0x4E49,0x76CA,0x6EA2, +0x8BE3,0x8BAE,0x8C0A,0x8BD1,0x5F02,0x7FFC,0x7FCC,0x7ECE, +0x8335,0x836B,0x56E0,0x6BB7,0x97F3,0x9634,0x59FB,0x541F, +0x94F6,0x6DEB,0x5BC5,0x996E,0x5C39,0x5F15,0x9690, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x89A2,0x89A3,0x89A4,0x89A5,0x89A6,0x89A7,0x89A8,0x89A9, +0x89AA,0x89AB,0x89AC,0x89AD,0x89AE,0x89AF,0x89B0,0x89B1, +0x89B2,0x89B3,0x89B4,0x89B5,0x89B6,0x89B7,0x89B8,0x89B9, +0x89BA,0x89BB,0x89BC,0x89BD,0x89BE,0x89BF,0x89C0,0x89C3, +0x89CD,0x89D3,0x89D4,0x89D5,0x89D7,0x89D8,0x89D9,0x89DB, +0x89DD,0x89DF,0x89E0,0x89E1,0x89E2,0x89E4,0x89E7,0x89E8, +0x89E9,0x89EA,0x89EC,0x89ED,0x89EE,0x89F0,0x89F1,0x89F2, +0x89F4,0x89F5,0x89F6,0x89F7,0x89F8,0x89F9,0x89FA, 0, +0x89FB,0x89FC,0x89FD,0x89FE,0x89FF,0x8A01,0x8A02,0x8A03, +0x8A04,0x8A05,0x8A06,0x8A08,0x8A09,0x8A0A,0x8A0B,0x8A0C, +0x8A0D,0x8A0E,0x8A0F,0x8A10,0x8A11,0x8A12,0x8A13,0x8A14, +0x8A15,0x8A16,0x8A17,0x8A18,0x8A19,0x8A1A,0x8A1B,0x8A1C, +0x8A1D,0x5370,0x82F1,0x6A31,0x5A74,0x9E70,0x5E94,0x7F28, +0x83B9,0x8424,0x8425,0x8367,0x8747,0x8FCE,0x8D62,0x76C8, +0x5F71,0x9896,0x786C,0x6620,0x54DF,0x62E5,0x4F63,0x81C3, +0x75C8,0x5EB8,0x96CD,0x8E0A,0x86F9,0x548F,0x6CF3,0x6D8C, +0x6C38,0x607F,0x52C7,0x7528,0x5E7D,0x4F18,0x60A0,0x5FE7, +0x5C24,0x7531,0x90AE,0x94C0,0x72B9,0x6CB9,0x6E38,0x9149, +0x6709,0x53CB,0x53F3,0x4F51,0x91C9,0x8BF1,0x53C8,0x5E7C, +0x8FC2,0x6DE4,0x4E8E,0x76C2,0x6986,0x865E,0x611A,0x8206, +0x4F59,0x4FDE,0x903E,0x9C7C,0x6109,0x6E1D,0x6E14,0x9685, +0x4E88,0x5A31,0x96E8,0x4E0E,0x5C7F,0x79B9,0x5B87,0x8BED, +0x7FBD,0x7389,0x57DF,0x828B,0x90C1,0x5401,0x9047,0x55BB, +0x5CEA,0x5FA1,0x6108,0x6B32,0x72F1,0x80B2,0x8A89, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8A1E,0x8A1F,0x8A20,0x8A21,0x8A22,0x8A23,0x8A24,0x8A25, +0x8A26,0x8A27,0x8A28,0x8A29,0x8A2A,0x8A2B,0x8A2C,0x8A2D, +0x8A2E,0x8A2F,0x8A30,0x8A31,0x8A32,0x8A33,0x8A34,0x8A35, +0x8A36,0x8A37,0x8A38,0x8A39,0x8A3A,0x8A3B,0x8A3C,0x8A3D, +0x8A3F,0x8A40,0x8A41,0x8A42,0x8A43,0x8A44,0x8A45,0x8A46, +0x8A47,0x8A49,0x8A4A,0x8A4B,0x8A4C,0x8A4D,0x8A4E,0x8A4F, +0x8A50,0x8A51,0x8A52,0x8A53,0x8A54,0x8A55,0x8A56,0x8A57, +0x8A58,0x8A59,0x8A5A,0x8A5B,0x8A5C,0x8A5D,0x8A5E, 0, +0x8A5F,0x8A60,0x8A61,0x8A62,0x8A63,0x8A64,0x8A65,0x8A66, +0x8A67,0x8A68,0x8A69,0x8A6A,0x8A6B,0x8A6C,0x8A6D,0x8A6E, +0x8A6F,0x8A70,0x8A71,0x8A72,0x8A73,0x8A74,0x8A75,0x8A76, +0x8A77,0x8A78,0x8A7A,0x8A7B,0x8A7C,0x8A7D,0x8A7E,0x8A7F, +0x8A80,0x6D74,0x5BD3,0x88D5,0x9884,0x8C6B,0x9A6D,0x9E33, +0x6E0A,0x51A4,0x5143,0x57A3,0x8881,0x539F,0x63F4,0x8F95, +0x56ED,0x5458,0x5706,0x733F,0x6E90,0x7F18,0x8FDC,0x82D1, +0x613F,0x6028,0x9662,0x66F0,0x7EA6,0x8D8A,0x8DC3,0x94A5, +0x5CB3,0x7CA4,0x6708,0x60A6,0x9605,0x8018,0x4E91,0x90E7, +0x5300,0x9668,0x5141,0x8FD0,0x8574,0x915D,0x6655,0x97F5, +0x5B55,0x531D,0x7838,0x6742,0x683D,0x54C9,0x707E,0x5BB0, +0x8F7D,0x518D,0x5728,0x54B1,0x6512,0x6682,0x8D5E,0x8D43, +0x810F,0x846C,0x906D,0x7CDF,0x51FF,0x85FB,0x67A3,0x65E9, +0x6FA1,0x86A4,0x8E81,0x566A,0x9020,0x7682,0x7076,0x71E5, +0x8D23,0x62E9,0x5219,0x6CFD,0x8D3C,0x600E,0x589E,0x618E, +0x66FE,0x8D60,0x624E,0x55B3,0x6E23,0x672D,0x8F67, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8A81,0x8A82,0x8A83,0x8A84,0x8A85,0x8A86,0x8A87,0x8A88, +0x8A8B,0x8A8C,0x8A8D,0x8A8E,0x8A8F,0x8A90,0x8A91,0x8A92, +0x8A94,0x8A95,0x8A96,0x8A97,0x8A98,0x8A99,0x8A9A,0x8A9B, +0x8A9C,0x8A9D,0x8A9E,0x8A9F,0x8AA0,0x8AA1,0x8AA2,0x8AA3, +0x8AA4,0x8AA5,0x8AA6,0x8AA7,0x8AA8,0x8AA9,0x8AAA,0x8AAB, +0x8AAC,0x8AAD,0x8AAE,0x8AAF,0x8AB0,0x8AB1,0x8AB2,0x8AB3, +0x8AB4,0x8AB5,0x8AB6,0x8AB7,0x8AB8,0x8AB9,0x8ABA,0x8ABB, +0x8ABC,0x8ABD,0x8ABE,0x8ABF,0x8AC0,0x8AC1,0x8AC2, 0, +0x8AC3,0x8AC4,0x8AC5,0x8AC6,0x8AC7,0x8AC8,0x8AC9,0x8ACA, +0x8ACB,0x8ACC,0x8ACD,0x8ACE,0x8ACF,0x8AD0,0x8AD1,0x8AD2, +0x8AD3,0x8AD4,0x8AD5,0x8AD6,0x8AD7,0x8AD8,0x8AD9,0x8ADA, +0x8ADB,0x8ADC,0x8ADD,0x8ADE,0x8ADF,0x8AE0,0x8AE1,0x8AE2, +0x8AE3,0x94E1,0x95F8,0x7728,0x6805,0x69A8,0x548B,0x4E4D, +0x70B8,0x8BC8,0x6458,0x658B,0x5B85,0x7A84,0x503A,0x5BE8, +0x77BB,0x6BE1,0x8A79,0x7C98,0x6CBE,0x76CF,0x65A9,0x8F97, +0x5D2D,0x5C55,0x8638,0x6808,0x5360,0x6218,0x7AD9,0x6E5B, +0x7EFD,0x6A1F,0x7AE0,0x5F70,0x6F33,0x5F20,0x638C,0x6DA8, +0x6756,0x4E08,0x5E10,0x8D26,0x4ED7,0x80C0,0x7634,0x969C, +0x62DB,0x662D,0x627E,0x6CBC,0x8D75,0x7167,0x7F69,0x5146, +0x8087,0x53EC,0x906E,0x6298,0x54F2,0x86F0,0x8F99,0x8005, +0x9517,0x8517,0x8FD9,0x6D59,0x73CD,0x659F,0x771F,0x7504, +0x7827,0x81FB,0x8D1E,0x9488,0x4FA6,0x6795,0x75B9,0x8BCA, +0x9707,0x632F,0x9547,0x9635,0x84B8,0x6323,0x7741,0x5F81, +0x72F0,0x4E89,0x6014,0x6574,0x62EF,0x6B63,0x653F, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8AE4,0x8AE5,0x8AE6,0x8AE7,0x8AE8,0x8AE9,0x8AEA,0x8AEB, +0x8AEC,0x8AED,0x8AEE,0x8AEF,0x8AF0,0x8AF1,0x8AF2,0x8AF3, +0x8AF4,0x8AF5,0x8AF6,0x8AF7,0x8AF8,0x8AF9,0x8AFA,0x8AFB, +0x8AFC,0x8AFD,0x8AFE,0x8AFF,0x8B00,0x8B01,0x8B02,0x8B03, +0x8B04,0x8B05,0x8B06,0x8B08,0x8B09,0x8B0A,0x8B0B,0x8B0C, +0x8B0D,0x8B0E,0x8B0F,0x8B10,0x8B11,0x8B12,0x8B13,0x8B14, +0x8B15,0x8B16,0x8B17,0x8B18,0x8B19,0x8B1A,0x8B1B,0x8B1C, +0x8B1D,0x8B1E,0x8B1F,0x8B20,0x8B21,0x8B22,0x8B23, 0, +0x8B24,0x8B25,0x8B27,0x8B28,0x8B29,0x8B2A,0x8B2B,0x8B2C, +0x8B2D,0x8B2E,0x8B2F,0x8B30,0x8B31,0x8B32,0x8B33,0x8B34, +0x8B35,0x8B36,0x8B37,0x8B38,0x8B39,0x8B3A,0x8B3B,0x8B3C, +0x8B3D,0x8B3E,0x8B3F,0x8B40,0x8B41,0x8B42,0x8B43,0x8B44, +0x8B45,0x5E27,0x75C7,0x90D1,0x8BC1,0x829D,0x679D,0x652F, +0x5431,0x8718,0x77E5,0x80A2,0x8102,0x6C41,0x4E4B,0x7EC7, +0x804C,0x76F4,0x690D,0x6B96,0x6267,0x503C,0x4F84,0x5740, +0x6307,0x6B62,0x8DBE,0x53EA,0x65E8,0x7EB8,0x5FD7,0x631A, +0x63B7,0x81F3,0x81F4,0x7F6E,0x5E1C,0x5CD9,0x5236,0x667A, +0x79E9,0x7A1A,0x8D28,0x7099,0x75D4,0x6EDE,0x6CBB,0x7A92, +0x4E2D,0x76C5,0x5FE0,0x949F,0x8877,0x7EC8,0x79CD,0x80BF, +0x91CD,0x4EF2,0x4F17,0x821F,0x5468,0x5DDE,0x6D32,0x8BCC, +0x7CA5,0x8F74,0x8098,0x5E1A,0x5492,0x76B1,0x5B99,0x663C, +0x9AA4,0x73E0,0x682A,0x86DB,0x6731,0x732A,0x8BF8,0x8BDB, +0x9010,0x7AF9,0x70DB,0x716E,0x62C4,0x77A9,0x5631,0x4E3B, +0x8457,0x67F1,0x52A9,0x86C0,0x8D2E,0x94F8,0x7B51, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8B46,0x8B47,0x8B48,0x8B49,0x8B4A,0x8B4B,0x8B4C,0x8B4D, +0x8B4E,0x8B4F,0x8B50,0x8B51,0x8B52,0x8B53,0x8B54,0x8B55, +0x8B56,0x8B57,0x8B58,0x8B59,0x8B5A,0x8B5B,0x8B5C,0x8B5D, +0x8B5E,0x8B5F,0x8B60,0x8B61,0x8B62,0x8B63,0x8B64,0x8B65, +0x8B67,0x8B68,0x8B69,0x8B6A,0x8B6B,0x8B6D,0x8B6E,0x8B6F, +0x8B70,0x8B71,0x8B72,0x8B73,0x8B74,0x8B75,0x8B76,0x8B77, +0x8B78,0x8B79,0x8B7A,0x8B7B,0x8B7C,0x8B7D,0x8B7E,0x8B7F, +0x8B80,0x8B81,0x8B82,0x8B83,0x8B84,0x8B85,0x8B86, 0, +0x8B87,0x8B88,0x8B89,0x8B8A,0x8B8B,0x8B8C,0x8B8D,0x8B8E, +0x8B8F,0x8B90,0x8B91,0x8B92,0x8B93,0x8B94,0x8B95,0x8B96, +0x8B97,0x8B98,0x8B99,0x8B9A,0x8B9B,0x8B9C,0x8B9D,0x8B9E, +0x8B9F,0x8BAC,0x8BB1,0x8BBB,0x8BC7,0x8BD0,0x8BEA,0x8C09, +0x8C1E,0x4F4F,0x6CE8,0x795D,0x9A7B,0x6293,0x722A,0x62FD, +0x4E13,0x7816,0x8F6C,0x64B0,0x8D5A,0x7BC6,0x6869,0x5E84, +0x88C5,0x5986,0x649E,0x58EE,0x72B6,0x690E,0x9525,0x8FFD, +0x8D58,0x5760,0x7F00,0x8C06,0x51C6,0x6349,0x62D9,0x5353, +0x684C,0x7422,0x8301,0x914C,0x5544,0x7740,0x707C,0x6D4A, +0x5179,0x54A8,0x8D44,0x59FF,0x6ECB,0x6DC4,0x5B5C,0x7D2B, +0x4ED4,0x7C7D,0x6ED3,0x5B50,0x81EA,0x6E0D,0x5B57,0x9B03, +0x68D5,0x8E2A,0x5B97,0x7EFC,0x603B,0x7EB5,0x90B9,0x8D70, +0x594F,0x63CD,0x79DF,0x8DB3,0x5352,0x65CF,0x7956,0x8BC5, +0x963B,0x7EC4,0x94BB,0x7E82,0x5634,0x9189,0x6700,0x7F6A, +0x5C0A,0x9075,0x6628,0x5DE6,0x4F50,0x67DE,0x505A,0x4F5C, +0x5750,0x5EA7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8C38,0x8C39,0x8C3A,0x8C3B,0x8C3C,0x8C3D,0x8C3E,0x8C3F, +0x8C40,0x8C42,0x8C43,0x8C44,0x8C45,0x8C48,0x8C4A,0x8C4B, +0x8C4D,0x8C4E,0x8C4F,0x8C50,0x8C51,0x8C52,0x8C53,0x8C54, +0x8C56,0x8C57,0x8C58,0x8C59,0x8C5B,0x8C5C,0x8C5D,0x8C5E, +0x8C5F,0x8C60,0x8C63,0x8C64,0x8C65,0x8C66,0x8C67,0x8C68, +0x8C69,0x8C6C,0x8C6D,0x8C6E,0x8C6F,0x8C70,0x8C71,0x8C72, +0x8C74,0x8C75,0x8C76,0x8C77,0x8C7B,0x8C7C,0x8C7D,0x8C7E, +0x8C7F,0x8C80,0x8C81,0x8C83,0x8C84,0x8C86,0x8C87, 0, +0x8C88,0x8C8B,0x8C8D,0x8C8E,0x8C8F,0x8C90,0x8C91,0x8C92, +0x8C93,0x8C95,0x8C96,0x8C97,0x8C99,0x8C9A,0x8C9B,0x8C9C, +0x8C9D,0x8C9E,0x8C9F,0x8CA0,0x8CA1,0x8CA2,0x8CA3,0x8CA4, +0x8CA5,0x8CA6,0x8CA7,0x8CA8,0x8CA9,0x8CAA,0x8CAB,0x8CAC, +0x8CAD,0x4E8D,0x4E0C,0x5140,0x4E10,0x5EFF,0x5345,0x4E15, +0x4E98,0x4E1E,0x9B32,0x5B6C,0x5669,0x4E28,0x79BA,0x4E3F, +0x5315,0x4E47,0x592D,0x723B,0x536E,0x6C10,0x56DF,0x80E4, +0x9997,0x6BD3,0x777E,0x9F17,0x4E36,0x4E9F,0x9F10,0x4E5C, +0x4E69,0x4E93,0x8288,0x5B5B,0x556C,0x560F,0x4EC4,0x538D, +0x539D,0x53A3,0x53A5,0x53AE,0x9765,0x8D5D,0x531A,0x53F5, +0x5326,0x532E,0x533E,0x8D5C,0x5366,0x5363,0x5202,0x5208, +0x520E,0x522D,0x5233,0x523F,0x5240,0x524C,0x525E,0x5261, +0x525C,0x84AF,0x527D,0x5282,0x5281,0x5290,0x5293,0x5182, +0x7F54,0x4EBB,0x4EC3,0x4EC9,0x4EC2,0x4EE8,0x4EE1,0x4EEB, +0x4EDE,0x4F1B,0x4EF3,0x4F22,0x4F64,0x4EF5,0x4F25,0x4F27, +0x4F09,0x4F2B,0x4F5E,0x4F67,0x6538,0x4F5A,0x4F5D, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8CAE,0x8CAF,0x8CB0,0x8CB1,0x8CB2,0x8CB3,0x8CB4,0x8CB5, +0x8CB6,0x8CB7,0x8CB8,0x8CB9,0x8CBA,0x8CBB,0x8CBC,0x8CBD, +0x8CBE,0x8CBF,0x8CC0,0x8CC1,0x8CC2,0x8CC3,0x8CC4,0x8CC5, +0x8CC6,0x8CC7,0x8CC8,0x8CC9,0x8CCA,0x8CCB,0x8CCC,0x8CCD, +0x8CCE,0x8CCF,0x8CD0,0x8CD1,0x8CD2,0x8CD3,0x8CD4,0x8CD5, +0x8CD6,0x8CD7,0x8CD8,0x8CD9,0x8CDA,0x8CDB,0x8CDC,0x8CDD, +0x8CDE,0x8CDF,0x8CE0,0x8CE1,0x8CE2,0x8CE3,0x8CE4,0x8CE5, +0x8CE6,0x8CE7,0x8CE8,0x8CE9,0x8CEA,0x8CEB,0x8CEC, 0, +0x8CED,0x8CEE,0x8CEF,0x8CF0,0x8CF1,0x8CF2,0x8CF3,0x8CF4, +0x8CF5,0x8CF6,0x8CF7,0x8CF8,0x8CF9,0x8CFA,0x8CFB,0x8CFC, +0x8CFD,0x8CFE,0x8CFF,0x8D00,0x8D01,0x8D02,0x8D03,0x8D04, +0x8D05,0x8D06,0x8D07,0x8D08,0x8D09,0x8D0A,0x8D0B,0x8D0C, +0x8D0D,0x4F5F,0x4F57,0x4F32,0x4F3D,0x4F76,0x4F74,0x4F91, +0x4F89,0x4F83,0x4F8F,0x4F7E,0x4F7B,0x4FAA,0x4F7C,0x4FAC, +0x4F94,0x4FE6,0x4FE8,0x4FEA,0x4FC5,0x4FDA,0x4FE3,0x4FDC, +0x4FD1,0x4FDF,0x4FF8,0x5029,0x504C,0x4FF3,0x502C,0x500F, +0x502E,0x502D,0x4FFE,0x501C,0x500C,0x5025,0x5028,0x507E, +0x5043,0x5055,0x5048,0x504E,0x506C,0x507B,0x50A5,0x50A7, +0x50A9,0x50BA,0x50D6,0x5106,0x50ED,0x50EC,0x50E6,0x50EE, +0x5107,0x510B,0x4EDD,0x6C3D,0x4F58,0x4F65,0x4FCE,0x9FA0, +0x6C46,0x7C74,0x516E,0x5DFD,0x9EC9,0x9998,0x5181,0x5914, +0x52F9,0x530D,0x8A07,0x5310,0x51EB,0x5919,0x5155,0x4EA0, +0x5156,0x4EB3,0x886E,0x88A4,0x4EB5,0x8114,0x88D2,0x7980, +0x5B34,0x8803,0x7FB8,0x51AB,0x51B1,0x51BD,0x51BC, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8D0E,0x8D0F,0x8D10,0x8D11,0x8D12,0x8D13,0x8D14,0x8D15, +0x8D16,0x8D17,0x8D18,0x8D19,0x8D1A,0x8D1B,0x8D1C,0x8D20, +0x8D51,0x8D52,0x8D57,0x8D5F,0x8D65,0x8D68,0x8D69,0x8D6A, +0x8D6C,0x8D6E,0x8D6F,0x8D71,0x8D72,0x8D78,0x8D79,0x8D7A, +0x8D7B,0x8D7C,0x8D7D,0x8D7E,0x8D7F,0x8D80,0x8D82,0x8D83, +0x8D86,0x8D87,0x8D88,0x8D89,0x8D8C,0x8D8D,0x8D8E,0x8D8F, +0x8D90,0x8D92,0x8D93,0x8D95,0x8D96,0x8D97,0x8D98,0x8D99, +0x8D9A,0x8D9B,0x8D9C,0x8D9D,0x8D9E,0x8DA0,0x8DA1, 0, +0x8DA2,0x8DA4,0x8DA5,0x8DA6,0x8DA7,0x8DA8,0x8DA9,0x8DAA, +0x8DAB,0x8DAC,0x8DAD,0x8DAE,0x8DAF,0x8DB0,0x8DB2,0x8DB6, +0x8DB7,0x8DB9,0x8DBB,0x8DBD,0x8DC0,0x8DC1,0x8DC2,0x8DC5, +0x8DC7,0x8DC8,0x8DC9,0x8DCA,0x8DCD,0x8DD0,0x8DD2,0x8DD3, +0x8DD4,0x51C7,0x5196,0x51A2,0x51A5,0x8BA0,0x8BA6,0x8BA7, +0x8BAA,0x8BB4,0x8BB5,0x8BB7,0x8BC2,0x8BC3,0x8BCB,0x8BCF, +0x8BCE,0x8BD2,0x8BD3,0x8BD4,0x8BD6,0x8BD8,0x8BD9,0x8BDC, +0x8BDF,0x8BE0,0x8BE4,0x8BE8,0x8BE9,0x8BEE,0x8BF0,0x8BF3, +0x8BF6,0x8BF9,0x8BFC,0x8BFF,0x8C00,0x8C02,0x8C04,0x8C07, +0x8C0C,0x8C0F,0x8C11,0x8C12,0x8C14,0x8C15,0x8C16,0x8C19, +0x8C1B,0x8C18,0x8C1D,0x8C1F,0x8C20,0x8C21,0x8C25,0x8C27, +0x8C2A,0x8C2B,0x8C2E,0x8C2F,0x8C32,0x8C33,0x8C35,0x8C36, +0x5369,0x537A,0x961D,0x9622,0x9621,0x9631,0x962A,0x963D, +0x963C,0x9642,0x9649,0x9654,0x965F,0x9667,0x966C,0x9672, +0x9674,0x9688,0x968D,0x9697,0x96B0,0x9097,0x909B,0x909D, +0x9099,0x90AC,0x90A1,0x90B4,0x90B3,0x90B6,0x90BA, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8DD5,0x8DD8,0x8DD9,0x8DDC,0x8DE0,0x8DE1,0x8DE2,0x8DE5, +0x8DE6,0x8DE7,0x8DE9,0x8DED,0x8DEE,0x8DF0,0x8DF1,0x8DF2, +0x8DF4,0x8DF6,0x8DFC,0x8DFE,0x8DFF,0x8E00,0x8E01,0x8E02, +0x8E03,0x8E04,0x8E06,0x8E07,0x8E08,0x8E0B,0x8E0D,0x8E0E, +0x8E10,0x8E11,0x8E12,0x8E13,0x8E15,0x8E16,0x8E17,0x8E18, +0x8E19,0x8E1A,0x8E1B,0x8E1C,0x8E20,0x8E21,0x8E24,0x8E25, +0x8E26,0x8E27,0x8E28,0x8E2B,0x8E2D,0x8E30,0x8E32,0x8E33, +0x8E34,0x8E36,0x8E37,0x8E38,0x8E3B,0x8E3C,0x8E3E, 0, +0x8E3F,0x8E43,0x8E45,0x8E46,0x8E4C,0x8E4D,0x8E4E,0x8E4F, +0x8E50,0x8E53,0x8E54,0x8E55,0x8E56,0x8E57,0x8E58,0x8E5A, +0x8E5B,0x8E5C,0x8E5D,0x8E5E,0x8E5F,0x8E60,0x8E61,0x8E62, +0x8E63,0x8E64,0x8E65,0x8E67,0x8E68,0x8E6A,0x8E6B,0x8E6E, +0x8E71,0x90B8,0x90B0,0x90CF,0x90C5,0x90BE,0x90D0,0x90C4, +0x90C7,0x90D3,0x90E6,0x90E2,0x90DC,0x90D7,0x90DB,0x90EB, +0x90EF,0x90FE,0x9104,0x9122,0x911E,0x9123,0x9131,0x912F, +0x9139,0x9143,0x9146,0x520D,0x5942,0x52A2,0x52AC,0x52AD, +0x52BE,0x54FF,0x52D0,0x52D6,0x52F0,0x53DF,0x71EE,0x77CD, +0x5EF4,0x51F5,0x51FC,0x9B2F,0x53B6,0x5F01,0x755A,0x5DEF, +0x574C,0x57A9,0x57A1,0x587E,0x58BC,0x58C5,0x58D1,0x5729, +0x572C,0x572A,0x5733,0x5739,0x572E,0x572F,0x575C,0x573B, +0x5742,0x5769,0x5785,0x576B,0x5786,0x577C,0x577B,0x5768, +0x576D,0x5776,0x5773,0x57AD,0x57A4,0x578C,0x57B2,0x57CF, +0x57A7,0x57B4,0x5793,0x57A0,0x57D5,0x57D8,0x57DA,0x57D9, +0x57D2,0x57B8,0x57F4,0x57EF,0x57F8,0x57E4,0x57DD, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8E73,0x8E75,0x8E77,0x8E78,0x8E79,0x8E7A,0x8E7B,0x8E7D, +0x8E7E,0x8E80,0x8E82,0x8E83,0x8E84,0x8E86,0x8E88,0x8E89, +0x8E8A,0x8E8B,0x8E8C,0x8E8D,0x8E8E,0x8E91,0x8E92,0x8E93, +0x8E95,0x8E96,0x8E97,0x8E98,0x8E99,0x8E9A,0x8E9B,0x8E9D, +0x8E9F,0x8EA0,0x8EA1,0x8EA2,0x8EA3,0x8EA4,0x8EA5,0x8EA6, +0x8EA7,0x8EA8,0x8EA9,0x8EAA,0x8EAD,0x8EAE,0x8EB0,0x8EB1, +0x8EB3,0x8EB4,0x8EB5,0x8EB6,0x8EB7,0x8EB8,0x8EB9,0x8EBB, +0x8EBC,0x8EBD,0x8EBE,0x8EBF,0x8EC0,0x8EC1,0x8EC2, 0, +0x8EC3,0x8EC4,0x8EC5,0x8EC6,0x8EC7,0x8EC8,0x8EC9,0x8ECA, +0x8ECB,0x8ECC,0x8ECD,0x8ECF,0x8ED0,0x8ED1,0x8ED2,0x8ED3, +0x8ED4,0x8ED5,0x8ED6,0x8ED7,0x8ED8,0x8ED9,0x8EDA,0x8EDB, +0x8EDC,0x8EDD,0x8EDE,0x8EDF,0x8EE0,0x8EE1,0x8EE2,0x8EE3, +0x8EE4,0x580B,0x580D,0x57FD,0x57ED,0x5800,0x581E,0x5819, +0x5844,0x5820,0x5865,0x586C,0x5881,0x5889,0x589A,0x5880, +0x99A8,0x9F19,0x61FF,0x8279,0x827D,0x827F,0x828F,0x828A, +0x82A8,0x8284,0x828E,0x8291,0x8297,0x8299,0x82AB,0x82B8, +0x82BE,0x82B0,0x82C8,0x82CA,0x82E3,0x8298,0x82B7,0x82AE, +0x82CB,0x82CC,0x82C1,0x82A9,0x82B4,0x82A1,0x82AA,0x829F, +0x82C4,0x82CE,0x82A4,0x82E1,0x8309,0x82F7,0x82E4,0x830F, +0x8307,0x82DC,0x82F4,0x82D2,0x82D8,0x830C,0x82FB,0x82D3, +0x8311,0x831A,0x8306,0x8314,0x8315,0x82E0,0x82D5,0x831C, +0x8351,0x835B,0x835C,0x8308,0x8392,0x833C,0x8334,0x8331, +0x839B,0x835E,0x832F,0x834F,0x8347,0x8343,0x835F,0x8340, +0x8317,0x8360,0x832D,0x833A,0x8333,0x8366,0x8365, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8EE5,0x8EE6,0x8EE7,0x8EE8,0x8EE9,0x8EEA,0x8EEB,0x8EEC, +0x8EED,0x8EEE,0x8EEF,0x8EF0,0x8EF1,0x8EF2,0x8EF3,0x8EF4, +0x8EF5,0x8EF6,0x8EF7,0x8EF8,0x8EF9,0x8EFA,0x8EFB,0x8EFC, +0x8EFD,0x8EFE,0x8EFF,0x8F00,0x8F01,0x8F02,0x8F03,0x8F04, +0x8F05,0x8F06,0x8F07,0x8F08,0x8F09,0x8F0A,0x8F0B,0x8F0C, +0x8F0D,0x8F0E,0x8F0F,0x8F10,0x8F11,0x8F12,0x8F13,0x8F14, +0x8F15,0x8F16,0x8F17,0x8F18,0x8F19,0x8F1A,0x8F1B,0x8F1C, +0x8F1D,0x8F1E,0x8F1F,0x8F20,0x8F21,0x8F22,0x8F23, 0, +0x8F24,0x8F25,0x8F26,0x8F27,0x8F28,0x8F29,0x8F2A,0x8F2B, +0x8F2C,0x8F2D,0x8F2E,0x8F2F,0x8F30,0x8F31,0x8F32,0x8F33, +0x8F34,0x8F35,0x8F36,0x8F37,0x8F38,0x8F39,0x8F3A,0x8F3B, +0x8F3C,0x8F3D,0x8F3E,0x8F3F,0x8F40,0x8F41,0x8F42,0x8F43, +0x8F44,0x8368,0x831B,0x8369,0x836C,0x836A,0x836D,0x836E, +0x83B0,0x8378,0x83B3,0x83B4,0x83A0,0x83AA,0x8393,0x839C, +0x8385,0x837C,0x83B6,0x83A9,0x837D,0x83B8,0x837B,0x8398, +0x839E,0x83A8,0x83BA,0x83BC,0x83C1,0x8401,0x83E5,0x83D8, +0x5807,0x8418,0x840B,0x83DD,0x83FD,0x83D6,0x841C,0x8438, +0x8411,0x8406,0x83D4,0x83DF,0x840F,0x8403,0x83F8,0x83F9, +0x83EA,0x83C5,0x83C0,0x8426,0x83F0,0x83E1,0x845C,0x8451, +0x845A,0x8459,0x8473,0x8487,0x8488,0x847A,0x8489,0x8478, +0x843C,0x8446,0x8469,0x8476,0x848C,0x848E,0x8431,0x846D, +0x84C1,0x84CD,0x84D0,0x84E6,0x84BD,0x84D3,0x84CA,0x84BF, +0x84BA,0x84E0,0x84A1,0x84B9,0x84B4,0x8497,0x84E5,0x84E3, +0x850C,0x750D,0x8538,0x84F0,0x8539,0x851F,0x853A, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8F45,0x8F46,0x8F47,0x8F48,0x8F49,0x8F4A,0x8F4B,0x8F4C, +0x8F4D,0x8F4E,0x8F4F,0x8F50,0x8F51,0x8F52,0x8F53,0x8F54, +0x8F55,0x8F56,0x8F57,0x8F58,0x8F59,0x8F5A,0x8F5B,0x8F5C, +0x8F5D,0x8F5E,0x8F5F,0x8F60,0x8F61,0x8F62,0x8F63,0x8F64, +0x8F65,0x8F6A,0x8F80,0x8F8C,0x8F92,0x8F9D,0x8FA0,0x8FA1, +0x8FA2,0x8FA4,0x8FA5,0x8FA6,0x8FA7,0x8FAA,0x8FAC,0x8FAD, +0x8FAE,0x8FAF,0x8FB2,0x8FB3,0x8FB4,0x8FB5,0x8FB7,0x8FB8, +0x8FBA,0x8FBB,0x8FBC,0x8FBF,0x8FC0,0x8FC3,0x8FC6, 0, +0x8FC9,0x8FCA,0x8FCB,0x8FCC,0x8FCD,0x8FCF,0x8FD2,0x8FD6, +0x8FD7,0x8FDA,0x8FE0,0x8FE1,0x8FE3,0x8FE7,0x8FEC,0x8FEF, +0x8FF1,0x8FF2,0x8FF4,0x8FF5,0x8FF6,0x8FFA,0x8FFB,0x8FFC, +0x8FFE,0x8FFF,0x9007,0x9008,0x900C,0x900E,0x9013,0x9015, +0x9018,0x8556,0x853B,0x84FF,0x84FC,0x8559,0x8548,0x8568, +0x8564,0x855E,0x857A,0x77A2,0x8543,0x8572,0x857B,0x85A4, +0x85A8,0x8587,0x858F,0x8579,0x85AE,0x859C,0x8585,0x85B9, +0x85B7,0x85B0,0x85D3,0x85C1,0x85DC,0x85FF,0x8627,0x8605, +0x8629,0x8616,0x863C,0x5EFE,0x5F08,0x593C,0x5941,0x8037, +0x5955,0x595A,0x5958,0x530F,0x5C22,0x5C25,0x5C2C,0x5C34, +0x624C,0x626A,0x629F,0x62BB,0x62CA,0x62DA,0x62D7,0x62EE, +0x6322,0x62F6,0x6339,0x634B,0x6343,0x63AD,0x63F6,0x6371, +0x637A,0x638E,0x63B4,0x636D,0x63AC,0x638A,0x6369,0x63AE, +0x63BC,0x63F2,0x63F8,0x63E0,0x63FF,0x63C4,0x63DE,0x63CE, +0x6452,0x63C6,0x63BE,0x6445,0x6441,0x640B,0x641B,0x6420, +0x640C,0x6426,0x6421,0x645E,0x6484,0x646D,0x6496, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9019,0x901C,0x9023,0x9024,0x9025,0x9027,0x9028,0x9029, +0x902A,0x902B,0x902C,0x9030,0x9031,0x9032,0x9033,0x9034, +0x9037,0x9039,0x903A,0x903D,0x903F,0x9040,0x9043,0x9045, +0x9046,0x9048,0x9049,0x904A,0x904B,0x904C,0x904E,0x9054, +0x9055,0x9056,0x9059,0x905A,0x905C,0x905D,0x905E,0x905F, +0x9060,0x9061,0x9064,0x9066,0x9067,0x9069,0x906A,0x906B, +0x906C,0x906F,0x9070,0x9071,0x9072,0x9073,0x9076,0x9077, +0x9078,0x9079,0x907A,0x907B,0x907C,0x907E,0x9081, 0, +0x9084,0x9085,0x9086,0x9087,0x9089,0x908A,0x908C,0x908D, +0x908E,0x908F,0x9090,0x9092,0x9094,0x9096,0x9098,0x909A, +0x909C,0x909E,0x909F,0x90A0,0x90A4,0x90A5,0x90A7,0x90A8, +0x90A9,0x90AB,0x90AD,0x90B2,0x90B7,0x90BC,0x90BD,0x90BF, +0x90C0,0x647A,0x64B7,0x64B8,0x6499,0x64BA,0x64C0,0x64D0, +0x64D7,0x64E4,0x64E2,0x6509,0x6525,0x652E,0x5F0B,0x5FD2, +0x7519,0x5F11,0x535F,0x53F1,0x53FD,0x53E9,0x53E8,0x53FB, +0x5412,0x5416,0x5406,0x544B,0x5452,0x5453,0x5454,0x5456, +0x5443,0x5421,0x5457,0x5459,0x5423,0x5432,0x5482,0x5494, +0x5477,0x5471,0x5464,0x549A,0x549B,0x5484,0x5476,0x5466, +0x549D,0x54D0,0x54AD,0x54C2,0x54B4,0x54D2,0x54A7,0x54A6, +0x54D3,0x54D4,0x5472,0x54A3,0x54D5,0x54BB,0x54BF,0x54CC, +0x54D9,0x54DA,0x54DC,0x54A9,0x54AA,0x54A4,0x54DD,0x54CF, +0x54DE,0x551B,0x54E7,0x5520,0x54FD,0x5514,0x54F3,0x5522, +0x5523,0x550F,0x5511,0x5527,0x552A,0x5567,0x558F,0x55B5, +0x5549,0x556D,0x5541,0x5555,0x553F,0x5550,0x553C, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x90C2,0x90C3,0x90C6,0x90C8,0x90C9,0x90CB,0x90CC,0x90CD, +0x90D2,0x90D4,0x90D5,0x90D6,0x90D8,0x90D9,0x90DA,0x90DE, +0x90DF,0x90E0,0x90E3,0x90E4,0x90E5,0x90E9,0x90EA,0x90EC, +0x90EE,0x90F0,0x90F1,0x90F2,0x90F3,0x90F5,0x90F6,0x90F7, +0x90F9,0x90FA,0x90FB,0x90FC,0x90FF,0x9100,0x9101,0x9103, +0x9105,0x9106,0x9107,0x9108,0x9109,0x910A,0x910B,0x910C, +0x910D,0x910E,0x910F,0x9110,0x9111,0x9112,0x9113,0x9114, +0x9115,0x9116,0x9117,0x9118,0x911A,0x911B,0x911C, 0, +0x911D,0x911F,0x9120,0x9121,0x9124,0x9125,0x9126,0x9127, +0x9128,0x9129,0x912A,0x912B,0x912C,0x912D,0x912E,0x9130, +0x9132,0x9133,0x9134,0x9135,0x9136,0x9137,0x9138,0x913A, +0x913B,0x913C,0x913D,0x913E,0x913F,0x9140,0x9141,0x9142, +0x9144,0x5537,0x5556,0x5575,0x5576,0x5577,0x5533,0x5530, +0x555C,0x558B,0x55D2,0x5583,0x55B1,0x55B9,0x5588,0x5581, +0x559F,0x557E,0x55D6,0x5591,0x557B,0x55DF,0x55BD,0x55BE, +0x5594,0x5599,0x55EA,0x55F7,0x55C9,0x561F,0x55D1,0x55EB, +0x55EC,0x55D4,0x55E6,0x55DD,0x55C4,0x55EF,0x55E5,0x55F2, +0x55F3,0x55CC,0x55CD,0x55E8,0x55F5,0x55E4,0x8F94,0x561E, +0x5608,0x560C,0x5601,0x5624,0x5623,0x55FE,0x5600,0x5627, +0x562D,0x5658,0x5639,0x5657,0x562C,0x564D,0x5662,0x5659, +0x565C,0x564C,0x5654,0x5686,0x5664,0x5671,0x566B,0x567B, +0x567C,0x5685,0x5693,0x56AF,0x56D4,0x56D7,0x56DD,0x56E1, +0x56F5,0x56EB,0x56F9,0x56FF,0x5704,0x570A,0x5709,0x571C, +0x5E0F,0x5E19,0x5E14,0x5E11,0x5E31,0x5E3B,0x5E3C, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9145,0x9147,0x9148,0x9151,0x9153,0x9154,0x9155,0x9156, +0x9158,0x9159,0x915B,0x915C,0x915F,0x9160,0x9166,0x9167, +0x9168,0x916B,0x916D,0x9173,0x917A,0x917B,0x917C,0x9180, +0x9181,0x9182,0x9183,0x9184,0x9186,0x9188,0x918A,0x918E, +0x918F,0x9193,0x9194,0x9195,0x9196,0x9197,0x9198,0x9199, +0x919C,0x919D,0x919E,0x919F,0x91A0,0x91A1,0x91A4,0x91A5, +0x91A6,0x91A7,0x91A8,0x91A9,0x91AB,0x91AC,0x91B0,0x91B1, +0x91B2,0x91B3,0x91B6,0x91B7,0x91B8,0x91B9,0x91BB, 0, +0x91BC,0x91BD,0x91BE,0x91BF,0x91C0,0x91C1,0x91C2,0x91C3, +0x91C4,0x91C5,0x91C6,0x91C8,0x91CB,0x91D0,0x91D2,0x91D3, +0x91D4,0x91D5,0x91D6,0x91D7,0x91D8,0x91D9,0x91DA,0x91DB, +0x91DD,0x91DE,0x91DF,0x91E0,0x91E1,0x91E2,0x91E3,0x91E4, +0x91E5,0x5E37,0x5E44,0x5E54,0x5E5B,0x5E5E,0x5E61,0x5C8C, +0x5C7A,0x5C8D,0x5C90,0x5C96,0x5C88,0x5C98,0x5C99,0x5C91, +0x5C9A,0x5C9C,0x5CB5,0x5CA2,0x5CBD,0x5CAC,0x5CAB,0x5CB1, +0x5CA3,0x5CC1,0x5CB7,0x5CC4,0x5CD2,0x5CE4,0x5CCB,0x5CE5, +0x5D02,0x5D03,0x5D27,0x5D26,0x5D2E,0x5D24,0x5D1E,0x5D06, +0x5D1B,0x5D58,0x5D3E,0x5D34,0x5D3D,0x5D6C,0x5D5B,0x5D6F, +0x5D5D,0x5D6B,0x5D4B,0x5D4A,0x5D69,0x5D74,0x5D82,0x5D99, +0x5D9D,0x8C73,0x5DB7,0x5DC5,0x5F73,0x5F77,0x5F82,0x5F87, +0x5F89,0x5F8C,0x5F95,0x5F99,0x5F9C,0x5FA8,0x5FAD,0x5FB5, +0x5FBC,0x8862,0x5F61,0x72AD,0x72B0,0x72B4,0x72B7,0x72B8, +0x72C3,0x72C1,0x72CE,0x72CD,0x72D2,0x72E8,0x72EF,0x72E9, +0x72F2,0x72F4,0x72F7,0x7301,0x72F3,0x7303,0x72FA, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x91E6,0x91E7,0x91E8,0x91E9,0x91EA,0x91EB,0x91EC,0x91ED, +0x91EE,0x91EF,0x91F0,0x91F1,0x91F2,0x91F3,0x91F4,0x91F5, +0x91F6,0x91F7,0x91F8,0x91F9,0x91FA,0x91FB,0x91FC,0x91FD, +0x91FE,0x91FF,0x9200,0x9201,0x9202,0x9203,0x9204,0x9205, +0x9206,0x9207,0x9208,0x9209,0x920A,0x920B,0x920C,0x920D, +0x920E,0x920F,0x9210,0x9211,0x9212,0x9213,0x9214,0x9215, +0x9216,0x9217,0x9218,0x9219,0x921A,0x921B,0x921C,0x921D, +0x921E,0x921F,0x9220,0x9221,0x9222,0x9223,0x9224, 0, +0x9225,0x9226,0x9227,0x9228,0x9229,0x922A,0x922B,0x922C, +0x922D,0x922E,0x922F,0x9230,0x9231,0x9232,0x9233,0x9234, +0x9235,0x9236,0x9237,0x9238,0x9239,0x923A,0x923B,0x923C, +0x923D,0x923E,0x923F,0x9240,0x9241,0x9242,0x9243,0x9244, +0x9245,0x72FB,0x7317,0x7313,0x7321,0x730A,0x731E,0x731D, +0x7315,0x7322,0x7339,0x7325,0x732C,0x7338,0x7331,0x7350, +0x734D,0x7357,0x7360,0x736C,0x736F,0x737E,0x821B,0x5925, +0x98E7,0x5924,0x5902,0x9963,0x9967,0x9968,0x9969,0x996A, +0x996B,0x996C,0x9974,0x9977,0x997D,0x9980,0x9984,0x9987, +0x998A,0x998D,0x9990,0x9991,0x9993,0x9994,0x9995,0x5E80, +0x5E91,0x5E8B,0x5E96,0x5EA5,0x5EA0,0x5EB9,0x5EB5,0x5EBE, +0x5EB3,0x8D53,0x5ED2,0x5ED1,0x5EDB,0x5EE8,0x5EEA,0x81BA, +0x5FC4,0x5FC9,0x5FD6,0x5FCF,0x6003,0x5FEE,0x6004,0x5FE1, +0x5FE4,0x5FFE,0x6005,0x6006,0x5FEA,0x5FED,0x5FF8,0x6019, +0x6035,0x6026,0x601B,0x600F,0x600D,0x6029,0x602B,0x600A, +0x603F,0x6021,0x6078,0x6079,0x607B,0x607A,0x6042, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9246,0x9247,0x9248,0x9249,0x924A,0x924B,0x924C,0x924D, +0x924E,0x924F,0x9250,0x9251,0x9252,0x9253,0x9254,0x9255, +0x9256,0x9257,0x9258,0x9259,0x925A,0x925B,0x925C,0x925D, +0x925E,0x925F,0x9260,0x9261,0x9262,0x9263,0x9264,0x9265, +0x9266,0x9267,0x9268,0x9269,0x926A,0x926B,0x926C,0x926D, +0x926E,0x926F,0x9270,0x9271,0x9272,0x9273,0x9275,0x9276, +0x9277,0x9278,0x9279,0x927A,0x927B,0x927C,0x927D,0x927E, +0x927F,0x9280,0x9281,0x9282,0x9283,0x9284,0x9285, 0, +0x9286,0x9287,0x9288,0x9289,0x928A,0x928B,0x928C,0x928D, +0x928F,0x9290,0x9291,0x9292,0x9293,0x9294,0x9295,0x9296, +0x9297,0x9298,0x9299,0x929A,0x929B,0x929C,0x929D,0x929E, +0x929F,0x92A0,0x92A1,0x92A2,0x92A3,0x92A4,0x92A5,0x92A6, +0x92A7,0x606A,0x607D,0x6096,0x609A,0x60AD,0x609D,0x6083, +0x6092,0x608C,0x609B,0x60EC,0x60BB,0x60B1,0x60DD,0x60D8, +0x60C6,0x60DA,0x60B4,0x6120,0x6126,0x6115,0x6123,0x60F4, +0x6100,0x610E,0x612B,0x614A,0x6175,0x61AC,0x6194,0x61A7, +0x61B7,0x61D4,0x61F5,0x5FDD,0x96B3,0x95E9,0x95EB,0x95F1, +0x95F3,0x95F5,0x95F6,0x95FC,0x95FE,0x9603,0x9604,0x9606, +0x9608,0x960A,0x960B,0x960C,0x960D,0x960F,0x9612,0x9615, +0x9616,0x9617,0x9619,0x961A,0x4E2C,0x723F,0x6215,0x6C35, +0x6C54,0x6C5C,0x6C4A,0x6CA3,0x6C85,0x6C90,0x6C94,0x6C8C, +0x6C68,0x6C69,0x6C74,0x6C76,0x6C86,0x6CA9,0x6CD0,0x6CD4, +0x6CAD,0x6CF7,0x6CF8,0x6CF1,0x6CD7,0x6CB2,0x6CE0,0x6CD6, +0x6CFA,0x6CEB,0x6CEE,0x6CB1,0x6CD3,0x6CEF,0x6CFE, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x92A8,0x92A9,0x92AA,0x92AB,0x92AC,0x92AD,0x92AF,0x92B0, +0x92B1,0x92B2,0x92B3,0x92B4,0x92B5,0x92B6,0x92B7,0x92B8, +0x92B9,0x92BA,0x92BB,0x92BC,0x92BD,0x92BE,0x92BF,0x92C0, +0x92C1,0x92C2,0x92C3,0x92C4,0x92C5,0x92C6,0x92C7,0x92C9, +0x92CA,0x92CB,0x92CC,0x92CD,0x92CE,0x92CF,0x92D0,0x92D1, +0x92D2,0x92D3,0x92D4,0x92D5,0x92D6,0x92D7,0x92D8,0x92D9, +0x92DA,0x92DB,0x92DC,0x92DD,0x92DE,0x92DF,0x92E0,0x92E1, +0x92E2,0x92E3,0x92E4,0x92E5,0x92E6,0x92E7,0x92E8, 0, +0x92E9,0x92EA,0x92EB,0x92EC,0x92ED,0x92EE,0x92EF,0x92F0, +0x92F1,0x92F2,0x92F3,0x92F4,0x92F5,0x92F6,0x92F7,0x92F8, +0x92F9,0x92FA,0x92FB,0x92FC,0x92FD,0x92FE,0x92FF,0x9300, +0x9301,0x9302,0x9303,0x9304,0x9305,0x9306,0x9307,0x9308, +0x9309,0x6D39,0x6D27,0x6D0C,0x6D43,0x6D48,0x6D07,0x6D04, +0x6D19,0x6D0E,0x6D2B,0x6D4D,0x6D2E,0x6D35,0x6D1A,0x6D4F, +0x6D52,0x6D54,0x6D33,0x6D91,0x6D6F,0x6D9E,0x6DA0,0x6D5E, +0x6D93,0x6D94,0x6D5C,0x6D60,0x6D7C,0x6D63,0x6E1A,0x6DC7, +0x6DC5,0x6DDE,0x6E0E,0x6DBF,0x6DE0,0x6E11,0x6DE6,0x6DDD, +0x6DD9,0x6E16,0x6DAB,0x6E0C,0x6DAE,0x6E2B,0x6E6E,0x6E4E, +0x6E6B,0x6EB2,0x6E5F,0x6E86,0x6E53,0x6E54,0x6E32,0x6E25, +0x6E44,0x6EDF,0x6EB1,0x6E98,0x6EE0,0x6F2D,0x6EE2,0x6EA5, +0x6EA7,0x6EBD,0x6EBB,0x6EB7,0x6ED7,0x6EB4,0x6ECF,0x6E8F, +0x6EC2,0x6E9F,0x6F62,0x6F46,0x6F47,0x6F24,0x6F15,0x6EF9, +0x6F2F,0x6F36,0x6F4B,0x6F74,0x6F2A,0x6F09,0x6F29,0x6F89, +0x6F8D,0x6F8C,0x6F78,0x6F72,0x6F7C,0x6F7A,0x6FD1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x930A,0x930B,0x930C,0x930D,0x930E,0x930F,0x9310,0x9311, +0x9312,0x9313,0x9314,0x9315,0x9316,0x9317,0x9318,0x9319, +0x931A,0x931B,0x931C,0x931D,0x931E,0x931F,0x9320,0x9321, +0x9322,0x9323,0x9324,0x9325,0x9326,0x9327,0x9328,0x9329, +0x932A,0x932B,0x932C,0x932D,0x932E,0x932F,0x9330,0x9331, +0x9332,0x9333,0x9334,0x9335,0x9336,0x9337,0x9338,0x9339, +0x933A,0x933B,0x933C,0x933D,0x933F,0x9340,0x9341,0x9342, +0x9343,0x9344,0x9345,0x9346,0x9347,0x9348,0x9349, 0, +0x934A,0x934B,0x934C,0x934D,0x934E,0x934F,0x9350,0x9351, +0x9352,0x9353,0x9354,0x9355,0x9356,0x9357,0x9358,0x9359, +0x935A,0x935B,0x935C,0x935D,0x935E,0x935F,0x9360,0x9361, +0x9362,0x9363,0x9364,0x9365,0x9366,0x9367,0x9368,0x9369, +0x936B,0x6FC9,0x6FA7,0x6FB9,0x6FB6,0x6FC2,0x6FE1,0x6FEE, +0x6FDE,0x6FE0,0x6FEF,0x701A,0x7023,0x701B,0x7039,0x7035, +0x704F,0x705E,0x5B80,0x5B84,0x5B95,0x5B93,0x5BA5,0x5BB8, +0x752F,0x9A9E,0x6434,0x5BE4,0x5BEE,0x8930,0x5BF0,0x8E47, +0x8B07,0x8FB6,0x8FD3,0x8FD5,0x8FE5,0x8FEE,0x8FE4,0x8FE9, +0x8FE6,0x8FF3,0x8FE8,0x9005,0x9004,0x900B,0x9026,0x9011, +0x900D,0x9016,0x9021,0x9035,0x9036,0x902D,0x902F,0x9044, +0x9051,0x9052,0x9050,0x9068,0x9058,0x9062,0x905B,0x66B9, +0x9074,0x907D,0x9082,0x9088,0x9083,0x908B,0x5F50,0x5F57, +0x5F56,0x5F58,0x5C3B,0x54AB,0x5C50,0x5C59,0x5B71,0x5C63, +0x5C66,0x7FBC,0x5F2A,0x5F29,0x5F2D,0x8274,0x5F3C,0x9B3B, +0x5C6E,0x5981,0x5983,0x598D,0x59A9,0x59AA,0x59A3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x936C,0x936D,0x936E,0x936F,0x9370,0x9371,0x9372,0x9373, +0x9374,0x9375,0x9376,0x9377,0x9378,0x9379,0x937A,0x937B, +0x937C,0x937D,0x937E,0x937F,0x9380,0x9381,0x9382,0x9383, +0x9384,0x9385,0x9386,0x9387,0x9388,0x9389,0x938A,0x938B, +0x938C,0x938D,0x938E,0x9390,0x9391,0x9392,0x9393,0x9394, +0x9395,0x9396,0x9397,0x9398,0x9399,0x939A,0x939B,0x939C, +0x939D,0x939E,0x939F,0x93A0,0x93A1,0x93A2,0x93A3,0x93A4, +0x93A5,0x93A6,0x93A7,0x93A8,0x93A9,0x93AA,0x93AB, 0, +0x93AC,0x93AD,0x93AE,0x93AF,0x93B0,0x93B1,0x93B2,0x93B3, +0x93B4,0x93B5,0x93B6,0x93B7,0x93B8,0x93B9,0x93BA,0x93BB, +0x93BC,0x93BD,0x93BE,0x93BF,0x93C0,0x93C1,0x93C2,0x93C3, +0x93C4,0x93C5,0x93C6,0x93C7,0x93C8,0x93C9,0x93CB,0x93CC, +0x93CD,0x5997,0x59CA,0x59AB,0x599E,0x59A4,0x59D2,0x59B2, +0x59AF,0x59D7,0x59BE,0x5A05,0x5A06,0x59DD,0x5A08,0x59E3, +0x59D8,0x59F9,0x5A0C,0x5A09,0x5A32,0x5A34,0x5A11,0x5A23, +0x5A13,0x5A40,0x5A67,0x5A4A,0x5A55,0x5A3C,0x5A62,0x5A75, +0x80EC,0x5AAA,0x5A9B,0x5A77,0x5A7A,0x5ABE,0x5AEB,0x5AB2, +0x5AD2,0x5AD4,0x5AB8,0x5AE0,0x5AE3,0x5AF1,0x5AD6,0x5AE6, +0x5AD8,0x5ADC,0x5B09,0x5B17,0x5B16,0x5B32,0x5B37,0x5B40, +0x5C15,0x5C1C,0x5B5A,0x5B65,0x5B73,0x5B51,0x5B53,0x5B62, +0x9A75,0x9A77,0x9A78,0x9A7A,0x9A7F,0x9A7D,0x9A80,0x9A81, +0x9A85,0x9A88,0x9A8A,0x9A90,0x9A92,0x9A93,0x9A96,0x9A98, +0x9A9B,0x9A9C,0x9A9D,0x9A9F,0x9AA0,0x9AA2,0x9AA3,0x9AA5, +0x9AA7,0x7E9F,0x7EA1,0x7EA3,0x7EA5,0x7EA8,0x7EA9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x93CE,0x93CF,0x93D0,0x93D1,0x93D2,0x93D3,0x93D4,0x93D5, +0x93D7,0x93D8,0x93D9,0x93DA,0x93DB,0x93DC,0x93DD,0x93DE, +0x93DF,0x93E0,0x93E1,0x93E2,0x93E3,0x93E4,0x93E5,0x93E6, +0x93E7,0x93E8,0x93E9,0x93EA,0x93EB,0x93EC,0x93ED,0x93EE, +0x93EF,0x93F0,0x93F1,0x93F2,0x93F3,0x93F4,0x93F5,0x93F6, +0x93F7,0x93F8,0x93F9,0x93FA,0x93FB,0x93FC,0x93FD,0x93FE, +0x93FF,0x9400,0x9401,0x9402,0x9403,0x9404,0x9405,0x9406, +0x9407,0x9408,0x9409,0x940A,0x940B,0x940C,0x940D, 0, +0x940E,0x940F,0x9410,0x9411,0x9412,0x9413,0x9414,0x9415, +0x9416,0x9417,0x9418,0x9419,0x941A,0x941B,0x941C,0x941D, +0x941E,0x941F,0x9420,0x9421,0x9422,0x9423,0x9424,0x9425, +0x9426,0x9427,0x9428,0x9429,0x942A,0x942B,0x942C,0x942D, +0x942E,0x7EAD,0x7EB0,0x7EBE,0x7EC0,0x7EC1,0x7EC2,0x7EC9, +0x7ECB,0x7ECC,0x7ED0,0x7ED4,0x7ED7,0x7EDB,0x7EE0,0x7EE1, +0x7EE8,0x7EEB,0x7EEE,0x7EEF,0x7EF1,0x7EF2,0x7F0D,0x7EF6, +0x7EFA,0x7EFB,0x7EFE,0x7F01,0x7F02,0x7F03,0x7F07,0x7F08, +0x7F0B,0x7F0C,0x7F0F,0x7F11,0x7F12,0x7F17,0x7F19,0x7F1C, +0x7F1B,0x7F1F,0x7F21,0x7F22,0x7F23,0x7F24,0x7F25,0x7F26, +0x7F27,0x7F2A,0x7F2B,0x7F2C,0x7F2D,0x7F2F,0x7F30,0x7F31, +0x7F32,0x7F33,0x7F35,0x5E7A,0x757F,0x5DDB,0x753E,0x9095, +0x738E,0x7391,0x73AE,0x73A2,0x739F,0x73CF,0x73C2,0x73D1, +0x73B7,0x73B3,0x73C0,0x73C9,0x73C8,0x73E5,0x73D9,0x987C, +0x740A,0x73E9,0x73E7,0x73DE,0x73BA,0x73F2,0x740F,0x742A, +0x745B,0x7426,0x7425,0x7428,0x7430,0x742E,0x742C, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x942F,0x9430,0x9431,0x9432,0x9433,0x9434,0x9435,0x9436, +0x9437,0x9438,0x9439,0x943A,0x943B,0x943C,0x943D,0x943F, +0x9440,0x9441,0x9442,0x9443,0x9444,0x9445,0x9446,0x9447, +0x9448,0x9449,0x944A,0x944B,0x944C,0x944D,0x944E,0x944F, +0x9450,0x9451,0x9452,0x9453,0x9454,0x9455,0x9456,0x9457, +0x9458,0x9459,0x945A,0x945B,0x945C,0x945D,0x945E,0x945F, +0x9460,0x9461,0x9462,0x9463,0x9464,0x9465,0x9466,0x9467, +0x9468,0x9469,0x946A,0x946C,0x946D,0x946E,0x946F, 0, +0x9470,0x9471,0x9472,0x9473,0x9474,0x9475,0x9476,0x9477, +0x9478,0x9479,0x947A,0x947B,0x947C,0x947D,0x947E,0x947F, +0x9480,0x9481,0x9482,0x9483,0x9484,0x9491,0x9496,0x9498, +0x94C7,0x94CF,0x94D3,0x94D4,0x94DA,0x94E6,0x94FB,0x951C, +0x9520,0x741B,0x741A,0x7441,0x745C,0x7457,0x7455,0x7459, +0x7477,0x746D,0x747E,0x749C,0x748E,0x7480,0x7481,0x7487, +0x748B,0x749E,0x74A8,0x74A9,0x7490,0x74A7,0x74D2,0x74BA, +0x97EA,0x97EB,0x97EC,0x674C,0x6753,0x675E,0x6748,0x6769, +0x67A5,0x6787,0x676A,0x6773,0x6798,0x67A7,0x6775,0x67A8, +0x679E,0x67AD,0x678B,0x6777,0x677C,0x67F0,0x6809,0x67D8, +0x680A,0x67E9,0x67B0,0x680C,0x67D9,0x67B5,0x67DA,0x67B3, +0x67DD,0x6800,0x67C3,0x67B8,0x67E2,0x680E,0x67C1,0x67FD, +0x6832,0x6833,0x6860,0x6861,0x684E,0x6862,0x6844,0x6864, +0x6883,0x681D,0x6855,0x6866,0x6841,0x6867,0x6840,0x683E, +0x684A,0x6849,0x6829,0x68B5,0x688F,0x6874,0x6877,0x6893, +0x686B,0x68C2,0x696E,0x68FC,0x691F,0x6920,0x68F9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9527,0x9533,0x953D,0x9543,0x9548,0x954B,0x9555,0x955A, +0x9560,0x956E,0x9574,0x9575,0x9577,0x9578,0x9579,0x957A, +0x957B,0x957C,0x957D,0x957E,0x9580,0x9581,0x9582,0x9583, +0x9584,0x9585,0x9586,0x9587,0x9588,0x9589,0x958A,0x958B, +0x958C,0x958D,0x958E,0x958F,0x9590,0x9591,0x9592,0x9593, +0x9594,0x9595,0x9596,0x9597,0x9598,0x9599,0x959A,0x959B, +0x959C,0x959D,0x959E,0x959F,0x95A0,0x95A1,0x95A2,0x95A3, +0x95A4,0x95A5,0x95A6,0x95A7,0x95A8,0x95A9,0x95AA, 0, +0x95AB,0x95AC,0x95AD,0x95AE,0x95AF,0x95B0,0x95B1,0x95B2, +0x95B3,0x95B4,0x95B5,0x95B6,0x95B7,0x95B8,0x95B9,0x95BA, +0x95BB,0x95BC,0x95BD,0x95BE,0x95BF,0x95C0,0x95C1,0x95C2, +0x95C3,0x95C4,0x95C5,0x95C6,0x95C7,0x95C8,0x95C9,0x95CA, +0x95CB,0x6924,0x68F0,0x690B,0x6901,0x6957,0x68E3,0x6910, +0x6971,0x6939,0x6960,0x6942,0x695D,0x6984,0x696B,0x6980, +0x6998,0x6978,0x6934,0x69CC,0x6987,0x6988,0x69CE,0x6989, +0x6966,0x6963,0x6979,0x699B,0x69A7,0x69BB,0x69AB,0x69AD, +0x69D4,0x69B1,0x69C1,0x69CA,0x69DF,0x6995,0x69E0,0x698D, +0x69FF,0x6A2F,0x69ED,0x6A17,0x6A18,0x6A65,0x69F2,0x6A44, +0x6A3E,0x6AA0,0x6A50,0x6A5B,0x6A35,0x6A8E,0x6A79,0x6A3D, +0x6A28,0x6A58,0x6A7C,0x6A91,0x6A90,0x6AA9,0x6A97,0x6AAB, +0x7337,0x7352,0x6B81,0x6B82,0x6B87,0x6B84,0x6B92,0x6B93, +0x6B8D,0x6B9A,0x6B9B,0x6BA1,0x6BAA,0x8F6B,0x8F6D,0x8F71, +0x8F72,0x8F73,0x8F75,0x8F76,0x8F78,0x8F77,0x8F79,0x8F7A, +0x8F7C,0x8F7E,0x8F81,0x8F82,0x8F84,0x8F87,0x8F8B, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x95CC,0x95CD,0x95CE,0x95CF,0x95D0,0x95D1,0x95D2,0x95D3, +0x95D4,0x95D5,0x95D6,0x95D7,0x95D8,0x95D9,0x95DA,0x95DB, +0x95DC,0x95DD,0x95DE,0x95DF,0x95E0,0x95E1,0x95E2,0x95E3, +0x95E4,0x95E5,0x95E6,0x95E7,0x95EC,0x95FF,0x9607,0x9613, +0x9618,0x961B,0x961E,0x9620,0x9623,0x9624,0x9625,0x9626, +0x9627,0x9628,0x9629,0x962B,0x962C,0x962D,0x962F,0x9630, +0x9637,0x9638,0x9639,0x963A,0x963E,0x9641,0x9643,0x964A, +0x964E,0x964F,0x9651,0x9652,0x9653,0x9656,0x9657, 0, +0x9658,0x9659,0x965A,0x965C,0x965D,0x965E,0x9660,0x9663, +0x9665,0x9666,0x966B,0x966D,0x966E,0x966F,0x9670,0x9671, +0x9673,0x9678,0x9679,0x967A,0x967B,0x967C,0x967D,0x967E, +0x967F,0x9680,0x9681,0x9682,0x9683,0x9684,0x9687,0x9689, +0x968A,0x8F8D,0x8F8E,0x8F8F,0x8F98,0x8F9A,0x8ECE,0x620B, +0x6217,0x621B,0x621F,0x6222,0x6221,0x6225,0x6224,0x622C, +0x81E7,0x74EF,0x74F4,0x74FF,0x750F,0x7511,0x7513,0x6534, +0x65EE,0x65EF,0x65F0,0x660A,0x6619,0x6772,0x6603,0x6615, +0x6600,0x7085,0x66F7,0x661D,0x6634,0x6631,0x6636,0x6635, +0x8006,0x665F,0x6654,0x6641,0x664F,0x6656,0x6661,0x6657, +0x6677,0x6684,0x668C,0x66A7,0x669D,0x66BE,0x66DB,0x66DC, +0x66E6,0x66E9,0x8D32,0x8D33,0x8D36,0x8D3B,0x8D3D,0x8D40, +0x8D45,0x8D46,0x8D48,0x8D49,0x8D47,0x8D4D,0x8D55,0x8D59, +0x89C7,0x89CA,0x89CB,0x89CC,0x89CE,0x89CF,0x89D0,0x89D1, +0x726E,0x729F,0x725D,0x7266,0x726F,0x727E,0x727F,0x7284, +0x728B,0x728D,0x728F,0x7292,0x6308,0x6332,0x63B0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x968C,0x968E,0x9691,0x9692,0x9693,0x9695,0x9696,0x969A, +0x969B,0x969D,0x969E,0x969F,0x96A0,0x96A1,0x96A2,0x96A3, +0x96A4,0x96A5,0x96A6,0x96A8,0x96A9,0x96AA,0x96AB,0x96AC, +0x96AD,0x96AE,0x96AF,0x96B1,0x96B2,0x96B4,0x96B5,0x96B7, +0x96B8,0x96BA,0x96BB,0x96BF,0x96C2,0x96C3,0x96C8,0x96CA, +0x96CB,0x96D0,0x96D1,0x96D3,0x96D4,0x96D6,0x96D7,0x96D8, +0x96D9,0x96DA,0x96DB,0x96DC,0x96DD,0x96DE,0x96DF,0x96E1, +0x96E2,0x96E3,0x96E4,0x96E5,0x96E6,0x96E7,0x96EB, 0, +0x96EC,0x96ED,0x96EE,0x96F0,0x96F1,0x96F2,0x96F4,0x96F5, +0x96F8,0x96FA,0x96FB,0x96FC,0x96FD,0x96FF,0x9702,0x9703, +0x9705,0x970A,0x970B,0x970C,0x9710,0x9711,0x9712,0x9714, +0x9715,0x9717,0x9718,0x9719,0x971A,0x971B,0x971D,0x971F, +0x9720,0x643F,0x64D8,0x8004,0x6BEA,0x6BF3,0x6BFD,0x6BF5, +0x6BF9,0x6C05,0x6C07,0x6C06,0x6C0D,0x6C15,0x6C18,0x6C19, +0x6C1A,0x6C21,0x6C29,0x6C24,0x6C2A,0x6C32,0x6535,0x6555, +0x656B,0x724D,0x7252,0x7256,0x7230,0x8662,0x5216,0x809F, +0x809C,0x8093,0x80BC,0x670A,0x80BD,0x80B1,0x80AB,0x80AD, +0x80B4,0x80B7,0x80E7,0x80E8,0x80E9,0x80EA,0x80DB,0x80C2, +0x80C4,0x80D9,0x80CD,0x80D7,0x6710,0x80DD,0x80EB,0x80F1, +0x80F4,0x80ED,0x810D,0x810E,0x80F2,0x80FC,0x6715,0x8112, +0x8C5A,0x8136,0x811E,0x812C,0x8118,0x8132,0x8148,0x814C, +0x8153,0x8174,0x8159,0x815A,0x8171,0x8160,0x8169,0x817C, +0x817D,0x816D,0x8167,0x584D,0x5AB5,0x8188,0x8182,0x8191, +0x6ED5,0x81A3,0x81AA,0x81CC,0x6726,0x81CA,0x81BB, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9721,0x9722,0x9723,0x9724,0x9725,0x9726,0x9727,0x9728, +0x9729,0x972B,0x972C,0x972E,0x972F,0x9731,0x9733,0x9734, +0x9735,0x9736,0x9737,0x973A,0x973B,0x973C,0x973D,0x973F, +0x9740,0x9741,0x9742,0x9743,0x9744,0x9745,0x9746,0x9747, +0x9748,0x9749,0x974A,0x974B,0x974C,0x974D,0x974E,0x974F, +0x9750,0x9751,0x9754,0x9755,0x9757,0x9758,0x975A,0x975C, +0x975D,0x975F,0x9763,0x9764,0x9766,0x9767,0x9768,0x976A, +0x976B,0x976C,0x976D,0x976E,0x976F,0x9770,0x9771, 0, +0x9772,0x9775,0x9777,0x9778,0x9779,0x977A,0x977B,0x977D, +0x977E,0x977F,0x9780,0x9781,0x9782,0x9783,0x9784,0x9786, +0x9787,0x9788,0x9789,0x978A,0x978C,0x978E,0x978F,0x9790, +0x9793,0x9795,0x9796,0x9797,0x9799,0x979A,0x979B,0x979C, +0x979D,0x81C1,0x81A6,0x6B24,0x6B37,0x6B39,0x6B43,0x6B46, +0x6B59,0x98D1,0x98D2,0x98D3,0x98D5,0x98D9,0x98DA,0x6BB3, +0x5F40,0x6BC2,0x89F3,0x6590,0x9F51,0x6593,0x65BC,0x65C6, +0x65C4,0x65C3,0x65CC,0x65CE,0x65D2,0x65D6,0x7080,0x709C, +0x7096,0x709D,0x70BB,0x70C0,0x70B7,0x70AB,0x70B1,0x70E8, +0x70CA,0x7110,0x7113,0x7116,0x712F,0x7131,0x7173,0x715C, +0x7168,0x7145,0x7172,0x714A,0x7178,0x717A,0x7198,0x71B3, +0x71B5,0x71A8,0x71A0,0x71E0,0x71D4,0x71E7,0x71F9,0x721D, +0x7228,0x706C,0x7118,0x7166,0x71B9,0x623E,0x623D,0x6243, +0x6248,0x6249,0x793B,0x7940,0x7946,0x7949,0x795B,0x795C, +0x7953,0x795A,0x7962,0x7957,0x7960,0x796F,0x7967,0x797A, +0x7985,0x798A,0x799A,0x79A7,0x79B3,0x5FD1,0x5FD0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x979E,0x979F,0x97A1,0x97A2,0x97A4,0x97A5,0x97A6,0x97A7, +0x97A8,0x97A9,0x97AA,0x97AC,0x97AE,0x97B0,0x97B1,0x97B3, +0x97B5,0x97B6,0x97B7,0x97B8,0x97B9,0x97BA,0x97BB,0x97BC, +0x97BD,0x97BE,0x97BF,0x97C0,0x97C1,0x97C2,0x97C3,0x97C4, +0x97C5,0x97C6,0x97C7,0x97C8,0x97C9,0x97CA,0x97CB,0x97CC, +0x97CD,0x97CE,0x97CF,0x97D0,0x97D1,0x97D2,0x97D3,0x97D4, +0x97D5,0x97D6,0x97D7,0x97D8,0x97D9,0x97DA,0x97DB,0x97DC, +0x97DD,0x97DE,0x97DF,0x97E0,0x97E1,0x97E2,0x97E3, 0, +0x97E4,0x97E5,0x97E8,0x97EE,0x97EF,0x97F0,0x97F1,0x97F2, +0x97F4,0x97F7,0x97F8,0x97F9,0x97FA,0x97FB,0x97FC,0x97FD, +0x97FE,0x97FF,0x9800,0x9801,0x9802,0x9803,0x9804,0x9805, +0x9806,0x9807,0x9808,0x9809,0x980A,0x980B,0x980C,0x980D, +0x980E,0x603C,0x605D,0x605A,0x6067,0x6041,0x6059,0x6063, +0x60AB,0x6106,0x610D,0x615D,0x61A9,0x619D,0x61CB,0x61D1, +0x6206,0x8080,0x807F,0x6C93,0x6CF6,0x6DFC,0x77F6,0x77F8, +0x7800,0x7809,0x7817,0x7818,0x7811,0x65AB,0x782D,0x781C, +0x781D,0x7839,0x783A,0x783B,0x781F,0x783C,0x7825,0x782C, +0x7823,0x7829,0x784E,0x786D,0x7856,0x7857,0x7826,0x7850, +0x7847,0x784C,0x786A,0x789B,0x7893,0x789A,0x7887,0x789C, +0x78A1,0x78A3,0x78B2,0x78B9,0x78A5,0x78D4,0x78D9,0x78C9, +0x78EC,0x78F2,0x7905,0x78F4,0x7913,0x7924,0x791E,0x7934, +0x9F9B,0x9EF9,0x9EFB,0x9EFC,0x76F1,0x7704,0x770D,0x76F9, +0x7707,0x7708,0x771A,0x7722,0x7719,0x772D,0x7726,0x7735, +0x7738,0x7750,0x7751,0x7747,0x7743,0x775A,0x7768, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x980F,0x9810,0x9811,0x9812,0x9813,0x9814,0x9815,0x9816, +0x9817,0x9818,0x9819,0x981A,0x981B,0x981C,0x981D,0x981E, +0x981F,0x9820,0x9821,0x9822,0x9823,0x9824,0x9825,0x9826, +0x9827,0x9828,0x9829,0x982A,0x982B,0x982C,0x982D,0x982E, +0x982F,0x9830,0x9831,0x9832,0x9833,0x9834,0x9835,0x9836, +0x9837,0x9838,0x9839,0x983A,0x983B,0x983C,0x983D,0x983E, +0x983F,0x9840,0x9841,0x9842,0x9843,0x9844,0x9845,0x9846, +0x9847,0x9848,0x9849,0x984A,0x984B,0x984C,0x984D, 0, +0x984E,0x984F,0x9850,0x9851,0x9852,0x9853,0x9854,0x9855, +0x9856,0x9857,0x9858,0x9859,0x985A,0x985B,0x985C,0x985D, +0x985E,0x985F,0x9860,0x9861,0x9862,0x9863,0x9864,0x9865, +0x9866,0x9867,0x9868,0x9869,0x986A,0x986B,0x986C,0x986D, +0x986E,0x7762,0x7765,0x777F,0x778D,0x777D,0x7780,0x778C, +0x7791,0x779F,0x77A0,0x77B0,0x77B5,0x77BD,0x753A,0x7540, +0x754E,0x754B,0x7548,0x755B,0x7572,0x7579,0x7583,0x7F58, +0x7F61,0x7F5F,0x8A48,0x7F68,0x7F74,0x7F71,0x7F79,0x7F81, +0x7F7E,0x76CD,0x76E5,0x8832,0x9485,0x9486,0x9487,0x948B, +0x948A,0x948C,0x948D,0x948F,0x9490,0x9494,0x9497,0x9495, +0x949A,0x949B,0x949C,0x94A3,0x94A4,0x94AB,0x94AA,0x94AD, +0x94AC,0x94AF,0x94B0,0x94B2,0x94B4,0x94B6,0x94B7,0x94B8, +0x94B9,0x94BA,0x94BC,0x94BD,0x94BF,0x94C4,0x94C8,0x94C9, +0x94CA,0x94CB,0x94CC,0x94CD,0x94CE,0x94D0,0x94D1,0x94D2, +0x94D5,0x94D6,0x94D7,0x94D9,0x94D8,0x94DB,0x94DE,0x94DF, +0x94E0,0x94E2,0x94E4,0x94E5,0x94E7,0x94E8,0x94EA, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x986F,0x9870,0x9871,0x9872,0x9873,0x9874,0x988B,0x988E, +0x9892,0x9895,0x9899,0x98A3,0x98A8,0x98A9,0x98AA,0x98AB, +0x98AC,0x98AD,0x98AE,0x98AF,0x98B0,0x98B1,0x98B2,0x98B3, +0x98B4,0x98B5,0x98B6,0x98B7,0x98B8,0x98B9,0x98BA,0x98BB, +0x98BC,0x98BD,0x98BE,0x98BF,0x98C0,0x98C1,0x98C2,0x98C3, +0x98C4,0x98C5,0x98C6,0x98C7,0x98C8,0x98C9,0x98CA,0x98CB, +0x98CC,0x98CD,0x98CF,0x98D0,0x98D4,0x98D6,0x98D7,0x98DB, +0x98DC,0x98DD,0x98E0,0x98E1,0x98E2,0x98E3,0x98E4, 0, +0x98E5,0x98E6,0x98E9,0x98EA,0x98EB,0x98EC,0x98ED,0x98EE, +0x98EF,0x98F0,0x98F1,0x98F2,0x98F3,0x98F4,0x98F5,0x98F6, +0x98F7,0x98F8,0x98F9,0x98FA,0x98FB,0x98FC,0x98FD,0x98FE, +0x98FF,0x9900,0x9901,0x9902,0x9903,0x9904,0x9905,0x9906, +0x9907,0x94E9,0x94EB,0x94EE,0x94EF,0x94F3,0x94F4,0x94F5, +0x94F7,0x94F9,0x94FC,0x94FD,0x94FF,0x9503,0x9502,0x9506, +0x9507,0x9509,0x950A,0x950D,0x950E,0x950F,0x9512,0x9513, +0x9514,0x9515,0x9516,0x9518,0x951B,0x951D,0x951E,0x951F, +0x9522,0x952A,0x952B,0x9529,0x952C,0x9531,0x9532,0x9534, +0x9536,0x9537,0x9538,0x953C,0x953E,0x953F,0x9542,0x9535, +0x9544,0x9545,0x9546,0x9549,0x954C,0x954E,0x954F,0x9552, +0x9553,0x9554,0x9556,0x9557,0x9558,0x9559,0x955B,0x955E, +0x955F,0x955D,0x9561,0x9562,0x9564,0x9565,0x9566,0x9567, +0x9568,0x9569,0x956A,0x956B,0x956C,0x956F,0x9571,0x9572, +0x9573,0x953A,0x77E7,0x77EC,0x96C9,0x79D5,0x79ED,0x79E3, +0x79EB,0x7A06,0x5D47,0x7A03,0x7A02,0x7A1E,0x7A14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9908,0x9909,0x990A,0x990B,0x990C,0x990E,0x990F,0x9911, +0x9912,0x9913,0x9914,0x9915,0x9916,0x9917,0x9918,0x9919, +0x991A,0x991B,0x991C,0x991D,0x991E,0x991F,0x9920,0x9921, +0x9922,0x9923,0x9924,0x9925,0x9926,0x9927,0x9928,0x9929, +0x992A,0x992B,0x992C,0x992D,0x992F,0x9930,0x9931,0x9932, +0x9933,0x9934,0x9935,0x9936,0x9937,0x9938,0x9939,0x993A, +0x993B,0x993C,0x993D,0x993E,0x993F,0x9940,0x9941,0x9942, +0x9943,0x9944,0x9945,0x9946,0x9947,0x9948,0x9949, 0, +0x994A,0x994B,0x994C,0x994D,0x994E,0x994F,0x9950,0x9951, +0x9952,0x9953,0x9956,0x9957,0x9958,0x9959,0x995A,0x995B, +0x995C,0x995D,0x995E,0x995F,0x9960,0x9961,0x9962,0x9964, +0x9966,0x9973,0x9978,0x9979,0x997B,0x997E,0x9982,0x9983, +0x9989,0x7A39,0x7A37,0x7A51,0x9ECF,0x99A5,0x7A70,0x7688, +0x768E,0x7693,0x7699,0x76A4,0x74DE,0x74E0,0x752C,0x9E20, +0x9E22,0x9E28,0x9E29,0x9E2A,0x9E2B,0x9E2C,0x9E32,0x9E31, +0x9E36,0x9E38,0x9E37,0x9E39,0x9E3A,0x9E3E,0x9E41,0x9E42, +0x9E44,0x9E46,0x9E47,0x9E48,0x9E49,0x9E4B,0x9E4C,0x9E4E, +0x9E51,0x9E55,0x9E57,0x9E5A,0x9E5B,0x9E5C,0x9E5E,0x9E63, +0x9E66,0x9E67,0x9E68,0x9E69,0x9E6A,0x9E6B,0x9E6C,0x9E71, +0x9E6D,0x9E73,0x7592,0x7594,0x7596,0x75A0,0x759D,0x75AC, +0x75A3,0x75B3,0x75B4,0x75B8,0x75C4,0x75B1,0x75B0,0x75C3, +0x75C2,0x75D6,0x75CD,0x75E3,0x75E8,0x75E6,0x75E4,0x75EB, +0x75E7,0x7603,0x75F1,0x75FC,0x75FF,0x7610,0x7600,0x7605, +0x760C,0x7617,0x760A,0x7625,0x7618,0x7615,0x7619, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x998C,0x998E,0x999A,0x999B,0x999C,0x999D,0x999E,0x999F, +0x99A0,0x99A1,0x99A2,0x99A3,0x99A4,0x99A6,0x99A7,0x99A9, +0x99AA,0x99AB,0x99AC,0x99AD,0x99AE,0x99AF,0x99B0,0x99B1, +0x99B2,0x99B3,0x99B4,0x99B5,0x99B6,0x99B7,0x99B8,0x99B9, +0x99BA,0x99BB,0x99BC,0x99BD,0x99BE,0x99BF,0x99C0,0x99C1, +0x99C2,0x99C3,0x99C4,0x99C5,0x99C6,0x99C7,0x99C8,0x99C9, +0x99CA,0x99CB,0x99CC,0x99CD,0x99CE,0x99CF,0x99D0,0x99D1, +0x99D2,0x99D3,0x99D4,0x99D5,0x99D6,0x99D7,0x99D8, 0, +0x99D9,0x99DA,0x99DB,0x99DC,0x99DD,0x99DE,0x99DF,0x99E0, +0x99E1,0x99E2,0x99E3,0x99E4,0x99E5,0x99E6,0x99E7,0x99E8, +0x99E9,0x99EA,0x99EB,0x99EC,0x99ED,0x99EE,0x99EF,0x99F0, +0x99F1,0x99F2,0x99F3,0x99F4,0x99F5,0x99F6,0x99F7,0x99F8, +0x99F9,0x761B,0x763C,0x7622,0x7620,0x7640,0x762D,0x7630, +0x763F,0x7635,0x7643,0x763E,0x7633,0x764D,0x765E,0x7654, +0x765C,0x7656,0x766B,0x766F,0x7FCA,0x7AE6,0x7A78,0x7A79, +0x7A80,0x7A86,0x7A88,0x7A95,0x7AA6,0x7AA0,0x7AAC,0x7AA8, +0x7AAD,0x7AB3,0x8864,0x8869,0x8872,0x887D,0x887F,0x8882, +0x88A2,0x88C6,0x88B7,0x88BC,0x88C9,0x88E2,0x88CE,0x88E3, +0x88E5,0x88F1,0x891A,0x88FC,0x88E8,0x88FE,0x88F0,0x8921, +0x8919,0x8913,0x891B,0x890A,0x8934,0x892B,0x8936,0x8941, +0x8966,0x897B,0x758B,0x80E5,0x76B2,0x76B4,0x77DC,0x8012, +0x8014,0x8016,0x801C,0x8020,0x8022,0x8025,0x8026,0x8027, +0x8029,0x8028,0x8031,0x800B,0x8035,0x8043,0x8046,0x804D, +0x8052,0x8069,0x8071,0x8983,0x9878,0x9880,0x9883, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x99FA,0x99FB,0x99FC,0x99FD,0x99FE,0x99FF,0x9A00,0x9A01, +0x9A02,0x9A03,0x9A04,0x9A05,0x9A06,0x9A07,0x9A08,0x9A09, +0x9A0A,0x9A0B,0x9A0C,0x9A0D,0x9A0E,0x9A0F,0x9A10,0x9A11, +0x9A12,0x9A13,0x9A14,0x9A15,0x9A16,0x9A17,0x9A18,0x9A19, +0x9A1A,0x9A1B,0x9A1C,0x9A1D,0x9A1E,0x9A1F,0x9A20,0x9A21, +0x9A22,0x9A23,0x9A24,0x9A25,0x9A26,0x9A27,0x9A28,0x9A29, +0x9A2A,0x9A2B,0x9A2C,0x9A2D,0x9A2E,0x9A2F,0x9A30,0x9A31, +0x9A32,0x9A33,0x9A34,0x9A35,0x9A36,0x9A37,0x9A38, 0, +0x9A39,0x9A3A,0x9A3B,0x9A3C,0x9A3D,0x9A3E,0x9A3F,0x9A40, +0x9A41,0x9A42,0x9A43,0x9A44,0x9A45,0x9A46,0x9A47,0x9A48, +0x9A49,0x9A4A,0x9A4B,0x9A4C,0x9A4D,0x9A4E,0x9A4F,0x9A50, +0x9A51,0x9A52,0x9A53,0x9A54,0x9A55,0x9A56,0x9A57,0x9A58, +0x9A59,0x9889,0x988C,0x988D,0x988F,0x9894,0x989A,0x989B, +0x989E,0x989F,0x98A1,0x98A2,0x98A5,0x98A6,0x864D,0x8654, +0x866C,0x866E,0x867F,0x867A,0x867C,0x867B,0x86A8,0x868D, +0x868B,0x86AC,0x869D,0x86A7,0x86A3,0x86AA,0x8693,0x86A9, +0x86B6,0x86C4,0x86B5,0x86CE,0x86B0,0x86BA,0x86B1,0x86AF, +0x86C9,0x86CF,0x86B4,0x86E9,0x86F1,0x86F2,0x86ED,0x86F3, +0x86D0,0x8713,0x86DE,0x86F4,0x86DF,0x86D8,0x86D1,0x8703, +0x8707,0x86F8,0x8708,0x870A,0x870D,0x8709,0x8723,0x873B, +0x871E,0x8725,0x872E,0x871A,0x873E,0x8748,0x8734,0x8731, +0x8729,0x8737,0x873F,0x8782,0x8722,0x877D,0x877E,0x877B, +0x8760,0x8770,0x874C,0x876E,0x878B,0x8753,0x8763,0x877C, +0x8764,0x8759,0x8765,0x8793,0x87AF,0x87A8,0x87D2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9A5A,0x9A5B,0x9A5C,0x9A5D,0x9A5E,0x9A5F,0x9A60,0x9A61, +0x9A62,0x9A63,0x9A64,0x9A65,0x9A66,0x9A67,0x9A68,0x9A69, +0x9A6A,0x9A6B,0x9A72,0x9A83,0x9A89,0x9A8D,0x9A8E,0x9A94, +0x9A95,0x9A99,0x9AA6,0x9AA9,0x9AAA,0x9AAB,0x9AAC,0x9AAD, +0x9AAE,0x9AAF,0x9AB2,0x9AB3,0x9AB4,0x9AB5,0x9AB9,0x9ABB, +0x9ABD,0x9ABE,0x9ABF,0x9AC3,0x9AC4,0x9AC6,0x9AC7,0x9AC8, +0x9AC9,0x9ACA,0x9ACD,0x9ACE,0x9ACF,0x9AD0,0x9AD2,0x9AD4, +0x9AD5,0x9AD6,0x9AD7,0x9AD9,0x9ADA,0x9ADB,0x9ADC, 0, +0x9ADD,0x9ADE,0x9AE0,0x9AE2,0x9AE3,0x9AE4,0x9AE5,0x9AE7, +0x9AE8,0x9AE9,0x9AEA,0x9AEC,0x9AEE,0x9AF0,0x9AF1,0x9AF2, +0x9AF3,0x9AF4,0x9AF5,0x9AF6,0x9AF7,0x9AF8,0x9AFA,0x9AFC, +0x9AFD,0x9AFE,0x9AFF,0x9B00,0x9B01,0x9B02,0x9B04,0x9B05, +0x9B06,0x87C6,0x8788,0x8785,0x87AD,0x8797,0x8783,0x87AB, +0x87E5,0x87AC,0x87B5,0x87B3,0x87CB,0x87D3,0x87BD,0x87D1, +0x87C0,0x87CA,0x87DB,0x87EA,0x87E0,0x87EE,0x8816,0x8813, +0x87FE,0x880A,0x881B,0x8821,0x8839,0x883C,0x7F36,0x7F42, +0x7F44,0x7F45,0x8210,0x7AFA,0x7AFD,0x7B08,0x7B03,0x7B04, +0x7B15,0x7B0A,0x7B2B,0x7B0F,0x7B47,0x7B38,0x7B2A,0x7B19, +0x7B2E,0x7B31,0x7B20,0x7B25,0x7B24,0x7B33,0x7B3E,0x7B1E, +0x7B58,0x7B5A,0x7B45,0x7B75,0x7B4C,0x7B5D,0x7B60,0x7B6E, +0x7B7B,0x7B62,0x7B72,0x7B71,0x7B90,0x7BA6,0x7BA7,0x7BB8, +0x7BAC,0x7B9D,0x7BA8,0x7B85,0x7BAA,0x7B9C,0x7BA2,0x7BAB, +0x7BB4,0x7BD1,0x7BC1,0x7BCC,0x7BDD,0x7BDA,0x7BE5,0x7BE6, +0x7BEA,0x7C0C,0x7BFE,0x7BFC,0x7C0F,0x7C16,0x7C0B, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9B07,0x9B09,0x9B0A,0x9B0B,0x9B0C,0x9B0D,0x9B0E,0x9B10, +0x9B11,0x9B12,0x9B14,0x9B15,0x9B16,0x9B17,0x9B18,0x9B19, +0x9B1A,0x9B1B,0x9B1C,0x9B1D,0x9B1E,0x9B20,0x9B21,0x9B22, +0x9B24,0x9B25,0x9B26,0x9B27,0x9B28,0x9B29,0x9B2A,0x9B2B, +0x9B2C,0x9B2D,0x9B2E,0x9B30,0x9B31,0x9B33,0x9B34,0x9B35, +0x9B36,0x9B37,0x9B38,0x9B39,0x9B3A,0x9B3D,0x9B3E,0x9B3F, +0x9B40,0x9B46,0x9B4A,0x9B4B,0x9B4C,0x9B4E,0x9B50,0x9B52, +0x9B53,0x9B55,0x9B56,0x9B57,0x9B58,0x9B59,0x9B5A, 0, +0x9B5B,0x9B5C,0x9B5D,0x9B5E,0x9B5F,0x9B60,0x9B61,0x9B62, +0x9B63,0x9B64,0x9B65,0x9B66,0x9B67,0x9B68,0x9B69,0x9B6A, +0x9B6B,0x9B6C,0x9B6D,0x9B6E,0x9B6F,0x9B70,0x9B71,0x9B72, +0x9B73,0x9B74,0x9B75,0x9B76,0x9B77,0x9B78,0x9B79,0x9B7A, +0x9B7B,0x7C1F,0x7C2A,0x7C26,0x7C38,0x7C41,0x7C40,0x81FE, +0x8201,0x8202,0x8204,0x81EC,0x8844,0x8221,0x8222,0x8223, +0x822D,0x822F,0x8228,0x822B,0x8238,0x823B,0x8233,0x8234, +0x823E,0x8244,0x8249,0x824B,0x824F,0x825A,0x825F,0x8268, +0x887E,0x8885,0x8888,0x88D8,0x88DF,0x895E,0x7F9D,0x7F9F, +0x7FA7,0x7FAF,0x7FB0,0x7FB2,0x7C7C,0x6549,0x7C91,0x7C9D, +0x7C9C,0x7C9E,0x7CA2,0x7CB2,0x7CBC,0x7CBD,0x7CC1,0x7CC7, +0x7CCC,0x7CCD,0x7CC8,0x7CC5,0x7CD7,0x7CE8,0x826E,0x66A8, +0x7FBF,0x7FCE,0x7FD5,0x7FE5,0x7FE1,0x7FE6,0x7FE9,0x7FEE, +0x7FF3,0x7CF8,0x7D77,0x7DA6,0x7DAE,0x7E47,0x7E9B,0x9EB8, +0x9EB4,0x8D73,0x8D84,0x8D94,0x8D91,0x8DB1,0x8D67,0x8D6D, +0x8C47,0x8C49,0x914A,0x9150,0x914E,0x914F,0x9164, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9B7C,0x9B7D,0x9B7E,0x9B7F,0x9B80,0x9B81,0x9B82,0x9B83, +0x9B84,0x9B85,0x9B86,0x9B87,0x9B88,0x9B89,0x9B8A,0x9B8B, +0x9B8C,0x9B8D,0x9B8E,0x9B8F,0x9B90,0x9B91,0x9B92,0x9B93, +0x9B94,0x9B95,0x9B96,0x9B97,0x9B98,0x9B99,0x9B9A,0x9B9B, +0x9B9C,0x9B9D,0x9B9E,0x9B9F,0x9BA0,0x9BA1,0x9BA2,0x9BA3, +0x9BA4,0x9BA5,0x9BA6,0x9BA7,0x9BA8,0x9BA9,0x9BAA,0x9BAB, +0x9BAC,0x9BAD,0x9BAE,0x9BAF,0x9BB0,0x9BB1,0x9BB2,0x9BB3, +0x9BB4,0x9BB5,0x9BB6,0x9BB7,0x9BB8,0x9BB9,0x9BBA, 0, +0x9BBB,0x9BBC,0x9BBD,0x9BBE,0x9BBF,0x9BC0,0x9BC1,0x9BC2, +0x9BC3,0x9BC4,0x9BC5,0x9BC6,0x9BC7,0x9BC8,0x9BC9,0x9BCA, +0x9BCB,0x9BCC,0x9BCD,0x9BCE,0x9BCF,0x9BD0,0x9BD1,0x9BD2, +0x9BD3,0x9BD4,0x9BD5,0x9BD6,0x9BD7,0x9BD8,0x9BD9,0x9BDA, +0x9BDB,0x9162,0x9161,0x9170,0x9169,0x916F,0x917D,0x917E, +0x9172,0x9174,0x9179,0x918C,0x9185,0x9190,0x918D,0x9191, +0x91A2,0x91A3,0x91AA,0x91AD,0x91AE,0x91AF,0x91B5,0x91B4, +0x91BA,0x8C55,0x9E7E,0x8DB8,0x8DEB,0x8E05,0x8E59,0x8E69, +0x8DB5,0x8DBF,0x8DBC,0x8DBA,0x8DC4,0x8DD6,0x8DD7,0x8DDA, +0x8DDE,0x8DCE,0x8DCF,0x8DDB,0x8DC6,0x8DEC,0x8DF7,0x8DF8, +0x8DE3,0x8DF9,0x8DFB,0x8DE4,0x8E09,0x8DFD,0x8E14,0x8E1D, +0x8E1F,0x8E2C,0x8E2E,0x8E23,0x8E2F,0x8E3A,0x8E40,0x8E39, +0x8E35,0x8E3D,0x8E31,0x8E49,0x8E41,0x8E42,0x8E51,0x8E52, +0x8E4A,0x8E70,0x8E76,0x8E7C,0x8E6F,0x8E74,0x8E85,0x8E8F, +0x8E94,0x8E90,0x8E9C,0x8E9E,0x8C78,0x8C82,0x8C8A,0x8C85, +0x8C98,0x8C94,0x659B,0x89D6,0x89DE,0x89DA,0x89DC, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9BDC,0x9BDD,0x9BDE,0x9BDF,0x9BE0,0x9BE1,0x9BE2,0x9BE3, +0x9BE4,0x9BE5,0x9BE6,0x9BE7,0x9BE8,0x9BE9,0x9BEA,0x9BEB, +0x9BEC,0x9BED,0x9BEE,0x9BEF,0x9BF0,0x9BF1,0x9BF2,0x9BF3, +0x9BF4,0x9BF5,0x9BF6,0x9BF7,0x9BF8,0x9BF9,0x9BFA,0x9BFB, +0x9BFC,0x9BFD,0x9BFE,0x9BFF,0x9C00,0x9C01,0x9C02,0x9C03, +0x9C04,0x9C05,0x9C06,0x9C07,0x9C08,0x9C09,0x9C0A,0x9C0B, +0x9C0C,0x9C0D,0x9C0E,0x9C0F,0x9C10,0x9C11,0x9C12,0x9C13, +0x9C14,0x9C15,0x9C16,0x9C17,0x9C18,0x9C19,0x9C1A, 0, +0x9C1B,0x9C1C,0x9C1D,0x9C1E,0x9C1F,0x9C20,0x9C21,0x9C22, +0x9C23,0x9C24,0x9C25,0x9C26,0x9C27,0x9C28,0x9C29,0x9C2A, +0x9C2B,0x9C2C,0x9C2D,0x9C2E,0x9C2F,0x9C30,0x9C31,0x9C32, +0x9C33,0x9C34,0x9C35,0x9C36,0x9C37,0x9C38,0x9C39,0x9C3A, +0x9C3B,0x89E5,0x89EB,0x89EF,0x8A3E,0x8B26,0x9753,0x96E9, +0x96F3,0x96EF,0x9706,0x9701,0x9708,0x970F,0x970E,0x972A, +0x972D,0x9730,0x973E,0x9F80,0x9F83,0x9F85,0x9F86,0x9F87, +0x9F88,0x9F89,0x9F8A,0x9F8C,0x9EFE,0x9F0B,0x9F0D,0x96B9, +0x96BC,0x96BD,0x96CE,0x96D2,0x77BF,0x96E0,0x928E,0x92AE, +0x92C8,0x933E,0x936A,0x93CA,0x938F,0x943E,0x946B,0x9C7F, +0x9C82,0x9C85,0x9C86,0x9C87,0x9C88,0x7A23,0x9C8B,0x9C8E, +0x9C90,0x9C91,0x9C92,0x9C94,0x9C95,0x9C9A,0x9C9B,0x9C9E, +0x9C9F,0x9CA0,0x9CA1,0x9CA2,0x9CA3,0x9CA5,0x9CA6,0x9CA7, +0x9CA8,0x9CA9,0x9CAB,0x9CAD,0x9CAE,0x9CB0,0x9CB1,0x9CB2, +0x9CB3,0x9CB4,0x9CB5,0x9CB6,0x9CB7,0x9CBA,0x9CBB,0x9CBC, +0x9CBD,0x9CC4,0x9CC5,0x9CC6,0x9CC7,0x9CCA,0x9CCB, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9C3C,0x9C3D,0x9C3E,0x9C3F,0x9C40,0x9C41,0x9C42,0x9C43, +0x9C44,0x9C45,0x9C46,0x9C47,0x9C48,0x9C49,0x9C4A,0x9C4B, +0x9C4C,0x9C4D,0x9C4E,0x9C4F,0x9C50,0x9C51,0x9C52,0x9C53, +0x9C54,0x9C55,0x9C56,0x9C57,0x9C58,0x9C59,0x9C5A,0x9C5B, +0x9C5C,0x9C5D,0x9C5E,0x9C5F,0x9C60,0x9C61,0x9C62,0x9C63, +0x9C64,0x9C65,0x9C66,0x9C67,0x9C68,0x9C69,0x9C6A,0x9C6B, +0x9C6C,0x9C6D,0x9C6E,0x9C6F,0x9C70,0x9C71,0x9C72,0x9C73, +0x9C74,0x9C75,0x9C76,0x9C77,0x9C78,0x9C79,0x9C7A, 0, +0x9C7B,0x9C7D,0x9C7E,0x9C80,0x9C83,0x9C84,0x9C89,0x9C8A, +0x9C8C,0x9C8F,0x9C93,0x9C96,0x9C97,0x9C98,0x9C99,0x9C9D, +0x9CAA,0x9CAC,0x9CAF,0x9CB9,0x9CBE,0x9CBF,0x9CC0,0x9CC1, +0x9CC2,0x9CC8,0x9CC9,0x9CD1,0x9CD2,0x9CDA,0x9CDB,0x9CE0, +0x9CE1,0x9CCC,0x9CCD,0x9CCE,0x9CCF,0x9CD0,0x9CD3,0x9CD4, +0x9CD5,0x9CD7,0x9CD8,0x9CD9,0x9CDC,0x9CDD,0x9CDF,0x9CE2, +0x977C,0x9785,0x9791,0x9792,0x9794,0x97AF,0x97AB,0x97A3, +0x97B2,0x97B4,0x9AB1,0x9AB0,0x9AB7,0x9E58,0x9AB6,0x9ABA, +0x9ABC,0x9AC1,0x9AC0,0x9AC5,0x9AC2,0x9ACB,0x9ACC,0x9AD1, +0x9B45,0x9B43,0x9B47,0x9B49,0x9B48,0x9B4D,0x9B51,0x98E8, +0x990D,0x992E,0x9955,0x9954,0x9ADF,0x9AE1,0x9AE6,0x9AEF, +0x9AEB,0x9AFB,0x9AED,0x9AF9,0x9B08,0x9B0F,0x9B13,0x9B1F, +0x9B23,0x9EBD,0x9EBE,0x7E3B,0x9E82,0x9E87,0x9E88,0x9E8B, +0x9E92,0x93D6,0x9E9D,0x9E9F,0x9EDB,0x9EDC,0x9EDD,0x9EE0, +0x9EDF,0x9EE2,0x9EE9,0x9EE7,0x9EE5,0x9EEA,0x9EEF,0x9F22, +0x9F2C,0x9F2F,0x9F39,0x9F37,0x9F3D,0x9F3E,0x9F44, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9CE3,0x9CE4,0x9CE5,0x9CE6,0x9CE7,0x9CE8,0x9CE9,0x9CEA, +0x9CEB,0x9CEC,0x9CED,0x9CEE,0x9CEF,0x9CF0,0x9CF1,0x9CF2, +0x9CF3,0x9CF4,0x9CF5,0x9CF6,0x9CF7,0x9CF8,0x9CF9,0x9CFA, +0x9CFB,0x9CFC,0x9CFD,0x9CFE,0x9CFF,0x9D00,0x9D01,0x9D02, +0x9D03,0x9D04,0x9D05,0x9D06,0x9D07,0x9D08,0x9D09,0x9D0A, +0x9D0B,0x9D0C,0x9D0D,0x9D0E,0x9D0F,0x9D10,0x9D11,0x9D12, +0x9D13,0x9D14,0x9D15,0x9D16,0x9D17,0x9D18,0x9D19,0x9D1A, +0x9D1B,0x9D1C,0x9D1D,0x9D1E,0x9D1F,0x9D20,0x9D21, 0, +0x9D22,0x9D23,0x9D24,0x9D25,0x9D26,0x9D27,0x9D28,0x9D29, +0x9D2A,0x9D2B,0x9D2C,0x9D2D,0x9D2E,0x9D2F,0x9D30,0x9D31, +0x9D32,0x9D33,0x9D34,0x9D35,0x9D36,0x9D37,0x9D38,0x9D39, +0x9D3A,0x9D3B,0x9D3C,0x9D3D,0x9D3E,0x9D3F,0x9D40,0x9D41, +0x9D42, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9D43,0x9D44,0x9D45,0x9D46,0x9D47,0x9D48,0x9D49,0x9D4A, +0x9D4B,0x9D4C,0x9D4D,0x9D4E,0x9D4F,0x9D50,0x9D51,0x9D52, +0x9D53,0x9D54,0x9D55,0x9D56,0x9D57,0x9D58,0x9D59,0x9D5A, +0x9D5B,0x9D5C,0x9D5D,0x9D5E,0x9D5F,0x9D60,0x9D61,0x9D62, +0x9D63,0x9D64,0x9D65,0x9D66,0x9D67,0x9D68,0x9D69,0x9D6A, +0x9D6B,0x9D6C,0x9D6D,0x9D6E,0x9D6F,0x9D70,0x9D71,0x9D72, +0x9D73,0x9D74,0x9D75,0x9D76,0x9D77,0x9D78,0x9D79,0x9D7A, +0x9D7B,0x9D7C,0x9D7D,0x9D7E,0x9D7F,0x9D80,0x9D81, 0, +0x9D82,0x9D83,0x9D84,0x9D85,0x9D86,0x9D87,0x9D88,0x9D89, +0x9D8A,0x9D8B,0x9D8C,0x9D8D,0x9D8E,0x9D8F,0x9D90,0x9D91, +0x9D92,0x9D93,0x9D94,0x9D95,0x9D96,0x9D97,0x9D98,0x9D99, +0x9D9A,0x9D9B,0x9D9C,0x9D9D,0x9D9E,0x9D9F,0x9DA0,0x9DA1, +0x9DA2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9DA3,0x9DA4,0x9DA5,0x9DA6,0x9DA7,0x9DA8,0x9DA9,0x9DAA, +0x9DAB,0x9DAC,0x9DAD,0x9DAE,0x9DAF,0x9DB0,0x9DB1,0x9DB2, +0x9DB3,0x9DB4,0x9DB5,0x9DB6,0x9DB7,0x9DB8,0x9DB9,0x9DBA, +0x9DBB,0x9DBC,0x9DBD,0x9DBE,0x9DBF,0x9DC0,0x9DC1,0x9DC2, +0x9DC3,0x9DC4,0x9DC5,0x9DC6,0x9DC7,0x9DC8,0x9DC9,0x9DCA, +0x9DCB,0x9DCC,0x9DCD,0x9DCE,0x9DCF,0x9DD0,0x9DD1,0x9DD2, +0x9DD3,0x9DD4,0x9DD5,0x9DD6,0x9DD7,0x9DD8,0x9DD9,0x9DDA, +0x9DDB,0x9DDC,0x9DDD,0x9DDE,0x9DDF,0x9DE0,0x9DE1, 0, +0x9DE2,0x9DE3,0x9DE4,0x9DE5,0x9DE6,0x9DE7,0x9DE8,0x9DE9, +0x9DEA,0x9DEB,0x9DEC,0x9DED,0x9DEE,0x9DEF,0x9DF0,0x9DF1, +0x9DF2,0x9DF3,0x9DF4,0x9DF5,0x9DF6,0x9DF7,0x9DF8,0x9DF9, +0x9DFA,0x9DFB,0x9DFC,0x9DFD,0x9DFE,0x9DFF,0x9E00,0x9E01, +0x9E02, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9E03,0x9E04,0x9E05,0x9E06,0x9E07,0x9E08,0x9E09,0x9E0A, +0x9E0B,0x9E0C,0x9E0D,0x9E0E,0x9E0F,0x9E10,0x9E11,0x9E12, +0x9E13,0x9E14,0x9E15,0x9E16,0x9E17,0x9E18,0x9E19,0x9E1A, +0x9E1B,0x9E1C,0x9E1D,0x9E1E,0x9E24,0x9E27,0x9E2E,0x9E30, +0x9E34,0x9E3B,0x9E3C,0x9E40,0x9E4D,0x9E50,0x9E52,0x9E53, +0x9E54,0x9E56,0x9E59,0x9E5D,0x9E5F,0x9E60,0x9E61,0x9E62, +0x9E65,0x9E6E,0x9E6F,0x9E72,0x9E74,0x9E75,0x9E76,0x9E77, +0x9E78,0x9E79,0x9E7A,0x9E7B,0x9E7C,0x9E7D,0x9E80, 0, +0x9E81,0x9E83,0x9E84,0x9E85,0x9E86,0x9E89,0x9E8A,0x9E8C, +0x9E8D,0x9E8E,0x9E8F,0x9E90,0x9E91,0x9E94,0x9E95,0x9E96, +0x9E97,0x9E98,0x9E99,0x9E9A,0x9E9B,0x9E9C,0x9E9E,0x9EA0, +0x9EA1,0x9EA2,0x9EA3,0x9EA4,0x9EA5,0x9EA7,0x9EA8,0x9EA9, +0x9EAA, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9EAB,0x9EAC,0x9EAD,0x9EAE,0x9EAF,0x9EB0,0x9EB1,0x9EB2, +0x9EB3,0x9EB5,0x9EB6,0x9EB7,0x9EB9,0x9EBA,0x9EBC,0x9EBF, +0x9EC0,0x9EC1,0x9EC2,0x9EC3,0x9EC5,0x9EC6,0x9EC7,0x9EC8, +0x9ECA,0x9ECB,0x9ECC,0x9ED0,0x9ED2,0x9ED3,0x9ED5,0x9ED6, +0x9ED7,0x9ED9,0x9EDA,0x9EDE,0x9EE1,0x9EE3,0x9EE4,0x9EE6, +0x9EE8,0x9EEB,0x9EEC,0x9EED,0x9EEE,0x9EF0,0x9EF1,0x9EF2, +0x9EF3,0x9EF4,0x9EF5,0x9EF6,0x9EF7,0x9EF8,0x9EFA,0x9EFD, +0x9EFF,0x9F00,0x9F01,0x9F02,0x9F03,0x9F04,0x9F05, 0, +0x9F06,0x9F07,0x9F08,0x9F09,0x9F0A,0x9F0C,0x9F0F,0x9F11, +0x9F12,0x9F14,0x9F15,0x9F16,0x9F18,0x9F1A,0x9F1B,0x9F1C, +0x9F1D,0x9F1E,0x9F1F,0x9F21,0x9F23,0x9F24,0x9F25,0x9F26, +0x9F27,0x9F28,0x9F29,0x9F2A,0x9F2B,0x9F2D,0x9F2E,0x9F30, +0x9F31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9F32,0x9F33,0x9F34,0x9F35,0x9F36,0x9F38,0x9F3A,0x9F3C, +0x9F3F,0x9F40,0x9F41,0x9F42,0x9F43,0x9F45,0x9F46,0x9F47, +0x9F48,0x9F49,0x9F4A,0x9F4B,0x9F4C,0x9F4D,0x9F4E,0x9F4F, +0x9F52,0x9F53,0x9F54,0x9F55,0x9F56,0x9F57,0x9F58,0x9F59, +0x9F5A,0x9F5B,0x9F5C,0x9F5D,0x9F5E,0x9F5F,0x9F60,0x9F61, +0x9F62,0x9F63,0x9F64,0x9F65,0x9F66,0x9F67,0x9F68,0x9F69, +0x9F6A,0x9F6B,0x9F6C,0x9F6D,0x9F6E,0x9F6F,0x9F70,0x9F71, +0x9F72,0x9F73,0x9F74,0x9F75,0x9F76,0x9F77,0x9F78, 0, +0x9F79,0x9F7A,0x9F7B,0x9F7C,0x9F7D,0x9F7E,0x9F81,0x9F82, +0x9F8D,0x9F8E,0x9F8F,0x9F90,0x9F91,0x9F92,0x9F93,0x9F94, +0x9F95,0x9F96,0x9F97,0x9F98,0x9F9C,0x9F9D,0x9F9E,0x9FA1, +0x9FA2,0x9FA3,0x9FA4,0x9FA5,0xF92C,0xF979,0xF995,0xF9E7, +0xF9F1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xFA0C,0xFA0D,0xFA0E,0xFA0F,0xFA11,0xFA13,0xFA14,0xFA18, +0xFA1F,0xFA20,0xFA21,0xFA23,0xFA24,0xFA27,0xFA28,0xFA29 +}; + +static int func_gbk_uni_onechar(int code){ + if ((code>=0x8140)&&(code<=0xFE4F)) + return(tab_gbk_uni0[code-0x8140]); + return(0); +} + + + +/* page 0 0x00A4-0x0451 */ +static uint16 tab_uni_gbk0[]={ +0xA1E8, 0, 0,0xA1EC,0xA1A7, 0, 0, 0, + 0, 0, 0, 0,0xA1E3,0xA1C0, 0, 0, + 0, 0, 0,0xA1A4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xA1C1, 0, 0, 0, 0, + 0, 0, 0, 0,0xA8A4,0xA8A2, 0, 0, + 0, 0, 0, 0,0xA8A8,0xA8A6,0xA8BA, 0, +0xA8AC,0xA8AA, 0, 0, 0, 0,0xA8B0,0xA8AE, + 0, 0, 0,0xA1C2, 0,0xA8B4,0xA8B2, 0, +0xA8B9, 0, 0, 0, 0,0xA8A1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xA8A5, + 0, 0, 0, 0, 0, 0, 0,0xA8A7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xA8A9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA8BD, 0, 0, 0,0xA8BE, 0, 0, 0, + 0,0xA8AD, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xA8B1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xA8A3, 0,0xA8AB, 0,0xA8AF, 0, +0xA8B3, 0,0xA8B5, 0,0xA8B6, 0,0xA8B7, 0, +0xA8B8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xA8BB, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xA8C0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xA1A6, 0,0xA1A5,0xA840,0xA841, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xA842, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xA6A1,0xA6A2,0xA6A3, +0xA6A4,0xA6A5,0xA6A6,0xA6A7,0xA6A8,0xA6A9,0xA6AA,0xA6AB, +0xA6AC,0xA6AD,0xA6AE,0xA6AF,0xA6B0,0xA6B1, 0,0xA6B2, +0xA6B3,0xA6B4,0xA6B5,0xA6B6,0xA6B7,0xA6B8, 0, 0, + 0, 0, 0, 0, 0,0xA6C1,0xA6C2,0xA6C3, +0xA6C4,0xA6C5,0xA6C6,0xA6C7,0xA6C8,0xA6C9,0xA6CA,0xA6CB, +0xA6CC,0xA6CD,0xA6CE,0xA6CF,0xA6D0,0xA6D1, 0,0xA6D2, +0xA6D3,0xA6D4,0xA6D5,0xA6D6,0xA6D7,0xA6D8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xA7A7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xA7A1,0xA7A2,0xA7A3,0xA7A4, +0xA7A5,0xA7A6,0xA7A8,0xA7A9,0xA7AA,0xA7AB,0xA7AC,0xA7AD, +0xA7AE,0xA7AF,0xA7B0,0xA7B1,0xA7B2,0xA7B3,0xA7B4,0xA7B5, +0xA7B6,0xA7B7,0xA7B8,0xA7B9,0xA7BA,0xA7BB,0xA7BC,0xA7BD, +0xA7BE,0xA7BF,0xA7C0,0xA7C1,0xA7D1,0xA7D2,0xA7D3,0xA7D4, +0xA7D5,0xA7D6,0xA7D8,0xA7D9,0xA7DA,0xA7DB,0xA7DC,0xA7DD, +0xA7DE,0xA7DF,0xA7E0,0xA7E1,0xA7E2,0xA7E3,0xA7E4,0xA7E5, +0xA7E6,0xA7E7,0xA7E8,0xA7E9,0xA7EA,0xA7EB,0xA7EC,0xA7ED, +0xA7EE,0xA7EF,0xA7F0,0xA7F1, 0,0xA7D7}; + +/* page 1 0x2010-0x2312 */ +static uint16 tab_uni_gbk1[]={ +0xA95C, 0, 0,0xA843,0xA1AA,0xA844,0xA1AC, 0, +0xA1AE,0xA1AF, 0, 0,0xA1B0,0xA1B1, 0, 0, + 0, 0, 0, 0, 0,0xA845,0xA1AD, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA1EB, 0,0xA1E4,0xA1E5, 0,0xA846, 0, 0, + 0, 0, 0,0xA1F9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xA1E6, 0,0xA847, 0, 0, + 0,0xA848, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xA1ED, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xA959, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA2F1,0xA2F2,0xA2F3,0xA2F4,0xA2F5,0xA2F6,0xA2F7,0xA2F8, +0xA2F9,0xA2FA,0xA2FB,0xA2FC, 0, 0, 0, 0, +0xA2A1,0xA2A2,0xA2A3,0xA2A4,0xA2A5,0xA2A6,0xA2A7,0xA2A8, +0xA2A9,0xA2AA, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA1FB,0xA1FC,0xA1FA,0xA1FD, 0, 0,0xA849,0xA84A, +0xA84B,0xA84C, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA1CA, 0, 0, 0, 0, 0, 0,0xA1C7, + 0,0xA1C6, 0, 0, 0,0xA84D, 0, 0, + 0, 0,0xA1CC, 0, 0,0xA1D8,0xA1DE,0xA84E, +0xA1CF, 0, 0,0xA84F, 0,0xA1CE, 0,0xA1C4, +0xA1C5,0xA1C9,0xA1C8,0xA1D2, 0, 0,0xA1D3, 0, + 0, 0, 0, 0,0xA1E0,0xA1DF,0xA1C3,0xA1CB, + 0, 0, 0, 0, 0,0xA1D7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA1D6, 0, 0, 0,0xA1D5, 0, 0, 0, + 0, 0,0xA850, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA1D9,0xA1D4, 0, 0,0xA1DC,0xA1DD,0xA851,0xA852, + 0, 0, 0, 0, 0, 0,0xA1DA,0xA1DB, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xA892, 0, 0, + 0,0xA1D1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xA1CD, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xA853, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xA1D0}; + +/* page 2 0x2460-0x2642 */ +static uint16 tab_uni_gbk2[]={ +0xA2D9,0xA2DA,0xA2DB,0xA2DC,0xA2DD,0xA2DE,0xA2DF,0xA2E0, +0xA2E1,0xA2E2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xA2C5,0xA2C6,0xA2C7,0xA2C8, +0xA2C9,0xA2CA,0xA2CB,0xA2CC,0xA2CD,0xA2CE,0xA2CF,0xA2D0, +0xA2D1,0xA2D2,0xA2D3,0xA2D4,0xA2D5,0xA2D6,0xA2D7,0xA2D8, +0xA2B1,0xA2B2,0xA2B3,0xA2B4,0xA2B5,0xA2B6,0xA2B7,0xA2B8, +0xA2B9,0xA2BA,0xA2BB,0xA2BC,0xA2BD,0xA2BE,0xA2BF,0xA2C0, +0xA2C1,0xA2C2,0xA2C3,0xA2C4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA9A4,0xA9A5,0xA9A6,0xA9A7,0xA9A8,0xA9A9,0xA9AA,0xA9AB, +0xA9AC,0xA9AD,0xA9AE,0xA9AF,0xA9B0,0xA9B1,0xA9B2,0xA9B3, +0xA9B4,0xA9B5,0xA9B6,0xA9B7,0xA9B8,0xA9B9,0xA9BA,0xA9BB, +0xA9BC,0xA9BD,0xA9BE,0xA9BF,0xA9C0,0xA9C1,0xA9C2,0xA9C3, +0xA9C4,0xA9C5,0xA9C6,0xA9C7,0xA9C8,0xA9C9,0xA9CA,0xA9CB, +0xA9CC,0xA9CD,0xA9CE,0xA9CF,0xA9D0,0xA9D1,0xA9D2,0xA9D3, +0xA9D4,0xA9D5,0xA9D6,0xA9D7,0xA9D8,0xA9D9,0xA9DA,0xA9DB, +0xA9DC,0xA9DD,0xA9DE,0xA9DF,0xA9E0,0xA9E1,0xA9E2,0xA9E3, +0xA9E4,0xA9E5,0xA9E6,0xA9E7,0xA9E8,0xA9E9,0xA9EA,0xA9EB, +0xA9EC,0xA9ED,0xA9EE,0xA9EF, 0, 0, 0, 0, +0xA854,0xA855,0xA856,0xA857,0xA858,0xA859,0xA85A,0xA85B, +0xA85C,0xA85D,0xA85E,0xA85F,0xA860,0xA861,0xA862,0xA863, +0xA864,0xA865,0xA866,0xA867,0xA868,0xA869,0xA86A,0xA86B, +0xA86C,0xA86D,0xA86E,0xA86F,0xA870,0xA871,0xA872,0xA873, +0xA874,0xA875,0xA876,0xA877, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xA878,0xA879,0xA87A,0xA87B,0xA87C,0xA87D,0xA87E, +0xA880,0xA881,0xA882,0xA883,0xA884,0xA885,0xA886,0xA887, + 0, 0, 0,0xA888,0xA889,0xA88A, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA1F6,0xA1F5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xA1F8,0xA1F7, 0, 0, 0, 0, + 0, 0, 0, 0,0xA88B,0xA88C, 0, 0, + 0, 0, 0, 0, 0, 0,0xA1F4,0xA1F3, + 0, 0, 0,0xA1F0, 0, 0,0xA1F2,0xA1F1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xA88D,0xA88E,0xA88F,0xA890, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xA1EF,0xA1EE, 0, + 0,0xA891, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA1E2, 0,0xA1E1}; + +/* page 3 0x3000-0x3129 */ +static uint16 tab_uni_gbk3[]={ +0xA1A1,0xA1A2,0xA1A3,0xA1A8, 0,0xA1A9,0xA965,0xA996, +0xA1B4,0xA1B5,0xA1B6,0xA1B7,0xA1B8,0xA1B9,0xA1BA,0xA1BB, +0xA1BE,0xA1BF,0xA893,0xA1FE,0xA1B2,0xA1B3,0xA1BC,0xA1BD, + 0, 0, 0, 0, 0,0xA894,0xA895, 0, + 0,0xA940,0xA941,0xA942,0xA943,0xA944,0xA945,0xA946, +0xA947,0xA948, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xA4A1,0xA4A2,0xA4A3,0xA4A4,0xA4A5,0xA4A6,0xA4A7, +0xA4A8,0xA4A9,0xA4AA,0xA4AB,0xA4AC,0xA4AD,0xA4AE,0xA4AF, +0xA4B0,0xA4B1,0xA4B2,0xA4B3,0xA4B4,0xA4B5,0xA4B6,0xA4B7, +0xA4B8,0xA4B9,0xA4BA,0xA4BB,0xA4BC,0xA4BD,0xA4BE,0xA4BF, +0xA4C0,0xA4C1,0xA4C2,0xA4C3,0xA4C4,0xA4C5,0xA4C6,0xA4C7, +0xA4C8,0xA4C9,0xA4CA,0xA4CB,0xA4CC,0xA4CD,0xA4CE,0xA4CF, +0xA4D0,0xA4D1,0xA4D2,0xA4D3,0xA4D4,0xA4D5,0xA4D6,0xA4D7, +0xA4D8,0xA4D9,0xA4DA,0xA4DB,0xA4DC,0xA4DD,0xA4DE,0xA4DF, +0xA4E0,0xA4E1,0xA4E2,0xA4E3,0xA4E4,0xA4E5,0xA4E6,0xA4E7, +0xA4E8,0xA4E9,0xA4EA,0xA4EB,0xA4EC,0xA4ED,0xA4EE,0xA4EF, +0xA4F0,0xA4F1,0xA4F2,0xA4F3, 0, 0, 0, 0, + 0, 0, 0,0xA961,0xA962,0xA966,0xA967, 0, + 0,0xA5A1,0xA5A2,0xA5A3,0xA5A4,0xA5A5,0xA5A6,0xA5A7, +0xA5A8,0xA5A9,0xA5AA,0xA5AB,0xA5AC,0xA5AD,0xA5AE,0xA5AF, +0xA5B0,0xA5B1,0xA5B2,0xA5B3,0xA5B4,0xA5B5,0xA5B6,0xA5B7, +0xA5B8,0xA5B9,0xA5BA,0xA5BB,0xA5BC,0xA5BD,0xA5BE,0xA5BF, +0xA5C0,0xA5C1,0xA5C2,0xA5C3,0xA5C4,0xA5C5,0xA5C6,0xA5C7, +0xA5C8,0xA5C9,0xA5CA,0xA5CB,0xA5CC,0xA5CD,0xA5CE,0xA5CF, +0xA5D0,0xA5D1,0xA5D2,0xA5D3,0xA5D4,0xA5D5,0xA5D6,0xA5D7, +0xA5D8,0xA5D9,0xA5DA,0xA5DB,0xA5DC,0xA5DD,0xA5DE,0xA5DF, +0xA5E0,0xA5E1,0xA5E2,0xA5E3,0xA5E4,0xA5E5,0xA5E6,0xA5E7, +0xA5E8,0xA5E9,0xA5EA,0xA5EB,0xA5EC,0xA5ED,0xA5EE,0xA5EF, +0xA5F0,0xA5F1,0xA5F2,0xA5F3,0xA5F4,0xA5F5,0xA5F6, 0, + 0, 0, 0, 0,0xA960,0xA963,0xA964, 0, + 0, 0, 0, 0, 0,0xA8C5,0xA8C6,0xA8C7, +0xA8C8,0xA8C9,0xA8CA,0xA8CB,0xA8CC,0xA8CD,0xA8CE,0xA8CF, +0xA8D0,0xA8D1,0xA8D2,0xA8D3,0xA8D4,0xA8D5,0xA8D6,0xA8D7, +0xA8D8,0xA8D9,0xA8DA,0xA8DB,0xA8DC,0xA8DD,0xA8DE,0xA8DF, +0xA8E0,0xA8E1,0xA8E2,0xA8E3,0xA8E4,0xA8E5,0xA8E6,0xA8E7, +0xA8E8,0xA8E9}; + +/* page 4 0x3220-0x32A3 */ +static uint16 tab_uni_gbk4[]={ +0xA2E5,0xA2E6,0xA2E7,0xA2E8,0xA2E9,0xA2EA,0xA2EB,0xA2EC, +0xA2ED,0xA2EE, 0, 0, 0, 0, 0, 0, + 0,0xA95A, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xA949}; + +/* page 5 0x338E-0x33D5 */ +static uint16 tab_uni_gbk5[]={ +0xA94A,0xA94B, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xA94C,0xA94D, +0xA94E, 0, 0,0xA94F, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xA950, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA951, 0, 0,0xA952,0xA953, 0, 0,0xA954 +}; + +/* page 6 0x4E00-0x9FA5 */ +static uint16 tab_uni_gbk6[]={ +0xD2BB,0xB6A1,0x8140,0xC6DF,0x8141,0x8142,0x8143,0xCDF2, +0xD5C9,0xC8FD,0xC9CF,0xCFC2,0xD8A2,0xB2BB,0xD3EB,0x8144, +0xD8A4,0xB3F3,0x8145,0xD7A8,0xC7D2,0xD8A7,0xCAC0,0x8146, +0xC7F0,0xB1FB,0xD2B5,0xB4D4,0xB6AB,0xCBBF,0xD8A9,0x8147, +0x8148,0x8149,0xB6AA,0x814A,0xC1BD,0xD1CF,0x814B,0xC9A5, +0xD8AD,0x814C,0xB8F6,0xD1BE,0xE3DC,0xD6D0,0x814D,0x814E, +0xB7E1,0x814F,0xB4AE,0x8150,0xC1D9,0x8151,0xD8BC,0x8152, +0xCDE8,0xB5A4,0xCEAA,0xD6F7,0x8153,0xC0F6,0xBED9,0xD8AF, +0x8154,0x8155,0x8156,0xC4CB,0x8157,0xBEC3,0x8158,0xD8B1, +0xC3B4,0xD2E5,0x8159,0xD6AE,0xCEDA,0xD5A7,0xBAF5,0xB7A6, +0xC0D6,0x815A,0xC6B9,0xC5D2,0xC7C7,0x815B,0xB9D4,0x815C, +0xB3CB,0xD2D2,0x815D,0x815E,0xD8BF,0xBEC5,0xC6F2,0xD2B2, +0xCFB0,0xCFE7,0x815F,0x8160,0x8161,0x8162,0xCAE9,0x8163, +0x8164,0xD8C0,0x8165,0x8166,0x8167,0x8168,0x8169,0x816A, +0xC2F2,0xC2D2,0x816B,0xC8E9,0x816C,0x816D,0x816E,0x816F, +0x8170,0x8171,0x8172,0x8173,0x8174,0x8175,0xC7AC,0x8176, +0x8177,0x8178,0x8179,0x817A,0x817B,0x817C,0xC1CB,0x817D, +0xD3E8,0xD5F9,0x817E,0xCAC2,0xB6FE,0xD8A1,0xD3DA,0xBFF7, +0x8180,0xD4C6,0xBBA5,0xD8C1,0xCEE5,0xBEAE,0x8181,0x8182, +0xD8A8,0x8183,0xD1C7,0xD0A9,0x8184,0x8185,0x8186,0xD8BD, +0xD9EF,0xCDF6,0xBFBA,0x8187,0xBDBB,0xBAA5,0xD2E0,0xB2FA, +0xBAE0,0xC4B6,0x8188,0xCFED,0xBEA9,0xCDA4,0xC1C1,0x8189, +0x818A,0x818B,0xC7D7,0xD9F1,0x818C,0xD9F4,0x818D,0x818E, +0x818F,0x8190,0xC8CB,0xD8E9,0x8191,0x8192,0x8193,0xD2DA, +0xCAB2,0xC8CA,0xD8EC,0xD8EA,0xD8C6,0xBDF6,0xC6CD,0xB3F0, +0x8194,0xD8EB,0xBDF1,0xBDE9,0x8195,0xC8D4,0xB4D3,0x8196, +0x8197,0xC2D8,0x8198,0xB2D6,0xD7D0,0xCACB,0xCBFB,0xD5CC, +0xB8B6,0xCFC9,0x8199,0x819A,0x819B,0xD9DA,0xD8F0,0xC7AA, +0x819C,0xD8EE,0x819D,0xB4FA,0xC1EE,0xD2D4,0x819E,0x819F, +0xD8ED,0x81A0,0xD2C7,0xD8EF,0xC3C7,0x81A1,0x81A2,0x81A3, +0xD1F6,0x81A4,0xD6D9,0xD8F2,0x81A5,0xD8F5,0xBCFE,0xBCDB, +0x81A6,0x81A7,0x81A8,0xC8CE,0x81A9,0xB7DD,0x81AA,0xB7C2, +0x81AB,0xC6F3,0x81AC,0x81AD,0x81AE,0x81AF,0x81B0,0x81B1, +0x81B2,0xD8F8,0xD2C1,0x81B3,0x81B4,0xCEE9,0xBCBF,0xB7FC, +0xB7A5,0xD0DD,0x81B5,0x81B6,0x81B7,0x81B8,0x81B9,0xD6DA, +0xD3C5,0xBBEF,0xBBE1,0xD8F1,0x81BA,0x81BB,0xC9A1,0xCEB0, +0xB4AB,0x81BC,0xD8F3,0x81BD,0xC9CB,0xD8F6,0xC2D7,0xD8F7, +0x81BE,0x81BF,0xCEB1,0xD8F9,0x81C0,0x81C1,0x81C2,0xB2AE, +0xB9C0,0x81C3,0xD9A3,0x81C4,0xB0E9,0x81C5,0xC1E6,0x81C6, +0xC9EC,0x81C7,0xCBC5,0x81C8,0xCBC6,0xD9A4,0x81C9,0x81CA, +0x81CB,0x81CC,0x81CD,0xB5E8,0x81CE,0x81CF,0xB5AB,0x81D0, +0x81D1,0x81D2,0x81D3,0x81D4,0x81D5,0xCEBB,0xB5CD,0xD7A1, +0xD7F4,0xD3D3,0x81D6,0xCCE5,0x81D7,0xBACE,0x81D8,0xD9A2, +0xD9DC,0xD3E0,0xD8FD,0xB7F0,0xD7F7,0xD8FE,0xD8FA,0xD9A1, +0xC4E3,0x81D9,0x81DA,0xD3B6,0xD8F4,0xD9DD,0x81DB,0xD8FB, +0x81DC,0xC5E5,0x81DD,0x81DE,0xC0D0,0x81DF,0x81E0,0xD1F0, +0xB0DB,0x81E1,0x81E2,0xBCD1,0xD9A6,0x81E3,0xD9A5,0x81E4, +0x81E5,0x81E6,0x81E7,0xD9AC,0xD9AE,0x81E8,0xD9AB,0xCAB9, +0x81E9,0x81EA,0x81EB,0xD9A9,0xD6B6,0x81EC,0x81ED,0x81EE, +0xB3DE,0xD9A8,0x81EF,0xC0FD,0x81F0,0xCACC,0x81F1,0xD9AA, +0x81F2,0xD9A7,0x81F3,0x81F4,0xD9B0,0x81F5,0x81F6,0xB6B1, +0x81F7,0x81F8,0x81F9,0xB9A9,0x81FA,0xD2C0,0x81FB,0x81FC, +0xCFC0,0x81FD,0x81FE,0xC2C2,0x8240,0xBDC4,0xD5EC,0xB2E0, +0xC7C8,0xBFEB,0xD9AD,0x8241,0xD9AF,0x8242,0xCEEA,0xBAEE, +0x8243,0x8244,0x8245,0x8246,0x8247,0xC7D6,0x8248,0x8249, +0x824A,0x824B,0x824C,0x824D,0x824E,0x824F,0x8250,0xB1E3, +0x8251,0x8252,0x8253,0xB4D9,0xB6ED,0xD9B4,0x8254,0x8255, +0x8256,0x8257,0xBFA1,0x8258,0x8259,0x825A,0xD9DE,0xC7CE, +0xC0FE,0xD9B8,0x825B,0x825C,0x825D,0x825E,0x825F,0xCBD7, +0xB7FD,0x8260,0xD9B5,0x8261,0xD9B7,0xB1A3,0xD3E1,0xD9B9, +0x8262,0xD0C5,0x8263,0xD9B6,0x8264,0x8265,0xD9B1,0x8266, +0xD9B2,0xC1A9,0xD9B3,0x8267,0x8268,0xBCF3,0xD0DE,0xB8A9, +0x8269,0xBEE3,0x826A,0xD9BD,0x826B,0x826C,0x826D,0x826E, +0xD9BA,0x826F,0xB0B3,0x8270,0x8271,0x8272,0xD9C2,0x8273, +0x8274,0x8275,0x8276,0x8277,0x8278,0x8279,0x827A,0x827B, +0x827C,0x827D,0x827E,0x8280,0xD9C4,0xB1B6,0x8281,0xD9BF, +0x8282,0x8283,0xB5B9,0x8284,0xBEF3,0x8285,0x8286,0x8287, +0xCCC8,0xBAF2,0xD2D0,0x8288,0xD9C3,0x8289,0x828A,0xBDE8, +0x828B,0xB3AB,0x828C,0x828D,0x828E,0xD9C5,0xBEEB,0x828F, +0xD9C6,0xD9BB,0xC4DF,0x8290,0xD9BE,0xD9C1,0xD9C0,0x8291, +0x8292,0x8293,0x8294,0x8295,0x8296,0x8297,0x8298,0x8299, +0x829A,0x829B,0xD5AE,0x829C,0xD6B5,0x829D,0xC7E3,0x829E, +0x829F,0x82A0,0x82A1,0xD9C8,0x82A2,0x82A3,0x82A4,0xBCD9, +0xD9CA,0x82A5,0x82A6,0x82A7,0xD9BC,0x82A8,0xD9CB,0xC6AB, +0x82A9,0x82AA,0x82AB,0x82AC,0x82AD,0xD9C9,0x82AE,0x82AF, +0x82B0,0x82B1,0xD7F6,0x82B2,0xCDA3,0x82B3,0x82B4,0x82B5, +0x82B6,0x82B7,0x82B8,0x82B9,0x82BA,0xBDA1,0x82BB,0x82BC, +0x82BD,0x82BE,0x82BF,0x82C0,0xD9CC,0x82C1,0x82C2,0x82C3, +0x82C4,0x82C5,0x82C6,0x82C7,0x82C8,0x82C9,0xC5BC,0xCDB5, +0x82CA,0x82CB,0x82CC,0xD9CD,0x82CD,0x82CE,0xD9C7,0xB3A5, +0xBFFE,0x82CF,0x82D0,0x82D1,0x82D2,0xB8B5,0x82D3,0x82D4, +0xC0FC,0x82D5,0x82D6,0x82D7,0x82D8,0xB0F8,0x82D9,0x82DA, +0x82DB,0x82DC,0x82DD,0x82DE,0x82DF,0x82E0,0x82E1,0x82E2, +0x82E3,0x82E4,0x82E5,0x82E6,0x82E7,0x82E8,0x82E9,0x82EA, +0x82EB,0x82EC,0x82ED,0xB4F6,0x82EE,0xD9CE,0x82EF,0xD9CF, +0xB4A2,0xD9D0,0x82F0,0x82F1,0xB4DF,0x82F2,0x82F3,0x82F4, +0x82F5,0x82F6,0xB0C1,0x82F7,0x82F8,0x82F9,0x82FA,0x82FB, +0x82FC,0x82FD,0xD9D1,0xC9B5,0x82FE,0x8340,0x8341,0x8342, +0x8343,0x8344,0x8345,0x8346,0x8347,0x8348,0x8349,0x834A, +0x834B,0x834C,0x834D,0x834E,0x834F,0x8350,0x8351,0xCFF1, +0x8352,0x8353,0x8354,0x8355,0x8356,0x8357,0xD9D2,0x8358, +0x8359,0x835A,0xC1C5,0x835B,0x835C,0x835D,0x835E,0x835F, +0x8360,0x8361,0x8362,0x8363,0x8364,0x8365,0xD9D6,0xC9AE, +0x8366,0x8367,0x8368,0x8369,0xD9D5,0xD9D4,0xD9D7,0x836A, +0x836B,0x836C,0x836D,0xCBDB,0x836E,0xBDA9,0x836F,0x8370, +0x8371,0x8372,0x8373,0xC6A7,0x8374,0x8375,0x8376,0x8377, +0x8378,0x8379,0x837A,0x837B,0x837C,0x837D,0xD9D3,0xD9D8, +0x837E,0x8380,0x8381,0xD9D9,0x8382,0x8383,0x8384,0x8385, +0x8386,0x8387,0xC8E5,0x8388,0x8389,0x838A,0x838B,0x838C, +0x838D,0x838E,0x838F,0x8390,0x8391,0x8392,0x8393,0x8394, +0x8395,0xC0DC,0x8396,0x8397,0x8398,0x8399,0x839A,0x839B, +0x839C,0x839D,0x839E,0x839F,0x83A0,0x83A1,0x83A2,0x83A3, +0x83A4,0x83A5,0x83A6,0x83A7,0x83A8,0x83A9,0x83AA,0x83AB, +0x83AC,0x83AD,0x83AE,0x83AF,0x83B0,0x83B1,0x83B2,0xB6F9, +0xD8A3,0xD4CA,0x83B3,0xD4AA,0xD0D6,0xB3E4,0xD5D7,0x83B4, +0xCFC8,0xB9E2,0x83B5,0xBFCB,0x83B6,0xC3E2,0x83B7,0x83B8, +0x83B9,0xB6D2,0x83BA,0x83BB,0xCDC3,0xD9EE,0xD9F0,0x83BC, +0x83BD,0x83BE,0xB5B3,0x83BF,0xB6B5,0x83C0,0x83C1,0x83C2, +0x83C3,0x83C4,0xBEA4,0x83C5,0x83C6,0xC8EB,0x83C7,0x83C8, +0xC8AB,0x83C9,0x83CA,0xB0CB,0xB9AB,0xC1F9,0xD9E2,0x83CB, +0xC0BC,0xB9B2,0x83CC,0xB9D8,0xD0CB,0xB1F8,0xC6E4,0xBEDF, +0xB5E4,0xD7C8,0x83CD,0xD1F8,0xBCE6,0xCADE,0x83CE,0x83CF, +0xBCBD,0xD9E6,0xD8E7,0x83D0,0x83D1,0xC4DA,0x83D2,0x83D3, +0xB8D4,0xC8BD,0x83D4,0x83D5,0xB2E1,0xD4D9,0x83D6,0x83D7, +0x83D8,0x83D9,0xC3B0,0x83DA,0x83DB,0xC3E1,0xDAA2,0xC8DF, +0x83DC,0xD0B4,0x83DD,0xBEFC,0xC5A9,0x83DE,0x83DF,0x83E0, +0xB9DA,0x83E1,0xDAA3,0x83E2,0xD4A9,0xDAA4,0x83E3,0x83E4, +0x83E5,0x83E6,0x83E7,0xD9FB,0xB6AC,0x83E8,0x83E9,0xB7EB, +0xB1F9,0xD9FC,0xB3E5,0xBEF6,0x83EA,0xBFF6,0xD2B1,0xC0E4, +0x83EB,0x83EC,0x83ED,0xB6B3,0xD9FE,0xD9FD,0x83EE,0x83EF, +0xBEBB,0x83F0,0x83F1,0x83F2,0xC6E0,0x83F3,0xD7BC,0xDAA1, +0x83F4,0xC1B9,0x83F5,0xB5F2,0xC1E8,0x83F6,0x83F7,0xBCF5, +0x83F8,0xB4D5,0x83F9,0x83FA,0x83FB,0x83FC,0x83FD,0x83FE, +0x8440,0x8441,0x8442,0xC1DD,0x8443,0xC4FD,0x8444,0x8445, +0xBCB8,0xB7B2,0x8446,0x8447,0xB7EF,0x8448,0x8449,0x844A, +0x844B,0x844C,0x844D,0xD9EC,0x844E,0xC6BE,0x844F,0xBFAD, +0xBBCB,0x8450,0x8451,0xB5CA,0x8452,0xDBC9,0xD0D7,0x8453, +0xCDB9,0xB0BC,0xB3F6,0xBBF7,0xDBCA,0xBAAF,0x8454,0xD4E4, +0xB5B6,0xB5F3,0xD8D6,0xC8D0,0x8455,0x8456,0xB7D6,0xC7D0, +0xD8D7,0x8457,0xBFAF,0x8458,0x8459,0xDBBB,0xD8D8,0x845A, +0x845B,0xD0CC,0xBBAE,0x845C,0x845D,0x845E,0xEBBE,0xC1D0, +0xC1F5,0xD4F2,0xB8D5,0xB4B4,0x845F,0xB3F5,0x8460,0x8461, +0xC9BE,0x8462,0x8463,0x8464,0xC5D0,0x8465,0x8466,0x8467, +0xC5D9,0xC0FB,0x8468,0xB1F0,0x8469,0xD8D9,0xB9CE,0x846A, +0xB5BD,0x846B,0x846C,0xD8DA,0x846D,0x846E,0xD6C6,0xCBA2, +0xC8AF,0xC9B2,0xB4CC,0xBFCC,0x846F,0xB9F4,0x8470,0xD8DB, +0xD8DC,0xB6E7,0xBCC1,0xCCEA,0x8471,0x8472,0x8473,0x8474, +0x8475,0x8476,0xCFF7,0x8477,0xD8DD,0xC7B0,0x8478,0x8479, +0xB9D0,0xBDA3,0x847A,0x847B,0xCCDE,0x847C,0xC6CA,0x847D, +0x847E,0x8480,0x8481,0x8482,0xD8E0,0x8483,0xD8DE,0x8484, +0x8485,0xD8DF,0x8486,0x8487,0x8488,0xB0FE,0x8489,0xBEE7, +0x848A,0xCAA3,0xBCF4,0x848B,0x848C,0x848D,0x848E,0xB8B1, +0x848F,0x8490,0xB8EE,0x8491,0x8492,0x8493,0x8494,0x8495, +0x8496,0x8497,0x8498,0x8499,0x849A,0xD8E2,0x849B,0xBDCB, +0x849C,0xD8E4,0xD8E3,0x849D,0x849E,0x849F,0x84A0,0x84A1, +0xC5FC,0x84A2,0x84A3,0x84A4,0x84A5,0x84A6,0x84A7,0x84A8, +0xD8E5,0x84A9,0x84AA,0xD8E6,0x84AB,0x84AC,0x84AD,0x84AE, +0x84AF,0x84B0,0x84B1,0xC1A6,0x84B2,0xC8B0,0xB0EC,0xB9A6, +0xBCD3,0xCEF1,0xDBBD,0xC1D3,0x84B3,0x84B4,0x84B5,0x84B6, +0xB6AF,0xD6FA,0xC5AC,0xBDD9,0xDBBE,0xDBBF,0x84B7,0x84B8, +0x84B9,0xC0F8,0xBEA2,0xC0CD,0x84BA,0x84BB,0x84BC,0x84BD, +0x84BE,0x84BF,0x84C0,0x84C1,0x84C2,0x84C3,0xDBC0,0xCAC6, +0x84C4,0x84C5,0x84C6,0xB2AA,0x84C7,0x84C8,0x84C9,0xD3C2, +0x84CA,0xC3E3,0x84CB,0xD1AB,0x84CC,0x84CD,0x84CE,0x84CF, +0xDBC2,0x84D0,0xC0D5,0x84D1,0x84D2,0x84D3,0xDBC3,0x84D4, +0xBFB1,0x84D5,0x84D6,0x84D7,0x84D8,0x84D9,0x84DA,0xC4BC, +0x84DB,0x84DC,0x84DD,0x84DE,0xC7DA,0x84DF,0x84E0,0x84E1, +0x84E2,0x84E3,0x84E4,0x84E5,0x84E6,0x84E7,0x84E8,0x84E9, +0xDBC4,0x84EA,0x84EB,0x84EC,0x84ED,0x84EE,0x84EF,0x84F0, +0x84F1,0xD9E8,0xC9D7,0x84F2,0x84F3,0x84F4,0xB9B4,0xCEF0, +0xD4C8,0x84F5,0x84F6,0x84F7,0x84F8,0xB0FC,0xB4D2,0x84F9, +0xD0D9,0x84FA,0x84FB,0x84FC,0x84FD,0xD9E9,0x84FE,0xDECB, +0xD9EB,0x8540,0x8541,0x8542,0x8543,0xD8B0,0xBBAF,0xB1B1, +0x8544,0xB3D7,0xD8CE,0x8545,0x8546,0xD4D1,0x8547,0x8548, +0xBDB3,0xBFEF,0x8549,0xCFBB,0x854A,0x854B,0xD8D0,0x854C, +0x854D,0x854E,0xB7CB,0x854F,0x8550,0x8551,0xD8D1,0x8552, +0x8553,0x8554,0x8555,0x8556,0x8557,0x8558,0x8559,0x855A, +0x855B,0xC6A5,0xC7F8,0xD2BD,0x855C,0x855D,0xD8D2,0xC4E4, +0x855E,0xCAAE,0x855F,0xC7A7,0x8560,0xD8A6,0x8561,0xC9FD, +0xCEE7,0xBBDC,0xB0EB,0x8562,0x8563,0x8564,0xBBAA,0xD0AD, +0x8565,0xB1B0,0xD7E4,0xD7BF,0x8566,0xB5A5,0xC2F4,0xC4CF, +0x8567,0x8568,0xB2A9,0x8569,0xB2B7,0x856A,0xB1E5,0xDFB2, +0xD5BC,0xBFA8,0xC2AC,0xD8D5,0xC2B1,0x856B,0xD8D4,0xCED4, +0x856C,0xDAE0,0x856D,0xCEC0,0x856E,0x856F,0xD8B4,0xC3AE, +0xD3A1,0xCEA3,0x8570,0xBCB4,0xC8B4,0xC2D1,0x8571,0xBEED, +0xD0B6,0x8572,0xDAE1,0x8573,0x8574,0x8575,0x8576,0xC7E4, +0x8577,0x8578,0xB3A7,0x8579,0xB6F2,0xCCFC,0xC0FA,0x857A, +0x857B,0xC0F7,0x857C,0xD1B9,0xD1E1,0xD8C7,0x857D,0x857E, +0x8580,0x8581,0x8582,0x8583,0x8584,0xB2DE,0x8585,0x8586, +0xC0E5,0x8587,0xBAF1,0x8588,0x8589,0xD8C8,0x858A,0xD4AD, +0x858B,0x858C,0xCFE1,0xD8C9,0x858D,0xD8CA,0xCFC3,0x858E, +0xB3F8,0xBEC7,0x858F,0x8590,0x8591,0x8592,0xD8CB,0x8593, +0x8594,0x8595,0x8596,0x8597,0x8598,0x8599,0xDBCC,0x859A, +0x859B,0x859C,0x859D,0xC8A5,0x859E,0x859F,0x85A0,0xCFD8, +0x85A1,0xC8FE,0xB2CE,0x85A2,0x85A3,0x85A4,0x85A5,0x85A6, +0xD3D6,0xB2E6,0xBCB0,0xD3D1,0xCBAB,0xB7B4,0x85A7,0x85A8, +0x85A9,0xB7A2,0x85AA,0x85AB,0xCAE5,0x85AC,0xC8A1,0xCADC, +0xB1E4,0xD0F0,0x85AD,0xC5D1,0x85AE,0x85AF,0x85B0,0xDBC5, +0xB5FE,0x85B1,0x85B2,0xBFDA,0xB9C5,0xBEE4,0xC1ED,0x85B3, +0xDFB6,0xDFB5,0xD6BB,0xBDD0,0xD5D9,0xB0C8,0xB6A3,0xBFC9, +0xCCA8,0xDFB3,0xCAB7,0xD3D2,0x85B4,0xD8CF,0xD2B6,0xBAC5, +0xCBBE,0xCCBE,0x85B5,0xDFB7,0xB5F0,0xDFB4,0x85B6,0x85B7, +0x85B8,0xD3F5,0x85B9,0xB3D4,0xB8F7,0x85BA,0xDFBA,0x85BB, +0xBACF,0xBCAA,0xB5F5,0x85BC,0xCDAC,0xC3FB,0xBAF3,0xC0F4, +0xCDC2,0xCFF2,0xDFB8,0xCFC5,0x85BD,0xC2C0,0xDFB9,0xC2F0, +0x85BE,0x85BF,0x85C0,0xBEFD,0x85C1,0xC1DF,0xCDCC,0xD2F7, +0xB7CD,0xDFC1,0x85C2,0xDFC4,0x85C3,0x85C4,0xB7F1,0xB0C9, +0xB6D6,0xB7D4,0x85C5,0xBAAC,0xCCFD,0xBFD4,0xCBB1,0xC6F4, +0x85C6,0xD6A8,0xDFC5,0x85C7,0xCEE2,0xB3B3,0x85C8,0x85C9, +0xCEFC,0xB4B5,0x85CA,0xCEC7,0xBAF0,0x85CB,0xCEE1,0x85CC, +0xD1BD,0x85CD,0x85CE,0xDFC0,0x85CF,0x85D0,0xB4F4,0x85D1, +0xB3CA,0x85D2,0xB8E6,0xDFBB,0x85D3,0x85D4,0x85D5,0x85D6, +0xC4C5,0x85D7,0xDFBC,0xDFBD,0xDFBE,0xC5BB,0xDFBF,0xDFC2, +0xD4B1,0xDFC3,0x85D8,0xC7BA,0xCED8,0x85D9,0x85DA,0x85DB, +0x85DC,0x85DD,0xC4D8,0x85DE,0xDFCA,0x85DF,0xDFCF,0x85E0, +0xD6DC,0x85E1,0x85E2,0x85E3,0x85E4,0x85E5,0x85E6,0x85E7, +0x85E8,0xDFC9,0xDFDA,0xCEB6,0x85E9,0xBAC7,0xDFCE,0xDFC8, +0xC5DE,0x85EA,0x85EB,0xC9EB,0xBAF4,0xC3FC,0x85EC,0x85ED, +0xBED7,0x85EE,0xDFC6,0x85EF,0xDFCD,0x85F0,0xC5D8,0x85F1, +0x85F2,0x85F3,0x85F4,0xD5A6,0xBACD,0x85F5,0xBECC,0xD3BD, +0xB8C0,0x85F6,0xD6E4,0x85F7,0xDFC7,0xB9BE,0xBFA7,0x85F8, +0x85F9,0xC1FC,0xDFCB,0xDFCC,0x85FA,0xDFD0,0x85FB,0x85FC, +0x85FD,0x85FE,0x8640,0xDFDB,0xDFE5,0x8641,0xDFD7,0xDFD6, +0xD7C9,0xDFE3,0xDFE4,0xE5EB,0xD2A7,0xDFD2,0x8642,0xBFA9, +0x8643,0xD4DB,0x8644,0xBFC8,0xDFD4,0x8645,0x8646,0x8647, +0xCFCC,0x8648,0x8649,0xDFDD,0x864A,0xD1CA,0x864B,0xDFDE, +0xB0A7,0xC6B7,0xDFD3,0x864C,0xBAE5,0x864D,0xB6DF,0xCDDB, +0xB9FE,0xD4D5,0x864E,0x864F,0xDFDF,0xCFEC,0xB0A5,0xDFE7, +0xDFD1,0xD1C6,0xDFD5,0xDFD8,0xDFD9,0xDFDC,0x8650,0xBBA9, +0x8651,0xDFE0,0xDFE1,0x8652,0xDFE2,0xDFE6,0xDFE8,0xD3B4, +0x8653,0x8654,0x8655,0x8656,0x8657,0xB8E7,0xC5B6,0xDFEA, +0xC9DA,0xC1A8,0xC4C4,0x8658,0x8659,0xBFDE,0xCFF8,0x865A, +0x865B,0x865C,0xD5DC,0xDFEE,0x865D,0x865E,0x865F,0x8660, +0x8661,0x8662,0xB2B8,0x8663,0xBADF,0xDFEC,0x8664,0xDBC1, +0x8665,0xD1E4,0x8666,0x8667,0x8668,0x8669,0xCBF4,0xB4BD, +0x866A,0xB0A6,0x866B,0x866C,0x866D,0x866E,0x866F,0xDFF1, +0xCCC6,0xDFF2,0x8670,0x8671,0xDFED,0x8672,0x8673,0x8674, +0x8675,0x8676,0x8677,0xDFE9,0x8678,0x8679,0x867A,0x867B, +0xDFEB,0x867C,0xDFEF,0xDFF0,0xBBBD,0x867D,0x867E,0xDFF3, +0x8680,0x8681,0xDFF4,0x8682,0xBBA3,0x8683,0xCADB,0xCEA8, +0xE0A7,0xB3AA,0x8684,0xE0A6,0x8685,0x8686,0x8687,0xE0A1, +0x8688,0x8689,0x868A,0x868B,0xDFFE,0x868C,0xCDD9,0xDFFC, +0x868D,0xDFFA,0x868E,0xBFD0,0xD7C4,0x868F,0xC9CC,0x8690, +0x8691,0xDFF8,0xB0A1,0x8692,0x8693,0x8694,0x8695,0x8696, +0xDFFD,0x8697,0x8698,0x8699,0x869A,0xDFFB,0xE0A2,0x869B, +0x869C,0x869D,0x869E,0x869F,0xE0A8,0x86A0,0x86A1,0x86A2, +0x86A3,0xB7C8,0x86A4,0x86A5,0xC6A1,0xC9B6,0xC0B2,0xDFF5, +0x86A6,0x86A7,0xC5BE,0x86A8,0xD8C4,0xDFF9,0xC4F6,0x86A9, +0x86AA,0x86AB,0x86AC,0x86AD,0x86AE,0xE0A3,0xE0A4,0xE0A5, +0xD0A5,0x86AF,0x86B0,0xE0B4,0xCCE4,0x86B1,0xE0B1,0x86B2, +0xBFA6,0xE0AF,0xCEB9,0xE0AB,0xC9C6,0x86B3,0x86B4,0xC0AE, +0xE0AE,0xBAED,0xBAB0,0xE0A9,0x86B5,0x86B6,0x86B7,0xDFF6, +0x86B8,0xE0B3,0x86B9,0x86BA,0xE0B8,0x86BB,0x86BC,0x86BD, +0xB4AD,0xE0B9,0x86BE,0x86BF,0xCFB2,0xBAC8,0x86C0,0xE0B0, +0x86C1,0x86C2,0x86C3,0x86C4,0x86C5,0x86C6,0x86C7,0xD0FA, +0x86C8,0x86C9,0x86CA,0x86CB,0x86CC,0x86CD,0x86CE,0x86CF, +0x86D0,0xE0AC,0x86D1,0xD4FB,0x86D2,0xDFF7,0x86D3,0xC5E7, +0x86D4,0xE0AD,0x86D5,0xD3F7,0x86D6,0xE0B6,0xE0B7,0x86D7, +0x86D8,0x86D9,0x86DA,0x86DB,0xE0C4,0xD0E1,0x86DC,0x86DD, +0x86DE,0xE0BC,0x86DF,0x86E0,0xE0C9,0xE0CA,0x86E1,0x86E2, +0x86E3,0xE0BE,0xE0AA,0xC9A4,0xE0C1,0x86E4,0xE0B2,0x86E5, +0x86E6,0x86E7,0x86E8,0x86E9,0xCAC8,0xE0C3,0x86EA,0xE0B5, +0x86EB,0xCECB,0x86EC,0xCBC3,0xE0CD,0xE0C6,0xE0C2,0x86ED, +0xE0CB,0x86EE,0xE0BA,0xE0BF,0xE0C0,0x86EF,0x86F0,0xE0C5, +0x86F1,0x86F2,0xE0C7,0xE0C8,0x86F3,0xE0CC,0x86F4,0xE0BB, +0x86F5,0x86F6,0x86F7,0x86F8,0x86F9,0xCBD4,0xE0D5,0x86FA, +0xE0D6,0xE0D2,0x86FB,0x86FC,0x86FD,0x86FE,0x8740,0x8741, +0xE0D0,0xBCCE,0x8742,0x8743,0xE0D1,0x8744,0xB8C2,0xD8C5, +0x8745,0x8746,0x8747,0x8748,0x8749,0x874A,0x874B,0x874C, +0xD0EA,0x874D,0x874E,0xC2EF,0x874F,0x8750,0xE0CF,0xE0BD, +0x8751,0x8752,0x8753,0xE0D4,0xE0D3,0x8754,0x8755,0xE0D7, +0x8756,0x8757,0x8758,0x8759,0xE0DC,0xE0D8,0x875A,0x875B, +0x875C,0xD6F6,0xB3B0,0x875D,0xD7EC,0x875E,0xCBBB,0x875F, +0x8760,0xE0DA,0x8761,0xCEFB,0x8762,0x8763,0x8764,0xBAD9, +0x8765,0x8766,0x8767,0x8768,0x8769,0x876A,0x876B,0x876C, +0x876D,0x876E,0x876F,0x8770,0xE0E1,0xE0DD,0xD2AD,0x8771, +0x8772,0x8773,0x8774,0x8775,0xE0E2,0x8776,0x8777,0xE0DB, +0xE0D9,0xE0DF,0x8778,0x8779,0xE0E0,0x877A,0x877B,0x877C, +0x877D,0x877E,0xE0DE,0x8780,0xE0E4,0x8781,0x8782,0x8783, +0xC6F7,0xD8AC,0xD4EB,0xE0E6,0xCAC9,0x8784,0x8785,0x8786, +0x8787,0xE0E5,0x8788,0x8789,0x878A,0x878B,0xB8C1,0x878C, +0x878D,0x878E,0x878F,0xE0E7,0xE0E8,0x8790,0x8791,0x8792, +0x8793,0x8794,0x8795,0x8796,0x8797,0xE0E9,0xE0E3,0x8798, +0x8799,0x879A,0x879B,0x879C,0x879D,0x879E,0xBABF,0xCCE7, +0x879F,0x87A0,0x87A1,0xE0EA,0x87A2,0x87A3,0x87A4,0x87A5, +0x87A6,0x87A7,0x87A8,0x87A9,0x87AA,0x87AB,0x87AC,0x87AD, +0x87AE,0x87AF,0x87B0,0xCFF9,0x87B1,0x87B2,0x87B3,0x87B4, +0x87B5,0x87B6,0x87B7,0x87B8,0x87B9,0x87BA,0x87BB,0xE0EB, +0x87BC,0x87BD,0x87BE,0x87BF,0x87C0,0x87C1,0x87C2,0xC8C2, +0x87C3,0x87C4,0x87C5,0x87C6,0xBDC0,0x87C7,0x87C8,0x87C9, +0x87CA,0x87CB,0x87CC,0x87CD,0x87CE,0x87CF,0x87D0,0x87D1, +0x87D2,0x87D3,0xC4D2,0x87D4,0x87D5,0x87D6,0x87D7,0x87D8, +0x87D9,0x87DA,0x87DB,0x87DC,0xE0EC,0x87DD,0x87DE,0xE0ED, +0x87DF,0x87E0,0xC7F4,0xCBC4,0x87E1,0xE0EE,0xBBD8,0xD8B6, +0xD2F2,0xE0EF,0xCDC5,0x87E2,0xB6DA,0x87E3,0x87E4,0x87E5, +0x87E6,0x87E7,0x87E8,0xE0F1,0x87E9,0xD4B0,0x87EA,0x87EB, +0xC0A7,0xB4D1,0x87EC,0x87ED,0xCEA7,0xE0F0,0x87EE,0x87EF, +0x87F0,0xE0F2,0xB9CC,0x87F1,0x87F2,0xB9FA,0xCDBC,0xE0F3, +0x87F3,0x87F4,0x87F5,0xC6D4,0xE0F4,0x87F6,0xD4B2,0x87F7, +0xC8A6,0xE0F6,0xE0F5,0x87F8,0x87F9,0x87FA,0x87FB,0x87FC, +0x87FD,0x87FE,0x8840,0x8841,0x8842,0x8843,0x8844,0x8845, +0x8846,0x8847,0x8848,0x8849,0xE0F7,0x884A,0x884B,0xCDC1, +0x884C,0x884D,0x884E,0xCAA5,0x884F,0x8850,0x8851,0x8852, +0xD4DA,0xDBD7,0xDBD9,0x8853,0xDBD8,0xB9E7,0xDBDC,0xDBDD, +0xB5D8,0x8854,0x8855,0xDBDA,0x8856,0x8857,0x8858,0x8859, +0x885A,0xDBDB,0xB3A1,0xDBDF,0x885B,0x885C,0xBBF8,0x885D, +0xD6B7,0x885E,0xDBE0,0x885F,0x8860,0x8861,0x8862,0xBEF9, +0x8863,0x8864,0xB7BB,0x8865,0xDBD0,0xCCAE,0xBFB2,0xBBB5, +0xD7F8,0xBFD3,0x8866,0x8867,0x8868,0x8869,0x886A,0xBFE9, +0x886B,0x886C,0xBCE1,0xCCB3,0xDBDE,0xB0D3,0xCEEB,0xB7D8, +0xD7B9,0xC6C2,0x886D,0x886E,0xC0A4,0x886F,0xCCB9,0x8870, +0xDBE7,0xDBE1,0xC6BA,0xDBE3,0x8871,0xDBE8,0x8872,0xC5F7, +0x8873,0x8874,0x8875,0xDBEA,0x8876,0x8877,0xDBE9,0xBFC0, +0x8878,0x8879,0x887A,0xDBE6,0xDBE5,0x887B,0x887C,0x887D, +0x887E,0x8880,0xB4B9,0xC0AC,0xC2A2,0xDBE2,0xDBE4,0x8881, +0x8882,0x8883,0x8884,0xD0CD,0xDBED,0x8885,0x8886,0x8887, +0x8888,0x8889,0xC0DD,0xDBF2,0x888A,0x888B,0x888C,0x888D, +0x888E,0x888F,0x8890,0xB6E2,0x8891,0x8892,0x8893,0x8894, +0xDBF3,0xDBD2,0xB9B8,0xD4AB,0xDBEC,0x8895,0xBFD1,0xDBF0, +0x8896,0xDBD1,0x8897,0xB5E6,0x8898,0xDBEB,0xBFE5,0x8899, +0x889A,0x889B,0xDBEE,0x889C,0xDBF1,0x889D,0x889E,0x889F, +0xDBF9,0x88A0,0x88A1,0x88A2,0x88A3,0x88A4,0x88A5,0x88A6, +0x88A7,0x88A8,0xB9A1,0xB0A3,0x88A9,0x88AA,0x88AB,0x88AC, +0x88AD,0x88AE,0x88AF,0xC2F1,0x88B0,0x88B1,0xB3C7,0xDBEF, +0x88B2,0x88B3,0xDBF8,0x88B4,0xC6D2,0xDBF4,0x88B5,0x88B6, +0xDBF5,0xDBF7,0xDBF6,0x88B7,0x88B8,0xDBFE,0x88B9,0xD3F2, +0xB2BA,0x88BA,0x88BB,0x88BC,0xDBFD,0x88BD,0x88BE,0x88BF, +0x88C0,0x88C1,0x88C2,0x88C3,0x88C4,0xDCA4,0x88C5,0xDBFB, +0x88C6,0x88C7,0x88C8,0x88C9,0xDBFA,0x88CA,0x88CB,0x88CC, +0xDBFC,0xC5E0,0xBBF9,0x88CD,0x88CE,0xDCA3,0x88CF,0x88D0, +0xDCA5,0x88D1,0xCCC3,0x88D2,0x88D3,0x88D4,0xB6D1,0xDDC0, +0x88D5,0x88D6,0x88D7,0xDCA1,0x88D8,0xDCA2,0x88D9,0x88DA, +0x88DB,0xC7B5,0x88DC,0x88DD,0x88DE,0xB6E9,0x88DF,0x88E0, +0x88E1,0xDCA7,0x88E2,0x88E3,0x88E4,0x88E5,0xDCA6,0x88E6, +0xDCA9,0xB1A4,0x88E7,0x88E8,0xB5CC,0x88E9,0x88EA,0x88EB, +0x88EC,0x88ED,0xBFB0,0x88EE,0x88EF,0x88F0,0x88F1,0x88F2, +0xD1DF,0x88F3,0x88F4,0x88F5,0x88F6,0xB6C2,0x88F7,0x88F8, +0x88F9,0x88FA,0x88FB,0x88FC,0x88FD,0x88FE,0x8940,0x8941, +0x8942,0x8943,0x8944,0x8945,0xDCA8,0x8946,0x8947,0x8948, +0x8949,0x894A,0x894B,0x894C,0xCBFA,0xEBF3,0x894D,0x894E, +0x894F,0xCBDC,0x8950,0x8951,0xCBFE,0x8952,0x8953,0x8954, +0xCCC1,0x8955,0x8956,0x8957,0x8958,0x8959,0xC8FB,0x895A, +0x895B,0x895C,0x895D,0x895E,0x895F,0xDCAA,0x8960,0x8961, +0x8962,0x8963,0x8964,0xCCEE,0xDCAB,0x8965,0x8966,0x8967, +0x8968,0x8969,0x896A,0x896B,0x896C,0x896D,0x896E,0x896F, +0x8970,0x8971,0x8972,0x8973,0x8974,0x8975,0xDBD3,0x8976, +0xDCAF,0xDCAC,0x8977,0xBEB3,0x8978,0xCAFB,0x8979,0x897A, +0x897B,0xDCAD,0x897C,0x897D,0x897E,0x8980,0x8981,0x8982, +0x8983,0x8984,0xC9CA,0xC4B9,0x8985,0x8986,0x8987,0x8988, +0x8989,0xC7BD,0xDCAE,0x898A,0x898B,0x898C,0xD4F6,0xD0E6, +0x898D,0x898E,0x898F,0x8990,0x8991,0x8992,0x8993,0x8994, +0xC4AB,0xB6D5,0x8995,0x8996,0x8997,0x8998,0x8999,0x899A, +0x899B,0x899C,0x899D,0x899E,0x899F,0x89A0,0x89A1,0x89A2, +0x89A3,0x89A4,0x89A5,0x89A6,0xDBD4,0x89A7,0x89A8,0x89A9, +0x89AA,0xB1DA,0x89AB,0x89AC,0x89AD,0xDBD5,0x89AE,0x89AF, +0x89B0,0x89B1,0x89B2,0x89B3,0x89B4,0x89B5,0x89B6,0x89B7, +0x89B8,0xDBD6,0x89B9,0x89BA,0x89BB,0xBABE,0x89BC,0x89BD, +0x89BE,0x89BF,0x89C0,0x89C1,0x89C2,0x89C3,0x89C4,0x89C5, +0x89C6,0x89C7,0x89C8,0x89C9,0xC8C0,0x89CA,0x89CB,0x89CC, +0x89CD,0x89CE,0x89CF,0xCABF,0xC8C9,0x89D0,0xD7B3,0x89D1, +0xC9F9,0x89D2,0x89D3,0xBFC7,0x89D4,0x89D5,0xBAF8,0x89D6, +0x89D7,0xD2BC,0x89D8,0x89D9,0x89DA,0x89DB,0x89DC,0x89DD, +0x89DE,0x89DF,0xE2BA,0x89E0,0xB4A6,0x89E1,0x89E2,0xB1B8, +0x89E3,0x89E4,0x89E5,0x89E6,0x89E7,0xB8B4,0x89E8,0xCFC4, +0x89E9,0x89EA,0x89EB,0x89EC,0xD9E7,0xCFA6,0xCDE2,0x89ED, +0x89EE,0xD9ED,0xB6E0,0x89EF,0xD2B9,0x89F0,0x89F1,0xB9BB, +0x89F2,0x89F3,0x89F4,0x89F5,0xE2B9,0xE2B7,0x89F6,0xB4F3, +0x89F7,0xCCEC,0xCCAB,0xB7F2,0x89F8,0xD8B2,0xD1EB,0xBABB, +0x89F9,0xCAA7,0x89FA,0x89FB,0xCDB7,0x89FC,0x89FD,0xD2C4, +0xBFE4,0xBCD0,0xB6E1,0x89FE,0xDEC5,0x8A40,0x8A41,0x8A42, +0x8A43,0xDEC6,0xDBBC,0x8A44,0xD1D9,0x8A45,0x8A46,0xC6E6, +0xC4CE,0xB7EE,0x8A47,0xB7DC,0x8A48,0x8A49,0xBFFC,0xD7E0, +0x8A4A,0xC6F5,0x8A4B,0x8A4C,0xB1BC,0xDEC8,0xBDB1,0xCCD7, +0xDECA,0x8A4D,0xDEC9,0x8A4E,0x8A4F,0x8A50,0x8A51,0x8A52, +0xB5EC,0x8A53,0xC9DD,0x8A54,0x8A55,0xB0C2,0x8A56,0x8A57, +0x8A58,0x8A59,0x8A5A,0x8A5B,0x8A5C,0x8A5D,0x8A5E,0x8A5F, +0x8A60,0x8A61,0x8A62,0xC5AE,0xC5AB,0x8A63,0xC4CC,0x8A64, +0xBCE9,0xCBFD,0x8A65,0x8A66,0x8A67,0xBAC3,0x8A68,0x8A69, +0x8A6A,0xE5F9,0xC8E7,0xE5FA,0xCDFD,0x8A6B,0xD7B1,0xB8BE, +0xC2E8,0x8A6C,0xC8D1,0x8A6D,0x8A6E,0xE5FB,0x8A6F,0x8A70, +0x8A71,0x8A72,0xB6CA,0xBCCB,0x8A73,0x8A74,0xD1FD,0xE6A1, +0x8A75,0xC3EE,0x8A76,0x8A77,0x8A78,0x8A79,0xE6A4,0x8A7A, +0x8A7B,0x8A7C,0x8A7D,0xE5FE,0xE6A5,0xCDD7,0x8A7E,0x8A80, +0xB7C1,0xE5FC,0xE5FD,0xE6A3,0x8A81,0x8A82,0xC4DD,0xE6A8, +0x8A83,0x8A84,0xE6A7,0x8A85,0x8A86,0x8A87,0x8A88,0x8A89, +0x8A8A,0xC3C3,0x8A8B,0xC6DE,0x8A8C,0x8A8D,0xE6AA,0x8A8E, +0x8A8F,0x8A90,0x8A91,0x8A92,0x8A93,0x8A94,0xC4B7,0x8A95, +0x8A96,0x8A97,0xE6A2,0xCABC,0x8A98,0x8A99,0x8A9A,0x8A9B, +0xBDE3,0xB9C3,0xE6A6,0xD0D5,0xCEAF,0x8A9C,0x8A9D,0xE6A9, +0xE6B0,0x8A9E,0xD2A6,0x8A9F,0xBDAA,0xE6AD,0x8AA0,0x8AA1, +0x8AA2,0x8AA3,0x8AA4,0xE6AF,0x8AA5,0xC0D1,0x8AA6,0x8AA7, +0xD2CC,0x8AA8,0x8AA9,0x8AAA,0xBCA7,0x8AAB,0x8AAC,0x8AAD, +0x8AAE,0x8AAF,0x8AB0,0x8AB1,0x8AB2,0x8AB3,0x8AB4,0x8AB5, +0x8AB6,0xE6B1,0x8AB7,0xD2F6,0x8AB8,0x8AB9,0x8ABA,0xD7CB, +0x8ABB,0xCDFE,0x8ABC,0xCDDE,0xC2A6,0xE6AB,0xE6AC,0xBDBF, +0xE6AE,0xE6B3,0x8ABD,0x8ABE,0xE6B2,0x8ABF,0x8AC0,0x8AC1, +0x8AC2,0xE6B6,0x8AC3,0xE6B8,0x8AC4,0x8AC5,0x8AC6,0x8AC7, +0xC4EF,0x8AC8,0x8AC9,0x8ACA,0xC4C8,0x8ACB,0x8ACC,0xBEEA, +0xC9EF,0x8ACD,0x8ACE,0xE6B7,0x8ACF,0xB6F0,0x8AD0,0x8AD1, +0x8AD2,0xC3E4,0x8AD3,0x8AD4,0x8AD5,0x8AD6,0x8AD7,0x8AD8, +0x8AD9,0xD3E9,0xE6B4,0x8ADA,0xE6B5,0x8ADB,0xC8A2,0x8ADC, +0x8ADD,0x8ADE,0x8ADF,0x8AE0,0xE6BD,0x8AE1,0x8AE2,0x8AE3, +0xE6B9,0x8AE4,0x8AE5,0x8AE6,0x8AE7,0x8AE8,0xC6C5,0x8AE9, +0x8AEA,0xCDF1,0xE6BB,0x8AEB,0x8AEC,0x8AED,0x8AEE,0x8AEF, +0x8AF0,0x8AF1,0x8AF2,0x8AF3,0x8AF4,0xE6BC,0x8AF5,0x8AF6, +0x8AF7,0x8AF8,0xBBE9,0x8AF9,0x8AFA,0x8AFB,0x8AFC,0x8AFD, +0x8AFE,0x8B40,0xE6BE,0x8B41,0x8B42,0x8B43,0x8B44,0xE6BA, +0x8B45,0x8B46,0xC0B7,0x8B47,0x8B48,0x8B49,0x8B4A,0x8B4B, +0x8B4C,0x8B4D,0x8B4E,0x8B4F,0xD3A4,0xE6BF,0xC9F4,0xE6C3, +0x8B50,0x8B51,0xE6C4,0x8B52,0x8B53,0x8B54,0x8B55,0xD0F6, +0x8B56,0x8B57,0x8B58,0x8B59,0x8B5A,0x8B5B,0x8B5C,0x8B5D, +0x8B5E,0x8B5F,0x8B60,0x8B61,0x8B62,0x8B63,0x8B64,0x8B65, +0x8B66,0x8B67,0xC3BD,0x8B68,0x8B69,0x8B6A,0x8B6B,0x8B6C, +0x8B6D,0x8B6E,0xC3C4,0xE6C2,0x8B6F,0x8B70,0x8B71,0x8B72, +0x8B73,0x8B74,0x8B75,0x8B76,0x8B77,0x8B78,0x8B79,0x8B7A, +0x8B7B,0x8B7C,0xE6C1,0x8B7D,0x8B7E,0x8B80,0x8B81,0x8B82, +0x8B83,0x8B84,0xE6C7,0xCFB1,0x8B85,0xEBF4,0x8B86,0x8B87, +0xE6CA,0x8B88,0x8B89,0x8B8A,0x8B8B,0x8B8C,0xE6C5,0x8B8D, +0x8B8E,0xBCDE,0xC9A9,0x8B8F,0x8B90,0x8B91,0x8B92,0x8B93, +0x8B94,0xBCB5,0x8B95,0x8B96,0xCFD3,0x8B97,0x8B98,0x8B99, +0x8B9A,0x8B9B,0xE6C8,0x8B9C,0xE6C9,0x8B9D,0xE6CE,0x8B9E, +0xE6D0,0x8B9F,0x8BA0,0x8BA1,0xE6D1,0x8BA2,0x8BA3,0x8BA4, +0xE6CB,0xB5D5,0x8BA5,0xE6CC,0x8BA6,0x8BA7,0xE6CF,0x8BA8, +0x8BA9,0xC4DB,0x8BAA,0xE6C6,0x8BAB,0x8BAC,0x8BAD,0x8BAE, +0x8BAF,0xE6CD,0x8BB0,0x8BB1,0x8BB2,0x8BB3,0x8BB4,0x8BB5, +0x8BB6,0x8BB7,0x8BB8,0x8BB9,0x8BBA,0x8BBB,0x8BBC,0x8BBD, +0x8BBE,0x8BBF,0x8BC0,0x8BC1,0x8BC2,0x8BC3,0x8BC4,0x8BC5, +0x8BC6,0xE6D2,0x8BC7,0x8BC8,0x8BC9,0x8BCA,0x8BCB,0x8BCC, +0x8BCD,0x8BCE,0x8BCF,0x8BD0,0x8BD1,0x8BD2,0xE6D4,0xE6D3, +0x8BD3,0x8BD4,0x8BD5,0x8BD6,0x8BD7,0x8BD8,0x8BD9,0x8BDA, +0x8BDB,0x8BDC,0x8BDD,0x8BDE,0x8BDF,0x8BE0,0x8BE1,0x8BE2, +0x8BE3,0x8BE4,0x8BE5,0x8BE6,0x8BE7,0x8BE8,0x8BE9,0x8BEA, +0x8BEB,0x8BEC,0xE6D5,0x8BED,0xD9F8,0x8BEE,0x8BEF,0xE6D6, +0x8BF0,0x8BF1,0x8BF2,0x8BF3,0x8BF4,0x8BF5,0x8BF6,0x8BF7, +0xE6D7,0x8BF8,0x8BF9,0x8BFA,0x8BFB,0x8BFC,0x8BFD,0x8BFE, +0x8C40,0x8C41,0x8C42,0x8C43,0x8C44,0x8C45,0x8C46,0x8C47, +0xD7D3,0xE6DD,0x8C48,0xE6DE,0xBFD7,0xD4D0,0x8C49,0xD7D6, +0xB4E6,0xCBEF,0xE6DA,0xD8C3,0xD7CE,0xD0A2,0x8C4A,0xC3CF, +0x8C4B,0x8C4C,0xE6DF,0xBCBE,0xB9C2,0xE6DB,0xD1A7,0x8C4D, +0x8C4E,0xBAA2,0xC2CF,0x8C4F,0xD8AB,0x8C50,0x8C51,0x8C52, +0xCAEB,0xE5EE,0x8C53,0xE6DC,0x8C54,0xB7F5,0x8C55,0x8C56, +0x8C57,0x8C58,0xC8E6,0x8C59,0x8C5A,0xC4F5,0x8C5B,0x8C5C, +0xE5B2,0xC4FE,0x8C5D,0xCBFC,0xE5B3,0xD5AC,0x8C5E,0xD3EE, +0xCAD8,0xB0B2,0x8C5F,0xCBCE,0xCDEA,0x8C60,0x8C61,0xBAEA, +0x8C62,0x8C63,0x8C64,0xE5B5,0x8C65,0xE5B4,0x8C66,0xD7DA, +0xB9D9,0xD6E6,0xB6A8,0xCDF0,0xD2CB,0xB1A6,0xCAB5,0x8C67, +0xB3E8,0xC9F3,0xBFCD,0xD0FB,0xCAD2,0xE5B6,0xBBC2,0x8C68, +0x8C69,0x8C6A,0xCFDC,0xB9AC,0x8C6B,0x8C6C,0x8C6D,0x8C6E, +0xD4D7,0x8C6F,0x8C70,0xBAA6,0xD1E7,0xCFFC,0xBCD2,0x8C71, +0xE5B7,0xC8DD,0x8C72,0x8C73,0x8C74,0xBFED,0xB1F6,0xCBDE, +0x8C75,0x8C76,0xBCC5,0x8C77,0xBCC4,0xD2FA,0xC3DC,0xBFDC, +0x8C78,0x8C79,0x8C7A,0x8C7B,0xB8BB,0x8C7C,0x8C7D,0x8C7E, +0xC3C2,0x8C80,0xBAAE,0xD4A2,0x8C81,0x8C82,0x8C83,0x8C84, +0x8C85,0x8C86,0x8C87,0x8C88,0x8C89,0xC7DE,0xC4AF,0xB2EC, +0x8C8A,0xB9D1,0x8C8B,0x8C8C,0xE5BB,0xC1C8,0x8C8D,0x8C8E, +0xD5AF,0x8C8F,0x8C90,0x8C91,0x8C92,0x8C93,0xE5BC,0x8C94, +0xE5BE,0x8C95,0x8C96,0x8C97,0x8C98,0x8C99,0x8C9A,0x8C9B, +0xB4E7,0xB6D4,0xCBC2,0xD1B0,0xB5BC,0x8C9C,0x8C9D,0xCAD9, +0x8C9E,0xB7E2,0x8C9F,0x8CA0,0xC9E4,0x8CA1,0xBDAB,0x8CA2, +0x8CA3,0xCEBE,0xD7F0,0x8CA4,0x8CA5,0x8CA6,0x8CA7,0xD0A1, +0x8CA8,0xC9D9,0x8CA9,0x8CAA,0xB6FB,0xE6D8,0xBCE2,0x8CAB, +0xB3BE,0x8CAC,0xC9D0,0x8CAD,0xE6D9,0xB3A2,0x8CAE,0x8CAF, +0x8CB0,0x8CB1,0xDECC,0x8CB2,0xD3C8,0xDECD,0x8CB3,0xD2A2, +0x8CB4,0x8CB5,0x8CB6,0x8CB7,0xDECE,0x8CB8,0x8CB9,0x8CBA, +0x8CBB,0xBECD,0x8CBC,0x8CBD,0xDECF,0x8CBE,0x8CBF,0x8CC0, +0xCAAC,0xD2FC,0xB3DF,0xE5EA,0xC4E1,0xBEA1,0xCEB2,0xC4F2, +0xBED6,0xC6A8,0xB2E3,0x8CC1,0x8CC2,0xBED3,0x8CC3,0x8CC4, +0xC7FC,0xCCEB,0xBDEC,0xCEDD,0x8CC5,0x8CC6,0xCABA,0xC6C1, +0xE5EC,0xD0BC,0x8CC7,0x8CC8,0x8CC9,0xD5B9,0x8CCA,0x8CCB, +0x8CCC,0xE5ED,0x8CCD,0x8CCE,0x8CCF,0x8CD0,0xCAF4,0x8CD1, +0xCDC0,0xC2C5,0x8CD2,0xE5EF,0x8CD3,0xC2C4,0xE5F0,0x8CD4, +0x8CD5,0x8CD6,0x8CD7,0x8CD8,0x8CD9,0x8CDA,0xE5F8,0xCDCD, +0x8CDB,0xC9BD,0x8CDC,0x8CDD,0x8CDE,0x8CDF,0x8CE0,0x8CE1, +0x8CE2,0xD2D9,0xE1A8,0x8CE3,0x8CE4,0x8CE5,0x8CE6,0xD3EC, +0x8CE7,0xCBEA,0xC6F1,0x8CE8,0x8CE9,0x8CEA,0x8CEB,0x8CEC, +0xE1AC,0x8CED,0x8CEE,0x8CEF,0xE1A7,0xE1A9,0x8CF0,0x8CF1, +0xE1AA,0xE1AF,0x8CF2,0x8CF3,0xB2ED,0x8CF4,0xE1AB,0xB8DA, +0xE1AD,0xE1AE,0xE1B0,0xB5BA,0xE1B1,0x8CF5,0x8CF6,0x8CF7, +0x8CF8,0x8CF9,0xE1B3,0xE1B8,0x8CFA,0x8CFB,0x8CFC,0x8CFD, +0x8CFE,0xD1D2,0x8D40,0xE1B6,0xE1B5,0xC1EB,0x8D41,0x8D42, +0x8D43,0xE1B7,0x8D44,0xD4C0,0x8D45,0xE1B2,0x8D46,0xE1BA, +0xB0B6,0x8D47,0x8D48,0x8D49,0x8D4A,0xE1B4,0x8D4B,0xBFF9, +0x8D4C,0xE1B9,0x8D4D,0x8D4E,0xE1BB,0x8D4F,0x8D50,0x8D51, +0x8D52,0x8D53,0x8D54,0xE1BE,0x8D55,0x8D56,0x8D57,0x8D58, +0x8D59,0x8D5A,0xE1BC,0x8D5B,0x8D5C,0x8D5D,0x8D5E,0x8D5F, +0x8D60,0xD6C5,0x8D61,0x8D62,0x8D63,0x8D64,0x8D65,0x8D66, +0x8D67,0xCFBF,0x8D68,0x8D69,0xE1BD,0xE1BF,0xC2CD,0x8D6A, +0xB6EB,0x8D6B,0xD3F8,0x8D6C,0x8D6D,0xC7CD,0x8D6E,0x8D6F, +0xB7E5,0x8D70,0x8D71,0x8D72,0x8D73,0x8D74,0x8D75,0x8D76, +0x8D77,0x8D78,0x8D79,0xBEFE,0x8D7A,0x8D7B,0x8D7C,0x8D7D, +0x8D7E,0x8D80,0xE1C0,0xE1C1,0x8D81,0x8D82,0xE1C7,0xB3E7, +0x8D83,0x8D84,0x8D85,0x8D86,0x8D87,0x8D88,0xC6E9,0x8D89, +0x8D8A,0x8D8B,0x8D8C,0x8D8D,0xB4DE,0x8D8E,0xD1C2,0x8D8F, +0x8D90,0x8D91,0x8D92,0xE1C8,0x8D93,0x8D94,0xE1C6,0x8D95, +0x8D96,0x8D97,0x8D98,0x8D99,0xE1C5,0x8D9A,0xE1C3,0xE1C2, +0x8D9B,0xB1C0,0x8D9C,0x8D9D,0x8D9E,0xD5B8,0xE1C4,0x8D9F, +0x8DA0,0x8DA1,0x8DA2,0x8DA3,0xE1CB,0x8DA4,0x8DA5,0x8DA6, +0x8DA7,0x8DA8,0x8DA9,0x8DAA,0x8DAB,0xE1CC,0xE1CA,0x8DAC, +0x8DAD,0x8DAE,0x8DAF,0x8DB0,0x8DB1,0x8DB2,0x8DB3,0xEFFA, +0x8DB4,0x8DB5,0xE1D3,0xE1D2,0xC7B6,0x8DB6,0x8DB7,0x8DB8, +0x8DB9,0x8DBA,0x8DBB,0x8DBC,0x8DBD,0x8DBE,0x8DBF,0x8DC0, +0xE1C9,0x8DC1,0x8DC2,0xE1CE,0x8DC3,0xE1D0,0x8DC4,0x8DC5, +0x8DC6,0x8DC7,0x8DC8,0x8DC9,0x8DCA,0x8DCB,0x8DCC,0x8DCD, +0x8DCE,0xE1D4,0x8DCF,0xE1D1,0xE1CD,0x8DD0,0x8DD1,0xE1CF, +0x8DD2,0x8DD3,0x8DD4,0x8DD5,0xE1D5,0x8DD6,0x8DD7,0x8DD8, +0x8DD9,0x8DDA,0x8DDB,0x8DDC,0x8DDD,0x8DDE,0x8DDF,0x8DE0, +0x8DE1,0x8DE2,0xE1D6,0x8DE3,0x8DE4,0x8DE5,0x8DE6,0x8DE7, +0x8DE8,0x8DE9,0x8DEA,0x8DEB,0x8DEC,0x8DED,0x8DEE,0x8DEF, +0x8DF0,0x8DF1,0x8DF2,0x8DF3,0x8DF4,0x8DF5,0x8DF6,0x8DF7, +0x8DF8,0xE1D7,0x8DF9,0x8DFA,0x8DFB,0xE1D8,0x8DFC,0x8DFD, +0x8DFE,0x8E40,0x8E41,0x8E42,0x8E43,0x8E44,0x8E45,0x8E46, +0x8E47,0x8E48,0x8E49,0x8E4A,0x8E4B,0x8E4C,0x8E4D,0x8E4E, +0x8E4F,0x8E50,0x8E51,0x8E52,0x8E53,0x8E54,0x8E55,0xE1DA, +0x8E56,0x8E57,0x8E58,0x8E59,0x8E5A,0x8E5B,0x8E5C,0x8E5D, +0x8E5E,0x8E5F,0x8E60,0x8E61,0x8E62,0xE1DB,0x8E63,0x8E64, +0x8E65,0x8E66,0x8E67,0x8E68,0x8E69,0xCEA1,0x8E6A,0x8E6B, +0x8E6C,0x8E6D,0x8E6E,0x8E6F,0x8E70,0x8E71,0x8E72,0x8E73, +0x8E74,0x8E75,0x8E76,0xE7DD,0x8E77,0xB4A8,0xD6DD,0x8E78, +0x8E79,0xD1B2,0xB3B2,0x8E7A,0x8E7B,0xB9A4,0xD7F3,0xC7C9, +0xBEDE,0xB9AE,0x8E7C,0xCED7,0x8E7D,0x8E7E,0xB2EE,0xDBCF, +0x8E80,0xBCBA,0xD2D1,0xCBC8,0xB0CD,0x8E81,0x8E82,0xCFEF, +0x8E83,0x8E84,0x8E85,0x8E86,0x8E87,0xD9E3,0xBDED,0x8E88, +0x8E89,0xB1D2,0xCAD0,0xB2BC,0x8E8A,0xCBA7,0xB7AB,0x8E8B, +0xCAA6,0x8E8C,0x8E8D,0x8E8E,0xCFA3,0x8E8F,0x8E90,0xE0F8, +0xD5CA,0xE0FB,0x8E91,0x8E92,0xE0FA,0xC5C1,0xCCFB,0x8E93, +0xC1B1,0xE0F9,0xD6E3,0xB2AF,0xD6C4,0xB5DB,0x8E94,0x8E95, +0x8E96,0x8E97,0x8E98,0x8E99,0x8E9A,0x8E9B,0xB4F8,0xD6A1, +0x8E9C,0x8E9D,0x8E9E,0x8E9F,0x8EA0,0xCFAF,0xB0EF,0x8EA1, +0x8EA2,0xE0FC,0x8EA3,0x8EA4,0x8EA5,0x8EA6,0x8EA7,0xE1A1, +0xB3A3,0x8EA8,0x8EA9,0xE0FD,0xE0FE,0xC3B1,0x8EAA,0x8EAB, +0x8EAC,0x8EAD,0xC3DD,0x8EAE,0xE1A2,0xB7F9,0x8EAF,0x8EB0, +0x8EB1,0x8EB2,0x8EB3,0x8EB4,0xBBCF,0x8EB5,0x8EB6,0x8EB7, +0x8EB8,0x8EB9,0x8EBA,0x8EBB,0xE1A3,0xC4BB,0x8EBC,0x8EBD, +0x8EBE,0x8EBF,0x8EC0,0xE1A4,0x8EC1,0x8EC2,0xE1A5,0x8EC3, +0x8EC4,0xE1A6,0xB4B1,0x8EC5,0x8EC6,0x8EC7,0x8EC8,0x8EC9, +0x8ECA,0x8ECB,0x8ECC,0x8ECD,0x8ECE,0x8ECF,0x8ED0,0x8ED1, +0x8ED2,0x8ED3,0xB8C9,0xC6BD,0xC4EA,0x8ED4,0xB2A2,0x8ED5, +0xD0D2,0x8ED6,0xE7DB,0xBBC3,0xD3D7,0xD3C4,0x8ED7,0xB9E3, +0xE2CF,0x8ED8,0x8ED9,0x8EDA,0xD7AF,0x8EDB,0xC7EC,0xB1D3, +0x8EDC,0x8EDD,0xB4B2,0xE2D1,0x8EDE,0x8EDF,0x8EE0,0xD0F2, +0xC2AE,0xE2D0,0x8EE1,0xBFE2,0xD3A6,0xB5D7,0xE2D2,0xB5EA, +0x8EE2,0xC3ED,0xB8FD,0x8EE3,0xB8AE,0x8EE4,0xC5D3,0xB7CF, +0xE2D4,0x8EE5,0x8EE6,0x8EE7,0x8EE8,0xE2D3,0xB6C8,0xD7F9, +0x8EE9,0x8EEA,0x8EEB,0x8EEC,0x8EED,0xCDA5,0x8EEE,0x8EEF, +0x8EF0,0x8EF1,0x8EF2,0xE2D8,0x8EF3,0xE2D6,0xCAFC,0xBFB5, +0xD3B9,0xE2D5,0x8EF4,0x8EF5,0x8EF6,0x8EF7,0xE2D7,0x8EF8, +0x8EF9,0x8EFA,0x8EFB,0x8EFC,0x8EFD,0x8EFE,0x8F40,0x8F41, +0x8F42,0xC1AE,0xC0C8,0x8F43,0x8F44,0x8F45,0x8F46,0x8F47, +0x8F48,0xE2DB,0xE2DA,0xC0AA,0x8F49,0x8F4A,0xC1CE,0x8F4B, +0x8F4C,0x8F4D,0x8F4E,0xE2DC,0x8F4F,0x8F50,0x8F51,0x8F52, +0x8F53,0x8F54,0x8F55,0x8F56,0x8F57,0x8F58,0x8F59,0x8F5A, +0xE2DD,0x8F5B,0xE2DE,0x8F5C,0x8F5D,0x8F5E,0x8F5F,0x8F60, +0x8F61,0x8F62,0x8F63,0x8F64,0xDBC8,0x8F65,0xD1D3,0xCDA2, +0x8F66,0x8F67,0xBDA8,0x8F68,0x8F69,0x8F6A,0xDEC3,0xD8A5, +0xBFAA,0xDBCD,0xD2EC,0xC6FA,0xC5AA,0x8F6B,0x8F6C,0x8F6D, +0xDEC4,0x8F6E,0xB1D7,0xDFAE,0x8F6F,0x8F70,0x8F71,0xCABD, +0x8F72,0xDFB1,0x8F73,0xB9AD,0x8F74,0xD2FD,0x8F75,0xB8A5, +0xBAEB,0x8F76,0x8F77,0xB3DA,0x8F78,0x8F79,0x8F7A,0xB5DC, +0xD5C5,0x8F7B,0x8F7C,0x8F7D,0x8F7E,0xC3D6,0xCFD2,0xBBA1, +0x8F80,0xE5F3,0xE5F2,0x8F81,0x8F82,0xE5F4,0x8F83,0xCDE4, +0x8F84,0xC8F5,0x8F85,0x8F86,0x8F87,0x8F88,0x8F89,0x8F8A, +0x8F8B,0xB5AF,0xC7BF,0x8F8C,0xE5F6,0x8F8D,0x8F8E,0x8F8F, +0xECB0,0x8F90,0x8F91,0x8F92,0x8F93,0x8F94,0x8F95,0x8F96, +0x8F97,0x8F98,0x8F99,0x8F9A,0x8F9B,0x8F9C,0x8F9D,0x8F9E, +0xE5E6,0x8F9F,0xB9E9,0xB5B1,0x8FA0,0xC2BC,0xE5E8,0xE5E7, +0xE5E9,0x8FA1,0x8FA2,0x8FA3,0x8FA4,0xD2CD,0x8FA5,0x8FA6, +0x8FA7,0xE1EA,0xD0CE,0x8FA8,0xCDAE,0x8FA9,0xD1E5,0x8FAA, +0x8FAB,0xB2CA,0xB1EB,0x8FAC,0xB1F2,0xC5ED,0x8FAD,0x8FAE, +0xD5C3,0xD3B0,0x8FAF,0xE1DC,0x8FB0,0x8FB1,0x8FB2,0xE1DD, +0x8FB3,0xD2DB,0x8FB4,0xB3B9,0xB1CB,0x8FB5,0x8FB6,0x8FB7, +0xCDF9,0xD5F7,0xE1DE,0x8FB8,0xBEB6,0xB4FD,0x8FB9,0xE1DF, +0xBADC,0xE1E0,0xBBB2,0xC2C9,0xE1E1,0x8FBA,0x8FBB,0x8FBC, +0xD0EC,0x8FBD,0xCDBD,0x8FBE,0x8FBF,0xE1E2,0x8FC0,0xB5C3, +0xC5C7,0xE1E3,0x8FC1,0x8FC2,0xE1E4,0x8FC3,0x8FC4,0x8FC5, +0x8FC6,0xD3F9,0x8FC7,0x8FC8,0x8FC9,0x8FCA,0x8FCB,0x8FCC, +0xE1E5,0x8FCD,0xD1AD,0x8FCE,0x8FCF,0xE1E6,0xCEA2,0x8FD0, +0x8FD1,0x8FD2,0x8FD3,0x8FD4,0x8FD5,0xE1E7,0x8FD6,0xB5C2, +0x8FD7,0x8FD8,0x8FD9,0x8FDA,0xE1E8,0xBBD5,0x8FDB,0x8FDC, +0x8FDD,0x8FDE,0x8FDF,0xD0C4,0xE2E0,0xB1D8,0xD2E4,0x8FE0, +0x8FE1,0xE2E1,0x8FE2,0x8FE3,0xBCC9,0xC8CC,0x8FE4,0xE2E3, +0xECFE,0xECFD,0xDFAF,0x8FE5,0x8FE6,0x8FE7,0xE2E2,0xD6BE, +0xCDFC,0xC3A6,0x8FE8,0x8FE9,0x8FEA,0xE3C3,0x8FEB,0x8FEC, +0xD6D2,0xE2E7,0x8FED,0x8FEE,0xE2E8,0x8FEF,0x8FF0,0xD3C7, +0x8FF1,0x8FF2,0xE2EC,0xBFEC,0x8FF3,0xE2ED,0xE2E5,0x8FF4, +0x8FF5,0xB3C0,0x8FF6,0x8FF7,0x8FF8,0xC4EE,0x8FF9,0x8FFA, +0xE2EE,0x8FFB,0x8FFC,0xD0C3,0x8FFD,0xBAF6,0xE2E9,0xB7DE, +0xBBB3,0xCCAC,0xCBCB,0xE2E4,0xE2E6,0xE2EA,0xE2EB,0x8FFE, +0x9040,0x9041,0xE2F7,0x9042,0x9043,0xE2F4,0xD4F5,0xE2F3, +0x9044,0x9045,0xC5AD,0x9046,0xD5FA,0xC5C2,0xB2C0,0x9047, +0x9048,0xE2EF,0x9049,0xE2F2,0xC1AF,0xCBBC,0x904A,0x904B, +0xB5A1,0xE2F9,0x904C,0x904D,0x904E,0xBCB1,0xE2F1,0xD0D4, +0xD4B9,0xE2F5,0xB9D6,0xE2F6,0x904F,0x9050,0x9051,0xC7D3, +0x9052,0x9053,0x9054,0x9055,0x9056,0xE2F0,0x9057,0x9058, +0x9059,0x905A,0x905B,0xD7DC,0xEDA1,0x905C,0x905D,0xE2F8, +0x905E,0xEDA5,0xE2FE,0xCAD1,0x905F,0x9060,0x9061,0x9062, +0x9063,0x9064,0x9065,0xC1B5,0x9066,0xBBD0,0x9067,0x9068, +0xBFD6,0x9069,0xBAE3,0x906A,0x906B,0xCBA1,0x906C,0x906D, +0x906E,0xEDA6,0xEDA3,0x906F,0x9070,0xEDA2,0x9071,0x9072, +0x9073,0x9074,0xBBD6,0xEDA7,0xD0F4,0x9075,0x9076,0xEDA4, +0xBADE,0xB6F7,0xE3A1,0xB6B2,0xCCF1,0xB9A7,0x9077,0xCFA2, +0xC7A1,0x9078,0x9079,0xBFD2,0x907A,0x907B,0xB6F1,0x907C, +0xE2FA,0xE2FB,0xE2FD,0xE2FC,0xC4D5,0xE3A2,0x907D,0xD3C1, +0x907E,0x9080,0x9081,0xE3A7,0xC7C4,0x9082,0x9083,0x9084, +0x9085,0xCFA4,0x9086,0x9087,0xE3A9,0xBAB7,0x9088,0x9089, +0x908A,0x908B,0xE3A8,0x908C,0xBBDA,0x908D,0xE3A3,0x908E, +0x908F,0x9090,0xE3A4,0xE3AA,0x9091,0xE3A6,0x9092,0xCEF2, +0xD3C6,0x9093,0x9094,0xBBBC,0x9095,0x9096,0xD4C3,0x9097, +0xC4FA,0x9098,0x9099,0xEDA8,0xD0FC,0xE3A5,0x909A,0xC3F5, +0x909B,0xE3AD,0xB1AF,0x909C,0xE3B2,0x909D,0x909E,0x909F, +0xBCC2,0x90A0,0x90A1,0xE3AC,0xB5BF,0x90A2,0x90A3,0x90A4, +0x90A5,0x90A6,0x90A7,0x90A8,0x90A9,0xC7E9,0xE3B0,0x90AA, +0x90AB,0x90AC,0xBEAA,0xCDEF,0x90AD,0x90AE,0x90AF,0x90B0, +0x90B1,0xBBF3,0x90B2,0x90B3,0x90B4,0xCCE8,0x90B5,0x90B6, +0xE3AF,0x90B7,0xE3B1,0x90B8,0xCFA7,0xE3AE,0x90B9,0xCEA9, +0xBBDD,0x90BA,0x90BB,0x90BC,0x90BD,0x90BE,0xB5EB,0xBEE5, +0xB2D2,0xB3CD,0x90BF,0xB1B9,0xE3AB,0xB2D1,0xB5AC,0xB9DF, +0xB6E8,0x90C0,0x90C1,0xCFEB,0xE3B7,0x90C2,0xBBCC,0x90C3, +0x90C4,0xC8C7,0xD0CA,0x90C5,0x90C6,0x90C7,0x90C8,0x90C9, +0xE3B8,0xB3EE,0x90CA,0x90CB,0x90CC,0x90CD,0xEDA9,0x90CE, +0xD3FA,0xD3E4,0x90CF,0x90D0,0x90D1,0xEDAA,0xE3B9,0xD2E2, +0x90D2,0x90D3,0x90D4,0x90D5,0x90D6,0xE3B5,0x90D7,0x90D8, +0x90D9,0x90DA,0xD3DE,0x90DB,0x90DC,0x90DD,0x90DE,0xB8D0, +0xE3B3,0x90DF,0x90E0,0xE3B6,0xB7DF,0x90E1,0xE3B4,0xC0A2, +0x90E2,0x90E3,0x90E4,0xE3BA,0x90E5,0x90E6,0x90E7,0x90E8, +0x90E9,0x90EA,0x90EB,0x90EC,0x90ED,0x90EE,0x90EF,0x90F0, +0x90F1,0x90F2,0x90F3,0x90F4,0x90F5,0x90F6,0x90F7,0xD4B8, +0x90F8,0x90F9,0x90FA,0x90FB,0x90FC,0x90FD,0x90FE,0x9140, +0xB4C8,0x9141,0xE3BB,0x9142,0xBBC5,0x9143,0xC9F7,0x9144, +0x9145,0xC9E5,0x9146,0x9147,0x9148,0xC4BD,0x9149,0x914A, +0x914B,0x914C,0x914D,0x914E,0x914F,0xEDAB,0x9150,0x9151, +0x9152,0x9153,0xC2FD,0x9154,0x9155,0x9156,0x9157,0xBBDB, +0xBFAE,0x9158,0x9159,0x915A,0x915B,0x915C,0x915D,0x915E, +0xCEBF,0x915F,0x9160,0x9161,0x9162,0xE3BC,0x9163,0xBFB6, +0x9164,0x9165,0x9166,0x9167,0x9168,0x9169,0x916A,0x916B, +0x916C,0x916D,0x916E,0x916F,0x9170,0x9171,0x9172,0x9173, +0x9174,0x9175,0x9176,0xB1EF,0x9177,0x9178,0xD4F7,0x9179, +0x917A,0x917B,0x917C,0x917D,0xE3BE,0x917E,0x9180,0x9181, +0x9182,0x9183,0x9184,0x9185,0x9186,0xEDAD,0x9187,0x9188, +0x9189,0x918A,0x918B,0x918C,0x918D,0x918E,0x918F,0xE3BF, +0xBAA9,0xEDAC,0x9190,0x9191,0xE3BD,0x9192,0x9193,0x9194, +0x9195,0x9196,0x9197,0x9198,0x9199,0x919A,0x919B,0xE3C0, +0x919C,0x919D,0x919E,0x919F,0x91A0,0x91A1,0xBAB6,0x91A2, +0x91A3,0x91A4,0xB6AE,0x91A5,0x91A6,0x91A7,0x91A8,0x91A9, +0xD0B8,0x91AA,0xB0C3,0xEDAE,0x91AB,0x91AC,0x91AD,0x91AE, +0x91AF,0xEDAF,0xC0C1,0x91B0,0xE3C1,0x91B1,0x91B2,0x91B3, +0x91B4,0x91B5,0x91B6,0x91B7,0x91B8,0x91B9,0x91BA,0x91BB, +0x91BC,0x91BD,0x91BE,0x91BF,0x91C0,0x91C1,0xC5B3,0x91C2, +0x91C3,0x91C4,0x91C5,0x91C6,0x91C7,0x91C8,0x91C9,0x91CA, +0x91CB,0x91CC,0x91CD,0x91CE,0x91CF,0xE3C2,0x91D0,0x91D1, +0x91D2,0x91D3,0x91D4,0x91D5,0x91D6,0x91D7,0x91D8,0xDCB2, +0x91D9,0x91DA,0x91DB,0x91DC,0x91DD,0x91DE,0xEDB0,0x91DF, +0xB8EA,0x91E0,0xCEEC,0xEAA7,0xD0E7,0xCAF9,0xC8D6,0xCFB7, +0xB3C9,0xCED2,0xBDE4,0x91E1,0x91E2,0xE3DE,0xBBF2,0xEAA8, +0xD5BD,0x91E3,0xC6DD,0xEAA9,0x91E4,0x91E5,0x91E6,0xEAAA, +0x91E7,0xEAAC,0xEAAB,0x91E8,0xEAAE,0xEAAD,0x91E9,0x91EA, +0x91EB,0x91EC,0xBDD8,0x91ED,0xEAAF,0x91EE,0xC2BE,0x91EF, +0x91F0,0x91F1,0x91F2,0xB4C1,0xB4F7,0x91F3,0x91F4,0xBBA7, +0x91F5,0x91F6,0x91F7,0x91F8,0x91F9,0xECE6,0xECE5,0xB7BF, +0xCBF9,0xB1E2,0x91FA,0xECE7,0x91FB,0x91FC,0x91FD,0xC9C8, +0xECE8,0xECE9,0x91FE,0xCAD6,0xDED0,0xB2C5,0xD4FA,0x9240, +0x9241,0xC6CB,0xB0C7,0xB4F2,0xC8D3,0x9242,0x9243,0x9244, +0xCDD0,0x9245,0x9246,0xBFB8,0x9247,0x9248,0x9249,0x924A, +0x924B,0x924C,0x924D,0xBFDB,0x924E,0x924F,0xC7A4,0xD6B4, +0x9250,0xC0A9,0xDED1,0xC9A8,0xD1EF,0xC5A4,0xB0E7,0xB3B6, +0xC8C5,0x9251,0x9252,0xB0E2,0x9253,0x9254,0xB7F6,0x9255, +0x9256,0xC5FA,0x9257,0x9258,0xB6F3,0x9259,0xD5D2,0xB3D0, +0xBCBC,0x925A,0x925B,0x925C,0xB3AD,0x925D,0x925E,0x925F, +0x9260,0xBEF1,0xB0D1,0x9261,0x9262,0x9263,0x9264,0x9265, +0x9266,0xD2D6,0xCAE3,0xD7A5,0x9267,0xCDB6,0xB6B6,0xBFB9, +0xD5DB,0x9268,0xB8A7,0xC5D7,0x9269,0x926A,0x926B,0xDED2, +0xBFD9,0xC2D5,0xC7C0,0x926C,0xBBA4,0xB1A8,0x926D,0x926E, +0xC5EA,0x926F,0x9270,0xC5FB,0xCCA7,0x9271,0x9272,0x9273, +0x9274,0xB1A7,0x9275,0x9276,0x9277,0xB5D6,0x9278,0x9279, +0x927A,0xC4A8,0x927B,0xDED3,0xD1BA,0xB3E9,0x927C,0xC3F2, +0x927D,0x927E,0xB7F7,0x9280,0xD6F4,0xB5A3,0xB2F0,0xC4B4, +0xC4E9,0xC0AD,0xDED4,0x9281,0xB0E8,0xC5C4,0xC1E0,0x9282, +0xB9D5,0x9283,0xBEDC,0xCDD8,0xB0CE,0x9284,0xCDCF,0xDED6, +0xBED0,0xD7BE,0xDED5,0xD5D0,0xB0DD,0x9285,0x9286,0xC4E2, +0x9287,0x9288,0xC2A3,0xBCF0,0x9289,0xD3B5,0xC0B9,0xC5A1, +0xB2A6,0xD4F1,0x928A,0x928B,0xC0A8,0xCAC3,0xDED7,0xD5FC, +0x928C,0xB9B0,0x928D,0xC8AD,0xCBA9,0x928E,0xDED9,0xBFBD, +0x928F,0x9290,0x9291,0x9292,0xC6B4,0xD7A7,0xCAB0,0xC4C3, +0x9293,0xB3D6,0xB9D2,0x9294,0x9295,0x9296,0x9297,0xD6B8, +0xEAFC,0xB0B4,0x9298,0x9299,0x929A,0x929B,0xBFE6,0x929C, +0x929D,0xCCF4,0x929E,0x929F,0x92A0,0x92A1,0xCDDA,0x92A2, +0x92A3,0x92A4,0xD6BF,0xC2CE,0x92A5,0xCECE,0xCCA2,0xD0AE, +0xC4D3,0xB5B2,0xDED8,0xD5F5,0xBCB7,0xBBD3,0x92A6,0x92A7, +0xB0A4,0x92A8,0xC5B2,0xB4EC,0x92A9,0x92AA,0x92AB,0xD5F1, +0x92AC,0x92AD,0xEAFD,0x92AE,0x92AF,0x92B0,0x92B1,0x92B2, +0x92B3,0xDEDA,0xCDA6,0x92B4,0x92B5,0xCDEC,0x92B6,0x92B7, +0x92B8,0x92B9,0xCEE6,0xDEDC,0x92BA,0xCDB1,0xC0A6,0x92BB, +0x92BC,0xD7BD,0x92BD,0xDEDB,0xB0C6,0xBAB4,0xC9D3,0xC4F3, +0xBEE8,0x92BE,0x92BF,0x92C0,0x92C1,0xB2B6,0x92C2,0x92C3, +0x92C4,0x92C5,0x92C6,0x92C7,0x92C8,0x92C9,0xC0CC,0xCBF0, +0x92CA,0xBCF1,0xBBBB,0xB5B7,0x92CB,0x92CC,0x92CD,0xC5F5, +0x92CE,0xDEE6,0x92CF,0x92D0,0x92D1,0xDEE3,0xBEDD,0x92D2, +0x92D3,0xDEDF,0x92D4,0x92D5,0x92D6,0x92D7,0xB4B7,0xBDDD, +0x92D8,0x92D9,0xDEE0,0xC4ED,0x92DA,0x92DB,0x92DC,0x92DD, +0xCFC6,0x92DE,0xB5E0,0x92DF,0x92E0,0x92E1,0x92E2,0xB6DE, +0xCADA,0xB5F4,0xDEE5,0x92E3,0xD5C6,0x92E4,0xDEE1,0xCCCD, +0xC6FE,0x92E5,0xC5C5,0x92E6,0x92E7,0x92E8,0xD2B4,0x92E9, +0xBEF2,0x92EA,0x92EB,0x92EC,0x92ED,0x92EE,0x92EF,0x92F0, +0xC2D3,0x92F1,0xCCBD,0xB3B8,0x92F2,0xBDD3,0x92F3,0xBFD8, +0xCDC6,0xD1DA,0xB4EB,0x92F4,0xDEE4,0xDEDD,0xDEE7,0x92F5, +0xEAFE,0x92F6,0x92F7,0xC2B0,0xDEE2,0x92F8,0x92F9,0xD6C0, +0xB5A7,0x92FA,0xB2F4,0x92FB,0xDEE8,0x92FC,0xDEF2,0x92FD, +0x92FE,0x9340,0x9341,0x9342,0xDEED,0x9343,0xDEF1,0x9344, +0x9345,0xC8E0,0x9346,0x9347,0x9348,0xD7E1,0xDEEF,0xC3E8, +0xCCE1,0x9349,0xB2E5,0x934A,0x934B,0x934C,0xD2BE,0x934D, +0x934E,0x934F,0x9350,0x9351,0x9352,0x9353,0xDEEE,0x9354, +0xDEEB,0xCED5,0x9355,0xB4A7,0x9356,0x9357,0x9358,0x9359, +0x935A,0xBFAB,0xBEBE,0x935B,0x935C,0xBDD2,0x935D,0x935E, +0x935F,0x9360,0xDEE9,0x9361,0xD4AE,0x9362,0xDEDE,0x9363, +0xDEEA,0x9364,0x9365,0x9366,0x9367,0xC0BF,0x9368,0xDEEC, +0xB2F3,0xB8E9,0xC2A7,0x9369,0x936A,0xBDC1,0x936B,0x936C, +0x936D,0x936E,0x936F,0xDEF5,0xDEF8,0x9370,0x9371,0xB2AB, +0xB4A4,0x9372,0x9373,0xB4EA,0xC9A6,0x9374,0x9375,0x9376, +0x9377,0x9378,0x9379,0xDEF6,0xCBD1,0x937A,0xB8E3,0x937B, +0xDEF7,0xDEFA,0x937C,0x937D,0x937E,0x9380,0xDEF9,0x9381, +0x9382,0x9383,0xCCC2,0x9384,0xB0E1,0xB4EE,0x9385,0x9386, +0x9387,0x9388,0x9389,0x938A,0xE5BA,0x938B,0x938C,0x938D, +0x938E,0x938F,0xD0AF,0x9390,0x9391,0xB2EB,0x9392,0xEBA1, +0x9393,0xDEF4,0x9394,0x9395,0xC9E3,0xDEF3,0xB0DA,0xD2A1, +0xB1F7,0x9396,0xCCAF,0x9397,0x9398,0x9399,0x939A,0x939B, +0x939C,0x939D,0xDEF0,0x939E,0xCBA4,0x939F,0x93A0,0x93A1, +0xD5AA,0x93A2,0x93A3,0x93A4,0x93A5,0x93A6,0xDEFB,0x93A7, +0x93A8,0x93A9,0x93AA,0x93AB,0x93AC,0x93AD,0x93AE,0xB4DD, +0x93AF,0xC4A6,0x93B0,0x93B1,0x93B2,0xDEFD,0x93B3,0x93B4, +0x93B5,0x93B6,0x93B7,0x93B8,0x93B9,0x93BA,0x93BB,0x93BC, +0xC3FE,0xC4A1,0xDFA1,0x93BD,0x93BE,0x93BF,0x93C0,0x93C1, +0x93C2,0x93C3,0xC1CC,0x93C4,0xDEFC,0xBEEF,0x93C5,0xC6B2, +0x93C6,0x93C7,0x93C8,0x93C9,0x93CA,0x93CB,0x93CC,0x93CD, +0x93CE,0xB3C5,0xC8F6,0x93CF,0x93D0,0xCBBA,0xDEFE,0x93D1, +0x93D2,0xDFA4,0x93D3,0x93D4,0x93D5,0x93D6,0xD7B2,0x93D7, +0x93D8,0x93D9,0x93DA,0x93DB,0xB3B7,0x93DC,0x93DD,0x93DE, +0x93DF,0xC1C3,0x93E0,0x93E1,0xC7CB,0xB2A5,0xB4E9,0x93E2, +0xD7AB,0x93E3,0x93E4,0x93E5,0x93E6,0xC4EC,0x93E7,0xDFA2, +0xDFA3,0x93E8,0xDFA5,0x93E9,0xBAB3,0x93EA,0x93EB,0x93EC, +0xDFA6,0x93ED,0xC0DE,0x93EE,0x93EF,0xC9C3,0x93F0,0x93F1, +0x93F2,0x93F3,0x93F4,0x93F5,0x93F6,0xB2D9,0xC7E6,0x93F7, +0xDFA7,0x93F8,0xC7DC,0x93F9,0x93FA,0x93FB,0x93FC,0xDFA8, +0xEBA2,0x93FD,0x93FE,0x9440,0x9441,0x9442,0xCBD3,0x9443, +0x9444,0x9445,0xDFAA,0x9446,0xDFA9,0x9447,0xB2C1,0x9448, +0x9449,0x944A,0x944B,0x944C,0x944D,0x944E,0x944F,0x9450, +0x9451,0x9452,0x9453,0x9454,0x9455,0x9456,0x9457,0x9458, +0x9459,0x945A,0x945B,0x945C,0x945D,0x945E,0x945F,0x9460, +0xC5CA,0x9461,0x9462,0x9463,0x9464,0x9465,0x9466,0x9467, +0x9468,0xDFAB,0x9469,0x946A,0x946B,0x946C,0x946D,0x946E, +0x946F,0x9470,0xD4DC,0x9471,0x9472,0x9473,0x9474,0x9475, +0xC8C1,0x9476,0x9477,0x9478,0x9479,0x947A,0x947B,0x947C, +0x947D,0x947E,0x9480,0x9481,0x9482,0xDFAC,0x9483,0x9484, +0x9485,0x9486,0x9487,0xBEF0,0x9488,0x9489,0xDFAD,0xD6A7, +0x948A,0x948B,0x948C,0x948D,0xEAB7,0xEBB6,0xCAD5,0x948E, +0xD8FC,0xB8C4,0x948F,0xB9A5,0x9490,0x9491,0xB7C5,0xD5FE, +0x9492,0x9493,0x9494,0x9495,0x9496,0xB9CA,0x9497,0x9498, +0xD0A7,0xF4CD,0x9499,0x949A,0xB5D0,0x949B,0x949C,0xC3F4, +0x949D,0xBEC8,0x949E,0x949F,0x94A0,0xEBB7,0xB0BD,0x94A1, +0x94A2,0xBDCC,0x94A3,0xC1B2,0x94A4,0xB1D6,0xB3A8,0x94A5, +0x94A6,0x94A7,0xB8D2,0xC9A2,0x94A8,0x94A9,0xB6D8,0x94AA, +0x94AB,0x94AC,0x94AD,0xEBB8,0xBEB4,0x94AE,0x94AF,0x94B0, +0xCAFD,0x94B1,0xC7C3,0x94B2,0xD5FB,0x94B3,0x94B4,0xB7F3, +0x94B5,0x94B6,0x94B7,0x94B8,0x94B9,0x94BA,0x94BB,0x94BC, +0x94BD,0x94BE,0x94BF,0x94C0,0x94C1,0x94C2,0x94C3,0xCEC4, +0x94C4,0x94C5,0x94C6,0xD5AB,0xB1F3,0x94C7,0x94C8,0x94C9, +0xECB3,0xB0DF,0x94CA,0xECB5,0x94CB,0x94CC,0x94CD,0xB6B7, +0x94CE,0xC1CF,0x94CF,0xF5FA,0xD0B1,0x94D0,0x94D1,0xD5E5, +0x94D2,0xCED3,0x94D3,0x94D4,0xBDEF,0xB3E2,0x94D5,0xB8AB, +0x94D6,0xD5B6,0x94D7,0xEDBD,0x94D8,0xB6CF,0x94D9,0xCBB9, +0xD0C2,0x94DA,0x94DB,0x94DC,0x94DD,0x94DE,0x94DF,0x94E0, +0x94E1,0xB7BD,0x94E2,0x94E3,0xECB6,0xCAA9,0x94E4,0x94E5, +0x94E6,0xC5D4,0x94E7,0xECB9,0xECB8,0xC2C3,0xECB7,0x94E8, +0x94E9,0x94EA,0x94EB,0xD0FD,0xECBA,0x94EC,0xECBB,0xD7E5, +0x94ED,0x94EE,0xECBC,0x94EF,0x94F0,0x94F1,0xECBD,0xC6EC, +0x94F2,0x94F3,0x94F4,0x94F5,0x94F6,0x94F7,0x94F8,0x94F9, +0xCEDE,0x94FA,0xBCC8,0x94FB,0x94FC,0xC8D5,0xB5A9,0xBEC9, +0xD6BC,0xD4E7,0x94FD,0x94FE,0xD1AE,0xD0F1,0xEAB8,0xEAB9, +0xEABA,0xBAB5,0x9540,0x9541,0x9542,0x9543,0xCAB1,0xBFF5, +0x9544,0x9545,0xCDFA,0x9546,0x9547,0x9548,0x9549,0x954A, +0xEAC0,0x954B,0xB0BA,0xEABE,0x954C,0x954D,0xC0A5,0x954E, +0x954F,0x9550,0xEABB,0x9551,0xB2FD,0x9552,0xC3F7,0xBBE8, +0x9553,0x9554,0x9555,0xD2D7,0xCEF4,0xEABF,0x9556,0x9557, +0x9558,0xEABC,0x9559,0x955A,0x955B,0xEAC3,0x955C,0xD0C7, +0xD3B3,0x955D,0x955E,0x955F,0x9560,0xB4BA,0x9561,0xC3C1, +0xD7F2,0x9562,0x9563,0x9564,0x9565,0xD5D1,0x9566,0xCAC7, +0x9567,0xEAC5,0x9568,0x9569,0xEAC4,0xEAC7,0xEAC6,0x956A, +0x956B,0x956C,0x956D,0x956E,0xD6E7,0x956F,0xCFD4,0x9570, +0x9571,0xEACB,0x9572,0xBBCE,0x9573,0x9574,0x9575,0x9576, +0x9577,0x9578,0x9579,0xBDFA,0xC9CE,0x957A,0x957B,0xEACC, +0x957C,0x957D,0xC9B9,0xCFFE,0xEACA,0xD4CE,0xEACD,0xEACF, +0x957E,0x9580,0xCDED,0x9581,0x9582,0x9583,0x9584,0xEAC9, +0x9585,0xEACE,0x9586,0x9587,0xCEEE,0x9588,0xBBDE,0x9589, +0xB3BF,0x958A,0x958B,0x958C,0x958D,0x958E,0xC6D5,0xBEB0, +0xCEFA,0x958F,0x9590,0x9591,0xC7E7,0x9592,0xBEA7,0xEAD0, +0x9593,0x9594,0xD6C7,0x9595,0x9596,0x9597,0xC1C0,0x9598, +0x9599,0x959A,0xD4DD,0x959B,0xEAD1,0x959C,0x959D,0xCFBE, +0x959E,0x959F,0x95A0,0x95A1,0xEAD2,0x95A2,0x95A3,0x95A4, +0x95A5,0xCAEE,0x95A6,0x95A7,0x95A8,0x95A9,0xC5AF,0xB0B5, +0x95AA,0x95AB,0x95AC,0x95AD,0x95AE,0xEAD4,0x95AF,0x95B0, +0x95B1,0x95B2,0x95B3,0x95B4,0x95B5,0x95B6,0x95B7,0xEAD3, +0xF4DF,0x95B8,0x95B9,0x95BA,0x95BB,0x95BC,0xC4BA,0x95BD, +0x95BE,0x95BF,0x95C0,0x95C1,0xB1A9,0x95C2,0x95C3,0x95C4, +0x95C5,0xE5DF,0x95C6,0x95C7,0x95C8,0x95C9,0xEAD5,0x95CA, +0x95CB,0x95CC,0x95CD,0x95CE,0x95CF,0x95D0,0x95D1,0x95D2, +0x95D3,0x95D4,0x95D5,0x95D6,0x95D7,0x95D8,0x95D9,0x95DA, +0x95DB,0x95DC,0x95DD,0x95DE,0x95DF,0x95E0,0x95E1,0x95E2, +0x95E3,0xCAEF,0x95E4,0xEAD6,0xEAD7,0xC6D8,0x95E5,0x95E6, +0x95E7,0x95E8,0x95E9,0x95EA,0x95EB,0x95EC,0xEAD8,0x95ED, +0x95EE,0xEAD9,0x95EF,0x95F0,0x95F1,0x95F2,0x95F3,0x95F4, +0xD4BB,0x95F5,0xC7FA,0xD2B7,0xB8FC,0x95F6,0x95F7,0xEAC2, +0x95F8,0xB2DC,0x95F9,0x95FA,0xC2FC,0x95FB,0xD4F8,0xCCE6, +0xD7EE,0x95FC,0x95FD,0x95FE,0x9640,0x9641,0x9642,0x9643, +0xD4C2,0xD3D0,0xEBC3,0xC5F3,0x9644,0xB7FE,0x9645,0x9646, +0xEBD4,0x9647,0x9648,0x9649,0xCBB7,0xEBDE,0x964A,0xC0CA, +0x964B,0x964C,0x964D,0xCDFB,0x964E,0xB3AF,0x964F,0xC6DA, +0x9650,0x9651,0x9652,0x9653,0x9654,0x9655,0xEBFC,0x9656, +0xC4BE,0x9657,0xCEB4,0xC4A9,0xB1BE,0xD4FD,0x9658,0xCAF5, +0x9659,0xD6EC,0x965A,0x965B,0xC6D3,0xB6E4,0x965C,0x965D, +0x965E,0x965F,0xBBFA,0x9660,0x9661,0xD0E0,0x9662,0x9663, +0xC9B1,0x9664,0xD4D3,0xC8A8,0x9665,0x9666,0xB8CB,0x9667, +0xE8BE,0xC9BC,0x9668,0x9669,0xE8BB,0x966A,0xC0EE,0xD0D3, +0xB2C4,0xB4E5,0x966B,0xE8BC,0x966C,0x966D,0xD5C8,0x966E, +0x966F,0x9670,0x9671,0x9672,0xB6C5,0x9673,0xE8BD,0xCAF8, +0xB8DC,0xCCF5,0x9674,0x9675,0x9676,0xC0B4,0x9677,0x9678, +0xD1EE,0xE8BF,0xE8C2,0x9679,0x967A,0xBABC,0x967B,0xB1AD, +0xBDDC,0x967C,0xEABD,0xE8C3,0x967D,0xE8C6,0x967E,0xE8CB, +0x9680,0x9681,0x9682,0x9683,0xE8CC,0x9684,0xCBC9,0xB0E5, +0x9685,0xBCAB,0x9686,0x9687,0xB9B9,0x9688,0x9689,0xE8C1, +0x968A,0xCDF7,0x968B,0xE8CA,0x968C,0x968D,0x968E,0x968F, +0xCEF6,0x9690,0x9691,0x9692,0x9693,0xD5ED,0x9694,0xC1D6, +0xE8C4,0x9695,0xC3B6,0x9696,0xB9FB,0xD6A6,0xE8C8,0x9697, +0x9698,0x9699,0xCAE0,0xD4E6,0x969A,0xE8C0,0x969B,0xE8C5, +0xE8C7,0x969C,0xC7B9,0xB7E3,0x969D,0xE8C9,0x969E,0xBFDD, +0xE8D2,0x969F,0x96A0,0xE8D7,0x96A1,0xE8D5,0xBCDC,0xBCCF, +0xE8DB,0x96A2,0x96A3,0x96A4,0x96A5,0x96A6,0x96A7,0x96A8, +0x96A9,0xE8DE,0x96AA,0xE8DA,0xB1FA,0x96AB,0x96AC,0x96AD, +0x96AE,0x96AF,0x96B0,0x96B1,0x96B2,0x96B3,0x96B4,0xB0D8, +0xC4B3,0xB8CC,0xC6E2,0xC8BE,0xC8E1,0x96B5,0x96B6,0x96B7, +0xE8CF,0xE8D4,0xE8D6,0x96B8,0xB9F1,0xE8D8,0xD7F5,0x96B9, +0xC4FB,0x96BA,0xE8DC,0x96BB,0x96BC,0xB2E9,0x96BD,0x96BE, +0x96BF,0xE8D1,0x96C0,0x96C1,0xBCED,0x96C2,0x96C3,0xBFC2, +0xE8CD,0xD6F9,0x96C4,0xC1F8,0xB2F1,0x96C5,0x96C6,0x96C7, +0x96C8,0x96C9,0x96CA,0x96CB,0x96CC,0xE8DF,0x96CD,0xCAC1, +0xE8D9,0x96CE,0x96CF,0x96D0,0x96D1,0xD5A4,0x96D2,0xB1EA, +0xD5BB,0xE8CE,0xE8D0,0xB6B0,0xE8D3,0x96D3,0xE8DD,0xC0B8, +0x96D4,0xCAF7,0x96D5,0xCBA8,0x96D6,0x96D7,0xC6DC,0xC0F5, +0x96D8,0x96D9,0x96DA,0x96DB,0x96DC,0xE8E9,0x96DD,0x96DE, +0x96DF,0xD0A3,0x96E0,0x96E1,0x96E2,0x96E3,0x96E4,0x96E5, +0x96E6,0xE8F2,0xD6EA,0x96E7,0x96E8,0x96E9,0x96EA,0x96EB, +0x96EC,0x96ED,0xE8E0,0xE8E1,0x96EE,0x96EF,0x96F0,0xD1F9, +0xBACB,0xB8F9,0x96F1,0x96F2,0xB8F1,0xD4D4,0xE8EF,0x96F3, +0xE8EE,0xE8EC,0xB9F0,0xCCD2,0xE8E6,0xCEA6,0xBFF2,0x96F4, +0xB0B8,0xE8F1,0xE8F0,0x96F5,0xD7C0,0x96F6,0xE8E4,0x96F7, +0xCDA9,0xC9A3,0x96F8,0xBBB8,0xBDDB,0xE8EA,0x96F9,0x96FA, +0x96FB,0x96FC,0x96FD,0x96FE,0x9740,0x9741,0x9742,0x9743, +0xE8E2,0xE8E3,0xE8E5,0xB5B5,0xE8E7,0xC7C5,0xE8EB,0xE8ED, +0xBDB0,0xD7AE,0x9744,0xE8F8,0x9745,0x9746,0x9747,0x9748, +0x9749,0x974A,0x974B,0x974C,0xE8F5,0x974D,0xCDB0,0xE8F6, +0x974E,0x974F,0x9750,0x9751,0x9752,0x9753,0x9754,0x9755, +0x9756,0xC1BA,0x9757,0xE8E8,0x9758,0xC3B7,0xB0F0,0x9759, +0x975A,0x975B,0x975C,0x975D,0x975E,0x975F,0x9760,0xE8F4, +0x9761,0x9762,0x9763,0xE8F7,0x9764,0x9765,0x9766,0xB9A3, +0x9767,0x9768,0x9769,0x976A,0x976B,0x976C,0x976D,0x976E, +0x976F,0x9770,0xC9D2,0x9771,0x9772,0x9773,0xC3CE,0xCEE0, +0xC0E6,0x9774,0x9775,0x9776,0x9777,0xCBF3,0x9778,0xCCDD, +0xD0B5,0x9779,0x977A,0xCAE1,0x977B,0xE8F3,0x977C,0x977D, +0x977E,0x9780,0x9781,0x9782,0x9783,0x9784,0x9785,0x9786, +0xBCEC,0x9787,0xE8F9,0x9788,0x9789,0x978A,0x978B,0x978C, +0x978D,0xC3DE,0x978E,0xC6E5,0x978F,0xB9F7,0x9790,0x9791, +0x9792,0x9793,0xB0F4,0x9794,0x9795,0xD7D8,0x9796,0x9797, +0xBCAC,0x9798,0xC5EF,0x9799,0x979A,0x979B,0x979C,0x979D, +0xCCC4,0x979E,0x979F,0xE9A6,0x97A0,0x97A1,0x97A2,0x97A3, +0x97A4,0x97A5,0x97A6,0x97A7,0x97A8,0x97A9,0xC9AD,0x97AA, +0xE9A2,0xC0E2,0x97AB,0x97AC,0x97AD,0xBFC3,0x97AE,0x97AF, +0x97B0,0xE8FE,0xB9D7,0x97B1,0xE8FB,0x97B2,0x97B3,0x97B4, +0x97B5,0xE9A4,0x97B6,0x97B7,0x97B8,0xD2CE,0x97B9,0x97BA, +0x97BB,0x97BC,0x97BD,0xE9A3,0x97BE,0xD6B2,0xD7B5,0x97BF, +0xE9A7,0x97C0,0xBDB7,0x97C1,0x97C2,0x97C3,0x97C4,0x97C5, +0x97C6,0x97C7,0x97C8,0x97C9,0x97CA,0x97CB,0x97CC,0xE8FC, +0xE8FD,0x97CD,0x97CE,0x97CF,0xE9A1,0x97D0,0x97D1,0x97D2, +0x97D3,0x97D4,0x97D5,0x97D6,0x97D7,0xCDD6,0x97D8,0x97D9, +0xD2AC,0x97DA,0x97DB,0x97DC,0xE9B2,0x97DD,0x97DE,0x97DF, +0x97E0,0xE9A9,0x97E1,0x97E2,0x97E3,0xB4AA,0x97E4,0xB4BB, +0x97E5,0x97E6,0xE9AB,0x97E7,0x97E8,0x97E9,0x97EA,0x97EB, +0x97EC,0x97ED,0x97EE,0x97EF,0x97F0,0x97F1,0x97F2,0x97F3, +0x97F4,0x97F5,0x97F6,0x97F7,0xD0A8,0x97F8,0x97F9,0xE9A5, +0x97FA,0x97FB,0xB3FE,0x97FC,0x97FD,0xE9AC,0xC0E3,0x97FE, +0xE9AA,0x9840,0x9841,0xE9B9,0x9842,0x9843,0xE9B8,0x9844, +0x9845,0x9846,0x9847,0xE9AE,0x9848,0x9849,0xE8FA,0x984A, +0x984B,0xE9A8,0x984C,0x984D,0x984E,0x984F,0x9850,0xBFAC, +0xE9B1,0xE9BA,0x9851,0x9852,0xC2A5,0x9853,0x9854,0x9855, +0xE9AF,0x9856,0xB8C5,0x9857,0xE9AD,0x9858,0xD3DC,0xE9B4, +0xE9B5,0xE9B7,0x9859,0x985A,0x985B,0xE9C7,0x985C,0x985D, +0x985E,0x985F,0x9860,0x9861,0xC0C6,0xE9C5,0x9862,0x9863, +0xE9B0,0x9864,0x9865,0xE9BB,0xB0F1,0x9866,0x9867,0x9868, +0x9869,0x986A,0x986B,0x986C,0x986D,0x986E,0x986F,0xE9BC, +0xD5A5,0x9870,0x9871,0xE9BE,0x9872,0xE9BF,0x9873,0x9874, +0x9875,0xE9C1,0x9876,0x9877,0xC1F1,0x9878,0x9879,0xC8B6, +0x987A,0x987B,0x987C,0xE9BD,0x987D,0x987E,0x9880,0x9881, +0x9882,0xE9C2,0x9883,0x9884,0x9885,0x9886,0x9887,0x9888, +0x9889,0x988A,0xE9C3,0x988B,0xE9B3,0x988C,0xE9B6,0x988D, +0xBBB1,0x988E,0x988F,0x9890,0xE9C0,0x9891,0x9892,0x9893, +0x9894,0x9895,0x9896,0xBCF7,0x9897,0x9898,0x9899,0xE9C4, +0xE9C6,0x989A,0x989B,0x989C,0x989D,0x989E,0x989F,0x98A0, +0x98A1,0x98A2,0x98A3,0x98A4,0x98A5,0xE9CA,0x98A6,0x98A7, +0x98A8,0x98A9,0xE9CE,0x98AA,0x98AB,0x98AC,0x98AD,0x98AE, +0x98AF,0x98B0,0x98B1,0x98B2,0x98B3,0xB2DB,0x98B4,0xE9C8, +0x98B5,0x98B6,0x98B7,0x98B8,0x98B9,0x98BA,0x98BB,0x98BC, +0x98BD,0x98BE,0xB7AE,0x98BF,0x98C0,0x98C1,0x98C2,0x98C3, +0x98C4,0x98C5,0x98C6,0x98C7,0x98C8,0x98C9,0x98CA,0xE9CB, +0xE9CC,0x98CB,0x98CC,0x98CD,0x98CE,0x98CF,0x98D0,0xD5C1, +0x98D1,0xC4A3,0x98D2,0x98D3,0x98D4,0x98D5,0x98D6,0x98D7, +0xE9D8,0x98D8,0xBAE1,0x98D9,0x98DA,0x98DB,0x98DC,0xE9C9, +0x98DD,0xD3A3,0x98DE,0x98DF,0x98E0,0xE9D4,0x98E1,0x98E2, +0x98E3,0x98E4,0x98E5,0x98E6,0x98E7,0xE9D7,0xE9D0,0x98E8, +0x98E9,0x98EA,0x98EB,0x98EC,0xE9CF,0x98ED,0x98EE,0xC7C1, +0x98EF,0x98F0,0x98F1,0x98F2,0x98F3,0x98F4,0x98F5,0x98F6, +0xE9D2,0x98F7,0x98F8,0x98F9,0x98FA,0x98FB,0x98FC,0x98FD, +0xE9D9,0xB3C8,0x98FE,0xE9D3,0x9940,0x9941,0x9942,0x9943, +0x9944,0xCFF0,0x9945,0x9946,0x9947,0xE9CD,0x9948,0x9949, +0x994A,0x994B,0x994C,0x994D,0x994E,0x994F,0x9950,0x9951, +0x9952,0xB3F7,0x9953,0x9954,0x9955,0x9956,0x9957,0x9958, +0x9959,0xE9D6,0x995A,0x995B,0xE9DA,0x995C,0x995D,0x995E, +0xCCB4,0x995F,0x9960,0x9961,0xCFAD,0x9962,0x9963,0x9964, +0x9965,0x9966,0x9967,0x9968,0x9969,0x996A,0xE9D5,0x996B, +0xE9DC,0xE9DB,0x996C,0x996D,0x996E,0x996F,0x9970,0xE9DE, +0x9971,0x9972,0x9973,0x9974,0x9975,0x9976,0x9977,0x9978, +0xE9D1,0x9979,0x997A,0x997B,0x997C,0x997D,0x997E,0x9980, +0x9981,0xE9DD,0x9982,0xE9DF,0xC3CA,0x9983,0x9984,0x9985, +0x9986,0x9987,0x9988,0x9989,0x998A,0x998B,0x998C,0x998D, +0x998E,0x998F,0x9990,0x9991,0x9992,0x9993,0x9994,0x9995, +0x9996,0x9997,0x9998,0x9999,0x999A,0x999B,0x999C,0x999D, +0x999E,0x999F,0x99A0,0x99A1,0x99A2,0x99A3,0x99A4,0x99A5, +0x99A6,0x99A7,0x99A8,0x99A9,0x99AA,0x99AB,0x99AC,0x99AD, +0x99AE,0x99AF,0x99B0,0x99B1,0x99B2,0x99B3,0x99B4,0x99B5, +0x99B6,0x99B7,0x99B8,0x99B9,0x99BA,0x99BB,0x99BC,0x99BD, +0x99BE,0x99BF,0x99C0,0x99C1,0x99C2,0x99C3,0x99C4,0x99C5, +0x99C6,0x99C7,0x99C8,0x99C9,0x99CA,0x99CB,0x99CC,0x99CD, +0x99CE,0x99CF,0x99D0,0x99D1,0x99D2,0x99D3,0x99D4,0x99D5, +0x99D6,0x99D7,0x99D8,0x99D9,0x99DA,0x99DB,0x99DC,0x99DD, +0x99DE,0x99DF,0x99E0,0x99E1,0x99E2,0x99E3,0x99E4,0x99E5, +0x99E6,0x99E7,0x99E8,0x99E9,0x99EA,0x99EB,0x99EC,0x99ED, +0x99EE,0x99EF,0x99F0,0x99F1,0x99F2,0x99F3,0x99F4,0x99F5, +0xC7B7,0xB4CE,0xBBB6,0xD0C0,0xECA3,0x99F6,0x99F7,0xC5B7, +0x99F8,0x99F9,0x99FA,0x99FB,0x99FC,0x99FD,0x99FE,0x9A40, +0x9A41,0x9A42,0xD3FB,0x9A43,0x9A44,0x9A45,0x9A46,0xECA4, +0x9A47,0xECA5,0xC6DB,0x9A48,0x9A49,0x9A4A,0xBFEE,0x9A4B, +0x9A4C,0x9A4D,0x9A4E,0xECA6,0x9A4F,0x9A50,0xECA7,0xD0AA, +0x9A51,0xC7B8,0x9A52,0x9A53,0xB8E8,0x9A54,0x9A55,0x9A56, +0x9A57,0x9A58,0x9A59,0x9A5A,0x9A5B,0x9A5C,0x9A5D,0x9A5E, +0x9A5F,0xECA8,0x9A60,0x9A61,0x9A62,0x9A63,0x9A64,0x9A65, +0x9A66,0x9A67,0xD6B9,0xD5FD,0xB4CB,0xB2BD,0xCEE4,0xC6E7, +0x9A68,0x9A69,0xCDE1,0x9A6A,0x9A6B,0x9A6C,0x9A6D,0x9A6E, +0x9A6F,0x9A70,0x9A71,0x9A72,0x9A73,0x9A74,0x9A75,0x9A76, +0x9A77,0xB4F5,0x9A78,0xCBC0,0xBCDF,0x9A79,0x9A7A,0x9A7B, +0x9A7C,0xE9E2,0xE9E3,0xD1EA,0xE9E5,0x9A7D,0xB4F9,0xE9E4, +0x9A7E,0xD1B3,0xCAE2,0xB2D0,0x9A80,0xE9E8,0x9A81,0x9A82, +0x9A83,0x9A84,0xE9E6,0xE9E7,0x9A85,0x9A86,0xD6B3,0x9A87, +0x9A88,0x9A89,0xE9E9,0xE9EA,0x9A8A,0x9A8B,0x9A8C,0x9A8D, +0x9A8E,0xE9EB,0x9A8F,0x9A90,0x9A91,0x9A92,0x9A93,0x9A94, +0x9A95,0x9A96,0xE9EC,0x9A97,0x9A98,0x9A99,0x9A9A,0x9A9B, +0x9A9C,0x9A9D,0x9A9E,0xECAF,0xC5B9,0xB6CE,0x9A9F,0xD2F3, +0x9AA0,0x9AA1,0x9AA2,0x9AA3,0x9AA4,0x9AA5,0x9AA6,0xB5EE, +0x9AA7,0xBBD9,0xECB1,0x9AA8,0x9AA9,0xD2E3,0x9AAA,0x9AAB, +0x9AAC,0x9AAD,0x9AAE,0xCEE3,0x9AAF,0xC4B8,0x9AB0,0xC3BF, +0x9AB1,0x9AB2,0xB6BE,0xD8B9,0xB1C8,0xB1CF,0xB1D1,0xC5FE, +0x9AB3,0xB1D0,0x9AB4,0xC3AB,0x9AB5,0x9AB6,0x9AB7,0x9AB8, +0x9AB9,0xD5B1,0x9ABA,0x9ABB,0x9ABC,0x9ABD,0x9ABE,0x9ABF, +0x9AC0,0x9AC1,0xEBA4,0xBAC1,0x9AC2,0x9AC3,0x9AC4,0xCCBA, +0x9AC5,0x9AC6,0x9AC7,0xEBA5,0x9AC8,0xEBA7,0x9AC9,0x9ACA, +0x9ACB,0xEBA8,0x9ACC,0x9ACD,0x9ACE,0xEBA6,0x9ACF,0x9AD0, +0x9AD1,0x9AD2,0x9AD3,0x9AD4,0x9AD5,0xEBA9,0xEBAB,0xEBAA, +0x9AD6,0x9AD7,0x9AD8,0x9AD9,0x9ADA,0xEBAC,0x9ADB,0xCACF, +0xD8B5,0xC3F1,0x9ADC,0xC3A5,0xC6F8,0xEBAD,0xC4CA,0x9ADD, +0xEBAE,0xEBAF,0xEBB0,0xB7D5,0x9ADE,0x9ADF,0x9AE0,0xB7FA, +0x9AE1,0xEBB1,0xC7E2,0x9AE2,0xEBB3,0x9AE3,0xBAA4,0xD1F5, +0xB0B1,0xEBB2,0xEBB4,0x9AE4,0x9AE5,0x9AE6,0xB5AA,0xC2C8, +0xC7E8,0x9AE7,0xEBB5,0x9AE8,0xCBAE,0xE3DF,0x9AE9,0x9AEA, +0xD3C0,0x9AEB,0x9AEC,0x9AED,0x9AEE,0xD9DB,0x9AEF,0x9AF0, +0xCDA1,0xD6AD,0xC7F3,0x9AF1,0x9AF2,0x9AF3,0xD9E0,0xBBE3, +0x9AF4,0xBABA,0xE3E2,0x9AF5,0x9AF6,0x9AF7,0x9AF8,0x9AF9, +0xCFAB,0x9AFA,0x9AFB,0x9AFC,0xE3E0,0xC9C7,0x9AFD,0xBAB9, +0x9AFE,0x9B40,0x9B41,0xD1B4,0xE3E1,0xC8EA,0xB9AF,0xBDAD, +0xB3D8,0xCEDB,0x9B42,0x9B43,0xCCC0,0x9B44,0x9B45,0x9B46, +0xE3E8,0xE3E9,0xCDF4,0x9B47,0x9B48,0x9B49,0x9B4A,0x9B4B, +0xCCAD,0x9B4C,0xBCB3,0x9B4D,0xE3EA,0x9B4E,0xE3EB,0x9B4F, +0x9B50,0xD0DA,0x9B51,0x9B52,0x9B53,0xC6FB,0xB7DA,0x9B54, +0x9B55,0xC7DF,0xD2CA,0xCED6,0x9B56,0xE3E4,0xE3EC,0x9B57, +0xC9F2,0xB3C1,0x9B58,0x9B59,0xE3E7,0x9B5A,0x9B5B,0xC6E3, +0xE3E5,0x9B5C,0x9B5D,0xEDB3,0xE3E6,0x9B5E,0x9B5F,0x9B60, +0x9B61,0xC9B3,0x9B62,0xC5E6,0x9B63,0x9B64,0x9B65,0xB9B5, +0x9B66,0xC3BB,0x9B67,0xE3E3,0xC5BD,0xC1A4,0xC2D9,0xB2D7, +0x9B68,0xE3ED,0xBBA6,0xC4AD,0x9B69,0xE3F0,0xBEDA,0x9B6A, +0x9B6B,0xE3FB,0xE3F5,0xBAD3,0x9B6C,0x9B6D,0x9B6E,0x9B6F, +0xB7D0,0xD3CD,0x9B70,0xD6CE,0xD5D3,0xB9C1,0xD5B4,0xD1D8, +0x9B71,0x9B72,0x9B73,0x9B74,0xD0B9,0xC7F6,0x9B75,0x9B76, +0x9B77,0xC8AA,0xB2B4,0x9B78,0xC3DA,0x9B79,0x9B7A,0x9B7B, +0xE3EE,0x9B7C,0x9B7D,0xE3FC,0xE3EF,0xB7A8,0xE3F7,0xE3F4, +0x9B7E,0x9B80,0x9B81,0xB7BA,0x9B82,0x9B83,0xC5A2,0x9B84, +0xE3F6,0xC5DD,0xB2A8,0xC6FC,0x9B85,0xC4E0,0x9B86,0x9B87, +0xD7A2,0x9B88,0xC0E1,0xE3F9,0x9B89,0x9B8A,0xE3FA,0xE3FD, +0xCCA9,0xE3F3,0x9B8B,0xD3BE,0x9B8C,0xB1C3,0xEDB4,0xE3F1, +0xE3F2,0x9B8D,0xE3F8,0xD0BA,0xC6C3,0xD4F3,0xE3FE,0x9B8E, +0x9B8F,0xBDE0,0x9B90,0x9B91,0xE4A7,0x9B92,0x9B93,0xE4A6, +0x9B94,0x9B95,0x9B96,0xD1F3,0xE4A3,0x9B97,0xE4A9,0x9B98, +0x9B99,0x9B9A,0xC8F7,0x9B9B,0x9B9C,0x9B9D,0x9B9E,0xCFB4, +0x9B9F,0xE4A8,0xE4AE,0xC2E5,0x9BA0,0x9BA1,0xB6B4,0x9BA2, +0x9BA3,0x9BA4,0x9BA5,0x9BA6,0x9BA7,0xBDF2,0x9BA8,0xE4A2, +0x9BA9,0x9BAA,0xBAE9,0xE4AA,0x9BAB,0x9BAC,0xE4AC,0x9BAD, +0x9BAE,0xB6FD,0xD6DE,0xE4B2,0x9BAF,0xE4AD,0x9BB0,0x9BB1, +0x9BB2,0xE4A1,0x9BB3,0xBBEE,0xCDDD,0xC7A2,0xC5C9,0x9BB4, +0x9BB5,0xC1F7,0x9BB6,0xE4A4,0x9BB7,0xC7B3,0xBDAC,0xBDBD, +0xE4A5,0x9BB8,0xD7C7,0xB2E2,0x9BB9,0xE4AB,0xBCC3,0xE4AF, +0x9BBA,0xBBEB,0xE4B0,0xC5A8,0xE4B1,0x9BBB,0x9BBC,0x9BBD, +0x9BBE,0xD5E3,0xBFA3,0x9BBF,0xE4BA,0x9BC0,0xE4B7,0x9BC1, +0xE4BB,0x9BC2,0x9BC3,0xE4BD,0x9BC4,0x9BC5,0xC6D6,0x9BC6, +0x9BC7,0xBAC6,0xC0CB,0x9BC8,0x9BC9,0x9BCA,0xB8A1,0xE4B4, +0x9BCB,0x9BCC,0x9BCD,0x9BCE,0xD4A1,0x9BCF,0x9BD0,0xBAA3, +0xBDFE,0x9BD1,0x9BD2,0x9BD3,0xE4BC,0x9BD4,0x9BD5,0x9BD6, +0x9BD7,0x9BD8,0xCDBF,0x9BD9,0x9BDA,0xC4F9,0x9BDB,0x9BDC, +0xCFFB,0xC9E6,0x9BDD,0x9BDE,0xD3BF,0x9BDF,0xCFD1,0x9BE0, +0x9BE1,0xE4B3,0x9BE2,0xE4B8,0xE4B9,0xCCE9,0x9BE3,0x9BE4, +0x9BE5,0x9BE6,0x9BE7,0xCCCE,0x9BE8,0xC0D4,0xE4B5,0xC1B0, +0xE4B6,0xCED0,0x9BE9,0xBBC1,0xB5D3,0x9BEA,0xC8F3,0xBDA7, +0xD5C7,0xC9AC,0xB8A2,0xE4CA,0x9BEB,0x9BEC,0xE4CC,0xD1C4, +0x9BED,0x9BEE,0xD2BA,0x9BEF,0x9BF0,0xBAAD,0x9BF1,0x9BF2, +0xBAD4,0x9BF3,0x9BF4,0x9BF5,0x9BF6,0x9BF7,0x9BF8,0xE4C3, +0xB5ED,0x9BF9,0x9BFA,0x9BFB,0xD7CD,0xE4C0,0xCFFD,0xE4BF, +0x9BFC,0x9BFD,0x9BFE,0xC1DC,0xCCCA,0x9C40,0x9C41,0x9C42, +0x9C43,0xCAE7,0x9C44,0x9C45,0x9C46,0x9C47,0xC4D7,0x9C48, +0xCCD4,0xE4C8,0x9C49,0x9C4A,0x9C4B,0xE4C7,0xE4C1,0x9C4C, +0xE4C4,0xB5AD,0x9C4D,0x9C4E,0xD3D9,0x9C4F,0xE4C6,0x9C50, +0x9C51,0x9C52,0x9C53,0xD2F9,0xB4E3,0x9C54,0xBBB4,0x9C55, +0x9C56,0xC9EE,0x9C57,0xB4BE,0x9C58,0x9C59,0x9C5A,0xBBEC, +0x9C5B,0xD1CD,0x9C5C,0xCCED,0xEDB5,0x9C5D,0x9C5E,0x9C5F, +0x9C60,0x9C61,0x9C62,0x9C63,0x9C64,0xC7E5,0x9C65,0x9C66, +0x9C67,0x9C68,0xD4A8,0x9C69,0xE4CB,0xD7D5,0xE4C2,0x9C6A, +0xBDA5,0xE4C5,0x9C6B,0x9C6C,0xD3E6,0x9C6D,0xE4C9,0xC9F8, +0x9C6E,0x9C6F,0xE4BE,0x9C70,0x9C71,0xD3E5,0x9C72,0x9C73, +0xC7FE,0xB6C9,0x9C74,0xD4FC,0xB2B3,0xE4D7,0x9C75,0x9C76, +0x9C77,0xCEC2,0x9C78,0xE4CD,0x9C79,0xCEBC,0x9C7A,0xB8DB, +0x9C7B,0x9C7C,0xE4D6,0x9C7D,0xBFCA,0x9C7E,0x9C80,0x9C81, +0xD3CE,0x9C82,0xC3EC,0x9C83,0x9C84,0x9C85,0x9C86,0x9C87, +0x9C88,0x9C89,0x9C8A,0xC5C8,0xE4D8,0x9C8B,0x9C8C,0x9C8D, +0x9C8E,0x9C8F,0x9C90,0x9C91,0x9C92,0xCDC4,0xE4CF,0x9C93, +0x9C94,0x9C95,0x9C96,0xE4D4,0xE4D5,0x9C97,0xBAFE,0x9C98, +0xCFE6,0x9C99,0x9C9A,0xD5BF,0x9C9B,0x9C9C,0x9C9D,0xE4D2, +0x9C9E,0x9C9F,0x9CA0,0x9CA1,0x9CA2,0x9CA3,0x9CA4,0x9CA5, +0x9CA6,0x9CA7,0x9CA8,0xE4D0,0x9CA9,0x9CAA,0xE4CE,0x9CAB, +0x9CAC,0x9CAD,0x9CAE,0x9CAF,0x9CB0,0x9CB1,0x9CB2,0x9CB3, +0x9CB4,0x9CB5,0x9CB6,0x9CB7,0x9CB8,0x9CB9,0xCDE5,0xCAAA, +0x9CBA,0x9CBB,0x9CBC,0xC0A3,0x9CBD,0xBDA6,0xE4D3,0x9CBE, +0x9CBF,0xB8C8,0x9CC0,0x9CC1,0x9CC2,0x9CC3,0x9CC4,0xE4E7, +0xD4B4,0x9CC5,0x9CC6,0x9CC7,0x9CC8,0x9CC9,0x9CCA,0x9CCB, +0xE4DB,0x9CCC,0x9CCD,0x9CCE,0xC1EF,0x9CCF,0x9CD0,0xE4E9, +0x9CD1,0x9CD2,0xD2E7,0x9CD3,0x9CD4,0xE4DF,0x9CD5,0xE4E0, +0x9CD6,0x9CD7,0xCFAA,0x9CD8,0x9CD9,0x9CDA,0x9CDB,0xCBDD, +0x9CDC,0xE4DA,0xE4D1,0x9CDD,0xE4E5,0x9CDE,0xC8DC,0xE4E3, +0x9CDF,0x9CE0,0xC4E7,0xE4E2,0x9CE1,0xE4E1,0x9CE2,0x9CE3, +0x9CE4,0xB3FC,0xE4E8,0x9CE5,0x9CE6,0x9CE7,0x9CE8,0xB5E1, +0x9CE9,0x9CEA,0x9CEB,0xD7CC,0x9CEC,0x9CED,0x9CEE,0xE4E6, +0x9CEF,0xBBAC,0x9CF0,0xD7D2,0xCCCF,0xEBF8,0x9CF1,0xE4E4, +0x9CF2,0x9CF3,0xB9F6,0x9CF4,0x9CF5,0x9CF6,0xD6CD,0xE4D9, +0xE4DC,0xC2FA,0xE4DE,0x9CF7,0xC2CB,0xC0C4,0xC2D0,0x9CF8, +0xB1F5,0xCCB2,0x9CF9,0x9CFA,0x9CFB,0x9CFC,0x9CFD,0x9CFE, +0x9D40,0x9D41,0x9D42,0x9D43,0xB5CE,0x9D44,0x9D45,0x9D46, +0x9D47,0xE4EF,0x9D48,0x9D49,0x9D4A,0x9D4B,0x9D4C,0x9D4D, +0x9D4E,0x9D4F,0xC6AF,0x9D50,0x9D51,0x9D52,0xC6E1,0x9D53, +0x9D54,0xE4F5,0x9D55,0x9D56,0x9D57,0x9D58,0x9D59,0xC2A9, +0x9D5A,0x9D5B,0x9D5C,0xC0EC,0xD1DD,0xE4EE,0x9D5D,0x9D5E, +0x9D5F,0x9D60,0x9D61,0x9D62,0x9D63,0x9D64,0x9D65,0x9D66, +0xC4AE,0x9D67,0x9D68,0x9D69,0xE4ED,0x9D6A,0x9D6B,0x9D6C, +0x9D6D,0xE4F6,0xE4F4,0xC2FE,0x9D6E,0xE4DD,0x9D6F,0xE4F0, +0x9D70,0xCAFE,0x9D71,0xD5C4,0x9D72,0x9D73,0xE4F1,0x9D74, +0x9D75,0x9D76,0x9D77,0x9D78,0x9D79,0x9D7A,0xD1FA,0x9D7B, +0x9D7C,0x9D7D,0x9D7E,0x9D80,0x9D81,0x9D82,0xE4EB,0xE4EC, +0x9D83,0x9D84,0x9D85,0xE4F2,0x9D86,0xCEAB,0x9D87,0x9D88, +0x9D89,0x9D8A,0x9D8B,0x9D8C,0x9D8D,0x9D8E,0x9D8F,0x9D90, +0xC5CB,0x9D91,0x9D92,0x9D93,0xC7B1,0x9D94,0xC2BA,0x9D95, +0x9D96,0x9D97,0xE4EA,0x9D98,0x9D99,0x9D9A,0xC1CA,0x9D9B, +0x9D9C,0x9D9D,0x9D9E,0x9D9F,0x9DA0,0xCCB6,0xB3B1,0x9DA1, +0x9DA2,0x9DA3,0xE4FB,0x9DA4,0xE4F3,0x9DA5,0x9DA6,0x9DA7, +0xE4FA,0x9DA8,0xE4FD,0x9DA9,0xE4FC,0x9DAA,0x9DAB,0x9DAC, +0x9DAD,0x9DAE,0x9DAF,0x9DB0,0xB3CE,0x9DB1,0x9DB2,0x9DB3, +0xB3BA,0xE4F7,0x9DB4,0x9DB5,0xE4F9,0xE4F8,0xC5EC,0x9DB6, +0x9DB7,0x9DB8,0x9DB9,0x9DBA,0x9DBB,0x9DBC,0x9DBD,0x9DBE, +0x9DBF,0x9DC0,0x9DC1,0x9DC2,0xC0BD,0x9DC3,0x9DC4,0x9DC5, +0x9DC6,0xD4E8,0x9DC7,0x9DC8,0x9DC9,0x9DCA,0x9DCB,0xE5A2, +0x9DCC,0x9DCD,0x9DCE,0x9DCF,0x9DD0,0x9DD1,0x9DD2,0x9DD3, +0x9DD4,0x9DD5,0x9DD6,0xB0C4,0x9DD7,0x9DD8,0xE5A4,0x9DD9, +0x9DDA,0xE5A3,0x9DDB,0x9DDC,0x9DDD,0x9DDE,0x9DDF,0x9DE0, +0xBCA4,0x9DE1,0xE5A5,0x9DE2,0x9DE3,0x9DE4,0x9DE5,0x9DE6, +0x9DE7,0xE5A1,0x9DE8,0x9DE9,0x9DEA,0x9DEB,0x9DEC,0x9DED, +0x9DEE,0xE4FE,0xB1F4,0x9DEF,0x9DF0,0x9DF1,0x9DF2,0x9DF3, +0x9DF4,0x9DF5,0x9DF6,0x9DF7,0x9DF8,0x9DF9,0xE5A8,0x9DFA, +0xE5A9,0xE5A6,0x9DFB,0x9DFC,0x9DFD,0x9DFE,0x9E40,0x9E41, +0x9E42,0x9E43,0x9E44,0x9E45,0x9E46,0x9E47,0xE5A7,0xE5AA, +0x9E48,0x9E49,0x9E4A,0x9E4B,0x9E4C,0x9E4D,0x9E4E,0x9E4F, +0x9E50,0x9E51,0x9E52,0x9E53,0x9E54,0x9E55,0x9E56,0x9E57, +0x9E58,0x9E59,0x9E5A,0x9E5B,0x9E5C,0x9E5D,0x9E5E,0x9E5F, +0x9E60,0x9E61,0x9E62,0x9E63,0x9E64,0x9E65,0x9E66,0x9E67, +0x9E68,0xC6D9,0x9E69,0x9E6A,0x9E6B,0x9E6C,0x9E6D,0x9E6E, +0x9E6F,0x9E70,0xE5AB,0xE5AD,0x9E71,0x9E72,0x9E73,0x9E74, +0x9E75,0x9E76,0x9E77,0xE5AC,0x9E78,0x9E79,0x9E7A,0x9E7B, +0x9E7C,0x9E7D,0x9E7E,0x9E80,0x9E81,0x9E82,0x9E83,0x9E84, +0x9E85,0x9E86,0x9E87,0x9E88,0x9E89,0xE5AF,0x9E8A,0x9E8B, +0x9E8C,0xE5AE,0x9E8D,0x9E8E,0x9E8F,0x9E90,0x9E91,0x9E92, +0x9E93,0x9E94,0x9E95,0x9E96,0x9E97,0x9E98,0x9E99,0x9E9A, +0x9E9B,0x9E9C,0x9E9D,0x9E9E,0xB9E0,0x9E9F,0x9EA0,0xE5B0, +0x9EA1,0x9EA2,0x9EA3,0x9EA4,0x9EA5,0x9EA6,0x9EA7,0x9EA8, +0x9EA9,0x9EAA,0x9EAB,0x9EAC,0x9EAD,0x9EAE,0xE5B1,0x9EAF, +0x9EB0,0x9EB1,0x9EB2,0x9EB3,0x9EB4,0x9EB5,0x9EB6,0x9EB7, +0x9EB8,0x9EB9,0x9EBA,0xBBF0,0xECE1,0xC3F0,0x9EBB,0xB5C6, +0xBBD2,0x9EBC,0x9EBD,0x9EBE,0x9EBF,0xC1E9,0xD4EE,0x9EC0, +0xBEC4,0x9EC1,0x9EC2,0x9EC3,0xD7C6,0x9EC4,0xD4D6,0xB2D3, +0xECBE,0x9EC5,0x9EC6,0x9EC7,0x9EC8,0xEAC1,0x9EC9,0x9ECA, +0x9ECB,0xC2AF,0xB4B6,0x9ECC,0x9ECD,0x9ECE,0xD1D7,0x9ECF, +0x9ED0,0x9ED1,0xB3B4,0x9ED2,0xC8B2,0xBFBB,0xECC0,0x9ED3, +0x9ED4,0xD6CB,0x9ED5,0x9ED6,0xECBF,0xECC1,0x9ED7,0x9ED8, +0x9ED9,0x9EDA,0x9EDB,0x9EDC,0x9EDD,0x9EDE,0x9EDF,0x9EE0, +0x9EE1,0x9EE2,0x9EE3,0xECC5,0xBEE6,0xCCBF,0xC5DA,0xBEBC, +0x9EE4,0xECC6,0x9EE5,0xB1FE,0x9EE6,0x9EE7,0x9EE8,0xECC4, +0xD5A8,0xB5E3,0x9EE9,0xECC2,0xC1B6,0xB3E3,0x9EEA,0x9EEB, +0xECC3,0xCBB8,0xC0C3,0xCCFE,0x9EEC,0x9EED,0x9EEE,0x9EEF, +0xC1D2,0x9EF0,0xECC8,0x9EF1,0x9EF2,0x9EF3,0x9EF4,0x9EF5, +0x9EF6,0x9EF7,0x9EF8,0x9EF9,0x9EFA,0x9EFB,0x9EFC,0x9EFD, +0xBAE6,0xC0D3,0x9EFE,0xD6F2,0x9F40,0x9F41,0x9F42,0xD1CC, +0x9F43,0x9F44,0x9F45,0x9F46,0xBFBE,0x9F47,0xB7B3,0xC9D5, +0xECC7,0xBBE2,0x9F48,0xCCCC,0xBDFD,0xC8C8,0x9F49,0xCFA9, +0x9F4A,0x9F4B,0x9F4C,0x9F4D,0x9F4E,0x9F4F,0x9F50,0xCDE9, +0x9F51,0xC5EB,0x9F52,0x9F53,0x9F54,0xB7E9,0x9F55,0x9F56, +0x9F57,0x9F58,0x9F59,0x9F5A,0x9F5B,0x9F5C,0x9F5D,0x9F5E, +0x9F5F,0xD1C9,0xBAB8,0x9F60,0x9F61,0x9F62,0x9F63,0x9F64, +0xECC9,0x9F65,0x9F66,0xECCA,0x9F67,0xBBC0,0xECCB,0x9F68, +0xECE2,0xB1BA,0xB7D9,0x9F69,0x9F6A,0x9F6B,0x9F6C,0x9F6D, +0x9F6E,0x9F6F,0x9F70,0x9F71,0x9F72,0x9F73,0xBDB9,0x9F74, +0x9F75,0x9F76,0x9F77,0x9F78,0x9F79,0x9F7A,0x9F7B,0xECCC, +0xD1E6,0xECCD,0x9F7C,0x9F7D,0x9F7E,0x9F80,0xC8BB,0x9F81, +0x9F82,0x9F83,0x9F84,0x9F85,0x9F86,0x9F87,0x9F88,0x9F89, +0x9F8A,0x9F8B,0x9F8C,0x9F8D,0x9F8E,0xECD1,0x9F8F,0x9F90, +0x9F91,0x9F92,0xECD3,0x9F93,0xBBCD,0x9F94,0xBCE5,0x9F95, +0x9F96,0x9F97,0x9F98,0x9F99,0x9F9A,0x9F9B,0x9F9C,0x9F9D, +0x9F9E,0x9F9F,0x9FA0,0x9FA1,0xECCF,0x9FA2,0xC9B7,0x9FA3, +0x9FA4,0x9FA5,0x9FA6,0x9FA7,0xC3BA,0x9FA8,0xECE3,0xD5D5, +0xECD0,0x9FA9,0x9FAA,0x9FAB,0x9FAC,0x9FAD,0xD6F3,0x9FAE, +0x9FAF,0x9FB0,0xECD2,0xECCE,0x9FB1,0x9FB2,0x9FB3,0x9FB4, +0xECD4,0x9FB5,0xECD5,0x9FB6,0x9FB7,0xC9BF,0x9FB8,0x9FB9, +0x9FBA,0x9FBB,0x9FBC,0x9FBD,0xCFA8,0x9FBE,0x9FBF,0x9FC0, +0x9FC1,0x9FC2,0xD0DC,0x9FC3,0x9FC4,0x9FC5,0x9FC6,0xD1AC, +0x9FC7,0x9FC8,0x9FC9,0x9FCA,0xC8DB,0x9FCB,0x9FCC,0x9FCD, +0xECD6,0xCEF5,0x9FCE,0x9FCF,0x9FD0,0x9FD1,0x9FD2,0xCAEC, +0xECDA,0x9FD3,0x9FD4,0x9FD5,0x9FD6,0x9FD7,0x9FD8,0x9FD9, +0xECD9,0x9FDA,0x9FDB,0x9FDC,0xB0BE,0x9FDD,0x9FDE,0x9FDF, +0x9FE0,0x9FE1,0x9FE2,0xECD7,0x9FE3,0xECD8,0x9FE4,0x9FE5, +0x9FE6,0xECE4,0x9FE7,0x9FE8,0x9FE9,0x9FEA,0x9FEB,0x9FEC, +0x9FED,0x9FEE,0x9FEF,0xC8BC,0x9FF0,0x9FF1,0x9FF2,0x9FF3, +0x9FF4,0x9FF5,0x9FF6,0x9FF7,0x9FF8,0x9FF9,0xC1C7,0x9FFA, +0x9FFB,0x9FFC,0x9FFD,0x9FFE,0xECDC,0xD1E0,0xA040,0xA041, +0xA042,0xA043,0xA044,0xA045,0xA046,0xA047,0xA048,0xA049, +0xECDB,0xA04A,0xA04B,0xA04C,0xA04D,0xD4EF,0xA04E,0xECDD, +0xA04F,0xA050,0xA051,0xA052,0xA053,0xA054,0xDBC6,0xA055, +0xA056,0xA057,0xA058,0xA059,0xA05A,0xA05B,0xA05C,0xA05D, +0xA05E,0xECDE,0xA05F,0xA060,0xA061,0xA062,0xA063,0xA064, +0xA065,0xA066,0xA067,0xA068,0xA069,0xA06A,0xB1AC,0xA06B, +0xA06C,0xA06D,0xA06E,0xA06F,0xA070,0xA071,0xA072,0xA073, +0xA074,0xA075,0xA076,0xA077,0xA078,0xA079,0xA07A,0xA07B, +0xA07C,0xA07D,0xA07E,0xA080,0xA081,0xECDF,0xA082,0xA083, +0xA084,0xA085,0xA086,0xA087,0xA088,0xA089,0xA08A,0xA08B, +0xECE0,0xA08C,0xD7A6,0xA08D,0xC5C0,0xA08E,0xA08F,0xA090, +0xEBBC,0xB0AE,0xA091,0xA092,0xA093,0xBEF4,0xB8B8,0xD2AF, +0xB0D6,0xB5F9,0xA094,0xD8B3,0xA095,0xCBAC,0xA096,0xE3DD, +0xA097,0xA098,0xA099,0xA09A,0xA09B,0xA09C,0xA09D,0xC6AC, +0xB0E6,0xA09E,0xA09F,0xA0A0,0xC5C6,0xEBB9,0xA0A1,0xA0A2, +0xA0A3,0xA0A4,0xEBBA,0xA0A5,0xA0A6,0xA0A7,0xEBBB,0xA0A8, +0xA0A9,0xD1C0,0xA0AA,0xC5A3,0xA0AB,0xEAF2,0xA0AC,0xC4B2, +0xA0AD,0xC4B5,0xC0CE,0xA0AE,0xA0AF,0xA0B0,0xEAF3,0xC4C1, +0xA0B1,0xCEEF,0xA0B2,0xA0B3,0xA0B4,0xA0B5,0xEAF0,0xEAF4, +0xA0B6,0xA0B7,0xC9FC,0xA0B8,0xA0B9,0xC7A3,0xA0BA,0xA0BB, +0xA0BC,0xCCD8,0xCEFE,0xA0BD,0xA0BE,0xA0BF,0xEAF5,0xEAF6, +0xCFAC,0xC0E7,0xA0C0,0xA0C1,0xEAF7,0xA0C2,0xA0C3,0xA0C4, +0xA0C5,0xA0C6,0xB6BF,0xEAF8,0xA0C7,0xEAF9,0xA0C8,0xEAFA, +0xA0C9,0xA0CA,0xEAFB,0xA0CB,0xA0CC,0xA0CD,0xA0CE,0xA0CF, +0xA0D0,0xA0D1,0xA0D2,0xA0D3,0xA0D4,0xA0D5,0xA0D6,0xEAF1, +0xA0D7,0xA0D8,0xA0D9,0xA0DA,0xA0DB,0xA0DC,0xA0DD,0xA0DE, +0xA0DF,0xA0E0,0xA0E1,0xA0E2,0xC8AE,0xE1EB,0xA0E3,0xB7B8, +0xE1EC,0xA0E4,0xA0E5,0xA0E6,0xE1ED,0xA0E7,0xD7B4,0xE1EE, +0xE1EF,0xD3CC,0xA0E8,0xA0E9,0xA0EA,0xA0EB,0xA0EC,0xA0ED, +0xA0EE,0xE1F1,0xBFF1,0xE1F0,0xB5D2,0xA0EF,0xA0F0,0xA0F1, +0xB1B7,0xA0F2,0xA0F3,0xA0F4,0xA0F5,0xE1F3,0xE1F2,0xA0F6, +0xBAFC,0xA0F7,0xE1F4,0xA0F8,0xA0F9,0xA0FA,0xA0FB,0xB9B7, +0xA0FC,0xBED1,0xA0FD,0xA0FE,0xAA40,0xAA41,0xC4FC,0xAA42, +0xBADD,0xBDC6,0xAA43,0xAA44,0xAA45,0xAA46,0xAA47,0xAA48, +0xE1F5,0xE1F7,0xAA49,0xAA4A,0xB6C0,0xCFC1,0xCAA8,0xE1F6, +0xD5F8,0xD3FC,0xE1F8,0xE1FC,0xE1F9,0xAA4B,0xAA4C,0xE1FA, +0xC0EA,0xAA4D,0xE1FE,0xE2A1,0xC0C7,0xAA4E,0xAA4F,0xAA50, +0xAA51,0xE1FB,0xAA52,0xE1FD,0xAA53,0xAA54,0xAA55,0xAA56, +0xAA57,0xAA58,0xE2A5,0xAA59,0xAA5A,0xAA5B,0xC1D4,0xAA5C, +0xAA5D,0xAA5E,0xAA5F,0xE2A3,0xAA60,0xE2A8,0xB2FE,0xE2A2, +0xAA61,0xAA62,0xAA63,0xC3CD,0xB2C2,0xE2A7,0xE2A6,0xAA64, +0xAA65,0xE2A4,0xE2A9,0xAA66,0xAA67,0xE2AB,0xAA68,0xAA69, +0xAA6A,0xD0C9,0xD6ED,0xC3A8,0xE2AC,0xAA6B,0xCFD7,0xAA6C, +0xAA6D,0xE2AE,0xAA6E,0xAA6F,0xBAEF,0xAA70,0xAA71,0xE9E0, +0xE2AD,0xE2AA,0xAA72,0xAA73,0xAA74,0xAA75,0xBBAB,0xD4B3, +0xAA76,0xAA77,0xAA78,0xAA79,0xAA7A,0xAA7B,0xAA7C,0xAA7D, +0xAA7E,0xAA80,0xAA81,0xAA82,0xAA83,0xE2B0,0xAA84,0xAA85, +0xE2AF,0xAA86,0xE9E1,0xAA87,0xAA88,0xAA89,0xAA8A,0xE2B1, +0xAA8B,0xAA8C,0xAA8D,0xAA8E,0xAA8F,0xAA90,0xAA91,0xAA92, +0xE2B2,0xAA93,0xAA94,0xAA95,0xAA96,0xAA97,0xAA98,0xAA99, +0xAA9A,0xAA9B,0xAA9C,0xAA9D,0xE2B3,0xCCA1,0xAA9E,0xE2B4, +0xAA9F,0xAAA0,0xAB40,0xAB41,0xAB42,0xAB43,0xAB44,0xAB45, +0xAB46,0xAB47,0xAB48,0xAB49,0xAB4A,0xAB4B,0xE2B5,0xAB4C, +0xAB4D,0xAB4E,0xAB4F,0xAB50,0xD0FE,0xAB51,0xAB52,0xC2CA, +0xAB53,0xD3F1,0xAB54,0xCDF5,0xAB55,0xAB56,0xE7E0,0xAB57, +0xAB58,0xE7E1,0xAB59,0xAB5A,0xAB5B,0xAB5C,0xBEC1,0xAB5D, +0xAB5E,0xAB5F,0xAB60,0xC2EA,0xAB61,0xAB62,0xAB63,0xE7E4, +0xAB64,0xAB65,0xE7E3,0xAB66,0xAB67,0xAB68,0xAB69,0xAB6A, +0xAB6B,0xCDE6,0xAB6C,0xC3B5,0xAB6D,0xAB6E,0xE7E2,0xBBB7, +0xCFD6,0xAB6F,0xC1E1,0xE7E9,0xAB70,0xAB71,0xAB72,0xE7E8, +0xAB73,0xAB74,0xE7F4,0xB2A3,0xAB75,0xAB76,0xAB77,0xAB78, +0xE7EA,0xAB79,0xE7E6,0xAB7A,0xAB7B,0xAB7C,0xAB7D,0xAB7E, +0xE7EC,0xE7EB,0xC9BA,0xAB80,0xAB81,0xD5E4,0xAB82,0xE7E5, +0xB7A9,0xE7E7,0xAB83,0xAB84,0xAB85,0xAB86,0xAB87,0xAB88, +0xAB89,0xE7EE,0xAB8A,0xAB8B,0xAB8C,0xAB8D,0xE7F3,0xAB8E, +0xD6E9,0xAB8F,0xAB90,0xAB91,0xAB92,0xE7ED,0xAB93,0xE7F2, +0xAB94,0xE7F1,0xAB95,0xAB96,0xAB97,0xB0E0,0xAB98,0xAB99, +0xAB9A,0xAB9B,0xE7F5,0xAB9C,0xAB9D,0xAB9E,0xAB9F,0xABA0, +0xAC40,0xAC41,0xAC42,0xAC43,0xAC44,0xAC45,0xAC46,0xAC47, +0xAC48,0xAC49,0xAC4A,0xC7F2,0xAC4B,0xC0C5,0xC0ED,0xAC4C, +0xAC4D,0xC1F0,0xE7F0,0xAC4E,0xAC4F,0xAC50,0xAC51,0xE7F6, +0xCBF6,0xAC52,0xAC53,0xAC54,0xAC55,0xAC56,0xAC57,0xAC58, +0xAC59,0xAC5A,0xE8A2,0xE8A1,0xAC5B,0xAC5C,0xAC5D,0xAC5E, +0xAC5F,0xAC60,0xD7C1,0xAC61,0xAC62,0xE7FA,0xE7F9,0xAC63, +0xE7FB,0xAC64,0xE7F7,0xAC65,0xE7FE,0xAC66,0xE7FD,0xAC67, +0xE7FC,0xAC68,0xAC69,0xC1D5,0xC7D9,0xC5FD,0xC5C3,0xAC6A, +0xAC6B,0xAC6C,0xAC6D,0xAC6E,0xC7ED,0xAC6F,0xAC70,0xAC71, +0xAC72,0xE8A3,0xAC73,0xAC74,0xAC75,0xAC76,0xAC77,0xAC78, +0xAC79,0xAC7A,0xAC7B,0xAC7C,0xAC7D,0xAC7E,0xAC80,0xAC81, +0xAC82,0xAC83,0xAC84,0xAC85,0xAC86,0xE8A6,0xAC87,0xE8A5, +0xAC88,0xE8A7,0xBAF7,0xE7F8,0xE8A4,0xAC89,0xC8F0,0xC9AA, +0xAC8A,0xAC8B,0xAC8C,0xAC8D,0xAC8E,0xAC8F,0xAC90,0xAC91, +0xAC92,0xAC93,0xAC94,0xAC95,0xAC96,0xE8A9,0xAC97,0xAC98, +0xB9E5,0xAC99,0xAC9A,0xAC9B,0xAC9C,0xAC9D,0xD1FE,0xE8A8, +0xAC9E,0xAC9F,0xACA0,0xAD40,0xAD41,0xAD42,0xE8AA,0xAD43, +0xE8AD,0xE8AE,0xAD44,0xC1A7,0xAD45,0xAD46,0xAD47,0xE8AF, +0xAD48,0xAD49,0xAD4A,0xE8B0,0xAD4B,0xAD4C,0xE8AC,0xAD4D, +0xE8B4,0xAD4E,0xAD4F,0xAD50,0xAD51,0xAD52,0xAD53,0xAD54, +0xAD55,0xAD56,0xAD57,0xAD58,0xE8AB,0xAD59,0xE8B1,0xAD5A, +0xAD5B,0xAD5C,0xAD5D,0xAD5E,0xAD5F,0xAD60,0xAD61,0xE8B5, +0xE8B2,0xE8B3,0xAD62,0xAD63,0xAD64,0xAD65,0xAD66,0xAD67, +0xAD68,0xAD69,0xAD6A,0xAD6B,0xAD6C,0xAD6D,0xAD6E,0xAD6F, +0xAD70,0xAD71,0xE8B7,0xAD72,0xAD73,0xAD74,0xAD75,0xAD76, +0xAD77,0xAD78,0xAD79,0xAD7A,0xAD7B,0xAD7C,0xAD7D,0xAD7E, +0xAD80,0xAD81,0xAD82,0xAD83,0xAD84,0xAD85,0xAD86,0xAD87, +0xAD88,0xAD89,0xE8B6,0xAD8A,0xAD8B,0xAD8C,0xAD8D,0xAD8E, +0xAD8F,0xAD90,0xAD91,0xAD92,0xB9CF,0xAD93,0xF0AC,0xAD94, +0xF0AD,0xAD95,0xC6B0,0xB0EA,0xC8BF,0xAD96,0xCDDF,0xAD97, +0xAD98,0xAD99,0xAD9A,0xAD9B,0xAD9C,0xAD9D,0xCECD,0xEAB1, +0xAD9E,0xAD9F,0xADA0,0xAE40,0xEAB2,0xAE41,0xC6BF,0xB4C9, +0xAE42,0xAE43,0xAE44,0xAE45,0xAE46,0xAE47,0xAE48,0xEAB3, +0xAE49,0xAE4A,0xAE4B,0xAE4C,0xD5E7,0xAE4D,0xAE4E,0xAE4F, +0xAE50,0xAE51,0xAE52,0xAE53,0xAE54,0xDDF9,0xAE55,0xEAB4, +0xAE56,0xEAB5,0xAE57,0xEAB6,0xAE58,0xAE59,0xAE5A,0xAE5B, +0xB8CA,0xDFB0,0xC9F5,0xAE5C,0xCCF0,0xAE5D,0xAE5E,0xC9FA, +0xAE5F,0xAE60,0xAE61,0xAE62,0xAE63,0xC9FB,0xAE64,0xAE65, +0xD3C3,0xCBA6,0xAE66,0xB8A6,0xF0AE,0xB1C2,0xAE67,0xE5B8, +0xCCEF,0xD3C9,0xBCD7,0xC9EA,0xAE68,0xB5E7,0xAE69,0xC4D0, +0xB5E9,0xAE6A,0xEEAE,0xBBAD,0xAE6B,0xAE6C,0xE7DE,0xAE6D, +0xEEAF,0xAE6E,0xAE6F,0xAE70,0xAE71,0xB3A9,0xAE72,0xAE73, +0xEEB2,0xAE74,0xAE75,0xEEB1,0xBDE7,0xAE76,0xEEB0,0xCEB7, +0xAE77,0xAE78,0xAE79,0xAE7A,0xC5CF,0xAE7B,0xAE7C,0xAE7D, +0xAE7E,0xC1F4,0xDBCE,0xEEB3,0xD0F3,0xAE80,0xAE81,0xAE82, +0xAE83,0xAE84,0xAE85,0xAE86,0xAE87,0xC2D4,0xC6E8,0xAE88, +0xAE89,0xAE8A,0xB7AC,0xAE8B,0xAE8C,0xAE8D,0xAE8E,0xAE8F, +0xAE90,0xAE91,0xEEB4,0xAE92,0xB3EB,0xAE93,0xAE94,0xAE95, +0xBBFB,0xEEB5,0xAE96,0xAE97,0xAE98,0xAE99,0xAE9A,0xE7DC, +0xAE9B,0xAE9C,0xAE9D,0xEEB6,0xAE9E,0xAE9F,0xBDAE,0xAEA0, +0xAF40,0xAF41,0xAF42,0xF1E2,0xAF43,0xAF44,0xAF45,0xCAE8, +0xAF46,0xD2C9,0xF0DA,0xAF47,0xF0DB,0xAF48,0xF0DC,0xC1C6, +0xAF49,0xB8ED,0xBECE,0xAF4A,0xAF4B,0xF0DE,0xAF4C,0xC5B1, +0xF0DD,0xD1F1,0xAF4D,0xF0E0,0xB0CC,0xBDEA,0xAF4E,0xAF4F, +0xAF50,0xAF51,0xAF52,0xD2DF,0xF0DF,0xAF53,0xB4AF,0xB7E8, +0xF0E6,0xF0E5,0xC6A3,0xF0E1,0xF0E2,0xB4C3,0xAF54,0xAF55, +0xF0E3,0xD5EE,0xAF56,0xAF57,0xCCDB,0xBED2,0xBCB2,0xAF58, +0xAF59,0xAF5A,0xF0E8,0xF0E7,0xF0E4,0xB2A1,0xAF5B,0xD6A2, +0xD3B8,0xBEB7,0xC8AC,0xAF5C,0xAF5D,0xF0EA,0xAF5E,0xAF5F, +0xAF60,0xAF61,0xD1F7,0xAF62,0xD6CC,0xBADB,0xF0E9,0xAF63, +0xB6BB,0xAF64,0xAF65,0xCDB4,0xAF66,0xAF67,0xC6A6,0xAF68, +0xAF69,0xAF6A,0xC1A1,0xF0EB,0xF0EE,0xAF6B,0xF0ED,0xF0F0, +0xF0EC,0xAF6C,0xBBBE,0xF0EF,0xAF6D,0xAF6E,0xAF6F,0xAF70, +0xCCB5,0xF0F2,0xAF71,0xAF72,0xB3D5,0xAF73,0xAF74,0xAF75, +0xAF76,0xB1D4,0xAF77,0xAF78,0xF0F3,0xAF79,0xAF7A,0xF0F4, +0xF0F6,0xB4E1,0xAF7B,0xF0F1,0xAF7C,0xF0F7,0xAF7D,0xAF7E, +0xAF80,0xAF81,0xF0FA,0xAF82,0xF0F8,0xAF83,0xAF84,0xAF85, +0xF0F5,0xAF86,0xAF87,0xAF88,0xAF89,0xF0FD,0xAF8A,0xF0F9, +0xF0FC,0xF0FE,0xAF8B,0xF1A1,0xAF8C,0xAF8D,0xAF8E,0xCEC1, +0xF1A4,0xAF8F,0xF1A3,0xAF90,0xC1F6,0xF0FB,0xCADD,0xAF91, +0xAF92,0xB4F1,0xB1F1,0xCCB1,0xAF93,0xF1A6,0xAF94,0xAF95, +0xF1A7,0xAF96,0xAF97,0xF1AC,0xD5CE,0xF1A9,0xAF98,0xAF99, +0xC8B3,0xAF9A,0xAF9B,0xAF9C,0xF1A2,0xAF9D,0xF1AB,0xF1A8, +0xF1A5,0xAF9E,0xAF9F,0xF1AA,0xAFA0,0xB040,0xB041,0xB042, +0xB043,0xB044,0xB045,0xB046,0xB0A9,0xF1AD,0xB047,0xB048, +0xB049,0xB04A,0xB04B,0xB04C,0xF1AF,0xB04D,0xF1B1,0xB04E, +0xB04F,0xB050,0xB051,0xB052,0xF1B0,0xB053,0xF1AE,0xB054, +0xB055,0xB056,0xB057,0xD1A2,0xB058,0xB059,0xB05A,0xB05B, +0xB05C,0xB05D,0xB05E,0xF1B2,0xB05F,0xB060,0xB061,0xF1B3, +0xB062,0xB063,0xB064,0xB065,0xB066,0xB067,0xB068,0xB069, +0xB9EF,0xB06A,0xB06B,0xB5C7,0xB06C,0xB0D7,0xB0D9,0xB06D, +0xB06E,0xB06F,0xD4ED,0xB070,0xB5C4,0xB071,0xBDD4,0xBBCA, +0xF0A7,0xB072,0xB073,0xB8DE,0xB074,0xB075,0xF0A8,0xB076, +0xB077,0xB0A8,0xB078,0xF0A9,0xB079,0xB07A,0xCDEE,0xB07B, +0xB07C,0xF0AA,0xB07D,0xB07E,0xB080,0xB081,0xB082,0xB083, +0xB084,0xB085,0xB086,0xB087,0xF0AB,0xB088,0xB089,0xB08A, +0xB08B,0xB08C,0xB08D,0xB08E,0xB08F,0xB090,0xC6A4,0xB091, +0xB092,0xD6E5,0xF1E4,0xB093,0xF1E5,0xB094,0xB095,0xB096, +0xB097,0xB098,0xB099,0xB09A,0xB09B,0xB09C,0xB09D,0xC3F3, +0xB09E,0xB09F,0xD3DB,0xB0A0,0xB140,0xD6D1,0xC5E8,0xB141, +0xD3AF,0xB142,0xD2E6,0xB143,0xB144,0xEEC1,0xB0BB,0xD5B5, +0xD1CE,0xBCE0,0xBAD0,0xB145,0xBFF8,0xB146,0xB8C7,0xB5C1, +0xC5CC,0xB147,0xB148,0xCAA2,0xB149,0xB14A,0xB14B,0xC3CB, +0xB14C,0xB14D,0xB14E,0xB14F,0xB150,0xEEC2,0xB151,0xB152, +0xB153,0xB154,0xB155,0xB156,0xB157,0xB158,0xC4BF,0xB6A2, +0xB159,0xEDEC,0xC3A4,0xB15A,0xD6B1,0xB15B,0xB15C,0xB15D, +0xCFE0,0xEDEF,0xB15E,0xB15F,0xC5CE,0xB160,0xB6DC,0xB161, +0xB162,0xCAA1,0xB163,0xB164,0xEDED,0xB165,0xB166,0xEDF0, +0xEDF1,0xC3BC,0xB167,0xBFB4,0xB168,0xEDEE,0xB169,0xB16A, +0xB16B,0xB16C,0xB16D,0xB16E,0xB16F,0xB170,0xB171,0xB172, +0xB173,0xEDF4,0xEDF2,0xB174,0xB175,0xB176,0xB177,0xD5E6, +0xC3DF,0xB178,0xEDF3,0xB179,0xB17A,0xB17B,0xEDF6,0xB17C, +0xD5A3,0xD1A3,0xB17D,0xB17E,0xB180,0xEDF5,0xB181,0xC3D0, +0xB182,0xB183,0xB184,0xB185,0xB186,0xEDF7,0xBFF4,0xBEEC, +0xEDF8,0xB187,0xCCF7,0xB188,0xD1DB,0xB189,0xB18A,0xB18B, +0xD7C5,0xD5F6,0xB18C,0xEDFC,0xB18D,0xB18E,0xB18F,0xEDFB, +0xB190,0xB191,0xB192,0xB193,0xB194,0xB195,0xB196,0xB197, +0xEDF9,0xEDFA,0xB198,0xB199,0xB19A,0xB19B,0xB19C,0xB19D, +0xB19E,0xB19F,0xEDFD,0xBEA6,0xB1A0,0xB240,0xB241,0xB242, +0xB243,0xCBAF,0xEEA1,0xB6BD,0xB244,0xEEA2,0xC4C0,0xB245, +0xEDFE,0xB246,0xB247,0xBDDE,0xB2C7,0xB248,0xB249,0xB24A, +0xB24B,0xB24C,0xB24D,0xB24E,0xB24F,0xB250,0xB251,0xB252, +0xB253,0xB6C3,0xB254,0xB255,0xB256,0xEEA5,0xD8BA,0xEEA3, +0xEEA6,0xB257,0xB258,0xB259,0xC3E9,0xB3F2,0xB25A,0xB25B, +0xB25C,0xB25D,0xB25E,0xB25F,0xEEA7,0xEEA4,0xCFB9,0xB260, +0xB261,0xEEA8,0xC2F7,0xB262,0xB263,0xB264,0xB265,0xB266, +0xB267,0xB268,0xB269,0xB26A,0xB26B,0xB26C,0xB26D,0xEEA9, +0xEEAA,0xB26E,0xDEAB,0xB26F,0xB270,0xC6B3,0xB271,0xC7C6, +0xB272,0xD6F5,0xB5C9,0xB273,0xCBB2,0xB274,0xB275,0xB276, +0xEEAB,0xB277,0xB278,0xCDAB,0xB279,0xEEAC,0xB27A,0xB27B, +0xB27C,0xB27D,0xB27E,0xD5B0,0xB280,0xEEAD,0xB281,0xF6C4, +0xB282,0xB283,0xB284,0xB285,0xB286,0xB287,0xB288,0xB289, +0xB28A,0xB28B,0xB28C,0xB28D,0xB28E,0xDBC7,0xB28F,0xB290, +0xB291,0xB292,0xB293,0xB294,0xB295,0xB296,0xB297,0xB4A3, +0xB298,0xB299,0xB29A,0xC3AC,0xF1E6,0xB29B,0xB29C,0xB29D, +0xB29E,0xB29F,0xCAB8,0xD2D3,0xB2A0,0xD6AA,0xB340,0xEFF2, +0xB341,0xBED8,0xB342,0xBDC3,0xEFF3,0xB6CC,0xB0AB,0xB343, +0xB344,0xB345,0xB346,0xCAAF,0xB347,0xB348,0xEDB6,0xB349, +0xEDB7,0xB34A,0xB34B,0xB34C,0xB34D,0xCEF9,0xB7AF,0xBFF3, +0xEDB8,0xC2EB,0xC9B0,0xB34E,0xB34F,0xB350,0xB351,0xB352, +0xB353,0xEDB9,0xB354,0xB355,0xC6F6,0xBFB3,0xB356,0xB357, +0xB358,0xEDBC,0xC5F8,0xB359,0xD1D0,0xB35A,0xD7A9,0xEDBA, +0xEDBB,0xB35B,0xD1E2,0xB35C,0xEDBF,0xEDC0,0xB35D,0xEDC4, +0xB35E,0xB35F,0xB360,0xEDC8,0xB361,0xEDC6,0xEDCE,0xD5E8, +0xB362,0xEDC9,0xB363,0xB364,0xEDC7,0xEDBE,0xB365,0xB366, +0xC5E9,0xB367,0xB368,0xB369,0xC6C6,0xB36A,0xB36B,0xC9E9, +0xD4D2,0xEDC1,0xEDC2,0xEDC3,0xEDC5,0xB36C,0xC0F9,0xB36D, +0xB4A1,0xB36E,0xB36F,0xB370,0xB371,0xB9E8,0xB372,0xEDD0, +0xB373,0xB374,0xB375,0xB376,0xEDD1,0xB377,0xEDCA,0xB378, +0xEDCF,0xB379,0xCEF8,0xB37A,0xB37B,0xCBB6,0xEDCC,0xEDCD, +0xB37C,0xB37D,0xB37E,0xB380,0xB381,0xCFF5,0xB382,0xB383, +0xB384,0xB385,0xB386,0xB387,0xB388,0xB389,0xB38A,0xB38B, +0xB38C,0xB38D,0xEDD2,0xC1F2,0xD3B2,0xEDCB,0xC8B7,0xB38E, +0xB38F,0xB390,0xB391,0xB392,0xB393,0xB394,0xB395,0xBCEF, +0xB396,0xB397,0xB398,0xB399,0xC5F0,0xB39A,0xB39B,0xB39C, +0xB39D,0xB39E,0xB39F,0xB3A0,0xB440,0xB441,0xB442,0xEDD6, +0xB443,0xB5EF,0xB444,0xB445,0xC2B5,0xB0AD,0xCBE9,0xB446, +0xB447,0xB1AE,0xB448,0xEDD4,0xB449,0xB44A,0xB44B,0xCDEB, +0xB5E2,0xB44C,0xEDD5,0xEDD3,0xEDD7,0xB44D,0xB44E,0xB5FA, +0xB44F,0xEDD8,0xB450,0xEDD9,0xB451,0xEDDC,0xB452,0xB1CC, +0xB453,0xB454,0xB455,0xB456,0xB457,0xB458,0xB459,0xB45A, +0xC5F6,0xBCEE,0xEDDA,0xCCBC,0xB2EA,0xB45B,0xB45C,0xB45D, +0xB45E,0xEDDB,0xB45F,0xB460,0xB461,0xB462,0xC4EB,0xB463, +0xB464,0xB4C5,0xB465,0xB466,0xB467,0xB0F5,0xB468,0xB469, +0xB46A,0xEDDF,0xC0DA,0xB4E8,0xB46B,0xB46C,0xB46D,0xB46E, +0xC5CD,0xB46F,0xB470,0xB471,0xEDDD,0xBFC4,0xB472,0xB473, +0xB474,0xEDDE,0xB475,0xB476,0xB477,0xB478,0xB479,0xB47A, +0xB47B,0xB47C,0xB47D,0xB47E,0xB480,0xB481,0xB482,0xB483, +0xC4A5,0xB484,0xB485,0xB486,0xEDE0,0xB487,0xB488,0xB489, +0xB48A,0xB48B,0xEDE1,0xB48C,0xEDE3,0xB48D,0xB48E,0xC1D7, +0xB48F,0xB490,0xBBC7,0xB491,0xB492,0xB493,0xB494,0xB495, +0xB496,0xBDB8,0xB497,0xB498,0xB499,0xEDE2,0xB49A,0xB49B, +0xB49C,0xB49D,0xB49E,0xB49F,0xB4A0,0xB540,0xB541,0xB542, +0xB543,0xB544,0xB545,0xEDE4,0xB546,0xB547,0xB548,0xB549, +0xB54A,0xB54B,0xB54C,0xB54D,0xB54E,0xB54F,0xEDE6,0xB550, +0xB551,0xB552,0xB553,0xB554,0xEDE5,0xB555,0xB556,0xB557, +0xB558,0xB559,0xB55A,0xB55B,0xB55C,0xB55D,0xB55E,0xB55F, +0xB560,0xB561,0xB562,0xB563,0xEDE7,0xB564,0xB565,0xB566, +0xB567,0xB568,0xCABE,0xECEA,0xC0F1,0xB569,0xC9E7,0xB56A, +0xECEB,0xC6EE,0xB56B,0xB56C,0xB56D,0xB56E,0xECEC,0xB56F, +0xC6ED,0xECED,0xB570,0xB571,0xB572,0xB573,0xB574,0xB575, +0xB576,0xB577,0xB578,0xECF0,0xB579,0xB57A,0xD7E6,0xECF3, +0xB57B,0xB57C,0xECF1,0xECEE,0xECEF,0xD7A3,0xC9F1,0xCBEE, +0xECF4,0xB57D,0xECF2,0xB57E,0xB580,0xCFE9,0xB581,0xECF6, +0xC6B1,0xB582,0xB583,0xB584,0xB585,0xBCC0,0xB586,0xECF5, +0xB587,0xB588,0xB589,0xB58A,0xB58B,0xB58C,0xB58D,0xB5BB, +0xBBF6,0xB58E,0xECF7,0xB58F,0xB590,0xB591,0xB592,0xB593, +0xD9F7,0xBDFB,0xB594,0xB595,0xC2BB,0xECF8,0xB596,0xB597, +0xB598,0xB599,0xECF9,0xB59A,0xB59B,0xB59C,0xB59D,0xB8A3, +0xB59E,0xB59F,0xB5A0,0xB640,0xB641,0xB642,0xB643,0xB644, +0xB645,0xB646,0xECFA,0xB647,0xB648,0xB649,0xB64A,0xB64B, +0xB64C,0xB64D,0xB64E,0xB64F,0xB650,0xB651,0xB652,0xECFB, +0xB653,0xB654,0xB655,0xB656,0xB657,0xB658,0xB659,0xB65A, +0xB65B,0xB65C,0xB65D,0xECFC,0xB65E,0xB65F,0xB660,0xB661, +0xB662,0xD3ED,0xD8AE,0xC0EB,0xB663,0xC7DD,0xBACC,0xB664, +0xD0E3,0xCBBD,0xB665,0xCDBA,0xB666,0xB667,0xB8D1,0xB668, +0xB669,0xB1FC,0xB66A,0xC7EF,0xB66B,0xD6D6,0xB66C,0xB66D, +0xB66E,0xBFC6,0xC3EB,0xB66F,0xB670,0xEFF5,0xB671,0xB672, +0xC3D8,0xB673,0xB674,0xB675,0xB676,0xB677,0xB678,0xD7E2, +0xB679,0xB67A,0xB67B,0xEFF7,0xB3D3,0xB67C,0xC7D8,0xD1ED, +0xB67D,0xD6C8,0xB67E,0xEFF8,0xB680,0xEFF6,0xB681,0xBBFD, +0xB3C6,0xB682,0xB683,0xB684,0xB685,0xB686,0xB687,0xB688, +0xBDD5,0xB689,0xB68A,0xD2C6,0xB68B,0xBBE0,0xB68C,0xB68D, +0xCFA1,0xB68E,0xEFFC,0xEFFB,0xB68F,0xB690,0xEFF9,0xB691, +0xB692,0xB693,0xB694,0xB3CC,0xB695,0xC9D4,0xCBB0,0xB696, +0xB697,0xB698,0xB699,0xB69A,0xEFFE,0xB69B,0xB69C,0xB0DE, +0xB69D,0xB69E,0xD6C9,0xB69F,0xB6A0,0xB740,0xEFFD,0xB741, +0xB3ED,0xB742,0xB743,0xF6D5,0xB744,0xB745,0xB746,0xB747, +0xB748,0xB749,0xB74A,0xB74B,0xB74C,0xB74D,0xB74E,0xB74F, +0xB750,0xB751,0xB752,0xCEC8,0xB753,0xB754,0xB755,0xF0A2, +0xB756,0xF0A1,0xB757,0xB5BE,0xBCDA,0xBBFC,0xB758,0xB8E5, +0xB759,0xB75A,0xB75B,0xB75C,0xB75D,0xB75E,0xC4C2,0xB75F, +0xB760,0xB761,0xB762,0xB763,0xB764,0xB765,0xB766,0xB767, +0xB768,0xF0A3,0xB769,0xB76A,0xB76B,0xB76C,0xB76D,0xCBEB, +0xB76E,0xB76F,0xB770,0xB771,0xB772,0xB773,0xB774,0xB775, +0xB776,0xB777,0xB778,0xB779,0xB77A,0xB77B,0xB77C,0xB77D, +0xB77E,0xB780,0xB781,0xB782,0xB783,0xB784,0xB785,0xB786, +0xF0A6,0xB787,0xB788,0xB789,0xD1A8,0xB78A,0xBEBF,0xC7EE, +0xF1B6,0xF1B7,0xBFD5,0xB78B,0xB78C,0xB78D,0xB78E,0xB4A9, +0xF1B8,0xCDBB,0xB78F,0xC7D4,0xD5AD,0xB790,0xF1B9,0xB791, +0xF1BA,0xB792,0xB793,0xB794,0xB795,0xC7CF,0xB796,0xB797, +0xB798,0xD2A4,0xD6CF,0xB799,0xB79A,0xF1BB,0xBDD1,0xB4B0, +0xBEBD,0xB79B,0xB79C,0xB79D,0xB4DC,0xCED1,0xB79E,0xBFDF, +0xF1BD,0xB79F,0xB7A0,0xB840,0xB841,0xBFFA,0xF1BC,0xB842, +0xF1BF,0xB843,0xB844,0xB845,0xF1BE,0xF1C0,0xB846,0xB847, +0xB848,0xB849,0xB84A,0xF1C1,0xB84B,0xB84C,0xB84D,0xB84E, +0xB84F,0xB850,0xB851,0xB852,0xB853,0xB854,0xB855,0xC1FE, +0xB856,0xB857,0xB858,0xB859,0xB85A,0xB85B,0xB85C,0xB85D, +0xB85E,0xB85F,0xB860,0xC1A2,0xB861,0xB862,0xB863,0xB864, +0xB865,0xB866,0xB867,0xB868,0xB869,0xB86A,0xCAFA,0xB86B, +0xB86C,0xD5BE,0xB86D,0xB86E,0xB86F,0xB870,0xBEBA,0xBEB9, +0xD5C2,0xB871,0xB872,0xBFA2,0xB873,0xCDAF,0xF1B5,0xB874, +0xB875,0xB876,0xB877,0xB878,0xB879,0xBDDF,0xB87A,0xB6CB, +0xB87B,0xB87C,0xB87D,0xB87E,0xB880,0xB881,0xB882,0xB883, +0xB884,0xD6F1,0xF3C3,0xB885,0xB886,0xF3C4,0xB887,0xB8CD, +0xB888,0xB889,0xB88A,0xF3C6,0xF3C7,0xB88B,0xB0CA,0xB88C, +0xF3C5,0xB88D,0xF3C9,0xCBF1,0xB88E,0xB88F,0xB890,0xF3CB, +0xB891,0xD0A6,0xB892,0xB893,0xB1CA,0xF3C8,0xB894,0xB895, +0xB896,0xF3CF,0xB897,0xB5D1,0xB898,0xB899,0xF3D7,0xB89A, +0xF3D2,0xB89B,0xB89C,0xB89D,0xF3D4,0xF3D3,0xB7FB,0xB89E, +0xB1BF,0xB89F,0xF3CE,0xF3CA,0xB5DA,0xB8A0,0xF3D0,0xB940, +0xB941,0xF3D1,0xB942,0xF3D5,0xB943,0xB944,0xB945,0xB946, +0xF3CD,0xB947,0xBCE3,0xB948,0xC1FD,0xB949,0xF3D6,0xB94A, +0xB94B,0xB94C,0xB94D,0xB94E,0xB94F,0xF3DA,0xB950,0xF3CC, +0xB951,0xB5C8,0xB952,0xBDEE,0xF3DC,0xB953,0xB954,0xB7A4, +0xBFF0,0xD6FE,0xCDB2,0xB955,0xB4F0,0xB956,0xB2DF,0xB957, +0xF3D8,0xB958,0xF3D9,0xC9B8,0xB959,0xF3DD,0xB95A,0xB95B, +0xF3DE,0xB95C,0xF3E1,0xB95D,0xB95E,0xB95F,0xB960,0xB961, +0xB962,0xB963,0xB964,0xB965,0xB966,0xB967,0xF3DF,0xB968, +0xB969,0xF3E3,0xF3E2,0xB96A,0xB96B,0xF3DB,0xB96C,0xBFEA, +0xB96D,0xB3EF,0xB96E,0xF3E0,0xB96F,0xB970,0xC7A9,0xB971, +0xBCF2,0xB972,0xB973,0xB974,0xB975,0xF3EB,0xB976,0xB977, +0xB978,0xB979,0xB97A,0xB97B,0xB97C,0xB9BF,0xB97D,0xB97E, +0xF3E4,0xB980,0xB981,0xB982,0xB2AD,0xBBFE,0xB983,0xCBE3, +0xB984,0xB985,0xB986,0xB987,0xF3ED,0xF3E9,0xB988,0xB989, +0xB98A,0xB9DC,0xF3EE,0xB98B,0xB98C,0xB98D,0xF3E5,0xF3E6, +0xF3EA,0xC2E1,0xF3EC,0xF3EF,0xF3E8,0xBCFD,0xB98E,0xB98F, +0xB990,0xCFE4,0xB991,0xB992,0xF3F0,0xB993,0xB994,0xB995, +0xF3E7,0xB996,0xB997,0xB998,0xB999,0xB99A,0xB99B,0xB99C, +0xB99D,0xF3F2,0xB99E,0xB99F,0xB9A0,0xBA40,0xD7AD,0xC6AA, +0xBA41,0xBA42,0xBA43,0xBA44,0xF3F3,0xBA45,0xBA46,0xBA47, +0xBA48,0xF3F1,0xBA49,0xC2A8,0xBA4A,0xBA4B,0xBA4C,0xBA4D, +0xBA4E,0xB8DD,0xF3F5,0xBA4F,0xBA50,0xF3F4,0xBA51,0xBA52, +0xBA53,0xB4DB,0xBA54,0xBA55,0xBA56,0xF3F6,0xF3F7,0xBA57, +0xBA58,0xBA59,0xF3F8,0xBA5A,0xBA5B,0xBA5C,0xC0BA,0xBA5D, +0xBA5E,0xC0E9,0xBA5F,0xBA60,0xBA61,0xBA62,0xBA63,0xC5F1, +0xBA64,0xBA65,0xBA66,0xBA67,0xF3FB,0xBA68,0xF3FA,0xBA69, +0xBA6A,0xBA6B,0xBA6C,0xBA6D,0xBA6E,0xBA6F,0xBA70,0xB4D8, +0xBA71,0xBA72,0xBA73,0xF3FE,0xF3F9,0xBA74,0xBA75,0xF3FC, +0xBA76,0xBA77,0xBA78,0xBA79,0xBA7A,0xBA7B,0xF3FD,0xBA7C, +0xBA7D,0xBA7E,0xBA80,0xBA81,0xBA82,0xBA83,0xBA84,0xF4A1, +0xBA85,0xBA86,0xBA87,0xBA88,0xBA89,0xBA8A,0xF4A3,0xBBC9, +0xBA8B,0xBA8C,0xF4A2,0xBA8D,0xBA8E,0xBA8F,0xBA90,0xBA91, +0xBA92,0xBA93,0xBA94,0xBA95,0xBA96,0xBA97,0xBA98,0xBA99, +0xF4A4,0xBA9A,0xBA9B,0xBA9C,0xBA9D,0xBA9E,0xBA9F,0xB2BE, +0xF4A6,0xF4A5,0xBAA0,0xBB40,0xBB41,0xBB42,0xBB43,0xBB44, +0xBB45,0xBB46,0xBB47,0xBB48,0xBB49,0xBCAE,0xBB4A,0xBB4B, +0xBB4C,0xBB4D,0xBB4E,0xBB4F,0xBB50,0xBB51,0xBB52,0xBB53, +0xBB54,0xBB55,0xBB56,0xBB57,0xBB58,0xBB59,0xBB5A,0xBB5B, +0xBB5C,0xBB5D,0xBB5E,0xBB5F,0xBB60,0xBB61,0xBB62,0xBB63, +0xBB64,0xBB65,0xBB66,0xBB67,0xBB68,0xBB69,0xBB6A,0xBB6B, +0xBB6C,0xBB6D,0xBB6E,0xC3D7,0xD9E1,0xBB6F,0xBB70,0xBB71, +0xBB72,0xBB73,0xBB74,0xC0E0,0xF4CC,0xD7D1,0xBB75,0xBB76, +0xBB77,0xBB78,0xBB79,0xBB7A,0xBB7B,0xBB7C,0xBB7D,0xBB7E, +0xBB80,0xB7DB,0xBB81,0xBB82,0xBB83,0xBB84,0xBB85,0xBB86, +0xBB87,0xF4CE,0xC1A3,0xBB88,0xBB89,0xC6C9,0xBB8A,0xB4D6, +0xD5B3,0xBB8B,0xBB8C,0xBB8D,0xF4D0,0xF4CF,0xF4D1,0xCBDA, +0xBB8E,0xBB8F,0xF4D2,0xBB90,0xD4C1,0xD6E0,0xBB91,0xBB92, +0xBB93,0xBB94,0xB7E0,0xBB95,0xBB96,0xBB97,0xC1B8,0xBB98, +0xBB99,0xC1BB,0xF4D3,0xBEAC,0xBB9A,0xBB9B,0xBB9C,0xBB9D, +0xBB9E,0xB4E2,0xBB9F,0xBBA0,0xF4D4,0xF4D5,0xBEAB,0xBC40, +0xBC41,0xF4D6,0xBC42,0xBC43,0xBC44,0xF4DB,0xBC45,0xF4D7, +0xF4DA,0xBC46,0xBAFD,0xBC47,0xF4D8,0xF4D9,0xBC48,0xBC49, +0xBC4A,0xBC4B,0xBC4C,0xBC4D,0xBC4E,0xB8E2,0xCCC7,0xF4DC, +0xBC4F,0xB2DA,0xBC50,0xBC51,0xC3D3,0xBC52,0xBC53,0xD4E3, +0xBFB7,0xBC54,0xBC55,0xBC56,0xBC57,0xBC58,0xBC59,0xBC5A, +0xF4DD,0xBC5B,0xBC5C,0xBC5D,0xBC5E,0xBC5F,0xBC60,0xC5B4, +0xBC61,0xBC62,0xBC63,0xBC64,0xBC65,0xBC66,0xBC67,0xBC68, +0xF4E9,0xBC69,0xBC6A,0xCFB5,0xBC6B,0xBC6C,0xBC6D,0xBC6E, +0xBC6F,0xBC70,0xBC71,0xBC72,0xBC73,0xBC74,0xBC75,0xBC76, +0xBC77,0xBC78,0xCEC9,0xBC79,0xBC7A,0xBC7B,0xBC7C,0xBC7D, +0xBC7E,0xBC80,0xBC81,0xBC82,0xBC83,0xBC84,0xBC85,0xBC86, +0xBC87,0xBC88,0xBC89,0xBC8A,0xBC8B,0xBC8C,0xBC8D,0xBC8E, +0xCBD8,0xBC8F,0xCBF7,0xBC90,0xBC91,0xBC92,0xBC93,0xBDF4, +0xBC94,0xBC95,0xBC96,0xD7CF,0xBC97,0xBC98,0xBC99,0xC0DB, +0xBC9A,0xBC9B,0xBC9C,0xBC9D,0xBC9E,0xBC9F,0xBCA0,0xBD40, +0xBD41,0xBD42,0xBD43,0xBD44,0xBD45,0xBD46,0xBD47,0xBD48, +0xBD49,0xBD4A,0xBD4B,0xBD4C,0xBD4D,0xBD4E,0xBD4F,0xBD50, +0xBD51,0xBD52,0xBD53,0xBD54,0xBD55,0xBD56,0xBD57,0xBD58, +0xBD59,0xBD5A,0xBD5B,0xBD5C,0xBD5D,0xBD5E,0xBD5F,0xBD60, +0xBD61,0xBD62,0xBD63,0xBD64,0xBD65,0xBD66,0xBD67,0xBD68, +0xBD69,0xBD6A,0xBD6B,0xBD6C,0xBD6D,0xBD6E,0xBD6F,0xBD70, +0xBD71,0xBD72,0xBD73,0xBD74,0xBD75,0xBD76,0xD0F5,0xBD77, +0xBD78,0xBD79,0xBD7A,0xBD7B,0xBD7C,0xBD7D,0xBD7E,0xF4EA, +0xBD80,0xBD81,0xBD82,0xBD83,0xBD84,0xBD85,0xBD86,0xBD87, +0xBD88,0xBD89,0xBD8A,0xBD8B,0xBD8C,0xBD8D,0xBD8E,0xBD8F, +0xBD90,0xBD91,0xBD92,0xBD93,0xBD94,0xBD95,0xBD96,0xBD97, +0xBD98,0xBD99,0xBD9A,0xBD9B,0xBD9C,0xBD9D,0xBD9E,0xBD9F, +0xBDA0,0xBE40,0xBE41,0xBE42,0xBE43,0xBE44,0xBE45,0xBE46, +0xBE47,0xBE48,0xBE49,0xBE4A,0xBE4B,0xBE4C,0xF4EB,0xBE4D, +0xBE4E,0xBE4F,0xBE50,0xBE51,0xBE52,0xBE53,0xF4EC,0xBE54, +0xBE55,0xBE56,0xBE57,0xBE58,0xBE59,0xBE5A,0xBE5B,0xBE5C, +0xBE5D,0xBE5E,0xBE5F,0xBE60,0xBE61,0xBE62,0xBE63,0xBE64, +0xBE65,0xBE66,0xBE67,0xBE68,0xBE69,0xBE6A,0xBE6B,0xBE6C, +0xBE6D,0xBE6E,0xBE6F,0xBE70,0xBE71,0xBE72,0xBE73,0xBE74, +0xBE75,0xBE76,0xBE77,0xBE78,0xBE79,0xBE7A,0xBE7B,0xBE7C, +0xBE7D,0xBE7E,0xBE80,0xBE81,0xBE82,0xBE83,0xBE84,0xBE85, +0xBE86,0xBE87,0xBE88,0xBE89,0xBE8A,0xBE8B,0xBE8C,0xBE8D, +0xBE8E,0xBE8F,0xBE90,0xBE91,0xBE92,0xBE93,0xBE94,0xBE95, +0xBE96,0xBE97,0xBE98,0xBE99,0xBE9A,0xBE9B,0xBE9C,0xBE9D, +0xBE9E,0xBE9F,0xBEA0,0xBF40,0xBF41,0xBF42,0xBF43,0xBF44, +0xBF45,0xBF46,0xBF47,0xBF48,0xBF49,0xBF4A,0xBF4B,0xBF4C, +0xBF4D,0xBF4E,0xBF4F,0xBF50,0xBF51,0xBF52,0xBF53,0xBF54, +0xBF55,0xBF56,0xBF57,0xBF58,0xBF59,0xBF5A,0xBF5B,0xBF5C, +0xBF5D,0xBF5E,0xBF5F,0xBF60,0xBF61,0xBF62,0xBF63,0xBF64, +0xBF65,0xBF66,0xBF67,0xBF68,0xBF69,0xBF6A,0xBF6B,0xBF6C, +0xBF6D,0xBF6E,0xBF6F,0xBF70,0xBF71,0xBF72,0xBF73,0xBF74, +0xBF75,0xBF76,0xBF77,0xBF78,0xBF79,0xBF7A,0xBF7B,0xBF7C, +0xBF7D,0xBF7E,0xBF80,0xF7E3,0xBF81,0xBF82,0xBF83,0xBF84, +0xBF85,0xB7B1,0xBF86,0xBF87,0xBF88,0xBF89,0xBF8A,0xF4ED, +0xBF8B,0xBF8C,0xBF8D,0xBF8E,0xBF8F,0xBF90,0xBF91,0xBF92, +0xBF93,0xBF94,0xBF95,0xBF96,0xBF97,0xBF98,0xBF99,0xBF9A, +0xBF9B,0xBF9C,0xBF9D,0xBF9E,0xBF9F,0xBFA0,0xC040,0xC041, +0xC042,0xC043,0xC044,0xC045,0xC046,0xC047,0xC048,0xC049, +0xC04A,0xC04B,0xC04C,0xC04D,0xC04E,0xC04F,0xC050,0xC051, +0xC052,0xC053,0xC054,0xC055,0xC056,0xC057,0xC058,0xC059, +0xC05A,0xC05B,0xC05C,0xC05D,0xC05E,0xC05F,0xC060,0xC061, +0xC062,0xC063,0xD7EB,0xC064,0xC065,0xC066,0xC067,0xC068, +0xC069,0xC06A,0xC06B,0xC06C,0xC06D,0xC06E,0xC06F,0xC070, +0xC071,0xC072,0xC073,0xC074,0xC075,0xC076,0xC077,0xC078, +0xC079,0xC07A,0xC07B,0xF4EE,0xC07C,0xC07D,0xC07E,0xE6F9, +0xBEC0,0xE6FA,0xBAEC,0xE6FB,0xCFCB,0xE6FC,0xD4BC,0xBCB6, +0xE6FD,0xE6FE,0xBCCD,0xC8D2,0xCEB3,0xE7A1,0xC080,0xB4BF, +0xE7A2,0xC9B4,0xB8D9,0xC4C9,0xC081,0xD7DD,0xC2DA,0xB7D7, +0xD6BD,0xCEC6,0xB7C4,0xC082,0xC083,0xC5A6,0xE7A3,0xCFDF, +0xE7A4,0xE7A5,0xE7A6,0xC1B7,0xD7E9,0xC9F0,0xCFB8,0xD6AF, +0xD6D5,0xE7A7,0xB0ED,0xE7A8,0xE7A9,0xC9DC,0xD2EF,0xBEAD, +0xE7AA,0xB0F3,0xC8DE,0xBDE1,0xE7AB,0xC8C6,0xC084,0xE7AC, +0xBBE6,0xB8F8,0xD1A4,0xE7AD,0xC2E7,0xBEF8,0xBDCA,0xCDB3, +0xE7AE,0xE7AF,0xBEEE,0xD0E5,0xC085,0xCBE7,0xCCD0,0xBCCC, +0xE7B0,0xBCA8,0xD0F7,0xE7B1,0xC086,0xD0F8,0xE7B2,0xE7B3, +0xB4C2,0xE7B4,0xE7B5,0xC9FE,0xCEAC,0xC3E0,0xE7B7,0xB1C1, +0xB3F1,0xC087,0xE7B8,0xE7B9,0xD7DB,0xD5C0,0xE7BA,0xC2CC, +0xD7BA,0xE7BB,0xE7BC,0xE7BD,0xBCEA,0xC3E5,0xC0C2,0xE7BE, +0xE7BF,0xBCA9,0xC088,0xE7C0,0xE7C1,0xE7B6,0xB6D0,0xE7C2, +0xC089,0xE7C3,0xE7C4,0xBBBA,0xB5DE,0xC2C6,0xB1E0,0xE7C5, +0xD4B5,0xE7C6,0xB8BF,0xE7C8,0xE7C7,0xB7EC,0xC08A,0xE7C9, +0xB2F8,0xE7CA,0xE7CB,0xE7CC,0xE7CD,0xE7CE,0xE7CF,0xE7D0, +0xD3A7,0xCBF5,0xE7D1,0xE7D2,0xE7D3,0xE7D4,0xC9C9,0xE7D5, +0xE7D6,0xE7D7,0xE7D8,0xE7D9,0xBDC9,0xE7DA,0xF3BE,0xC08B, +0xB8D7,0xC08C,0xC8B1,0xC08D,0xC08E,0xC08F,0xC090,0xC091, +0xC092,0xC093,0xF3BF,0xC094,0xF3C0,0xF3C1,0xC095,0xC096, +0xC097,0xC098,0xC099,0xC09A,0xC09B,0xC09C,0xC09D,0xC09E, +0xB9DE,0xCDF8,0xC09F,0xC0A0,0xD8E8,0xBAB1,0xC140,0xC2DE, +0xEEB7,0xC141,0xB7A3,0xC142,0xC143,0xC144,0xC145,0xEEB9, +0xC146,0xEEB8,0xB0D5,0xC147,0xC148,0xC149,0xC14A,0xC14B, +0xEEBB,0xD5D6,0xD7EF,0xC14C,0xC14D,0xC14E,0xD6C3,0xC14F, +0xC150,0xEEBD,0xCAF0,0xC151,0xEEBC,0xC152,0xC153,0xC154, +0xC155,0xEEBE,0xC156,0xC157,0xC158,0xC159,0xEEC0,0xC15A, +0xC15B,0xEEBF,0xC15C,0xC15D,0xC15E,0xC15F,0xC160,0xC161, +0xC162,0xC163,0xD1F2,0xC164,0xC7BC,0xC165,0xC3C0,0xC166, +0xC167,0xC168,0xC169,0xC16A,0xB8E1,0xC16B,0xC16C,0xC16D, +0xC16E,0xC16F,0xC1E7,0xC170,0xC171,0xF4C6,0xD0DF,0xF4C7, +0xC172,0xCFDB,0xC173,0xC174,0xC8BA,0xC175,0xC176,0xF4C8, +0xC177,0xC178,0xC179,0xC17A,0xC17B,0xC17C,0xC17D,0xF4C9, +0xF4CA,0xC17E,0xF4CB,0xC180,0xC181,0xC182,0xC183,0xC184, +0xD9FA,0xB8FE,0xC185,0xC186,0xE5F1,0xD3F0,0xC187,0xF4E0, +0xC188,0xCECC,0xC189,0xC18A,0xC18B,0xB3E1,0xC18C,0xC18D, +0xC18E,0xC18F,0xF1B4,0xC190,0xD2EE,0xC191,0xF4E1,0xC192, +0xC193,0xC194,0xC195,0xC196,0xCFE8,0xF4E2,0xC197,0xC198, +0xC7CC,0xC199,0xC19A,0xC19B,0xC19C,0xC19D,0xC19E,0xB5D4, +0xB4E4,0xF4E4,0xC19F,0xC1A0,0xC240,0xF4E3,0xF4E5,0xC241, +0xC242,0xF4E6,0xC243,0xC244,0xC245,0xC246,0xF4E7,0xC247, +0xBAB2,0xB0BF,0xC248,0xF4E8,0xC249,0xC24A,0xC24B,0xC24C, +0xC24D,0xC24E,0xC24F,0xB7AD,0xD2ED,0xC250,0xC251,0xC252, +0xD2AB,0xC0CF,0xC253,0xBFBC,0xEBA3,0xD5DF,0xEAC8,0xC254, +0xC255,0xC256,0xC257,0xF1F3,0xB6F8,0xCBA3,0xC258,0xC259, +0xC4CD,0xC25A,0xF1E7,0xC25B,0xF1E8,0xB8FB,0xF1E9,0xBAC4, +0xD4C5,0xB0D2,0xC25C,0xC25D,0xF1EA,0xC25E,0xC25F,0xC260, +0xF1EB,0xC261,0xF1EC,0xC262,0xC263,0xF1ED,0xF1EE,0xF1EF, +0xF1F1,0xF1F0,0xC5D5,0xC264,0xC265,0xC266,0xC267,0xC268, +0xC269,0xF1F2,0xC26A,0xB6FA,0xC26B,0xF1F4,0xD2AE,0xDEC7, +0xCBCA,0xC26C,0xC26D,0xB3DC,0xC26E,0xB5A2,0xC26F,0xB9A2, +0xC270,0xC271,0xC4F4,0xF1F5,0xC272,0xC273,0xF1F6,0xC274, +0xC275,0xC276,0xC1C4,0xC1FB,0xD6B0,0xF1F7,0xC277,0xC278, +0xC279,0xC27A,0xF1F8,0xC27B,0xC1AA,0xC27C,0xC27D,0xC27E, +0xC6B8,0xC280,0xBEDB,0xC281,0xC282,0xC283,0xC284,0xC285, +0xC286,0xC287,0xC288,0xC289,0xC28A,0xC28B,0xC28C,0xC28D, +0xC28E,0xF1F9,0xB4CF,0xC28F,0xC290,0xC291,0xC292,0xC293, +0xC294,0xF1FA,0xC295,0xC296,0xC297,0xC298,0xC299,0xC29A, +0xC29B,0xC29C,0xC29D,0xC29E,0xC29F,0xC2A0,0xC340,0xEDB2, +0xEDB1,0xC341,0xC342,0xCBE0,0xD2DE,0xC343,0xCBC1,0xD5D8, +0xC344,0xC8E2,0xC345,0xC0DF,0xBCA1,0xC346,0xC347,0xC348, +0xC349,0xC34A,0xC34B,0xEBC1,0xC34C,0xC34D,0xD0A4,0xC34E, +0xD6E2,0xC34F,0xB6C7,0xB8D8,0xEBC0,0xB8CE,0xC350,0xEBBF, +0xB3A6,0xB9C9,0xD6AB,0xC351,0xB7F4,0xB7CA,0xC352,0xC353, +0xC354,0xBCE7,0xB7BE,0xEBC6,0xC355,0xEBC7,0xB0B9,0xBFCF, +0xC356,0xEBC5,0xD3FD,0xC357,0xEBC8,0xC358,0xC359,0xEBC9, +0xC35A,0xC35B,0xB7CE,0xC35C,0xEBC2,0xEBC4,0xC9F6,0xD6D7, +0xD5CD,0xD0B2,0xEBCF,0xCEB8,0xEBD0,0xC35D,0xB5A8,0xC35E, +0xC35F,0xC360,0xC361,0xC362,0xB1B3,0xEBD2,0xCCA5,0xC363, +0xC364,0xC365,0xC366,0xC367,0xC368,0xC369,0xC5D6,0xEBD3, +0xC36A,0xEBD1,0xC5DF,0xEBCE,0xCAA4,0xEBD5,0xB0FB,0xC36B, +0xC36C,0xBAFA,0xC36D,0xC36E,0xD8B7,0xF1E3,0xC36F,0xEBCA, +0xEBCB,0xEBCC,0xEBCD,0xEBD6,0xE6C0,0xEBD9,0xC370,0xBFE8, +0xD2C8,0xEBD7,0xEBDC,0xB8EC,0xEBD8,0xC371,0xBDBA,0xC372, +0xD0D8,0xC373,0xB0B7,0xC374,0xEBDD,0xC4DC,0xC375,0xC376, +0xC377,0xC378,0xD6AC,0xC379,0xC37A,0xC37B,0xB4E0,0xC37C, +0xC37D,0xC2F6,0xBCB9,0xC37E,0xC380,0xEBDA,0xEBDB,0xD4E0, +0xC6EA,0xC4D4,0xEBDF,0xC5A7,0xD9F5,0xC381,0xB2B1,0xC382, +0xEBE4,0xC383,0xBDC5,0xC384,0xC385,0xC386,0xEBE2,0xC387, +0xC388,0xC389,0xC38A,0xC38B,0xC38C,0xC38D,0xC38E,0xC38F, +0xC390,0xC391,0xC392,0xC393,0xEBE3,0xC394,0xC395,0xB8AC, +0xC396,0xCDD1,0xEBE5,0xC397,0xC398,0xC399,0xEBE1,0xC39A, +0xC1B3,0xC39B,0xC39C,0xC39D,0xC39E,0xC39F,0xC6A2,0xC3A0, +0xC440,0xC441,0xC442,0xC443,0xC444,0xC445,0xCCF3,0xC446, +0xEBE6,0xC447,0xC0B0,0xD2B8,0xEBE7,0xC448,0xC449,0xC44A, +0xB8AF,0xB8AD,0xC44B,0xEBE8,0xC7BB,0xCDF3,0xC44C,0xC44D, +0xC44E,0xEBEA,0xEBEB,0xC44F,0xC450,0xC451,0xC452,0xC453, +0xEBED,0xC454,0xC455,0xC456,0xC457,0xD0C8,0xC458,0xEBF2, +0xC459,0xEBEE,0xC45A,0xC45B,0xC45C,0xEBF1,0xC8F9,0xC45D, +0xD1FC,0xEBEC,0xC45E,0xC45F,0xEBE9,0xC460,0xC461,0xC462, +0xC463,0xB8B9,0xCFD9,0xC4E5,0xEBEF,0xEBF0,0xCCDA,0xCDC8, +0xB0F2,0xC464,0xEBF6,0xC465,0xC466,0xC467,0xC468,0xC469, +0xEBF5,0xC46A,0xB2B2,0xC46B,0xC46C,0xC46D,0xC46E,0xB8E0, +0xC46F,0xEBF7,0xC470,0xC471,0xC472,0xC473,0xC474,0xC475, +0xB1EC,0xC476,0xC477,0xCCC5,0xC4A4,0xCFA5,0xC478,0xC479, +0xC47A,0xC47B,0xC47C,0xEBF9,0xC47D,0xC47E,0xECA2,0xC480, +0xC5F2,0xC481,0xEBFA,0xC482,0xC483,0xC484,0xC485,0xC486, +0xC487,0xC488,0xC489,0xC9C5,0xC48A,0xC48B,0xC48C,0xC48D, +0xC48E,0xC48F,0xE2DF,0xEBFE,0xC490,0xC491,0xC492,0xC493, +0xCDCE,0xECA1,0xB1DB,0xD3B7,0xC494,0xC495,0xD2DC,0xC496, +0xC497,0xC498,0xEBFD,0xC499,0xEBFB,0xC49A,0xC49B,0xC49C, +0xC49D,0xC49E,0xC49F,0xC4A0,0xC540,0xC541,0xC542,0xC543, +0xC544,0xC545,0xC546,0xC547,0xC548,0xC549,0xC54A,0xC54B, +0xC54C,0xC54D,0xC54E,0xB3BC,0xC54F,0xC550,0xC551,0xEAB0, +0xC552,0xC553,0xD7D4,0xC554,0xF4AB,0xB3F4,0xC555,0xC556, +0xC557,0xC558,0xC559,0xD6C1,0xD6C2,0xC55A,0xC55B,0xC55C, +0xC55D,0xC55E,0xC55F,0xD5E9,0xBECA,0xC560,0xF4A7,0xC561, +0xD2A8,0xF4A8,0xF4A9,0xC562,0xF4AA,0xBECB,0xD3DF,0xC563, +0xC564,0xC565,0xC566,0xC567,0xC9E0,0xC9E1,0xC568,0xC569, +0xF3C2,0xC56A,0xCAE6,0xC56B,0xCCF2,0xC56C,0xC56D,0xC56E, +0xC56F,0xC570,0xC571,0xE2B6,0xCBB4,0xC572,0xCEE8,0xD6DB, +0xC573,0xF4AD,0xF4AE,0xF4AF,0xC574,0xC575,0xC576,0xC577, +0xF4B2,0xC578,0xBABD,0xF4B3,0xB0E3,0xF4B0,0xC579,0xF4B1, +0xBDA2,0xB2D5,0xC57A,0xF4B6,0xF4B7,0xB6E6,0xB2B0,0xCFCF, +0xF4B4,0xB4AC,0xC57B,0xF4B5,0xC57C,0xC57D,0xF4B8,0xC57E, +0xC580,0xC581,0xC582,0xC583,0xF4B9,0xC584,0xC585,0xCDA7, +0xC586,0xF4BA,0xC587,0xF4BB,0xC588,0xC589,0xC58A,0xF4BC, +0xC58B,0xC58C,0xC58D,0xC58E,0xC58F,0xC590,0xC591,0xC592, +0xCBD2,0xC593,0xF4BD,0xC594,0xC595,0xC596,0xC597,0xF4BE, +0xC598,0xC599,0xC59A,0xC59B,0xC59C,0xC59D,0xC59E,0xC59F, +0xF4BF,0xC5A0,0xC640,0xC641,0xC642,0xC643,0xF4DE,0xC1BC, +0xBCE8,0xC644,0xC9AB,0xD1DE,0xE5F5,0xC645,0xC646,0xC647, +0xC648,0xDCB3,0xD2D5,0xC649,0xC64A,0xDCB4,0xB0AC,0xDCB5, +0xC64B,0xC64C,0xBDDA,0xC64D,0xDCB9,0xC64E,0xC64F,0xC650, +0xD8C2,0xC651,0xDCB7,0xD3F3,0xC652,0xC9D6,0xDCBA,0xDCB6, +0xC653,0xDCBB,0xC3A2,0xC654,0xC655,0xC656,0xC657,0xDCBC, +0xDCC5,0xDCBD,0xC658,0xC659,0xCEDF,0xD6A5,0xC65A,0xDCCF, +0xC65B,0xDCCD,0xC65C,0xC65D,0xDCD2,0xBDE6,0xC2AB,0xC65E, +0xDCB8,0xDCCB,0xDCCE,0xDCBE,0xB7D2,0xB0C5,0xDCC7,0xD0BE, +0xDCC1,0xBBA8,0xC65F,0xB7BC,0xDCCC,0xC660,0xC661,0xDCC6, +0xDCBF,0xC7DB,0xC662,0xC663,0xC664,0xD1BF,0xDCC0,0xC665, +0xC666,0xDCCA,0xC667,0xC668,0xDCD0,0xC669,0xC66A,0xCEAD, +0xDCC2,0xC66B,0xDCC3,0xDCC8,0xDCC9,0xB2D4,0xDCD1,0xCBD5, +0xC66C,0xD4B7,0xDCDB,0xDCDF,0xCCA6,0xDCE6,0xC66D,0xC3E7, +0xDCDC,0xC66E,0xC66F,0xBFC1,0xDCD9,0xC670,0xB0FA,0xB9B6, +0xDCE5,0xDCD3,0xC671,0xDCC4,0xDCD6,0xC8F4,0xBFE0,0xC672, +0xC673,0xC674,0xC675,0xC9BB,0xC676,0xC677,0xC678,0xB1BD, +0xC679,0xD3A2,0xC67A,0xC67B,0xDCDA,0xC67C,0xC67D,0xDCD5, +0xC67E,0xC6BB,0xC680,0xDCDE,0xC681,0xC682,0xC683,0xC684, +0xC685,0xD7C2,0xC3AF,0xB7B6,0xC7D1,0xC3A9,0xDCE2,0xDCD8, +0xDCEB,0xDCD4,0xC686,0xC687,0xDCDD,0xC688,0xBEA5,0xDCD7, +0xC689,0xDCE0,0xC68A,0xC68B,0xDCE3,0xDCE4,0xC68C,0xDCF8, +0xC68D,0xC68E,0xDCE1,0xDDA2,0xDCE7,0xC68F,0xC690,0xC691, +0xC692,0xC693,0xC694,0xC695,0xC696,0xC697,0xC698,0xBCEB, +0xB4C4,0xC699,0xC69A,0xC3A3,0xB2E7,0xDCFA,0xC69B,0xDCF2, +0xC69C,0xDCEF,0xC69D,0xDCFC,0xDCEE,0xD2F0,0xB2E8,0xC69E, +0xC8D7,0xC8E3,0xDCFB,0xC69F,0xDCED,0xC6A0,0xC740,0xC741, +0xDCF7,0xC742,0xC743,0xDCF5,0xC744,0xC745,0xBEA3,0xDCF4, +0xC746,0xB2DD,0xC747,0xC748,0xC749,0xC74A,0xC74B,0xDCF3, +0xBCF6,0xDCE8,0xBBC4,0xC74C,0xC0F3,0xC74D,0xC74E,0xC74F, +0xC750,0xC751,0xBCD4,0xDCE9,0xDCEA,0xC752,0xDCF1,0xDCF6, +0xDCF9,0xB5B4,0xC753,0xC8D9,0xBBE7,0xDCFE,0xDCFD,0xD3AB, +0xDDA1,0xDDA3,0xDDA5,0xD2F1,0xDDA4,0xDDA6,0xDDA7,0xD2A9, +0xC754,0xC755,0xC756,0xC757,0xC758,0xC759,0xC75A,0xBAC9, +0xDDA9,0xC75B,0xC75C,0xDDB6,0xDDB1,0xDDB4,0xC75D,0xC75E, +0xC75F,0xC760,0xC761,0xC762,0xC763,0xDDB0,0xC6CE,0xC764, +0xC765,0xC0F2,0xC766,0xC767,0xC768,0xC769,0xC9AF,0xC76A, +0xC76B,0xC76C,0xDCEC,0xDDAE,0xC76D,0xC76E,0xC76F,0xC770, +0xDDB7,0xC771,0xC772,0xDCF0,0xDDAF,0xC773,0xDDB8,0xC774, +0xDDAC,0xC775,0xC776,0xC777,0xC778,0xC779,0xC77A,0xC77B, +0xDDB9,0xDDB3,0xDDAD,0xC4AA,0xC77C,0xC77D,0xC77E,0xC780, +0xDDA8,0xC0B3,0xC1AB,0xDDAA,0xDDAB,0xC781,0xDDB2,0xBBF1, +0xDDB5,0xD3A8,0xDDBA,0xC782,0xDDBB,0xC3A7,0xC783,0xC784, +0xDDD2,0xDDBC,0xC785,0xC786,0xC787,0xDDD1,0xC788,0xB9BD, +0xC789,0xC78A,0xBED5,0xC78B,0xBEFA,0xC78C,0xC78D,0xBACA, +0xC78E,0xC78F,0xC790,0xC791,0xDDCA,0xC792,0xDDC5,0xC793, +0xDDBF,0xC794,0xC795,0xC796,0xB2CB,0xDDC3,0xC797,0xDDCB, +0xB2A4,0xDDD5,0xC798,0xC799,0xC79A,0xDDBE,0xC79B,0xC79C, +0xC79D,0xC6D0,0xDDD0,0xC79E,0xC79F,0xC7A0,0xC840,0xC841, +0xDDD4,0xC1E2,0xB7C6,0xC842,0xC843,0xC844,0xC845,0xC846, +0xDDCE,0xDDCF,0xC847,0xC848,0xC849,0xDDC4,0xC84A,0xC84B, +0xC84C,0xDDBD,0xC84D,0xDDCD,0xCCD1,0xC84E,0xDDC9,0xC84F, +0xC850,0xC851,0xC852,0xDDC2,0xC3C8,0xC6BC,0xCEAE,0xDDCC, +0xC853,0xDDC8,0xC854,0xC855,0xC856,0xC857,0xC858,0xC859, +0xDDC1,0xC85A,0xC85B,0xC85C,0xDDC6,0xC2DC,0xC85D,0xC85E, +0xC85F,0xC860,0xC861,0xC862,0xD3A9,0xD3AA,0xDDD3,0xCFF4, +0xC8F8,0xC863,0xC864,0xC865,0xC866,0xC867,0xC868,0xC869, +0xC86A,0xDDE6,0xC86B,0xC86C,0xC86D,0xC86E,0xC86F,0xC870, +0xDDC7,0xC871,0xC872,0xC873,0xDDE0,0xC2E4,0xC874,0xC875, +0xC876,0xC877,0xC878,0xC879,0xC87A,0xC87B,0xDDE1,0xC87C, +0xC87D,0xC87E,0xC880,0xC881,0xC882,0xC883,0xC884,0xC885, +0xC886,0xDDD7,0xC887,0xC888,0xC889,0xC88A,0xC88B,0xD6F8, +0xC88C,0xDDD9,0xDDD8,0xB8F0,0xDDD6,0xC88D,0xC88E,0xC88F, +0xC890,0xC6CF,0xC891,0xB6AD,0xC892,0xC893,0xC894,0xC895, +0xC896,0xDDE2,0xC897,0xBAF9,0xD4E1,0xDDE7,0xC898,0xC899, +0xC89A,0xB4D0,0xC89B,0xDDDA,0xC89C,0xBFFB,0xDDE3,0xC89D, +0xDDDF,0xC89E,0xDDDD,0xC89F,0xC8A0,0xC940,0xC941,0xC942, +0xC943,0xC944,0xB5D9,0xC945,0xC946,0xC947,0xC948,0xDDDB, +0xDDDC,0xDDDE,0xC949,0xBDAF,0xDDE4,0xC94A,0xDDE5,0xC94B, +0xC94C,0xC94D,0xC94E,0xC94F,0xC950,0xC951,0xC952,0xDDF5, +0xC953,0xC3C9,0xC954,0xC955,0xCBE2,0xC956,0xC957,0xC958, +0xC959,0xDDF2,0xC95A,0xC95B,0xC95C,0xC95D,0xC95E,0xC95F, +0xC960,0xC961,0xC962,0xC963,0xC964,0xC965,0xC966,0xD8E1, +0xC967,0xC968,0xC6D1,0xC969,0xDDF4,0xC96A,0xC96B,0xC96C, +0xD5F4,0xDDF3,0xDDF0,0xC96D,0xC96E,0xDDEC,0xC96F,0xDDEF, +0xC970,0xDDE8,0xC971,0xC972,0xD0EE,0xC973,0xC974,0xC975, +0xC976,0xC8D8,0xDDEE,0xC977,0xC978,0xDDE9,0xC979,0xC97A, +0xDDEA,0xCBF2,0xC97B,0xDDED,0xC97C,0xC97D,0xB1CD,0xC97E, +0xC980,0xC981,0xC982,0xC983,0xC984,0xC0B6,0xC985,0xBCBB, +0xDDF1,0xC986,0xC987,0xDDF7,0xC988,0xDDF6,0xDDEB,0xC989, +0xC98A,0xC98B,0xC98C,0xC98D,0xC5EE,0xC98E,0xC98F,0xC990, +0xDDFB,0xC991,0xC992,0xC993,0xC994,0xC995,0xC996,0xC997, +0xC998,0xC999,0xC99A,0xC99B,0xDEA4,0xC99C,0xC99D,0xDEA3, +0xC99E,0xC99F,0xC9A0,0xCA40,0xCA41,0xCA42,0xCA43,0xCA44, +0xCA45,0xCA46,0xCA47,0xCA48,0xDDF8,0xCA49,0xCA4A,0xCA4B, +0xCA4C,0xC3EF,0xCA4D,0xC2FB,0xCA4E,0xCA4F,0xCA50,0xD5E1, +0xCA51,0xCA52,0xCEB5,0xCA53,0xCA54,0xCA55,0xCA56,0xDDFD, +0xCA57,0xB2CC,0xCA58,0xCA59,0xCA5A,0xCA5B,0xCA5C,0xCA5D, +0xCA5E,0xCA5F,0xCA60,0xC4E8,0xCADF,0xCA61,0xCA62,0xCA63, +0xCA64,0xCA65,0xCA66,0xCA67,0xCA68,0xCA69,0xCA6A,0xC7BE, +0xDDFA,0xDDFC,0xDDFE,0xDEA2,0xB0AA,0xB1CE,0xCA6B,0xCA6C, +0xCA6D,0xCA6E,0xCA6F,0xDEAC,0xCA70,0xCA71,0xCA72,0xCA73, +0xDEA6,0xBDB6,0xC8EF,0xCA74,0xCA75,0xCA76,0xCA77,0xCA78, +0xCA79,0xCA7A,0xCA7B,0xCA7C,0xCA7D,0xCA7E,0xDEA1,0xCA80, +0xCA81,0xDEA5,0xCA82,0xCA83,0xCA84,0xCA85,0xDEA9,0xCA86, +0xCA87,0xCA88,0xCA89,0xCA8A,0xDEA8,0xCA8B,0xCA8C,0xCA8D, +0xDEA7,0xCA8E,0xCA8F,0xCA90,0xCA91,0xCA92,0xCA93,0xCA94, +0xCA95,0xCA96,0xDEAD,0xCA97,0xD4CC,0xCA98,0xCA99,0xCA9A, +0xCA9B,0xDEB3,0xDEAA,0xDEAE,0xCA9C,0xCA9D,0xC0D9,0xCA9E, +0xCA9F,0xCAA0,0xCB40,0xCB41,0xB1A1,0xDEB6,0xCB42,0xDEB1, +0xCB43,0xCB44,0xCB45,0xCB46,0xCB47,0xCB48,0xCB49,0xDEB2, +0xCB4A,0xCB4B,0xCB4C,0xCB4D,0xCB4E,0xCB4F,0xCB50,0xCB51, +0xCB52,0xCB53,0xCB54,0xD1A6,0xDEB5,0xCB55,0xCB56,0xCB57, +0xCB58,0xCB59,0xCB5A,0xCB5B,0xDEAF,0xCB5C,0xCB5D,0xCB5E, +0xDEB0,0xCB5F,0xD0BD,0xCB60,0xCB61,0xCB62,0xDEB4,0xCAED, +0xDEB9,0xCB63,0xCB64,0xCB65,0xCB66,0xCB67,0xCB68,0xDEB8, +0xCB69,0xDEB7,0xCB6A,0xCB6B,0xCB6C,0xCB6D,0xCB6E,0xCB6F, +0xCB70,0xDEBB,0xCB71,0xCB72,0xCB73,0xCB74,0xCB75,0xCB76, +0xCB77,0xBDE5,0xCB78,0xCB79,0xCB7A,0xCB7B,0xCB7C,0xB2D8, +0xC3EA,0xCB7D,0xCB7E,0xDEBA,0xCB80,0xC5BA,0xCB81,0xCB82, +0xCB83,0xCB84,0xCB85,0xCB86,0xDEBC,0xCB87,0xCB88,0xCB89, +0xCB8A,0xCB8B,0xCB8C,0xCB8D,0xCCD9,0xCB8E,0xCB8F,0xCB90, +0xCB91,0xB7AA,0xCB92,0xCB93,0xCB94,0xCB95,0xCB96,0xCB97, +0xCB98,0xCB99,0xCB9A,0xCB9B,0xCB9C,0xCB9D,0xCB9E,0xCB9F, +0xCBA0,0xCC40,0xCC41,0xD4E5,0xCC42,0xCC43,0xCC44,0xDEBD, +0xCC45,0xCC46,0xCC47,0xCC48,0xCC49,0xDEBF,0xCC4A,0xCC4B, +0xCC4C,0xCC4D,0xCC4E,0xCC4F,0xCC50,0xCC51,0xCC52,0xCC53, +0xCC54,0xC4A2,0xCC55,0xCC56,0xCC57,0xCC58,0xDEC1,0xCC59, +0xCC5A,0xCC5B,0xCC5C,0xCC5D,0xCC5E,0xCC5F,0xCC60,0xCC61, +0xCC62,0xCC63,0xCC64,0xCC65,0xCC66,0xCC67,0xCC68,0xDEBE, +0xCC69,0xDEC0,0xCC6A,0xCC6B,0xCC6C,0xCC6D,0xCC6E,0xCC6F, +0xCC70,0xCC71,0xCC72,0xCC73,0xCC74,0xCC75,0xCC76,0xCC77, +0xD5BA,0xCC78,0xCC79,0xCC7A,0xDEC2,0xCC7B,0xCC7C,0xCC7D, +0xCC7E,0xCC80,0xCC81,0xCC82,0xCC83,0xCC84,0xCC85,0xCC86, +0xCC87,0xCC88,0xCC89,0xCC8A,0xCC8B,0xF2AE,0xBBA2,0xC2B2, +0xC5B0,0xC2C7,0xCC8C,0xCC8D,0xF2AF,0xCC8E,0xCC8F,0xCC90, +0xCC91,0xCC92,0xD0E9,0xCC93,0xCC94,0xCC95,0xD3DD,0xCC96, +0xCC97,0xCC98,0xEBBD,0xCC99,0xCC9A,0xCC9B,0xCC9C,0xCC9D, +0xCC9E,0xCC9F,0xCCA0,0xB3E6,0xF2B0,0xCD40,0xF2B1,0xCD41, +0xCD42,0xCAAD,0xCD43,0xCD44,0xCD45,0xCD46,0xCD47,0xCD48, +0xCD49,0xBAE7,0xF2B3,0xF2B5,0xF2B4,0xCBE4,0xCFBA,0xF2B2, +0xCAB4,0xD2CF,0xC2EC,0xCD4A,0xCD4B,0xCD4C,0xCD4D,0xCD4E, +0xCD4F,0xCD50,0xCEC3,0xF2B8,0xB0F6,0xF2B7,0xCD51,0xCD52, +0xCD53,0xCD54,0xCD55,0xF2BE,0xCD56,0xB2CF,0xCD57,0xCD58, +0xCD59,0xCD5A,0xCD5B,0xCD5C,0xD1C1,0xF2BA,0xCD5D,0xCD5E, +0xCD5F,0xCD60,0xCD61,0xF2BC,0xD4E9,0xCD62,0xCD63,0xF2BB, +0xF2B6,0xF2BF,0xF2BD,0xCD64,0xF2B9,0xCD65,0xCD66,0xF2C7, +0xF2C4,0xF2C6,0xCD67,0xCD68,0xF2CA,0xF2C2,0xF2C0,0xCD69, +0xCD6A,0xCD6B,0xF2C5,0xCD6C,0xCD6D,0xCD6E,0xCD6F,0xCD70, +0xD6FB,0xCD71,0xCD72,0xCD73,0xF2C1,0xCD74,0xC7F9,0xC9DF, +0xCD75,0xF2C8,0xB9C6,0xB5B0,0xCD76,0xCD77,0xF2C3,0xF2C9, +0xF2D0,0xF2D6,0xCD78,0xCD79,0xBBD7,0xCD7A,0xCD7B,0xCD7C, +0xF2D5,0xCDDC,0xCD7D,0xD6EB,0xCD7E,0xCD80,0xF2D2,0xF2D4, +0xCD81,0xCD82,0xCD83,0xCD84,0xB8F2,0xCD85,0xCD86,0xCD87, +0xCD88,0xF2CB,0xCD89,0xCD8A,0xCD8B,0xF2CE,0xC2F9,0xCD8C, +0xD5DD,0xF2CC,0xF2CD,0xF2CF,0xF2D3,0xCD8D,0xCD8E,0xCD8F, +0xF2D9,0xD3BC,0xCD90,0xCD91,0xCD92,0xCD93,0xB6EA,0xCD94, +0xCAF1,0xCD95,0xB7E4,0xF2D7,0xCD96,0xCD97,0xCD98,0xF2D8, +0xF2DA,0xF2DD,0xF2DB,0xCD99,0xCD9A,0xF2DC,0xCD9B,0xCD9C, +0xCD9D,0xCD9E,0xD1D1,0xF2D1,0xCD9F,0xCDC9,0xCDA0,0xCECF, +0xD6A9,0xCE40,0xF2E3,0xCE41,0xC3DB,0xCE42,0xF2E0,0xCE43, +0xCE44,0xC0AF,0xF2EC,0xF2DE,0xCE45,0xF2E1,0xCE46,0xCE47, +0xCE48,0xF2E8,0xCE49,0xCE4A,0xCE4B,0xCE4C,0xF2E2,0xCE4D, +0xCE4E,0xF2E7,0xCE4F,0xCE50,0xF2E6,0xCE51,0xCE52,0xF2E9, +0xCE53,0xCE54,0xCE55,0xF2DF,0xCE56,0xCE57,0xF2E4,0xF2EA, +0xCE58,0xCE59,0xCE5A,0xCE5B,0xCE5C,0xCE5D,0xCE5E,0xD3AC, +0xF2E5,0xB2F5,0xCE5F,0xCE60,0xF2F2,0xCE61,0xD0AB,0xCE62, +0xCE63,0xCE64,0xCE65,0xF2F5,0xCE66,0xCE67,0xCE68,0xBBC8, +0xCE69,0xF2F9,0xCE6A,0xCE6B,0xCE6C,0xCE6D,0xCE6E,0xCE6F, +0xF2F0,0xCE70,0xCE71,0xF2F6,0xF2F8,0xF2FA,0xCE72,0xCE73, +0xCE74,0xCE75,0xCE76,0xCE77,0xCE78,0xCE79,0xF2F3,0xCE7A, +0xF2F1,0xCE7B,0xCE7C,0xCE7D,0xBAFB,0xCE7E,0xB5FB,0xCE80, +0xCE81,0xCE82,0xCE83,0xF2EF,0xF2F7,0xF2ED,0xF2EE,0xCE84, +0xCE85,0xCE86,0xF2EB,0xF3A6,0xCE87,0xF3A3,0xCE88,0xCE89, +0xF3A2,0xCE8A,0xCE8B,0xF2F4,0xCE8C,0xC8DA,0xCE8D,0xCE8E, +0xCE8F,0xCE90,0xCE91,0xF2FB,0xCE92,0xCE93,0xCE94,0xF3A5, +0xCE95,0xCE96,0xCE97,0xCE98,0xCE99,0xCE9A,0xCE9B,0xC3F8, +0xCE9C,0xCE9D,0xCE9E,0xCE9F,0xCEA0,0xCF40,0xCF41,0xCF42, +0xF2FD,0xCF43,0xCF44,0xF3A7,0xF3A9,0xF3A4,0xCF45,0xF2FC, +0xCF46,0xCF47,0xCF48,0xF3AB,0xCF49,0xF3AA,0xCF4A,0xCF4B, +0xCF4C,0xCF4D,0xC2DD,0xCF4E,0xCF4F,0xF3AE,0xCF50,0xCF51, +0xF3B0,0xCF52,0xCF53,0xCF54,0xCF55,0xCF56,0xF3A1,0xCF57, +0xCF58,0xCF59,0xF3B1,0xF3AC,0xCF5A,0xCF5B,0xCF5C,0xCF5D, +0xCF5E,0xF3AF,0xF2FE,0xF3AD,0xCF5F,0xCF60,0xCF61,0xCF62, +0xCF63,0xCF64,0xCF65,0xF3B2,0xCF66,0xCF67,0xCF68,0xCF69, +0xF3B4,0xCF6A,0xCF6B,0xCF6C,0xCF6D,0xF3A8,0xCF6E,0xCF6F, +0xCF70,0xCF71,0xF3B3,0xCF72,0xCF73,0xCF74,0xF3B5,0xCF75, +0xCF76,0xCF77,0xCF78,0xCF79,0xCF7A,0xCF7B,0xCF7C,0xCF7D, +0xCF7E,0xD0B7,0xCF80,0xCF81,0xCF82,0xCF83,0xF3B8,0xCF84, +0xCF85,0xCF86,0xCF87,0xD9F9,0xCF88,0xCF89,0xCF8A,0xCF8B, +0xCF8C,0xCF8D,0xF3B9,0xCF8E,0xCF8F,0xCF90,0xCF91,0xCF92, +0xCF93,0xCF94,0xCF95,0xF3B7,0xCF96,0xC8E4,0xF3B6,0xCF97, +0xCF98,0xCF99,0xCF9A,0xF3BA,0xCF9B,0xCF9C,0xCF9D,0xCF9E, +0xCF9F,0xF3BB,0xB4C0,0xCFA0,0xD040,0xD041,0xD042,0xD043, +0xD044,0xD045,0xD046,0xD047,0xD048,0xD049,0xD04A,0xD04B, +0xD04C,0xD04D,0xEEC3,0xD04E,0xD04F,0xD050,0xD051,0xD052, +0xD053,0xF3BC,0xD054,0xD055,0xF3BD,0xD056,0xD057,0xD058, +0xD1AA,0xD059,0xD05A,0xD05B,0xF4AC,0xD0C6,0xD05C,0xD05D, +0xD05E,0xD05F,0xD060,0xD061,0xD0D0,0xD1DC,0xD062,0xD063, +0xD064,0xD065,0xD066,0xD067,0xCFCE,0xD068,0xD069,0xBDD6, +0xD06A,0xD1C3,0xD06B,0xD06C,0xD06D,0xD06E,0xD06F,0xD070, +0xD071,0xBAE2,0xE1E9,0xD2C2,0xF1C2,0xB2B9,0xD072,0xD073, +0xB1ED,0xF1C3,0xD074,0xC9C0,0xB3C4,0xD075,0xD9F2,0xD076, +0xCBA5,0xD077,0xF1C4,0xD078,0xD079,0xD07A,0xD07B,0xD6D4, +0xD07C,0xD07D,0xD07E,0xD080,0xD081,0xF1C5,0xF4C0,0xF1C6, +0xD082,0xD4AC,0xF1C7,0xD083,0xB0C0,0xF4C1,0xD084,0xD085, +0xF4C2,0xD086,0xD087,0xB4FC,0xD088,0xC5DB,0xD089,0xD08A, +0xD08B,0xD08C,0xCCBB,0xD08D,0xD08E,0xD08F,0xD0E4,0xD090, +0xD091,0xD092,0xD093,0xD094,0xCDE0,0xD095,0xD096,0xD097, +0xD098,0xD099,0xF1C8,0xD09A,0xD9F3,0xD09B,0xD09C,0xD09D, +0xD09E,0xD09F,0xD0A0,0xB1BB,0xD140,0xCFAE,0xD141,0xD142, +0xD143,0xB8A4,0xD144,0xD145,0xD146,0xD147,0xD148,0xF1CA, +0xD149,0xD14A,0xD14B,0xD14C,0xF1CB,0xD14D,0xD14E,0xD14F, +0xD150,0xB2C3,0xC1D1,0xD151,0xD152,0xD7B0,0xF1C9,0xD153, +0xD154,0xF1CC,0xD155,0xD156,0xD157,0xD158,0xF1CE,0xD159, +0xD15A,0xD15B,0xD9F6,0xD15C,0xD2E1,0xD4A3,0xD15D,0xD15E, +0xF4C3,0xC8B9,0xD15F,0xD160,0xD161,0xD162,0xD163,0xF4C4, +0xD164,0xD165,0xF1CD,0xF1CF,0xBFE3,0xF1D0,0xD166,0xD167, +0xF1D4,0xD168,0xD169,0xD16A,0xD16B,0xD16C,0xD16D,0xD16E, +0xF1D6,0xF1D1,0xD16F,0xC9D1,0xC5E1,0xD170,0xD171,0xD172, +0xC2E3,0xB9FC,0xD173,0xD174,0xF1D3,0xD175,0xF1D5,0xD176, +0xD177,0xD178,0xB9D3,0xD179,0xD17A,0xD17B,0xD17C,0xD17D, +0xD17E,0xD180,0xF1DB,0xD181,0xD182,0xD183,0xD184,0xD185, +0xBAD6,0xD186,0xB0FD,0xF1D9,0xD187,0xD188,0xD189,0xD18A, +0xD18B,0xF1D8,0xF1D2,0xF1DA,0xD18C,0xD18D,0xD18E,0xD18F, +0xD190,0xF1D7,0xD191,0xD192,0xD193,0xC8EC,0xD194,0xD195, +0xD196,0xD197,0xCDCA,0xF1DD,0xD198,0xD199,0xD19A,0xD19B, +0xE5BD,0xD19C,0xD19D,0xD19E,0xF1DC,0xD19F,0xF1DE,0xD1A0, +0xD240,0xD241,0xD242,0xD243,0xD244,0xD245,0xD246,0xD247, +0xD248,0xF1DF,0xD249,0xD24A,0xCFE5,0xD24B,0xD24C,0xD24D, +0xD24E,0xD24F,0xD250,0xD251,0xD252,0xD253,0xD254,0xD255, +0xD256,0xD257,0xD258,0xD259,0xD25A,0xD25B,0xD25C,0xD25D, +0xD25E,0xD25F,0xD260,0xD261,0xD262,0xD263,0xF4C5,0xBDF3, +0xD264,0xD265,0xD266,0xD267,0xD268,0xD269,0xF1E0,0xD26A, +0xD26B,0xD26C,0xD26D,0xD26E,0xD26F,0xD270,0xD271,0xD272, +0xD273,0xD274,0xD275,0xD276,0xD277,0xD278,0xD279,0xD27A, +0xD27B,0xD27C,0xD27D,0xF1E1,0xD27E,0xD280,0xD281,0xCEF7, +0xD282,0xD2AA,0xD283,0xF1FB,0xD284,0xD285,0xB8B2,0xD286, +0xD287,0xD288,0xD289,0xD28A,0xD28B,0xD28C,0xD28D,0xD28E, +0xD28F,0xD290,0xD291,0xD292,0xD293,0xD294,0xD295,0xD296, +0xD297,0xD298,0xD299,0xD29A,0xD29B,0xD29C,0xD29D,0xD29E, +0xD29F,0xD2A0,0xD340,0xD341,0xD342,0xD343,0xD344,0xD345, +0xD346,0xD347,0xD348,0xD349,0xD34A,0xD34B,0xD34C,0xD34D, +0xD34E,0xD34F,0xD350,0xD351,0xD352,0xD353,0xD354,0xD355, +0xD356,0xD357,0xD358,0xD359,0xD35A,0xD35B,0xD35C,0xD35D, +0xD35E,0xBCFB,0xB9DB,0xD35F,0xB9E6,0xC3D9,0xCAD3,0xEAE8, +0xC0C0,0xBEF5,0xEAE9,0xEAEA,0xEAEB,0xD360,0xEAEC,0xEAED, +0xEAEE,0xEAEF,0xBDC7,0xD361,0xD362,0xD363,0xF5FB,0xD364, +0xD365,0xD366,0xF5FD,0xD367,0xF5FE,0xD368,0xF5FC,0xD369, +0xD36A,0xD36B,0xD36C,0xBDE2,0xD36D,0xF6A1,0xB4A5,0xD36E, +0xD36F,0xD370,0xD371,0xF6A2,0xD372,0xD373,0xD374,0xF6A3, +0xD375,0xD376,0xD377,0xECB2,0xD378,0xD379,0xD37A,0xD37B, +0xD37C,0xD37D,0xD37E,0xD380,0xD381,0xD382,0xD383,0xD384, +0xD1D4,0xD385,0xD386,0xD387,0xD388,0xD389,0xD38A,0xD9EA, +0xD38B,0xD38C,0xD38D,0xD38E,0xD38F,0xD390,0xD391,0xD392, +0xD393,0xD394,0xD395,0xD396,0xD397,0xD398,0xD399,0xD39A, +0xD39B,0xD39C,0xD39D,0xD39E,0xD39F,0xD3A0,0xD440,0xD441, +0xD442,0xD443,0xD444,0xD445,0xD446,0xD447,0xD448,0xD449, +0xD44A,0xD44B,0xD44C,0xD44D,0xD44E,0xD44F,0xD450,0xD451, +0xD452,0xD453,0xD454,0xD455,0xD456,0xD457,0xD458,0xD459, +0xD45A,0xD45B,0xD45C,0xD45D,0xD45E,0xD45F,0xF6A4,0xD460, +0xD461,0xD462,0xD463,0xD464,0xD465,0xD466,0xD467,0xD468, +0xEEBA,0xD469,0xD46A,0xD46B,0xD46C,0xD46D,0xD46E,0xD46F, +0xD470,0xD471,0xD472,0xD473,0xD474,0xD475,0xD476,0xD477, +0xD478,0xD479,0xD47A,0xD47B,0xD47C,0xD47D,0xD47E,0xD480, +0xD481,0xD482,0xD483,0xD484,0xD485,0xD486,0xD487,0xD488, +0xD489,0xD48A,0xD48B,0xD48C,0xD48D,0xD48E,0xD48F,0xD490, +0xD491,0xD492,0xD493,0xD494,0xD495,0xD496,0xD497,0xD498, +0xD499,0xD5B2,0xD49A,0xD49B,0xD49C,0xD49D,0xD49E,0xD49F, +0xD4A0,0xD540,0xD541,0xD542,0xD543,0xD544,0xD545,0xD546, +0xD547,0xD3FE,0xCCDC,0xD548,0xD549,0xD54A,0xD54B,0xD54C, +0xD54D,0xD54E,0xD54F,0xCAC4,0xD550,0xD551,0xD552,0xD553, +0xD554,0xD555,0xD556,0xD557,0xD558,0xD559,0xD55A,0xD55B, +0xD55C,0xD55D,0xD55E,0xD55F,0xD560,0xD561,0xD562,0xD563, +0xD564,0xD565,0xD566,0xD567,0xD568,0xD569,0xD56A,0xD56B, +0xD56C,0xD56D,0xD56E,0xD56F,0xD570,0xD571,0xD572,0xD573, +0xD574,0xD575,0xD576,0xD577,0xD578,0xD579,0xD57A,0xD57B, +0xD57C,0xD57D,0xD57E,0xD580,0xD581,0xD582,0xD583,0xD584, +0xD585,0xD586,0xD587,0xD588,0xD589,0xD58A,0xD58B,0xD58C, +0xD58D,0xD58E,0xD58F,0xD590,0xD591,0xD592,0xD593,0xD594, +0xD595,0xD596,0xD597,0xD598,0xD599,0xD59A,0xD59B,0xD59C, +0xD59D,0xD59E,0xD59F,0xD5A0,0xD640,0xD641,0xD642,0xD643, +0xD644,0xD645,0xD646,0xD647,0xD648,0xD649,0xD64A,0xD64B, +0xD64C,0xD64D,0xD64E,0xD64F,0xD650,0xD651,0xD652,0xD653, +0xD654,0xD655,0xD656,0xD657,0xD658,0xD659,0xD65A,0xD65B, +0xD65C,0xD65D,0xD65E,0xD65F,0xD660,0xD661,0xD662,0xE5C0, +0xD663,0xD664,0xD665,0xD666,0xD667,0xD668,0xD669,0xD66A, +0xD66B,0xD66C,0xD66D,0xD66E,0xD66F,0xD670,0xD671,0xD672, +0xD673,0xD674,0xD675,0xD676,0xD677,0xD678,0xD679,0xD67A, +0xD67B,0xD67C,0xD67D,0xD67E,0xD680,0xD681,0xF6A5,0xD682, +0xD683,0xD684,0xD685,0xD686,0xD687,0xD688,0xD689,0xD68A, +0xD68B,0xD68C,0xD68D,0xD68E,0xD68F,0xD690,0xD691,0xD692, +0xD693,0xD694,0xD695,0xD696,0xD697,0xD698,0xD699,0xD69A, +0xD69B,0xD69C,0xD69D,0xD69E,0xD69F,0xD6A0,0xD740,0xD741, +0xD742,0xD743,0xD744,0xD745,0xD746,0xD747,0xD748,0xD749, +0xD74A,0xD74B,0xD74C,0xD74D,0xD74E,0xD74F,0xD750,0xD751, +0xD752,0xD753,0xD754,0xD755,0xD756,0xD757,0xD758,0xD759, +0xD75A,0xD75B,0xD75C,0xD75D,0xD75E,0xD75F,0xBEAF,0xD760, +0xD761,0xD762,0xD763,0xD764,0xC6A9,0xD765,0xD766,0xD767, +0xD768,0xD769,0xD76A,0xD76B,0xD76C,0xD76D,0xD76E,0xD76F, +0xD770,0xD771,0xD772,0xD773,0xD774,0xD775,0xD776,0xD777, +0xD778,0xD779,0xD77A,0xD77B,0xD77C,0xD77D,0xD77E,0xD780, +0xD781,0xD782,0xD783,0xD784,0xD785,0xD786,0xD787,0xD788, +0xD789,0xD78A,0xD78B,0xD78C,0xD78D,0xD78E,0xD78F,0xD790, +0xD791,0xD792,0xD793,0xD794,0xD795,0xD796,0xD797,0xD798, +0xDAA5,0xBCC6,0xB6A9,0xB8BC,0xC8CF,0xBCA5,0xDAA6,0xDAA7, +0xCCD6,0xC8C3,0xDAA8,0xC6FD,0xD799,0xD1B5,0xD2E9,0xD1B6, +0xBCC7,0xD79A,0xBDB2,0xBBE4,0xDAA9,0xDAAA,0xD1C8,0xDAAB, +0xD0ED,0xB6EF,0xC2DB,0xD79B,0xCBCF,0xB7ED,0xC9E8,0xB7C3, +0xBEF7,0xD6A4,0xDAAC,0xDAAD,0xC6C0,0xD7E7,0xCAB6,0xD79C, +0xD5A9,0xCBDF,0xD5EF,0xDAAE,0xD6DF,0xB4CA,0xDAB0,0xDAAF, +0xD79D,0xD2EB,0xDAB1,0xDAB2,0xDAB3,0xCAD4,0xDAB4,0xCAAB, +0xDAB5,0xDAB6,0xB3CF,0xD6EF,0xDAB7,0xBBB0,0xB5AE,0xDAB8, +0xDAB9,0xB9EE,0xD1AF,0xD2E8,0xDABA,0xB8C3,0xCFEA,0xB2EF, +0xDABB,0xDABC,0xD79E,0xBDEB,0xCEDC,0xD3EF,0xDABD,0xCEF3, +0xDABE,0xD3D5,0xBBE5,0xDABF,0xCBB5,0xCBD0,0xDAC0,0xC7EB, +0xD6EE,0xDAC1,0xC5B5,0xB6C1,0xDAC2,0xB7CC,0xBFCE,0xDAC3, +0xDAC4,0xCBAD,0xDAC5,0xB5F7,0xDAC6,0xC1C2,0xD7BB,0xDAC7, +0xCCB8,0xD79F,0xD2EA,0xC4B1,0xDAC8,0xB5FD,0xBBD1,0xDAC9, +0xD0B3,0xDACA,0xDACB,0xCEBD,0xDACC,0xDACD,0xDACE,0xB2F7, +0xDAD1,0xDACF,0xD1E8,0xDAD0,0xC3D5,0xDAD2,0xD7A0,0xDAD3, +0xDAD4,0xDAD5,0xD0BB,0xD2A5,0xB0F9,0xDAD6,0xC7AB,0xDAD7, +0xBDF7,0xC3A1,0xDAD8,0xDAD9,0xC3FD,0xCCB7,0xDADA,0xDADB, +0xC0BE,0xC6D7,0xDADC,0xDADD,0xC7B4,0xDADE,0xDADF,0xB9C8, +0xD840,0xD841,0xD842,0xD843,0xD844,0xD845,0xD846,0xD847, +0xD848,0xBBED,0xD849,0xD84A,0xD84B,0xD84C,0xB6B9,0xF4F8, +0xD84D,0xF4F9,0xD84E,0xD84F,0xCDE3,0xD850,0xD851,0xD852, +0xD853,0xD854,0xD855,0xD856,0xD857,0xF5B9,0xD858,0xD859, +0xD85A,0xD85B,0xEBE0,0xD85C,0xD85D,0xD85E,0xD85F,0xD860, +0xD861,0xCFF3,0xBBBF,0xD862,0xD863,0xD864,0xD865,0xD866, +0xD867,0xD868,0xBAC0,0xD4A5,0xD869,0xD86A,0xD86B,0xD86C, +0xD86D,0xD86E,0xD86F,0xE1D9,0xD870,0xD871,0xD872,0xD873, +0xF5F4,0xB1AA,0xB2F2,0xD874,0xD875,0xD876,0xD877,0xD878, +0xD879,0xD87A,0xF5F5,0xD87B,0xD87C,0xF5F7,0xD87D,0xD87E, +0xD880,0xBAD1,0xF5F6,0xD881,0xC3B2,0xD882,0xD883,0xD884, +0xD885,0xD886,0xD887,0xD888,0xF5F9,0xD889,0xD88A,0xD88B, +0xF5F8,0xD88C,0xD88D,0xD88E,0xD88F,0xD890,0xD891,0xD892, +0xD893,0xD894,0xD895,0xD896,0xD897,0xD898,0xD899,0xD89A, +0xD89B,0xD89C,0xD89D,0xD89E,0xD89F,0xD8A0,0xD940,0xD941, +0xD942,0xD943,0xD944,0xD945,0xD946,0xD947,0xD948,0xD949, +0xD94A,0xD94B,0xD94C,0xD94D,0xD94E,0xD94F,0xD950,0xD951, +0xD952,0xD953,0xD954,0xD955,0xD956,0xD957,0xD958,0xD959, +0xD95A,0xD95B,0xD95C,0xD95D,0xD95E,0xD95F,0xD960,0xD961, +0xD962,0xD963,0xD964,0xD965,0xD966,0xD967,0xD968,0xD969, +0xD96A,0xD96B,0xD96C,0xD96D,0xD96E,0xD96F,0xD970,0xD971, +0xD972,0xD973,0xD974,0xD975,0xD976,0xD977,0xD978,0xD979, +0xD97A,0xD97B,0xD97C,0xD97D,0xD97E,0xD980,0xD981,0xD982, +0xD983,0xD984,0xD985,0xD986,0xD987,0xD988,0xD989,0xD98A, +0xD98B,0xD98C,0xD98D,0xD98E,0xD98F,0xD990,0xD991,0xD992, +0xD993,0xD994,0xD995,0xD996,0xD997,0xD998,0xD999,0xD99A, +0xD99B,0xD99C,0xD99D,0xD99E,0xD99F,0xD9A0,0xDA40,0xDA41, +0xDA42,0xDA43,0xDA44,0xDA45,0xDA46,0xDA47,0xDA48,0xDA49, +0xDA4A,0xDA4B,0xDA4C,0xDA4D,0xDA4E,0xB1B4,0xD5EA,0xB8BA, +0xDA4F,0xB9B1,0xB2C6,0xD4F0,0xCFCD,0xB0DC,0xD5CB,0xBBF5, +0xD6CA,0xB7B7,0xCCB0,0xC6B6,0xB1E1,0xB9BA,0xD6FC,0xB9E1, +0xB7A1,0xBCFA,0xEADA,0xEADB,0xCCF9,0xB9F3,0xEADC,0xB4FB, +0xC3B3,0xB7D1,0xBAD8,0xEADD,0xD4F4,0xEADE,0xBCD6,0xBBDF, +0xEADF,0xC1DE,0xC2B8,0xD4DF,0xD7CA,0xEAE0,0xEAE1,0xEAE4, +0xEAE2,0xEAE3,0xC9DE,0xB8B3,0xB6C4,0xEAE5,0xCAEA,0xC9CD, +0xB4CD,0xDA50,0xDA51,0xE2D9,0xC5E2,0xEAE6,0xC0B5,0xDA52, +0xD7B8,0xEAE7,0xD7AC,0xC8FC,0xD8D3,0xD8CD,0xD4DE,0xDA53, +0xD4F9,0xC9C4,0xD3AE,0xB8D3,0xB3E0,0xDA54,0xC9E2,0xF4F6, +0xDA55,0xDA56,0xDA57,0xBAD5,0xDA58,0xF4F7,0xDA59,0xDA5A, +0xD7DF,0xDA5B,0xDA5C,0xF4F1,0xB8B0,0xD5D4,0xB8CF,0xC6F0, +0xDA5D,0xDA5E,0xDA5F,0xDA60,0xDA61,0xDA62,0xDA63,0xDA64, +0xDA65,0xB3C3,0xDA66,0xDA67,0xF4F2,0xB3AC,0xDA68,0xDA69, +0xDA6A,0xDA6B,0xD4BD,0xC7F7,0xDA6C,0xDA6D,0xDA6E,0xDA6F, +0xDA70,0xF4F4,0xDA71,0xDA72,0xF4F3,0xDA73,0xDA74,0xDA75, +0xDA76,0xDA77,0xDA78,0xDA79,0xDA7A,0xDA7B,0xDA7C,0xCCCB, +0xDA7D,0xDA7E,0xDA80,0xC8A4,0xDA81,0xDA82,0xDA83,0xDA84, +0xDA85,0xDA86,0xDA87,0xDA88,0xDA89,0xDA8A,0xDA8B,0xDA8C, +0xDA8D,0xF4F5,0xDA8E,0xD7E3,0xC5BF,0xF5C0,0xDA8F,0xDA90, +0xF5BB,0xDA91,0xF5C3,0xDA92,0xF5C2,0xDA93,0xD6BA,0xF5C1, +0xDA94,0xDA95,0xDA96,0xD4BE,0xF5C4,0xDA97,0xF5CC,0xDA98, +0xDA99,0xDA9A,0xDA9B,0xB0CF,0xB5F8,0xDA9C,0xF5C9,0xF5CA, +0xDA9D,0xC5DC,0xDA9E,0xDA9F,0xDAA0,0xDB40,0xF5C5,0xF5C6, +0xDB41,0xDB42,0xF5C7,0xF5CB,0xDB43,0xBEE0,0xF5C8,0xB8FA, +0xDB44,0xDB45,0xDB46,0xF5D0,0xF5D3,0xDB47,0xDB48,0xDB49, +0xBFE7,0xDB4A,0xB9F2,0xF5BC,0xF5CD,0xDB4B,0xDB4C,0xC2B7, +0xDB4D,0xDB4E,0xDB4F,0xCCF8,0xDB50,0xBCF9,0xDB51,0xF5CE, +0xF5CF,0xF5D1,0xB6E5,0xF5D2,0xDB52,0xF5D5,0xDB53,0xDB54, +0xDB55,0xDB56,0xDB57,0xDB58,0xDB59,0xF5BD,0xDB5A,0xDB5B, +0xDB5C,0xF5D4,0xD3BB,0xDB5D,0xB3EC,0xDB5E,0xDB5F,0xCCA4, +0xDB60,0xDB61,0xDB62,0xDB63,0xF5D6,0xDB64,0xDB65,0xDB66, +0xDB67,0xDB68,0xDB69,0xDB6A,0xDB6B,0xF5D7,0xBEE1,0xF5D8, +0xDB6C,0xDB6D,0xCCDF,0xF5DB,0xDB6E,0xDB6F,0xDB70,0xDB71, +0xDB72,0xB2C8,0xD7D9,0xDB73,0xF5D9,0xDB74,0xF5DA,0xF5DC, +0xDB75,0xF5E2,0xDB76,0xDB77,0xDB78,0xF5E0,0xDB79,0xDB7A, +0xDB7B,0xF5DF,0xF5DD,0xDB7C,0xDB7D,0xF5E1,0xDB7E,0xDB80, +0xF5DE,0xF5E4,0xF5E5,0xDB81,0xCCE3,0xDB82,0xDB83,0xE5BF, +0xB5B8,0xF5E3,0xF5E8,0xCCA3,0xDB84,0xDB85,0xDB86,0xDB87, +0xDB88,0xF5E6,0xF5E7,0xDB89,0xDB8A,0xDB8B,0xDB8C,0xDB8D, +0xDB8E,0xF5BE,0xDB8F,0xDB90,0xDB91,0xDB92,0xDB93,0xDB94, +0xDB95,0xDB96,0xDB97,0xDB98,0xDB99,0xDB9A,0xB1C4,0xDB9B, +0xDB9C,0xF5BF,0xDB9D,0xDB9E,0xB5C5,0xB2E4,0xDB9F,0xF5EC, +0xF5E9,0xDBA0,0xB6D7,0xDC40,0xF5ED,0xDC41,0xF5EA,0xDC42, +0xDC43,0xDC44,0xDC45,0xDC46,0xF5EB,0xDC47,0xDC48,0xB4DA, +0xDC49,0xD4EA,0xDC4A,0xDC4B,0xDC4C,0xF5EE,0xDC4D,0xB3F9, +0xDC4E,0xDC4F,0xDC50,0xDC51,0xDC52,0xDC53,0xDC54,0xF5EF, +0xF5F1,0xDC55,0xDC56,0xDC57,0xF5F0,0xDC58,0xDC59,0xDC5A, +0xDC5B,0xDC5C,0xDC5D,0xDC5E,0xF5F2,0xDC5F,0xF5F3,0xDC60, +0xDC61,0xDC62,0xDC63,0xDC64,0xDC65,0xDC66,0xDC67,0xDC68, +0xDC69,0xDC6A,0xDC6B,0xC9ED,0xB9AA,0xDC6C,0xDC6D,0xC7FB, +0xDC6E,0xDC6F,0xB6E3,0xDC70,0xDC71,0xDC72,0xDC73,0xDC74, +0xDC75,0xDC76,0xCCC9,0xDC77,0xDC78,0xDC79,0xDC7A,0xDC7B, +0xDC7C,0xDC7D,0xDC7E,0xDC80,0xDC81,0xDC82,0xDC83,0xDC84, +0xDC85,0xDC86,0xDC87,0xDC88,0xDC89,0xDC8A,0xEAA6,0xDC8B, +0xDC8C,0xDC8D,0xDC8E,0xDC8F,0xDC90,0xDC91,0xDC92,0xDC93, +0xDC94,0xDC95,0xDC96,0xDC97,0xDC98,0xDC99,0xDC9A,0xDC9B, +0xDC9C,0xDC9D,0xDC9E,0xDC9F,0xDCA0,0xDD40,0xDD41,0xDD42, +0xDD43,0xDD44,0xDD45,0xDD46,0xDD47,0xDD48,0xDD49,0xDD4A, +0xDD4B,0xDD4C,0xDD4D,0xDD4E,0xDD4F,0xDD50,0xDD51,0xDD52, +0xDD53,0xDD54,0xDD55,0xDD56,0xDD57,0xDD58,0xDD59,0xDD5A, +0xDD5B,0xDD5C,0xDD5D,0xDD5E,0xDD5F,0xDD60,0xDD61,0xDD62, +0xDD63,0xDD64,0xDD65,0xDD66,0xDD67,0xDD68,0xDD69,0xDD6A, +0xDD6B,0xDD6C,0xDD6D,0xDD6E,0xDD6F,0xDD70,0xDD71,0xDD72, +0xDD73,0xDD74,0xDD75,0xDD76,0xDD77,0xDD78,0xDD79,0xDD7A, +0xDD7B,0xDD7C,0xDD7D,0xDD7E,0xDD80,0xDD81,0xDD82,0xDD83, +0xDD84,0xDD85,0xDD86,0xDD87,0xDD88,0xDD89,0xDD8A,0xDD8B, +0xDD8C,0xDD8D,0xDD8E,0xDD8F,0xDD90,0xDD91,0xDD92,0xDD93, +0xDD94,0xDD95,0xDD96,0xDD97,0xDD98,0xDD99,0xDD9A,0xDD9B, +0xDD9C,0xDD9D,0xDD9E,0xDD9F,0xDDA0,0xDE40,0xDE41,0xDE42, +0xDE43,0xDE44,0xDE45,0xDE46,0xDE47,0xDE48,0xDE49,0xDE4A, +0xDE4B,0xDE4C,0xDE4D,0xDE4E,0xDE4F,0xDE50,0xDE51,0xDE52, +0xDE53,0xDE54,0xDE55,0xDE56,0xDE57,0xDE58,0xDE59,0xDE5A, +0xDE5B,0xDE5C,0xDE5D,0xDE5E,0xDE5F,0xDE60,0xB3B5,0xD4FE, +0xB9EC,0xD0F9,0xDE61,0xE9ED,0xD7AA,0xE9EE,0xC2D6,0xC8ED, +0xBAE4,0xE9EF,0xE9F0,0xE9F1,0xD6E1,0xE9F2,0xE9F3,0xE9F5, +0xE9F4,0xE9F6,0xE9F7,0xC7E1,0xE9F8,0xD4D8,0xE9F9,0xBDCE, +0xDE62,0xE9FA,0xE9FB,0xBDCF,0xE9FC,0xB8A8,0xC1BE,0xE9FD, +0xB1B2,0xBBD4,0xB9F5,0xE9FE,0xDE63,0xEAA1,0xEAA2,0xEAA3, +0xB7F8,0xBCAD,0xDE64,0xCAE4,0xE0CE,0xD4AF,0xCFBD,0xD5B7, +0xEAA4,0xD5DE,0xEAA5,0xD0C1,0xB9BC,0xDE65,0xB4C7,0xB1D9, +0xDE66,0xDE67,0xDE68,0xC0B1,0xDE69,0xDE6A,0xDE6B,0xDE6C, +0xB1E6,0xB1E7,0xDE6D,0xB1E8,0xDE6E,0xDE6F,0xDE70,0xDE71, +0xB3BD,0xC8E8,0xDE72,0xDE73,0xDE74,0xDE75,0xE5C1,0xDE76, +0xDE77,0xB1DF,0xDE78,0xDE79,0xDE7A,0xC1C9,0xB4EF,0xDE7B, +0xDE7C,0xC7A8,0xD3D8,0xDE7D,0xC6F9,0xD1B8,0xDE7E,0xB9FD, +0xC2F5,0xDE80,0xDE81,0xDE82,0xDE83,0xDE84,0xD3AD,0xDE85, +0xD4CB,0xBDFC,0xDE86,0xE5C2,0xB7B5,0xE5C3,0xDE87,0xDE88, +0xBBB9,0xD5E2,0xDE89,0xBDF8,0xD4B6,0xCEA5,0xC1AC,0xB3D9, +0xDE8A,0xDE8B,0xCCF6,0xDE8C,0xE5C6,0xE5C4,0xE5C8,0xDE8D, +0xE5CA,0xE5C7,0xB5CF,0xC6C8,0xDE8E,0xB5FC,0xE5C5,0xDE8F, +0xCAF6,0xDE90,0xDE91,0xE5C9,0xDE92,0xDE93,0xDE94,0xC3D4, +0xB1C5,0xBCA3,0xDE95,0xDE96,0xDE97,0xD7B7,0xDE98,0xDE99, +0xCDCB,0xCBCD,0xCACA,0xCCD3,0xE5CC,0xE5CB,0xC4E6,0xDE9A, +0xDE9B,0xD1A1,0xD1B7,0xE5CD,0xDE9C,0xE5D0,0xDE9D,0xCDB8, +0xD6F0,0xE5CF,0xB5DD,0xDE9E,0xCDBE,0xDE9F,0xE5D1,0xB6BA, +0xDEA0,0xDF40,0xCDA8,0xB9E4,0xDF41,0xCAC5,0xB3D1,0xCBD9, +0xD4EC,0xE5D2,0xB7EA,0xDF42,0xDF43,0xDF44,0xE5CE,0xDF45, +0xDF46,0xDF47,0xDF48,0xDF49,0xDF4A,0xE5D5,0xB4FE,0xE5D6, +0xDF4B,0xDF4C,0xDF4D,0xDF4E,0xDF4F,0xE5D3,0xE5D4,0xDF50, +0xD2DD,0xDF51,0xDF52,0xC2DF,0xB1C6,0xDF53,0xD3E2,0xDF54, +0xDF55,0xB6DD,0xCBEC,0xDF56,0xE5D7,0xDF57,0xDF58,0xD3F6, +0xDF59,0xDF5A,0xDF5B,0xDF5C,0xDF5D,0xB1E9,0xDF5E,0xB6F4, +0xE5DA,0xE5D8,0xE5D9,0xB5C0,0xDF5F,0xDF60,0xDF61,0xD2C5, +0xE5DC,0xDF62,0xDF63,0xE5DE,0xDF64,0xDF65,0xDF66,0xDF67, +0xDF68,0xDF69,0xE5DD,0xC7B2,0xDF6A,0xD2A3,0xDF6B,0xDF6C, +0xE5DB,0xDF6D,0xDF6E,0xDF6F,0xDF70,0xD4E2,0xD5DA,0xDF71, +0xDF72,0xDF73,0xDF74,0xDF75,0xE5E0,0xD7F1,0xDF76,0xDF77, +0xDF78,0xDF79,0xDF7A,0xDF7B,0xDF7C,0xE5E1,0xDF7D,0xB1DC, +0xD1FB,0xDF7E,0xE5E2,0xE5E4,0xDF80,0xDF81,0xDF82,0xDF83, +0xE5E3,0xDF84,0xDF85,0xE5E5,0xDF86,0xDF87,0xDF88,0xDF89, +0xDF8A,0xD2D8,0xDF8B,0xB5CB,0xDF8C,0xE7DF,0xDF8D,0xDAF5, +0xDF8E,0xDAF8,0xDF8F,0xDAF6,0xDF90,0xDAF7,0xDF91,0xDF92, +0xDF93,0xDAFA,0xD0CF,0xC4C7,0xDF94,0xDF95,0xB0EE,0xDF96, +0xDF97,0xDF98,0xD0B0,0xDF99,0xDAF9,0xDF9A,0xD3CA,0xBAAA, +0xDBA2,0xC7F1,0xDF9B,0xDAFC,0xDAFB,0xC9DB,0xDAFD,0xDF9C, +0xDBA1,0xD7DE,0xDAFE,0xC1DA,0xDF9D,0xDF9E,0xDBA5,0xDF9F, +0xDFA0,0xD3F4,0xE040,0xE041,0xDBA7,0xDBA4,0xE042,0xDBA8, +0xE043,0xE044,0xBDBC,0xE045,0xE046,0xE047,0xC0C9,0xDBA3, +0xDBA6,0xD6A3,0xE048,0xDBA9,0xE049,0xE04A,0xE04B,0xDBAD, +0xE04C,0xE04D,0xE04E,0xDBAE,0xDBAC,0xBAC2,0xE04F,0xE050, +0xE051,0xBFA4,0xDBAB,0xE052,0xE053,0xE054,0xDBAA,0xD4C7, +0xB2BF,0xE055,0xE056,0xDBAF,0xE057,0xB9F9,0xE058,0xDBB0, +0xE059,0xE05A,0xE05B,0xE05C,0xB3BB,0xE05D,0xE05E,0xE05F, +0xB5A6,0xE060,0xE061,0xE062,0xE063,0xB6BC,0xDBB1,0xE064, +0xE065,0xE066,0xB6F5,0xE067,0xDBB2,0xE068,0xE069,0xE06A, +0xE06B,0xE06C,0xE06D,0xE06E,0xE06F,0xE070,0xE071,0xE072, +0xE073,0xE074,0xE075,0xE076,0xE077,0xE078,0xE079,0xE07A, +0xE07B,0xB1C9,0xE07C,0xE07D,0xE07E,0xE080,0xDBB4,0xE081, +0xE082,0xE083,0xDBB3,0xDBB5,0xE084,0xE085,0xE086,0xE087, +0xE088,0xE089,0xE08A,0xE08B,0xE08C,0xE08D,0xE08E,0xDBB7, +0xE08F,0xDBB6,0xE090,0xE091,0xE092,0xE093,0xE094,0xE095, +0xE096,0xDBB8,0xE097,0xE098,0xE099,0xE09A,0xE09B,0xE09C, +0xE09D,0xE09E,0xE09F,0xDBB9,0xE0A0,0xE140,0xDBBA,0xE141, +0xE142,0xD3CF,0xF4FA,0xC7F5,0xD7C3,0xC5E4,0xF4FC,0xF4FD, +0xF4FB,0xE143,0xBEC6,0xE144,0xE145,0xE146,0xE147,0xD0EF, +0xE148,0xE149,0xB7D3,0xE14A,0xE14B,0xD4CD,0xCCAA,0xE14C, +0xE14D,0xF5A2,0xF5A1,0xBAA8,0xF4FE,0xCBD6,0xE14E,0xE14F, +0xE150,0xF5A4,0xC0D2,0xE151,0xB3EA,0xE152,0xCDAA,0xF5A5, +0xF5A3,0xBDB4,0xF5A8,0xE153,0xF5A9,0xBDCD,0xC3B8,0xBFE1, +0xCBE1,0xF5AA,0xE154,0xE155,0xE156,0xF5A6,0xF5A7,0xC4F0, +0xE157,0xE158,0xE159,0xE15A,0xE15B,0xF5AC,0xE15C,0xB4BC, +0xE15D,0xD7ED,0xE15E,0xB4D7,0xF5AB,0xF5AE,0xE15F,0xE160, +0xF5AD,0xF5AF,0xD0D1,0xE161,0xE162,0xE163,0xE164,0xE165, +0xE166,0xE167,0xC3D1,0xC8A9,0xE168,0xE169,0xE16A,0xE16B, +0xE16C,0xE16D,0xF5B0,0xF5B1,0xE16E,0xE16F,0xE170,0xE171, +0xE172,0xE173,0xF5B2,0xE174,0xE175,0xF5B3,0xF5B4,0xF5B5, +0xE176,0xE177,0xE178,0xE179,0xF5B7,0xF5B6,0xE17A,0xE17B, +0xE17C,0xE17D,0xF5B8,0xE17E,0xE180,0xE181,0xE182,0xE183, +0xE184,0xE185,0xE186,0xE187,0xE188,0xE189,0xE18A,0xB2C9, +0xE18B,0xD3D4,0xCACD,0xE18C,0xC0EF,0xD6D8,0xD2B0,0xC1BF, +0xE18D,0xBDF0,0xE18E,0xE18F,0xE190,0xE191,0xE192,0xE193, +0xE194,0xE195,0xE196,0xE197,0xB8AA,0xE198,0xE199,0xE19A, +0xE19B,0xE19C,0xE19D,0xE19E,0xE19F,0xE1A0,0xE240,0xE241, +0xE242,0xE243,0xE244,0xE245,0xE246,0xE247,0xE248,0xE249, +0xE24A,0xE24B,0xE24C,0xE24D,0xE24E,0xE24F,0xE250,0xE251, +0xE252,0xE253,0xE254,0xE255,0xE256,0xE257,0xE258,0xE259, +0xE25A,0xE25B,0xE25C,0xE25D,0xE25E,0xE25F,0xE260,0xE261, +0xE262,0xE263,0xE264,0xE265,0xE266,0xE267,0xE268,0xE269, +0xE26A,0xE26B,0xE26C,0xE26D,0xE26E,0xE26F,0xE270,0xE271, +0xE272,0xE273,0xE274,0xE275,0xE276,0xE277,0xE278,0xE279, +0xE27A,0xE27B,0xE27C,0xE27D,0xE27E,0xE280,0xE281,0xE282, +0xE283,0xE284,0xE285,0xE286,0xE287,0xE288,0xE289,0xE28A, +0xE28B,0xE28C,0xE28D,0xE28E,0xE28F,0xE290,0xE291,0xE292, +0xE293,0xE294,0xE295,0xE296,0xE297,0xE298,0xE299,0xE29A, +0xE29B,0xE29C,0xE29D,0xE29E,0xE29F,0xE2A0,0xE340,0xE341, +0xE342,0xE343,0xE344,0xE345,0xE346,0xE347,0xE348,0xE349, +0xE34A,0xE34B,0xE34C,0xE34D,0xE34E,0xE34F,0xE350,0xE351, +0xE352,0xE353,0xE354,0xE355,0xE356,0xE357,0xE358,0xE359, +0xE35A,0xE35B,0xE35C,0xE35D,0xE35E,0xE35F,0xE360,0xE361, +0xE362,0xE363,0xE364,0xE365,0xE366,0xE367,0xE368,0xE369, +0xE36A,0xE36B,0xE36C,0xE36D,0xBCF8,0xE36E,0xE36F,0xE370, +0xE371,0xE372,0xE373,0xE374,0xE375,0xE376,0xE377,0xE378, +0xE379,0xE37A,0xE37B,0xE37C,0xE37D,0xE37E,0xE380,0xE381, +0xE382,0xE383,0xE384,0xE385,0xE386,0xE387,0xF6C6,0xE388, +0xE389,0xE38A,0xE38B,0xE38C,0xE38D,0xE38E,0xE38F,0xE390, +0xE391,0xE392,0xE393,0xE394,0xE395,0xE396,0xE397,0xE398, +0xE399,0xE39A,0xE39B,0xE39C,0xE39D,0xE39E,0xE39F,0xE3A0, +0xE440,0xE441,0xE442,0xE443,0xE444,0xE445,0xF6C7,0xE446, +0xE447,0xE448,0xE449,0xE44A,0xE44B,0xE44C,0xE44D,0xE44E, +0xE44F,0xE450,0xE451,0xE452,0xE453,0xE454,0xE455,0xE456, +0xE457,0xE458,0xE459,0xE45A,0xE45B,0xE45C,0xE45D,0xE45E, +0xF6C8,0xE45F,0xE460,0xE461,0xE462,0xE463,0xE464,0xE465, +0xE466,0xE467,0xE468,0xE469,0xE46A,0xE46B,0xE46C,0xE46D, +0xE46E,0xE46F,0xE470,0xE471,0xE472,0xE473,0xE474,0xE475, +0xE476,0xE477,0xE478,0xE479,0xE47A,0xE47B,0xE47C,0xE47D, +0xE47E,0xE480,0xE481,0xE482,0xE483,0xE484,0xE485,0xE486, +0xE487,0xE488,0xE489,0xE48A,0xE48B,0xE48C,0xE48D,0xE48E, +0xE48F,0xE490,0xE491,0xE492,0xE493,0xE494,0xE495,0xE496, +0xE497,0xE498,0xE499,0xE49A,0xE49B,0xE49C,0xE49D,0xE49E, +0xE49F,0xE4A0,0xE540,0xE541,0xE542,0xE543,0xE544,0xE545, +0xE546,0xE547,0xE548,0xE549,0xE54A,0xE54B,0xE54C,0xE54D, +0xE54E,0xE54F,0xE550,0xE551,0xE552,0xE553,0xE554,0xE555, +0xE556,0xE557,0xE558,0xE559,0xE55A,0xE55B,0xE55C,0xE55D, +0xE55E,0xE55F,0xE560,0xE561,0xE562,0xE563,0xE564,0xE565, +0xE566,0xE567,0xE568,0xE569,0xE56A,0xE56B,0xE56C,0xE56D, +0xE56E,0xE56F,0xE570,0xE571,0xE572,0xE573,0xF6C9,0xE574, +0xE575,0xE576,0xE577,0xE578,0xE579,0xE57A,0xE57B,0xE57C, +0xE57D,0xE57E,0xE580,0xE581,0xE582,0xE583,0xE584,0xE585, +0xE586,0xE587,0xE588,0xE589,0xE58A,0xE58B,0xE58C,0xE58D, +0xE58E,0xE58F,0xE590,0xE591,0xE592,0xE593,0xE594,0xE595, +0xE596,0xE597,0xE598,0xE599,0xE59A,0xE59B,0xE59C,0xE59D, +0xE59E,0xE59F,0xF6CA,0xE5A0,0xE640,0xE641,0xE642,0xE643, +0xE644,0xE645,0xE646,0xE647,0xE648,0xE649,0xE64A,0xE64B, +0xE64C,0xE64D,0xE64E,0xE64F,0xE650,0xE651,0xE652,0xE653, +0xE654,0xE655,0xE656,0xE657,0xE658,0xE659,0xE65A,0xE65B, +0xE65C,0xE65D,0xE65E,0xE65F,0xE660,0xE661,0xE662,0xF6CC, +0xE663,0xE664,0xE665,0xE666,0xE667,0xE668,0xE669,0xE66A, +0xE66B,0xE66C,0xE66D,0xE66E,0xE66F,0xE670,0xE671,0xE672, +0xE673,0xE674,0xE675,0xE676,0xE677,0xE678,0xE679,0xE67A, +0xE67B,0xE67C,0xE67D,0xE67E,0xE680,0xE681,0xE682,0xE683, +0xE684,0xE685,0xE686,0xE687,0xE688,0xE689,0xE68A,0xE68B, +0xE68C,0xE68D,0xE68E,0xE68F,0xE690,0xE691,0xE692,0xE693, +0xE694,0xE695,0xE696,0xE697,0xE698,0xE699,0xE69A,0xE69B, +0xE69C,0xE69D,0xF6CB,0xE69E,0xE69F,0xE6A0,0xE740,0xE741, +0xE742,0xE743,0xE744,0xE745,0xE746,0xE747,0xF7E9,0xE748, +0xE749,0xE74A,0xE74B,0xE74C,0xE74D,0xE74E,0xE74F,0xE750, +0xE751,0xE752,0xE753,0xE754,0xE755,0xE756,0xE757,0xE758, +0xE759,0xE75A,0xE75B,0xE75C,0xE75D,0xE75E,0xE75F,0xE760, +0xE761,0xE762,0xE763,0xE764,0xE765,0xE766,0xE767,0xE768, +0xE769,0xE76A,0xE76B,0xE76C,0xE76D,0xE76E,0xE76F,0xE770, +0xE771,0xE772,0xE773,0xE774,0xE775,0xE776,0xE777,0xE778, +0xE779,0xE77A,0xE77B,0xE77C,0xE77D,0xE77E,0xE780,0xE781, +0xE782,0xE783,0xE784,0xE785,0xE786,0xE787,0xE788,0xE789, +0xE78A,0xE78B,0xE78C,0xE78D,0xE78E,0xE78F,0xE790,0xE791, +0xE792,0xE793,0xE794,0xE795,0xE796,0xE797,0xE798,0xE799, +0xE79A,0xE79B,0xE79C,0xE79D,0xE79E,0xE79F,0xE7A0,0xE840, +0xE841,0xE842,0xE843,0xE844,0xE845,0xE846,0xE847,0xE848, +0xE849,0xE84A,0xE84B,0xE84C,0xE84D,0xE84E,0xF6CD,0xE84F, +0xE850,0xE851,0xE852,0xE853,0xE854,0xE855,0xE856,0xE857, +0xE858,0xE859,0xE85A,0xE85B,0xE85C,0xE85D,0xE85E,0xE85F, +0xE860,0xE861,0xE862,0xE863,0xE864,0xE865,0xE866,0xE867, +0xE868,0xE869,0xE86A,0xE86B,0xE86C,0xE86D,0xE86E,0xE86F, +0xE870,0xE871,0xE872,0xE873,0xE874,0xE875,0xE876,0xE877, +0xE878,0xE879,0xE87A,0xF6CE,0xE87B,0xE87C,0xE87D,0xE87E, +0xE880,0xE881,0xE882,0xE883,0xE884,0xE885,0xE886,0xE887, +0xE888,0xE889,0xE88A,0xE88B,0xE88C,0xE88D,0xE88E,0xE88F, +0xE890,0xE891,0xE892,0xE893,0xE894,0xEEC4,0xEEC5,0xEEC6, +0xD5EB,0xB6A4,0xEEC8,0xEEC7,0xEEC9,0xEECA,0xC7A5,0xEECB, +0xEECC,0xE895,0xB7B0,0xB5F6,0xEECD,0xEECF,0xE896,0xEECE, +0xE897,0xB8C6,0xEED0,0xEED1,0xEED2,0xB6DB,0xB3AE,0xD6D3, +0xC4C6,0xB1B5,0xB8D6,0xEED3,0xEED4,0xD4BF,0xC7D5,0xBEFB, +0xCED9,0xB9B3,0xEED6,0xEED5,0xEED8,0xEED7,0xC5A5,0xEED9, +0xEEDA,0xC7AE,0xEEDB,0xC7AF,0xEEDC,0xB2A7,0xEEDD,0xEEDE, +0xEEDF,0xEEE0,0xEEE1,0xD7EA,0xEEE2,0xEEE3,0xBCD8,0xEEE4, +0xD3CB,0xCCFA,0xB2AC,0xC1E5,0xEEE5,0xC7A6,0xC3AD,0xE898, +0xEEE6,0xEEE7,0xEEE8,0xEEE9,0xEEEA,0xEEEB,0xEEEC,0xE899, +0xEEED,0xEEEE,0xEEEF,0xE89A,0xE89B,0xEEF0,0xEEF1,0xEEF2, +0xEEF4,0xEEF3,0xE89C,0xEEF5,0xCDAD,0xC2C1,0xEEF6,0xEEF7, +0xEEF8,0xD5A1,0xEEF9,0xCFB3,0xEEFA,0xEEFB,0xE89D,0xEEFC, +0xEEFD,0xEFA1,0xEEFE,0xEFA2,0xB8F5,0xC3FA,0xEFA3,0xEFA4, +0xBDC2,0xD2BF,0xB2F9,0xEFA5,0xEFA6,0xEFA7,0xD2F8,0xEFA8, +0xD6FD,0xEFA9,0xC6CC,0xE89E,0xEFAA,0xEFAB,0xC1B4,0xEFAC, +0xCFFA,0xCBF8,0xEFAE,0xEFAD,0xB3FA,0xB9F8,0xEFAF,0xEFB0, +0xD0E2,0xEFB1,0xEFB2,0xB7E6,0xD0BF,0xEFB3,0xEFB4,0xEFB5, +0xC8F1,0xCCE0,0xEFB6,0xEFB7,0xEFB8,0xEFB9,0xEFBA,0xD5E0, +0xEFBB,0xB4ED,0xC3AA,0xEFBC,0xE89F,0xEFBD,0xEFBE,0xEFBF, +0xE8A0,0xCEFD,0xEFC0,0xC2E0,0xB4B8,0xD7B6,0xBDF5,0xE940, +0xCFC7,0xEFC3,0xEFC1,0xEFC2,0xEFC4,0xB6A7,0xBCFC,0xBEE2, +0xC3CC,0xEFC5,0xEFC6,0xE941,0xEFC7,0xEFCF,0xEFC8,0xEFC9, +0xEFCA,0xC7C2,0xEFF1,0xB6CD,0xEFCB,0xE942,0xEFCC,0xEFCD, +0xB6C6,0xC3BE,0xEFCE,0xE943,0xEFD0,0xEFD1,0xEFD2,0xD5F2, +0xE944,0xEFD3,0xC4F7,0xE945,0xEFD4,0xC4F8,0xEFD5,0xEFD6, +0xB8E4,0xB0F7,0xEFD7,0xEFD8,0xEFD9,0xE946,0xEFDA,0xEFDB, +0xEFDC,0xEFDD,0xE947,0xEFDE,0xBEB5,0xEFE1,0xEFDF,0xEFE0, +0xE948,0xEFE2,0xEFE3,0xC1CD,0xEFE4,0xEFE5,0xEFE6,0xEFE7, +0xEFE8,0xEFE9,0xEFEA,0xEFEB,0xEFEC,0xC0D8,0xE949,0xEFED, +0xC1AD,0xEFEE,0xEFEF,0xEFF0,0xE94A,0xE94B,0xCFE2,0xE94C, +0xE94D,0xE94E,0xE94F,0xE950,0xE951,0xE952,0xE953,0xB3A4, +0xE954,0xE955,0xE956,0xE957,0xE958,0xE959,0xE95A,0xE95B, +0xE95C,0xE95D,0xE95E,0xE95F,0xE960,0xE961,0xE962,0xE963, +0xE964,0xE965,0xE966,0xE967,0xE968,0xE969,0xE96A,0xE96B, +0xE96C,0xE96D,0xE96E,0xE96F,0xE970,0xE971,0xE972,0xE973, +0xE974,0xE975,0xE976,0xE977,0xE978,0xE979,0xE97A,0xE97B, +0xE97C,0xE97D,0xE97E,0xE980,0xE981,0xE982,0xE983,0xE984, +0xE985,0xE986,0xE987,0xE988,0xE989,0xE98A,0xE98B,0xE98C, +0xE98D,0xE98E,0xE98F,0xE990,0xE991,0xE992,0xE993,0xE994, +0xE995,0xE996,0xE997,0xE998,0xE999,0xE99A,0xE99B,0xE99C, +0xE99D,0xE99E,0xE99F,0xE9A0,0xEA40,0xEA41,0xEA42,0xEA43, +0xEA44,0xEA45,0xEA46,0xEA47,0xEA48,0xEA49,0xEA4A,0xEA4B, +0xEA4C,0xEA4D,0xEA4E,0xEA4F,0xEA50,0xEA51,0xEA52,0xEA53, +0xEA54,0xEA55,0xEA56,0xEA57,0xEA58,0xEA59,0xEA5A,0xEA5B, +0xC3C5,0xE3C5,0xC9C1,0xE3C6,0xEA5C,0xB1D5,0xCECA,0xB4B3, +0xC8F2,0xE3C7,0xCFD0,0xE3C8,0xBCE4,0xE3C9,0xE3CA,0xC3C6, +0xD5A2,0xC4D6,0xB9EB,0xCEC5,0xE3CB,0xC3F6,0xE3CC,0xEA5D, +0xB7A7,0xB8F3,0xBAD2,0xE3CD,0xE3CE,0xD4C4,0xE3CF,0xEA5E, +0xE3D0,0xD1CB,0xE3D1,0xE3D2,0xE3D3,0xE3D4,0xD1D6,0xE3D5, +0xB2FB,0xC0BB,0xE3D6,0xEA5F,0xC0AB,0xE3D7,0xE3D8,0xE3D9, +0xEA60,0xE3DA,0xE3DB,0xEA61,0xB8B7,0xDAE2,0xEA62,0xB6D3, +0xEA63,0xDAE4,0xDAE3,0xEA64,0xEA65,0xEA66,0xEA67,0xEA68, +0xEA69,0xEA6A,0xDAE6,0xEA6B,0xEA6C,0xEA6D,0xC8EE,0xEA6E, +0xEA6F,0xDAE5,0xB7C0,0xD1F4,0xD2F5,0xD5F3,0xBDD7,0xEA70, +0xEA71,0xEA72,0xEA73,0xD7E8,0xDAE8,0xDAE7,0xEA74,0xB0A2, +0xCDD3,0xEA75,0xDAE9,0xEA76,0xB8BD,0xBCCA,0xC2BD,0xC2A4, +0xB3C2,0xDAEA,0xEA77,0xC2AA,0xC4B0,0xBDB5,0xEA78,0xEA79, +0xCFDE,0xEA7A,0xEA7B,0xEA7C,0xDAEB,0xC9C2,0xEA7D,0xEA7E, +0xEA80,0xEA81,0xEA82,0xB1DD,0xEA83,0xEA84,0xEA85,0xDAEC, +0xEA86,0xB6B8,0xD4BA,0xEA87,0xB3FD,0xEA88,0xEA89,0xDAED, +0xD4C9,0xCFD5,0xC5E3,0xEA8A,0xDAEE,0xEA8B,0xEA8C,0xEA8D, +0xEA8E,0xEA8F,0xDAEF,0xEA90,0xDAF0,0xC1EA,0xCCD5,0xCFDD, +0xEA91,0xEA92,0xEA93,0xEA94,0xEA95,0xEA96,0xEA97,0xEA98, +0xEA99,0xEA9A,0xEA9B,0xEA9C,0xEA9D,0xD3E7,0xC2A1,0xEA9E, +0xDAF1,0xEA9F,0xEAA0,0xCBE5,0xEB40,0xDAF2,0xEB41,0xCBE6, +0xD2FE,0xEB42,0xEB43,0xEB44,0xB8F4,0xEB45,0xEB46,0xDAF3, +0xB0AF,0xCFB6,0xEB47,0xEB48,0xD5CF,0xEB49,0xEB4A,0xEB4B, +0xEB4C,0xEB4D,0xEB4E,0xEB4F,0xEB50,0xEB51,0xEB52,0xCBED, +0xEB53,0xEB54,0xEB55,0xEB56,0xEB57,0xEB58,0xEB59,0xEB5A, +0xDAF4,0xEB5B,0xEB5C,0xE3C4,0xEB5D,0xEB5E,0xC1A5,0xEB5F, +0xEB60,0xF6BF,0xEB61,0xEB62,0xF6C0,0xF6C1,0xC4D1,0xEB63, +0xC8B8,0xD1E3,0xEB64,0xEB65,0xD0DB,0xD1C5,0xBCAF,0xB9CD, +0xEB66,0xEFF4,0xEB67,0xEB68,0xB4C6,0xD3BA,0xF6C2,0xB3FB, +0xEB69,0xEB6A,0xF6C3,0xEB6B,0xEB6C,0xB5F1,0xEB6D,0xEB6E, +0xEB6F,0xEB70,0xEB71,0xEB72,0xEB73,0xEB74,0xEB75,0xEB76, +0xF6C5,0xEB77,0xEB78,0xEB79,0xEB7A,0xEB7B,0xEB7C,0xEB7D, +0xD3EA,0xF6A7,0xD1A9,0xEB7E,0xEB80,0xEB81,0xEB82,0xF6A9, +0xEB83,0xEB84,0xEB85,0xF6A8,0xEB86,0xEB87,0xC1E3,0xC0D7, +0xEB88,0xB1A2,0xEB89,0xEB8A,0xEB8B,0xEB8C,0xCEED,0xEB8D, +0xD0E8,0xF6AB,0xEB8E,0xEB8F,0xCFF6,0xEB90,0xF6AA,0xD5F0, +0xF6AC,0xC3B9,0xEB91,0xEB92,0xEB93,0xBBF4,0xF6AE,0xF6AD, +0xEB94,0xEB95,0xEB96,0xC4DE,0xEB97,0xEB98,0xC1D8,0xEB99, +0xEB9A,0xEB9B,0xEB9C,0xEB9D,0xCBAA,0xEB9E,0xCFBC,0xEB9F, +0xEBA0,0xEC40,0xEC41,0xEC42,0xEC43,0xEC44,0xEC45,0xEC46, +0xEC47,0xEC48,0xF6AF,0xEC49,0xEC4A,0xF6B0,0xEC4B,0xEC4C, +0xF6B1,0xEC4D,0xC2B6,0xEC4E,0xEC4F,0xEC50,0xEC51,0xEC52, +0xB0D4,0xC5F9,0xEC53,0xEC54,0xEC55,0xEC56,0xF6B2,0xEC57, +0xEC58,0xEC59,0xEC5A,0xEC5B,0xEC5C,0xEC5D,0xEC5E,0xEC5F, +0xEC60,0xEC61,0xEC62,0xEC63,0xEC64,0xEC65,0xEC66,0xEC67, +0xEC68,0xEC69,0xC7E0,0xF6A6,0xEC6A,0xEC6B,0xBEB8,0xEC6C, +0xEC6D,0xBEB2,0xEC6E,0xB5E5,0xEC6F,0xEC70,0xB7C7,0xEC71, +0xBFBF,0xC3D2,0xC3E6,0xEC72,0xEC73,0xD8CC,0xEC74,0xEC75, +0xEC76,0xB8EF,0xEC77,0xEC78,0xEC79,0xEC7A,0xEC7B,0xEC7C, +0xEC7D,0xEC7E,0xEC80,0xBDF9,0xD1A5,0xEC81,0xB0D0,0xEC82, +0xEC83,0xEC84,0xEC85,0xEC86,0xF7B0,0xEC87,0xEC88,0xEC89, +0xEC8A,0xEC8B,0xEC8C,0xEC8D,0xEC8E,0xF7B1,0xEC8F,0xEC90, +0xEC91,0xEC92,0xEC93,0xD0AC,0xEC94,0xB0B0,0xEC95,0xEC96, +0xEC97,0xF7B2,0xF7B3,0xEC98,0xF7B4,0xEC99,0xEC9A,0xEC9B, +0xC7CA,0xEC9C,0xEC9D,0xEC9E,0xEC9F,0xECA0,0xED40,0xED41, +0xBECF,0xED42,0xED43,0xF7B7,0xED44,0xED45,0xED46,0xED47, +0xED48,0xED49,0xED4A,0xF7B6,0xED4B,0xB1DE,0xED4C,0xF7B5, +0xED4D,0xED4E,0xF7B8,0xED4F,0xF7B9,0xED50,0xED51,0xED52, +0xED53,0xED54,0xED55,0xED56,0xED57,0xED58,0xED59,0xED5A, +0xED5B,0xED5C,0xED5D,0xED5E,0xED5F,0xED60,0xED61,0xED62, +0xED63,0xED64,0xED65,0xED66,0xED67,0xED68,0xED69,0xED6A, +0xED6B,0xED6C,0xED6D,0xED6E,0xED6F,0xED70,0xED71,0xED72, +0xED73,0xED74,0xED75,0xED76,0xED77,0xED78,0xED79,0xED7A, +0xED7B,0xED7C,0xED7D,0xED7E,0xED80,0xED81,0xCEA4,0xC8CD, +0xED82,0xBAAB,0xE8B8,0xE8B9,0xE8BA,0xBEC2,0xED83,0xED84, +0xED85,0xED86,0xED87,0xD2F4,0xED88,0xD4CF,0xC9D8,0xED89, +0xED8A,0xED8B,0xED8C,0xED8D,0xED8E,0xED8F,0xED90,0xED91, +0xED92,0xED93,0xED94,0xED95,0xED96,0xED97,0xED98,0xED99, +0xED9A,0xED9B,0xED9C,0xED9D,0xED9E,0xED9F,0xEDA0,0xEE40, +0xEE41,0xEE42,0xEE43,0xEE44,0xEE45,0xEE46,0xEE47,0xEE48, +0xEE49,0xEE4A,0xEE4B,0xEE4C,0xEE4D,0xEE4E,0xEE4F,0xEE50, +0xEE51,0xEE52,0xEE53,0xEE54,0xEE55,0xEE56,0xEE57,0xEE58, +0xEE59,0xEE5A,0xEE5B,0xEE5C,0xEE5D,0xEE5E,0xEE5F,0xEE60, +0xEE61,0xEE62,0xEE63,0xEE64,0xEE65,0xEE66,0xEE67,0xEE68, +0xEE69,0xEE6A,0xEE6B,0xEE6C,0xEE6D,0xEE6E,0xEE6F,0xEE70, +0xEE71,0xEE72,0xEE73,0xEE74,0xEE75,0xEE76,0xEE77,0xEE78, +0xEE79,0xEE7A,0xEE7B,0xEE7C,0xEE7D,0xEE7E,0xEE80,0xEE81, +0xEE82,0xEE83,0xEE84,0xEE85,0xEE86,0xEE87,0xEE88,0xEE89, +0xEE8A,0xEE8B,0xEE8C,0xEE8D,0xEE8E,0xEE8F,0xEE90,0xEE91, +0xEE92,0xEE93,0xEE94,0xEE95,0xEE96,0xEE97,0xEE98,0xEE99, +0xEE9A,0xEE9B,0xEE9C,0xEE9D,0xEE9E,0xEE9F,0xEEA0,0xEF40, +0xEF41,0xEF42,0xEF43,0xEF44,0xEF45,0xD2B3,0xB6A5,0xC7EA, +0xF1FC,0xCFEE,0xCBB3,0xD0EB,0xE7EF,0xCDE7,0xB9CB,0xB6D9, +0xF1FD,0xB0E4,0xCBCC,0xF1FE,0xD4A4,0xC2AD,0xC1EC,0xC6C4, +0xBEB1,0xF2A1,0xBCD5,0xEF46,0xF2A2,0xF2A3,0xEF47,0xF2A4, +0xD2C3,0xC6B5,0xEF48,0xCDC7,0xF2A5,0xEF49,0xD3B1,0xBFC5, +0xCCE2,0xEF4A,0xF2A6,0xF2A7,0xD1D5,0xB6EE,0xF2A8,0xF2A9, +0xB5DF,0xF2AA,0xF2AB,0xEF4B,0xB2FC,0xF2AC,0xF2AD,0xC8A7, +0xEF4C,0xEF4D,0xEF4E,0xEF4F,0xEF50,0xEF51,0xEF52,0xEF53, +0xEF54,0xEF55,0xEF56,0xEF57,0xEF58,0xEF59,0xEF5A,0xEF5B, +0xEF5C,0xEF5D,0xEF5E,0xEF5F,0xEF60,0xEF61,0xEF62,0xEF63, +0xEF64,0xEF65,0xEF66,0xEF67,0xEF68,0xEF69,0xEF6A,0xEF6B, +0xEF6C,0xEF6D,0xEF6E,0xEF6F,0xEF70,0xEF71,0xB7E7,0xEF72, +0xEF73,0xECA9,0xECAA,0xECAB,0xEF74,0xECAC,0xEF75,0xEF76, +0xC6AE,0xECAD,0xECAE,0xEF77,0xEF78,0xEF79,0xB7C9,0xCAB3, +0xEF7A,0xEF7B,0xEF7C,0xEF7D,0xEF7E,0xEF80,0xEF81,0xE2B8, +0xF7CF,0xEF82,0xEF83,0xEF84,0xEF85,0xEF86,0xEF87,0xEF88, +0xEF89,0xEF8A,0xEF8B,0xEF8C,0xEF8D,0xEF8E,0xEF8F,0xEF90, +0xEF91,0xEF92,0xEF93,0xEF94,0xEF95,0xEF96,0xEF97,0xEF98, +0xEF99,0xEF9A,0xEF9B,0xEF9C,0xEF9D,0xEF9E,0xEF9F,0xEFA0, +0xF040,0xF041,0xF042,0xF043,0xF044,0xF7D0,0xF045,0xF046, +0xB2CD,0xF047,0xF048,0xF049,0xF04A,0xF04B,0xF04C,0xF04D, +0xF04E,0xF04F,0xF050,0xF051,0xF052,0xF053,0xF054,0xF055, +0xF056,0xF057,0xF058,0xF059,0xF05A,0xF05B,0xF05C,0xF05D, +0xF05E,0xF05F,0xF060,0xF061,0xF062,0xF063,0xF7D1,0xF064, +0xF065,0xF066,0xF067,0xF068,0xF069,0xF06A,0xF06B,0xF06C, +0xF06D,0xF06E,0xF06F,0xF070,0xF071,0xF072,0xF073,0xF074, +0xF075,0xF076,0xF077,0xF078,0xF079,0xF07A,0xF07B,0xF07C, +0xF07D,0xF07E,0xF080,0xF081,0xF082,0xF083,0xF084,0xF085, +0xF086,0xF087,0xF088,0xF089,0xF7D3,0xF7D2,0xF08A,0xF08B, +0xF08C,0xF08D,0xF08E,0xF08F,0xF090,0xF091,0xF092,0xF093, +0xF094,0xF095,0xF096,0xE2BB,0xF097,0xBCA2,0xF098,0xE2BC, +0xE2BD,0xE2BE,0xE2BF,0xE2C0,0xE2C1,0xB7B9,0xD2FB,0xBDA4, +0xCACE,0xB1A5,0xCBC7,0xF099,0xE2C2,0xB6FC,0xC8C4,0xE2C3, +0xF09A,0xF09B,0xBDC8,0xF09C,0xB1FD,0xE2C4,0xF09D,0xB6F6, +0xE2C5,0xC4D9,0xF09E,0xF09F,0xE2C6,0xCFDA,0xB9DD,0xE2C7, +0xC0A1,0xF0A0,0xE2C8,0xB2F6,0xF140,0xE2C9,0xF141,0xC1F3, +0xE2CA,0xE2CB,0xC2F8,0xE2CC,0xE2CD,0xE2CE,0xCAD7,0xD8B8, +0xD9E5,0xCFE3,0xF142,0xF143,0xF144,0xF145,0xF146,0xF147, +0xF148,0xF149,0xF14A,0xF14B,0xF14C,0xF0A5,0xF14D,0xF14E, +0xDCB0,0xF14F,0xF150,0xF151,0xF152,0xF153,0xF154,0xF155, +0xF156,0xF157,0xF158,0xF159,0xF15A,0xF15B,0xF15C,0xF15D, +0xF15E,0xF15F,0xF160,0xF161,0xF162,0xF163,0xF164,0xF165, +0xF166,0xF167,0xF168,0xF169,0xF16A,0xF16B,0xF16C,0xF16D, +0xF16E,0xF16F,0xF170,0xF171,0xF172,0xF173,0xF174,0xF175, +0xF176,0xF177,0xF178,0xF179,0xF17A,0xF17B,0xF17C,0xF17D, +0xF17E,0xF180,0xF181,0xF182,0xF183,0xF184,0xF185,0xF186, +0xF187,0xF188,0xF189,0xF18A,0xF18B,0xF18C,0xF18D,0xF18E, +0xF18F,0xF190,0xF191,0xF192,0xF193,0xF194,0xF195,0xF196, +0xF197,0xF198,0xF199,0xF19A,0xF19B,0xF19C,0xF19D,0xF19E, +0xF19F,0xF1A0,0xF240,0xF241,0xF242,0xF243,0xF244,0xF245, +0xF246,0xF247,0xF248,0xF249,0xF24A,0xF24B,0xF24C,0xF24D, +0xF24E,0xF24F,0xF250,0xF251,0xF252,0xF253,0xF254,0xF255, +0xF256,0xF257,0xF258,0xF259,0xF25A,0xF25B,0xF25C,0xF25D, +0xF25E,0xF25F,0xF260,0xF261,0xF262,0xF263,0xF264,0xF265, +0xF266,0xF267,0xF268,0xF269,0xF26A,0xF26B,0xF26C,0xF26D, +0xF26E,0xF26F,0xF270,0xF271,0xF272,0xF273,0xF274,0xF275, +0xF276,0xF277,0xF278,0xF279,0xF27A,0xF27B,0xF27C,0xF27D, +0xF27E,0xF280,0xF281,0xF282,0xF283,0xF284,0xF285,0xF286, +0xF287,0xF288,0xF289,0xF28A,0xF28B,0xF28C,0xF28D,0xF28E, +0xF28F,0xF290,0xF291,0xF292,0xF293,0xF294,0xF295,0xF296, +0xF297,0xF298,0xF299,0xF29A,0xF29B,0xF29C,0xF29D,0xF29E, +0xF29F,0xF2A0,0xF340,0xF341,0xF342,0xF343,0xF344,0xF345, +0xF346,0xF347,0xF348,0xF349,0xF34A,0xF34B,0xF34C,0xF34D, +0xF34E,0xF34F,0xF350,0xF351,0xC2ED,0xD4A6,0xCDD4,0xD1B1, +0xB3DB,0xC7FD,0xF352,0xB2B5,0xC2BF,0xE6E0,0xCABB,0xE6E1, +0xE6E2,0xBED4,0xE6E3,0xD7A4,0xCDD5,0xE6E5,0xBCDD,0xE6E4, +0xE6E6,0xE6E7,0xC2EE,0xF353,0xBDBE,0xE6E8,0xC2E6,0xBAA7, +0xE6E9,0xF354,0xE6EA,0xB3D2,0xD1E9,0xF355,0xF356,0xBFA5, +0xE6EB,0xC6EF,0xE6EC,0xE6ED,0xF357,0xF358,0xE6EE,0xC6AD, +0xE6EF,0xF359,0xC9A7,0xE6F0,0xE6F1,0xE6F2,0xE5B9,0xE6F3, +0xE6F4,0xC2E2,0xE6F5,0xE6F6,0xD6E8,0xE6F7,0xF35A,0xE6F8, +0xB9C7,0xF35B,0xF35C,0xF35D,0xF35E,0xF35F,0xF360,0xF361, +0xF7BB,0xF7BA,0xF362,0xF363,0xF364,0xF365,0xF7BE,0xF7BC, +0xBAA1,0xF366,0xF7BF,0xF367,0xF7C0,0xF368,0xF369,0xF36A, +0xF7C2,0xF7C1,0xF7C4,0xF36B,0xF36C,0xF7C3,0xF36D,0xF36E, +0xF36F,0xF370,0xF371,0xF7C5,0xF7C6,0xF372,0xF373,0xF374, +0xF375,0xF7C7,0xF376,0xCBE8,0xF377,0xF378,0xF379,0xF37A, +0xB8DF,0xF37B,0xF37C,0xF37D,0xF37E,0xF380,0xF381,0xF7D4, +0xF382,0xF7D5,0xF383,0xF384,0xF385,0xF386,0xF7D6,0xF387, +0xF388,0xF389,0xF38A,0xF7D8,0xF38B,0xF7DA,0xF38C,0xF7D7, +0xF38D,0xF38E,0xF38F,0xF390,0xF391,0xF392,0xF393,0xF394, +0xF395,0xF7DB,0xF396,0xF7D9,0xF397,0xF398,0xF399,0xF39A, +0xF39B,0xF39C,0xF39D,0xD7D7,0xF39E,0xF39F,0xF3A0,0xF440, +0xF7DC,0xF441,0xF442,0xF443,0xF444,0xF445,0xF446,0xF7DD, +0xF447,0xF448,0xF449,0xF7DE,0xF44A,0xF44B,0xF44C,0xF44D, +0xF44E,0xF44F,0xF450,0xF451,0xF452,0xF453,0xF454,0xF7DF, +0xF455,0xF456,0xF457,0xF7E0,0xF458,0xF459,0xF45A,0xF45B, +0xF45C,0xF45D,0xF45E,0xF45F,0xF460,0xF461,0xF462,0xDBCB, +0xF463,0xF464,0xD8AA,0xF465,0xF466,0xF467,0xF468,0xF469, +0xF46A,0xF46B,0xF46C,0xE5F7,0xB9ED,0xF46D,0xF46E,0xF46F, +0xF470,0xBFFD,0xBBEA,0xF7C9,0xC6C7,0xF7C8,0xF471,0xF7CA, +0xF7CC,0xF7CB,0xF472,0xF473,0xF474,0xF7CD,0xF475,0xCEBA, +0xF476,0xF7CE,0xF477,0xF478,0xC4A7,0xF479,0xF47A,0xF47B, +0xF47C,0xF47D,0xF47E,0xF480,0xF481,0xF482,0xF483,0xF484, +0xF485,0xF486,0xF487,0xF488,0xF489,0xF48A,0xF48B,0xF48C, +0xF48D,0xF48E,0xF48F,0xF490,0xF491,0xF492,0xF493,0xF494, +0xF495,0xF496,0xF497,0xF498,0xF499,0xF49A,0xF49B,0xF49C, +0xF49D,0xF49E,0xF49F,0xF4A0,0xF540,0xF541,0xF542,0xF543, +0xF544,0xF545,0xF546,0xF547,0xF548,0xF549,0xF54A,0xF54B, +0xF54C,0xF54D,0xF54E,0xF54F,0xF550,0xF551,0xF552,0xF553, +0xF554,0xF555,0xF556,0xF557,0xF558,0xF559,0xF55A,0xF55B, +0xF55C,0xF55D,0xF55E,0xF55F,0xF560,0xF561,0xF562,0xF563, +0xF564,0xF565,0xF566,0xF567,0xF568,0xF569,0xF56A,0xF56B, +0xF56C,0xF56D,0xF56E,0xF56F,0xF570,0xF571,0xF572,0xF573, +0xF574,0xF575,0xF576,0xF577,0xF578,0xF579,0xF57A,0xF57B, +0xF57C,0xF57D,0xF57E,0xF580,0xF581,0xF582,0xF583,0xF584, +0xF585,0xF586,0xF587,0xF588,0xF589,0xF58A,0xF58B,0xF58C, +0xF58D,0xF58E,0xF58F,0xF590,0xF591,0xF592,0xF593,0xF594, +0xF595,0xF596,0xF597,0xF598,0xF599,0xF59A,0xF59B,0xF59C, +0xF59D,0xF59E,0xF59F,0xF5A0,0xF640,0xF641,0xF642,0xF643, +0xF644,0xF645,0xF646,0xF647,0xF648,0xF649,0xF64A,0xF64B, +0xF64C,0xF64D,0xF64E,0xF64F,0xF650,0xF651,0xF652,0xF653, +0xF654,0xF655,0xF656,0xF657,0xF658,0xF659,0xF65A,0xF65B, +0xF65C,0xF65D,0xF65E,0xF65F,0xF660,0xF661,0xF662,0xF663, +0xF664,0xF665,0xF666,0xF667,0xF668,0xF669,0xF66A,0xF66B, +0xF66C,0xF66D,0xF66E,0xF66F,0xF670,0xF671,0xF672,0xF673, +0xF674,0xF675,0xF676,0xF677,0xF678,0xF679,0xF67A,0xF67B, +0xF67C,0xF67D,0xF67E,0xF680,0xF681,0xF682,0xF683,0xF684, +0xF685,0xF686,0xF687,0xF688,0xF689,0xF68A,0xF68B,0xF68C, +0xF68D,0xF68E,0xF68F,0xF690,0xF691,0xF692,0xF693,0xF694, +0xF695,0xF696,0xF697,0xF698,0xF699,0xF69A,0xF69B,0xF69C, +0xF69D,0xF69E,0xF69F,0xF6A0,0xF740,0xF741,0xF742,0xF743, +0xF744,0xF745,0xF746,0xF747,0xF748,0xF749,0xF74A,0xF74B, +0xF74C,0xF74D,0xF74E,0xF74F,0xF750,0xF751,0xF752,0xF753, +0xF754,0xF755,0xF756,0xF757,0xF758,0xF759,0xF75A,0xF75B, +0xF75C,0xF75D,0xF75E,0xF75F,0xF760,0xF761,0xF762,0xF763, +0xF764,0xF765,0xF766,0xF767,0xF768,0xF769,0xF76A,0xF76B, +0xF76C,0xF76D,0xF76E,0xF76F,0xF770,0xF771,0xF772,0xF773, +0xF774,0xF775,0xF776,0xF777,0xF778,0xF779,0xF77A,0xF77B, +0xF77C,0xF77D,0xF77E,0xF780,0xD3E3,0xF781,0xF782,0xF6CF, +0xF783,0xC2B3,0xF6D0,0xF784,0xF785,0xF6D1,0xF6D2,0xF6D3, +0xF6D4,0xF786,0xF787,0xF6D6,0xF788,0xB1AB,0xF6D7,0xF789, +0xF6D8,0xF6D9,0xF6DA,0xF78A,0xF6DB,0xF6DC,0xF78B,0xF78C, +0xF78D,0xF78E,0xF6DD,0xF6DE,0xCFCA,0xF78F,0xF6DF,0xF6E0, +0xF6E1,0xF6E2,0xF6E3,0xF6E4,0xC0F0,0xF6E5,0xF6E6,0xF6E7, +0xF6E8,0xF6E9,0xF790,0xF6EA,0xF791,0xF6EB,0xF6EC,0xF792, +0xF6ED,0xF6EE,0xF6EF,0xF6F0,0xF6F1,0xF6F2,0xF6F3,0xF6F4, +0xBEA8,0xF793,0xF6F5,0xF6F6,0xF6F7,0xF6F8,0xF794,0xF795, +0xF796,0xF797,0xF798,0xC8FA,0xF6F9,0xF6FA,0xF6FB,0xF6FC, +0xF799,0xF79A,0xF6FD,0xF6FE,0xF7A1,0xF7A2,0xF7A3,0xF7A4, +0xF7A5,0xF79B,0xF79C,0xF7A6,0xF7A7,0xF7A8,0xB1EE,0xF7A9, +0xF7AA,0xF7AB,0xF79D,0xF79E,0xF7AC,0xF7AD,0xC1DB,0xF7AE, +0xF79F,0xF7A0,0xF7AF,0xF840,0xF841,0xF842,0xF843,0xF844, +0xF845,0xF846,0xF847,0xF848,0xF849,0xF84A,0xF84B,0xF84C, +0xF84D,0xF84E,0xF84F,0xF850,0xF851,0xF852,0xF853,0xF854, +0xF855,0xF856,0xF857,0xF858,0xF859,0xF85A,0xF85B,0xF85C, +0xF85D,0xF85E,0xF85F,0xF860,0xF861,0xF862,0xF863,0xF864, +0xF865,0xF866,0xF867,0xF868,0xF869,0xF86A,0xF86B,0xF86C, +0xF86D,0xF86E,0xF86F,0xF870,0xF871,0xF872,0xF873,0xF874, +0xF875,0xF876,0xF877,0xF878,0xF879,0xF87A,0xF87B,0xF87C, +0xF87D,0xF87E,0xF880,0xF881,0xF882,0xF883,0xF884,0xF885, +0xF886,0xF887,0xF888,0xF889,0xF88A,0xF88B,0xF88C,0xF88D, +0xF88E,0xF88F,0xF890,0xF891,0xF892,0xF893,0xF894,0xF895, +0xF896,0xF897,0xF898,0xF899,0xF89A,0xF89B,0xF89C,0xF89D, +0xF89E,0xF89F,0xF8A0,0xF940,0xF941,0xF942,0xF943,0xF944, +0xF945,0xF946,0xF947,0xF948,0xF949,0xF94A,0xF94B,0xF94C, +0xF94D,0xF94E,0xF94F,0xF950,0xF951,0xF952,0xF953,0xF954, +0xF955,0xF956,0xF957,0xF958,0xF959,0xF95A,0xF95B,0xF95C, +0xF95D,0xF95E,0xF95F,0xF960,0xF961,0xF962,0xF963,0xF964, +0xF965,0xF966,0xF967,0xF968,0xF969,0xF96A,0xF96B,0xF96C, +0xF96D,0xF96E,0xF96F,0xF970,0xF971,0xF972,0xF973,0xF974, +0xF975,0xF976,0xF977,0xF978,0xF979,0xF97A,0xF97B,0xF97C, +0xF97D,0xF97E,0xF980,0xF981,0xF982,0xF983,0xF984,0xF985, +0xF986,0xF987,0xF988,0xF989,0xF98A,0xF98B,0xF98C,0xF98D, +0xF98E,0xF98F,0xF990,0xF991,0xF992,0xF993,0xF994,0xF995, +0xF996,0xF997,0xF998,0xF999,0xF99A,0xF99B,0xF99C,0xF99D, +0xF99E,0xF99F,0xF9A0,0xFA40,0xFA41,0xFA42,0xFA43,0xFA44, +0xFA45,0xFA46,0xFA47,0xFA48,0xFA49,0xFA4A,0xFA4B,0xFA4C, +0xFA4D,0xFA4E,0xFA4F,0xFA50,0xFA51,0xFA52,0xFA53,0xFA54, +0xFA55,0xFA56,0xFA57,0xFA58,0xFA59,0xFA5A,0xFA5B,0xFA5C, +0xFA5D,0xFA5E,0xFA5F,0xFA60,0xFA61,0xFA62,0xFA63,0xFA64, +0xFA65,0xFA66,0xFA67,0xFA68,0xFA69,0xFA6A,0xFA6B,0xFA6C, +0xFA6D,0xFA6E,0xFA6F,0xFA70,0xFA71,0xFA72,0xFA73,0xFA74, +0xFA75,0xFA76,0xFA77,0xFA78,0xFA79,0xFA7A,0xFA7B,0xFA7C, +0xFA7D,0xFA7E,0xFA80,0xFA81,0xFA82,0xFA83,0xFA84,0xFA85, +0xFA86,0xFA87,0xFA88,0xFA89,0xFA8A,0xFA8B,0xFA8C,0xFA8D, +0xFA8E,0xFA8F,0xFA90,0xFA91,0xFA92,0xFA93,0xFA94,0xFA95, +0xFA96,0xFA97,0xFA98,0xFA99,0xFA9A,0xFA9B,0xFA9C,0xFA9D, +0xFA9E,0xFA9F,0xFAA0,0xFB40,0xFB41,0xFB42,0xFB43,0xFB44, +0xFB45,0xFB46,0xFB47,0xFB48,0xFB49,0xFB4A,0xFB4B,0xFB4C, +0xFB4D,0xFB4E,0xFB4F,0xFB50,0xFB51,0xFB52,0xFB53,0xFB54, +0xFB55,0xFB56,0xFB57,0xFB58,0xFB59,0xFB5A,0xFB5B,0xC4F1, +0xF0AF,0xBCA6,0xF0B0,0xC3F9,0xFB5C,0xC5B8,0xD1BB,0xFB5D, +0xF0B1,0xF0B2,0xF0B3,0xF0B4,0xF0B5,0xD1BC,0xFB5E,0xD1EC, +0xFB5F,0xF0B7,0xF0B6,0xD4A7,0xFB60,0xCDD2,0xF0B8,0xF0BA, +0xF0B9,0xF0BB,0xF0BC,0xFB61,0xFB62,0xB8EB,0xF0BD,0xBAE8, +0xFB63,0xF0BE,0xF0BF,0xBEE9,0xF0C0,0xB6EC,0xF0C1,0xF0C2, +0xF0C3,0xF0C4,0xC8B5,0xF0C5,0xF0C6,0xFB64,0xF0C7,0xC5F4, +0xFB65,0xF0C8,0xFB66,0xFB67,0xFB68,0xF0C9,0xFB69,0xF0CA, +0xF7BD,0xFB6A,0xF0CB,0xF0CC,0xF0CD,0xFB6B,0xF0CE,0xFB6C, +0xFB6D,0xFB6E,0xFB6F,0xF0CF,0xBAD7,0xFB70,0xF0D0,0xF0D1, +0xF0D2,0xF0D3,0xF0D4,0xF0D5,0xF0D6,0xF0D8,0xFB71,0xFB72, +0xD3A5,0xF0D7,0xFB73,0xF0D9,0xFB74,0xFB75,0xFB76,0xFB77, +0xFB78,0xFB79,0xFB7A,0xFB7B,0xFB7C,0xFB7D,0xF5BA,0xC2B9, +0xFB7E,0xFB80,0xF7E4,0xFB81,0xFB82,0xFB83,0xFB84,0xF7E5, +0xF7E6,0xFB85,0xFB86,0xF7E7,0xFB87,0xFB88,0xFB89,0xFB8A, +0xFB8B,0xFB8C,0xF7E8,0xC2B4,0xFB8D,0xFB8E,0xFB8F,0xFB90, +0xFB91,0xFB92,0xFB93,0xFB94,0xFB95,0xF7EA,0xFB96,0xF7EB, +0xFB97,0xFB98,0xFB99,0xFB9A,0xFB9B,0xFB9C,0xC2F3,0xFB9D, +0xFB9E,0xFB9F,0xFBA0,0xFC40,0xFC41,0xFC42,0xFC43,0xFC44, +0xFC45,0xFC46,0xFC47,0xFC48,0xF4F0,0xFC49,0xFC4A,0xFC4B, +0xF4EF,0xFC4C,0xFC4D,0xC2E9,0xFC4E,0xF7E1,0xF7E2,0xFC4F, +0xFC50,0xFC51,0xFC52,0xFC53,0xBBC6,0xFC54,0xFC55,0xFC56, +0xFC57,0xD9E4,0xFC58,0xFC59,0xFC5A,0xCAF2,0xC0E8,0xF0A4, +0xFC5B,0xBADA,0xFC5C,0xFC5D,0xC7AD,0xFC5E,0xFC5F,0xFC60, +0xC4AC,0xFC61,0xFC62,0xF7EC,0xF7ED,0xF7EE,0xFC63,0xF7F0, +0xF7EF,0xFC64,0xF7F1,0xFC65,0xFC66,0xF7F4,0xFC67,0xF7F3, +0xFC68,0xF7F2,0xF7F5,0xFC69,0xFC6A,0xFC6B,0xFC6C,0xF7F6, +0xFC6D,0xFC6E,0xFC6F,0xFC70,0xFC71,0xFC72,0xFC73,0xFC74, +0xFC75,0xEDE9,0xFC76,0xEDEA,0xEDEB,0xFC77,0xF6BC,0xFC78, +0xFC79,0xFC7A,0xFC7B,0xFC7C,0xFC7D,0xFC7E,0xFC80,0xFC81, +0xFC82,0xFC83,0xFC84,0xF6BD,0xFC85,0xF6BE,0xB6A6,0xFC86, +0xD8BE,0xFC87,0xFC88,0xB9C4,0xFC89,0xFC8A,0xFC8B,0xD8BB, +0xFC8C,0xDCB1,0xFC8D,0xFC8E,0xFC8F,0xFC90,0xFC91,0xFC92, +0xCAF3,0xFC93,0xF7F7,0xFC94,0xFC95,0xFC96,0xFC97,0xFC98, +0xFC99,0xFC9A,0xFC9B,0xFC9C,0xF7F8,0xFC9D,0xFC9E,0xF7F9, +0xFC9F,0xFCA0,0xFD40,0xFD41,0xFD42,0xFD43,0xFD44,0xF7FB, +0xFD45,0xF7FA,0xFD46,0xB1C7,0xFD47,0xF7FC,0xF7FD,0xFD48, +0xFD49,0xFD4A,0xFD4B,0xFD4C,0xF7FE,0xFD4D,0xFD4E,0xFD4F, +0xFD50,0xFD51,0xFD52,0xFD53,0xFD54,0xFD55,0xFD56,0xFD57, +0xC6EB,0xECB4,0xFD58,0xFD59,0xFD5A,0xFD5B,0xFD5C,0xFD5D, +0xFD5E,0xFD5F,0xFD60,0xFD61,0xFD62,0xFD63,0xFD64,0xFD65, +0xFD66,0xFD67,0xFD68,0xFD69,0xFD6A,0xFD6B,0xFD6C,0xFD6D, +0xFD6E,0xFD6F,0xFD70,0xFD71,0xFD72,0xFD73,0xFD74,0xFD75, +0xFD76,0xFD77,0xFD78,0xFD79,0xFD7A,0xFD7B,0xFD7C,0xFD7D, +0xFD7E,0xFD80,0xFD81,0xFD82,0xFD83,0xFD84,0xFD85,0xB3DD, +0xF6B3,0xFD86,0xFD87,0xF6B4,0xC1E4,0xF6B5,0xF6B6,0xF6B7, +0xF6B8,0xF6B9,0xF6BA,0xC8A3,0xF6BB,0xFD88,0xFD89,0xFD8A, +0xFD8B,0xFD8C,0xFD8D,0xFD8E,0xFD8F,0xFD90,0xFD91,0xFD92, +0xFD93,0xC1FA,0xB9A8,0xEDE8,0xFD94,0xFD95,0xFD96,0xB9EA, +0xD9DF,0xFD97,0xFD98,0xFD99,0xFD9A,0xFD9B}; + +/* page 7 0xF92C-0xFA29 */ +static uint16 tab_uni_gbk7[]={ +0xFD9C, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xFD9D, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xFD9E, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xFD9F, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xFDA0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xFE40,0xFE41,0xFE42,0xFE43, 0,0xFE44, 0,0xFE45, +0xFE46, 0, 0, 0,0xFE47, 0, 0, 0, + 0, 0, 0,0xFE48,0xFE49,0xFE4A, 0,0xFE4B, +0xFE4C, 0, 0,0xFE4D,0xFE4E,0xFE4F}; + +/* page 8 0xFE30-0xFFE5 */ +static uint16 tab_uni_gbk8[]={ +0xA955,0xA6F2, 0,0xA6F4,0xA6F5,0xA6E0,0xA6E1,0xA6F0, +0xA6F1,0xA6E2,0xA6E3,0xA6EE,0xA6EF,0xA6E6,0xA6E7,0xA6E4, +0xA6E5,0xA6E8,0xA6E9,0xA6EA,0xA6EB, 0, 0, 0, + 0,0xA968,0xA969,0xA96A,0xA96B,0xA96C,0xA96D,0xA96E, +0xA96F,0xA970,0xA971, 0,0xA972,0xA973,0xA974,0xA975, + 0,0xA976,0xA977,0xA978,0xA979,0xA97A,0xA97B,0xA97C, +0xA97D,0xA97E,0xA980,0xA981,0xA982,0xA983,0xA984, 0, +0xA985,0xA986,0xA987,0xA988, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xA3A1,0xA3A2,0xA3A3,0xA1E7,0xA3A5,0xA3A6,0xA3A7, +0xA3A8,0xA3A9,0xA3AA,0xA3AB,0xA3AC,0xA3AD,0xA3AE,0xA3AF, +0xA3B0,0xA3B1,0xA3B2,0xA3B3,0xA3B4,0xA3B5,0xA3B6,0xA3B7, +0xA3B8,0xA3B9,0xA3BA,0xA3BB,0xA3BC,0xA3BD,0xA3BE,0xA3BF, +0xA3C0,0xA3C1,0xA3C2,0xA3C3,0xA3C4,0xA3C5,0xA3C6,0xA3C7, +0xA3C8,0xA3C9,0xA3CA,0xA3CB,0xA3CC,0xA3CD,0xA3CE,0xA3CF, +0xA3D0,0xA3D1,0xA3D2,0xA3D3,0xA3D4,0xA3D5,0xA3D6,0xA3D7, +0xA3D8,0xA3D9,0xA3DA,0xA3DB,0xA3DC,0xA3DD,0xA3DE,0xA3DF, +0xA3E0,0xA3E1,0xA3E2,0xA3E3,0xA3E4,0xA3E5,0xA3E6,0xA3E7, +0xA3E8,0xA3E9,0xA3EA,0xA3EB,0xA3EC,0xA3ED,0xA3EE,0xA3EF, +0xA3F0,0xA3F1,0xA3F2,0xA3F3,0xA3F4,0xA3F5,0xA3F6,0xA3F7, +0xA3F8,0xA3F9,0xA3FA,0xA3FB,0xA3FC,0xA3FD,0xA1AB, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xA1E9,0xA1EA,0xA956,0xA3FE,0xA957,0xA3A4}; + +static int func_uni_gbk_onechar(int code){ + if ((code>=0x00A4)&&(code<=0x0451)) + return(tab_uni_gbk0[code-0x00A4]); + if ((code>=0x2010)&&(code<=0x2312)) + return(tab_uni_gbk1[code-0x2010]); + if ((code>=0x2460)&&(code<=0x2642)) + return(tab_uni_gbk2[code-0x2460]); + if ((code>=0x3000)&&(code<=0x3129)) + return(tab_uni_gbk3[code-0x3000]); + if ((code>=0x3220)&&(code<=0x32A3)) + return(tab_uni_gbk4[code-0x3220]); + if ((code>=0x338E)&&(code<=0x33D5)) + return(tab_uni_gbk5[code-0x338E]); + if ((code>=0x4E00)&&(code<=0x9FA5)) + return(tab_uni_gbk6[code-0x4E00]); + if ((code>=0xF92C)&&(code<=0xFA29)) + return(tab_uni_gbk7[code-0xF92C]); + if ((code>=0xFE30)&&(code<=0xFFE5)) + return(tab_uni_gbk8[code-0xFE30]); + return(0); +} + +int +my_wc_mb_gbk(CHARSET_INFO *cs __attribute__((unused)), + my_wc_t wc, uchar *s, uchar *e) +{ + int code; + + if (wc<0x80) + { + s[0]=wc; + return 1; + } + + if (!(code=func_uni_gbk_onechar(wc))) + return MY_CS_ILUNI; + + if (s+2>e) + return MY_CS_TOOSMALL; + + s[0]=code>>8; + s[1]=code&0xFF; + return 2; +} + +int +my_mb_wc_gbk(CHARSET_INFO *cs __attribute__((unused)), + my_wc_t *pwc, const uchar *s, const uchar *e) +{ + int hi; + + hi=s[0]; + + if (hi<0x80) + { + pwc[0]=hi; + return 1; + } + + if (s+2>e) + return MY_CS_TOOFEW(0); + + if (!(pwc[0]=func_gbk_uni_onechar( (hi<<8) + s[1]))) + return MY_CS_ILSEQ; + + return 2; + +} + #endif diff --git a/strings/ctype-sjis.c b/strings/ctype-sjis.c index 0d99ed452cf..e8c3890abc9 100644 --- a/strings/ctype-sjis.c +++ b/strings/ctype-sjis.c @@ -313,4 +313,4150 @@ my_bool my_like_range_sjis(CHARSET_INFO *cs __attribute__((unused)), return 0; } +/* page 0 0x00A1-0x00DF */ +static uint16 tab_sjis_uni0[]={ +0xFF61,0xFF62,0xFF63,0xFF64,0xFF65,0xFF66,0xFF67,0xFF68, +0xFF69,0xFF6A,0xFF6B,0xFF6C,0xFF6D,0xFF6E,0xFF6F,0xFF70, +0xFF71,0xFF72,0xFF73,0xFF74,0xFF75,0xFF76,0xFF77,0xFF78, +0xFF79,0xFF7A,0xFF7B,0xFF7C,0xFF7D,0xFF7E,0xFF7F,0xFF80, +0xFF81,0xFF82,0xFF83,0xFF84,0xFF85,0xFF86,0xFF87,0xFF88, +0xFF89,0xFF8A,0xFF8B,0xFF8C,0xFF8D,0xFF8E,0xFF8F,0xFF90, +0xFF91,0xFF92,0xFF93,0xFF94,0xFF95,0xFF96,0xFF97,0xFF98, +0xFF99,0xFF9A,0xFF9B,0xFF9C,0xFF9D,0xFF9E,0xFF9F}; + +/* page 1 0x8140-0x84BE */ +static uint16 tab_sjis_uni1[]={ +0x3000,0x3001,0x3002,0xFF0C,0xFF0E,0x30FB,0xFF1A,0xFF1B, +0xFF1F,0xFF01,0x309B,0x309C,0x00B4,0xFF40,0x00A8,0xFF3E, +0xFFE3,0xFF3F,0x30FD,0x30FE,0x309D,0x309E,0x3003,0x4EDD, +0x3005,0x3006,0x3007,0x30FC,0x2015,0x2010,0xFF0F,0x005C, +0x301C,0x2016,0xFF5C,0x2026,0x2025,0x2018,0x2019,0x201C, +0x201D,0xFF08,0xFF09,0x3014,0x3015,0xFF3B,0xFF3D,0xFF5B, +0xFF5D,0x3008,0x3009,0x300A,0x300B,0x300C,0x300D,0x300E, +0x300F,0x3010,0x3011,0xFF0B,0x2212,0x00B1,0x00D7, 0, +0x00F7,0xFF1D,0x2260,0xFF1C,0xFF1E,0x2266,0x2267,0x221E, +0x2234,0x2642,0x2640,0x00B0,0x2032,0x2033,0x2103,0xFFE5, +0xFF04,0x00A2,0x00A3,0xFF05,0xFF03,0xFF06,0xFF0A,0xFF20, +0x00A7,0x2606,0x2605,0x25CB,0x25CF,0x25CE,0x25C7,0x25C6, +0x25A1,0x25A0,0x25B3,0x25B2,0x25BD,0x25BC,0x203B,0x3012, +0x2192,0x2190,0x2191,0x2193,0x3013, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x2208,0x220B,0x2286,0x2287,0x2282,0x2283,0x222A,0x2229, + 0, 0, 0, 0, 0, 0, 0, 0, +0x2227,0x2228,0x00AC,0x21D2,0x21D4,0x2200,0x2203, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x2220,0x22A5,0x2312,0x2202,0x2207,0x2261, +0x2252,0x226A,0x226B,0x221A,0x223D,0x221D,0x2235,0x222B, +0x222C, 0, 0, 0, 0, 0, 0, 0, +0x212B,0x2030,0x266F,0x266D,0x266A,0x2020,0x2021,0x00B6, + 0, 0, 0, 0,0x25EF, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xFF10, +0xFF11,0xFF12,0xFF13,0xFF14,0xFF15,0xFF16,0xFF17,0xFF18, +0xFF19, 0, 0, 0, 0, 0, 0, 0, +0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27,0xFF28, +0xFF29,0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F,0xFF30, +0xFF31,0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37,0xFF38, +0xFF39,0xFF3A, 0, 0, 0, 0, 0, 0, + 0,0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47, +0xFF48,0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F, +0xFF50,0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,0xFF56,0xFF57, +0xFF58,0xFF59,0xFF5A, 0, 0, 0, 0,0x3041, +0x3042,0x3043,0x3044,0x3045,0x3046,0x3047,0x3048,0x3049, +0x304A,0x304B,0x304C,0x304D,0x304E,0x304F,0x3050,0x3051, +0x3052,0x3053,0x3054,0x3055,0x3056,0x3057,0x3058,0x3059, +0x305A,0x305B,0x305C,0x305D,0x305E,0x305F,0x3060,0x3061, +0x3062,0x3063,0x3064,0x3065,0x3066,0x3067,0x3068,0x3069, +0x306A,0x306B,0x306C,0x306D,0x306E,0x306F,0x3070,0x3071, +0x3072,0x3073,0x3074,0x3075,0x3076,0x3077,0x3078,0x3079, +0x307A,0x307B,0x307C,0x307D,0x307E,0x307F,0x3080,0x3081, +0x3082,0x3083,0x3084,0x3085,0x3086,0x3087,0x3088,0x3089, +0x308A,0x308B,0x308C,0x308D,0x308E,0x308F,0x3090,0x3091, +0x3092,0x3093, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x30A1,0x30A2,0x30A3,0x30A4,0x30A5,0x30A6,0x30A7,0x30A8, +0x30A9,0x30AA,0x30AB,0x30AC,0x30AD,0x30AE,0x30AF,0x30B0, +0x30B1,0x30B2,0x30B3,0x30B4,0x30B5,0x30B6,0x30B7,0x30B8, +0x30B9,0x30BA,0x30BB,0x30BC,0x30BD,0x30BE,0x30BF,0x30C0, +0x30C1,0x30C2,0x30C3,0x30C4,0x30C5,0x30C6,0x30C7,0x30C8, +0x30C9,0x30CA,0x30CB,0x30CC,0x30CD,0x30CE,0x30CF,0x30D0, +0x30D1,0x30D2,0x30D3,0x30D4,0x30D5,0x30D6,0x30D7,0x30D8, +0x30D9,0x30DA,0x30DB,0x30DC,0x30DD,0x30DE,0x30DF, 0, +0x30E0,0x30E1,0x30E2,0x30E3,0x30E4,0x30E5,0x30E6,0x30E7, +0x30E8,0x30E9,0x30EA,0x30EB,0x30EC,0x30ED,0x30EE,0x30EF, +0x30F0,0x30F1,0x30F2,0x30F3,0x30F4,0x30F5,0x30F6, 0, + 0, 0, 0, 0, 0, 0, 0,0x0391, +0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399, +0x039A,0x039B,0x039C,0x039D,0x039E,0x039F,0x03A0,0x03A1, +0x03A3,0x03A4,0x03A5,0x03A6,0x03A7,0x03A8,0x03A9, 0, + 0, 0, 0, 0, 0, 0, 0,0x03B1, +0x03B2,0x03B3,0x03B4,0x03B5,0x03B6,0x03B7,0x03B8,0x03B9, +0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF,0x03C0,0x03C1, +0x03C3,0x03C4,0x03C5,0x03C6,0x03C7,0x03C8,0x03C9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0401,0x0416, +0x0417,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E, +0x041F,0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426, +0x0427,0x0428,0x0429,0x042A,0x042B,0x042C,0x042D,0x042E, +0x042F, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0451,0x0436, +0x0437,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D, 0, +0x043E,0x043F,0x0440,0x0441,0x0442,0x0443,0x0444,0x0445, +0x0446,0x0447,0x0448,0x0449,0x044A,0x044B,0x044C,0x044D, +0x044E,0x044F, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x2500, +0x2502,0x250C,0x2510,0x2518,0x2514,0x251C,0x252C,0x2524, +0x2534,0x253C,0x2501,0x2503,0x250F,0x2513,0x251B,0x2517, +0x2523,0x2533,0x252B,0x253B,0x254B,0x2520,0x252F,0x2528, +0x2537,0x253F,0x251D,0x2530,0x2525,0x2538,0x2542}; + +/* page 2 0x889F-0x9FFC */ +static uint16 tab_sjis_uni2[]={ +0x4E9C,0x5516,0x5A03,0x963F,0x54C0,0x611B,0x6328,0x59F6, +0x9022,0x8475,0x831C,0x7A50,0x60AA,0x63E1,0x6E25,0x65ED, +0x8466,0x82A6,0x9BF5,0x6893,0x5727,0x65A1,0x6271,0x5B9B, +0x59D0,0x867B,0x98F4,0x7D62,0x7DBE,0x9B8E,0x6216,0x7C9F, +0x88B7,0x5B89,0x5EB5,0x6309,0x6697,0x6848,0x95C7,0x978D, +0x674F,0x4EE5,0x4F0A,0x4F4D,0x4F9D,0x5049,0x56F2,0x5937, +0x59D4,0x5A01,0x5C09,0x60DF,0x610F,0x6170,0x6613,0x6905, +0x70BA,0x754F,0x7570,0x79FB,0x7DAD,0x7DEF,0x80C3,0x840E, +0x8863,0x8B02,0x9055,0x907A,0x533B,0x4E95,0x4EA5,0x57DF, +0x80B2,0x90C1,0x78EF,0x4E00,0x58F1,0x6EA2,0x9038,0x7A32, +0x8328,0x828B,0x9C2F,0x5141,0x5370,0x54BD,0x54E1,0x56E0, +0x59FB,0x5F15,0x98F2,0x6DEB,0x80E4,0x852D, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x9662,0x9670,0x96A0,0x97FB,0x540B,0x53F3,0x5B87, +0x70CF,0x7FBD,0x8FC2,0x96E8,0x536F,0x9D5C,0x7ABA,0x4E11, +0x7893,0x81FC,0x6E26,0x5618,0x5504,0x6B1D,0x851A,0x9C3B, +0x59E5,0x53A9,0x6D66,0x74DC,0x958F,0x5642,0x4E91,0x904B, +0x96F2,0x834F,0x990C,0x53E1,0x55B6,0x5B30,0x5F71,0x6620, +0x66F3,0x6804,0x6C38,0x6CF3,0x6D29,0x745B,0x76C8,0x7A4E, +0x9834,0x82F1,0x885B,0x8A60,0x92ED,0x6DB2,0x75AB,0x76CA, +0x99C5,0x60A6,0x8B01,0x8D8A,0x95B2,0x698E,0x53AD,0x5186, + 0,0x5712,0x5830,0x5944,0x5BB4,0x5EF6,0x6028,0x63A9, +0x63F4,0x6CBF,0x6F14,0x708E,0x7114,0x7159,0x71D5,0x733F, +0x7E01,0x8276,0x82D1,0x8597,0x9060,0x925B,0x9D1B,0x5869, +0x65BC,0x6C5A,0x7525,0x51F9,0x592E,0x5965,0x5F80,0x5FDC, +0x62BC,0x65FA,0x6A2A,0x6B27,0x6BB4,0x738B,0x7FC1,0x8956, +0x9D2C,0x9D0E,0x9EC4,0x5CA1,0x6C96,0x837B,0x5104,0x5C4B, +0x61B6,0x81C6,0x6876,0x7261,0x4E59,0x4FFA,0x5378,0x6069, +0x6E29,0x7A4F,0x97F3,0x4E0B,0x5316,0x4EEE,0x4F55,0x4F3D, +0x4FA1,0x4F73,0x52A0,0x53EF,0x5609,0x590F,0x5AC1,0x5BB6, +0x5BE1,0x79D1,0x6687,0x679C,0x67B6,0x6B4C,0x6CB3,0x706B, +0x73C2,0x798D,0x79BE,0x7A3C,0x7B87,0x82B1,0x82DB,0x8304, +0x8377,0x83EF,0x83D3,0x8766,0x8AB2,0x5629,0x8CA8,0x8FE6, +0x904E,0x971E,0x868A,0x4FC4,0x5CE8,0x6211,0x7259,0x753B, +0x81E5,0x82BD,0x86FE,0x8CC0,0x96C5,0x9913,0x99D5,0x4ECB, +0x4F1A,0x89E3,0x56DE,0x584A,0x58CA,0x5EFB,0x5FEB,0x602A, +0x6094,0x6062,0x61D0,0x6212,0x62D0,0x6539, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x9B41,0x6666,0x68B0,0x6D77,0x7070,0x754C,0x7686, +0x7D75,0x82A5,0x87F9,0x958B,0x968E,0x8C9D,0x51F1,0x52BE, +0x5916,0x54B3,0x5BB3,0x5D16,0x6168,0x6982,0x6DAF,0x788D, +0x84CB,0x8857,0x8A72,0x93A7,0x9AB8,0x6D6C,0x99A8,0x86D9, +0x57A3,0x67FF,0x86CE,0x920E,0x5283,0x5687,0x5404,0x5ED3, +0x62E1,0x64B9,0x683C,0x6838,0x6BBB,0x7372,0x78BA,0x7A6B, +0x899A,0x89D2,0x8D6B,0x8F03,0x90ED,0x95A3,0x9694,0x9769, +0x5B66,0x5CB3,0x697D,0x984D,0x984E,0x639B,0x7B20,0x6A2B, + 0,0x6A7F,0x68B6,0x9C0D,0x6F5F,0x5272,0x559D,0x6070, +0x62EC,0x6D3B,0x6E07,0x6ED1,0x845B,0x8910,0x8F44,0x4E14, +0x9C39,0x53F6,0x691B,0x6A3A,0x9784,0x682A,0x515C,0x7AC3, +0x84B2,0x91DC,0x938C,0x565B,0x9D28,0x6822,0x8305,0x8431, +0x7CA5,0x5208,0x82C5,0x74E6,0x4E7E,0x4F83,0x51A0,0x5BD2, +0x520A,0x52D8,0x52E7,0x5DFB,0x559A,0x582A,0x59E6,0x5B8C, +0x5B98,0x5BDB,0x5E72,0x5E79,0x60A3,0x611F,0x6163,0x61BE, +0x63DB,0x6562,0x67D1,0x6853,0x68FA,0x6B3E,0x6B53,0x6C57, +0x6F22,0x6F97,0x6F45,0x74B0,0x7518,0x76E3,0x770B,0x7AFF, +0x7BA1,0x7C21,0x7DE9,0x7F36,0x7FF0,0x809D,0x8266,0x839E, +0x89B3,0x8ACC,0x8CAB,0x9084,0x9451,0x9593,0x9591,0x95A2, +0x9665,0x97D3,0x9928,0x8218,0x4E38,0x542B,0x5CB8,0x5DCC, +0x73A9,0x764C,0x773C,0x5CA9,0x7FEB,0x8D0B,0x96C1,0x9811, +0x9854,0x9858,0x4F01,0x4F0E,0x5371,0x559C,0x5668,0x57FA, +0x5947,0x5B09,0x5BC4,0x5C90,0x5E0C,0x5E7E,0x5FCC,0x63EE, +0x673A,0x65D7,0x65E2,0x671F,0x68CB,0x68C4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6A5F,0x5E30,0x6BC5,0x6C17,0x6C7D,0x757F,0x7948, +0x5B63,0x7A00,0x7D00,0x5FBD,0x898F,0x8A18,0x8CB4,0x8D77, +0x8ECC,0x8F1D,0x98E2,0x9A0E,0x9B3C,0x4E80,0x507D,0x5100, +0x5993,0x5B9C,0x622F,0x6280,0x64EC,0x6B3A,0x72A0,0x7591, +0x7947,0x7FA9,0x87FB,0x8ABC,0x8B70,0x63AC,0x83CA,0x97A0, +0x5409,0x5403,0x55AB,0x6854,0x6A58,0x8A70,0x7827,0x6775, +0x9ECD,0x5374,0x5BA2,0x811A,0x8650,0x9006,0x4E18,0x4E45, +0x4EC7,0x4F11,0x53CA,0x5438,0x5BAE,0x5F13,0x6025,0x6551, + 0,0x673D,0x6C42,0x6C72,0x6CE3,0x7078,0x7403,0x7A76, +0x7AAE,0x7B08,0x7D1A,0x7CFE,0x7D66,0x65E7,0x725B,0x53BB, +0x5C45,0x5DE8,0x62D2,0x62E0,0x6319,0x6E20,0x865A,0x8A31, +0x8DDD,0x92F8,0x6F01,0x79A6,0x9B5A,0x4EA8,0x4EAB,0x4EAC, +0x4F9B,0x4FA0,0x50D1,0x5147,0x7AF6,0x5171,0x51F6,0x5354, +0x5321,0x537F,0x53EB,0x55AC,0x5883,0x5CE1,0x5F37,0x5F4A, +0x602F,0x6050,0x606D,0x631F,0x6559,0x6A4B,0x6CC1,0x72C2, +0x72ED,0x77EF,0x80F8,0x8105,0x8208,0x854E,0x90F7,0x93E1, +0x97FF,0x9957,0x9A5A,0x4EF0,0x51DD,0x5C2D,0x6681,0x696D, +0x5C40,0x66F2,0x6975,0x7389,0x6850,0x7C81,0x50C5,0x52E4, +0x5747,0x5DFE,0x9326,0x65A4,0x6B23,0x6B3D,0x7434,0x7981, +0x79BD,0x7B4B,0x7DCA,0x82B9,0x83CC,0x887F,0x895F,0x8B39, +0x8FD1,0x91D1,0x541F,0x9280,0x4E5D,0x5036,0x53E5,0x533A, +0x72D7,0x7396,0x77E9,0x82E6,0x8EAF,0x99C6,0x99C8,0x99D2, +0x5177,0x611A,0x865E,0x55B0,0x7A7A,0x5076,0x5BD3,0x9047, +0x9685,0x4E32,0x6ADB,0x91E7,0x5C51,0x5C48, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6398,0x7A9F,0x6C93,0x9774,0x8F61,0x7AAA,0x718A, +0x9688,0x7C82,0x6817,0x7E70,0x6851,0x936C,0x52F2,0x541B, +0x85AB,0x8A13,0x7FA4,0x8ECD,0x90E1,0x5366,0x8888,0x7941, +0x4FC2,0x50BE,0x5211,0x5144,0x5553,0x572D,0x73EA,0x578B, +0x5951,0x5F62,0x5F84,0x6075,0x6176,0x6167,0x61A9,0x63B2, +0x643A,0x656C,0x666F,0x6842,0x6E13,0x7566,0x7A3D,0x7CFB, +0x7D4C,0x7D99,0x7E4B,0x7F6B,0x830E,0x834A,0x86CD,0x8A08, +0x8A63,0x8B66,0x8EFD,0x981A,0x9D8F,0x82B8,0x8FCE,0x9BE8, + 0,0x5287,0x621F,0x6483,0x6FC0,0x9699,0x6841,0x5091, +0x6B20,0x6C7A,0x6F54,0x7A74,0x7D50,0x8840,0x8A23,0x6708, +0x4EF6,0x5039,0x5026,0x5065,0x517C,0x5238,0x5263,0x55A7, +0x570F,0x5805,0x5ACC,0x5EFA,0x61B2,0x61F8,0x62F3,0x6372, +0x691C,0x6A29,0x727D,0x72AC,0x732E,0x7814,0x786F,0x7D79, +0x770C,0x80A9,0x898B,0x8B19,0x8CE2,0x8ED2,0x9063,0x9375, +0x967A,0x9855,0x9A13,0x9E78,0x5143,0x539F,0x53B3,0x5E7B, +0x5F26,0x6E1B,0x6E90,0x7384,0x73FE,0x7D43,0x8237,0x8A00, +0x8AFA,0x9650,0x4E4E,0x500B,0x53E4,0x547C,0x56FA,0x59D1, +0x5B64,0x5DF1,0x5EAB,0x5F27,0x6238,0x6545,0x67AF,0x6E56, +0x72D0,0x7CCA,0x88B4,0x80A1,0x80E1,0x83F0,0x864E,0x8A87, +0x8DE8,0x9237,0x96C7,0x9867,0x9F13,0x4E94,0x4E92,0x4F0D, +0x5348,0x5449,0x543E,0x5A2F,0x5F8C,0x5FA1,0x609F,0x68A7, +0x6A8E,0x745A,0x7881,0x8A9E,0x8AA4,0x8B77,0x9190,0x4E5E, +0x9BC9,0x4EA4,0x4F7C,0x4FAF,0x5019,0x5016,0x5149,0x516C, +0x529F,0x52B9,0x52FE,0x539A,0x53E3,0x5411, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x540E,0x5589,0x5751,0x57A2,0x597D,0x5B54,0x5B5D, +0x5B8F,0x5DE5,0x5DE7,0x5DF7,0x5E78,0x5E83,0x5E9A,0x5EB7, +0x5F18,0x6052,0x614C,0x6297,0x62D8,0x63A7,0x653B,0x6602, +0x6643,0x66F4,0x676D,0x6821,0x6897,0x69CB,0x6C5F,0x6D2A, +0x6D69,0x6E2F,0x6E9D,0x7532,0x7687,0x786C,0x7A3F,0x7CE0, +0x7D05,0x7D18,0x7D5E,0x7DB1,0x8015,0x8003,0x80AF,0x80B1, +0x8154,0x818F,0x822A,0x8352,0x884C,0x8861,0x8B1B,0x8CA2, +0x8CFC,0x90CA,0x9175,0x9271,0x783F,0x92FC,0x95A4,0x964D, + 0,0x9805,0x9999,0x9AD8,0x9D3B,0x525B,0x52AB,0x53F7, +0x5408,0x58D5,0x62F7,0x6FE0,0x8C6A,0x8F5F,0x9EB9,0x514B, +0x523B,0x544A,0x56FD,0x7A40,0x9177,0x9D60,0x9ED2,0x7344, +0x6F09,0x8170,0x7511,0x5FFD,0x60DA,0x9AA8,0x72DB,0x8FBC, +0x6B64,0x9803,0x4ECA,0x56F0,0x5764,0x58BE,0x5A5A,0x6068, +0x61C7,0x660F,0x6606,0x6839,0x68B1,0x6DF7,0x75D5,0x7D3A, +0x826E,0x9B42,0x4E9B,0x4F50,0x53C9,0x5506,0x5D6F,0x5DE6, +0x5DEE,0x67FB,0x6C99,0x7473,0x7802,0x8A50,0x9396,0x88DF, +0x5750,0x5EA7,0x632B,0x50B5,0x50AC,0x518D,0x6700,0x54C9, +0x585E,0x59BB,0x5BB0,0x5F69,0x624D,0x63A1,0x683D,0x6B73, +0x6E08,0x707D,0x91C7,0x7280,0x7815,0x7826,0x796D,0x658E, +0x7D30,0x83DC,0x88C1,0x8F09,0x969B,0x5264,0x5728,0x6750, +0x7F6A,0x8CA1,0x51B4,0x5742,0x962A,0x583A,0x698A,0x80B4, +0x54B2,0x5D0E,0x57FC,0x7895,0x9DFA,0x4F5C,0x524A,0x548B, +0x643E,0x6628,0x6714,0x67F5,0x7A84,0x7B56,0x7D22,0x932F, +0x685C,0x9BAD,0x7B39,0x5319,0x518A,0x5237, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5BDF,0x62F6,0x64AE,0x64E6,0x672D,0x6BBA,0x85A9, +0x96D1,0x7690,0x9BD6,0x634C,0x9306,0x9BAB,0x76BF,0x6652, +0x4E09,0x5098,0x53C2,0x5C71,0x60E8,0x6492,0x6563,0x685F, +0x71E6,0x73CA,0x7523,0x7B97,0x7E82,0x8695,0x8B83,0x8CDB, +0x9178,0x9910,0x65AC,0x66AB,0x6B8B,0x4ED5,0x4ED4,0x4F3A, +0x4F7F,0x523A,0x53F8,0x53F2,0x55E3,0x56DB,0x58EB,0x59CB, +0x59C9,0x59FF,0x5B50,0x5C4D,0x5E02,0x5E2B,0x5FD7,0x601D, +0x6307,0x652F,0x5B5C,0x65AF,0x65BD,0x65E8,0x679D,0x6B62, + 0,0x6B7B,0x6C0F,0x7345,0x7949,0x79C1,0x7CF8,0x7D19, +0x7D2B,0x80A2,0x8102,0x81F3,0x8996,0x8A5E,0x8A69,0x8A66, +0x8A8C,0x8AEE,0x8CC7,0x8CDC,0x96CC,0x98FC,0x6B6F,0x4E8B, +0x4F3C,0x4F8D,0x5150,0x5B57,0x5BFA,0x6148,0x6301,0x6642, +0x6B21,0x6ECB,0x6CBB,0x723E,0x74BD,0x75D4,0x78C1,0x793A, +0x800C,0x8033,0x81EA,0x8494,0x8F9E,0x6C50,0x9E7F,0x5F0F, +0x8B58,0x9D2B,0x7AFA,0x8EF8,0x5B8D,0x96EB,0x4E03,0x53F1, +0x57F7,0x5931,0x5AC9,0x5BA4,0x6089,0x6E7F,0x6F06,0x75BE, +0x8CEA,0x5B9F,0x8500,0x7BE0,0x5072,0x67F4,0x829D,0x5C61, +0x854A,0x7E1E,0x820E,0x5199,0x5C04,0x6368,0x8D66,0x659C, +0x716E,0x793E,0x7D17,0x8005,0x8B1D,0x8ECA,0x906E,0x86C7, +0x90AA,0x501F,0x52FA,0x5C3A,0x6753,0x707C,0x7235,0x914C, +0x91C8,0x932B,0x82E5,0x5BC2,0x5F31,0x60F9,0x4E3B,0x53D6, +0x5B88,0x624B,0x6731,0x6B8A,0x72E9,0x73E0,0x7A2E,0x816B, +0x8DA3,0x9152,0x9996,0x5112,0x53D7,0x546A,0x5BFF,0x6388, +0x6A39,0x7DAC,0x9700,0x56DA,0x53CE,0x5468, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5B97,0x5C31,0x5DDE,0x4FEE,0x6101,0x62FE,0x6D32, +0x79C0,0x79CB,0x7D42,0x7E4D,0x7FD2,0x81ED,0x821F,0x8490, +0x8846,0x8972,0x8B90,0x8E74,0x8F2F,0x9031,0x914B,0x916C, +0x96C6,0x919C,0x4EC0,0x4F4F,0x5145,0x5341,0x5F93,0x620E, +0x67D4,0x6C41,0x6E0B,0x7363,0x7E26,0x91CD,0x9283,0x53D4, +0x5919,0x5BBF,0x6DD1,0x795D,0x7E2E,0x7C9B,0x587E,0x719F, +0x51FA,0x8853,0x8FF0,0x4FCA,0x5CFB,0x6625,0x77AC,0x7AE3, +0x821C,0x99FF,0x51C6,0x5FAA,0x65EC,0x696F,0x6B89,0x6DF3, + 0,0x6E96,0x6F64,0x76FE,0x7D14,0x5DE1,0x9075,0x9187, +0x9806,0x51E6,0x521D,0x6240,0x6691,0x66D9,0x6E1A,0x5EB6, +0x7DD2,0x7F72,0x66F8,0x85AF,0x85F7,0x8AF8,0x52A9,0x53D9, +0x5973,0x5E8F,0x5F90,0x6055,0x92E4,0x9664,0x50B7,0x511F, +0x52DD,0x5320,0x5347,0x53EC,0x54E8,0x5546,0x5531,0x5617, +0x5968,0x59BE,0x5A3C,0x5BB5,0x5C06,0x5C0F,0x5C11,0x5C1A, +0x5E84,0x5E8A,0x5EE0,0x5F70,0x627F,0x6284,0x62DB,0x638C, +0x6377,0x6607,0x660C,0x662D,0x6676,0x677E,0x68A2,0x6A1F, +0x6A35,0x6CBC,0x6D88,0x6E09,0x6E58,0x713C,0x7126,0x7167, +0x75C7,0x7701,0x785D,0x7901,0x7965,0x79F0,0x7AE0,0x7B11, +0x7CA7,0x7D39,0x8096,0x83D6,0x848B,0x8549,0x885D,0x88F3, +0x8A1F,0x8A3C,0x8A54,0x8A73,0x8C61,0x8CDE,0x91A4,0x9266, +0x937E,0x9418,0x969C,0x9798,0x4E0A,0x4E08,0x4E1E,0x4E57, +0x5197,0x5270,0x57CE,0x5834,0x58CC,0x5B22,0x5E38,0x60C5, +0x64FE,0x6761,0x6756,0x6D44,0x72B6,0x7573,0x7A63,0x84B8, +0x8B72,0x91B8,0x9320,0x5631,0x57F4,0x98FE, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x62ED,0x690D,0x6B96,0x71ED,0x7E54,0x8077,0x8272, +0x89E6,0x98DF,0x8755,0x8FB1,0x5C3B,0x4F38,0x4FE1,0x4FB5, +0x5507,0x5A20,0x5BDD,0x5BE9,0x5FC3,0x614E,0x632F,0x65B0, +0x664B,0x68EE,0x699B,0x6D78,0x6DF1,0x7533,0x75B9,0x771F, +0x795E,0x79E6,0x7D33,0x81E3,0x82AF,0x85AA,0x89AA,0x8A3A, +0x8EAB,0x8F9B,0x9032,0x91DD,0x9707,0x4EBA,0x4EC1,0x5203, +0x5875,0x58EC,0x5C0B,0x751A,0x5C3D,0x814E,0x8A0A,0x8FC5, +0x9663,0x976D,0x7B25,0x8ACF,0x9808,0x9162,0x56F3,0x53A8, + 0,0x9017,0x5439,0x5782,0x5E25,0x63A8,0x6C34,0x708A, +0x7761,0x7C8B,0x7FE0,0x8870,0x9042,0x9154,0x9310,0x9318, +0x968F,0x745E,0x9AC4,0x5D07,0x5D69,0x6570,0x67A2,0x8DA8, +0x96DB,0x636E,0x6749,0x6919,0x83C5,0x9817,0x96C0,0x88FE, +0x6F84,0x647A,0x5BF8,0x4E16,0x702C,0x755D,0x662F,0x51C4, +0x5236,0x52E2,0x59D3,0x5F81,0x6027,0x6210,0x653F,0x6574, +0x661F,0x6674,0x68F2,0x6816,0x6B63,0x6E05,0x7272,0x751F, +0x76DB,0x7CBE,0x8056,0x58F0,0x88FD,0x897F,0x8AA0,0x8A93, +0x8ACB,0x901D,0x9192,0x9752,0x9759,0x6589,0x7A0E,0x8106, +0x96BB,0x5E2D,0x60DC,0x621A,0x65A5,0x6614,0x6790,0x77F3, +0x7A4D,0x7C4D,0x7E3E,0x810A,0x8CAC,0x8D64,0x8DE1,0x8E5F, +0x78A9,0x5207,0x62D9,0x63A5,0x6442,0x6298,0x8A2D,0x7A83, +0x7BC0,0x8AAC,0x96EA,0x7D76,0x820C,0x8749,0x4ED9,0x5148, +0x5343,0x5360,0x5BA3,0x5C02,0x5C16,0x5DDD,0x6226,0x6247, +0x64B0,0x6813,0x6834,0x6CC9,0x6D45,0x6D17,0x67D3,0x6F5C, +0x714E,0x717D,0x65CB,0x7A7F,0x7BAD,0x7DDA, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x7E4A,0x7FA8,0x817A,0x821B,0x8239,0x85A6,0x8A6E, +0x8CCE,0x8DF5,0x9078,0x9077,0x92AD,0x9291,0x9583,0x9BAE, +0x524D,0x5584,0x6F38,0x7136,0x5168,0x7985,0x7E55,0x81B3, +0x7CCE,0x564C,0x5851,0x5CA8,0x63AA,0x66FE,0x66FD,0x695A, +0x72D9,0x758F,0x758E,0x790E,0x7956,0x79DF,0x7C97,0x7D20, +0x7D44,0x8607,0x8A34,0x963B,0x9061,0x9F20,0x50E7,0x5275, +0x53CC,0x53E2,0x5009,0x55AA,0x58EE,0x594F,0x723D,0x5B8B, +0x5C64,0x531D,0x60E3,0x60F3,0x635C,0x6383,0x633F,0x63BB, + 0,0x64CD,0x65E9,0x66F9,0x5DE3,0x69CD,0x69FD,0x6F15, +0x71E5,0x4E89,0x75E9,0x76F8,0x7A93,0x7CDF,0x7DCF,0x7D9C, +0x8061,0x8349,0x8358,0x846C,0x84BC,0x85FB,0x88C5,0x8D70, +0x9001,0x906D,0x9397,0x971C,0x9A12,0x50CF,0x5897,0x618E, +0x81D3,0x8535,0x8D08,0x9020,0x4FC3,0x5074,0x5247,0x5373, +0x606F,0x6349,0x675F,0x6E2C,0x8DB3,0x901F,0x4FD7,0x5C5E, +0x8CCA,0x65CF,0x7D9A,0x5352,0x8896,0x5176,0x63C3,0x5B58, +0x5B6B,0x5C0A,0x640D,0x6751,0x905C,0x4ED6,0x591A,0x592A, +0x6C70,0x8A51,0x553E,0x5815,0x59A5,0x60F0,0x6253,0x67C1, +0x8235,0x6955,0x9640,0x99C4,0x9A28,0x4F53,0x5806,0x5BFE, +0x8010,0x5CB1,0x5E2F,0x5F85,0x6020,0x614B,0x6234,0x66FF, +0x6CF0,0x6EDE,0x80CE,0x817F,0x82D4,0x888B,0x8CB8,0x9000, +0x902E,0x968A,0x9EDB,0x9BDB,0x4EE3,0x53F0,0x5927,0x7B2C, +0x918D,0x984C,0x9DF9,0x6EDD,0x7027,0x5353,0x5544,0x5B85, +0x6258,0x629E,0x62D3,0x6CA2,0x6FEF,0x7422,0x8A17,0x9438, +0x6FC1,0x8AFE,0x8338,0x51E7,0x86F8,0x53EA, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x53E9,0x4F46,0x9054,0x8FB0,0x596A,0x8131,0x5DFD, +0x7AEA,0x8FBF,0x68DA,0x8C37,0x72F8,0x9C48,0x6A3D,0x8AB0, +0x4E39,0x5358,0x5606,0x5766,0x62C5,0x63A2,0x65E6,0x6B4E, +0x6DE1,0x6E5B,0x70AD,0x77ED,0x7AEF,0x7BAA,0x7DBB,0x803D, +0x80C6,0x86CB,0x8A95,0x935B,0x56E3,0x58C7,0x5F3E,0x65AD, +0x6696,0x6A80,0x6BB5,0x7537,0x8AC7,0x5024,0x77E5,0x5730, +0x5F1B,0x6065,0x667A,0x6C60,0x75F4,0x7A1A,0x7F6E,0x81F4, +0x8718,0x9045,0x99B3,0x7BC9,0x755C,0x7AF9,0x7B51,0x84C4, + 0,0x9010,0x79E9,0x7A92,0x8336,0x5AE1,0x7740,0x4E2D, +0x4EF2,0x5B99,0x5FE0,0x62BD,0x663C,0x67F1,0x6CE8,0x866B, +0x8877,0x8A3B,0x914E,0x92F3,0x99D0,0x6A17,0x7026,0x732A, +0x82E7,0x8457,0x8CAF,0x4E01,0x5146,0x51CB,0x558B,0x5BF5, +0x5E16,0x5E33,0x5E81,0x5F14,0x5F35,0x5F6B,0x5FB4,0x61F2, +0x6311,0x66A2,0x671D,0x6F6E,0x7252,0x753A,0x773A,0x8074, +0x8139,0x8178,0x8776,0x8ABF,0x8ADC,0x8D85,0x8DF3,0x929A, +0x9577,0x9802,0x9CE5,0x52C5,0x6357,0x76F4,0x6715,0x6C88, +0x73CD,0x8CC3,0x93AE,0x9673,0x6D25,0x589C,0x690E,0x69CC, +0x8FFD,0x939A,0x75DB,0x901A,0x585A,0x6802,0x63B4,0x69FB, +0x4F43,0x6F2C,0x67D8,0x8FBB,0x8526,0x7DB4,0x9354,0x693F, +0x6F70,0x576A,0x58F7,0x5B2C,0x7D2C,0x722A,0x540A,0x91E3, +0x9DB4,0x4EAD,0x4F4E,0x505C,0x5075,0x5243,0x8C9E,0x5448, +0x5824,0x5B9A,0x5E1D,0x5E95,0x5EAD,0x5EF7,0x5F1F,0x608C, +0x62B5,0x633A,0x63D0,0x68AF,0x6C40,0x7887,0x798E,0x7A0B, +0x7DE0,0x8247,0x8A02,0x8AE6,0x8E44,0x9013, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x90B8,0x912D,0x91D8,0x9F0E,0x6CE5,0x6458,0x64E2, +0x6575,0x6EF4,0x7684,0x7B1B,0x9069,0x93D1,0x6EBA,0x54F2, +0x5FB9,0x64A4,0x8F4D,0x8FED,0x9244,0x5178,0x586B,0x5929, +0x5C55,0x5E97,0x6DFB,0x7E8F,0x751C,0x8CBC,0x8EE2,0x985B, +0x70B9,0x4F1D,0x6BBF,0x6FB1,0x7530,0x96FB,0x514E,0x5410, +0x5835,0x5857,0x59AC,0x5C60,0x5F92,0x6597,0x675C,0x6E21, +0x767B,0x83DF,0x8CED,0x9014,0x90FD,0x934D,0x7825,0x783A, +0x52AA,0x5EA6,0x571F,0x5974,0x6012,0x5012,0x515A,0x51AC, + 0,0x51CD,0x5200,0x5510,0x5854,0x5858,0x5957,0x5B95, +0x5CF6,0x5D8B,0x60BC,0x6295,0x642D,0x6771,0x6843,0x68BC, +0x68DF,0x76D7,0x6DD8,0x6E6F,0x6D9B,0x706F,0x71C8,0x5F53, +0x75D8,0x7977,0x7B49,0x7B54,0x7B52,0x7CD6,0x7D71,0x5230, +0x8463,0x8569,0x85E4,0x8A0E,0x8B04,0x8C46,0x8E0F,0x9003, +0x900F,0x9419,0x9676,0x982D,0x9A30,0x95D8,0x50CD,0x52D5, +0x540C,0x5802,0x5C0E,0x61A7,0x649E,0x6D1E,0x77B3,0x7AE5, +0x80F4,0x8404,0x9053,0x9285,0x5CE0,0x9D07,0x533F,0x5F97, +0x5FB3,0x6D9C,0x7279,0x7763,0x79BF,0x7BE4,0x6BD2,0x72EC, +0x8AAD,0x6803,0x6A61,0x51F8,0x7A81,0x6934,0x5C4A,0x9CF6, +0x82EB,0x5BC5,0x9149,0x701E,0x5678,0x5C6F,0x60C7,0x6566, +0x6C8C,0x8C5A,0x9041,0x9813,0x5451,0x66C7,0x920D,0x5948, +0x90A3,0x5185,0x4E4D,0x51EA,0x8599,0x8B0E,0x7058,0x637A, +0x934B,0x6962,0x99B4,0x7E04,0x7577,0x5357,0x6960,0x8EDF, +0x96E3,0x6C5D,0x4E8C,0x5C3C,0x5F10,0x8FE9,0x5302,0x8CD1, +0x8089,0x8679,0x5EFF,0x65E5,0x4E73,0x5165, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5982,0x5C3F,0x97EE,0x4EFB,0x598A,0x5FCD,0x8A8D, +0x6FE1,0x79B0,0x7962,0x5BE7,0x8471,0x732B,0x71B1,0x5E74, +0x5FF5,0x637B,0x649A,0x71C3,0x7C98,0x4E43,0x5EFC,0x4E4B, +0x57DC,0x56A2,0x60A9,0x6FC3,0x7D0D,0x80FD,0x8133,0x81BF, +0x8FB2,0x8997,0x86A4,0x5DF4,0x628A,0x64AD,0x8987,0x6777, +0x6CE2,0x6D3E,0x7436,0x7834,0x5A46,0x7F75,0x82AD,0x99AC, +0x4FF3,0x5EC3,0x62DD,0x6392,0x6557,0x676F,0x76C3,0x724C, +0x80CC,0x80BA,0x8F29,0x914D,0x500D,0x57F9,0x5A92,0x6885, + 0,0x6973,0x7164,0x72FD,0x8CB7,0x58F2,0x8CE0,0x966A, +0x9019,0x877F,0x79E4,0x77E7,0x8429,0x4F2F,0x5265,0x535A, +0x62CD,0x67CF,0x6CCA,0x767D,0x7B94,0x7C95,0x8236,0x8584, +0x8FEB,0x66DD,0x6F20,0x7206,0x7E1B,0x83AB,0x99C1,0x9EA6, +0x51FD,0x7BB1,0x7872,0x7BB8,0x8087,0x7B48,0x6AE8,0x5E61, +0x808C,0x7551,0x7560,0x516B,0x9262,0x6E8C,0x767A,0x9197, +0x9AEA,0x4F10,0x7F70,0x629C,0x7B4F,0x95A5,0x9CE9,0x567A, +0x5859,0x86E4,0x96BC,0x4F34,0x5224,0x534A,0x53CD,0x53DB, +0x5E06,0x642C,0x6591,0x677F,0x6C3E,0x6C4E,0x7248,0x72AF, +0x73ED,0x7554,0x7E41,0x822C,0x85E9,0x8CA9,0x7BC4,0x91C6, +0x7169,0x9812,0x98EF,0x633D,0x6669,0x756A,0x76E4,0x78D0, +0x8543,0x86EE,0x532A,0x5351,0x5426,0x5983,0x5E87,0x5F7C, +0x60B2,0x6249,0x6279,0x62AB,0x6590,0x6BD4,0x6CCC,0x75B2, +0x76AE,0x7891,0x79D8,0x7DCB,0x7F77,0x80A5,0x88AB,0x8AB9, +0x8CBB,0x907F,0x975E,0x98DB,0x6A0B,0x7C38,0x5099,0x5C3E, +0x5FAE,0x6787,0x6BD8,0x7435,0x7709,0x7F8E, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x9F3B,0x67CA,0x7A17,0x5339,0x758B,0x9AED,0x5F66, +0x819D,0x83F1,0x8098,0x5F3C,0x5FC5,0x7562,0x7B46,0x903C, +0x6867,0x59EB,0x5A9B,0x7D10,0x767E,0x8B2C,0x4FF5,0x5F6A, +0x6A19,0x6C37,0x6F02,0x74E2,0x7968,0x8868,0x8A55,0x8C79, +0x5EDF,0x63CF,0x75C5,0x79D2,0x82D7,0x9328,0x92F2,0x849C, +0x86ED,0x9C2D,0x54C1,0x5F6C,0x658C,0x6D5C,0x7015,0x8CA7, +0x8CD3,0x983B,0x654F,0x74F6,0x4E0D,0x4ED8,0x57E0,0x592B, +0x5A66,0x5BCC,0x51A8,0x5E03,0x5E9C,0x6016,0x6276,0x6577, + 0,0x65A7,0x666E,0x6D6E,0x7236,0x7B26,0x8150,0x819A, +0x8299,0x8B5C,0x8CA0,0x8CE6,0x8D74,0x961C,0x9644,0x4FAE, +0x64AB,0x6B66,0x821E,0x8461,0x856A,0x90E8,0x5C01,0x6953, +0x98A8,0x847A,0x8557,0x4F0F,0x526F,0x5FA9,0x5E45,0x670D, +0x798F,0x8179,0x8907,0x8986,0x6DF5,0x5F17,0x6255,0x6CB8, +0x4ECF,0x7269,0x9B92,0x5206,0x543B,0x5674,0x58B3,0x61A4, +0x626E,0x711A,0x596E,0x7C89,0x7CDE,0x7D1B,0x96F0,0x6587, +0x805E,0x4E19,0x4F75,0x5175,0x5840,0x5E63,0x5E73,0x5F0A, +0x67C4,0x4E26,0x853D,0x9589,0x965B,0x7C73,0x9801,0x50FB, +0x58C1,0x7656,0x78A7,0x5225,0x77A5,0x8511,0x7B86,0x504F, +0x5909,0x7247,0x7BC7,0x7DE8,0x8FBA,0x8FD4,0x904D,0x4FBF, +0x52C9,0x5A29,0x5F01,0x97AD,0x4FDD,0x8217,0x92EA,0x5703, +0x6355,0x6B69,0x752B,0x88DC,0x8F14,0x7A42,0x52DF,0x5893, +0x6155,0x620A,0x66AE,0x6BCD,0x7C3F,0x83E9,0x5023,0x4FF8, +0x5305,0x5446,0x5831,0x5949,0x5B9D,0x5CF0,0x5CEF,0x5D29, +0x5E96,0x62B1,0x6367,0x653E,0x65B9,0x670B, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6CD5,0x6CE1,0x70F9,0x7832,0x7E2B,0x80DE,0x82B3, +0x840C,0x84EC,0x8702,0x8912,0x8A2A,0x8C4A,0x90A6,0x92D2, +0x98FD,0x9CF3,0x9D6C,0x4E4F,0x4EA1,0x508D,0x5256,0x574A, +0x59A8,0x5E3D,0x5FD8,0x5FD9,0x623F,0x66B4,0x671B,0x67D0, +0x68D2,0x5192,0x7D21,0x80AA,0x81A8,0x8B00,0x8C8C,0x8CBF, +0x927E,0x9632,0x5420,0x982C,0x5317,0x50D5,0x535C,0x58A8, +0x64B2,0x6734,0x7267,0x7766,0x7A46,0x91E6,0x52C3,0x6CA1, +0x6B86,0x5800,0x5E4C,0x5954,0x672C,0x7FFB,0x51E1,0x76C6, + 0,0x6469,0x78E8,0x9B54,0x9EBB,0x57CB,0x59B9,0x6627, +0x679A,0x6BCE,0x54E9,0x69D9,0x5E55,0x819C,0x6795,0x9BAA, +0x67FE,0x9C52,0x685D,0x4EA6,0x4FE3,0x53C8,0x62B9,0x672B, +0x6CAB,0x8FC4,0x4FAD,0x7E6D,0x9EBF,0x4E07,0x6162,0x6E80, +0x6F2B,0x8513,0x5473,0x672A,0x9B45,0x5DF3,0x7B95,0x5CAC, +0x5BC6,0x871C,0x6E4A,0x84D1,0x7A14,0x8108,0x5999,0x7C8D, +0x6C11,0x7720,0x52D9,0x5922,0x7121,0x725F,0x77DB,0x9727, +0x9D61,0x690B,0x5A7F,0x5A18,0x51A5,0x540D,0x547D,0x660E, +0x76DF,0x8FF7,0x9298,0x9CF4,0x59EA,0x725D,0x6EC5,0x514D, +0x68C9,0x7DBF,0x7DEC,0x9762,0x9EBA,0x6478,0x6A21,0x8302, +0x5984,0x5B5F,0x6BDB,0x731B,0x76F2,0x7DB2,0x8017,0x8499, +0x5132,0x6728,0x9ED9,0x76EE,0x6762,0x52FF,0x9905,0x5C24, +0x623B,0x7C7E,0x8CB0,0x554F,0x60B6,0x7D0B,0x9580,0x5301, +0x4E5F,0x51B6,0x591C,0x723A,0x8036,0x91CE,0x5F25,0x77E2, +0x5384,0x5F79,0x7D04,0x85AC,0x8A33,0x8E8D,0x9756,0x67F3, +0x85AE,0x9453,0x6109,0x6108,0x6CB9,0x7652, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x8AED,0x8F38,0x552F,0x4F51,0x512A,0x52C7,0x53CB, +0x5BA5,0x5E7D,0x60A0,0x6182,0x63D6,0x6709,0x67DA,0x6E67, +0x6D8C,0x7336,0x7337,0x7531,0x7950,0x88D5,0x8A98,0x904A, +0x9091,0x90F5,0x96C4,0x878D,0x5915,0x4E88,0x4F59,0x4E0E, +0x8A89,0x8F3F,0x9810,0x50AD,0x5E7C,0x5996,0x5BB9,0x5EB8, +0x63DA,0x63FA,0x64C1,0x66DC,0x694A,0x69D8,0x6D0B,0x6EB6, +0x7194,0x7528,0x7AAF,0x7F8A,0x8000,0x8449,0x84C9,0x8981, +0x8B21,0x8E0A,0x9065,0x967D,0x990A,0x617E,0x6291,0x6B32, + 0,0x6C83,0x6D74,0x7FCC,0x7FFC,0x6DC0,0x7F85,0x87BA, +0x88F8,0x6765,0x83B1,0x983C,0x96F7,0x6D1B,0x7D61,0x843D, +0x916A,0x4E71,0x5375,0x5D50,0x6B04,0x6FEB,0x85CD,0x862D, +0x89A7,0x5229,0x540F,0x5C65,0x674E,0x68A8,0x7406,0x7483, +0x75E2,0x88CF,0x88E1,0x91CC,0x96E2,0x9678,0x5F8B,0x7387, +0x7ACB,0x844E,0x63A0,0x7565,0x5289,0x6D41,0x6E9C,0x7409, +0x7559,0x786B,0x7C92,0x9686,0x7ADC,0x9F8D,0x4FB6,0x616E, +0x65C5,0x865C,0x4E86,0x4EAE,0x50DA,0x4E21,0x51CC,0x5BEE, +0x6599,0x6881,0x6DBC,0x731F,0x7642,0x77AD,0x7A1C,0x7CE7, +0x826F,0x8AD2,0x907C,0x91CF,0x9675,0x9818,0x529B,0x7DD1, +0x502B,0x5398,0x6797,0x6DCB,0x71D0,0x7433,0x81E8,0x8F2A, +0x96A3,0x9C57,0x9E9F,0x7460,0x5841,0x6D99,0x7D2F,0x985E, +0x4EE4,0x4F36,0x4F8B,0x51B7,0x52B1,0x5DBA,0x601C,0x73B2, +0x793C,0x82D3,0x9234,0x96B7,0x96F6,0x970A,0x9E97,0x9F62, +0x66A6,0x6B74,0x5217,0x52A3,0x70C8,0x88C2,0x5EC9,0x604B, +0x6190,0x6F23,0x7149,0x7C3E,0x7DF4,0x806F, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x84EE,0x9023,0x932C,0x5442,0x9B6F,0x6AD3,0x7089, +0x8CC2,0x8DEF,0x9732,0x52B4,0x5A41,0x5ECA,0x5F04,0x6717, +0x697C,0x6994,0x6D6A,0x6F0F,0x7262,0x72FC,0x7BED,0x8001, +0x807E,0x874B,0x90CE,0x516D,0x9E93,0x7984,0x808B,0x9332, +0x8AD6,0x502D,0x548C,0x8A71,0x6B6A,0x8CC4,0x8107,0x60D1, +0x67A0,0x9DF2,0x4E99,0x4E98,0x9C10,0x8A6B,0x85C1,0x8568, +0x6900,0x6E7E,0x7897,0x8155, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x5F0C,0x4E10,0x4E15,0x4E2A,0x4E31,0x4E36,0x4E3C,0x4E3F, +0x4E42,0x4E56,0x4E58,0x4E82,0x4E85,0x8C6B,0x4E8A,0x8212, +0x5F0D,0x4E8E,0x4E9E,0x4E9F,0x4EA0,0x4EA2,0x4EB0,0x4EB3, +0x4EB6,0x4ECE,0x4ECD,0x4EC4,0x4EC6,0x4EC2,0x4ED7,0x4EDE, +0x4EED,0x4EDF,0x4EF7,0x4F09,0x4F5A,0x4F30,0x4F5B,0x4F5D, +0x4F57,0x4F47,0x4F76,0x4F88,0x4F8F,0x4F98,0x4F7B,0x4F69, +0x4F70,0x4F91,0x4F6F,0x4F86,0x4F96,0x5118,0x4FD4,0x4FDF, +0x4FCE,0x4FD8,0x4FDB,0x4FD1,0x4FDA,0x4FD0,0x4FE4,0x4FE5, +0x501A,0x5028,0x5014,0x502A,0x5025,0x5005,0x4F1C,0x4FF6, +0x5021,0x5029,0x502C,0x4FFE,0x4FEF,0x5011,0x5006,0x5043, +0x5047,0x6703,0x5055,0x5050,0x5048,0x505A,0x5056,0x506C, +0x5078,0x5080,0x509A,0x5085,0x50B4,0x50B2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x50C9,0x50CA,0x50B3,0x50C2,0x50D6,0x50DE,0x50E5, +0x50ED,0x50E3,0x50EE,0x50F9,0x50F5,0x5109,0x5101,0x5102, +0x5116,0x5115,0x5114,0x511A,0x5121,0x513A,0x5137,0x513C, +0x513B,0x513F,0x5140,0x5152,0x514C,0x5154,0x5162,0x7AF8, +0x5169,0x516A,0x516E,0x5180,0x5182,0x56D8,0x518C,0x5189, +0x518F,0x5191,0x5193,0x5195,0x5196,0x51A4,0x51A6,0x51A2, +0x51A9,0x51AA,0x51AB,0x51B3,0x51B1,0x51B2,0x51B0,0x51B5, +0x51BD,0x51C5,0x51C9,0x51DB,0x51E0,0x8655,0x51E9,0x51ED, + 0,0x51F0,0x51F5,0x51FE,0x5204,0x520B,0x5214,0x520E, +0x5227,0x522A,0x522E,0x5233,0x5239,0x524F,0x5244,0x524B, +0x524C,0x525E,0x5254,0x526A,0x5274,0x5269,0x5273,0x527F, +0x527D,0x528D,0x5294,0x5292,0x5271,0x5288,0x5291,0x8FA8, +0x8FA7,0x52AC,0x52AD,0x52BC,0x52B5,0x52C1,0x52CD,0x52D7, +0x52DE,0x52E3,0x52E6,0x98ED,0x52E0,0x52F3,0x52F5,0x52F8, +0x52F9,0x5306,0x5308,0x7538,0x530D,0x5310,0x530F,0x5315, +0x531A,0x5323,0x532F,0x5331,0x5333,0x5338,0x5340,0x5346, +0x5345,0x4E17,0x5349,0x534D,0x51D6,0x535E,0x5369,0x536E, +0x5918,0x537B,0x5377,0x5382,0x5396,0x53A0,0x53A6,0x53A5, +0x53AE,0x53B0,0x53B6,0x53C3,0x7C12,0x96D9,0x53DF,0x66FC, +0x71EE,0x53EE,0x53E8,0x53ED,0x53FA,0x5401,0x543D,0x5440, +0x542C,0x542D,0x543C,0x542E,0x5436,0x5429,0x541D,0x544E, +0x548F,0x5475,0x548E,0x545F,0x5471,0x5477,0x5470,0x5492, +0x547B,0x5480,0x5476,0x5484,0x5490,0x5486,0x54C7,0x54A2, +0x54B8,0x54A5,0x54AC,0x54C4,0x54C8,0x54A8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x54AB,0x54C2,0x54A4,0x54BE,0x54BC,0x54D8,0x54E5, +0x54E6,0x550F,0x5514,0x54FD,0x54EE,0x54ED,0x54FA,0x54E2, +0x5539,0x5540,0x5563,0x554C,0x552E,0x555C,0x5545,0x5556, +0x5557,0x5538,0x5533,0x555D,0x5599,0x5580,0x54AF,0x558A, +0x559F,0x557B,0x557E,0x5598,0x559E,0x55AE,0x557C,0x5583, +0x55A9,0x5587,0x55A8,0x55DA,0x55C5,0x55DF,0x55C4,0x55DC, +0x55E4,0x55D4,0x5614,0x55F7,0x5616,0x55FE,0x55FD,0x561B, +0x55F9,0x564E,0x5650,0x71DF,0x5634,0x5636,0x5632,0x5638, + 0,0x566B,0x5664,0x562F,0x566C,0x566A,0x5686,0x5680, +0x568A,0x56A0,0x5694,0x568F,0x56A5,0x56AE,0x56B6,0x56B4, +0x56C2,0x56BC,0x56C1,0x56C3,0x56C0,0x56C8,0x56CE,0x56D1, +0x56D3,0x56D7,0x56EE,0x56F9,0x5700,0x56FF,0x5704,0x5709, +0x5708,0x570B,0x570D,0x5713,0x5718,0x5716,0x55C7,0x571C, +0x5726,0x5737,0x5738,0x574E,0x573B,0x5740,0x574F,0x5769, +0x57C0,0x5788,0x5761,0x577F,0x5789,0x5793,0x57A0,0x57B3, +0x57A4,0x57AA,0x57B0,0x57C3,0x57C6,0x57D4,0x57D2,0x57D3, +0x580A,0x57D6,0x57E3,0x580B,0x5819,0x581D,0x5872,0x5821, +0x5862,0x584B,0x5870,0x6BC0,0x5852,0x583D,0x5879,0x5885, +0x58B9,0x589F,0x58AB,0x58BA,0x58DE,0x58BB,0x58B8,0x58AE, +0x58C5,0x58D3,0x58D1,0x58D7,0x58D9,0x58D8,0x58E5,0x58DC, +0x58E4,0x58DF,0x58EF,0x58FA,0x58F9,0x58FB,0x58FC,0x58FD, +0x5902,0x590A,0x5910,0x591B,0x68A6,0x5925,0x592C,0x592D, +0x5932,0x5938,0x593E,0x7AD2,0x5955,0x5950,0x594E,0x595A, +0x5958,0x5962,0x5960,0x5967,0x596C,0x5969, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5978,0x5981,0x599D,0x4F5E,0x4FAB,0x59A3,0x59B2, +0x59C6,0x59E8,0x59DC,0x598D,0x59D9,0x59DA,0x5A25,0x5A1F, +0x5A11,0x5A1C,0x5A09,0x5A1A,0x5A40,0x5A6C,0x5A49,0x5A35, +0x5A36,0x5A62,0x5A6A,0x5A9A,0x5ABC,0x5ABE,0x5ACB,0x5AC2, +0x5ABD,0x5AE3,0x5AD7,0x5AE6,0x5AE9,0x5AD6,0x5AFA,0x5AFB, +0x5B0C,0x5B0B,0x5B16,0x5B32,0x5AD0,0x5B2A,0x5B36,0x5B3E, +0x5B43,0x5B45,0x5B40,0x5B51,0x5B55,0x5B5A,0x5B5B,0x5B65, +0x5B69,0x5B70,0x5B73,0x5B75,0x5B78,0x6588,0x5B7A,0x5B80, + 0,0x5B83,0x5BA6,0x5BB8,0x5BC3,0x5BC7,0x5BC9,0x5BD4, +0x5BD0,0x5BE4,0x5BE6,0x5BE2,0x5BDE,0x5BE5,0x5BEB,0x5BF0, +0x5BF6,0x5BF3,0x5C05,0x5C07,0x5C08,0x5C0D,0x5C13,0x5C20, +0x5C22,0x5C28,0x5C38,0x5C39,0x5C41,0x5C46,0x5C4E,0x5C53, +0x5C50,0x5C4F,0x5B71,0x5C6C,0x5C6E,0x4E62,0x5C76,0x5C79, +0x5C8C,0x5C91,0x5C94,0x599B,0x5CAB,0x5CBB,0x5CB6,0x5CBC, +0x5CB7,0x5CC5,0x5CBE,0x5CC7,0x5CD9,0x5CE9,0x5CFD,0x5CFA, +0x5CED,0x5D8C,0x5CEA,0x5D0B,0x5D15,0x5D17,0x5D5C,0x5D1F, +0x5D1B,0x5D11,0x5D14,0x5D22,0x5D1A,0x5D19,0x5D18,0x5D4C, +0x5D52,0x5D4E,0x5D4B,0x5D6C,0x5D73,0x5D76,0x5D87,0x5D84, +0x5D82,0x5DA2,0x5D9D,0x5DAC,0x5DAE,0x5DBD,0x5D90,0x5DB7, +0x5DBC,0x5DC9,0x5DCD,0x5DD3,0x5DD2,0x5DD6,0x5DDB,0x5DEB, +0x5DF2,0x5DF5,0x5E0B,0x5E1A,0x5E19,0x5E11,0x5E1B,0x5E36, +0x5E37,0x5E44,0x5E43,0x5E40,0x5E4E,0x5E57,0x5E54,0x5E5F, +0x5E62,0x5E64,0x5E47,0x5E75,0x5E76,0x5E7A,0x9EBC,0x5E7F, +0x5EA0,0x5EC1,0x5EC2,0x5EC8,0x5ED0,0x5ECF, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x5ED6,0x5EE3,0x5EDD,0x5EDA,0x5EDB,0x5EE2,0x5EE1, +0x5EE8,0x5EE9,0x5EEC,0x5EF1,0x5EF3,0x5EF0,0x5EF4,0x5EF8, +0x5EFE,0x5F03,0x5F09,0x5F5D,0x5F5C,0x5F0B,0x5F11,0x5F16, +0x5F29,0x5F2D,0x5F38,0x5F41,0x5F48,0x5F4C,0x5F4E,0x5F2F, +0x5F51,0x5F56,0x5F57,0x5F59,0x5F61,0x5F6D,0x5F73,0x5F77, +0x5F83,0x5F82,0x5F7F,0x5F8A,0x5F88,0x5F91,0x5F87,0x5F9E, +0x5F99,0x5F98,0x5FA0,0x5FA8,0x5FAD,0x5FBC,0x5FD6,0x5FFB, +0x5FE4,0x5FF8,0x5FF1,0x5FDD,0x60B3,0x5FFF,0x6021,0x6060, + 0,0x6019,0x6010,0x6029,0x600E,0x6031,0x601B,0x6015, +0x602B,0x6026,0x600F,0x603A,0x605A,0x6041,0x606A,0x6077, +0x605F,0x604A,0x6046,0x604D,0x6063,0x6043,0x6064,0x6042, +0x606C,0x606B,0x6059,0x6081,0x608D,0x60E7,0x6083,0x609A, +0x6084,0x609B,0x6096,0x6097,0x6092,0x60A7,0x608B,0x60E1, +0x60B8,0x60E0,0x60D3,0x60B4,0x5FF0,0x60BD,0x60C6,0x60B5, +0x60D8,0x614D,0x6115,0x6106,0x60F6,0x60F7,0x6100,0x60F4, +0x60FA,0x6103,0x6121,0x60FB,0x60F1,0x610D,0x610E,0x6147, +0x613E,0x6128,0x6127,0x614A,0x613F,0x613C,0x612C,0x6134, +0x613D,0x6142,0x6144,0x6173,0x6177,0x6158,0x6159,0x615A, +0x616B,0x6174,0x616F,0x6165,0x6171,0x615F,0x615D,0x6153, +0x6175,0x6199,0x6196,0x6187,0x61AC,0x6194,0x619A,0x618A, +0x6191,0x61AB,0x61AE,0x61CC,0x61CA,0x61C9,0x61F7,0x61C8, +0x61C3,0x61C6,0x61BA,0x61CB,0x7F79,0x61CD,0x61E6,0x61E3, +0x61F6,0x61FA,0x61F4,0x61FF,0x61FD,0x61FC,0x61FE,0x6200, +0x6208,0x6209,0x620D,0x620C,0x6214,0x621B, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x621E,0x6221,0x622A,0x622E,0x6230,0x6232,0x6233, +0x6241,0x624E,0x625E,0x6263,0x625B,0x6260,0x6268,0x627C, +0x6282,0x6289,0x627E,0x6292,0x6293,0x6296,0x62D4,0x6283, +0x6294,0x62D7,0x62D1,0x62BB,0x62CF,0x62FF,0x62C6,0x64D4, +0x62C8,0x62DC,0x62CC,0x62CA,0x62C2,0x62C7,0x629B,0x62C9, +0x630C,0x62EE,0x62F1,0x6327,0x6302,0x6308,0x62EF,0x62F5, +0x6350,0x633E,0x634D,0x641C,0x634F,0x6396,0x638E,0x6380, +0x63AB,0x6376,0x63A3,0x638F,0x6389,0x639F,0x63B5,0x636B, + 0,0x6369,0x63BE,0x63E9,0x63C0,0x63C6,0x63E3,0x63C9, +0x63D2,0x63F6,0x63C4,0x6416,0x6434,0x6406,0x6413,0x6426, +0x6436,0x651D,0x6417,0x6428,0x640F,0x6467,0x646F,0x6476, +0x644E,0x652A,0x6495,0x6493,0x64A5,0x64A9,0x6488,0x64BC, +0x64DA,0x64D2,0x64C5,0x64C7,0x64BB,0x64D8,0x64C2,0x64F1, +0x64E7,0x8209,0x64E0,0x64E1,0x62AC,0x64E3,0x64EF,0x652C, +0x64F6,0x64F4,0x64F2,0x64FA,0x6500,0x64FD,0x6518,0x651C, +0x6505,0x6524,0x6523,0x652B,0x6534,0x6535,0x6537,0x6536, +0x6538,0x754B,0x6548,0x6556,0x6555,0x654D,0x6558,0x655E, +0x655D,0x6572,0x6578,0x6582,0x6583,0x8B8A,0x659B,0x659F, +0x65AB,0x65B7,0x65C3,0x65C6,0x65C1,0x65C4,0x65CC,0x65D2, +0x65DB,0x65D9,0x65E0,0x65E1,0x65F1,0x6772,0x660A,0x6603, +0x65FB,0x6773,0x6635,0x6636,0x6634,0x661C,0x664F,0x6644, +0x6649,0x6641,0x665E,0x665D,0x6664,0x6667,0x6668,0x665F, +0x6662,0x6670,0x6683,0x6688,0x668E,0x6689,0x6684,0x6698, +0x669D,0x66C1,0x66B9,0x66C9,0x66BE,0x66BC, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x66C4,0x66B8,0x66D6,0x66DA,0x66E0,0x663F,0x66E6, +0x66E9,0x66F0,0x66F5,0x66F7,0x670F,0x6716,0x671E,0x6726, +0x6727,0x9738,0x672E,0x673F,0x6736,0x6741,0x6738,0x6737, +0x6746,0x675E,0x6760,0x6759,0x6763,0x6764,0x6789,0x6770, +0x67A9,0x677C,0x676A,0x678C,0x678B,0x67A6,0x67A1,0x6785, +0x67B7,0x67EF,0x67B4,0x67EC,0x67B3,0x67E9,0x67B8,0x67E4, +0x67DE,0x67DD,0x67E2,0x67EE,0x67B9,0x67CE,0x67C6,0x67E7, +0x6A9C,0x681E,0x6846,0x6829,0x6840,0x684D,0x6832,0x684E, + 0,0x68B3,0x682B,0x6859,0x6863,0x6877,0x687F,0x689F, +0x688F,0x68AD,0x6894,0x689D,0x689B,0x6883,0x6AAE,0x68B9, +0x6874,0x68B5,0x68A0,0x68BA,0x690F,0x688D,0x687E,0x6901, +0x68CA,0x6908,0x68D8,0x6922,0x6926,0x68E1,0x690C,0x68CD, +0x68D4,0x68E7,0x68D5,0x6936,0x6912,0x6904,0x68D7,0x68E3, +0x6925,0x68F9,0x68E0,0x68EF,0x6928,0x692A,0x691A,0x6923, +0x6921,0x68C6,0x6979,0x6977,0x695C,0x6978,0x696B,0x6954, +0x697E,0x696E,0x6939,0x6974,0x693D,0x6959,0x6930,0x6961, +0x695E,0x695D,0x6981,0x696A,0x69B2,0x69AE,0x69D0,0x69BF, +0x69C1,0x69D3,0x69BE,0x69CE,0x5BE8,0x69CA,0x69DD,0x69BB, +0x69C3,0x69A7,0x6A2E,0x6991,0x69A0,0x699C,0x6995,0x69B4, +0x69DE,0x69E8,0x6A02,0x6A1B,0x69FF,0x6B0A,0x69F9,0x69F2, +0x69E7,0x6A05,0x69B1,0x6A1E,0x69ED,0x6A14,0x69EB,0x6A0A, +0x6A12,0x6AC1,0x6A23,0x6A13,0x6A44,0x6A0C,0x6A72,0x6A36, +0x6A78,0x6A47,0x6A62,0x6A59,0x6A66,0x6A48,0x6A38,0x6A22, +0x6A90,0x6A8D,0x6AA0,0x6A84,0x6AA2,0x6AA3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x6A97,0x8617,0x6ABB,0x6AC3,0x6AC2,0x6AB8,0x6AB3, +0x6AAC,0x6ADE,0x6AD1,0x6ADF,0x6AAA,0x6ADA,0x6AEA,0x6AFB, +0x6B05,0x8616,0x6AFA,0x6B12,0x6B16,0x9B31,0x6B1F,0x6B38, +0x6B37,0x76DC,0x6B39,0x98EE,0x6B47,0x6B43,0x6B49,0x6B50, +0x6B59,0x6B54,0x6B5B,0x6B5F,0x6B61,0x6B78,0x6B79,0x6B7F, +0x6B80,0x6B84,0x6B83,0x6B8D,0x6B98,0x6B95,0x6B9E,0x6BA4, +0x6BAA,0x6BAB,0x6BAF,0x6BB2,0x6BB1,0x6BB3,0x6BB7,0x6BBC, +0x6BC6,0x6BCB,0x6BD3,0x6BDF,0x6BEC,0x6BEB,0x6BF3,0x6BEF, + 0,0x9EBE,0x6C08,0x6C13,0x6C14,0x6C1B,0x6C24,0x6C23, +0x6C5E,0x6C55,0x6C62,0x6C6A,0x6C82,0x6C8D,0x6C9A,0x6C81, +0x6C9B,0x6C7E,0x6C68,0x6C73,0x6C92,0x6C90,0x6CC4,0x6CF1, +0x6CD3,0x6CBD,0x6CD7,0x6CC5,0x6CDD,0x6CAE,0x6CB1,0x6CBE, +0x6CBA,0x6CDB,0x6CEF,0x6CD9,0x6CEA,0x6D1F,0x884D,0x6D36, +0x6D2B,0x6D3D,0x6D38,0x6D19,0x6D35,0x6D33,0x6D12,0x6D0C, +0x6D63,0x6D93,0x6D64,0x6D5A,0x6D79,0x6D59,0x6D8E,0x6D95, +0x6FE4,0x6D85,0x6DF9,0x6E15,0x6E0A,0x6DB5,0x6DC7,0x6DE6, +0x6DB8,0x6DC6,0x6DEC,0x6DDE,0x6DCC,0x6DE8,0x6DD2,0x6DC5, +0x6DFA,0x6DD9,0x6DE4,0x6DD5,0x6DEA,0x6DEE,0x6E2D,0x6E6E, +0x6E2E,0x6E19,0x6E72,0x6E5F,0x6E3E,0x6E23,0x6E6B,0x6E2B, +0x6E76,0x6E4D,0x6E1F,0x6E43,0x6E3A,0x6E4E,0x6E24,0x6EFF, +0x6E1D,0x6E38,0x6E82,0x6EAA,0x6E98,0x6EC9,0x6EB7,0x6ED3, +0x6EBD,0x6EAF,0x6EC4,0x6EB2,0x6ED4,0x6ED5,0x6E8F,0x6EA5, +0x6EC2,0x6E9F,0x6F41,0x6F11,0x704C,0x6EEC,0x6EF8,0x6EFE, +0x6F3F,0x6EF2,0x6F31,0x6EEF,0x6F32,0x6ECC}; + +/* page 3 0xE040-0xEAA4 */ +static uint16 tab_sjis_uni3[]={ +0x6F3E,0x6F13,0x6EF7,0x6F86,0x6F7A,0x6F78,0x6F81,0x6F80, +0x6F6F,0x6F5B,0x6FF3,0x6F6D,0x6F82,0x6F7C,0x6F58,0x6F8E, +0x6F91,0x6FC2,0x6F66,0x6FB3,0x6FA3,0x6FA1,0x6FA4,0x6FB9, +0x6FC6,0x6FAA,0x6FDF,0x6FD5,0x6FEC,0x6FD4,0x6FD8,0x6FF1, +0x6FEE,0x6FDB,0x7009,0x700B,0x6FFA,0x7011,0x7001,0x700F, +0x6FFE,0x701B,0x701A,0x6F74,0x701D,0x7018,0x701F,0x7030, +0x703E,0x7032,0x7051,0x7063,0x7099,0x7092,0x70AF,0x70F1, +0x70AC,0x70B8,0x70B3,0x70AE,0x70DF,0x70CB,0x70DD, 0, +0x70D9,0x7109,0x70FD,0x711C,0x7119,0x7165,0x7155,0x7188, +0x7166,0x7162,0x714C,0x7156,0x716C,0x718F,0x71FB,0x7184, +0x7195,0x71A8,0x71AC,0x71D7,0x71B9,0x71BE,0x71D2,0x71C9, +0x71D4,0x71CE,0x71E0,0x71EC,0x71E7,0x71F5,0x71FC,0x71F9, +0x71FF,0x720D,0x7210,0x721B,0x7228,0x722D,0x722C,0x7230, +0x7232,0x723B,0x723C,0x723F,0x7240,0x7246,0x724B,0x7258, +0x7274,0x727E,0x7282,0x7281,0x7287,0x7292,0x7296,0x72A2, +0x72A7,0x72B9,0x72B2,0x72C3,0x72C6,0x72C4,0x72CE,0x72D2, +0x72E2,0x72E0,0x72E1,0x72F9,0x72F7,0x500F,0x7317,0x730A, +0x731C,0x7316,0x731D,0x7334,0x732F,0x7329,0x7325,0x733E, +0x734E,0x734F,0x9ED8,0x7357,0x736A,0x7368,0x7370,0x7378, +0x7375,0x737B,0x737A,0x73C8,0x73B3,0x73CE,0x73BB,0x73C0, +0x73E5,0x73EE,0x73DE,0x74A2,0x7405,0x746F,0x7425,0x73F8, +0x7432,0x743A,0x7455,0x743F,0x745F,0x7459,0x7441,0x745C, +0x7469,0x7470,0x7463,0x746A,0x7476,0x747E,0x748B,0x749E, +0x74A7,0x74CA,0x74CF,0x74D4,0x73F1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x74E0,0x74E3,0x74E7,0x74E9,0x74EE,0x74F2,0x74F0,0x74F1, +0x74F8,0x74F7,0x7504,0x7503,0x7505,0x750C,0x750E,0x750D, +0x7515,0x7513,0x751E,0x7526,0x752C,0x753C,0x7544,0x754D, +0x754A,0x7549,0x755B,0x7546,0x755A,0x7569,0x7564,0x7567, +0x756B,0x756D,0x7578,0x7576,0x7586,0x7587,0x7574,0x758A, +0x7589,0x7582,0x7594,0x759A,0x759D,0x75A5,0x75A3,0x75C2, +0x75B3,0x75C3,0x75B5,0x75BD,0x75B8,0x75BC,0x75B1,0x75CD, +0x75CA,0x75D2,0x75D9,0x75E3,0x75DE,0x75FE,0x75FF, 0, +0x75FC,0x7601,0x75F0,0x75FA,0x75F2,0x75F3,0x760B,0x760D, +0x7609,0x761F,0x7627,0x7620,0x7621,0x7622,0x7624,0x7634, +0x7630,0x763B,0x7647,0x7648,0x7646,0x765C,0x7658,0x7661, +0x7662,0x7668,0x7669,0x766A,0x7667,0x766C,0x7670,0x7672, +0x7676,0x7678,0x767C,0x7680,0x7683,0x7688,0x768B,0x768E, +0x7696,0x7693,0x7699,0x769A,0x76B0,0x76B4,0x76B8,0x76B9, +0x76BA,0x76C2,0x76CD,0x76D6,0x76D2,0x76DE,0x76E1,0x76E5, +0x76E7,0x76EA,0x862F,0x76FB,0x7708,0x7707,0x7704,0x7729, +0x7724,0x771E,0x7725,0x7726,0x771B,0x7737,0x7738,0x7747, +0x775A,0x7768,0x776B,0x775B,0x7765,0x777F,0x777E,0x7779, +0x778E,0x778B,0x7791,0x77A0,0x779E,0x77B0,0x77B6,0x77B9, +0x77BF,0x77BC,0x77BD,0x77BB,0x77C7,0x77CD,0x77D7,0x77DA, +0x77DC,0x77E3,0x77EE,0x77FC,0x780C,0x7812,0x7926,0x7820, +0x792A,0x7845,0x788E,0x7874,0x7886,0x787C,0x789A,0x788C, +0x78A3,0x78B5,0x78AA,0x78AF,0x78D1,0x78C6,0x78CB,0x78D4, +0x78BE,0x78BC,0x78C5,0x78CA,0x78EC, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x78E7,0x78DA,0x78FD,0x78F4,0x7907,0x7912,0x7911,0x7919, +0x792C,0x792B,0x7940,0x7960,0x7957,0x795F,0x795A,0x7955, +0x7953,0x797A,0x797F,0x798A,0x799D,0x79A7,0x9F4B,0x79AA, +0x79AE,0x79B3,0x79B9,0x79BA,0x79C9,0x79D5,0x79E7,0x79EC, +0x79E1,0x79E3,0x7A08,0x7A0D,0x7A18,0x7A19,0x7A20,0x7A1F, +0x7980,0x7A31,0x7A3B,0x7A3E,0x7A37,0x7A43,0x7A57,0x7A49, +0x7A61,0x7A62,0x7A69,0x9F9D,0x7A70,0x7A79,0x7A7D,0x7A88, +0x7A97,0x7A95,0x7A98,0x7A96,0x7AA9,0x7AC8,0x7AB0, 0, +0x7AB6,0x7AC5,0x7AC4,0x7ABF,0x9083,0x7AC7,0x7ACA,0x7ACD, +0x7ACF,0x7AD5,0x7AD3,0x7AD9,0x7ADA,0x7ADD,0x7AE1,0x7AE2, +0x7AE6,0x7AED,0x7AF0,0x7B02,0x7B0F,0x7B0A,0x7B06,0x7B33, +0x7B18,0x7B19,0x7B1E,0x7B35,0x7B28,0x7B36,0x7B50,0x7B7A, +0x7B04,0x7B4D,0x7B0B,0x7B4C,0x7B45,0x7B75,0x7B65,0x7B74, +0x7B67,0x7B70,0x7B71,0x7B6C,0x7B6E,0x7B9D,0x7B98,0x7B9F, +0x7B8D,0x7B9C,0x7B9A,0x7B8B,0x7B92,0x7B8F,0x7B5D,0x7B99, +0x7BCB,0x7BC1,0x7BCC,0x7BCF,0x7BB4,0x7BC6,0x7BDD,0x7BE9, +0x7C11,0x7C14,0x7BE6,0x7BE5,0x7C60,0x7C00,0x7C07,0x7C13, +0x7BF3,0x7BF7,0x7C17,0x7C0D,0x7BF6,0x7C23,0x7C27,0x7C2A, +0x7C1F,0x7C37,0x7C2B,0x7C3D,0x7C4C,0x7C43,0x7C54,0x7C4F, +0x7C40,0x7C50,0x7C58,0x7C5F,0x7C64,0x7C56,0x7C65,0x7C6C, +0x7C75,0x7C83,0x7C90,0x7CA4,0x7CAD,0x7CA2,0x7CAB,0x7CA1, +0x7CA8,0x7CB3,0x7CB2,0x7CB1,0x7CAE,0x7CB9,0x7CBD,0x7CC0, +0x7CC5,0x7CC2,0x7CD8,0x7CD2,0x7CDC,0x7CE2,0x9B3B,0x7CEF, +0x7CF2,0x7CF4,0x7CF6,0x7CFA,0x7D06, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x7D02,0x7D1C,0x7D15,0x7D0A,0x7D45,0x7D4B,0x7D2E,0x7D32, +0x7D3F,0x7D35,0x7D46,0x7D73,0x7D56,0x7D4E,0x7D72,0x7D68, +0x7D6E,0x7D4F,0x7D63,0x7D93,0x7D89,0x7D5B,0x7D8F,0x7D7D, +0x7D9B,0x7DBA,0x7DAE,0x7DA3,0x7DB5,0x7DC7,0x7DBD,0x7DAB, +0x7E3D,0x7DA2,0x7DAF,0x7DDC,0x7DB8,0x7D9F,0x7DB0,0x7DD8, +0x7DDD,0x7DE4,0x7DDE,0x7DFB,0x7DF2,0x7DE1,0x7E05,0x7E0A, +0x7E23,0x7E21,0x7E12,0x7E31,0x7E1F,0x7E09,0x7E0B,0x7E22, +0x7E46,0x7E66,0x7E3B,0x7E35,0x7E39,0x7E43,0x7E37, 0, +0x7E32,0x7E3A,0x7E67,0x7E5D,0x7E56,0x7E5E,0x7E59,0x7E5A, +0x7E79,0x7E6A,0x7E69,0x7E7C,0x7E7B,0x7E83,0x7DD5,0x7E7D, +0x8FAE,0x7E7F,0x7E88,0x7E89,0x7E8C,0x7E92,0x7E90,0x7E93, +0x7E94,0x7E96,0x7E8E,0x7E9B,0x7E9C,0x7F38,0x7F3A,0x7F45, +0x7F4C,0x7F4D,0x7F4E,0x7F50,0x7F51,0x7F55,0x7F54,0x7F58, +0x7F5F,0x7F60,0x7F68,0x7F69,0x7F67,0x7F78,0x7F82,0x7F86, +0x7F83,0x7F88,0x7F87,0x7F8C,0x7F94,0x7F9E,0x7F9D,0x7F9A, +0x7FA3,0x7FAF,0x7FB2,0x7FB9,0x7FAE,0x7FB6,0x7FB8,0x8B71, +0x7FC5,0x7FC6,0x7FCA,0x7FD5,0x7FD4,0x7FE1,0x7FE6,0x7FE9, +0x7FF3,0x7FF9,0x98DC,0x8006,0x8004,0x800B,0x8012,0x8018, +0x8019,0x801C,0x8021,0x8028,0x803F,0x803B,0x804A,0x8046, +0x8052,0x8058,0x805A,0x805F,0x8062,0x8068,0x8073,0x8072, +0x8070,0x8076,0x8079,0x807D,0x807F,0x8084,0x8086,0x8085, +0x809B,0x8093,0x809A,0x80AD,0x5190,0x80AC,0x80DB,0x80E5, +0x80D9,0x80DD,0x80C4,0x80DA,0x80D6,0x8109,0x80EF,0x80F1, +0x811B,0x8129,0x8123,0x812F,0x814B, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x968B,0x8146,0x813E,0x8153,0x8151,0x80FC,0x8171,0x816E, +0x8165,0x8166,0x8174,0x8183,0x8188,0x818A,0x8180,0x8182, +0x81A0,0x8195,0x81A4,0x81A3,0x815F,0x8193,0x81A9,0x81B0, +0x81B5,0x81BE,0x81B8,0x81BD,0x81C0,0x81C2,0x81BA,0x81C9, +0x81CD,0x81D1,0x81D9,0x81D8,0x81C8,0x81DA,0x81DF,0x81E0, +0x81E7,0x81FA,0x81FB,0x81FE,0x8201,0x8202,0x8205,0x8207, +0x820A,0x820D,0x8210,0x8216,0x8229,0x822B,0x8238,0x8233, +0x8240,0x8259,0x8258,0x825D,0x825A,0x825F,0x8264, 0, +0x8262,0x8268,0x826A,0x826B,0x822E,0x8271,0x8277,0x8278, +0x827E,0x828D,0x8292,0x82AB,0x829F,0x82BB,0x82AC,0x82E1, +0x82E3,0x82DF,0x82D2,0x82F4,0x82F3,0x82FA,0x8393,0x8303, +0x82FB,0x82F9,0x82DE,0x8306,0x82DC,0x8309,0x82D9,0x8335, +0x8334,0x8316,0x8332,0x8331,0x8340,0x8339,0x8350,0x8345, +0x832F,0x832B,0x8317,0x8318,0x8385,0x839A,0x83AA,0x839F, +0x83A2,0x8396,0x8323,0x838E,0x8387,0x838A,0x837C,0x83B5, +0x8373,0x8375,0x83A0,0x8389,0x83A8,0x83F4,0x8413,0x83EB, +0x83CE,0x83FD,0x8403,0x83D8,0x840B,0x83C1,0x83F7,0x8407, +0x83E0,0x83F2,0x840D,0x8422,0x8420,0x83BD,0x8438,0x8506, +0x83FB,0x846D,0x842A,0x843C,0x855A,0x8484,0x8477,0x846B, +0x84AD,0x846E,0x8482,0x8469,0x8446,0x842C,0x846F,0x8479, +0x8435,0x84CA,0x8462,0x84B9,0x84BF,0x849F,0x84D9,0x84CD, +0x84BB,0x84DA,0x84D0,0x84C1,0x84C6,0x84D6,0x84A1,0x8521, +0x84FF,0x84F4,0x8517,0x8518,0x852C,0x851F,0x8515,0x8514, +0x84FC,0x8540,0x8563,0x8558,0x8548, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8541,0x8602,0x854B,0x8555,0x8580,0x85A4,0x8588,0x8591, +0x858A,0x85A8,0x856D,0x8594,0x859B,0x85EA,0x8587,0x859C, +0x8577,0x857E,0x8590,0x85C9,0x85BA,0x85CF,0x85B9,0x85D0, +0x85D5,0x85DD,0x85E5,0x85DC,0x85F9,0x860A,0x8613,0x860B, +0x85FE,0x85FA,0x8606,0x8622,0x861A,0x8630,0x863F,0x864D, +0x4E55,0x8654,0x865F,0x8667,0x8671,0x8693,0x86A3,0x86A9, +0x86AA,0x868B,0x868C,0x86B6,0x86AF,0x86C4,0x86C6,0x86B0, +0x86C9,0x8823,0x86AB,0x86D4,0x86DE,0x86E9,0x86EC, 0, +0x86DF,0x86DB,0x86EF,0x8712,0x8706,0x8708,0x8700,0x8703, +0x86FB,0x8711,0x8709,0x870D,0x86F9,0x870A,0x8734,0x873F, +0x8737,0x873B,0x8725,0x8729,0x871A,0x8760,0x875F,0x8778, +0x874C,0x874E,0x8774,0x8757,0x8768,0x876E,0x8759,0x8753, +0x8763,0x876A,0x8805,0x87A2,0x879F,0x8782,0x87AF,0x87CB, +0x87BD,0x87C0,0x87D0,0x96D6,0x87AB,0x87C4,0x87B3,0x87C7, +0x87C6,0x87BB,0x87EF,0x87F2,0x87E0,0x880F,0x880D,0x87FE, +0x87F6,0x87F7,0x880E,0x87D2,0x8811,0x8816,0x8815,0x8822, +0x8821,0x8831,0x8836,0x8839,0x8827,0x883B,0x8844,0x8842, +0x8852,0x8859,0x885E,0x8862,0x886B,0x8881,0x887E,0x889E, +0x8875,0x887D,0x88B5,0x8872,0x8882,0x8897,0x8892,0x88AE, +0x8899,0x88A2,0x888D,0x88A4,0x88B0,0x88BF,0x88B1,0x88C3, +0x88C4,0x88D4,0x88D8,0x88D9,0x88DD,0x88F9,0x8902,0x88FC, +0x88F4,0x88E8,0x88F2,0x8904,0x890C,0x890A,0x8913,0x8943, +0x891E,0x8925,0x892A,0x892B,0x8941,0x8944,0x893B,0x8936, +0x8938,0x894C,0x891D,0x8960,0x895E, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8966,0x8964,0x896D,0x896A,0x896F,0x8974,0x8977,0x897E, +0x8983,0x8988,0x898A,0x8993,0x8998,0x89A1,0x89A9,0x89A6, +0x89AC,0x89AF,0x89B2,0x89BA,0x89BD,0x89BF,0x89C0,0x89DA, +0x89DC,0x89DD,0x89E7,0x89F4,0x89F8,0x8A03,0x8A16,0x8A10, +0x8A0C,0x8A1B,0x8A1D,0x8A25,0x8A36,0x8A41,0x8A5B,0x8A52, +0x8A46,0x8A48,0x8A7C,0x8A6D,0x8A6C,0x8A62,0x8A85,0x8A82, +0x8A84,0x8AA8,0x8AA1,0x8A91,0x8AA5,0x8AA6,0x8A9A,0x8AA3, +0x8AC4,0x8ACD,0x8AC2,0x8ADA,0x8AEB,0x8AF3,0x8AE7, 0, +0x8AE4,0x8AF1,0x8B14,0x8AE0,0x8AE2,0x8AF7,0x8ADE,0x8ADB, +0x8B0C,0x8B07,0x8B1A,0x8AE1,0x8B16,0x8B10,0x8B17,0x8B20, +0x8B33,0x97AB,0x8B26,0x8B2B,0x8B3E,0x8B28,0x8B41,0x8B4C, +0x8B4F,0x8B4E,0x8B49,0x8B56,0x8B5B,0x8B5A,0x8B6B,0x8B5F, +0x8B6C,0x8B6F,0x8B74,0x8B7D,0x8B80,0x8B8C,0x8B8E,0x8B92, +0x8B93,0x8B96,0x8B99,0x8B9A,0x8C3A,0x8C41,0x8C3F,0x8C48, +0x8C4C,0x8C4E,0x8C50,0x8C55,0x8C62,0x8C6C,0x8C78,0x8C7A, +0x8C82,0x8C89,0x8C85,0x8C8A,0x8C8D,0x8C8E,0x8C94,0x8C7C, +0x8C98,0x621D,0x8CAD,0x8CAA,0x8CBD,0x8CB2,0x8CB3,0x8CAE, +0x8CB6,0x8CC8,0x8CC1,0x8CE4,0x8CE3,0x8CDA,0x8CFD,0x8CFA, +0x8CFB,0x8D04,0x8D05,0x8D0A,0x8D07,0x8D0F,0x8D0D,0x8D10, +0x9F4E,0x8D13,0x8CCD,0x8D14,0x8D16,0x8D67,0x8D6D,0x8D71, +0x8D73,0x8D81,0x8D99,0x8DC2,0x8DBE,0x8DBA,0x8DCF,0x8DDA, +0x8DD6,0x8DCC,0x8DDB,0x8DCB,0x8DEA,0x8DEB,0x8DDF,0x8DE3, +0x8DFC,0x8E08,0x8E09,0x8DFF,0x8E1D,0x8E1E,0x8E10,0x8E1F, +0x8E42,0x8E35,0x8E30,0x8E34,0x8E4A, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8E47,0x8E49,0x8E4C,0x8E50,0x8E48,0x8E59,0x8E64,0x8E60, +0x8E2A,0x8E63,0x8E55,0x8E76,0x8E72,0x8E7C,0x8E81,0x8E87, +0x8E85,0x8E84,0x8E8B,0x8E8A,0x8E93,0x8E91,0x8E94,0x8E99, +0x8EAA,0x8EA1,0x8EAC,0x8EB0,0x8EC6,0x8EB1,0x8EBE,0x8EC5, +0x8EC8,0x8ECB,0x8EDB,0x8EE3,0x8EFC,0x8EFB,0x8EEB,0x8EFE, +0x8F0A,0x8F05,0x8F15,0x8F12,0x8F19,0x8F13,0x8F1C,0x8F1F, +0x8F1B,0x8F0C,0x8F26,0x8F33,0x8F3B,0x8F39,0x8F45,0x8F42, +0x8F3E,0x8F4C,0x8F49,0x8F46,0x8F4E,0x8F57,0x8F5C, 0, +0x8F62,0x8F63,0x8F64,0x8F9C,0x8F9F,0x8FA3,0x8FAD,0x8FAF, +0x8FB7,0x8FDA,0x8FE5,0x8FE2,0x8FEA,0x8FEF,0x9087,0x8FF4, +0x9005,0x8FF9,0x8FFA,0x9011,0x9015,0x9021,0x900D,0x901E, +0x9016,0x900B,0x9027,0x9036,0x9035,0x9039,0x8FF8,0x904F, +0x9050,0x9051,0x9052,0x900E,0x9049,0x903E,0x9056,0x9058, +0x905E,0x9068,0x906F,0x9076,0x96A8,0x9072,0x9082,0x907D, +0x9081,0x9080,0x908A,0x9089,0x908F,0x90A8,0x90AF,0x90B1, +0x90B5,0x90E2,0x90E4,0x6248,0x90DB,0x9102,0x9112,0x9119, +0x9132,0x9130,0x914A,0x9156,0x9158,0x9163,0x9165,0x9169, +0x9173,0x9172,0x918B,0x9189,0x9182,0x91A2,0x91AB,0x91AF, +0x91AA,0x91B5,0x91B4,0x91BA,0x91C0,0x91C1,0x91C9,0x91CB, +0x91D0,0x91D6,0x91DF,0x91E1,0x91DB,0x91FC,0x91F5,0x91F6, +0x921E,0x91FF,0x9214,0x922C,0x9215,0x9211,0x925E,0x9257, +0x9245,0x9249,0x9264,0x9248,0x9295,0x923F,0x924B,0x9250, +0x929C,0x9296,0x9293,0x929B,0x925A,0x92CF,0x92B9,0x92B7, +0x92E9,0x930F,0x92FA,0x9344,0x932E, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9319,0x9322,0x931A,0x9323,0x933A,0x9335,0x933B,0x935C, +0x9360,0x937C,0x936E,0x9356,0x93B0,0x93AC,0x93AD,0x9394, +0x93B9,0x93D6,0x93D7,0x93E8,0x93E5,0x93D8,0x93C3,0x93DD, +0x93D0,0x93C8,0x93E4,0x941A,0x9414,0x9413,0x9403,0x9407, +0x9410,0x9436,0x942B,0x9435,0x9421,0x943A,0x9441,0x9452, +0x9444,0x945B,0x9460,0x9462,0x945E,0x946A,0x9229,0x9470, +0x9475,0x9477,0x947D,0x945A,0x947C,0x947E,0x9481,0x947F, +0x9582,0x9587,0x958A,0x9594,0x9596,0x9598,0x9599, 0, +0x95A0,0x95A8,0x95A7,0x95AD,0x95BC,0x95BB,0x95B9,0x95BE, +0x95CA,0x6FF6,0x95C3,0x95CD,0x95CC,0x95D5,0x95D4,0x95D6, +0x95DC,0x95E1,0x95E5,0x95E2,0x9621,0x9628,0x962E,0x962F, +0x9642,0x964C,0x964F,0x964B,0x9677,0x965C,0x965E,0x965D, +0x965F,0x9666,0x9672,0x966C,0x968D,0x9698,0x9695,0x9697, +0x96AA,0x96A7,0x96B1,0x96B2,0x96B0,0x96B4,0x96B6,0x96B8, +0x96B9,0x96CE,0x96CB,0x96C9,0x96CD,0x894D,0x96DC,0x970D, +0x96D5,0x96F9,0x9704,0x9706,0x9708,0x9713,0x970E,0x9711, +0x970F,0x9716,0x9719,0x9724,0x972A,0x9730,0x9739,0x973D, +0x973E,0x9744,0x9746,0x9748,0x9742,0x9749,0x975C,0x9760, +0x9764,0x9766,0x9768,0x52D2,0x976B,0x9771,0x9779,0x9785, +0x977C,0x9781,0x977A,0x9786,0x978B,0x978F,0x9790,0x979C, +0x97A8,0x97A6,0x97A3,0x97B3,0x97B4,0x97C3,0x97C6,0x97C8, +0x97CB,0x97DC,0x97ED,0x9F4F,0x97F2,0x7ADF,0x97F6,0x97F5, +0x980F,0x980C,0x9838,0x9824,0x9821,0x9837,0x983D,0x9846, +0x984F,0x984B,0x986B,0x986F,0x9870, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9871,0x9874,0x9873,0x98AA,0x98AF,0x98B1,0x98B6,0x98C4, +0x98C3,0x98C6,0x98E9,0x98EB,0x9903,0x9909,0x9912,0x9914, +0x9918,0x9921,0x991D,0x991E,0x9924,0x9920,0x992C,0x992E, +0x993D,0x993E,0x9942,0x9949,0x9945,0x9950,0x994B,0x9951, +0x9952,0x994C,0x9955,0x9997,0x9998,0x99A5,0x99AD,0x99AE, +0x99BC,0x99DF,0x99DB,0x99DD,0x99D8,0x99D1,0x99ED,0x99EE, +0x99F1,0x99F2,0x99FB,0x99F8,0x9A01,0x9A0F,0x9A05,0x99E2, +0x9A19,0x9A2B,0x9A37,0x9A45,0x9A42,0x9A40,0x9A43, 0, +0x9A3E,0x9A55,0x9A4D,0x9A5B,0x9A57,0x9A5F,0x9A62,0x9A65, +0x9A64,0x9A69,0x9A6B,0x9A6A,0x9AAD,0x9AB0,0x9ABC,0x9AC0, +0x9ACF,0x9AD1,0x9AD3,0x9AD4,0x9ADE,0x9ADF,0x9AE2,0x9AE3, +0x9AE6,0x9AEF,0x9AEB,0x9AEE,0x9AF4,0x9AF1,0x9AF7,0x9AFB, +0x9B06,0x9B18,0x9B1A,0x9B1F,0x9B22,0x9B23,0x9B25,0x9B27, +0x9B28,0x9B29,0x9B2A,0x9B2E,0x9B2F,0x9B32,0x9B44,0x9B43, +0x9B4F,0x9B4D,0x9B4E,0x9B51,0x9B58,0x9B74,0x9B93,0x9B83, +0x9B91,0x9B96,0x9B97,0x9B9F,0x9BA0,0x9BA8,0x9BB4,0x9BC0, +0x9BCA,0x9BB9,0x9BC6,0x9BCF,0x9BD1,0x9BD2,0x9BE3,0x9BE2, +0x9BE4,0x9BD4,0x9BE1,0x9C3A,0x9BF2,0x9BF1,0x9BF0,0x9C15, +0x9C14,0x9C09,0x9C13,0x9C0C,0x9C06,0x9C08,0x9C12,0x9C0A, +0x9C04,0x9C2E,0x9C1B,0x9C25,0x9C24,0x9C21,0x9C30,0x9C47, +0x9C32,0x9C46,0x9C3E,0x9C5A,0x9C60,0x9C67,0x9C76,0x9C78, +0x9CE7,0x9CEC,0x9CF0,0x9D09,0x9D08,0x9CEB,0x9D03,0x9D06, +0x9D2A,0x9D26,0x9DAF,0x9D23,0x9D1F,0x9D44,0x9D15,0x9D12, +0x9D41,0x9D3F,0x9D3E,0x9D46,0x9D48, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9D5D,0x9D5E,0x9D64,0x9D51,0x9D50,0x9D59,0x9D72,0x9D89, +0x9D87,0x9DAB,0x9D6F,0x9D7A,0x9D9A,0x9DA4,0x9DA9,0x9DB2, +0x9DC4,0x9DC1,0x9DBB,0x9DB8,0x9DBA,0x9DC6,0x9DCF,0x9DC2, +0x9DD9,0x9DD3,0x9DF8,0x9DE6,0x9DED,0x9DEF,0x9DFD,0x9E1A, +0x9E1B,0x9E1E,0x9E75,0x9E79,0x9E7D,0x9E81,0x9E88,0x9E8B, +0x9E8C,0x9E92,0x9E95,0x9E91,0x9E9D,0x9EA5,0x9EA9,0x9EB8, +0x9EAA,0x9EAD,0x9761,0x9ECC,0x9ECE,0x9ECF,0x9ED0,0x9ED4, +0x9EDC,0x9EDE,0x9EDD,0x9EE0,0x9EE5,0x9EE8,0x9EEF, 0, +0x9EF4,0x9EF6,0x9EF7,0x9EF9,0x9EFB,0x9EFC,0x9EFD,0x9F07, +0x9F08,0x76B7,0x9F15,0x9F21,0x9F2C,0x9F3E,0x9F4A,0x9F52, +0x9F54,0x9F63,0x9F5F,0x9F60,0x9F61,0x9F66,0x9F67,0x9F6C, +0x9F6A,0x9F77,0x9F72,0x9F76,0x9F95,0x9F9C,0x9FA0,0x582F, +0x69C7,0x9059,0x7464,0x51DC,0x7199}; + +static int func_sjis_uni_onechar(int code){ + if ((code>=0x00A1)&&(code<=0x00DF)) + return(tab_sjis_uni0[code-0x00A1]); + if ((code>=0x8140)&&(code<=0x84BE)) + return(tab_sjis_uni1[code-0x8140]); + if ((code>=0x889F)&&(code<=0x9FFC)) + return(tab_sjis_uni2[code-0x889F]); + if ((code>=0xE040)&&(code<=0xEAA4)) + return(tab_sjis_uni3[code-0xE040]); + return(0); +} +/* page 0 0x005C-0x00F7 */ +static uint16 tab_uni_sjis0[]={ +0x815F, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x8191,0x8192, + 0, 0, 0,0x8198,0x814E, 0, 0, 0, +0x81CA, 0, 0, 0,0x818B,0x817D, 0, 0, +0x814C, 0,0x81F7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x817E, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x8180}; + +/* page 1 0x0391-0x0451 */ +static uint16 tab_uni_sjis1[]={ +0x839F,0x83A0,0x83A1,0x83A2,0x83A3,0x83A4,0x83A5,0x83A6, +0x83A7,0x83A8,0x83A9,0x83AA,0x83AB,0x83AC,0x83AD,0x83AE, +0x83AF, 0,0x83B0,0x83B1,0x83B2,0x83B3,0x83B4,0x83B5, +0x83B6, 0, 0, 0, 0, 0, 0, 0, +0x83BF,0x83C0,0x83C1,0x83C2,0x83C3,0x83C4,0x83C5,0x83C6, +0x83C7,0x83C8,0x83C9,0x83CA,0x83CB,0x83CC,0x83CD,0x83CE, +0x83CF, 0,0x83D0,0x83D1,0x83D2,0x83D3,0x83D4,0x83D5, +0x83D6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8446, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x8440, +0x8441,0x8442,0x8443,0x8444,0x8445,0x8447,0x8448,0x8449, +0x844A,0x844B,0x844C,0x844D,0x844E,0x844F,0x8450,0x8451, +0x8452,0x8453,0x8454,0x8455,0x8456,0x8457,0x8458,0x8459, +0x845A,0x845B,0x845C,0x845D,0x845E,0x845F,0x8460,0x8470, +0x8471,0x8472,0x8473,0x8474,0x8475,0x8477,0x8478,0x8479, +0x847A,0x847B,0x847C,0x847D,0x847E,0x8480,0x8481,0x8482, +0x8483,0x8484,0x8485,0x8486,0x8487,0x8488,0x8489,0x848A, +0x848B,0x848C,0x848D,0x848E,0x848F,0x8490,0x8491, 0, +0x8476}; + +/* page 2 0x2010-0x2312 */ +static uint16 tab_uni_sjis2[]={ +0x815D, 0, 0, 0, 0,0x815C,0x8161, 0, +0x8165,0x8166, 0, 0,0x8167,0x8168, 0, 0, +0x81F5,0x81F6, 0, 0, 0,0x8164,0x8163, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x81F1, 0,0x818C,0x818D, 0, 0, 0, 0, + 0, 0, 0,0x81A6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x818E, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x81F0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x81A9,0x81AA,0x81A8,0x81AB, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x81CB, 0,0x81CC, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x81CD, 0,0x81DD,0x81CE, 0, 0, 0,0x81DE, +0x81B8, 0, 0,0x81B9, 0, 0, 0, 0, + 0, 0,0x817C, 0, 0, 0, 0, 0, + 0, 0,0x81E3, 0, 0,0x81E5,0x8187, 0, +0x81DA, 0, 0, 0, 0, 0, 0,0x81C8, +0x81C9,0x81BF,0x81BE,0x81E7,0x81E8, 0, 0, 0, + 0, 0, 0, 0,0x8188,0x81E6, 0, 0, + 0, 0, 0, 0, 0,0x81E4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x81E0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8182,0x81DF, 0, 0, 0, 0,0x8185,0x8186, + 0, 0,0x81E1,0x81E2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x81BC,0x81BD, 0, 0,0x81BA,0x81BB, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x81DB, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x81DC}; + +/* page 3 0x2500-0x266F */ +static uint16 tab_uni_sjis3[]={ +0x849F,0x84AA,0x84A0,0x84AB, 0, 0, 0, 0, + 0, 0, 0, 0,0x84A1, 0, 0,0x84AC, +0x84A2, 0, 0,0x84AD,0x84A4, 0, 0,0x84AF, +0x84A3, 0, 0,0x84AE,0x84A5,0x84BA, 0, 0, +0x84B5, 0, 0,0x84B0,0x84A7,0x84BC, 0, 0, +0x84B7, 0, 0,0x84B2,0x84A6, 0, 0,0x84B6, +0x84BB, 0, 0,0x84B1,0x84A8, 0, 0,0x84B8, +0x84BD, 0, 0,0x84B3,0x84A9, 0, 0,0x84B9, + 0, 0,0x84BE, 0, 0, 0, 0, 0, + 0, 0, 0,0x84B4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x81A1,0x81A0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x81A3,0x81A2, 0, 0, 0, 0, + 0, 0, 0, 0,0x81A5,0x81A4, 0, 0, + 0, 0, 0, 0, 0, 0,0x819F,0x819E, + 0, 0, 0,0x819B, 0, 0,0x819D,0x819C, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x81FC, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x819A,0x8199, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x818A, 0,0x8189, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x81F4, 0, 0,0x81F3, 0,0x81F2 +}; + +/* page 4 0x3000-0x30FE */ +static uint16 tab_uni_sjis4[]={ +0x8140,0x8141,0x8142,0x8156, 0,0x8158,0x8159,0x815A, +0x8171,0x8172,0x8173,0x8174,0x8175,0x8176,0x8177,0x8178, +0x8179,0x817A,0x81A7,0x81AC,0x816B,0x816C, 0, 0, + 0, 0, 0, 0,0x8160, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x829F,0x82A0,0x82A1,0x82A2,0x82A3,0x82A4,0x82A5, +0x82A6,0x82A7,0x82A8,0x82A9,0x82AA,0x82AB,0x82AC,0x82AD, +0x82AE,0x82AF,0x82B0,0x82B1,0x82B2,0x82B3,0x82B4,0x82B5, +0x82B6,0x82B7,0x82B8,0x82B9,0x82BA,0x82BB,0x82BC,0x82BD, +0x82BE,0x82BF,0x82C0,0x82C1,0x82C2,0x82C3,0x82C4,0x82C5, +0x82C6,0x82C7,0x82C8,0x82C9,0x82CA,0x82CB,0x82CC,0x82CD, +0x82CE,0x82CF,0x82D0,0x82D1,0x82D2,0x82D3,0x82D4,0x82D5, +0x82D6,0x82D7,0x82D8,0x82D9,0x82DA,0x82DB,0x82DC,0x82DD, +0x82DE,0x82DF,0x82E0,0x82E1,0x82E2,0x82E3,0x82E4,0x82E5, +0x82E6,0x82E7,0x82E8,0x82E9,0x82EA,0x82EB,0x82EC,0x82ED, +0x82EE,0x82EF,0x82F0,0x82F1, 0, 0, 0, 0, + 0, 0, 0,0x814A,0x814B,0x8154,0x8155, 0, + 0,0x8340,0x8341,0x8342,0x8343,0x8344,0x8345,0x8346, +0x8347,0x8348,0x8349,0x834A,0x834B,0x834C,0x834D,0x834E, +0x834F,0x8350,0x8351,0x8352,0x8353,0x8354,0x8355,0x8356, +0x8357,0x8358,0x8359,0x835A,0x835B,0x835C,0x835D,0x835E, +0x835F,0x8360,0x8361,0x8362,0x8363,0x8364,0x8365,0x8366, +0x8367,0x8368,0x8369,0x836A,0x836B,0x836C,0x836D,0x836E, +0x836F,0x8370,0x8371,0x8372,0x8373,0x8374,0x8375,0x8376, +0x8377,0x8378,0x8379,0x837A,0x837B,0x837C,0x837D,0x837E, +0x8380,0x8381,0x8382,0x8383,0x8384,0x8385,0x8386,0x8387, +0x8388,0x8389,0x838A,0x838B,0x838C,0x838D,0x838E,0x838F, +0x8390,0x8391,0x8392,0x8393,0x8394,0x8395,0x8396, 0, + 0, 0, 0,0x8145,0x815B,0x8152,0x8153}; + +/* page 5 0x4E00-0x9481 */ +static uint16 tab_uni_sjis5[]={ +0x88EA,0x929A, 0,0x8EB5, 0, 0, 0,0x969C, +0x8FE4,0x8E4F,0x8FE3,0x89BA, 0,0x9573,0x975E, 0, +0x98A0,0x894E, 0, 0,0x8A8E,0x98A1,0x90A2,0x99C0, +0x8B75,0x95B8, 0, 0, 0, 0,0x8FE5, 0, + 0,0x97BC, 0, 0, 0, 0,0x95C0, 0, + 0, 0,0x98A2, 0, 0,0x9286, 0, 0, + 0,0x98A3,0x8BF8, 0, 0, 0,0x98A4, 0, +0x8ADB,0x924F, 0,0x8EE5,0x98A5, 0, 0,0x98A6, + 0, 0,0x98A7,0x9454, 0,0x8B76, 0, 0, + 0, 0, 0,0x9456, 0,0x93E1,0x8CC1,0x9652, + 0, 0, 0, 0, 0,0xE568,0x98A8,0x8FE6, +0x98A9,0x89B3, 0, 0, 0,0x8BE3,0x8CEE,0x96E7, + 0, 0,0x9BA4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x9790, 0,0x93FB, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x8AA3, 0, +0x8B54, 0,0x98AA, 0, 0,0x98AB,0x97B9, 0, +0x975C,0x9188,0x98AD,0x8E96,0x93F1, 0,0x98B0, 0, + 0,0x895D,0x8CDD, 0,0x8CDC,0x88E4, 0, 0, +0x986A,0x9869, 0,0x8DB1,0x889F, 0,0x98B1,0x98B2, +0x98B3,0x9653,0x98B4, 0,0x8CF0,0x88E5,0x9692, 0, +0x8B9C, 0, 0,0x8B9D,0x8B9E,0x92E0,0x97BA, 0, +0x98B5, 0, 0,0x98B6, 0, 0,0x98B7, 0, + 0, 0,0x906C, 0, 0, 0, 0, 0, +0x8F59,0x906D,0x98BC, 0,0x98BA, 0,0x98BB,0x8B77, + 0, 0,0x8DA1,0x89EE, 0,0x98B9,0x98B8,0x95A7, + 0, 0, 0, 0,0x8E65,0x8E64,0x91BC,0x98BD, +0x9574,0x90E5, 0, 0, 0,0x8157,0x98BE,0x98C0, + 0, 0, 0,0x91E3,0x97DF,0x88C8, 0, 0, + 0, 0, 0, 0, 0,0x98BF,0x89BC, 0, +0x8BC2, 0,0x9287, 0, 0, 0,0x8C8F,0x98C1, + 0, 0, 0,0x9443, 0, 0, 0, 0, + 0,0x8AE9, 0, 0, 0, 0, 0, 0, + 0,0x98C2,0x88C9, 0, 0,0x8CDE,0x8AEA,0x959A, +0x94B0,0x8B78, 0, 0, 0, 0, 0, 0, + 0, 0,0x89EF, 0,0x98E5,0x9360, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x948C, +0x98C4, 0, 0, 0,0x94BA, 0,0x97E0, 0, +0x904C, 0,0x8E66, 0,0x8E97,0x89BE, 0, 0, + 0, 0, 0,0x92CF, 0, 0,0x9241,0x98C8, + 0, 0, 0, 0, 0,0x88CA,0x92E1,0x8F5A, +0x8DB2,0x9743, 0,0x91CC, 0,0x89BD, 0,0x98C7, + 0,0x975D,0x98C3,0x98C5,0x8DEC,0x98C6,0x9B43, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x98CE, 0, 0, 0, 0, 0,0x98D1, +0x98CF, 0, 0,0x89C0, 0,0x95B9,0x98C9, 0, + 0, 0, 0,0x98CD,0x8CF1, 0, 0,0x8E67, + 0, 0, 0,0x8AA4, 0, 0,0x98D2, 0, +0x98CA, 0, 0,0x97E1, 0,0x8E98, 0,0x98CB, + 0,0x98D0, 0, 0, 0, 0,0x98D3, 0, +0x98CC, 0, 0,0x8B9F, 0,0x88CB, 0, 0, +0x8BA0,0x89BF, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x9B44, 0,0x9699,0x958E,0x8CF2, + 0, 0, 0, 0, 0,0x904E,0x97B5, 0, + 0, 0, 0, 0, 0, 0, 0,0x95D6, + 0, 0,0x8C57,0x91A3,0x89E2, 0, 0, 0, + 0, 0,0x8F72, 0, 0, 0,0x98D7, 0, +0x98DC,0x98DA, 0, 0,0x98D5, 0, 0,0x91AD, +0x98D8, 0,0x98DB,0x98D9, 0,0x95DB, 0,0x98D6, + 0,0x904D, 0,0x9693,0x98DD,0x98DE, 0, 0, + 0, 0, 0, 0, 0, 0,0x8F43,0x98EB, + 0, 0, 0,0x946F, 0,0x9555,0x98E6, 0, +0x95EE, 0,0x89B4, 0, 0, 0,0x98EA, 0, + 0, 0, 0, 0, 0,0x98E4,0x98ED, 0, + 0,0x9171, 0,0x8CC2, 0,0x947B, 0,0xE0C5, + 0,0x98EC,0x937C, 0,0x98E1, 0,0x8CF4, 0, + 0,0x8CF3,0x98DF, 0, 0, 0, 0,0x8ED8, + 0,0x98E7, 0,0x95ED,0x926C,0x98E3,0x8C91, 0, +0x98E0,0x98E8,0x98E2,0x97CF,0x98E9,0x9860, 0, 0, + 0, 0, 0, 0, 0, 0,0x8BE4, 0, + 0,0x8C90, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x98EE, 0, 0, 0,0x98EF, +0x98F3,0x88CC, 0, 0, 0, 0, 0,0x95CE, +0x98F2, 0, 0, 0, 0,0x98F1,0x98F5, 0, + 0, 0,0x98F4, 0,0x92E2, 0, 0, 0, + 0, 0, 0, 0, 0,0x8C92, 0, 0, + 0, 0, 0, 0,0x98F6, 0, 0, 0, + 0, 0,0x8EC3, 0,0x91A4,0x92E3,0x8BF4, 0, +0x98F7, 0, 0, 0, 0,0x8B55, 0, 0, +0x98F8, 0, 0, 0, 0,0x98FA, 0, 0, + 0, 0, 0, 0, 0,0x9654, 0, 0, + 0,0x8C86, 0, 0, 0, 0, 0, 0, +0x8E50,0x94F5,0x98F9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x8DC3,0x9762, 0, 0, + 0, 0,0x98FC,0x9942,0x98FB,0x8DC2, 0,0x8F9D, + 0, 0, 0, 0, 0, 0,0x8C58, 0, + 0, 0,0x9943, 0, 0,0x8BCD, 0, 0, + 0,0x9940,0x9941, 0, 0,0x93AD, 0,0x919C, + 0,0x8BA1, 0, 0, 0,0x966C,0x9944, 0, + 0, 0,0x97BB, 0, 0, 0,0x9945, 0, + 0, 0, 0,0x9948, 0,0x9946, 0,0x916D, + 0, 0, 0, 0, 0,0x9947,0x9949, 0, + 0, 0, 0, 0, 0,0x994B, 0, 0, + 0,0x994A, 0,0x95C6, 0, 0, 0, 0, +0x8B56,0x994D,0x994E, 0,0x89AD, 0, 0, 0, + 0,0x994C, 0, 0, 0, 0, 0, 0, + 0, 0,0x8EF2, 0,0x9951,0x9950,0x994F, 0, +0x98D4, 0,0x9952, 0, 0, 0, 0,0x8F9E, + 0,0x9953, 0, 0, 0, 0, 0, 0, + 0, 0,0x9744, 0, 0, 0, 0, 0, + 0, 0,0x96D7, 0, 0, 0, 0,0x9955, + 0, 0,0x9954,0x9957,0x9956, 0, 0,0x9958, +0x9959,0x88F2, 0,0x8CB3,0x8C5A,0x8F5B,0x929B,0x8BA2, +0x90E6,0x8CF5, 0,0x8D8E,0x995B,0x96C6,0x9365, 0, +0x8E99, 0,0x995A, 0,0x995C, 0, 0, 0, + 0, 0,0x937D, 0,0x8A95, 0, 0, 0, + 0, 0,0x995D, 0, 0,0x93FC, 0, 0, +0x9153,0x995F,0x9960,0x94AA,0x8CF6,0x985A,0x9961, 0, + 0,0x8BA4, 0, 0, 0,0x95BA,0x91B4,0x8BEF, +0x9354, 0, 0, 0,0x8C93, 0, 0, 0, +0x9962, 0,0x9963, 0, 0,0x93E0,0x897E, 0, + 0,0x9966,0x8DFB, 0,0x9965,0x8DC4, 0,0x9967, +0xE3EC,0x9968,0x9660,0x9969, 0,0x996A,0x996B,0x8FE7, + 0,0x8ECA, 0, 0, 0, 0, 0, 0, +0x8AA5, 0,0x996E, 0,0x996C,0x96BB,0x996D, 0, +0x9579,0x996F,0x9970,0x9971,0x937E, 0, 0, 0, +0x9975,0x9973,0x9974,0x9972,0x8DE1,0x9976,0x96E8,0x97E2, + 0, 0, 0, 0, 0,0x9977, 0, 0, + 0, 0, 0, 0,0x90A6,0x9978,0x8F79, 0, + 0,0x9979, 0,0x929C,0x97BD,0x9380, 0, 0, + 0, 0, 0, 0, 0, 0,0x99C3, 0, + 0, 0, 0,0x997A,0xEAA3,0x8BC3, 0, 0, +0x997B,0x967D, 0, 0, 0, 0,0x8F88,0x91FA, + 0,0x997D,0x93E2, 0, 0,0x997E, 0, 0, +0x9980,0x8A4D, 0, 0, 0,0x9981,0x8BA5, 0, +0x93CA,0x899A,0x8F6F, 0, 0,0x949F,0x9982, 0, +0x9381, 0, 0,0x906E,0x9983, 0,0x95AA,0x90D8, +0x8AA0, 0,0x8AA7,0x9984, 0, 0,0x9986, 0, + 0,0x8C59, 0, 0,0x9985, 0, 0,0x97F1, + 0, 0, 0, 0, 0,0x8F89, 0, 0, + 0, 0, 0, 0,0x94BB,0x95CA, 0,0x9987, + 0,0x9798,0x9988, 0, 0, 0,0x9989, 0, +0x939E, 0, 0,0x998A, 0, 0,0x90A7,0x8DFC, +0x8C94,0x998B,0x8E68,0x8D8F, 0, 0, 0, 0, + 0, 0, 0,0x92E4,0x998D, 0, 0,0x91A5, + 0, 0,0x8DED,0x998E,0x998F,0x914F, 0,0x998C, + 0, 0, 0, 0,0x9991, 0,0x9655, 0, + 0, 0, 0,0x8D84, 0, 0,0x9990, 0, + 0, 0, 0,0x8C95,0x8DDC,0x948D, 0, 0, + 0,0x9994,0x9992, 0, 0, 0, 0,0x959B, +0x8FE8,0x999B,0x8A84,0x9995,0x9993,0x916E, 0, 0, + 0, 0, 0, 0, 0,0x9997, 0,0x9996, + 0, 0, 0,0x8A63, 0, 0, 0,0x8C80, +0x999C,0x97AB, 0, 0, 0,0x9998, 0, 0, + 0,0x999D,0x999A, 0,0x9999, 0, 0, 0, + 0, 0, 0,0x97CD, 0, 0, 0,0x8CF7, +0x89C1, 0, 0,0x97F2, 0, 0, 0, 0, + 0,0x8F95,0x9377,0x8D85,0x99A0,0x99A1, 0, 0, + 0,0x97E3, 0, 0,0x984A,0x99A3, 0, 0, + 0,0x8CF8, 0, 0,0x99A2, 0,0x8A4E, 0, + 0,0x99A4, 0,0x9675, 0,0x92BA, 0,0x9745, + 0,0x95D7, 0, 0, 0,0x99A5, 0, 0, + 0, 0,0xE8D3, 0, 0,0x93AE, 0,0x99A6, +0x8AA8,0x96B1, 0, 0, 0,0x8F9F,0x99A7,0x95E5, +0x99AB, 0,0x90A8,0x99A8,0x8BCE, 0,0x99A9,0x8AA9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x8C4D,0x99AC, 0,0x99AD, 0, 0, +0x99AE,0x99AF,0x8ED9, 0, 0, 0,0x8CF9,0x96DC, + 0,0x96E6,0x93F5, 0, 0,0x95EF,0x99B0, 0, +0x99B1, 0, 0, 0, 0,0x99B3, 0,0x99B5, +0x99B4, 0, 0, 0, 0,0x99B6,0x89BB,0x966B, + 0,0x8DFA,0x99B7, 0, 0,0x9178, 0, 0, +0x8FA0,0x8BA7, 0,0x99B8, 0, 0, 0, 0, + 0, 0,0x94D9, 0, 0, 0, 0,0x99B9, + 0,0x99BA, 0,0x99BB, 0, 0, 0, 0, +0x99BC,0x9543,0x8BE6,0x88E3, 0, 0, 0,0x93BD, +0x99BD,0x8F5C, 0,0x90E7, 0,0x99BF,0x99BE,0x8FA1, +0x8CDF,0x99C1,0x94BC, 0, 0,0x99C2, 0, 0, + 0,0x94DA,0x91B2,0x91EC,0x8BA6, 0, 0,0x93EC, +0x9250, 0,0x948E, 0,0x966D, 0,0x99C4, 0, +0x90E8, 0, 0, 0, 0, 0,0x8C54, 0, + 0,0x99C5, 0, 0, 0, 0,0x99C6,0x894B, +0x88F3,0x8AEB, 0,0x91A6,0x8B70,0x9791, 0,0x99C9, +0x89B5, 0, 0,0x99C8, 0, 0, 0,0x8BA8, + 0, 0,0x99CA, 0,0x96EF, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x99CB, 0, +0x97D0, 0,0x8CFA, 0, 0, 0, 0,0x8CB4, +0x99CC, 0, 0, 0, 0,0x99CE,0x99CD, 0, +0x907E,0x8958, 0, 0, 0,0x897D,0x99CF, 0, +0x99D0, 0, 0,0x8CB5, 0, 0,0x99D1, 0, + 0, 0, 0,0x8B8E, 0, 0, 0, 0, + 0, 0,0x8E51,0x99D2, 0, 0, 0, 0, +0x9694,0x8DB3,0x8B79,0x9746,0x916F,0x94BD,0x8EFB, 0, + 0, 0, 0, 0,0x8F66, 0,0x8EE6,0x8EF3, + 0,0x8F96, 0,0x94BE, 0, 0, 0,0x99D5, + 0,0x8962,0x9170,0x8CFB,0x8CC3,0x8BE5, 0, 0, +0x99D9,0x9240,0x91FC,0x8BA9,0x8FA2,0x99DA,0x99D8,0x89C2, +0x91E4,0x8EB6,0x8E6A,0x8945, 0, 0,0x8A90,0x8D86, +0x8E69, 0,0x99DB, 0, 0, 0, 0, 0, + 0,0x99DC, 0,0x8B68,0x8A65, 0, 0, 0, +0x8D87,0x8B67,0x92DD,0x8944,0x93AF,0x96BC,0x8D40,0x9799, +0x9366,0x8CFC, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x8C4E, 0,0x99E5, 0,0x8BE1, +0x9669, 0, 0, 0, 0, 0,0x94DB, 0, + 0,0x99E4, 0,0x8ADC,0x99DF,0x99E0,0x99E2, 0, + 0, 0, 0, 0, 0, 0,0x99E3, 0, +0x8B7A,0x9081, 0,0x95AB,0x99E1,0x99DD,0x8CE1, 0, +0x99DE, 0,0x9843, 0, 0, 0,0x95F0, 0, +0x92E6,0x8CE0,0x8D90, 0, 0, 0,0x99E6, 0, + 0,0x93DB, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x99EA, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8EFC, 0,0x8EF4, 0, 0, 0, 0, 0, +0x99ED,0x99EB, 0,0x96A1, 0,0x99E8,0x99F1,0x99EC, + 0, 0, 0,0x99EF,0x8CC4,0x96BD, 0, 0, +0x99F0, 0, 0, 0,0x99F2, 0,0x99F4, 0, + 0, 0, 0,0x8DEE,0x9861, 0,0x99E9,0x99E7, +0x99F3, 0,0x99EE, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x99F6, 0,0x9A42,0x99F8, 0, 0, +0x99FC, 0, 0,0x9A40,0x99F9, 0, 0,0x9A5D, + 0, 0,0x8DE7,0x8A50, 0, 0, 0, 0, +0x99F7, 0, 0, 0,0x9A44,0x88F4,0x9A43, 0, +0x88A3,0x9569,0x9A41, 0,0x99FA, 0, 0,0x99F5, +0x99FB,0x8DC6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9A45, 0, 0, 0, 0, 0, 0, 0, + 0,0x88F5,0x9A4E, 0, 0,0x9A46,0x9A47, 0, +0x8FA3,0x9689, 0, 0, 0,0x9A4C,0x9A4B, 0, + 0, 0,0x934E, 0, 0, 0, 0, 0, + 0, 0,0x9A4D, 0, 0,0x9A4A, 0, 0, + 0, 0, 0, 0,0x8953, 0,0x8DB4,0x904F, + 0, 0, 0, 0, 0, 0, 0,0x9A48, +0x9382, 0, 0, 0,0x9A49, 0,0x88A0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x9A53,0x9742, + 0,0x8FA5, 0,0x9A59, 0, 0, 0, 0, +0x9A58,0x9A4F, 0, 0, 0, 0,0x91C1, 0, +0x9A50, 0, 0, 0,0x91ED,0x9A55,0x8FA4, 0, + 0, 0, 0, 0,0x9A52, 0, 0,0x96E2, + 0, 0, 0,0x8C5B, 0, 0,0x9A56,0x9A57, + 0, 0, 0, 0,0x9A54,0x9A5A, 0, 0, + 0, 0, 0,0x9A51, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x9A60,0x9A65, 0,0x9A61, 0, +0x9A5C, 0, 0,0x9A66,0x9150, 0, 0,0x9A68, + 0,0x8D41,0x9A5E,0x929D, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9A62,0x9A5B,0x8AAB, 0,0x8AEC,0x8A85,0x9A63,0x9A5F, + 0, 0, 0, 0, 0, 0, 0,0x8C96, +0x9A69,0x9A67,0x9172,0x8B69,0x8BAA, 0,0x9A64, 0, +0x8BF2, 0, 0, 0, 0, 0,0x8963, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x9A6D,0x9A6B, 0,0x9AA5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x9A70, 0, 0, 0, + 0, 0,0x9A6A, 0,0x9A6E, 0, 0,0x9A6C, + 0, 0, 0,0x8E6B,0x9A6F, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x9A72, + 0,0x9A77, 0, 0, 0,0x9A75,0x9A74, 0, + 0, 0, 0, 0, 0, 0,0x9251, 0, + 0,0x89C3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x9A71, 0,0x9A73,0x8FA6, +0x8952, 0, 0,0x9A76, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x89DC, 0, 0, 0, 0, 0,0x9A82, + 0,0x8FFA,0x9A7D, 0,0x9A7B, 0,0x9A7C, 0, +0x9A7E, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x895C, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x9158, 0,0x9A78, 0, +0x9A79, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x8A9A, 0, 0, 0, 0, + 0, 0, 0, 0,0x9A81, 0, 0, 0, +0x8AED, 0,0x9A84,0x9A80,0x9A83, 0, 0, 0, + 0, 0, 0, 0,0x95AC, 0, 0, 0, +0x93D3, 0,0x94B6, 0, 0, 0, 0, 0, +0x9A86, 0, 0, 0, 0, 0,0x9A85,0x8A64, + 0, 0,0x9A87, 0, 0, 0, 0,0x9A8A, + 0, 0, 0, 0,0x9A89, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9A88, 0,0x9458, 0, 0,0x9A8B, 0, 0, + 0, 0, 0, 0, 0, 0,0x9A8C, 0, + 0, 0, 0, 0,0x9A8E, 0,0x9A8D, 0, + 0, 0, 0, 0,0x9A90, 0, 0, 0, +0x9A93,0x9A91,0x9A8F,0x9A92, 0, 0, 0, 0, +0x9A94, 0, 0, 0, 0, 0,0x9A95, 0, + 0,0x9A96, 0,0x9A97, 0, 0, 0,0x9A98, +0x9964, 0,0x8EFA,0x8E6C, 0, 0,0x89F1, 0, +0x88F6, 0, 0,0x9263, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x9A99, 0, +0x8DA2, 0,0x88CD,0x907D, 0, 0, 0, 0, + 0,0x9A9A,0x8CC5, 0, 0,0x8D91, 0,0x9A9C, +0x9A9B, 0, 0,0x95DE,0x9A9D, 0, 0, 0, +0x9A9F,0x9A9E, 0,0x9AA0, 0,0x9AA1, 0,0x8C97, + 0, 0,0x8980,0x9AA2, 0, 0,0x9AA4, 0, +0x9AA3, 0, 0, 0,0x9AA6, 0, 0,0x9379, + 0, 0, 0, 0, 0, 0,0x9AA7,0x88B3, +0x8DDD, 0, 0, 0, 0,0x8C5C, 0, 0, +0x926E, 0, 0, 0, 0, 0, 0,0x9AA8, +0x9AA9, 0, 0,0x9AAB, 0, 0, 0, 0, +0x9AAC, 0,0x8DE2, 0, 0, 0, 0,0x8BCF, + 0, 0,0x9656, 0, 0, 0,0x9AAA,0x9AAD, +0x8DBF,0x8D42, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x9AB1, 0, 0,0x8DA3, 0,0x9252, 0, + 0,0x9AAE,0x92D8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x9AB2, + 0, 0,0x9082, 0, 0, 0, 0, 0, +0x9AB0,0x9AB3, 0,0x8C5E, 0, 0, 0, 0, + 0, 0, 0,0x9AB4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9AB5, 0,0x8D43,0x8A5F,0x9AB7, 0, 0, 0, + 0, 0,0x9AB8, 0, 0, 0, 0, 0, +0x9AB9, 0, 0,0x9AB6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9AAF, 0, 0,0x9ABA, 0, 0,0x9ABB, 0, + 0, 0, 0,0x9684, 0, 0,0x8FE9, 0, + 0, 0,0x9ABD,0x9ABE,0x9ABC, 0,0x9AC0, 0, + 0, 0, 0, 0,0x9457, 0, 0,0x88E6, +0x9575, 0, 0,0x9AC1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x8FFB, 0, 0,0x8EB7, + 0,0x947C,0x8AEE, 0,0x8DE9, 0, 0, 0, +0x9678, 0,0x93B0, 0, 0,0x8C98,0x91CD, 0, + 0, 0,0x9ABF,0x9AC2, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x91C2, 0, 0, + 0,0x9AC3, 0, 0, 0,0x9AC4, 0, 0, + 0,0x9AC6, 0, 0,0x92E7, 0, 0, 0, + 0, 0,0x8AAC, 0, 0, 0, 0,0xEA9F, +0x8981,0x95F1, 0, 0,0x8FEA,0x9367, 0, 0, + 0, 0,0x8DE4, 0, 0,0x9ACC, 0, 0, +0x95BB,0x97DB, 0, 0, 0, 0, 0, 0, + 0, 0,0x89F2,0x9AC8, 0, 0, 0, 0, + 0,0x9159,0x9ACB, 0,0x9383, 0, 0,0x9368, +0x9384,0x94B7,0x92CB, 0, 0, 0,0x8DC7, 0, + 0, 0,0x9AC7, 0, 0, 0, 0, 0, + 0,0x8996, 0,0x9355, 0, 0, 0, 0, +0x9AC9, 0,0x9AC5, 0, 0,0x906F, 0, 0, + 0,0x9ACD, 0, 0, 0, 0,0x8F6D, 0, + 0, 0, 0,0x8BAB, 0,0x9ACE, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x95E6, 0, 0, 0,0x919D, + 0, 0, 0, 0,0x92C4, 0, 0,0x9AD0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x966E, 0, 0,0x9AD1, 0, 0,0x9AD6, 0, + 0, 0, 0,0x95AD, 0, 0, 0, 0, +0x9AD5,0x9ACF,0x9AD2,0x9AD4, 0, 0,0x8DA4, 0, + 0,0x95C7, 0, 0, 0,0x9AD7, 0,0x9264, + 0, 0,0x89F3, 0,0x8FEB, 0, 0, 0, + 0,0x9AD9, 0,0x9AD8, 0,0x8D88, 0,0x9ADA, +0x9ADC,0x9ADB, 0, 0,0x9ADE, 0,0x9AD3,0x9AE0, + 0, 0, 0, 0,0x9ADF,0x9ADD, 0, 0, + 0, 0, 0,0x8E6D,0x9070, 0,0x9173,0x9AE1, +0x90BA,0x88EB,0x9484, 0, 0, 0, 0,0x92D9, + 0,0x9AE3,0x9AE2,0x9AE4,0x9AE5,0x9AE6, 0, 0, + 0, 0,0x9AE7, 0, 0, 0, 0, 0, + 0,0x95CF,0x9AE8, 0, 0, 0, 0,0x89C4, +0x9AE9, 0, 0, 0, 0,0x975B,0x8A4F, 0, +0x99C7,0x8F67,0x91BD,0x9AEA,0x96E9, 0, 0, 0, + 0, 0,0x96B2, 0, 0,0x9AEC, 0,0x91E5, + 0,0x9356,0x91BE,0x9576,0x9AED,0x9AEE,0x899B, 0, + 0,0x8EB8,0x9AEF, 0, 0, 0, 0,0x88CE, +0x9AF0, 0, 0, 0, 0, 0,0x9AF1, 0, + 0, 0, 0, 0,0x8982, 0, 0,0x8AEF, +0x93DE,0x95F2, 0, 0, 0, 0,0x9AF5,0x9174, +0x9AF4,0x8C5F, 0, 0,0x967A,0x9AF3, 0,0x9385, +0x9AF7, 0,0x9AF6, 0, 0, 0, 0, 0, +0x9AF9, 0,0x9AF8, 0, 0,0x899C, 0,0x9AFA, +0x8FA7,0x9AFC,0x9244, 0,0x9AFB, 0,0x95B1, 0, + 0, 0, 0,0x8F97,0x937A, 0, 0, 0, +0x9B40, 0, 0, 0, 0,0x8D44, 0, 0, + 0,0x9B41,0x9440,0x94DC,0x96CF, 0, 0, 0, + 0, 0,0x9444, 0, 0,0x9B4A, 0, 0, + 0, 0, 0,0x8B57, 0, 0,0x9764, 0, + 0,0x96AD, 0,0x9BAA, 0,0x9B42, 0, 0, + 0, 0, 0,0x9B45, 0,0x91C3, 0, 0, +0x9657, 0, 0, 0,0x9369, 0, 0, 0, + 0, 0,0x9B46, 0, 0, 0, 0, 0, + 0,0x9685, 0,0x8DC8, 0, 0,0x8FA8, 0, + 0, 0, 0, 0, 0, 0,0x9B47, 0, + 0,0x8E6F, 0,0x8E6E, 0, 0, 0, 0, +0x88B7,0x8CC6, 0,0x90A9,0x88CF, 0, 0, 0, + 0,0x9B4B,0x9B4C, 0,0x9B49, 0, 0, 0, + 0, 0, 0, 0, 0,0x8957,0x8AAD, 0, +0x9B48, 0,0x96C3,0x9550, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x88A6, 0, + 0, 0, 0,0x88F7, 0, 0, 0,0x8E70, + 0,0x88D0, 0,0x88A1, 0, 0, 0, 0, + 0,0x9B51, 0, 0, 0, 0, 0, 0, + 0,0x9B4F, 0, 0, 0, 0, 0, 0, +0x96BA, 0,0x9B52, 0,0x9B50, 0, 0,0x9B4E, +0x9050, 0, 0, 0, 0,0x9B4D, 0, 0, + 0,0x95D8, 0, 0, 0, 0, 0,0x8CE2, + 0, 0, 0, 0, 0,0x9B56,0x9B57, 0, + 0, 0, 0, 0,0x8FA9, 0, 0, 0, +0x9B53,0x984B, 0, 0, 0, 0,0x946B, 0, + 0,0x9B55, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x8DA5, 0, 0, 0, 0, 0, + 0, 0,0x9B58, 0, 0, 0,0x9577, 0, + 0, 0,0x9B59, 0,0x9B54, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x96B9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x947D, 0, 0, 0, 0, 0, + 0, 0,0x9B5A,0x9551, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x9B5B,0x9B5F,0x9B5C, 0, + 0,0x89C5,0x9B5E, 0, 0, 0, 0, 0, + 0,0x8EB9, 0,0x9B5D,0x8C99, 0, 0, 0, +0x9B6B, 0, 0, 0, 0, 0,0x9B64,0x9B61, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x9284, 0,0x9B60, 0, 0,0x9B62, 0, + 0,0x9B63, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x9B65,0x9B66, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x8AF0, 0,0x9B68,0x9B67, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x9B69, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x8FEC, 0, 0, 0, 0, 0, + 0, 0,0x9B6C, 0,0x92DA, 0, 0, 0, +0x8964, 0,0x9B6A, 0, 0, 0,0x9B6D, 0, + 0, 0, 0, 0, 0, 0,0x9B6E, 0, +0x9B71, 0, 0,0x9B6F, 0,0x9B70, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8E71,0x9B72, 0, 0,0x8D45,0x9B73, 0,0x8E9A, +0x91B6, 0,0x9B74,0x9B75,0x8E79,0x8D46, 0,0x96D0, + 0, 0, 0,0x8B47,0x8CC7,0x9B76,0x8A77, 0, + 0,0x9B77, 0,0x91B7, 0, 0, 0, 0, +0x9B78,0x9BA1, 0,0x9B79, 0,0x9B7A, 0, 0, +0x9B7B, 0,0x9B7D, 0, 0, 0, 0, 0, +0x9B7E, 0, 0,0x9B80, 0,0x91EE, 0,0x8946, +0x8EE7,0x88C0, 0,0x9176,0x8AAE,0x8EB3, 0,0x8D47, + 0, 0, 0, 0, 0,0x9386, 0,0x8F40, +0x8AAF,0x9288,0x92E8,0x88B6,0x8B58,0x95F3, 0,0x8EC0, + 0, 0,0x8B71,0x90E9,0x8EBA,0x9747,0x9B81, 0, + 0, 0, 0, 0, 0, 0,0x8B7B, 0, +0x8DC9, 0, 0,0x8A51,0x8983,0x8FAA,0x89C6, 0, +0x9B82,0x9765, 0, 0, 0, 0, 0,0x8F68, + 0, 0,0x8EE2,0x9B83,0x8AF1,0x93D0,0x96A7,0x9B84, + 0,0x9B85, 0, 0,0x9578, 0, 0, 0, +0x9B87, 0,0x8AA6,0x8BF5,0x9B86, 0, 0, 0, + 0, 0, 0,0x8AB0, 0,0x9051,0x9B8B,0x8E40, + 0,0x89C7,0x9B8A, 0,0x9B88,0x9B8C,0x9B89,0x944A, +0x9ECB,0x9052, 0,0x9B8D, 0, 0,0x97BE, 0, +0x9B8E, 0, 0,0x9B90, 0,0x929E,0x9B8F, 0, +0x90A1, 0,0x8E9B, 0, 0, 0,0x91CE,0x8EF5, + 0,0x9595,0x90EA, 0,0x8ECB,0x9B91,0x8FAB,0x9B92, +0x9B93,0x88D1,0x91B8,0x9071, 0,0x9B94,0x93B1,0x8FAC, + 0,0x8FAD, 0,0x9B95, 0, 0,0x90EB, 0, + 0, 0,0x8FAE, 0, 0, 0, 0, 0, +0x9B96, 0,0x9B97, 0,0x96DE, 0, 0, 0, +0x9B98, 0, 0, 0, 0,0x8BC4, 0, 0, + 0,0x8F41, 0, 0, 0, 0, 0, 0, +0x9B99,0x9B9A,0x8EDA,0x904B,0x93F2,0x9073,0x94F6,0x9441, +0x8BC7,0x9B9B, 0, 0, 0,0x8B8F,0x9B9C, 0, +0x8BFC, 0,0x93CD,0x89AE, 0,0x8E72,0x9B9D,0x9BA0, +0x9B9F,0x8BFB, 0,0x9B9E, 0,0x9357, 0, 0, + 0, 0, 0, 0, 0, 0,0x91AE, 0, +0x936A,0x8EC6, 0, 0,0x9177,0x979A, 0, 0, + 0, 0, 0, 0,0x9BA2, 0,0x9BA3,0x93D4, + 0,0x8E52, 0, 0, 0, 0,0x9BA5, 0, + 0,0x9BA6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x9BA7, 0, 0, 0, +0x8AF2,0x9BA8, 0, 0,0x9BA9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x89AA, 0, 0, 0, 0, 0, 0, +0x915A,0x8AE2, 0,0x9BAB,0x96A6, 0, 0, 0, + 0,0x91D0, 0,0x8A78, 0, 0,0x9BAD,0x9BAF, +0x8ADD, 0, 0,0x9BAC,0x9BAE, 0,0x9BB1, 0, + 0, 0, 0, 0, 0,0x9BB0, 0,0x9BB2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x9BB3, 0, 0, 0, 0, 0, 0, +0x93BB,0x8BAC, 0, 0, 0, 0, 0, 0, +0x89E3,0x9BB4,0x9BB9, 0, 0,0x9BB7, 0,0x95F5, +0x95F4, 0, 0, 0, 0, 0,0x9387, 0, + 0, 0,0x9BB6,0x8F73, 0,0x9BB5, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x9092, + 0, 0, 0,0x9BBA, 0, 0,0x8DE8, 0, + 0,0x9BC0, 0, 0,0x9BC1,0x9BBB,0x8A52,0x9BBC, +0x9BC5,0x9BC4,0x9BC3,0x9BBF, 0, 0, 0,0x9BBE, + 0, 0,0x9BC2, 0, 0, 0, 0, 0, + 0,0x95F6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x9BC9,0x9BC6, 0,0x9BC8, 0, +0x9792, 0,0x9BC7, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x9BBD, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x9093, 0, 0,0x9BCA, 0, 0,0x8DB5, + 0, 0, 0,0x9BCB, 0, 0,0x9BCC, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x9BCF, 0,0x9BCE, 0, 0,0x9BCD, + 0, 0, 0,0x9388,0x9BB8, 0, 0, 0, +0x9BD5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x9BD1, 0, 0, + 0, 0,0x9BD0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x9BD2, 0,0x9BD3, 0, + 0, 0, 0, 0, 0, 0, 0,0x9BD6, + 0, 0,0x97E4, 0,0x9BD7,0x9BD4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x9BD8, 0, 0,0x8ADE,0x9BD9, 0, 0, + 0, 0,0x9BDB,0x9BDA, 0, 0,0x9BDC, 0, + 0, 0, 0,0x9BDD, 0,0x90EC,0x8F42, 0, + 0,0x8F84, 0,0x9183, 0,0x8D48,0x8DB6,0x8D49, +0x8B90, 0, 0,0x9BDE, 0, 0,0x8DB7, 0, + 0,0x8CC8,0x9BDF,0x96A4,0x9462,0x9BE0, 0,0x8D4A, + 0, 0, 0,0x8AAA, 0,0x9246,0x8BD0, 0, + 0, 0,0x8E73,0x957A, 0, 0,0x94BF, 0, + 0, 0, 0,0x9BE1,0x8AF3, 0, 0, 0, + 0,0x9BE4, 0, 0, 0, 0,0x929F, 0, + 0,0x9BE3,0x9BE2,0x9BE5, 0,0x92E9, 0, 0, + 0, 0, 0, 0, 0,0x9083, 0, 0, + 0, 0, 0,0x8E74, 0,0x90C8, 0,0x91D1, +0x8B41, 0, 0,0x92A0, 0, 0,0x9BE6,0x9BE7, +0x8FED, 0, 0, 0, 0,0x9658, 0, 0, +0x9BEA, 0, 0,0x9BE9,0x9BE8,0x959D, 0,0x9BF1, + 0, 0, 0, 0,0x9679, 0,0x9BEB, 0, + 0, 0, 0, 0,0x9BED,0x968B, 0,0x9BEC, + 0, 0, 0, 0, 0, 0, 0,0x9BEE, + 0,0x94A6,0x9BEF,0x95BC,0x9BF0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x8AB1,0x95BD,0x944E,0x9BF2,0x9BF3, 0, +0x8D4B,0x8AB2,0x9BF4,0x8CB6,0x9763,0x9748,0x8AF4,0x9BF6, + 0,0x92A1, 0,0x8D4C,0x8FAF, 0, 0,0x94DD, + 0, 0,0x8FB0, 0, 0, 0, 0,0x8F98, + 0, 0, 0, 0, 0,0x92EA,0x95F7,0x9358, + 0, 0,0x8D4D, 0,0x957B, 0, 0, 0, +0x9BF7, 0, 0, 0, 0, 0,0x9378,0x8DC0, + 0, 0, 0,0x8CC9, 0,0x92EB, 0, 0, + 0, 0, 0, 0, 0,0x88C1,0x8F8E,0x8D4E, +0x9766, 0, 0, 0, 0, 0, 0, 0, + 0,0x9BF8,0x9BF9,0x9470, 0, 0, 0, 0, +0x9BFA,0x97F5,0x984C, 0, 0, 0, 0,0x9BFC, +0x9BFB, 0, 0,0x8A66, 0, 0,0x9C40, 0, + 0, 0,0x9C43,0x9C44, 0,0x9C42, 0,0x955F, +0x8FB1,0x9C46,0x9C45,0x9C41, 0, 0, 0, 0, +0x9C47,0x9C48, 0, 0,0x9C49, 0, 0, 0, +0x9C4C,0x9C4A, 0,0x9C4B,0x9C4D, 0,0x8984,0x92EC, +0x9C4E, 0,0x8C9A,0x89F4,0x9455, 0,0x9C4F,0x93F9, + 0,0x95D9, 0,0x9C50,0x984D, 0, 0, 0, + 0,0x9C51,0x95BE,0x9C54,0x989F,0x98AF, 0,0x8EAE, +0x93F3,0x9C55, 0,0x8B7C,0x92A2,0x88F8,0x9C56,0x95A4, +0x8D4F, 0, 0,0x926F, 0, 0, 0,0x92ED, + 0, 0, 0, 0, 0,0x96ED,0x8CB7,0x8CCA, + 0,0x9C57, 0, 0, 0,0x9C58, 0,0x9C5E, + 0,0x8EE3, 0, 0, 0,0x92A3, 0,0x8BAD, +0x9C59, 0, 0, 0,0x954A, 0,0x9265, 0, + 0,0x9C5A, 0, 0, 0, 0, 0, 0, +0x9C5B, 0,0x8BAE, 0,0x9C5C, 0,0x9C5D, 0, + 0,0x9C5F, 0,0x9396, 0, 0,0x9C60,0x9C61, + 0,0x9C62, 0, 0,0x9C53,0x9C52, 0, 0, + 0,0x9C63,0x8C60, 0, 0, 0,0x9546, 0, + 0,0x8DCA,0x9556,0x92A4,0x956A,0x9C64, 0, 0, +0x8FB2,0x8965, 0,0x9C65, 0, 0, 0,0x9C66, + 0,0x96F0, 0, 0,0x94DE, 0, 0,0x9C69, +0x899D,0x90AA,0x9C68,0x9C67,0x8C61,0x91D2, 0,0x9C6D, +0x9C6B, 0,0x9C6A,0x97A5,0x8CE3, 0, 0, 0, +0x8F99,0x9C6C,0x936B,0x8F5D, 0, 0, 0,0x93BE, +0x9C70,0x9C6F, 0, 0, 0, 0,0x9C6E, 0, +0x9C71,0x8CE4, 0, 0, 0, 0, 0, 0, +0x9C72,0x959C,0x8F7A, 0, 0,0x9C73,0x94F7, 0, + 0, 0, 0,0x93BF,0x92A5, 0, 0, 0, + 0,0x934F, 0, 0,0x9C74,0x8B4A, 0, 0, + 0, 0, 0,0x9053, 0,0x954B, 0, 0, + 0, 0, 0, 0,0x8AF5,0x9445, 0, 0, + 0, 0, 0, 0, 0, 0,0x9C75,0x8E75, +0x9659,0x965A, 0, 0,0x899E,0x9C7A, 0, 0, +0x9289, 0, 0, 0,0x9C77, 0, 0, 0, + 0, 0, 0,0x89F5, 0, 0, 0, 0, +0x9CAB,0x9C79, 0, 0, 0,0x944F, 0, 0, +0x9C78, 0, 0,0x9C76, 0,0x8D9A, 0,0x9C7C, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x9C83,0x9C89, +0x9C81, 0,0x937B, 0, 0,0x9C86,0x957C, 0, + 0,0x9C80, 0,0x9C85,0x97E5,0x8E76, 0, 0, +0x91D3,0x9C7D, 0, 0, 0,0x8B7D,0x9C88,0x90AB, +0x8985,0x9C82,0x89F6,0x9C87, 0, 0, 0,0x8BAF, + 0,0x9C84, 0, 0, 0, 0, 0, 0, + 0, 0,0x9C8A, 0, 0, 0, 0, 0, + 0,0x9C8C,0x9C96,0x9C94, 0, 0,0x9C91, 0, + 0, 0,0x9C90,0x97F6, 0,0x9C92, 0, 0, +0x8BB0, 0,0x8D50, 0, 0,0x8F9A, 0, 0, + 0,0x9C99,0x9C8B, 0, 0, 0, 0,0x9C8F, +0x9C7E, 0,0x89F8,0x9C93,0x9C95,0x9270, 0, 0, +0x8DA6,0x89B6,0x9C8D,0x9C98,0x9C97,0x8BB1, 0,0x91A7, +0x8A86, 0, 0, 0, 0,0x8C62, 0,0x9C8E, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x9C9A, 0,0x9C9D,0x9C9F, 0, 0, 0, + 0,0x8EBB, 0,0x9CA5,0x92EE,0x9C9B, 0, 0, + 0, 0,0x9CA3, 0,0x89F7, 0,0x9CA1,0x9CA2, + 0, 0,0x9C9E,0x9CA0, 0, 0, 0,0x8CE5, +0x9749, 0, 0,0x8AB3, 0, 0,0x8978,0x9CA4, + 0,0x9459,0x88AB, 0, 0, 0, 0, 0, + 0, 0,0x94DF,0x9C7B,0x9CAA,0x9CAE,0x96E3, 0, +0x9CA7, 0, 0, 0,0x9389,0x9CAC, 0, 0, + 0, 0, 0, 0, 0,0x8FEE,0x9CAD,0x93D5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x9866, 0,0x9CA9, 0, 0, 0, 0, +0x9CAF, 0,0x8D9B, 0,0x90C9, 0, 0,0x88D2, +0x9CA8,0x9CA6, 0,0x9179, 0, 0, 0,0x9C9C, +0x8E53, 0, 0, 0, 0, 0, 0, 0, +0x91C4,0x9CBB, 0,0x917A,0x9CB6, 0,0x9CB3,0x9CB4, + 0,0x8EE4,0x9CB7,0x9CBA, 0, 0, 0, 0, +0x9CB5,0x8F44, 0,0x9CB8, 0, 0,0x9CB2, 0, +0x96FA,0x96F9, 0, 0, 0,0x9CBC,0x9CBD,0x88D3, + 0, 0, 0, 0, 0,0x9CB1, 0, 0, + 0, 0,0x8BF0,0x88A4, 0, 0, 0,0x8AB4, + 0,0x9CB9, 0, 0, 0, 0, 0,0x9CC1, +0x9CC0, 0, 0, 0,0x9CC5, 0, 0, 0, + 0, 0, 0, 0,0x9CC6, 0, 0, 0, + 0, 0, 0, 0,0x9CC4,0x9CC7,0x9CBF,0x9CC3, + 0, 0,0x9CC8, 0,0x9CC9, 0, 0,0x9CBE, +0x8E9C, 0,0x9CC2,0x91D4,0x8D51,0x9CB0,0x9054, 0, + 0, 0, 0,0x9CD6, 0,0x95E7, 0, 0, +0x9CCC,0x9CCD,0x9CCE, 0, 0,0x9CD5, 0,0x9CD4, + 0, 0,0x969D,0x8AB5, 0,0x9CD2, 0,0x8C64, +0x8A53, 0, 0,0x9CCF, 0, 0,0x97B6,0x9CD1, +0x88D4,0x9CD3, 0,0x9CCA,0x9CD0,0x9CD7,0x8C63,0x9CCB, + 0, 0, 0, 0, 0, 0,0x977C, 0, + 0, 0,0x974A, 0, 0, 0, 0,0x9CDA, + 0, 0,0x9CDE, 0, 0, 0,0x919E, 0, +0x97F7,0x9CDF, 0, 0,0x9CDC, 0,0x9CD9, 0, + 0,0x9CD8,0x9CDD, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x95AE, 0, 0,0x93B2, + 0,0x8C65, 0,0x9CE0,0x9CDB, 0,0x9CE1, 0, + 0, 0,0x8C9B, 0, 0, 0,0x89AF, 0, + 0, 0,0x9CE9, 0, 0, 0,0x8AB6, 0, + 0, 0, 0,0x9CE7, 0, 0,0x9CE8,0x8DA7, +0x9CE6,0x9CE4,0x9CE3,0x9CEA,0x9CE2,0x9CEC, 0, 0, +0x89F9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x9CEE, 0, 0,0x9CED, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x92A6, 0,0x9CF1, 0,0x9CEF,0x9CE5, +0x8C9C, 0,0x9CF0, 0,0x9CF4,0x9CF3,0x9CF5,0x9CF2, +0x9CF6, 0, 0, 0, 0, 0, 0, 0, +0x9CF7,0x9CF8,0x95E8, 0,0x9CFA,0x9CF9,0x8F5E, 0, +0x90AC,0x89E4,0x89FA, 0,0x9CFB, 0,0x88BD, 0, + 0, 0,0x90CA,0x9CFC, 0,0xE6C1,0x9D40,0x8C81, + 0,0x9D41, 0, 0, 0, 0,0x90ED, 0, + 0, 0,0x9D42, 0, 0, 0,0x9D43,0x8B59, +0x9D44, 0,0x9D45,0x9D46,0x91D5, 0, 0, 0, +0x8CCB, 0, 0,0x96DF, 0, 0, 0,0x965B, +0x8F8A,0x9D47, 0, 0, 0, 0, 0,0x90EE, +0xE7BB,0x94E0, 0,0x8EE8, 0,0x8DCB,0x9D48, 0, + 0, 0, 0,0x91C5, 0,0x95A5, 0, 0, +0x91EF, 0, 0,0x9D4B, 0, 0,0x9D49, 0, +0x9D4C, 0, 0,0x9D4A, 0, 0, 0, 0, +0x9D4D, 0, 0, 0, 0, 0,0x95AF, 0, + 0,0x88B5, 0, 0, 0, 0,0x957D, 0, + 0,0x94E1, 0, 0,0x9D4E, 0,0x9D51,0x8FB3, +0x8B5A, 0,0x9D4F,0x9D56,0x8FB4, 0, 0, 0, + 0,0x9D50,0x9463, 0, 0, 0, 0, 0, + 0,0x977D,0x9D52,0x9D53,0x9D57,0x938A,0x9D54,0x8D52, +0x90DC, 0, 0,0x9D65,0x94B2, 0,0x91F0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x94E2,0x9DAB, 0, 0, 0, + 0,0x95F8, 0, 0, 0,0x92EF, 0, 0, + 0,0x9695, 0,0x9D5A,0x899F,0x928A, 0, 0, + 0, 0,0x9D63, 0, 0,0x9253,0x9D5D,0x9D64, +0x9D5F,0x9D66,0x9D62, 0,0x9D61,0x948F, 0,0x9D5B, +0x89FB,0x9D59,0x8B91,0x91F1,0x9D55, 0, 0,0x9D58, +0x8D53,0x90D9, 0,0x8FB5,0x9D60,0x9471, 0, 0, +0x8B92,0x8A67, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x8A87,0x9040,0x9D68,0x9D6D, + 0,0x9D69, 0,0x8C9D, 0,0x9D6E,0x8E41,0x8D89, + 0, 0, 0, 0, 0, 0,0x8F45,0x9D5C, + 0,0x8E9D,0x9D6B, 0, 0, 0, 0,0x8E77, +0x9D6C,0x88C2, 0, 0,0x9D67, 0, 0, 0, + 0,0x92A7, 0, 0, 0, 0, 0, 0, + 0,0x8B93, 0, 0, 0, 0, 0,0x8BB2, + 0, 0, 0, 0, 0, 0, 0,0x9D6A, +0x88A5, 0, 0,0x8DC1, 0, 0, 0,0x9055, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x92F0, 0, 0,0x94D2,0x9D70,0x917D, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x91A8, 0, 0,0x8E4A,0x9D71, 0,0x9D73, +0x9D6F, 0, 0, 0, 0,0x95DF, 0,0x92BB, + 0, 0, 0, 0,0x917B, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x95F9, +0x8ECC,0x9D80, 0,0x9D7E, 0, 0,0x9098, 0, + 0, 0,0x8C9E, 0, 0, 0,0x9D78,0x8FB7, + 0, 0,0x93E6,0x9450, 0, 0, 0, 0, +0x9D76, 0, 0,0x917C, 0, 0, 0, 0, +0x8EF6,0x9D7B, 0, 0,0x8FB6, 0,0x9D75,0x9D7A, + 0, 0,0x9472, 0, 0, 0,0x9D74, 0, +0x8C40, 0, 0,0x8A7C, 0, 0, 0,0x9D7C, +0x97A9,0x8DCC,0x9254,0x9D79, 0,0x90DA, 0,0x8D54, +0x9084,0x8986,0x915B,0x9D77,0x8B64, 0, 0, 0, + 0, 0,0x8C66, 0,0x92CD,0x9D7D, 0, 0, + 0, 0, 0,0x917E, 0, 0,0x9D81, 0, +0x9D83, 0, 0,0x91B5,0x9D89, 0,0x9D84, 0, + 0,0x9D86, 0, 0, 0, 0, 0,0x9560, +0x92F1, 0,0x9D87, 0, 0, 0,0x974B, 0, + 0, 0,0x9767,0x8AB7, 0, 0, 0, 0, + 0,0x88AC, 0,0x9D85, 0, 0, 0, 0, + 0,0x9D82, 0, 0, 0, 0,0x8AF6, 0, + 0, 0, 0, 0,0x8987, 0,0x9D88, 0, + 0, 0,0x9768, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x9D8C, 0, + 0, 0, 0, 0, 0,0x91B9, 0,0x9D93, + 0, 0, 0,0x9D8D, 0, 0,0x9D8A,0x9D91, + 0, 0, 0, 0,0x9D72, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x9D8E, 0, +0x9D92, 0, 0, 0,0x94C0,0x938B, 0, 0, + 0, 0, 0, 0,0x9D8B, 0,0x9D8F, 0, + 0, 0,0x8C67, 0, 0, 0,0x8DEF, 0, + 0, 0,0x90DB, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x9D97, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9345, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x9D94, + 0,0x9680, 0, 0, 0, 0, 0,0x9D95, + 0, 0, 0, 0, 0, 0,0x9D96, 0, +0x96CC, 0,0x90A0, 0, 0, 0, 0, 0, + 0, 0, 0,0x8C82, 0, 0, 0, 0, +0x9D9D, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x8E54,0x9D9A, 0,0x9D99, 0, 0, + 0, 0,0x9451, 0, 0, 0,0x93B3, 0, + 0, 0, 0, 0,0x9350,0x9D9B, 0, 0, + 0,0x9D9C, 0,0x958F, 0,0x9464,0x8E42, 0, +0x90EF, 0,0x966F, 0, 0, 0, 0, 0, + 0,0x8A68, 0,0x9DA3,0x9D9E, 0, 0, 0, + 0,0x9769,0x9DA5, 0, 0,0x9DA1, 0,0x9DA2, + 0, 0, 0, 0, 0,0x9180, 0, 0, + 0, 0,0x9DA0, 0,0x9D5E, 0, 0, 0, +0x9DA4, 0,0x9D9F, 0, 0, 0, 0, 0, +0x9DA9,0x9DAA,0x9346,0x9DAC, 0, 0,0x8E43,0x9DA7, + 0, 0, 0, 0,0x8B5B, 0, 0,0x9DAD, + 0,0x9DA6,0x9DB1, 0,0x9DB0, 0,0x9DAF, 0, + 0, 0,0x9DB2, 0, 0,0x9DB4,0x8FEF, 0, +0x9DB3, 0, 0, 0, 0,0x9DB7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9DB5, 0, 0, 0,0x9DB6,0x9D90, 0, 0, + 0, 0, 0,0x9DB9,0x9DB8, 0, 0, 0, + 0, 0,0x9D98,0x9DBA,0x9DAE, 0, 0,0x8E78, + 0, 0, 0, 0,0x9DBB,0x9DBC,0x9DBE,0x9DBD, +0x9DBF,0x89FC, 0,0x8D55, 0, 0,0x95FA,0x90AD, + 0, 0, 0, 0, 0,0x8CCC, 0, 0, +0x9DC1, 0, 0, 0, 0,0x9DC4, 0,0x9571, + 0,0x8B7E, 0, 0, 0,0x9DC3,0x9DC2,0x9473, +0x9DC5,0x8BB3, 0, 0, 0,0x9DC7,0x9DC6, 0, + 0, 0,0x8AB8,0x8E55, 0, 0,0x93D6, 0, + 0, 0, 0, 0,0x8C68, 0, 0, 0, +0x9094, 0,0x9DC8, 0,0x90AE,0x9347, 0,0x957E, +0x9DC9, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x9DCA,0x9DCB, 0, 0, 0,0x95B6, +0x9B7C,0x90C4, 0, 0,0x956B, 0,0x8DD6, 0, +0x94E3,0x94C1, 0, 0, 0, 0, 0,0x936C, + 0,0x97BF, 0,0x9DCD,0x8ECE, 0, 0,0x9DCE, + 0,0x88B4, 0, 0,0x8BD2,0x90CB, 0,0x9580, + 0, 0, 0,0x9DCF,0x8E61,0x9266, 0,0x8E7A, +0x9056, 0, 0, 0, 0, 0, 0,0x9DD0, + 0,0x95FB, 0, 0,0x8997,0x8E7B, 0, 0, + 0,0x9DD3, 0,0x9DD1,0x9DD4,0x97B7,0x9DD2, 0, + 0, 0, 0,0x90F9,0x9DD5, 0, 0,0x91B0, + 0, 0,0x9DD6, 0, 0, 0, 0,0x8AF8, + 0,0x9DD8, 0,0x9DD7, 0, 0, 0, 0, +0x9DD9,0x9DDA,0x8AF9, 0, 0,0x93FA,0x9255,0x8B8C, +0x8E7C,0x9181, 0, 0,0x8F7B,0x88AE, 0, 0, + 0,0x9DDB, 0, 0, 0, 0, 0, 0, + 0, 0,0x89A0,0x9DDF, 0, 0, 0, 0, + 0, 0,0x8D56,0x9DDE, 0, 0,0x8DA9,0x8FB8, + 0, 0,0x9DDD, 0,0x8FB9, 0,0x96BE,0x8DA8, + 0, 0, 0,0x88D5,0x90CC, 0, 0, 0, + 0, 0, 0, 0,0x9DE4, 0, 0,0x90AF, +0x8966, 0, 0, 0, 0,0x8F74, 0,0x9686, +0x8DF0, 0, 0, 0, 0,0x8FBA, 0,0x90A5, + 0, 0, 0, 0,0x9DE3,0x9DE1,0x9DE2, 0, + 0, 0, 0, 0,0x928B, 0, 0,0x9E45, + 0,0x9DE8,0x8E9E,0x8D57,0x9DE6, 0, 0, 0, + 0,0x9DE7, 0,0x9057, 0, 0, 0,0x9DE5, + 0, 0,0x8E4E, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x9DEA,0x9DE9,0x9DEE, + 0, 0,0x9DEF, 0,0x9DEB, 0,0x8A41,0x9DEC, +0x9DED,0x94D3, 0, 0, 0, 0,0x9581,0x8C69, +0x9DF0, 0, 0, 0,0x90B0, 0,0x8FBB, 0, + 0, 0,0x9271, 0, 0, 0, 0, 0, + 0,0x8BC5, 0,0x9DF1,0x9DF5, 0, 0,0x89C9, +0x9DF2,0x9DF4, 0, 0, 0, 0,0x9DF3, 0, + 0,0x8F8B, 0, 0, 0, 0,0x9267,0x88C3, +0x9DF6, 0, 0, 0, 0,0x9DF7, 0, 0, + 0, 0,0x92A8, 0, 0, 0,0x97EF, 0, + 0, 0, 0,0x8E62, 0, 0,0x95E9, 0, + 0, 0, 0, 0,0x965C, 0, 0, 0, +0x9E41,0x9DF9, 0, 0,0x9DFC, 0,0x9DFB, 0, + 0,0x9DF8, 0, 0,0x9E40, 0, 0,0x93DC, + 0,0x9DFA, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x9E42, 0, + 0,0x8F8C,0x9E43, 0,0x976A,0x9498, 0, 0, +0x9E44, 0, 0, 0, 0, 0,0x9E46, 0, + 0,0x9E47, 0, 0, 0, 0, 0, 0, +0x9E48, 0,0x8BC8,0x8967,0x8D58,0x9E49, 0,0x9E4A, +0x8F91,0x9182, 0, 0,0x99D6,0x915D,0x915C,0x91D6, +0x8DC5, 0, 0,0x98F0, 0, 0, 0, 0, +0x8C8E,0x974C, 0,0x95FC, 0,0x959E, 0,0x9E4B, + 0, 0, 0, 0,0x8DF1,0x92BD,0x9E4C,0x984E, + 0, 0, 0,0x965D, 0,0x92A9,0x9E4D,0x8AFA, + 0, 0, 0, 0, 0, 0,0x9E4E,0x9E4F, +0x96D8, 0,0x96A2,0x9696,0x967B,0x8E44,0x9E51, 0, + 0,0x8EE9, 0, 0,0x9670, 0,0x9E53,0x9E56, +0x9E55, 0,0x8AF7, 0, 0,0x8B80, 0,0x9E52, + 0,0x9E54, 0, 0, 0, 0,0x9E57, 0, + 0,0x9099, 0, 0, 0, 0,0x979B,0x88C7, +0x8DDE,0x91BA, 0,0x8EDB, 0, 0,0x8FF1, 0, + 0,0x9E5A, 0, 0,0x936D, 0,0x9E58,0x91A9, +0x9E59,0x8FF0,0x96DB,0x9E5B,0x9E5C,0x9788, 0, 0, + 0, 0,0x9E61, 0, 0,0x8D59, 0,0x9474, +0x9E5E,0x938C,0x9DDC,0x9DE0, 0,0x8B6E, 0,0x9466, + 0, 0, 0, 0,0x9E60, 0,0x8FBC,0x94C2, + 0, 0, 0, 0, 0,0x9E66, 0,0x94F8, + 0,0x9E5D, 0,0x9E63,0x9E62, 0, 0, 0, +0x90CD, 0, 0, 0, 0,0x968D, 0,0x97D1, + 0, 0,0x9687, 0,0x89CA,0x8E7D, 0, 0, +0x9867,0x9E65,0x9095, 0, 0, 0,0x9E64, 0, + 0,0x9E5F, 0, 0, 0, 0, 0,0x8CCD, + 0, 0, 0,0x9E6B,0x9E69, 0,0x89CB,0x9E67, +0x9E6D,0x9E73, 0, 0, 0, 0, 0, 0, + 0,0x91C6, 0, 0,0x95BF, 0,0x9E75, 0, + 0, 0,0x9541, 0, 0, 0,0x9E74,0x9490, +0x965E,0x8AB9, 0,0x90F5,0x8F5F, 0, 0, 0, +0x92D1, 0,0x974D, 0, 0,0x9E70,0x9E6F, 0, + 0, 0,0x9E71, 0,0x9E6E, 0, 0,0x9E76, + 0,0x9E6C, 0, 0,0x9E6A, 0,0x9E72,0x9E68, + 0,0x928C, 0,0x96F6,0x8EC4,0x8DF2, 0, 0, + 0, 0, 0,0x8DB8, 0, 0,0x968F,0x8A60, + 0, 0,0x92CC,0x93C8,0x8968, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x90F0, 0, 0,0x90B2,0x8C49, + 0, 0, 0, 0, 0, 0,0x9E78, 0, + 0,0x8D5A,0x8A9C, 0, 0, 0, 0, 0, + 0,0x9E7A,0x8A94,0x9E81, 0, 0, 0, 0, + 0, 0,0x9E7D, 0,0x90F1, 0, 0, 0, +0x8A6A,0x8DAA, 0, 0,0x8A69,0x8DCD, 0, 0, +0x9E7B,0x8C85,0x8C6A,0x938D, 0, 0,0x9E79, 0, +0x88C4, 0, 0, 0, 0,0x9E7C,0x9E7E, 0, +0x8BCB,0x8C4B, 0,0x8ABA,0x8B6A, 0, 0, 0, + 0,0x9E82, 0, 0,0x8DF7,0x9691, 0,0x8E56, + 0, 0, 0,0x9E83, 0, 0, 0,0x954F, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x9E8F, 0,0x89B1,0x9E84, + 0, 0, 0, 0, 0, 0,0x9E95,0x9E85, + 0,0x97C0, 0,0x9E8C, 0,0x947E, 0, 0, + 0, 0, 0, 0, 0,0x9E94, 0,0x9E87, + 0, 0, 0,0x88B2,0x9E89, 0, 0,0x8D5B, + 0, 0, 0,0x9E8B, 0,0x9E8A, 0,0x9E86, +0x9E91, 0,0x8FBD, 0, 0, 0,0x9AEB,0x8CE6, +0x979C, 0, 0, 0, 0,0x9E88, 0,0x92F2, +0x8A42,0x8DAB, 0,0x9E80, 0,0x9E90,0x8A81, 0, + 0,0x9E8E,0x9E92, 0,0x938E, 0, 0, 0, + 0, 0, 0, 0,0x8AFC, 0,0x9EB0, 0, + 0,0x96C7,0x9E97,0x8AFB, 0,0x9E9E, 0, 0, + 0, 0,0x965F, 0,0x9E9F,0x9EA1, 0,0x9EA5, +0x9E99, 0,0x9249, 0, 0, 0, 0,0x938F, +0x9EA9,0x9E9C, 0,0x9EA6, 0, 0, 0,0x9EA0, + 0, 0, 0, 0, 0, 0,0x9058,0x9EAA, + 0, 0,0x90B1, 0, 0, 0, 0, 0, + 0,0x9EA8,0x8ABB, 0, 0, 0, 0, 0, +0x986F,0x9E96, 0, 0,0x9EA4,0x88D6, 0, 0, +0x9E98, 0, 0,0x96B8,0x9E9D,0x9041,0x92C5,0x9E93, + 0, 0,0x9EA3, 0, 0, 0, 0, 0, + 0,0x909A,0x9EAD,0x8A91,0x8C9F, 0, 0, 0, + 0,0x9EAF,0x9E9A,0x9EAE, 0,0x9EA7,0x9E9B, 0, +0x9EAB, 0,0x9EAC, 0, 0, 0, 0, 0, +0x9EBD, 0, 0, 0,0x93CC, 0,0x9EA2, 0, + 0,0x9EB9, 0, 0, 0,0x9EBB, 0,0x92D6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x976B, 0, 0, 0, 0, 0, + 0, 0, 0,0x9596,0x9EB6,0x91C8, 0, 0, + 0,0x9EBC,0x915E, 0,0x9EB3,0x9EC0,0x9EBF, 0, +0x93ED,0x9EBE,0x93E8, 0, 0, 0, 0, 0, + 0, 0,0x9EC2,0x9EB5, 0,0x8BC6,0x9EB8,0x8F7C, + 0, 0, 0,0x9480,0x9EBA,0x8BC9, 0,0x9EB2, +0x9EB4,0x9EB1, 0, 0,0x984F,0x8A79,0x9EB7, 0, + 0,0x9EC1,0x8A54, 0, 0, 0, 0, 0, + 0, 0,0x8DE5, 0, 0, 0,0x897C, 0, + 0,0x9ED2, 0, 0,0x9850,0x9ED5, 0, 0, + 0, 0, 0,0x9059,0x9ED4, 0, 0, 0, +0x9ED3, 0, 0, 0, 0, 0, 0,0x9ED0, + 0, 0, 0, 0, 0, 0,0x9EC4, 0, + 0,0x9EE1,0x9EC3, 0,0x9ED6, 0, 0, 0, + 0, 0, 0,0x9ECE, 0, 0,0x9EC9,0x9EC6, + 0,0x9EC7, 0,0x9ECF, 0, 0, 0,0xEAA0, + 0, 0,0x9ECC,0x8D5C,0x92C6,0x9184,0x9ECA, 0, +0x9EC5, 0, 0,0x9EC8, 0, 0, 0, 0, +0x976C,0x968A, 0, 0, 0,0x9ECD,0x9ED7, 0, + 0, 0, 0, 0, 0, 0, 0,0x9EDF, +0x9ED8, 0, 0,0x9EE5, 0,0x9EE3, 0, 0, + 0, 0,0x9EDE, 0, 0, 0, 0, 0, + 0,0x9EDD, 0,0x92CE, 0,0x9185, 0,0x9EDB, + 0, 0,0x9ED9, 0, 0,0x9EE0, 0, 0, + 0, 0,0x9EE6,0x94F3,0x9EEC, 0, 0, 0, + 0, 0,0x9EE7,0x9EEA,0x9EE4, 0, 0,0x9294, + 0,0x9557, 0,0x9EDA, 0, 0,0x9EE2,0x8FBE, + 0,0x96CD,0x9EF6,0x9EE9, 0, 0, 0, 0, + 0,0x8CA0,0x89A1,0x8A7E, 0, 0,0x9ED1, 0, + 0, 0, 0, 0, 0,0x8FBF,0x9EEE, 0, +0x9EF5,0x8EF7,0x8A92, 0, 0,0x924D, 0, 0, + 0, 0, 0, 0,0x9EEB, 0, 0,0x9EF0, +0x9EF4, 0, 0,0x8BB4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8B6B,0x9EF2, 0, 0, 0, 0, 0,0x8B40, + 0,0x93C9,0x9EF1, 0, 0, 0,0x9EF3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x9EED, 0, 0, 0, 0, 0, +0x9EEF, 0, 0, 0, 0, 0, 0,0x8A80, +0x9268, 0, 0, 0,0x9EFA, 0, 0, 0, + 0, 0, 0, 0, 0,0x9EF8,0x8CE7, 0, +0x9EF7, 0, 0, 0, 0, 0, 0,0x9F40, + 0, 0, 0, 0,0x9E77, 0, 0, 0, +0x9EF9, 0,0x9EFB,0x9EFC, 0, 0, 0, 0, + 0, 0,0x9F4B, 0,0x9F47, 0,0x9E8D, 0, + 0, 0, 0,0x9F46, 0, 0, 0, 0, +0x9F45, 0, 0,0x9F42, 0, 0, 0, 0, + 0,0x9EE8,0x9F44,0x9F43, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x9F49, 0,0x9845, 0, 0, 0, 0, + 0, 0,0x9F4C,0x8BF9, 0, 0,0x9F48,0x9F4A, + 0, 0, 0, 0, 0, 0, 0, 0, +0x94A5, 0,0x9F4D, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x9F51,0x9F4E, 0, 0, 0, 0, + 0, 0, 0, 0,0x9793,0x9F4F, 0, 0, + 0, 0,0x9EDC, 0, 0, 0, 0, 0, + 0, 0,0x9F52, 0, 0, 0,0x9F53, 0, + 0, 0, 0, 0, 0,0x8954, 0,0x9F55, +0x8C87,0x8E9F, 0,0x8BD3, 0, 0, 0,0x89A2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x977E, 0, 0, 0, 0,0x9F57, +0x9F56,0x9F59,0x8B5C, 0, 0,0x8BD4,0x8ABC, 0, + 0, 0, 0,0x9F5C, 0, 0, 0,0x9F5B, + 0,0x9F5D, 0, 0,0x89CC, 0,0x9256, 0, +0x9F5E, 0, 0,0x8ABD,0x9F60, 0, 0, 0, + 0,0x9F5F, 0,0x9F61, 0, 0, 0,0x9F62, + 0,0x9F63,0x8E7E,0x90B3,0x8D9F, 0,0x9590, 0, + 0,0x95E0,0x9863, 0, 0, 0, 0,0x8E95, + 0, 0, 0,0x8DCE,0x97F0, 0, 0, 0, +0x9F64,0x9F65, 0,0x8E80, 0, 0, 0,0x9F66, +0x9F67, 0, 0,0x9F69,0x9F68, 0,0x9677, 0, + 0,0x8F7D,0x8EEA,0x8E63, 0,0x9F6A, 0, 0, + 0, 0, 0, 0, 0,0x9F6C,0x9042, 0, +0x9F6B, 0, 0, 0, 0, 0,0x9F6D, 0, + 0, 0, 0, 0,0x9F6E, 0, 0, 0, + 0, 0,0x9F6F,0x9F70, 0, 0, 0,0x9F71, + 0,0x9F73,0x9F72,0x9F74,0x89A3,0x9269, 0,0x9F75, + 0, 0,0x8E45,0x8A6B,0x9F76, 0, 0,0x9361, +0x9ACA, 0, 0, 0, 0,0x8B42,0x9F77, 0, + 0, 0, 0,0x9F78, 0,0x95EA,0x9688, 0, + 0, 0,0x93C5,0x9F79,0x94E4, 0, 0, 0, +0x94F9, 0, 0,0x96D1, 0, 0, 0,0x9F7A, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x9F7C,0x9F7B, 0, 0,0x9F7E, + 0, 0, 0,0x9F7D, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9F81, 0, 0, 0, 0, 0, 0,0x8E81, + 0,0x96AF, 0,0x9F82,0x9F83, 0, 0,0x8B43, + 0, 0, 0,0x9F84, 0, 0, 0, 0, + 0, 0, 0,0x9F86,0x9F85, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x9085, 0, 0,0x9558, +0x8969, 0, 0, 0, 0, 0,0x94C3, 0, +0x92F3,0x8F60,0x8B81, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x94C4, 0, +0x8EAC, 0, 0, 0, 0,0x9F88, 0,0x8ABE, + 0, 0,0x8998, 0, 0,0x93F0,0x9F87,0x8D5D, +0x9272, 0,0x9F89, 0, 0, 0, 0, 0, +0x9F91, 0,0x9F8A, 0, 0, 0, 0, 0, +0x91BF, 0,0x8B82,0x9F92, 0, 0, 0, 0, + 0, 0,0x8C88, 0, 0,0x8B44,0x9F90, 0, + 0,0x9F8E,0x9F8B,0x9780, 0, 0, 0, 0, +0x92BE, 0, 0, 0,0x93D7,0x9F8C, 0, 0, +0x9F94, 0,0x9F93,0x8C42, 0, 0,0x89AB, 0, + 0,0x8DB9,0x9F8D,0x9F8F, 0, 0, 0, 0, + 0,0x9676,0x91F2, 0, 0, 0, 0, 0, + 0, 0, 0,0x9697, 0, 0,0x9F9C, 0, + 0,0x9F9D, 0,0x89CD, 0, 0, 0, 0, +0x95A6,0x96FB,0x9F9F,0x8EA1,0x8FC0,0x9F98,0x9F9E,0x8988, + 0,0x8BB5, 0, 0,0x9F95,0x9F9A, 0, 0, + 0,0x90F2,0x9491, 0,0x94E5, 0, 0, 0, + 0, 0, 0,0x9F97, 0,0x9640, 0,0x9F99, + 0,0x9FA2, 0,0x9FA0, 0,0x9F9B, 0, 0, + 0,0x9641,0x9467,0x8B83, 0,0x9344, 0, 0, +0x928D, 0,0x9FA3, 0, 0, 0, 0,0x9FA1, +0x91D7,0x9F96, 0,0x896A, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x976D,0x9FAE, 0, 0, 0, + 0, 0,0x9FAD, 0, 0, 0, 0,0x90F4, + 0,0x9FAA, 0,0x978C, 0, 0,0x93B4,0x9FA4, + 0, 0, 0, 0, 0,0x92C3, 0, 0, + 0,0x896B,0x8D5E,0x9FA7, 0, 0, 0, 0, + 0, 0,0x8F46,0x9FAC, 0,0x9FAB,0x9FA6, 0, +0x9FA9, 0, 0,0x8A88, 0,0x9FA8,0x9468, 0, + 0,0x97AC, 0, 0,0x8FF2,0x90F3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x9FB4,0x9FB2, 0,0x956C, 0, 0, 0, + 0, 0, 0,0x9FAF,0x9FB1, 0,0x8959, 0, + 0,0x8D5F,0x9851, 0,0x8A5C, 0,0x9582, 0, + 0, 0, 0, 0,0x9781, 0, 0,0x8A43, +0x905A,0x9FB3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x9FB8, 0, 0, +0x8FC1, 0, 0, 0,0x974F, 0,0x9FB5, 0, + 0, 0, 0,0x9FB0, 0,0x9FB6, 0, 0, + 0,0x97DC, 0,0x9393,0x93C0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x8A55, + 0, 0,0x8974, 0, 0,0x9FBC, 0, 0, +0x9FBF, 0, 0, 0,0x97C1, 0, 0, 0, +0x9784, 0, 0, 0, 0,0x9FC6,0x9FC0,0x9FBD, + 0, 0, 0,0x97D2,0x9FC3, 0, 0, 0, + 0,0x8F69,0x9FC5, 0, 0,0x9FCA, 0, 0, +0x9391,0x9FC8, 0, 0, 0, 0,0x9FC2, 0, + 0,0x9257, 0, 0,0x9FC9, 0,0x9FBE, 0, +0x9FC4, 0,0x9FCB,0x88FA,0x9FC1, 0,0x9FCC, 0, + 0,0x905B, 0,0x8F7E, 0,0x95A3, 0,0x8DAC, + 0,0x9FB9,0x9FC7,0x9359, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x90B4, 0,0x8A89, +0x8DCF,0x8FC2,0x9FBB,0x8F61, 0, 0, 0, 0, + 0, 0, 0,0x8C6B, 0,0x9FBA, 0, 0, + 0,0x9FD0,0x8F8D,0x8CB8, 0,0x9FDF, 0,0x9FD9, +0x8B94,0x936E, 0,0x9FD4,0x9FDD,0x88AD,0x8951, 0, + 0,0x89B7, 0,0x9FD6,0x91AA,0x9FCD,0x9FCF,0x8D60, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9FE0, 0,0x9FDB, 0, 0, 0,0x9FD3, 0, + 0, 0, 0,0x9FDA, 0, 0, 0, 0, + 0, 0,0x96A9, 0, 0,0x9FD8,0x9FDC, 0, + 0, 0, 0, 0, 0, 0,0x8CCE, 0, +0x8FC3, 0, 0,0x9258, 0, 0, 0,0x9FD2, + 0, 0, 0, 0, 0, 0, 0,0x974E, + 0, 0, 0,0x9FD5, 0, 0,0x9FCE,0x9392, + 0, 0,0x9FD1, 0, 0, 0,0x9FD7, 0, + 0, 0, 0, 0, 0, 0,0x9870,0x8EBC, +0x969E, 0,0x9FE1, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x94AC, 0, 0,0x9FED, +0x8CB9, 0, 0, 0, 0, 0,0x8F80, 0, +0x9FE3, 0, 0, 0,0x97AD,0x8D61, 0,0x9FF0, + 0, 0,0x88EC, 0, 0,0x9FEE, 0, 0, + 0, 0,0x9FE2, 0, 0, 0, 0,0x9FE8, + 0, 0,0x9FEA, 0, 0, 0,0x976E,0x9FE5, + 0, 0,0x934D, 0, 0,0x9FE7, 0, 0, + 0, 0,0x9FEF, 0,0x9FE9,0x96C5, 0, 0, + 0,0x9FE4, 0,0x8EA0,0x9FFC, 0, 0, 0, + 0,0x8A8A, 0,0x9FE6,0x9FEB,0x9FEC, 0, 0, + 0, 0, 0, 0, 0,0x91EA,0x91D8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x9FF4, 0, 0,0x9FFA, + 0, 0,0x9FF8, 0,0x9348, 0, 0,0xE042, +0x9FF5, 0, 0, 0, 0, 0,0x9FF6,0x9FDE, + 0,0x8B99,0x9559, 0, 0, 0,0x8EBD, 0, + 0,0x8D97, 0, 0, 0, 0, 0,0x9852, + 0,0x9FF2, 0,0xE041,0x8989,0x9186, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9499, 0,0x8ABF,0x97F8, 0, 0, 0, 0, + 0, 0, 0,0x969F,0x92D0, 0, 0, 0, + 0,0x9FF9,0x9FFB, 0, 0, 0, 0, 0, +0x9151, 0, 0, 0, 0, 0,0xE040,0x9FF7, + 0,0x9FF1, 0, 0, 0,0x8AC1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x8C89, 0, 0, 0, +0xE04E, 0, 0,0xE049,0x90F6, 0, 0,0x8A83, + 0, 0, 0, 0,0x8F81, 0,0xE052, 0, + 0, 0, 0, 0, 0,0xE04B,0x92AA,0xE048, +0x92D7, 0, 0, 0,0xE06B, 0, 0, 0, +0xE045, 0,0xE044, 0,0xE04D, 0, 0, 0, +0xE047,0xE046,0xE04C, 0,0x909F, 0,0xE043, 0, + 0, 0, 0, 0, 0, 0,0xE04F, 0, + 0,0xE050, 0, 0, 0, 0, 0,0x8AC0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xE055, 0,0xE054,0xE056, 0, 0, 0, + 0, 0,0xE059, 0, 0, 0, 0, 0, + 0,0x9362, 0,0xE053, 0, 0, 0, 0, + 0,0xE057, 0, 0, 0, 0, 0, 0, +0x8C83,0x91F7,0xE051,0x945A, 0, 0,0xE058, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xE05D,0xE05B, 0, 0, +0xE05E, 0, 0,0xE061, 0, 0, 0,0xE05A, +0x8D8A,0x9447, 0, 0,0x9FB7, 0, 0, 0, + 0, 0, 0,0x9794,0xE05C, 0,0xE060,0x91F3, + 0,0xE05F, 0,0xE04A, 0, 0,0xE889, 0, + 0, 0,0xE064, 0, 0, 0,0xE068, 0, + 0,0xE066, 0, 0, 0, 0, 0, 0, + 0,0xE062, 0,0xE063, 0, 0, 0,0xE067, + 0,0xE065, 0, 0, 0,0x956D, 0, 0, +0xE06D, 0,0xE06A,0xE069, 0,0xE06C,0x93D2,0xE06E, + 0, 0, 0, 0, 0, 0,0x9295,0x91EB, + 0, 0, 0, 0,0x90A3, 0, 0, 0, +0xE06F, 0,0xE071, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE070, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x9FF3, 0, 0, 0, + 0,0xE072, 0, 0, 0, 0, 0, 0, +0x93E5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE073, 0, 0, 0, 0, + 0, 0, 0,0x89CE, 0, 0, 0,0x9394, +0x8A44, 0, 0, 0, 0, 0, 0, 0, +0x8B84, 0, 0, 0,0x8EDC,0x8DD0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x9846,0x9086, 0, 0, 0,0x898A, 0, + 0, 0,0xE075, 0, 0, 0, 0, 0, + 0,0xE074, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xE078,0x9259,0xE07B,0xE076, + 0, 0, 0,0xE07A, 0, 0, 0, 0, +0xE079,0x935F,0x88D7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x97F3, 0, 0,0xE07D, 0, 0, 0,0x8947, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xE080, 0, 0, 0,0xE07E, 0,0xE07C, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xE077, 0, 0, 0, 0, 0, 0, + 0,0x9642, 0, 0, 0,0xE082, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xE081, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x898B, 0, 0, 0, + 0,0xE084,0x95B0, 0,0xE083, 0, 0, 0, + 0,0x96B3, 0, 0, 0, 0,0x8FC5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x9152, 0, + 0, 0, 0, 0,0x8FC4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x97F9, 0, 0,0xE08A, 0,0x90F7, 0, + 0, 0, 0, 0, 0,0xE086,0xE08B, 0, + 0,0x898C, 0, 0, 0, 0, 0, 0, + 0, 0,0xE089, 0,0x9481,0xE085,0xE088,0x8FC6, + 0,0x94CF, 0, 0,0xE08C, 0,0x8ECF, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x90F8, 0, 0, + 0, 0, 0, 0,0xE08F, 0, 0, 0, +0xE087, 0,0x8C46, 0, 0, 0, 0,0xE08D, + 0, 0, 0, 0,0x976F,0xE090, 0, 0, + 0,0xEAA4, 0, 0, 0, 0, 0,0x8F6E, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE091, 0, 0, 0,0xE092, 0, 0, 0, + 0,0x944D, 0, 0, 0, 0, 0, 0, + 0,0xE094, 0, 0, 0, 0,0xE095, 0, + 0, 0, 0,0x9452, 0, 0, 0, 0, +0x9395,0xE097, 0, 0, 0, 0,0xE099, 0, +0x97D3, 0,0xE096, 0,0xE098,0x898D, 0,0xE093, + 0, 0, 0, 0, 0, 0, 0,0x9A7A, +0xE09A, 0, 0, 0, 0,0x9187,0x8E57,0xE09C, + 0, 0, 0, 0,0xE09B,0x9043,0x99D7, 0, + 0, 0, 0, 0, 0,0xE09D, 0, 0, + 0,0xE09F, 0,0xE08E,0xE09E, 0, 0,0xE0A0, + 0, 0, 0, 0, 0, 0,0x949A, 0, + 0, 0, 0, 0, 0,0xE0A1, 0, 0, +0xE0A2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE0A3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE0A4, 0,0x92DC, 0,0xE0A6,0xE0A5, 0, 0, +0xE0A7, 0,0xE0A8, 0, 0,0x8EDD,0x9583, 0, + 0, 0,0x96EA,0xE0A9,0xE0AA,0x9175,0x8EA2,0xE0AB, +0xE0AC, 0, 0, 0, 0, 0,0xE0AD,0x95D0, +0x94C5, 0, 0,0xE0AE,0x9476, 0, 0, 0, + 0, 0,0x92AB, 0, 0, 0, 0, 0, +0xE0AF,0x89E5, 0,0x8B8D, 0,0x96C4, 0,0x96B4, + 0,0x89B2,0x9853, 0, 0, 0, 0,0x9671, + 0,0x95A8, 0, 0, 0, 0, 0, 0, + 0, 0,0x90B5, 0,0xE0B0, 0, 0, 0, + 0,0x93C1, 0, 0, 0,0x8CA1,0xE0B1, 0, +0x8DD2,0xE0B3,0xE0B2, 0, 0, 0, 0,0xE0B4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xE0B5, 0, 0, 0,0xE0B6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8B5D, 0,0xE0B7, 0, 0, 0, 0,0xE0B8, + 0, 0, 0, 0,0x8CA2, 0, 0,0x94C6, + 0, 0,0xE0BA, 0, 0, 0,0x8FF3, 0, + 0,0xE0B9, 0, 0, 0, 0, 0, 0, + 0, 0,0x8BB6,0xE0BB,0xE0BD, 0,0xE0BC, 0, + 0, 0, 0, 0, 0, 0,0xE0BE, 0, +0x8CCF, 0,0xE0BF, 0, 0, 0, 0,0x8BE7, + 0,0x915F, 0,0x8D9D, 0, 0, 0, 0, +0xE0C1,0xE0C2,0xE0C0, 0, 0, 0, 0, 0, + 0,0x8EEB, 0, 0,0x93C6,0x8BB7, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE0C4, +0x924B,0xE0C3, 0, 0,0x9854,0x9482, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xE0C7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE0C9,0xE0C6, + 0, 0, 0,0x96D2,0xE0C8,0xE0CA, 0,0x97C2, + 0, 0, 0, 0, 0,0xE0CE, 0, 0, + 0,0xE0CD,0x9296,0x944C, 0, 0,0x8CA3,0xE0CC, + 0, 0, 0, 0,0xE0CB, 0,0x9750,0x9751, + 0, 0, 0, 0, 0, 0,0xE0CF,0x898E, + 0, 0, 0, 0,0x8D96,0x8E82, 0, 0, + 0, 0, 0, 0, 0, 0,0xE0D0,0xE0D1, + 0, 0, 0, 0, 0, 0, 0,0xE0D3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x8F62, 0, 0, 0, 0, +0xE0D5, 0,0xE0D4, 0, 0, 0, 0, 0, +0xE0D6, 0,0x8A6C, 0, 0,0xE0D8, 0, 0, +0xE0D7, 0,0xE0DA,0xE0D9, 0, 0, 0, 0, + 0, 0, 0, 0,0x8CBA, 0, 0,0x97A6, + 0,0x8BCA, 0,0x89A4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x8BE8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x8ADF, 0, 0, 0, 0, 0, 0, + 0, 0,0x97E6,0xE0DC, 0, 0, 0, 0, + 0, 0, 0,0xE0DE, 0, 0, 0, 0, +0xE0DF, 0,0x89CF, 0, 0, 0, 0, 0, +0xE0DB, 0,0x8E58, 0, 0,0x92BF,0xE0DD, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE0E2, 0, +0x8EEC, 0, 0, 0, 0,0xE0E0, 0, 0, + 0, 0,0x8C5D, 0, 0,0x94C7,0xE0E1, 0, + 0,0xE0FC, 0, 0, 0, 0, 0, 0, +0xE0E7, 0, 0, 0, 0, 0,0x8CBB, 0, + 0, 0, 0,0x8B85, 0,0xE0E4,0x979D, 0, + 0,0x97AE, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x91F4, 0, 0,0xE0E6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xE0E8,0x97D4,0x8BD5,0x94FA,0x9469, 0, + 0, 0,0xE0E9, 0, 0, 0, 0,0xE0EB, + 0,0xE0EE, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE0EA, 0, 0, + 0,0xE0ED,0x8CE8,0x896C,0xE0EF, 0,0x9090,0xE0EC, +0x97DA, 0, 0,0xE0F2,0xEAA2, 0, 0, 0, + 0,0xE0F0,0xE0F3, 0, 0, 0, 0,0xE0E5, +0xE0F1, 0, 0,0x8DBA, 0, 0,0xE0F4, 0, + 0, 0, 0, 0, 0, 0,0xE0F5, 0, + 0, 0, 0,0x979E, 0, 0, 0, 0, + 0, 0, 0,0xE0F6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE0F7, 0, + 0, 0,0xE0E3, 0, 0, 0, 0,0xE0F8, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8AC2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x8EA3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xE0F9, 0, 0, 0, 0,0xE0FA, + 0, 0, 0, 0,0xE0FB, 0, 0, 0, + 0, 0, 0, 0,0x895A, 0, 0, 0, +0xE140, 0,0x955A,0xE141, 0, 0,0x8AA2,0xE142, + 0,0xE143, 0, 0, 0, 0,0xE144, 0, +0xE146,0xE147,0xE145, 0, 0, 0,0x9572,0xE149, +0xE148, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE14B,0xE14A,0xE14C, 0, 0, + 0, 0, 0, 0,0xE14D,0xE14F,0xE14E, 0, + 0,0x8D99, 0,0xE151, 0,0xE150, 0, 0, +0x8AC3, 0,0x9072, 0,0x935B, 0,0xE152,0x90B6, + 0, 0, 0,0x8E59, 0,0x8999,0xE153, 0, +0x9770, 0, 0,0x95E1,0xE154, 0, 0, 0, +0x9363,0x9752,0x8D62,0x905C, 0, 0, 0,0x926A, +0x99B2, 0,0x92AC,0x89E6,0xE155, 0, 0, 0, + 0, 0, 0, 0,0xE156, 0,0xE15B, 0, + 0,0xE159,0xE158,0x9DC0,0x8A45,0xE157, 0,0x88D8, + 0,0x94A8, 0, 0,0x94C8, 0, 0, 0, + 0,0x97AF,0xE15C,0xE15A,0x927B,0x90A4, 0, 0, +0x94A9, 0,0x954C, 0,0xE15E,0x97AA,0x8C6C,0xE15F, + 0,0xE15D,0x94D4,0xE160, 0,0xE161, 0, 0, +0x88D9, 0, 0,0x8FF4,0xE166, 0,0xE163,0x93EB, +0xE162, 0, 0, 0, 0, 0, 0,0x8B45, + 0, 0,0xE169, 0, 0, 0,0xE164,0xE165, + 0,0xE168,0xE167,0x9544, 0, 0,0x9161,0x9160, + 0,0x8B5E, 0, 0,0xE16A, 0, 0, 0, + 0, 0,0xE16B, 0, 0,0xE16C, 0, 0, + 0, 0, 0,0xE16E, 0,0xE16D, 0, 0, + 0, 0, 0,0x8975, 0, 0, 0, 0, + 0,0xE176,0x94E6,0xE170, 0,0xE172, 0, 0, +0xE174,0x905D, 0, 0,0xE175,0xE173,0x8EBE, 0, + 0, 0,0xE16F,0xE171, 0,0x9561, 0,0x8FC7, + 0, 0,0xE178, 0, 0,0xE177, 0, 0, + 0, 0,0xE179, 0,0x8EA4,0x8DAD, 0, 0, +0x9397,0xE17A, 0,0x92C9, 0, 0,0xE17C, 0, + 0, 0,0x979F,0xE17B, 0, 0, 0, 0, + 0,0x9189, 0, 0, 0, 0, 0, 0, +0xE182, 0,0xE184,0xE185,0x9273, 0, 0, 0, + 0, 0,0xE183, 0,0xE180, 0,0xE17D,0xE17E, + 0,0xE181, 0, 0, 0, 0, 0, 0, + 0,0xE188, 0,0xE186, 0,0xE187, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE189, +0xE18B,0xE18C,0xE18D, 0,0xE18E, 0, 0,0xE18A, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE190, 0, 0, 0,0xE18F, 0, 0, 0, + 0, 0, 0,0xE191, 0, 0, 0, 0, + 0, 0,0x97C3, 0, 0, 0,0xE194,0xE192, +0xE193, 0, 0, 0,0x8AE0, 0, 0, 0, + 0, 0,0x96FC, 0, 0, 0,0x95C8, 0, +0xE196, 0, 0, 0,0xE195, 0, 0, 0, + 0,0xE197,0xE198, 0, 0, 0, 0,0xE19C, +0xE199,0xE19A,0xE19B, 0,0xE19D, 0, 0, 0, +0xE19E, 0,0xE19F, 0, 0, 0,0xE1A0, 0, +0xE1A1, 0,0x94AD,0x936F,0xE1A2,0x9492,0x9553, 0, +0xE1A3, 0, 0,0xE1A4,0x9349, 0,0x8A46,0x8D63, +0xE1A5, 0, 0,0xE1A6, 0, 0,0xE1A7, 0, +0x8E48, 0, 0,0xE1A9, 0, 0,0xE1A8, 0, + 0,0xE1AA,0xE1AB, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x94E7, 0, +0xE1AC, 0, 0, 0,0xE1AD, 0, 0,0xEA89, +0xE1AE,0xE1AF,0xE1B0, 0, 0, 0, 0,0x8E4D, + 0, 0,0xE1B1,0x9475, 0, 0,0x967E, 0, +0x896D, 0,0x8976, 0, 0,0xE1B2, 0, 0, + 0, 0,0xE1B4, 0, 0, 0,0xE1B3,0x9390, + 0, 0, 0,0x90B7,0x9F58, 0,0xE1B5,0x96BF, + 0,0xE1B6, 0,0x8AC4,0x94D5,0xE1B7, 0,0xE1B8, + 0, 0,0xE1B9, 0, 0, 0,0x96DA, 0, + 0, 0,0x96D3, 0,0x92BC, 0, 0, 0, +0x918A, 0, 0,0xE1BB, 0, 0,0x8F82, 0, + 0,0x8FC8, 0, 0,0xE1BE, 0, 0,0xE1BD, +0xE1BC,0x94FB, 0,0x8AC5,0x8CA7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE1C4, 0, 0,0xE1C1,0x905E, +0x96B0, 0, 0, 0,0xE1C0,0xE1C2,0xE1C3, 0, + 0,0xE1BF, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE1C5, +0xE1C6, 0,0x92AD, 0,0x8AE1, 0, 0, 0, +0x9285, 0, 0, 0, 0, 0, 0,0xE1C7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xE1C8,0xE1CB, 0, 0, 0, 0, + 0,0x9087, 0,0x93C2, 0,0xE1CC,0x9672, 0, +0xE1C9, 0, 0,0xE1CA, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xE1CF, 0, 0, 0, 0,0xE1CE,0xE1CD, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE1D1, 0, 0,0xE1D0, 0, + 0,0xE1D2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE1D4, 0, +0xE1D3, 0, 0, 0, 0,0x95CB, 0, 0, + 0, 0, 0, 0,0x8F75,0x97C4, 0, 0, +0xE1D5, 0, 0,0x93B5, 0, 0,0xE1D6, 0, + 0,0xE1D7, 0,0xE1DB,0xE1D9,0xE1DA, 0,0xE1D8, + 0, 0, 0, 0, 0, 0, 0,0xE1DC, + 0, 0, 0, 0, 0,0xE1DD, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE1DE, + 0, 0,0xE1DF,0x96B5,0xE1E0, 0, 0, 0, + 0, 0,0x96EE,0xE1E1, 0,0x926D, 0,0x948A, + 0,0x8BE9, 0, 0, 0,0x925A,0xE1E2,0x8BB8, + 0, 0, 0,0x90CE, 0, 0, 0, 0, + 0, 0, 0, 0,0xE1E3, 0, 0, 0, + 0, 0,0x8DBB, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xE1E4, 0, 0, 0, + 0, 0,0xE1E5, 0,0x8CA4,0x8DD3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE1E7, 0, 0, 0, 0,0x9375,0x8DD4,0x8B6D, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x9643, 0,0x946A, 0, 0, 0, + 0, 0,0x9376, 0, 0, 0, 0,0x8D7B, + 0, 0, 0, 0, 0,0xE1E9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x8FC9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x97B0,0x8D64, 0, 0,0x8CA5, + 0, 0,0x94A1, 0,0xE1EB, 0, 0, 0, + 0, 0, 0, 0,0xE1ED, 0, 0, 0, + 0,0x8CE9, 0, 0, 0, 0,0xE1EC,0x92F4, + 0, 0, 0, 0,0xE1EF,0x8A56,0xE1EA, 0, + 0,0x94E8, 0,0x894F, 0,0x8DEA, 0,0x9871, + 0, 0,0xE1EE, 0, 0, 0, 0, 0, + 0, 0, 0,0xE1F0, 0, 0, 0,0x95C9, + 0,0x90D7,0xE1F2, 0, 0, 0, 0,0xE1F3, + 0, 0, 0, 0, 0,0xE1F1, 0, 0, + 0, 0,0x8A6D, 0,0xE1F9, 0,0xE1F8, 0, + 0,0x8EA5, 0, 0, 0,0xE1FA,0xE1F5, 0, + 0, 0,0xE1FB,0xE1F6, 0, 0, 0, 0, +0x94D6,0xE1F4, 0, 0,0xE1F7, 0, 0, 0, + 0, 0,0xE241, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE240, +0x9681, 0, 0, 0,0xE1FC, 0, 0,0x88E9, + 0, 0, 0, 0,0xE243, 0, 0, 0, + 0, 0, 0, 0, 0,0xE242, 0, 0, + 0,0x8FCA, 0, 0, 0, 0, 0,0xE244, + 0, 0, 0, 0, 0, 0,0x9162, 0, + 0,0xE246,0xE245, 0, 0, 0, 0, 0, + 0,0xE247, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE1E6, 0, + 0, 0,0xE1E8,0xE249,0xE248, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x8EA6, 0,0x97E7, 0,0x8ED0, 0, +0xE24A,0x8C56, 0, 0, 0, 0, 0,0x8B5F, +0x8B46,0x8E83, 0, 0, 0, 0, 0, 0, +0x9753, 0, 0,0xE250, 0,0xE24F,0x9163,0xE24C, + 0, 0,0xE24E, 0, 0,0x8F6A,0x905F,0xE24D, +0xE24B, 0,0x9449, 0, 0,0x8FCB, 0, 0, +0x955B, 0, 0, 0, 0,0x8DD5, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x9398, + 0, 0,0xE251, 0, 0, 0, 0,0xE252, +0xE268,0x8BD6, 0, 0,0x985C,0x9154, 0, 0, + 0, 0,0xE253, 0, 0,0x89D0,0x92F5,0x959F, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE254, 0, 0, + 0, 0, 0, 0, 0, 0,0x8B9A,0xE255, + 0, 0,0xE257, 0, 0, 0,0xE258, 0, +0x9448, 0, 0,0xE259, 0, 0, 0, 0, + 0,0xE25A,0xE25B, 0, 0,0x8BD7,0x89D1,0x93C3, +0x8F47,0x8E84, 0, 0, 0, 0, 0, 0, + 0,0xE25C, 0,0x8F48, 0, 0, 0, 0, + 0,0x89C8,0x9562, 0, 0,0xE25D, 0, 0, +0x94E9, 0, 0, 0, 0, 0, 0,0x9164, + 0,0xE260, 0,0xE261,0x9489, 0,0x9060,0xE25E, + 0,0x9281, 0, 0,0xE25F, 0, 0, 0, +0x8FCC, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x88DA, 0, 0, 0, 0, +0x8B48, 0, 0, 0, 0, 0, 0, 0, +0xE262, 0, 0,0x92F6, 0,0xE263,0x90C5, 0, + 0, 0, 0, 0,0x96AB, 0, 0,0x9542, +0xE264,0xE265,0x9274, 0,0x97C5, 0, 0,0xE267, +0xE266, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x8EED, 0, + 0,0xE269,0x88EE, 0, 0, 0, 0,0xE26C, + 0, 0, 0,0xE26A,0x89D2,0x8C6D,0xE26B,0x8D65, +0x8D92, 0,0x95E4,0xE26D, 0, 0,0x9673, 0, + 0,0xE26F, 0, 0, 0,0x90CF,0x896E,0x89B8, +0x88AA, 0, 0, 0, 0, 0, 0,0xE26E, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xE270,0xE271,0x8FF5, 0, 0, 0, 0, + 0,0xE272, 0,0x8A6E, 0, 0, 0, 0, +0xE274, 0, 0, 0,0x8C8A, 0,0x8B86, 0, + 0,0xE275,0x8BF3, 0, 0,0xE276, 0,0x90FA, + 0,0x93CB, 0,0x90DE,0x8DF3, 0, 0, 0, +0xE277, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x9282,0x918B, 0,0xE279,0xE27B,0xE278, +0xE27A, 0, 0, 0, 0, 0, 0,0x8C41, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xE27C,0x8C45, 0, 0, 0,0x8B87,0x9771, +0xE27E, 0, 0, 0, 0, 0,0xE280, 0, + 0, 0,0x894D, 0, 0, 0, 0,0xE283, + 0, 0, 0,0x8A96,0xE282,0xE281, 0,0xE285, +0xE27D, 0,0xE286,0x97A7, 0,0xE287, 0,0xE288, + 0, 0,0x9AF2,0xE28A, 0,0xE289, 0, 0, + 0,0xE28B,0xE28C, 0,0x97B3,0xE28D, 0,0xE8ED, +0x8FCD,0xE28E,0xE28F,0x8F76, 0,0x93B6,0xE290, 0, + 0, 0,0x9247, 0, 0,0xE291, 0,0x925B, +0xE292, 0, 0, 0, 0, 0,0x8BA3, 0, +0x995E,0x927C,0x8EB1, 0, 0, 0, 0,0x8AC6, + 0, 0,0xE293, 0,0xE2A0, 0,0xE296, 0, +0x8B88, 0,0xE295,0xE2A2, 0, 0, 0,0xE294, + 0,0x8FCE, 0, 0, 0, 0, 0, 0, +0xE298,0xE299, 0,0x934A, 0, 0,0xE29A, 0, +0x8A7D, 0, 0, 0, 0,0x9079,0x9584, 0, +0xE29C, 0, 0, 0,0x91E6, 0, 0, 0, + 0, 0, 0,0xE297, 0,0xE29B,0xE29D, 0, + 0,0x8DF9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE2A4,0x954D, 0, +0x94A4,0x9399, 0,0x8BD8,0xE2A3,0xE2A1, 0,0x94B3, +0xE29E,0x927D,0x939B, 0,0x939A, 0,0x8DF4, 0, + 0, 0, 0, 0, 0,0xE2B6, 0, 0, + 0, 0, 0, 0, 0,0xE2A6, 0,0xE2A8, + 0, 0, 0, 0,0xE2AB, 0,0xE2AC, 0, +0xE2A9,0xE2AA, 0, 0,0xE2A7,0xE2A5, 0, 0, + 0, 0,0xE29F, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x95CD,0x89D3, + 0, 0, 0,0xE2B3, 0,0xE2B0, 0,0xE2B5, + 0, 0,0xE2B4, 0,0x9493,0x96A5, 0,0x8E5A, +0xE2AE,0xE2B7,0xE2B2, 0,0xE2B1,0xE2AD, 0,0xE2AF, + 0,0x8AC7, 0, 0, 0, 0, 0, 0, + 0, 0,0x925C, 0, 0,0x90FB, 0, 0, + 0,0x94A0, 0, 0,0xE2BC, 0, 0, 0, +0x94A2, 0, 0, 0, 0, 0, 0, 0, +0x90DF,0xE2B9, 0, 0,0x94CD, 0,0xE2BD,0x95D1, + 0,0x927A, 0,0xE2B8,0xE2BA, 0, 0,0xE2BB, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE2BE, 0, 0, +0x8EC2, 0, 0, 0,0x93C4,0xE2C3,0xE2C2, 0, + 0,0xE2BF, 0, 0, 0,0x9855, 0, 0, + 0, 0, 0,0xE2C8, 0, 0,0xE2CC,0xE2C9, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE2C5, 0, 0, 0, 0, 0, 0,0xE2C6, + 0, 0, 0, 0, 0,0xE2CB, 0, 0, + 0,0xE2C0,0x99D3,0xE2C7,0xE2C1, 0, 0,0xE2CA, + 0, 0, 0, 0, 0, 0, 0,0xE2D0, + 0,0x8AC8, 0,0xE2CD, 0, 0, 0,0xE2CE, + 0, 0,0xE2CF,0xE2D2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE2D1, +0x94F4, 0, 0, 0, 0,0xE2D3,0x97FA,0x95EB, +0xE2D8, 0, 0,0xE2D5, 0, 0, 0, 0, + 0, 0, 0, 0,0xE2D4,0x90D0, 0,0xE2D7, +0xE2D9, 0, 0, 0,0xE2D6, 0,0xE2DD, 0, +0xE2DA, 0, 0, 0, 0, 0, 0,0xE2DB, +0xE2C4, 0, 0, 0,0xE2DC,0xE2DE, 0, 0, + 0, 0, 0, 0,0xE2DF, 0, 0, 0, + 0, 0, 0,0x95C4, 0,0xE2E0, 0, 0, + 0, 0, 0, 0, 0, 0,0x96E0, 0, + 0,0x8BCC,0x8C48,0xE2E1, 0, 0, 0, 0, + 0,0x95B2, 0,0x9088, 0,0x96AE, 0, 0, +0xE2E2, 0,0x97B1, 0, 0,0x9494, 0,0x9165, +0x9453, 0, 0,0x8F6C, 0, 0, 0,0x88BE, + 0,0xE2E7,0xE2E5, 0,0xE2E3,0x8A9F, 0,0x8FCF, +0xE2E8, 0, 0,0xE2E6, 0,0xE2E4,0xE2EC, 0, + 0,0xE2EB,0xE2EA,0xE2E9, 0, 0, 0, 0, + 0,0xE2ED, 0, 0, 0,0xE2EE,0x90B8, 0, +0xE2EF, 0,0xE2F1, 0, 0,0xE2F0, 0, 0, + 0, 0,0x8CD0, 0, 0, 0,0x9157, 0, + 0, 0,0xE2F3, 0, 0, 0,0x939C, 0, +0xE2F2, 0, 0, 0,0xE2F4, 0,0x95B3,0x918C, +0x8D66, 0,0xE2F5, 0, 0, 0, 0,0x97C6, + 0, 0, 0, 0, 0, 0, 0,0xE2F7, + 0, 0,0xE2F8, 0,0xE2F9, 0,0xE2FA, 0, +0x8E85, 0,0xE2FB,0x8C6E, 0, 0,0x8B8A, 0, +0x8B49, 0,0xE340, 0,0x96F1,0x8D67,0xE2FC, 0, + 0, 0,0xE343,0x96E4, 0,0x945B, 0, 0, +0x9552, 0, 0, 0,0x8F83,0xE342, 0,0x8ED1, +0x8D68,0x8E86,0x8B89,0x95B4,0xE341, 0, 0, 0, +0x9166,0x9661,0x8DF5, 0, 0, 0, 0, 0, + 0, 0, 0,0x8E87,0x92DB, 0,0xE346,0x97DD, +0x8DD7, 0,0xE347,0x9061, 0,0xE349, 0, 0, + 0,0x8FD0,0x8DAE, 0, 0, 0, 0,0xE348, + 0, 0,0x8F49,0x8CBC,0x9167,0xE344,0xE34A, 0, + 0, 0, 0,0xE345,0x8C6F, 0,0xE34D,0xE351, +0x8C8B, 0, 0, 0, 0, 0,0xE34C, 0, + 0, 0, 0,0xE355, 0, 0,0x8D69, 0, + 0,0x978D,0x88BA,0xE352, 0, 0,0x8B8B, 0, +0xE34F, 0, 0, 0, 0, 0,0xE350, 0, + 0,0x939D,0xE34E,0xE34B, 0,0x8A47,0x90E2, 0, + 0,0x8CA6, 0, 0, 0,0xE357, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xE354, 0, 0, 0, 0, 0,0xE356, + 0, 0, 0,0xE353, 0, 0, 0, 0, + 0,0x8C70,0x91B1,0xE358,0x918E, 0, 0,0xE365, + 0, 0,0xE361,0xE35B, 0, 0, 0, 0, + 0, 0, 0,0xE35F,0x8EF8,0x88DB,0xE35A,0xE362, +0xE366,0x8D6A,0x96D4, 0,0x92D4,0xE35C, 0, 0, +0xE364, 0,0xE359,0x925D, 0,0xE35E,0x88BB,0x96C8, + 0, 0, 0, 0, 0, 0, 0,0xE35D, + 0, 0,0x8BD9,0x94EA, 0, 0, 0,0x918D, + 0,0x97CE,0x8F8F, 0, 0,0xE38E, 0, 0, +0xE367, 0,0x90FC, 0,0xE363,0xE368,0xE36A, 0, +0x92F7,0xE36D, 0, 0,0xE369, 0, 0, 0, +0x95D2,0x8AC9, 0, 0,0x96C9, 0, 0,0x88DC, + 0, 0,0xE36C, 0,0x97FB, 0, 0, 0, + 0, 0, 0,0xE36B, 0, 0, 0, 0, + 0,0x898F, 0, 0,0x93EA,0xE36E, 0, 0, + 0,0xE375,0xE36F,0xE376, 0, 0, 0, 0, + 0, 0,0xE372, 0, 0, 0, 0, 0, + 0, 0, 0,0x949B, 0, 0,0x8EC8,0xE374, + 0,0xE371,0xE377,0xE370, 0, 0,0x8F63, 0, + 0, 0, 0,0x9644, 0, 0,0x8F6B, 0, + 0,0xE373,0xE380, 0, 0,0xE37B, 0,0xE37E, + 0,0xE37C,0xE381,0xE37A, 0,0xE360,0x90D1, 0, + 0,0x94C9, 0,0xE37D, 0, 0,0xE378, 0, + 0, 0,0x9140,0x8C71, 0,0x8F4A, 0, 0, + 0, 0, 0, 0,0x9044,0x9155,0xE384, 0, + 0,0xE386,0xE387, 0, 0,0xE383,0xE385, 0, + 0, 0, 0, 0, 0, 0,0xE379,0xE382, + 0,0xE38A,0xE389, 0, 0,0x969A, 0, 0, +0x8C4A, 0, 0, 0, 0, 0, 0, 0, + 0,0xE388, 0,0xE38C,0xE38B,0xE38F, 0,0xE391, + 0, 0,0x8E5B,0xE38D, 0, 0, 0, 0, +0xE392,0xE393, 0, 0,0xE394, 0,0xE39A,0x935A, +0xE396, 0,0xE395,0xE397,0xE398, 0,0xE399, 0, + 0, 0, 0,0xE39B,0xE39C, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x8ACA, 0, +0xE39D, 0,0xE39E, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE39F, 0, 0, + 0, 0, 0, 0,0xE3A0,0xE3A1,0xE3A2, 0, +0xE3A3,0xE3A4, 0, 0,0xE3A6,0xE3A5, 0, 0, +0xE3A7, 0, 0, 0, 0, 0, 0,0xE3A8, +0xE3A9, 0, 0, 0, 0, 0, 0,0xE3AC, +0xE3AA,0xE3AB,0x8DDF,0x8C72, 0, 0,0x9275, 0, +0x94B1, 0,0x8F90, 0, 0,0x946C, 0,0x94EB, +0xE3AD,0x9CEB, 0, 0, 0, 0, 0, 0, + 0, 0,0xE3AE,0xE3B0, 0,0x9785,0xE3AF,0xE3B2, +0xE3B1, 0,0x9772, 0,0xE3B3, 0,0x94FC, 0, + 0, 0, 0, 0,0xE3B4, 0, 0, 0, + 0, 0,0xE3B7, 0, 0,0xE3B6,0xE3B5, 0, + 0, 0, 0,0xE3B8,0x8C51, 0, 0, 0, +0x9141,0x8B60, 0, 0, 0, 0,0xE3BC,0xE3B9, + 0, 0,0xE3BA, 0, 0, 0,0xE3BD, 0, +0xE3BE,0xE3BB, 0, 0, 0,0x8948, 0, 0, + 0,0x89A5, 0, 0, 0,0xE3C0,0xE3C1, 0, + 0, 0,0xE3C2, 0,0x9782, 0, 0, 0, + 0, 0,0x8F4B, 0,0xE3C4,0xE3C3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9089,0xE3C5, 0, 0, 0, 0,0xE3C6, 0, + 0,0xE3C7, 0,0x8AE3, 0, 0, 0, 0, +0x8ACB, 0, 0,0xE3C8, 0, 0, 0, 0, + 0,0xE3C9, 0,0x967C,0x9783, 0, 0, 0, +0x9773,0x9856, 0,0x8D6C,0xE3CC,0x8ED2,0xE3CB, 0, + 0, 0, 0,0xE3CD,0x8EA7, 0, 0, 0, +0x91CF, 0,0xE3CE, 0, 0,0x8D6B, 0,0x96D5, +0xE3CF,0xE3D0, 0, 0,0xE3D1, 0, 0, 0, + 0,0xE3D2, 0, 0, 0, 0, 0, 0, +0xE3D3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x8EA8, 0, 0,0x96EB, 0, + 0, 0, 0,0xE3D5, 0,0x925E, 0,0xE3D4, + 0, 0, 0, 0, 0, 0,0xE3D7, 0, + 0, 0,0xE3D6, 0, 0, 0, 0, 0, + 0, 0,0xE3D8, 0, 0, 0,0x90B9, 0, +0xE3D9, 0,0xE3DA, 0, 0, 0,0x95B7,0xE3DB, + 0,0x918F,0xE3DC, 0, 0, 0, 0, 0, +0xE3DD, 0, 0, 0, 0, 0, 0,0x97FC, +0xE3E0, 0,0xE3DF,0xE3DE,0x92AE, 0,0xE3E1,0x9045, + 0,0xE3E2, 0, 0, 0,0xE3E3,0x9857,0xE3E4, + 0, 0, 0, 0,0xE3E5,0xE3E7,0xE3E6,0x94A3, + 0,0x93F7, 0,0x985D,0x94A7, 0, 0, 0, + 0, 0, 0,0xE3E9, 0, 0,0x8FD1, 0, +0x9549, 0,0xE3EA,0xE3E8, 0,0x8ACC, 0, 0, + 0,0x8CD2,0x8E88, 0, 0,0x94EC, 0, 0, + 0,0x8CA8,0x9662, 0,0xE3ED,0xE3EB, 0,0x8D6D, + 0,0x8D6E,0x88E7, 0,0x8DE6, 0, 0, 0, + 0, 0,0x9478, 0, 0, 0, 0, 0, + 0, 0, 0,0x88DD,0xE3F2, 0,0x925F, 0, + 0, 0, 0, 0,0x9477, 0,0x91D9, 0, + 0, 0, 0, 0, 0, 0,0xE3F4, 0, + 0,0xE3F0,0xE3F3,0xE3EE, 0,0xE3F1,0x9645, 0, + 0,0x8CD3, 0, 0,0x88FB,0xE3EF, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE3F6, + 0,0xE3F7, 0, 0,0x93B7, 0, 0, 0, +0x8BB9, 0, 0, 0,0xE445,0x945C, 0, 0, + 0, 0,0x8E89, 0, 0,0x8BBA,0x90C6,0x9865, +0x96AC,0xE3F5,0x90D2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x8B72,0xE3F8, 0, 0, 0, 0, + 0, 0, 0,0xE3FA, 0, 0, 0, 0, + 0,0xE3F9, 0, 0, 0, 0, 0,0xE3FB, + 0,0x9245, 0,0x945D, 0, 0, 0, 0, + 0,0x92AF, 0, 0, 0, 0,0xE442, 0, + 0, 0, 0, 0, 0, 0,0xE441, 0, + 0, 0, 0,0xE3FC, 0, 0,0x9074, 0, +0x9585,0xE444, 0,0xE443,0x8D6F,0x9872, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE454, + 0, 0, 0, 0, 0,0xE448,0xE449, 0, + 0, 0, 0,0x8EEE, 0, 0,0xE447, 0, +0x8D98,0xE446, 0, 0,0xE44A, 0, 0, 0, +0x92B0,0x95A0,0x9142, 0, 0, 0, 0,0x91DA, +0xE44E, 0,0xE44F,0xE44B, 0, 0, 0, 0, +0xE44C, 0,0xE44D, 0, 0, 0, 0,0x8D70, + 0, 0, 0,0xE455, 0,0xE451, 0, 0, + 0, 0,0x9586, 0,0x968C,0x9547, 0, 0, +0xE450, 0, 0,0xE453,0xE452, 0, 0, 0, +0x9663,0xE456, 0, 0, 0, 0, 0, 0, +0xE457, 0, 0,0x9156, 0,0xE458, 0, 0, +0xE45A, 0,0xE45E, 0, 0,0xE45B,0xE459,0x945E, +0xE45C, 0,0xE45D, 0, 0, 0,0x89B0, 0, +0xE464,0xE45F, 0, 0, 0,0xE460, 0, 0, + 0,0xE461, 0,0x919F, 0, 0, 0, 0, +0xE463,0xE462,0xE465, 0, 0, 0, 0,0xE466, +0xE467, 0, 0,0x9062, 0,0x89E7, 0,0xE468, +0x97D5, 0,0x8EA9, 0, 0,0x8F4C, 0, 0, + 0, 0, 0,0x8E8A,0x9276, 0, 0, 0, + 0, 0,0xE469,0xE46A,0x8950, 0,0xE46B, 0, + 0,0xE46C,0xE46D, 0, 0,0xE46E, 0,0xE46F, +0x8BBB,0x9DA8,0xE470, 0,0x90E3,0xE471,0x8EC9, 0, +0xE472, 0,0x98AE, 0, 0, 0,0xE473,0x95DC, +0x8ADA, 0, 0,0x9143,0x8F77, 0,0x9591,0x8F4D, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xE474,0x8D71,0xE475,0x94CA, 0,0xE484, 0, + 0, 0, 0,0xE477, 0,0x91C7,0x9495,0x8CBD, +0xE476,0x9144, 0, 0, 0, 0, 0, 0, +0xE478, 0, 0, 0, 0, 0, 0,0x92F8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE47A,0xE479,0xE47C, 0, 0,0xE47B, 0,0xE47D, + 0, 0,0xE480, 0,0xE47E, 0,0x8ACD, 0, +0xE481, 0,0xE482,0xE483, 0, 0,0x8DAF,0x97C7, + 0,0xE485,0x9046, 0, 0, 0,0x8990,0xE486, +0xE487, 0, 0, 0, 0, 0,0xE488, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x88F0, 0,0xE489, 0, 0, + 0, 0,0xE48A, 0, 0, 0, 0, 0, + 0,0x9587, 0, 0, 0,0x8EC5, 0,0xE48C, + 0, 0, 0, 0, 0,0x8A48,0x88B0, 0, + 0, 0, 0,0xE48B,0xE48E,0x946D, 0,0x9063, + 0,0x89D4, 0,0x9646, 0, 0, 0, 0, +0x8C7C,0x8BDA, 0,0xE48D, 0,0x89E8, 0, 0, + 0, 0, 0, 0, 0,0x8AA1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x8991,0xE492,0x97E8,0x91DB, 0, 0,0x9563, + 0,0xE49E, 0,0x89D5,0xE49C, 0,0xE49A,0xE491, + 0,0xE48F, 0,0xE490, 0,0x8EE1,0x8BEA,0x9297, + 0, 0, 0,0x93CF, 0, 0, 0, 0, + 0,0x8970, 0,0xE494,0xE493, 0, 0, 0, + 0,0xE499,0xE495,0xE498, 0, 0, 0, 0, + 0, 0,0x96CE,0xE497,0x89D6,0x8A9D,0xE49B, 0, + 0,0xE49D, 0, 0, 0, 0,0x8C73, 0, + 0, 0, 0, 0, 0, 0,0xE4A1,0xE4AA, +0xE4AB, 0, 0, 0,0x88A9, 0, 0, 0, + 0, 0, 0,0xE4B2, 0, 0, 0, 0, +0x88EF, 0, 0,0xE4A9, 0, 0, 0,0xE4A8, + 0,0xE4A3,0xE4A2, 0,0xE4A0,0xE49F,0x9283, 0, +0x91F9,0xE4A5, 0, 0, 0, 0, 0, 0, +0xE4A4, 0, 0, 0, 0,0xE4A7, 0, 0, + 0,0x9190,0x8C74, 0, 0, 0, 0,0x8960, +0xE4A6, 0,0x8D72, 0, 0, 0, 0, 0, +0x9191, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE4B8, 0,0xE4B9, 0,0x89D7, + 0, 0, 0,0x89AC,0xE4B6, 0, 0, 0, + 0, 0, 0, 0, 0,0xE4AC, 0,0xE4B4, + 0,0xE4BB,0xE4B5, 0, 0, 0,0xE4B3, 0, + 0, 0, 0,0xE496, 0, 0,0xE4B1, 0, + 0, 0,0xE4AD, 0, 0, 0,0x8ACE,0xE4AF, +0xE4BA, 0,0xE4B0, 0, 0, 0, 0, 0, +0xE4BC, 0,0xE4AE,0x949C, 0, 0, 0, 0, + 0,0x9789, 0, 0, 0,0xE4B7, 0, 0, + 0, 0, 0, 0, 0,0xE4CD, 0, 0, + 0,0xE4C5, 0, 0, 0,0x909B, 0, 0, + 0, 0,0x8B65, 0,0x8BDB, 0,0xE4C0, 0, + 0, 0, 0,0x89D9, 0, 0,0x8FD2, 0, +0xE4C3, 0, 0, 0,0x8DD8, 0, 0,0x9370, +0xE4C8, 0, 0, 0, 0, 0, 0, 0, + 0,0x95EC, 0,0xE4BF, 0, 0, 0,0x89D8, +0x8CD4,0x9548,0xE4C9, 0,0xE4BD, 0, 0,0xE4C6, + 0, 0, 0,0xE4D0, 0,0xE4C1, 0, 0, + 0, 0, 0,0xE4C2,0x93B8, 0, 0,0xE4C7, + 0, 0, 0,0xE4C4,0x9647,0xE4CA,0x88DE, 0, + 0, 0, 0,0xE4BE, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE4CC, 0,0xE4CB, 0, 0, 0, 0, 0, + 0,0x948B,0xE4D2, 0,0xE4DD, 0, 0, 0, + 0,0x8A9E, 0, 0, 0,0xE4E0, 0, 0, +0xE4CE, 0, 0, 0,0xE4D3,0x978E, 0, 0, + 0, 0, 0, 0, 0, 0,0xE4DC, 0, + 0,0x9774, 0, 0, 0, 0,0x97A8, 0, + 0, 0, 0, 0, 0, 0, 0,0x9298, + 0, 0, 0,0x8A8B, 0, 0, 0, 0, + 0,0x9592,0xE4E2,0x939F, 0, 0,0x88AF, 0, + 0,0xE4DB, 0,0xE4D7,0x9192,0xE4D1,0xE4D9,0xE4DE, + 0,0x944B, 0, 0, 0,0x88A8, 0,0xE4D6, + 0,0xE4DF,0x9598, 0, 0, 0, 0, 0, + 0, 0,0xE4DA, 0,0xE4D5, 0, 0, 0, + 0, 0, 0,0x8FD3, 0, 0, 0, 0, +0x8F4E, 0, 0, 0,0x8EAA, 0, 0, 0, + 0,0x96D6, 0, 0,0x9566, 0, 0,0xE4E5, + 0,0xE4EE, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE4D8, 0, 0, + 0, 0,0x8A97, 0, 0, 0, 0, 0, +0x8FF6,0xE4E3, 0,0xE4E8,0x9193, 0, 0,0xE4E4, + 0,0xE4EB, 0, 0,0x927E, 0,0xE4EC, 0, + 0,0x9775,0xE4E1,0x8A57, 0,0xE4E7, 0, 0, +0xE4EA,0x96AA, 0, 0, 0, 0,0xE4ED, 0, + 0,0xE4E6,0xE4E9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x9648, 0,0x9840, 0, + 0, 0, 0, 0,0xE4F1, 0, 0, 0, + 0, 0, 0, 0,0xE4F8, 0, 0,0xE4F0, +0x8EC1, 0, 0, 0, 0, 0,0xE4CF, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x95CC, 0,0x96A0,0xE4F7,0xE4F6, 0,0xE4F2, +0xE4F3, 0,0x8955, 0, 0, 0, 0,0xE4F5, + 0,0xE4EF, 0, 0, 0, 0,0x92D3, 0, + 0, 0, 0, 0,0xE4F4,0x88FC, 0, 0, + 0, 0, 0, 0, 0,0x91A0, 0, 0, + 0, 0, 0, 0, 0,0x95C1, 0, 0, +0xE4F9,0xE540, 0,0x94D7, 0, 0, 0, 0, +0xE4FC,0x8FD4,0x8EC7,0xE542, 0, 0,0x8BBC, 0, + 0, 0, 0, 0, 0,0xE543, 0,0x9599, +0xE4FB, 0,0xE4D4, 0, 0, 0, 0, 0, + 0, 0, 0,0xE4FA, 0, 0, 0, 0, +0x986E,0x93A0,0x9593, 0, 0,0xE54A, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE550, + 0, 0, 0, 0, 0, 0,0xE551, 0, +0xE544, 0, 0, 0,0x9496, 0, 0,0xE54E, +0xE546, 0,0xE548, 0, 0, 0, 0, 0, +0xE552,0xE547, 0, 0,0xE54B, 0, 0,0x8992, + 0,0x93E3, 0,0xE54C,0xE54F, 0, 0, 0, + 0, 0, 0, 0,0xE545, 0,0x9145, 0, +0xE549,0x8E46,0x9064,0x8C4F,0x96F2, 0,0x96F7,0x8F92, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xE556,0xE554, 0, 0, 0, 0, 0, + 0,0x986D, 0, 0, 0, 0, 0, 0, + 0,0xE553, 0, 0, 0,0x9795, 0,0xE555, +0xE557, 0, 0, 0, 0,0xE558, 0, 0, + 0, 0, 0, 0,0xE55B,0xE559, 0, 0, + 0, 0, 0, 0,0x93A1,0xE55A, 0, 0, + 0,0x94CB,0xE54D, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x8F93, + 0,0xE55C,0xE561,0x9194, 0, 0,0xE560, 0, + 0, 0,0xE541, 0, 0, 0,0xE562,0x9168, + 0, 0,0xE55D,0xE55F, 0, 0, 0, 0, + 0, 0, 0,0xE55E, 0, 0,0x9F50,0x9F41, + 0, 0,0xE564, 0, 0, 0, 0, 0, + 0, 0,0xE563, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x9796, 0,0xE1BA, +0xE565, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE566, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE567,0x8CD5, 0, +0x8B73, 0, 0, 0,0xE569,0x997C, 0, 0, + 0, 0,0x8B95, 0,0x97B8, 0,0x8BF1,0xE56A, + 0, 0, 0, 0, 0, 0, 0,0xE56B, + 0, 0, 0,0x928E, 0, 0, 0, 0, + 0,0xE56C, 0, 0, 0, 0, 0, 0, + 0,0x93F8, 0,0x88B8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x89E1,0xE571,0xE572, 0, 0, 0, + 0, 0, 0,0xE56D, 0,0x8E5C, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE56E,0x9461, 0, 0, 0, + 0,0xE56F,0xE570,0xE57A, 0, 0, 0,0xE574, +0xE577, 0, 0, 0, 0, 0,0xE573, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xE575, 0,0xE576,0x8ED6, + 0,0xE578, 0,0x9260, 0,0x8C75,0x8A61, 0, + 0, 0, 0, 0,0xE57B, 0, 0, 0, + 0,0x8A5E, 0,0xE581, 0, 0,0xE57C,0xE580, + 0, 0, 0, 0,0x94B8, 0, 0, 0, + 0,0xE57D, 0, 0,0xE57E,0x9567,0x94D8,0xE582, + 0, 0, 0, 0, 0, 0, 0, 0, +0x91FB,0xE58C, 0,0xE588, 0, 0,0x89E9, 0, +0xE586, 0,0x9649,0xE587, 0, 0,0xE584, 0, +0xE585,0xE58A,0xE58D, 0, 0,0xE58B, 0, 0, + 0,0xE589,0xE583, 0, 0, 0, 0, 0, +0x9277, 0,0xE594, 0,0x96A8, 0, 0, 0, + 0, 0, 0, 0, 0,0xE592, 0, 0, + 0,0xE593, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xE58E, 0, 0,0xE590, + 0, 0, 0,0xE591, 0, 0, 0,0xE58F, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x90E4, 0,0x9858,0xE598, 0,0xE599, 0, + 0, 0, 0,0xE59F, 0,0x9049, 0,0xE59B, + 0,0xE59E, 0, 0, 0, 0, 0,0xE596, +0xE595, 0, 0,0xE5A0, 0, 0,0x89DA, 0, +0xE59C, 0,0xE5A1, 0, 0, 0,0xE59D, 0, + 0, 0, 0, 0,0xE59A, 0,0x92B1, 0, +0xE597, 0, 0, 0, 0, 0, 0,0x9488, + 0, 0,0xE5A5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x975A, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE5A4, + 0, 0,0xE5A3, 0, 0, 0, 0, 0, + 0, 0, 0,0xE5AC, 0, 0, 0,0xE5A6, + 0, 0, 0,0xE5AE, 0, 0, 0, 0, + 0, 0,0x9786,0xE5B1, 0,0xE5A8, 0, 0, +0xE5A9, 0, 0, 0,0xE5AD, 0,0xE5B0,0xE5AF, + 0, 0, 0,0xE5A7, 0, 0, 0, 0, +0xE5AA, 0,0xE5BB, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE5B4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE5B2, + 0, 0,0xE5B3, 0, 0, 0,0xE5B8,0xE5B9, + 0,0x8A49, 0,0x8B61, 0, 0,0xE5B7, 0, + 0, 0, 0, 0, 0,0xE5A2, 0, 0, + 0, 0, 0, 0, 0,0xE5B6,0xE5BA,0xE5B5, + 0,0xE5BC, 0, 0, 0,0xE5BE,0xE5BD, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xE5C0,0xE5BF,0xE579, 0, 0, 0,0xE5C4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xE5C1, 0, 0, 0, 0,0xE5C2, 0, + 0,0xE5C3, 0,0xE5C5, 0, 0, 0, 0, +0x8C8C, 0,0xE5C7, 0,0xE5C6, 0,0x8F4F, 0, + 0, 0, 0, 0,0x8D73,0x9FA5, 0, 0, + 0, 0,0xE5C8,0x8F70, 0, 0, 0,0x8A58, + 0,0xE5C9, 0,0x8971, 0,0x8FD5,0xE5CA, 0, + 0,0x8D74,0xE5CB,0x88DF, 0, 0, 0, 0, +0x955C, 0, 0,0xE5CC, 0, 0, 0, 0, +0x908A, 0,0xE5D3, 0, 0,0xE5D0, 0,0x928F, + 0, 0, 0, 0, 0,0xE5D1,0xE5CE,0x8BDC, + 0,0xE5CD,0xE5D4, 0, 0, 0, 0, 0, +0x8C55, 0, 0,0x91DC, 0,0xE5DA, 0, 0, + 0, 0,0xE5D6, 0, 0, 0,0x91B3,0xE5D5, + 0,0xE5D8, 0, 0, 0, 0,0xE5CF, 0, + 0, 0,0xE5D9, 0,0xE5DB, 0, 0, 0, + 0, 0, 0,0x94ED, 0, 0,0xE5D7, 0, +0xE5DC,0xE5DE, 0, 0,0x8CD1,0xE5D2, 0,0x88BF, + 0, 0, 0, 0, 0, 0, 0,0xE5DD, + 0,0x8DD9,0x97F4,0xE5DF,0xE5E0,0x9195, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x97A0, + 0, 0, 0, 0,0xE5E1,0x9754, 0, 0, +0xE5E2,0xE5E3, 0, 0,0x95E2,0xE5E4, 0,0x8DBE, + 0,0x97A1, 0, 0, 0, 0, 0, 0, +0xE5E9, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xE5EA,0x8FD6,0xE5E8, 0, 0, 0, +0x9787,0xE5E5, 0, 0,0xE5E7,0x90BB,0x909E, 0, + 0, 0,0xE5E6, 0,0xE5EB, 0, 0,0x95A1, + 0, 0,0xE5ED, 0,0xE5EC, 0, 0, 0, +0x8A8C, 0,0x964A,0xE5EE, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE5FA,0xE5F0, 0, + 0, 0, 0, 0, 0,0xE5F1, 0, 0, + 0, 0,0xE5F2,0xE5F3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE5F7, 0, +0xE5F8, 0, 0,0xE5F6, 0, 0, 0, 0, + 0,0xE5F4, 0,0xE5EF,0xE5F5, 0, 0, 0, + 0, 0, 0, 0,0xE5F9,0xE8B5, 0, 0, + 0, 0, 0, 0, 0, 0,0x89A6, 0, + 0, 0, 0, 0, 0, 0,0xE5FC,0x8BDD, +0xE5FB, 0, 0, 0,0xE641, 0,0xE640, 0, + 0, 0,0xE643, 0, 0,0xE642, 0,0xE644, + 0, 0,0x8F50, 0,0xE645, 0, 0,0xE646, + 0, 0, 0, 0, 0, 0,0xE647,0x90BC, + 0,0x9776, 0,0xE648, 0, 0,0x95A2,0x9465, +0xE649, 0,0xE64A,0x8CA9, 0, 0, 0,0x8B4B, + 0, 0, 0,0xE64B, 0, 0,0x8E8B,0x9460, +0xE64C, 0,0x8A6F, 0, 0, 0, 0, 0, + 0,0xE64D, 0, 0, 0, 0,0xE64F,0x9797, + 0,0xE64E,0x9065, 0,0xE650, 0, 0,0xE651, + 0, 0,0xE652,0x8ACF, 0, 0, 0, 0, + 0, 0,0xE653, 0, 0,0xE654, 0,0xE655, +0xE656, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x8A70, 0, 0, 0, 0, 0, + 0, 0,0xE657, 0,0xE658,0xE659, 0, 0, + 0, 0, 0,0x89F0, 0, 0,0x9047,0xE65A, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xE65B, 0, 0, 0, +0xE65C, 0, 0, 0, 0, 0, 0, 0, +0x8CBE, 0,0x92F9,0xE65D, 0, 0, 0, 0, +0x8C76, 0,0x9075, 0,0xE660, 0,0x93A2, 0, +0xE65F, 0, 0,0x8C50, 0, 0,0xE65E,0x91F5, +0x8B4C, 0, 0,0xE661, 0,0xE662, 0,0x8FD7, + 0, 0, 0,0x8C8D, 0,0xE663, 0, 0, + 0, 0,0x964B, 0, 0,0x90DD, 0, 0, + 0,0x8B96, 0,0x96F3,0x9169, 0,0xE664, 0, + 0, 0,0x9066,0x9290,0x8FD8, 0, 0, 0, + 0,0xE665, 0, 0, 0, 0,0xE668, 0, +0xE669, 0, 0, 0, 0, 0, 0, 0, +0x8DBC,0x91C0,0xE667, 0,0x8FD9,0x955D, 0, 0, + 0, 0, 0,0xE666, 0, 0,0x8E8C, 0, +0x8972, 0,0xE66D,0x8C77, 0, 0,0x8E8E, 0, + 0,0x8E8D, 0,0x986C,0xE66C,0xE66B,0x9146, 0, +0x8B6C,0x9862,0x8A59,0x8FDA, 0, 0, 0, 0, + 0, 0, 0, 0,0xE66A, 0, 0, 0, + 0, 0,0xE66F, 0,0xE670,0xE66E, 0,0x8CD6, + 0,0x975F, 0, 0,0x8E8F,0x9446, 0, 0, + 0,0xE673, 0,0x90BE, 0,0x9261, 0, 0, +0x9755, 0,0xE676, 0, 0, 0,0x8CEA, 0, +0x90BD,0xE672, 0,0xE677,0x8CEB,0xE674,0xE675, 0, +0xE671, 0, 0, 0,0x90E0,0x93C7, 0, 0, +0x924E, 0,0x89DB, 0, 0, 0, 0, 0, + 0,0x94EE, 0, 0,0x8B62, 0, 0,0x92B2, + 0, 0,0xE67A, 0,0xE678, 0, 0,0x926B, + 0, 0, 0,0x90BF,0x8AD0,0xE679, 0,0x907A, + 0, 0,0x97C8, 0, 0, 0,0x985F, 0, + 0, 0,0xE67B,0xE687,0x92B3, 0,0xE686, 0, +0xE683,0xE68B,0xE684, 0,0xE680, 0,0x92FA,0xE67E, + 0, 0, 0,0xE67C, 0,0x9740,0x8E90, 0, + 0,0xE681, 0,0xE67D, 0, 0, 0,0xE685, +0x8F94, 0,0x8CBF, 0, 0, 0,0x91F8, 0, +0x9664,0x8979,0x88E0, 0,0x93A3, 0, 0,0xE689, + 0, 0, 0, 0,0xE688, 0,0x93E4, 0, +0xE68D, 0, 0, 0,0xE682, 0,0xE68C,0xE68E, + 0,0x8CAA,0xE68A,0x8D75, 0,0x8ED3, 0, 0, +0xE68F,0x9777, 0, 0, 0, 0,0xE692, 0, +0xE695, 0, 0,0xE693,0x9554, 0, 0, 0, + 0, 0, 0,0xE690, 0, 0, 0, 0, + 0,0x8BDE, 0, 0, 0, 0,0xE694, 0, + 0,0xE696, 0, 0, 0, 0, 0, 0, + 0,0xE69A, 0, 0,0xE697, 0,0xE699,0xE698, + 0, 0, 0, 0, 0, 0,0xE69B, 0, +0x8EAF, 0,0xE69D,0xE69C,0x9588, 0, 0,0xE69F, + 0, 0, 0, 0, 0, 0,0x8C78, 0, + 0, 0, 0,0xE69E,0xE6A0, 0, 0,0xE6A1, +0x8B63,0xE3BF,0x8FF7, 0,0xE6A2, 0, 0,0x8CEC, + 0, 0, 0, 0, 0,0xE6A3, 0, 0, +0xE6A4, 0, 0,0x8E5D, 0, 0, 0, 0, + 0, 0,0x9DCC, 0,0xE6A5, 0,0xE6A6, 0, +0x8F51, 0,0xE6A7,0xE6A8, 0, 0,0xE6A9, 0, + 0,0xE6AA,0xE6AB, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x924A, + 0, 0,0xE6AC, 0, 0, 0, 0,0xE6AE, + 0,0xE6AD, 0, 0, 0, 0,0x93A4, 0, +0xE6AF, 0,0x964C, 0,0xE6B0, 0,0xE6B1, 0, +0xE6B2, 0, 0, 0, 0,0xE6B3, 0, 0, + 0, 0,0x93D8, 0, 0, 0, 0, 0, + 0,0x8FDB,0xE6B4, 0, 0, 0, 0, 0, + 0, 0,0x8D8B,0x98AC,0xE6B5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE6B6,0x955E,0xE6B7, 0,0xE6BF, 0, 0, 0, + 0, 0,0xE6B8, 0, 0,0xE6BA, 0, 0, + 0,0xE6B9,0xE6BB, 0,0x9665,0xE6BC,0xE6BD, 0, + 0, 0, 0, 0,0xE6BE, 0, 0, 0, +0xE6C0, 0, 0, 0, 0,0x8A4C,0x92E5, 0, +0x9589,0x8DE0,0x8D76, 0, 0, 0, 0,0x956E, +0x89DD,0x94CC,0xE6C3,0x8AD1,0x90D3,0xE6C2,0xE6C7,0x9299, +0x96E1, 0,0xE6C5,0xE6C6,0x8B4D, 0,0xE6C8,0x9483, +0x91DD, 0, 0,0x94EF,0x935C,0xE6C4, 0,0x9666, +0x89EA,0xE6CA,0x9847,0x92C0,0x9864, 0, 0,0x8E91, +0xE6C9, 0,0x91AF, 0, 0,0xE6DA,0x9147, 0, + 0,0x93F6, 0,0x956F, 0, 0, 0, 0, + 0, 0,0xE6CD,0x8E5E,0x8E92, 0,0x8FDC, 0, +0x9485, 0,0x8CAB,0xE6CC,0xE6CB, 0,0x958A, 0, + 0, 0,0x8EBF, 0, 0,0x9371, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xE6CF,0xE6D0,0x8D77,0xE6CE, 0, 0, + 0, 0, 0, 0,0xE6D1,0xE6D2, 0,0xE6D4, +0x91A1, 0,0xE6D3,0x8AE4, 0,0xE6D6, 0,0xE6D5, +0xE6D7, 0, 0,0xE6D9,0xE6DB, 0,0xE6DC, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x90D4, 0,0x8ECD,0xE6DD, + 0, 0, 0,0x8A71, 0,0xE6DE, 0, 0, +0x9196,0xE6DF, 0,0xE6E0,0x958B, 0, 0,0x8B4E, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xE6E1, 0, 0, 0,0x92B4, 0, 0, + 0, 0,0x897A, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xE6E2, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x8EEF, 0, 0, 0, 0, +0x9096, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x91AB, 0, 0, 0, 0, + 0, 0,0xE6E5, 0, 0, 0,0xE6E4, 0, + 0, 0,0xE6E3, 0, 0, 0, 0, 0, + 0, 0, 0,0xE6EB,0xE6E9, 0, 0,0xE6E6, + 0, 0, 0, 0, 0, 0,0xE6E8, 0, + 0, 0,0xE6E7,0xE6EA, 0,0x8B97, 0,0xE6EE, + 0,0x90D5, 0,0xE6EF, 0, 0, 0, 0, +0x8CD7, 0,0xE6EC,0xE6ED, 0, 0, 0,0x9848, + 0, 0, 0,0x92B5, 0,0x9148, 0, 0, + 0, 0, 0, 0,0xE6F0, 0, 0,0xE6F3, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE6F1,0xE6F2,0x9778, 0, 0, 0, 0,0x93A5, +0xE6F6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE6F4,0xE6F5,0xE6F7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xE748, 0, 0, 0, 0, 0, +0xE6FA, 0, 0, 0,0xE6FB,0xE6F9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xE6F8, 0,0x92FB, 0, 0,0xE740, +0xE744,0xE741,0xE6FC, 0,0xE742, 0, 0, 0, +0xE743, 0, 0, 0, 0,0xE74A, 0, 0, + 0,0xE745, 0, 0, 0, 0, 0,0x90D6, +0xE747, 0, 0,0xE749,0xE746, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xE74C, 0,0x8F52, 0,0xE74B, 0, + 0, 0, 0, 0,0xE74D, 0, 0, 0, + 0,0xE74E, 0, 0,0xE751,0xE750, 0,0xE74F, + 0, 0,0xE753,0xE752, 0,0x96F4, 0, 0, + 0,0xE755, 0,0xE754,0xE756, 0, 0, 0, + 0,0xE757, 0, 0, 0, 0, 0, 0, + 0,0xE759, 0, 0, 0, 0, 0, 0, + 0, 0,0xE758,0x9067,0xE75A, 0, 0,0x8BEB, +0xE75B,0xE75D, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE75E, 0, + 0, 0, 0, 0, 0,0xE75F,0xE75C, 0, +0xE760, 0,0x8ED4,0xE761,0x8B4F,0x8C52, 0, 0, + 0, 0,0x8CAC, 0, 0, 0, 0, 0, + 0, 0, 0,0xE762, 0, 0, 0,0x93EE, + 0, 0,0x935D,0xE763, 0, 0, 0, 0, + 0, 0, 0,0xE766, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8EB2, 0, 0,0xE765,0xE764,0x8C79,0xE767, 0, + 0, 0, 0,0x8A72, 0,0xE769, 0, 0, + 0,0x8DDA,0xE768, 0,0xE771, 0, 0, 0, + 0, 0,0xE76B,0xE76D,0x95E3,0xE76A, 0, 0, + 0,0xE76C, 0,0xE770,0xE76E,0x8B50, 0,0xE76F, + 0, 0, 0, 0, 0, 0,0xE772, 0, + 0,0x9479,0x97D6, 0, 0, 0, 0,0x8F53, + 0, 0, 0,0xE773, 0, 0, 0, 0, +0x9741,0xE775, 0,0xE774, 0, 0,0xE778,0x9760, + 0, 0,0xE777, 0,0x8A8D,0xE776,0xE77B, 0, + 0,0xE77A, 0, 0,0xE779,0x9351,0xE77C, 0, + 0, 0, 0, 0, 0, 0, 0,0xE77D, + 0, 0, 0, 0,0xE77E, 0, 0,0x8D8C, + 0,0x8C44,0xE780,0xE781,0xE782, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x9068,0xE783, 0,0x8EAB,0xE784, + 0, 0, 0,0xE785, 0, 0, 0,0x999F, +0x999E, 0, 0, 0, 0,0xE786,0xE390,0xE787, +0x9243,0x904A,0x945F, 0, 0, 0, 0,0xE788, + 0, 0,0x95D3,0x92D2,0x8D9E, 0, 0,0x9248, + 0, 0,0x8949, 0,0x9698,0x9076, 0, 0, + 0, 0, 0, 0, 0, 0,0x8C7D, 0, + 0,0x8BDF, 0, 0,0x95D4, 0, 0, 0, + 0, 0,0xE789, 0, 0, 0, 0, 0, + 0, 0,0xE78B, 0, 0,0xE78A,0x89DE, 0, + 0,0x93F4,0xE78C,0x9497, 0,0x9352, 0,0xE78D, +0x8F71, 0, 0, 0,0xE78F, 0, 0,0x96C0, +0xE79E,0xE791,0xE792, 0, 0,0x92C7, 0, 0, +0x91DE,0x9197, 0,0x93A6, 0,0xE790,0x8B74, 0, + 0, 0, 0,0xE799, 0,0xE796,0xE7A3,0x93A7, +0x9280,0xE793, 0,0x92FC,0x9372,0xE794,0xE798,0x9080, + 0,0x9487,0x92CA, 0, 0,0x90C0,0xE797,0x91AC, +0x91A2,0xE795,0x88A7,0x9841, 0, 0, 0,0xE79A, + 0, 0, 0, 0, 0, 0,0x91DF, 0, + 0,0x8F54,0x9069, 0, 0,0xE79C,0xE79B, 0, +0x88ED,0xE79D, 0, 0,0x954E, 0,0xE7A5, 0, + 0,0x93D9,0x908B, 0, 0,0x9278, 0,0x8BF6, + 0,0xE7A4,0x9756,0x895E, 0,0x95D5,0x89DF,0xE79F, +0xE7A0,0xE7A1,0xE7A2,0x93B9,0x9242,0x88E1,0xE7A6, 0, +0xE7A7,0xEAA1, 0, 0,0x91BB, 0,0xE7A8, 0, +0x8993,0x916B, 0,0x8CAD, 0,0x9779, 0, 0, +0xE7A9,0x934B, 0, 0, 0,0x9198,0x8ED5,0xE7AA, + 0, 0,0xE7AD, 0, 0,0x8F85,0xE7AB,0x914A, +0x9149, 0,0x88E2, 0,0x97C9,0xE7AF, 0,0x94F0, +0xE7B1,0xE7B0,0xE7AE,0xE284,0x8AD2, 0, 0,0xE78E, + 0,0xE7B3,0xE7B2, 0, 0, 0, 0,0xE7B4, + 0,0x9757, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x93DF, 0, 0,0x964D, 0, +0xE7B5, 0,0x8ED7, 0, 0, 0, 0,0xE7B6, + 0,0xE7B7, 0, 0, 0,0xE7B8, 0, 0, +0x9340, 0, 0, 0, 0, 0, 0, 0, + 0,0x88E8, 0, 0, 0, 0, 0, 0, + 0, 0,0x8D78, 0, 0, 0,0x9859, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE7BC, 0, 0, 0, 0, + 0,0x8C53,0xE7B9, 0,0xE7BA, 0, 0, 0, +0x9594, 0, 0, 0, 0,0x8A73, 0, 0, + 0, 0, 0, 0, 0,0x9758, 0,0x8BBD, + 0, 0, 0, 0, 0,0x9373, 0, 0, + 0, 0,0xE7BD, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xE7BE, 0, 0, 0, 0, 0, + 0,0xE7BF, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x9341, 0, 0, +0xE7C1, 0,0xE7C0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x93D1,0xE7C2,0x8F55,0x8EDE,0x947A,0x9291, 0, + 0, 0,0x8EF0, 0,0x908C, 0,0xE7C3, 0, +0xE7C4, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x907C,0xE7C5, 0,0xE7C6, 0, 0, + 0,0xE7C7,0x978F, 0,0x8F56, 0, 0, 0, + 0, 0,0xE7C9,0xE7C8, 0,0x8D79, 0,0x8D93, +0x8E5F, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0xE7CC, 0, 0, 0, 0,0x8F86, + 0,0xE7CB, 0,0xE7CA, 0,0x91E7, 0, 0, +0x8CED, 0,0x90C1, 0, 0, 0, 0,0x94AE, + 0, 0, 0, 0,0x8F58, 0, 0, 0, + 0, 0,0xE7CD, 0,0x8FDD, 0, 0, 0, + 0, 0,0xE7D0,0xE7CE, 0, 0, 0,0xE7CF, + 0, 0, 0, 0,0xE7D2,0xE7D1, 0, 0, +0x8FF8, 0,0xE7D3, 0, 0, 0, 0, 0, +0xE7D4,0xE7D5, 0, 0, 0, 0,0x94CE,0x8DD1, +0x8EDF,0xE7D6, 0,0xE7D7,0x97A2,0x8F64,0x96EC,0x97CA, +0xE7D8,0x8BE0, 0, 0, 0, 0,0xE7D9, 0, +0x9342, 0, 0,0xE7DC,0x8A98,0x906A, 0,0xE7DA, + 0,0xE7DB, 0,0x92DE, 0, 0,0x9674,0x8BFA, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE7DE,0xE7DF, 0, + 0, 0, 0, 0,0xE7DD, 0, 0,0xE7E1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x93DD,0x8A62, 0, + 0,0xE7E5, 0, 0,0xE7E2,0xE7E4, 0, 0, + 0, 0, 0, 0, 0, 0,0xE7E0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xE86E, 0, 0,0xE7E3, 0, 0, 0, + 0, 0, 0, 0,0x97E9, 0, 0,0x8CD8, + 0, 0, 0, 0, 0, 0, 0,0xE7ED, + 0, 0, 0, 0,0x9353,0xE7E8, 0, 0, +0xE7EB,0xE7E9, 0,0xE7EE, 0, 0, 0, 0, +0xE7EF, 0, 0, 0, 0, 0, 0,0xE7E7, + 0, 0,0xE7F4,0x8994, 0, 0,0xE7E6, 0, + 0, 0,0x94AB, 0,0xE7EA, 0,0x8FDE, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x8D7A, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x9667, 0, +0x8BE2, 0, 0,0x8F65, 0,0x93BA, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x914C, 0,0xE7F2, 0,0xE7EC,0xE7F1, 0, +0x96C1, 0,0x92B6,0xE7F3,0xE7F0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x914B, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE7F7, + 0,0xE7F6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE7F5, + 0, 0,0x964E, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x8F9B, 0, 0, 0, + 0,0xE7F8,0x95DD, 0, 0,0x8973, 0, 0, + 0, 0,0x9565,0x9292, 0, 0, 0, 0, +0x8B98, 0,0xE7FA, 0,0x8D7C, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x8E4B, 0, + 0, 0, 0, 0, 0, 0, 0,0xE7F9, +0x908D, 0, 0, 0, 0, 0, 0, 0, +0x908E,0xE840,0xE842, 0, 0, 0, 0, 0, +0x8FF9, 0,0xE841,0xE843, 0, 0,0x8BD1, 0, +0x9564, 0, 0,0x8EE0,0x9842, 0,0xE7FC,0x8DF6, + 0, 0,0x985E, 0, 0,0xE845, 0, 0, + 0, 0,0xE844,0xE846, 0, 0, 0, 0, + 0, 0, 0, 0,0xE7FB, 0, 0, 0, + 0, 0, 0,0x93E7, 0,0x9374, 0, 0, + 0, 0, 0, 0,0x92D5, 0,0xE84B, 0, + 0, 0, 0,0x9262,0xE847, 0, 0, 0, +0xE848, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x8C4C, 0,0xE84A, 0, + 0, 0, 0, 0, 0,0x8CAE, 0, 0, + 0, 0, 0, 0,0xE849, 0,0x8FDF, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x8A99, 0, 0, 0, + 0, 0, 0, 0,0xE84F, 0,0x8DBD,0x9199, + 0, 0,0x92C8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x8A5A, + 0, 0, 0, 0,0xE84D,0xE84E,0x92C1, 0, +0xE84C, 0, 0, 0, 0, 0, 0, 0, + 0,0xE850, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE856, 0, 0, 0, 0, +0xE859, 0, 0, 0, 0, 0, 0, 0, +0xE858,0x934C, 0, 0, 0, 0,0xE851,0xE852, +0xE855, 0, 0, 0, 0,0xE857, 0, 0, + 0,0x8BBE, 0, 0,0xE85A,0xE854, 0, 0, +0xE853, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE85E, 0, 0, 0,0xE85F, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE860, 0, 0,0xE85D,0xE85C, 0, 0, 0, +0x8FE0,0x93A8,0xE85B, 0, 0, 0, 0, 0, + 0,0xE864, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xE862, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE863,0xE861, 0, +0x91F6, 0,0xE865, 0, 0, 0, 0, 0, + 0,0xE866, 0, 0,0xE868, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x8AD3,0xE867,0x96F8, 0, 0, 0, 0, + 0, 0,0xE873,0xE869, 0, 0,0xE86C, 0, +0xE86A, 0,0xE86B, 0, 0, 0, 0, 0, + 0, 0,0xE86D, 0, 0, 0, 0, 0, +0xE86F, 0, 0, 0, 0,0xE870, 0,0xE871, + 0, 0, 0, 0,0xE874,0xE872,0xE875,0xE877, + 0,0xE876}; + +/* page 6 0x9577-0x9FA0 */ +static uint16 tab_uni_sjis6[]={ +0x92B7, 0, 0, 0, 0, 0, 0, 0, + 0,0x96E5, 0,0xE878,0x914D, 0, 0, 0, +0xE879, 0,0x95C2,0xE87A,0x8A4A, 0, 0, 0, +0x895B, 0,0x8AD5, 0,0x8AD4,0xE87B, 0,0xE87C, + 0,0xE87D,0xE87E, 0, 0, 0, 0, 0, + 0,0xE880, 0,0x8AD6,0x8A74,0x8D7D,0x94B4, 0, +0xE882,0xE881, 0, 0, 0, 0,0xE883, 0, + 0, 0, 0,0x897B, 0, 0, 0, 0, + 0, 0,0xE886, 0,0xE885,0xE884, 0,0xE887, + 0, 0, 0, 0,0xE88A, 0, 0, 0, +0x88C5, 0, 0,0xE888, 0,0xE88C,0xE88B, 0, + 0, 0, 0, 0, 0,0xE88E,0xE88D,0xE88F, + 0,0x93AC, 0, 0, 0,0xE890, 0, 0, + 0, 0,0xE891,0xE893, 0, 0,0xE892, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0x958C, 0, 0, + 0, 0,0xE894, 0, 0, 0, 0, 0, + 0,0xE895, 0,0x8DE3, 0, 0, 0,0xE896, +0xE897, 0, 0,0x9668, 0, 0, 0, 0, + 0, 0, 0, 0,0x916A, 0, 0, 0, +0x88A2,0x91C9, 0,0xE898, 0,0x958D, 0, 0, + 0, 0, 0, 0,0xE89B,0xE899,0x8D7E, 0, +0xE89A,0x8CC0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x95C3,0xE89D,0xE89F,0xE89E, +0xE8A0, 0, 0,0x8940,0x9077,0x8F9C,0x8AD7,0xE8A1, + 0, 0, 0,0x9486, 0,0xE8A3, 0, 0, + 0,0x8941, 0,0xE8A2,0x92C2, 0,0x97CB,0x93A9, +0xE89C,0x97A4, 0,0x8CAF, 0, 0,0x977A, 0, + 0, 0, 0, 0, 0, 0,0x8BF7,0x97B2, + 0,0x8C47, 0,0x91E0,0xE440, 0,0xE8A4,0x8A4B, +0x908F, 0, 0, 0, 0,0x8A75,0xE8A6, 0, +0xE8A7,0xE8A5,0x8C84, 0,0x8DDB,0x8FE1, 0, 0, + 0,0x8942, 0, 0,0x97D7, 0, 0, 0, +0xE8A9,0xE7AC, 0,0xE8A8, 0, 0, 0, 0, + 0,0xE8AC,0xE8AA,0xE8AB, 0,0xE8AD, 0,0xE8AE, +0x97EA,0xE8AF,0xE8B0, 0,0x90C7,0x94B9, 0, 0, + 0,0x909D,0x8AE5, 0, 0,0x9759,0x89EB,0x8F57, +0x8CD9, 0,0xE8B3, 0,0xE8B2,0x8E93,0xE8B4,0xE8B1, + 0, 0,0x8E47, 0, 0, 0,0xE8B8,0xE5AB, + 0, 0,0x99D4, 0,0x9097,0xE8B6, 0, 0, + 0, 0, 0,0x97A3,0x93EF, 0, 0, 0, + 0,0x894A, 0,0x90E1,0x8EB4, 0, 0, 0, + 0,0x95B5, 0,0x895F, 0, 0, 0,0x97EB, +0x978B, 0,0xE8B9, 0,0x9364, 0, 0, 0, + 0,0x8EF9, 0, 0, 0,0xE8BA, 0,0xE8BB, +0x906B,0xE8BC, 0,0x97EC, 0, 0,0xE8B7,0xE8BE, +0xE8C0, 0,0xE8BF, 0,0xE8BD, 0, 0,0xE8C1, + 0, 0,0xE8C2, 0, 0,0x919A, 0,0x89E0, + 0, 0, 0, 0, 0,0xE8C3, 0, 0, +0x96B6, 0, 0,0xE8C4, 0, 0, 0, 0, + 0,0xE8C5, 0,0x9849, 0, 0, 0, 0, + 0,0x9E50,0xE8C6, 0, 0, 0,0xE8C7,0xE8C8, + 0, 0, 0,0xE8CC, 0,0xE8C9, 0,0xE8CA, + 0,0xE8CB,0xE8CD, 0, 0, 0, 0, 0, + 0, 0, 0,0x90C2, 0, 0, 0,0x96F5, + 0, 0,0x90C3, 0, 0,0xE8CE, 0,0x94F1, + 0,0xE8CF,0xEA72,0x96CA, 0,0xE8D0, 0,0xE8D1, + 0,0xE8D2,0x8A76, 0,0xE8D4, 0,0x9078, 0, + 0, 0,0xE8D5, 0, 0,0x8C43, 0, 0, + 0, 0,0xE8D6,0xE8DA, 0,0xE8D8, 0, 0, + 0, 0,0xE8D9, 0, 0,0x8A93,0xE8D7,0xE8DB, + 0, 0, 0, 0,0xE8DC, 0,0x88C6, 0, +0xE8DD,0xE8DE, 0, 0, 0, 0, 0, 0, + 0,0x8FE2, 0, 0, 0,0xE8DF, 0, 0, + 0,0x8B66, 0, 0,0xE8E2, 0, 0,0xE8E1, + 0,0xE8E0, 0, 0,0xE691, 0,0x95DA, 0, + 0, 0, 0, 0,0xE8E3,0xE8E4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xE8E5, 0, 0,0xE8E6, + 0,0xE8E7, 0, 0,0xE8E8, 0, 0, 0, + 0, 0, 0, 0,0x8AD8, 0, 0, 0, + 0, 0, 0, 0, 0,0xE8E9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE8EA,0x9442, + 0, 0, 0,0xE8EC,0x89B9, 0,0xE8EF,0xE8EE, + 0, 0, 0, 0,0x8943, 0, 0, 0, +0x8BBF, 0,0x95C5,0x92B8,0x8DA0, 0,0x8D80,0x8F87, + 0,0x907B, 0, 0, 0,0xE8F1, 0, 0, +0xE8F0,0x9761,0x8AE6,0x94D0,0x93DA, 0, 0, 0, +0x909C,0x97CC, 0,0x8C7A, 0, 0, 0, 0, + 0, 0,0xE8F4, 0, 0,0xE8F3, 0, 0, + 0, 0, 0, 0, 0,0x966A,0x93AA, 0, + 0, 0, 0, 0, 0,0x896F, 0, 0, +0xE8F5,0xE8F2, 0, 0,0x9570,0x978A,0xE8F6, 0, + 0, 0, 0, 0, 0, 0, 0,0xE8F7, + 0, 0, 0, 0,0xE8F9,0x91E8,0x8A7A,0x8A7B, +0xE8F8, 0, 0, 0, 0,0x8AE7,0x8CB0, 0, + 0,0x8AE8, 0, 0,0x935E, 0, 0,0x97DE, + 0, 0, 0, 0, 0, 0, 0, 0, +0x8CDA, 0, 0, 0,0xE8FA, 0, 0, 0, +0xE8FB,0xE8FC,0xE940, 0,0xE942,0xE941, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x9597, 0,0xE943, 0, 0, 0, 0, +0xE944, 0,0xE945, 0, 0, 0, 0,0xE946, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xE948,0xE947, 0,0xE949, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x94F2,0xE3CA, 0, 0, +0x9048, 0, 0,0x8B51, 0, 0, 0, 0, + 0, 0,0xE94A, 0,0xE94B, 0,0x99AA,0x9F5A, +0x94D1, 0, 0,0x88F9, 0,0x88B9, 0, 0, + 0, 0, 0, 0, 0,0x8E94,0x964F,0x8FFC, + 0, 0, 0, 0,0xE94C, 0,0x96DD, 0, + 0, 0,0xE94D,0x977B, 0,0x8961, 0, 0, + 0,0x8E60, 0,0xE94E,0x89EC,0xE94F, 0, 0, + 0,0xE950, 0, 0, 0, 0,0xE952,0xE953, + 0,0xE955,0xE951, 0, 0,0xE954, 0, 0, + 0,0x8AD9, 0, 0, 0,0xE956, 0,0xE957, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE958,0xE959, + 0, 0, 0,0xE95A, 0, 0,0xE95C, 0, + 0, 0,0xE95B, 0,0xE95E,0xE961, 0, 0, + 0,0xE95D,0xE95F,0xE960, 0, 0,0xE962, 0, +0x8BC0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x8EF1, +0xE963,0xE964,0x8D81, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE965, 0, + 0,0x8A5D, 0, 0, 0,0x946E,0xE966,0xE967, + 0, 0, 0, 0,0x9279,0x93E9, 0, 0, + 0, 0, 0, 0, 0,0xE968, 0, 0, + 0, 0,0x949D, 0, 0,0x91CA,0x8977,0x8BEC, + 0,0x8BED, 0, 0, 0, 0, 0, 0, + 0,0x9293,0xE96D,0x8BEE, 0, 0,0x89ED, 0, + 0,0xE96C, 0, 0,0xE96A, 0,0xE96B, 0, +0xE969, 0, 0,0xE977, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xE96E,0xE96F, + 0, 0,0xE970,0xE971, 0, 0, 0, 0, + 0,0xE973, 0, 0,0xE972, 0, 0, 0, +0x8F78, 0,0xE974, 0, 0, 0,0xE976, 0, + 0, 0, 0, 0, 0, 0, 0,0x8B52, +0xE975, 0, 0,0x919B,0x8CB1, 0, 0, 0, + 0, 0,0xE978, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x91CB, 0, 0,0xE979, 0, 0, 0, + 0,0x93AB, 0, 0, 0, 0, 0, 0, +0xE97A, 0, 0, 0, 0, 0, 0,0xE980, + 0,0xE97D, 0,0xE97C,0xE97E, 0,0xE97B, 0, + 0, 0, 0, 0, 0, 0,0xE982, 0, + 0, 0, 0, 0, 0, 0,0xE981, 0, +0xE984, 0, 0,0x8BC1,0xE983, 0, 0, 0, +0xE985, 0, 0,0xE986, 0,0xE988,0xE987, 0, + 0, 0,0xE989,0xE98B,0xE98A, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x8D9C, 0, 0, 0, 0,0xE98C, 0, + 0,0xE98D, 0, 0, 0, 0, 0, 0, + 0,0x8A5B, 0, 0, 0,0xE98E, 0, 0, + 0,0xE98F, 0, 0, 0,0x9091, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xE990, 0,0xE991, 0,0xE992,0xE993, 0, 0, + 0,0x8D82, 0, 0, 0, 0, 0,0xE994, +0xE995, 0, 0,0xE996,0xE997, 0, 0,0xE998, + 0, 0, 0,0x94AF,0xE99A, 0,0x9545,0xE99B, +0xE999, 0,0xE99D, 0, 0,0xE99C, 0, 0, +0xE99E, 0, 0, 0,0xE99F, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE9A0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xE9A1, 0,0xE9A2, 0, 0, 0, 0, +0xE9A3, 0, 0,0xE9A4,0xE9A5, 0,0xE9A6, 0, +0xE9A7,0xE9A8,0xE9A9,0xE9AA, 0, 0, 0,0xE9AB, +0xE9AC, 0,0x9F54,0xE9AD, 0, 0, 0, 0, + 0, 0, 0, 0,0xE2F6,0x8B53, 0, 0, + 0, 0,0x8A40,0x8DB0,0xE9AF,0xE9AE,0x96A3, 0, + 0, 0, 0, 0, 0, 0,0xE9B1,0xE9B2, +0xE9B0, 0,0xE9B3, 0, 0,0x9682, 0, 0, + 0,0xE9B4, 0,0x8B9B, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x9844, 0, 0, 0, 0,0xE9B5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xE9B7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0x88BC, + 0, 0,0xE9B8,0x95A9,0xE9B6, 0, 0,0xE9B9, +0xE9BA, 0, 0, 0, 0, 0, 0, 0, +0xE9BB,0xE9BC, 0, 0, 0, 0, 0, 0, + 0,0xE9BD, 0,0x968E,0x8E4C, 0,0x8DF8,0x914E, + 0, 0, 0, 0, 0,0xE9BE, 0, 0, + 0, 0,0xE9C1, 0, 0, 0, 0, 0, + 0,0xE9BF, 0, 0, 0, 0, 0,0xE9C2, + 0, 0,0x8CEF,0xE9C0, 0, 0, 0, 0, +0xE9C3, 0,0xE9C4,0xE9C5, 0,0xE9C9, 0,0x8E49, + 0, 0, 0, 0,0x91E2, 0, 0, 0, + 0, 0,0xE9CA,0xE9C7,0xE9C6,0xE9C8, 0, 0, + 0,0x8C7E, 0, 0, 0, 0, 0, 0, + 0,0xE9CE,0xE9CD,0xE9CC, 0, 0,0x88B1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xE9D8, 0,0xE9D4, + 0,0xE9D5,0xE9D1,0xE9D7, 0,0xE9D3,0x8A82, 0, + 0,0x986B, 0,0xE9D6,0xE9D2,0xE9D0,0xE9CF, 0, + 0, 0, 0, 0,0xE9DA, 0, 0, 0, + 0, 0,0xE9DD, 0, 0,0xE9DC,0xE9DB, 0, + 0, 0, 0, 0, 0, 0,0x9568,0xE9D9, +0x88F1,0xE9DE, 0,0xE9E0, 0, 0, 0, 0, + 0, 0,0x8A8F,0xE9CB,0x8956, 0, 0,0xE9E2, + 0, 0, 0, 0, 0, 0, 0,0xE9E1, +0xE9DF,0x924C, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0x9690, 0, 0, 0, 0, +0x97D8, 0, 0,0xE9E3, 0, 0, 0, 0, + 0,0xE9E4, 0, 0, 0, 0, 0, 0, +0xE9E5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xE9E6, + 0,0xE9E7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x92B9, 0, +0xE9E8, 0,0x94B5, 0,0xE9ED,0xE9E9, 0, 0, + 0,0xE9EA, 0, 0,0x9650,0x96C2, 0,0x93CE, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0xE9EE, 0, 0,0xE9EF, +0x93BC,0xE9EC,0xE9EB, 0, 0, 0, 0,0x89A8, + 0, 0, 0,0xE9F7, 0, 0,0xE9F6, 0, + 0, 0, 0, 0,0x8995, 0, 0, 0, +0xE9F4, 0, 0, 0,0xE9F3, 0, 0,0xE9F1, + 0,0x8A9B, 0,0xE9F0,0x8EB0,0x89A7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x8D83, 0, 0,0xE9FA, +0xE9F9, 0,0xE9F8, 0, 0,0xE9F5, 0,0xE9FB, + 0,0xE9FC, 0, 0, 0, 0, 0, 0, + 0,0xEA44,0xEA43, 0, 0, 0, 0, 0, + 0, 0,0xEA45, 0, 0,0x894C,0xEA40,0xEA41, + 0,0x8D94,0x96B7, 0, 0,0xEA42, 0, 0, + 0, 0, 0, 0, 0,0x9651, 0, 0, +0xEA4A, 0, 0,0xEA46, 0, 0, 0, 0, + 0, 0, 0,0xEA4B, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xEA48, 0,0xEA47, 0, 0, 0, 0, 0, +0x8C7B, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xEA4C, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xEA4D, 0, 0, + 0, 0,0xEA4E, 0,0xEA49, 0, 0, 0, +0xE9F2, 0, 0,0xEA4F, 0,0x92DF, 0, 0, + 0,0xEA53, 0,0xEA54,0xEA52, 0, 0, 0, + 0, 0,0xEA51,0xEA57, 0,0xEA50, 0,0xEA55, + 0, 0, 0, 0, 0, 0, 0, 0, +0xEA56, 0, 0, 0,0xEA59, 0, 0, 0, + 0, 0,0xEA58, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,0xEA5B, + 0, 0, 0, 0, 0, 0,0xEA5C, 0, +0xEA5D, 0, 0,0x9868, 0, 0, 0, 0, + 0,0xEA5A,0x91E9,0x8DEB, 0, 0,0xEA5E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xEA5F,0xEA60, 0, 0,0xEA61, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0xEA62, 0, + 0,0x8CB2,0xEA63, 0, 0, 0,0xEA64, 0, +0x8EAD, 0,0xEA65, 0, 0, 0, 0, 0, + 0,0xEA66, 0, 0,0xEA67,0xEA68, 0, 0, + 0, 0,0xEA6B,0xEA69,0x985B, 0,0xEA6A, 0, +0x97ED, 0, 0, 0, 0, 0,0xEA6C, 0, +0x97D9, 0, 0, 0, 0, 0,0xEA6D,0x949E, + 0, 0,0xEA6E,0xEA70, 0, 0,0xEA71, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0xEA6F,0x8D8D,0x96CB,0x9683,0x9BF5, 0,0x9F80, +0x969B, 0, 0, 0, 0,0x89A9, 0, 0, + 0, 0, 0, 0, 0,0xEA73,0x8B6F,0xEA74, +0xEA75,0xEA76, 0,0x8D95, 0,0xEA77, 0, 0, + 0,0xE0D2,0x96D9, 0,0x91E1,0xEA78,0xEA7A,0xEA79, + 0,0xEA7B, 0, 0, 0, 0,0xEA7C, 0, + 0,0xEA7D, 0, 0, 0, 0, 0, 0, +0xEA7E, 0, 0, 0, 0,0xEA80, 0,0xEA81, +0xEA82, 0,0xEA83, 0,0xEA84,0xEA85,0xEA86, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xEA87,0xEA88, 0, 0, 0, 0, 0,0x9343, + 0, 0, 0, 0,0x8CDB, 0,0xEA8A, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0,0x916C,0xEA8B, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,0xEA8C, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,0x9540, 0, 0,0xEA8D, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,0xEA8E,0xE256, 0, 0,0xE6D8, +0xE8EB, 0, 0,0xEA8F, 0,0xEA90, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0xEA92,0xEA93,0xEA94,0x97EE,0xEA91, 0, 0,0xEA95, +0xEA96, 0, 0,0xEA98, 0,0xEA97, 0, 0, + 0, 0, 0,0xEA9A, 0, 0, 0,0xEA9B, +0xEA99, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,0x97B4, 0, + 0, 0, 0, 0, 0, 0,0xEA9C, 0, + 0, 0, 0, 0, 0,0xEA9D,0xE273, 0, + 0,0xEA9E}; + +/* page 7 0xFF01-0xFFE5 */ +static uint16 tab_uni_sjis7[]={ +0x8149, 0,0x8194,0x8190,0x8193,0x8195, 0,0x8169, +0x816A,0x8196,0x817B,0x8143, 0,0x8144,0x815E,0x824F, +0x8250,0x8251,0x8252,0x8253,0x8254,0x8255,0x8256,0x8257, +0x8258,0x8146,0x8147,0x8183,0x8181,0x8184,0x8148,0x8197, +0x8260,0x8261,0x8262,0x8263,0x8264,0x8265,0x8266,0x8267, +0x8268,0x8269,0x826A,0x826B,0x826C,0x826D,0x826E,0x826F, +0x8270,0x8271,0x8272,0x8273,0x8274,0x8275,0x8276,0x8277, +0x8278,0x8279,0x816D, 0,0x816E,0x814F,0x8151,0x814D, +0x8281,0x8282,0x8283,0x8284,0x8285,0x8286,0x8287,0x8288, +0x8289,0x828A,0x828B,0x828C,0x828D,0x828E,0x828F,0x8290, +0x8291,0x8292,0x8293,0x8294,0x8295,0x8296,0x8297,0x8298, +0x8299,0x829A,0x816F,0x8162,0x8170, 0, 0, 0, +0x00A1,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,0x00A8, +0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF,0x00B0, +0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7,0x00B8, +0x00B9,0x00BA,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF,0x00C0, +0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x00C7,0x00C8, +0x00C9,0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF,0x00D0, +0x00D1,0x00D2,0x00D3,0x00D4,0x00D5,0x00D6,0x00D7,0x00D8, +0x00D9,0x00DA,0x00DB,0x00DC,0x00DD,0x00DE,0x00DF, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,0x8150, 0,0x818F}; + +static int func_uni_sjis_onechar(int code){ + if ((code>=0x005C)&&(code<=0x00F7)) + return(tab_uni_sjis0[code-0x005C]); + if ((code>=0x0391)&&(code<=0x0451)) + return(tab_uni_sjis1[code-0x0391]); + if ((code>=0x2010)&&(code<=0x2312)) + return(tab_uni_sjis2[code-0x2010]); + if ((code>=0x2500)&&(code<=0x266F)) + return(tab_uni_sjis3[code-0x2500]); + if ((code>=0x3000)&&(code<=0x30FE)) + return(tab_uni_sjis4[code-0x3000]); + if ((code>=0x4E00)&&(code<=0x9481)) + return(tab_uni_sjis5[code-0x4E00]); + if ((code>=0x9577)&&(code<=0x9FA0)) + return(tab_uni_sjis6[code-0x9577]); + if ((code>=0xFF01)&&(code<=0xFFE5)) + return(tab_uni_sjis7[code-0xFF01]); + return(0); +} + + +int +my_wc_mb_sjis(CHARSET_INFO *cs __attribute__((unused)), + my_wc_t wc, uchar *s, uchar *e) +{ + int code; + + if(wc<0x80) + { + s[0]=wc; + return 1; + } + + if(!(code=func_uni_sjis_onechar(wc))) + return MY_CS_ILUNI; + + if(s+2>e) + return MY_CS_TOOSMALL; + + s[0]=code>>8; + s[1]=code&0xFF; + return 2; +} + +int +my_mb_wc_sjis(CHARSET_INFO *cs __attribute__((unused)), + my_wc_t *pwc, const uchar *s, const uchar *e){ + int hi=s[0]; + + if(hi<0x80) + { + pwc[0]=hi; + return 1; + } + + if(s+2>e) + return MY_CS_TOOFEW(0); + + if(!(pwc[0]=func_sjis_uni_onechar((hi<<8)+s[1]))) + return MY_CS_ILSEQ; + + return 2; +} + + #endif diff --git a/strings/ctype.c b/strings/ctype.c index 4f81b5c3225..37f9b9bbcb9 100644 --- a/strings/ctype.c +++ b/strings/ctype.c @@ -3148,8 +3148,8 @@ CHARSET_INFO compiled_charsets[] = { ismbchar_gb2312, ismbhead_gb2312, mbcharlen_gb2312, - NULL, /* mb_wc */ - NULL, /* wc_mb */ + my_mb_wc_gb2312, /* mb_wc */ + my_wc_mb_gb2312, /* wc_mb */ my_caseup_str_mb, my_casedn_str_mb, my_caseup_mb, @@ -3178,8 +3178,8 @@ CHARSET_INFO compiled_charsets[] = { ismbchar_gbk, ismbhead_gbk, mbcharlen_gbk, - NULL, /* mb_wc */ - NULL, /* wc_mb */ + my_mb_wc_gbk, /* mb_wc */ + my_wc_mb_gbk, /* wc_mb */ my_caseup_str_mb, my_casedn_str_mb, my_caseup_mb, @@ -3508,8 +3508,8 @@ CHARSET_INFO compiled_charsets[] = { ismbchar_sjis, ismbhead_sjis, mbcharlen_sjis, - NULL, /* mb_wc */ - NULL, /* wc_mb */ + my_mb_wc_sjis, /* mb_wc */ + my_wc_mb_sjis, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, -- cgit v1.2.1 From 61420ed94fec8d34b1820e42494ea95914432ff5 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 30 Mar 2002 14:11:00 +0200 Subject: Fix for small tipo --- configure.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.in b/configure.in index 137621260fa..14600b7b091 100644 --- a/configure.in +++ b/configure.in @@ -588,7 +588,7 @@ AC_ARG_ENABLE(local-infile, [ --enable-local-infile If LOAD DATA LOCAL INFILE is enabled by default.], [ - ENABLED_LOCAL_INFILE=$enablewal + ENABLED_LOCAL_INFILE=$enableval AC_DEFINE(ENABLED_LOCAL_INFILE) ], [ ENABLED_LOCAL_INFILE=no ] -- cgit v1.2.1 From adc7a375368892eac433e19aab29ecefcf867d4b Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 30 Mar 2002 17:50:20 +0200 Subject: solves coredump --- client/mysql.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/client/mysql.cc b/client/mysql.cc index 9bea7c73ef4..21f46379522 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -319,6 +319,7 @@ int main(int argc,char *argv[]) if (!status.batch) ignore_errors=1; // Don't abort monitor signal(SIGINT, mysql_end); // Catch SIGINT to clean up + signal(SIGQUIT, mysql_end); // Catch SIGQUIT to clean up /* ** Run in interactive mode like the ingres/postgres monitor -- cgit v1.2.1 From 7be6a76520c5e1f72f9d8324d266aa91b6e8ea24 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 15 Apr 2002 20:01:16 +0500 Subject: Somebody made a bug here: one line disappeared --- configure.in | 1 + 1 file changed, 1 insertion(+) diff --git a/configure.in b/configure.in index 12d207a799d..669fec435cb 100644 --- a/configure.in +++ b/configure.in @@ -630,6 +630,7 @@ AC_SUBST(MYSQLD_USER) AC_MSG_CHECKING(If we should should enable LOAD DATA LOCAL by default) AC_ARG_ENABLE(local-infile, [ --enable-local-infile + Enable LOAD DATA LOCAL INFILE (default: disabled)], [ ENABLED_LOCAL_INFILE=$enableval AC_DEFINE(ENABLED_LOCAL_INFILE) -- cgit v1.2.1 From 32ac1ef044428947f6396a47c275d06975133c8c Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 16 Apr 2002 18:21:53 +0500 Subject: Some fixes after merging changes from 4.0 include/hash.h: Monty forgot to add H in left part of macros mysys/hash.c: I wonder how it happened that my_bool disappeared sql/sql_acl.cc: Somebody forgot ) sql/sql_class.h: I wonder how it happened that this line disappeared sql/sql_table.cc: small typo sql/sql_yacc.yy: Having ; is more compatible --- include/hash.h | 2 +- mysys/hash.c | 2 +- sql/sql_acl.cc | 2 +- sql/sql_class.h | 1 + sql/sql_table.cc | 2 +- sql/sql_yacc.yy | 34 +++++++++++++++++----------------- 6 files changed, 22 insertions(+), 21 deletions(-) diff --git a/include/hash.h b/include/hash.h index a4afe03fb59..0635d2fd7fc 100644 --- a/include/hash.h +++ b/include/hash.h @@ -44,7 +44,7 @@ typedef struct st_hash { CHARSET_INFO *charset; } HASH; -#define hash_init(A,B,C,D,E,F,G) _hash_init(A,B,C,D,E,F,G, H CALLER_INFO) +#define hash_init(A,B,C,D,E,F,G,H) _hash_init(A,B,C,D,E,F,G, H CALLER_INFO) my_bool _hash_init(HASH *hash, CHARSET_INFO *charset, uint default_array_elements, uint key_offset, uint key_length, hash_get_key get_key, diff --git a/mysys/hash.c b/mysys/hash.c index 656732598c1..a0c5c6e45f0 100644 --- a/mysys/hash.c +++ b/mysys/hash.c @@ -35,7 +35,7 @@ static uint calc_hashnr(CHARSET_INFO *cs,const byte *key,uint length); static uint calc_hashnr_caseup(CHARSET_INFO *cs, const byte *key,uint length); static int hashcmp(HASH *hash,HASH_LINK *pos,const byte *key,uint length); - +my_bool _hash_init(HASH *hash,CHARSET_INFO *charset, uint size,uint key_offset,uint key_length, hash_get_key get_key, diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index 403d08ad0ab..1398b2ce84f 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -941,7 +941,7 @@ bool change_password(THD *thd, const char *host, const char *user, if (!thd->slave_thread && (strcmp(thd->user,user) || - my_strcasecmp(system_charset_info, host,thd->host_or_ip)) + my_strcasecmp(system_charset_info, host,thd->host_or_ip))) { if (check_access(thd, UPDATE_ACL, "mysql",0,1)) DBUG_RETURN(1); diff --git a/sql/sql_class.h b/sql/sql_class.h index d111ff3df8e..1b1340c07a2 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -222,6 +222,7 @@ public: const char *Name; Key(enum Keytype type_par,const char *name_arg,List &cols) + :type(type_par), columns(cols),Name(name_arg) {} Key(enum Keytype type_par, enum ha_key_alg alg_par, const char *name_arg, List &cols) :type(type_par), algorithm(alg_par), columns(cols), Name(name_arg) diff --git a/sql/sql_table.cc b/sql/sql_table.cc index b88db94c767..19fcf5970c2 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -454,7 +454,7 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, key_info->flags = HA_NOSAME; } - key_info->key_alg = key->alg; + key_info->key_alg = key->algorithm; key_info->key_parts=(uint8) key->columns.elements; key_info->key_part=key_part_info; key_info->usable_key_parts= key_number; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 18b8e5bb824..77a70093036 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1154,7 +1154,7 @@ opt_unique_or_fulltext: key_alg: /* empty */ { $$= HA_KEY_ALG_BTREE; } - | USING opt_btree_or_rtree { $$= $2 } + | USING opt_btree_or_rtree { $$= $2; } opt_btree_or_rtree: BTREE_SYM { $$= HA_KEY_ALG_BTREE; } @@ -1784,9 +1784,9 @@ simple_expr: | FIELD_FUNC '(' expr ',' expr_list ')' { $$= new Item_func_field($3, *$5); } | GEOMFROMTEXT '(' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | GEOMFROMTEXT '(' expr ',' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | GEOMETRYCOLLECTION '(' expr_list ')' { $$= new Item_func_spatial_collection(* $3, Geometry::wkbGeometryCollection, @@ -1823,17 +1823,17 @@ simple_expr: | LOCATE '(' expr ',' expr ',' expr ')' { $$= new Item_func_locate($5,$3,$7); } | GEOMCOLLFROMTEXT '(' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | GEOMCOLLFROMTEXT '(' expr ',' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | GREATEST_SYM '(' expr ',' expr_list ')' { $5->push_front($3); $$= new Item_func_max(*$5); } | LEAST_SYM '(' expr ',' expr_list ')' { $5->push_front($3); $$= new Item_func_min(*$5); } | LINEFROMTEXT '(' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | LINEFROMTEXT '(' expr ',' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | MINUTE_SYM '(' expr ')' { $$= new Item_func_minute($3); } | MONTH_SYM '(' expr ')' @@ -1842,17 +1842,17 @@ simple_expr: { $$= new Item_func_spatial_collection(* $3, Geometry::wkbMultiLineString, Geometry::wkbLineString); } | MLINEFROMTEXT '(' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | MLINEFROMTEXT '(' expr ',' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | MPOINTFROMTEXT '(' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | MPOINTFROMTEXT '(' expr ',' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | MPOLYFROMTEXT '(' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | MPOLYFROMTEXT '(' expr ',' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | MULTIPOINT '(' expr_list ')' { $$= new Item_func_spatial_collection(* $3, Geometry::wkbMultiPoint, Geometry::wkbPoint); } @@ -1868,13 +1868,13 @@ simple_expr: $$= new Item_func_password($3); } | POINTFROMTEXT '(' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | POINTFROMTEXT '(' expr ',' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | POLYFROMTEXT '(' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | POLYFROMTEXT '(' expr ',' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | POLYGON '(' expr_list ')' { $$= new Item_func_spatial_collection(* $3, Geometry::wkbPolygon, Geometry::wkbLineString); } -- cgit v1.2.1 From 08665a17e0642b1a7103ac5ff39b7a7ab3894356 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 17 Apr 2002 14:16:26 +0500 Subject: New win1250ch charset --- acconfig.h | 1 + configure.in | 7 +++++-- include/m_ctype.h | 15 +++++++++++++++ libmysql/Makefile.shared | 2 +- sql/share/charsets/Index | 1 + strings/Makefile.am | 8 ++++---- strings/ctype.c | 33 +++++++++++++++++++++++++++++++++ 7 files changed, 60 insertions(+), 7 deletions(-) diff --git a/acconfig.h b/acconfig.h index 6ff8958670b..bcf07015534 100644 --- a/acconfig.h +++ b/acconfig.h @@ -98,6 +98,7 @@ #undef HAVE_CHARSET_usa7 #undef HAVE_CHARSET_utf8 #undef HAVE_CHARSET_win1250 +#undef HAVE_CHARSET_win1250ch #undef HAVE_CHARSET_win1251ukr #undef HAVE_CHARSET_win1251 diff --git a/configure.in b/configure.in index 669fec435cb..6e303f32e9b 100644 --- a/configure.in +++ b/configure.in @@ -1933,9 +1933,9 @@ CHARSETS_AVAILABLE="armscii8 big5 cp1251 cp1257 croat czech danish dec8 dos estonia euc_kr gb2312 gbk german1 greek hebrew hp8 hungarian koi8_ru koi8_ukr latin1 latin1_de latin2 latin5 sjis swe7 tis620 ujis - usa7 utf8 win1250 win1251ukr" + usa7 utf8 win1250 win1250ch win1251ukr" CHARSETS_DEPRECATED="win1251" -CHARSETS_COMPLEX="big5 czech euc_kr gb2312 gbk latin1_de sjis tis620 ujis utf8" +CHARSETS_COMPLEX="big5 czech euc_kr gb2312 gbk latin1_de sjis tis620 ujis utf8 win1250ch" DEFAULT_CHARSET=latin1 AC_DIVERT_POP @@ -2071,6 +2071,9 @@ do win1250) AC_DEFINE(HAVE_CHARSET_win1250) ;; + win1250ch) + AC_DEFINE(HAVE_CHARSET_win1250ch) + ;; win1251) AC_DEFINE(HAVE_CHARSET_win1251) ;; diff --git a/include/m_ctype.h b/include/m_ctype.h index 3b095b41d4f..1dad253e126 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -158,6 +158,21 @@ extern my_bool my_like_range_czech(CHARSET_INFO *, char *, char *, uint *, uint *); #endif + +#ifdef HAVE_CHARSET_win1250ch +/* declarations for the win1250ch character set */ +extern uchar ctype_win1250ch[]; +extern uchar to_lower_win1250ch[]; +extern uchar to_upper_win1250ch[]; +extern uchar sort_order_win1250ch[]; +extern int my_strnncoll_win1250ch(CHARSET_INFO *, const uchar *, uint, const uchar *, uint); +extern int my_strnxfrm_win1250ch(CHARSET_INFO *, uchar *, uint, const uchar *, uint); +extern my_bool my_like_range_win1250ch(CHARSET_INFO *, + const char *, uint, pchar, uint, + char *, char *, uint *, uint *); +#endif + + #ifdef HAVE_CHARSET_euc_kr /* declarations for the euc_kr character set */ extern uchar ctype_euc_kr[], to_lower_euc_kr[], to_upper_euc_kr[], sort_order_euc_kr[]; diff --git a/libmysql/Makefile.shared b/libmysql/Makefile.shared index 2ff4a68cb7e..5835fde8643 100644 --- a/libmysql/Makefile.shared +++ b/libmysql/Makefile.shared @@ -39,7 +39,7 @@ mystringsobjects = strmov.lo strxmov.lo strxnmov.lo strnmov.lo \ bchange.lo bmove.lo bmove_upp.lo longlong2str.lo \ strtoull.lo strtoll.lo llstr.lo \ ctype.lo ctype-simple.lo ctype-mb.lo \ - ctype-big5.lo ctype-czech.lo ctype-euc_kr.lo \ + ctype-big5.lo ctype-czech.lo ctype-euc_kr.lo ctype-win1250ch.lo\ ctype-gb2312.lo ctype-gbk.lo ctype-latin1_de.lo \ ctype-sjis.lo ctype-tis620.lo ctype-ujis.lo ctype-utf8.lo diff --git a/sql/share/charsets/Index b/sql/share/charsets/Index index 565b98a1c60..075cdc9872b 100644 --- a/sql/share/charsets/Index +++ b/sql/share/charsets/Index @@ -38,3 +38,4 @@ latin5 30 latin1_de 31 armscii8 32 utf8 33 +win1250ch 34 diff --git a/strings/Makefile.am b/strings/Makefile.am index 1b925036670..34f7b85c1e8 100644 --- a/strings/Makefile.am +++ b/strings/Makefile.am @@ -22,26 +22,26 @@ pkglib_LIBRARIES = libmystrings.a # Exact one of ASSEMBLER_X if ASSEMBLER_x86 ASRCS = strings-x86.s longlong2str-x86.s -CSRCS = bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c strnlen.c ctype.c ctype-simple.c ctype-mb.c ctype-big5.c ctype-czech.c ctype-euc_kr.c ctype-gb2312.c ctype-gbk.c ctype-latin1_de.c ctype-sjis.c ctype-tis620.c ctype-ujis.c ctype-utf8.c +CSRCS = bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c strnlen.c ctype.c ctype-simple.c ctype-mb.c ctype-big5.c ctype-czech.c ctype-euc_kr.c ctype-gb2312.c ctype-gbk.c ctype-latin1_de.c ctype-sjis.c ctype-tis620.c ctype-ujis.c ctype-utf8.c ctype-win1250ch.c else if ASSEMBLER_sparc # These file MUST all be on the same line!! Otherwise automake # generats a very broken makefile ASRCS = bmove_upp-sparc.s strappend-sparc.s strend-sparc.s strinstr-sparc.s strmake-sparc.s strmov-sparc.s strnmov-sparc.s strstr-sparc.s strxmov-sparc.s -CSRCS = strcont.c strfill.c strcend.c is_prefix.c longlong2str.c bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c strnlen.c ctype.c ctype-simple.c ctype-mb.c ctype-big5.c ctype-czech.c ctype-euc_kr.c ctype-gb2312.c ctype-gbk.c ctype-latin1_de.c ctype-sjis.c ctype-tis620.c ctype-ujis.cctype-utf8.c +CSRCS = strcont.c strfill.c strcend.c is_prefix.c longlong2str.c bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c strnlen.c ctype.c ctype-simple.c ctype-mb.c ctype-big5.c ctype-czech.c ctype-euc_kr.c ctype-gb2312.c ctype-gbk.c ctype-latin1_de.c ctype-sjis.c ctype-tis620.c ctype-ujis.c ctype-utf8.c ctype-win1250ch.c else #no assembler ASRCS = # These file MUST all be on the same line!! Otherwise automake # generats a very broken makefile -CSRCS = strxmov.c bmove_upp.c strappend.c strcont.c strend.c strfill.c strcend.c is_prefix.c strstr.c strinstr.c strmake.c strnmov.c strmov.c longlong2str.c bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c strnlen.c ctype.c ctype-simple.c ctype-mb.c ctype-big5.c ctype-czech.c ctype-euc_kr.c ctype-gb2312.c ctype-gbk.c ctype-latin1_de.c ctype-sjis.c ctype-tis620.c ctype-ujis.c ctype-utf8.c +CSRCS = strxmov.c bmove_upp.c strappend.c strcont.c strend.c strfill.c strcend.c is_prefix.c strstr.c strinstr.c strmake.c strnmov.c strmov.c longlong2str.c bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c strnlen.c ctype.c ctype-simple.c ctype-mb.c ctype-big5.c ctype-czech.c ctype-euc_kr.c ctype-gb2312.c ctype-gbk.c ctype-latin1_de.c ctype-sjis.c ctype-tis620.c ctype-ujis.c ctype-utf8.c ctype-win1250ch.c endif endif libmystrings_a_SOURCES = $(ASRCS) $(CSRCS) noinst_PROGRAMS = conf_to_src # Default charset definitions -EXTRA_DIST = ctype-big5.c ctype-czech.c ctype-euc_kr.c \ +EXTRA_DIST = ctype-big5.c ctype-czech.c ctype-euc_kr.c ctype-win1250ch.c \ ctype-gb2312.c ctype-gbk.c ctype-sjis.c ctype-utf8.c \ ctype-tis620.c ctype-ujis.c ctype-latin1_de.c \ strto.c strings-x86.s longlong2str-x86.s \ diff --git a/strings/ctype.c b/strings/ctype.c index 37f9b9bbcb9..fa2937eec81 100644 --- a/strings/ctype.c +++ b/strings/ctype.c @@ -2527,6 +2527,9 @@ static uchar sort_order_win1250[] = { 88, 65, 65, 65, 65, 80, 69, 67, 68, 73, 73, 73, 73, 77, 77, 70, 71, 83, 83, 85, 85, 85, 85,247, 88, 92, 92, 92, 92, 96, 91,255 }; +#endif + +#if defined(HAVE_CHARSET_win1250)||defined(HAVE_CHARSET_win1250ch) static uint16 tab_cp1250_uni[256]={ 0,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, @@ -3790,6 +3793,36 @@ CHARSET_INFO compiled_charsets[] = { }, #endif +#ifdef HAVE_CHARSET_win1250ch + { + 34, /* number */ + "win1250ch", /* name */ + ctype_win1250ch, + to_lower_win1250ch, + to_upper_win1250ch, + sort_order_win1250ch, + tab_cp1250_uni, /* tab_to_uni */ + idx_uni_cp1250, /* tab_from_uni */ + 2, /* strxfrm_multiply */ + my_strnncoll_win1250ch, + my_strnxfrm_win1250ch, + my_like_range_win1250ch, + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + my_strcasecmp_8bit, + my_strncasecmp_8bit, + 0 + }, +#endif + { 0, /* end-of-list marker */ NullS, -- cgit v1.2.1 From 804af496a1e5504fc0f5883b5dfb7502dcc0dbb4 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 17 Apr 2002 15:57:18 +0500 Subject: Some charsets require special hash function New file ctype-win1250ch, I forgot to commit it in my previous changes include/m_ctype.h: Some charsets require special hash function mysys/hash.c: Some charsets require special hash function strings/ctype-utf8.c: Some charsets require special hash function strings/ctype.c: Some charsets require special hash function --- include/m_ctype.h | 5 + mysys/hash.c | 7 +- strings/ctype-utf8.c | 24 ++- strings/ctype-win1250ch.c | 521 ++++++++++++++++++++++++++++++++++++++++++++++ strings/ctype.c | 35 ++++ 5 files changed, 590 insertions(+), 2 deletions(-) create mode 100644 strings/ctype-win1250ch.c diff --git a/include/m_ctype.h b/include/m_ctype.h index 1dad253e126..d52f86430d2 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -92,6 +92,8 @@ typedef struct charset_info_st int (*strcasecmp)(struct charset_info_st *, const char *, const char *); int (*strncasecmp)(struct charset_info_st *, const char *, const char *, uint); + /* Hash calculation */ + uint (*hash_caseup)(struct charset_info_st *cs, const byte *key, uint len); char max_sort_char; /* For LIKE otimization */ } CHARSET_INFO; @@ -275,6 +277,9 @@ int my_strncasecmp_utf8(CHARSET_INFO *cs, const char *s,const char *t,uint l); int my_utf8_uni (CHARSET_INFO *cs, my_wc_t *p, const uchar *s, const uchar *e); int my_uni_utf8 (CHARSET_INFO *cs, my_wc_t wc, uchar *b, uchar *e); + +uint my_hash_caseup_utf8(struct charset_info_st *cs, const byte *key, uint len); + #endif #define _U 01 /* Upper case */ diff --git a/mysys/hash.c b/mysys/hash.c index a0c5c6e45f0..770bd396d06 100644 --- a/mysys/hash.c +++ b/mysys/hash.c @@ -59,7 +59,12 @@ _hash_init(HASH *hash,CHARSET_INFO *charset, hash->flags=flags; hash->charset=charset; if (flags & HASH_CASE_INSENSITIVE) - hash->calc_hashnr=calc_hashnr_caseup; + { + if (charset->hash_caseup) + hash->calc_hashnr=charset->hash_caseup; + else + hash->calc_hashnr=calc_hashnr_caseup; + } else hash->calc_hashnr=calc_hashnr; DBUG_RETURN(0); diff --git a/strings/ctype-utf8.c b/strings/ctype-utf8.c index ab2a2db9acc..62dcd9f6b87 100644 --- a/strings/ctype-utf8.c +++ b/strings/ctype-utf8.c @@ -1732,6 +1732,28 @@ void my_caseup_utf8(CHARSET_INFO *cs, char *s, uint slen) } } +uint my_hash_caseup_utf8(CHARSET_INFO *cs, const byte *s, uint slen) +{ + my_wc_t wc; + register uint nr=1, nr2=4; + int res; + const char *e=s+slen; + + while ((s < e) && (res=my_utf8_uni(cs,&wc, (uchar *)s, (uchar*)e))>0 ) + { + int plane = (wc>>8) & 0xFF; + wc = uni_plane[plane] ? uni_plane[plane][wc & 0xFF].toupper : wc; + nr^= (((nr & 63)+nr2)*(wc & 0xFF))+ (nr << 8); + nr2+=3; + nr^= (((nr & 63)+nr2)*(wc >> 8))+ (nr << 8); + nr2+=3; + + s+=res; + } + + return nr; +} + void my_caseup_str_utf8(CHARSET_INFO * cs, char * s) { my_caseup_utf8(cs, s, strlen(s)); @@ -1938,7 +1960,7 @@ int main() test_mb(cs,(uchar*)str); - printf("orig :'%s'\n",str); + pr1;2cintf("orig :'%s'\n",str); my_caseup_utf8(cs,str,15); printf("caseup :'%s'\n",str); diff --git a/strings/ctype-win1250ch.c b/strings/ctype-win1250ch.c new file mode 100644 index 00000000000..c8ea1bf1f9f --- /dev/null +++ b/strings/ctype-win1250ch.c @@ -0,0 +1,521 @@ +/* + File strings/ctype-win1250ch.c for MySQL. + + Copyright: (C) 2001 Jan Pazdziora. + + This software is released under the terms of GNU General + Public License. + + Development of this software was supported by Neocortex, s.r.o. + + Bug reports and suggestions are always welcome. + + This file implements the collating sequence for Windows-1250 + character set. It merely extends the binary sorting of US-ASCII + by adding characters with diacritical marks into proper places. + In addition, it sorts 'ch' between 'h' and 'i', and the sorting + is case sensitive, with uppercase being sorted first, in the + second pass. + + Bug reports and suggestions are always welcome. +*/ + +/* + * This comment is parsed by configure to create ctype.c, + * so don't change it unless you know what you are doing. + * + * .configure. strxfrm_multiply_win1250ch=2 + */ + +#define REAL_MYSQL + +#ifdef REAL_MYSQL + +#include "my_global.h" +#include "m_string.h" +#include "m_ctype.h" + +uchar NEAR ctype_win1250ch[] = { +0x00, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x28, 0x28, 0x28, 0x28, 0x28, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, +0x48, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, +0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, +0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, +0x84, 0x84, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, +0x10, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x10, 0x10, 0x10, 0x10, 0x10, +0x10, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x02, +0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +0x02, 0x02, 0x02, 0x10, 0x10, 0x10, 0x10, 0x20, +0x20, 0x20, 0x10, 0x20, 0x10, 0x10, 0x10, 0x10, +0x20, 0x10, 0x01, 0x10, 0x01, 0x01, 0x01, 0x01, +0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, +0x20, 0x10, 0x02, 0x10, 0x02, 0x02, 0x02, 0x02, +0x48, 0x10, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, +0x10, 0x10, 0x01, 0x10, 0x10, 0x10, 0x10, 0x01, +0x10, 0x10, 0x10, 0x02, 0x10, 0x10, 0x10, 0x10, +0x10, 0x02, 0x02, 0x10, 0x01, 0x10, 0x02, 0x02, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, +0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x10, +0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x10 +}; + +uchar NEAR to_lower_win1250ch[] = { +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, +0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, +0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, +0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, +0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, +0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, +0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, +0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, +0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, +0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, +0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, +0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, +0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, +0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, +0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, +0x88, 0x89, 0x9a, 0x8b, 0x9c, 0x9d, 0x9e, 0x9f, +0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, +0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, +0xa0, 0xa1, 0xa2, 0xb3, 0xa4, 0xb9, 0xa6, 0xdf, +0xa8, 0xa9, 0xba, 0xab, 0xac, 0xad, 0xae, 0xbf, +0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, +0xb8, 0xb9, 0xba, 0xbb, 0xbe, 0xbd, 0xbe, 0xbf, +0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, +0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, +0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xd7, +0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf, +0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, +0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, +0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, +0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff +}; + +uchar NEAR to_upper_win1250ch[] = { +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, +0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, +0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, +0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, +0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, +0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, +0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, +0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, +0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, +0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, +0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, +0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, +0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, +0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, +0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, +0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, +0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, +0x98, 0x99, 0x8a, 0x9b, 0x8c, 0x8d, 0x8e, 0x8f, +0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, +0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, +0xb0, 0xb1, 0xb2, 0xa3, 0xb4, 0xb5, 0xb6, 0xb7, +0xb8, 0xa5, 0xaa, 0xbb, 0xbc, 0xbd, 0xbc, 0xaf, +0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, +0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, +0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, +0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xa7, +0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, +0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, +0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xf7, +0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xff +}; + +#else + +#include +#define uchar unsigned char + +#endif + + +uchar NEAR sort_order_win1250ch[] = { +0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, +16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, +32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, +48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, +64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, +80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, +96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, +112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, +128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, +144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, +160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, +176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, +192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, +208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, +224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, +240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 +}; + +uchar NEAR _sort_order_win1250ch1[] = { +0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, +/* space ord 32 0x20 */ +0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, +0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, +/* 0 ord 48 0x30 */ +0x92, 0x93, 0x94, 0x95, 0x95, 0x97, 0x98, 0x99, +0x9a, 0x9b, + /* colon ord 58 0x3a */ + 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, +0xa2, + /* A ord 65 0x41 */ + 0xa4, 0xa5, + /* C ord 67 0x43 */ + 0xff, 0xa8, 0xa9, 0xaa, 0xab, +0xac, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, +0xb5, 0xb6, + /* R ord 82 0x52 */ + 0xb7, + /* S ord 83 0x53 */ + 0xb9, 0xbc, 0xbd, 0xbe, 0xbf, +0xc0, 0xc1, 0xc2, + /* [ ord 91 0x5b */ + 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, +0xc9, + /* a ord 97 0x61 */ + 0xa4, 0xa5, 0xff, 0xa8, 0xa9, 0xaa, 0xab, +0xac, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, +0xb5, 0xb6, 0xb7, 0xb9, 0xbc, 0xbd, 0xbe, 0xbf, +0xc0, 0xc1, 0xc2, + /* { ord 123 0x7b */ + 0xca, 0xcb, 0xcc, 0xcd, 0x81, +0x81, 0x81, 0xce, 0x81, 0xcf, 0xd0, 0xd1, 0xd2, +0x81, 0xd3, + /* Scaron ord 138 0x8a */ + 0xba, 0xd4, 0xb9, 0xbc, 0xc3, 0xc2, +0x81, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, +0x81, 0xdc, 0xba, 0xdd, 0xb9, 0xbc, 0xc3, 0xc2, +/* nobreakspace ord 160 0xa0 */ +0x82, 0xde, 0xdf, 0xb1, 0xe0, 0xa4, 0xe1, 0xe2, +0xe3, 0xe4, 0xb9, 0xe5, 0xe6, 0xe7, 0xe8, 0xc2, +0xe9, 0xea, 0xeb, 0xb1, 0xed, 0xee, 0x81, 0xef, +/* cedilla ord 183 0xb8 */ +0xf0, 0xa4, 0xb9, 0xf1, 0xb1, 0xf2, 0xb1, 0xc2, +0xb7, 0xa4, 0xa4, 0xa4, 0xa4, 0xb1, 0xa6, 0xa6, +0xa7, 0xa9, 0xa9, 0xa9, 0xa9, 0xae, 0xae, 0xa8, +/* Eth ord 208 0xd0 */ +0xa8, 0xb3, 0xb3, 0xb4, 0xb4, 0xb4, 0xb4, 0xf3, +0xb8, 0xbd, 0xbd, 0xbd, 0xbd, 0xc1, 0xbc, 0xbb, +/* racute ord 224 0xe0 */ +0xb7, 0xa4, 0xa4, 0xa4, 0xa4, 0xb1, 0xa6, 0xa6, +0xa7, 0xa9, 0xa9, 0xa9, 0xa9, 0xae, 0xae, 0xa8, +/* eth ord 240 0xf0 */ +0xa8, 0xb3, 0xb3, 0xb4, 0xb4, 0xb4, 0xb4, 0xf4, +0xb8, 0xbd, 0xbd, 0xbd, 0xbd, 0xc1, 0xbc, 0xf5 +}; + +uchar NEAR _sort_order_win1250ch2[] = { +0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, +0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, +0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, +0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, +/* space ord 32 0x20 */ +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +/* 0 ord 48 0x30 */ +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, + /* colon ord 58 0x3a */ + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, + /* A ord 65 0x41 */ + 0x01, 0x01, + /* C ord 67 0x43 */ + 0xff, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, + /* R ord 82 0x52 */ + 0x01, + /* S ord 83 0x53 */ + 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, + /* [ ord 91 0x5b */ + 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, + /* a ord 97 0x61 */ + 0x02, 0x02, 0xff, 0x02, 0x02, 0x02, 0x02, +0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +0x02, 0x02, 0x02, + /* { ord 123 0x7b */ + 0x01, 0x01, 0x01, 0x01, 0x22, +0x23, 0x24, 0x01, 0x25, 0x01, 0x01, 0x01, 0x01, +0x26, 0x01, + /* Scaron ord 138 0x8a */ + 0x01, 0x01, 0x03, 0x03, 0x01, 0x05, +0x27, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x28, 0x01, 0x02, 0x01, 0x04, 0x04, 0x02, 0x06, +/* nobreakspace ord 160 0xa0 */ +0x02, 0x01, 0x01, 0x07, 0x01, 0x11, 0x01, 0x01, +0x01, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x03, +0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x29, 0x01, +/* cedilla ord 184 0xb8 */ +0x01, 0x12, 0x06, 0x01, 0x05, 0x01, 0x06, 0x04, +0x03, 0x03, 0x05, 0x07, 0x09, 0x03, 0x03, 0x05, +0x01, 0x03, 0x09, 0x07, 0x05, 0x03, 0x05, 0x03, +/* Eth ord 208 0xd0 */ +0x05, 0x03, 0x05, 0x03, 0x05, 0x09, 0x07, 0x01, +0x01, 0x05, 0x03, 0x09, 0x07, 0x03, 0x05, 0x01, +/* racute ord 224 0xe0 */ +0x04, 0x04, 0x06, 0x08, 0x0a, 0x04, 0x04, 0x06, +0x02, 0x04, 0x0a, 0x08, 0x06, 0x04, 0x06, 0x04, +/* eth ord 240 0xf0 */ +0x06, 0x04, 0x06, 0x04, 0x06, 0x0a, 0x08, 0x01, +0x02, 0x06, 0x04, 0x0a, 0x08, 0x04, 0x06, 0x01 +}; + +struct wordvalue { + const char * word; + uchar pass1; + uchar pass2; +}; +static struct wordvalue doubles[] = { + { "ch", 0xad, 0x03 }, + { "c", 0xa6, 0x02 }, + { "Ch", 0xad, 0x02 }, + { "CH", 0xad, 0x01 }, + { "C", 0xa6, 0x01 }, +}; + +#define NEXT_CMP_VALUE(src, p, pass, value, len) \ + while (1) { \ + if (IS_END(p, src, len)) { \ + if (pass == 0) { p = src; pass++; } \ + else { value = 0; break; } \ + } \ + value = ((pass == 0) ? _sort_order_win1250ch1[*p] \ + : _sort_order_win1250ch2[*p]); \ + if (value == 0xff) { \ + int i; \ + for (i = 0; i < (int) sizeof(doubles); i++) { \ + const uchar * patt = doubles[i].word; \ + const uchar * q = (const char *) p; \ + while (*patt \ + && !(IS_END(q, src, len)) \ + && (*patt == *q)) { \ + patt++; q++; \ + } \ + if (!(*patt)) { \ + value = (int)((pass == 0) \ + ? doubles[i].pass1 \ + : doubles[i].pass2); \ + p = (const uchar *) q - 1; \ + break; \ + } \ + } \ + } \ + p++; \ + break; \ + } + +#define IS_END(p, src, len) (!(*p)) + +int my_strcoll_win1250ch(const uchar * s1, const uchar * s2) { + int v1, v2; + const uchar * p1, * p2; + int pass1 = 0, pass2 = 0; + int diff; + + p1 = s1; p2 = s2; + + do { + NEXT_CMP_VALUE(s1, p1, pass1, v1, 0); + NEXT_CMP_VALUE(s2, p2, pass2, v2, 0); + diff = v1 - v2; + if (diff != 0) return diff; + } while (v1); + return 0; +} + +#ifdef UNUSED +int my_strxfrm_win1250ch(uchar * dest, const uchar * src, int len) { + int value; + const uchar * p; + int pass = 0; + int totlen = 0; + p = src; + + do { + NEXT_CMP_VALUE(src, p, pass, value, 0); + if (totlen <= len) + dest[totlen] = value; + totlen++; + } while (value); + return totlen; +} +#endif + +#undef IS_END + +#define IS_END(p, src, len) (((char *)p - (char *)src) >= (len)) + +int my_strnncoll_win1250ch(CHARSET_INFO *cs __attribute__((unused)), + const uchar * s1, uint len1, + const uchar * s2, uint len2) { + int v1, v2; + const uchar * p1, * p2; + int pass1 = 0, pass2 = 0; + int diff; + + p1 = s1; p2 = s2; + + do { + NEXT_CMP_VALUE(s1, p1, pass1, v1, (int)len1); + NEXT_CMP_VALUE(s2, p2, pass2, v2, (int)len2); + diff = v1 - v2; + if (diff != 0) return diff; + } while (v1); + return 0; +} + +int my_strnxfrm_win1250ch(CHARSET_INFO * cs __attribute__((unused)), + uchar * dest, uint len, + const uchar * src, uint srclen) { + int value; + const uchar * p; + int pass = 0; + uint totlen = 0; + p = src; + + do { + NEXT_CMP_VALUE(src, p, pass, value, (int)srclen); + if (totlen <= len) + dest[totlen] = value; + totlen++; + } while (value) ; + return totlen; +} + +#undef IS_END + + +#ifdef REAL_MYSQL + +static uchar NEAR like_range_prefix_min_win1250ch[] = { +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, +48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, +64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, +80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, +96, 54, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, +80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 165, 124, 125, 126, 0, +0, 0, 130, 0, 132, 133, 134, 135, 0, 137, 138, 139, 83, 84, 142, 90, +0, 145, 146, 147, 148, 149, 150, 151, 0, 153, 138, 155, 83, 84, 142, 90, +32, 161, 162, 76, 164, 165, 166, 167, 168, 65, 83, 171, 172, 173, 174, 90, +176, 177, 178, 76, 180, 181, 0, 183, 184, 65, 83, 187, 76, 189, 76, 90, +82, 65, 65, 65, 65, 76, 67, 67, 200, 69, 69, 69, 69, 73, 73, 68, +68, 78, 78, 79, 79, 79, 79, 215, 216, 85, 85, 85, 85, 89, 84, 223, +82, 65, 65, 65, 65, 76, 67, 67, 200, 69, 69, 69, 69, 73, 73, 68, +68, 78, 78, 79, 79, 79, 79, 247, 216, 85, 85, 85, 85, 89, 84, 255, +}; +static uchar NEAR like_range_prefix_max_win1250ch[] = { +182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, +182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, +160, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, +48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, +64, 185, 98, 73, 240, 234, 102, 103, 104, 238, 106, 107, 179, 109, 242, 245, +112, 113, 224, 186, 254, 251, 118, 119, 120, 253, 159, 91, 92, 93, 94, 95, +96, 54, 98, 73, 240, 234, 102, 103, 104, 238, 106, 107, 179, 109, 242, 245, +112, 113, 224, 186, 254, 251, 118, 119, 120, 253, 159, 165, 124, 125, 126, 182, +182, 182, 130, 182, 132, 133, 134, 135, 182, 137, 154, 139, 186, 254, 158, 159, +182, 145, 146, 147, 148, 149, 150, 151, 182, 153, 154, 155, 186, 254, 158, 159, +32, 161, 162, 179, 164, 165, 166, 167, 168, 185, 186, 171, 172, 173, 174, 159, +176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 179, 189, 179, 159, +224, 185, 185, 185, 185, 179, 238, 238, 200, 234, 234, 234, 234, 238, 238, 240, +240, 242, 242, 245, 245, 245, 245, 215, 248, 251, 251, 251, 251, 253, 254, 223, +224, 185, 185, 185, 185, 179, 238, 238, 200, 234, 234, 234, 234, 238, 238, 240, +240, 242, 242, 245, 245, 245, 245, 247, 248, 251, 251, 251, 251, 253, 254, 255, +}; + +#define min_sort_char '\x00' +#define max_sort_char '\xff' +#define wild_one '_' +#define wild_many '%' + +/* +** Calculate min_str and max_str that ranges a LIKE string. +** Arguments: +** ptr Pointer to LIKE string. +** ptr_length Length of LIKE string. +** escape Escape character in LIKE. (Normally '\'). +** All escape characters should be removed from min_str and max_str +** res_length Length of min_str and max_str. +** min_str Smallest case sensitive string that ranges LIKE. +** Should be space padded to res_length. +** max_str Largest case sensitive string that ranges LIKE. +** Normally padded with the biggest character sort value. +** +** The function should return 0 if ok and 1 if the LIKE string can't be +** optimized ! +*/ + +my_bool my_like_range_win1250ch(CHARSET_INFO *cs __attribute__((unused)), + const char *ptr, uint ptr_length, + pchar escape, uint res_length, + char *min_str, char *max_str, + uint *min_length, uint *max_length) { + + int was_other_than_min = 0; + const char *end = ptr + ptr_length; + char *min_org = min_str; + char *min_end = min_str + res_length; + + /* return 1; */ + + for (; ptr != end && min_str != min_end ; ptr++) { + if (*ptr == wild_one) { /* '_' in SQL */ + break; + } + if (*ptr == wild_many) { /* '%' in SQL */ + break; + } + if (*ptr == escape && ptr + 1 != end) { /* Skip escape */ + ptr++; + } + *min_str = like_range_prefix_min_win1250ch[(uint)(*ptr)]; + if (*min_str != min_sort_char) { + was_other_than_min = 1; + } + min_str++; + *max_str++ = like_range_prefix_max_win1250ch[(uint)(*ptr)]; + } + + *min_length = (uint) (min_str - min_org); + *max_length = res_length; + while (min_str != min_end) { + *min_str++ = min_sort_char; + *max_str++ = max_sort_char; + } + if (! was_other_than_min) { + return 1; + } + + return 0; +} + +#endif diff --git a/strings/ctype.c b/strings/ctype.c index fa2937eec81..c4fb6f1388d 100644 --- a/strings/ctype.c +++ b/strings/ctype.c @@ -2829,6 +2829,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -2859,6 +2860,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_mb, my_strcasecmp_mb, my_strncasecmp_mb, + NULL, /* hash_caseup */ 0 }, #endif @@ -2889,6 +2891,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -2919,6 +2922,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -2949,6 +2953,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -2979,6 +2984,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -3009,6 +3015,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -3039,6 +3046,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -3069,6 +3077,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -3099,6 +3108,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -3129,6 +3139,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_mb, my_strcasecmp_mb, my_strncasecmp_mb, + NULL, /* hash_caseup */ 0 }, #endif @@ -3159,6 +3170,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_mb, my_strcasecmp_mb, my_strncasecmp_mb, + NULL, /* hash_caseup */ 0 }, #endif @@ -3189,6 +3201,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_mb, my_strcasecmp_mb, my_strncasecmp_mb, + NULL, /* hash_caseup */ 0 }, #endif @@ -3219,6 +3232,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -3249,6 +3263,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -3279,6 +3294,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -3309,6 +3325,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -3339,6 +3356,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -3369,6 +3387,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -3399,6 +3418,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -3429,6 +3449,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -3459,6 +3480,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -3489,6 +3511,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -3519,6 +3542,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -3549,6 +3573,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -3579,6 +3604,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -3609,6 +3635,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_mb, my_strcasecmp_mb, my_strncasecmp_mb, + NULL, /* hash_caseup */ 0 }, #endif @@ -3639,6 +3666,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_utf8, my_strcasecmp_utf8, my_strncasecmp_utf8, + my_hash_caseup_utf8,/* hash_caseup */ 0 }, #endif @@ -3669,6 +3697,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -3699,6 +3728,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -3729,6 +3759,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -3759,6 +3790,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -3789,6 +3821,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -3819,6 +3852,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, + NULL, /* hash_caseup */ 0 }, #endif @@ -3850,6 +3884,7 @@ CHARSET_INFO compiled_charsets[] = { NULL, NULL, NULL, + NULL, /* hash_caseup */ 0 } }; -- cgit v1.2.1 From 48297dbfcf6c3829b21662774cdc08e65dede423 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 17 Apr 2002 17:27:13 +0500 Subject: Fix for problem that GROUP BY and DISTINCT didn't work for UTF8 --- heap/hp_hash.c | 14 ++++++++++++-- include/m_ctype.h | 5 ++++- strings/ctype-utf8.c | 20 ++++++++++++++++++++ strings/ctype.c | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 71 insertions(+), 3 deletions(-) diff --git a/heap/hp_hash.c b/heap/hp_hash.c index 519779d330d..2ca33e5b782 100644 --- a/heap/hp_hash.c +++ b/heap/hp_hash.c @@ -151,7 +151,8 @@ void _hp_movelink(HASH_INFO *pos, HASH_INFO *next_link, HASH_INFO *newlink) ulong _hp_hashnr(register HP_KEYDEF *keydef, register const byte *key) { - register ulong nr=1, nr2=4; + /*register*/ + ulong nr=1, nr2=4; HP_KEYSEG *seg,*endseg; for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++) @@ -170,6 +171,10 @@ ulong _hp_hashnr(register HP_KEYDEF *keydef, register const byte *key) } if (seg->type == HA_KEYTYPE_TEXT) { + if (default_charset_info->hash_sort) + default_charset_info->hash_sort(default_charset_info, + pos,((uchar*)key)-pos,&nr,&nr2); + else for (; pos < (uchar*) key ; pos++) { nr^=(ulong) ((((uint) nr & 63)+nr2) * @@ -193,7 +198,8 @@ ulong _hp_hashnr(register HP_KEYDEF *keydef, register const byte *key) ulong _hp_rec_hashnr(register HP_KEYDEF *keydef, register const byte *rec) { - register ulong nr=1, nr2=4; + /*register*/ + ulong nr=1, nr2=4; HP_KEYSEG *seg,*endseg; for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++) @@ -209,6 +215,10 @@ ulong _hp_rec_hashnr(register HP_KEYDEF *keydef, register const byte *rec) } if (seg->type == HA_KEYTYPE_TEXT) { + if (default_charset_info->hash_sort) + default_charset_info->hash_sort(default_charset_info, + pos,end-pos,&nr,&nr2); + else for (; pos < end ; pos++) { nr^=(ulong) ((((uint) nr & 63)+nr2)* diff --git a/include/m_ctype.h b/include/m_ctype.h index d52f86430d2..6e116b95428 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -94,6 +94,8 @@ typedef struct charset_info_st /* Hash calculation */ uint (*hash_caseup)(struct charset_info_st *cs, const byte *key, uint len); + void (*hash_sort)(struct charset_info_st *cs, const uchar *key, uint len, ulong *nr1, ulong *nr2); + char max_sort_char; /* For LIKE otimization */ } CHARSET_INFO; @@ -279,7 +281,8 @@ int my_utf8_uni (CHARSET_INFO *cs, my_wc_t *p, const uchar *s, const uchar *e); int my_uni_utf8 (CHARSET_INFO *cs, my_wc_t wc, uchar *b, uchar *e); uint my_hash_caseup_utf8(struct charset_info_st *cs, const byte *key, uint len); - +void my_hash_sort_utf8(struct charset_info_st *cs, const uchar *key, uint len, ulong *nr1, ulong *nr2); + #endif #define _U 01 /* Upper case */ diff --git a/strings/ctype-utf8.c b/strings/ctype-utf8.c index 62dcd9f6b87..a4485e1ef50 100644 --- a/strings/ctype-utf8.c +++ b/strings/ctype-utf8.c @@ -1754,6 +1754,26 @@ uint my_hash_caseup_utf8(CHARSET_INFO *cs, const byte *s, uint slen) return nr; } + +void my_hash_sort_utf8(CHARSET_INFO *cs, const uchar *s, uint slen, ulong *n1, ulong *n2) +{ + my_wc_t wc; + int res; + const uchar *e=s+slen; + + while ((s < e) && (res=my_utf8_uni(cs,&wc, (uchar *)s, (uchar*)e))>0 ) + { + int plane = (wc>>8) & 0xFF; + wc = uni_plane[plane] ? uni_plane[plane][wc & 0xFF].sort : wc; + n1[0]^= (((n1[0] & 63)+n2[0])*(wc & 0xFF))+ (n1[0] << 8); + n2[0]+=3; + n1[0]^= (((n1[0] & 63)+n2[0])*(wc >> 8))+ (n1[0] << 8); + n2[0]+=3; + s+=res; + } +} + + void my_caseup_str_utf8(CHARSET_INFO * cs, char * s) { my_caseup_utf8(cs, s, strlen(s)); diff --git a/strings/ctype.c b/strings/ctype.c index c4fb6f1388d..0c20db35da2 100644 --- a/strings/ctype.c +++ b/strings/ctype.c @@ -2830,6 +2830,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -2861,6 +2862,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_mb, my_strncasecmp_mb, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -2892,6 +2894,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -2923,6 +2926,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -2954,6 +2958,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -2985,6 +2990,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3016,6 +3022,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3047,6 +3054,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3078,6 +3086,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3109,6 +3118,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3140,6 +3150,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_mb, my_strncasecmp_mb, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3171,6 +3182,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_mb, my_strncasecmp_mb, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3202,6 +3214,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_mb, my_strncasecmp_mb, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3233,6 +3246,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3264,6 +3278,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3295,6 +3310,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3326,6 +3342,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3357,6 +3374,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3388,6 +3406,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3419,6 +3438,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3450,6 +3470,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3481,6 +3502,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3512,6 +3534,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3543,6 +3566,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3574,6 +3598,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3605,6 +3630,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3636,6 +3662,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_mb, my_strncasecmp_mb, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3667,6 +3694,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_utf8, my_strncasecmp_utf8, my_hash_caseup_utf8,/* hash_caseup */ + my_hash_sort_utf8, /* hash_sort */ 0 }, #endif @@ -3698,6 +3726,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3729,6 +3758,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3760,6 +3790,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3791,6 +3822,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3822,6 +3854,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3853,6 +3886,7 @@ CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -3885,6 +3919,7 @@ CHARSET_INFO compiled_charsets[] = { NULL, NULL, NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 } }; -- cgit v1.2.1 From e8b6c9646eb44a3fd000a7e7996f8e6bf4de7da6 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 18 Apr 2002 11:53:59 +0500 Subject: Fix for AsText() spatial function sql/item_strfunc.cc: Fix for the case when argument args[0] and result str are the same strings --- sql/item_strfunc.cc | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 4a7e5dfe33f..9c791453fd8 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -2128,12 +2128,16 @@ String *Item_func_as_text::val_str(String *str) { String *wkt = args[0]->val_str(str); Geometry geom; - - str->length(0); + if ((null_value=(args[0]->null_value || - geom.create_from_wkb(wkt->ptr(),wkt->length()) || - geom.as_wkt(str)))) + geom.create_from_wkb(wkt->ptr(),wkt->length())))) + return 0; + + str->length(0); + + if ((null_value=geom.as_wkt(str))) return 0; + return str; } -- cgit v1.2.1 From c7e72e8d55067b2638a7e8ee6561b0b42008d6de Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 18 Apr 2002 14:08:38 +0500 Subject: Fix to use Monty's changes in frm format Enable latin1 by default configure.in: Always compile latin1 sql/ha_myisam.cc: Fix for "SHOW KEYS FROM table" and various key types sql/sql_show.cc: Fix to use Monty's changes in frm format sql/sql_table.cc: Fix to use Monty's changes in frm format sql/structs.h: Fix to use Monty's changes in frm format sql/table.cc: Fix to use Monty's changes in frm format --- configure.in | 3 +++ sql/ha_myisam.cc | 8 ++++++-- sql/sql_show.cc | 2 +- sql/sql_table.cc | 11 +++++++---- sql/structs.h | 1 - sql/table.cc | 13 +++++++++++-- 6 files changed, 28 insertions(+), 10 deletions(-) diff --git a/configure.in b/configure.in index 6e303f32e9b..cfd6ae5747c 100644 --- a/configure.in +++ b/configure.in @@ -2086,6 +2086,9 @@ do esac done +dnl Always compile latin1 +AC_DEFINE(HAVE_CHARSET_latin1) + if test "$use_mb" = "yes" then AC_DEFINE(USE_MB) diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc index df4de96b6c5..eabf9536fd0 100644 --- a/sql/ha_myisam.cc +++ b/sql/ha_myisam.cc @@ -124,8 +124,12 @@ const char **ha_myisam::bas_ext() const const char *ha_myisam::index_type(uint key_number) { - return ((table->key_info[key_number].flags & HA_FULLTEXT) ? + return ((table->key_info[key_number].flags & HA_FULLTEXT) ? "FULLTEXT" : + (table->key_info[key_number].flags & HA_SPATIAL) ? + "SPATIAL" : + (table->key_info[key_number].algorithm == HA_KEY_ALG_RTREE) ? + "RTREE" : "BTREE"); } @@ -1006,7 +1010,7 @@ int ha_myisam::create(const char *name, register TABLE *table, for (i=0; i < table->keys ; i++, pos++) { keydef[i].flag= (pos->flags & (HA_NOSAME | HA_FULLTEXT | HA_SPATIAL)); - keydef[i].key_alg=pos->key_alg; // +BAR + keydef[i].key_alg=pos->algorithm; keydef[i].seg=keyseg; keydef[i].keysegs=pos->key_parts; for (j=0 ; j < pos->key_parts ; j++) diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 0aa0c643ba9..95705c19d68 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -890,7 +890,7 @@ store_create_info(THD *thd, TABLE *table, String *packet) append_identifier(thd,packet,key_info->name); // +BAR: send USING only in non-default case: non-spatial rtree - if((key_info->key_alg == HA_KEY_ALG_RTREE) && !(key_info->flags & HA_SPATIAL)) + if((key_info->algorithm == HA_KEY_ALG_RTREE) && !(key_info->flags & HA_SPATIAL)) packet->append(" USING RTREE",12); packet->append(" (", 2); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 19fcf5970c2..f5cb9a07a41 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -454,7 +454,7 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, key_info->flags = HA_NOSAME; } - key_info->key_alg = key->algorithm; + key_info->algorithm = key->algorithm; key_info->key_parts=(uint8) key->columns.elements; key_info->key_part=key_part_info; key_info->usable_key_parts= key_number; @@ -476,7 +476,10 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, in near future when new frm file is ready checking for proper key parts number: */ - + +printf("key_info->flags=%d key_info->algorithm=%d\n", + key_info->flags,key_info->algorithm); + if(key_info->flags == HA_SPATIAL){ if(key_info->key_parts!=1){ my_printf_error(ER_WRONG_ARGUMENTS, @@ -485,7 +488,7 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, } }else { - if(key_info->key_alg == HA_KEY_ALG_RTREE){ + if(key_info->algorithm == HA_KEY_ALG_RTREE){ if((key_info->key_parts&1)==1){ my_printf_error(ER_WRONG_ARGUMENTS, ER(ER_WRONG_ARGUMENTS),MYF(0),"RTREE INDEX"); @@ -1584,7 +1587,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, Key::PRIMARY : Key::UNIQUE) : (key_info->flags & HA_FULLTEXT ? Key::FULLTEXT : Key::MULTIPLE)), - key_info->key_alg, + key_info->algorithm, key_name,key_parts)); } key_it.rewind(); diff --git a/sql/structs.h b/sql/structs.h index 978a523df7f..2250ea784f2 100644 --- a/sql/structs.h +++ b/sql/structs.h @@ -64,7 +64,6 @@ typedef struct st_key_part_info { /* Info about a key part */ typedef struct st_key { uint key_length; /* Tot length of key */ uint flags; /* dupp key and pack flags */ - enum ha_key_alg key_alg; /* +BAR Algorithm BTREE or RTREE */ uint key_parts; /* How many key_parts */ uint extra_length; uint usable_key_parts; /* Should normally be = key_parts */ diff --git a/sql/table.cc b/sql/table.cc index 122357a1fb1..7e4faa1ba7c 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -201,6 +201,13 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, for (i=0 ; i < keys ; i++, keyinfo++) keyinfo->algorithm= (enum ha_key_alg) *(strpos++); } + else + { + /* Set key types to BTREE, BAR TODO: how to be with HASH/RBTREE? */ + keyinfo=outparam->key_info; + for (i=0 ; i < keys ; i++, keyinfo++) + keyinfo->algorithm= HA_KEY_ALG_BTREE; + } outparam->reclength = uint2korr((head+16)); if (*(head+26) == 1) outparam->system=1; /* one-record-database */ @@ -408,10 +415,12 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, } } - keyinfo->key_alg=HA_KEY_ALG_BTREE; // BAR : btree by default + if (keyinfo->name[0]=='S') + keyinfo->flags |= HA_SPATIAL; -#define BAR_DIRTY_HACK #ifdef BAR_DIRTY_HACK + keyinfo->key_alg=HA_KEY_ALG_BTREE; // BAR : btree by default + // BAR FIXME: Dirty hack while waiting for new .frm format switch(keyinfo->name[0]){ case 'R': -- cgit v1.2.1 From 0e4445850dd29493d61e06650a7b2a430ca42ec8 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 18 Apr 2002 17:35:26 +0500 Subject: Exhange HA_AUTO_KEY and HA_SPATIAL values: FRM stores only 8bit flags --- include/my_base.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/my_base.h b/include/my_base.h index ae8fc2204d5..bb589fa59cc 100644 --- a/include/my_base.h +++ b/include/my_base.h @@ -147,11 +147,11 @@ enum ha_base_keytype { #define HA_NOSAME 1 /* Set if not dupplicated records */ #define HA_PACK_KEY 2 /* Pack string key to previous key */ -#define HA_AUTO_KEY 16 +#define HA_AUTO_KEY 1024 #define HA_BINARY_PACK_KEY 32 /* Packing of all keys to prev key */ #define HA_FULLTEXT 128 /* SerG: for full-text search */ #define HA_UNIQUE_CHECK 256 /* Check the key for uniqueness */ -#define HA_SPATIAL 1024 /* Alex Barkov: for spatial search */ +#define HA_SPATIAL 16 /* Alex Barkov: for spatial search */ #define HA_NULL_ARE_EQUAL 2048 /* NULL in key are cmp as equal */ -- cgit v1.2.1 From 139a73cade4827ca2a41d6cfc9db379b2c696fa3 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 25 Apr 2002 13:36:55 +0500 Subject: RB-Tree indexes support in HEAP tables Renamed _hp_func -> hp_func mi_key_cmp moved to /mysys/my_handler.c New tests for HEAP tables heap/_check.c: RB-tree index Renamed _hp_func -> hp_func heap/_rectest.c: RB-tree index Renamed _hp_func -> hp_func heap/heapdef.h: RB-tree index Renamed _hp_func -> hp_func heap/hp_block.c: RB-tree index Renamed _hp_func -> hp_func heap/hp_clear.c: RB-tree index Renamed _hp_func -> hp_func heap/hp_close.c: RB-tree index Renamed _hp_func -> hp_func heap/hp_create.c: RB-tree index Renamed _hp_func -> hp_func heap/hp_delete.c: RB-tree index Renamed _hp_func -> hp_func heap/hp_hash.c: RB-tree index Renamed _hp_func -> hp_func heap/hp_open.c: RB-tree index Renamed _hp_func -> hp_func heap/hp_panic.c: RB-tree index Renamed _hp_func -> hp_func heap/hp_rename.c: RB-tree index Renamed _hp_func -> hp_func heap/hp_rfirst.c: RB-tree index Renamed _hp_func -> hp_func heap/hp_rkey.c: RB-tree index Renamed _hp_func -> hp_func heap/hp_rlast.c: RB-tree index Renamed _hp_func -> hp_func heap/hp_rnext.c: RB-tree index Renamed _hp_func -> hp_func heap/hp_rprev.c: RB-tree index Renamed _hp_func -> hp_func heap/hp_rrnd.c: RB-tree index Renamed _hp_func -> hp_func heap/hp_rsame.c: RB-tree index Renamed _hp_func -> hp_func heap/hp_scan.c: RB-tree index Renamed _hp_func -> hp_func heap/hp_test1.c: RB-tree index Renamed _hp_func -> hp_func heap/hp_test2.c: RB-tree index Renamed _hp_func -> hp_func heap/hp_update.c: RB-tree index Renamed _hp_func -> hp_func heap/hp_write.c: RB-tree index Renamed _hp_func -> hp_func include/Makefile.am: New include include/heap.h: RB-Tree index include/my_tree.h: new search functions new custom_arg argument include/myisam.h: Removed MI_KEYSEG isam/isamlog.c: Add custom_arg isam/pack_isam.c: Add custom_arg myisam/ft_nlq_search.c: Add custom_arg myisam/ft_parser.c: Add custom_arg myisam/ft_stopwords.c: Add custom_arg myisam/mi_search.c: Remove mi_key_cmp myisam/mi_write.c: Add custom_arg myisam/myisamdef.h: Remove mi_key_cmp myisam/myisamlog.c: Add custom_arg myisam/myisampack.c: Add custom_arg mysys/Makefile.am: New file my_handler.c mysys/tree.c: custom_arg new search functions sql/ha_heap.cc: RBTree sql/ha_myisam.cc: RBTree sql/item_sum.cc: custom_arg sql/sql_analyse.cc: custom_arg sql/sql_class.h: custom_arg sql/sql_table.cc: Remove duplicate code sql/sql_yacc.yy: UNDEF by default sql/table.cc: Remove dirty hack --- heap/_check.c | 15 +- heap/_rectest.c | 4 +- heap/heapdef.h | 74 +++-- heap/hp_block.c | 8 +- heap/hp_clear.c | 26 +- heap/hp_close.c | 8 +- heap/hp_create.c | 13 +- heap/hp_delete.c | 59 ++-- heap/hp_hash.c | 146 +++++++-- heap/hp_open.c | 61 +++- heap/hp_panic.c | 4 +- heap/hp_rename.c | 2 +- heap/hp_rfirst.c | 39 ++- heap/hp_rkey.c | 45 ++- heap/hp_rlast.c | 36 ++- heap/hp_rnext.c | 52 ++- heap/hp_rprev.c | 44 ++- heap/hp_rrnd.c | 2 +- heap/hp_rsame.c | 4 +- heap/hp_scan.c | 2 +- heap/hp_test1.c | 6 +- heap/hp_test2.c | 18 +- heap/hp_update.c | 40 ++- heap/hp_write.c | 86 +++-- include/Makefile.am | 2 +- include/heap.h | 37 ++- include/my_handler.h | 63 ++++ include/my_tree.h | 18 +- include/myisam.h | 15 +- isam/isamlog.c | 6 +- isam/pack_isam.c | 6 +- myisam/ft_nlq_search.c | 2 +- myisam/ft_parser.c | 2 +- myisam/ft_stopwords.c | 4 +- myisam/mi_search.c | 382 ---------------------- myisam/mi_write.c | 3 +- myisam/myisamdef.h | 16 - myisam/myisamlog.c | 7 +- myisam/myisampack.c | 6 +- mysql-test/r/heap_btree.result | 205 ++++++++++++ mysql-test/r/heap_hash.result | 205 ++++++++++++ mysql-test/t/heap_btree.test | 140 ++++++++ mysql-test/t/heap_hash.test | 140 ++++++++ mysys/Makefile.am | 3 +- mysys/my_handler.c | 717 +++++++++++++++++++++++++++++++++++++++++ mysys/tree.c | 189 ++++++++++- sql/ha_heap.cc | 103 +++--- sql/ha_myisam.cc | 3 +- sql/item_sum.cc | 2 +- sql/sql_analyse.cc | 10 +- sql/sql_class.h | 2 +- sql/sql_table.cc | 1 - sql/sql_yacc.yy | 2 +- sql/table.cc | 22 -- 54 files changed, 2360 insertions(+), 747 deletions(-) create mode 100644 include/my_handler.h create mode 100644 mysql-test/r/heap_btree.result create mode 100644 mysql-test/r/heap_hash.result create mode 100644 mysql-test/t/heap_btree.test create mode 100644 mysql-test/t/heap_hash.test create mode 100644 mysys/my_handler.c diff --git a/heap/_check.c b/heap/_check.c index 03fb664cba9..3498625bffc 100644 --- a/heap/_check.c +++ b/heap/_check.c @@ -31,8 +31,11 @@ int heap_check_heap(HP_INFO *info,my_bool print_status) DBUG_ENTER("heap_check_keys"); for (error=key=0 ; key < share->keys ; key++) - error|=check_one_key(share->keydef+key,key, share->records,share->blength, - print_status); + { + if (!(share->keydef[key].algorithm == HA_KEY_ALG_BTREE)) + error|=check_one_key(share->keydef+key,key, share->records,share->blength, + print_status); + } DBUG_RETURN(error); } @@ -50,8 +53,8 @@ static int check_one_key(HP_KEYDEF *keydef, uint keynr, ulong records, for (i=found=max_links=seek=0 ; i < records ; i++) { hash_info=hp_find_hash(&keydef->block,i); - if (_hp_mask(_hp_rec_hashnr(keydef,hash_info->ptr_to_rec), - blength,records) == i) + if (hp_mask(hp_rec_hashnr(keydef, hash_info->ptr_to_rec), + blength,records) == i) { found++; seek++; @@ -59,8 +62,8 @@ static int check_one_key(HP_KEYDEF *keydef, uint keynr, ulong records, while ((hash_info=hash_info->next_key) && found < records + 1) { seek+= ++links; - if ((rec_link=_hp_mask(_hp_rec_hashnr(keydef,hash_info->ptr_to_rec), - blength,records)) + if ((rec_link = hp_mask(hp_rec_hashnr(keydef, hash_info->ptr_to_rec), + blength, records)) != i) { DBUG_PRINT("error",("Record in wrong link: Link %d Record: %lx Record-link %d", i,hash_info->ptr_to_rec,rec_link)); diff --git a/heap/_rectest.c b/heap/_rectest.c index 522940286fd..eb350263cec 100644 --- a/heap/_rectest.c +++ b/heap/_rectest.c @@ -19,9 +19,9 @@ #include "heapdef.h" -int _hp_rectest(register HP_INFO *info, register const byte *old) +int hp_rectest(register HP_INFO *info, register const byte *old) { - DBUG_ENTER("_hp_rectest"); + DBUG_ENTER("hp_rectest"); if (memcmp(info->current_ptr,old,(size_t) info->s->reclength)) { diff --git a/heap/heapdef.h b/heap/heapdef.h index bdd7de45370..53ad87a7d20 100644 --- a/heap/heapdef.h +++ b/heap/heapdef.h @@ -21,6 +21,7 @@ #include #endif #include "heap.h" /* Structs & some defines */ +#include "my_tree.h" /* Some extern variables */ @@ -29,10 +30,10 @@ extern LIST *heap_open_list,*heap_share_list; #define test_active(info) \ if (!(info->update & HA_STATE_AKTIV))\ { my_errno=HA_ERR_NO_ACTIVE_RECORD; DBUG_RETURN(-1); } -#define hp_find_hash(A,B) ((HASH_INFO*) _hp_find_block((A),(B))) +#define hp_find_hash(A,B) ((HASH_INFO*) hp_find_block((A),(B))) /* Find pos for record and update it in info->current_ptr */ -#define _hp_find_record(info,pos) (info)->current_ptr= _hp_find_block(&(info)->s->block,pos) +#define hp_find_record(info,pos) (info)->current_ptr= hp_find_block(&(info)->s->block,pos) typedef struct st_hp_hash_info { @@ -40,40 +41,51 @@ typedef struct st_hp_hash_info byte *ptr_to_rec; } HASH_INFO; +typedef struct { + MI_KEYSEG *keyseg; + uint key_length; + uint search_flag; +} heap_rb_param; + /* Prototypes for intern functions */ -extern HP_SHARE *_hp_find_named_heap(const char *name); -extern int _hp_rectest(HP_INFO *info,const byte *old); -extern void _hp_delete_file_from_open_list(HP_INFO *info); -extern byte *_hp_find_block(HP_BLOCK *info,ulong pos); -extern int _hp_get_new_block(HP_BLOCK *info, ulong* alloc_length); -extern void _hp_free(HP_SHARE *info); -extern byte *_hp_free_level(HP_BLOCK *block,uint level,HP_PTRS *pos, - byte *last_pos); -extern int _hp_write_key(HP_SHARE *info,HP_KEYDEF *keyinfo, - const byte *record,byte *recpos); -extern int _hp_delete_key(HP_INFO *info,HP_KEYDEF *keyinfo, - const byte *record,byte *recpos,int flag); +extern HP_SHARE *hp_find_named_heap(const char *name); +extern int hp_rectest(HP_INFO *info,const byte *old); +extern byte *hp_find_block(HP_BLOCK *info,ulong pos); +extern int hp_get_new_block(HP_BLOCK *info, ulong* alloc_length); +extern void hp_free(HP_SHARE *info); +extern byte *hp_free_level(HP_BLOCK *block,uint level,HP_PTRS *pos, + byte *last_pos); +extern int hp_write_key(HP_INFO *info, HP_KEYDEF *keyinfo, + const byte *record, byte *recpos); +extern int hp_rb_write_key(HP_INFO *info, HP_KEYDEF *keyinfo, + const byte *record, byte *recpos); +extern int hp_rb_delete_key(HP_INFO *info,HP_KEYDEF *keyinfo, + const byte *record,byte *recpos,int flag); +extern int hp_delete_key(HP_INFO *info,HP_KEYDEF *keyinfo, + const byte *record,byte *recpos,int flag); extern HASH_INFO *_heap_find_hash(HP_BLOCK *block,ulong pos); -extern byte *_hp_search(HP_INFO *info,HP_KEYDEF *keyinfo,const byte *key, - uint nextflag); -extern byte *_hp_search_next(HP_INFO *info, HP_KEYDEF *keyinfo, - const byte *key, - HASH_INFO *pos); -extern ulong _hp_hashnr(HP_KEYDEF *keyinfo,const byte *key); -extern ulong _hp_rec_hashnr(HP_KEYDEF *keyinfo,const byte *rec); -extern ulong _hp_mask(ulong hashnr,ulong buffmax,ulong maxlength); -extern void _hp_movelink(HASH_INFO *pos,HASH_INFO *next_link, +extern byte *hp_search(HP_INFO *info,HP_KEYDEF *keyinfo,const byte *key, + uint nextflag); +extern byte *hp_search_next(HP_INFO *info, HP_KEYDEF *keyinfo, + const byte *key, HASH_INFO *pos); +extern ulong hp_hashnr(HP_KEYDEF *keyinfo,const byte *key); +extern ulong hp_rec_hashnr(HP_KEYDEF *keyinfo,const byte *rec); +extern ulong hp_mask(ulong hashnr,ulong buffmax,ulong maxlength); +extern void hp_movelink(HASH_INFO *pos,HASH_INFO *next_link, HASH_INFO *newlink); -extern int _hp_rec_key_cmp(HP_KEYDEF *keydef,const byte *rec1, - const byte *rec2); -extern int _hp_key_cmp(HP_KEYDEF *keydef,const byte *rec, - const byte *key); -extern void _hp_make_key(HP_KEYDEF *keydef,byte *key,const byte *rec); +extern int hp_rec_key_cmp(HP_KEYDEF *keydef,const byte *rec1, + const byte *rec2); +extern int hp_key_cmp(HP_KEYDEF *keydef,const byte *rec, + const byte *key); +extern void hp_make_key(HP_KEYDEF *keydef,byte *key,const byte *rec); +extern void hp_rb_make_key(HP_KEYDEF *keydef, byte *key, + const byte *rec, byte *recpos); extern my_bool hp_if_null_in_key(HP_KEYDEF *keyinfo, const byte *record); -extern int _hp_close(register HP_INFO *info); -extern void _hp_clear(HP_SHARE *info); - +extern int hp_close(register HP_INFO *info); +extern void hp_clear(HP_SHARE *info); +extern uint hp_rb_pack_key(HP_INFO *info, uint inx, uchar *key, + const uchar *old, uint k_length); #ifdef THREAD extern pthread_mutex_t THR_LOCK_heap; #else diff --git a/heap/hp_block.c b/heap/hp_block.c index 5c052218e58..6a022fb3084 100644 --- a/heap/hp_block.c +++ b/heap/hp_block.c @@ -20,7 +20,7 @@ /* Find record according to record-position */ -byte *_hp_find_block(HP_BLOCK *block, ulong pos) +byte *hp_find_block(HP_BLOCK *block, ulong pos) { reg1 int i; reg3 HP_PTRS *ptr; @@ -37,7 +37,7 @@ byte *_hp_find_block(HP_BLOCK *block, ulong pos) /* get one new block-of-records. Alloc ptr to block if neaded */ /* Interrupts are stopped to allow ha_panic in interrupts */ -int _hp_get_new_block(HP_BLOCK *block, ulong *alloc_length) +int hp_get_new_block(HP_BLOCK *block, ulong *alloc_length) { reg1 uint i,j; HP_PTRS *root; @@ -84,7 +84,7 @@ int _hp_get_new_block(HP_BLOCK *block, ulong *alloc_length) /* free all blocks under level */ -byte *_hp_free_level(HP_BLOCK *block, uint level, HP_PTRS *pos, byte *last_pos) +byte *hp_free_level(HP_BLOCK *block, uint level, HP_PTRS *pos, byte *last_pos) { int i,max_pos; byte *next_ptr; @@ -99,7 +99,7 @@ byte *_hp_free_level(HP_BLOCK *block, uint level, HP_PTRS *pos, byte *last_pos) next_ptr=(byte*) (pos+1); for (i=0 ; i < max_pos ; i++) - next_ptr=_hp_free_level(block,level-1, + next_ptr=hp_free_level(block,level-1, (HP_PTRS*) pos->blocks[i],next_ptr); } if ((byte*) pos != last_pos) diff --git a/heap/hp_clear.c b/heap/hp_clear.c index 2dcf91c03d7..e65d3a172c3 100644 --- a/heap/hp_clear.c +++ b/heap/hp_clear.c @@ -24,25 +24,33 @@ void heap_clear(HP_INFO *info) { - _hp_clear(info->s); + hp_clear(info->s); } -void _hp_clear(HP_SHARE *info) +void hp_clear(HP_SHARE *info) { uint key; - DBUG_ENTER("_hp_clear"); + DBUG_ENTER("hp_clear"); if (info->block.levels) - VOID(_hp_free_level(&info->block,info->block.levels,info->block.root, + VOID(hp_free_level(&info->block,info->block.levels,info->block.root, (byte*) 0)); info->block.levels=0; for (key=0 ; key < info->keys ; key++) { - HP_BLOCK *block= &info->keydef[key].block; - if (block->levels) - VOID(_hp_free_level(block,block->levels,block->root,(byte*) 0)); - block->levels=0; - block->last_allocated=0; + HP_KEYDEF *keyinfo = info->keydef + key; + if (keyinfo->algorithm == HA_KEY_ALG_BTREE) + { + delete_tree(&keyinfo->rb_tree); + } + else + { + HP_BLOCK *block= &keyinfo->block; + if (block->levels) + VOID(hp_free_level(block,block->levels,block->root,(byte*) 0)); + block->levels=0; + block->last_allocated=0; + } } info->records=info->deleted=info->data_length=info->index_length=0; info->blength=1; diff --git a/heap/hp_close.c b/heap/hp_close.c index 9e7d9ab31d1..3e0c9003ac8 100644 --- a/heap/hp_close.c +++ b/heap/hp_close.c @@ -26,16 +26,16 @@ int heap_close(HP_INFO *info) int tmp; DBUG_ENTER("heap_close"); pthread_mutex_lock(&THR_LOCK_heap); - tmp= _hp_close(info); + tmp= hp_close(info); pthread_mutex_unlock(&THR_LOCK_heap); DBUG_RETURN(tmp); } -int _hp_close(register HP_INFO *info) +int hp_close(register HP_INFO *info) { int error=0; - DBUG_ENTER("_hp_close"); + DBUG_ENTER("hp_close"); #ifndef DBUG_OFF if (info->s->changed && heap_check_heap(info,0)) { @@ -45,7 +45,7 @@ int _hp_close(register HP_INFO *info) info->s->changed=0; heap_open_list=list_delete(heap_open_list,&info->open_list); if (!--info->s->open_count && info->s->delete_on_close) - _hp_free(info->s); /* Table was deleted */ + hp_free(info->s); /* Table was deleted */ my_free((gptr) info,MYF(0)); DBUG_RETURN(error); } diff --git a/heap/hp_create.c b/heap/hp_create.c index 1307fab1d12..99f4cb0146d 100644 --- a/heap/hp_create.c +++ b/heap/hp_create.c @@ -21,16 +21,15 @@ #include "heapdef.h" - int heap_create(const char *name) { reg1 HP_SHARE *share; DBUG_ENTER("heap_create"); pthread_mutex_lock(&THR_LOCK_heap); - if ((share=_hp_find_named_heap(name))) + if ((share=hp_find_named_heap(name))) { if (share->open_count == 0) - _hp_free(share); + hp_free(share); } else { @@ -47,10 +46,10 @@ int heap_delete_table(const char *name) DBUG_ENTER("heap_delete_table"); pthread_mutex_lock(&THR_LOCK_heap); - if ((share=_hp_find_named_heap(name))) + if ((share = hp_find_named_heap(name))) { if (share->open_count == 0) - _hp_free(share); + hp_free(share); else share->delete_on_close=1; result=0; @@ -64,10 +63,10 @@ int heap_delete_table(const char *name) } -void _hp_free(HP_SHARE *share) +void hp_free(HP_SHARE *share) { heap_share_list=list_delete(heap_share_list,&share->open_list); - _hp_clear(share); /* Remove blocks from memory */ + hp_clear(share); /* Remove blocks from memory */ #ifdef THREAD thr_lock_delete(&share->lock); VOID(pthread_mutex_destroy(&share->intern_lock)); diff --git a/heap/hp_delete.c b/heap/hp_delete.c index 3ac321d5fa2..82513044058 100644 --- a/heap/hp_delete.c +++ b/heap/hp_delete.c @@ -20,25 +20,26 @@ int heap_delete(HP_INFO *info, const byte *record) { - uint key; byte *pos; HP_SHARE *share=info->s; + HP_KEYDEF *keydef, *end, *p_lastinx; DBUG_ENTER("heap_delete"); DBUG_PRINT("enter",("info: %lx record: %lx",info,record)); test_active(info); - if (info->opt_flag & READ_CHECK_USED && _hp_rectest(info,record)) + if (info->opt_flag & READ_CHECK_USED && hp_rectest(info,record)) DBUG_RETURN(my_errno); /* Record changed */ share->changed=1; if ( --(share->records) < share->blength >> 1) share->blength>>=1; pos=info->current_ptr; - for (key=0 ; key < share->keys ; key++) + p_lastinx = share->keydef + info->lastinx; + for (keydef = share->keydef, end = keydef + share->keys; keydef < end; + keydef++) { - if (_hp_delete_key(info,share->keydef+key,record,pos, - key == (uint) info->lastinx)) + if ((*keydef->delete_key)(info, keydef, record, pos, keydef == p_lastinx)) goto err; } @@ -49,22 +50,40 @@ int heap_delete(HP_INFO *info, const byte *record) share->deleted++; info->current_hash_ptr=0; DBUG_RETURN(0); - err: +err: if (++(share->records) == share->blength) share->blength+= share->blength; DBUG_RETURN(my_errno); } +/* +Remove one key from rb-tree +*/ +int hp_rb_delete_key(HP_INFO *info, register HP_KEYDEF *keyinfo, + const byte *record, byte *recpos, int flag) +{ + heap_rb_param custom_arg; + + if (flag) + info->last_pos = NULL; /* For heap_rnext/heap_rprev */ + + hp_rb_make_key(keyinfo, info->recbuf, record, recpos); + custom_arg.keyseg = keyinfo->seg; + custom_arg.key_length = keyinfo->length; + custom_arg.search_flag = SEARCH_SAME; + return tree_delete(&keyinfo->rb_tree, info->recbuf, &custom_arg); +} + /* Remove one key from hash-table */ /* Flag is set if we want's to correct info->current_ptr */ -int _hp_delete_key(HP_INFO *info, register HP_KEYDEF *keyinfo, +int hp_delete_key(HP_INFO *info, register HP_KEYDEF *keyinfo, const byte *record, byte *recpos, int flag) { ulong blength,pos2,pos_hashnr,lastpos_hashnr; HASH_INFO *lastpos,*gpos,*pos,*pos3,*empty,*last_ptr; HP_SHARE *share=info->s; - DBUG_ENTER("_hp_delete_key"); + DBUG_ENTER("hp_delete_key"); blength=share->blength; if (share->records+1 == blength) @@ -74,13 +93,13 @@ int _hp_delete_key(HP_INFO *info, register HP_KEYDEF *keyinfo, /* Search after record with key */ pos= hp_find_hash(&keyinfo->block, - _hp_mask(_hp_rec_hashnr(keyinfo,record),blength, - share->records+1)); + hp_mask(hp_rec_hashnr(keyinfo, record), blength, + share->records + 1)); gpos = pos3 = 0; while (pos->ptr_to_rec != recpos) { - if (flag && !_hp_rec_key_cmp(keyinfo,record,pos->ptr_to_rec)) + if (flag && !hp_rec_key_cmp(keyinfo, record, pos->ptr_to_rec)) last_ptr=pos; /* Previous same key */ gpos=pos; if (!(pos=pos->next_key)) @@ -113,33 +132,33 @@ int _hp_delete_key(HP_INFO *info, register HP_KEYDEF *keyinfo, DBUG_RETURN (0); /* Move the last key (lastpos) */ - lastpos_hashnr=_hp_rec_hashnr(keyinfo,lastpos->ptr_to_rec); + lastpos_hashnr = hp_rec_hashnr(keyinfo, lastpos->ptr_to_rec); /* pos is where lastpos should be */ - pos=hp_find_hash(&keyinfo->block,_hp_mask(lastpos_hashnr,share->blength, + pos=hp_find_hash(&keyinfo->block, hp_mask(lastpos_hashnr, share->blength, share->records)); if (pos == empty) /* Move to empty position. */ { empty[0]=lastpos[0]; DBUG_RETURN(0); } - pos_hashnr=_hp_rec_hashnr(keyinfo,pos->ptr_to_rec); + pos_hashnr = hp_rec_hashnr(keyinfo, pos->ptr_to_rec); /* pos3 is where the pos should be */ pos3= hp_find_hash(&keyinfo->block, - _hp_mask(pos_hashnr,share->blength,share->records)); + hp_mask(pos_hashnr, share->blength, share->records)); if (pos != pos3) { /* pos is on wrong posit */ empty[0]=pos[0]; /* Save it here */ pos[0]=lastpos[0]; /* This shold be here */ - _hp_movelink(pos,pos3,empty); /* Fix link to pos */ + hp_movelink(pos, pos3, empty); /* Fix link to pos */ DBUG_RETURN(0); } - pos2= _hp_mask(lastpos_hashnr,blength,share->records+1); - if (pos2 == _hp_mask(pos_hashnr,blength,share->records+1)) + pos2= hp_mask(lastpos_hashnr, blength, share->records + 1); + if (pos2 == hp_mask(pos_hashnr, blength, share->records + 1)) { /* Identical key-positions */ if (pos2 != share->records) { empty[0]=lastpos[0]; - _hp_movelink(lastpos,pos,empty); + hp_movelink(lastpos, pos, empty); DBUG_RETURN(0); } pos3= pos; /* Link pos->next after lastpos */ @@ -147,7 +166,7 @@ int _hp_delete_key(HP_INFO *info, register HP_KEYDEF *keyinfo, else pos3= 0; /* Different positions merge */ empty[0]=lastpos[0]; - _hp_movelink(pos3,empty,pos->next_key); + hp_movelink(pos3, empty, pos->next_key); pos->next_key=empty; DBUG_RETURN(0); } diff --git a/heap/hp_hash.c b/heap/hp_hash.c index 2ca33e5b782..b13ce786f6d 100644 --- a/heap/hp_hash.c +++ b/heap/hp_hash.c @@ -19,30 +19,72 @@ #include "heapdef.h" #include +ha_rows hp_rb_records_in_range(HP_INFO *info, int inx, const byte *start_key, + uint start_key_len, + enum ha_rkey_function start_search_flag, + const byte *end_key, uint end_key_len, + enum ha_rkey_function end_search_flag) +{ + ha_rows start_pos, end_pos; + TREE *rb_tree = &info->s->keydef[inx].rb_tree; + heap_rb_param custom_arg; + + info->lastinx = inx; + custom_arg.keyseg = info->s->keydef[inx].seg; + custom_arg.search_flag = SEARCH_FIND | SEARCH_SAME; + custom_arg.key_length = start_key_len; + if (start_key) + { + hp_rb_pack_key(info, inx, info->recbuf, start_key, start_key_len); + start_pos= tree_record_pos(rb_tree, info->recbuf, start_search_flag, + &custom_arg); + } + else + { + start_pos= 0; + } + + custom_arg.key_length = end_key_len; + if (end_key) + { + hp_rb_pack_key(info, inx, info->recbuf, end_key, end_key_len); + end_pos= tree_record_pos(rb_tree, info->recbuf, end_search_flag, + &custom_arg); + } + else + { + end_pos= rb_tree->elements_in_tree + (ha_rows)1; + } + + if (start_pos == HA_POS_ERROR || end_pos == HA_POS_ERROR) + return HA_POS_ERROR; + return end_pos < start_pos ? (ha_rows) 0 : + (end_pos == start_pos ? (ha_rows) 1 : end_pos - start_pos); +} + /* Search after a record based on a key */ /* Sets info->current_ptr to found record */ /* next_flag: Search=0, next=1, prev =2, same =3 */ -byte *_hp_search(HP_INFO *info, HP_KEYDEF *keyinfo, const byte *key, +byte *hp_search(HP_INFO *info, HP_KEYDEF *keyinfo, const byte *key, uint nextflag) { reg1 HASH_INFO *pos,*prev_ptr; int flag; uint old_nextflag; HP_SHARE *share=info->s; - DBUG_ENTER("_hp_search"); - + DBUG_ENTER("hp_search"); old_nextflag=nextflag; flag=1; prev_ptr=0; if (share->records) { - pos=hp_find_hash(&keyinfo->block,_hp_mask(_hp_hashnr(keyinfo,key), - share->blength,share->records)); + pos=hp_find_hash(&keyinfo->block, hp_mask(hp_hashnr(keyinfo, key), + share->blength, share->records)); do { - if (!_hp_key_cmp(keyinfo,pos->ptr_to_rec,key)) + if (!hp_key_cmp(keyinfo, pos->ptr_to_rec, key)) { switch (nextflag) { case 0: /* Search after key */ @@ -74,8 +116,8 @@ byte *_hp_search(HP_INFO *info, HP_KEYDEF *keyinfo, const byte *key, { flag=0; /* Reset flag */ if (hp_find_hash(&keyinfo->block, - _hp_mask(_hp_rec_hashnr(keyinfo,pos->ptr_to_rec), - share->blength,share->records)) != pos) + hp_mask(hp_rec_hashnr(keyinfo, pos->ptr_to_rec), + share->blength, share->records)) != pos) break; /* Wrong link */ } } @@ -102,14 +144,14 @@ byte *_hp_search(HP_INFO *info, HP_KEYDEF *keyinfo, const byte *key, since last read ! */ -byte *_hp_search_next(HP_INFO *info, HP_KEYDEF *keyinfo, const byte *key, +byte *hp_search_next(HP_INFO *info, HP_KEYDEF *keyinfo, const byte *key, HASH_INFO *pos) { - DBUG_ENTER("_hp_search_next"); + DBUG_ENTER("hp_search_next"); while ((pos= pos->next_key)) { - if (!_hp_key_cmp(keyinfo,pos->ptr_to_rec,key)) + if (! hp_key_cmp(keyinfo, pos->ptr_to_rec, key)) { info->current_hash_ptr=pos; DBUG_RETURN (info->current_ptr= pos->ptr_to_rec); @@ -124,7 +166,7 @@ byte *_hp_search_next(HP_INFO *info, HP_KEYDEF *keyinfo, const byte *key, /* Calculate pos according to keys */ -ulong _hp_mask(ulong hashnr, ulong buffmax, ulong maxlength) +ulong hp_mask(ulong hashnr, ulong buffmax, ulong maxlength) { if ((hashnr & (buffmax-1)) < maxlength) return (hashnr & (buffmax-1)); return (hashnr & ((buffmax >> 1) -1)); @@ -133,7 +175,7 @@ ulong _hp_mask(ulong hashnr, ulong buffmax, ulong maxlength) /* Change link from pos to new_link */ -void _hp_movelink(HASH_INFO *pos, HASH_INFO *next_link, HASH_INFO *newlink) +void hp_movelink(HASH_INFO *pos, HASH_INFO *next_link, HASH_INFO *newlink) { HASH_INFO *old_link; do @@ -149,11 +191,11 @@ void _hp_movelink(HASH_INFO *pos, HASH_INFO *next_link, HASH_INFO *newlink) /* Calc hashvalue for a key */ -ulong _hp_hashnr(register HP_KEYDEF *keydef, register const byte *key) +ulong hp_hashnr(register HP_KEYDEF *keydef, register const byte *key) { /*register*/ ulong nr=1, nr2=4; - HP_KEYSEG *seg,*endseg; + MI_KEYSEG *seg,*endseg; for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++) { @@ -196,11 +238,11 @@ ulong _hp_hashnr(register HP_KEYDEF *keydef, register const byte *key) /* Calc hashvalue for a key in a record */ -ulong _hp_rec_hashnr(register HP_KEYDEF *keydef, register const byte *rec) +ulong hp_rec_hashnr(register HP_KEYDEF *keydef, register const byte *rec) { /*register*/ ulong nr=1, nr2=4; - HP_KEYSEG *seg,*endseg; + MI_KEYSEG *seg,*endseg; for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++) { @@ -255,10 +297,10 @@ ulong _hp_rec_hashnr(register HP_KEYDEF *keydef, register const byte *rec) * far, and works well on both numbers and strings. */ -ulong _hp_hashnr(register HP_KEYDEF *keydef, register const byte *key) +ulong hp_hashnr(register HP_KEYDEF *keydef, register const byte *key) { register ulong nr=0; - HP_KEYSEG *seg,*endseg; + MI_KEYSEG *seg,*endseg; for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++) { @@ -296,10 +338,10 @@ ulong _hp_hashnr(register HP_KEYDEF *keydef, register const byte *key) /* Calc hashvalue for a key in a record */ -ulong _hp_rec_hashnr(register HP_KEYDEF *keydef, register const byte *rec) +ulong hp_rec_hashnr(register HP_KEYDEF *keydef, register const byte *rec) { register ulong nr=0; - HP_KEYSEG *seg,*endseg; + MI_KEYSEG *seg,*endseg; for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++) { @@ -337,9 +379,9 @@ ulong _hp_rec_hashnr(register HP_KEYDEF *keydef, register const byte *rec) /* Compare keys for two records. Returns 0 if they are identical */ -int _hp_rec_key_cmp(HP_KEYDEF *keydef, const byte *rec1, const byte *rec2) +int hp_rec_key_cmp(HP_KEYDEF *keydef, const byte *rec1, const byte *rec2) { - HP_KEYSEG *seg,*endseg; + MI_KEYSEG *seg,*endseg; for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++) { @@ -351,13 +393,14 @@ int _hp_rec_key_cmp(HP_KEYDEF *keydef, const byte *rec1, const byte *rec2) if (rec1[seg->null_pos] & seg->null_bit) continue; } - if (seg->type == HA_KEYTYPE_TEXT) - { + switch (seg->type) { + case HA_KEYTYPE_END: + return 0; + case HA_KEYTYPE_TEXT: if (my_sortcmp(default_charset_info,rec1+seg->start,rec2+seg->start,seg->length)) return 1; - } - else - { + break; + default: if (bcmp(rec1+seg->start,rec2+seg->start,seg->length)) return 1; } @@ -367,9 +410,9 @@ int _hp_rec_key_cmp(HP_KEYDEF *keydef, const byte *rec1, const byte *rec2) /* Compare a key in a record to a whole key */ -int _hp_key_cmp(HP_KEYDEF *keydef, const byte *rec, const byte *key) +int hp_key_cmp(HP_KEYDEF *keydef, const byte *rec, const byte *key) { - HP_KEYSEG *seg,*endseg; + MI_KEYSEG *seg,*endseg; for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; @@ -405,9 +448,9 @@ int _hp_key_cmp(HP_KEYDEF *keydef, const byte *rec, const byte *key) /* Copy a key from a record to a keybuffer */ -void _hp_make_key(HP_KEYDEF *keydef, byte *key, const byte *rec) +void hp_make_key(HP_KEYDEF *keydef, byte *key, const byte *rec) { - HP_KEYSEG *seg,*endseg; + MI_KEYSEG *seg,*endseg; for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++) { @@ -418,7 +461,44 @@ void _hp_make_key(HP_KEYDEF *keydef, byte *key, const byte *rec) } } +void hp_rb_make_key(HP_KEYDEF *keydef, byte *key, + const byte *rec, byte *recpos) +{ + MI_KEYSEG *seg, *endseg; + + /* -1 means that HA_KEYTYPE_END segment will not copy */ + for (seg= keydef->seg, endseg= seg + keydef->keysegs - 1; seg < endseg; + seg++) + { + if (seg->null_bit) + *key++= 1 - test(rec[seg->null_pos] & seg->null_bit); + memcpy(key, rec + seg->start, (size_t) seg->length); + key+= seg->length; + } + memcpy(key, &recpos, sizeof(byte*)); +} +uint hp_rb_pack_key(HP_INFO *info, uint inx, uchar *key, const uchar *old, + uint k_length) +{ + MI_KEYSEG *seg, *endseg; + uchar *start_key= key; + HP_KEYDEF *keydef= info->s->keydef + inx; + + for (seg= keydef->seg, endseg= seg + keydef->keysegs; seg < endseg; + old+= seg->length, seg++) + { + if (seg->null_bit) + { + if (!(*key++= (char) 1 - *old++)) + continue; + } + memcpy((byte*) key, old, seg->length); + key+= seg->length; + } + return key - start_key; +} + /* Test if any of the key parts are NULL. Return: @@ -428,7 +508,7 @@ void _hp_make_key(HP_KEYDEF *keydef, byte *key, const byte *rec) my_bool hp_if_null_in_key(HP_KEYDEF *keydef, const byte *record) { - HP_KEYSEG *seg,*endseg; + MI_KEYSEG *seg,*endseg; for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++) { if (seg->null_bit && (record[seg->null_pos] & seg->null_bit)) diff --git a/heap/hp_open.c b/heap/hp_open.c index 938ab8c4f78..a2423d5a4ff 100644 --- a/heap/hp_open.c +++ b/heap/hp_open.c @@ -21,6 +21,15 @@ #include "hp_static.c" /* Stupid vms-linker */ #endif +#include "my_sys.h" + +static int keys_compare(heap_rb_param *param, uchar *key1, uchar *key2) +{ + uint not_used; + return hp_rb_key_cmp(param->keyseg, key1, key2, param->key_length, + param->search_flag, ¬_used); +} + static void init_block(HP_BLOCK *block,uint reclength,ulong min_records, ulong max_records); @@ -32,49 +41,70 @@ HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef, uint i,j,key_segs,max_length,length; HP_INFO *info; HP_SHARE *share; - HP_KEYSEG *keyseg; + MI_KEYSEG *keyseg; + DBUG_ENTER("heap_open"); pthread_mutex_lock(&THR_LOCK_heap); - if (!(share=_hp_find_named_heap(name))) + if (!(share = hp_find_named_heap(name))) { DBUG_PRINT("info",("Initializing new table")); for (i=key_segs=max_length=0 ; i < keys ; i++) { key_segs+= keydef[i].keysegs; bzero((char*) &keydef[i].block,sizeof(keydef[i].block)); + bzero((char*) &keydef[i].rb_tree ,sizeof(keydef[i].rb_tree)); for (j=length=0 ; j < keydef[i].keysegs; j++) { length+=keydef[i].seg[j].length; if (keydef[i].seg[j].null_bit && !(keydef[i].flag & HA_NULL_ARE_EQUAL)) keydef[i].flag |= HA_NULL_PART_KEY; + if (keydef[i].algorithm == HA_KEY_ALG_BTREE && + keydef[i].seg[j].null_bit) + keydef[i].rb_tree.size_of_element++; } - keydef[i].length=length; - if (length > max_length) - max_length=length; + keydef[i].length= length; + keydef[i].ref_offs= length + keydef[i].rb_tree.size_of_element - + sizeof(byte*); + if (length + keydef[i].rb_tree.size_of_element > max_length) + max_length= length + keydef[i].rb_tree.size_of_element; } if (!(share = (HP_SHARE*) my_malloc((uint) sizeof(HP_SHARE)+ keys*sizeof(HP_KEYDEF)+ - key_segs*sizeof(HP_KEYSEG), + key_segs*sizeof(MI_KEYSEG), MYF(MY_ZEROFILL)))) { pthread_mutex_unlock(&THR_LOCK_heap); DBUG_RETURN(0); } share->keydef=(HP_KEYDEF*) (share+1); - keyseg=(HP_KEYSEG*) (share->keydef+keys); + keyseg=(MI_KEYSEG*) (share->keydef+keys); init_block(&share->block,reclength+1,min_records,max_records); /* Fix keys */ memcpy(share->keydef,keydef,(size_t) (sizeof(keydef[0])*keys)); for (i=0 ; i < keys ; i++) { - share->keydef[i].seg=keyseg; - memcpy(keyseg,keydef[i].seg, - (size_t) (sizeof(keyseg[0])*keydef[i].keysegs)); - keyseg+=keydef[i].keysegs; - init_block(&share->keydef[i].block,sizeof(HASH_INFO),min_records, - max_records); + HP_KEYDEF *keyinfo = share->keydef + i; + keyinfo->seg = keyseg; + memcpy(keyseg, keydef[i].seg, + (size_t) (sizeof(keyseg[0]) * keydef[i].keysegs)); + keyseg += keydef[i].keysegs; + if (keydef[i].algorithm == HA_KEY_ALG_BTREE) + { + init_tree(&keyinfo->rb_tree, 0, 0, keydef[i].length + + keydef[i].rb_tree.size_of_element, + (qsort_cmp2)keys_compare, 1, NULL, NULL); + keyinfo->delete_key = hp_rb_delete_key; + keyinfo->write_key = hp_rb_write_key; + } + else + { + init_block(&keyinfo->block, sizeof(HASH_INFO), min_records, + max_records); + keyinfo->delete_key = hp_delete_key; + keyinfo->write_key = hp_write_key; + } } share->min_records=min_records; @@ -99,7 +129,7 @@ HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef, heap_share_list=list_add(heap_share_list,&share->open_list); } if (!(info= (HP_INFO*) my_malloc((uint) sizeof(HP_INFO)+ - share->max_key_length, + 2 * share->max_key_length, MYF(MY_ZEROFILL)))) { pthread_mutex_unlock(&THR_LOCK_heap); @@ -115,6 +145,7 @@ HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef, info->s=share; info->lastkey=(byte*) (info+1); + info->recbuf = (byte*) (info->lastkey + share->max_key_length); info->mode=mode; info->current_record= (ulong) ~0L; /* No current record */ info->current_ptr=0; @@ -132,7 +163,7 @@ HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef, /* map name to a heap-nr. If name isn't found return 0 */ -HP_SHARE *_hp_find_named_heap(const char *name) +HP_SHARE *hp_find_named_heap(const char *name) { LIST *pos; HP_SHARE *info; diff --git a/heap/hp_panic.c b/heap/hp_panic.c index 4b93190b7e1..2b659cbfbb3 100644 --- a/heap/hp_panic.c +++ b/heap/hp_panic.c @@ -31,7 +31,7 @@ int heap_panic(enum ha_panic_function flag) next_open=element->next; /* Save if close */ switch (flag) { case HA_PANIC_CLOSE: - _hp_close(info); + hp_close(info); break; default: break; @@ -45,7 +45,7 @@ int heap_panic(enum ha_panic_function flag) case HA_PANIC_CLOSE: { if (!share->open_count) - _hp_free(share); + hp_free(share); break; } default: diff --git a/heap/hp_rename.c b/heap/hp_rename.c index 118c5931f43..93906a66c37 100644 --- a/heap/hp_rename.c +++ b/heap/hp_rename.c @@ -27,7 +27,7 @@ int heap_rename(const char *old_name, const char *new_name) DBUG_ENTER("heap_rename"); pthread_mutex_lock(&THR_LOCK_heap); - if ((info=_hp_find_named_heap(old_name))) + if ((info = hp_find_named_heap(old_name))) { if (!(name_buff=(char*) my_strdup(new_name,MYF(MY_WME)))) { diff --git a/heap/hp_rfirst.c b/heap/hp_rfirst.c index b20918ff3a7..4b7098745a4 100644 --- a/heap/hp_rfirst.c +++ b/heap/hp_rfirst.c @@ -20,14 +20,39 @@ int heap_rfirst(HP_INFO *info, byte *record) { + HP_SHARE *share = info->s; + HP_KEYDEF *keyinfo = share->keydef + info->lastinx; + DBUG_ENTER("heap_rfirst"); - if (!(info->s->records)) + if (keyinfo->algorithm == HA_KEY_ALG_BTREE) { - my_errno=HA_ERR_END_OF_FILE; - DBUG_RETURN(my_errno); + byte *pos; + + if ((pos = tree_search_edge(&keyinfo->rb_tree, info->parents, + &info->last_pos, offsetof(TREE_ELEMENT, left)))) + { + memcpy(&pos, pos + keyinfo->ref_offs, sizeof(byte*)); + info->current_ptr = pos; + memcpy(record, pos, (size_t)share->reclength); + info->update = HA_STATE_AKTIV; + } + else + { + my_errno = HA_ERR_END_OF_FILE; + DBUG_RETURN(my_errno); + } + DBUG_RETURN(0); + } + else + { + if (!(info->s->records)) + { + my_errno=HA_ERR_END_OF_FILE; + DBUG_RETURN(my_errno); + } + info->current_record=0; + info->current_hash_ptr=0; + info->update=HA_STATE_PREV_FOUND; + DBUG_RETURN(heap_rnext(info,record)); } - info->current_record=0; - info->current_hash_ptr=0; - info->update=HA_STATE_PREV_FOUND; - DBUG_RETURN(heap_rnext(info,record)); } diff --git a/heap/hp_rkey.c b/heap/hp_rkey.c index e7a1d81fba6..649370cf0b0 100644 --- a/heap/hp_rkey.c +++ b/heap/hp_rkey.c @@ -16,10 +16,12 @@ #include "heapdef.h" -int heap_rkey(HP_INFO *info, byte *record, int inx, const byte *key) +int heap_rkey(HP_INFO *info, byte *record, int inx, const byte *key, + uint key_len, enum ha_rkey_function find_flag) { byte *pos; HP_SHARE *share=info->s; + HP_KEYDEF *keyinfo = share->keydef+inx; DBUG_ENTER("heap_rkey"); DBUG_PRINT("enter",("base: %lx inx: %d",info,inx)); @@ -30,15 +32,44 @@ int heap_rkey(HP_INFO *info, byte *record, int inx, const byte *key) info->lastinx=inx; info->current_record = (ulong) ~0L; /* For heap_rrnd() */ - if (!(pos=_hp_search(info,share->keydef+inx,key,0))) + if (keyinfo->algorithm == HA_KEY_ALG_BTREE) { - info->update=0; - DBUG_RETURN(my_errno); + heap_rb_param custom_arg; + + hp_rb_pack_key(info, inx, info->recbuf, key, key_len); + + custom_arg.keyseg = info->s->keydef[inx].seg; + custom_arg.key_length = key_len; + custom_arg.search_flag = SEARCH_FIND | SEARCH_SAME; + /* for next rkey() after deletion */ + if (find_flag == HA_READ_AFTER_KEY) + info->last_find_flag = HA_READ_KEY_OR_NEXT; + else if (find_flag == HA_READ_BEFORE_KEY) + info->last_find_flag = HA_READ_KEY_OR_PREV; + else + info->last_find_flag = find_flag; + info->lastkey_len = key_len; + if (!(pos = tree_search_key(&keyinfo->rb_tree, info->recbuf, info->parents, + &info->last_pos, find_flag, &custom_arg))) + { + info->update = 0; + DBUG_RETURN(my_errno = HA_ERR_KEY_NOT_FOUND); + } + memcpy(&pos, pos + keyinfo->ref_offs, sizeof(byte*)); + info->current_ptr = pos; + } + else + { + if (!(pos=hp_search(info,share->keydef+inx,key,0))) + { + info->update=0; + DBUG_RETURN(my_errno); + } + if (!(keyinfo->flag & HA_NOSAME)) + memcpy(info->lastkey,key,(size_t) keyinfo->length); } memcpy(record,pos,(size_t) share->reclength); info->update=HA_STATE_AKTIV; - if (!(share->keydef[inx].flag & HA_NOSAME)) - memcpy(info->lastkey,key,(size_t) share->keydef[inx].length); DBUG_RETURN(0); } @@ -47,5 +78,5 @@ int heap_rkey(HP_INFO *info, byte *record, int inx, const byte *key) gptr heap_find(HP_INFO *info, int inx, const byte *key) { - return _hp_search(info,info->s->keydef+inx,key,0); + return hp_search(info, info->s->keydef + inx, key, 0); } diff --git a/heap/hp_rlast.c b/heap/hp_rlast.c index 463b6dc9aac..7f883d3a18b 100644 --- a/heap/hp_rlast.c +++ b/heap/hp_rlast.c @@ -21,9 +21,37 @@ int heap_rlast(HP_INFO *info, byte *record) { + HP_SHARE *share = info->s; + HP_KEYDEF *keyinfo; + DBUG_ENTER("heap_rlast"); - info->current_ptr=0; - info->current_hash_ptr=0; - info->update=HA_STATE_NEXT_FOUND; - DBUG_RETURN(heap_rprev(info,record)); + if (info->lastinx < 0) + DBUG_RETURN(my_errno = HA_ERR_WRONG_INDEX); + keyinfo = share->keydef + info->lastinx; + if (keyinfo->algorithm == HA_KEY_ALG_BTREE) + { + byte *pos; + + if ((pos = tree_search_edge(&keyinfo->rb_tree, info->parents, + &info->last_pos, offsetof(TREE_ELEMENT, right)))) + { + memcpy(&pos, pos + keyinfo->ref_offs, sizeof(byte*)); + info->current_ptr = pos; + memcpy(record, pos, (size_t)share->reclength); + info->update = HA_STATE_AKTIV; + } + else + { + my_errno = HA_ERR_END_OF_FILE; + DBUG_RETURN(my_errno); + } + DBUG_RETURN(0); + } + else + { + info->current_ptr=0; + info->current_hash_ptr=0; + info->update=HA_STATE_NEXT_FOUND; + DBUG_RETURN(heap_rprev(info,record)); + } } diff --git a/heap/hp_rnext.c b/heap/hp_rnext.c index af08a0e68a2..12ce354335d 100644 --- a/heap/hp_rnext.c +++ b/heap/hp_rnext.c @@ -22,27 +22,57 @@ int heap_rnext(HP_INFO *info, byte *record) { byte *pos; HP_SHARE *share=info->s; + HP_KEYDEF *keyinfo; DBUG_ENTER("heap_rnext"); if (info->lastinx < 0) DBUG_RETURN(my_errno=HA_ERR_WRONG_INDEX); - if (info->current_hash_ptr) - pos= _hp_search_next(info,share->keydef+info->lastinx, info->lastkey, - info->current_hash_ptr); - else + keyinfo = share->keydef + info->lastinx; + if (keyinfo->algorithm == HA_KEY_ALG_BTREE) { - if (!info->current_ptr && (info->update & HA_STATE_NEXT_FOUND)) + heap_rb_param custom_arg; + + if (info->last_pos) + pos = tree_search_next(&keyinfo->rb_tree, &info->last_pos, + offsetof(TREE_ELEMENT, left), + offsetof(TREE_ELEMENT, right)); + else + { + custom_arg.keyseg = keyinfo->seg; + custom_arg.key_length = info->lastkey_len; + custom_arg.search_flag = SEARCH_SAME | SEARCH_FIND; + pos = tree_search_key(&keyinfo->rb_tree, info->lastkey, info->parents, + &info->last_pos, info->last_find_flag, &custom_arg); + } + if (pos) + { + memcpy(&pos, pos + keyinfo->ref_offs, sizeof(byte*)); + info->current_ptr = pos; + } + else { - pos=0; /* Read next after last */ - my_errno=HA_ERR_KEY_NOT_FOUND; + my_errno = HA_ERR_KEY_NOT_FOUND; } - else if (!info->current_ptr) /* Deleted or first call */ - pos= _hp_search(info,share->keydef+info->lastinx, info->lastkey, 0); + } + else + { + if (info->current_hash_ptr) + pos= hp_search_next(info, keyinfo, info->lastkey, + info->current_hash_ptr); else - pos= _hp_search(info,share->keydef+info->lastinx, info->lastkey, 1); + { + if (!info->current_ptr && (info->update & HA_STATE_NEXT_FOUND)) + { + pos=0; /* Read next after last */ + my_errno=HA_ERR_KEY_NOT_FOUND; + } + else if (!info->current_ptr) /* Deleted or first call */ + pos= hp_search(info, keyinfo, info->lastkey, 0); + else + pos= hp_search(info, keyinfo, info->lastkey, 1); + } } - if (!pos) { info->update=HA_STATE_NEXT_FOUND; /* For heap_rprev */ diff --git a/heap/hp_rprev.c b/heap/hp_rprev.c index c7c649e6b9f..98f7a02d55b 100644 --- a/heap/hp_rprev.c +++ b/heap/hp_rprev.c @@ -23,22 +23,52 @@ int heap_rprev(HP_INFO *info, byte *record) { byte *pos; HP_SHARE *share=info->s; + HP_KEYDEF *keyinfo; DBUG_ENTER("heap_rprev"); if (info->lastinx < 0) DBUG_RETURN(my_errno=HA_ERR_WRONG_INDEX); - - if (info->current_ptr || (info->update & HA_STATE_NEXT_FOUND)) + keyinfo = share->keydef + info->lastinx; + if (keyinfo->algorithm == HA_KEY_ALG_BTREE) { - if ((info->update & HA_STATE_DELETED)) - pos= _hp_search(info,share->keydef+info->lastinx, info->lastkey, 3); + heap_rb_param custom_arg; + + if (info->last_pos) + pos = tree_search_next(&keyinfo->rb_tree, &info->last_pos, + offsetof(TREE_ELEMENT, right), + offsetof(TREE_ELEMENT, left)); else - pos= _hp_search(info,share->keydef+info->lastinx, info->lastkey, 2); + { + custom_arg.keyseg = keyinfo->seg; + custom_arg.key_length = keyinfo->length; + custom_arg.search_flag = SEARCH_SAME; + pos = tree_search_key(&keyinfo->rb_tree, info->lastkey, info->parents, + &info->last_pos, info->last_find_flag, &custom_arg); + } + if (pos) + { + memcpy(&pos, pos + keyinfo->ref_offs, sizeof(byte*)); + info->current_ptr = pos; + } + else + { + my_errno = HA_ERR_KEY_NOT_FOUND; + } } else { - pos=0; /* Read next after last */ - my_errno=HA_ERR_KEY_NOT_FOUND; + if (info->current_ptr || (info->update & HA_STATE_NEXT_FOUND)) + { + if ((info->update & HA_STATE_DELETED)) + pos= hp_search(info, share->keydef + info->lastinx, info->lastkey, 3); + else + pos= hp_search(info, share->keydef + info->lastinx, info->lastkey, 2); + } + else + { + pos=0; /* Read next after last */ + my_errno=HA_ERR_KEY_NOT_FOUND; + } } if (!pos) { diff --git a/heap/hp_rrnd.c b/heap/hp_rrnd.c index 78abebcaf47..cce3ce24e51 100644 --- a/heap/hp_rrnd.c +++ b/heap/hp_rrnd.c @@ -88,7 +88,7 @@ int heap_rrnd_old(register HP_INFO *info, byte *record, ulong pos) } /* Find record number pos */ - _hp_find_record(info,pos); + hp_find_record(info, pos); end: if (!info->current_ptr[share->reclength]) diff --git a/heap/hp_rsame.c b/heap/hp_rsame.c index a346707641b..6a375753b1a 100644 --- a/heap/hp_rsame.c +++ b/heap/hp_rsame.c @@ -41,8 +41,8 @@ int heap_rsame(register HP_INFO *info, byte *record, int inx) else if (inx != -1) { info->lastinx=inx; - _hp_make_key(share->keydef+inx,info->lastkey,record); - if (!_hp_search(info,share->keydef+inx,info->lastkey,3)) + hp_make_key(share->keydef + inx, info->lastkey, record); + if (!hp_search(info, share->keydef + inx, info->lastkey, 3)) { info->update=0; DBUG_RETURN(my_errno); diff --git a/heap/hp_scan.c b/heap/hp_scan.c index e74f8b43ba7..487d48c3a95 100644 --- a/heap/hp_scan.c +++ b/heap/hp_scan.c @@ -58,7 +58,7 @@ int heap_scan(register HP_INFO *info, byte *record) DBUG_RETURN(my_errno= HA_ERR_END_OF_FILE); } } - _hp_find_record(info,pos); + hp_find_record(info, pos); } if (!info->current_ptr[share->reclength]) { diff --git a/heap/hp_test1.c b/heap/hp_test1.c index e07af2761f0..124a2901402 100644 --- a/heap/hp_test1.c +++ b/heap/hp_test1.c @@ -36,7 +36,7 @@ int main(int argc, char **argv) char record[128],key[32]; const char *filename; HP_KEYDEF keyinfo[10]; - HP_KEYSEG keyseg[4]; + MI_KEYSEG keyseg[4]; MY_INIT(argv[0]); filename= "test1"; @@ -85,7 +85,7 @@ int main(int argc, char **argv) { if (i == remove_ant) { VOID(heap_close(file)) ; return (0) ; } sprintf(key,"%6d",(j=(int) ((rand() & 32767)/32767.*25))); - if ((error = heap_rkey(file,record,0,key))) + if ((error = heap_rkey(file,record,0,key,0,6))) { if (verbose || (flags[j] == 1 || (error && my_errno != HA_ERR_KEY_NOT_FOUND))) @@ -113,7 +113,7 @@ int main(int argc, char **argv) sprintf(key,"%6d",i); bmove(record+1,key,6); my_errno=0; - error=heap_rkey(file,record,0,key); + error=heap_rkey(file,record,0,key,0,6); if (verbose || (error == 0 && flags[i] != 1) || (error && (flags[i] != 0 || my_errno != HA_ERR_KEY_NOT_FOUND))) diff --git a/heap/hp_test2.c b/heap/hp_test2.c index e2570893519..5d945dca282 100644 --- a/heap/hp_test2.c +++ b/heap/hp_test2.c @@ -26,7 +26,7 @@ #define SAFEMALLOC #endif -#include "heapdef.h" /* Because of _hp_find_block */ +#include "heapdef.h" /* Because of hp_find_block */ #include #define MAX_RECORDS 100000 @@ -61,7 +61,7 @@ int main(int argc, char *argv[]) const char *filename,*filename2; HP_INFO *file,*file2; HP_KEYDEF keyinfo[MAX_KEYS]; - HP_KEYSEG keyseg[MAX_KEYS*5]; + MI_KEYSEG keyseg[MAX_KEYS*5]; HEAP_PTR position; MY_INIT(argv[0]); /* init my_sys library & pthreads */ LINT_INIT(position); @@ -167,14 +167,14 @@ int main(int argc, char *argv[]) if (j != 0) { sprintf(key,"%6d",j); - if (heap_rkey(file,record,0,key)) + if (heap_rkey(file,record,0,key,6,0)) { printf("can't find key1: \"%s\"\n",key); goto err; } #ifdef NOT_USED - if (file->current_ptr == _hp_find_block(&file->s->block,0) || - file->current_ptr == _hp_find_block(&file->s->block,1)) + if (file->current_ptr == hp_find_block(&file->s->block,0) || + file->current_ptr == hp_find_block(&file->s->block,1)) continue; /* Don't remove 2 first records */ #endif if (heap_delete(file,record)) @@ -227,7 +227,7 @@ int main(int argc, char *argv[]) if (!key1[j]) continue; sprintf(key,"%6d",j); - if (heap_rkey(file,record,0,key)) + if (heap_rkey(file,record,0,key,6,0)) { printf("can't find key1: \"%s\"\n",key); goto err; @@ -277,7 +277,7 @@ int main(int argc, char *argv[]) printf("- Read first key - next - delete - next -> last\n"); DBUG_PRINT("progpos",("first - next - delete - next -> last")); - if (heap_rkey(file,record,0,key)) + if (heap_rkey(file,record,0,key,6,0)) goto err; if (heap_rnext(file,record3)) goto err; if (heap_delete(file,record3)) goto err; @@ -501,7 +501,7 @@ int main(int argc, char *argv[]) } printf("- Read through all keys with first-next-last-prev\n"); ant=0; - for (error=heap_rkey(file,record,0,key) ; + for (error=heap_rkey(file,record,0,key,6,0); ! error ; error=heap_rnext(file,record)) ant++; @@ -538,7 +538,7 @@ int main(int argc, char *argv[]) { if (error == 0) { - if (heap_rkey(file2,record2,2,record+keyinfo[2].seg[0].start)) + if (heap_rkey(file2,record2,2,record+keyinfo[2].seg[0].start,8,0)) { printf("can't find key3: \"%.8s\"\n", record+keyinfo[2].seg[0].start); diff --git a/heap/hp_update.c b/heap/hp_update.c index 8cf3e4d4b8d..dd47e04ebc2 100644 --- a/heap/hp_update.c +++ b/heap/hp_update.c @@ -20,7 +20,7 @@ int heap_update(HP_INFO *info, const byte *old, const byte *heap_new) { - uint key; + HP_KEYDEF *keydef, *end, *p_lastinx; byte *pos; HP_SHARE *share=info->s; DBUG_ENTER("heap_update"); @@ -28,19 +28,20 @@ int heap_update(HP_INFO *info, const byte *old, const byte *heap_new) test_active(info); pos=info->current_ptr; - if (info->opt_flag & READ_CHECK_USED && _hp_rectest(info,old)) + if (info->opt_flag & READ_CHECK_USED && hp_rectest(info,old)) DBUG_RETURN(my_errno); /* Record changed */ if (--(share->records) < share->blength >> 1) share->blength>>= 1; share->changed=1; - for (key=0 ; key < share->keys ; key++) + p_lastinx = share->keydef + info->lastinx; + for (keydef = share->keydef, end = keydef + share->keys; keydef < end; + keydef++) { - if (_hp_rec_key_cmp(share->keydef+key,old,heap_new)) + if (hp_rec_key_cmp(keydef, old, heap_new)) { - if (_hp_delete_key(info,share->keydef+key,old,pos,key == - (uint) info->lastinx) || - _hp_write_key(share,share->keydef+key,heap_new,pos)) - goto err; + if ((*keydef->delete_key)(info, keydef, old, pos, keydef == p_lastinx) || + (*keydef->write_key)(info, keydef, heap_new, pos)) + goto err; } } @@ -51,16 +52,27 @@ int heap_update(HP_INFO *info, const byte *old, const byte *heap_new) err: if (my_errno == HA_ERR_FOUND_DUPP_KEY) { - info->errkey=key; - do + info->errkey = keydef - share->keydef; + if (keydef->algorithm == HA_KEY_ALG_BTREE) { - if (_hp_rec_key_cmp(share->keydef+key,old,heap_new)) + /* we don't need to delete non-inserted key from rb-tree */ + if ((*keydef->write_key)(info, keydef, old, pos)) { - if (_hp_delete_key(info,share->keydef+key,heap_new,pos,0) || - _hp_write_key(share,share->keydef+key,old,pos)) + if (++(share->records) == share->blength) share->blength+= share->blength; + DBUG_RETURN(my_errno); + } + keydef--; + } + while (keydef >= share->keydef) + { + if (hp_rec_key_cmp(keydef, old, heap_new)) + { + if ((*keydef->delete_key)(info, keydef, heap_new, pos, 0) || + (*keydef->write_key)(info, keydef, old, pos)) break; } - } while (key-- > 0); + keydef--; + } } if (++(share->records) == share->blength) share->blength+= share->blength; DBUG_RETURN(my_errno); diff --git a/heap/hp_write.c b/heap/hp_write.c index 806f40e5be5..801505216bd 100644 --- a/heap/hp_write.c +++ b/heap/hp_write.c @@ -27,12 +27,12 @@ #define HIGHUSED 8 static byte *next_free_record_pos(HP_SHARE *info); -static HASH_INFO *_hp_find_free_hash(HP_SHARE *info, HP_BLOCK *block, +static HASH_INFO *hp_find_free_hash(HP_SHARE *info, HP_BLOCK *block, ulong records); int heap_write(HP_INFO *info, const byte *record) { - uint key; + HP_KEYDEF *keydef, *end; byte *pos; HP_SHARE *share=info->s; DBUG_ENTER("heap_write"); @@ -47,9 +47,10 @@ int heap_write(HP_INFO *info, const byte *record) DBUG_RETURN(my_errno); share->changed=1; - for (key=0 ; key < share->keys ; key++) + for (keydef = share->keydef, end = keydef + share->keys; keydef < end; + keydef++) { - if (_hp_write_key(share,share->keydef+key,record,pos)) + if ((*keydef->write_key)(info, keydef, record, pos)) goto err; } @@ -62,13 +63,19 @@ int heap_write(HP_INFO *info, const byte *record) info->update|=HA_STATE_AKTIV; DBUG_RETURN(0); err: - DBUG_PRINT("info",("Duplicate key: %d",key)); - info->errkey= key; - do + DBUG_PRINT("info",("Duplicate key: %d", keydef - share->keydef)); + info->errkey= keydef - share->keydef; + if (keydef->algorithm == HA_KEY_ALG_BTREE) { - if (_hp_delete_key(info,share->keydef+key,record,pos,0)) + /* we don't need to delete non-inserted key from rb-tree */ + keydef--; + } + while (keydef >= share->keydef) + { + if ((*keydef->delete_key)(info, keydef, record, pos, 0)) break; - } while (key-- > 0); + keydef--; + } share->deleted++; *((byte**) pos)=share->del_link; @@ -77,6 +84,35 @@ err: DBUG_RETURN(my_errno); } /* heap_write */ +/* + Write a key to rb_tree-index +*/ + +int hp_rb_write_key(HP_INFO *info, HP_KEYDEF *keyinfo, const byte *record, + byte *recpos) +{ + heap_rb_param custom_arg; + + info->last_pos = NULL; /* For heap_rnext/heap_rprev */ + hp_rb_make_key(keyinfo, info->recbuf, record, recpos); + custom_arg.keyseg = keyinfo->seg; + custom_arg.key_length = keyinfo->length; + if ((keyinfo->flag & HA_NOSAME) && + (!(keyinfo->flag & HA_NULL_PART_KEY) || + !hp_if_null_in_key(keyinfo, record))) + { + custom_arg.search_flag = SEARCH_FIND | SEARCH_SAME; + if (tree_search_key(&keyinfo->rb_tree, info->recbuf, info->parents, + &info->last_pos, 0, &custom_arg)) + { + my_errno = HA_ERR_FOUND_DUPP_KEY; + return 1; + } + } + custom_arg.search_flag = SEARCH_SAME; + return tree_insert(&keyinfo->rb_tree, (void*)info->recbuf, keyinfo->length + + sizeof(byte*), &custom_arg) ? 0 : 1; +} /* Find where to place new record */ @@ -102,7 +138,7 @@ static byte *next_free_record_pos(HP_SHARE *info) my_errno=HA_ERR_RECORD_FILE_FULL; DBUG_RETURN(NULL); } - if (_hp_get_new_block(&info->block,&length)) + if (hp_get_new_block(&info->block,&length)) DBUG_RETURN(NULL); info->data_length+=length; } @@ -113,12 +149,12 @@ static byte *next_free_record_pos(HP_SHARE *info) block_pos*info->block.recbuffer); } - /* Write a hash-key to the hash-index */ -int _hp_write_key(register HP_SHARE *info, HP_KEYDEF *keyinfo, +int hp_write_key(HP_INFO *info, HP_KEYDEF *keyinfo, const byte *record, byte *recpos) { + HP_SHARE *share = info->s; int flag; ulong halfbuff,hashnr,first_index; byte *ptr_to_rec,*ptr_to_rec2; @@ -129,18 +165,18 @@ int _hp_write_key(register HP_SHARE *info, HP_KEYDEF *keyinfo, LINT_INIT(ptr_to_rec); LINT_INIT(ptr_to_rec2); flag=0; - if (!(empty= _hp_find_free_hash(info,&keyinfo->block,info->records))) + if (!(empty= hp_find_free_hash(share,&keyinfo->block,share->records))) DBUG_RETURN(-1); /* No more memory */ - halfbuff= (long) info->blength >> 1; - pos= hp_find_hash(&keyinfo->block,(first_index=info->records-halfbuff)); + halfbuff= (long) share->blength >> 1; + pos= hp_find_hash(&keyinfo->block,(first_index=share->records-halfbuff)); if (pos != empty) /* If some records */ { do { - hashnr=_hp_rec_hashnr(keyinfo,pos->ptr_to_rec); + hashnr = hp_rec_hashnr(keyinfo, pos->ptr_to_rec); if (flag == 0) /* First loop; Check if ok */ - if (_hp_mask(hashnr,info->blength,info->records) != first_index) + if (hp_mask(hashnr, share->blength, share->records) != first_index) break; if (!(hashnr & halfbuff)) { /* Key will not move */ @@ -212,8 +248,8 @@ int _hp_write_key(register HP_SHARE *info, HP_KEYDEF *keyinfo, } /* Check if we are at the empty position */ - pos=hp_find_hash(&keyinfo->block,_hp_mask(_hp_rec_hashnr(keyinfo,record), - info->blength,info->records+1)); + pos=hp_find_hash(&keyinfo->block, hp_mask(hp_rec_hashnr(keyinfo, record), + share->blength, share->records + 1)); if (pos == empty) { pos->ptr_to_rec=recpos; @@ -224,8 +260,8 @@ int _hp_write_key(register HP_SHARE *info, HP_KEYDEF *keyinfo, /* Check if more records in same hash-nr family */ empty[0]=pos[0]; gpos=hp_find_hash(&keyinfo->block, - _hp_mask(_hp_rec_hashnr(keyinfo,pos->ptr_to_rec), - info->blength,info->records+1)); + hp_mask(hp_rec_hashnr(keyinfo, pos->ptr_to_rec), + share->blength, share->records + 1)); if (pos == gpos) { pos->ptr_to_rec=recpos; @@ -235,7 +271,7 @@ int _hp_write_key(register HP_SHARE *info, HP_KEYDEF *keyinfo, { pos->ptr_to_rec=recpos; pos->next_key=0; - _hp_movelink(pos,gpos,empty); + hp_movelink(pos, gpos, empty); } /* Check if duplicated keys */ @@ -246,7 +282,7 @@ int _hp_write_key(register HP_SHARE *info, HP_KEYDEF *keyinfo, pos=empty; do { - if (! _hp_rec_key_cmp(keyinfo,record,pos->ptr_to_rec)) + if (! hp_rec_key_cmp(keyinfo, record, pos->ptr_to_rec)) { DBUG_RETURN(my_errno=HA_ERR_FOUND_DUPP_KEY); } @@ -258,7 +294,7 @@ int _hp_write_key(register HP_SHARE *info, HP_KEYDEF *keyinfo, /* Returns ptr to block, and allocates block if neaded */ -static HASH_INFO *_hp_find_free_hash(HP_SHARE *info, +static HASH_INFO *hp_find_free_hash(HP_SHARE *info, HP_BLOCK *block, ulong records) { uint block_pos; @@ -268,7 +304,7 @@ static HASH_INFO *_hp_find_free_hash(HP_SHARE *info, return hp_find_hash(block,records); if (!(block_pos=(records % block->records_in_block))) { - if (_hp_get_new_block(block,&length)) + if (hp_get_new_block(block,&length)) return(NULL); info->index_length+=length; } diff --git a/include/Makefile.am b/include/Makefile.am index b943e8d76e6..8cf9c7c5a78 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -29,7 +29,7 @@ noinst_HEADERS = config-win.h \ my_nosys.h my_alarm.h queues.h \ my_tree.h hash.h thr_alarm.h thr_lock.h \ getopt.h my_getopt.h t_ctype.h violite.h md5.h \ - mysql_version.h.in + my_handler.h mysql_version.h.in # mysql_version.h are generated SUPERCLEANFILES = mysql_version.h my_config.h diff --git a/include/heap.h b/include/heap.h index 02b04e2b3ec..ebcad285f55 100644 --- a/include/heap.h +++ b/include/heap.h @@ -14,7 +14,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* This file should be included when using heap_database_funktions */ +/* This file should be included when using heap_database_functions */ /* Author: Michael Widenius */ #ifndef _heap_h @@ -31,6 +31,9 @@ extern "C" { #include #endif +#include "my_handler.h" +#include "my_tree.h" + /* defines used by heap-funktions */ #define HP_MAX_LEVELS 4 /* 128^5 records is enough */ @@ -73,22 +76,22 @@ typedef struct st_heap_block /* The data is saved in blocks */ ulong last_allocated; /* Blocks allocated, used by keys */ } HP_BLOCK; -typedef struct st_hp_keyseg /* Key-portion */ -{ - uint start; /* Start of key in record (from 0) */ - uint length; /* Keylength */ - uint type; - uint null_bit; /* bit set in row+null_pos */ - uint null_pos; -} HP_KEYSEG; +struct st_heap_info; /* For referense */ typedef struct st_hp_keydef /* Key definition with open */ { uint flag; /* HA_NOSAME | HA_NULL_PART_KEY */ uint keysegs; /* Number of key-segment */ uint length; /* Length of key (automatic) */ - HP_KEYSEG *seg; + uint8 algorithm; /* HASH / BTREE */ + uint ref_offs; /* Data reference offset */ + MI_KEYSEG *seg; HP_BLOCK block; /* Where keys are saved */ + TREE rb_tree; + int (*write_key)(struct st_heap_info *info, struct st_hp_keydef *keyinfo, + const byte *record, byte *recpos); + int (*delete_key)(struct st_heap_info *info, struct st_hp_keydef *keyinfo, + const byte *record, byte *recpos, int flag); } HP_KEYDEF; typedef struct st_heap_share @@ -126,6 +129,11 @@ typedef struct st_heap_info int mode; /* Mode of file (READONLY..) */ uint opt_flag,update; byte *lastkey; /* Last used key with rkey */ + byte *recbuf; /* Record buffer for rb-tree keys */ + enum ha_rkey_function last_find_flag; + TREE_ELEMENT *parents[MAX_TREE_HIGHT+1]; + TREE_ELEMENT **last_pos; + uint lastkey_len; #ifdef THREAD THR_LOCK_DATA lock; #endif @@ -156,7 +164,14 @@ extern int heap_rprev(HP_INFO *info,byte *record); extern int heap_rfirst(HP_INFO *info,byte *record); extern int heap_rlast(HP_INFO *info,byte *record); extern void heap_clear(HP_INFO *info); -extern int heap_rkey(HP_INFO *info,byte *record,int inx,const byte *key); + +ha_rows hp_rb_records_in_range(HP_INFO *info, int inx, const byte *start_key, + uint start_key_len, + enum ha_rkey_function start_search_flag, + const byte *end_key, uint end_key_len, + enum ha_rkey_function end_search_flag); +int heap_rkey(HP_INFO *info, byte *record, int inx, const byte *key, + uint key_len, enum ha_rkey_function find_flag); extern gptr heap_find(HP_INFO *info,int inx,const byte *key); extern int heap_check_heap(HP_INFO *info, my_bool print_status); extern byte *heap_position(HP_INFO *info); diff --git a/include/my_handler.h b/include/my_handler.h new file mode 100644 index 00000000000..ddbb33cd93f --- /dev/null +++ b/include/my_handler.h @@ -0,0 +1,63 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + 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; either + version 2 of the License, or (at your option) any later version. + + 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., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +#ifndef _my_handler_h +#define _my_handler_h + +#include "my_global.h" +#include "my_base.h" +#include "m_ctype.h" +#include "myisampack.h" + +typedef struct st_MI_KEYSEG /* Key-portion */ +{ + uint8 type; /* Type of key (for sort) */ + uint8 language; + uint8 null_bit; /* bitmask to test for NULL */ + uint8 bit_start,bit_end; /* if bit field */ + uint16 flag; + uint16 length; /* Keylength */ + uint32 start; /* Start of key in record */ + uint32 null_pos; /* position to NULL indicator */ + CHARSET_INFO *charset; +} MI_KEYSEG; + +#define get_key_length(length,key) \ +{ if ((uchar) *(key) != 255) \ + length= (uint) (uchar) *((key)++); \ + else \ + { length=mi_uint2korr((key)+1); (key)+=3; } \ +} + +#define get_key_pack_length(length,length_pack,key) \ +{ if ((uchar) *(key) != 255) \ + { length= (uint) (uchar) *((key)++); length_pack=1; }\ + else \ + { length=mi_uint2korr((key)+1); (key)+=3; length_pack=3; } \ +} + +extern int _mi_compare_text(CHARSET_INFO *, uchar *, uint, uchar *, uint , + my_bool); +extern int _mi_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, + register uchar *b, uint key_length, uint nextflag, + uint *diff_pos); + +extern int hp_rb_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, + register uchar *b, uint key_length, uint nextflag, + uint *diff_pos); + +#endif /* _my_handler_h */ diff --git a/include/my_tree.h b/include/my_tree.h index 8b326a19518..265bf69b1e7 100644 --- a/include/my_tree.h +++ b/include/my_tree.h @@ -48,6 +48,8 @@ typedef struct st_tree_element { } TREE_ELEMENT; #endif /* MSDOS */ +#define ELEMENT_CHILD(element, offs) (*(TREE_ELEMENT**)((char*)element + offs)) + typedef struct st_tree { TREE_ELEMENT *root,null_element; TREE_ELEMENT **parents[MAX_TREE_HIGHT]; @@ -70,12 +72,22 @@ void reset_tree(TREE*); #define is_tree_inited(tree) ((tree)->root != 0) /* Functions on leafs */ -TREE_ELEMENT *tree_insert(TREE *tree,void *key,uint key_size); -void *tree_search(TREE *tree,void *key); +TREE_ELEMENT *tree_insert(TREE *tree,void *key, uint key_size, + void *custom_arg); +void *tree_search(TREE *tree, void *key, void *custom_arg); int tree_walk(TREE *tree,tree_walk_action action, void *argument, TREE_WALK visit); -int tree_delete(TREE *tree,void *key); +int tree_delete(TREE *tree, void *key, void *custom_arg); +void *tree_search_key(TREE *tree, const void *key, + TREE_ELEMENT **parents, TREE_ELEMENT ***last_pos, + enum ha_rkey_function flag, void *custom_arg); +void *tree_search_edge(TREE *tree, TREE_ELEMENT **parents, + TREE_ELEMENT ***last_pos, int child_offs); +void *tree_search_next(TREE *tree, TREE_ELEMENT ***last_pos, int l_offs, + int r_offs); +uint tree_record_pos(TREE *tree, const void *key, + enum ha_rkey_function search_flag, void *custom_arg); #ifdef __cplusplus } #endif diff --git a/include/myisam.h b/include/myisam.h index ecf34a7e156..bf714dfef8a 100644 --- a/include/myisam.h +++ b/include/myisam.h @@ -28,6 +28,7 @@ extern "C" { #ifndef _m_ctype_h #include #endif +#include "my_handler.h" /* defines used by myisam-funktions */ @@ -105,20 +106,6 @@ typedef struct st_mi_create_info struct st_myisam_info; /* For referense */ typedef struct st_myisam_info MI_INFO; -typedef struct st_mi_keyseg /* Key-portion */ -{ - uint8 type; /* Type of key (for sort) */ - uint8 language; - uint8 null_bit; /* bitmask to test for NULL */ - uint8 bit_start,bit_end; /* if bit field */ - uint16 flag; - uint16 length; /* Keylength */ - uint32 start; /* Start of key in record */ - uint32 null_pos; /* position to NULL indicator */ - CHARSET_INFO *charset; -} MI_KEYSEG; - - struct st_mi_s_param; typedef struct st_mi_keydef /* Key definition with open & info */ diff --git a/isam/isamlog.c b/isam/isamlog.c index 6d2bde42bf7..3c38caaf141 100644 --- a/isam/isamlog.c +++ b/isam/isamlog.c @@ -342,7 +342,7 @@ static int examine_log(my_string file_name, char **table_names) file_info.process=0; result=uint2korr(head+7); if ((curr_file_info=(struct isamlog_file_info*) - tree_search(&tree,&file_info))) + tree_search(&tree, &file_info, tree.custom_arg))) { curr_file_info->accessed=access_time; if (update && curr_file_info->used && curr_file_info->closed) @@ -444,7 +444,7 @@ static int examine_log(my_string file_name, char **table_names) files_open++; file_info.closed=0; } - VOID(tree_insert(&tree,(gptr) &file_info,0)); + VOID(tree_insert(&tree, (gptr) &file_info, 0, tree.custom_arg)); if (file_info.used) { if (verbose && !record_pos_file) @@ -463,7 +463,7 @@ static int examine_log(my_string file_name, char **table_names) { if (!curr_file_info->closed) files_open--; - VOID(tree_delete(&tree,(gptr) curr_file_info)); + VOID(tree_delete(&tree, (gptr) curr_file_info, tree.custom_arg)); } break; case LOG_EXTRA: diff --git a/isam/pack_isam.c b/isam/pack_isam.c index 4a3a787ff5c..6122a4e6024 100644 --- a/isam/pack_isam.c +++ b/isam/pack_isam.c @@ -762,7 +762,8 @@ static int get_statistic(MRG_INFO *mrg,HUFF_COUNTS *huff_counts) if (count->tree_buff) { global_count=count; - if (!(element=tree_insert(&count->int_tree,pos,0)) || + if (!(element=tree_insert(&count->int_tree, pos, 0, + count->int_tree.custom_arg)) || ((element->count == 1 && count->tree_buff + tree_buff_length < count->tree_pos + count->field_length) || @@ -1733,7 +1734,8 @@ static int compress_isam_file(MRG_INFO *mrg, HUFF_COUNTS *huff_counts) break; case FIELD_INTERVALL: global_count=count; - pos=(byte*) tree_search(&count->int_tree,start_pos); + pos=(byte*) tree_search(&count->int_tree, start_pos, + count->int_tree.custom_arg); intervall=(uint) (pos - count->tree_buff)/field_length; write_bits(tree->code[intervall],(uint) tree->code_len[intervall]); start_pos=end_pos; diff --git a/myisam/ft_nlq_search.c b/myisam/ft_nlq_search.c index ac9fa5a9a8c..635d6239359 100644 --- a/myisam/ft_nlq_search.c +++ b/myisam/ft_nlq_search.c @@ -115,7 +115,7 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio) sdoc.doc.dpos=aio->info->lastpos; /* saving document matched into dtree */ - if(!(selem=tree_insert(&aio->dtree, &sdoc, 0))) return 1; + if(!(selem=tree_insert(&aio->dtree, &sdoc, 0, aio->dtree.custom_arg))) return 1; sptr=(FT_SUPERDOC *)ELEMENT_KEY((&aio->dtree), selem); diff --git a/myisam/ft_parser.c b/myisam/ft_parser.c index b241ae9be88..c514a923b63 100644 --- a/myisam/ft_parser.c +++ b/myisam/ft_parser.c @@ -223,7 +223,7 @@ int ft_parse(TREE *wtree, byte *doc, int doclen) while (ft_simple_get_word(&doc,end,&w)) { - if (!tree_insert(wtree, &w, 0)) + if (!tree_insert(wtree, &w, 0, wtree->custom_arg)) goto err; } return 0; diff --git a/myisam/ft_stopwords.c b/myisam/ft_stopwords.c index 9c2047c3b56..0e4112bb29a 100644 --- a/myisam/ft_stopwords.c +++ b/myisam/ft_stopwords.c @@ -50,7 +50,7 @@ int ft_init_stopwords(const char **sws) for(;*sws;sws++) { if( (sw.len= (uint) strlen(sw.pos=*sws)) < ft_min_word_len) continue; - if(!tree_insert(stopwords3, &sw, 0)) + if(!tree_insert(stopwords3, &sw, 0, stopwords3->custom_arg)) { delete_tree(stopwords3); /* purecov: inspected */ return -1; /* purecov: inspected */ @@ -64,7 +64,7 @@ int is_stopword(char *word, uint len) FT_STOPWORD sw; sw.pos=word; sw.len=len; - return tree_search(stopwords3,&sw) != NULL; + return tree_search(stopwords3, &sw, stopwords3->custom_arg) != NULL; } diff --git a/myisam/mi_search.c b/myisam/mi_search.c index 4114125d6f7..09b4159737f 100644 --- a/myisam/mi_search.c +++ b/myisam/mi_search.c @@ -651,388 +651,6 @@ void _mi_dpointer(MI_INFO *info, uchar *buff, my_off_t pos) } /* _mi_dpointer */ -int _mi_compare_text(CHARSET_INFO *charset_info, uchar *a, uint a_length, - uchar *b, uint b_length, my_bool part_key) -{ - int flag; - -#ifdef USE_STRCOLL - if (use_strcoll(charset_info)) - { - /* QQ: This needs to work with part keys at some point */ - return my_strnncoll(charset_info, a, a_length, b, b_length); - } - else -#endif - { - uint length= min(a_length,b_length); - uchar *end= a+ length; - uchar *sort_order=charset_info->sort_order; - while (a < end) - if ((flag= (int) sort_order[*a++] - (int) sort_order[*b++])) - return flag; - } - if (part_key && b_length < a_length) - return 0; - return (int) (a_length-b_length); -} - - -static int compare_bin(uchar *a, uint a_length, uchar *b, uint b_length, - my_bool part_key) -{ - uint length= min(a_length,b_length); - uchar *end= a+ length; - int flag; - - while (a < end) - if ((flag= (int) *a++ - (int) *b++)) - return flag; - if (part_key && b_length < a_length) - return 0; - return (int) (a_length-b_length); -} - - - /* - ** Compare two keys - ** Returns <0, 0, >0 acording to which is bigger - ** Key_length specifies length of key to use. Number-keys can't - ** be splited - ** If flag <> SEARCH_FIND compare also position - */ - -#define FCMP(A,B) ((int) (A) - (int) (B)) - -int _mi_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, - register uchar *b, uint key_length, uint nextflag, - uint *diff_pos) -{ - int flag; - int16 s_1,s_2; - int32 l_1,l_2; - uint32 u_1,u_2; - float f_1,f_2; - double d_1,d_2; - uint next_key_length; - - *diff_pos=0; - for ( ; (int) key_length >0 ; key_length=next_key_length, keyseg++) - { - uchar *end; - uint piks=! (keyseg->flag & HA_NO_SORT); - (*diff_pos)++; - - /* Handle NULL part */ - if (keyseg->null_bit) - { - key_length--; - if (*a != *b && piks) - { - flag = (int) *a - (int) *b; - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - } - b++; - if (!*a++) /* If key was NULL */ - { - if (nextflag == (SEARCH_FIND | SEARCH_UPDATE)) - nextflag=SEARCH_SAME; /* Allow duplicate keys */ - next_key_length=key_length; - continue; /* To next key part */ - } - } - end= a+ min(keyseg->length,key_length); - next_key_length=key_length-keyseg->length; - - switch ((enum ha_base_keytype) keyseg->type) { - case HA_KEYTYPE_TEXT: /* Ascii; Key is converted */ - if (keyseg->flag & HA_SPACE_PACK) - { - int a_length,b_length,pack_length; - get_key_length(a_length,a); - get_key_pack_length(b_length,pack_length,b); - next_key_length=key_length-b_length-pack_length; - - if (piks && - (flag=_mi_compare_text(keyseg->charset,a,a_length,b,b_length, - (my_bool) ((nextflag & SEARCH_PREFIX) && next_key_length <= 0)))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a+=a_length; - b+=b_length; - break; - } - else - { - uint length=(uint) (end-a), a_length=length, b_length=length; - if (!(nextflag & SEARCH_PREFIX)) - { - while (a_length && a[a_length-1] == ' ') - a_length--; - while (b_length && b[b_length-1] == ' ') - b_length--; - } - if (piks && - (flag=_mi_compare_text(keyseg->charset,a,a_length,b,b_length, - (my_bool) ((nextflag & SEARCH_PREFIX) && next_key_length <= 0)))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a=end; - b+=length; - } - break; - case HA_KEYTYPE_BINARY: - if (keyseg->flag & HA_SPACE_PACK) - { - int a_length,b_length,pack_length; - get_key_length(a_length,a); - get_key_pack_length(b_length,pack_length,b); - next_key_length=key_length-b_length-pack_length; - - if (piks && - (flag=compare_bin(a,a_length,b,b_length, - (my_bool) ((nextflag & SEARCH_PREFIX) && next_key_length <= 0)))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a+=a_length; - b+=b_length; - break; - } - else - { - uint length=keyseg->length; - if (piks && - (flag=compare_bin(a,length,b,length, - (my_bool) ((nextflag & SEARCH_PREFIX) && next_key_length <= 0)))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a+=length; - b+=length; - } - break; - case HA_KEYTYPE_VARTEXT: - { - int a_length,b_length,pack_length; - get_key_length(a_length,a); - get_key_pack_length(b_length,pack_length,b); - next_key_length=key_length-b_length-pack_length; - - if (piks && - (flag=_mi_compare_text(keyseg->charset,a,a_length,b,b_length, - (my_bool) ((nextflag & SEARCH_PREFIX) && next_key_length <= 0)))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a+=a_length; - b+=b_length; - break; - } - break; - case HA_KEYTYPE_VARBINARY: - { - int a_length,b_length,pack_length; - get_key_length(a_length,a); - get_key_pack_length(b_length,pack_length,b); - next_key_length=key_length-b_length-pack_length; - - if (piks && - (flag=compare_bin(a,a_length,b,b_length, - (my_bool) ((nextflag & SEARCH_PREFIX) && next_key_length <= 0)))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a+=a_length; - b+=b_length; - break; - } - break; - case HA_KEYTYPE_INT8: - { - int i_1= (int) *((signed char*) a); - int i_2= (int) *((signed char*) b); - if (piks && (flag = CMP_NUM(i_1,i_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b++; - break; - } - case HA_KEYTYPE_SHORT_INT: - s_1= mi_sint2korr(a); - s_2= mi_sint2korr(b); - if (piks && (flag = CMP_NUM(s_1,s_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 2; /* sizeof(short int); */ - break; - case HA_KEYTYPE_USHORT_INT: - { - uint16 us_1,us_2; - us_1= mi_sint2korr(a); - us_2= mi_sint2korr(b); - if (piks && (flag = CMP_NUM(us_1,us_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+=2; /* sizeof(short int); */ - break; - } - case HA_KEYTYPE_LONG_INT: - l_1= mi_sint4korr(a); - l_2= mi_sint4korr(b); - if (piks && (flag = CMP_NUM(l_1,l_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 4; /* sizeof(long int); */ - break; - case HA_KEYTYPE_ULONG_INT: - u_1= mi_sint4korr(a); - u_2= mi_sint4korr(b); - if (piks && (flag = CMP_NUM(u_1,u_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 4; /* sizeof(long int); */ - break; - case HA_KEYTYPE_INT24: - l_1=mi_sint3korr(a); - l_2=mi_sint3korr(b); - if (piks && (flag = CMP_NUM(l_1,l_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 3; - break; - case HA_KEYTYPE_UINT24: - l_1=mi_uint3korr(a); - l_2=mi_uint3korr(b); - if (piks && (flag = CMP_NUM(l_1,l_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 3; - break; - case HA_KEYTYPE_FLOAT: - mi_float4get(f_1,a); - mi_float4get(f_2,b); - if (piks && (flag = CMP_NUM(f_1,f_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 4; /* sizeof(float); */ - break; - case HA_KEYTYPE_DOUBLE: - mi_float8get(d_1,a); - mi_float8get(d_2,b); - if (piks && (flag = CMP_NUM(d_1,d_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 8; /* sizeof(double); */ - break; - case HA_KEYTYPE_NUM: /* Numeric key */ - { - int swap_flag= 0; - int alength,blength; - - if (keyseg->flag & HA_REVERSE_SORT) - { - swap(uchar*,a,b); - swap_flag=1; /* Remember swap of a & b */ - end= a+ (int) (end-b); - } - if (keyseg->flag & HA_SPACE_PACK) - { - alength= *a++; blength= *b++; - end=a+alength; - next_key_length=key_length-blength-1; - } - else - { - alength= (int) (end-a); - blength=keyseg->length; - /* remove pre space from keys */ - for ( ; alength && *a == ' ' ; a++, alength--) ; - for ( ; blength && *b == ' ' ; b++, blength--) ; - } - if (piks) - { - if (*a == '-') - { - if (*b != '-') - return -1; - a++; b++; - swap(uchar*,a,b); - swap(int,alength,blength); - swap_flag=1-swap_flag; - alength--; blength--; - end=a+alength; - } - else if (*b == '-') - return 1; - while (alength && (*a == '+' || *a == '0')) - { - a++; alength--; - } - while (blength && (*b == '+' || *b == '0')) - { - b++; blength--; - } - if (alength != blength) - return (alength < blength) ? -1 : 1; - while (a < end) - if (*a++ != *b++) - return ((int) a[-1] - (int) b[-1]); - } - else - { - b+=(end-a); - a=end; - } - - if (swap_flag) /* Restore pointers */ - swap(uchar*,a,b); - break; - } -#ifdef HAVE_LONG_LONG - case HA_KEYTYPE_LONGLONG: - { - longlong ll_a,ll_b; - ll_a= mi_sint8korr(a); - ll_b= mi_sint8korr(b); - if (piks && (flag = CMP_NUM(ll_a,ll_b))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 8; - break; - } - case HA_KEYTYPE_ULONGLONG: - { - ulonglong ll_a,ll_b; - ll_a= mi_uint8korr(a); - ll_b= mi_uint8korr(b); - if (piks && (flag = CMP_NUM(ll_a,ll_b))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 8; - break; - } -#endif - case HA_KEYTYPE_END: /* Ready */ - goto end; /* diff_pos is incremented */ - } - } - (*diff_pos)++; -end: - if (!(nextflag & SEARCH_FIND)) - { - uint i; - if (nextflag & (SEARCH_NO_FIND | SEARCH_LAST)) /* Find record after key */ - return (nextflag & (SEARCH_BIGGER | SEARCH_LAST)) ? -1 : 1; - flag=0; - for (i=keyseg->length ; i-- > 0 ; ) - { - if (*a++ != *b++) - { - flag= FCMP(a[-1],b[-1]); - break; - } - } - if (nextflag & SEARCH_SAME) - return (flag); /* read same */ - if (nextflag & SEARCH_BIGGER) - return (flag <= 0 ? -1 : 1); /* read next */ - return (flag < 0 ? -1 : 1); /* read previous */ - } - return 0; -} /* _mi_key_cmp */ - - /* Get key from key-block */ /* page points at previous key; its advanced to point at next key */ /* key should contain previous key */ diff --git a/myisam/mi_write.c b/myisam/mi_write.c index d357ab24d52..fe7187d59ef 100644 --- a/myisam/mi_write.c +++ b/myisam/mi_write.c @@ -753,7 +753,8 @@ int _mi_ck_write_tree(register MI_INFO *info, uint keynr, uchar *key, DBUG_ENTER("_mi_ck_write_tree"); error= tree_insert(& info->bulk_insert[keynr], key, - key_length + info->s->rec_reflength) ? 0 : HA_ERR_OUT_OF_MEM ; + key_length + info->s->rec_reflength, + info->bulk_insert[keynr].custom_arg) ? 0 : HA_ERR_OUT_OF_MEM ; DBUG_RETURN(error); } /* _mi_ck_write_tree */ diff --git a/myisam/myisamdef.h b/myisam/myisamdef.h index e5da4752429..417b6762065 100644 --- a/myisam/myisamdef.h +++ b/myisam/myisamdef.h @@ -329,13 +329,6 @@ struct st_myisam_info { { *(key)=255; mi_int2store((key)+1,(length)); } \ } -#define get_key_length(length,key) \ -{ if ((uchar) *(key) != 255) \ - length= (uint) (uchar) *((key)++); \ - else \ - { length=mi_uint2korr((key)+1); (key)+=3; } \ -} - #define get_key_full_length(length,key) \ { if ((uchar) *(key) != 255) \ length= ((uint) (uchar) *((key)++))+1; \ @@ -343,13 +336,6 @@ struct st_myisam_info { { length=mi_uint2korr((key)+1)+3; (key)+=3; } \ } -#define get_key_pack_length(length,length_pack,key) \ -{ if ((uchar) *(key) != 255) \ - { length= (uint) (uchar) *((key)++); length_pack=1; }\ - else \ - { length=mi_uint2korr((key)+1); (key)+=3; length_pack=3; } \ -} - #define get_pack_length(length) ((length) >= 255 ? 3 : 1) #define MI_MIN_BLOCK_LENGTH 20 /* Because of delete-link */ @@ -484,8 +470,6 @@ extern int _mi_seq_search(MI_INFO *info,MI_KEYDEF *keyinfo,uchar *page, extern int _mi_prefix_search(MI_INFO *info,MI_KEYDEF *keyinfo,uchar *page, uchar *key,uint key_len,uint comp_flag, uchar **ret_pos,uchar *buff, my_bool *was_last_key); -extern int _mi_compare_text(CHARSET_INFO *, uchar *, uint, uchar *, uint , - my_bool); extern my_off_t _mi_kpos(uint nod_flag,uchar *after_key); extern void _mi_kpointer(MI_INFO *info,uchar *buff,my_off_t pos); extern my_off_t _mi_dpos(MI_INFO *info, uint nod_flag,uchar *after_key); diff --git a/myisam/myisamlog.c b/myisam/myisamlog.c index 2d4c7570956..df375556c25 100644 --- a/myisam/myisamlog.c +++ b/myisam/myisamlog.c @@ -345,7 +345,8 @@ static int examine_log(my_string file_name, char **table_names) if (!opt_processes) file_info.process=0; result= mi_uint2korr(head+7); - if ((curr_file_info=(struct file_info*) tree_search(&tree,&file_info))) + if ((curr_file_info=(struct file_info*) tree_search(&tree, &file_info, + tree.custom_arg))) { curr_file_info->accessed=access_time; if (update && curr_file_info->used && curr_file_info->closed) @@ -452,7 +453,7 @@ static int examine_log(my_string file_name, char **table_names) else file_info.isam->s->rnd= isamlog_process; } - VOID(tree_insert(&tree,(gptr) &file_info,0)); + VOID(tree_insert(&tree, (gptr) &file_info, 0, tree.custom_arg)); if (file_info.used) { if (verbose && !record_pos_file) @@ -471,7 +472,7 @@ static int examine_log(my_string file_name, char **table_names) { if (!curr_file_info->closed) files_open--; - VOID(tree_delete(&tree,(gptr) curr_file_info)); + VOID(tree_delete(&tree, (gptr) curr_file_info, tree.custom_arg)); } break; case MI_LOG_EXTRA: diff --git a/myisam/myisampack.c b/myisam/myisampack.c index 5d7898e9020..bdd217a3643 100644 --- a/myisam/myisampack.c +++ b/myisam/myisampack.c @@ -765,7 +765,8 @@ static int get_statistic(PACK_MRG_INFO *mrg,HUFF_COUNTS *huff_counts) if (count->tree_buff) { global_count=count; - if (!(element=tree_insert(&count->int_tree,pos,0)) || + if (!(element=tree_insert(&count->int_tree,pos, 0, + count->int_tree.custom_arg)) || (element->count == 1 && count->tree_buff + tree_buff_length < count->tree_pos + count->field_length) || @@ -1788,7 +1789,8 @@ static int compress_isam_file(PACK_MRG_INFO *mrg, HUFF_COUNTS *huff_counts) break; case FIELD_INTERVALL: global_count=count; - pos=(byte*) tree_search(&count->int_tree,start_pos); + pos=(byte*) tree_search(&count->int_tree, start_pos, + count->int_tree.custom_arg); intervall=(uint) (pos - count->tree_buff)/field_length; write_bits(tree->code[intervall],(uint) tree->code_len[intervall]); start_pos=end_pos; diff --git a/mysql-test/r/heap_btree.result b/mysql-test/r/heap_btree.result new file mode 100644 index 00000000000..14c5f6d56f4 --- /dev/null +++ b/mysql-test/r/heap_btree.result @@ -0,0 +1,205 @@ +drop table if exists t1; +create table t1 (a int not null,b int not null, primary key using BTREE (a)) type=heap comment="testing heaps" avg_row_length=100 min_rows=1 max_rows=100; +insert into t1 values(1,1),(2,2),(3,3),(4,4); +delete from t1 where a=1 or a=0; +show keys from t1; +Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment +t1 0 PRIMARY 1 a A NULL NULL NULL BTREE +select * from t1; +a b +2 2 +3 3 +4 4 +select * from t1 where a=4; +a b +4 4 +update t1 set b=5 where a=4; +update t1 set b=b+1 where a>=3; +replace t1 values (3,3); +select * from t1; +a b +2 2 +3 3 +4 6 +alter table t1 add c int not null, add key using BTREE (c,a); +drop table t1; +create table t1 (a int not null,b int not null, primary key using BTREE (a)) type=heap comment="testing heaps"; +insert into t1 values(1,1),(2,2),(3,3),(4,4); +delete from t1 where a > 0; +select * from t1; +a b +drop table t1; +create table t1 (a int not null,b int not null, primary key using BTREE (a)) type=heap comment="testing heaps"; +insert into t1 values(1,1),(2,2),(3,3),(4,4); +alter table t1 modify a int not null auto_increment, type=myisam, comment="new myisam table"; +select * from t1; +a b +1 1 +2 2 +3 3 +4 4 +drop table t1; +create table t1 (a int not null) type=heap; +insert into t1 values (869751),(736494),(226312),(802616); +select * from t1 where a > 736494; +a +869751 +802616 +alter table t1 add unique uniq_id using BTREE (a); +select * from t1 where a > 736494; +a +802616 +869751 +select * from t1 where a = 736494; +a +736494 +select * from t1 where a=869751 or a=736494; +a +736494 +869751 +select * from t1 where a in (869751,736494,226312,802616); +a +226312 +736494 +802616 +869751 +alter table t1 type=myisam; +explain select * from t1 where a in (869751,736494,226312,802616); +table type possible_keys key key_len ref rows Extra +t1 range uniq_id uniq_id 4 NULL 4 where used; Using index +drop table t1; +create table t1 (x int not null, y int not null, key x using BTREE (x), unique y using BTREE (y)) +type=heap; +insert into t1 values (1,1),(2,2),(1,3),(2,4),(2,5),(2,6); +select * from t1 where x=1; +x y +1 1 +1 3 +select * from t1,t1 as t2 where t1.x=t2.y; +x y x y +1 1 1 1 +2 2 2 2 +1 3 1 1 +2 4 2 2 +2 5 2 2 +2 6 2 2 +explain select * from t1,t1 as t2 where t1.x=t2.y; +table type possible_keys key key_len ref rows Extra +t1 ALL x NULL NULL NULL 6 +t2 eq_ref y y 4 t1.x 1 +drop table t1; +create table t1 (a int) type=heap; +insert into t1 values(1); +select max(a) from t1; +max(a) +1 +drop table t1; +CREATE TABLE t1 ( a int not null default 0, b int not null default 0, key using BTREE (a), key using BTREE (b) ) TYPE=HEAP; +insert into t1 values(1,1),(1,2),(2,3),(1,3),(1,4),(1,5),(1,6); +select * from t1 where a=1; +a b +1 1 +1 2 +1 3 +1 4 +1 5 +1 6 +insert into t1 values(1,1),(1,2),(2,3),(1,3),(1,4),(1,5),(1,6); +select * from t1 where a=1; +a b +1 1 +1 2 +1 3 +1 4 +1 5 +1 6 +1 1 +1 2 +1 3 +1 4 +1 5 +1 6 +drop table t1; +create table t1 (id int unsigned not null, primary key using BTREE (id)) type=HEAP; +insert into t1 values(1); +select max(id) from t1; +max(id) +NULL +insert into t1 values(2); +select max(id) from t1; +max(id) +NULL +replace into t1 values(1); +drop table t1; +create table t1 (n int) type=heap; +drop table t1; +create table t1 (n int) type=heap; +drop table if exists t1; +CREATE table t1(f1 int not null,f2 char(20) not +null,index(f2)) type=heap; +INSERT into t1 set f1=12,f2="bill"; +INSERT into t1 set f1=13,f2="bill"; +INSERT into t1 set f1=14,f2="bill"; +INSERT into t1 set f1=15,f2="bill"; +INSERT into t1 set f1=16,f2="ted"; +INSERT into t1 set f1=12,f2="ted"; +INSERT into t1 set f1=12,f2="ted"; +INSERT into t1 set f1=12,f2="ted"; +INSERT into t1 set f1=12,f2="ted"; +delete from t1 where f2="bill"; +select * from t1; +f1 f2 +16 ted +12 ted +12 ted +12 ted +12 ted +drop table t1; +create table t1 (btn char(10) not null, key using BTREE (btn)) type=heap; +insert into t1 values ("hello"),("hello"),("hello"),("hello"),("hello"),("a"),("b"),("c"),("d"),("e"),("f"),("g"),("h"),("i"); +explain select * from t1 where btn like "q%"; +table type possible_keys key key_len ref rows Extra +t1 ALL btn NULL NULL NULL 14 where used +select * from t1 where btn like "q%"; +btn +alter table t1 add column new_col char(1) not null, add key using BTREE (btn,new_col), drop key btn; +update t1 set new_col=btn; +explain select * from t1 where btn="a"; +table type possible_keys key key_len ref rows Extra +t1 ref btn btn 10 const 1 where used +explain select * from t1 where btn="a" and new_col="a"; +table type possible_keys key key_len ref rows Extra +t1 ref btn btn 11 const,const 1 where used +drop table t1; +CREATE TABLE t1 ( +a int default NULL, +b int default NULL, +KEY a using BTREE (a), +UNIQUE b using BTREE (b) +) type=heap; +INSERT INTO t1 VALUES (NULL,99),(99,NULL),(1,1),(2,2),(1,3); +SELECT * FROM t1 WHERE a=NULL; +a b +explain SELECT * FROM t1 WHERE a IS NULL; +table type possible_keys key key_len ref rows Extra +t1 ref a a 5 const 1 where used +SELECT * FROM t1 WHERE a<=>NULL; +a b +NULL 99 +SELECT * FROM t1 WHERE b=NULL; +a b +explain SELECT * FROM t1 WHERE b IS NULL; +table type possible_keys key key_len ref rows Extra +t1 ref b b 5 const 1 where used +SELECT * FROM t1 WHERE b<=>NULL; +a b +99 NULL +INSERT INTO t1 VALUES (1,3); +Duplicate entry '3' for key 1 +DROP TABLE t1; +CREATE TABLE t1 (a int not null, primary key using BTREE (a)) type=heap; +INSERT into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11); +DELETE from t1 where a < 100; +SELECT * from t1; +a +DROP TABLE t1; diff --git a/mysql-test/r/heap_hash.result b/mysql-test/r/heap_hash.result new file mode 100644 index 00000000000..9b7f2cca6bc --- /dev/null +++ b/mysql-test/r/heap_hash.result @@ -0,0 +1,205 @@ +drop table if exists t1; +create table t1 (a int not null,b int not null, primary key using HASH (a)) type=heap comment="testing heaps" avg_row_length=100 min_rows=1 max_rows=100; +insert into t1 values(1,1),(2,2),(3,3),(4,4); +delete from t1 where a=1 or a=0; +show keys from t1; +Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment +t1 0 PRIMARY 1 a NULL NULL NULL NULL HASH +select * from t1; +a b +2 2 +3 3 +4 4 +select * from t1 where a=4; +a b +4 4 +update t1 set b=5 where a=4; +update t1 set b=b+1 where a>=3; +replace t1 values (3,3); +select * from t1; +a b +2 2 +3 3 +4 6 +alter table t1 add c int not null, add key using HASH (c,a); +drop table t1; +create table t1 (a int not null,b int not null, primary key using HASH (a)) type=heap comment="testing heaps"; +insert into t1 values(1,1),(2,2),(3,3),(4,4); +delete from t1 where a > 0; +select * from t1; +a b +drop table t1; +create table t1 (a int not null,b int not null, primary key using HASH (a)) type=heap comment="testing heaps"; +insert into t1 values(1,1),(2,2),(3,3),(4,4); +alter table t1 modify a int not null auto_increment, type=myisam, comment="new myisam table"; +select * from t1; +a b +1 1 +2 2 +3 3 +4 4 +drop table t1; +create table t1 (a int not null) type=heap; +insert into t1 values (869751),(736494),(226312),(802616); +select * from t1 where a > 736494; +a +869751 +802616 +alter table t1 add unique uniq_id using HASH (a); +select * from t1 where a > 736494; +a +869751 +802616 +select * from t1 where a = 736494; +a +736494 +select * from t1 where a=869751 or a=736494; +a +736494 +869751 +select * from t1 where a in (869751,736494,226312,802616); +a +226312 +736494 +802616 +869751 +alter table t1 type=myisam; +explain select * from t1 where a in (869751,736494,226312,802616); +table type possible_keys key key_len ref rows Extra +t1 range uniq_id uniq_id 4 NULL 4 where used; Using index +drop table t1; +create table t1 (x int not null, y int not null, key x using HASH (x), unique y using HASH (y)) +type=heap; +insert into t1 values (1,1),(2,2),(1,3),(2,4),(2,5),(2,6); +select * from t1 where x=1; +x y +1 3 +1 1 +select * from t1,t1 as t2 where t1.x=t2.y; +x y x y +1 1 1 1 +2 2 2 2 +1 3 1 1 +2 4 2 2 +2 5 2 2 +2 6 2 2 +explain select * from t1,t1 as t2 where t1.x=t2.y; +table type possible_keys key key_len ref rows Extra +t1 ALL x NULL NULL NULL 6 +t2 eq_ref y y 4 t1.x 1 +drop table t1; +create table t1 (a int) type=heap; +insert into t1 values(1); +select max(a) from t1; +max(a) +1 +drop table t1; +CREATE TABLE t1 ( a int not null default 0, b int not null default 0, key using HASH (a), key using HASH (b) ) TYPE=HEAP; +insert into t1 values(1,1),(1,2),(2,3),(1,3),(1,4),(1,5),(1,6); +select * from t1 where a=1; +a b +1 6 +1 5 +1 4 +1 3 +1 2 +1 1 +insert into t1 values(1,1),(1,2),(2,3),(1,3),(1,4),(1,5),(1,6); +select * from t1 where a=1; +a b +1 6 +1 5 +1 4 +1 3 +1 2 +1 1 +1 6 +1 5 +1 4 +1 3 +1 2 +1 1 +drop table t1; +create table t1 (id int unsigned not null, primary key using HASH (id)) type=HEAP; +insert into t1 values(1); +select max(id) from t1; +max(id) +1 +insert into t1 values(2); +select max(id) from t1; +max(id) +2 +replace into t1 values(1); +drop table t1; +create table t1 (n int) type=heap; +drop table t1; +create table t1 (n int) type=heap; +drop table if exists t1; +CREATE table t1(f1 int not null,f2 char(20) not +null,index(f2)) type=heap; +INSERT into t1 set f1=12,f2="bill"; +INSERT into t1 set f1=13,f2="bill"; +INSERT into t1 set f1=14,f2="bill"; +INSERT into t1 set f1=15,f2="bill"; +INSERT into t1 set f1=16,f2="ted"; +INSERT into t1 set f1=12,f2="ted"; +INSERT into t1 set f1=12,f2="ted"; +INSERT into t1 set f1=12,f2="ted"; +INSERT into t1 set f1=12,f2="ted"; +delete from t1 where f2="bill"; +select * from t1; +f1 f2 +16 ted +12 ted +12 ted +12 ted +12 ted +drop table t1; +create table t1 (btn char(10) not null, key using HASH (btn)) type=heap; +insert into t1 values ("hello"),("hello"),("hello"),("hello"),("hello"),("a"),("b"),("c"),("d"),("e"),("f"),("g"),("h"),("i"); +explain select * from t1 where btn like "q%"; +table type possible_keys key key_len ref rows Extra +t1 ALL btn NULL NULL NULL 14 where used +select * from t1 where btn like "q%"; +btn +alter table t1 add column new_col char(1) not null, add key using HASH (btn,new_col), drop key btn; +update t1 set new_col=btn; +explain select * from t1 where btn="a"; +table type possible_keys key key_len ref rows Extra +t1 ALL btn NULL NULL NULL 14 where used +explain select * from t1 where btn="a" and new_col="a"; +table type possible_keys key key_len ref rows Extra +t1 ref btn btn 11 const,const 10 where used +drop table t1; +CREATE TABLE t1 ( +a int default NULL, +b int default NULL, +KEY a using HASH (a), +UNIQUE b using HASH (b) +) type=heap; +INSERT INTO t1 VALUES (NULL,99),(99,NULL),(1,1),(2,2),(1,3); +SELECT * FROM t1 WHERE a=NULL; +a b +explain SELECT * FROM t1 WHERE a IS NULL; +table type possible_keys key key_len ref rows Extra +t1 ref a a 5 const 10 where used +SELECT * FROM t1 WHERE a<=>NULL; +a b +NULL 99 +SELECT * FROM t1 WHERE b=NULL; +a b +explain SELECT * FROM t1 WHERE b IS NULL; +table type possible_keys key key_len ref rows Extra +t1 ref b b 5 const 1 where used +SELECT * FROM t1 WHERE b<=>NULL; +a b +99 NULL +INSERT INTO t1 VALUES (1,3); +Duplicate entry '3' for key 1 +DROP TABLE t1; +CREATE TABLE t1 (a int not null, primary key using HASH (a)) type=heap; +INSERT into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11); +DELETE from t1 where a < 100; +SELECT * from t1; +a +DROP TABLE t1; diff --git a/mysql-test/t/heap_btree.test b/mysql-test/t/heap_btree.test new file mode 100644 index 00000000000..28fc209525b --- /dev/null +++ b/mysql-test/t/heap_btree.test @@ -0,0 +1,140 @@ +# +# Test of heap tables. +# + +drop table if exists t1; +create table t1 (a int not null,b int not null, primary key using BTREE (a)) type=heap comment="testing heaps" avg_row_length=100 min_rows=1 max_rows=100; +insert into t1 values(1,1),(2,2),(3,3),(4,4); +delete from t1 where a=1 or a=0; +#show table status like "t1"; +show keys from t1; +select * from t1; +select * from t1 where a=4; +update t1 set b=5 where a=4; +update t1 set b=b+1 where a>=3; +replace t1 values (3,3); +select * from t1; +alter table t1 add c int not null, add key using BTREE (c,a); +drop table t1; + +create table t1 (a int not null,b int not null, primary key using BTREE (a)) type=heap comment="testing heaps"; +insert into t1 values(1,1),(2,2),(3,3),(4,4); +delete from t1 where a > 0; +select * from t1; +drop table t1; + +create table t1 (a int not null,b int not null, primary key using BTREE (a)) type=heap comment="testing heaps"; +insert into t1 values(1,1),(2,2),(3,3),(4,4); +alter table t1 modify a int not null auto_increment, type=myisam, comment="new myisam table"; +#show table status like "t1"; +select * from t1; +drop table t1; + +create table t1 (a int not null) type=heap; +insert into t1 values (869751),(736494),(226312),(802616); +select * from t1 where a > 736494; +alter table t1 add unique uniq_id using BTREE (a); +select * from t1 where a > 736494; +select * from t1 where a = 736494; +select * from t1 where a=869751 or a=736494; +select * from t1 where a in (869751,736494,226312,802616); +alter table t1 type=myisam; +explain select * from t1 where a in (869751,736494,226312,802616); +drop table t1; + +create table t1 (x int not null, y int not null, key x using BTREE (x), unique y using BTREE (y)) +type=heap; +insert into t1 values (1,1),(2,2),(1,3),(2,4),(2,5),(2,6); +select * from t1 where x=1; +select * from t1,t1 as t2 where t1.x=t2.y; +explain select * from t1,t1 as t2 where t1.x=t2.y; +drop table t1; + +create table t1 (a int) type=heap; +insert into t1 values(1); +select max(a) from t1; +drop table t1; + +CREATE TABLE t1 ( a int not null default 0, b int not null default 0, key using BTREE (a), key using BTREE (b) ) TYPE=HEAP; +insert into t1 values(1,1),(1,2),(2,3),(1,3),(1,4),(1,5),(1,6); +select * from t1 where a=1; +insert into t1 values(1,1),(1,2),(2,3),(1,3),(1,4),(1,5),(1,6); +select * from t1 where a=1; +drop table t1; + +create table t1 (id int unsigned not null, primary key using BTREE (id)) type=HEAP; +insert into t1 values(1); +select max(id) from t1; +insert into t1 values(2); +select max(id) from t1; +replace into t1 values(1); +drop table t1; + +create table t1 (n int) type=heap; +drop table t1; + +create table t1 (n int) type=heap; +drop table if exists t1; + +# Test of non unique index + +CREATE table t1(f1 int not null,f2 char(20) not +null,index(f2)) type=heap; +INSERT into t1 set f1=12,f2="bill"; +INSERT into t1 set f1=13,f2="bill"; +INSERT into t1 set f1=14,f2="bill"; +INSERT into t1 set f1=15,f2="bill"; +INSERT into t1 set f1=16,f2="ted"; +INSERT into t1 set f1=12,f2="ted"; +INSERT into t1 set f1=12,f2="ted"; +INSERT into t1 set f1=12,f2="ted"; +INSERT into t1 set f1=12,f2="ted"; +delete from t1 where f2="bill"; +select * from t1; +drop table t1; + +# +# Test when using part key searches +# + +create table t1 (btn char(10) not null, key using BTREE (btn)) type=heap; +insert into t1 values ("hello"),("hello"),("hello"),("hello"),("hello"),("a"),("b"),("c"),("d"),("e"),("f"),("g"),("h"),("i"); +explain select * from t1 where btn like "q%"; +select * from t1 where btn like "q%"; +alter table t1 add column new_col char(1) not null, add key using BTREE (btn,new_col), drop key btn; +update t1 set new_col=btn; +explain select * from t1 where btn="a"; +explain select * from t1 where btn="a" and new_col="a"; +drop table t1; + +# +# Test of NULL keys +# + +CREATE TABLE t1 ( + a int default NULL, + b int default NULL, + KEY a using BTREE (a), + UNIQUE b using BTREE (b) +) type=heap; +INSERT INTO t1 VALUES (NULL,99),(99,NULL),(1,1),(2,2),(1,3); +SELECT * FROM t1 WHERE a=NULL; +explain SELECT * FROM t1 WHERE a IS NULL; +SELECT * FROM t1 WHERE a<=>NULL; +SELECT * FROM t1 WHERE b=NULL; +explain SELECT * FROM t1 WHERE b IS NULL; +SELECT * FROM t1 WHERE b<=>NULL; + +--error 1062 +INSERT INTO t1 VALUES (1,3); +DROP TABLE t1; + +# +# Test when deleting all rows +# + +CREATE TABLE t1 (a int not null, primary key using BTREE (a)) type=heap; +INSERT into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11); +DELETE from t1 where a < 100; +SELECT * from t1; +DROP TABLE t1; diff --git a/mysql-test/t/heap_hash.test b/mysql-test/t/heap_hash.test new file mode 100644 index 00000000000..5dbd2b4a928 --- /dev/null +++ b/mysql-test/t/heap_hash.test @@ -0,0 +1,140 @@ +# +# Test of heap tables. +# + +drop table if exists t1; +create table t1 (a int not null,b int not null, primary key using HASH (a)) type=heap comment="testing heaps" avg_row_length=100 min_rows=1 max_rows=100; +insert into t1 values(1,1),(2,2),(3,3),(4,4); +delete from t1 where a=1 or a=0; +#show table status like "t1"; +show keys from t1; +select * from t1; +select * from t1 where a=4; +update t1 set b=5 where a=4; +update t1 set b=b+1 where a>=3; +replace t1 values (3,3); +select * from t1; +alter table t1 add c int not null, add key using HASH (c,a); +drop table t1; + +create table t1 (a int not null,b int not null, primary key using HASH (a)) type=heap comment="testing heaps"; +insert into t1 values(1,1),(2,2),(3,3),(4,4); +delete from t1 where a > 0; +select * from t1; +drop table t1; + +create table t1 (a int not null,b int not null, primary key using HASH (a)) type=heap comment="testing heaps"; +insert into t1 values(1,1),(2,2),(3,3),(4,4); +alter table t1 modify a int not null auto_increment, type=myisam, comment="new myisam table"; +#show table status like "t1"; +select * from t1; +drop table t1; + +create table t1 (a int not null) type=heap; +insert into t1 values (869751),(736494),(226312),(802616); +select * from t1 where a > 736494; +alter table t1 add unique uniq_id using HASH (a); +select * from t1 where a > 736494; +select * from t1 where a = 736494; +select * from t1 where a=869751 or a=736494; +select * from t1 where a in (869751,736494,226312,802616); +alter table t1 type=myisam; +explain select * from t1 where a in (869751,736494,226312,802616); +drop table t1; + +create table t1 (x int not null, y int not null, key x using HASH (x), unique y using HASH (y)) +type=heap; +insert into t1 values (1,1),(2,2),(1,3),(2,4),(2,5),(2,6); +select * from t1 where x=1; +select * from t1,t1 as t2 where t1.x=t2.y; +explain select * from t1,t1 as t2 where t1.x=t2.y; +drop table t1; + +create table t1 (a int) type=heap; +insert into t1 values(1); +select max(a) from t1; +drop table t1; + +CREATE TABLE t1 ( a int not null default 0, b int not null default 0, key using HASH (a), key using HASH (b) ) TYPE=HEAP; +insert into t1 values(1,1),(1,2),(2,3),(1,3),(1,4),(1,5),(1,6); +select * from t1 where a=1; +insert into t1 values(1,1),(1,2),(2,3),(1,3),(1,4),(1,5),(1,6); +select * from t1 where a=1; +drop table t1; + +create table t1 (id int unsigned not null, primary key using HASH (id)) type=HEAP; +insert into t1 values(1); +select max(id) from t1; +insert into t1 values(2); +select max(id) from t1; +replace into t1 values(1); +drop table t1; + +create table t1 (n int) type=heap; +drop table t1; + +create table t1 (n int) type=heap; +drop table if exists t1; + +# Test of non unique index + +CREATE table t1(f1 int not null,f2 char(20) not +null,index(f2)) type=heap; +INSERT into t1 set f1=12,f2="bill"; +INSERT into t1 set f1=13,f2="bill"; +INSERT into t1 set f1=14,f2="bill"; +INSERT into t1 set f1=15,f2="bill"; +INSERT into t1 set f1=16,f2="ted"; +INSERT into t1 set f1=12,f2="ted"; +INSERT into t1 set f1=12,f2="ted"; +INSERT into t1 set f1=12,f2="ted"; +INSERT into t1 set f1=12,f2="ted"; +delete from t1 where f2="bill"; +select * from t1; +drop table t1; + +# +# Test when using part key searches +# + +create table t1 (btn char(10) not null, key using HASH (btn)) type=heap; +insert into t1 values ("hello"),("hello"),("hello"),("hello"),("hello"),("a"),("b"),("c"),("d"),("e"),("f"),("g"),("h"),("i"); +explain select * from t1 where btn like "q%"; +select * from t1 where btn like "q%"; +alter table t1 add column new_col char(1) not null, add key using HASH (btn,new_col), drop key btn; +update t1 set new_col=btn; +explain select * from t1 where btn="a"; +explain select * from t1 where btn="a" and new_col="a"; +drop table t1; + +# +# Test of NULL keys +# + +CREATE TABLE t1 ( + a int default NULL, + b int default NULL, + KEY a using HASH (a), + UNIQUE b using HASH (b) +) type=heap; +INSERT INTO t1 VALUES (NULL,99),(99,NULL),(1,1),(2,2),(1,3); +SELECT * FROM t1 WHERE a=NULL; +explain SELECT * FROM t1 WHERE a IS NULL; +SELECT * FROM t1 WHERE a<=>NULL; +SELECT * FROM t1 WHERE b=NULL; +explain SELECT * FROM t1 WHERE b IS NULL; +SELECT * FROM t1 WHERE b<=>NULL; + +--error 1062 +INSERT INTO t1 VALUES (1,3); +DROP TABLE t1; + +# +# Test when deleting all rows +# + +CREATE TABLE t1 (a int not null, primary key using HASH (a)) type=heap; +INSERT into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11); +DELETE from t1 where a < 100; +SELECT * from t1; +DROP TABLE t1; diff --git a/mysys/Makefile.am b/mysys/Makefile.am index 287dc357b3d..a32740e2168 100644 --- a/mysys/Makefile.am +++ b/mysys/Makefile.am @@ -46,7 +46,8 @@ libmysys_a_SOURCES = my_init.c my_getwd.c mf_getdate.c\ my_quick.c my_lockmem.c my_static.c \ getopt.c getopt1.c my_getopt.c getvar.c my_mkdir.c \ default.c my_compress.c checksum.c raid.cc my_net.c \ - my_vsnprintf.c charset.c my_bitmap.c my_bit.c md5.c + my_vsnprintf.c charset.c my_bitmap.c my_bit.c md5.c \ + my_handler.c EXTRA_DIST = thr_alarm.c thr_lock.c my_pthread.c my_thr_init.c \ thr_mutex.c thr_rwlock.c libmysys_a_LIBADD = @THREAD_LOBJECTS@ diff --git a/mysys/my_handler.c b/mysys/my_handler.c new file mode 100644 index 00000000000..afaada615b4 --- /dev/null +++ b/mysys/my_handler.c @@ -0,0 +1,717 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + 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; either + version 2 of the License, or (at your option) any later version. + + 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., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +#include "my_handler.h" + +int _mi_compare_text(CHARSET_INFO *charset_info, uchar *a, uint a_length, + uchar *b, uint b_length, my_bool part_key) +{ + int flag; + +#ifdef USE_STRCOLL + if (use_strcoll(charset_info)) + { + /* QQ: This needs to work with part keys at some point */ + return my_strnncoll(charset_info, a, a_length, b, b_length); + } + else +#endif + { + uint length= min(a_length,b_length); + uchar *end= a+ length; + uchar *sort_order=charset_info->sort_order; + while (a < end) + if ((flag= (int) sort_order[*a++] - (int) sort_order[*b++])) + return flag; + } + if (part_key && b_length < a_length) + return 0; + return (int) (a_length-b_length); +} + +static int compare_bin(uchar *a, uint a_length, uchar *b, uint b_length, + my_bool part_key) +{ + uint length= min(a_length,b_length); + uchar *end= a+ length; + int flag; + + while (a < end) + if ((flag= (int) *a++ - (int) *b++)) + return flag; + if (part_key && b_length < a_length) + return 0; + return (int) (a_length-b_length); +} + +#define CMP(a,b) (a0 acording to which is bigger +Key_length specifies length of key to use. Number-keys can't be splited +If flag <> SEARCH_FIND compare also position +*/ +int _mi_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, + register uchar *b, uint key_length, uint nextflag, + uint *diff_pos) +{ + int flag; + int16 s_1,s_2; + int32 l_1,l_2; + uint32 u_1,u_2; + float f_1,f_2; + double d_1,d_2; + uint next_key_length; + + *diff_pos=0; + for ( ; (int) key_length >0 ; key_length=next_key_length, keyseg++) + { + uchar *end; + (*diff_pos)++; + + /* Handle NULL part */ + if (keyseg->null_bit) + { + key_length--; + if (*a != *b) + { + flag = (int) *a - (int) *b; + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + } + b++; + if (!*a++) /* If key was NULL */ + { + if (nextflag == (SEARCH_FIND | SEARCH_UPDATE)) + nextflag=SEARCH_SAME; /* Allow duplicate keys */ + next_key_length=key_length; + continue; /* To next key part */ + } + } + end= a+ min(keyseg->length,key_length); + next_key_length=key_length-keyseg->length; + + switch ((enum ha_base_keytype) keyseg->type) { + case HA_KEYTYPE_TEXT: /* Ascii; Key is converted */ + if (keyseg->flag & HA_SPACE_PACK) + { + int a_length,b_length,pack_length; + get_key_length(a_length,a); + get_key_pack_length(b_length,pack_length,b); + next_key_length=key_length-b_length-pack_length; + + if ((flag=_mi_compare_text(keyseg->charset,a,a_length,b,b_length, + (my_bool) ((nextflag & SEARCH_PREFIX) && + next_key_length <= 0)))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a+=a_length; + b+=b_length; + break; + } + else + { + uint length=(uint) (end-a), a_length=length, b_length=length; + if (!(nextflag & SEARCH_PREFIX)) + { + while (a_length && a[a_length-1] == ' ') + a_length--; + while (b_length && b[b_length-1] == ' ') + b_length--; + } + if ((flag=_mi_compare_text(keyseg->charset,a,a_length,b,b_length, + (my_bool) ((nextflag & SEARCH_PREFIX) && + next_key_length <= 0)))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a=end; + b+=length; + } + break; + case HA_KEYTYPE_BINARY: + if (keyseg->flag & HA_SPACE_PACK) + { + int a_length,b_length,pack_length; + get_key_length(a_length,a); + get_key_pack_length(b_length,pack_length,b); + next_key_length=key_length-b_length-pack_length; + + if ((flag=compare_bin(a,a_length,b,b_length, + (my_bool) ((nextflag & SEARCH_PREFIX) && + next_key_length <= 0)))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a+=a_length; + b+=b_length; + break; + } + else + { + uint length=keyseg->length; + if ((flag=compare_bin(a,length,b,length, + (my_bool) ((nextflag & SEARCH_PREFIX) && + next_key_length <= 0)))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a+=length; + b+=length; + } + break; + case HA_KEYTYPE_VARTEXT: + { + int a_length,b_length,pack_length; + get_key_length(a_length,a); + get_key_pack_length(b_length,pack_length,b); + next_key_length=key_length-b_length-pack_length; + + if ((flag=_mi_compare_text(keyseg->charset,a,a_length,b,b_length, + (my_bool) ((nextflag & SEARCH_PREFIX) && + next_key_length <= 0)))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a+=a_length; + b+=b_length; + break; + } + break; + case HA_KEYTYPE_VARBINARY: + { + int a_length,b_length,pack_length; + get_key_length(a_length,a); + get_key_pack_length(b_length,pack_length,b); + next_key_length=key_length-b_length-pack_length; + + if ((flag=compare_bin(a,a_length,b,b_length, + (my_bool) ((nextflag & SEARCH_PREFIX) && + next_key_length <= 0)))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a+=a_length; + b+=b_length; + break; + } + break; + case HA_KEYTYPE_INT8: + { + int i_1= (int) *((signed char*) a); + int i_2= (int) *((signed char*) b); + if ((flag = CMP(i_1,i_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b++; + break; + } + case HA_KEYTYPE_SHORT_INT: + s_1= mi_sint2korr(a); + s_2= mi_sint2korr(b); + if ((flag = CMP(s_1,s_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 2; /* sizeof(short int); */ + break; + case HA_KEYTYPE_USHORT_INT: + { + uint16 us_1,us_2; + us_1= mi_sint2korr(a); + us_2= mi_sint2korr(b); + if ((flag = CMP(us_1,us_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+=2; /* sizeof(short int); */ + break; + } + case HA_KEYTYPE_LONG_INT: + l_1= mi_sint4korr(a); + l_2= mi_sint4korr(b); + if ((flag = CMP(l_1,l_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 4; /* sizeof(long int); */ + break; + case HA_KEYTYPE_ULONG_INT: + u_1= mi_sint4korr(a); + u_2= mi_sint4korr(b); + if ((flag = CMP(u_1,u_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 4; /* sizeof(long int); */ + break; + case HA_KEYTYPE_INT24: + l_1=mi_sint3korr(a); + l_2=mi_sint3korr(b); + if ((flag = CMP(l_1,l_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 3; + break; + case HA_KEYTYPE_UINT24: + l_1=mi_uint3korr(a); + l_2=mi_uint3korr(b); + if ((flag = CMP(l_1,l_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 3; + break; + case HA_KEYTYPE_FLOAT: + mi_float4get(f_1,a); + mi_float4get(f_2,b); + if ((flag = CMP(f_1,f_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 4; /* sizeof(float); */ + break; + case HA_KEYTYPE_DOUBLE: + mi_float8get(d_1,a); + mi_float8get(d_2,b); + if ((flag = CMP(d_1,d_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 8; /* sizeof(double); */ + break; + case HA_KEYTYPE_NUM: /* Numeric key */ + { + int swap_flag= 0; + int alength,blength; + + if (keyseg->flag & HA_REVERSE_SORT) + { + swap(uchar*,a,b); + swap_flag=1; /* Remember swap of a & b */ + end= a+ (int) (end-b); + } + if (keyseg->flag & HA_SPACE_PACK) + { + alength= *a++; blength= *b++; + end=a+alength; + next_key_length=key_length-blength-1; + } + else + { + alength= (int) (end-a); + blength=keyseg->length; + /* remove pre space from keys */ + for ( ; alength && *a == ' ' ; a++, alength--) ; + for ( ; blength && *b == ' ' ; b++, blength--) ; + } + + if (*a == '-') + { + if (*b != '-') + return -1; + a++; b++; + swap(uchar*,a,b); + swap(int,alength,blength); + swap_flag=1-swap_flag; + alength--; blength--; + end=a+alength; + } + else if (*b == '-') + return 1; + while (alength && (*a == '+' || *a == '0')) + { + a++; alength--; + } + while (blength && (*b == '+' || *b == '0')) + { + b++; blength--; + } + if (alength != blength) + return (alength < blength) ? -1 : 1; + while (a < end) + if (*a++ != *b++) + return ((int) a[-1] - (int) b[-1]); + + if (swap_flag) /* Restore pointers */ + swap(uchar*,a,b); + break; + } +#ifdef HAVE_LONG_LONG + case HA_KEYTYPE_LONGLONG: + { + longlong ll_a,ll_b; + ll_a= mi_sint8korr(a); + ll_b= mi_sint8korr(b); + if ((flag = CMP(ll_a,ll_b))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 8; + break; + } + case HA_KEYTYPE_ULONGLONG: + { + ulonglong ll_a,ll_b; + ll_a= mi_uint8korr(a); + ll_b= mi_uint8korr(b); + if ((flag = CMP(ll_a,ll_b))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 8; + break; + } +#endif + case HA_KEYTYPE_END: /* Ready */ + goto end; /* diff_pos is incremented */ + } + } + (*diff_pos)++; +end: + if (!(nextflag & SEARCH_FIND)) + { + uint i; + if (nextflag & (SEARCH_NO_FIND | SEARCH_LAST)) /* Find record after key */ + return (nextflag & (SEARCH_BIGGER | SEARCH_LAST)) ? -1 : 1; + flag=0; + for (i=keyseg->length ; i-- > 0 ; ) + { + if (*a++ != *b++) + { + flag= FCMP(a[-1],b[-1]); + break; + } + } + if (nextflag & SEARCH_SAME) + return (flag); /* read same */ + if (nextflag & SEARCH_BIGGER) + return (flag <= 0 ? -1 : 1); /* read next */ + return (flag < 0 ? -1 : 1); /* read previous */ + } + return 0; +} /* my_key_cmp */ + +/* +Compare two keys +Returns <0, 0, >0 acording to which is bigger +Key_length specifies length of key to use. Number-keys can't be splited +If flag <> SEARCH_FIND compare also position +*/ +int hp_rb_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, + register uchar *b, uint key_length, uint nextflag, + uint *diff_pos) +{ + int flag; + int16 s_1,s_2; + int32 l_1,l_2; + uint32 u_1,u_2; + float f_1,f_2; + double d_1,d_2; + uint next_key_length; + + *diff_pos=0; + for ( ; (int) key_length >0 ; key_length=next_key_length, keyseg++) + { + uchar *end; + (*diff_pos)++; + + /* Handle NULL part */ + if (keyseg->null_bit) + { + key_length--; + if (*a != *b) + { + flag = (int) *a - (int) *b; + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + } + b++; + if (!*a++) /* If key was NULL */ + { + if (nextflag == (SEARCH_FIND | SEARCH_UPDATE)) + nextflag=SEARCH_SAME; /* Allow duplicate keys */ + next_key_length=key_length; + a+= keyseg->length; + b+= keyseg->length; + key_length-= keyseg->length; + continue; /* To next key part */ + } + } + end= a+ min(keyseg->length,key_length); + next_key_length=key_length-keyseg->length; + + switch ((enum ha_base_keytype) keyseg->type) { + case HA_KEYTYPE_TEXT: /* Ascii; Key is converted */ + if (keyseg->flag & HA_SPACE_PACK) + { + int a_length,b_length,pack_length; + get_key_length(a_length,a); + get_key_pack_length(b_length,pack_length,b); + next_key_length=key_length-b_length-pack_length; + + if ((flag=_mi_compare_text(keyseg->charset,a,a_length,b,b_length, + (my_bool) ((nextflag & SEARCH_PREFIX) && + next_key_length <= 0)))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a+=a_length; + b+=b_length; + break; + } + else + { + uint length=(uint) (end-a), a_length=length, b_length=length; + if (!(nextflag & SEARCH_PREFIX)) + { + while (a_length && a[a_length-1] == ' ') + a_length--; + while (b_length && b[b_length-1] == ' ') + b_length--; + } + if ((flag=_mi_compare_text(keyseg->charset,a,a_length,b,b_length, + (my_bool) ((nextflag & SEARCH_PREFIX) && + next_key_length <= 0)))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a=end; + b+=length; + } + break; + case HA_KEYTYPE_BINARY: + if (keyseg->flag & HA_SPACE_PACK) + { + int a_length,b_length,pack_length; + get_key_length(a_length,a); + get_key_pack_length(b_length,pack_length,b); + next_key_length=key_length-b_length-pack_length; + + if ((flag=compare_bin(a,a_length,b,b_length, + (my_bool) ((nextflag & SEARCH_PREFIX) && + next_key_length <= 0)))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a+=a_length; + b+=b_length; + break; + } + else + { + uint length=keyseg->length; + if ((flag=compare_bin(a,length,b,length, + (my_bool) ((nextflag & SEARCH_PREFIX) && + next_key_length <= 0)))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a+=length; + b+=length; + } + break; + case HA_KEYTYPE_VARTEXT: + { + int a_length,b_length,pack_length; + get_key_length(a_length,a); + get_key_pack_length(b_length,pack_length,b); + next_key_length=key_length-b_length-pack_length; + + if ((flag=_mi_compare_text(keyseg->charset,a,a_length,b,b_length, + (my_bool) ((nextflag & SEARCH_PREFIX) && + next_key_length <= 0)))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a+=a_length; + b+=b_length; + break; + } + break; + case HA_KEYTYPE_VARBINARY: + { + int a_length,b_length,pack_length; + get_key_length(a_length,a); + get_key_pack_length(b_length,pack_length,b); + next_key_length=key_length-b_length-pack_length; + + if ((flag=compare_bin(a,a_length,b,b_length, + (my_bool) ((nextflag & SEARCH_PREFIX) && + next_key_length <= 0)))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a+=a_length; + b+=b_length; + break; + } + break; + case HA_KEYTYPE_INT8: + { + int i_1= (int) *((signed char*) a); + int i_2= (int) *((signed char*) b); + if ((flag = CMP(i_1,i_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b++; + break; + } + case HA_KEYTYPE_SHORT_INT: + s_1= mi_sint2korr(a); + s_2= mi_sint2korr(b); + if ((flag = CMP(s_1,s_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 2; /* sizeof(short int); */ + break; + case HA_KEYTYPE_USHORT_INT: + { + uint16 us_1,us_2; + us_1= mi_sint2korr(a); + us_2= mi_sint2korr(b); + if ((flag = CMP(us_1,us_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+=2; /* sizeof(short int); */ + break; + } + case HA_KEYTYPE_LONG_INT: + l_1= mi_sint4korr(a); + l_2= mi_sint4korr(b); + if ((flag = CMP(l_1,l_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 4; /* sizeof(long int); */ + break; + case HA_KEYTYPE_ULONG_INT: + u_1= mi_sint4korr(a); + u_2= mi_sint4korr(b); + if ((flag = CMP(u_1,u_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 4; /* sizeof(long int); */ + break; + case HA_KEYTYPE_INT24: + l_1=mi_sint3korr(a); + l_2=mi_sint3korr(b); + if ((flag = CMP(l_1,l_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 3; + break; + case HA_KEYTYPE_UINT24: + l_1=mi_uint3korr(a); + l_2=mi_uint3korr(b); + if ((flag = CMP(l_1,l_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 3; + break; + case HA_KEYTYPE_FLOAT: + mi_float4get(f_1,a); + mi_float4get(f_2,b); + if ((flag = CMP(f_1,f_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 4; /* sizeof(float); */ + break; + case HA_KEYTYPE_DOUBLE: + mi_float8get(d_1,a); + mi_float8get(d_2,b); + if ((flag = CMP(d_1,d_2))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 8; /* sizeof(double); */ + break; + case HA_KEYTYPE_NUM: /* Numeric key */ + { + int swap_flag= 0; + int alength,blength; + + if (keyseg->flag & HA_REVERSE_SORT) + { + swap(uchar*,a,b); + swap_flag=1; /* Remember swap of a & b */ + end= a+ (int) (end-b); + } + if (keyseg->flag & HA_SPACE_PACK) + { + alength= *a++; blength= *b++; + end=a+alength; + next_key_length=key_length-blength-1; + } + else + { + alength= (int) (end-a); + blength=keyseg->length; + /* remove pre space from keys */ + for ( ; alength && *a == ' ' ; a++, alength--) ; + for ( ; blength && *b == ' ' ; b++, blength--) ; + } + + if (*a == '-') + { + if (*b != '-') + return -1; + a++; b++; + swap(uchar*,a,b); + swap(int,alength,blength); + swap_flag=1-swap_flag; + alength--; blength--; + end=a+alength; + } + else if (*b == '-') + return 1; + while (alength && (*a == '+' || *a == '0')) + { + a++; alength--; + } + while (blength && (*b == '+' || *b == '0')) + { + b++; blength--; + } + if (alength != blength) + return (alength < blength) ? -1 : 1; + while (a < end) + if (*a++ != *b++) + return ((int) a[-1] - (int) b[-1]); + + if (swap_flag) /* Restore pointers */ + swap(uchar*,a,b); + break; + } +#ifdef HAVE_LONG_LONG + case HA_KEYTYPE_LONGLONG: + { + longlong ll_a,ll_b; + ll_a= mi_sint8korr(a); + ll_b= mi_sint8korr(b); + if ((flag = CMP(ll_a,ll_b))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 8; + break; + } + case HA_KEYTYPE_ULONGLONG: + { + ulonglong ll_a,ll_b; + ll_a= mi_uint8korr(a); + ll_b= mi_uint8korr(b); + if ((flag = CMP(ll_a,ll_b))) + return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); + a= end; + b+= 8; + break; + } +#endif + case HA_KEYTYPE_END: /* Ready */ + goto end; /* diff_pos is incremented */ + } + } + (*diff_pos)++; +end: + if (!(nextflag & SEARCH_FIND)) + { + uint i; + if (nextflag & (SEARCH_NO_FIND | SEARCH_LAST)) /* Find record after key */ + return (nextflag & (SEARCH_BIGGER | SEARCH_LAST)) ? -1 : 1; + flag=0; + for (i=keyseg->length ; i-- > 0 ; ) + { + if (*a++ != *b++) + { + flag= FCMP(a[-1],b[-1]); + break; + } + } + if (nextflag & SEARCH_SAME) + return (flag); /* read same */ + if (nextflag & SEARCH_BIGGER) + return (flag <= 0 ? -1 : 1); /* read next */ + return (flag < 0 ? -1 : 1); /* read previous */ + } + return 0; +} /* my_key_cmp */ diff --git a/mysys/tree.c b/mysys/tree.c index 2ac2c88fd66..632660344b5 100644 --- a/mysys/tree.c +++ b/mysys/tree.c @@ -42,6 +42,7 @@ #include "mysys_priv.h" #include #include +#include "my_base.h" #define BLACK 1 #define RED 0 @@ -167,7 +168,8 @@ static void delete_tree_element(TREE *tree, TREE_ELEMENT *element) parent[0] = & parent[-1][0]->right */ -TREE_ELEMENT *tree_insert(TREE *tree, void *key, uint key_size) +TREE_ELEMENT *tree_insert(TREE *tree, void *key, uint key_size, + void* custom_arg) { int cmp; TREE_ELEMENT *element,***parent; @@ -177,8 +179,8 @@ TREE_ELEMENT *tree_insert(TREE *tree, void *key, uint key_size) for (;;) { if (element == &tree->null_element || - (cmp=(*tree->compare)(tree->custom_arg, - ELEMENT_KEY(tree,element),key)) == 0) + (cmp = (*tree->compare)(custom_arg, ELEMENT_KEY(tree,element), + key)) == 0) break; if (cmp < 0) { @@ -198,7 +200,7 @@ TREE_ELEMENT *tree_insert(TREE *tree, void *key, uint key_size) && tree->allocated > tree->memory_limit) { reset_tree(tree); - return tree_insert(tree, key, key_size); + return tree_insert(tree, key, key_size, custom_arg); } key_size+=tree->size_of_element; @@ -234,8 +236,7 @@ TREE_ELEMENT *tree_insert(TREE *tree, void *key, uint key_size) return element; } - -int tree_delete(TREE *tree, void *key) +int tree_delete(TREE *tree, void *key, void *custom_arg) { int cmp,remove_colour; TREE_ELEMENT *element,***parent, ***org_parent, *nod; @@ -248,8 +249,8 @@ int tree_delete(TREE *tree, void *key) { if (element == &tree->null_element) return 1; /* Was not in tree */ - if ((cmp=(*tree->compare)(tree->custom_arg, - ELEMENT_KEY(tree,element),key)) == 0) + if ((cmp = (*tree->compare)(custom_arg, ELEMENT_KEY(tree,element), + key)) == 0) break; if (cmp < 0) { @@ -296,7 +297,7 @@ int tree_delete(TREE *tree, void *key) } -void *tree_search(TREE *tree, void *key) +void *tree_search(TREE *tree, void *key, void *custom_arg) { int cmp; TREE_ELEMENT *element=tree->root; @@ -305,8 +306,8 @@ void *tree_search(TREE *tree, void *key) { if (element == &tree->null_element) return (void*) 0; - if ((cmp=(*tree->compare)(tree->custom_arg, - ELEMENT_KEY(tree,element),key)) == 0) + if ((cmp = (*tree->compare)(custom_arg, ELEMENT_KEY(tree,element), + key)) == 0) return ELEMENT_KEY(tree,element); if (cmp < 0) element=element->right; @@ -315,6 +316,172 @@ void *tree_search(TREE *tree, void *key) } } +void *tree_search_key(TREE *tree, const void *key, + TREE_ELEMENT **parents, TREE_ELEMENT ***last_pos, + enum ha_rkey_function flag, void *custom_arg) +{ + int cmp; + TREE_ELEMENT *element = tree->root; + TREE_ELEMENT **last_left_step_parent = NULL; + TREE_ELEMENT **last_equal_element = NULL; + +/* + TODO: handle HA_READ_KEY_OR_PREV, HA_READ_BEFORE_KEY, HA_READ_PREFIX, + HA_READ_PREFIX_LAST flags if needed. +*/ + + *parents = &tree->null_element; + while (element != &tree->null_element) + { + *++parents = element; + if ((cmp = (*tree->compare)(custom_arg, ELEMENT_KEY(tree, element), + key)) == 0) + { + switch (flag) { + case HA_READ_KEY_EXACT: + case HA_READ_KEY_OR_NEXT: + last_equal_element = parents; + cmp = 1; + break; + case HA_READ_AFTER_KEY: + cmp = -1; + break; + default: + return NULL; + } + } + if (cmp < 0) /* element < key */ + { + element = element->right; + } + else + { + last_left_step_parent = parents; + element = element->left; + } + } + switch (flag) { + case HA_READ_KEY_EXACT: + *last_pos = last_equal_element; + break; + case HA_READ_KEY_OR_NEXT: + *last_pos = last_equal_element ? last_equal_element : last_left_step_parent; + break; + case HA_READ_AFTER_KEY: + *last_pos = last_left_step_parent; + break; + default: + return NULL; + } + return *last_pos ? ELEMENT_KEY(tree, **last_pos) : NULL; +} + +/* + Search first (the most left) or last (the most right) tree element +*/ +void *tree_search_edge(TREE *tree, TREE_ELEMENT **parents, + TREE_ELEMENT ***last_pos, int child_offs) +{ + TREE_ELEMENT *element = tree->root; + + *parents = &tree->null_element; + while (element != &tree->null_element) + { + *++parents = element; + element = ELEMENT_CHILD(element, child_offs); + } + *last_pos = parents; + return **last_pos != &tree->null_element ? + ELEMENT_KEY(tree, **last_pos) : NULL; +} + +void *tree_search_next(TREE *tree, TREE_ELEMENT ***last_pos, int l_offs, + int r_offs) +{ + TREE_ELEMENT *x = **last_pos; + + if (ELEMENT_CHILD(x, r_offs) != &tree->null_element) + { + x = ELEMENT_CHILD(x, r_offs); + *++*last_pos = x; + while (ELEMENT_CHILD(x, l_offs) != &tree->null_element) + { + x = ELEMENT_CHILD(x, l_offs); + *++*last_pos = x; + } + return ELEMENT_KEY(tree, x); + } + else + { + TREE_ELEMENT *y = *--*last_pos; + while (y != &tree->null_element && x == ELEMENT_CHILD(y, r_offs)) + { + x = y; + y = *--*last_pos; + } + return y == &tree->null_element ? NULL : ELEMENT_KEY(tree, y); + } +} + +/* + Expected that tree is fully balanced + (each path from root to leaf has the same length) +*/ +uint tree_record_pos(TREE *tree, const void *key, + enum ha_rkey_function flag, void *custom_arg) +{ + int cmp; + TREE_ELEMENT *element = tree->root; + uint left = 1; + uint right = tree->elements_in_tree; + uint last_left_step_pos = tree->elements_in_tree; + uint last_right_step_pos = 1; + uint last_equal_pos = HA_POS_ERROR; + + while (element != &tree->null_element) + { + if ((cmp = (*tree->compare)(custom_arg, ELEMENT_KEY(tree, element), + key)) == 0) + { + switch (flag) { + case HA_READ_KEY_EXACT: + last_equal_pos = (left + right) >> 1; + cmp = 1; + break; + case HA_READ_BEFORE_KEY: + cmp = 1; + break; + case HA_READ_AFTER_KEY: + cmp = -1; + break; + default: + return HA_POS_ERROR; + } + } + if (cmp < 0) /* element < key */ + { + last_right_step_pos = (left + right) >> 1; + element = element->right; + left = last_right_step_pos; + } + else + { + last_left_step_pos = (left + right) >> 1; + element = element->left; + right = last_left_step_pos; + } + } + switch (flag) { + case HA_READ_KEY_EXACT: + return last_equal_pos; + case HA_READ_BEFORE_KEY: + return last_right_step_pos; + case HA_READ_AFTER_KEY: + return last_left_step_pos; + default: + return HA_POS_ERROR; + } +} int tree_walk(TREE *tree, tree_walk_action action, void *argument, TREE_WALK visit) { diff --git a/sql/ha_heap.cc b/sql/ha_heap.cc index 5f482bca1e8..8a4758aa558 100644 --- a/sql/ha_heap.cc +++ b/sql/ha_heap.cc @@ -36,42 +36,59 @@ int ha_heap::open(const char *name, int mode, uint test_if_locked) uint key,parts,mem_per_row=0; ulong max_rows; HP_KEYDEF *keydef; - HP_KEYSEG *seg; + MI_KEYSEG *seg; for (key=parts=0 ; key < table->keys ; key++) + { parts+=table->key_info[key].key_parts; + if (table->key_info[key].algorithm == HA_KEY_ALG_BTREE) + { + parts++; /* additional HA_KEYTYPE_END keyseg */ + } + } if (!(keydef=(HP_KEYDEF*) my_malloc(table->keys*sizeof(HP_KEYDEF)+ - parts*sizeof(HP_KEYSEG),MYF(MY_WME)))) + parts*sizeof(MI_KEYSEG),MYF(MY_WME)))) return my_errno; - seg=my_reinterpret_cast(HP_KEYSEG*) (keydef+table->keys); + seg=my_reinterpret_cast(MI_KEYSEG*) (keydef+table->keys); for (key=0 ; key < table->keys ; key++) { KEY *pos=table->key_info+key; KEY_PART_INFO *key_part= pos->key_part; KEY_PART_INFO *key_part_end= key_part+pos->key_parts; - mem_per_row += (pos->key_length + (sizeof(char*) * 2)); + mem_per_row+= (pos->key_length + (sizeof(char*) * 2)); - keydef[key].keysegs=(uint) pos->key_parts; - keydef[key].flag = (pos->flags & (HA_NOSAME | HA_NULL_ARE_EQUAL)); - keydef[key].seg=seg; + keydef[key].keysegs= (uint) pos->key_parts; + keydef[key].flag= (pos->flags & (HA_NOSAME | HA_NULL_ARE_EQUAL)); + keydef[key].seg= seg; + keydef[key].algorithm= pos->algorithm == HA_KEY_ALG_UNDEF ? + HA_KEY_ALG_HASH : pos->algorithm; for (; key_part != key_part_end ; key_part++, seg++) { - uint flag=key_part->key_type; - Field *field=key_part->field; - if (!f_is_packed(flag) && - f_packtype(flag) == (int) FIELD_TYPE_DECIMAL && - !(flag & FIELDFLAG_BINARY)) - seg->type= (int) HA_KEYTYPE_TEXT; + uint flag= key_part->key_type; + Field *field= key_part->field; + if (pos->algorithm == HA_KEY_ALG_BTREE) + { + seg->type= field->key_type(); + } else - seg->type= (int) HA_KEYTYPE_BINARY; - seg->start=(uint) key_part->offset; - seg->length=(uint) key_part->length; + { + if (!f_is_packed(flag) && + f_packtype(flag) == (int) FIELD_TYPE_DECIMAL && + !(flag & FIELDFLAG_BINARY)) + seg->type= (int) HA_KEYTYPE_TEXT; + else + seg->type= (int) HA_KEYTYPE_BINARY; + } + seg->start= (uint) key_part->offset; + seg->length= (uint) key_part->length; + seg->flag = 0; + seg->charset= default_charset_info; if (field->null_ptr) { - seg->null_bit=field->null_bit; + seg->null_bit= field->null_bit; seg->null_pos= (uint) (field->null_ptr- (uchar*) table->record[0]); } @@ -81,6 +98,16 @@ int ha_heap::open(const char *name, int mode, uint test_if_locked) seg->null_pos=0; } } + if (pos->algorithm == HA_KEY_ALG_BTREE) + { + /* additional HA_KEYTYPE_END keyseg */ + keydef[key].keysegs++; + seg->type= HA_KEYTYPE_END; + seg->length= sizeof(byte*); + seg->flag= 0; + seg->null_bit= 0; + seg++; + } } mem_per_row += MY_ALIGN(table->reclength+1, sizeof(char*)); max_rows = (ulong) (max_heap_table_size / mem_per_row); @@ -124,25 +151,21 @@ int ha_heap::delete_row(const byte * buf) return heap_delete(file,buf); } -int ha_heap::index_read(byte * buf, const byte * key, - uint key_len __attribute__((unused)), - enum ha_rkey_function find_flag - __attribute__((unused))) +int ha_heap::index_read(byte * buf, const byte * key, uint key_len, + enum ha_rkey_function find_flag) { - statistic_increment(ha_read_key_count,&LOCK_status); - int error=heap_rkey(file,buf,active_index, key); - table->status=error ? STATUS_NOT_FOUND: 0; + statistic_increment(ha_read_key_count, &LOCK_status); + int error = heap_rkey(file,buf,active_index, key, key_len, find_flag); + table->status = error ? STATUS_NOT_FOUND : 0; return error; } int ha_heap::index_read_idx(byte * buf, uint index, const byte * key, - uint key_len __attribute__((unused)), - enum ha_rkey_function find_flag - __attribute__((unused))) + uint key_len, enum ha_rkey_function find_flag) { - statistic_increment(ha_read_key_count,&LOCK_status); - int error=heap_rkey(file, buf, index, key); - table->status=error ? STATUS_NOT_FOUND: 0; + statistic_increment(ha_read_key_count, &LOCK_status); + int error = heap_rkey(file, buf, index, key, key_len, find_flag); + table->status = error ? STATUS_NOT_FOUND : 0; return error; } @@ -279,12 +302,20 @@ ha_rows ha_heap::records_in_range(int inx, enum ha_rkey_function end_search_flag) { KEY *pos=table->key_info+inx; - if (start_key_len != end_key_len || - start_key_len != pos->key_length || - start_search_flag != HA_READ_KEY_EXACT || - end_search_flag != HA_READ_AFTER_KEY) - return HA_POS_ERROR; // Can't only use exact keys - return 10; // Good guess + if (pos->algorithm == HA_KEY_ALG_BTREE) + { + return hp_rb_records_in_range(file, inx, start_key, start_key_len, + start_search_flag, end_key, end_key_len, end_search_flag); + } + else + { + if (start_key_len != end_key_len || + start_key_len != pos->key_length || + start_search_flag != HA_READ_KEY_EXACT || + end_search_flag != HA_READ_AFTER_KEY) + return HA_POS_ERROR; // Can't only use exact keys + return 10; // Good guess + } } diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc index eabf9536fd0..3def79dc67f 100644 --- a/sql/ha_myisam.cc +++ b/sql/ha_myisam.cc @@ -1010,7 +1010,8 @@ int ha_myisam::create(const char *name, register TABLE *table, for (i=0; i < table->keys ; i++, pos++) { keydef[i].flag= (pos->flags & (HA_NOSAME | HA_FULLTEXT | HA_SPATIAL)); - keydef[i].key_alg=pos->algorithm; + keydef[i].key_alg=pos->algorithm == HA_KEY_ALG_UNDEF ? + HA_KEY_ALG_BTREE : pos->algorithm; keydef[i].seg=keyseg; keydef[i].keysegs=pos->key_parts; for (j=0 ; j < pos->key_parts ; j++) diff --git a/sql/item_sum.cc b/sql/item_sum.cc index 7ebeda19993..83bc2272515 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -1106,7 +1106,7 @@ bool Item_sum_count_distinct::add() if(tree_to_myisam()) return 1; } - else if (!tree_insert(&tree, table->record[0] + rec_offset, 0)) + else if (!tree_insert(&tree, table->record[0] + rec_offset, 0, tree.custom_arg)) return 1; } else if ((error=table->file->write_row(table->record[0]))) diff --git a/sql/sql_analyse.cc b/sql/sql_analyse.cc index fc764333916..8f086863a4e 100644 --- a/sql/sql_analyse.cc +++ b/sql/sql_analyse.cc @@ -309,10 +309,10 @@ void field_str::add() { if (res != &s) s.copy(*res); - if (!tree_search(&tree, (void*) &s)) // If not in tree + if (!tree_search(&tree, (void*) &s, tree.custom_arg)) // If not in tree { s.copy(); // slow, when SAFE_MALLOC is in use - if (!tree_insert(&tree, (void*) &s, 0)) + if (!tree_insert(&tree, (void*) &s, 0, tree.custom_arg)) { room_in_tree = 0; // Remove tree, out of RAM ? delete_tree(&tree); @@ -411,7 +411,7 @@ void field_real::add() if (room_in_tree) { - if (!(element = tree_insert(&tree, (void*) &num, 0))) + if (!(element = tree_insert(&tree, (void*) &num, 0, tree.custom_arg))) { room_in_tree = 0; // Remove tree, out of RAM ? delete_tree(&tree); @@ -464,7 +464,7 @@ void field_longlong::add() if (room_in_tree) { - if (!(element = tree_insert(&tree, (void*) &num, 0))) + if (!(element = tree_insert(&tree, (void*) &num, 0, tree.custom_arg))) { room_in_tree = 0; // Remove tree, out of RAM ? delete_tree(&tree); @@ -518,7 +518,7 @@ void field_ulonglong::add() if (room_in_tree) { - if (!(element = tree_insert(&tree, (void*) &num, 0))) + if (!(element = tree_insert(&tree, (void*) &num, 0, tree.custom_arg))) { room_in_tree = 0; // Remove tree, out of RAM ? delete_tree(&tree); diff --git a/sql/sql_class.h b/sql/sql_class.h index 1b1340c07a2..3ffac72c1db 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -751,7 +751,7 @@ public: { if (tree.elements_in_tree > max_elements && flush()) return 1; - return !tree_insert(&tree,ptr,0); + return !tree_insert(&tree, ptr, 0, tree.custom_arg); } bool get(TABLE *table); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index f5cb9a07a41..782caa8fa51 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -454,7 +454,6 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, key_info->flags = HA_NOSAME; } - key_info->algorithm = key->algorithm; key_info->key_parts=(uint8) key->columns.elements; key_info->key_part=key_part_info; key_info->usable_key_parts= key_number; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 77a70093036..6317b21a603 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1153,7 +1153,7 @@ opt_unique_or_fulltext: | SPATIAL_SYM { $$= Key::SPATIAL; } key_alg: - /* empty */ { $$= HA_KEY_ALG_BTREE; } + /* empty */ { $$= HA_KEY_ALG_UNDEF; } | USING opt_btree_or_rtree { $$= $2; } opt_btree_or_rtree: diff --git a/sql/table.cc b/sql/table.cc index 7e4faa1ba7c..3c217ced03c 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -415,28 +415,6 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, } } - if (keyinfo->name[0]=='S') - keyinfo->flags |= HA_SPATIAL; - -#ifdef BAR_DIRTY_HACK - keyinfo->key_alg=HA_KEY_ALG_BTREE; // BAR : btree by default - - // BAR FIXME: Dirty hack while waiting for new .frm format - switch(keyinfo->name[0]){ - case 'R': - keyinfo->key_alg=HA_KEY_ALG_RTREE; - break; - case 'S': - keyinfo->key_alg = HA_KEY_ALG_RTREE; - keyinfo->flags |= HA_SPATIAL; - break; - case 'B': - default: - keyinfo->key_alg=HA_KEY_ALG_BTREE; - break; - } -#endif - for (i=0 ; i < keyinfo->key_parts ; key_part++,i++) { if (new_field_pack_flag <= 1) -- cgit v1.2.1 From 3adee5046d70aa91fead16c289dd2a1b098b3dfd Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 25 Apr 2002 15:10:29 +0500 Subject: MI_KEYSEG -> HA_KEYSEG _mi_key_cmp -> ha_key_cmp BitKeeper/etc/logging_ok: Logging to logging@openlogging.org accepted --- BitKeeper/etc/logging_ok | 1 + heap/heapdef.h | 2 +- heap/hp_hash.c | 20 ++++++++++---------- heap/hp_open.c | 6 +++--- heap/hp_test1.c | 2 +- heap/hp_test2.c | 2 +- include/heap.h | 2 +- include/my_handler.h | 8 ++++---- include/myisam.h | 6 +++--- myisam/ft_eval.h | 2 +- myisam/ft_static.c | 2 +- myisam/ft_test1.c | 2 +- myisam/ftdefs.h | 2 +- myisam/fulltext.h | 2 +- myisam/mi_check.c | 16 ++++++++-------- myisam/mi_create.c | 8 ++++---- myisam/mi_dbug.c | 2 +- myisam/mi_key.c | 8 ++++---- myisam/mi_open.c | 10 +++++----- myisam/mi_rnext_same.c | 2 +- myisam/mi_search.c | 22 +++++++++++----------- myisam/mi_test1.c | 4 ++-- myisam/mi_test2.c | 4 ++-- myisam/mi_test3.c | 2 +- myisam/mi_unique.c | 4 ++-- myisam/mi_write.c | 2 +- myisam/myisamchk.c | 2 +- myisam/myisamdef.h | 14 +++++++------- myisam/rt_mbr.c | 14 +++++++------- myisam/rt_mbr.h | 14 +++++++------- myisam/rt_test.c | 2 +- myisam/sp_key.c | 2 +- myisam/sp_test.c | 2 +- myisammrg/myrg_queue.c | 2 +- mysys/my_handler.c | 4 ++-- sql/ha_heap.cc | 6 +++--- sql/ha_myisam.cc | 4 ++-- sql/sql_select.cc | 2 +- 38 files changed, 106 insertions(+), 105 deletions(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index 20daaf3a8d6..a0fb630c348 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -53,3 +53,4 @@ tonu@x3.internalnet venu@work.mysql.com zak@balfor.local zak@linux.local +ram@gw.udmsearch.izhnet.ru diff --git a/heap/heapdef.h b/heap/heapdef.h index 53ad87a7d20..aeb345522f5 100644 --- a/heap/heapdef.h +++ b/heap/heapdef.h @@ -42,7 +42,7 @@ typedef struct st_hp_hash_info } HASH_INFO; typedef struct { - MI_KEYSEG *keyseg; + HA_KEYSEG *keyseg; uint key_length; uint search_flag; } heap_rb_param; diff --git a/heap/hp_hash.c b/heap/hp_hash.c index b13ce786f6d..92e6320211a 100644 --- a/heap/hp_hash.c +++ b/heap/hp_hash.c @@ -195,7 +195,7 @@ ulong hp_hashnr(register HP_KEYDEF *keydef, register const byte *key) { /*register*/ ulong nr=1, nr2=4; - MI_KEYSEG *seg,*endseg; + HA_KEYSEG *seg,*endseg; for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++) { @@ -242,7 +242,7 @@ ulong hp_rec_hashnr(register HP_KEYDEF *keydef, register const byte *rec) { /*register*/ ulong nr=1, nr2=4; - MI_KEYSEG *seg,*endseg; + HA_KEYSEG *seg,*endseg; for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++) { @@ -300,7 +300,7 @@ ulong hp_rec_hashnr(register HP_KEYDEF *keydef, register const byte *rec) ulong hp_hashnr(register HP_KEYDEF *keydef, register const byte *key) { register ulong nr=0; - MI_KEYSEG *seg,*endseg; + HA_KEYSEG *seg,*endseg; for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++) { @@ -341,7 +341,7 @@ ulong hp_hashnr(register HP_KEYDEF *keydef, register const byte *key) ulong hp_rec_hashnr(register HP_KEYDEF *keydef, register const byte *rec) { register ulong nr=0; - MI_KEYSEG *seg,*endseg; + HA_KEYSEG *seg,*endseg; for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++) { @@ -381,7 +381,7 @@ ulong hp_rec_hashnr(register HP_KEYDEF *keydef, register const byte *rec) int hp_rec_key_cmp(HP_KEYDEF *keydef, const byte *rec1, const byte *rec2) { - MI_KEYSEG *seg,*endseg; + HA_KEYSEG *seg,*endseg; for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++) { @@ -412,7 +412,7 @@ int hp_rec_key_cmp(HP_KEYDEF *keydef, const byte *rec1, const byte *rec2) int hp_key_cmp(HP_KEYDEF *keydef, const byte *rec, const byte *key) { - MI_KEYSEG *seg,*endseg; + HA_KEYSEG *seg,*endseg; for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; @@ -450,7 +450,7 @@ int hp_key_cmp(HP_KEYDEF *keydef, const byte *rec, const byte *key) void hp_make_key(HP_KEYDEF *keydef, byte *key, const byte *rec) { - MI_KEYSEG *seg,*endseg; + HA_KEYSEG *seg,*endseg; for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++) { @@ -464,7 +464,7 @@ void hp_make_key(HP_KEYDEF *keydef, byte *key, const byte *rec) void hp_rb_make_key(HP_KEYDEF *keydef, byte *key, const byte *rec, byte *recpos) { - MI_KEYSEG *seg, *endseg; + HA_KEYSEG *seg, *endseg; /* -1 means that HA_KEYTYPE_END segment will not copy */ for (seg= keydef->seg, endseg= seg + keydef->keysegs - 1; seg < endseg; @@ -481,7 +481,7 @@ void hp_rb_make_key(HP_KEYDEF *keydef, byte *key, uint hp_rb_pack_key(HP_INFO *info, uint inx, uchar *key, const uchar *old, uint k_length) { - MI_KEYSEG *seg, *endseg; + HA_KEYSEG *seg, *endseg; uchar *start_key= key; HP_KEYDEF *keydef= info->s->keydef + inx; @@ -508,7 +508,7 @@ uint hp_rb_pack_key(HP_INFO *info, uint inx, uchar *key, const uchar *old, my_bool hp_if_null_in_key(HP_KEYDEF *keydef, const byte *record) { - MI_KEYSEG *seg,*endseg; + HA_KEYSEG *seg,*endseg; for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++) { if (seg->null_bit && (record[seg->null_pos] & seg->null_bit)) diff --git a/heap/hp_open.c b/heap/hp_open.c index a2423d5a4ff..49f9a2cfc33 100644 --- a/heap/hp_open.c +++ b/heap/hp_open.c @@ -41,7 +41,7 @@ HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef, uint i,j,key_segs,max_length,length; HP_INFO *info; HP_SHARE *share; - MI_KEYSEG *keyseg; + HA_KEYSEG *keyseg; DBUG_ENTER("heap_open"); @@ -72,14 +72,14 @@ HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef, } if (!(share = (HP_SHARE*) my_malloc((uint) sizeof(HP_SHARE)+ keys*sizeof(HP_KEYDEF)+ - key_segs*sizeof(MI_KEYSEG), + key_segs*sizeof(HA_KEYSEG), MYF(MY_ZEROFILL)))) { pthread_mutex_unlock(&THR_LOCK_heap); DBUG_RETURN(0); } share->keydef=(HP_KEYDEF*) (share+1); - keyseg=(MI_KEYSEG*) (share->keydef+keys); + keyseg=(HA_KEYSEG*) (share->keydef+keys); init_block(&share->block,reclength+1,min_records,max_records); /* Fix keys */ memcpy(share->keydef,keydef,(size_t) (sizeof(keydef[0])*keys)); diff --git a/heap/hp_test1.c b/heap/hp_test1.c index 124a2901402..79edfe2effc 100644 --- a/heap/hp_test1.c +++ b/heap/hp_test1.c @@ -36,7 +36,7 @@ int main(int argc, char **argv) char record[128],key[32]; const char *filename; HP_KEYDEF keyinfo[10]; - MI_KEYSEG keyseg[4]; + HA_KEYSEG keyseg[4]; MY_INIT(argv[0]); filename= "test1"; diff --git a/heap/hp_test2.c b/heap/hp_test2.c index 5d945dca282..f8b6a8cd7d3 100644 --- a/heap/hp_test2.c +++ b/heap/hp_test2.c @@ -61,7 +61,7 @@ int main(int argc, char *argv[]) const char *filename,*filename2; HP_INFO *file,*file2; HP_KEYDEF keyinfo[MAX_KEYS]; - MI_KEYSEG keyseg[MAX_KEYS*5]; + HA_KEYSEG keyseg[MAX_KEYS*5]; HEAP_PTR position; MY_INIT(argv[0]); /* init my_sys library & pthreads */ LINT_INIT(position); diff --git a/include/heap.h b/include/heap.h index ebcad285f55..088bb1241b2 100644 --- a/include/heap.h +++ b/include/heap.h @@ -85,7 +85,7 @@ typedef struct st_hp_keydef /* Key definition with open */ uint length; /* Length of key (automatic) */ uint8 algorithm; /* HASH / BTREE */ uint ref_offs; /* Data reference offset */ - MI_KEYSEG *seg; + HA_KEYSEG *seg; HP_BLOCK block; /* Where keys are saved */ TREE rb_tree; int (*write_key)(struct st_heap_info *info, struct st_hp_keydef *keyinfo, diff --git a/include/my_handler.h b/include/my_handler.h index ddbb33cd93f..0fa30f580b6 100644 --- a/include/my_handler.h +++ b/include/my_handler.h @@ -23,7 +23,7 @@ #include "m_ctype.h" #include "myisampack.h" -typedef struct st_MI_KEYSEG /* Key-portion */ +typedef struct st_HA_KEYSEG /* Key-portion */ { uint8 type; /* Type of key (for sort) */ uint8 language; @@ -34,7 +34,7 @@ typedef struct st_MI_KEYSEG /* Key-portion */ uint32 start; /* Start of key in record */ uint32 null_pos; /* position to NULL indicator */ CHARSET_INFO *charset; -} MI_KEYSEG; +} HA_KEYSEG; #define get_key_length(length,key) \ { if ((uchar) *(key) != 255) \ @@ -52,11 +52,11 @@ typedef struct st_MI_KEYSEG /* Key-portion */ extern int _mi_compare_text(CHARSET_INFO *, uchar *, uint, uchar *, uint , my_bool); -extern int _mi_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, +extern int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, register uchar *b, uint key_length, uint nextflag, uint *diff_pos); -extern int hp_rb_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, +extern int hp_rb_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, register uchar *b, uint key_length, uint nextflag, uint *diff_pos); diff --git a/include/myisam.h b/include/myisam.h index bf714dfef8a..96cbeaf0cd4 100644 --- a/include/myisam.h +++ b/include/myisam.h @@ -122,7 +122,7 @@ typedef struct st_mi_keydef /* Key definition with open & info */ uint16 block_size; /* block_size (auto) */ uint32 version; /* For concurrent read/write */ - MI_KEYSEG *seg,*end; + HA_KEYSEG *seg,*end; int (*bin_search)(struct st_myisam_info *info,struct st_mi_keydef *keyinfo, uchar *page,uchar *key, uint key_len,uint comp_flag,uchar * *ret_pos, @@ -146,7 +146,7 @@ typedef struct st_unique_def /* Segment definition of unique */ uint16 keysegs; /* Number of key-segment */ uchar key; /* Mapped to which key */ uint8 null_are_equal; - MI_KEYSEG *seg,*end; + HA_KEYSEG *seg,*end; } MI_UNIQUEDEF; typedef struct st_mi_decode_tree /* Decode huff-table */ @@ -318,7 +318,7 @@ typedef struct st_sort_info { char *record,*buff; void *wordlist, *wordptr; MI_KEYDEF *keyinfo; - MI_KEYSEG *keyseg; + HA_KEYSEG *keyseg; } SORT_INFO; typedef struct st_mi_check_param diff --git a/myisam/ft_eval.h b/myisam/ft_eval.h index 68be3a39f33..5501fe9d34b 100644 --- a/myisam/ft_eval.h +++ b/myisam/ft_eval.h @@ -33,7 +33,7 @@ FILE *df,*qf; MI_COLUMNDEF recinfo[3]; MI_KEYDEF keyinfo[2]; -MI_KEYSEG keyseg[10]; +HA_KEYSEG keyseg[10]; #define SWL_INIT 500 #define SWL_PLUS 50 diff --git a/myisam/ft_static.c b/myisam/ft_static.c index 3efb3a3ec74..640b754afa9 100644 --- a/myisam/ft_static.c +++ b/myisam/ft_static.c @@ -23,7 +23,7 @@ ulong ft_max_word_len=HA_FT_MAXLEN; ulong ft_max_word_len_for_sort=20; const char *ft_boolean_syntax="+ -><()~*:\"\"&|"; -const MI_KEYSEG ft_keysegs[FT_SEGS]={ +const HA_KEYSEG ft_keysegs[FT_SEGS]={ { HA_KEYTYPE_VARTEXT, /* type */ 7, /* language (will be overwritten) */ diff --git a/myisam/ft_test1.c b/myisam/ft_test1.c index e1a47ff87c3..caa41d4a8c5 100644 --- a/myisam/ft_test1.c +++ b/myisam/ft_test1.c @@ -45,7 +45,7 @@ int main(int argc,char *argv[]) static MI_COLUMNDEF recinfo[3]; static MI_KEYDEF keyinfo[2]; -static MI_KEYSEG keyseg[10]; +static HA_KEYSEG keyseg[10]; static int run_test(const char *filename) { diff --git a/myisam/ftdefs.h b/myisam/ftdefs.h index 1a3c0ef60dc..f829a5f0c3a 100644 --- a/myisam/ftdefs.h +++ b/myisam/ftdefs.h @@ -122,7 +122,7 @@ byte ft_simple_get_word(byte **, byte *, FT_WORD *); typedef struct _st_ft_seg_iterator { uint num, len; - MI_KEYSEG *seg; + HA_KEYSEG *seg; const byte *rec, *pos; } FT_SEG_ITERATOR; diff --git a/myisam/fulltext.h b/myisam/fulltext.h index f787c9bcfe8..39801c1c87e 100644 --- a/myisam/fulltext.h +++ b/myisam/fulltext.h @@ -32,7 +32,7 @@ #define FT_SEGS 2 #endif /* EVAL_RUN */ -extern const MI_KEYSEG ft_keysegs[FT_SEGS]; +extern const HA_KEYSEG ft_keysegs[FT_SEGS]; int _mi_ft_cmp(MI_INFO *, uint, const byte *, const byte *); int _mi_ft_add(MI_INFO *, uint, byte *, const byte *, my_off_t); diff --git a/myisam/mi_check.c b/myisam/mi_check.c index 2ba74836ab7..9dceccc164f 100644 --- a/myisam/mi_check.c +++ b/myisam/mi_check.c @@ -588,7 +588,7 @@ static int chk_index(MI_CHECK *param, MI_INFO *info, MI_KEYDEF *keyinfo, goto err; } if ((*keys)++ && - (flag=_mi_key_cmp(keyinfo->seg,info->lastkey,key,key_length, + (flag=ha_key_cmp(keyinfo->seg,info->lastkey,key,key_length, comp_flag, ¬_used)) >=0) { DBUG_DUMP("old",(byte*) info->lastkey, info->lastkey_length); @@ -606,7 +606,7 @@ static int chk_index(MI_CHECK *param, MI_INFO *info, MI_KEYDEF *keyinfo, if (*keys != 1L) /* not first_key */ { uint diff; - _mi_key_cmp(keyinfo->seg,info->lastkey,key,USE_WHOLE_KEY,SEARCH_FIND, + ha_key_cmp(keyinfo->seg,info->lastkey,key,USE_WHOLE_KEY,SEARCH_FIND, &diff); param->unique_count[diff-1]++; } @@ -674,7 +674,7 @@ static ha_checksum calc_checksum(ha_rows count) static uint isam_key_length(MI_INFO *info, register MI_KEYDEF *keyinfo) { uint length; - MI_KEYSEG *keyseg; + HA_KEYSEG *keyseg; DBUG_ENTER("isam_key_length"); length= info->s->rec_reflength; @@ -2625,7 +2625,7 @@ int sort_write_record(SORT_INFO *sort_info) static int sort_key_cmp(SORT_INFO *sort_info, const void *a, const void *b) { uint not_used; - return (_mi_key_cmp(sort_info->keyseg,*((uchar**) a),*((uchar**) b), + return (ha_key_cmp(sort_info->keyseg,*((uchar**) a),*((uchar**) b), USE_WHOLE_KEY, SEARCH_SAME,¬_used)); } /* sort_key_cmp */ @@ -2639,7 +2639,7 @@ static int sort_key_write(SORT_INFO *sort_info, const void *a) if (sort_info->key_block->inited) { - cmp=_mi_key_cmp(sort_info->keyseg,sort_info->key_block->lastkey,(uchar*) a, + cmp=ha_key_cmp(sort_info->keyseg,sort_info->key_block->lastkey,(uchar*) a, USE_WHOLE_KEY,SEARCH_FIND | SEARCH_UPDATE ,&diff_pos); sort_info->unique[diff_pos-1]++; } @@ -2922,7 +2922,7 @@ int recreate_table(MI_CHECK *param, MI_INFO **org_info, char *filename) MI_INFO info; MYISAM_SHARE share; MI_KEYDEF *keyinfo,*key,*key_end; - MI_KEYSEG *keysegs,*keyseg; + HA_KEYSEG *keysegs,*keyseg; MI_COLUMNDEF *recdef,*rec,*end; MI_UNIQUEDEF *uniquedef,*u_ptr,*u_end; MI_STATUS_INFO status_info; @@ -2944,7 +2944,7 @@ int recreate_table(MI_CHECK *param, MI_INFO **org_info, char *filename) (size_t) (sizeof(MI_KEYDEF)*share.base.keys)); key_parts= share.base.all_key_parts; - if (!(keysegs=(MI_KEYSEG*) my_alloca(sizeof(MI_KEYSEG)* + if (!(keysegs=(HA_KEYSEG*) my_alloca(sizeof(HA_KEYSEG)* (key_parts+share.base.keys)))) { my_afree((gptr) keyinfo); @@ -2980,7 +2980,7 @@ int recreate_table(MI_CHECK *param, MI_INFO **org_info, char *filename) /* Change the new key to point at the saved key segments */ memcpy((byte*) keysegs,(byte*) share.keyparts, - (size_t) (sizeof(MI_KEYSEG)*(key_parts+share.base.keys+ + (size_t) (sizeof(HA_KEYSEG)*(key_parts+share.base.keys+ share.state.header.uniques))); keyseg=keysegs; for (key=keyinfo,key_end=keyinfo+share.base.keys; key != key_end ; key++) diff --git a/myisam/mi_create.c b/myisam/mi_create.c index 8f4a44a52a4..13d9443c099 100644 --- a/myisam/mi_create.c +++ b/myisam/mi_create.c @@ -53,7 +53,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs, MYISAM_SHARE share; MI_KEYDEF *keydef,tmp_keydef; MI_UNIQUEDEF *uniquedef; - MI_KEYSEG *keyseg,tmp_keyseg; + HA_KEYSEG *keyseg,tmp_keyseg; MI_COLUMNDEF *rec; ulong *rec_per_key_part; my_off_t key_root[MI_MAX_POSSIBLE_KEY],key_del[MI_MAX_KEY_BLOCK_SIZE]; @@ -440,7 +440,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs, info_length=base_pos+(uint) (MI_BASE_INFO_SIZE+ keys * MI_KEYDEF_SIZE+ uniques * MI_UNIQUEDEF_SIZE + - (key_segs + unique_key_parts)*MI_KEYSEG_SIZE+ + (key_segs + unique_key_parts)*HA_KEYSEG_SIZE+ columns*MI_COLUMNDEF_SIZE); bmove(share.state.header.file_version,(byte*) myisam_file_magic,4); @@ -596,14 +596,14 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs, goto err; for (j=0 ; j < ft_segs ; j++) { - MI_KEYSEG seg=ft_keysegs[j]; + HA_KEYSEG seg=ft_keysegs[j]; seg.language= keydefs[i].seg[0].language; if (mi_keyseg_write(file, &seg)) goto err; } for (j=0 ; j < sp_segs ; j++) { - MI_KEYSEG sseg; + HA_KEYSEG sseg; sseg.type=SPTYPE; sseg.language= 7; sseg.null_bit=0; diff --git a/myisam/mi_dbug.c b/myisam/mi_dbug.c index 482287938c0..6548b38c135 100644 --- a/myisam/mi_dbug.c +++ b/myisam/mi_dbug.c @@ -20,7 +20,7 @@ /* Print a key in user understandable format */ -void _mi_print_key(FILE *stream, register MI_KEYSEG *keyseg, +void _mi_print_key(FILE *stream, register HA_KEYSEG *keyseg, const uchar *key, uint length) { int flag; diff --git a/myisam/mi_key.c b/myisam/mi_key.c index 055b18284de..067556a3222 100644 --- a/myisam/mi_key.c +++ b/myisam/mi_key.c @@ -37,7 +37,7 @@ uint _mi_make_key(register MI_INFO *info, uint keynr, uchar *key, { byte *pos,*end; uchar *start; - reg1 MI_KEYSEG *keyseg; + reg1 HA_KEYSEG *keyseg; DBUG_ENTER("_mi_make_key"); if(info->s->keyinfo[keynr].flag & HA_SPATIAL) @@ -153,7 +153,7 @@ uint _mi_pack_key(register MI_INFO *info, uint keynr, uchar *key, uchar *old, { uint length; uchar *pos,*end,*start_key=key; - reg1 MI_KEYSEG *keyseg; + reg1 HA_KEYSEG *keyseg; enum ha_base_keytype type; DBUG_ENTER("_mi_pack_key"); @@ -252,7 +252,7 @@ static int _mi_put_key_in_record(register MI_INFO *info, uint keynr, { reg2 byte *key; byte *pos,*key_end; - reg1 MI_KEYSEG *keyseg; + reg1 HA_KEYSEG *keyseg; byte *blob_ptr; DBUG_ENTER("_mi_put_key_in_record"); @@ -385,7 +385,7 @@ int _mi_read_key_record(MI_INFO *info, my_off_t filepos, byte *buf) void update_auto_increment(MI_INFO *info,const byte *record) { ulonglong value; - MI_KEYSEG *keyseg=info->s->keyinfo[info->s->base.auto_key-1].seg; + HA_KEYSEG *keyseg=info->s->keyinfo[info->s->base.auto_key-1].seg; const uchar *key=(uchar*) record+keyseg->start; switch (keyseg->type) { diff --git a/myisam/mi_open.c b/myisam/mi_open.c index 3dc6c9bf61f..d2960c6751c 100644 --- a/myisam/mi_open.c +++ b/myisam/mi_open.c @@ -256,7 +256,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags) &share->uniqueinfo,uniques*sizeof(MI_UNIQUEDEF), &share->keyparts, (key_parts+unique_key_parts+keys+uniques) * - sizeof(MI_KEYSEG), + sizeof(HA_KEYSEG), &share->rec, (share->base.fields+1)*sizeof(MI_COLUMNDEF), &share->blobs,sizeof(MI_BLOB)*share->base.blobs, @@ -286,7 +286,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags) share->blocksize=min(IO_SIZE,myisam_block_size); { - MI_KEYSEG *pos=share->keyparts; + HA_KEYSEG *pos=share->keyparts; for (i=0 ; i < keys ; i++) { disk_pos=mi_keydef_read(disk_pos, &share->keyinfo[i]); @@ -949,9 +949,9 @@ char *mi_keydef_read(char *ptr, MI_KEYDEF *keydef) ** mi_keyseg ***************************************************************************/ -int mi_keyseg_write(File file, const MI_KEYSEG *keyseg) +int mi_keyseg_write(File file, const HA_KEYSEG *keyseg) { - uchar buff[MI_KEYSEG_SIZE]; + uchar buff[HA_KEYSEG_SIZE]; uchar *ptr=buff; *ptr++ =keyseg->type; @@ -969,7 +969,7 @@ int mi_keyseg_write(File file, const MI_KEYSEG *keyseg) } -char *mi_keyseg_read(char *ptr, MI_KEYSEG *keyseg) +char *mi_keyseg_read(char *ptr, HA_KEYSEG *keyseg) { keyseg->type = *ptr++; keyseg->language = *ptr++; diff --git a/myisam/mi_rnext_same.c b/myisam/mi_rnext_same.c index 88ff24842d4..88146c89f85 100644 --- a/myisam/mi_rnext_same.c +++ b/myisam/mi_rnext_same.c @@ -60,7 +60,7 @@ int mi_rnext_same(MI_INFO *info, byte *buf) info->lastkey_length,flag, info->s->state.key_root[inx]))) break; - if (_mi_key_cmp(keyinfo->seg,info->lastkey2,info->lastkey, + if (ha_key_cmp(keyinfo->seg,info->lastkey2,info->lastkey, info->last_rkey_length, SEARCH_FIND, ¬_used)) { error=1; diff --git a/myisam/mi_search.c b/myisam/mi_search.c index 09b4159737f..46d1cd19142 100644 --- a/myisam/mi_search.c +++ b/myisam/mi_search.c @@ -133,7 +133,7 @@ int _mi_search(register MI_INFO *info, register MI_KEYDEF *keyinfo, &info->lastkey_length)) goto err; if ((nextflag & SEARCH_LAST) && - _mi_key_cmp(keyinfo->seg, info->lastkey, key, key_len, SEARCH_FIND, + ha_key_cmp(keyinfo->seg, info->lastkey, key, key_len, SEARCH_FIND, ¬_used)) { my_errno=HA_ERR_KEY_NOT_FOUND; /* Didn't find key */ @@ -191,7 +191,7 @@ int _mi_bin_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, while (start != end) { mid= (start+end)/2; - if ((flag=_mi_key_cmp(keyinfo->seg,page+(uint) mid*totlength,key,key_len, + if ((flag=ha_key_cmp(keyinfo->seg,page+(uint) mid*totlength,key,key_len, comp_flag,¬_used)) >= 0) end=mid; @@ -199,7 +199,7 @@ int _mi_bin_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, start=mid+1; } if (mid != start) - flag=_mi_key_cmp(keyinfo->seg,page+(uint) start*totlength,key,key_len, + flag=ha_key_cmp(keyinfo->seg,page+(uint) start*totlength,key,key_len, comp_flag,¬_used); if (flag < 0) start++; /* point at next, bigger key */ @@ -239,7 +239,7 @@ int _mi_seq_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, length,page,end)); DBUG_RETURN(MI_FOUND_WRONG_KEY); } - if ((flag=_mi_key_cmp(keyinfo->seg,t_buff,key,key_len,comp_flag, + if ((flag=ha_key_cmp(keyinfo->seg,t_buff,key,key_len,comp_flag, ¬_used)) >= 0) break; #ifdef EXTRA_DEBUG @@ -262,7 +262,7 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, { /* my_flag is raw comparison result to be changed according to SEARCH_NO_FIND,SEARCH_LAST and HA_REVERSE_SORT flags. - flag is the value returned by _mi_key_cmp and as treated as final */ + flag is the value returned by ha_key_cmp and as treated as final */ int flag=0, my_flag=-1; uint nod_flag, length, len, matched, cmplen, kseg_len; uint prefix_len,suffix_len; @@ -351,7 +351,7 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, DBUG_PRINT("loop",("page: '%.*s%.*s'",prefix_len,t_buff+seg_len_pack,suffix_len,vseg)); { uchar *from=vseg+suffix_len; - MI_KEYSEG *keyseg; + HA_KEYSEG *keyseg; uint l; for (keyseg=keyinfo->seg+1 ; keyseg->type ; keyseg++ ) @@ -423,7 +423,7 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, else if (key_len_left>0) { uint not_used; - if ((flag = _mi_key_cmp(keyinfo->seg+1,vseg, + if ((flag = ha_key_cmp(keyinfo->seg+1,vseg, k,key_len_left,nextflag,¬_used)) >= 0) break; } @@ -674,7 +674,7 @@ uint _mi_get_static_key(register MI_KEYDEF *keyinfo, uint nod_flag, uint _mi_get_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag, register uchar **page_pos, register uchar *key) { - reg1 MI_KEYSEG *keyseg; + reg1 HA_KEYSEG *keyseg; uchar *start_key,*page=*page_pos; uint length; @@ -807,7 +807,7 @@ uint _mi_get_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag, uint _mi_get_binary_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag, register uchar **page_pos, register uchar *key) { - reg1 MI_KEYSEG *keyseg; + reg1 HA_KEYSEG *keyseg; uchar *start_key,*page=*page_pos,*page_end,*from,*from_end; uint length,tmp; @@ -1006,7 +1006,7 @@ uchar *_mi_get_last_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *page, uint _mi_keylength(MI_KEYDEF *keyinfo, register uchar *key) { - reg1 MI_KEYSEG *keyseg; + reg1 HA_KEYSEG *keyseg; uchar *start; if (! (keyinfo->flag & (HA_VAR_LENGTH_KEY | HA_BINARY_PACK_KEY))) @@ -1272,7 +1272,7 @@ _mi_calc_var_pack_key_length(MI_KEYDEF *keyinfo,uint nod_flag,uchar *next_key, uchar *org_key, uchar *prev_key, uchar *key, MI_KEY_PARAM *s_temp) { - reg1 MI_KEYSEG *keyseg; + reg1 HA_KEYSEG *keyseg; int length; uint key_length,ref_length,org_key_length=0, length_pack,new_key_length,diff_flag,pack_marker; diff --git a/myisam/mi_test1.c b/myisam/mi_test1.c index 412c493db9a..b477263dd4a 100644 --- a/myisam/mi_test1.c +++ b/myisam/mi_test1.c @@ -33,8 +33,8 @@ static uint unique_key=HA_NOSAME,key_cacheing=0,opt_unique=0; static uint silent; static MI_COLUMNDEF recinfo[4]; static MI_KEYDEF keyinfo[10]; -static MI_KEYSEG keyseg[10]; -static MI_KEYSEG uniqueseg[10]; +static HA_KEYSEG keyseg[10]; +static HA_KEYSEG uniqueseg[10]; static int run_test(const char *filename); static void get_options(int argc, char *argv[]); diff --git a/myisam/mi_test2.c b/myisam/mi_test2.c index 54752b43fbd..a4c813b718b 100644 --- a/myisam/mi_test2.c +++ b/myisam/mi_test2.c @@ -55,7 +55,7 @@ static uint use_blob=0; static uint16 key1[1001],key3[5000]; static char record[300],record2[300],key[100],key2[100], read_record[300],read_record2[300],read_record3[300]; -static MI_KEYSEG glob_keyseg[MYISAM_KEYS][MAX_PARTS]; +static HA_KEYSEG glob_keyseg[MYISAM_KEYS][MAX_PARTS]; /* Test program */ @@ -1006,7 +1006,7 @@ static void put_blob_in_record(char *blob_pos, char **blob_buffer) static void copy_key(MI_INFO *info,uint inx,uchar *rec,uchar *key_buff) { - MI_KEYSEG *keyseg; + HA_KEYSEG *keyseg; for (keyseg=info->s->keyinfo[inx].seg ; keyseg->type ; keyseg++) { diff --git a/myisam/mi_test3.c b/myisam/mi_test3.c index 17c4e92d2ba..405345259cb 100644 --- a/myisam/mi_test3.c +++ b/myisam/mi_test3.c @@ -59,7 +59,7 @@ int main(int argc,char **argv) uint i=0; MI_KEYDEF keyinfo[10]; MI_COLUMNDEF recinfo[10]; - MI_KEYSEG keyseg[10][2]; + HA_KEYSEG keyseg[10][2]; MY_INIT(argv[0]); get_options(argc,argv); diff --git a/myisam/mi_unique.c b/myisam/mi_unique.c index 5806502823a..629523ec69a 100644 --- a/myisam/mi_unique.c +++ b/myisam/mi_unique.c @@ -70,7 +70,7 @@ ha_checksum mi_unique_hash(MI_UNIQUEDEF *def, const byte *record) { const byte *pos, *end; ha_checksum crc=0; - MI_KEYSEG *keyseg; + HA_KEYSEG *keyseg; for (keyseg=def->seg ; keyseg < def->end ; keyseg++) { @@ -122,7 +122,7 @@ int mi_unique_comp(MI_UNIQUEDEF *def, const byte *a, const byte *b, my_bool null_are_equal) { const byte *pos_a, *pos_b, *end; - MI_KEYSEG *keyseg; + HA_KEYSEG *keyseg; for (keyseg=def->seg ; keyseg < def->end ; keyseg++) { diff --git a/myisam/mi_write.c b/myisam/mi_write.c index fe7187d59ef..85bcb8427df 100644 --- a/myisam/mi_write.c +++ b/myisam/mi_write.c @@ -764,7 +764,7 @@ int _mi_ck_write_tree(register MI_INFO *info, uint keynr, uchar *key, static int keys_compare(bulk_insert_param *param, uchar *key1, uchar *key2) { uint not_used; - return _mi_key_cmp(param->info->s->keyinfo[param->keynr].seg, + return ha_key_cmp(param->info->s->keyinfo[param->keynr].seg, key1, key2, USE_WHOLE_KEY, SEARCH_SAME, ¬_used); } diff --git a/myisam/myisamchk.c b/myisam/myisamchk.c index 10bd29e25e3..0f290712841 100644 --- a/myisam/myisamchk.c +++ b/myisam/myisamchk.c @@ -1062,7 +1062,7 @@ static void descript(MI_CHECK *param, register MI_INFO *info, my_string name) { uint key,keyseg_nr,field,start; reg3 MI_KEYDEF *keyinfo; - reg2 MI_KEYSEG *keyseg; + reg2 HA_KEYSEG *keyseg; reg4 const char *text; char buff[160],length[10],*pos,*end; enum en_fieldtype type; diff --git a/myisam/myisamdef.h b/myisam/myisamdef.h index 417b6762065..7617d0e7c1d 100644 --- a/myisam/myisamdef.h +++ b/myisam/myisamdef.h @@ -96,7 +96,7 @@ typedef struct st_mi_state_info #define MI_STATE_EXTRA_SIZE ((MI_MAX_KEY+MI_MAX_KEY_BLOCK_SIZE)*MI_STATE_KEY_SIZE + MI_MAX_KEY*MI_MAX_KEY_SEG*MI_STATE_KEYSEG_SIZE) #define MI_KEYDEF_SIZE (2+ 5*2) #define MI_UNIQUEDEF_SIZE (2+1+1) -#define MI_KEYSEG_SIZE (6+ 2*2 + 4*2) +#define HA_KEYSEG_SIZE (6+ 2*2 + 4*2) #define MI_COLUMNDEF_SIZE (2*3+1) #define MI_BASE_INFO_SIZE (5*8 + 8*4 + 4 + 4*2 + 16) #define MI_INDEX_BLOCK_MARGIN 16 /* Safety margin for .MYI tables */ @@ -156,7 +156,7 @@ typedef struct st_mi_isam_share { /* Shared between opens */ MI_BASE_INFO base; MI_KEYDEF *keyinfo; /* Key definitions */ MI_UNIQUEDEF *uniqueinfo; /* unique definitions */ - MI_KEYSEG *keyparts; /* key part info */ + HA_KEYSEG *keyparts; /* key part info */ MI_COLUMNDEF *rec; /* Pointer to field information */ MI_PACK pack; /* Data about packed records */ MI_BLOB *blobs; /* Pointer to blobs */ @@ -355,7 +355,7 @@ struct st_myisam_info { #define PACK_TYPE_SELECTED 1 /* Bits in field->pack_type */ #define PACK_TYPE_SPACE_FIELDS 2 #define PACK_TYPE_ZERO_FILL 4 -#define MI_FOUND_WRONG_KEY 32738 /* Impossible value from _mi_key_cmp */ +#define MI_FOUND_WRONG_KEY 32738 /* Impossible value from ha_key_cmp */ #define MI_MAX_KEY_BLOCK_SIZE (MI_MAX_KEY_BLOCK_LENGTH/MI_MIN_KEY_BLOCK_LENGTH) #define MI_BLOCK_SIZE(key_length,data_pointer,key_pointer) ((((key_length+data_pointer+key_pointer)*4+key_pointer+2)/myisam_block_size+1)*myisam_block_size) @@ -475,7 +475,7 @@ extern void _mi_kpointer(MI_INFO *info,uchar *buff,my_off_t pos); extern my_off_t _mi_dpos(MI_INFO *info, uint nod_flag,uchar *after_key); extern my_off_t _mi_rec_pos(MYISAM_SHARE *info, uchar *ptr); extern void _mi_dpointer(MI_INFO *info, uchar *buff,my_off_t pos); -extern int _mi_key_cmp(MI_KEYSEG *keyseg, uchar *a,uchar *b, +extern int ha_key_cmp(HA_KEYSEG *keyseg, uchar *a,uchar *b, uint key_length,uint nextflag,uint *diff_length); extern uint _mi_get_static_key(MI_KEYDEF *keyinfo,uint nod_flag,uchar * *page, uchar *key); @@ -515,7 +515,7 @@ extern my_bool _mi_rec_check(MI_INFO *info,const char *from); extern int _mi_write_part_record(MI_INFO *info,my_off_t filepos,ulong length, my_off_t next_filepos,byte **record, ulong *reclength,int *flag); -extern void _mi_print_key(FILE *stream,MI_KEYSEG *keyseg,const uchar *key, +extern void _mi_print_key(FILE *stream,HA_KEYSEG *keyseg,const uchar *key, uint length); extern my_bool _mi_read_pack_info(MI_INFO *info,pbool fix_keys); extern int _mi_read_pack_record(MI_INFO *info,my_off_t filepos,byte *buf); @@ -606,8 +606,8 @@ char *mi_state_info_read(char *ptr, MI_STATE_INFO *state); uint mi_state_info_read_dsk(File file, MI_STATE_INFO *state, my_bool pRead); uint mi_base_info_write(File file, MI_BASE_INFO *base); char *my_n_base_info_read(char *ptr, MI_BASE_INFO *base); -int mi_keyseg_write(File file, const MI_KEYSEG *keyseg); -char *mi_keyseg_read(char *ptr, MI_KEYSEG *keyseg); +int mi_keyseg_write(File file, const HA_KEYSEG *keyseg); +char *mi_keyseg_read(char *ptr, HA_KEYSEG *keyseg); uint mi_keydef_write(File file, MI_KEYDEF *keydef); char *mi_keydef_read(char *ptr, MI_KEYDEF *keydef); uint mi_uniquedef_write(File file, MI_UNIQUEDEF *keydef); diff --git a/myisam/rt_mbr.c b/myisam/rt_mbr.c index 7ffc1cfa267..a6467500183 100644 --- a/myisam/rt_mbr.c +++ b/myisam/rt_mbr.c @@ -93,7 +93,7 @@ MBR_DATA(a,b) Data reference is the same Returns 0 on success. */ -int rtree_key_cmp(MI_KEYSEG *keyseg, uchar *b, uchar *a, uint key_length, +int rtree_key_cmp(HA_KEYSEG *keyseg, uchar *b, uchar *a, uint key_length, uint nextflag) { for (; (int) key_length > 0; keyseg += 2 ) @@ -186,7 +186,7 @@ end: /* Calculates rectangle volume */ -double rtree_rect_volume(MI_KEYSEG *keyseg, uchar *a, uint key_length) +double rtree_rect_volume(HA_KEYSEG *keyseg, uchar *a, uint key_length) { double res = 1; for (; (int)key_length > 0; keyseg += 2) @@ -269,7 +269,7 @@ double rtree_rect_volume(MI_KEYSEG *keyseg, uchar *a, uint key_length) /* Creates an MBR as an array of doubles. */ -int rtree_d_mbr(MI_KEYSEG *keyseg, uchar *a, uint key_length, double *res) +int rtree_d_mbr(HA_KEYSEG *keyseg, uchar *a, uint key_length, double *res) { for (; (int)key_length > 0; keyseg += 2) { @@ -366,7 +366,7 @@ Creates common minimal bounding rectungle for two input rectagnles a and b Result is written to c */ -int rtree_combine_rect(MI_KEYSEG *keyseg, uchar* a, uchar* b, uchar* c, +int rtree_combine_rect(HA_KEYSEG *keyseg, uchar* a, uchar* b, uchar* c, uint key_length) { @@ -466,7 +466,7 @@ int rtree_combine_rect(MI_KEYSEG *keyseg, uchar* a, uchar* b, uchar* c, /* Calculates overlapping area of two MBRs a & b */ -double rtree_overlapping_area(MI_KEYSEG *keyseg, uchar* a, uchar* b, +double rtree_overlapping_area(HA_KEYSEG *keyseg, uchar* a, uchar* b, uint key_length) { double res = 1; @@ -559,7 +559,7 @@ double rtree_overlapping_area(MI_KEYSEG *keyseg, uchar* a, uchar* b, /* Calculates MBR_AREA(a+b) - MBR_AREA(a) */ -double rtree_area_increase(MI_KEYSEG *keyseg, uchar* a, uchar* b, +double rtree_area_increase(HA_KEYSEG *keyseg, uchar* a, uchar* b, uint key_length, double *ab_area) { double a_area = 1; @@ -675,7 +675,7 @@ double rtree_area_increase(MI_KEYSEG *keyseg, uchar* a, uchar* b, /* Calculates key page total MBR = MBR(key1) + MBR(key2) + ... */ -int rtree_page_mbr(MI_INFO *info, MI_KEYSEG *keyseg, uchar *page_buf, +int rtree_page_mbr(MI_INFO *info, HA_KEYSEG *keyseg, uchar *page_buf, uchar *c, uint key_length) { uint inc = 0; diff --git a/myisam/rt_mbr.h b/myisam/rt_mbr.h index 87af3b06c2e..a68807370f9 100644 --- a/myisam/rt_mbr.h +++ b/myisam/rt_mbr.h @@ -18,16 +18,16 @@ #ifndef _rt_mbr_h #define _rt_mbr_h -int rtree_key_cmp(MI_KEYSEG *keyseg, uchar *a, uchar *b, uint key_length, +int rtree_key_cmp(HA_KEYSEG *keyseg, uchar *a, uchar *b, uint key_length, uint nextflag); -int rtree_combine_rect(MI_KEYSEG *keyseg,uchar *, uchar *, uchar*, +int rtree_combine_rect(HA_KEYSEG *keyseg,uchar *, uchar *, uchar*, uint key_length); -double rtree_rect_volume(MI_KEYSEG *keyseg, uchar*, uint key_length); -int rtree_d_mbr(MI_KEYSEG *keyseg, uchar *a, uint key_length, double *res); -double rtree_overlapping_area(MI_KEYSEG *keyseg, uchar *a, uchar *b, +double rtree_rect_volume(HA_KEYSEG *keyseg, uchar*, uint key_length); +int rtree_d_mbr(HA_KEYSEG *keyseg, uchar *a, uint key_length, double *res); +double rtree_overlapping_area(HA_KEYSEG *keyseg, uchar *a, uchar *b, uint key_length); -double rtree_area_increase(MI_KEYSEG *keyseg, uchar *a, uchar *b, +double rtree_area_increase(HA_KEYSEG *keyseg, uchar *a, uchar *b, uint key_length, double *ab_area); -int rtree_page_mbr(MI_INFO *info, MI_KEYSEG *keyseg, uchar *page_buf, +int rtree_page_mbr(MI_INFO *info, HA_KEYSEG *keyseg, uchar *page_buf, uchar* c, uint key_length); #endif /* _rt_mbr_h */ diff --git a/myisam/rt_test.c b/myisam/rt_test.c index b18ec1fc857..4cc60d63031 100644 --- a/myisam/rt_test.c +++ b/myisam/rt_test.c @@ -47,7 +47,7 @@ int run_test(const char *filename) MI_CREATE_INFO create_info; MI_COLUMNDEF recinfo[20]; MI_KEYDEF keyinfo[20]; - MI_KEYSEG keyseg[20]; + HA_KEYSEG keyseg[20]; int silent=0; int opt_unique=0; diff --git a/myisam/sp_key.c b/myisam/sp_key.c index 0230ce04f76..2ab11f993c3 100644 --- a/myisam/sp_key.c +++ b/myisam/sp_key.c @@ -33,7 +33,7 @@ static int sp_mbr_from_wkb(uchar (*wkb), uint size, uint n_dims, double *mbr); uint sp_make_key(register MI_INFO *info, uint keynr, uchar *key, const byte *record, my_off_t filepos) { - MI_KEYSEG *keyseg; + HA_KEYSEG *keyseg; MI_KEYDEF *keyinfo = &info->s->keyinfo[keynr]; uint len = 0; byte *pos; diff --git a/myisam/sp_test.c b/myisam/sp_test.c index 9fc130eb6de..9d32b3e623d 100644 --- a/myisam/sp_test.c +++ b/myisam/sp_test.c @@ -56,7 +56,7 @@ int run_test(const char *filename) MI_CREATE_INFO create_info; MI_COLUMNDEF recinfo[20]; MI_KEYDEF keyinfo[20]; - MI_KEYSEG keyseg[20]; + HA_KEYSEG keyseg[20]; int silent=0; int create_flag=0; diff --git a/myisammrg/myrg_queue.c b/myisammrg/myrg_queue.c index b4f729fc2cf..08a248bdd64 100644 --- a/myisammrg/myrg_queue.c +++ b/myisammrg/myrg_queue.c @@ -23,7 +23,7 @@ static int queue_key_cmp(void *keyseg, byte *a, byte *b) MI_INFO *aa=((MYRG_TABLE *)a)->table; MI_INFO *bb=((MYRG_TABLE *)b)->table; uint not_used; - int ret= _mi_key_cmp((MI_KEYSEG *)keyseg, aa->lastkey, bb->lastkey, + int ret= ha_key_cmp((HA_KEYSEG *)keyseg, aa->lastkey, bb->lastkey, USE_WHOLE_KEY, SEARCH_FIND, ¬_used); return ret < 0 ? -1 : ret > 0 ? 1 : 0; } /* queue_key_cmp */ diff --git a/mysys/my_handler.c b/mysys/my_handler.c index afaada615b4..5544c7cc483 100644 --- a/mysys/my_handler.c +++ b/mysys/my_handler.c @@ -67,7 +67,7 @@ Returns <0, 0, >0 acording to which is bigger Key_length specifies length of key to use. Number-keys can't be splited If flag <> SEARCH_FIND compare also position */ -int _mi_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, +int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, register uchar *b, uint key_length, uint nextflag, uint *diff_pos) { @@ -393,7 +393,7 @@ Returns <0, 0, >0 acording to which is bigger Key_length specifies length of key to use. Number-keys can't be splited If flag <> SEARCH_FIND compare also position */ -int hp_rb_key_cmp(register MI_KEYSEG *keyseg, register uchar *a, +int hp_rb_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, register uchar *b, uint key_length, uint nextflag, uint *diff_pos) { diff --git a/sql/ha_heap.cc b/sql/ha_heap.cc index 8a4758aa558..1abaa63de68 100644 --- a/sql/ha_heap.cc +++ b/sql/ha_heap.cc @@ -36,7 +36,7 @@ int ha_heap::open(const char *name, int mode, uint test_if_locked) uint key,parts,mem_per_row=0; ulong max_rows; HP_KEYDEF *keydef; - MI_KEYSEG *seg; + HA_KEYSEG *seg; for (key=parts=0 ; key < table->keys ; key++) { @@ -48,9 +48,9 @@ int ha_heap::open(const char *name, int mode, uint test_if_locked) } if (!(keydef=(HP_KEYDEF*) my_malloc(table->keys*sizeof(HP_KEYDEF)+ - parts*sizeof(MI_KEYSEG),MYF(MY_WME)))) + parts*sizeof(HA_KEYSEG),MYF(MY_WME)))) return my_errno; - seg=my_reinterpret_cast(MI_KEYSEG*) (keydef+table->keys); + seg=my_reinterpret_cast(HA_KEYSEG*) (keydef+table->keys); for (key=0 ; key < table->keys ; key++) { KEY *pos=table->key_info+key; diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc index 3def79dc67f..a8bbc03aa91 100644 --- a/sql/ha_myisam.cc +++ b/sql/ha_myisam.cc @@ -993,7 +993,7 @@ int ha_myisam::create(const char *name, register TABLE *table, KEY *pos; MI_KEYDEF *keydef; MI_COLUMNDEF *recinfo,*recinfo_pos; - MI_KEYSEG *keyseg; + HA_KEYSEG *keyseg; uint options=table->db_options_in_use; DBUG_ENTER("ha_myisam::create"); @@ -1002,7 +1002,7 @@ int ha_myisam::create(const char *name, register TABLE *table, &recinfo,(table->fields*2+2)*sizeof(MI_COLUMNDEF), &keydef, table->keys*sizeof(MI_KEYDEF), &keyseg, - ((table->key_parts + table->keys) * sizeof(MI_KEYSEG)), + ((table->key_parts + table->keys) * sizeof(HA_KEYSEG)), 0))) DBUG_RETURN(1); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 2abefe0aac5..2599fe216c5 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -3942,7 +3942,7 @@ static bool create_myisam_tmp_table(TABLE *table,TMP_TABLE_PARAM *param, if (table->keys) { // Get keys for ni_create bool using_unique_constraint=0; - MI_KEYSEG *seg= (MI_KEYSEG*) sql_calloc(sizeof(*seg) * + HA_KEYSEG *seg= (HA_KEYSEG*) sql_calloc(sizeof(*seg) * keyinfo->key_parts); if (!seg) goto err; -- cgit v1.2.1 From 234dc3a35e8ae7f63aa6d3b7891b72e735728639 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 29 Apr 2002 13:53:29 +0500 Subject: Index number argument Fix in test results heap/hp_rfirst.c: Index number argument heap/hp_rlast.c: Index number argument heap/hp_test2.c: Index number argument include/heap.h: Index number argument mysql-test/r/heap_btree.result: Test results fix sql/ha_heap.cc: Index number argument --- heap/hp_rfirst.c | 4 ++-- heap/hp_rlast.c | 9 +++------ heap/hp_test2.c | 4 ++-- include/heap.h | 4 ++-- mysql-test/r/heap_btree.result | 4 ++-- sql/ha_heap.cc | 4 ++-- 6 files changed, 13 insertions(+), 16 deletions(-) diff --git a/heap/hp_rfirst.c b/heap/hp_rfirst.c index 4b7098745a4..390d18fc58f 100644 --- a/heap/hp_rfirst.c +++ b/heap/hp_rfirst.c @@ -18,10 +18,10 @@ /* Read first record with the current key */ -int heap_rfirst(HP_INFO *info, byte *record) +int heap_rfirst(HP_INFO *info, byte *record, int inx) { HP_SHARE *share = info->s; - HP_KEYDEF *keyinfo = share->keydef + info->lastinx; + HP_KEYDEF *keyinfo = share->keydef + inx; DBUG_ENTER("heap_rfirst"); if (keyinfo->algorithm == HA_KEY_ALG_BTREE) diff --git a/heap/hp_rlast.c b/heap/hp_rlast.c index 7f883d3a18b..4c2379427b0 100644 --- a/heap/hp_rlast.c +++ b/heap/hp_rlast.c @@ -19,15 +19,12 @@ /* Read first record with the current key */ -int heap_rlast(HP_INFO *info, byte *record) +int heap_rlast(HP_INFO *info, byte *record, int inx) { - HP_SHARE *share = info->s; - HP_KEYDEF *keyinfo; + HP_SHARE *share= info->s; + HP_KEYDEF *keyinfo= share->keydef + inx; DBUG_ENTER("heap_rlast"); - if (info->lastinx < 0) - DBUG_RETURN(my_errno = HA_ERR_WRONG_INDEX); - keyinfo = share->keydef + info->lastinx; if (keyinfo->algorithm == HA_KEY_ALG_BTREE) { byte *pos; diff --git a/heap/hp_test2.c b/heap/hp_test2.c index f8b6a8cd7d3..a972e7073e0 100644 --- a/heap/hp_test2.c +++ b/heap/hp_test2.c @@ -306,7 +306,7 @@ int main(int argc, char *argv[]) if (!silent) printf("- Read last key - delete - prev - prev - opt_delete - prev -> first\n"); - if (heap_rlast(file,record3)) goto err; + if (heap_rlast(file,record3,0)) goto err; if (heap_delete(file,record3)) goto err; key_check-=atoi(record3); key1[atoi(record+keyinfo[0].seg[0].start)]--; @@ -513,7 +513,7 @@ int main(int argc, char *argv[]) } ant=0; - for (error=heap_rlast(file,record) ; + for (error=heap_rlast(file,record,0) ; ! error ; error=heap_rprev(file,record)) { diff --git a/include/heap.h b/include/heap.h index 088bb1241b2..8cc62df9250 100644 --- a/include/heap.h +++ b/include/heap.h @@ -161,8 +161,8 @@ extern int heap_panic(enum ha_panic_function flag); extern int heap_rsame(HP_INFO *info,byte *record,int inx); extern int heap_rnext(HP_INFO *info,byte *record); extern int heap_rprev(HP_INFO *info,byte *record); -extern int heap_rfirst(HP_INFO *info,byte *record); -extern int heap_rlast(HP_INFO *info,byte *record); +extern int heap_rfirst(HP_INFO *info,byte *record,int inx); +extern int heap_rlast(HP_INFO *info,byte *record,int inx); extern void heap_clear(HP_INFO *info); ha_rows hp_rb_records_in_range(HP_INFO *info, int inx, const byte *start_key, diff --git a/mysql-test/r/heap_btree.result b/mysql-test/r/heap_btree.result index 14c5f6d56f4..4e101229b0e 100644 --- a/mysql-test/r/heap_btree.result +++ b/mysql-test/r/heap_btree.result @@ -124,11 +124,11 @@ create table t1 (id int unsigned not null, primary key using BTREE (id)) type=H insert into t1 values(1); select max(id) from t1; max(id) -NULL +1 insert into t1 values(2); select max(id) from t1; max(id) -NULL +2 replace into t1 values(1); drop table t1; create table t1 (n int) type=heap; diff --git a/sql/ha_heap.cc b/sql/ha_heap.cc index 1abaa63de68..43485a97fe3 100644 --- a/sql/ha_heap.cc +++ b/sql/ha_heap.cc @@ -189,7 +189,7 @@ int ha_heap::index_prev(byte * buf) int ha_heap::index_first(byte * buf) { statistic_increment(ha_read_first_count,&LOCK_status); - int error=heap_rfirst(file, buf); + int error=heap_rfirst(file, buf, active_index); table->status=error ? STATUS_NOT_FOUND: 0; return error; } @@ -197,7 +197,7 @@ int ha_heap::index_first(byte * buf) int ha_heap::index_last(byte * buf) { statistic_increment(ha_read_last_count,&LOCK_status); - int error=heap_rlast(file, buf); + int error=heap_rlast(file, buf, active_index); table->status=error ? STATUS_NOT_FOUND: 0; return error; } -- cgit v1.2.1 From 7d9572c29354b77ca91d5ec4f34b2508d18ca7fa Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 6 May 2002 18:52:06 +0500 Subject: Use keyseg charset instead of default_charset_info --- heap/hp_hash.c | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/heap/hp_hash.c b/heap/hp_hash.c index 92e6320211a..70823c2c2c7 100644 --- a/heap/hp_hash.c +++ b/heap/hp_hash.c @@ -213,14 +213,13 @@ ulong hp_hashnr(register HP_KEYDEF *keydef, register const byte *key) } if (seg->type == HA_KEYTYPE_TEXT) { - if (default_charset_info->hash_sort) - default_charset_info->hash_sort(default_charset_info, - pos,((uchar*)key)-pos,&nr,&nr2); + if (seg->charset->hash_sort) + seg->charset->hash_sort(seg->charset,pos,((uchar*)key)-pos,&nr,&nr2); else for (; pos < (uchar*) key ; pos++) { nr^=(ulong) ((((uint) nr & 63)+nr2) * - ((uint) default_charset_info->sort_order[(uint) *pos])) + (nr << 8); + ((uint) seg->charset->sort_order[(uint) *pos])) + (nr << 8); nr2+=3; } } @@ -257,14 +256,13 @@ ulong hp_rec_hashnr(register HP_KEYDEF *keydef, register const byte *rec) } if (seg->type == HA_KEYTYPE_TEXT) { - if (default_charset_info->hash_sort) - default_charset_info->hash_sort(default_charset_info, - pos,end-pos,&nr,&nr2); + if (seg->charset->hash_sort) + seg->charset->hash_sort(seg->charset,pos,end-pos,&nr,&nr2); else for (; pos < end ; pos++) { nr^=(ulong) ((((uint) nr & 63)+nr2)* - ((uint) default_charset_info->sort_order[(uint) *pos]))+ (nr << 8); + ((uint) seg->charset->sort_order[(uint) *pos]))+ (nr << 8); nr2+=3; } } @@ -397,7 +395,7 @@ int hp_rec_key_cmp(HP_KEYDEF *keydef, const byte *rec1, const byte *rec2) case HA_KEYTYPE_END: return 0; case HA_KEYTYPE_TEXT: - if (my_sortcmp(default_charset_info,rec1+seg->start,rec2+seg->start,seg->length)) + if (my_sortcmp(seg->charset,rec1+seg->start,rec2+seg->start,seg->length)) return 1; break; default: @@ -428,12 +426,7 @@ int hp_key_cmp(HP_KEYDEF *keydef, const byte *rec, const byte *key) } if (seg->type == HA_KEYTYPE_TEXT) { - /* - BAR TODO: this will not use default_charset_info - I need Ram to apply his HEAP patches with - CHARSET_INFO field in HP segments - */ - if (my_sortcmp(default_charset_info,rec+seg->start,key,seg->length)) + if (my_sortcmp(seg->charset,rec+seg->start,key,seg->length)) return 1; } else -- cgit v1.2.1 From d822b0d5222b5522598608c495330901b98a9fb2 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 6 May 2002 22:47:57 +0300 Subject: fixed bug in derived tables if derived tables more than 1 mysql-test/r/derived.result: added test of found bug in derived tables mysql-test/t/derived.test: added test of found bug in derived tables --- mysql-test/r/derived.result | 10 ++++++++-- mysql-test/t/derived.test | 7 +++++-- sql/sql_yacc.yy | 4 +++- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/mysql-test/r/derived.result b/mysql-test/r/derived.result index 5a41a51463e..822993a7bf2 100644 --- a/mysql-test/r/derived.result +++ b/mysql-test/r/derived.result @@ -1,4 +1,4 @@ -drop table if exists t1,t2; +drop table if exists t1,t2,t3; CREATE TABLE t1 (a int not null, b char (10) not null); insert into t1 values(1,'a'),(2,'b'),(3,'c'),(3,'c'); CREATE TABLE t2 (a int not null, b char (10) not null); @@ -7,4 +7,10 @@ select t1.a,t3.y from t1,(select a as y from t2 where b='c') as t3 where t1.a a y 3 3 3 3 -drop table if exists t1.t2; +CREATE TABLE t3 (a int not null, b char (10) not null); +insert into t3 values (3,'f'),(4,'y'),(5,'z'),(6,'c'); +select t1.a,t4.y from t1,(select t2.a as y from t2,(select t3.b from t3 where t3.a>3) as t5 where t2.b=t5.b) as t4 where t1.a = t4.y; +a y +3 3 +3 3 +drop table if exists t1.t2,t3; diff --git a/mysql-test/t/derived.test b/mysql-test/t/derived.test index 4a3e8e86d4a..c5f57007e54 100644 --- a/mysql-test/t/derived.test +++ b/mysql-test/t/derived.test @@ -1,7 +1,10 @@ -drop table if exists t1,t2; +drop table if exists t1,t2,t3; CREATE TABLE t1 (a int not null, b char (10) not null); insert into t1 values(1,'a'),(2,'b'),(3,'c'),(3,'c'); CREATE TABLE t2 (a int not null, b char (10) not null); insert into t2 values (3,'c'),(4,'d'),(5,'f'),(6,'e'); select t1.a,t3.y from t1,(select a as y from t2 where b='c') as t3 where t1.a = t3.y; -drop table if exists t1.t2; \ No newline at end of file +CREATE TABLE t3 (a int not null, b char (10) not null); +insert into t3 values (3,'f'),(4,'y'),(5,'z'),(6,'c'); +select t1.a,t4.y from t1,(select t2.a as y from t2,(select t3.b from t3 where t3.a>3) as t5 where t2.b=t5.b) as t4 where t1.a = t4.y; +drop table if exists t1.t2,t3; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 6317b21a603..24321dbdb53 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2155,8 +2155,10 @@ join_table: | '(' SELECT_SYM select_part3 ')' opt_table_alias { LEX *lex=Lex; + SELECT_LEX *select_to_execute= lex->select; lex->select=lex->select->prev; - if (!($$=add_table_to_list(new Table_ident(Lex->last_select),$5,0,TL_UNLOCK))) + if (!($$=add_table_to_list(new Table_ident(select_to_execute), + $5,0,TL_UNLOCK))) YYABORT; } -- cgit v1.2.1 From 2c62a868a60058a8664dcf3e45cdd86b41635ddd Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 7 May 2002 00:04:16 +0300 Subject: new SELECT_LEX structure mysql-test/r/derived.result: derived table bug test mysql-test/t/derived.test: derived table bug test sql/mysql_priv.h: new mysql_new_select call & layout fixing sql/sql_class.h: passing unit as parameter of Table_ident constructor sql/sql_lex.cc: new SELECT_LEX structure methods sql/sql_lex.h: new SELECT_LEX structure definition sql/table.h: fixed layout --- mysql-test/r/derived.result | 10 ++- mysql-test/t/derived.test | 7 ++- sql/mysql_priv.h | 6 +- sql/sql_class.h | 21 +++++-- sql/sql_derived.cc | 19 +++--- sql/sql_lex.cc | 115 ++++++++++++++++++++++++++++++++++ sql/sql_lex.h | 149 +++++++++++++++++++++++++++++++++++++++----- sql/sql_parse.cc | 88 +++++++++++++------------- sql/sql_union.cc | 28 +++++---- sql/sql_yacc.yy | 24 +++---- sql/table.h | 16 ++--- 11 files changed, 372 insertions(+), 111 deletions(-) diff --git a/mysql-test/r/derived.result b/mysql-test/r/derived.result index 5a41a51463e..822993a7bf2 100644 --- a/mysql-test/r/derived.result +++ b/mysql-test/r/derived.result @@ -1,4 +1,4 @@ -drop table if exists t1,t2; +drop table if exists t1,t2,t3; CREATE TABLE t1 (a int not null, b char (10) not null); insert into t1 values(1,'a'),(2,'b'),(3,'c'),(3,'c'); CREATE TABLE t2 (a int not null, b char (10) not null); @@ -7,4 +7,10 @@ select t1.a,t3.y from t1,(select a as y from t2 where b='c') as t3 where t1.a a y 3 3 3 3 -drop table if exists t1.t2; +CREATE TABLE t3 (a int not null, b char (10) not null); +insert into t3 values (3,'f'),(4,'y'),(5,'z'),(6,'c'); +select t1.a,t4.y from t1,(select t2.a as y from t2,(select t3.b from t3 where t3.a>3) as t5 where t2.b=t5.b) as t4 where t1.a = t4.y; +a y +3 3 +3 3 +drop table if exists t1.t2,t3; diff --git a/mysql-test/t/derived.test b/mysql-test/t/derived.test index 4a3e8e86d4a..c5f57007e54 100644 --- a/mysql-test/t/derived.test +++ b/mysql-test/t/derived.test @@ -1,7 +1,10 @@ -drop table if exists t1,t2; +drop table if exists t1,t2,t3; CREATE TABLE t1 (a int not null, b char (10) not null); insert into t1 values(1,'a'),(2,'b'),(3,'c'),(3,'c'); CREATE TABLE t2 (a int not null, b char (10) not null); insert into t2 values (3,'c'),(4,'d'),(5,'f'),(6,'e'); select t1.a,t3.y from t1,(select a as y from t2 where b='c') as t3 where t1.a = t3.y; -drop table if exists t1.t2; \ No newline at end of file +CREATE TABLE t3 (a int not null, b char (10) not null); +insert into t3 values (3,'f'),(4,'y'),(5,'z'),(6,'c'); +select t1.a,t4.y from t1,(select t2.a as y from t2,(select t3.b from t3 where t3.a>3) as t5 where t2.b=t5.b) as t4 where t1.a = t4.y; +drop table if exists t1.t2,t3; diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 4c71e845207..a0dad53b4e2 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -291,7 +291,7 @@ bool mysql_rename_tables(THD *thd, TABLE_LIST *table_list); bool mysql_change_db(THD *thd,const char *name); void mysql_parse(THD *thd,char *inBuf,uint length); void mysql_init_select(LEX *lex); -bool mysql_new_select(LEX *lex); +bool mysql_new_select(LEX *lex, bool move_down); void mysql_init_multi_delete(LEX *lex); void init_max_user_conn(void); void free_max_user_conn(void); @@ -360,8 +360,8 @@ int handle_select(THD *thd, LEX *lex, select_result *result); int mysql_select(THD *thd,TABLE_LIST *tables,List &list,COND *conds, ORDER *order, ORDER *group,Item *having,ORDER *proc_param, ulong select_type,select_result *result); -int mysql_union(THD *thd,LEX *lex,select_result *result); -int mysql_derived(THD *thd,LEX *lex,SELECT_LEX *s, TABLE_LIST *t); +int mysql_union(THD *thd, LEX *lex,select_result *result); +int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *s, TABLE_LIST *t); Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, Item_result_field ***copy_func, Field **from_field, bool group,bool modify_item); diff --git a/sql/sql_class.h b/sql/sql_class.h index 3ffac72c1db..56a0d6a44df 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -706,19 +706,28 @@ class Table_ident :public Sql_alloc { public: LEX_STRING db; LEX_STRING table; - SELECT_LEX *sel; - inline Table_ident(LEX_STRING db_arg,LEX_STRING table_arg,bool force) - :table(table_arg), sel((SELECT_LEX *)0) + SELECT_LEX_UNIT *sel; + inline Table_ident(LEX_STRING db_arg, LEX_STRING table_arg, bool force) + :table(table_arg), sel((SELECT_LEX_UNIT *)0) { if (!force && (current_thd->client_capabilities & CLIENT_NO_SCHEMA)) db.str=0; else db= db_arg; } - inline Table_ident(LEX_STRING table_arg) :table(table_arg), sel((SELECT_LEX *)0) {db.str=0;} - inline Table_ident(SELECT_LEX *s) : sel(s) {db.str=0; table.str=(char *)""; table.length=0;} + inline Table_ident(LEX_STRING table_arg) + :table(table_arg), sel((SELECT_LEX_UNIT *)0) + { + db.str=0; + } + inline Table_ident(SELECT_LEX_UNIT *s) : sel(s) + { + db.str=0; table.str=(char *)""; table.length=0; + } inline void change_db(char *db_name) - { db.str= db_name; db.length=(uint) strlen(db_name); } + { + db.str= db_name; db.length= (uint) strlen(db_name); + } }; // this is needed for user_vars hash diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index f1b60dd9b84..79343ef4ae0 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -28,21 +28,25 @@ static const char *any_db="*any*"; // Special symbol for check_access -int mysql_derived(THD *thd, LEX *lex,SELECT_LEX *s, TABLE_LIST *t) +int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *s, TABLE_LIST *t) { - SELECT_LEX *sl=s; + /* + TODO: make derived tables with union inside (now only 1 SELECT may be + procesed) + */ + SELECT_LEX *sl= (SELECT_LEX*)s->slave; List item_list; TABLE *table; int res; select_union *derived_result; - TABLE_LIST *tables=(TABLE_LIST *)sl->table_list.first; + TABLE_LIST *tables= (TABLE_LIST *)sl->table_list.first; TMP_TABLE_PARAM tmp_table_param; DBUG_ENTER("mysql_derived"); if (tables) - res=check_table_access(thd,SELECT_ACL, tables); + res= check_table_access(thd,SELECT_ACL, tables); else - res=check_access(thd, SELECT_ACL, any_db); + res= check_access(thd, SELECT_ACL, any_db); if (res) DBUG_RETURN(-1); @@ -52,7 +56,7 @@ int mysql_derived(THD *thd, LEX *lex,SELECT_LEX *s, TABLE_LIST *t) { if (cursor->derived) { - res=mysql_derived(thd,lex,(SELECT_LEX *)cursor->derived,cursor); + res=mysql_derived(thd, lex, (SELECT_LEX_UNIT *)cursor->derived, cursor); if (res) DBUG_RETURN(res); } } @@ -103,9 +107,8 @@ int mysql_derived(THD *thd, LEX *lex,SELECT_LEX *s, TABLE_LIST *t) { t->real_name=table->real_name; t->table=table; - sl->prev->next=sl->next; + sl->exclude(); t->derived=(SELECT_LEX *)0; // just in case ... - if (!sl->next) lex->last_select = sl; } } delete derived_result; diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 31ec6d1cecc..3b17c8d498a 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -879,3 +879,118 @@ int yylex(void *arg) } } } + +/* + st_select_lex structures initialisations +*/ + +void st_select_lex_node::init_query() +{ + next= master= slave= link_next= 0; + prev= link_prev= 0; +} + +void st_select_lex_node::init_select() +{ + order_list.elements= 0; + order_list.first= 0; + order_list.next= (byte**) &order_list.first; + select_limit= offset_limit= 0; +} + +void st_select_lex_unit::init_query() +{ + st_select_lex_node::init_query(); + global_parameters= this; + select_limit_cnt= offset_limit_cnt= 0; +} + +void st_select_lex::init_query() +{ + st_select_lex_node::init_query(); + table_list.elements= 0; + table_list.first= 0; + table_list.next= (byte**) &table_list.first; + item_list.empty(); +} + +void st_select_lex::init_select() +{ + st_select_lex_node::init_select(); + group_list.elements= 0; + group_list.first= 0; + group_list.next= (byte**) &group_list.first; + options= 0; + where= having= 0; + when_list.empty(); + expr_list.empty(); + interval_list.empty(); + use_index.empty(); + ftfunc_list.empty(); + linkage=UNSPECIFIED_TYPE; +} + +/* + st_select_lex structures linking +*/ + +/* include on level down */ +void st_select_lex_node::include_down(st_select_lex_node *upper) +{ + if ((next= upper->slave)) + next->prev= &next; + prev= &upper->slave; + upper->slave= this; + master= upper; +} + +/* include neighbour (on same level) */ +void st_select_lex_node::include_neighbour(st_select_lex_node *before) +{ + if ((next= before->next)) + next->prev= &next; + prev= &before->next; + before->next= this; + master= before->master; +} + +/* including in global SELECT_LEX list */ +void st_select_lex_node::include_global(st_select_lex_node **plink) +{ + if ((link_next= *plink)) + link_next->link_prev= &link_next; + link_prev= plink; + *plink= this; +} + +//excluding from global list (internal function) +void st_select_lex_node::fast_exclude() +{ + if(link_prev) + { + if ((*link_prev= link_next)) + link_next->link_prev= link_prev; + // Remove slave structure + for (; slave; slave= slave->next) + slave->fast_exclude(); + } +} + +/* + excluding select_lex structure (except first (first select can't be + deleted, because it is most upper select)) +*/ +void st_select_lex_node::exclude() +{ + //exclude from global list + fast_exclude(); + //exclude from other structures + if ((*prev= next)) + next->prev= prev; + /* + We do not need following statements, because prev pointer of first + list element point to master->slave + if (master->slave == this) + master->slave= next; + */ +} diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 53422b050a3..7603157f66d 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -103,28 +103,143 @@ typedef struct st_lex_master_info } LEX_MASTER_INFO; -enum sub_select_type {UNSPECIFIED_TYPE,UNION_TYPE, INTERSECT_TYPE, EXCEPT_TYPE, NOT_A_SELECT, DERIVED_TABLE_TYPE}; +enum sub_select_type {UNSPECIFIED_TYPE,UNION_TYPE, INTERSECT_TYPE, + EXCEPT_TYPE, GLOBAL_OPTIONS_TYPE, DERIVED_TABLE_TYPE}; -/* The state of the lex parsing for selects */ +/* + The state of the lex parsing for selects + + All select describing structures linked with following pointers: + - list of neighbors (next/prev) (prev of first element point to slave + pointer of upper structure) + - one level units for unit (union) structure + - member of one union(unit) for ordinary select_lex + - pointer to master + - outer select_lex for unit (union) + - unit structure for ordinary select_lex + - pointer to slave + - first list element of select_lex belonged to this unit for unit + - first unit in list of units that belong to this select_lex (as + subselects or derived tables) for ordinary select_lex + - list of all select_lex (for group operation like correcting list of opened + tables) + for example for following query: -typedef struct st_select_lex { + select * + from table1 + where table1.field IN (select * from table1_1_1 union + select * from table1_1_2) + union + select * + from table2 + where table2.field=(select (select f1 from table2_1_1_1_1 + where table2_1_1_1_1.f2=table2_1_1.f3) + from table2_1_1 + where table2_1_1.f1=table2.f2) + union + select * from table3; + + we will have following structure: + + + main unit + select1 select2 select3 + |^^ |^ + s||| ||master + l||| |+---------------------------------+ + a||| +---------------------------------+| + v|||master slave || + e||+-------------------------+ || + V| neighbor | V| + unit 1.1<==================>unit1.2 unit2.1 + select1.1.1 select 1.1.2 select1.2.1 select2.1.1 select2.1.2 + |^ + || + V| + unit2.1.1.1 + select2.1.1.1.1 + + + relation in main unit will be following: + + main unit + |^^^ + |||| + |||+------------------------------+ + ||+--------------+ | + slave||master | | + V| neighbor | neighbor | + select1<========>select2<========>select3 + + list of all select_lex will be following (as it will be constructed by + parser): + + select1->select2->select3->select2.1.1->select 2.1.2->select2.1.1.1.1-+ + | + +---------------------------------------------------------------------+ + | + +->select1.1.1->select1.1.2 + +*/ + +/* + Base class for st_select_lex (SELECT_LEX) & + st_select_lex_unit (SELECT_LEX_UNIT) +*/ +struct st_select_lex_node { enum sub_select_type linkage; - char *db,*db1,*table1,*db2,*table2; /* For outer join using .. */ - Item *where,*having; - ha_rows select_limit,offset_limit; + st_select_lex_node *next, **prev, /* neighbor list */ + *master, *slave, /* vertical links */ + *link_next, **link_prev; /* list of whole SELECT_LEX */ + SQL_LIST order_list; /* ORDER clause */ + ha_rows select_limit, offset_limit; /* LIMIT clause parameters */ + void init_query(); + void init_select(); + void include_down(st_select_lex_node *upper); + void include_neighbour(st_select_lex_node *before); + void include_global(st_select_lex_node **plink); + void exclude(); +private: + void fast_exclude(); +}; + +/* + SELECT_LEX_UNIT - unit of selects (UNION, INTERSECT, ...) group + SELECT_LEXs +*/ +struct st_select_lex_unit: public st_select_lex_node { + /* + Pointer to 'last' select or pointer to unit where stored + global parameters for union + */ + st_select_lex_node *global_parameters; + /* LIMIT clause runtime counters */ + ha_rows select_limit_cnt, offset_limit_cnt; + void init_query(); +}; +typedef struct st_select_lex_unit SELECT_LEX_UNIT; + +/* + SELECT_LEX - store information of parsed SELECT_LEX statment +*/ +struct st_select_lex: public st_select_lex_node { + char *db, *db1, *table1, *db2, *table2; /* For outer join using .. */ + Item *where, *having; /* WHERE & HAVING clauses */ ulong options; List expr_list; - List when_list; - SQL_LIST order_list,table_list,group_list; - List item_list; - List interval_list,use_index, *use_index_ptr, + List when_list; /* WHEN clause */ + SQL_LIST table_list, group_list; /* FROM & GROUP BY clauses */ + List item_list; /* list of fields & expressions */ + List interval_list, use_index, *use_index_ptr, ignore_index, *ignore_index_ptr; List ftfunc_list; uint in_sum_expr, sort_default; - bool create_refs, braces; - st_select_lex *next, *prev; -} SELECT_LEX; - + bool create_refs, + braces; /* SELECT ... UNION (SELECT ... ) <- this braces */ + void init_query(); + void init_select(); +}; +typedef struct st_select_lex SELECT_LEX; class Set_option :public Sql_alloc { public: @@ -137,13 +252,15 @@ public: :name(par_name), item(par_item), name_length(length), type(par_type) {} }; - /* The state of the lex parsing. This is saved in the THD struct */ typedef struct st_lex { uint yylineno,yytoklen; /* Simulate lex */ LEX_YYSTYPE yylval; - SELECT_LEX select_lex, *select, *last_select; + SELECT_LEX_UNIT unit; /* most upper unit */ + SELECT_LEX select_lex, /* first SELECT_LEX */ + /* current SELECT_LEX in parsing */ + *select; uchar *ptr,*tok_start,*tok_end,*end_of_query; char *length,*dec,*change,*name; char *backup_dir; /* For RESTORE/BACKUP */ diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 06431124356..4d03701e4f8 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1240,8 +1240,10 @@ mysql_execute_command(void) { for (TABLE_LIST *cursor= tables; cursor; - cursor=cursor->next) - if (cursor->derived && mysql_derived(thd,lex,(SELECT_LEX *)cursor->derived,cursor)) + cursor= cursor->next) + if (cursor->derived && mysql_derived(thd, lex, + (SELECT_LEX_UNIT *)cursor->derived, + cursor)) DBUG_VOID_RETURN; } if ((lex->select_lex.next && create_total_list(thd,lex,&tables)) || @@ -2664,18 +2666,19 @@ static void mysql_init_query(THD *thd) { DBUG_ENTER("mysql_init_query"); - thd->lex.select_lex.item_list.empty(); + thd->lex.unit.init_query(); + thd->lex.select_lex.init_query(); + thd->lex.unit.slave= &thd->lex.select_lex; + thd->lex.select_lex.master= &thd->lex.unit; + thd->lex.select_lex.prev= &thd->lex.unit.slave; thd->lex.value_list.empty(); - thd->lex.select_lex.table_list.elements=0; - thd->free_list=0; thd->lex.union_option=0; - thd->lex.select = thd->lex.last_select = &thd->lex.select_lex; - thd->lex.select_lex.table_list.first=0; - thd->lex.select_lex.table_list.next= (byte**) &thd->lex.select_lex.table_list.first; - thd->lex.select_lex.next=0; - thd->fatal_error=0; // Safety - thd->last_insert_id_used=thd->query_start_used=thd->insert_id_used=0; - thd->sent_row_count=thd->examined_row_count=0; - thd->safe_to_cache_query=1; + thd->free_list= 0; + thd->lex.union_option= 0; + thd->lex.select= &thd->lex.select_lex; + thd->fatal_error= 0; // Safety + thd->last_insert_id_used= thd->query_start_used= thd->insert_id_used=0; + thd->sent_row_count= thd->examined_row_count= 0; + thd->safe_to_cache_query= 1; DBUG_VOID_RETURN; } @@ -2683,53 +2686,52 @@ void mysql_init_select(LEX *lex) { SELECT_LEX *select_lex = lex->select; - select_lex->where=select_lex->having=0; + select_lex->init_select(); select_lex->select_limit=lex->thd->default_select_limit; select_lex->offset_limit=0; - select_lex->options=0; - select_lex->linkage=UNSPECIFIED_TYPE; lex->exchange = 0; lex->proc_list.first=0; - select_lex->order_list.elements=select_lex->group_list.elements=0; - select_lex->order_list.first=0; - select_lex->order_list.next= (byte**) &select_lex->order_list.first; - select_lex->group_list.first=0; - select_lex->group_list.next= (byte**) &select_lex->group_list.first; - select_lex->next = select_lex->prev = (SELECT_LEX *)NULL; } bool -mysql_new_select(LEX *lex) +mysql_new_select(LEX *lex, bool move_down) { SELECT_LEX *select_lex = (SELECT_LEX *) lex->thd->calloc(sizeof(SELECT_LEX)); if (!select_lex) return 1; - lex->select=lex->last_select; - lex->select->next=select_lex; - lex->select=lex->last_select=select_lex; - select_lex->table_list.next= (byte**) &select_lex->table_list.first; - select_lex->item_list.empty(); - select_lex->when_list.empty(); - select_lex->expr_list.empty(); - select_lex->interval_list.empty(); - select_lex->use_index.empty(); - select_lex->ftfunc_list.empty(); + select_lex->init_query(); + select_lex->init_select(); + if (move_down) + { + /* first select_lex of subselect or derived table */ + SELECT_LEX_UNIT *unit= + (SELECT_LEX_UNIT *) lex->thd->calloc(sizeof(SELECT_LEX_UNIT)); + if (!unit) + return 1; + unit->init_query(); + unit->init_select(); + unit->include_down(lex->select); + select_lex->include_down(unit); + } + else + select_lex->include_neighbour(lex->select); + + select_lex->include_global(&lex->select->link_next); + lex->select= select_lex; return 0; } void mysql_init_multi_delete(LEX *lex) { - lex->sql_command = SQLCOM_DELETE_MULTI; + lex->sql_command= SQLCOM_DELETE_MULTI; mysql_init_select(lex); - lex->select->select_limit=HA_POS_ERROR; - lex->auxilliary_table_list=lex->select_lex.table_list; - lex->select->table_list.elements=0; - lex->select->table_list.first=0; - lex->select->table_list.next= (byte**) &(lex->select->table_list.first); + lex->select->select_limit= HA_POS_ERROR; + lex->auxilliary_table_list= lex->select_lex.table_list; + lex->select->init_query(); } void -mysql_parse(THD *thd,char *inBuf,uint length) +mysql_parse(THD *thd, char *inBuf, uint length) { DBUG_ENTER("mysql_parse"); @@ -3159,7 +3161,7 @@ TABLE_LIST *add_table_to_list(Table_ident *table, LEX_STRING *alias, ptr->real_name_length=table->table.length; ptr->lock_type=flags; ptr->updating=updating; - ptr->derived=(SELECT_LEX *)table->sel; + ptr->derived= (SELECT_LEX_UNIT *) table->sel; if (use_index) ptr->use_index=(List *) thd->memdup((gptr) use_index, sizeof(*use_index)); @@ -3204,8 +3206,8 @@ static bool create_total_list(THD *thd, LEX *lex, TABLE_LIST **result) SELECT_LEX *sl; TABLE_LIST **new_table_list= result, *aux; - *new_table_list=0; // end result list - for (sl= &lex->select_lex; sl; sl=sl->next) + *new_table_list= 0; // end result list + for (sl= &lex->select_lex; sl; sl= (SELECT_LEX *) sl->next) { if (sl->order_list.first && sl->next && !sl->braces) { diff --git a/sql/sql_union.cc b/sql/sql_union.cc index c8237f3ae9b..7178b857bbc 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -43,8 +43,8 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) /* Fix tables 'to-be-unioned-from' list to point at opened tables */ last_sl= &lex->select_lex; for (sl= last_sl; - sl && sl->linkage != NOT_A_SELECT; - last_sl=sl, sl=sl->next) + sl && sl->linkage != GLOBAL_OPTIONS_TYPE; + last_sl= sl, sl= (SELECT_LEX *) sl->next) { for (TABLE_LIST *cursor= (TABLE_LIST *)sl->table_list.first; cursor; @@ -133,7 +133,7 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) } union_result->save_time_stamp=!describe; - for (sl= &lex->select_lex; sl; sl=sl->next) + for (sl= &lex->select_lex; sl; sl= (SELECT_LEX*) sl->next) { lex->select=sl; thd->offset_limit=sl->offset_limit; @@ -143,15 +143,19 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) if (thd->select_limit == HA_POS_ERROR) sl->options&= ~OPTION_FOUND_ROWS; - res=mysql_select(thd, (describe && sl->linkage==NOT_A_SELECT) ? first_table : (TABLE_LIST*) sl->table_list.first, - sl->item_list, - sl->where, - (sl->braces) ? (ORDER *)sl->order_list.first : (ORDER *) 0, - (ORDER*) sl->group_list.first, - sl->having, - (ORDER*) NULL, - sl->options | thd->options | SELECT_NO_UNLOCK | ((describe) ? SELECT_DESCRIBE : 0), - union_result); + res= mysql_select(thd, + (describe && sl->linkage==GLOBAL_OPTIONS_TYPE) ? + first_table : (TABLE_LIST*) sl->table_list.first, + sl->item_list, + sl->where, + (sl->braces) ? + (ORDER *)sl->order_list.first : (ORDER *) 0, + (ORDER*) sl->group_list.first, + sl->having, + (ORDER*) NULL, + sl->options | thd->options | + SELECT_NO_UNLOCK | ((describe) ? SELECT_DESCRIBE : 0), + union_result); if (res) goto exit; } diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 6317b21a603..f9d075b75b3 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2155,21 +2155,22 @@ join_table: | '(' SELECT_SYM select_part3 ')' opt_table_alias { LEX *lex=Lex; - lex->select=lex->select->prev; - if (!($$=add_table_to_list(new Table_ident(Lex->last_select),$5,0,TL_UNLOCK))) + SELECT_LEX_UNIT *unit= (SELECT_LEX_UNIT*) lex->select->master; + lex->select= (SELECT_LEX*) unit->master; + if (!($$= add_table_to_list(new Table_ident(unit), + $5,0,TL_UNLOCK))) YYABORT; } select_part3: { - LEX *lex=Lex; - lex->derived_tables=true; - SELECT_LEX *tmp=lex->select; - if (lex->select->linkage == NOT_A_SELECT || mysql_new_select(lex)) + LEX *lex= Lex; + lex->derived_tables= true; + if (lex->select->linkage == GLOBAL_OPTIONS_TYPE || + mysql_new_select(lex, 1)) YYABORT; mysql_init_select(lex); - lex->select->linkage=DERIVED_TABLE_TYPE; - lex->select->prev=tmp; + lex->select->linkage= DERIVED_TABLE_TYPE; } select_options select_item_list select_intoto @@ -3809,7 +3810,8 @@ union_list: net_printf(&lex->thd->net, ER_WRONG_USAGE,"UNION","INTO"); YYABORT; } - if (lex->select->linkage == NOT_A_SELECT || mysql_new_select(lex)) + if (lex->select->linkage == GLOBAL_OPTIONS_TYPE || + mysql_new_select(lex, 0)) YYABORT; lex->select->linkage=UNION_TYPE; } @@ -3824,10 +3826,10 @@ optional_order_or_limit: | { LEX *lex=Lex; - if (!lex->select->braces || mysql_new_select(lex)) + if (!lex->select->braces || mysql_new_select(lex, 0)) YYABORT; mysql_init_select(lex); - lex->select->linkage=NOT_A_SELECT; + lex->select->linkage= GLOBAL_OPTIONS_TYPE; lex->select->select_limit=lex->thd->default_select_limit; } opt_order_clause limit_clause diff --git a/sql/table.h b/sql/table.h index 59cb28038bf..e30e29ddd3f 100644 --- a/sql/table.h +++ b/sql/table.h @@ -139,18 +139,18 @@ typedef struct st_table_list { struct st_table_list *next; char *db,*name,*real_name; uint32 db_length, real_name_length; - Item *on_expr; /* Used with outer join */ - struct st_table_list *natural_join; /* natural join on this table*/ + Item *on_expr; /* Used with outer join */ + struct st_table_list *natural_join; /* natural join on this table*/ /* ... join ... USE INDEX ... IGNORE INDEX */ - List *use_index,*ignore_index; + List *use_index, *ignore_index; TABLE *table; GRANT_INFO grant; thr_lock_type lock_type; - uint outer_join; /* Which join type */ - bool straight; /* optimize with prev table */ - bool updating; /* for replicate-do/ignore table */ - bool shared; /* Used twice in union */ - void *derived; + uint outer_join; /* Which join type */ + bool straight; /* optimize with prev table */ + bool updating; /* for replicate-do/ignore table */ + bool shared; /* Used twice in union */ + void *derived; /* SELECT_LEX_UNIT of derived table */ } TABLE_LIST; typedef struct st_changed_table_list { -- cgit v1.2.1 From 6ff06df2333d90021cb10a27f9285586908ee542 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 8 May 2002 23:14:40 +0300 Subject: new SELECT_LEX structures used for storing global ORDER BY, global LIMIT & limit counters mysql-test/r/union.result: correct result of union explain command --- mysql-test/r/union.result | 1 - sql/item_sum.cc | 8 ++-- sql/mysql_priv.h | 3 +- sql/sql_class.cc | 19 +++++---- sql/sql_class.h | 23 +++++++---- sql/sql_delete.cc | 3 +- sql/sql_derived.cc | 24 ++++++----- sql/sql_insert.cc | 14 ++++--- sql/sql_lex.cc | 6 ++- sql/sql_parse.cc | 55 +++++++++++++------------ sql/sql_select.cc | 93 +++++++++++++++++++++++------------------- sql/sql_select.h | 5 ++- sql/sql_union.cc | 102 ++++++++++++++++++---------------------------- sql/sql_update.cc | 13 ++++-- sql/sql_yacc.yy | 20 +++++++-- 15 files changed, 208 insertions(+), 181 deletions(-) diff --git a/mysql-test/r/union.result b/mysql-test/r/union.result index 7d914d029af..29b925b6746 100644 --- a/mysql-test/r/union.result +++ b/mysql-test/r/union.result @@ -88,7 +88,6 @@ explain (select a,b from t1 limit 2) union all (select a,b from t2 order by a l table type possible_keys key key_len ref rows Extra t1 ALL NULL NULL NULL NULL 4 t2 ALL NULL NULL NULL NULL 4 Using filesort -t1 ALL NULL NULL NULL NULL 4 (select sql_calc_found_rows a,b from t1 limit 2) union all (select a,b from t2 order by a) limit 2; a b 1 a diff --git a/sql/item_sum.cc b/sql/item_sum.cc index 83bc2272515..ecb908a797b 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -940,6 +940,7 @@ bool Item_sum_count_distinct::fix_fields(THD *thd,TABLE_LIST *tables) bool Item_sum_count_distinct::setup(THD *thd) { List list; + SELECT_LEX *select_lex= current_lex->select; /* Create a table with an unique key over all parameters */ for (uint i=0; i < arg_count ; i++) { @@ -961,9 +962,10 @@ bool Item_sum_count_distinct::setup(THD *thd) free_tmp_table(thd, table); tmp_table_param->cleanup(); } - if (!(table=create_tmp_table(thd, tmp_table_param, list, (ORDER*) 0, 1, - 0, 0, - current_lex->select->options | thd->options))) + if (!(table= create_tmp_table(thd, tmp_table_param, list, (ORDER*) 0, 1, + 0, 0, + select_lex->options | thd->options, + (SELECT_LEX_UNIT*) select_lex->master))) return 1; table->file->extra(HA_EXTRA_NO_ROWS); // Don't update rows table->no_rows=1; diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index a0dad53b4e2..1719fe69b17 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -359,7 +359,8 @@ int setup_order(THD *thd,TABLE_LIST *tables, List &fields, int handle_select(THD *thd, LEX *lex, select_result *result); int mysql_select(THD *thd,TABLE_LIST *tables,List &list,COND *conds, ORDER *order, ORDER *group,Item *having,ORDER *proc_param, - ulong select_type,select_result *result); + ulong select_type,select_result *result, + SELECT_LEX_UNIT *unit); int mysql_union(THD *thd, LEX *lex,select_result *result); int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *s, TABLE_LIST *t); Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 29cdaa676d6..6be0e46679b 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -389,9 +389,9 @@ bool select_send::send_data(List &items) String *packet= &thd->packet; DBUG_ENTER("send_data"); - if (thd->offset_limit) + if (unit->offset_limit_cnt) { // using limit offset,count - thd->offset_limit--; + unit->offset_limit_cnt--; DBUG_RETURN(0); } packet->length(0); // Reset packet @@ -439,11 +439,12 @@ select_export::~select_export() } int -select_export::prepare(List &list) +select_export::prepare(List &list, SELECT_LEX_UNIT *u) { char path[FN_REFLEN]; uint option=4; bool blob_flag=0; + unit= u; #ifdef DONT_ALLOW_FULL_LOAD_DATA_PATHS option|=1; // Force use of db directory #endif @@ -510,9 +511,9 @@ bool select_export::send_data(List &items) String tmp(buff,sizeof(buff)),*res; tmp.length(0); - if (thd->offset_limit) + if (unit->offset_limit_cnt) { // using limit offset,count - thd->offset_limit--; + unit->offset_limit_cnt--; DBUG_RETURN(0); } row_count++; @@ -678,9 +679,11 @@ select_dump::~select_dump() } int -select_dump::prepare(List &list __attribute__((unused))) +select_dump::prepare(List &list __attribute__((unused)), + SELECT_LEX_UNIT *u) { uint option=4; + unit= u; #ifdef DONT_ALLOW_FULL_LOAD_DATA_PATHS option|=1; // Force use of db directory #endif @@ -719,9 +722,9 @@ bool select_dump::send_data(List &items) Item *item; DBUG_ENTER("send_data"); - if (thd->offset_limit) + if (unit->offset_limit_cnt) { // using limit offset,count - thd->offset_limit--; + unit->offset_limit_cnt--; DBUG_RETURN(0); } if (row_count++ > 1) diff --git a/sql/sql_class.h b/sql/sql_class.h index 56a0d6a44df..d4bd65674f1 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -382,7 +382,7 @@ public: #endif ulonglong next_insert_id,last_insert_id,current_insert_id, limit_found_rows; - ha_rows select_limit,offset_limit,default_select_limit,cuted_fields, + ha_rows default_select_limit,cuted_fields, max_join_size, sent_row_count, examined_row_count; table_map used_tables; UC *user_connect; @@ -551,10 +551,15 @@ void send_error(NET *net,uint sql_errno=0, const char *err=0); class select_result :public Sql_alloc { protected: THD *thd; + SELECT_LEX_UNIT *unit; public: select_result(); virtual ~select_result() {}; - virtual int prepare(List &list) { return 0; } + virtual int prepare(List &list, SELECT_LEX_UNIT *u) + { + unit= u; + return 0; + } virtual bool send_fields(List &list,uint flag)=0; virtual bool send_data(List &items)=0; virtual void initialize_tables (JOIN *join=0) {} @@ -587,7 +592,7 @@ class select_export :public select_result { public: select_export(sql_exchange *ex) :exchange(ex),file(-1),row_count(0L) {} ~select_export(); - int prepare(List &list); + int prepare(List &list, SELECT_LEX_UNIT *u); bool send_fields(List &list, uint flag) { return 0; } bool send_data(List &items); @@ -606,7 +611,7 @@ public: select_dump(sql_exchange *ex) :exchange(ex),file(-1),row_count(0L) { path[0]=0; } ~select_dump(); - int prepare(List &list); + int prepare(List &list, SELECT_LEX_UNIT *u); bool send_fields(List &list, uint flag) { return 0; } bool send_data(List &items); @@ -629,7 +634,7 @@ class select_insert :public select_result { info.handle_duplicates=duplic; } ~select_insert(); - int prepare(List &list); + int prepare(List &list, SELECT_LEX_UNIT *u); bool send_fields(List &list, uint flag) { return 0; } bool send_data(List &items); @@ -658,7 +663,7 @@ public: create_info(create_info_par), lock(0) {} - int prepare(List &list); + int prepare(List &list, SELECT_LEX_UNIT *u); bool send_data(List &values); bool send_eof(); void abort(); @@ -672,7 +677,7 @@ class select_union :public select_result { select_union(TABLE *table_par); ~select_union(); - int prepare(List &list); + int prepare(List &list, SELECT_LEX_UNIT *u); bool send_fields(List &list, uint flag) { return 0; } bool send_data(List &items); @@ -787,7 +792,7 @@ public: multi_delete(THD *thd, TABLE_LIST *dt, thr_lock_type lock_option_arg, uint num_of_tables); ~multi_delete(); - int prepare(List &list); + int prepare(List &list, SELECT_LEX_UNIT *u); bool send_fields(List &list, uint flag) { return 0; } bool send_data(List &items); @@ -816,7 +821,7 @@ public: enum enum_duplicates handle_duplicates, thr_lock_type lock_option_arg, uint num); ~multi_update(); - int prepare(List &list); + int prepare(List &list, SELECT_LEX_UNIT *u); bool send_fields(List &list, uint flag) { return 0; } bool send_data(List &items); diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index f5a5a684fc0..2e565a59ca0 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -232,9 +232,10 @@ multi_delete::multi_delete(THD *thd_arg, TABLE_LIST *dt, int -multi_delete::prepare(List &values) +multi_delete::prepare(List &values, SELECT_LEX_UNIT *u) { DBUG_ENTER("multi_delete::prepare"); + unit= u; do_delete = true; thd->proc_info="deleting from main table"; diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index 79343ef4ae0..41f166c6ad0 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -28,13 +28,13 @@ static const char *any_db="*any*"; // Special symbol for check_access -int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *s, TABLE_LIST *t) +int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t) { /* TODO: make derived tables with union inside (now only 1 SELECT may be procesed) */ - SELECT_LEX *sl= (SELECT_LEX*)s->slave; + SELECT_LEX *sl= (SELECT_LEX*)unit->slave; List item_list; TABLE *table; int res; @@ -75,9 +75,11 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *s, TABLE_LIST *t) } bzero((char*) &tmp_table_param,sizeof(tmp_table_param)); tmp_table_param.field_count=item_list.elements; - if (!(table=create_tmp_table(thd, &tmp_table_param, sl->item_list, - (ORDER*) 0, 0, 1, 0, - (sl->options | thd->options | TMP_TABLE_ALL_COLUMNS)))) + if (!(table= create_tmp_table(thd, &tmp_table_param, sl->item_list, + (ORDER*) 0, 0, 1, 0, + (sl->options | thd->options | + TMP_TABLE_ALL_COLUMNS), + unit))) { res=-1; goto exit; @@ -85,11 +87,11 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *s, TABLE_LIST *t) if ((derived_result=new select_union(table))) { - thd->offset_limit=sl->offset_limit; - thd->select_limit=sl->select_limit+sl->offset_limit; - if (thd->select_limit < sl->select_limit) - thd->select_limit= HA_POS_ERROR; - if (thd->select_limit == HA_POS_ERROR) + unit->offset_limit_cnt= sl->offset_limit; + unit->select_limit_cnt= sl->select_limit+sl->offset_limit; + if (unit->select_limit_cnt < sl->select_limit) + unit->select_limit_cnt= HA_POS_ERROR; + if (unit->select_limit_cnt == HA_POS_ERROR) sl->options&= ~OPTION_FOUND_ROWS; res=mysql_select(thd, tables, sl->item_list, @@ -97,7 +99,7 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *s, TABLE_LIST *t) (ORDER*) sl->group_list.first, sl->having, (ORDER*) NULL, sl->options | thd->options | SELECT_NO_UNLOCK, - derived_result); + derived_result, unit); if (!res) { // Here we entirely fix both TABLE_LIST and list of SELECT's as there were no derived tables diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index 69fc7c00955..2e6c009741e 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -1266,10 +1266,11 @@ bool delayed_insert::handle_inserts(void) ***************************************************************************/ int -select_insert::prepare(List &values) +select_insert::prepare(List &values, SELECT_LEX_UNIT *u) { DBUG_ENTER("select_insert::prepare"); + unit= u; save_time_stamp=table->time_stamp; if (check_insert_fields(thd,table,*fields,values,1)) DBUG_RETURN(1); @@ -1302,9 +1303,9 @@ select_insert::~select_insert() bool select_insert::send_data(List &values) { - if (thd->offset_limit) + if (unit->offset_limit_cnt) { // using limit offset,count - thd->offset_limit--; + unit->offset_limit_cnt--; return 0; } if (fields->elements) @@ -1380,10 +1381,11 @@ bool select_insert::send_eof() ***************************************************************************/ int -select_create::prepare(List &values) +select_create::prepare(List &values, SELECT_LEX_UNIT *u) { DBUG_ENTER("select_create::prepare"); + unit= u; table=create_table_from_items(thd, create_info, db, name, extra_fields, keys, &values, &lock); if (!table) @@ -1413,9 +1415,9 @@ select_create::prepare(List &values) bool select_create::send_data(List &values) { - if (thd->offset_limit) + if (unit->offset_limit_cnt) { // using limit offset,count - thd->offset_limit--; + unit->offset_limit_cnt--; return 0; } fill_record(field,values); diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 3b17c8d498a..bfa06353e30 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -895,14 +895,16 @@ void st_select_lex_node::init_select() order_list.elements= 0; order_list.first= 0; order_list.next= (byte**) &order_list.first; - select_limit= offset_limit= 0; + select_limit= HA_POS_ERROR; + offset_limit= 0; } void st_select_lex_unit::init_query() { st_select_lex_node::init_query(); global_parameters= this; - select_limit_cnt= offset_limit_cnt= 0; + select_limit_cnt= HA_POS_ERROR; + offset_limit_cnt= 0; } void st_select_lex::init_query() diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 4d03701e4f8..4313259aaf3 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1203,11 +1203,12 @@ bool dispatch_command(enum enum_server_command command, THD *thd, void mysql_execute_command(void) { - int res=0; - THD *thd=current_thd; + int res= 0; + THD *thd= current_thd; LEX *lex= &thd->lex; - TABLE_LIST *tables=(TABLE_LIST*) lex->select_lex.table_list.first; - SELECT_LEX *select_lex = lex->select; + TABLE_LIST *tables= (TABLE_LIST*) lex->select_lex.table_list.first; + SELECT_LEX *select_lex= lex->select; + SELECT_LEX_UNIT *unit= &lex->unit; DBUG_ENTER("mysql_execute_command"); if (thd->slave_thread) @@ -1274,11 +1275,11 @@ mysql_execute_command(void) break; // Error message is given } - thd->offset_limit=select_lex->offset_limit; - thd->select_limit=select_lex->select_limit+select_lex->offset_limit; - if (thd->select_limit < select_lex->select_limit) - thd->select_limit= HA_POS_ERROR; // no limit - if (thd->select_limit == HA_POS_ERROR) + unit->offset_limit_cnt =select_lex->offset_limit; + unit->select_limit_cnt =select_lex->select_limit+select_lex->offset_limit; + if (unit->select_limit_cnt < select_lex->select_limit) + unit->select_limit_cnt= HA_POS_ERROR; // no limit + if (unit->select_limit_cnt == HA_POS_ERROR) select_lex->options&= ~OPTION_FOUND_ROWS; if (lex->exchange) @@ -1503,10 +1504,11 @@ mysql_execute_command(void) for (table = tables->next ; table ; table=table->next) table->lock_type= lex->lock_option; } - thd->offset_limit=select_lex->offset_limit; - thd->select_limit=select_lex->select_limit+select_lex->offset_limit; - if (thd->select_limit < select_lex->select_limit) - thd->select_limit= HA_POS_ERROR; // No limit + unit->offset_limit_cnt= select_lex->offset_limit; + unit->select_limit_cnt= select_lex->select_limit+ + select_lex->offset_limit; + if (unit->select_limit_cnt < select_lex->select_limit) + unit->select_limit_cnt= HA_POS_ERROR; // No limit /* Skip first table, which is the table we are creating */ lex->select_lex.table_list.first= @@ -1788,13 +1790,13 @@ mysql_execute_command(void) while ((item=value_list++)) total_list.push_back(item); - res=mysql_select(thd,tables,total_list, - select_lex->where, - (ORDER *)NULL,(ORDER *)NULL,(Item *)NULL, - (ORDER *)NULL, - select_lex->options | thd->options | - SELECT_NO_JOIN_CACHE, - result); + res= mysql_select(thd, tables, total_list, + select_lex->where, + (ORDER *)NULL, (ORDER *)NULL, (Item *)NULL, + (ORDER *)NULL, + select_lex->options | thd->options | + SELECT_NO_JOIN_CACHE, + result, unit); delete result; } else @@ -1844,10 +1846,10 @@ mysql_execute_command(void) } select_result *result; - thd->offset_limit=select_lex->offset_limit; - thd->select_limit=select_lex->select_limit+select_lex->offset_limit; - if (thd->select_limit < select_lex->select_limit) - thd->select_limit= HA_POS_ERROR; // No limit + unit->offset_limit_cnt= select_lex->offset_limit; + unit->select_limit_cnt= select_lex->select_limit+select_lex->offset_limit; + if (unit->select_limit_cnt < select_lex->select_limit) + unit->select_limit_cnt= HA_POS_ERROR; // No limit if (check_dup(tables->db, tables->real_name, tables->next)) { @@ -1963,7 +1965,7 @@ mysql_execute_command(void) (ORDER *)NULL, select_lex->options | thd->options | SELECT_NO_JOIN_CACHE, - result); + result, unit); delete result; } else @@ -2667,8 +2669,10 @@ mysql_init_query(THD *thd) { DBUG_ENTER("mysql_init_query"); thd->lex.unit.init_query(); + thd->lex.unit.init_select(); thd->lex.select_lex.init_query(); thd->lex.unit.slave= &thd->lex.select_lex; + thd->lex.unit.select_limit= thd->default_select_limit; //Global limit thd->lex.select_lex.master= &thd->lex.unit; thd->lex.select_lex.prev= &thd->lex.unit.slave; thd->lex.value_list.empty(); @@ -2716,6 +2720,7 @@ mysql_new_select(LEX *lex, bool move_down) else select_lex->include_neighbour(lex->select); + ((SELECT_LEX_UNIT*)select_lex->master)->global_parameters= select_lex; select_lex->include_global(&lex->select->link_next); lex->select= select_lex; return 0; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 2599fe216c5..d8d9c854652 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -65,7 +65,8 @@ static ORDER *remove_const(JOIN *join,ORDER *first_order,COND *cond, static int return_zero_rows(select_result *res,TABLE_LIST *tables, List &fields, bool send_row, uint select_options, const char *info, - Item *having, Procedure *proc); + Item *having, Procedure *proc, + SELECT_LEX_UNIT *unit); static COND *optimize_cond(COND *conds,Item::cond_result *cond_value); static COND *remove_eq_conds(COND *cond,Item::cond_result *cond_value); static bool const_expression_in_where(COND *conds,Item *item, Item **comp_item); @@ -166,7 +167,7 @@ int handle_select(THD *thd, LEX *lex, select_result *result) select_lex->having, (ORDER*) lex->proc_list.first, select_lex->options | thd->options, - result); + result, &(lex->unit)); if (res && result) result->abort(); delete result; @@ -182,7 +183,8 @@ int handle_select(THD *thd, LEX *lex, select_result *result) int mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, ORDER *order, ORDER *group,Item *having,ORDER *proc_param, - ulong select_options,select_result *result) + ulong select_options,select_result *result, + SELECT_LEX_UNIT *unit) { TABLE *tmp_table; int error, tmp_error; @@ -195,8 +197,8 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, Procedure *procedure; List all_fields(fields); bool select_distinct; - SELECT_LEX *select_lex = &(thd->lex.select_lex); - SELECT_LEX *cur_sel = thd->lex.select; + SELECT_LEX *select_lex= &(thd->lex.select_lex); + SELECT_LEX *cur_sel= thd->lex.select; DBUG_ENTER("mysql_select"); /* Check that all tables, fields, conds and order are ok */ @@ -312,7 +314,8 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, join.do_send_rows = 1; join.group= group != 0; join.row_limit= ((select_distinct || order || group) ? HA_POS_ERROR : - thd->select_limit); + unit->select_limit_cnt); + join.unit= unit; #ifdef RESTRICTED_GROUP if (join.sum_func_count && !group && (join.func_count || join.field_count)) @@ -322,7 +325,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, DBUG_RETURN(-1); } #endif - if (!procedure && result->prepare(fields)) + if (!procedure && result->prepare(fields, unit)) { /* purecov: inspected */ DBUG_RETURN(-1); /* purecov: inspected */ } @@ -351,7 +354,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, delete procedure; DBUG_RETURN(0); } - if (cond_value == Item::COND_FALSE || !thd->select_limit) + if (cond_value == Item::COND_FALSE || !unit->select_limit_cnt) { /* Impossible cond */ if (select_options & SELECT_DESCRIBE && select_lex->next) select_describe(&join,false,false,false,"Impossible WHERE"); @@ -359,7 +362,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, error=return_zero_rows(result, tables, fields, join.tmp_table_param.sum_func_count != 0 && !group, select_options,"Impossible WHERE",having, - procedure); + procedure, unit); delete procedure; DBUG_RETURN(error); } @@ -376,8 +379,8 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, select_describe(&join,false,false,false,"No matching min/max row"); else error=return_zero_rows(result, tables, fields, !group, - select_options,"No matching min/max row", - having,procedure); + select_options, "No matching min/max row", + having, procedure, unit); delete procedure; DBUG_RETURN(error); } @@ -435,9 +438,9 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, if (join.const_table_map != join.found_const_table_map && !(select_options & SELECT_DESCRIBE)) { - error=return_zero_rows(result,tables,fields, - join.tmp_table_param.sum_func_count != 0 && - !group,0,"",having,procedure); + error= return_zero_rows(result, tables, fields, + join.tmp_table_param.sum_func_count != 0 && + !group, 0, "", having, procedure, unit); goto err; } if (!(thd->options & OPTION_BIG_SELECTS) && @@ -483,11 +486,12 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, if (select_options & SELECT_DESCRIBE && select_lex->next) select_describe(&join,false,false,false,"Impossible WHERE noticed after reading const tables"); else - error=return_zero_rows(result,tables,fields, - join.tmp_table_param.sum_func_count != 0 && !group, - select_options, - "Impossible WHERE noticed after reading const tables", - having,procedure); + error= return_zero_rows(result,tables,fields, + join.tmp_table_param.sum_func_count != 0 && + !group, + select_options, + "Impossible WHERE noticed after reading const tables", + having, procedure, unit); goto err; } @@ -501,12 +505,12 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, select_distinct=0; } else if (select_distinct && join.tables - join.const_tables == 1 && - (thd->select_limit == HA_POS_ERROR || + (unit->select_limit_cnt == HA_POS_ERROR || (join.select_options & OPTION_FOUND_ROWS) || order && !(skip_sort_order= test_if_skip_sort_order(&join.join_tab[join.const_tables], - order, thd->select_limit,1)))) + order, unit->select_limit_cnt,1)))) { if ((group=create_distinct_group(order,fields))) { @@ -593,7 +597,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, ((group && join.const_tables != join.tables && (!simple_group || !test_if_skip_sort_order(&join.join_tab[join.const_tables], group, - thd->select_limit,0))) || + unit->select_limit_cnt, 0))) || select_distinct) && join.tmp_table_param.quick_group && !procedure) { @@ -610,7 +614,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, test_if_skip_sort_order(&join.join_tab[join.const_tables], order, (join.const_tables != join.tables - 1 || (join.select_options & OPTION_FOUND_ROWS)) ? - HA_POS_ERROR : thd->select_limit,0)))) + HA_POS_ERROR : unit->select_limit_cnt, 0)))) order=0; select_describe(&join,need_tmp, order != 0 && !skip_sort_order, @@ -637,7 +641,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, group && simple_group, (order == 0 || skip_sort_order) && !(join.select_options & OPTION_FOUND_ROWS), - join.select_options))) + join.select_options, unit))) goto err; /* purecov: inspected */ if (having && (join.sort_and_group || (tmp_table->distinct && !group))) @@ -690,7 +694,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, if (order && skip_sort_order) { (void) test_if_skip_sort_order(&join.join_tab[join.const_tables], - order, thd->select_limit,0); + order, unit->select_limit_cnt, 0); order=0; } } @@ -760,7 +764,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, (ORDER*) 0, select_distinct && !group, 1, 0, - join.select_options))) + join.select_options, unit))) goto err; /* purecov: inspected */ if (group) { @@ -817,9 +821,9 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, if (procedure) { if (procedure->change_columns(fields) || - result->prepare(fields)) + result->prepare(fields, unit)) goto err; - count_field_types(&join.tmp_table_param,all_fields,0); + count_field_types(&join.tmp_table_param, all_fields, 0); } if (join.group || join.tmp_table_param.sum_func_count || (procedure && (procedure->flags & PROC_GROUP))) @@ -864,7 +868,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, (having || group || join.const_tables != join.tables - 1 || (join.select_options & OPTION_FOUND_ROWS)) ? - HA_POS_ERROR : thd->select_limit)) + HA_POS_ERROR : unit->select_limit_cnt)) goto err; /* purecov: inspected */ } join.having=having; // Actually a parameter @@ -2480,7 +2484,8 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond) if ((tab->keys & ~ tab->const_keys && i > 0) || (tab->const_keys && i == join->const_tables && - join->thd->select_limit < join->best_positions[i].records_read && + join->unit->select_limit_cnt < + join->best_positions[i].records_read && !(join->select_options & OPTION_FOUND_ROWS))) { /* Join with outer join condition */ @@ -2491,7 +2496,7 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond) (join->select_options & OPTION_FOUND_ROWS ? HA_POS_ERROR : - join->thd->select_limit)) < 0) + join->unit->select_limit_cnt)) < 0) DBUG_RETURN(1); // Impossible range sel->cond=orig_cond; } @@ -2929,7 +2934,7 @@ remove_const(JOIN *join,ORDER *first_order, COND *cond, bool *simple_order) static int return_zero_rows(select_result *result,TABLE_LIST *tables,List &fields, bool send_row, uint select_options,const char *info, - Item *having, Procedure *procedure) + Item *having, Procedure *procedure, SELECT_LEX_UNIT *unit) { DBUG_ENTER("return_zero_rows"); @@ -2940,7 +2945,7 @@ return_zero_rows(select_result *result,TABLE_LIST *tables,List &fields, } if (procedure) { - if (result->prepare(fields)) // This hasn't been done yet + if (result->prepare(fields, unit)) // This hasn't been done yet DBUG_RETURN(-1); } if (send_row) @@ -3475,7 +3480,8 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, TABLE * create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List &fields, ORDER *group, bool distinct, bool save_sum_fields, - bool allow_distinct_limit, ulong select_options) + bool allow_distinct_limit, ulong select_options, + SELECT_LEX_UNIT *unit) { TABLE *table; uint i,field_count,reclength,null_count,null_pack_length, @@ -3846,8 +3852,8 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List &fields, test(null_pack_length)); if (allow_distinct_limit) { - set_if_smaller(table->max_rows,thd->select_limit); - param->end_write_records=thd->select_limit; + set_if_smaller(table->max_rows, unit->select_limit_cnt); + param->end_write_records= unit->select_limit_cnt; } else param->end_write_records= HA_POS_ERROR; @@ -4892,7 +4898,8 @@ end_send(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), error=join->result->send_data(*join->fields); if (error) DBUG_RETURN(-1); /* purecov: inspected */ - if (++join->send_records >= join->thd->select_limit && join->do_send_rows) + if (++join->send_records >= join->unit->select_limit_cnt && + join->do_send_rows) { if (join->select_options & OPTION_FOUND_ROWS) { @@ -4907,8 +4914,8 @@ end_send(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), } else { - join->do_send_rows=0; - join->thd->select_limit = HA_POS_ERROR; + join->do_send_rows= 0; + join->unit->select_limit= HA_POS_ERROR; DBUG_RETURN(0); } } @@ -4969,13 +4976,13 @@ end_send_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), DBUG_RETURN(-1); /* purecov: inspected */ if (end_of_records) DBUG_RETURN(0); - if (!error && ++join->send_records >= join->thd->select_limit && + if (!error && ++join->send_records >= join->unit->select_limit_cnt && join->do_send_rows) { if (!(join->select_options & OPTION_FOUND_ROWS)) DBUG_RETURN(-3); // Abort nicely join->do_send_rows=0; - join->thd->select_limit = HA_POS_ERROR; + join->unit->select_limit_cnt = HA_POS_ERROR; } } } @@ -5056,7 +5063,7 @@ end_write(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), if (!(join->select_options & OPTION_FOUND_ROWS)) DBUG_RETURN(-3); join->do_send_rows=0; - join->thd->select_limit = HA_POS_ERROR; + join->unit->select_limit_cnt = HA_POS_ERROR; DBUG_RETURN(0); } } @@ -5755,7 +5762,7 @@ remove_duplicates(JOIN *join, TABLE *entry,List &fields, Item *having) if (!field_count) { // only const items - join->thd->select_limit=1; // Only send first row + join->unit->select_limit_cnt= 1; // Only send first row DBUG_RETURN(0); } Field **first_field=entry->field+entry->fields - field_count; diff --git a/sql/sql_select.h b/sql/sql_select.h index befa1efde53..5466974f587 100644 --- a/sql/sql_select.h +++ b/sql/sql_select.h @@ -173,6 +173,8 @@ class JOIN { select_result *result; TMP_TABLE_PARAM tmp_table_param; MYSQL_LOCK *lock; + // unit structure (with global parameters) for this select + SELECT_LEX_UNIT *unit; }; @@ -187,7 +189,8 @@ void TEST_join(JOIN *join); bool store_val_in_field(Field *field,Item *val); TABLE *create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List &fields, ORDER *group, bool distinct, bool save_sum_fields, - bool allow_distinct_limit, ulong select_options); + bool allow_distinct_limit, ulong select_options, + SELECT_LEX_UNIT *unit); void free_tmp_table(THD *thd, TABLE *entry); void count_field_types(TMP_TABLE_PARAM *param, List &fields, bool reset_with_sum_func); diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 7178b857bbc..2eae37a70eb 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -27,8 +27,8 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) { - SELECT_LEX *sl, *last_sl, *lex_sl; - ORDER *order; + SELECT_LEX *sl; + SELECT_LEX_UNIT *unit= &(lex->unit); List item_list; TABLE *table; int describe=(lex->select_lex.options & SELECT_DESCRIBE) ? 1 : 0; @@ -39,12 +39,12 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) TMP_TABLE_PARAM tmp_table_param; select_union *union_result; DBUG_ENTER("mysql_union"); + st_select_lex_node * global; /* Fix tables 'to-be-unioned-from' list to point at opened tables */ - last_sl= &lex->select_lex; - for (sl= last_sl; - sl && sl->linkage != GLOBAL_OPTIONS_TYPE; - last_sl= sl, sl= (SELECT_LEX *) sl->next) + for (sl= &lex->select_lex; + sl; + sl= (SELECT_LEX *) sl->next) { for (TABLE_LIST *cursor= (TABLE_LIST *)sl->table_list.first; cursor; @@ -52,31 +52,13 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) cursor->table= ((TABLE_LIST*) cursor->table)->table; } - /* last_sel now points at the last select where the ORDER BY is stored */ - if (sl) + /* Global option */ + if (((void*)(global= unit->global_parameters)) == ((void*)unit)) { - /* - The found SL is an extra SELECT_LEX argument that contains - the ORDER BY and LIMIT parameter for the whole UNION - */ - lex_sl= sl; - order= (ORDER *) lex_sl->order_list.first; - found_rows_for_union = lex->select_lex.options & OPTION_FOUND_ROWS && !describe && sl->select_limit; + found_rows_for_union = lex->select_lex.options & OPTION_FOUND_ROWS && + !describe && global->select_limit; if (found_rows_for_union) lex->select_lex.options ^= OPTION_FOUND_ROWS; -// This is done to eliminate unnecessary slowing down of the first query - if (!order || !describe) - last_sl->next=0; // Remove this extra element - } - else if (!last_sl->braces) - { - lex_sl= last_sl; // ORDER BY is here - order= (ORDER *) lex_sl->order_list.first; - } - else - { - lex_sl=0; - order=0; } if (describe) @@ -113,11 +95,12 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) bzero((char*) &tmp_table_param,sizeof(tmp_table_param)); tmp_table_param.field_count=item_list.elements; - if (!(table=create_tmp_table(thd, &tmp_table_param, item_list, - (ORDER*) 0, !describe & !lex->union_option, - 1, 0, - (lex->select_lex.options | thd->options | - TMP_TABLE_ALL_COLUMNS)))) + if (!(table= create_tmp_table(thd, &tmp_table_param, item_list, + (ORDER*) 0, !describe & !lex->union_option, + 1, 0, + (lex->select_lex.options | thd->options | + TMP_TABLE_ALL_COLUMNS), + unit))) DBUG_RETURN(-1); table->file->extra(HA_EXTRA_WRITE_CACHE); table->file->extra(HA_EXTRA_IGNORE_DUP_KEY); @@ -136,11 +119,11 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) for (sl= &lex->select_lex; sl; sl= (SELECT_LEX*) sl->next) { lex->select=sl; - thd->offset_limit=sl->offset_limit; - thd->select_limit=sl->select_limit+sl->offset_limit; - if (thd->select_limit < sl->select_limit) - thd->select_limit= HA_POS_ERROR; // no limit - if (thd->select_limit == HA_POS_ERROR) + unit->offset_limit_cnt= sl->offset_limit; + unit->select_limit_cnt= sl->select_limit+sl->offset_limit; + if (unit->select_limit_cnt < sl->select_limit) + unit->select_limit_cnt= HA_POS_ERROR; // no limit + if (unit->select_limit_cnt == HA_POS_ERROR) sl->options&= ~OPTION_FOUND_ROWS; res= mysql_select(thd, @@ -155,7 +138,7 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) (ORDER*) NULL, sl->options | thd->options | SELECT_NO_UNLOCK | ((describe) ? SELECT_DESCRIBE : 0), - union_result); + union_result, unit); if (res) goto exit; } @@ -187,26 +170,20 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) } if (!thd->fatal_error) // Check if EOM { - if (lex_sl) - { - thd->offset_limit=lex_sl->offset_limit; - thd->select_limit=lex_sl->select_limit+lex_sl->offset_limit; - if (thd->select_limit < lex_sl->select_limit) - thd->select_limit= HA_POS_ERROR; // no limit - if (thd->select_limit == HA_POS_ERROR) - thd->options&= ~OPTION_FOUND_ROWS; - } - else - { - thd->offset_limit= 0; - thd->select_limit= thd->default_select_limit; - } + st_select_lex_node * global= unit->global_parameters; + unit->offset_limit_cnt= global->offset_limit; + unit->select_limit_cnt= global->select_limit+global->offset_limit; + if (unit->select_limit_cnt < global->select_limit) + unit->select_limit_cnt= HA_POS_ERROR; // no limit + if (unit->select_limit_cnt == HA_POS_ERROR) + thd->options&= ~OPTION_FOUND_ROWS; if (describe) - thd->select_limit= HA_POS_ERROR; // no limit - res=mysql_select(thd,&result_table_list, - item_list, NULL, (describe) ? 0 : order, - (ORDER*) NULL, NULL, (ORDER*) NULL, - thd->options, result); + unit->select_limit_cnt= HA_POS_ERROR; // no limit + res= mysql_select(thd,&result_table_list, + item_list, NULL, + (describe) ? 0 : (ORDER*)global->order_list.first, + (ORDER*) NULL, NULL, (ORDER*) NULL, + thd->options, result, unit); if (found_rows_for_union && !res) thd->limit_found_rows = (ulonglong)table->file->records; } @@ -230,7 +207,7 @@ select_union::select_union(TABLE *table_par) We can always use DUP_IGNORE because the temporary table will only contain a unique key if we are using not using UNION ALL */ - info.handle_duplicates=DUP_IGNORE; + info.handle_duplicates= DUP_IGNORE; } select_union::~select_union() @@ -238,8 +215,9 @@ select_union::~select_union() } -int select_union::prepare(List &list) +int select_union::prepare(List &list, SELECT_LEX_UNIT *u) { + unit= u; if (save_time_stamp && list.elements != table->fields) { my_message(ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT, @@ -251,9 +229,9 @@ int select_union::prepare(List &list) bool select_union::send_data(List &values) { - if (thd->offset_limit) + if (unit->offset_limit_cnt) { // using limit offset,count - thd->offset_limit--; + unit->offset_limit_cnt--; return 0; } fill_record(table->field,values); diff --git a/sql/sql_update.cc b/sql/sql_update.cc index db520af61c1..7e3d10ee202 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -379,9 +379,10 @@ multi_update::multi_update(THD *thd_arg, TABLE_LIST *ut, List &fs, } int -multi_update::prepare(List &values) +multi_update::prepare(List &values, SELECT_LEX_UNIT *u) { DBUG_ENTER("multi_update::prepare"); + unit= u; do_update = true; thd->count_cuted_fields=1; thd->cuted_fields=0L; @@ -466,15 +467,19 @@ multi_update::prepare(List &values) } if (counter) { - Field_string offset(table_ref->table->file->ref_length,false,"offset",table_ref->table,true); + Field_string offset(table_ref->table->file->ref_length, false, + "offset", table_ref->table, true); temp_fields->push_front(new Item_field(((Field *)&offset))); // Here I make tmp tables int cnt=counter-1; TMP_TABLE_PARAM tmp_table_param; bzero((char*) &tmp_table_param,sizeof(tmp_table_param)); tmp_table_param.field_count=temp_fields->elements; - if (!(tmp_tables[cnt]=create_tmp_table(thd, &tmp_table_param, *temp_fields, - (ORDER*) 0, 1, 0, 0, TMP_TABLE_ALL_COLUMNS))) + if (!(tmp_tables[cnt]=create_tmp_table(thd, &tmp_table_param, + *temp_fields, + (ORDER*) 0, 1, 0, 0, + TMP_TABLE_ALL_COLUMNS, + unit))) { error = 1; // A proper error message is due here DBUG_RETURN(1); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index f9d075b75b3..bd7a5ff3b48 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1449,7 +1449,14 @@ select: select_init: SELECT_SYM select_part2 { Select->braces=false; } union | - '(' SELECT_SYM select_part2 ')' { Select->braces=true;} union_opt + '(' SELECT_SYM select_part2 ')' + { + SELECT_LEX * sel=Select; + sel->braces=true; + /* select in braces, can't contain global parameters */ + ((SELECT_LEX_UNIT*)sel->master)->global_parameters= + sel->master; + } union_opt select_part2: @@ -3826,10 +3833,15 @@ optional_order_or_limit: | { LEX *lex=Lex; - if (!lex->select->braces || mysql_new_select(lex, 0)) + if (!lex->select->braces) YYABORT; - mysql_init_select(lex); - lex->select->linkage= GLOBAL_OPTIONS_TYPE; + ((SELECT_LEX_UNIT*)lex->select->master)->global_parameters= + lex->select->master; + /* + Following type conversion looks like hack, but all that need SELECT_LEX + fields always check linkage type. + */ + lex->select= (SELECT_LEX*)lex->select->master; lex->select->select_limit=lex->thd->default_select_limit; } opt_order_clause limit_clause -- cgit v1.2.1 From 510a4d1da1578c240a37328e82f2dbaae1a7bfc3 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 9 May 2002 12:12:17 +0300 Subject: removed fake description (EXPLAIN) of first table for last SELECT_LEX with global parameters, because now it is absent --- sql/sql_union.cc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 2eae37a70eb..d821c6f6641 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -35,7 +35,6 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) int res; bool found_rows_for_union=false; TABLE_LIST result_table_list; - TABLE_LIST *first_table=(TABLE_LIST *)lex->select_lex.table_list.first; TMP_TABLE_PARAM tmp_table_param; select_union *union_result; DBUG_ENTER("mysql_union"); @@ -127,8 +126,7 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) sl->options&= ~OPTION_FOUND_ROWS; res= mysql_select(thd, - (describe && sl->linkage==GLOBAL_OPTIONS_TYPE) ? - first_table : (TABLE_LIST*) sl->table_list.first, + (TABLE_LIST*) sl->table_list.first, sl->item_list, sl->where, (sl->braces) ? -- cgit v1.2.1 From b69d8dab20811845e41c9f5c770125fd2f3b1a2f Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 9 May 2002 15:23:57 +0300 Subject: total table list managment is changed sql/sql_lex.cc: tabllist creation routine moved to SELECT_LEX_UNION class & made recursive sql/sql_lex.h: list creation routine moved to SELECT_LEX_UNION class sql/sql_parse.cc: list creation routine moved to SELECT_LEX_UNION class anonymous union used for storing TABLE*/TABLE_LIST* sql/sql_union.cc: anonymous union used for storing TABLE*/TABLE_LIST* sql/table.h: anonymous union used for storing TABLE*/TABLE_LIST* --- sql/sql_lex.cc | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ sql/sql_lex.h | 5 ++++ sql/sql_parse.cc | 70 +++------------------------------------------------ sql/sql_union.cc | 2 +- sql/table.h | 10 +++++++- 5 files changed, 95 insertions(+), 68 deletions(-) diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index bfa06353e30..dfa60918665 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -996,3 +996,79 @@ void st_select_lex_node::exclude() master->slave= next; */ } + +/* + This is used for UNION & subselect to create a new table list of all used + tables. + The table_list->table entry in all used tables are set to point + to the entries in this list. +*/ + +// interface +bool st_select_lex_unit::create_total_list(THD *thd, st_lex *lex, + TABLE_LIST **result) +{ + *result= 0; + return create_total_list_n_last_return(thd, lex, &result); +} + +// list creator +bool st_select_lex_unit::create_total_list_n_last_return(THD *thd, st_lex *lex, + TABLE_LIST ***result) +{ + TABLE_LIST *slave_list_first=0, **slave_list_last= &slave_list_first; + TABLE_LIST **new_table_list= *result, *aux; + SELECT_LEX *sl= (SELECT_LEX*)slave; + for (; sl; sl= (SELECT_LEX*)sl->next) + { + // check usage of ORDER BY in union + if (sl->order_list.first && sl->next && !sl->braces) + { + net_printf(&thd->net,ER_WRONG_USAGE,"UNION","ORDER BY"); + return 1; + } + if (sl->slave) + if (((SELECT_LEX_UNIT *) + sl->slave)->create_total_list_n_last_return(thd, lex, + &slave_list_last)) + return 1; + if ((aux= (TABLE_LIST*) sl->table_list.first)) + { + TABLE_LIST *next; + for (; aux; aux= next) + { + TABLE_LIST *cursor; + next= aux->next; + for (cursor= **result; cursor; cursor= cursor->next) + if (!strcmp(cursor->db, aux->db) && + !strcmp(cursor->real_name, aux->real_name) && + !strcmp(cursor->name, aux->name)) + break; + if (!cursor) + { + /* Add not used table to the total table list */ + aux->lock_type= lex->lock_option; + if (!(cursor= (TABLE_LIST *) thd->memdup((char*) aux, + sizeof(*aux)))) + { + send_error(&thd->net,0); + return 1; + } + *new_table_list= cursor; + new_table_list= &cursor->next; + *new_table_list= 0; // end result list + } + else + aux->shared= 1; // Mark that it's used twice + aux->table_list= cursor; + } + } + } + if (slave_list_first) + { + *new_table_list= slave_list_first; + new_table_list= slave_list_last; + } + *result= new_table_list; + return 0; +} diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 7603157f66d..876b9aa2743 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -207,6 +207,7 @@ private: SELECT_LEX_UNIT - unit of selects (UNION, INTERSECT, ...) group SELECT_LEXs */ +struct st_lex; struct st_select_lex_unit: public st_select_lex_node { /* Pointer to 'last' select or pointer to unit where stored @@ -216,6 +217,10 @@ struct st_select_lex_unit: public st_select_lex_node { /* LIMIT clause runtime counters */ ha_rows select_limit_cnt, offset_limit_cnt; void init_query(); + bool create_total_list(THD *thd, st_lex *lex, TABLE_LIST **result); +private: + bool create_total_list_n_last_return(THD *thd, st_lex *lex, + TABLE_LIST ***result); }; typedef struct st_select_lex_unit SELECT_LEX_UNIT; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 4313259aaf3..e9a8ef2f449 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -70,7 +70,6 @@ static void remove_escape(char *name); static void refresh_status(void); static bool append_file_to_dir(THD *thd, char **filename_ptr, char *table_name); -static bool create_total_list(THD *thd, LEX *lex, TABLE_LIST **result); const char *any_db="*any*"; // Special symbol for check_access @@ -1247,7 +1246,8 @@ mysql_execute_command(void) cursor)) DBUG_VOID_RETURN; } - if ((lex->select_lex.next && create_total_list(thd,lex,&tables)) || + if ((lex->select_lex.link_next && + lex->unit.create_total_list(thd, lex, &tables)) || (table_rules_on && tables && thd->slave_thread && !tables_ok(thd,tables))) DBUG_VOID_RETURN; @@ -1942,7 +1942,7 @@ mysql_execute_command(void) goto error; } auxi->lock_type=walk->lock_type=TL_WRITE; - auxi->table= (TABLE *) walk; // Remember corresponding table + auxi->table_list= walk; // Remember corresponding table } tables->grant.want_privilege=(SELECT_ACL & ~tables->grant.privilege); if (add_item_to_list(new Item_null())) @@ -1955,7 +1955,7 @@ mysql_execute_command(void) break; /* Fix tables-to-be-deleted-from list to point at opened tables */ for (auxi=(TABLE_LIST*) aux_tables ; auxi ; auxi=auxi->next) - auxi->table= ((TABLE_LIST*) auxi->table)->table; + auxi->table= auxi->table_list->table; if (!thd->fatal_error && (result=new multi_delete(thd,aux_tables, lex->lock_option,table_count))) { @@ -3193,68 +3193,6 @@ TABLE_LIST *add_table_to_list(Table_ident *table, LEX_STRING *alias, } -/* -** This is used for UNION to create a new table list of all used tables -** The table_list->table entry in all used tables are set to point -** to the entries in this list. -*/ - -static bool create_total_list(THD *thd, LEX *lex, TABLE_LIST **result) -{ - /* Handle the case when we are not using union */ - if (!lex->select_lex.next) - { - *result= (TABLE_LIST*) lex->select_lex.table_list.first; - return 0; - } - - SELECT_LEX *sl; - TABLE_LIST **new_table_list= result, *aux; - - *new_table_list= 0; // end result list - for (sl= &lex->select_lex; sl; sl= (SELECT_LEX *) sl->next) - { - if (sl->order_list.first && sl->next && !sl->braces) - { - net_printf(&thd->net,ER_WRONG_USAGE,"UNION","ORDER BY"); - return 1; - } - if ((aux= (TABLE_LIST*) sl->table_list.first)) - { - TABLE_LIST *next; - for (; aux; aux=next) - { - TABLE_LIST *cursor; - next= aux->next; - for (cursor= *result; cursor; cursor=cursor->next) - if (!strcmp(cursor->db,aux->db) && - !strcmp(cursor->real_name,aux->real_name) && - !strcmp(cursor->name, aux->name)) - break; - if (!cursor) - { - /* Add not used table to the total table list */ - aux->lock_type= lex->lock_option; - if (!(cursor = (TABLE_LIST *) thd->memdup((char*) aux, - sizeof(*aux)))) - { - send_error(&thd->net,0); - return 1; - } - *new_table_list= cursor; - new_table_list= &cursor->next; - *new_table_list=0; // end result list - } - else - aux->shared=1; // Mark that it's used twice - aux->table=(TABLE *) cursor; - } - } - } - return 0; -} - - void add_join_on(TABLE_LIST *b,Item *expr) { if (!b->on_expr) diff --git a/sql/sql_union.cc b/sql/sql_union.cc index d821c6f6641..ef34af6fe1e 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -48,7 +48,7 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) for (TABLE_LIST *cursor= (TABLE_LIST *)sl->table_list.first; cursor; cursor=cursor->next) - cursor->table= ((TABLE_LIST*) cursor->table)->table; + cursor->table= cursor->table_list->table; } /* Global option */ diff --git a/sql/table.h b/sql/table.h index e30e29ddd3f..1c65c2a7ce2 100644 --- a/sql/table.h +++ b/sql/table.h @@ -143,7 +143,15 @@ typedef struct st_table_list { struct st_table_list *natural_join; /* natural join on this table*/ /* ... join ... USE INDEX ... IGNORE INDEX */ List *use_index, *ignore_index; - TABLE *table; + /* + Usually hold reference on opened table, but may hold reference + to node of complete list of tables used in UNION & subselect. + */ + union + { + TABLE *table; /* opened table */ + st_table_list *table_list; /* pointer to node of list of all tables */ + }; GRANT_INFO grant; thr_lock_type lock_type; uint outer_join; /* Which join type */ -- cgit v1.2.1 From 044cbe42ac583969f8339f6974f90e4430371536 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 12 May 2002 23:46:42 +0300 Subject: simple subselects ported to new select_lex structures include/mysqld_error.h: simple subselects libmysqld/Makefile.am: simple subselects sql/Makefile.am: simple subselects sql/item.h: simple subselects sql/item_strfunc.h: simple subselects sql/share/czech/errmsg.txt: simple subselects sql/share/danish/errmsg.txt: simple subselects sql/share/dutch/errmsg.txt: simple subselects sql/share/english/errmsg.txt: simple subselects sql/share/estonian/errmsg.txt: simple subselects sql/share/french/errmsg.txt: simple subselects sql/share/german/errmsg.txt: simple subselects sql/share/greek/errmsg.txt: simple subselects sql/share/hungarian/errmsg.txt: simple subselects sql/share/italian/errmsg.txt: simple subselects sql/share/japanese/errmsg.txt: simple subselects sql/share/korean/errmsg.txt: simple subselects sql/share/norwegian-ny/errmsg.txt: simple subselects sql/share/norwegian/errmsg.txt: simple subselects sql/share/polish/errmsg.txt: simple subselects sql/share/portuguese/errmsg.txt: simple subselects sql/share/romanian/errmsg.txt: simple subselects sql/share/russian/errmsg.txt: simple subselects sql/share/slovak/errmsg.txt: simple subselects sql/share/spanish/errmsg.txt: simple subselects sql/share/swedish/errmsg.txt: simple subselects sql/share/ukrainian/errmsg.txt: simple subselects sql/sql_class.cc: simple subselects sql/sql_class.h: simple subselects sql/sql_lex.cc: simple subselects sql/sql_select.cc: simple subselects sql/sql_select.h: simple subselects sql/sql_union.cc: simple subselects sql/sql_yacc.yy: simple subselects --- include/mysqld_error.h | 4 +- libmysqld/Makefile.am | 3 +- mysql-test/r/subselect.result | 31 + mysql-test/t/subselect.test | 18 + sql/Makefile.am | 4 +- sql/item.h | 6 +- sql/item_strfunc.h | 4 +- sql/item_subselect.cc | 136 ++++ sql/item_subselect.h | 79 ++ sql/share/czech/errmsg.txt | 2 + sql/share/danish/errmsg.txt | 2 + sql/share/dutch/errmsg.txt | 2 + sql/share/english/errmsg.txt | 2 + sql/share/estonian/errmsg.txt | 2 + sql/share/french/errmsg.txt | 2 + sql/share/german/errmsg.txt | 2 + sql/share/greek/errmsg.txt | 2 + sql/share/hungarian/errmsg.txt | 2 + sql/share/italian/errmsg.txt | 2 + sql/share/japanese/errmsg.txt | 2 + sql/share/korean/errmsg.txt | 2 + sql/share/norwegian-ny/errmsg.txt | 2 + sql/share/norwegian/errmsg.txt | 2 + sql/share/polish/errmsg.txt | 2 + sql/share/portuguese/errmsg.txt | 2 + sql/share/romanian/errmsg.txt | 2 + sql/share/russian/errmsg.txt | 2 + sql/share/slovak/errmsg.txt | 2 + sql/share/spanish/errmsg.txt | 2 + sql/share/swedish/errmsg.txt | 2 + sql/share/ukrainian/errmsg.txt | 2 + sql/sql_class.cc | 27 + sql/sql_class.h | 13 + sql/sql_lex.cc | 1 + sql/sql_select.cc | 732 +++++++++-------- sql/sql_select.cc.rej | 1576 +++++++++++++++++++++++++++++++++++++ sql/sql_select.h | 67 +- sql/sql_select.h.rej | 96 +++ sql/sql_union.cc | 11 - sql/sql_yacc.yy | 36 +- 40 files changed, 2540 insertions(+), 348 deletions(-) create mode 100644 mysql-test/r/subselect.result create mode 100644 mysql-test/t/subselect.test create mode 100644 sql/item_subselect.cc create mode 100644 sql/item_subselect.h create mode 100644 sql/sql_select.cc.rej create mode 100644 sql/sql_select.h.rej diff --git a/include/mysqld_error.h b/include/mysqld_error.h index c910078331e..4c08bc77e8f 100644 --- a/include/mysqld_error.h +++ b/include/mysqld_error.h @@ -243,4 +243,6 @@ #define ER_MIXING_NOT_ALLOWED 1224 #define ER_DUP_ARGUMENT 1225 #define ER_USER_LIMIT_REACHED 1226 -#define ER_ERROR_MESSAGES 227 +#define ER_SUBSELECT_NO_1_COL 1227 +#define ER_SUBSELECT_NO_1_ROW 1228 +#define ER_ERROR_MESSAGES 229 diff --git a/libmysqld/Makefile.am b/libmysqld/Makefile.am index c98e1c7e973..ee35011db3a 100644 --- a/libmysqld/Makefile.am +++ b/libmysqld/Makefile.am @@ -43,7 +43,8 @@ sqlsources = convert.cc derror.cc field.cc field_conv.cc filesort.cc \ hostname.cc init.cc \ item.cc item_buff.cc item_cmpfunc.cc item_create.cc \ item_func.cc item_strfunc.cc item_sum.cc item_timefunc.cc \ - item_uniq.cc key.cc lock.cc log.cc log_event.cc mf_iocache.cc\ + item_uniq.cc item_subselect.cc \ + key.cc lock.cc log.cc log_event.cc mf_iocache.cc\ mini_client.cc net_pkg.cc net_serv.cc opt_ft.cc opt_range.cc \ opt_sum.cc procedure.cc records.cc sql_acl.cc \ repl_failsafe.cc slave.cc \ diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result new file mode 100644 index 00000000000..ba705504970 --- /dev/null +++ b/mysql-test/r/subselect.result @@ -0,0 +1,31 @@ +drop table if exists t1,t2,t3,t4; +create table t1 (a int); +create table t2 (a int, b int); +create table t3 (a int); +create table t4 (a int, b int); +insert into t1 values (2); +insert into t2 values (1,7),(2,7); +insert into t4 values (4,8),(3,8),(5,9); +select (select a from t1), a from t2; +(select a from t1) a +2 1 +2 2 +select (select a from t3), a from t2; +(select a from t3) a +NULL 1 +NULL 2 +select * from t2 where t2.a=(select a from t1); +a b +2 7 +insert into t3 values (6),(7),(3); +select * from t2 where t2.b=(select a from t3 order by 1 limit 1); +a b +1 7 +2 7 +select * from t2 where t2.b=(select a from t3 order by 1 limit 1) +union (select * from t4 order by a limit 2) limit 3; +a b +1 7 +2 7 +3 8 +drop table t1,t2,t3,t4; diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test new file mode 100644 index 00000000000..3bd92ef41de --- /dev/null +++ b/mysql-test/t/subselect.test @@ -0,0 +1,18 @@ + +#select (select 2); +drop table if exists t1,t2,t3,t4; +create table t1 (a int); +create table t2 (a int, b int); +create table t3 (a int); +create table t4 (a int, b int); +insert into t1 values (2); +insert into t2 values (1,7),(2,7); +insert into t4 values (4,8),(3,8),(5,9); +select (select a from t1), a from t2; +select (select a from t3), a from t2; +select * from t2 where t2.a=(select a from t1); +insert into t3 values (6),(7),(3); +select * from t2 where t2.b=(select a from t3 order by 1 limit 1); +select * from t2 where t2.b=(select a from t3 order by 1 limit 1) +union (select * from t4 order by a limit 2) limit 3; +drop table t1,t2,t3,t4; diff --git a/sql/Makefile.am b/sql/Makefile.am index f58075358b6..bd626ea10b7 100644 --- a/sql/Makefile.am +++ b/sql/Makefile.am @@ -46,7 +46,7 @@ mysqld_LDADD = @MYSQLD_EXTRA_LDFLAGS@ \ $(LDADD) $(CXXLDFLAGS) $(WRAPLIBS) @LIBDL@ @openssl_libs@ noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \ item_strfunc.h item_timefunc.h item_uniq.h \ - item_create.h mysql_priv.h \ + item_create.h item_subselect.h mysql_priv.h \ procedure.h sql_class.h sql_lex.h sql_list.h \ sql_manager.h sql_map.h sql_string.h unireg.h \ field.h handler.h \ @@ -60,7 +60,7 @@ noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \ mysqld_SOURCES = sql_lex.cc sql_handler.cc \ item.cc item_sum.cc item_buff.cc item_func.cc \ item_cmpfunc.cc item_strfunc.cc item_timefunc.cc \ - thr_malloc.cc item_create.cc \ + thr_malloc.cc item_create.cc item_subselect.cc\ field.cc key.cc sql_class.cc sql_list.cc \ net_serv.cc net_pkg.cc lock.cc my_lock.c \ sql_string.cc sql_manager.cc sql_map.cc \ diff --git a/sql/item.h b/sql/item.h index 97f2862bb8b..2bd1cb99bf5 100644 --- a/sql/item.h +++ b/sql/item.h @@ -32,7 +32,8 @@ public: enum Type {FIELD_ITEM,FUNC_ITEM,SUM_FUNC_ITEM,STRING_ITEM, INT_ITEM,REAL_ITEM,NULL_ITEM,VARBIN_ITEM, COPY_STR_ITEM,FIELD_AVG_ITEM, - PROC_ITEM,COND_ITEM,REF_ITEM,FIELD_STD_ITEM, CONST_ITEM}; + PROC_ITEM,COND_ITEM,REF_ITEM,FIELD_STD_ITEM, CONST_ITEM, + SUBSELECT_ITEM}; enum cond_result { COND_UNDEF,COND_OK,COND_TRUE,COND_FALSE }; String str_value; /* used to store value */ @@ -46,7 +47,6 @@ public: my_bool unsigned_flag; my_bool with_sum_func; - // alloc & destruct is done as start of select using sql_alloc Item(); virtual ~Item() { name=0; } /*lint -e1509 */ @@ -371,6 +371,7 @@ public: #include "item_strfunc.h" #include "item_timefunc.h" #include "item_uniq.h" +#include "item_subselect.h" class Item_copy_string :public Item { @@ -458,3 +459,4 @@ extern Item_result item_cmp_type(Item_result a,Item_result b); extern Item *resolve_const_item(Item *item,Item *cmp_item); extern bool field_is_equal_to_item(Field *field,Item *item); Item *get_system_var(LEX_STRING name); + diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index 091289fd040..350c4b3d793 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -38,7 +38,9 @@ public: Field *tmp_table_field(TABLE *t_arg) { if (!t_arg) return result_field; - return (max_length > 255) ? (Field *)new Field_blob(max_length,maybe_null, name,t_arg, binary) : (Field *) new Field_string(max_length,maybe_null, name,t_arg, binary); + return (max_length > 255) ? + (Field *) new Field_blob(max_length,maybe_null, name,t_arg, binary) : + (Field *) new Field_string(max_length,maybe_null, name,t_arg, binary); } }; diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc new file mode 100644 index 00000000000..286c29fec7a --- /dev/null +++ b/sql/item_subselect.cc @@ -0,0 +1,136 @@ +/* Copyright (C) 2000 MySQL AB + + 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; either version 2 of the License, or + (at your option) any later version. + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + subselect Item + +SUBSELECT TODO: + - add function from mysql_select that use JOIN* as parameter to JOIN methods + (sql_select.h/sql_select.cc) + - remove double 'having' & 'having_list' from JOIN + (sql_select.h/sql_select.cc) + + - add subselect union select (sql_union.cc) + - depended from outer select subselects + +*/ + +#ifdef __GNUC__ +#pragma implementation // gcc: Class implementation +#endif + +#include "mysql_priv.h" +#include "sql_select.h" + +Item_subselect::Item_subselect(THD *thd, st_select_lex *select_lex): + executed(0) +{ + DBUG_ENTER("Item_subselect::Item_subselect"); + DBUG_PRINT("subs", ("select_lex 0x%xl", (long) select_lex)); + result= new select_subselect(this); + join= new JOIN(thd, select_lex->item_list, select_lex->options, result); + this->select_lex= select_lex; + maybe_null= 1; + /* + item value is NULL if select_subselect not changed this value + (i.e. some rows will be found returned) + */ + assign_null(); + DBUG_VOID_RETURN; +} + +Item::Type Item_subselect::type() const +{ + return SUBSELECT_ITEM; +} + +double Item_subselect::val () +{ + if (exec()) + return 0; + return real_value; +} + +longlong Item_subselect::val_int () +{ + if (exec()) + return 0; + return int_value; +} + +String *Item_subselect::val_str (String *str) +{ + if (exec() || null_value) + return 0; + return &str_value; +} + +void Item_subselect::make_field (Send_field *tmp_field) +{ + if (null_value) + { + init_make_field(tmp_field,FIELD_TYPE_NULL); + tmp_field->length=4; + } else { + init_make_field(tmp_field, ((result_type() == STRING_RESULT) ? + FIELD_TYPE_VAR_STRING : + (result_type() == INT_RESULT) ? + FIELD_TYPE_LONGLONG : FIELD_TYPE_DOUBLE)); + } +} + +bool Item_subselect::fix_fields(THD *thd,TABLE_LIST *tables) +{ + // Is it one field subselect? + if (select_lex->item_list.elements != 1) + { + my_printf_error(ER_SUBSELECT_NO_1_COL, ER(ER_SUBSELECT_NO_1_COL), MYF(0)); + return 1; + } + SELECT_LEX *save_select= thd->lex.select; + thd->lex.select= select_lex; + if(join->prepare((TABLE_LIST*) select_lex->table_list.first, + select_lex->where, + (ORDER*) select_lex->order_list.first, + (ORDER*) select_lex->group_list.first, + select_lex->having, + (ORDER*) 0, select_lex, + (SELECT_LEX_UNIT*) select_lex->master)) + return 1; + if (join->optimize()) + { + executed= 1; + return 1; + } + thd->lex.select= save_select; + return 0; +} + +int Item_subselect::exec() +{ + if (!executed) + { + SELECT_LEX *save_select= join->thd->lex.select; + join->thd->lex.select= select_lex; + join->exec(); + join->thd->lex.select= save_select; + if (!executed) + //No rows returned => value is null (returned as inited) + executed= 1; + return join->error; + } + return 0; +} diff --git a/sql/item_subselect.h b/sql/item_subselect.h new file mode 100644 index 00000000000..096da68600c --- /dev/null +++ b/sql/item_subselect.h @@ -0,0 +1,79 @@ +/* Copyright (C) 2000 MySQL AB + + 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; either version 2 of the License, or + (at your option) any later version. + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* subselect Item */ + +#ifdef __GNUC__ +#pragma interface /* gcc class implementation */ +#endif + +struct st_select_lex; +class JOIN; +class select_subselect; + +/* simple (not depended of covered select ) subselect */ + +class Item_subselect :public Item +{ +protected: + my_bool executed; /* simple subselect is executed */ + longlong int_value; + double real_value; + enum Item_result res_type; + + int exec(); + void assign_null() + { + null_value= 1; + int_value= 0; + real_value= 0; + max_length= 4; + res_type= STRING_RESULT; + } +public: + st_select_lex *select_lex; + JOIN *join; + select_subselect *result; + + Item_subselect(THD *thd, st_select_lex *select_lex); + Item_subselect(Item_subselect *item) + { + null_value= item->null_value; + int_value= item->int_value; + real_value= item->real_value; + max_length= item->max_length; + decimals= item->decimals; + res_type= item->res_type; + executed= item->executed; + select_lex= item->select_lex; + join= item->join; + result= item->result; + name= item->name; + } + enum Type type() const; + double val (); + longlong val_int (); + String *val_str (String *); + bool is_null() { return null_value; } + void make_field (Send_field *); + bool fix_fields(THD *thd, TABLE_LIST *tables); + Item *new_item() { return new Item_subselect(this); } + enum Item_result result_type() const { return res_type; } + + friend class select_subselect; +}; + + diff --git a/sql/share/czech/errmsg.txt b/sql/share/czech/errmsg.txt index 950ca4f6623..f654f2a2240 100644 --- a/sql/share/czech/errmsg.txt +++ b/sql/share/czech/errmsg.txt @@ -237,3 +237,5 @@ "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", "User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"Subselect return more than 1 field", +"Subselect return more than 1 record", diff --git a/sql/share/danish/errmsg.txt b/sql/share/danish/errmsg.txt index d87ed4ee629..cb9912d5783 100644 --- a/sql/share/danish/errmsg.txt +++ b/sql/share/danish/errmsg.txt @@ -231,3 +231,5 @@ "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", "User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"Subselect return more than 1 field", +"Subselect return more than 1 record", diff --git a/sql/share/dutch/errmsg.txt b/sql/share/dutch/errmsg.txt index c8b47cb3c19..be4cd7d7896 100644 --- a/sql/share/dutch/errmsg.txt +++ b/sql/share/dutch/errmsg.txt @@ -236,3 +236,5 @@ "Het combineren van transactionele en niet-transactionele tabellen is uitgeschakeld.", "Optie '%s' tweemaal gebruikt in opdracht", "Gebruiker '%-64s' heeft het maximale gebruik van de '%s' faciliteit overschreden (huidige waarde: %ld)", +"Subselect return more than 1 field", +"Subselect return more than 1 record", diff --git a/sql/share/english/errmsg.txt b/sql/share/english/errmsg.txt index 5033449c266..533a305cd1d 100644 --- a/sql/share/english/errmsg.txt +++ b/sql/share/english/errmsg.txt @@ -228,3 +228,5 @@ "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", "User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"Subselect return more than 1 field", +"Subselect return more than 1 record", diff --git a/sql/share/estonian/errmsg.txt b/sql/share/estonian/errmsg.txt index 6a83468eae5..d303cf22102 100644 --- a/sql/share/estonian/errmsg.txt +++ b/sql/share/estonian/errmsg.txt @@ -233,3 +233,5 @@ "Transaktsioone toetavate ning mittetoetavate tabelite kooskasutamine ei ole lubatud", "Määrangut '%s' on lauses kasutatud topelt", "User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"Subselect return more than 1 field", +"Subselect return more than 1 record", diff --git a/sql/share/french/errmsg.txt b/sql/share/french/errmsg.txt index cf3e3e845e4..cae31a7c799 100644 --- a/sql/share/french/errmsg.txt +++ b/sql/share/french/errmsg.txt @@ -228,3 +228,5 @@ "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", "User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"Subselect return more than 1 field", +"Subselect return more than 1 record", diff --git a/sql/share/german/errmsg.txt b/sql/share/german/errmsg.txt index 19d46fabab8..8f3b59da035 100644 --- a/sql/share/german/errmsg.txt +++ b/sql/share/german/errmsg.txt @@ -231,3 +231,5 @@ "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", "User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"Subselect return more than 1 field", +"Subselect return more than 1 record", diff --git a/sql/share/greek/errmsg.txt b/sql/share/greek/errmsg.txt index f9b4f137f82..f6c92f7c27c 100644 --- a/sql/share/greek/errmsg.txt +++ b/sql/share/greek/errmsg.txt @@ -228,3 +228,5 @@ "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", "User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"Subselect return more than 1 field", +"Subselect return more than 1 record", diff --git a/sql/share/hungarian/errmsg.txt b/sql/share/hungarian/errmsg.txt index 38877371243..1dd72efc63a 100644 --- a/sql/share/hungarian/errmsg.txt +++ b/sql/share/hungarian/errmsg.txt @@ -230,3 +230,5 @@ "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", "User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"Subselect return more than 1 field", +"Subselect return more than 1 record", diff --git a/sql/share/italian/errmsg.txt b/sql/share/italian/errmsg.txt index e8cfd5a63a9..e658bc2975e 100644 --- a/sql/share/italian/errmsg.txt +++ b/sql/share/italian/errmsg.txt @@ -228,3 +228,5 @@ "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", "User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"Subselect return more than 1 field", +"Subselect return more than 1 record", diff --git a/sql/share/japanese/errmsg.txt b/sql/share/japanese/errmsg.txt index 98bc099954f..55fe7d79768 100644 --- a/sql/share/japanese/errmsg.txt +++ b/sql/share/japanese/errmsg.txt @@ -230,3 +230,5 @@ "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", "User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"Subselect return more than 1 field", +"Subselect return more than 1 record", diff --git a/sql/share/korean/errmsg.txt b/sql/share/korean/errmsg.txt index f6cc890cb39..38d9416edc9 100644 --- a/sql/share/korean/errmsg.txt +++ b/sql/share/korean/errmsg.txt @@ -228,3 +228,5 @@ "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", "User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"Subselect return more than 1 field", +"Subselect return more than 1 record", diff --git a/sql/share/norwegian-ny/errmsg.txt b/sql/share/norwegian-ny/errmsg.txt index adffc27949f..c84e8242778 100644 --- a/sql/share/norwegian-ny/errmsg.txt +++ b/sql/share/norwegian-ny/errmsg.txt @@ -230,3 +230,5 @@ "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", "User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"Subselect return more than 1 field", +"Subselect return more than 1 record", diff --git a/sql/share/norwegian/errmsg.txt b/sql/share/norwegian/errmsg.txt index 09a1ea4684c..dae9cf927c5 100644 --- a/sql/share/norwegian/errmsg.txt +++ b/sql/share/norwegian/errmsg.txt @@ -230,3 +230,5 @@ "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", "User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"Subselect return more than 1 field", +"Subselect return more than 1 record", diff --git a/sql/share/polish/errmsg.txt b/sql/share/polish/errmsg.txt index 12a9bd358b5..312ae153cbe 100644 --- a/sql/share/polish/errmsg.txt +++ b/sql/share/polish/errmsg.txt @@ -232,3 +232,5 @@ "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", "User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"Subselect return more than 1 field", +"Subselect return more than 1 record", diff --git a/sql/share/portuguese/errmsg.txt b/sql/share/portuguese/errmsg.txt index b7feb0a7b0d..6dca23872e2 100644 --- a/sql/share/portuguese/errmsg.txt +++ b/sql/share/portuguese/errmsg.txt @@ -228,3 +228,5 @@ "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", "User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"Subselect return more than 1 field", +"Subselect return more than 1 record", diff --git a/sql/share/romanian/errmsg.txt b/sql/share/romanian/errmsg.txt index 8e48cabfc39..6e89a0119e2 100644 --- a/sql/share/romanian/errmsg.txt +++ b/sql/share/romanian/errmsg.txt @@ -232,3 +232,5 @@ "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", "User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"Subselect return more than 1 field", +"Subselect return more than 1 record", diff --git a/sql/share/russian/errmsg.txt b/sql/share/russian/errmsg.txt index 8ed33ec21a0..5df743b0dbf 100644 --- a/sql/share/russian/errmsg.txt +++ b/sql/share/russian/errmsg.txt @@ -231,3 +231,5 @@ "ïÄÎÏ×ÒÅÍÅÎÎÏÅ ÉÓÐÏÌØÚÏ×ÁÎÉÅ transactional É non-transactional ÔÁÂÌÉà ÏÔËÌÀÞÅÎÏ", "ïÐÃÉÑ '%s' ÉÓÐÏÌØÚÏ×ÁÎÁ Ä×ÁÖÄÙ", "User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"ðÏÄÚÁÐÒÏÓ ×ÏÚ×ÒÁÝÁÅÔ ÂÏÌÅÅ ÏÄÎÏÇÏ ÐÏÌÑ", +"ðÏÄÚÁÐÒÏÓ ×ÏÚ×ÒÁÝÁÅÔ ÂÏÌÅÅ ÏÄÎÏÊ ÚÁÐÉÓÉ", diff --git a/sql/share/slovak/errmsg.txt b/sql/share/slovak/errmsg.txt index 06503cdf69e..37a2d30e1ae 100644 --- a/sql/share/slovak/errmsg.txt +++ b/sql/share/slovak/errmsg.txt @@ -236,3 +236,5 @@ "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", "User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"Subselect return more than 1 field", +"Subselect return more than 1 record", diff --git a/sql/share/spanish/errmsg.txt b/sql/share/spanish/errmsg.txt index 4240581c5b8..2e371e75cbd 100644 --- a/sql/share/spanish/errmsg.txt +++ b/sql/share/spanish/errmsg.txt @@ -229,3 +229,5 @@ "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", "User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"Subselect return more than 1 field", +"Subselect return more than 1 record", diff --git a/sql/share/swedish/errmsg.txt b/sql/share/swedish/errmsg.txt index e774f4a2c5c..58c8e5af54f 100644 --- a/sql/share/swedish/errmsg.txt +++ b/sql/share/swedish/errmsg.txt @@ -228,3 +228,5 @@ "Blandning av transaktionella och icke-transaktionella tabeller är inaktiverat", "Option '%s' användes två gånger", "Användare '%-64s' har överskridit '%s' (nuvarande värde: %ld)", +"Subselect return more than 1 field", +"Subselect return more than 1 record", diff --git a/sql/share/ukrainian/errmsg.txt b/sql/share/ukrainian/errmsg.txt index c4c89433331..4dad29345e5 100644 --- a/sql/share/ukrainian/errmsg.txt +++ b/sql/share/ukrainian/errmsg.txt @@ -233,3 +233,5 @@ "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", "User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"ðiÄÚÁÐÉÔ ÐÏ×ÅÒÔÁ¤ ÂiÌØÛ ÎiÖ 1 ÓÔÏ×ÂÅÃØ", +"ðiÄÚÁÐÉÔ ÐÏ×ÅÒÔÁ¤ ÂiÌØÛ ÎiÖ 1 ÚÁÐÉÓ", diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 6be0e46679b..95c10112a9b 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -774,3 +774,30 @@ bool select_dump::send_eof() file= -1; return error; } + +select_subselect::select_subselect(Item_subselect *item) +{ + this->item=item; +} + +bool select_subselect::send_data(List &items) +{ + if (item->executed){ + my_printf_error(ER_SUBSELECT_NO_1_ROW, ER(ER_SUBSELECT_NO_1_ROW), MYF(0)); + return 1; + } + Item *val_item= (Item *)item->select_lex->item_list.head(); + if ((item->null_value= val_item->is_null())) + { + item->assign_null(); + } else { + item->max_length= val_item->max_length; + item->decimals= val_item->decimals; + item->binary= val_item->binary; + val_item->val_str(&item->str_value); + item->int_value= val_item->val_int(); + item->real_value= val_item->val(); + item->res_type= val_item->result_type(); + } + return 0; +} diff --git a/sql/sql_class.h b/sql/sql_class.h index d4bd65674f1..10d6bf84b22 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -685,6 +685,19 @@ class select_union :public select_result { bool flush(); }; +/* Single value subselect interface class */ +class select_subselect :public select_result +{ + Item_subselect *item; +public: + select_subselect(Item_subselect *item); + bool send_fields(List &list, uint flag) { return 0; }; + bool send_data(List &items); + bool send_eof() { return 0; }; + + friend class Ttem_subselect; +}; + /* Structs used when sorting */ typedef struct st_sort_field { diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index dfa60918665..134e776a15a 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -901,6 +901,7 @@ void st_select_lex_node::init_select() void st_select_lex_unit::init_query() { + linkage= GLOBAL_OPTIONS_TYPE; st_select_lex_node::init_query(); global_parameters= this; select_limit_cnt= HA_POS_ERROR; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index d8d9c854652..c5e5e971e33 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -156,6 +156,19 @@ int handle_select(THD *thd, LEX *lex, select_result *result) { int res; register SELECT_LEX *select_lex = &lex->select_lex; + if (select_lex->link_next) + { + /* Fix tables 'to-be-unioned-from' list to point at opened tables */ + for (SELECT_LEX *sl= select_lex; + sl; + sl= (SELECT_LEX*)sl->link_next) + { + for (TABLE_LIST *cursor= (TABLE_LIST *)sl->table_list.first; + cursor; + cursor=cursor->next) + cursor->table= cursor->table_list->table; + } + } if (select_lex->next) res=mysql_union(thd,lex,result); else @@ -180,50 +193,42 @@ int handle_select(THD *thd, LEX *lex, select_result *result) ** mysql_select assumes that all tables are already opened *****************************************************************************/ +/* + Prepare of whole select (including subselect in future). + return -1 on error + 0 on success +*/ int -mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, - ORDER *order, ORDER *group,Item *having,ORDER *proc_param, - ulong select_options,select_result *result, - SELECT_LEX_UNIT *unit) +JOIN::prepare(TABLE_LIST *tables_init, + COND *conds_init, ORDER *order_init, ORDER *group_init, + Item *having_init, + ORDER *proc_param_init, SELECT_LEX *select, SELECT_LEX_UNIT *unit) { - TABLE *tmp_table; - int error, tmp_error; - bool need_tmp,hidden_group_fields; - bool simple_order,simple_group,no_order, skip_sort_order, buffer_result; - Item::cond_result cond_value; - SQL_SELECT *select; - DYNAMIC_ARRAY keyuse; - JOIN join; - Procedure *procedure; - List all_fields(fields); - bool select_distinct; - SELECT_LEX *select_lex= &(thd->lex.select_lex); - SELECT_LEX *cur_sel= thd->lex.select; - DBUG_ENTER("mysql_select"); + DBUG_ENTER("JOIN::prepare"); - /* Check that all tables, fields, conds and order are ok */ + conds= conds_init; + order= order_init; + group_list= group_init; + having= having_init; + proc_param= proc_param_init; + tables_list= tables_init; + select_lex= select; - select_distinct=test(select_options & SELECT_DISTINCT); - buffer_result=test(select_options & OPTION_BUFFER_RESULT) && !test(select_options & OPTION_FOUND_ROWS); - tmp_table=0; - select=0; - no_order=skip_sort_order=0; - bzero((char*) &keyuse,sizeof(keyuse)); - thd->proc_info="init"; - thd->used_tables=0; // Updated by setup_fields + /* Check that all tables, fields, conds and order are ok */ - if (setup_tables(tables) || - setup_fields(thd,tables,fields,1,&all_fields,1) || - setup_conds(thd,tables,&conds) || - setup_order(thd,tables,fields,all_fields,order) || - setup_group(thd,tables,fields,all_fields,group,&hidden_group_fields)) + if (setup_tables(tables_list) || + setup_fields(thd,tables_list,fields_list,1,&all_fields,1) || + setup_conds(thd,tables_list,&conds) || + setup_order(thd,tables_list,fields_list,all_fields,order) || + setup_group(thd,tables_list,fields_list,all_fields,group_list, + &hidden_group_fields)) DBUG_RETURN(-1); /* purecov: inspected */ if (having) { thd->where="having clause"; thd->allow_sum_func=1; - if (having->fix_fields(thd,tables) || thd->fatal_error) + if (having->fix_fields(thd,tables_list) || thd->fatal_error) DBUG_RETURN(-1); /* purecov: inspected */ if (having->with_sum_func) having->split_sum_func(all_fields); @@ -236,13 +241,11 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, TODO: Add check of calculation of GROUP functions and fields: SELECT COUNT(*)+table.col1 from table1; */ - join.table=0; - join.tables=0; { - if (!group) + if (!group_list) { uint flag=0; - List_iterator_fast it(fields); + List_iterator_fast it(fields_list); Item *item; while ((item= it++)) { @@ -258,22 +261,23 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, } } TABLE_LIST *table; - for (table=tables ; table ; table=table->next) - join.tables++; + for (table=tables_list ; table ; table=table->next) + tables++; } - procedure=setup_procedure(thd,proc_param,result,fields,&error); + procedure=setup_procedure(thd,proc_param,result,fields_list,&error); if (error) DBUG_RETURN(-1); /* purecov: inspected */ if (procedure) { - if (setup_new_fields(thd,tables,fields,all_fields,procedure->param_fields)) + if (setup_new_fields(thd, tables_list, fields_list, all_fields, + procedure->param_fields)) { /* purecov: inspected */ delete procedure; /* purecov: inspected */ DBUG_RETURN(-1); /* purecov: inspected */ } if (procedure->group) { - if (!test_if_subpart(procedure->group,group)) + if (!test_if_subpart(procedure->group,group_list)) { /* purecov: inspected */ my_message(0,"Can't handle procedures with differents groups yet", MYF(0)); /* purecov: inspected */ @@ -282,7 +286,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, } } #ifdef NOT_NEEDED - else if (!group && procedure->flags & PROC_GROUP) + else if (!group_list && procedure->flags & PROC_GROUP) { my_message(0,"Select must have a group with this procedure",MYF(0)); delete procedure; @@ -298,52 +302,54 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, } /* Init join struct */ - join.thd=thd; - join.lock=thd->lock; - join.join_tab=0; - join.tmp_table_param.copy_field=0; - join.sum_funcs=0; - join.send_records=join.found_records=join.examined_rows=0; - join.tmp_table_param.end_write_records= HA_POS_ERROR; - join.first_record=join.sort_and_group=0; - join.select_options=select_options; - join.result=result; - count_field_types(&join.tmp_table_param,all_fields,0); - join.const_tables=0; - join.having=0; - join.do_send_rows = 1; - join.group= group != 0; - join.row_limit= ((select_distinct || order || group) ? HA_POS_ERROR : - unit->select_limit_cnt); - join.unit= unit; + count_field_types(&tmp_table_param, all_fields, 0); + this->group= group_list != 0; + row_limit= ((select_distinct || order || group_list) ? HA_POS_ERROR : + unit->select_limit_cnt); + this->unit= unit; #ifdef RESTRICTED_GROUP - if (join.sum_func_count && !group && (join.func_count || join.field_count)) + if (sum_func_count && !group_list && (func_count || field_count)) { my_message(ER_WRONG_SUM_SELECT,ER(ER_WRONG_SUM_SELECT),MYF(0)); delete procedure; DBUG_RETURN(-1); } #endif - if (!procedure && result->prepare(fields, unit)) + if (!procedure && result->prepare(fields_list, unit)) { /* purecov: inspected */ DBUG_RETURN(-1); /* purecov: inspected */ } + DBUG_RETURN(0); // All OK +} + +/* + global select optimisation. + return 0 - success + 1 - go out + -1 - go out with cleaning + error code saved in field 'error' +*/ +int +JOIN::optimize() +{ + DBUG_ENTER("JOIN::optimize"); + SELECT_LEX *select_lex = &(thd->lex.select_lex); #ifdef HAVE_REF_TO_FIELDS // Not done yet /* Add HAVING to WHERE if possible */ - if (having && !group && ! join.sum_func_count) + if (having && !group_list && ! sum_func_count) { if (!conds) { - conds=having; - having=0; + conds= having; + having= 0; } else if ((conds=new Item_cond_and(conds,having))) { - conds->fix_fields(thd,tables); - conds->change_ref_to_fields(thd,tables); - having=0; + conds->fix_fields(thd, tables_list); + conds->change_ref_to_fields(thd, tables_list); + having= 0; } } #endif @@ -352,110 +358,76 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, if (thd->fatal_error) // Out of memory { delete procedure; - DBUG_RETURN(0); + error = 0; + DBUG_RETURN(1); } if (cond_value == Item::COND_FALSE || !unit->select_limit_cnt) { /* Impossible cond */ - if (select_options & SELECT_DESCRIBE && select_lex->next) - select_describe(&join,false,false,false,"Impossible WHERE"); - else - error=return_zero_rows(result, tables, fields, - join.tmp_table_param.sum_func_count != 0 && !group, - select_options,"Impossible WHERE",having, - procedure, unit); - delete procedure; - DBUG_RETURN(error); + zero_result_cause= "Impossible WHERE"; + DBUG_RETURN(0); } /* Optimize count(*), min() and max() */ - if (tables && join.tmp_table_param.sum_func_count && ! group) + if (tables_list && tmp_table_param.sum_func_count && ! group_list) { int res; - if ((res=opt_sum_query(tables, all_fields, conds))) + if ((res=opt_sum_query(tables_list, all_fields, conds))) { if (res < 0) { - if (select_options & SELECT_DESCRIBE && select_lex->next) - select_describe(&join,false,false,false,"No matching min/max row"); - else - error=return_zero_rows(result, tables, fields, !group, - select_options, "No matching min/max row", - having, procedure, unit); - delete procedure; - DBUG_RETURN(error); + zero_result_cause= "No matching min/max row"; + DBUG_RETURN(0); } if (select_options & SELECT_DESCRIBE) { if (select_lex->next) - select_describe(&join,false,false,false,"Select tables optimized away"); + select_describe(this, false, false, false, + "Select tables optimized away"); else - describe_info(thd,"Select tables optimized away"); + describe_info(thd, "Select tables optimized away"); delete procedure; - DBUG_RETURN(error); + DBUG_RETURN(1); } - tables=0; // All tables resolved + tables_list= 0; // All tables resolved } } - if (!tables) - { // Only test of functions - error=0; - if (select_options & SELECT_DESCRIBE) - { - if (select_lex->next) - select_describe(&join,false,false,false,"No tables used"); - else - describe_info(thd,"No tables used"); - } - else - { - result->send_fields(fields,1); - if (!having || having->val_int()) - { - if (join.do_send_rows && result->send_data(fields)) - { - result->send_error(0,NullS); /* purecov: inspected */ - error=1; - } - else - error=(int) result->send_eof(); - } - else - error=(int) result->send_eof(); - } - delete procedure; - DBUG_RETURN(error); + + if (!tables_list) + { + test_function_query= 1; + DBUG_RETURN(0); } - error = -1; - join.sort_by_table=get_sort_by_table(order,group,tables); + error= -1; + sort_by_table= get_sort_by_table(order, group_list, tables_list); /* Calculate how to do the join */ - thd->proc_info="statistics"; - if (make_join_statistics(&join,tables,conds,&keyuse) || thd->fatal_error) - goto err; - thd->proc_info="preparing"; - result->initialize_tables(&join); - if (join.const_table_map != join.found_const_table_map && + thd->proc_info= "statistics"; + if (make_join_statistics(this, tables_list, conds, &keyuse) || + thd->fatal_error) + DBUG_RETURN(-1); + thd->proc_info= "preparing"; + result->initialize_tables(this); + if (const_table_map != found_const_table_map && !(select_options & SELECT_DESCRIBE)) { - error= return_zero_rows(result, tables, fields, - join.tmp_table_param.sum_func_count != 0 && - !group, 0, "", having, procedure, unit); - goto err; + zero_result_cause= ""; + select_options= 0; //TODO why option in return_zero_rows was droped + DBUG_RETURN(0); } if (!(thd->options & OPTION_BIG_SELECTS) && - join.best_read > (double) thd->max_join_size && + best_read > (double) thd->max_join_size && !(select_options & SELECT_DESCRIBE)) { /* purecov: inspected */ result->send_error(ER_TOO_BIG_SELECT,ER(ER_TOO_BIG_SELECT)); /* purecov: inspected */ error= 1; /* purecov: inspected */ - goto err; /* purecov: inspected */ + DBUG_RETURN(-1); } - if (join.const_tables && !thd->locked_tables && + if (const_tables && !thd->locked_tables && !(select_options & SELECT_NO_UNLOCK)) { TABLE **table, **end; - for (table=join.table, end=table + join.const_tables ; + for (table=this->table, end=table + const_tables ; table != end; table++) { @@ -467,98 +439,94 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, } (*table)->file->index_end(); } - mysql_unlock_some_tables(thd, join.table,join.const_tables); + mysql_unlock_some_tables(thd, this->table, const_tables); } - if (!conds && join.outer_join) + if (!conds && outer_join) { /* Handle the case where we have an OUTER JOIN without a WHERE */ conds=new Item_int((longlong) 1,1); // Always true } - select=make_select(*join.table, join.const_table_map, - join.const_table_map,conds,&error); + select=make_select(*table, const_table_map, + const_table_map, conds, &error); if (error) { /* purecov: inspected */ error= -1; /* purecov: inspected */ - goto err; /* purecov: inspected */ + DBUG_RETURN(-1); } - if (make_join_select(&join,select,conds)) + if (make_join_select(this, select, conds)) { - if (select_options & SELECT_DESCRIBE && select_lex->next) - select_describe(&join,false,false,false,"Impossible WHERE noticed after reading const tables"); - else - error= return_zero_rows(result,tables,fields, - join.tmp_table_param.sum_func_count != 0 && - !group, - select_options, - "Impossible WHERE noticed after reading const tables", - having, procedure, unit); - goto err; + zero_result_cause= + "Impossible WHERE noticed after reading const tables"; + DBUG_RETURN(0); } error= -1; /* if goto err */ /* Optimize distinct away if possible */ - order=remove_const(&join,order,conds,&simple_order); - if (group || join.tmp_table_param.sum_func_count) + order= remove_const(this, order, conds, &simple_order); + if (group_list || tmp_table_param.sum_func_count) { if (! hidden_group_fields) select_distinct=0; } - else if (select_distinct && join.tables - join.const_tables == 1 && + else if (select_distinct && tables - const_tables == 1 && (unit->select_limit_cnt == HA_POS_ERROR || - (join.select_options & OPTION_FOUND_ROWS) || + (select_options & OPTION_FOUND_ROWS) || order && !(skip_sort_order= - test_if_skip_sort_order(&join.join_tab[join.const_tables], - order, unit->select_limit_cnt,1)))) + test_if_skip_sort_order(&join_tab[const_tables], + order, + unit->select_limit_cnt, + 1)))) { - if ((group=create_distinct_group(order,fields))) + if ((group_list= create_distinct_group(order, fields_list))) { - select_distinct=0; + select_distinct= 0; no_order= !order; - join.group=1; // For end_write_group + group= 1; // For end_write_group } else if (thd->fatal_error) // End of memory - goto err; + DBUG_RETURN(-1); } - group=remove_const(&join,group,conds,&simple_group); - if (!group && join.group) + group_list= remove_const(this, group_list, conds, &simple_group); + if (!group_list && group) { order=0; // The output has only one row simple_order=1; } - calc_group_buffer(&join,group); - join.send_group_parts=join.tmp_table_param.group_parts; /* Save org parts */ + calc_group_buffer(this, group_list); + send_group_parts= tmp_table_param.group_parts; /* Save org parts */ if (procedure && procedure->group) { - group=procedure->group=remove_const(&join,procedure->group,conds, - &simple_group); - calc_group_buffer(&join,group); + group_list= procedure->group= remove_const(this, procedure->group, conds, + &simple_group); + calc_group_buffer(this, group_list); } - if (test_if_subpart(group,order) || - (!group && join.tmp_table_param.sum_func_count)) + if (test_if_subpart(group_list, order) || + (!group_list && tmp_table_param.sum_func_count)) order=0; // Can't use sort on head table if using row cache - if (join.full_join) + if (full_join) { - if (group) + if (group_list) simple_group=0; if (order) simple_order=0; } - need_tmp= (join.const_tables != join.tables && + need_tmp= (const_tables != tables && ((select_distinct || !simple_order || !simple_group) || - (group && order) || buffer_result)); + (group_list && order) || buffer_result)); // No cache for MATCH - make_join_readinfo(&join, + make_join_readinfo(this, (select_options & (SELECT_DESCRIBE | SELECT_NO_JOIN_CACHE)) | - (cur_sel->ftfunc_list.elements ? SELECT_NO_JOIN_CACHE : 0)); + (thd->lex.select->ftfunc_list.elements ? + SELECT_NO_JOIN_CACHE : 0)); /* Need to tell Innobase that to play it safe, it should fetch all columns of the tables: this is because MySQL @@ -567,60 +535,132 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, by MySQL. */ #ifdef HAVE_INNOBASE_DB - if (need_tmp || select_distinct || group || order) + if (need_tmp || select_distinct || group_list || order) { - for (uint i_h = join.const_tables; i_h < join.tables; i_h++) + for (uint i_h = const_tables; i_h < tables; i_h++) { - TABLE* table_h = join.join_tab[i_h].table; + TABLE* table_h = join_tab[i_h].table; if (table_h->db_type == DB_TYPE_INNODB) table_h->file->extra(HA_EXTRA_DONT_USE_CURSOR_TO_UPDATE); } } #endif - DBUG_EXECUTE("info",TEST_join(&join);); + DBUG_EXECUTE("info",TEST_join(this);); /* Because filesort always does a full table scan or a quick range scan we must add the removed reference to the select for the table. We only need to do this when we have a simple_order or simple_group as in other cases the join is done before the sort. */ - if ((order || group) && join.join_tab[join.const_tables].type != JT_ALL && - join.join_tab[join.const_tables].type != JT_FT && - (order && simple_order || group && simple_group)) + if ((order || group_list) && join_tab[const_tables].type != JT_ALL && + join_tab[const_tables].type != JT_FT && + (order && simple_order || group_list && simple_group)) { - if (add_ref_to_table_cond(thd,&join.join_tab[join.const_tables])) - goto err; + if (add_ref_to_table_cond(thd,&join_tab[const_tables])) + DBUG_RETURN(-1); } if (!(select_options & SELECT_BIG_RESULT) && - ((group && join.const_tables != join.tables && + ((group_list && const_tables != tables && (!simple_group || - !test_if_skip_sort_order(&join.join_tab[join.const_tables], group, - unit->select_limit_cnt, 0))) || + !test_if_skip_sort_order(&join_tab[const_tables], group_list, + unit->select_limit_cnt, + 0))) || select_distinct) && - join.tmp_table_param.quick_group && !procedure) + tmp_table_param.quick_group && !procedure) { need_tmp=1; simple_order=simple_group=0; // Force tmp table without sort } + DBUG_RETURN(0); +} + +/* + global uptimisation (with subselect) must be here (TODO) +*/ + +int +JOIN::global_optimize() +{ + return 0; +} + +/* + exec select +*/ +void +JOIN::exec() +{ + int tmp_error; + + DBUG_ENTER("JOIN::exec"); + + if (test_function_query) + { // Only test of functions + error=0; + if (select_options & SELECT_DESCRIBE) + { + if (select_lex->next) + select_describe(this, false, false, false, "No tables used"); + else + describe_info(thd, "No tables used"); + } + else + { + result->send_fields(fields_list,1); + if (!having || having->val_int()) + { + if (do_send_rows && result->send_data(fields_list)) + { + result->send_error(0,NullS); /* purecov: inspected */ + error=1; + } + else + error=(int) result->send_eof(); + } + else + error=(int) result->send_eof(); + } + delete procedure; + DBUG_VOID_RETURN; + } + + if (zero_result_cause) + { + if (select_options & SELECT_DESCRIBE && select_lex->next) + select_describe(this, false, false, false, zero_result_cause); + else + error=return_zero_rows(result, tables_list, fields_list, + tmp_table_param.sum_func_count != 0 && + !group_list, + select_options, + zero_result_cause, + having,procedure, + unit); + DBUG_VOID_RETURN; + } + + Item *having_list = having; + having = 0; if (select_options & SELECT_DESCRIBE) { if (!order && !no_order) - order=group; + order=group_list; if (order && - (join.const_tables == join.tables || + (const_tables == tables || (simple_order && - test_if_skip_sort_order(&join.join_tab[join.const_tables], order, - (join.const_tables != join.tables - 1 || - (join.select_options & OPTION_FOUND_ROWS)) ? - HA_POS_ERROR : unit->select_limit_cnt, 0)))) + test_if_skip_sort_order(&join_tab[const_tables], order, + (const_tables != tables - 1 || + (select_options & OPTION_FOUND_ROWS)) ? + HA_POS_ERROR : unit->select_limit_cnt, + 0)))) order=0; - select_describe(&join,need_tmp, + select_describe(this, need_tmp, order != 0 && !skip_sort_order, select_distinct); error=0; - goto err; + DBUG_VOID_RETURN; } /* Perform FULLTEXT search before all regular searches */ @@ -632,44 +672,45 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, DBUG_PRINT("info",("Creating tmp table")); thd->proc_info="Creating tmp table"; - if (!(tmp_table = - create_tmp_table(thd,&join.tmp_table_param,all_fields, + if (!(exec_tmp_table = + create_tmp_table(thd, &tmp_table_param, all_fields, ((!simple_group && !procedure && !(test_flags & TEST_NO_KEY_GROUP)) ? - group : (ORDER*) 0), - group ? 0 : select_distinct, - group && simple_group, + group_list : (ORDER*) 0), + group_list ? 0 : select_distinct, + group_list && simple_group, (order == 0 || skip_sort_order) && - !(join.select_options & OPTION_FOUND_ROWS), - join.select_options, unit))) - goto err; /* purecov: inspected */ + !(select_options & OPTION_FOUND_ROWS), + select_options, unit))) + DBUG_VOID_RETURN; - if (having && (join.sort_and_group || (tmp_table->distinct && !group))) - join.having=having; + if (having_list && + (sort_and_group || (exec_tmp_table->distinct && !group_list))) + having=having_list; /* if group or order on first table, sort first */ - if (group && simple_group) + if (group_list && simple_group) { DBUG_PRINT("info",("Sorting for group")); thd->proc_info="Sorting for group"; - if (create_sort_index(&join.join_tab[join.const_tables],group, + if (create_sort_index(&join_tab[const_tables], group_list, HA_POS_ERROR) || - make_sum_func_list(&join,all_fields) || - alloc_group_fields(&join,group)) - goto err; - group=0; + make_sum_func_list(this, all_fields) || + alloc_group_fields(this, group_list)) + DBUG_VOID_RETURN; + group_list=0; } else { - if (make_sum_func_list(&join,all_fields)) - goto err; - if (!group && ! tmp_table->distinct && order && simple_order) + if (make_sum_func_list(this, all_fields)) + DBUG_VOID_RETURN; + if (!group_list && ! exec_tmp_table->distinct && order && simple_order) { DBUG_PRINT("info",("Sorting for order")); thd->proc_info="Sorting for order"; - if (create_sort_index(&join.join_tab[join.const_tables],order, - HA_POS_ERROR)) - goto err; /* purecov: inspected */ + if (create_sort_index(&join_tab[const_tables], order, + HA_POS_ERROR)) + DBUG_VOID_RETURN; order=0; } } @@ -680,58 +721,58 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, In this case we can stop scanning t2 when we have found one t1.a */ - if (tmp_table->distinct) + if (exec_tmp_table->distinct) { table_map used_tables= thd->used_tables; - JOIN_TAB *join_tab=join.join_tab+join.tables-1; + JOIN_TAB *join_tab= this->join_tab+tables-1; do { if (used_tables & join_tab->table->map) break; join_tab->not_used_in_distinct=1; - } while (join_tab-- != join.join_tab); + } while (join_tab-- != this->join_tab); /* Optimize "select distinct b from t1 order by key_part_1 limit #" */ if (order && skip_sort_order) { - (void) test_if_skip_sort_order(&join.join_tab[join.const_tables], + (void) test_if_skip_sort_order(&this->join_tab[const_tables], order, unit->select_limit_cnt, 0); order=0; } } /* Copy data to the temporary table */ - thd->proc_info="Copying to tmp table"; - if ((tmp_error=do_select(&join,(List *) 0,tmp_table,0))) + thd->proc_info= "Copying to tmp table"; + if ((tmp_error= do_select(this, (List *) 0, exec_tmp_table, 0))) { - error=tmp_error; - goto err; /* purecov: inspected */ + error= tmp_error; + DBUG_VOID_RETURN; } - if (join.having) - join.having=having=0; // Allready done + if (having) + having= having_list= 0; // Allready done /* Change sum_fields reference to calculated fields in tmp_table */ - if (join.sort_and_group || tmp_table->group) + if (sort_and_group || exec_tmp_table->group) { if (change_to_use_tmp_fields(all_fields)) - goto err; - join.tmp_table_param.field_count+=join.tmp_table_param.sum_func_count+ - join.tmp_table_param.func_count; - join.tmp_table_param.sum_func_count=join.tmp_table_param.func_count=0; + DBUG_VOID_RETURN; + tmp_table_param.field_count+= tmp_table_param.sum_func_count+ + tmp_table_param.func_count; + tmp_table_param.sum_func_count= tmp_table_param.func_count= 0; } else { if (change_refs_to_tmp_fields(thd,all_fields)) - goto err; - join.tmp_table_param.field_count+=join.tmp_table_param.func_count; - join.tmp_table_param.func_count=0; + DBUG_VOID_RETURN; + tmp_table_param.field_count+= tmp_table_param.func_count; + tmp_table_param.func_count= 0; } if (procedure) procedure->update_refs(); - if (tmp_table->group) + if (exec_tmp_table->group) { // Already grouped if (!order && !no_order) - order=group; /* order by group */ - group=0; + order= group_list; /* order by group */ + group_list= 0; } /* @@ -742,153 +783,196 @@ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, ** like SEC_TO_TIME(SUM(...)). */ - if (group && (!test_if_subpart(group,order) || select_distinct) || + if (group_list && (!test_if_subpart(group_list,order) || + select_distinct) || (select_distinct && - join.tmp_table_param.using_indirect_summary_function)) + tmp_table_param.using_indirect_summary_function)) { /* Must copy to another table */ TABLE *tmp_table2; DBUG_PRINT("info",("Creating group table")); /* Free first data from old join */ - join_free(&join); - if (make_simple_join(&join,tmp_table)) - goto err; - calc_group_buffer(&join,group); - count_field_types(&join.tmp_table_param,all_fields, - select_distinct && !group); - join.tmp_table_param.hidden_field_count=(all_fields.elements- - fields.elements); + join_free(this); + if (make_simple_join(this, exec_tmp_table)) + DBUG_VOID_RETURN; + calc_group_buffer(this, group_list); + count_field_types(&tmp_table_param, all_fields, + select_distinct && !group_list); + tmp_table_param.hidden_field_count= (all_fields.elements- + fields_list.elements); /* group data to new table */ - if (!(tmp_table2 = create_tmp_table(thd,&join.tmp_table_param,all_fields, + if (!(tmp_table2 = create_tmp_table(thd, &tmp_table_param, all_fields, (ORDER*) 0, - select_distinct && !group, + select_distinct && !group_list, 1, 0, - join.select_options, unit))) - goto err; /* purecov: inspected */ - if (group) + select_options, unit))) + DBUG_VOID_RETURN; + if (group_list) { thd->proc_info="Creating sort index"; - if (create_sort_index(join.join_tab,group,HA_POS_ERROR) || - alloc_group_fields(&join,group)) + if (create_sort_index(join_tab, group_list, HA_POS_ERROR) || + alloc_group_fields(this, group_list)) { free_tmp_table(thd,tmp_table2); /* purecov: inspected */ - goto err; /* purecov: inspected */ + DBUG_VOID_RETURN; } - group=0; + group_list= 0; } thd->proc_info="Copying to group table"; tmp_error= -1; - if (make_sum_func_list(&join,all_fields) || - (tmp_error=do_select(&join,(List *) 0,tmp_table2,0))) + if (make_sum_func_list(this, all_fields) || + (tmp_error=do_select(this, (List *) 0,tmp_table2,0))) { error=tmp_error; free_tmp_table(thd,tmp_table2); - goto err; /* purecov: inspected */ + DBUG_VOID_RETURN; } - end_read_record(&join.join_tab->read_record); - free_tmp_table(thd,tmp_table); - join.const_tables=join.tables; // Mark free for join_free() - tmp_table=tmp_table2; - join.join_tab[0].table=0; // Table is freed + end_read_record(&join_tab->read_record); + free_tmp_table(thd,exec_tmp_table); + const_tables= tables; // Mark free for join_free() + exec_tmp_table= tmp_table2; + join_tab[0].table= 0; // Table is freed if (change_to_use_tmp_fields(all_fields)) // No sum funcs anymore - goto err; - join.tmp_table_param.field_count+=join.tmp_table_param.sum_func_count; - join.tmp_table_param.sum_func_count=0; + DBUG_VOID_RETURN; + tmp_table_param.field_count+= tmp_table_param.sum_func_count; + tmp_table_param.sum_func_count= 0; } - if (tmp_table->distinct) + if (exec_tmp_table->distinct) select_distinct=0; /* Each row is unique */ - join_free(&join); /* Free quick selects */ - if (select_distinct && ! group) + join_free(this); /* Free quick selects */ + if (select_distinct && ! group_list) { thd->proc_info="Removing duplicates"; - if (having) - having->update_used_tables(); - if (remove_duplicates(&join,tmp_table,fields, having)) - goto err; /* purecov: inspected */ - having=0; + if (having_list) + having_list->update_used_tables(); + if (remove_duplicates(this, exec_tmp_table, fields_list, having_list)) + DBUG_VOID_RETURN; + having_list=0; select_distinct=0; } - tmp_table->reginfo.lock_type=TL_UNLOCK; - if (make_simple_join(&join,tmp_table)) - goto err; - calc_group_buffer(&join,group); - count_field_types(&join.tmp_table_param,all_fields,0); + exec_tmp_table->reginfo.lock_type=TL_UNLOCK; + if (make_simple_join(this, exec_tmp_table)) + DBUG_VOID_RETURN; + calc_group_buffer(this, group_list); + count_field_types(&tmp_table_param, all_fields, 0); } if (procedure) { - if (procedure->change_columns(fields) || - result->prepare(fields, unit)) - goto err; - count_field_types(&join.tmp_table_param, all_fields, 0); + if (procedure->change_columns(fields_list) || + result->prepare(fields_list, unit)) + DBUG_VOID_RETURN; + count_field_types(&tmp_table_param, all_fields, 0); } - if (join.group || join.tmp_table_param.sum_func_count || + if (group || tmp_table_param.sum_func_count || (procedure && (procedure->flags & PROC_GROUP))) { - alloc_group_fields(&join,group); - setup_copy_fields(thd, &join.tmp_table_param,all_fields); - if (make_sum_func_list(&join,all_fields) || thd->fatal_error) - goto err; /* purecov: inspected */ + alloc_group_fields(this, group_list); + setup_copy_fields(thd, &tmp_table_param,all_fields); + if (make_sum_func_list(this, all_fields) || thd->fatal_error) + DBUG_VOID_RETURN; } - if (group || order) + if (group_list || order) { DBUG_PRINT("info",("Sorting for send_fields")); thd->proc_info="Sorting result"; /* If we have already done the group, add HAVING to sorted table */ - if (having && ! group && ! join.sort_and_group) + if (having_list && ! group_list && ! sort_and_group) { - having->update_used_tables(); // Some tables may have been const - JOIN_TAB *table=&join.join_tab[join.const_tables]; - table_map used_tables= join.const_table_map | table->table->map; + having_list->update_used_tables(); // Some tables may have been const + JOIN_TAB *table= &join_tab[const_tables]; + table_map used_tables= const_table_map | table->table->map; - Item* sort_table_cond=make_cond_for_table(having,used_tables,used_tables); + Item* sort_table_cond= make_cond_for_table(having_list, used_tables, + used_tables); if (sort_table_cond) { if (!table->select) if (!(table->select=new SQL_SELECT)) - goto err; + DBUG_VOID_RETURN; if (!table->select->cond) table->select->cond=sort_table_cond; else // This should never happen if (!(table->select->cond=new Item_cond_and(table->select->cond, sort_table_cond))) - goto err; + DBUG_VOID_RETURN; table->select_cond=table->select->cond; DBUG_EXECUTE("where",print_where(table->select->cond, "select and having");); - having=make_cond_for_table(having,~ (table_map) 0,~used_tables); + having_list= make_cond_for_table(having_list, ~ (table_map) 0, + ~used_tables); DBUG_EXECUTE("where",print_where(conds,"having after sort");); } } - if (create_sort_index(&join.join_tab[join.const_tables], - group ? group : order, - (having || group || - join.const_tables != join.tables - 1 || - (join.select_options & OPTION_FOUND_ROWS)) ? - HA_POS_ERROR : unit->select_limit_cnt)) - goto err; /* purecov: inspected */ + if (create_sort_index(&join_tab[const_tables], + group_list ? group_list : order, + (having_list || group_list || + const_tables != tables - 1 || + (select_options & OPTION_FOUND_ROWS)) ? + HA_POS_ERROR : unit->select_limit_cnt)) + DBUG_VOID_RETURN; } - join.having=having; // Actually a parameter + having=having_list; // Actually a parameter thd->proc_info="Sending data"; - error=do_select(&join,&fields,NULL,procedure); + error=do_select(this, &fields_list, NULL, procedure); + DBUG_VOID_RETURN; +} -err: - thd->limit_found_rows = join.send_records; - thd->examined_row_count = join.examined_rows; - thd->proc_info="end"; - join.lock=0; // It's faster to unlock later - join_free(&join); - thd->proc_info="end2"; // QQ - if (tmp_table) - free_tmp_table(thd,tmp_table); - thd->proc_info="end3"; // QQ +/* + Clean up join. Return error that hold JOIN. +*/ + +int +JOIN::cleanup(THD *thd) +{ + lock=0; // It's faster to unlock later + join_free(this); + if (exec_tmp_table) + free_tmp_table(thd, exec_tmp_table); delete select; delete_dynamic(&keyuse); delete procedure; - thd->proc_info="end4"; // QQ + return error; +} + +int +mysql_select(THD *thd, TABLE_LIST *tables, List &fields, COND *conds, + ORDER *order, ORDER *group,Item *having, ORDER *proc_param, + ulong select_options, select_result *result, SELECT_LEX_UNIT *unit) +{ + JOIN *join = new JOIN(thd, fields, select_options, result); + + DBUG_ENTER("mysql_select"); + thd->proc_info="init"; + thd->used_tables=0; // Updated by setup_fields + + if (join->prepare(tables, conds, order, group, having, proc_param, + &(thd->lex.select_lex), unit)) + { + DBUG_RETURN(-1); + } + switch(join->optimize()) + { + case 1: + DBUG_RETURN(join->error); + case -1: + goto err; + } + + if(join->global_optimize()) + goto err; + + join->exec(); + +err: + thd->limit_found_rows = join->send_records; + thd->examined_row_count = join->examined_rows; + thd->proc_info="end"; + int error= join->cleanup(thd); + delete join; DBUG_RETURN(error); } @@ -2538,7 +2622,7 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond) static void -make_join_readinfo(JOIN *join,uint options) +make_join_readinfo(JOIN *join, uint options) { uint i; SELECT_LEX *select_lex = &(join->thd->lex.select_lex); diff --git a/sql/sql_select.cc.rej b/sql/sql_select.cc.rej new file mode 100644 index 00000000000..e5be98e9859 --- /dev/null +++ b/sql/sql_select.cc.rej @@ -0,0 +1,1576 @@ +*************** +*** 65,71 **** + static int return_zero_rows(select_result *res,TABLE_LIST *tables, + List &fields, bool send_row, + uint select_options, const char *info, +- Item *having, Procedure *proc); + static COND *optimize_cond(COND *conds,Item::cond_result *cond_value); + static COND *remove_eq_conds(COND *cond,Item::cond_result *cond_value); + static bool const_expression_in_where(COND *conds,Item *item, Item **comp_item); +--- 65,72 ---- + static int return_zero_rows(select_result *res,TABLE_LIST *tables, + List &fields, bool send_row, + uint select_options, const char *info, ++ Item *having, Procedure *proc, ++ SELECT_LEX *select_lex); + static COND *optimize_cond(COND *conds,Item::cond_result *cond_value); + static COND *remove_eq_conds(COND *cond,Item::cond_result *cond_value); + static bool const_expression_in_where(COND *conds,Item *item, Item **comp_item); +*************** +*** 180,228 **** + ** mysql_select assumes that all tables are already opened + *****************************************************************************/ + + int +- mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, +- ORDER *order, ORDER *group,Item *having,ORDER *proc_param, +- ulong select_options,select_result *result) +- { +- TABLE *tmp_table; +- int error, tmp_error; +- bool need_tmp,hidden_group_fields; +- bool simple_order,simple_group,no_order, skip_sort_order, buffer_result; +- Item::cond_result cond_value; +- SQL_SELECT *select; +- DYNAMIC_ARRAY keyuse; +- JOIN join; +- Procedure *procedure; +- List all_fields(fields); +- bool select_distinct; +- SELECT_LEX *select_lex = &(thd->lex.select_lex); +- SELECT_LEX *cur_sel = thd->lex.select; +- DBUG_ENTER("mysql_select"); + +- /* Check that all tables, fields, conds and order are ok */ + +- select_distinct=test(select_options & SELECT_DISTINCT); +- buffer_result=test(select_options & OPTION_BUFFER_RESULT) && !test(select_options & OPTION_FOUND_ROWS); +- tmp_table=0; +- select=0; +- no_order=skip_sort_order=0; +- bzero((char*) &keyuse,sizeof(keyuse)); +- thd->proc_info="init"; +- thd->used_tables=0; // Updated by setup_fields + +- if (setup_tables(tables) || +- setup_fields(thd,tables,fields,1,&all_fields,1) || +- setup_conds(thd,tables,&conds) || +- setup_order(thd,tables,fields,all_fields,order) || +- setup_group(thd,tables,fields,all_fields,group,&hidden_group_fields)) + DBUG_RETURN(-1); /* purecov: inspected */ + + if (having) + { + thd->where="having clause"; + thd->allow_sum_func=1; +- if (having->fix_fields(thd,tables) || thd->fatal_error) + DBUG_RETURN(-1); /* purecov: inspected */ + if (having->with_sum_func) + having->split_sum_func(all_fields); +--- 195,237 ---- + ** mysql_select assumes that all tables are already opened + *****************************************************************************/ + ++ /* ++ Prepare of whole select (including subselect in future). ++ return -1 on error ++ 0 on success ++ */ + int + ++ JOIN::prepare(TABLE_LIST *tables_init, ++ COND *conds_init, ORDER *order_init, ORDER *group_init, ++ Item *having_init, ++ ORDER *proc_param_init, SELECT_LEX *select) ++ { ++ DBUG_ENTER("JOIN::prepare"); ++ ++ conds= conds_init; ++ order= order_init; ++ group_list= group_init; ++ having= having_init; ++ proc_param= proc_param_init; ++ tables_list= tables_init; ++ select_lex= select; + ++ /* Check that all tables, fields, conds and order are ok */ + ++ if (setup_tables(tables_list) || ++ setup_fields(thd,tables_list,fields_list,1,&all_fields,1) || ++ setup_conds(thd,tables_list,&conds) || ++ setup_order(thd,tables_list,fields_list,all_fields,order) || ++ setup_group(thd,tables_list,fields_list,all_fields,group_list, ++ &hidden_group_fields)) + DBUG_RETURN(-1); /* purecov: inspected */ + + if (having) + { + thd->where="having clause"; + thd->allow_sum_func=1; ++ if (having->fix_fields(thd,tables_list) || thd->fatal_error) + DBUG_RETURN(-1); /* purecov: inspected */ + if (having->with_sum_func) + having->split_sum_func(all_fields); +*************** +*** 297,347 **** + } + + /* Init join struct */ +- join.thd=thd; +- join.lock=thd->lock; +- join.join_tab=0; +- join.tmp_table_param.copy_field=0; +- join.sum_funcs=0; +- join.send_records=join.found_records=join.examined_rows=0; +- join.tmp_table_param.end_write_records= HA_POS_ERROR; +- join.first_record=join.sort_and_group=0; +- join.select_options=select_options; +- join.result=result; +- count_field_types(&join.tmp_table_param,all_fields,0); +- join.const_tables=0; +- join.having=0; +- join.do_send_rows = 1; +- join.group= group != 0; +- join.row_limit= ((select_distinct || order || group) ? HA_POS_ERROR : +- thd->select_limit); + + #ifdef RESTRICTED_GROUP +- if (join.sum_func_count && !group && (join.func_count || join.field_count)) + { + my_message(ER_WRONG_SUM_SELECT,ER(ER_WRONG_SUM_SELECT),MYF(0)); + delete procedure; + DBUG_RETURN(-1); + } + #endif +- if (!procedure && result->prepare(fields)) + { /* purecov: inspected */ + DBUG_RETURN(-1); /* purecov: inspected */ + } + + #ifdef HAVE_REF_TO_FIELDS // Not done yet + /* Add HAVING to WHERE if possible */ +- if (having && !group && ! join.sum_func_count) + { + if (!conds) + { +- conds=having; +- having=0; + } + else if ((conds=new Item_cond_and(conds,having))) + { +- conds->fix_fields(thd,tables); +- conds->change_ref_to_fields(thd,tables); +- having=0; + } + } + #endif +--- 305,358 ---- + } + + /* Init join struct */ ++ count_field_types(&tmp_table_param, all_fields, 0); ++ this->group= group_list != 0; ++ row_limit= ((select_distinct || order || group_list) ? HA_POS_ERROR : ++ select_lex->first_in_union->select_limit_cnt); + + #ifdef RESTRICTED_GROUP ++ if (sum_func_count && !group_list && (func_count || field_count)) + { + my_message(ER_WRONG_SUM_SELECT,ER(ER_WRONG_SUM_SELECT),MYF(0)); + delete procedure; + DBUG_RETURN(-1); + } + #endif ++ if (!procedure && result->prepare(fields_list, select_lex->first_in_union)) + { /* purecov: inspected */ + DBUG_RETURN(-1); /* purecov: inspected */ + } ++ DBUG_RETURN(0); // All OK ++ } ++ ++ /* ++ global select optimisation. ++ return 0 - success ++ 1 - go out ++ -1 - go out with cleaning ++ ++ error code saved in field 'error' ++ */ ++ int ++ JOIN::optimize() ++ { ++ DBUG_ENTER("JOIN::optimize"); ++ SELECT_LEX *select_lex = &(thd->lex.select_lex); + + #ifdef HAVE_REF_TO_FIELDS // Not done yet + /* Add HAVING to WHERE if possible */ ++ if (having && !group_list && ! sum_func_count) + { + if (!conds) + { ++ conds= having; ++ having= 0; + } + else if ((conds=new Item_cond_and(conds,having))) + { ++ conds->fix_fields(thd, tables_list); ++ conds->change_ref_to_fields(thd, tables_list); ++ having= 0; + } + } + #endif +*************** +*** 350,459 **** + if (thd->fatal_error) // Out of memory + { + delete procedure; +- DBUG_RETURN(0); + } +- if (cond_value == Item::COND_FALSE || !thd->select_limit) + { /* Impossible cond */ +- if (select_options & SELECT_DESCRIBE && select_lex->next) +- select_describe(&join,false,false,false,"Impossible WHERE"); +- else +- error=return_zero_rows(result, tables, fields, +- join.tmp_table_param.sum_func_count != 0 && !group, +- select_options,"Impossible WHERE",having, +- procedure); +- delete procedure; +- DBUG_RETURN(error); + } + + /* Optimize count(*), min() and max() */ +- if (tables && join.tmp_table_param.sum_func_count && ! group) + { + int res; +- if ((res=opt_sum_query(tables, all_fields, conds))) + { + if (res < 0) + { +- if (select_options & SELECT_DESCRIBE && select_lex->next) +- select_describe(&join,false,false,false,"No matching min/max row"); +- else +- error=return_zero_rows(result, tables, fields, !group, +- select_options,"No matching min/max row", +- having,procedure); +- delete procedure; +- DBUG_RETURN(error); + } + if (select_options & SELECT_DESCRIBE) + { + if (select_lex->next) +- select_describe(&join,false,false,false,"Select tables optimized away"); + else +- describe_info(thd,"Select tables optimized away"); + delete procedure; +- DBUG_RETURN(error); + } +- tables=0; // All tables resolved + } + } +- if (!tables) +- { // Only test of functions +- error=0; +- if (select_options & SELECT_DESCRIBE) +- { +- if (select_lex->next) +- select_describe(&join,false,false,false,"No tables used"); +- else +- describe_info(thd,"No tables used"); +- } +- else +- { +- result->send_fields(fields,1); +- if (!having || having->val_int()) +- { +- if (join.do_send_rows && result->send_data(fields)) +- { +- result->send_error(0,NullS); /* purecov: inspected */ +- error=1; +- } +- else +- error=(int) result->send_eof(); +- } +- else +- error=(int) result->send_eof(); +- } +- delete procedure; +- DBUG_RETURN(error); + } + +- error = -1; +- join.sort_by_table=get_sort_by_table(order,group,tables); + + /* Calculate how to do the join */ +- thd->proc_info="statistics"; +- if (make_join_statistics(&join,tables,conds,&keyuse) || thd->fatal_error) +- goto err; +- thd->proc_info="preparing"; +- result->initialize_tables(&join); +- if (join.const_table_map != join.found_const_table_map && + !(select_options & SELECT_DESCRIBE)) + { +- error=return_zero_rows(result,tables,fields, +- join.tmp_table_param.sum_func_count != 0 && +- !group,0,"",having,procedure); +- goto err; + } + if (!(thd->options & OPTION_BIG_SELECTS) && +- join.best_read > (double) thd->max_join_size && + !(select_options & SELECT_DESCRIBE)) + { /* purecov: inspected */ + result->send_error(ER_TOO_BIG_SELECT,ER(ER_TOO_BIG_SELECT)); /* purecov: inspected */ + error= 1; /* purecov: inspected */ +- goto err; /* purecov: inspected */ + } +- if (join.const_tables && !thd->locked_tables && + !(select_options & SELECT_NO_UNLOCK)) + { + TABLE **table, **end; +- for (table=join.table, end=table + join.const_tables ; + table != end; + table++) + { +--- 361,436 ---- + if (thd->fatal_error) // Out of memory + { + delete procedure; ++ error = 0; ++ DBUG_RETURN(1); + } ++ if (cond_value == Item::COND_FALSE || ++ !select_lex->first_in_union->select_limit_cnt) + { /* Impossible cond */ ++ zero_result_cause= "Impossible WHERE"; ++ DBUG_RETURN(0); + } + + /* Optimize count(*), min() and max() */ ++ if (tables_list && tmp_table_param.sum_func_count && ! group_list) + { + int res; ++ if ((res=opt_sum_query(tables_list, all_fields, conds))) + { + if (res < 0) + { ++ zero_result_cause= "No matching min/max row"; ++ DBUG_RETURN(0); + } + if (select_options & SELECT_DESCRIBE) + { + if (select_lex->next) ++ select_describe(this, false, false, false, ++ "Select tables optimized away"); + else ++ describe_info(thd, "Select tables optimized away"); + delete procedure; ++ DBUG_RETURN(1); + } ++ tables_list=0; // All tables resolved + } + } ++ if (!tables_list) ++ { ++ test_function_query= 1; ++ DBUG_RETURN(0); + } + ++ error= -1; ++ sort_by_table= get_sort_by_table(order, group_list, tables_list); + + /* Calculate how to do the join */ ++ thd->proc_info= "statistics"; ++ if (make_join_statistics(this, tables_list, conds, &keyuse) || ++ thd->fatal_error) ++ DBUG_RETURN(-1); ++ thd->proc_info= "preparing"; ++ result->initialize_tables(this); ++ if (const_table_map != found_const_table_map && + !(select_options & SELECT_DESCRIBE)) + { ++ zero_result_cause= ""; ++ select_options= 0; //TODO why option in return_zero_rows was droped ++ DBUG_RETURN(0); + } + if (!(thd->options & OPTION_BIG_SELECTS) && ++ best_read > (double) thd->max_join_size && + !(select_options & SELECT_DESCRIBE)) + { /* purecov: inspected */ + result->send_error(ER_TOO_BIG_SELECT,ER(ER_TOO_BIG_SELECT)); /* purecov: inspected */ + error= 1; /* purecov: inspected */ ++ DBUG_RETURN(-1); + } ++ if (const_tables && !thd->locked_tables && + !(select_options & SELECT_NO_UNLOCK)) + { + TABLE **table, **end; ++ for (table=this->table, end=table + const_tables ; + table != end; + table++) + { +*************** +*** 465,561 **** + } + (*table)->file->index_end(); + } +- mysql_unlock_some_tables(thd, join.table,join.const_tables); + } +- if (!conds && join.outer_join) + { + /* Handle the case where we have an OUTER JOIN without a WHERE */ + conds=new Item_int((longlong) 1,1); // Always true + } +- select=make_select(*join.table, join.const_table_map, +- join.const_table_map,conds,&error); + if (error) + { /* purecov: inspected */ + error= -1; /* purecov: inspected */ +- goto err; /* purecov: inspected */ + } +- if (make_join_select(&join,select,conds)) + { +- if (select_options & SELECT_DESCRIBE && select_lex->next) +- select_describe(&join,false,false,false,"Impossible WHERE noticed after reading const tables"); +- else +- error=return_zero_rows(result,tables,fields, +- join.tmp_table_param.sum_func_count != 0 && !group, +- select_options, +- "Impossible WHERE noticed after reading const tables", +- having,procedure); +- goto err; + } + + error= -1; /* if goto err */ + + /* Optimize distinct away if possible */ +- order=remove_const(&join,order,conds,&simple_order); +- if (group || join.tmp_table_param.sum_func_count) + { + if (! hidden_group_fields) + select_distinct=0; + } +- else if (select_distinct && join.tables - join.const_tables == 1 && +- (thd->select_limit == HA_POS_ERROR || +- (join.select_options & OPTION_FOUND_ROWS) || + order && + !(skip_sort_order= +- test_if_skip_sort_order(&join.join_tab[join.const_tables], +- order, thd->select_limit,1)))) + { +- if ((group=create_distinct_group(order,fields))) + { + select_distinct=0; + no_order= !order; +- join.group=1; // For end_write_group + } + else if (thd->fatal_error) // End of memory +- goto err; + } +- group=remove_const(&join,group,conds,&simple_group); +- if (!group && join.group) + { + order=0; // The output has only one row + simple_order=1; + } + +- calc_group_buffer(&join,group); +- join.send_group_parts=join.tmp_table_param.group_parts; /* Save org parts */ + if (procedure && procedure->group) + { +- group=procedure->group=remove_const(&join,procedure->group,conds, +- &simple_group); +- calc_group_buffer(&join,group); + } + +- if (test_if_subpart(group,order) || +- (!group && join.tmp_table_param.sum_func_count)) + order=0; + + // Can't use sort on head table if using row cache +- if (join.full_join) + { +- if (group) + simple_group=0; + if (order) + simple_order=0; + } + +- need_tmp= (join.const_tables != join.tables && + ((select_distinct || !simple_order || !simple_group) || +- (group && order) || buffer_result)); + + // No cache for MATCH +- make_join_readinfo(&join, + (select_options & (SELECT_DESCRIBE | + SELECT_NO_JOIN_CACHE)) | +- (cur_sel->ftfunc_list.elements ? SELECT_NO_JOIN_CACHE : 0)); + + /* Need to tell Innobase that to play it safe, it should fetch all + columns of the tables: this is because MySQL +--- 442,535 ---- + } + (*table)->file->index_end(); + } ++ mysql_unlock_some_tables(thd, this->table, const_tables); + } ++ if (!conds && outer_join) + { + /* Handle the case where we have an OUTER JOIN without a WHERE */ + conds=new Item_int((longlong) 1,1); // Always true + } ++ select=make_select(*table, const_table_map, ++ const_table_map, conds, &error); + if (error) + { /* purecov: inspected */ + error= -1; /* purecov: inspected */ ++ DBUG_RETURN(-1); + } ++ if (make_join_select(this, select, conds)) + { ++ zero_result_cause= ++ "Impossible WHERE noticed after reading const tables"; ++ DBUG_RETURN(0); + } + + error= -1; /* if goto err */ + + /* Optimize distinct away if possible */ ++ order=remove_const(this,order,conds,&simple_order); ++ if (group_list || tmp_table_param.sum_func_count) + { + if (! hidden_group_fields) + select_distinct=0; + } ++ else if (select_distinct && tables - const_tables == 1 && ++ (select_lex->first_in_union->select_limit_cnt == HA_POS_ERROR || ++ (select_options & OPTION_FOUND_ROWS) || + order && + !(skip_sort_order= ++ test_if_skip_sort_order(&join_tab[const_tables], ++ order, ++ select_lex->first_in_union->select_limit_cnt, ++ 1)))) + { ++ if ((group_list=create_distinct_group(order, fields_list))) + { + select_distinct=0; + no_order= !order; ++ group=1; // For end_write_group + } + else if (thd->fatal_error) // End of memory ++ DBUG_RETURN(-1); + } ++ group_list= remove_const(this, group_list, conds, &simple_group); ++ if (!group_list && group) + { + order=0; // The output has only one row + simple_order=1; + } + ++ calc_group_buffer(this, group_list); ++ send_group_parts=tmp_table_param.group_parts; /* Save org parts */ + if (procedure && procedure->group) + { ++ group_list= procedure->group= remove_const(this, procedure->group, conds, ++ &simple_group); ++ calc_group_buffer(this, group_list); + } + ++ if (test_if_subpart(group_list, order) || ++ (!group_list && tmp_table_param.sum_func_count)) + order=0; + + // Can't use sort on head table if using row cache ++ if (full_join) + { ++ if (group_list) + simple_group=0; + if (order) + simple_order=0; + } + ++ need_tmp= (const_tables != tables && + ((select_distinct || !simple_order || !simple_group) || ++ (group_list && order) || buffer_result)); + + // No cache for MATCH ++ make_join_readinfo(this, + (select_options & (SELECT_DESCRIBE | + SELECT_NO_JOIN_CACHE)) | ++ (thd->lex.select->ftfunc_list.elements ? ++ SELECT_NO_JOIN_CACHE : 0)); + + /* Need to tell Innobase that to play it safe, it should fetch all + columns of the tables: this is because MySQL +*************** +*** 564,624 **** + by MySQL. */ + + #ifdef HAVE_INNOBASE_DB +- if (need_tmp || select_distinct || group || order) + { +- for (uint i_h = join.const_tables; i_h < join.tables; i_h++) + { +- TABLE* table_h = join.join_tab[i_h].table; + if (table_h->db_type == DB_TYPE_INNODB) + table_h->file->extra(HA_EXTRA_DONT_USE_CURSOR_TO_UPDATE); + } + } + #endif + +- DBUG_EXECUTE("info",TEST_join(&join);); + /* + Because filesort always does a full table scan or a quick range scan + we must add the removed reference to the select for the table. + We only need to do this when we have a simple_order or simple_group + as in other cases the join is done before the sort. + */ +- if ((order || group) && join.join_tab[join.const_tables].type != JT_ALL && +- join.join_tab[join.const_tables].type != JT_FT && +- (order && simple_order || group && simple_group)) + { +- if (add_ref_to_table_cond(thd,&join.join_tab[join.const_tables])) +- goto err; + } + + if (!(select_options & SELECT_BIG_RESULT) && +- ((group && join.const_tables != join.tables && + (!simple_group || +- !test_if_skip_sort_order(&join.join_tab[join.const_tables], group, +- thd->select_limit,0))) || + select_distinct) && +- join.tmp_table_param.quick_group && !procedure) + { + need_tmp=1; simple_order=simple_group=0; // Force tmp table without sort + } + + if (select_options & SELECT_DESCRIBE) + { + if (!order && !no_order) +- order=group; + if (order && +- (join.const_tables == join.tables || + (simple_order && +- test_if_skip_sort_order(&join.join_tab[join.const_tables], order, +- (join.const_tables != join.tables - 1 || +- (join.select_options & OPTION_FOUND_ROWS)) ? +- HA_POS_ERROR : thd->select_limit,0)))) + order=0; +- select_describe(&join,need_tmp, + (order != 0 && +- (!need_tmp || order != group || simple_group)), + select_distinct); + error=0; +- goto err; + } + + /* Perform FULLTEXT search before all regular searches */ +--- 538,672 ---- + by MySQL. */ + + #ifdef HAVE_INNOBASE_DB ++ if (need_tmp || select_distinct || group_list || order) + { ++ for (uint i_h = const_tables; i_h < tables; i_h++) + { ++ TABLE* table_h = join_tab[i_h].table; + if (table_h->db_type == DB_TYPE_INNODB) + table_h->file->extra(HA_EXTRA_DONT_USE_CURSOR_TO_UPDATE); + } + } + #endif + ++ DBUG_EXECUTE("info",TEST_join(this);); + /* + Because filesort always does a full table scan or a quick range scan + we must add the removed reference to the select for the table. + We only need to do this when we have a simple_order or simple_group + as in other cases the join is done before the sort. + */ ++ if ((order || group_list) && join_tab[const_tables].type != JT_ALL && ++ join_tab[const_tables].type != JT_FT && ++ (order && simple_order || group_list && simple_group)) + { ++ if (add_ref_to_table_cond(thd,&join_tab[const_tables])) ++ DBUG_RETURN(-1); + } + + if (!(select_options & SELECT_BIG_RESULT) && ++ ((group_list && const_tables != tables && + (!simple_group || ++ !test_if_skip_sort_order(&join_tab[const_tables], group_list, ++ select_lex->first_in_union->select_limit_cnt, ++ 0))) || + select_distinct) && ++ tmp_table_param.quick_group && !procedure) + { + need_tmp=1; simple_order=simple_group=0; // Force tmp table without sort + } ++ DBUG_RETURN(0); ++ } ++ ++ /* ++ global uptimisation (with subselect) must be here (TODO) ++ */ ++ ++ int ++ JOIN::global_optimize() ++ { ++ return 0; ++ } ++ ++ /* ++ exec select ++ */ ++ ++ void ++ JOIN::exec() ++ { ++ int tmp_error; ++ ++ DBUG_ENTER("JOIN::exec"); ++ ++ if (test_function_query) ++ { // Only test of functions ++ error=0; ++ if (select_options & SELECT_DESCRIBE) ++ { ++ if (select_lex->next) ++ select_describe(this, false, false, false, "No tables used"); ++ else ++ describe_info(thd, "No tables used"); ++ } ++ else ++ { ++ result->send_fields(fields_list,1); ++ if (!having || having->val_int()) ++ { ++ if (do_send_rows && result->send_data(fields_list)) ++ { ++ result->send_error(0,NullS); /* purecov: inspected */ ++ error=1; ++ } ++ else ++ error=(int) result->send_eof(); ++ } ++ else ++ error=(int) result->send_eof(); ++ } ++ delete procedure; ++ DBUG_VOID_RETURN; ++ } ++ ++ if (zero_result_cause) ++ { ++ if (select_options & SELECT_DESCRIBE && select_lex->next) ++ select_describe(this, false, false, false, zero_result_cause); ++ else ++ error=return_zero_rows(result, tables_list, fields_list, ++ tmp_table_param.sum_func_count != 0 && ++ !group_list, ++ select_options, ++ zero_result_cause, ++ having,procedure, ++ select_lex->first_in_union); ++ DBUG_VOID_RETURN; ++ } ++ ++ Item *having_list = having; ++ having = 0; + + if (select_options & SELECT_DESCRIBE) + { + if (!order && !no_order) ++ order=group_list; + if (order && ++ (const_tables == tables || + (simple_order && ++ test_if_skip_sort_order(&join_tab[const_tables], order, ++ (const_tables != tables - 1 || ++ (select_options & OPTION_FOUND_ROWS)) ? ++ HA_POS_ERROR : ++ select_lex->first_in_union->select_limit_cnt, ++ 0)))) + order=0; ++ select_describe(this, need_tmp, + (order != 0 && ++ (!need_tmp || order != group_list || simple_group)), + select_distinct); + error=0; ++ DBUG_VOID_RETURN; + } + + /* Perform FULLTEXT search before all regular searches */ +*************** +*** 630,673 **** + DBUG_PRINT("info",("Creating tmp table")); + thd->proc_info="Creating tmp table"; + +- if (!(tmp_table = +- create_tmp_table(thd,&join.tmp_table_param,all_fields, + ((!simple_group && !procedure && + !(test_flags & TEST_NO_KEY_GROUP)) ? +- group : (ORDER*) 0), +- group ? 0 : select_distinct, +- group && simple_group, + (order == 0 || skip_sort_order) && +- !(join.select_options & OPTION_FOUND_ROWS), +- join.select_options))) +- goto err; /* purecov: inspected */ +- +- if (having && (join.sort_and_group || (tmp_table->distinct && !group))) +- join.having=having; + + /* if group or order on first table, sort first */ +- if (group && simple_group) + { + DBUG_PRINT("info",("Sorting for group")); + thd->proc_info="Sorting for group"; +- if (create_sort_index(&join.join_tab[join.const_tables],group, + HA_POS_ERROR) || +- make_sum_func_list(&join,all_fields) || +- alloc_group_fields(&join,group)) +- goto err; +- group=0; + } + else + { +- if (make_sum_func_list(&join,all_fields)) +- goto err; +- if (!group && ! tmp_table->distinct && order && simple_order) + { + DBUG_PRINT("info",("Sorting for order")); + thd->proc_info="Sorting for order"; +- if (create_sort_index(&join.join_tab[join.const_tables],order, + HA_POS_ERROR)) +- goto err; /* purecov: inspected */ + order=0; + } + } +--- 678,722 ---- + DBUG_PRINT("info",("Creating tmp table")); + thd->proc_info="Creating tmp table"; + ++ if (!(exec_tmp_table = ++ create_tmp_table(thd,&tmp_table_param,all_fields, + ((!simple_group && !procedure && + !(test_flags & TEST_NO_KEY_GROUP)) ? ++ group_list : (ORDER*) 0), ++ group_list ? 0 : select_distinct, ++ group_list && simple_group, + (order == 0 || skip_sort_order) && ++ !(select_options & OPTION_FOUND_ROWS), ++ select_options, select_lex->first_in_union))) ++ DBUG_VOID_RETURN; ++ ++ if (having_list && ++ (sort_and_group || (exec_tmp_table->distinct && !group_list))) ++ having=having_list; + + /* if group or order on first table, sort first */ ++ if (group_list && simple_group) + { + DBUG_PRINT("info",("Sorting for group")); + thd->proc_info="Sorting for group"; ++ if (create_sort_index(&join_tab[const_tables],group_list, + HA_POS_ERROR) || ++ make_sum_func_list(this, all_fields) || ++ alloc_group_fields(this, group_list)) ++ DBUG_VOID_RETURN; ++ group_list=0; + } + else + { ++ if (make_sum_func_list(this, all_fields)) ++ DBUG_VOID_RETURN; ++ if (!group_list && ! exec_tmp_table->distinct && order && simple_order) + { + DBUG_PRINT("info",("Sorting for order")); + thd->proc_info="Sorting for order"; ++ if (create_sort_index(&join_tab[const_tables], order, + HA_POS_ERROR)) ++ DBUG_VOID_RETURN; + order=0; + } + } +*************** +*** 678,735 **** + In this case we can stop scanning t2 when we have found one t1.a + */ + +- if (tmp_table->distinct) + { + table_map used_tables= thd->used_tables; +- JOIN_TAB *join_tab=join.join_tab+join.tables-1; + do + { + if (used_tables & join_tab->table->map) + break; + join_tab->not_used_in_distinct=1; +- } while (join_tab-- != join.join_tab); + /* Optimize "select distinct b from t1 order by key_part_1 limit #" */ + if (order && skip_sort_order) + { +- (void) test_if_skip_sort_order(&join.join_tab[join.const_tables], +- order, thd->select_limit,0); + order=0; + } + } + + /* Copy data to the temporary table */ + thd->proc_info="Copying to tmp table"; +- if ((tmp_error=do_select(&join,(List *) 0,tmp_table,0))) + { +- error=tmp_error; +- goto err; /* purecov: inspected */ + } +- if (join.having) +- join.having=having=0; // Allready done + + /* Change sum_fields reference to calculated fields in tmp_table */ +- if (join.sort_and_group || tmp_table->group) + { + if (change_to_use_tmp_fields(all_fields)) +- goto err; +- join.tmp_table_param.field_count+=join.tmp_table_param.sum_func_count+ +- join.tmp_table_param.func_count; +- join.tmp_table_param.sum_func_count=join.tmp_table_param.func_count=0; + } + else + { + if (change_refs_to_tmp_fields(thd,all_fields)) +- goto err; +- join.tmp_table_param.field_count+=join.tmp_table_param.func_count; +- join.tmp_table_param.func_count=0; + } + if (procedure) + procedure->update_refs(); +- if (tmp_table->group) + { // Already grouped + if (!order && !no_order) +- order=group; /* order by group */ +- group=0; + } + + /* +--- 727,786 ---- + In this case we can stop scanning t2 when we have found one t1.a + */ + ++ if (exec_tmp_table->distinct) + { + table_map used_tables= thd->used_tables; ++ JOIN_TAB *join_tab= this->join_tab+tables-1; + do + { + if (used_tables & join_tab->table->map) + break; + join_tab->not_used_in_distinct=1; ++ } while (join_tab-- != this->join_tab); + /* Optimize "select distinct b from t1 order by key_part_1 limit #" */ + if (order && skip_sort_order) + { ++ (void) test_if_skip_sort_order(&this->join_tab[const_tables], ++ order, ++ select_lex->first_in_union->select_limit_cnt, ++ 0); + order=0; + } + } + + /* Copy data to the temporary table */ + thd->proc_info="Copying to tmp table"; ++ if ((tmp_error=do_select(this, (List *) 0, exec_tmp_table, 0))) + { ++ error= tmp_error; ++ DBUG_VOID_RETURN; + } ++ if (having) ++ having= having_list= 0; // Allready done + + /* Change sum_fields reference to calculated fields in tmp_table */ ++ if (sort_and_group || exec_tmp_table->group) + { + if (change_to_use_tmp_fields(all_fields)) ++ DBUG_VOID_RETURN; ++ tmp_table_param.field_count+= tmp_table_param.sum_func_count+ ++ tmp_table_param.func_count; ++ tmp_table_param.sum_func_count= tmp_table_param.func_count= 0; + } + else + { + if (change_refs_to_tmp_fields(thd,all_fields)) ++ DBUG_VOID_RETURN; ++ tmp_table_param.field_count+= tmp_table_param.func_count; ++ tmp_table_param.func_count= 0; + } + if (procedure) + procedure->update_refs(); ++ if (exec_tmp_table->group) + { // Already grouped + if (!order && !no_order) ++ order= group_list; /* order by group */ ++ group_list= 0; + } + + /* +*************** +*** 740,892 **** + ** like SEC_TO_TIME(SUM(...)). + */ + +- if (group && (!test_if_subpart(group,order) || select_distinct) || + (select_distinct && +- join.tmp_table_param.using_indirect_summary_function)) + { /* Must copy to another table */ + TABLE *tmp_table2; + DBUG_PRINT("info",("Creating group table")); + + /* Free first data from old join */ +- join_free(&join); +- if (make_simple_join(&join,tmp_table)) +- goto err; +- calc_group_buffer(&join,group); +- count_field_types(&join.tmp_table_param,all_fields, +- select_distinct && !group); +- join.tmp_table_param.hidden_field_count=(all_fields.elements- +- fields.elements); + + /* group data to new table */ +- if (!(tmp_table2 = create_tmp_table(thd,&join.tmp_table_param,all_fields, + (ORDER*) 0, +- select_distinct && !group, + 1, 0, +- join.select_options))) +- goto err; /* purecov: inspected */ +- if (group) + { + thd->proc_info="Creating sort index"; +- if (create_sort_index(join.join_tab,group,HA_POS_ERROR) || +- alloc_group_fields(&join,group)) + { + free_tmp_table(thd,tmp_table2); /* purecov: inspected */ +- goto err; /* purecov: inspected */ + } +- group=0; + } + thd->proc_info="Copying to group table"; + tmp_error= -1; +- if (make_sum_func_list(&join,all_fields) || +- (tmp_error=do_select(&join,(List *) 0,tmp_table2,0))) + { + error=tmp_error; + free_tmp_table(thd,tmp_table2); +- goto err; /* purecov: inspected */ + } +- end_read_record(&join.join_tab->read_record); +- free_tmp_table(thd,tmp_table); +- join.const_tables=join.tables; // Mark free for join_free() +- tmp_table=tmp_table2; +- join.join_tab[0].table=0; // Table is freed + + if (change_to_use_tmp_fields(all_fields)) // No sum funcs anymore +- goto err; +- join.tmp_table_param.field_count+=join.tmp_table_param.sum_func_count; +- join.tmp_table_param.sum_func_count=0; + } + +- if (tmp_table->distinct) + select_distinct=0; /* Each row is unique */ + +- join_free(&join); /* Free quick selects */ +- if (select_distinct && ! group) + { + thd->proc_info="Removing duplicates"; +- if (having) +- having->update_used_tables(); +- if (remove_duplicates(&join,tmp_table,fields, having)) +- goto err; /* purecov: inspected */ +- having=0; + select_distinct=0; + } +- tmp_table->reginfo.lock_type=TL_UNLOCK; +- if (make_simple_join(&join,tmp_table)) +- goto err; +- calc_group_buffer(&join,group); +- count_field_types(&join.tmp_table_param,all_fields,0); + } + if (procedure) + { +- if (procedure->change_columns(fields) || +- result->prepare(fields)) +- goto err; +- count_field_types(&join.tmp_table_param,all_fields,0); + } +- if (join.group || join.tmp_table_param.sum_func_count || + (procedure && (procedure->flags & PROC_GROUP))) + { +- alloc_group_fields(&join,group); +- setup_copy_fields(thd, &join.tmp_table_param,all_fields); +- if (make_sum_func_list(&join,all_fields) || thd->fatal_error) +- goto err; /* purecov: inspected */ + } +- if (group || order) + { + DBUG_PRINT("info",("Sorting for send_fields")); + thd->proc_info="Sorting result"; + /* If we have already done the group, add HAVING to sorted table */ +- if (having && ! group && ! join.sort_and_group) + { +- having->update_used_tables(); // Some tables may have been const +- JOIN_TAB *table=&join.join_tab[join.const_tables]; +- table_map used_tables= join.const_table_map | table->table->map; + +- Item* sort_table_cond=make_cond_for_table(having,used_tables,used_tables); + if (sort_table_cond) + { + if (!table->select) + if (!(table->select=new SQL_SELECT)) +- goto err; + if (!table->select->cond) + table->select->cond=sort_table_cond; + else // This should never happen + if (!(table->select->cond=new Item_cond_and(table->select->cond, + sort_table_cond))) +- goto err; + table->select_cond=table->select->cond; + DBUG_EXECUTE("where",print_where(table->select->cond, + "select and having");); +- having=make_cond_for_table(having,~ (table_map) 0,~used_tables); + DBUG_EXECUTE("where",print_where(conds,"having after sort");); + } + } +- if (create_sort_index(&join.join_tab[join.const_tables], +- group ? group : order, +- (having || group || +- join.const_tables != join.tables - 1 || +- (join.select_options & OPTION_FOUND_ROWS)) ? +- HA_POS_ERROR : thd->select_limit)) +- goto err; /* purecov: inspected */ + } +- join.having=having; // Actually a parameter + thd->proc_info="Sending data"; +- error=do_select(&join,&fields,NULL,procedure); + +- err: +- thd->limit_found_rows = join.send_records; +- thd->examined_row_count = join.examined_rows; +- thd->proc_info="end"; +- join.lock=0; // It's faster to unlock later +- join_free(&join); +- thd->proc_info="end2"; // QQ +- if (tmp_table) +- free_tmp_table(thd,tmp_table); +- thd->proc_info="end3"; // QQ + delete select; + delete_dynamic(&keyuse); + delete procedure; +- thd->proc_info="end4"; // QQ + DBUG_RETURN(error); + } + +--- 791,987 ---- + ** like SEC_TO_TIME(SUM(...)). + */ + ++ if (group_list && (!test_if_subpart(group_list,order) || select_distinct) || + (select_distinct && ++ tmp_table_param.using_indirect_summary_function)) + { /* Must copy to another table */ + TABLE *tmp_table2; + DBUG_PRINT("info",("Creating group table")); + + /* Free first data from old join */ ++ join_free(this); ++ if (make_simple_join(this, exec_tmp_table)) ++ DBUG_VOID_RETURN; ++ calc_group_buffer(this, group_list); ++ count_field_types(&tmp_table_param, all_fields, ++ select_distinct && !group_list); ++ tmp_table_param.hidden_field_count= (all_fields.elements- ++ fields_list.elements); + + /* group data to new table */ ++ if (!(tmp_table2 = create_tmp_table(thd,&tmp_table_param, all_fields, + (ORDER*) 0, ++ select_distinct && !group_list, + 1, 0, ++ select_options, ++ select_lex->first_in_union))) ++ DBUG_VOID_RETURN; ++ if (group_list) + { + thd->proc_info="Creating sort index"; ++ if (create_sort_index(join_tab,group_list,HA_POS_ERROR) || ++ alloc_group_fields(this, group_list)) + { + free_tmp_table(thd,tmp_table2); /* purecov: inspected */ ++ DBUG_VOID_RETURN; + } ++ group_list=0; + } + thd->proc_info="Copying to group table"; + tmp_error= -1; ++ if (make_sum_func_list(this, all_fields) || ++ (tmp_error=do_select(this, (List *) 0,tmp_table2,0))) + { + error=tmp_error; + free_tmp_table(thd,tmp_table2); ++ DBUG_VOID_RETURN; + } ++ end_read_record(&join_tab->read_record); ++ free_tmp_table(thd,exec_tmp_table); ++ const_tables= tables; // Mark free for join_free() ++ exec_tmp_table= tmp_table2; ++ join_tab[0].table= 0; // Table is freed + + if (change_to_use_tmp_fields(all_fields)) // No sum funcs anymore ++ DBUG_VOID_RETURN; ++ tmp_table_param.field_count+= tmp_table_param.sum_func_count; ++ tmp_table_param.sum_func_count=0; + } + ++ if (exec_tmp_table->distinct) + select_distinct=0; /* Each row is unique */ + ++ join_free(this); /* Free quick selects */ ++ if (select_distinct && ! group_list) + { + thd->proc_info="Removing duplicates"; ++ if (having_list) ++ having_list->update_used_tables(); ++ if (remove_duplicates(this, exec_tmp_table, fields_list, having_list)) ++ DBUG_VOID_RETURN; ++ having_list=0; + select_distinct=0; + } ++ exec_tmp_table->reginfo.lock_type=TL_UNLOCK; ++ if (make_simple_join(this, exec_tmp_table)) ++ DBUG_VOID_RETURN; ++ calc_group_buffer(this, group_list); ++ count_field_types(&tmp_table_param, all_fields, 0); + } + if (procedure) + { ++ if (procedure->change_columns(fields_list) || ++ result->prepare(fields_list, select_lex->first_in_union)) ++ DBUG_VOID_RETURN; ++ count_field_types(&tmp_table_param,all_fields,0); + } ++ if (group || tmp_table_param.sum_func_count || + (procedure && (procedure->flags & PROC_GROUP))) + { ++ alloc_group_fields(this, group_list); ++ setup_copy_fields(thd, &tmp_table_param,all_fields); ++ if (make_sum_func_list(this, all_fields) || thd->fatal_error) ++ DBUG_VOID_RETURN; + } ++ if (group_list || order) + { + DBUG_PRINT("info",("Sorting for send_fields")); + thd->proc_info="Sorting result"; + /* If we have already done the group, add HAVING to sorted table */ ++ if (having_list && ! group_list && ! sort_and_group) + { ++ having_list->update_used_tables(); // Some tables may have been const ++ JOIN_TAB *table=&join_tab[const_tables]; ++ table_map used_tables= const_table_map | table->table->map; + ++ Item* sort_table_cond=make_cond_for_table(having_list, used_tables, ++ used_tables); + if (sort_table_cond) + { + if (!table->select) + if (!(table->select=new SQL_SELECT)) ++ DBUG_VOID_RETURN; + if (!table->select->cond) + table->select->cond=sort_table_cond; + else // This should never happen + if (!(table->select->cond=new Item_cond_and(table->select->cond, + sort_table_cond))) ++ DBUG_VOID_RETURN; + table->select_cond=table->select->cond; + DBUG_EXECUTE("where",print_where(table->select->cond, + "select and having");); ++ having_list= make_cond_for_table(having_list, ~ (table_map) 0, ++ ~used_tables); + DBUG_EXECUTE("where",print_where(conds,"having after sort");); + } + } ++ if (create_sort_index(&join_tab[const_tables], ++ group_list ? group_list : order, ++ (having_list || group_list || ++ const_tables != tables - 1 || ++ (select_options & OPTION_FOUND_ROWS)) ? ++ HA_POS_ERROR : ++ select_lex->first_in_union->select_limit_cnt)) ++ DBUG_VOID_RETURN; + } ++ having=having_list; // Actually a parameter + thd->proc_info="Sending data"; ++ error=do_select(this, &fields_list, NULL, procedure); ++ DBUG_VOID_RETURN; ++ } + ++ /* ++ Clean up join. Return error that hold JOIN. ++ */ ++ ++ int ++ JOIN::cleanup(THD *thd) ++ { ++ lock=0; // It's faster to unlock later ++ join_free(this); ++ if (exec_tmp_table) ++ free_tmp_table(thd, exec_tmp_table); + delete select; + delete_dynamic(&keyuse); + delete procedure; ++ return error; ++ } ++ ++ int ++ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, ++ ORDER *order, ORDER *group,Item *having,ORDER *proc_param, ++ ulong select_options,select_result *result) ++ { ++ JOIN *join = new JOIN(thd, fields, select_options, result); ++ ++ DBUG_ENTER("mysql_select"); ++ thd->proc_info="init"; ++ thd->used_tables=0; // Updated by setup_fields ++ ++ if (join->prepare(tables, conds, order, group, having, proc_param, ++ &(thd->lex.select_lex))) ++ { ++ DBUG_RETURN(-1); ++ } ++ switch(join->optimize()) ++ { ++ case 1: ++ DBUG_RETURN(join->error); ++ case -1: ++ goto err; ++ } ++ ++ if(join->global_optimize()) ++ goto err; ++ ++ join->exec(); ++ ++ err: ++ thd->limit_found_rows = join->send_records; ++ thd->examined_row_count = join->examined_rows; ++ thd->proc_info="end"; ++ int error= join->cleanup(thd); ++ delete join; + DBUG_RETURN(error); + } + +*************** +*** 2480,2486 **** + + if ((tab->keys & ~ tab->const_keys && i > 0) || + (tab->const_keys && i == join->const_tables && +- join->thd->select_limit < join->best_positions[i].records_read && + !(join->select_options & OPTION_FOUND_ROWS))) + { + /* Join with outer join condition */ +--- 2575,2582 ---- + + if ((tab->keys & ~ tab->const_keys && i > 0) || + (tab->const_keys && i == join->const_tables && ++ join->select_lex->first_in_union->select_limit_cnt < ++ join->best_positions[i].records_read && + !(join->select_options & OPTION_FOUND_ROWS))) + { + /* Join with outer join condition */ +*************** +*** 2491,2497 **** + (join->select_options & + OPTION_FOUND_ROWS ? + HA_POS_ERROR : +- join->thd->select_limit)) < 0) + DBUG_RETURN(1); // Impossible range + sel->cond=orig_cond; + } +--- 2587,2593 ---- + (join->select_options & + OPTION_FOUND_ROWS ? + HA_POS_ERROR : ++ join->select_lex->first_in_union->select_limit_cnt)) < 0) + DBUG_RETURN(1); // Impossible range + sel->cond=orig_cond; + } +*************** +*** 2933,2939 **** + static int + return_zero_rows(select_result *result,TABLE_LIST *tables,List &fields, + bool send_row, uint select_options,const char *info, +- Item *having, Procedure *procedure) + { + DBUG_ENTER("return_zero_rows"); + +--- 3029,3035 ---- + static int + return_zero_rows(select_result *result,TABLE_LIST *tables,List &fields, + bool send_row, uint select_options,const char *info, ++ Item *having, Procedure *procedure, SELECT_LEX *select_lex) + { + DBUG_ENTER("return_zero_rows"); + +*************** +*** 2944,2950 **** + } + if (procedure) + { +- if (result->prepare(fields)) // This hasn't been done yet + DBUG_RETURN(-1); + } + if (send_row) +--- 3040,3047 ---- + } + if (procedure) + { ++ if (result->prepare(fields, ++ select_lex->first_in_union))//This hasn't been done yet + DBUG_RETURN(-1); + } + if (send_row) +*************** +*** 3479,3485 **** + TABLE * + create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List &fields, + ORDER *group, bool distinct, bool save_sum_fields, +- bool allow_distinct_limit, ulong select_options) + { + TABLE *table; + uint i,field_count,reclength,null_count,null_pack_length, +--- 3576,3583 ---- + TABLE * + create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List &fields, + ORDER *group, bool distinct, bool save_sum_fields, ++ bool allow_distinct_limit, ulong select_options, ++ SELECT_LEX *first_select) + { + TABLE *table; + uint i,field_count,reclength,null_count,null_pack_length, +*************** +*** 3850,3857 **** + test(null_pack_length)); + if (allow_distinct_limit) + { +- set_if_smaller(table->max_rows,thd->select_limit); +- param->end_write_records=thd->select_limit; + } + else + param->end_write_records= HA_POS_ERROR; +--- 3948,3955 ---- + test(null_pack_length)); + if (allow_distinct_limit) + { ++ set_if_smaller(table->max_rows,first_select->select_limit_cnt); ++ param->end_write_records=first_select->select_limit_cnt; + } + else + param->end_write_records= HA_POS_ERROR; +*************** +*** 4896,4902 **** + error=join->result->send_data(*join->fields); + if (error) + DBUG_RETURN(-1); /* purecov: inspected */ +- if (++join->send_records >= join->thd->select_limit && join->do_send_rows) + { + if (join->select_options & OPTION_FOUND_ROWS) + { +--- 4994,5002 ---- + error=join->result->send_data(*join->fields); + if (error) + DBUG_RETURN(-1); /* purecov: inspected */ ++ if (++join->send_records >= ++ join->select_lex->first_in_union->select_limit_cnt && ++ join->do_send_rows) + { + if (join->select_options & OPTION_FOUND_ROWS) + { +*************** +*** 4912,4918 **** + else + { + join->do_send_rows=0; +- join->thd->select_limit = HA_POS_ERROR; + DBUG_RETURN(0); + } + } +--- 5012,5018 ---- + else + { + join->do_send_rows=0; ++ join->select_lex->first_in_union->select_limit_cnt = HA_POS_ERROR; + DBUG_RETURN(0); + } + } +*************** +*** 4973,4985 **** + DBUG_RETURN(-1); /* purecov: inspected */ + if (end_of_records) + DBUG_RETURN(0); +- if (!error && ++join->send_records >= join->thd->select_limit && + join->do_send_rows) + { + if (!(join->select_options & OPTION_FOUND_ROWS)) + DBUG_RETURN(-3); // Abort nicely + join->do_send_rows=0; +- join->thd->select_limit = HA_POS_ERROR; + } + } + } +--- 5073,5086 ---- + DBUG_RETURN(-1); /* purecov: inspected */ + if (end_of_records) + DBUG_RETURN(0); ++ if (!error && ++join->send_records >= ++ join->select_lex->first_in_union->select_limit_cnt && + join->do_send_rows) + { + if (!(join->select_options & OPTION_FOUND_ROWS)) + DBUG_RETURN(-3); // Abort nicely + join->do_send_rows=0; ++ join->select_lex->first_in_union->select_limit_cnt = HA_POS_ERROR; + } + } + } +*************** +*** 5060,5066 **** + if (!(join->select_options & OPTION_FOUND_ROWS)) + DBUG_RETURN(-3); + join->do_send_rows=0; +- join->thd->select_limit = HA_POS_ERROR; + DBUG_RETURN(0); + } + } +--- 5161,5167 ---- + if (!(join->select_options & OPTION_FOUND_ROWS)) + DBUG_RETURN(-3); + join->do_send_rows=0; ++ join->select_lex->first_in_union->select_limit_cnt = HA_POS_ERROR; + DBUG_RETURN(0); + } + } +*************** +*** 5743,5749 **** + + if (!field_count) + { // only const items +- join->thd->select_limit=1; // Only send first row + DBUG_RETURN(0); + } + Field **first_field=entry->field+entry->fields - field_count; +--- 5844,5850 ---- + + if (!field_count) + { // only const items ++ join->select_lex->first_in_union->select_limit_cnt=1;// Only send first row + DBUG_RETURN(0); + } + Field **first_field=entry->field+entry->fields - field_count; diff --git a/sql/sql_select.h b/sql/sql_select.h index 5466974f587..ba27c5b4b3b 100644 --- a/sql/sql_select.h +++ b/sql/sql_select.h @@ -149,8 +149,7 @@ class TMP_TABLE_PARAM { } }; - -class JOIN { +class JOIN :public Sql_alloc{ public: JOIN_TAB *join_tab,**best_ref,**map2table; TABLE **table,**all_tables,*sort_by_table; @@ -175,6 +174,70 @@ class JOIN { MYSQL_LOCK *lock; // unit structure (with global parameters) for this select SELECT_LEX_UNIT *unit; + // select that processed + SELECT_LEX *select_lex; + + bool select_distinct, //Is select distinct? + no_order, simple_order, simple_group, + skip_sort_order, need_tmp, + hidden_group_fields, + buffer_result; + DYNAMIC_ARRAY keyuse; + Item::cond_result cond_value; + List all_fields; + List & fields_list; // hold field list passed to mysql_select + int error; + + ORDER *order, *group_list, *proc_param; //hold parameters of mysql_select + COND *conds; // ---"--- + TABLE_LIST *tables_list; //hold 'tables' parameter of mysql_selec + SQL_SELECT *select; //created in optimisation phase + TABLE *exec_tmp_table; //used in 'exec' to hold temporary + + my_bool test_function_query; // need to return select items 1 row + const char *zero_result_cause; // not 0 if exec must return zero result + + JOIN(THD *thd, List &fields, + ulong select_options, select_result *result): + join_tab(0), + table(0), + tables(0), const_tables(0), + sort_and_group(0), first_record(0), + do_send_rows(1), + send_records(0), found_records(0), examined_rows(0), + thd(thd), + sum_funcs(0), + having(0), + select_options(select_options), + result(result), + lock(thd->lock), + select_lex(0), //for safety + select_distinct(test(select_options & SELECT_DISTINCT)), + no_order(0), simple_order(0), simple_group(0), skip_sort_order(0), + need_tmp(0), + hidden_group_fields (0), /*safety*/ + buffer_result(test(select_options & OPTION_BUFFER_RESULT) && + !test(select_options & OPTION_FOUND_ROWS)), + all_fields(fields), + fields_list(fields), + select(0), + exec_tmp_table(0), + test_function_query(0), + zero_result_cause(0) + { + fields_list = fields; + bzero((char*) &keyuse,sizeof(keyuse)); + tmp_table_param.copy_field=0; + tmp_table_param.end_write_records= HA_POS_ERROR; + } + + int prepare(TABLE_LIST *tables, + COND *conds, ORDER *order, ORDER *group, Item *having, + ORDER *proc_param, SELECT_LEX *select, SELECT_LEX_UNIT *unit); + int optimize(); + int global_optimize(); + void exec(); + int cleanup(THD *thd); }; diff --git a/sql/sql_select.h.rej b/sql/sql_select.h.rej new file mode 100644 index 00000000000..07b1c4403f9 --- /dev/null +++ b/sql/sql_select.h.rej @@ -0,0 +1,96 @@ +*************** +*** 173,178 **** + select_result *result; + TMP_TABLE_PARAM tmp_table_param; + MYSQL_LOCK *lock; + }; + + +--- 172,240 ---- + select_result *result; + TMP_TABLE_PARAM tmp_table_param; + MYSQL_LOCK *lock; ++ ++ bool select_distinct, //Is select distinct? ++ no_order, simple_order, simple_group, ++ skip_sort_order, need_tmp, ++ hidden_group_fields, ++ buffer_result; ++ DYNAMIC_ARRAY keyuse; ++ Item::cond_result cond_value; ++ List all_fields; ++ List & fields_list; // hold field list passed to mysql_select ++ int error; ++ ++ ORDER *order, *group_list, *proc_param; //hold parameters of mysql_select ++ COND *conds; // ---"--- ++ TABLE_LIST *tables_list; //hold 'tables' parameter of mysql_select ++ SQL_SELECT *select; //created in optimisation phase ++ TABLE *exec_tmp_table; //used in 'exec' to hold temporary table ++ SELECT_LEX *select_lex; //corresponding select_lex ++ ++ my_bool test_function_query; // need to return select items 1 row ++ const char *zero_result_cause; // not 0 if exec must return zero result ++ ++ JOIN(THD *thd, List &fields, ++ ulong select_options, select_result *result): ++ join_tab(0), ++ table(0), ++ tables(0), const_tables(0), ++ sort_and_group(0), first_record(0), ++ do_send_rows(1), ++ send_records(0), found_records(0), examined_rows(0), ++ thd(thd), ++ sum_funcs(0), ++ having(0), ++ select_options(select_options), ++ result(result), ++ lock(thd->lock), ++ select_distinct(test(select_options & SELECT_DISTINCT)), ++ no_order(0), simple_order(0), simple_group(0), skip_sort_order(0), ++ need_tmp(0), ++ hidden_group_fields (0), /*safety*/ ++ buffer_result(test(select_options & OPTION_BUFFER_RESULT) && ++ !test(select_options & OPTION_FOUND_ROWS)), ++ all_fields(fields), ++ fields_list(fields), ++ select(0), ++ exec_tmp_table(0), ++ select_lex(0), //for safety ++ test_function_query(0), ++ zero_result_cause(0) ++ { ++ fields_list = fields; ++ bzero((char*) &keyuse,sizeof(keyuse)); ++ tmp_table_param.copy_field=0; ++ tmp_table_param.end_write_records= HA_POS_ERROR; ++ } ++ ++ int prepare(TABLE_LIST *tables, ++ COND *conds, ORDER *order, ORDER *group, Item *having, ++ ORDER *proc_param, SELECT_LEX *select); ++ int optimize(); ++ int global_optimize(); ++ void exec(); ++ int cleanup(THD *thd); + }; + + +*************** +*** 187,193 **** + bool store_val_in_field(Field *field,Item *val); + TABLE *create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List &fields, + ORDER *group, bool distinct, bool save_sum_fields, +- bool allow_distinct_limit, ulong select_options); + void free_tmp_table(THD *thd, TABLE *entry); + void count_field_types(TMP_TABLE_PARAM *param, List &fields, + bool reset_with_sum_func); +--- 249,256 ---- + bool store_val_in_field(Field *field,Item *val); + TABLE *create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List &fields, + ORDER *group, bool distinct, bool save_sum_fields, ++ bool allow_distinct_limit, ulong select_options, ++ SELECT_LEX *first_select); + void free_tmp_table(THD *thd, TABLE *entry); + void count_field_types(TMP_TABLE_PARAM *param, List &fields, + bool reset_with_sum_func); diff --git a/sql/sql_union.cc b/sql/sql_union.cc index ef34af6fe1e..b5db593a234 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -40,17 +40,6 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) DBUG_ENTER("mysql_union"); st_select_lex_node * global; - /* Fix tables 'to-be-unioned-from' list to point at opened tables */ - for (sl= &lex->select_lex; - sl; - sl= (SELECT_LEX *) sl->next) - { - for (TABLE_LIST *cursor= (TABLE_LIST *)sl->table_list.first; - cursor; - cursor=cursor->next) - cursor->table= cursor->table_list->table; - } - /* Global option */ if (((void*)(global= unit->global_parameters)) == ((void*)unit)) { diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index bd7a5ff3b48..8d981f05a1f 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -544,7 +544,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); literal text_literal insert_ident order_ident simple_ident select_item2 expr opt_expr opt_else sum_expr in_sum_expr table_wild opt_pad no_in_expr expr_expr simple_expr no_and_expr - using_list + using_list subselect subselect_init %type expr_list udf_expr_list when_list ident_list ident_list_arg @@ -612,7 +612,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); table_to_table_list table_to_table opt_table_list opt_as handler_rkey_function handler_read_or_scan single_multi table_wild_list table_wild_one opt_wild union union_list - precision union_option + precision union_option subselect_start subselect_end END_OF_INPUT %type @@ -1547,8 +1547,8 @@ optional_braces: | '(' ')' {} /* all possible expressions */ -expr: expr_expr {$$ = $1; } - | simple_expr {$$ = $1; } +expr: expr_expr { $$= $1; } + | simple_expr { $$= $1; } /* expressions that begin with 'expr' */ expr_expr: @@ -1688,6 +1688,7 @@ simple_expr: | NOT expr %prec NEG { $$= new Item_func_not($2); } | '!' expr %prec NEG { $$= new Item_func_not($2); } | '(' expr ')' { $$= $2; } + | subselect { $$= $1; } | '{' ident expr '}' { $$= $3; } | MATCH ident_list_arg AGAINST '(' expr ')' { Select->ftfunc_list.push_back((Item_func_match *) @@ -3849,3 +3850,30 @@ optional_order_or_limit: union_option: /* empty */ {} | ALL {Lex->union_option=1;} + +subselect: + subselect_start subselect_init + subselect_end + { + $$= $2; + } + +subselect_init: + select_init + { + $$= new Item_subselect(current_thd, Lex->select); + } + +subselect_start: + '(' + { + if (mysql_new_select(Lex, 1)) + YYABORT; + } + +subselect_end: + ')' + { + LEX *lex=Lex; + lex->select = (SELECT_LEX*)lex->select->master->master; + } -- cgit v1.2.1 From 9017573d1d5992e89bb8e80a0f51778d109bce13 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 13 May 2002 18:18:27 +0500 Subject: New Serbian error.txt --- sql/share/serbian/errmsg.txt | 234 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 234 insertions(+) create mode 100644 sql/share/serbian/errmsg.txt diff --git a/sql/share/serbian/errmsg.txt b/sql/share/serbian/errmsg.txt new file mode 100644 index 00000000000..051924f799f --- /dev/null +++ b/sql/share/serbian/errmsg.txt @@ -0,0 +1,234 @@ +/* Copyright Abandoned 1997 TCX DataKonsult AB & Monty Program KB & Detron HB + This file is public domain and comes with NO WARRANTY of any kind */ + +/* Serbian Translation, version 1.0: + Copyright 2002 Vladimir Kraljevic, vladimir_kraljevic@yahoo.com + This file is public domain and comes with NO WARRANTY of any kind */ + +"hashchk", +"isamchk", +"NE", +"DA", +"Ne mogu da kreiram file '%-.64s' (errno: %d)", +"Ne mogu da kreiram tabelu '%-.64s' (errno: %d)", +"Ne mogu da kreiram bazu '%-.64s'. (errno: %d)", +"Ne mogu da kreiram bazu '%-.64s'. Baza veæ postoji.", +"Ne mogu da izbrišem bazu '%-.64s'. Baza ne postoji.", +"Ne mogu da izbrišem bazu (ne mogu da izbrišem '%-.64s', errno: %d)", +"Ne mogu da izbrišem bazu (ne mogu da izbrišem direktorijum '%-.64s', errno: %d)", +"Greška pri brisanju '%-.64s' (errno: %d)", +"Ne mogu da proèitam slog iz sistemske tabele", +"Ne mogu da dobijem stanje file-a '%-.64s' (errno: %d)", +"Ne mogu da dobijem trenutni direktorijum (errno: %d)", +"Ne mogu da zakljuèam file (errno: %d)", +"Ne mogu da otvorim file: '%-.64s'. (errno: %d)", +"Ne mogu da pronaðem file: '%-.64s' (errno: %d)", +"Ne mogu da proèitam direktorijum '%-.64s' (errno: %d)", +"Ne mogu da promenim direktorijum na '%-.64s' (errno: %d)", +"Slog je promenjen od zadnjeg èitanja tabele '%-.64s'", +"Disk je pun (%s). Èekam nekoga da doðe i oslobodi nešto mesta....", +"Ne mogu da pišem pošto postoji duplirani kljuè u tabeli '%-.64s'", +"Greška pri zatvaranju '%-.64s' (errno: %d)", +"Greška pri èitanju file-a '%-.64s' (errno: %d)", +"Greška pri promeni imena '%-.64s' na '%-.64s' (errno: %d)", +"Greška pri upisu '%-.64s' (errno: %d)", +"'%-.64s' je zakljuèan za upis", +"Sortiranje je prekinuto", +"View '%-.64s' ne postoji za '%-.64s'", +"Handler tabela je vratio grešku %d", +"Handler tabela za '%-.64s' nema ovu opciju", +"Ne mogu da pronaðem slog u '%-.64s'", +"Pogrešna informacija u file-u: '%-.64s'", +"Pogrešan key file za tabelu: '%-.64s'. Probajte da ga ispravite", +"Zastareo key file za tabelu '%-.64s'; Ispravite ga", +"Tabelu '%-.64s' je dozvoljeno samo èitati", +"Nema memorije. Restartujte MySQL server i probajte ponovo (potrebno je %d byte-ova)", +"Nema memorije za sortiranje. Poveæajte velièinu sort buffer-a MySQL server-u", +"Neoèekivani kraj pri èitanju file-a '%-.64s' (errno: %d)", +"Previše konekcija", +"Nema memorije; Proverite da li MySQL server ili neki drugi proces koristi svu slobodnu memoriju. (UNIX: Ako ne, probajte da upotrebite 'ulimit' komandu da biste dozvolili daemon-u da koristi više memorije ili probajte da dodate više swap memorije)", +"Ne mogu da dobijem ime host-a za vašu IP adresu", +"Loš poèetak komunikacije (handshake)", +"Pristup je zabranjen korisniku '%-.32s@%-.64s' za bazu '%-.64s'", +"Pristup je zabranjen korisniku '%-.32s@%-.64s' (koristi lozinku: '%s')", +"Ni jedna baza nije selektovana", +"Nepoznata komanda", +"Kolona '%-.64s' ne može biti NULL", +"Nepoznata baza '%-.64s'", +"Tabela '%-.64s' veæ postoji", +"Nepoznata tabela '%-.64s'", +"Kolona '%-.64s' u %-.64s nije jedinstvena u kontekstu", +"Gašenje servera je u toku", +"Nepoznata kolona '%-.64s' u '%-.64s'", +"Entitet '%-.64s' nije naveden u komandi 'GROUP BY'", +"Ne mogu da grupišem po '%-.64s'", +"Izraz ima 'SUM' agregatnu funkciju i kolone u isto vreme", +"Broj kolona ne odgovara broju vrednosti", +"Ime '%-.100s' je predugaèko", +"Duplirano ime kolone '%-.64s'", +"Duplirano ime kljuèa '%-.64s'", +"Dupliran unos '%-.64s' za kljuè '%d'", +"Pogrešan naziv kolone za kolonu '%-.64s'", +"'%s' u iskazu '%-.80s' na liniji %d", +"Upit je bio prazan", +"Tabela ili alias nisu bili jedinstveni: '%-.64s'", +"Loša default vrednost za '%-.64s'", +"Definisani višestruki primarni kljuèevi", +"Navedeno je previše kljuèeva. Maksimum %d kljuèeva je dozvoljeno", +"Navedeno je previše delova kljuèa. Maksimum %d delova je dozvoljeno", +"Navedeni kljuè je predug. Maksimalna dužina kljuèa je %d", +"Kljuèna kolona '%-.64s' ne postoji u tabeli", +"BLOB kolona '%-.64s' ne može biti upotrebljena za navoðenje kljuèa sa tipom tabele koji se trenutno koristi", +"Previše podataka za kolonu '%-.64s' (maksimum je %d). Upotrebite BLOB polje", +"Pogrešna definicija tabele; U tabeli može postojati samo jedna 'AUTO' kolona i ona mora biti istovremeno definisana kao kolona kljuèa", +"%s: Spreman za konekcije\n", +"%s: Normalno gašenje\n", +"%s: Dobio signal %d. Prekidam!\n", +"%s: Gašenje završeno\n", +"%s: Usiljeno gašenje thread-a %ld koji pripada korisniku: '%-.32s'\n", +"Ne mogu da kreiram IP socket", +"Tabela '%-.64s' nema isti indeks kao onaj upotrebljen pri komandi 'CREATE INDEX'. Napravite tabelu ponovo", +"Argument separatora polja nije ono što se oèekivalo. Proverite uputstvo MySQL server-a", +"Ne možete koristiti fiksnu velièinu sloga kada imate BLOB polja. Molim koristite 'fields terminated by' opciju.", +"File '%-.64s' mora biti u direktorijumu gde su file-ovi baze i mora imati odgovarajuæa prava pristupa", +"File '%-.80s' veæ postoji", +"Slogova: %ld Izbrisano: %ld Preskoèeno: %ld Upozorenja: %ld", +"Slogova: %ld Duplikata: %ld", +"Pogrešan pod-kljuè dela kljuèa. Upotrebljeni deo kljuèa nije string, upotrebljena dužina je veæa od dela kljuèa ili handler tabela ne podržava jedinstvene pod-kljuèeve", +"Ne možete da izbrišete sve kolone pomoæu komande 'ALTER TABLE'. Upotrebite komandu 'DROP TABLE' ako želite to da uradite", +"Ne mogu da izvršim komandu drop 'DROP' na '%-.64s'. Proverite da li ta kolona (odnosno kljuè) postoji", +"Slogova: %ld Duplikata: %ld Upozorenja: %ld", +"Komanda 'INSERT TABLE' na '%-.64s' nije dozvoljena u listi 'FROM' tabela", +"Nepoznat thread identifikator: %lu", +"Vi niste vlasnik thread-a %lu", +"Nema upotrebljenih tabela", +"Previše string-ova za kolonu '%-.64s' i komandu 'SET'", +"Ne mogu da generišem jedinstveno ime log-file-a: '%-.64s.(1-999)'\n", +"Tabela '%-.64s' je zakljuèana READ lock-om; iz nje se može samo èitati ali u nju se ne može pisati", +"Tabela '%-.64s' nije bila zakljuèana komandom 'LOCK TABLES'", +"BLOB kolona '%-.64s' ne može imati default vrednost", +"Pogrešno ime baze '%-.100s'", +"Pogrešno ime tabele '%-.100s'", +"Komanda 'SELECT' æe ispitati previše slogova i potrošiti previše vremena. Proverite vaš 'WHERE' filter i upotrebite 'SET OPTION SQL_BIG_SELECTS=1' ako želite baš ovakvu komandu", +"Nepoznata greška", +"Nepoznata procedura '%-.64s'", +"Pogrešan broj parametara za proceduru '%-.64s'", +"Pogrešni parametri prosleðeni proceduri '%-.64s'", +"Nepoznata tabela '%-.64s' u '%-.32s'", +"Kolona '%-.64s' je navedena dva puta", +"Pogrešna upotreba 'GROUP' funkcije", +"Tabela '%-.64s' koristi ekstenziju koje ne postoji u ovoj verziji MySQL-a", +"Tabela mora imati najmanje jednu kolonu", +"Tabela '%-.64s' je popunjena do kraja", +"Nepoznati karakter-set: '%-.64s'", +"Previše tabela. MySQL može upotrebiti maksimum %d tabela pri 'JOIN' operaciji", +"Previše kolona", +"Prevelik slog. Maksimalna velièina sloga, ne raèunajuæi BLOB polja, je %d. Trebali bi da promenite tip nekih polja u BLOB", +"Prepisivanje thread stack-a: Upotrebljeno: %ld od %ld stack memorije. Upotrebite 'mysqld -O thread_stack=#' da navedete veæi stack ako je potrebno", +"Unakrsna zavisnost pronaðena u komandi 'OUTER JOIN'. Istražite vaše 'ON' uslove", +"Kolona '%-.64s' je upotrebljena kao 'UNIQUE' ili 'INDEX' ali nije definisana kao 'NOT NULL'", +"Ne mogu da uèitam funkciju '%-.64s'", +"Ne mogu da inicijalizujem funkciju '%-.64s'; %-.80s", +"Ne postoje dozvoljene putanje do share-ovane biblioteke", +"Funkcija '%-.64s' veæ postoji", +"Ne mogu da otvorim share-ovanu biblioteku '%-.64s' (errno: %d %-.64s)", +"Ne mogu da pronadjem funkciju '%-.64s' u biblioteci", +"Funkcija '%-.64s' nije definisana", +"Host '%-.64s' je blokiran zbog previše grešaka u konekciji. Možete ga odblokirati pomoæu komande 'mysqladmin flush-hosts'", +"Host-u '%-.64s' nije dozvoljeno da se konektuje na ovaj MySQL server", +"Vi koristite MySQL kao anonimni korisnik a anonimnim korisnicima nije dozvoljeno da menjaju lozinke", +"Morate imati privilegije da možete da update-ujete odreðene tabele ako želite da menjate lozinke za druge korisnike", +"Ne mogu da pronaðem odgovarajuæi slog u 'user' tabeli", +"Odgovarajuæih slogova: %ld Promenjeno: %ld Upozorenja: %ld", +"Ne mogu da kreiram novi thread (errno %d). Ako imate još slobodne memorije, trebali biste da pogledate u priruèniku da li je ovo specifièna greška vašeg operativnog sistema", +"Broj kolona ne odgovara broju vrednosti u slogu %ld", +"Ne mogu da ponovo otvorim tabelu '%-.64s'", +"Pogrešna upotreba vrednosti NULL", +"Funkcija regexp je vratila grešku '%-.64s'", +"Upotreba agregatnih funkcija (MIN(),MAX(),COUNT()...) bez 'GROUP' kolona je pogrešna ako ne postoji 'GROUP BY' iskaz", +"Ne postoji odobrenje za pristup korisniku '%-.32s' na host-u '%-.64s'", +"%-.16s komanda zabranjena za korisnika '%-.32s@%-.64s' za tabelu '%-.64s'", +"%-.16s komanda zabranjena za korisnika '%-.32s@%-.64s' za kolonu '%-.64s' iz tabele '%-.64s'", +"Pogrešna 'GRANT' odnosno 'REVOKE' komanda. Molim Vas pogledajte u priruèniku koje vrednosti mogu biti upotrebljene.", +"Argument 'host' ili 'korisnik' prosleðen komandi 'GRANT' je predugaèak", +"Tabela '%-.64s.%-.64s' ne postoji", +"Ne postoji odobrenje za pristup korisniku '%-.32s' na host-u '%-.64s' tabeli '%-.64s'", +"Upotrebljena komanda nije dozvoljena sa ovom verzijom MySQL servera", +"Imate grešku u vašoj SQL sintaksi", +"Prolongirani 'INSERT' thread nije mogao da dobije traženo zakljuèavanje tabele '%-.64s'", +"Previše prolongiranih thread-ova je u upotrebi", +"Prekinuta konekcija broj %ld ka bazi: '%-.64s' korisnik je bio: '%-.32s' (%-.64s)", +"Primio sam mrežni paket veæi od definisane vrednosti 'max_allowed_packet'", +"Greška pri èitanju podataka sa pipe-a", +"Greška pri izvršavanju funkcije fcntl()", +"Primio sam mrežne pakete van reda", +"Ne mogu da dekompresujem mrežne pakete", +"Greška pri primanju mrežnih paketa", +"Vremenski limit za èitanje mrežnih paketa je istekao", +"Greška pri slanju mrežnih paketa", +"Vremenski limit za slanje mrežnih paketa je istekao", +"Rezultujuèi string je duži nego što to dozvoljava parametar servera 'max_allowed_packet'", +"Iskorišteni tip tabele ne podržava kolone tipa 'BLOB' odnosno 'TEXT'", +"Iskorišteni tip tabele ne podržava kolone tipa 'AUTO_INCREMENT'", +"Komanda 'INSERT DELAYED' ne može biti iskorištena u tabeli '%-.64s', zbog toga što je zakljuèana komandom 'LOCK TABLES'", +"Pogrešno ime kolone '%-.100s'", +"Handler tabele ne može da indeksira kolonu '%-.64s'", +"Tabele iskorištene u 'MERGE' tabeli nisu definisane na isti naèin", +"Zbog provere jedinstvenosti ne mogu da upišem podatke u tabelu '%-.64s'", +"BLOB kolona '%-.64s' je upotrebljena u specifikaciji kljuèa bez navoðenja dužine kljuèa", +"Svi delovi primarnog kljuèa moraju biti razlièiti od NULL; Ako Vam ipak treba NULL vrednost u kljuèu, upotrebite 'UNIQUE'", +"Rezultat je saèinjen od više slogova", +"Ovaj tip tabele zahteva da imate definisan primarni kljuè", +"Ova verzija MySQL servera nije kompajlirana sa podrškom za RAID ureðaje", +"Vi koristite safe update mod servera, a probali ste da promenite podatke bez 'WHERE' komande koja koristi kolonu kljuèa", +"Kljuè '%-.64s' ne postoji u tabeli '%-.64s'", +"Ne mogu da otvorim tabelu", +"Handler za ovu tabelu ne dozvoljava 'check' odnosno 'repair' komande", +"Nije Vam dozvoljeno da izvršite ovu komandu u transakciji", +"Greška %d za vreme izvršavanja komande 'COMMIT'", +"Greška %d za vreme izvršavanja komande 'ROLLBACK'", +"Greška %d za vreme izvršavanja komande 'FLUSH_LOGS'", +"Greška %d za vreme izvršavanja komande 'CHECKPOINT'", +"Prekinuta konekcija broj %ld ka bazi: '%-.64s' korisnik je bio: '%-.32s' a host: `%-.64s' (%-.64s)", +"Handler tabele ne podržava binarni dump tabele", +"Binarni log file zatvoren, ne mogu da izvršim komandu 'RESET MASTER'", +"Izgradnja indeksa dump-ovane tabele '%-.64s' nije uspela", +"Greška iz glavnog servera '%-.64s' u klasteru", +"Greška u primanju mrežnih paketa sa glavnog servera u klasteru", +"Greška u slanju mrežnih paketa na glavni server u klasteru", +"Ne mogu da pronaðem 'FULLTEXT' indeks koli odgovara listi kolona", +"Ne mogu da izvršim datu komandu zbog toga što su tabele zakljuèane ili je transakcija u toku", +"Nepoznata sistemska promenljiva '%-.64'", +"Tabela '%-.64s' je markirana kao ošteæena i trebala bi biti popravljena", +"Tabela '%-.64s' je markirana kao ošteæena, a zadnja (automatska?) popravka je bila neuspela", +"Upozorenje: Neke izmenjene tabele ne podržavaju komandu 'ROLLBACK'", +"Transakcija sa više stavki zahtevala je više od 'max_binlog_cache_size' bajtova skladišnog prostora. Uveæajte ovu promenljivu servera i pokušajte ponovo', +"Ova operacija ne može biti izvršena dok je aktivan podreðeni server. Zadajte prvo komandu 'SLAVE STOP' da zaustavite podreðeni server.", +"Ova operacija zahteva da je aktivan podreðeni server. Konfigurišite prvo podreðeni server i onda izvršite komandu 'SLAVE START'", +"Server nije konfigurisan kao podreðeni server, ispravite konfiguracioni file ili na njemu izvršite komandu 'CHANGE MASTER TO'", +"Nisam mogao da inicijalizujem informacionu strukturu glavnog servera, proverite da li imam privilegije potrebne za pristup file-u 'master.info'", +"Nisam mogao da startujem thread za podreðeni server, proverite sistemske resurse", +"Korisnik %-.64s veæ ima više aktivnih konekcija nego što je to odreðeno 'max_user_connections' promenljivom", +"Možete upotrebiti samo konstantan iskaz sa komandom 'SET'", +"Vremenski limit za zakljuèavanje tabele je istekao; Probajte da ponovo startujete transakciju", +"Broj totalnih zakljuèavanja tabele premašuje velièinu tabele zakljuèavanja", +"Zakljuèavanja izmena ne mogu biti realizovana sve dok traje 'READ UNCOMMITTED' transakcija", +"Komanda 'DROP DATABASE' nije dozvoljena dok thread globalno zakljuèava èitanje podataka", +"Komanda 'CREATE DATABASE' nije dozvoljena dok thread globalno zakljuèava èitanje podataka", +"Pogrešni argumenti prosleðeni na %s", +"Korisniku %-.32s@%-.64s nije dozvoljeno da kreira nove korisnike", +"Pogrešna definicija tabele; Sve 'MERGE' tabele moraju biti u istoj bazi podataka", +"Unakrsno zakljuèavanje pronaðeno kada sam pokušao da dobijem pravo na zakljuèavanje; Probajte da restartujete transakciju", +"Upotrebljeni tip tabele ne podržava 'FULLTEXT' indekse", +"Ne mogu da dodam proveru spoljnog kljuèa", +"Ne mogu da dodam slog: provera spoljnog kljuèa je neuspela", +"Ne mogu da izbrišem roditeljski slog: provera spoljnog kljuèa je neuspela", +"Greška pri povezivanju sa glavnim serverom u klasteru: %-.128s", +"Greška pri izvršavanju upita na glavnom serveru u klasteru: %-.128s", +"Greška pri izvršavanju komande %s: %-.128s", +"Pogrešna upotreba %s i %s", +"Upotrebljene 'SELECT' komande adresiraju razlièit broj kolona", +"Ne mogu da izvršim upit zbog toga što imate zakljuèavanja èitanja podataka u konfliktu", +"Mešanje tabela koje podržavaju transakcije i onih koje ne podržavaju transakcije je iskljuèeno", +"Opcija '%s' je upotrebljena dva puta u istom iskazu", +"User '%-64s' has exceeded the '%s' resource (current value: %ld)", -- cgit v1.2.1 From 492611f16575bd4f05a7ccd844fa27742ac1f0c5 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 13 May 2002 18:24:42 +0500 Subject: Added charset information --- sql/share/serbian/errmsg.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sql/share/serbian/errmsg.txt b/sql/share/serbian/errmsg.txt index 051924f799f..105860f0e4b 100644 --- a/sql/share/serbian/errmsg.txt +++ b/sql/share/serbian/errmsg.txt @@ -3,7 +3,9 @@ /* Serbian Translation, version 1.0: Copyright 2002 Vladimir Kraljevic, vladimir_kraljevic@yahoo.com - This file is public domain and comes with NO WARRANTY of any kind */ + This file is public domain and comes with NO WARRANTY of any kind. + Charset: cp1250 +*/ "hashchk", "isamchk", -- cgit v1.2.1 From 3a6483fe4bfc53293b4b7e03f6fda7515bcf9b7f Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 13 May 2002 20:53:09 +0300 Subject: new error messages in new translation --- sql/share/serbian/errmsg.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sql/share/serbian/errmsg.txt b/sql/share/serbian/errmsg.txt index 105860f0e4b..8e3b6e2a318 100644 --- a/sql/share/serbian/errmsg.txt +++ b/sql/share/serbian/errmsg.txt @@ -234,3 +234,5 @@ "Mešanje tabela koje podržavaju transakcije i onih koje ne podržavaju transakcije je iskljuèeno", "Opcija '%s' je upotrebljena dva puta u istom iskazu", "User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"Subselect return more than 1 field", +"Subselect return more than 1 record", -- cgit v1.2.1 From bf8727991777e9fd90a5a6966454f942b162b502 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 13 May 2002 22:39:36 +0300 Subject: HEAP tables bug (by Ramil request) --- heap/hp_hash.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/heap/hp_hash.c b/heap/hp_hash.c index 70823c2c2c7..dbd330ea4f4 100644 --- a/heap/hp_hash.c +++ b/heap/hp_hash.c @@ -482,10 +482,7 @@ uint hp_rb_pack_key(HP_INFO *info, uint inx, uchar *key, const uchar *old, old+= seg->length, seg++) { if (seg->null_bit) - { - if (!(*key++= (char) 1 - *old++)) - continue; - } + *key++= 1 - *old++; memcpy((byte*) key, old, seg->length); key+= seg->length; } -- cgit v1.2.1 From b043f06666c278a4277e7d35b1bff418d45708c2 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 14 May 2002 20:58:38 +0500 Subject: Now several character sets can live in the same table, However some hacks were used while waiting for new FRM file sql/field.h: Added function to set Field charset sql/filesort.cc: Temporarily workaround, It seems charset should be passed in argument sql/ha_heap.cc: Set correct key charset from Field information sql/table.cc: Dirty hack to distinguish columns charsets while waiting for Monty to rewrite FRM file sql/table.h: New field: table default character set --- sql/field.h | 1 + sql/filesort.cc | 10 +++++++++- sql/ha_heap.cc | 2 +- sql/table.cc | 21 +++++++++++++++++++++ sql/table.h | 1 + 5 files changed, 33 insertions(+), 2 deletions(-) diff --git a/sql/field.h b/sql/field.h index baedf9e78e7..91bb39dd338 100644 --- a/sql/field.h +++ b/sql/field.h @@ -252,6 +252,7 @@ public: void make_field(Send_field *); uint size_of() const { return sizeof(*this); } inline CHARSET_INFO *charset() const { return field_charset; } + inline void set_charset(CHARSET_INFO *charset) { field_charset=charset; } inline int cmp_image(char *buff,uint length) { if (binary()) diff --git a/sql/filesort.cc b/sql/filesort.cc index 3bde4eeae14..c087e65172e 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -77,10 +77,18 @@ ha_rows filesort(TABLE *table, SORT_FIELD *sortorder, uint s_length, SORTPARAM param; DBUG_ENTER("filesort"); DBUG_EXECUTE("info",TEST_filesort(sortorder,s_length,special);); + CHARSET_INFO *charset=table->table_charset; + uint i; #ifdef SKIP_DBUG_IN_FILESORT DBUG_PUSH(""); /* No DBUG here */ #endif + // BAR TODO: this is not absolutely correct, but OK for now + for(i=0;ifields;i++) + if (!table->field[i]->binary()) + charset=((Field_str*)(table->field[i]))->charset(); + // /BAR TODO + outfile= table->io_cache; my_b_clear(&tempfile); my_b_clear(&buffpek_pointers); @@ -129,7 +137,7 @@ ha_rows filesort(TABLE *table, SORT_FIELD *sortorder, uint s_length, records=param.max_rows; /* purecov: inspected */ #ifdef USE_STRCOLL - if (use_strcoll(default_charset_info) && + if (use_strcoll(charset) && !(param.tmp_buffer=my_malloc(param.sort_length,MYF(MY_WME)))) goto err; #endif diff --git a/sql/ha_heap.cc b/sql/ha_heap.cc index 43485a97fe3..e18bc877540 100644 --- a/sql/ha_heap.cc +++ b/sql/ha_heap.cc @@ -85,7 +85,7 @@ int ha_heap::open(const char *name, int mode, uint test_if_locked) seg->start= (uint) key_part->offset; seg->length= (uint) key_part->length; seg->flag = 0; - seg->charset= default_charset_info; + seg->charset= field->binary() ? NULL : ((Field_str*)field)->charset(); if (field->null_ptr) { seg->null_bit= field->null_bit; diff --git a/sql/table.cc b/sql/table.cc index 3c217ced03c..eb5f5ecbc9a 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -341,6 +341,15 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, (hash_get_key) get_field_name,0, HASH_CASE_INSENSITIVE); +// BAR: dirty hack while waiting for new FRM +// BAR: take a charset information from table name +{ + const char* csname=strstr(alias,"_cs_"); + if(!csname || + !(outparam->table_charset=get_charset_by_name(csname+4,MYF(MY_WME)))) + outparam->table_charset=default_charset_info; +} + for (i=0 ; i < outparam->fields; i++, strpos+= 11, field_ptr++) { uint pack_flag= uint2korr(strpos+6); @@ -357,6 +366,18 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, (TYPELIB*) 0), outparam->fieldnames.type_names[i], outparam); + if (!reg_field->binary()) + { + // BAR: dirty hack while waiting for new FRM + // BAR: take a charset information from field name + + Field_str* str_field=(Field_str*)reg_field; + const char* csname=strstr(str_field->field_name,"_cs_"); + CHARSET_INFO *fcs; + if (!csname || (!(fcs=get_charset_by_name(csname+4,MYF(MY_WME))))) + fcs=outparam->table_charset; + str_field->set_charset(fcs); + } if (!(reg_field->flags & NOT_NULL_FLAG)) { if ((null_bit<<=1) == 256) diff --git a/sql/table.h b/sql/table.h index 59cb28038bf..183e1b2a38f 100644 --- a/sql/table.h +++ b/sql/table.h @@ -104,6 +104,7 @@ struct st_table { *rowid_field; Field_timestamp *timestamp_field; my_string comment; /* Comment about table */ + CHARSET_INFO *table_charset; /* Default charset of string fields */ REGINFO reginfo; /* field connections */ MEM_ROOT mem_root; GRANT_INFO grant; -- cgit v1.2.1 From 8bee96ab0ad02e45bb4652f6878173d030642051 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 17 May 2002 16:29:52 +0500 Subject: Now string values are created and filled with charset field SELECT func(charset2) FROM t ORDER BY 1 works in correct charset --- sql/field.cc | 121 +++++++++++++++++++++++++++------------------------ sql/field.h | 84 +++++++++++++++++------------------ sql/field_conv.cc | 16 +++---- sql/filesort.cc | 5 +-- sql/handler.cc | 2 +- sql/item.cc | 31 +++++++------ sql/item.h | 16 +++---- sql/item_cmpfunc.cc | 12 ++--- sql/item_cmpfunc.h | 6 +-- sql/item_create.cc | 10 +++-- sql/item_func.cc | 16 +++---- sql/item_strfunc.cc | 20 ++++----- sql/item_strfunc.h | 2 +- sql/item_sum.cc | 6 +-- sql/item_timefunc.cc | 32 +++++++++++--- sql/item_timefunc.h | 4 +- sql/log_event.cc | 32 +++++++------- sql/net_pkg.cc | 2 +- sql/opt_range.cc | 4 +- sql/sql_acl.cc | 102 +++++++++++++++++++++---------------------- sql/sql_analyse.cc | 17 ++++---- sql/sql_analyse.h | 5 ++- sql/sql_base.cc | 3 +- sql/sql_class.cc | 10 +++-- sql/sql_load.cc | 4 +- sql/sql_select.cc | 38 ++++++++-------- sql/sql_select.h | 2 +- sql/sql_show.cc | 18 ++++---- sql/sql_string.cc | 1 + sql/sql_string.h | 23 +++++----- sql/sql_table.cc | 2 +- sql/sql_test.cc | 5 ++- sql/sql_udf.cc | 4 +- sql/sql_update.cc | 5 ++- sql/sql_yacc.yy | 22 +++++----- sql/table.cc | 2 +- sql/unireg.cc | 7 +-- 37 files changed, 366 insertions(+), 325 deletions(-) diff --git a/sql/field.cc b/sql/field.cc index bd4b8e9f29d..75cbedbb71b 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -257,7 +257,7 @@ bool Field::send(THD *thd, String *packet) if (is_null()) return net_store_null(packet); char buff[MAX_FIELD_WIDTH]; - String tmp(buff,sizeof(buff)); + String tmp(buff,sizeof(buff),default_charset_info); val_str(&tmp,&tmp); CONVERT *convert; if ((convert=thd->convert_set)) @@ -320,7 +320,7 @@ uint Field::fill_cache_field(CACHE_FIELD *copy) bool Field::get_date(TIME *ltime,bool fuzzydate) { char buff[40]; - String tmp(buff,sizeof(buff)),tmp2,*res; + String tmp(buff,sizeof(buff),default_charset_info),tmp2,*res; if (!(res=val_str(&tmp,&tmp2)) || str_to_TIME(res->ptr(),res->length(),ltime,fuzzydate) == TIMESTAMP_NONE) return 1; @@ -330,7 +330,7 @@ bool Field::get_date(TIME *ltime,bool fuzzydate) bool Field::get_time(TIME *ltime) { char buff[40]; - String tmp(buff,sizeof(buff)),tmp2,*res; + String tmp(buff,sizeof(buff),default_charset_info),tmp2,*res; if (!(res=val_str(&tmp,&tmp2)) || str_to_time(res->ptr(),res->length(),ltime)) return 1; @@ -344,22 +344,22 @@ void Field::store_time(TIME *ltime,timestamp_type type) char buff[25]; switch (type) { case TIMESTAMP_NONE: - store("",0); // Probably an error + store("",0,default_charset_info); // Probably an error break; case TIMESTAMP_DATE: sprintf(buff,"%04d-%02d-%02d", ltime->year,ltime->month,ltime->day); - store(buff,10); + store(buff,10,default_charset_info); break; case TIMESTAMP_FULL: sprintf(buff,"%04d-%02d-%02d %02d:%02d:%02d", ltime->year,ltime->month,ltime->day, ltime->hour,ltime->minute,ltime->second); - store(buff,19); + store(buff,19,default_charset_info); break; case TIMESTAMP_TIME: sprintf(buff, "%02d:%02d:%02d", ltime->hour,ltime->minute,ltime->second); - store(buff,(uint) strlen(buff)); + store(buff,(uint) strlen(buff),default_charset_info); break; } } @@ -378,7 +378,7 @@ bool Field::optimize_range(uint idx) void Field_decimal::reset(void) { - Field_decimal::store("0",1); + Field_decimal::store("0",1,default_charset_info); } void Field_decimal::overflow(bool negative) @@ -397,7 +397,7 @@ void Field_decimal::overflow(bool negative) } -void Field_decimal::store(const char *from,uint len) +void Field_decimal::store(const char *from,uint len,CHARSET_INFO *cs) { reg3 int i; uint tmp_dec; @@ -589,7 +589,7 @@ String *Field_decimal::val_str(String *val_buffer __attribute__((unused)), if (field_length < tmp_length) // Error in data val_ptr->length(0); else - val_ptr->set((const char*) str,field_length-tmp_length); + val_ptr->set((const char*) str,field_length-tmp_length,default_charset_info); return val_ptr; } @@ -672,9 +672,9 @@ void Field_decimal::sql_type(String &res) const ** tiny int ****************************************************************************/ -void Field_tiny::store(const char *from,uint len) +void Field_tiny::store(const char *from,uint len,CHARSET_INFO *cs) { - String tmp_str(from,len); + String tmp_str(from,len,default_charset_info); long tmp= strtol(tmp_str.c_ptr(),NULL,10); if (unsigned_flag) @@ -843,9 +843,9 @@ void Field_tiny::sql_type(String &res) const // Note: Sometimes this should be fixed to use one strtol() to use // len and check for garbage after number. -void Field_short::store(const char *from,uint len) +void Field_short::store(const char *from,uint len,CHARSET_INFO *cs) { - String tmp_str(from,len); + String tmp_str(from,len,default_charset_info); long tmp= strtol(tmp_str.c_ptr(),NULL,10); if (unsigned_flag) { @@ -1083,9 +1083,9 @@ void Field_short::sql_type(String &res) const // Note: Sometimes this should be fixed to use one strtol() to use // len and check for garbage after number. -void Field_medium::store(const char *from,uint len) +void Field_medium::store(const char *from,uint len,CHARSET_INFO *cs) { - String tmp_str(from,len); + String tmp_str(from,len,default_charset_info); long tmp= strtol(tmp_str.c_ptr(),NULL,10); if (unsigned_flag) @@ -1268,14 +1268,14 @@ void Field_medium::sql_type(String &res) const // Note: Sometimes this should be fixed to use one strtol() to use // len and check for garbage after number. -void Field_long::store(const char *from,uint len) +void Field_long::store(const char *from,uint len,CHARSET_INFO *cs) { while (len && my_isspace(system_charset_info,*from)) { len--; from++; } long tmp; - String tmp_str(from,len); + String tmp_str(from,len,default_charset_info); errno=0; if (unsigned_flag) { @@ -1496,14 +1496,14 @@ void Field_long::sql_type(String &res) const ** longlong int ****************************************************************************/ -void Field_longlong::store(const char *from,uint len) +void Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs) { while (len && my_isspace(system_charset_info,*from)) { // For easy error check len--; from++; } longlong tmp; - String tmp_str(from,len); + String tmp_str(from,len,default_charset_info); errno=0; if (unsigned_flag) { @@ -1703,9 +1703,9 @@ void Field_longlong::sql_type(String &res) const ** single precision float ****************************************************************************/ -void Field_float::store(const char *from,uint len) +void Field_float::store(const char *from,uint len,CHARSET_INFO *cs) { - String tmp_str(from,len); + String tmp_str(from,len,default_charset_info); errno=0; Field_float::store(atof(tmp_str.c_ptr())); if (errno || current_thd->count_cuted_fields && !test_if_real(from,len)) @@ -1953,9 +1953,9 @@ void Field_float::sql_type(String &res) const ** double precision floating point numbers ****************************************************************************/ -void Field_double::store(const char *from,uint len) +void Field_double::store(const char *from,uint len,CHARSET_INFO *cs) { - String tmp_str(from,len); + String tmp_str(from,len,default_charset_info); errno=0; double j= atof(tmp_str.c_ptr()); if (errno || current_thd->count_cuted_fields && !test_if_real(from,len)) @@ -2209,7 +2209,7 @@ Field_timestamp::Field_timestamp(char *ptr_arg, uint32 len_arg, } -void Field_timestamp::store(const char *from,uint len) +void Field_timestamp::store(const char *from,uint len,CHARSET_INFO *cs) { long tmp=(long) str_to_timestamp(from,len); #ifdef WORDS_BIGENDIAN @@ -2548,7 +2548,7 @@ void Field_timestamp::set_time() ** Stored as a 3 byte unsigned int ****************************************************************************/ -void Field_time::store(const char *from,uint len) +void Field_time::store(const char *from,uint len,CHARSET_INFO *cs) { TIME ltime; long tmp; @@ -2688,7 +2688,7 @@ void Field_time::sort_string(char *to,uint length __attribute__((unused))) void Field_time::sql_type(String &res) const { - res.set("time",4); + res.set("time",4,default_charset_info); } /**************************************************************************** @@ -2697,9 +2697,9 @@ void Field_time::sql_type(String &res) const ** Can handle 2 byte or 4 byte years! ****************************************************************************/ -void Field_year::store(const char *from, uint len) +void Field_year::store(const char *from, uint len,CHARSET_INFO *cs) { - String tmp_str(from,len); + String tmp_str(from,len,default_charset_info); long nr= strtol(tmp_str.c_ptr(),NULL,10); if (nr < 0 || nr >= 100 && nr <= 1900 || nr > 2155) @@ -2786,7 +2786,7 @@ void Field_year::sql_type(String &res) const ** Stored as a 4 byte unsigned int ****************************************************************************/ -void Field_date::store(const char *from, uint len) +void Field_date::store(const char *from, uint len,CHARSET_INFO *cs) { TIME l_time; uint32 tmp; @@ -2934,7 +2934,7 @@ void Field_date::sort_string(char *to,uint length __attribute__((unused))) void Field_date::sql_type(String &res) const { - res.set("date",4); + res.set("date",4,default_charset_info); } /**************************************************************************** @@ -2943,7 +2943,7 @@ void Field_date::sql_type(String &res) const ** In number context: YYYYMMDD ****************************************************************************/ -void Field_newdate::store(const char *from,uint len) +void Field_newdate::store(const char *from,uint len,CHARSET_INFO *cs) { TIME l_time; long tmp; @@ -3085,7 +3085,7 @@ void Field_newdate::sort_string(char *to,uint length __attribute__((unused))) void Field_newdate::sql_type(String &res) const { - res.set("date",4); + res.set("date",4,default_charset_info); } @@ -3096,7 +3096,7 @@ void Field_newdate::sql_type(String &res) const ** Stored as a 8 byte unsigned int. Should sometimes be change to a 6 byte int. ****************************************************************************/ -void Field_datetime::store(const char *from,uint len) +void Field_datetime::store(const char *from,uint len,CHARSET_INFO *cs) { longlong tmp=str_to_datetime(from,len,1); #ifdef WORDS_BIGENDIAN @@ -3302,7 +3302,7 @@ void Field_datetime::sort_string(char *to,uint length __attribute__((unused))) void Field_datetime::sql_type(String &res) const { - res.set("datetime",8); + res.set("datetime",8,default_charset_info); } /**************************************************************************** @@ -3312,8 +3312,9 @@ void Field_datetime::sql_type(String &res) const /* Copy a string and fill with space */ -void Field_string::store(const char *from,uint length) +void Field_string::store(const char *from,uint length,CHARSET_INFO *cs) { + field_charset=cs; #ifdef USE_TIS620 if(!binary_flag) { ThNormalize((uchar *)ptr, field_length, (uchar *)from, length); @@ -3354,7 +3355,7 @@ void Field_string::store(double nr) int width=min(field_length,DBL_DIG+5); sprintf(buff,"%-*.*g",width,max(width-5,0),nr); end=strcend(buff,' '); - Field_string::store(buff,(uint) (end - buff)); + Field_string::store(buff,(uint) (end - buff), default_charset_info); } @@ -3362,7 +3363,7 @@ void Field_string::store(longlong nr) { char buff[22]; char *end=longlong10_to_str(nr,buff,-10); - Field_string::store(buff,(uint) (end-buff)); + Field_string::store(buff,(uint) (end-buff), default_charset_info); } @@ -3397,7 +3398,7 @@ String *Field_string::val_str(String *val_buffer __attribute__((unused)), #endif while (end > ptr && end[-1] == ' ') end--; - val_ptr->set((const char*) ptr,(uint) (end - ptr)); + val_ptr->set((const char*) ptr,(uint) (end - ptr),field_charset); return val_ptr; } @@ -3516,8 +3517,9 @@ uint Field_string::max_packed_col_length(uint max_length) ****************************************************************************/ -void Field_varstring::store(const char *from,uint length) +void Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs) { + field_charset=cs; #ifdef USE_TIS620 if(!binary_flag) { @@ -3545,7 +3547,7 @@ void Field_varstring::store(double nr) int width=min(field_length,DBL_DIG+5); sprintf(buff,"%-*.*g",width,max(width-5,0),nr); end=strcend(buff,' '); - Field_varstring::store(buff,(uint) (end - buff)); + Field_varstring::store(buff,(uint) (end - buff), default_charset_info); } @@ -3553,7 +3555,7 @@ void Field_varstring::store(longlong nr) { char buff[22]; char *end=longlong10_to_str(nr,buff,-10); - Field_varstring::store(buff,(uint) (end-buff)); + Field_varstring::store(buff,(uint) (end-buff), default_charset_info); } @@ -3585,7 +3587,7 @@ String *Field_varstring::val_str(String *val_buffer __attribute__((unused)), String *val_ptr) { uint length=uint2korr(ptr); - val_ptr->set((const char*) ptr+2,length); + val_ptr->set((const char*) ptr+2,length,field_charset); return val_ptr; } @@ -3741,7 +3743,7 @@ Field_blob::Field_blob(char *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg, bool binary_arg) :Field_str(ptr_arg, (1L << min(blob_pack_length,3)*8)-1L, null_ptr_arg, null_bit_arg, unireg_check_arg, field_name_arg, - table_arg), + table_arg, default_charset_info), packlength(blob_pack_length),binary_flag(binary_arg), geom_flag(true) { flags|= BLOB_FLAG; @@ -3833,8 +3835,9 @@ uint32 Field_blob::get_length(const char *pos) } -void Field_blob::store(const char *from,uint len) +void Field_blob::store(const char *from,uint len,CHARSET_INFO *cs) { + field_charset=cs; if (!len) { bzero(ptr,Field_blob::pack_length()); @@ -3872,14 +3875,14 @@ void Field_blob::store(const char *from,uint len) void Field_blob::store(double nr) { value.set(nr); - Field_blob::store(value.ptr(),(uint) value.length()); + Field_blob::store(value.ptr(),(uint) value.length(), default_charset_info); } void Field_blob::store(longlong nr) { value.set(nr); - Field_blob::store(value.ptr(), (uint) value.length()); + Field_blob::store(value.ptr(), (uint) value.length(), default_charset_info); } @@ -3922,9 +3925,9 @@ String *Field_blob::val_str(String *val_buffer __attribute__((unused)), char *blob; memcpy_fixed(&blob,ptr+packlength,sizeof(char*)); if (!blob) - val_ptr->set("",0); // A bit safer than ->length(0) + val_ptr->set("",0,default_charset_info); // A bit safer than ->length(0) else - val_ptr->set((const char*) blob,get_length(ptr)); + val_ptr->set((const char*) blob,get_length(ptr),default_charset_info); return val_ptr; } @@ -4026,7 +4029,7 @@ void Field_blob::get_key_image(char *buff,uint length, imagetype type) void Field_blob::set_key_image(char *buff,uint length) { length=uint2korr(buff); - Field_blob::store(buff+2,length); + Field_blob::store(buff+2,length, default_charset_info); } void Field_geom::get_key_image(char *buff,uint length, imagetype type) @@ -4121,7 +4124,7 @@ void Field_blob::sql_type(String &res) const case 3: str="medium"; break; case 4: str="long"; break; } - res.set(str,(uint) strlen(str)); + res.set(str,(uint) strlen(str),default_charset_info); res.append(binary_flag ? "blob" : "text"); } @@ -4342,7 +4345,7 @@ uint find_enum(TYPELIB *lib,const char *x, uint length) ** (if there isn't a empty value in the enum) */ -void Field_enum::store(const char *from,uint length) +void Field_enum::store(const char *from,uint length,CHARSET_INFO *cs) { uint tmp=find_enum(typelib,from,length); if (!tmp) @@ -4448,7 +4451,8 @@ String *Field_enum::val_str(String *val_buffer __attribute__((unused)), val_ptr->length(0); else val_ptr->set((const char*) typelib->type_names[tmp-1], - (uint) strlen(typelib->type_names[tmp-1])); + (uint) strlen(typelib->type_names[tmp-1]), + default_charset_info); return val_ptr; } @@ -4534,7 +4538,7 @@ ulonglong find_set(TYPELIB *lib,const char *x,uint length) } -void Field_set::store(const char *from,uint length) +void Field_set::store(const char *from,uint length,CHARSET_INFO *cs) { ulonglong tmp=find_set(typelib,from,length); if (!tmp && length && length < 22) @@ -4585,7 +4589,8 @@ String *Field_set::val_str(String *val_buffer, if (val_buffer->length()) val_buffer->append(field_separator); String str(typelib->type_names[bitnr], - (uint) strlen(typelib->type_names[bitnr])); + (uint) strlen(typelib->type_names[bitnr]), + default_charset_info); val_buffer->append(str); } tmp>>=1; @@ -4723,7 +4728,7 @@ Field *make_field(char *ptr, uint32 field_length, if (!f_is_packed(pack_flag)) return new Field_string(ptr,field_length,null_pos,null_bit, unireg_check, field_name, table, - f_is_binary(pack_flag) != 0); + f_is_binary(pack_flag) != 0, default_charset_info); uint pack_length=calc_pack_length((enum_field_types) f_packtype(pack_flag), @@ -4853,7 +4858,7 @@ create_field::create_field(Field *old_field,Field *orig_field) orig_field) { char buff[MAX_FIELD_WIDTH],*pos; - String tmp(buff,sizeof(buff)); + String tmp(buff,sizeof(buff),default_charset_info); /* Get the value from record[2] (the default value row) */ my_ptrdiff_t diff= (my_ptrdiff_t) (orig_field->table->rec_buff_length*2); @@ -4865,7 +4870,7 @@ create_field::create_field(Field *old_field,Field *orig_field) { pos= (char*) sql_memdup(tmp.ptr(),tmp.length()+1); pos[tmp.length()]=0; - def=new Item_string(pos,tmp.length()); + def=new Item_string(pos,tmp.length(),default_charset_info); } } } diff --git a/sql/field.h b/sql/field.h index 91bb39dd338..cf7c2a50218 100644 --- a/sql/field.h +++ b/sql/field.h @@ -59,7 +59,7 @@ public: utype unireg_check_arg, const char *field_name_arg, struct st_table *table_arg); virtual ~Field() {} - virtual void store(const char *to,uint length)=0; + virtual void store(const char *to,uint length,CHARSET_INFO *cs)=0; virtual void store(double nr)=0; virtual void store(longlong nr)=0; virtual void store_time(TIME *ltime,timestamp_type t_type); @@ -242,10 +242,10 @@ public: Field_str(char *ptr_arg,uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, utype unireg_check_arg, const char *field_name_arg, - struct st_table *table_arg) + struct st_table *table_arg,CHARSET_INFO *charset) :Field(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, unireg_check_arg, field_name_arg, table_arg) - { field_charset=default_charset_info; } + { field_charset=charset; } Item_result result_type () const { return STRING_RESULT; } uint decimals() const { return NOT_FIXED_DEC; } friend class create_field; @@ -279,7 +279,7 @@ public: enum ha_base_keytype key_type() const { return zerofill ? HA_KEYTYPE_BINARY : HA_KEYTYPE_NUM; } void reset(void); - void store(const char *to,uint length); + void store(const char *to,uint length,CHARSET_INFO *charset); void store(double nr); void store(longlong nr); double val_real(void); @@ -308,7 +308,7 @@ public: enum_field_types type() const { return FIELD_TYPE_TINY;} enum ha_base_keytype key_type() const { return unsigned_flag ? HA_KEYTYPE_BINARY : HA_KEYTYPE_INT8; } - void store(const char *to,uint length); + void store(const char *to,uint length,CHARSET_INFO *charset); void store(double nr); void store(longlong nr); void reset(void) { ptr[0]=0; } @@ -337,7 +337,7 @@ public: enum_field_types type() const { return FIELD_TYPE_SHORT;} enum ha_base_keytype key_type() const { return unsigned_flag ? HA_KEYTYPE_USHORT_INT : HA_KEYTYPE_SHORT_INT;} - void store(const char *to,uint length); + void store(const char *to,uint length,CHARSET_INFO *charset); void store(double nr); void store(longlong nr); void reset(void) { ptr[0]=ptr[1]=0; } @@ -366,7 +366,7 @@ public: enum_field_types type() const { return FIELD_TYPE_INT24;} enum ha_base_keytype key_type() const { return unsigned_flag ? HA_KEYTYPE_UINT24 : HA_KEYTYPE_INT24; } - void store(const char *to,uint length); + void store(const char *to,uint length,CHARSET_INFO *charset); void store(double nr); void store(longlong nr); void reset(void) { ptr[0]=ptr[1]=ptr[2]=0; } @@ -400,7 +400,7 @@ public: enum_field_types type() const { return FIELD_TYPE_LONG;} enum ha_base_keytype key_type() const { return unsigned_flag ? HA_KEYTYPE_ULONG_INT : HA_KEYTYPE_LONG_INT; } - void store(const char *to,uint length); + void store(const char *to,uint length,CHARSET_INFO *charset); void store(double nr); void store(longlong nr); void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; } @@ -436,7 +436,7 @@ public: enum_field_types type() const { return FIELD_TYPE_LONGLONG;} enum ha_base_keytype key_type() const { return unsigned_flag ? HA_KEYTYPE_ULONGLONG : HA_KEYTYPE_LONGLONG; } - void store(const char *to,uint length); + void store(const char *to,uint length,CHARSET_INFO *charset); void store(double nr); void store(longlong nr); void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=ptr[4]=ptr[5]=ptr[6]=ptr[7]=0; } @@ -463,7 +463,7 @@ public: {} enum_field_types type() const { return FIELD_TYPE_FLOAT;} enum ha_base_keytype key_type() const { return HA_KEYTYPE_FLOAT; } - void store(const char *to,uint length); + void store(const char *to,uint length,CHARSET_INFO *charset); void store(double nr); void store(longlong nr); void reset(void) { bzero(ptr,sizeof(float)); } @@ -495,7 +495,7 @@ public: {} enum_field_types type() const { return FIELD_TYPE_DOUBLE;} enum ha_base_keytype key_type() const { return HA_KEYTYPE_DOUBLE; } - void store(const char *to,uint length); + void store(const char *to,uint length,CHARSET_INFO *charset); void store(double nr); void store(longlong nr); void reset(void) { bzero(ptr,sizeof(double)); } @@ -518,10 +518,10 @@ public: enum utype unireg_check_arg, const char *field_name_arg, struct st_table *table_arg) :Field_str(ptr_arg, len_arg, null, 1, - unireg_check_arg, field_name_arg, table_arg) + unireg_check_arg, field_name_arg, table_arg, default_charset_info) {} enum_field_types type() const { return FIELD_TYPE_NULL;} - void store(const char *to, uint length) { null[0]=1; } + void store(const char *to, uint length, CHARSET_INFO *cs) { null[0]=1; } void store(double nr) { null[0]=1; } void store(longlong nr) { null[0]=1; } void reset(void) {} @@ -532,7 +532,7 @@ public: int cmp(const char *a, const char *b) { return 0;} void sort_string(char *buff, uint length) {} uint32 pack_length() const { return 0; } - void sql_type(String &str) const { str.set("null",4); } + void sql_type(String &str) const { str.set("null",4,default_charset_info); } uint size_of() const { return sizeof(*this); } }; @@ -545,7 +545,7 @@ public: enum Item_result result_type () const { return field_length == 8 || field_length == 14 ? INT_RESULT : STRING_RESULT; } enum_field_types type() const { return FIELD_TYPE_TIMESTAMP;} enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONG_INT; } - void store(const char *to,uint length); + void store(const char *to,uint length,CHARSET_INFO *charset); void store(double nr); void store(longlong nr); void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; } @@ -585,7 +585,7 @@ public: unireg_check_arg, field_name_arg, table_arg, 1, 1) {} enum_field_types type() const { return FIELD_TYPE_YEAR;} - void store(const char *to,uint length); + void store(const char *to,uint length,CHARSET_INFO *charset); void store(double nr); void store(longlong nr); double val_real(void); @@ -601,16 +601,16 @@ public: enum utype unireg_check_arg, const char *field_name_arg, struct st_table *table_arg) :Field_str(ptr_arg, 10, null_ptr_arg, null_bit_arg, - unireg_check_arg, field_name_arg, table_arg) + unireg_check_arg, field_name_arg, table_arg, default_charset_info) {} Field_date(bool maybe_null_arg, const char *field_name_arg, struct st_table *table_arg) :Field_str((char*) 0,10, maybe_null_arg ? (uchar*) "": 0,0, - NONE, field_name_arg, table_arg) {} + NONE, field_name_arg, table_arg, default_charset_info) {} enum_field_types type() const { return FIELD_TYPE_DATE;} enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONG_INT; } enum Item_result cmp_type () const { return INT_RESULT; } - void store(const char *to,uint length); + void store(const char *to,uint length,CHARSET_INFO *charset); void store(double nr); void store(longlong nr); void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; } @@ -631,13 +631,13 @@ public: enum utype unireg_check_arg, const char *field_name_arg, struct st_table *table_arg) :Field_str(ptr_arg, 10, null_ptr_arg, null_bit_arg, - unireg_check_arg, field_name_arg, table_arg) + unireg_check_arg, field_name_arg, table_arg, default_charset_info) {} enum_field_types type() const { return FIELD_TYPE_DATE;} enum_field_types real_type() const { return FIELD_TYPE_NEWDATE; } enum ha_base_keytype key_type() const { return HA_KEYTYPE_UINT24; } enum Item_result cmp_type () const { return INT_RESULT; } - void store(const char *to,uint length); + void store(const char *to,uint length,CHARSET_INFO *charset); void store(double nr); void store(longlong nr); void store_time(TIME *ltime,timestamp_type type); @@ -662,16 +662,16 @@ public: enum utype unireg_check_arg, const char *field_name_arg, struct st_table *table_arg) :Field_str(ptr_arg, 8, null_ptr_arg, null_bit_arg, - unireg_check_arg, field_name_arg, table_arg) + unireg_check_arg, field_name_arg, table_arg, default_charset_info) {} Field_time(bool maybe_null_arg, const char *field_name_arg, struct st_table *table_arg) :Field_str((char*) 0,8, maybe_null_arg ? (uchar*) "": 0,0, - NONE, field_name_arg, table_arg) {} + NONE, field_name_arg, table_arg, default_charset_info) {} enum_field_types type() const { return FIELD_TYPE_TIME;} enum ha_base_keytype key_type() const { return HA_KEYTYPE_INT24; } enum Item_result cmp_type () const { return INT_RESULT; } - void store(const char *to,uint length); + void store(const char *to,uint length,CHARSET_INFO *charset); void store(double nr); void store(longlong nr); void reset(void) { ptr[0]=ptr[1]=ptr[2]=0; } @@ -694,18 +694,18 @@ public: enum utype unireg_check_arg, const char *field_name_arg, struct st_table *table_arg) :Field_str(ptr_arg, 19, null_ptr_arg, null_bit_arg, - unireg_check_arg, field_name_arg, table_arg) + unireg_check_arg, field_name_arg, table_arg, default_charset_info) {} Field_datetime(bool maybe_null_arg, const char *field_name_arg, struct st_table *table_arg) :Field_str((char*) 0,19, maybe_null_arg ? (uchar*) "": 0,0, - NONE, field_name_arg, table_arg) {} + NONE, field_name_arg, table_arg, default_charset_info) {} enum_field_types type() const { return FIELD_TYPE_DATETIME;} #ifdef HAVE_LONG_LONG enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONGLONG; } #endif enum Item_result cmp_type () const { return INT_RESULT; } - void store(const char *to,uint length); + void store(const char *to,uint length,CHARSET_INFO *charset); void store(double nr); void store(longlong nr); void store_time(TIME *ltime,timestamp_type type); @@ -730,18 +730,18 @@ public: Field_string(char *ptr_arg, uint32 len_arg,uchar *null_ptr_arg, uchar null_bit_arg, enum utype unireg_check_arg, const char *field_name_arg, - struct st_table *table_arg,bool binary_arg) + struct st_table *table_arg,bool binary_arg, CHARSET_INFO *cs) :Field_str(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, - unireg_check_arg, field_name_arg, table_arg), + unireg_check_arg, field_name_arg, table_arg,cs), binary_flag(binary_arg) { if (binary_arg) flags|=BINARY_FLAG; } Field_string(uint32 len_arg,bool maybe_null_arg, const char *field_name_arg, - struct st_table *table_arg, bool binary_arg) + struct st_table *table_arg, bool binary_arg, CHARSET_INFO *cs) :Field_str((char*) 0,len_arg, maybe_null_arg ? (uchar*) "": 0,0, - NONE, field_name_arg, table_arg), + NONE, field_name_arg, table_arg, cs), binary_flag(binary_arg) { if (binary_arg) @@ -759,7 +759,7 @@ public: bool zero_pack() const { return 0; } bool binary() const { return binary_flag; } void reset(void) { bfill(ptr,field_length,' '); } - void store(const char *to,uint length); + void store(const char *to,uint length,CHARSET_INFO *charset); void store(double nr); void store(longlong nr); double val_real(void); @@ -785,18 +785,18 @@ public: Field_varstring(char *ptr_arg, uint32 len_arg,uchar *null_ptr_arg, uchar null_bit_arg, enum utype unireg_check_arg, const char *field_name_arg, - struct st_table *table_arg,bool binary_arg) + struct st_table *table_arg,bool binary_arg, CHARSET_INFO *cs) :Field_str(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, - unireg_check_arg, field_name_arg, table_arg), + unireg_check_arg, field_name_arg, table_arg, cs), binary_flag(binary_arg) { if (binary_arg) flags|=BINARY_FLAG; } Field_varstring(uint32 len_arg,bool maybe_null_arg, const char *field_name_arg, - struct st_table *table_arg, bool binary_arg) + struct st_table *table_arg, bool binary_arg, CHARSET_INFO *cs) :Field_str((char*) 0,len_arg, maybe_null_arg ? (uchar*) "": 0,0, - NONE, field_name_arg, table_arg), + NONE, field_name_arg, table_arg, cs), binary_flag(binary_arg) { if (binary_arg) @@ -811,7 +811,7 @@ public: void reset(void) { bzero(ptr,field_length+2); } uint32 pack_length() const { return (uint32) field_length+2; } uint32 key_length() const { return (uint32) field_length; } - void store(const char *to,uint length); + void store(const char *to,uint length,CHARSET_INFO *charset); void store(double nr); void store(longlong nr); double val_real(void); @@ -844,7 +844,7 @@ public: Field_blob(uint32 len_arg,bool maybe_null_arg, const char *field_name_arg, struct st_table *table_arg, bool binary_arg) :Field_str((char*) 0,len_arg, maybe_null_arg ? (uchar*) "": 0,0, - NONE, field_name_arg, table_arg), + NONE, field_name_arg, table_arg, default_charset_info), packlength(3),binary_flag(binary_arg), geom_flag(true) { flags|= BLOB_FLAG; @@ -854,7 +854,7 @@ public: enum_field_types type() const { return FIELD_TYPE_BLOB;} enum ha_base_keytype key_type() const { return binary_flag ? HA_KEYTYPE_VARBINARY : HA_KEYTYPE_VARTEXT; } - void store(const char *to,uint length); + void store(const char *to,uint length,CHARSET_INFO *charset); void store(double nr); void store(longlong nr); double val_real(void); @@ -951,7 +951,7 @@ public: struct st_table *table_arg,uint packlength_arg, TYPELIB *typelib_arg) :Field_str(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, - unireg_check_arg, field_name_arg, table_arg), + unireg_check_arg, field_name_arg, table_arg, default_charset_info), packlength(packlength_arg),typelib(typelib_arg) { flags|=ENUM_FLAG; @@ -959,7 +959,7 @@ public: enum_field_types type() const { return FIELD_TYPE_STRING; } enum Item_result cmp_type () const { return INT_RESULT; } enum ha_base_keytype key_type() const; - void store(const char *to,uint length); + void store(const char *to,uint length,CHARSET_INFO *charset); void store(double nr); void store(longlong nr); void reset() { bzero(ptr,packlength); } @@ -994,7 +994,7 @@ public: { flags=(flags & ~ENUM_FLAG) | SET_FLAG; } - void store(const char *to,uint length); + void store(const char *to,uint length,CHARSET_INFO *charset); void store(double nr) { Field_set::store((longlong) nr); } void store(longlong nr); virtual bool zero_pack() const { return 1; } diff --git a/sql/field_conv.cc b/sql/field_conv.cc index 02be0365002..3b6de1383e2 100644 --- a/sql/field_conv.cc +++ b/sql/field_conv.cc @@ -228,7 +228,7 @@ static void do_conv_blob(Copy_field *copy) { copy->from_field->val_str(©->tmp,©->tmp); ((Field_blob *) copy->to_field)->store(copy->tmp.ptr(), - copy->tmp.length()); + copy->tmp.length(),default_charset_info); } /* Save blob in copy->tmp for GROUP BY */ @@ -236,20 +236,20 @@ static void do_conv_blob(Copy_field *copy) static void do_save_blob(Copy_field *copy) { char buff[MAX_FIELD_WIDTH]; - String res(buff,sizeof(buff)); + String res(buff,sizeof(buff),default_charset_info); copy->from_field->val_str(&res,&res); copy->tmp.copy(res); ((Field_blob *) copy->to_field)->store(copy->tmp.ptr(), - copy->tmp.length()); + copy->tmp.length(),default_charset_info); } static void do_field_string(Copy_field *copy) { char buff[MAX_FIELD_WIDTH]; - copy->tmp.set_quick(buff,sizeof(buff)); + copy->tmp.set_quick(buff,sizeof(buff),default_charset_info); copy->from_field->val_str(©->tmp,©->tmp); - copy->to_field->store(copy->tmp.c_ptr_quick(),copy->tmp.length()); + copy->to_field->store(copy->tmp.c_ptr_quick(),copy->tmp.length(),default_charset_info); } @@ -508,7 +508,7 @@ void field_conv(Field *to,Field *from) if (!blob->value.is_alloced() && from->real_type() != FIELD_TYPE_STRING) blob->value.copy(); - blob->store(blob->value.ptr(),blob->value.length()); + blob->store(blob->value.ptr(),blob->value.length(),default_charset_info); return; } if ((from->result_type() == STRING_RESULT && @@ -518,9 +518,9 @@ void field_conv(Field *to,Field *from) to->type() == FIELD_TYPE_DECIMAL) { char buff[MAX_FIELD_WIDTH]; - String result(buff,sizeof(buff)); + String result(buff,sizeof(buff),default_charset_info); from->val_str(&result,&result); - to->store(result.c_ptr_quick(),result.length()); + to->store(result.c_ptr_quick(),result.length(),default_charset_info); } else if (from->result_type() == REAL_RESULT) to->store(from->val_real()); diff --git a/sql/filesort.cc b/sql/filesort.cc index c087e65172e..ec49163f8a0 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -475,12 +475,10 @@ static void make_sortkey(register SORTPARAM *param, switch (sort_field->result_type) { case STRING_RESULT: { - CHARSET_INFO *cs=item->str_value.charset(); - if (item->maybe_null) *to++=1; /* All item->str() to use some extra byte for end null.. */ - String tmp((char*) to,sort_field->length+4); + String tmp((char*) to,sort_field->length+4,default_charset_info); String *res=item->val_str(&tmp); if (!res) { @@ -495,6 +493,7 @@ static void make_sortkey(register SORTPARAM *param, break; } length=res->length(); + CHARSET_INFO *cs=res->charset(); int diff=(int) (sort_field->length-length); if (diff < 0) { diff --git a/sql/handler.cc b/sql/handler.cc index 7947ae5a9f0..47c59be0166 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -665,7 +665,7 @@ void handler::print_error(int error, myf errflag) { /* Write the dupplicated key in the error message */ char key[MAX_KEY_LENGTH]; - String str(key,sizeof(key)); + String str(key,sizeof(key),default_charset_info); key_unpack(&str,table,(uint) key_nr); uint max_length=MYSQL_ERRMSG_SIZE-(uint) strlen(ER(ER_DUP_ENTRY)); if (str.length() >= max_length) diff --git a/sql/item.cc b/sql/item.cc index 84f4624a248..d5b9487eea6 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -89,7 +89,7 @@ bool Item_string::eq(const Item *item, bool binary_cmp) const bool Item::get_date(TIME *ltime,bool fuzzydate) { char buff[40]; - String tmp(buff,sizeof(buff)),*res; + String tmp(buff,sizeof(buff),default_charset_info),*res; if (!(res=val_str(&tmp)) || str_to_TIME(res->ptr(),res->length(),ltime,fuzzydate) == TIMESTAMP_NONE) { @@ -107,7 +107,7 @@ bool Item::get_date(TIME *ltime,bool fuzzydate) bool Item::get_time(TIME *ltime) { char buff[40]; - String tmp(buff,sizeof(buff)),*res; + String tmp(buff,sizeof(buff),default_charset_info),*res; if (!(res=val_str(&tmp)) || str_to_time(res->ptr(),res->length(),ltime)) { @@ -457,14 +457,15 @@ bool Item::save_in_field(Field *field) field->result_type() == STRING_RESULT) { String *result; + CHARSET_INFO *cs=field->binary()?default_charset_info:((Field_str*)field)->charset(); char buff[MAX_FIELD_WIDTH]; // Alloc buffer for small columns - str_value.set_quick(buff,sizeof(buff)); + str_value.set_quick(buff,sizeof(buff),cs); result=val_str(&str_value); if (null_value) return set_field_to_null(field); field->set_notnull(); - field->store(result->ptr(),result->length()); - str_value.set_quick(0, 0); + field->store(result->ptr(),result->length(),cs); + str_value.set_quick(0, 0, cs); } else if (result_type() == REAL_RESULT) { @@ -488,11 +489,12 @@ bool Item::save_in_field(Field *field) bool Item_string::save_in_field(Field *field) { String *result; + CHARSET_INFO *cs=field->binary()?default_charset_info:((Field_str*)field)->charset(); result=val_str(&str_value); if (null_value) return set_field_to_null(field); field->set_notnull(); - field->store(result->ptr(),result->length()); + field->store(result->ptr(),result->length(),cs); return 0; } @@ -529,14 +531,14 @@ inline uint char_val(char X) X-'a'+10); } -Item_varbinary::Item_varbinary(const char *str, uint str_length) +Item_varbinary::Item_varbinary(const char *str, uint str_length, CHARSET_INFO *cs) { name=(char*) str-2; // Lex makes this start with 0x max_length=(str_length+1)/2; char *ptr=(char*) sql_alloc(max_length+1); if (!ptr) return; - str_value.set(ptr,max_length); + str_value.set(ptr,max_length,cs); char *end=ptr+max_length; if (max_length*2 != str_length) *ptr++=char_val(*str++); // Not even, assume 0 prefix @@ -563,10 +565,11 @@ longlong Item_varbinary::val_int() bool Item_varbinary::save_in_field(Field *field) { + CHARSET_INFO *cs=field->binary()?default_charset_info:((Field_str*)field)->charset(); field->set_notnull(); if (field->result_type() == STRING_RESULT) { - field->store(str_value.ptr(),str_value.length()); + field->store(str_value.ptr(),str_value.length(),cs); } else { @@ -590,7 +593,7 @@ bool Item::send(THD *thd, String *packet) { char buff[MAX_FIELD_WIDTH]; CONVERT *convert; - String s(buff,sizeof(buff)),*res; + String s(buff,sizeof(buff),packet->charset()),*res; if (!(res=val_str(&s))) return net_store_null(packet); if ((convert=thd->convert_set)) @@ -649,7 +652,7 @@ Item *resolve_const_item(Item *item,Item *comp_item) if (res_type == STRING_RESULT) { char buff[MAX_FIELD_WIDTH]; - String tmp(buff,sizeof(buff)),*result; + String tmp(buff,sizeof(buff),default_charset_info),*result; result=item->val_str(&tmp); if (item->null_value) { @@ -663,7 +666,7 @@ Item *resolve_const_item(Item *item,Item *comp_item) #ifdef DELETE_ITEMS delete item; #endif - return new Item_string(name,tmp_str,length); + return new Item_string(name,tmp_str,length,default_charset_info); } if (res_type == INT_RESULT) { @@ -704,8 +707,8 @@ bool field_is_equal_to_item(Field *field,Item *item) { char item_buff[MAX_FIELD_WIDTH]; char field_buff[MAX_FIELD_WIDTH]; - String item_tmp(item_buff,sizeof(item_buff)),*item_result; - String field_tmp(field_buff,sizeof(field_buff)); + String item_tmp(item_buff,sizeof(item_buff),default_charset_info),*item_result; + String field_tmp(field_buff,sizeof(field_buff),default_charset_info); item_result=item->val_str(&item_tmp); if (item->null_value) return 1; // This must be true diff --git a/sql/item.h b/sql/item.h index 97f2862bb8b..927e86398c2 100644 --- a/sql/item.h +++ b/sql/item.h @@ -241,16 +241,16 @@ public: class Item_string :public Item { public: - Item_string(const char *str,uint length) + Item_string(const char *str,uint length,CHARSET_INFO *cs) { - str_value.set(str,length); + str_value.set(str,length,cs); max_length=length; name=(char*) str_value.ptr(); decimals=NOT_FIXED_DEC; } - Item_string(const char *name_par,const char *str,uint length) + Item_string(const char *name_par,const char *str,uint length,CHARSET_INFO *cs) { - str_value.set(str,length); + str_value.set(str,length,cs); max_length=length; name=(char*) name_par; decimals=NOT_FIXED_DEC; @@ -265,7 +265,7 @@ public: enum Item_result result_type () const { return STRING_RESULT; } bool basic_const_item() const { return 1; } bool eq(const Item *item, bool binary_cmp) const; - Item *new_item() { return new Item_string(name,str_value.ptr(),max_length); } + Item *new_item() { return new Item_string(name,str_value.ptr(),max_length,default_charset_info); } String *const_string() { return &str_value; } inline void append(char *str,uint length) { str_value.append(str,length); } void print(String *str); @@ -276,7 +276,7 @@ public: class Item_datetime :public Item_string { public: - Item_datetime(const char *item_name): Item_string(item_name,"",0) + Item_datetime(const char *item_name): Item_string(item_name,"",0,default_charset_info) { max_length=19;} void make_field(Send_field *field); }; @@ -284,14 +284,14 @@ public: class Item_empty_string :public Item_string { public: - Item_empty_string(const char *header,uint length) :Item_string("",0) + Item_empty_string(const char *header,uint length) :Item_string("",0,default_charset_info) { name=(char*) header; max_length=length;} }; class Item_varbinary :public Item { public: - Item_varbinary(const char *str,uint str_length); + Item_varbinary(const char *str,uint str_length,CHARSET_INFO *cs); ~Item_varbinary() {} enum Type type() const { return VARBIN_ITEM; } double val() { return (double) Item_varbinary::val_int(); } diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index c34440d92d4..072eaf51567 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -687,7 +687,7 @@ String *Item_func_case::val_str(String *str) longlong Item_func_case::val_int() { char buff[MAX_FIELD_WIDTH]; - String dummy_str(buff,sizeof(buff)); + String dummy_str(buff,sizeof(buff),default_charset_info); Item *item=find_item(&dummy_str); longlong res; @@ -704,7 +704,7 @@ longlong Item_func_case::val_int() double Item_func_case::val() { char buff[MAX_FIELD_WIDTH]; - String dummy_str(buff,sizeof(buff)); + String dummy_str(buff,sizeof(buff),default_charset_info); Item *item=find_item(&dummy_str); double res; @@ -876,7 +876,7 @@ int in_vector::find(Item *item) in_string::in_string(uint elements,qsort_cmp cmp_func) - :in_vector(elements,sizeof(String),cmp_func),tmp(buff,sizeof(buff)) + :in_vector(elements,sizeof(String),cmp_func),tmp(buff,sizeof(buff),default_charset_info) {} in_string::~in_string() @@ -1272,7 +1272,7 @@ Item_func_regex::fix_fields(THD *thd,TABLE_LIST *tables) if (!regex_compiled && args[1]->const_item()) { char buff[MAX_FIELD_WIDTH]; - String tmp(buff,sizeof(buff)); + String tmp(buff,sizeof(buff),default_charset_info); String *res=args[1]->val_str(&tmp); if (args[1]->null_value) { // Will always return NULL @@ -1301,7 +1301,7 @@ Item_func_regex::fix_fields(THD *thd,TABLE_LIST *tables) longlong Item_func_regex::val_int() { char buff[MAX_FIELD_WIDTH]; - String *res, tmp(buff,sizeof(buff)); + String *res, tmp(buff,sizeof(buff),default_charset_info); res=args[0]->val_str(&tmp); if (args[0]->null_value) @@ -1312,7 +1312,7 @@ longlong Item_func_regex::val_int() if (!regex_is_const) { char buff2[MAX_FIELD_WIDTH]; - String *res2, tmp2(buff2,sizeof(buff2)); + String *res2, tmp2(buff2,sizeof(buff2),default_charset_info); res2= args[1]->val_str(&tmp2); if (args[1]->null_value) diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index b8f21f21008..350e369eaac 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -341,7 +341,7 @@ class cmp_item_sort_string :public cmp_item { char value_buff[80]; String value,*value_res; public: - cmp_item_sort_string() :value(value_buff,sizeof(value_buff)) {} + cmp_item_sort_string() :value(value_buff,sizeof(value_buff),default_charset_info) {} void store_value(Item *item) { value_res=item->val_str(&value); @@ -349,7 +349,7 @@ public: int cmp(Item *arg) { char buff[80]; - String tmp(buff,sizeof(buff)),*res; + String tmp(buff,sizeof(buff),default_charset_info),*res; if (!(res=arg->val_str(&tmp))) return 1; /* Can't be right */ return sortcmp(value_res,res); @@ -362,7 +362,7 @@ public: int cmp(Item *arg) { char buff[80]; - String tmp(buff,sizeof(buff)),*res; + String tmp(buff,sizeof(buff),default_charset_info),*res; if (!(res=arg->val_str(&tmp))) return 1; /* Can't be right */ return stringcmp(value_res,res); diff --git a/sql/item_create.cc b/sql/item_create.cc index 79d7fcfe230..9204d23b8c2 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -227,7 +227,7 @@ Item *create_func_lpad(Item* a, Item *b, Item *c) Item *create_func_ltrim(Item* a) { - return new Item_func_ltrim(a,new Item_string(" ",1)); + return new Item_func_ltrim(a,new Item_string(" ",1,default_charset_info)); } Item *create_func_md5(Item* a) @@ -309,7 +309,7 @@ Item *create_func_rpad(Item* a, Item *b, Item *c) Item *create_func_rtrim(Item* a) { - return new Item_func_rtrim(a,new Item_string(" ",1)); + return new Item_func_rtrim(a,new Item_string(" ",1,default_charset_info)); } Item *create_func_sec_to_time(Item* a) @@ -329,7 +329,7 @@ Item *create_func_sin(Item* a) Item *create_func_space(Item *a) { - return new Item_func_repeat(new Item_string(" ",1),a); + return new Item_func_repeat(new Item_string(" ",1,default_charset_info),a); } Item *create_func_soundex(Item* a) @@ -374,7 +374,9 @@ Item *create_func_ucase(Item* a) Item *create_func_version(void) { - return new Item_string(NullS,server_version, (uint) strlen(server_version)); + return new Item_string(NullS,server_version, + (uint) strlen(server_version), + default_charset_info); } Item *create_func_weekday(Item* a) diff --git a/sql/item_func.cc b/sql/item_func.cc index 9d4895788fc..057518fb5f2 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -1296,7 +1296,7 @@ String *udf_handler::val_str(String *str,String *save_str) str->length(res_length); return str; } - save_str->set(res, res_length); + save_str->set(res, res_length, default_charset_info); return save_str; } @@ -1438,7 +1438,7 @@ void item_user_lock_release(ULL *ull) THD *thd = current_thd; uint save_query_length; char buf[256]; - String tmp(buf,sizeof(buf)); + String tmp(buf,sizeof(buf), default_charset_info); tmp.length(0); tmp.append("DO RELEASE_LOCK(\""); tmp.append(ull->key,ull->key_length); @@ -1695,7 +1695,7 @@ longlong Item_func_set_last_insert_id::val_int() longlong Item_func_benchmark::val_int() { char buff[MAX_FIELD_WIDTH]; - String tmp(buff,sizeof(buff)); + String tmp(buff,sizeof(buff), default_charset_info); THD *thd=current_thd; for (ulong loop=0 ; loop < loop_count && !thd->killed; loop++) @@ -1832,7 +1832,7 @@ Item_func_set_user_var::update() break; case STRING_RESULT: char buffer[MAX_FIELD_WIDTH]; - String tmp(buffer,sizeof(buffer)); + String tmp(buffer,sizeof(buffer),default_charset_info); (void) val_str(&tmp); break; } @@ -2006,7 +2006,7 @@ longlong Item_func_inet_aton::val_int() char c = '.'; // we mark c to indicate invalid IP in case length is 0 char buff[36]; - String *s,tmp(buff,sizeof(buff)); + String *s,tmp(buff,sizeof(buff),default_charset_info); if (!(s = args[0]->val_str(&tmp))) // If null value goto err; null_value=0; @@ -2052,17 +2052,17 @@ void Item_func_match::init_search(bool no_order) } if (key == NO_SUCH_KEY) - concat=new Item_func_concat_ws (new Item_string(" ",1), fields); + concat=new Item_func_concat_ws (new Item_string(" ",1,default_charset_info), fields); String *ft_tmp=0; char tmp1[FT_QUERY_MAXLEN]; - String tmp2(tmp1,sizeof(tmp1)); + String tmp2(tmp1,sizeof(tmp1),default_charset_info); // MATCH ... AGAINST (NULL) is meaningless, but possible if (!(ft_tmp=key_item()->val_str(&tmp2))) { ft_tmp=&tmp2; - tmp2.set("",0); + tmp2.set("",0,default_charset_info); } ft_handler=table->file->ft_init_ext(mode, key, diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 9c791453fd8..e3436ac4641 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -35,7 +35,7 @@ #endif /* HAVE_OPENSSL */ #include "md5.h" -String empty_string(""); +String empty_string("",default_charset_info); uint nr_of_decimals(const char *str) { @@ -371,7 +371,7 @@ error: String *Item_func_concat_ws::val_str(String *str) { char tmp_str_buff[10]; - String tmp_sep_str(tmp_str_buff, sizeof(tmp_str_buff)), + String tmp_sep_str(tmp_str_buff, sizeof(tmp_str_buff),default_charset_info), *sep_str, *res, *res2,*use_as_buff; uint i; @@ -989,7 +989,7 @@ String *Item_func_ltrim::val_str(String *str) if ((null_value=args[0]->null_value)) return 0; /* purecov: inspected */ char buff[MAX_FIELD_WIDTH]; - String tmp(buff,sizeof(buff)); + String tmp(buff,sizeof(buff),res->charset()); String *remove_str=args[1]->val_str(&tmp); uint remove_length; LINT_INIT(remove_length); @@ -1027,7 +1027,7 @@ String *Item_func_rtrim::val_str(String *str) if ((null_value=args[0]->null_value)) return 0; /* purecov: inspected */ char buff[MAX_FIELD_WIDTH]; - String tmp(buff,sizeof(buff)); + String tmp(buff,sizeof(buff),res->charset()); String *remove_str=args[1]->val_str(&tmp); uint remove_length; LINT_INIT(remove_length); @@ -1099,7 +1099,7 @@ String *Item_func_trim::val_str(String *str) if ((null_value=args[0]->null_value)) return 0; /* purecov: inspected */ char buff[MAX_FIELD_WIDTH]; - String tmp(buff,sizeof(buff)); + String tmp(buff,sizeof(buff),res->charset()); String *remove_str=args[1]->val_str(&tmp); uint remove_length; LINT_INIT(remove_length); @@ -1154,7 +1154,7 @@ String *Item_func_password::val_str(String *str) if (res->length() == 0) return &empty_string; make_scrambled_password(tmp_value,res->c_ptr()); - str->set(tmp_value,16); + str->set(tmp_value,16,res->charset()); return str; } @@ -1188,7 +1188,7 @@ String *Item_func_encrypt::val_str(String *str) } pthread_mutex_lock(&LOCK_crypt); char *tmp=crypt(res->c_ptr(),salt_ptr); - str->set(tmp,(uint) strlen(tmp)); + str->set(tmp,(uint) strlen(tmp),res->charset()); str->copy(); pthread_mutex_unlock(&LOCK_crypt); return str; @@ -1240,7 +1240,7 @@ String *Item_func_database::val_str(String *str) if (!current_thd->db) str->length(0); else - str->set((const char*) current_thd->db,(uint) strlen(current_thd->db)); + str->set((const char*) current_thd->db,(uint) strlen(current_thd->db), default_charset_info); return str; } @@ -2035,7 +2035,7 @@ String* Item_func_export_set::val_str(String* str) } break; case 3: - sep_buf.set(",", 1); + sep_buf.set(",", 1, default_charset_info); sep = &sep_buf; } null_value=0; @@ -2154,7 +2154,7 @@ String *Item_func_geometry_type::val_str(String *str) if ((null_value=(args[0]->null_value || geom.create_from_wkb(wkt->ptr(),wkt->length())))) return 0; - str->copy(geom.get_class_info()->m_name); + str->copy(geom.get_class_info()->m_name,strlen(geom.get_class_info()->m_name)); return str; } diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index 091289fd040..8627ecd0d73 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -38,7 +38,7 @@ public: Field *tmp_table_field(TABLE *t_arg) { if (!t_arg) return result_field; - return (max_length > 255) ? (Field *)new Field_blob(max_length,maybe_null, name,t_arg, binary) : (Field *) new Field_string(max_length,maybe_null, name,t_arg, binary); + return (max_length > 255) ? (Field *)new Field_blob(max_length,maybe_null, name,t_arg, binary) : (Field *) new Field_string(max_length,maybe_null, name,t_arg, binary, default_charset_info); } }; diff --git a/sql/item_sum.cc b/sql/item_sum.cc index 83bc2272515..2275ce4eeb6 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -513,7 +513,7 @@ void Item_sum_hybrid::reset_field() if (hybrid_type == STRING_RESULT) { char buff[MAX_FIELD_WIDTH]; - String tmp(buff,sizeof(buff)),*res; + String tmp(buff,sizeof(buff),default_charset_info),*res; res=args[0]->val_str(&tmp); if (args[0]->null_value) @@ -524,7 +524,7 @@ void Item_sum_hybrid::reset_field() else { result_field->set_notnull(); - result_field->store(res->ptr(),res->length()); + result_field->store(res->ptr(),res->length(),tmp.charset()); } } else if (hybrid_type == INT_RESULT) @@ -694,7 +694,7 @@ Item_sum_hybrid::min_max_update_str_field(int offset) if (result_field->is_null() || (cmp_sign * (binary ? stringcmp(res_str,&tmp_value) : sortcmp(res_str,&tmp_value)) < 0)) - result_field->store(res_str->ptr(),res_str->length()); + result_field->store(res_str->ptr(),res_str->length(),res_str->charset()); else { // Use old value char *res=result_field->ptr; diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index 404d44d7122..9bbb9e4fe19 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -29,11 +29,31 @@ ** Todo: Move month and days to language files */ -static String month_names[] = { "January", "February", "March", "April", - "May", "June", "July", "August", - "September", "October", "November", "December" }; -static String day_names[] = { "Monday", "Tuesday", "Wednesday", - "Thursday", "Friday", "Saturday" ,"Sunday" }; +static String month_names[] = +{ + String("January", default_charset_info), + String("February", default_charset_info), + String("March", default_charset_info), + String("April", default_charset_info), + String("May", default_charset_info), + String("June", default_charset_info), + String("July", default_charset_info), + String("August", default_charset_info), + String("September", default_charset_info), + String("October", default_charset_info), + String("November", default_charset_info), + String("December", default_charset_info) +}; +static String day_names[] = +{ + String("Monday", default_charset_info), + String("Tuesday", default_charset_info), + String("Wednesday", default_charset_info), + String("Thursday", default_charset_info), + String("Friday", default_charset_info), + String("Saturday", default_charset_info), + String("Sunday", default_charset_info) +}; /* ** Get a array of positive numbers from a string object. @@ -376,7 +396,7 @@ String *Item_date::val_str(String *str) return (String*) 0; if (!value) // zero daynr { - str->copy("0000-00-00"); + str->copy("0000-00-00",10); return str; } if (str->alloc(11)) diff --git a/sql/item_timefunc.h b/sql/item_timefunc.h index aa4140192ab..9ff2734f460 100644 --- a/sql/item_timefunc.h +++ b/sql/item_timefunc.h @@ -271,7 +271,7 @@ public: double val() { return (double) value; } longlong val_int() { return value; } String *val_str(String *str) - { str_value.set(buff,buff_length); return &str_value; } + { str_value.set(buff,buff_length,default_charset_info); return &str_value; } const char *func_name() const { return "curtime"; } void fix_length_and_dec(); void make_field(Send_field *tmp_field) @@ -313,7 +313,7 @@ public: longlong val_int() { return value; } bool save_in_field(Field *to); String *val_str(String *str) - { str_value.set(buff,buff_length); return &str_value; } + { str_value.set(buff,buff_length,default_charset_info); return &str_value; } const char *func_name() const { return "now"; } void fix_length_and_dec(); bool get_date(TIME *res,bool fuzzy_date); diff --git a/sql/log_event.cc b/sql/log_event.cc index fd04f8dbbaa..cd116f867c2 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -213,7 +213,7 @@ void Log_event::pack_info(String* packet) void Query_log_event::pack_info(String* packet) { char buf[256]; - String tmp(buf, sizeof(buf)); + String tmp(buf, sizeof(buf), system_charset_info); tmp.length(0); if (db && db_len) { @@ -230,7 +230,7 @@ void Query_log_event::pack_info(String* packet) void Start_log_event::pack_info(String* packet) { char buf1[256]; - String tmp(buf1, sizeof(buf1)); + String tmp(buf1, sizeof(buf1), system_charset_info); tmp.length(0); char buf[22]; @@ -244,7 +244,7 @@ void Start_log_event::pack_info(String* packet) void Load_log_event::pack_info(String* packet) { char buf[256]; - String tmp(buf, sizeof(buf)); + String tmp(buf, sizeof(buf), system_charset_info); tmp.length(0); if(db && db_len) { @@ -320,7 +320,7 @@ void Load_log_event::pack_info(String* packet) void Rotate_log_event::pack_info(String* packet) { char buf1[256]; - String tmp(buf1, sizeof(buf1)); + String tmp(buf1, sizeof(buf1), system_charset_info); tmp.length(0); char buf[22]; tmp.append(new_log_ident, ident_len); @@ -334,7 +334,7 @@ void Rotate_log_event::pack_info(String* packet) void Intvar_log_event::pack_info(String* packet) { char buf1[256]; - String tmp(buf1, sizeof(buf1)); + String tmp(buf1, sizeof(buf1), system_charset_info); tmp.length(0); char buf[22]; tmp.append(get_var_type_name()); @@ -346,7 +346,7 @@ void Intvar_log_event::pack_info(String* packet) void Slave_log_event::pack_info(String* packet) { char buf1[256]; - String tmp(buf1, sizeof(buf1)); + String tmp(buf1, sizeof(buf1), system_charset_info); tmp.length(0); char buf[22]; tmp.append("host="); @@ -1417,7 +1417,7 @@ void Create_file_log_event::print(FILE* file, bool short_form, void Create_file_log_event::pack_info(String* packet) { char buf1[256]; - String tmp(buf1, sizeof(buf1)); + String tmp(buf1, sizeof(buf1), system_charset_info); tmp.length(0); char buf[22]; tmp.append("db="); @@ -1475,7 +1475,7 @@ void Append_block_log_event::print(FILE* file, bool short_form, void Append_block_log_event::pack_info(String* packet) { char buf1[256]; - String tmp(buf1, sizeof(buf1)); + String tmp(buf1, sizeof(buf1), system_charset_info); tmp.length(0); char buf[22]; tmp.append(";file_id="); @@ -1524,7 +1524,7 @@ void Delete_file_log_event::print(FILE* file, bool short_form, void Delete_file_log_event::pack_info(String* packet) { char buf1[256]; - String tmp(buf1, sizeof(buf1)); + String tmp(buf1, sizeof(buf1), system_charset_info); tmp.length(0); char buf[22]; tmp.append(";file_id="); @@ -1571,7 +1571,7 @@ void Execute_load_log_event::print(FILE* file, bool short_form, void Execute_load_log_event::pack_info(String* packet) { char buf1[256]; - String tmp(buf1, sizeof(buf1)); + String tmp(buf1, sizeof(buf1), system_charset_info); tmp.length(0); char buf[22]; tmp.append(";file_id="); @@ -1690,12 +1690,12 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli) handle_dup = DUP_REPLACE; sql_exchange ex((char*)fname, sql_ex.opt_flags && DUMPFILE_FLAG ); - String field_term(sql_ex.field_term,sql_ex.field_term_len); - String enclosed(sql_ex.enclosed,sql_ex.enclosed_len); - String line_term(sql_ex.line_term,sql_ex.line_term_len); - String line_start(sql_ex.line_start,sql_ex.line_start_len); - String escaped(sql_ex.escaped,sql_ex.escaped_len); - + String field_term(sql_ex.field_term,sql_ex.field_term_len, system_charset_info); + String enclosed(sql_ex.enclosed,sql_ex.enclosed_len, system_charset_info); + String line_term(sql_ex.line_term,sql_ex.line_term_len, system_charset_info); + String line_start(sql_ex.line_start,sql_ex.line_start_len, system_charset_info); + String escaped(sql_ex.escaped,sql_ex.escaped_len, system_charset_info); + ex.opt_enclosed = (sql_ex.opt_flags & OPT_ENCLOSED_FLAG); if (sql_ex.empty_flags & FIELD_TERM_EMPTY) ex.field_term->length(0); diff --git a/sql/net_pkg.cc b/sql/net_pkg.cc index 1ab3e18424f..a201651fc2f 100644 --- a/sql/net_pkg.cc +++ b/sql/net_pkg.cc @@ -334,7 +334,7 @@ net_store_data(String *packet,struct tm *tmp) bool net_store_data(String* packet, I_List* str_list) { char buf[256]; - String tmp(buf, sizeof(buf)); + String tmp(buf, sizeof(buf), default_charset_info); tmp.length(0); I_List_iterator it(*str_list); i_string* s; diff --git a/sql/opt_range.cc b/sql/opt_range.cc index 9f547c6e0ca..ccee7192682 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -930,7 +930,7 @@ get_mm_leaf(PARAM *param, Field *field, KEY_PART *key_part, { bool like_error; char buff1[MAX_FIELD_WIDTH],*min_str,*max_str; - String tmp(buff1,sizeof(buff1)),*res; + String tmp(buff1,sizeof(buff1),default_charset_info),*res; uint length,offset,min_length,max_length; if (!field->optimize_range((uint) key_part->key)) @@ -2836,7 +2836,7 @@ static void print_key(KEY_PART *key_part,const char *key,uint used_length) { char buff[1024]; - String tmp(buff,sizeof(buff)); + String tmp(buff,sizeof(buff),default_charset_info); for (uint length=0; length < used_length ; diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index 1398b2ce84f..f8f13c35e35 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -377,7 +377,7 @@ static uint get_access(TABLE *form,uint fieldnr) { uint access_bits=0,bit; char buff[2]; - String res(buff,sizeof(buff)); + String res(buff,sizeof(buff),default_charset_info); Field **pos; for (pos=form->field+fieldnr,bit=1 ; *pos ; pos++ , bit<<=1) @@ -1091,8 +1091,8 @@ static bool update_user_table(THD *thd, const char *host, const char *user, tables.db=(char*) "mysql"; if (!(table=open_ltable(thd,&tables,TL_WRITE))) DBUG_RETURN(1); /* purecov: deadcode */ - table->field[0]->store(host,(uint) strlen(host)); - table->field[1]->store(user,(uint) strlen(user)); + table->field[0]->store(host,(uint) strlen(host), system_charset_info); + table->field[1]->store(user,(uint) strlen(user), system_charset_info); if (table->file->index_read_idx(table->record[0],0, (byte*) table->field[0]->ptr,0, @@ -1102,7 +1102,7 @@ static bool update_user_table(THD *thd, const char *host, const char *user, DBUG_RETURN(1); /* purecov: deadcode */ } store_record(table,1); - table->field[2]->store(new_password,(uint) strlen(new_password)); + table->field[2]->store(new_password,(uint) strlen(new_password), system_charset_info); if ((error=table->file->update_row(table->record[1],table->record[0]))) { table->file->print_error(error,MYF(0)); /* purecov: deadcode */ @@ -1161,8 +1161,8 @@ static int replace_user_table(THD *thd, TABLE *table, const LEX_USER &combo, empty_string[0]=0; } - table->field[0]->store(combo.host.str,combo.host.length); - table->field[1]->store(combo.user.str,combo.user.length); + table->field[0]->store(combo.host.str,combo.host.length, system_charset_info); + table->field[1]->store(combo.user.str,combo.user.length, system_charset_info); table->file->index_init(0); if (table->file->index_read(table->record[0], (byte*) table->field[0]->ptr,0, @@ -1183,17 +1183,17 @@ static int replace_user_table(THD *thd, TABLE *table, const LEX_USER &combo, goto end; } old_row_exists = 0; - restore_record(table,2); // cp empty row from record[2] - table->field[0]->store(combo.host.str,combo.host.length); - table->field[1]->store(combo.user.str,combo.user.length); - table->field[2]->store(password,(uint) strlen(password)); + restore_record(table,2); // cp empty row from record[2] + table->field[0]->store(combo.host.str,combo.host.length, system_charset_info); + table->field[1]->store(combo.user.str,combo.user.length, system_charset_info); + table->field[2]->store(password,(uint) strlen(password), system_charset_info); } else { old_row_exists = 1; store_record(table,1); // Save copy for update if (combo.password.str) // If password given - table->field[2]->store(password,(uint) strlen(password)); + table->field[2]->store(password,(uint) strlen(password), system_charset_info); } for (i = 3, j = SELECT_ACL; // starting from reload @@ -1201,7 +1201,7 @@ static int replace_user_table(THD *thd, TABLE *table, const LEX_USER &combo, i++, j <<= 1) { if (j & rights) // set requested privileges - table->field[i]->store(&what,1); + table->field[i]->store(&what,1, system_charset_info); } rights=get_access(table,3); #ifdef HAVE_OPENSSL @@ -1209,30 +1209,30 @@ static int replace_user_table(THD *thd, TABLE *table, const LEX_USER &combo, DBUG_PRINT("info",("table->fields=%d",table->fields)); if (table->fields >= 21) /* From 4.0.0 we have more fields */ { - table->field[18]->store("",0); - table->field[19]->store("",0); - table->field[20]->store("",0); + table->field[18]->store("",0, system_charset_info); + table->field[19]->store("",0, system_charset_info); + table->field[20]->store("",0, system_charset_info); switch (thd->lex.ssl_type) { case SSL_TYPE_ANY: - table->field[17]->store("ANY",3); + table->field[17]->store("ANY",3, system_charset_info); break; case SSL_TYPE_X509: - table->field[17]->store("X509",4); + table->field[17]->store("X509",4, system_charset_info); break; case SSL_TYPE_SPECIFIED: - table->field[17]->store("SPECIFIED",9); + table->field[17]->store("SPECIFIED",9, system_charset_info); if (thd->lex.ssl_cipher) table->field[18]->store(thd->lex.ssl_cipher, - strlen(thd->lex.ssl_cipher)); + strlen(thd->lex.ssl_cipher), system_charset_info); if (thd->lex.x509_issuer) table->field[19]->store(thd->lex.x509_issuer, - strlen(thd->lex.x509_issuer)); + strlen(thd->lex.x509_issuer), system_charset_info); if (thd->lex.x509_subject) table->field[20]->store(thd->lex.x509_subject, - strlen(thd->lex.x509_subject)); + strlen(thd->lex.x509_subject), system_charset_info); break; default: - table->field[17]->store("NONE",4); + table->field[17]->store("NONE",4, system_charset_info); } } #endif /* HAVE_OPENSSL */ @@ -1315,9 +1315,9 @@ static int replace_db_table(TABLE *table, const char *db, DBUG_RETURN(-1); } - table->field[0]->store(combo.host.str,combo.host.length); - table->field[1]->store(db,(uint) strlen(db)); - table->field[2]->store(combo.user.str,combo.user.length); + table->field[0]->store(combo.host.str,combo.host.length, system_charset_info); + table->field[1]->store(db,(uint) strlen(db), system_charset_info); + table->field[2]->store(combo.user.str,combo.user.length, system_charset_info); table->file->index_init(0); if (table->file->index_read(table->record[0],(byte*) table->field[0]->ptr,0, HA_READ_KEY_EXACT)) @@ -1330,9 +1330,9 @@ static int replace_db_table(TABLE *table, const char *db, } old_row_exists = 0; restore_record(table,2); // cp empty row from record[2] - table->field[0]->store(combo.host.str,combo.host.length); - table->field[1]->store(db,(uint) strlen(db)); - table->field[2]->store(combo.user.str,combo.user.length); + table->field[0]->store(combo.host.str,combo.host.length, system_charset_info); + table->field[1]->store(db,(uint) strlen(db), system_charset_info); + table->field[2]->store(combo.user.str,combo.user.length, system_charset_info); } else { @@ -1344,7 +1344,7 @@ static int replace_db_table(TABLE *table, const char *db, for (i = 3, j = 1; i < table->fields; i++, j <<= 1) { if (j & store_rights) // do it if priv is chosen - table->field [i]->store(&what,1); // set requested privileges + table->field [i]->store(&what,1, system_charset_info);// set requested privileges } rights=get_access(table,3); rights=fix_rights_for_db(rights); @@ -1466,16 +1466,16 @@ public: if (cols) { int key_len; - col_privs->field[0]->store(host,(uint) strlen(host)); - col_privs->field[1]->store(db,(uint) strlen(db)); - col_privs->field[2]->store(user,(uint) strlen(user)); - col_privs->field[3]->store(tname,(uint) strlen(tname)); + col_privs->field[0]->store(host,(uint) strlen(host), system_charset_info); + col_privs->field[1]->store(db,(uint) strlen(db), system_charset_info); + col_privs->field[2]->store(user,(uint) strlen(user), system_charset_info); + col_privs->field[3]->store(tname,(uint) strlen(tname), system_charset_info); key_len=(col_privs->field[0]->pack_length()+ col_privs->field[1]->pack_length()+ col_privs->field[2]->pack_length()+ col_privs->field[3]->pack_length()); key_copy(key,col_privs,0,key_len); - col_privs->field[4]->store("",0); + col_privs->field[4]->store("",0, system_charset_info); col_privs->file->index_init(0); if (col_privs->file->index_read(col_privs->record[0], (byte*) col_privs->field[0]->ptr, @@ -1574,10 +1574,10 @@ static int replace_column_table(GRANT_TABLE *g_t, byte key[MAX_KEY_LENGTH]; DBUG_ENTER("replace_column_table"); - table->field[0]->store(combo.host.str,combo.host.length); - table->field[1]->store(db,(uint) strlen(db)); - table->field[2]->store(combo.user.str,combo.user.length); - table->field[3]->store(table_name,(uint) strlen(table_name)); + table->field[0]->store(combo.host.str,combo.host.length, system_charset_info); + table->field[1]->store(db,(uint) strlen(db), system_charset_info); + table->field[2]->store(combo.user.str,combo.user.length, system_charset_info); + table->field[3]->store(table_name,(uint) strlen(table_name), system_charset_info); key_length=(table->field[0]->pack_length()+ table->field[1]->pack_length()+ table->field[2]->pack_length()+ table->field[3]->pack_length()); key_copy(key,table,0,key_length); @@ -1594,7 +1594,7 @@ static int replace_column_table(GRANT_TABLE *g_t, uint privileges = xx->rights; bool old_row_exists=0; key_restore(table,key,0,key_length); - table->field[4]->store(xx->column.ptr(),xx->column.length()); + table->field[4]->store(xx->column.ptr(),xx->column.length(),system_charset_info); if (table->file->index_read(table->record[0],(byte*) table->field[0]->ptr, 0, HA_READ_KEY_EXACT)) @@ -1608,9 +1608,9 @@ static int replace_column_table(GRANT_TABLE *g_t, continue; /* purecov: inspected */ } old_row_exists = 0; - restore_record(table,2); // Get empty record + restore_record(table,2); // Get empty record key_restore(table,key,0,key_length); - table->field[4]->store(xx->column.ptr(),xx->column.length()); + table->field[4]->store(xx->column.ptr(),xx->column.length(), system_charset_info); } else { @@ -1682,7 +1682,7 @@ static int replace_column_table(GRANT_TABLE *g_t, { GRANT_COLUMN *grant_column = NULL; char colum_name_buf[HOSTNAME_LENGTH+1]; - String column_name(colum_name_buf,sizeof(colum_name_buf)); + String column_name(colum_name_buf,sizeof(colum_name_buf),system_charset_info); privileges&= ~rights; table->field[6]->store((longlong) @@ -1749,10 +1749,10 @@ static int replace_table_table(THD *thd, GRANT_TABLE *grant_table, } restore_record(table,2); // Get empty record - table->field[0]->store(combo.host.str,combo.host.length); - table->field[1]->store(db,(uint) strlen(db)); - table->field[2]->store(combo.user.str,combo.user.length); - table->field[3]->store(table_name,(uint) strlen(table_name)); + table->field[0]->store(combo.host.str,combo.host.length, system_charset_info); + table->field[1]->store(db,(uint) strlen(db), system_charset_info); + table->field[2]->store(combo.user.str,combo.user.length, system_charset_info); + table->field[3]->store(table_name,(uint) strlen(table_name), system_charset_info); store_record(table,1); // store at pos 1 if (table->file->index_read_idx(table->record[0],0, @@ -1797,7 +1797,7 @@ static int replace_table_table(THD *thd, GRANT_TABLE *grant_table, } } - table->field[4]->store(grantor,(uint) strlen(grantor)); + table->field[4]->store(grantor,(uint) strlen(grantor), system_charset_info); table->field[6]->store((longlong) store_table_rights); table->field[7]->store((longlong) store_col_rights); rights=fix_rights_for_table(store_table_rights); @@ -2612,7 +2612,7 @@ int mysql_show_grants(THD *thd,LEX_USER *lex_user) DBUG_RETURN(-1); } - Item_string *field=new Item_string("",0); + Item_string *field=new Item_string("",0,system_charset_info); List field_list; field->name=buff; field->max_length=1024; @@ -2628,7 +2628,7 @@ int mysql_show_grants(THD *thd,LEX_USER *lex_user) if (acl_user->access || acl_user->password) { want_access=acl_user->access; - String global(buff,sizeof(buff)); + String global(buff,sizeof(buff),system_charset_info); global.length(0); global.append("GRANT ",6); @@ -2734,7 +2734,7 @@ int mysql_show_grants(THD *thd,LEX_USER *lex_user) want_access=acl_db->access; if (want_access) { - String db(buff,sizeof(buff)); + String db(buff,sizeof(buff),system_charset_info); db.length(0); db.append("GRANT ",6); @@ -2793,7 +2793,7 @@ int mysql_show_grants(THD *thd,LEX_USER *lex_user) want_access=grant_table->privs; if ((want_access | grant_table->cols) != 0) { - String global(buff,sizeof(buff)); + String global(buff,sizeof(buff),system_charset_info); global.length(0); global.append("GRANT ",6); diff --git a/sql/sql_analyse.cc b/sql/sql_analyse.cc index 8f086863a4e..cc3406d0f54 100644 --- a/sql/sql_analyse.cc +++ b/sql/sql_analyse.cc @@ -270,7 +270,7 @@ void free_string(String *s) void field_str::add() { char buff[MAX_FIELD_WIDTH], *ptr; - String s(buff, sizeof(buff)), *res; + String s(buff, sizeof(buff),default_charset_info), *res; ulong length; if (!(res = item->val_str(&s))) @@ -573,8 +573,9 @@ bool analyse::end_of_records() { field_info **f = f_info; char buff[MAX_FIELD_WIDTH]; - String *res, s_min(buff, sizeof(buff)), s_max(buff, sizeof(buff)), - ans(buff, sizeof(buff)); + String *res, s_min(buff, sizeof(buff),default_charset_info), + s_max(buff, sizeof(buff),default_charset_info), + ans(buff, sizeof(buff),default_charset_info); for (; f != f_end; f++) { @@ -620,14 +621,14 @@ bool analyse::end_of_records() ((*f)->tree.elements_in_tree * 3 - 1 + 6)))) { char tmp[331]; //331, because one double prec. num. can be this long - String tmp_str(tmp, sizeof(tmp)); + String tmp_str(tmp, sizeof(tmp),default_charset_info); TREE_INFO tree_info; tree_info.str = &tmp_str; tree_info.found = 0; tree_info.item = (*f)->item; - tmp_str.set("ENUM(", 5); + tmp_str.set("ENUM(", 5,default_charset_info); tree_walk(&(*f)->tree, (*f)->collect_enum(), (char*) &tree_info, left_root_right); tmp_str.append(')'); @@ -891,7 +892,7 @@ int collect_real(double *element, element_count count __attribute__((unused)), TREE_INFO *info) { char buff[MAX_FIELD_WIDTH]; - String s(buff, sizeof(buff)); + String s(buff, sizeof(buff),default_charset_info); if (info->found) info->str->append(','); @@ -910,7 +911,7 @@ int collect_longlong(longlong *element, TREE_INFO *info) { char buff[MAX_FIELD_WIDTH]; - String s(buff, sizeof(buff)); + String s(buff, sizeof(buff),default_charset_info); if (info->found) info->str->append(','); @@ -929,7 +930,7 @@ int collect_ulonglong(ulonglong *element, TREE_INFO *info) { char buff[MAX_FIELD_WIDTH]; - String s(buff, sizeof(buff)); + String s(buff, sizeof(buff),default_charset_info); if (info->found) info->str->append(','); diff --git a/sql/sql_analyse.h b/sql/sql_analyse.h index 1c60d0c150f..3e8ddd67023 100644 --- a/sql/sql_analyse.h +++ b/sql/sql_analyse.h @@ -110,8 +110,9 @@ class field_str :public field_info EV_NUM_INFO ev_num_info; public: - field_str(Item* a, analyse* b) :field_info(a,b), min_arg(""), - max_arg(""), sum(0), + field_str(Item* a, analyse* b) :field_info(a,b), + min_arg("",default_charset_info), + max_arg("",default_charset_info), sum(0), must_be_blob(0), was_zero_fill(0), was_maybe_zerofill(0), can_be_still_num(1) { init_tree(&tree, 0, 0, sizeof(String), a->binary ? diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 031c83a2aeb..5e3bf90c4a5 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -197,7 +197,8 @@ send_fields(THD *thd,List &list,uint flag) char buff[80]; CONVERT *convert= (flag & 4) ? (CONVERT*) 0 : thd->convert_set; - String tmp((char*) buff,sizeof(buff)),*res,*packet= &thd->packet; + String tmp((char*) buff,sizeof(buff),default_charset_info); + String *res,*packet= &thd->packet; if (thd->fatal_error) // We have got an error goto err; diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 29cdaa676d6..d5d5c8fa6f9 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -363,8 +363,10 @@ select_result::select_result() thd=current_thd; } -static String default_line_term("\n"),default_escaped("\\"), - default_field_term("\t"); +static String + default_line_term("\n",default_charset_info), + default_escaped("\\",default_charset_info), + default_field_term("\t",default_charset_info); sql_exchange::sql_exchange(char *name,bool flag) :file_name(name), opt_enclosed(0), dumpfile(flag), skip_lines(0) @@ -507,7 +509,7 @@ bool select_export::send_data(List &items) DBUG_ENTER("send_data"); char buff[MAX_FIELD_WIDTH],null_buff[2],space[MAX_FIELD_WIDTH]; bool space_inited=0; - String tmp(buff,sizeof(buff)),*res; + String tmp(buff,sizeof(buff),default_charset_info),*res; tmp.length(0); if (thd->offset_limit) @@ -714,7 +716,7 @@ bool select_dump::send_data(List &items) { List_iterator_fast li(items); char buff[MAX_FIELD_WIDTH]; - String tmp(buff,sizeof(buff)),*res; + String tmp(buff,sizeof(buff),default_charset_info),*res; tmp.length(0); Item *item; DBUG_ENTER("send_data"); diff --git a/sql/sql_load.cc b/sql/sql_load.cc index 419e3fccabd..faeeaf2812e 100644 --- a/sql/sql_load.cc +++ b/sql/sql_load.cc @@ -358,7 +358,7 @@ read_fixed_length(THD *thd,COPY_INFO &info,TABLE *table,List &fields, field->field_length) length=field->field_length; save_chr=pos[length]; pos[length]='\0'; // Safeguard aganst malloc - field->store((char*) pos,length); + field->store((char*) pos,length,default_charset_info); pos[length]=save_chr; if ((pos+=length) > read_info.row_end) pos= read_info.row_end; /* Fills rest with space */ @@ -427,7 +427,7 @@ read_sep_field(THD *thd,COPY_INFO &info,TABLE *table, } field->set_notnull(); read_info.row_end[0]=0; // Safe to change end marker - field->store((char*) read_info.row_start,length); + field->store((char*) read_info.row_start,length,default_charset_info); } if (read_info.error) break; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 2599fe216c5..c539afb00c1 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -3377,14 +3377,14 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, case Item_sum::AVG_FUNC: /* Place for sum & count */ if (group) return new Field_string(sizeof(double)+sizeof(longlong), - maybe_null, item->name,table,1); + maybe_null, item->name,table,1,default_charset_info); else return new Field_double(item_sum->max_length,maybe_null, item->name, table, item_sum->decimals); case Item_sum::STD_FUNC: /* Place for sum & count */ if (group) return new Field_string(sizeof(double)*2+sizeof(longlong), - maybe_null, item->name,table,1); + maybe_null, item->name,table,1,default_charset_info); else return new Field_double(item_sum->max_length, maybe_null, item->name,table,item_sum->decimals); @@ -3403,7 +3403,7 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, return new Field_blob(item_sum->max_length,maybe_null, item->name,table,item->binary); return new Field_string(item_sum->max_length,maybe_null, - item->name,table,item->binary); + item->name,table,item->binary,default_charset_info); } } thd->fatal_error=1; @@ -3457,7 +3457,7 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, item->name,table,item->binary); else new_field= new Field_string(item->max_length,maybe_null, - item->name,table,item->binary); + item->name,table,item->binary,default_charset_info); break; } if (copy_func) @@ -3876,7 +3876,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List &fields, (uchar*) 0, (uint) 0, Field::NONE, - NullS, table, (bool) 1); + NullS, table, (bool) 1, default_charset_info); key_part_info->key_type=FIELDFLAG_BINARY; key_part_info->type= HA_KEYTYPE_BINARY; key_part_info++; @@ -6790,7 +6790,7 @@ change_to_use_tmp_fields(List &items) if (_db_on_ && !item_field->name) { char buff[256]; - String str(buff,sizeof(buff)); + String str(buff,sizeof(buff),default_charset_info); str.length(0); item->print(&str); item_field->name=sql_strmake(str.ptr(),str.length()); @@ -7021,7 +7021,7 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, item_list.push_back(new Item_empty_string("",0)); item_list.push_back(new Item_empty_string("",0)); item_list.push_back(new Item_empty_string("",0)); - item_list.push_back(new Item_string(message,strlen(message))); + item_list.push_back(new Item_string(message,strlen(message),default_charset_info)); if (result->send_data(item_list)) result->send_error(0,NullS); } @@ -7034,13 +7034,13 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, TABLE *table=tab->table; char buff[512],*buff_ptr=buff; char buff1[512], buff2[512], bufff[512]; - String tmp1(buff1,sizeof(buff1)); - String tmp2(buff2,sizeof(buff2)); + String tmp1(buff1,sizeof(buff1),default_charset_info); + String tmp2(buff2,sizeof(buff2),default_charset_info); item_list.empty(); if (tab->type == JT_ALL && tab->select && tab->select->quick) tab->type= JT_RANGE; - item_list.push_back(new Item_string(table->table_name,strlen(table->table_name))); - item_list.push_back(new Item_string(join_type_str[tab->type],strlen(join_type_str[tab->type]))); + item_list.push_back(new Item_string(table->table_name,strlen(table->table_name),default_charset_info)); + item_list.push_back(new Item_string(join_type_str[tab->type],strlen(join_type_str[tab->type]),default_charset_info)); tmp1.length(0); tmp2.length(0); key_map bits; uint j; @@ -7054,12 +7054,12 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, } } if (tmp1.length()) - item_list.push_back(new Item_string(tmp1.ptr(),tmp1.length())); + item_list.push_back(new Item_string(tmp1.ptr(),tmp1.length(),default_charset_info)); else item_list.push_back(new Item_null()); if (tab->ref.key_parts) { - item_list.push_back(new Item_string(table->key_info[tab->ref.key].name,strlen(table->key_info[tab->ref.key].name))); + item_list.push_back(new Item_string(table->key_info[tab->ref.key].name,strlen(table->key_info[tab->ref.key].name),default_charset_info)); item_list.push_back(new Item_int((int) tab->ref.key_length)); for (store_key **ref=tab->ref.key_copy ; *ref ; ref++) { @@ -7067,17 +7067,17 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, tmp2.append(','); tmp2.append((*ref)->name()); } - item_list.push_back(new Item_string(tmp2.ptr(),tmp2.length())); + item_list.push_back(new Item_string(tmp2.ptr(),tmp2.length(),default_charset_info)); } else if (tab->type == JT_NEXT) { - item_list.push_back(new Item_string(table->key_info[tab->index].name,strlen(table->key_info[tab->index].name))); + item_list.push_back(new Item_string(table->key_info[tab->index].name,strlen(table->key_info[tab->index].name),default_charset_info)); item_list.push_back(new Item_int((int) table->key_info[tab->index].key_length)); item_list.push_back(new Item_null()); } else if (tab->select && tab->select->quick) { - item_list.push_back(new Item_string(table->key_info[tab->select->quick->index].name,strlen(table->key_info[tab->select->quick->index].name))); + item_list.push_back(new Item_string(table->key_info[tab->select->quick->index].name,strlen(table->key_info[tab->select->quick->index].name),default_charset_info)); item_list.push_back(new Item_int((int) tab->select->quick->max_used_key_length)); item_list.push_back(new Item_null()); } @@ -7088,14 +7088,14 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, item_list.push_back(new Item_null()); } sprintf(bufff,"%.0f",join->best_positions[i].records_read); - item_list.push_back(new Item_string(bufff,strlen(bufff))); + item_list.push_back(new Item_string(bufff,strlen(bufff),default_charset_info)); my_bool key_read=table->key_read; if (tab->type == JT_NEXT && ((table->used_keys & ((key_map) 1 << tab->index)))) key_read=1; if (tab->info) - item_list.push_back(new Item_string(tab->info,strlen(tab->info))); + item_list.push_back(new Item_string(tab->info,strlen(tab->info),default_charset_info)); else if (tab->select) { if (tab->use_quick == 2) @@ -7149,7 +7149,7 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, } buff_ptr=strmov(buff_ptr,"Distinct"); } - item_list.push_back(new Item_string(buff,(uint) (buff_ptr - buff))); + item_list.push_back(new Item_string(buff,(uint) (buff_ptr - buff),default_charset_info)); // For next iteration used_tables|=table->map; if (result->send_data(item_list)) diff --git a/sql/sql_select.h b/sql/sql_select.h index befa1efde53..054d427a4e0 100644 --- a/sql/sql_select.h +++ b/sql/sql_select.h @@ -217,7 +217,7 @@ class store_key :public Sql_alloc if (field_arg->type() == FIELD_TYPE_BLOB) to_field=new Field_varstring(ptr, length, (uchar*) null, 1, Field::NONE, field_arg->field_name, - field_arg->table, field_arg->binary()); + field_arg->table, field_arg->binary(), default_charset_info); else { to_field=field_arg->new_field(&thd->mem_root,field_arg->table); diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 95705c19d68..849a803a622 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -57,7 +57,7 @@ extern struct st_VioSSLAcceptorFd * ssl_acceptor_fd; int mysqld_show_dbs(THD *thd,const char *wild) { - Item_string *field=new Item_string("",0); + Item_string *field=new Item_string("",0,default_charset_info); List field_list; char *end; List files; @@ -138,7 +138,7 @@ int mysqld_show_open_tables(THD *thd,const char *wild) int mysqld_show_tables(THD *thd,const char *db,const char *wild) { - Item_string *field=new Item_string("",0); + Item_string *field=new Item_string("",0,default_charset_info); List field_list; char path[FN_LEN],*end; List files; @@ -262,7 +262,7 @@ int mysqld_extend_show_tables(THD *thd,const char *db,const char *wild) (void) sprintf(path,"%s/%s",mysql_data_home,db); (void) unpack_dirname(path,path); - +//,default_charset_info field_list.push_back(item=new Item_empty_string("Name",NAME_LEN)); item->maybe_null=1; field_list.push_back(item=new Item_empty_string("Type",10)); @@ -483,7 +483,7 @@ mysqld_show_fields(THD *thd, TABLE_LIST *table_list,const char *wild, { byte *pos; uint flags=field->flags; - String type(tmp,sizeof(tmp)); + String type(tmp,sizeof(tmp),default_charset_info); uint col_access; bool null_default_value=0; @@ -506,7 +506,7 @@ mysqld_show_fields(THD *thd, TABLE_LIST *table_list,const char *wild, null_default_value=1; if (!null_default_value && !field->is_null()) { // Not null by default - type.set(tmp,sizeof(tmp)); + type.set(tmp,sizeof(tmp),default_charset_info); field->val_str(&type,&type); net_store_data(packet,convert,type.ptr(),type.length()); } @@ -810,7 +810,7 @@ store_create_info(THD *thd, TABLE *table, String *packet) List field_list; char tmp[MAX_FIELD_WIDTH]; - String type(tmp, sizeof(tmp)); + String type(tmp, sizeof(tmp),default_charset_info); if (table->tmp_table) packet->append("CREATE TEMPORARY TABLE ", 23); else @@ -830,7 +830,7 @@ store_create_info(THD *thd, TABLE *table, String *packet) packet->append(' '); // check for surprises from the previous call to Field::sql_type() if (type.ptr() != tmp) - type.set(tmp, sizeof(tmp)); + type.set(tmp, sizeof(tmp),default_charset_info); field->sql_type(type); packet->append(type.ptr(),type.length()); @@ -846,7 +846,7 @@ store_create_info(THD *thd, TABLE *table, String *packet) packet->append(" default ", 9); if (!field->is_null()) { // Not null by default - type.set(tmp,sizeof(tmp)); + type.set(tmp,sizeof(tmp),default_charset_info); field->val_str(&type,&type); packet->append('\''); if (type.length()) @@ -1143,7 +1143,7 @@ int mysqld_show(THD *thd, const char *wild, show_var_st *variables) { uint i; char buff[8192]; - String packet2(buff,sizeof(buff)); + String packet2(buff,sizeof(buff),default_charset_info); List field_list; CONVERT *convert=thd->convert_set; DBUG_ENTER("mysqld_show"); diff --git a/sql/sql_string.cc b/sql/sql_string.cc index cf9e9f62507..b222d3394eb 100644 --- a/sql/sql_string.cc +++ b/sql/sql_string.cc @@ -586,6 +586,7 @@ String *copy_if_not_alloced(String *to,String *from,uint32 from_length) return from; // Actually an error if ((to->str_length=min(from->str_length,from_length))) memcpy(to->Ptr,from->Ptr,to->str_length); + to->str_charset=from->str_charset; return to; } diff --git a/sql/sql_string.h b/sql/sql_string.h index 9bf13b93628..68c5e005782 100644 --- a/sql/sql_string.h +++ b/sql/sql_string.h @@ -46,22 +46,21 @@ public: String(uint32 length_arg) { alloced=0; Alloced_length=0; (void) real_alloc(length_arg); - str_charset=default_charset_info; } - String(const char *str) + String(const char *str, CHARSET_INFO *cs) { Ptr=(char*) str; str_length=(uint) strlen(str); Alloced_length=0; alloced=0; - str_charset=default_charset_info; + str_charset=cs; } - String(const char *str,uint32 len) + String(const char *str,uint32 len, CHARSET_INFO *cs) { Ptr=(char*) str; str_length=len; Alloced_length=0; alloced=0; - str_charset=default_charset_info; + str_charset=cs; } - String(char *str,uint32 len) + String(char *str,uint32 len, CHARSET_INFO *cs) { Ptr=(char*) str; Alloced_length=str_length=len; alloced=0; - str_charset=default_charset_info; + str_charset=cs; } String(const String &str) { @@ -103,23 +102,27 @@ public: Alloced_length=str.Alloced_length-offset; else Alloced_length=0; + str_charset=str.str_charset; } - inline void set(char *str,uint32 arg_length) + inline void set(char *str,uint32 arg_length, CHARSET_INFO *cs) { free(); Ptr=(char*) str; str_length=Alloced_length=arg_length ; alloced=0; + str_charset=cs; } - inline void set(const char *str,uint32 arg_length) + inline void set(const char *str,uint32 arg_length, CHARSET_INFO *cs) { free(); Ptr=(char*) str; str_length=arg_length; Alloced_length=0 ; alloced=0; + str_charset=cs; } - inline void set_quick(char *str,uint32 arg_length) + inline void set_quick(char *str,uint32 arg_length, CHARSET_INFO *cs) { if (!alloced) { Ptr=(char*) str; str_length=Alloced_length=arg_length; } + str_charset=cs; } bool set(longlong num); /* bool set(long num); */ diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 782caa8fa51..a60ff793cb6 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -156,7 +156,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists, { if (wrong_tables.length()) wrong_tables.append(','); - wrong_tables.append(String(table->real_name)); + wrong_tables.append(String(table->real_name,default_charset_info)); } } if (some_tables_deleted) diff --git a/sql/sql_test.cc b/sql/sql_test.cc index 43c24da85a2..0bc1feed839 100644 --- a/sql/sql_test.cc +++ b/sql/sql_test.cc @@ -33,7 +33,7 @@ print_where(COND *cond,const char *info) if (cond) { char buff[256]; - String str(buff,(uint32) sizeof(buff)); + String str(buff,(uint32) sizeof(buff), default_charset_info); str.length(0); cond->print(&str); str.append('\0'); @@ -99,7 +99,8 @@ void print_cached_tables(void) void TEST_filesort(SORT_FIELD *sortorder,uint s_length, ha_rows special) { char buff[256],buff2[256]; - String str(buff,sizeof(buff)),out(buff2,sizeof(buff2)); + String str(buff,sizeof(buff),default_charset_info); + String out(buff2,sizeof(buff2),default_charset_info); const char *sep; DBUG_ENTER("TEST_filesort"); diff --git a/sql/sql_udf.cc b/sql/sql_udf.cc index f44fa3b7321..225c0ea26a4 100644 --- a/sql/sql_udf.cc +++ b/sql/sql_udf.cc @@ -412,9 +412,9 @@ int mysql_create_function(THD *thd,udf_func *udf) goto err; restore_record(table,2); // Get default values for fields - table->field[0]->store(u_d->name, u_d->name_length); + table->field[0]->store(u_d->name, u_d->name_length, default_charset_info); table->field[1]->store((longlong) u_d->returns); - table->field[2]->store(u_d->dl,(uint) strlen(u_d->dl)); + table->field[2]->store(u_d->dl,(uint) strlen(u_d->dl), default_charset_info); if (table->fields >= 4) // If not old func format table->field[3]->store((longlong) u_d->type); error = table->file->write_row(table->record[0]); diff --git a/sql/sql_update.cc b/sql/sql_update.cc index db520af61c1..2a45798ddf8 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -466,7 +466,7 @@ multi_update::prepare(List &values) } if (counter) { - Field_string offset(table_ref->table->file->ref_length,false,"offset",table_ref->table,true); + Field_string offset(table_ref->table->file->ref_length,false,"offset",table_ref->table,true,default_charset_info); temp_fields->push_front(new Item_field(((Field *)&offset))); // Here I make tmp tables int cnt=counter-1; @@ -616,7 +616,8 @@ bool multi_update::send_data(List &values) { // Here we insert into each temporary table values_by_table.push_front(new Item_string((char*) table->file->ref, - table->file->ref_length)); + table->file->ref_length, + system_charset_info)); fill_record(tmp_tables[secure_counter]->field,values_by_table); error= write_record(tmp_tables[secure_counter], &(infos[secure_counter])); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 24321dbdb53..6ce661440c0 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1904,7 +1904,7 @@ simple_expr: | SUBSTRING_INDEX '(' expr ',' expr ',' expr ')' { $$= new Item_func_substr_index($3,$5,$7); } | TRIM '(' expr ')' - { $$= new Item_func_trim($3,new Item_string(" ",1)); } + { $$= new Item_func_trim($3,new Item_string(" ",1,default_charset_info)); } | TRIM '(' LEADING opt_pad FROM expr ')' { $$= new Item_func_ltrim($6,$4); } | TRIM '(' TRAILING opt_pad FROM expr ')' @@ -2089,7 +2089,7 @@ when_list2: } opt_pad: - /* empty */ { $$=new Item_string(" ",1); } + /* empty */ { $$=new Item_string(" ",1,default_charset_info); } | expr { $$=$1; } join_table_list: @@ -2204,11 +2204,11 @@ key_usage_list: key_usage_list2: key_usage_list2 ',' ident - { Select->interval_list.push_back(new String((const char*) $3.str,$3.length)); } + { Select->interval_list.push_back(new String((const char*) $3.str,$3.length,default_charset_info)); } | ident - { Select->interval_list.push_back(new String((const char*) $1.str,$1.length)); } + { Select->interval_list.push_back(new String((const char*) $1.str,$1.length,default_charset_info)); } | PRIMARY_SYM - { Select->interval_list.push_back(new String("PRIMARY",7)); } + { Select->interval_list.push_back(new String("PRIMARY",7,default_charset_info)); } using_list: ident @@ -2815,7 +2815,7 @@ describe_command: opt_describe_column: /* empty */ {} | text_string { Lex->wild= $1; } - | ident { Lex->wild= new String((const char*) $1.str,$1.length); } + | ident { Lex->wild= new String((const char*) $1.str,$1.length,default_charset_info); } /* flush things */ @@ -2983,15 +2983,15 @@ opt_ignore_lines: /* Common definitions */ text_literal: - TEXT_STRING { $$ = new Item_string($1.str,$1.length); } + TEXT_STRING { $$ = new Item_string($1.str,$1.length,default_charset_info); } | text_literal TEXT_STRING { ((Item_string*) $1)->append($2.str,$2.length); } text_string: - TEXT_STRING { $$= new String($1.str,$1.length); } + TEXT_STRING { $$= new String($1.str,$1.length,default_charset_info); } | HEX_NUM { - Item *tmp = new Item_varbinary($1.str,$1.length); + Item *tmp = new Item_varbinary($1.str,$1.length,default_charset_info); $$= tmp ? tmp->val_str((String*) 0) : (String*) 0; } @@ -3004,7 +3004,7 @@ literal: | FLOAT_NUM { $$ = new Item_float($1.str, $1.length); } | NULL_SYM { $$ = new Item_null(); Lex->next_state=STATE_OPERATOR_OR_IDENT;} - | HEX_NUM { $$ = new Item_varbinary($1.str,$1.length);} + | HEX_NUM { $$ = new Item_varbinary($1.str,$1.length,default_charset_info);} | DATE_SYM text_literal { $$ = $2; } | TIME_SYM text_literal { $$ = $2; } | TIMESTAMP text_literal { $$ = $2; } @@ -3731,7 +3731,7 @@ column_list: column_list_id: ident { - String *new_str = new String((const char*) $1.str,$1.length); + String *new_str = new String((const char*) $1.str,$1.length,default_charset_info); List_iterator iter(Lex->columns); class LEX_COLUMN *point; LEX *lex=Lex; diff --git a/sql/table.cc b/sql/table.cc index eb5f5ecbc9a..29c50fd8dcc 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -1072,7 +1072,7 @@ char *get_field(MEM_ROOT *mem, TABLE *table, uint fieldnr) { Field *field=table->field[fieldnr]; char buff[MAX_FIELD_WIDTH]; - String str(buff,sizeof(buff)); + String str(buff,sizeof(buff),table->table_charset); field->val_str(&str,&str); uint length=str.length(); if (!length) diff --git a/sql/unireg.cc b/sql/unireg.cc index 1c35f7a6a08..16f51658313 100644 --- a/sql/unireg.cc +++ b/sql/unireg.cc @@ -484,7 +484,7 @@ static bool pack_fields(File file,List &create_fields) /* Write intervals */ if (int_count) { - String tmp((char*) buff,sizeof(buff)); + String tmp((char*) buff,sizeof(buff), default_charset_info); tmp.length(0); it.rewind(); int_count=0; @@ -561,6 +561,7 @@ static bool make_empty_rec(File file,enum db_type table_type, field->interval, field->field_name, &table); + if (!(field->flags & NOT_NULL_FLAG)) null_count++; @@ -581,9 +582,9 @@ static bool make_empty_rec(File file,enum db_type table_type, regfield->store((longlong) 1); } else if (type == Field::YES) // Old unireg type - regfield->store(ER(ER_YES),(uint) strlen(ER(ER_YES))); + regfield->store(ER(ER_YES),(uint) strlen(ER(ER_YES)),default_charset_info); else if (type == Field::NO) // Old unireg type - regfield->store(ER(ER_NO), (uint) strlen(ER(ER_NO))); + regfield->store(ER(ER_NO), (uint) strlen(ER(ER_NO)),default_charset_info); else regfield->reset(); delete regfield; -- cgit v1.2.1 From 3f50440f30f5b49f78672f804c578ff1484ee274 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 20 May 2002 17:10:50 +0500 Subject: Charset related synax changes, now these things work in parser: CREATE DATABASE name DEFAULT CHARACTER SET charsetname; CREATE DATABASE name (fieldname CHAR(n) CHARACTER SET charsetname); Changes affect query parsing ONLY and do not have other effect yet. sql/sql_lex.h: Charset related synax changes sql/sql_yacc.yy: Charset related synax changes --- sql/sql_lex.h | 1 + sql/sql_yacc.yy | 29 ++++++++++++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 53422b050a3..e53a2e7bda8 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -189,6 +189,7 @@ typedef struct st_lex { bool drop_primary,drop_if_exists,local_file; bool in_comment,ignore_space,verbose,simple_alter, option_type, derived_tables; uint slave_thd_opt; + CHARSET_INFO *charset; } LEX; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 6ce661440c0..756afbd7a09 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -777,7 +777,7 @@ create: lex->key_list.push_back(new Key($2,$5,$4.str,lex->col_list)); lex->col_list.empty(); } - | CREATE DATABASE opt_if_not_exists ident + | CREATE DATABASE opt_if_not_exists ident default_charset { LEX *lex=Lex; lex->sql_command=SQLCOM_CREATE_DB; @@ -1095,8 +1095,31 @@ attribute: | UNIQUE_SYM KEY_SYM { Lex->type|= UNIQUE_KEY_FLAG; } opt_binary: - /* empty */ {} - | BINARY { Lex->type|=BINARY_FLAG; } + /* empty */ { Lex->charset=default_charset_info; } + | BINARY { Lex->type|=BINARY_FLAG; Lex->charset=default_charset_info; } + | CHAR_SYM SET ident + { + CHARSET_INFO *cs=get_charset_by_name($3.str,MYF(MY_WME)); + if (!cs) + { + net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$3); + YYABORT; + } + Lex->charset=cs; + } + +default_charset: + /* empty */ { Lex->charset-default_charset_info; } + | DEFAULT CHAR_SYM SET ident + { + CHARSET_INFO *cs=get_charset_by_name($4.str,MYF(MY_WME)); + if (!cs) + { + net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$4); + YYABORT; + } + Lex->charset=cs; + } references: REFERENCES table_ident opt_on_delete {} -- cgit v1.2.1 From 1afa4558563c758277052520f811d665845a223c Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 20 May 2002 20:38:39 +0500 Subject: Fix for bug mentioned by Peter and Sanja sql/sql_table.cc: Remove debug output --- sql/filesort.cc | 2 +- sql/sql_table.cc | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/sql/filesort.cc b/sql/filesort.cc index ec49163f8a0..b7745ccb8ca 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -87,6 +87,7 @@ ha_rows filesort(TABLE *table, SORT_FIELD *sortorder, uint s_length, for(i=0;ifields;i++) if (!table->field[i]->binary()) charset=((Field_str*)(table->field[i]))->charset(); + charset=charset?charset:default_charset_info; // /BAR TODO outfile= table->io_cache; @@ -930,7 +931,6 @@ sortlength(SORT_FIELD *sortorder, uint s_length) #ifdef USE_STRCOLL if (!sortorder->field->binary()) { - // BAR TODO: need checking that it is really Field_str based class CHARSET_INFO *cs=((Field_str*)(sortorder->field))->charset(); if (use_strcoll(cs)) sortorder->length= sortorder->length*cs->strxfrm_multiply; diff --git a/sql/sql_table.cc b/sql/sql_table.cc index a60ff793cb6..36c4f4cba48 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -476,9 +476,6 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, checking for proper key parts number: */ -printf("key_info->flags=%d key_info->algorithm=%d\n", - key_info->flags,key_info->algorithm); - if(key_info->flags == HA_SPATIAL){ if(key_info->key_parts!=1){ my_printf_error(ER_WRONG_ARGUMENTS, -- cgit v1.2.1 From 1b49cd8ca1391d5141750fae62fa0c9c13da6e86 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 20 May 2002 21:56:27 +0500 Subject: Bug fix: charset was not initialized --- sql/sql_string.cc | 1 + sql/sql_string.h | 1 + 2 files changed, 2 insertions(+) diff --git a/sql/sql_string.cc b/sql/sql_string.cc index b222d3394eb..c05a7b85f77 100644 --- a/sql/sql_string.cc +++ b/sql/sql_string.cc @@ -203,6 +203,7 @@ bool String::copy(const String &str) str_length=str.str_length; bmove(Ptr,str.Ptr,str_length); // May be overlapping Ptr[str_length]=0; + str_charset=str.str_charset; return FALSE; } diff --git a/sql/sql_string.h b/sql/sql_string.h index 68c5e005782..5e5c9001590 100644 --- a/sql/sql_string.h +++ b/sql/sql_string.h @@ -46,6 +46,7 @@ public: String(uint32 length_arg) { alloced=0; Alloced_length=0; (void) real_alloc(length_arg); + str_charset=default_charset_info; } String(const char *str, CHARSET_INFO *cs) { -- cgit v1.2.1 From c811538f89925b7111e4ee0e3b940726f32a64d9 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 21 May 2002 21:54:08 +0500 Subject: BTREE heap key structure is now the same as MyISAM _mi_compare_text -> mi_compate_text Changes according Monty's suggestions heap/heapdef.h: BTREE heap key structure is now the same as MyISAM heap/hp_delete.c: BTREE heap key structure is now the same as MyISAM heap/hp_hash.c: BTREE heap key structure is now the same as MyISAM heap/hp_open.c: BTREE heap key structure is now the same as MyISAM heap/hp_rfirst.c: BTREE heap key structure is now the same as MyISAM heap/hp_rkey.c: BTREE heap key structure is now the same as MyISAM heap/hp_rlast.c: BTREE heap key structure is now the same as MyISAM heap/hp_rnext.c: BTREE heap key structure is now the same as MyISAM heap/hp_rprev.c: BTREE heap key structure is now the same as MyISAM heap/hp_write.c: BTREE heap key structure is now the same as MyISAM include/heap.h: BTREE heap key structure is now the same as MyISAM include/my_handler.h: Removed hp_rb_key_cmp() _mi_compare_text -> mi_compate_text include/my_tree.h: Fixed typo myisam/ft_boolean_search.c: _mi_compare_text -> mi_compate_text myisam/ft_nlq_search.c: _mi_compare_text -> mi_compate_text myisam/ft_parser.c: _mi_compare_text -> mi_compate_text myisam/ft_stopwords.c: _mi_compare_text -> mi_compate_text myisam/ft_update.c: _mi_compare_text -> mi_compate_text mysys/my_handler.c: Removed hp_rb_key_cmp() _mi_compare_text -> mi_compate_text mysys/tree.c: BTREE heap key structure is now the same as MyISAM sql/ha_heap.cc: BTREE heap key structure is now the same as MyISAM --- heap/heapdef.h | 3 +- heap/hp_delete.c | 9 +- heap/hp_hash.c | 53 +++++-- heap/hp_open.c | 111 ++++++++------- heap/hp_rfirst.c | 2 +- heap/hp_rkey.c | 2 +- heap/hp_rlast.c | 2 +- heap/hp_rnext.c | 2 +- heap/hp_rprev.c | 2 +- heap/hp_write.c | 18 +-- include/heap.h | 3 +- include/my_handler.h | 12 +- include/my_tree.h | 4 +- myisam/ft_boolean_search.c | 10 +- myisam/ft_nlq_search.c | 6 +- myisam/ft_parser.c | 8 +- myisam/ft_stopwords.c | 6 +- myisam/ft_update.c | 4 +- mysys/my_handler.c | 341 +-------------------------------------------- mysys/tree.c | 64 ++++----- sql/ha_heap.cc | 9 +- 21 files changed, 182 insertions(+), 489 deletions(-) diff --git a/heap/heapdef.h b/heap/heapdef.h index aeb345522f5..0308f7dd62c 100644 --- a/heap/heapdef.h +++ b/heap/heapdef.h @@ -79,8 +79,9 @@ extern int hp_rec_key_cmp(HP_KEYDEF *keydef,const byte *rec1, extern int hp_key_cmp(HP_KEYDEF *keydef,const byte *rec, const byte *key); extern void hp_make_key(HP_KEYDEF *keydef,byte *key,const byte *rec); -extern void hp_rb_make_key(HP_KEYDEF *keydef, byte *key, +extern uint hp_rb_make_key(HP_KEYDEF *keydef, byte *key, const byte *rec, byte *recpos); +extern uint hp_rb_key_length(HP_KEYDEF *keydef, const byte *key); extern my_bool hp_if_null_in_key(HP_KEYDEF *keyinfo, const byte *record); extern int hp_close(register HP_INFO *info); extern void hp_clear(HP_SHARE *info); diff --git a/heap/hp_delete.c b/heap/hp_delete.c index 82513044058..4ba2f2c5310 100644 --- a/heap/hp_delete.c +++ b/heap/hp_delete.c @@ -65,12 +65,11 @@ int hp_rb_delete_key(HP_INFO *info, register HP_KEYDEF *keyinfo, heap_rb_param custom_arg; if (flag) - info->last_pos = NULL; /* For heap_rnext/heap_rprev */ + info->last_pos= NULL; /* For heap_rnext/heap_rprev */ - hp_rb_make_key(keyinfo, info->recbuf, record, recpos); - custom_arg.keyseg = keyinfo->seg; - custom_arg.key_length = keyinfo->length; - custom_arg.search_flag = SEARCH_SAME; + custom_arg.keyseg= keyinfo->seg; + custom_arg.key_length= hp_rb_make_key(keyinfo, info->recbuf, record, recpos); + custom_arg.search_flag= SEARCH_SAME; return tree_delete(&keyinfo->rb_tree, info->recbuf, &custom_arg); } diff --git a/heap/hp_hash.c b/heap/hp_hash.c index dbd330ea4f4..f170df4fdb8 100644 --- a/heap/hp_hash.c +++ b/heap/hp_hash.c @@ -391,14 +391,13 @@ int hp_rec_key_cmp(HP_KEYDEF *keydef, const byte *rec1, const byte *rec2) if (rec1[seg->null_pos] & seg->null_bit) continue; } - switch (seg->type) { - case HA_KEYTYPE_END: - return 0; - case HA_KEYTYPE_TEXT: + if (seg->type == HA_KEYTYPE_TEXT) + { if (my_sortcmp(seg->charset,rec1+seg->start,rec2+seg->start,seg->length)) return 1; - break; - default: + } + else + { if (bcmp(rec1+seg->start,rec2+seg->start,seg->length)) return 1; } @@ -454,21 +453,24 @@ void hp_make_key(HP_KEYDEF *keydef, byte *key, const byte *rec) } } -void hp_rb_make_key(HP_KEYDEF *keydef, byte *key, +uint hp_rb_make_key(HP_KEYDEF *keydef, byte *key, const byte *rec, byte *recpos) { + byte *start_key= key; HA_KEYSEG *seg, *endseg; - /* -1 means that HA_KEYTYPE_END segment will not copy */ - for (seg= keydef->seg, endseg= seg + keydef->keysegs - 1; seg < endseg; - seg++) + for (seg= keydef->seg, endseg= seg + keydef->keysegs; seg < endseg; seg++) { if (seg->null_bit) - *key++= 1 - test(rec[seg->null_pos] & seg->null_bit); + { + if (!(*key++= 1 - test(rec[seg->null_pos] & seg->null_bit))) + continue; + } memcpy(key, rec + seg->start, (size_t) seg->length); key+= seg->length; } memcpy(key, &recpos, sizeof(byte*)); + return key - start_key; } uint hp_rb_pack_key(HP_INFO *info, uint inx, uchar *key, const uchar *old, @@ -482,12 +484,39 @@ uint hp_rb_pack_key(HP_INFO *info, uint inx, uchar *key, const uchar *old, old+= seg->length, seg++) { if (seg->null_bit) - *key++= 1 - *old++; + { + if (!(*key++= (char) 1 - *old++)) + continue; + } memcpy((byte*) key, old, seg->length); key+= seg->length; } return key - start_key; } + +uint hp_rb_key_length(HP_KEYDEF *keydef, const byte *key) +{ + const byte *start_key= key; + HA_KEYSEG *seg, *endseg; + + if (keydef->flag & HA_NULL_PART_KEY) + { + for (seg= keydef->seg, endseg= seg + keydef->keysegs; seg < endseg; seg++) + { + if (seg->null_bit) + { + if (!*key++) + continue; + } + key += seg->length; + } + return key - start_key; + } + else + { + return keydef->length; + } +} /* Test if any of the key parts are NULL. diff --git a/heap/hp_open.c b/heap/hp_open.c index 49f9a2cfc33..7f189adc497 100644 --- a/heap/hp_open.c +++ b/heap/hp_open.c @@ -26,8 +26,8 @@ static int keys_compare(heap_rb_param *param, uchar *key1, uchar *key2) { uint not_used; - return hp_rb_key_cmp(param->keyseg, key1, key2, param->key_length, - param->search_flag, ¬_used); + return ha_key_cmp(param->keyseg, key1, key2, param->key_length, + param->search_flag, ¬_used); } static void init_block(HP_BLOCK *block,uint reclength,ulong min_records, @@ -52,25 +52,28 @@ HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef, for (i=key_segs=max_length=0 ; i < keys ; i++) { key_segs+= keydef[i].keysegs; + if (keydef[i].algorithm == HA_KEY_ALG_BTREE) + key_segs++; bzero((char*) &keydef[i].block,sizeof(keydef[i].block)); bzero((char*) &keydef[i].rb_tree ,sizeof(keydef[i].rb_tree)); for (j=length=0 ; j < keydef[i].keysegs; j++) { length+=keydef[i].seg[j].length; - if (keydef[i].seg[j].null_bit && - !(keydef[i].flag & HA_NULL_ARE_EQUAL)) - keydef[i].flag |= HA_NULL_PART_KEY; - if (keydef[i].algorithm == HA_KEY_ALG_BTREE && - keydef[i].seg[j].null_bit) - keydef[i].rb_tree.size_of_element++; + if (keydef[i].seg[j].null_bit) + { + if (!(keydef[i].flag & HA_NULL_ARE_EQUAL)) + keydef[i].flag |= HA_NULL_PART_KEY; + if (keydef[i].algorithm == HA_KEY_ALG_BTREE) + keydef[i].rb_tree.size_of_element++; + } } - keydef[i].length= length; - keydef[i].ref_offs= length + keydef[i].rb_tree.size_of_element - - sizeof(byte*); - if (length + keydef[i].rb_tree.size_of_element > max_length) - max_length= length + keydef[i].rb_tree.size_of_element; + keydef[i].length= length; + length+= keydef[i].rb_tree.size_of_element + + ((keydef[i].algorithm == HA_KEY_ALG_BTREE) ? sizeof(byte*) : 0); + if (length > max_length) + max_length= length; } - if (!(share = (HP_SHARE*) my_malloc((uint) sizeof(HP_SHARE)+ + if (!(share= (HP_SHARE*) my_malloc((uint) sizeof(HP_SHARE)+ keys*sizeof(HP_KEYDEF)+ key_segs*sizeof(HA_KEYSEG), MYF(MY_ZEROFILL)))) @@ -78,44 +81,46 @@ HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef, pthread_mutex_unlock(&THR_LOCK_heap); DBUG_RETURN(0); } - share->keydef=(HP_KEYDEF*) (share+1); - keyseg=(HA_KEYSEG*) (share->keydef+keys); - init_block(&share->block,reclength+1,min_records,max_records); + share->keydef= (HP_KEYDEF*) (share + 1); + keyseg= (HA_KEYSEG*) (share->keydef + keys); + init_block(&share->block, reclength + 1, min_records, max_records); /* Fix keys */ - memcpy(share->keydef,keydef,(size_t) (sizeof(keydef[0])*keys)); - for (i=0 ; i < keys ; i++) + memcpy(share->keydef, keydef, (size_t) (sizeof(keydef[0]) * keys)); + for (i= 0; i < keys; i++) { - HP_KEYDEF *keyinfo = share->keydef + i; - keyinfo->seg = keyseg; - memcpy(keyseg, keydef[i].seg, - (size_t) (sizeof(keyseg[0]) * keydef[i].keysegs)); - keyseg += keydef[i].keysegs; + HP_KEYDEF *keyinfo= share->keydef + i; + uint nsegs= keydef[i].keysegs; + if (keydef[i].algorithm == HA_KEY_ALG_BTREE) { - init_tree(&keyinfo->rb_tree, 0, 0, keydef[i].length + - keydef[i].rb_tree.size_of_element, - (qsort_cmp2)keys_compare, 1, NULL, NULL); - keyinfo->delete_key = hp_rb_delete_key; - keyinfo->write_key = hp_rb_write_key; + init_tree(&keyinfo->rb_tree, 0, 0, 0, (qsort_cmp2)keys_compare, 1, + NULL, NULL); + keyinfo->delete_key= hp_rb_delete_key; + keyinfo->write_key= hp_rb_write_key; + nsegs++; } else { init_block(&keyinfo->block, sizeof(HASH_INFO), min_records, max_records); - keyinfo->delete_key = hp_delete_key; - keyinfo->write_key = hp_write_key; + keyinfo->delete_key= hp_delete_key; + keyinfo->write_key= hp_write_key; } + keyinfo->seg= keyseg; + memcpy(keyseg, keydef[i].seg, + (size_t) (sizeof(keyseg[0]) * nsegs)); + keyseg+= nsegs; } - share->min_records=min_records; - share->max_records=max_records; - share->data_length=share->index_length=0; - share->reclength=reclength; - share->blength=1; - share->keys=keys; - share->max_key_length=max_length; - share->changed=0; - if (!(share->name=my_strdup(name,MYF(0)))) + share->min_records= min_records; + share->max_records= max_records; + share->data_length= share->index_length= 0; + share->reclength= reclength; + share->blength= 1; + share->keys= keys; + share->max_key_length= max_length; + share->changed= 0; + if (!(share->name= my_strdup(name,MYF(0)))) { my_free((gptr) share,MYF(0)); pthread_mutex_unlock(&THR_LOCK_heap); @@ -125,8 +130,8 @@ HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef, thr_lock_init(&share->lock); VOID(pthread_mutex_init(&share->intern_lock,MY_MUTEX_INIT_FAST)); #endif - share->open_list.data=(void*) share; - heap_share_list=list_add(heap_share_list,&share->open_list); + share->open_list.data= (void*) share; + heap_share_list= list_add(heap_share_list,&share->open_list); } if (!(info= (HP_INFO*) my_malloc((uint) sizeof(HP_INFO)+ 2 * share->max_key_length, @@ -139,21 +144,21 @@ HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef, #ifdef THREAD thr_lock_data_init(&share->lock,&info->lock,NULL); #endif - info->open_list.data=(void*) info; - heap_open_list=list_add(heap_open_list,&info->open_list); + info->open_list.data= (void*) info; + heap_open_list= list_add(heap_open_list,&info->open_list); pthread_mutex_unlock(&THR_LOCK_heap); - info->s=share; - info->lastkey=(byte*) (info+1); - info->recbuf = (byte*) (info->lastkey + share->max_key_length); - info->mode=mode; + info->s= share; + info->lastkey= (byte*) (info + 1); + info->recbuf= (byte*) (info->lastkey + share->max_key_length); + info->mode= mode; info->current_record= (ulong) ~0L; /* No current record */ - info->current_ptr=0; - info->current_hash_ptr=0; - info->lastinx= info->errkey= -1; - info->update=0; + info->current_ptr= 0; + info->current_hash_ptr= 0; + info->lastinx= info->errkey= -1; + info->update= 0; #ifndef DBUG_OFF - info->opt_flag=READ_CHECK_USED; /* Check when changing */ + info->opt_flag= READ_CHECK_USED; /* Check when changing */ #endif DBUG_PRINT("exit",("heap: %lx reclength: %d records_in_block: %d", info,share->reclength,share->block.records_in_block)); diff --git a/heap/hp_rfirst.c b/heap/hp_rfirst.c index 390d18fc58f..654874d5c8d 100644 --- a/heap/hp_rfirst.c +++ b/heap/hp_rfirst.c @@ -31,7 +31,7 @@ int heap_rfirst(HP_INFO *info, byte *record, int inx) if ((pos = tree_search_edge(&keyinfo->rb_tree, info->parents, &info->last_pos, offsetof(TREE_ELEMENT, left)))) { - memcpy(&pos, pos + keyinfo->ref_offs, sizeof(byte*)); + memcpy(&pos, pos + hp_rb_key_length(keyinfo, pos), sizeof(byte*)); info->current_ptr = pos; memcpy(record, pos, (size_t)share->reclength); info->update = HA_STATE_AKTIV; diff --git a/heap/hp_rkey.c b/heap/hp_rkey.c index 649370cf0b0..502e97e2f06 100644 --- a/heap/hp_rkey.c +++ b/heap/hp_rkey.c @@ -55,7 +55,7 @@ int heap_rkey(HP_INFO *info, byte *record, int inx, const byte *key, info->update = 0; DBUG_RETURN(my_errno = HA_ERR_KEY_NOT_FOUND); } - memcpy(&pos, pos + keyinfo->ref_offs, sizeof(byte*)); + memcpy(&pos, pos + hp_rb_key_length(keyinfo, pos), sizeof(byte*)); info->current_ptr = pos; } else diff --git a/heap/hp_rlast.c b/heap/hp_rlast.c index 4c2379427b0..6832b6e2428 100644 --- a/heap/hp_rlast.c +++ b/heap/hp_rlast.c @@ -32,7 +32,7 @@ int heap_rlast(HP_INFO *info, byte *record, int inx) if ((pos = tree_search_edge(&keyinfo->rb_tree, info->parents, &info->last_pos, offsetof(TREE_ELEMENT, right)))) { - memcpy(&pos, pos + keyinfo->ref_offs, sizeof(byte*)); + memcpy(&pos, pos + hp_rb_key_length(keyinfo, pos), sizeof(byte*)); info->current_ptr = pos; memcpy(record, pos, (size_t)share->reclength); info->update = HA_STATE_AKTIV; diff --git a/heap/hp_rnext.c b/heap/hp_rnext.c index 12ce354335d..c01ca52d5ae 100644 --- a/heap/hp_rnext.c +++ b/heap/hp_rnext.c @@ -47,7 +47,7 @@ int heap_rnext(HP_INFO *info, byte *record) } if (pos) { - memcpy(&pos, pos + keyinfo->ref_offs, sizeof(byte*)); + memcpy(&pos, pos + hp_rb_key_length(keyinfo, pos), sizeof(byte*)); info->current_ptr = pos; } else diff --git a/heap/hp_rprev.c b/heap/hp_rprev.c index 98f7a02d55b..071746fa3de 100644 --- a/heap/hp_rprev.c +++ b/heap/hp_rprev.c @@ -47,7 +47,7 @@ int heap_rprev(HP_INFO *info, byte *record) } if (pos) { - memcpy(&pos, pos + keyinfo->ref_offs, sizeof(byte*)); + memcpy(&pos, pos + hp_rb_key_length(keyinfo, pos), sizeof(byte*)); info->current_ptr = pos; } else diff --git a/heap/hp_write.c b/heap/hp_write.c index 801505216bd..fcfe922d9c0 100644 --- a/heap/hp_write.c +++ b/heap/hp_write.c @@ -93,25 +93,25 @@ int hp_rb_write_key(HP_INFO *info, HP_KEYDEF *keyinfo, const byte *record, { heap_rb_param custom_arg; - info->last_pos = NULL; /* For heap_rnext/heap_rprev */ - hp_rb_make_key(keyinfo, info->recbuf, record, recpos); - custom_arg.keyseg = keyinfo->seg; - custom_arg.key_length = keyinfo->length; + info->last_pos= NULL; /* For heap_rnext/heap_rprev */ + custom_arg.keyseg= keyinfo->seg; + custom_arg.key_length= hp_rb_make_key(keyinfo, info->recbuf, record, recpos); if ((keyinfo->flag & HA_NOSAME) && (!(keyinfo->flag & HA_NULL_PART_KEY) || !hp_if_null_in_key(keyinfo, record))) { - custom_arg.search_flag = SEARCH_FIND | SEARCH_SAME; + custom_arg.search_flag= SEARCH_FIND | SEARCH_SAME; if (tree_search_key(&keyinfo->rb_tree, info->recbuf, info->parents, &info->last_pos, 0, &custom_arg)) { - my_errno = HA_ERR_FOUND_DUPP_KEY; + my_errno= HA_ERR_FOUND_DUPP_KEY; return 1; } } - custom_arg.search_flag = SEARCH_SAME; - return tree_insert(&keyinfo->rb_tree, (void*)info->recbuf, keyinfo->length + - sizeof(byte*), &custom_arg) ? 0 : 1; + custom_arg.search_flag= SEARCH_SAME; + return tree_insert(&keyinfo->rb_tree, (void*)info->recbuf, + custom_arg.key_length + sizeof(byte*), + &custom_arg) ? 0 : 1; } /* Find where to place new record */ diff --git a/include/heap.h b/include/heap.h index 8cc62df9250..ef72524c03c 100644 --- a/include/heap.h +++ b/include/heap.h @@ -84,7 +84,6 @@ typedef struct st_hp_keydef /* Key definition with open */ uint keysegs; /* Number of key-segment */ uint length; /* Length of key (automatic) */ uint8 algorithm; /* HASH / BTREE */ - uint ref_offs; /* Data reference offset */ HA_KEYSEG *seg; HP_BLOCK block; /* Where keys are saved */ TREE rb_tree; @@ -131,7 +130,7 @@ typedef struct st_heap_info byte *lastkey; /* Last used key with rkey */ byte *recbuf; /* Record buffer for rb-tree keys */ enum ha_rkey_function last_find_flag; - TREE_ELEMENT *parents[MAX_TREE_HIGHT+1]; + TREE_ELEMENT *parents[MAX_TREE_HEIGHT+1]; TREE_ELEMENT **last_pos; uint lastkey_len; #ifdef THREAD diff --git a/include/my_handler.h b/include/my_handler.h index 0fa30f580b6..629a0974d93 100644 --- a/include/my_handler.h +++ b/include/my_handler.h @@ -50,14 +50,10 @@ typedef struct st_HA_KEYSEG /* Key-portion */ { length=mi_uint2korr((key)+1); (key)+=3; length_pack=3; } \ } -extern int _mi_compare_text(CHARSET_INFO *, uchar *, uint, uchar *, uint , - my_bool); +extern int mi_compare_text(CHARSET_INFO *, uchar *, uint, uchar *, uint , + my_bool); extern int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, - register uchar *b, uint key_length, uint nextflag, - uint *diff_pos); - -extern int hp_rb_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, - register uchar *b, uint key_length, uint nextflag, - uint *diff_pos); + register uchar *b, uint key_length, uint nextflag, + uint *diff_pos); #endif /* _my_handler_h */ diff --git a/include/my_tree.h b/include/my_tree.h index 265bf69b1e7..826c2b7c808 100644 --- a/include/my_tree.h +++ b/include/my_tree.h @@ -20,7 +20,7 @@ extern "C" { #endif -#define MAX_TREE_HIGHT 40 /* = max 1048576 leafs in tree */ +#define MAX_TREE_HEIGHT 40 /* = max 1048576 leafs in tree */ #define ELEMENT_KEY(tree,element)\ (tree->offset_to_key ? (void*)((byte*) element+tree->offset_to_key) :\ *((void**) (element+1))) @@ -52,7 +52,7 @@ typedef struct st_tree_element { typedef struct st_tree { TREE_ELEMENT *root,null_element; - TREE_ELEMENT **parents[MAX_TREE_HIGHT]; + TREE_ELEMENT **parents[MAX_TREE_HEIGHT]; uint offset_to_key,elements_in_tree,size_of_element,memory_limit,allocated; qsort_cmp2 compare; void* custom_arg; diff --git a/myisam/ft_boolean_search.c b/myisam/ft_boolean_search.c index 9b51601be40..0c5efcb50df 100644 --- a/myisam/ft_boolean_search.c +++ b/myisam/ft_boolean_search.c @@ -104,7 +104,7 @@ int FTB_WORD_cmp(void *v __attribute__((unused)), FTB_WORD *a, FTB_WORD *b) int FTB_WORD_cmp_list(void *v __attribute__((unused)), FTB_WORD **a, FTB_WORD **b) { /* ORDER BY word DESC, ndepth DESC */ - int i=_mi_compare_text(default_charset_info, (*b)->word+1,(*b)->len-1, + int i= mi_compare_text(default_charset_info, (*b)->word+1,(*b)->len-1, (*a)->word+1,(*a)->len-1,0); if (!i) i=CMP_NUM((*b)->ndepth,(*a)->ndepth); @@ -203,7 +203,7 @@ void _ftb_init_index_search(FT_INFO *ftb) SEARCH_FIND | SEARCH_BIGGER, keyroot); if (!r) { - r=_mi_compare_text(default_charset_info, + r= mi_compare_text(default_charset_info, info->lastkey + (ftbw->flags&FTB_FLAG_TRUNC), ftbw->len - (ftbw->flags&FTB_FLAG_TRUNC), ftbw->word + (ftbw->flags&FTB_FLAG_TRUNC), @@ -359,7 +359,7 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record) SEARCH_BIGGER , keyroot); if (!r) { - r=_mi_compare_text(default_charset_info, + r= mi_compare_text(default_charset_info, info->lastkey + (ftbw->flags&FTB_FLAG_TRUNC), ftbw->len - (ftbw->flags&FTB_FLAG_TRUNC), ftbw->word + (ftbw->flags&FTB_FLAG_TRUNC), @@ -443,7 +443,7 @@ float ft_boolean_find_relevance(FT_INFO *ftb, byte *record, uint length) for (a=0, b=ftb->queue.elements, c=(a+b)/2; b-a>1; c=(a+b)/2) { ftbw=(FTB_WORD *)(ftb->list[c]); - if (_mi_compare_text(default_charset_info, word.pos,word.len, + if (mi_compare_text(default_charset_info, word.pos,word.len, (uchar*) ftbw->word+1,ftbw->len-1, (ftbw->flags&FTB_FLAG_TRUNC) ) >0) b=c; @@ -453,7 +453,7 @@ float ft_boolean_find_relevance(FT_INFO *ftb, byte *record, uint length) for (; c>=0; c--) { ftbw=(FTB_WORD *)(ftb->list[c]); - if (_mi_compare_text(default_charset_info, word.pos,word.len, + if (mi_compare_text(default_charset_info, word.pos,word.len, (uchar*) ftbw->word+1,ftbw->len-1, (ftbw->flags&FTB_FLAG_TRUNC) )) break; diff --git a/myisam/ft_nlq_search.c b/myisam/ft_nlq_search.c index 635d6239359..5b12c4d4571 100644 --- a/myisam/ft_nlq_search.c +++ b/myisam/ft_nlq_search.c @@ -93,9 +93,9 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio) while(!r) { - if (_mi_compare_text(default_charset_info, - aio->info->lastkey,keylen, - aio->keybuff,keylen,0)) break; + if (mi_compare_text(default_charset_info, + aio->info->lastkey,keylen, + aio->keybuff,keylen,0)) break; #if HA_FT_WTYPE == HA_KEYTYPE_FLOAT #ifdef EVAL_RUN diff --git a/myisam/ft_parser.c b/myisam/ft_parser.c index c514a923b63..93c574841f7 100644 --- a/myisam/ft_parser.c +++ b/myisam/ft_parser.c @@ -37,10 +37,10 @@ typedef struct st_ft_docstat { static int FT_WORD_cmp(void* cmp_arg, FT_WORD *w1, FT_WORD *w2) { - return _mi_compare_text(default_charset_info, - (uchar*) w1->pos, w1->len, - (uchar*) w2->pos, w2->len, - (my_bool) (cmp_arg != 0)); + return mi_compare_text(default_charset_info, + (uchar*) w1->pos, w1->len, + (uchar*) w2->pos, w2->len, + (my_bool) (cmp_arg != 0)); } static int walk_and_copy(FT_WORD *word,uint32 count,FT_DOCSTAT *docstat) diff --git a/myisam/ft_stopwords.c b/myisam/ft_stopwords.c index 0e4112bb29a..170442c71de 100644 --- a/myisam/ft_stopwords.c +++ b/myisam/ft_stopwords.c @@ -28,9 +28,9 @@ static TREE *stopwords3=NULL; static int FT_STOPWORD_cmp(void* cmp_arg __attribute__((unused)), FT_STOPWORD *w1, FT_STOPWORD *w2) { - return _mi_compare_text(default_charset_info, - (uchar *)w1->pos,w1->len, - (uchar *)w2->pos,w2->len,0); + return mi_compare_text(default_charset_info, + (uchar *)w1->pos,w1->len, + (uchar *)w2->pos,w2->len,0); } int ft_init_stopwords(const char **sws) diff --git a/myisam/ft_update.c b/myisam/ft_update.c index 8ffc35157d2..04b6becde86 100644 --- a/myisam/ft_update.c +++ b/myisam/ft_update.c @@ -160,7 +160,7 @@ int _mi_ft_cmp(MI_INFO *info, uint keynr, const byte *rec1, const byte *rec2) { if ((ftsi1.pos != ftsi2.pos) && (!ftsi1.pos || !ftsi2.pos || - _mi_compare_text(default_charset_info, + mi_compare_text(default_charset_info, (uchar*) ftsi1.pos,ftsi1.len, (uchar*) ftsi2.pos,ftsi2.len,0))) return THOSE_TWO_DAMN_KEYS_ARE_REALLY_DIFFERENT; @@ -185,7 +185,7 @@ int _mi_ft_update(MI_INFO *info, uint keynr, byte *keybuf, error=0; while(old_word->pos && new_word->pos) { - cmp=_mi_compare_text(default_charset_info, + cmp= mi_compare_text(default_charset_info, (uchar*) old_word->pos,old_word->len, (uchar*) new_word->pos,new_word->len,0); cmp2= cmp ? 0 : (fabs(old_word->weight - new_word->weight) > 1.e-5); diff --git a/mysys/my_handler.c b/mysys/my_handler.c index 5544c7cc483..7d73dbb1531 100644 --- a/mysys/my_handler.c +++ b/mysys/my_handler.c @@ -17,8 +17,8 @@ #include "my_handler.h" -int _mi_compare_text(CHARSET_INFO *charset_info, uchar *a, uint a_length, - uchar *b, uint b_length, my_bool part_key) +int mi_compare_text(CHARSET_INFO *charset_info, uchar *a, uint a_length, + uchar *b, uint b_length, my_bool part_key) { int flag; @@ -115,7 +115,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, get_key_pack_length(b_length,pack_length,b); next_key_length=key_length-b_length-pack_length; - if ((flag=_mi_compare_text(keyseg->charset,a,a_length,b,b_length, + if ((flag= mi_compare_text(keyseg->charset,a,a_length,b,b_length, (my_bool) ((nextflag & SEARCH_PREFIX) && next_key_length <= 0)))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); @@ -133,7 +133,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, while (b_length && b[b_length-1] == ' ') b_length--; } - if ((flag=_mi_compare_text(keyseg->charset,a,a_length,b,b_length, + if ((flag= mi_compare_text(keyseg->charset,a,a_length,b,b_length, (my_bool) ((nextflag & SEARCH_PREFIX) && next_key_length <= 0)))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); @@ -175,7 +175,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, get_key_pack_length(b_length,pack_length,b); next_key_length=key_length-b_length-pack_length; - if ((flag=_mi_compare_text(keyseg->charset,a,a_length,b,b_length, + if ((flag= mi_compare_text(keyseg->charset,a,a_length,b,b_length, (my_bool) ((nextflag & SEARCH_PREFIX) && next_key_length <= 0)))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); @@ -385,333 +385,4 @@ end: return (flag < 0 ? -1 : 1); /* read previous */ } return 0; -} /* my_key_cmp */ - -/* -Compare two keys -Returns <0, 0, >0 acording to which is bigger -Key_length specifies length of key to use. Number-keys can't be splited -If flag <> SEARCH_FIND compare also position -*/ -int hp_rb_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, - register uchar *b, uint key_length, uint nextflag, - uint *diff_pos) -{ - int flag; - int16 s_1,s_2; - int32 l_1,l_2; - uint32 u_1,u_2; - float f_1,f_2; - double d_1,d_2; - uint next_key_length; - - *diff_pos=0; - for ( ; (int) key_length >0 ; key_length=next_key_length, keyseg++) - { - uchar *end; - (*diff_pos)++; - - /* Handle NULL part */ - if (keyseg->null_bit) - { - key_length--; - if (*a != *b) - { - flag = (int) *a - (int) *b; - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - } - b++; - if (!*a++) /* If key was NULL */ - { - if (nextflag == (SEARCH_FIND | SEARCH_UPDATE)) - nextflag=SEARCH_SAME; /* Allow duplicate keys */ - next_key_length=key_length; - a+= keyseg->length; - b+= keyseg->length; - key_length-= keyseg->length; - continue; /* To next key part */ - } - } - end= a+ min(keyseg->length,key_length); - next_key_length=key_length-keyseg->length; - - switch ((enum ha_base_keytype) keyseg->type) { - case HA_KEYTYPE_TEXT: /* Ascii; Key is converted */ - if (keyseg->flag & HA_SPACE_PACK) - { - int a_length,b_length,pack_length; - get_key_length(a_length,a); - get_key_pack_length(b_length,pack_length,b); - next_key_length=key_length-b_length-pack_length; - - if ((flag=_mi_compare_text(keyseg->charset,a,a_length,b,b_length, - (my_bool) ((nextflag & SEARCH_PREFIX) && - next_key_length <= 0)))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a+=a_length; - b+=b_length; - break; - } - else - { - uint length=(uint) (end-a), a_length=length, b_length=length; - if (!(nextflag & SEARCH_PREFIX)) - { - while (a_length && a[a_length-1] == ' ') - a_length--; - while (b_length && b[b_length-1] == ' ') - b_length--; - } - if ((flag=_mi_compare_text(keyseg->charset,a,a_length,b,b_length, - (my_bool) ((nextflag & SEARCH_PREFIX) && - next_key_length <= 0)))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a=end; - b+=length; - } - break; - case HA_KEYTYPE_BINARY: - if (keyseg->flag & HA_SPACE_PACK) - { - int a_length,b_length,pack_length; - get_key_length(a_length,a); - get_key_pack_length(b_length,pack_length,b); - next_key_length=key_length-b_length-pack_length; - - if ((flag=compare_bin(a,a_length,b,b_length, - (my_bool) ((nextflag & SEARCH_PREFIX) && - next_key_length <= 0)))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a+=a_length; - b+=b_length; - break; - } - else - { - uint length=keyseg->length; - if ((flag=compare_bin(a,length,b,length, - (my_bool) ((nextflag & SEARCH_PREFIX) && - next_key_length <= 0)))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a+=length; - b+=length; - } - break; - case HA_KEYTYPE_VARTEXT: - { - int a_length,b_length,pack_length; - get_key_length(a_length,a); - get_key_pack_length(b_length,pack_length,b); - next_key_length=key_length-b_length-pack_length; - - if ((flag=_mi_compare_text(keyseg->charset,a,a_length,b,b_length, - (my_bool) ((nextflag & SEARCH_PREFIX) && - next_key_length <= 0)))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a+=a_length; - b+=b_length; - break; - } - break; - case HA_KEYTYPE_VARBINARY: - { - int a_length,b_length,pack_length; - get_key_length(a_length,a); - get_key_pack_length(b_length,pack_length,b); - next_key_length=key_length-b_length-pack_length; - - if ((flag=compare_bin(a,a_length,b,b_length, - (my_bool) ((nextflag & SEARCH_PREFIX) && - next_key_length <= 0)))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a+=a_length; - b+=b_length; - break; - } - break; - case HA_KEYTYPE_INT8: - { - int i_1= (int) *((signed char*) a); - int i_2= (int) *((signed char*) b); - if ((flag = CMP(i_1,i_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b++; - break; - } - case HA_KEYTYPE_SHORT_INT: - s_1= mi_sint2korr(a); - s_2= mi_sint2korr(b); - if ((flag = CMP(s_1,s_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 2; /* sizeof(short int); */ - break; - case HA_KEYTYPE_USHORT_INT: - { - uint16 us_1,us_2; - us_1= mi_sint2korr(a); - us_2= mi_sint2korr(b); - if ((flag = CMP(us_1,us_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+=2; /* sizeof(short int); */ - break; - } - case HA_KEYTYPE_LONG_INT: - l_1= mi_sint4korr(a); - l_2= mi_sint4korr(b); - if ((flag = CMP(l_1,l_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 4; /* sizeof(long int); */ - break; - case HA_KEYTYPE_ULONG_INT: - u_1= mi_sint4korr(a); - u_2= mi_sint4korr(b); - if ((flag = CMP(u_1,u_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 4; /* sizeof(long int); */ - break; - case HA_KEYTYPE_INT24: - l_1=mi_sint3korr(a); - l_2=mi_sint3korr(b); - if ((flag = CMP(l_1,l_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 3; - break; - case HA_KEYTYPE_UINT24: - l_1=mi_uint3korr(a); - l_2=mi_uint3korr(b); - if ((flag = CMP(l_1,l_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 3; - break; - case HA_KEYTYPE_FLOAT: - mi_float4get(f_1,a); - mi_float4get(f_2,b); - if ((flag = CMP(f_1,f_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 4; /* sizeof(float); */ - break; - case HA_KEYTYPE_DOUBLE: - mi_float8get(d_1,a); - mi_float8get(d_2,b); - if ((flag = CMP(d_1,d_2))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 8; /* sizeof(double); */ - break; - case HA_KEYTYPE_NUM: /* Numeric key */ - { - int swap_flag= 0; - int alength,blength; - - if (keyseg->flag & HA_REVERSE_SORT) - { - swap(uchar*,a,b); - swap_flag=1; /* Remember swap of a & b */ - end= a+ (int) (end-b); - } - if (keyseg->flag & HA_SPACE_PACK) - { - alength= *a++; blength= *b++; - end=a+alength; - next_key_length=key_length-blength-1; - } - else - { - alength= (int) (end-a); - blength=keyseg->length; - /* remove pre space from keys */ - for ( ; alength && *a == ' ' ; a++, alength--) ; - for ( ; blength && *b == ' ' ; b++, blength--) ; - } - - if (*a == '-') - { - if (*b != '-') - return -1; - a++; b++; - swap(uchar*,a,b); - swap(int,alength,blength); - swap_flag=1-swap_flag; - alength--; blength--; - end=a+alength; - } - else if (*b == '-') - return 1; - while (alength && (*a == '+' || *a == '0')) - { - a++; alength--; - } - while (blength && (*b == '+' || *b == '0')) - { - b++; blength--; - } - if (alength != blength) - return (alength < blength) ? -1 : 1; - while (a < end) - if (*a++ != *b++) - return ((int) a[-1] - (int) b[-1]); - - if (swap_flag) /* Restore pointers */ - swap(uchar*,a,b); - break; - } -#ifdef HAVE_LONG_LONG - case HA_KEYTYPE_LONGLONG: - { - longlong ll_a,ll_b; - ll_a= mi_sint8korr(a); - ll_b= mi_sint8korr(b); - if ((flag = CMP(ll_a,ll_b))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 8; - break; - } - case HA_KEYTYPE_ULONGLONG: - { - ulonglong ll_a,ll_b; - ll_a= mi_uint8korr(a); - ll_b= mi_uint8korr(b); - if ((flag = CMP(ll_a,ll_b))) - return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); - a= end; - b+= 8; - break; - } -#endif - case HA_KEYTYPE_END: /* Ready */ - goto end; /* diff_pos is incremented */ - } - } - (*diff_pos)++; -end: - if (!(nextflag & SEARCH_FIND)) - { - uint i; - if (nextflag & (SEARCH_NO_FIND | SEARCH_LAST)) /* Find record after key */ - return (nextflag & (SEARCH_BIGGER | SEARCH_LAST)) ? -1 : 1; - flag=0; - for (i=keyseg->length ; i-- > 0 ; ) - { - if (*a++ != *b++) - { - flag= FCMP(a[-1],b[-1]); - break; - } - } - if (nextflag & SEARCH_SAME) - return (flag); /* read same */ - if (nextflag & SEARCH_BIGGER) - return (flag <= 0 ? -1 : 1); /* read next */ - return (flag < 0 ? -1 : 1); /* read previous */ - } - return 0; -} /* my_key_cmp */ +} /* ha_key_cmp */ diff --git a/mysys/tree.c b/mysys/tree.c index 632660344b5..1bd49ef5182 100644 --- a/mysys/tree.c +++ b/mysys/tree.c @@ -380,17 +380,17 @@ void *tree_search_key(TREE *tree, const void *key, Search first (the most left) or last (the most right) tree element */ void *tree_search_edge(TREE *tree, TREE_ELEMENT **parents, - TREE_ELEMENT ***last_pos, int child_offs) + TREE_ELEMENT ***last_pos, int child_offs) { - TREE_ELEMENT *element = tree->root; + TREE_ELEMENT *element= tree->root; - *parents = &tree->null_element; + *parents= &tree->null_element; while (element != &tree->null_element) { - *++parents = element; - element = ELEMENT_CHILD(element, child_offs); + *++parents= element; + element= ELEMENT_CHILD(element, child_offs); } - *last_pos = parents; + *last_pos= parents; return **last_pos != &tree->null_element ? ELEMENT_KEY(tree, **last_pos) : NULL; } @@ -398,26 +398,26 @@ void *tree_search_edge(TREE *tree, TREE_ELEMENT **parents, void *tree_search_next(TREE *tree, TREE_ELEMENT ***last_pos, int l_offs, int r_offs) { - TREE_ELEMENT *x = **last_pos; + TREE_ELEMENT *x= **last_pos; if (ELEMENT_CHILD(x, r_offs) != &tree->null_element) { - x = ELEMENT_CHILD(x, r_offs); - *++*last_pos = x; + x= ELEMENT_CHILD(x, r_offs); + *++*last_pos= x; while (ELEMENT_CHILD(x, l_offs) != &tree->null_element) { - x = ELEMENT_CHILD(x, l_offs); - *++*last_pos = x; + x= ELEMENT_CHILD(x, l_offs); + *++*last_pos= x; } return ELEMENT_KEY(tree, x); } else { - TREE_ELEMENT *y = *--*last_pos; + TREE_ELEMENT *y= *--*last_pos; while (y != &tree->null_element && x == ELEMENT_CHILD(y, r_offs)) { - x = y; - y = *--*last_pos; + x= y; + y= *--*last_pos; } return y == &tree->null_element ? NULL : ELEMENT_KEY(tree, y); } @@ -431,28 +431,26 @@ uint tree_record_pos(TREE *tree, const void *key, enum ha_rkey_function flag, void *custom_arg) { int cmp; - TREE_ELEMENT *element = tree->root; - uint left = 1; - uint right = tree->elements_in_tree; - uint last_left_step_pos = tree->elements_in_tree; - uint last_right_step_pos = 1; - uint last_equal_pos = HA_POS_ERROR; + TREE_ELEMENT *element= tree->root; + double left= 1; + double right= tree->elements_in_tree; + uint last_equal_pos= HA_POS_ERROR; while (element != &tree->null_element) { - if ((cmp = (*tree->compare)(custom_arg, ELEMENT_KEY(tree, element), - key)) == 0) + if ((cmp= (*tree->compare)(custom_arg, ELEMENT_KEY(tree, element), + key)) == 0) { switch (flag) { case HA_READ_KEY_EXACT: - last_equal_pos = (left + right) >> 1; - cmp = 1; + last_equal_pos= (left + right) / 2; + cmp= 1; break; case HA_READ_BEFORE_KEY: - cmp = 1; + cmp= 1; break; case HA_READ_AFTER_KEY: - cmp = -1; + cmp= -1; break; default: return HA_POS_ERROR; @@ -460,24 +458,22 @@ uint tree_record_pos(TREE *tree, const void *key, } if (cmp < 0) /* element < key */ { - last_right_step_pos = (left + right) >> 1; - element = element->right; - left = last_right_step_pos; + element= element->right; + left= (left + right) / 2; } else { - last_left_step_pos = (left + right) >> 1; - element = element->left; - right = last_left_step_pos; + element= element->left; + right= (left + right) / 2; } } switch (flag) { case HA_READ_KEY_EXACT: return last_equal_pos; case HA_READ_BEFORE_KEY: - return last_right_step_pos; + return (uint) right; case HA_READ_AFTER_KEY: - return last_left_step_pos; + return (uint) left; default: return HA_POS_ERROR; } diff --git a/sql/ha_heap.cc b/sql/ha_heap.cc index e18bc877540..70409be4e42 100644 --- a/sql/ha_heap.cc +++ b/sql/ha_heap.cc @@ -42,9 +42,7 @@ int ha_heap::open(const char *name, int mode, uint test_if_locked) { parts+=table->key_info[key].key_parts; if (table->key_info[key].algorithm == HA_KEY_ALG_BTREE) - { parts++; /* additional HA_KEYTYPE_END keyseg */ - } } if (!(keydef=(HP_KEYDEF*) my_malloc(table->keys*sizeof(HP_KEYDEF)+ @@ -55,7 +53,7 @@ int ha_heap::open(const char *name, int mode, uint test_if_locked) { KEY *pos=table->key_info+key; KEY_PART_INFO *key_part= pos->key_part; - KEY_PART_INFO *key_part_end= key_part+pos->key_parts; + KEY_PART_INFO *key_part_end= key_part + pos->key_parts; mem_per_row+= (pos->key_length + (sizeof(char*) * 2)); @@ -94,14 +92,13 @@ int ha_heap::open(const char *name, int mode, uint test_if_locked) } else { - seg->null_bit=0; - seg->null_pos=0; + seg->null_bit= 0; + seg->null_pos= 0; } } if (pos->algorithm == HA_KEY_ALG_BTREE) { /* additional HA_KEYTYPE_END keyseg */ - keydef[key].keysegs++; seg->type= HA_KEYTYPE_END; seg->length= sizeof(byte*); seg->flag= 0; -- cgit v1.2.1 From a8652e9957e014c19b47635e09147a7bc17a3b8c Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 22 May 2002 18:51:21 +0300 Subject: Fixed problem in fulltest testcase include/my_base.h: Fix to ensure that old tables works in 4.1 myisam/mi_open.c: cleanup mysys/my_handler.c: Fixed problem in fulltest testcase sql/spatial.cc: cleanup sql/sql_table.cc: cleanup --- include/my_base.h | 6 +-- myisam/mi_open.c | 4 +- mysys/my_handler.c | 109 ++++++++++++++++++++++++++++++----------------------- sql/spatial.cc | 14 +++++-- sql/sql_table.cc | 20 +++++----- 5 files changed, 89 insertions(+), 64 deletions(-) diff --git a/include/my_base.h b/include/my_base.h index bb589fa59cc..22bc3355cd5 100644 --- a/include/my_base.h +++ b/include/my_base.h @@ -147,11 +147,11 @@ enum ha_base_keytype { #define HA_NOSAME 1 /* Set if not dupplicated records */ #define HA_PACK_KEY 2 /* Pack string key to previous key */ -#define HA_AUTO_KEY 1024 +#define HA_AUTO_KEY 16 #define HA_BINARY_PACK_KEY 32 /* Packing of all keys to prev key */ -#define HA_FULLTEXT 128 /* SerG: for full-text search */ +#define HA_FULLTEXT 128 /* For full-text search */ #define HA_UNIQUE_CHECK 256 /* Check the key for uniqueness */ -#define HA_SPATIAL 16 /* Alex Barkov: for spatial search */ +#define HA_SPATIAL 1024 /* For spatial search */ #define HA_NULL_ARE_EQUAL 2048 /* NULL in key are cmp as equal */ diff --git a/myisam/mi_open.c b/myisam/mi_open.c index d2960c6751c..458d2d53dfc 100644 --- a/myisam/mi_open.c +++ b/myisam/mi_open.c @@ -920,7 +920,7 @@ uint mi_keydef_write(File file, MI_KEYDEF *keydef) uchar *ptr=buff; *ptr++ = (uchar) keydef->keysegs; - *ptr++ = keydef->key_alg; /* +BAR Rtree or Btree */ + *ptr++ = keydef->key_alg; /* Rtree or Btree */ mi_int2store(ptr,keydef->flag); ptr +=2; mi_int2store(ptr,keydef->block_length); ptr +=2; mi_int2store(ptr,keydef->keylength); ptr +=2; @@ -932,7 +932,7 @@ uint mi_keydef_write(File file, MI_KEYDEF *keydef) char *mi_keydef_read(char *ptr, MI_KEYDEF *keydef) { keydef->keysegs = (uint) *ptr++; - keydef->key_alg = *ptr++; /* +BAR Rtree or Btree */ + keydef->key_alg = *ptr++; /* Rtree or Btree */ keydef->flag = mi_uint2korr(ptr); ptr +=2; keydef->block_length = mi_uint2korr(ptr); ptr +=2; diff --git a/mysys/my_handler.c b/mysys/my_handler.c index 7d73dbb1531..1e7d8a702d2 100644 --- a/mysys/my_handler.c +++ b/mysys/my_handler.c @@ -58,18 +58,18 @@ static int compare_bin(uchar *a, uint a_length, uchar *b, uint b_length, return (int) (a_length-b_length); } -#define CMP(a,b) (a0 acording to which is bigger -Key_length specifies length of key to use. Number-keys can't be splited -If flag <> SEARCH_FIND compare also position + Compare two keys + Returns <0, 0, >0 acording to which is bigger + Key_length specifies length of key to use. Number-keys can't be splited + If flag <> SEARCH_FIND compare also position */ + int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, - register uchar *b, uint key_length, uint nextflag, - uint *diff_pos) + register uchar *b, uint key_length, uint nextflag, + uint *diff_pos) { int flag; int16 s_1,s_2; @@ -83,13 +83,14 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, for ( ; (int) key_length >0 ; key_length=next_key_length, keyseg++) { uchar *end; + uint piks=! (keyseg->flag & HA_NO_SORT); (*diff_pos)++; /* Handle NULL part */ if (keyseg->null_bit) { key_length--; - if (*a != *b) + if (*a != *b && piks) { flag = (int) *a - (int) *b; return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); @@ -115,7 +116,8 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, get_key_pack_length(b_length,pack_length,b); next_key_length=key_length-b_length-pack_length; - if ((flag= mi_compare_text(keyseg->charset,a,a_length,b,b_length, + if (piks && + (flag= mi_compare_text(keyseg->charset,a,a_length,b,b_length, (my_bool) ((nextflag & SEARCH_PREFIX) && next_key_length <= 0)))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); @@ -133,7 +135,8 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, while (b_length && b[b_length-1] == ' ') b_length--; } - if ((flag= mi_compare_text(keyseg->charset,a,a_length,b,b_length, + if (piks && + (flag= mi_compare_text(keyseg->charset,a,a_length,b,b_length, (my_bool) ((nextflag & SEARCH_PREFIX) && next_key_length <= 0)))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); @@ -149,7 +152,8 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, get_key_pack_length(b_length,pack_length,b); next_key_length=key_length-b_length-pack_length; - if ((flag=compare_bin(a,a_length,b,b_length, + if (piks && + (flag=compare_bin(a,a_length,b,b_length, (my_bool) ((nextflag & SEARCH_PREFIX) && next_key_length <= 0)))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); @@ -160,7 +164,8 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, else { uint length=keyseg->length; - if ((flag=compare_bin(a,length,b,length, + if (piks && + (flag=compare_bin(a,length,b,length, (my_bool) ((nextflag & SEARCH_PREFIX) && next_key_length <= 0)))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); @@ -175,7 +180,8 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, get_key_pack_length(b_length,pack_length,b); next_key_length=key_length-b_length-pack_length; - if ((flag= mi_compare_text(keyseg->charset,a,a_length,b,b_length, + if (piks && + (flag= mi_compare_text(keyseg->charset,a,a_length,b,b_length, (my_bool) ((nextflag & SEARCH_PREFIX) && next_key_length <= 0)))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); @@ -191,7 +197,8 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, get_key_pack_length(b_length,pack_length,b); next_key_length=key_length-b_length-pack_length; - if ((flag=compare_bin(a,a_length,b,b_length, + if (piks && + (flag=compare_bin(a,a_length,b,b_length, (my_bool) ((nextflag & SEARCH_PREFIX) && next_key_length <= 0)))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); @@ -204,7 +211,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, { int i_1= (int) *((signed char*) a); int i_2= (int) *((signed char*) b); - if ((flag = CMP(i_1,i_2))) + if (piks && (flag = CMP_NUM(i_1,i_2))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b++; @@ -213,7 +220,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, case HA_KEYTYPE_SHORT_INT: s_1= mi_sint2korr(a); s_2= mi_sint2korr(b); - if ((flag = CMP(s_1,s_2))) + if (piks && (flag = CMP_NUM(s_1,s_2))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 2; /* sizeof(short int); */ @@ -223,7 +230,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, uint16 us_1,us_2; us_1= mi_sint2korr(a); us_2= mi_sint2korr(b); - if ((flag = CMP(us_1,us_2))) + if (piks && (flag = CMP_NUM(us_1,us_2))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+=2; /* sizeof(short int); */ @@ -232,7 +239,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, case HA_KEYTYPE_LONG_INT: l_1= mi_sint4korr(a); l_2= mi_sint4korr(b); - if ((flag = CMP(l_1,l_2))) + if (piks && (flag = CMP_NUM(l_1,l_2))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 4; /* sizeof(long int); */ @@ -240,7 +247,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, case HA_KEYTYPE_ULONG_INT: u_1= mi_sint4korr(a); u_2= mi_sint4korr(b); - if ((flag = CMP(u_1,u_2))) + if (piks && (flag = CMP_NUM(u_1,u_2))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 4; /* sizeof(long int); */ @@ -248,7 +255,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, case HA_KEYTYPE_INT24: l_1=mi_sint3korr(a); l_2=mi_sint3korr(b); - if ((flag = CMP(l_1,l_2))) + if (piks && (flag = CMP_NUM(l_1,l_2))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 3; @@ -256,7 +263,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, case HA_KEYTYPE_UINT24: l_1=mi_uint3korr(a); l_2=mi_uint3korr(b); - if ((flag = CMP(l_1,l_2))) + if (piks && (flag = CMP_NUM(l_1,l_2))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 3; @@ -264,7 +271,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, case HA_KEYTYPE_FLOAT: mi_float4get(f_1,a); mi_float4get(f_2,b); - if ((flag = CMP(f_1,f_2))) + if (piks && (flag = CMP_NUM(f_1,f_2))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 4; /* sizeof(float); */ @@ -272,7 +279,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, case HA_KEYTYPE_DOUBLE: mi_float8get(d_1,a); mi_float8get(d_2,b); - if ((flag = CMP(d_1,d_2))) + if (piks && (flag = CMP_NUM(d_1,d_2))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 8; /* sizeof(double); */ @@ -303,32 +310,40 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, for ( ; blength && *b == ' ' ; b++, blength--) ; } - if (*a == '-') + if (piks) { - if (*b != '-') - return -1; - a++; b++; - swap(uchar*,a,b); - swap(int,alength,blength); - swap_flag=1-swap_flag; - alength--; blength--; - end=a+alength; - } - else if (*b == '-') - return 1; - while (alength && (*a == '+' || *a == '0')) - { - a++; alength--; + if (*a == '-') + { + if (*b != '-') + return -1; + a++; b++; + swap(uchar*,a,b); + swap(int,alength,blength); + swap_flag=1-swap_flag; + alength--; blength--; + end=a+alength; + } + else if (*b == '-') + return 1; + while (alength && (*a == '+' || *a == '0')) + { + a++; alength--; + } + while (blength && (*b == '+' || *b == '0')) + { + b++; blength--; + } + if (alength != blength) + return (alength < blength) ? -1 : 1; + while (a < end) + if (*a++ != *b++) + return ((int) a[-1] - (int) b[-1]); } - while (blength && (*b == '+' || *b == '0')) + else { - b++; blength--; + b+=(end-a); + a=end; } - if (alength != blength) - return (alength < blength) ? -1 : 1; - while (a < end) - if (*a++ != *b++) - return ((int) a[-1] - (int) b[-1]); if (swap_flag) /* Restore pointers */ swap(uchar*,a,b); @@ -340,7 +355,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, longlong ll_a,ll_b; ll_a= mi_sint8korr(a); ll_b= mi_sint8korr(b); - if ((flag = CMP(ll_a,ll_b))) + if (piks && (flag = CMP_NUM(ll_a,ll_b))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 8; @@ -351,7 +366,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, ulonglong ll_a,ll_b; ll_a= mi_uint8korr(a); ll_b= mi_uint8korr(b); - if ((flag = CMP(ll_a,ll_b))) + if (piks && (flag = CMP_NUM(ll_a,ll_b))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 8; diff --git a/sql/spatial.cc b/sql/spatial.cc index 32942a70dc2..bb6e03c3c03 100644 --- a/sql/spatial.cc +++ b/sql/spatial.cc @@ -680,13 +680,16 @@ int GPolygon::centroid_xy(double *x, double *y) const uint32 i; double res_area, res_cx, res_cy; const char *data = m_data; + LINT_INIT(res_area); + LINT_INIT(res_cx); + LINT_INIT(res_cy); if (no_data(data, 4)) return 1; n_linear_rings = uint4korr(data); data += 4; - for(i = 0; i < n_linear_rings; ++i) + for (i = 0; i < n_linear_rings; ++i) { if (no_data(data, 4)) return 1; @@ -720,7 +723,8 @@ int GPolygon::centroid_xy(double *x, double *y) const cur_area = fabs(cur_area) / 2; cur_cx = cur_cx / (n_points - 1); cur_cy = cur_cy / (n_points - 1); - if(i) + + if (i) { double d_area = res_area - cur_area; if (d_area <= 0) @@ -1195,6 +1199,10 @@ int GMultiPolygon::centroid(String *result) const double res_area, res_cx, res_cy; double cur_area, cur_cx, cur_cy; + LINT_INIT(res_area); + LINT_INIT(res_cx); + LINT_INIT(res_cy); + const char *data = m_data; if (no_data(data, 4)) return 1; @@ -1211,7 +1219,7 @@ int GMultiPolygon::centroid(String *result) const if (p.centroid_xy(&cur_cx, &cur_cy)) return 1; - if(i) + if (i) { double sum_area = res_area + cur_area; res_cx = (res_area * res_cx + cur_area * cur_cx) / sum_area; diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 36c4f4cba48..bdcb325774b 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -476,20 +476,22 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, checking for proper key parts number: */ - if(key_info->flags == HA_SPATIAL){ - if(key_info->key_parts!=1){ + if (key_info->flags == HA_SPATIAL) + { + if (key_info->key_parts != 1) + { my_printf_error(ER_WRONG_ARGUMENTS, ER(ER_WRONG_ARGUMENTS),MYF(0),"SPATIAL INDEX"); DBUG_RETURN(-1); } - }else + } + else if (key_info->algorithm == HA_KEY_ALG_RTREE) { - if(key_info->algorithm == HA_KEY_ALG_RTREE){ - if((key_info->key_parts&1)==1){ - my_printf_error(ER_WRONG_ARGUMENTS, - ER(ER_WRONG_ARGUMENTS),MYF(0),"RTREE INDEX"); - DBUG_RETURN(-1); - } + if ((key_info->key_parts & 1) == 1) + { + my_printf_error(ER_WRONG_ARGUMENTS, + ER(ER_WRONG_ARGUMENTS),MYF(0),"RTREE INDEX"); + DBUG_RETURN(-1); } } -- cgit v1.2.1 From e494b724d0b3100d325a6dd9f59c004b3bb71c1c Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 22 May 2002 20:09:03 +0300 Subject: Fixed key algorithm handling sql/sql_string.cc: Portability fix --- sql/sql_class.h | 3 --- sql/sql_parse.cc | 5 +++-- sql/sql_string.cc | 4 ++-- sql/table.cc | 5 +++++ 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/sql/sql_class.h b/sql/sql_class.h index 3ffac72c1db..5dc761ff811 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -221,9 +221,6 @@ public: List columns; const char *Name; - Key(enum Keytype type_par,const char *name_arg,List &cols) - :type(type_par), columns(cols),Name(name_arg) {} - Key(enum Keytype type_par, enum ha_key_alg alg_par, const char *name_arg, List &cols) :type(type_par), algorithm(alg_par), columns(cols), Name(name_arg) {} diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 06431124356..469de136fbb 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2787,14 +2787,14 @@ bool add_field_to_list(char *field_name, enum_field_types type, if (type_modifier & PRI_KEY_FLAG) { lex->col_list.push_back(new key_part_spec(field_name,0)); - lex->key_list.push_back(new Key(Key::PRIMARY,NullS, + lex->key_list.push_back(new Key(Key::PRIMARY, HA_KEY_ALG_UNDEF, NullS, lex->col_list)); lex->col_list.empty(); } if (type_modifier & (UNIQUE_FLAG | UNIQUE_KEY_FLAG)) { lex->col_list.push_back(new key_part_spec(field_name,0)); - lex->key_list.push_back(new Key(Key::UNIQUE,NullS, + lex->key_list.push_back(new Key(Key::UNIQUE, HA_KEY_ALG_UNDEF, NullS, lex->col_list)); lex->col_list.empty(); } @@ -2858,6 +2858,7 @@ bool add_field_to_list(char *field_name, enum_field_types type, case FIELD_TYPE_STRING: case FIELD_TYPE_VAR_STRING: case FIELD_TYPE_NULL: + case FIELD_TYPE_GEOMETRY: break; case FIELD_TYPE_DECIMAL: if (!length) diff --git a/sql/sql_string.cc b/sql/sql_string.cc index c05a7b85f77..b8e2ba7b536 100644 --- a/sql/sql_string.cc +++ b/sql/sql_string.cc @@ -123,7 +123,7 @@ bool String::set(double num,uint decimals) char *pos,*to; VOID(fconvert(num,(int) decimals,&decpt,&sign,buff+1)); - if (!isdigit(buff[1])) + if (!my_isdigit(system_charset_info, buff[1])) { // Nan or Inf pos=buff+1; if (sign) @@ -490,7 +490,7 @@ void String::qs_append(double d) void String::qs_append(double *d) { double ld; - float8get(ld, d); + float8get(ld, (char*) d); qs_append(ld); } diff --git a/sql/table.cc b/sql/table.cc index 29c50fd8dcc..05a5c5e6bd2 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -199,7 +199,12 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, /* Read key types */ keyinfo=outparam->key_info; for (i=0 ; i < keys ; i++, keyinfo++) + { keyinfo->algorithm= (enum ha_key_alg) *(strpos++); + /* Temporary fix to get spatial index to work */ + if (keyinfo->algorithm == HA_KEY_ALG_RTREE) + keyinfo->flags|= HA_SPATIAL; + } } else { -- cgit v1.2.1 From c1f3be5bb5f70e5d0376f258b79ccffa5b2d9c2b Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 23 May 2002 19:26:16 +0500 Subject: Heap table code cleanup --- heap/heapdef.h | 4 ++-- heap/hp_hash.c | 41 ++++++++++++++++++----------------------- heap/hp_open.c | 42 ++++++++++++++++++++++++------------------ heap/hp_rfirst.c | 3 ++- heap/hp_rkey.c | 48 ++++++++++++++++++++++++------------------------ heap/hp_rlast.c | 3 ++- heap/hp_rnext.c | 3 ++- heap/hp_rprev.c | 3 ++- include/heap.h | 1 + 9 files changed, 77 insertions(+), 71 deletions(-) diff --git a/heap/heapdef.h b/heap/heapdef.h index 0308f7dd62c..c81624059d5 100644 --- a/heap/heapdef.h +++ b/heap/heapdef.h @@ -82,11 +82,11 @@ extern void hp_make_key(HP_KEYDEF *keydef,byte *key,const byte *rec); extern uint hp_rb_make_key(HP_KEYDEF *keydef, byte *key, const byte *rec, byte *recpos); extern uint hp_rb_key_length(HP_KEYDEF *keydef, const byte *key); +extern uint hp_rb_null_key_length(HP_KEYDEF *keydef, const byte *key); extern my_bool hp_if_null_in_key(HP_KEYDEF *keyinfo, const byte *record); extern int hp_close(register HP_INFO *info); extern void hp_clear(HP_SHARE *info); -extern uint hp_rb_pack_key(HP_INFO *info, uint inx, uchar *key, - const uchar *old, uint k_length); +extern uint hp_rb_pack_key(HP_KEYDEF *keydef, uchar *key, const uchar *old); #ifdef THREAD extern pthread_mutex_t THR_LOCK_heap; #else diff --git a/heap/hp_hash.c b/heap/hp_hash.c index f170df4fdb8..424322fd5e7 100644 --- a/heap/hp_hash.c +++ b/heap/hp_hash.c @@ -26,16 +26,17 @@ ha_rows hp_rb_records_in_range(HP_INFO *info, int inx, const byte *start_key, enum ha_rkey_function end_search_flag) { ha_rows start_pos, end_pos; - TREE *rb_tree = &info->s->keydef[inx].rb_tree; + HP_KEYDEF *keyinfo= info->s->keydef + inx; + TREE *rb_tree = &keyinfo->rb_tree; heap_rb_param custom_arg; info->lastinx = inx; - custom_arg.keyseg = info->s->keydef[inx].seg; + custom_arg.keyseg = keyinfo->seg; custom_arg.search_flag = SEARCH_FIND | SEARCH_SAME; custom_arg.key_length = start_key_len; if (start_key) { - hp_rb_pack_key(info, inx, info->recbuf, start_key, start_key_len); + hp_rb_pack_key(keyinfo, info->recbuf, start_key); start_pos= tree_record_pos(rb_tree, info->recbuf, start_search_flag, &custom_arg); } @@ -47,7 +48,7 @@ ha_rows hp_rb_records_in_range(HP_INFO *info, int inx, const byte *start_key, custom_arg.key_length = end_key_len; if (end_key) { - hp_rb_pack_key(info, inx, info->recbuf, end_key, end_key_len); + hp_rb_pack_key(keyinfo, info->recbuf, end_key); end_pos= tree_record_pos(rb_tree, info->recbuf, end_search_flag, &custom_arg); } @@ -473,12 +474,10 @@ uint hp_rb_make_key(HP_KEYDEF *keydef, byte *key, return key - start_key; } -uint hp_rb_pack_key(HP_INFO *info, uint inx, uchar *key, const uchar *old, - uint k_length) +uint hp_rb_pack_key(HP_KEYDEF *keydef, uchar *key, const uchar *old) { HA_KEYSEG *seg, *endseg; uchar *start_key= key; - HP_KEYDEF *keydef= info->s->keydef + inx; for (seg= keydef->seg, endseg= seg + keydef->keysegs; seg < endseg; old+= seg->length, seg++) @@ -494,28 +493,24 @@ uint hp_rb_pack_key(HP_INFO *info, uint inx, uchar *key, const uchar *old, return key - start_key; } -uint hp_rb_key_length(HP_KEYDEF *keydef, const byte *key) +uint hp_rb_key_length(HP_KEYDEF *keydef, + const byte *key __attribute__((unused))) +{ + return keydef->length; +} + +uint hp_rb_null_key_length(HP_KEYDEF *keydef, const byte *key) { const byte *start_key= key; HA_KEYSEG *seg, *endseg; - if (keydef->flag & HA_NULL_PART_KEY) - { - for (seg= keydef->seg, endseg= seg + keydef->keysegs; seg < endseg; seg++) - { - if (seg->null_bit) - { - if (!*key++) - continue; - } - key += seg->length; - } - return key - start_key; - } - else + for (seg= keydef->seg, endseg= seg + keydef->keysegs; seg < endseg; seg++) { - return keydef->length; + if (seg->null_bit && !*key++) + continue; + key+= seg->length; } + return key - start_key; } /* diff --git a/heap/hp_open.c b/heap/hp_open.c index 7f189adc497..3aa35e2cf88 100644 --- a/heap/hp_open.c +++ b/heap/hp_open.c @@ -48,30 +48,37 @@ HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef, pthread_mutex_lock(&THR_LOCK_heap); if (!(share = hp_find_named_heap(name))) { + HP_KEYDEF *keyinfo; DBUG_PRINT("info",("Initializing new table")); - for (i=key_segs=max_length=0 ; i < keys ; i++) + for (i=key_segs=max_length=0, keyinfo= keydef; i < keys; i++, keyinfo++) { - key_segs+= keydef[i].keysegs; - if (keydef[i].algorithm == HA_KEY_ALG_BTREE) - key_segs++; - bzero((char*) &keydef[i].block,sizeof(keydef[i].block)); - bzero((char*) &keydef[i].rb_tree ,sizeof(keydef[i].rb_tree)); - for (j=length=0 ; j < keydef[i].keysegs; j++) + bzero((char*) &keyinfo->block,sizeof(keyinfo->block)); + bzero((char*) &keyinfo->rb_tree ,sizeof(keyinfo->rb_tree)); + for (j=length=0 ; j < keyinfo->keysegs; j++) { - length+=keydef[i].seg[j].length; - if (keydef[i].seg[j].null_bit) + length+=keyinfo->seg[j].length; + if (keyinfo->seg[j].null_bit) { - if (!(keydef[i].flag & HA_NULL_ARE_EQUAL)) - keydef[i].flag |= HA_NULL_PART_KEY; - if (keydef[i].algorithm == HA_KEY_ALG_BTREE) - keydef[i].rb_tree.size_of_element++; + if (!(keyinfo->flag & HA_NULL_ARE_EQUAL)) + keyinfo->flag |= HA_NULL_PART_KEY; + if (keyinfo->algorithm == HA_KEY_ALG_BTREE) + keyinfo->rb_tree.size_of_element++; } } - keydef[i].length= length; - length+= keydef[i].rb_tree.size_of_element + - ((keydef[i].algorithm == HA_KEY_ALG_BTREE) ? sizeof(byte*) : 0); + keyinfo->length= length; + length+= keyinfo->rb_tree.size_of_element + + ((keyinfo->algorithm == HA_KEY_ALG_BTREE) ? sizeof(byte*) : 0); if (length > max_length) max_length= length; + key_segs+= keyinfo->keysegs; + if (keyinfo->algorithm == HA_KEY_ALG_BTREE) + { + key_segs++; /* additional HA_KEYTYPE_END segment */ + if (keyinfo->flag & HA_NULL_PART_KEY) + keyinfo->get_key_length = hp_rb_null_key_length; + else + keyinfo->get_key_length = hp_rb_key_length; + } } if (!(share= (HP_SHARE*) my_malloc((uint) sizeof(HP_SHARE)+ keys*sizeof(HP_KEYDEF)+ @@ -86,9 +93,8 @@ HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef, init_block(&share->block, reclength + 1, min_records, max_records); /* Fix keys */ memcpy(share->keydef, keydef, (size_t) (sizeof(keydef[0]) * keys)); - for (i= 0; i < keys; i++) + for (i= 0, keyinfo= share->keydef; i < keys; i++, keyinfo++) { - HP_KEYDEF *keyinfo= share->keydef + i; uint nsegs= keydef[i].keysegs; if (keydef[i].algorithm == HA_KEY_ALG_BTREE) diff --git a/heap/hp_rfirst.c b/heap/hp_rfirst.c index 654874d5c8d..39b0d4385f2 100644 --- a/heap/hp_rfirst.c +++ b/heap/hp_rfirst.c @@ -31,7 +31,8 @@ int heap_rfirst(HP_INFO *info, byte *record, int inx) if ((pos = tree_search_edge(&keyinfo->rb_tree, info->parents, &info->last_pos, offsetof(TREE_ELEMENT, left)))) { - memcpy(&pos, pos + hp_rb_key_length(keyinfo, pos), sizeof(byte*)); + memcpy(&pos, pos + (*keyinfo->get_key_length)(keyinfo, pos), + sizeof(byte*)); info->current_ptr = pos; memcpy(record, pos, (size_t)share->reclength); info->update = HA_STATE_AKTIV; diff --git a/heap/hp_rkey.c b/heap/hp_rkey.c index 502e97e2f06..4e47fd52e9b 100644 --- a/heap/hp_rkey.c +++ b/heap/hp_rkey.c @@ -20,56 +20,56 @@ int heap_rkey(HP_INFO *info, byte *record, int inx, const byte *key, uint key_len, enum ha_rkey_function find_flag) { byte *pos; - HP_SHARE *share=info->s; - HP_KEYDEF *keyinfo = share->keydef+inx; + HP_SHARE *share= info->s; + HP_KEYDEF *keyinfo= share->keydef + inx; DBUG_ENTER("heap_rkey"); DBUG_PRINT("enter",("base: %lx inx: %d",info,inx)); if ((uint) inx >= share->keys) { - DBUG_RETURN(my_errno=HA_ERR_WRONG_INDEX); + DBUG_RETURN(my_errno= HA_ERR_WRONG_INDEX); } - info->lastinx=inx; - info->current_record = (ulong) ~0L; /* For heap_rrnd() */ + info->lastinx= inx; + info->current_record= (ulong) ~0L; /* For heap_rrnd() */ if (keyinfo->algorithm == HA_KEY_ALG_BTREE) { heap_rb_param custom_arg; - hp_rb_pack_key(info, inx, info->recbuf, key, key_len); + hp_rb_pack_key(keyinfo, info->recbuf, key); - custom_arg.keyseg = info->s->keydef[inx].seg; - custom_arg.key_length = key_len; - custom_arg.search_flag = SEARCH_FIND | SEARCH_SAME; + custom_arg.keyseg= info->s->keydef[inx].seg; + custom_arg.key_length= key_len; + custom_arg.search_flag= SEARCH_FIND | SEARCH_SAME; /* for next rkey() after deletion */ if (find_flag == HA_READ_AFTER_KEY) - info->last_find_flag = HA_READ_KEY_OR_NEXT; + info->last_find_flag= HA_READ_KEY_OR_NEXT; else if (find_flag == HA_READ_BEFORE_KEY) - info->last_find_flag = HA_READ_KEY_OR_PREV; + info->last_find_flag= HA_READ_KEY_OR_PREV; else - info->last_find_flag = find_flag; - info->lastkey_len = key_len; - if (!(pos = tree_search_key(&keyinfo->rb_tree, info->recbuf, info->parents, - &info->last_pos, find_flag, &custom_arg))) + info->last_find_flag= find_flag; + info->lastkey_len= key_len; + if (!(pos= tree_search_key(&keyinfo->rb_tree, info->recbuf, info->parents, + &info->last_pos, find_flag, &custom_arg))) { - info->update = 0; - DBUG_RETURN(my_errno = HA_ERR_KEY_NOT_FOUND); + info->update= 0; + DBUG_RETURN(my_errno= HA_ERR_KEY_NOT_FOUND); } - memcpy(&pos, pos + hp_rb_key_length(keyinfo, pos), sizeof(byte*)); - info->current_ptr = pos; + memcpy(&pos, pos + (*keyinfo->get_key_length)(keyinfo, pos), sizeof(byte*)); + info->current_ptr= pos; } else { - if (!(pos=hp_search(info,share->keydef+inx,key,0))) + if (!(pos= hp_search(info, share->keydef + inx, key, 0))) { - info->update=0; + info->update= 0; DBUG_RETURN(my_errno); } if (!(keyinfo->flag & HA_NOSAME)) - memcpy(info->lastkey,key,(size_t) keyinfo->length); + memcpy(info->lastkey, key, (size_t) keyinfo->length); } - memcpy(record,pos,(size_t) share->reclength); - info->update=HA_STATE_AKTIV; + memcpy(record, pos, (size_t) share->reclength); + info->update= HA_STATE_AKTIV; DBUG_RETURN(0); } diff --git a/heap/hp_rlast.c b/heap/hp_rlast.c index 6832b6e2428..e51a0e8a8f1 100644 --- a/heap/hp_rlast.c +++ b/heap/hp_rlast.c @@ -32,7 +32,8 @@ int heap_rlast(HP_INFO *info, byte *record, int inx) if ((pos = tree_search_edge(&keyinfo->rb_tree, info->parents, &info->last_pos, offsetof(TREE_ELEMENT, right)))) { - memcpy(&pos, pos + hp_rb_key_length(keyinfo, pos), sizeof(byte*)); + memcpy(&pos, pos + (*keyinfo->get_key_length)(keyinfo, pos), + sizeof(byte*)); info->current_ptr = pos; memcpy(record, pos, (size_t)share->reclength); info->update = HA_STATE_AKTIV; diff --git a/heap/hp_rnext.c b/heap/hp_rnext.c index c01ca52d5ae..a1bc480333e 100644 --- a/heap/hp_rnext.c +++ b/heap/hp_rnext.c @@ -47,7 +47,8 @@ int heap_rnext(HP_INFO *info, byte *record) } if (pos) { - memcpy(&pos, pos + hp_rb_key_length(keyinfo, pos), sizeof(byte*)); + memcpy(&pos, pos + (*keyinfo->get_key_length)(keyinfo, pos), + sizeof(byte*)); info->current_ptr = pos; } else diff --git a/heap/hp_rprev.c b/heap/hp_rprev.c index 071746fa3de..d8f5c01dcea 100644 --- a/heap/hp_rprev.c +++ b/heap/hp_rprev.c @@ -47,7 +47,8 @@ int heap_rprev(HP_INFO *info, byte *record) } if (pos) { - memcpy(&pos, pos + hp_rb_key_length(keyinfo, pos), sizeof(byte*)); + memcpy(&pos, pos + (*keyinfo->get_key_length)(keyinfo, pos), + sizeof(byte*)); info->current_ptr = pos; } else diff --git a/include/heap.h b/include/heap.h index ef72524c03c..53757f51e73 100644 --- a/include/heap.h +++ b/include/heap.h @@ -91,6 +91,7 @@ typedef struct st_hp_keydef /* Key definition with open */ const byte *record, byte *recpos); int (*delete_key)(struct st_heap_info *info, struct st_hp_keydef *keyinfo, const byte *record, byte *recpos, int flag); + uint (*get_key_length)(struct st_hp_keydef *keydef, const byte *key); } HP_KEYDEF; typedef struct st_heap_share -- cgit v1.2.1 From 02d8b9ba56082d26b14808f6618e098c72e083fb Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 26 May 2002 22:50:32 +0300 Subject: added depended subselect processing mysql-test/r/subselect.result: depended subselect test mysql-test/t/subselect.test: depended subselect test sql/item.cc: resolving field names in depended queries sql/item_subselect.cc: move optimization just before execution, because we can't optimize inner depended subselect if have not optimized outer subselect sql/item_subselect.h: move optimization just before execution sql/sql_lex.h: some inline methods to hide internal SELECT_LEX structures sql/sql_select.cc: fixed error --- mysql-test/r/subselect.result | 8 ++++++++ mysql-test/t/subselect.test | 2 ++ sql/item.cc | 29 ++++++++++++++++++++++++++++- sql/item_subselect.cc | 28 +++++++++++++++++++++------- sql/item_subselect.h | 5 ++++- sql/sql_lex.cc | 1 + sql/sql_lex.h | 8 +++++++- sql/sql_select.cc | 42 +++++++++++++++++++++++++++++++++++------- sql/sql_select.h | 3 +++ 9 files changed, 109 insertions(+), 17 deletions(-) diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index ba705504970..cda4300d5f4 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -6,6 +6,14 @@ create table t4 (a int, b int); insert into t1 values (2); insert into t2 values (1,7),(2,7); insert into t4 values (4,8),(3,8),(5,9); +select (select a from t1 where t1.a=t2.a), a from t2; +(select a from t1 where t1.a=t2.a) a +NULL 1 +2 2 +select (select a from t1 where t1.a=t2.b), a from t2; +(select a from t1 where t1.a=t2.b) a +NULL 1 +NULL 2 select (select a from t1), a from t2; (select a from t1) a 2 1 diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 3bd92ef41de..d4358a14e64 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -8,6 +8,8 @@ create table t4 (a int, b int); insert into t1 values (2); insert into t2 values (1,7),(2,7); insert into t4 values (4,8),(3,8),(5,9); +select (select a from t1 where t1.a=t2.a), a from t2; +select (select a from t1 where t1.a=t2.b), a from t2; select (select a from t1), a from t2; select (select a from t3), a from t2; select * from t2 where t2.a=(select a from t1); diff --git a/sql/item.cc b/sql/item.cc index 84f4624a248..13141ade2a8 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -320,7 +320,34 @@ bool Item_field::fix_fields(THD *thd,TABLE_LIST *tables) { Field *tmp; if (!(tmp=find_field_in_tables(thd,this,tables))) - return 1; + { + /* + We can't find table field in table list of current select, + consequently we have to find it in outer subselect(s). + We can't join lists of outer & current select, because of scope + of view rules. For example if both tables (outer & current) have + field 'field' it is not mistake to refer to this field without + mention of table name, but if we join tables in one list it will + cause error ER_NON_UNIQ_ERROR in find_field_in_tables. + */ + for (SELECT_LEX *sl= thd->lex.select->outer_select(); + sl && !tmp; + sl= sl->outer_select()) + tmp=find_field_in_tables(thd, this, + (TABLE_LIST*)sl->table_list.first); + if (!tmp) + return 1; + else + if( !thd->lex.select->depended ) + { + thd->lex.select->depended= 1; //Select is depended of outer select(s) + //Tables will be reopened many times + for (TABLE_LIST *tbl= (TABLE_LIST*)thd->lex.select->table_list.first; + tbl; + tbl= tbl->next) + tbl->shared= 1; + } + } set_field(tmp); } else if (thd && thd->set_query_id && field->query_id != thd->query_id) diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 286c29fec7a..d71271b98fd 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -36,7 +36,7 @@ SUBSELECT TODO: #include "sql_select.h" Item_subselect::Item_subselect(THD *thd, st_select_lex *select_lex): - executed(0) + executed(0), optimized(0), error(0) { DBUG_ENTER("Item_subselect::Item_subselect"); DBUG_PRINT("subs", ("select_lex 0x%xl", (long) select_lex)); @@ -48,7 +48,7 @@ Item_subselect::Item_subselect(THD *thd, st_select_lex *select_lex): item value is NULL if select_subselect not changed this value (i.e. some rows will be found returned) */ - assign_null(); + assign_null(); DBUG_VOID_RETURN; } @@ -110,17 +110,31 @@ bool Item_subselect::fix_fields(THD *thd,TABLE_LIST *tables) (ORDER*) 0, select_lex, (SELECT_LEX_UNIT*) select_lex->master)) return 1; - if (join->optimize()) - { - executed= 1; - return 1; - } thd->lex.select= save_select; return 0; } int Item_subselect::exec() { + if (!optimized) + { + optimized=1; + if (join->optimize()) + { + executed= 1; + return (join->error?join->error:1); + } + } + if (join->select_lex->depended && executed) + { + if (join->reinit()) + { + error= 1; + return 1; + } + assign_null(); + executed= 0; + } if (!executed) { SELECT_LEX *save_select= join->thd->lex.select; diff --git a/sql/item_subselect.h b/sql/item_subselect.h index 096da68600c..e27f14fb83d 100644 --- a/sql/item_subselect.h +++ b/sql/item_subselect.h @@ -29,9 +29,11 @@ class select_subselect; class Item_subselect :public Item { protected: - my_bool executed; /* simple subselect is executed */ longlong int_value; double real_value; + my_bool executed; /* simple subselect is executed */ + my_bool optimized; /* simple subselect is optimized */ + my_bool error; /* error in query */ enum Item_result res_type; int exec(); @@ -62,6 +64,7 @@ public: join= item->join; result= item->result; name= item->name; + error= item->error; } enum Type type() const; double val (); diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 134e776a15a..496d21b333c 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -931,6 +931,7 @@ void st_select_lex::init_select() use_index.empty(); ftfunc_list.empty(); linkage=UNSPECIFIED_TYPE; + depended= 0; } /* diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 876b9aa2743..32a98615390 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -208,6 +208,7 @@ private: SELECT_LEXs */ struct st_lex; +struct st_select_lex; struct st_select_lex_unit: public st_select_lex_node { /* Pointer to 'last' select or pointer to unit where stored @@ -218,6 +219,8 @@ struct st_select_lex_unit: public st_select_lex_node { ha_rows select_limit_cnt, offset_limit_cnt; void init_query(); bool create_total_list(THD *thd, st_lex *lex, TABLE_LIST **result); + st_select_lex* first_select() { return (st_select_lex*) slave; } + st_select_lex_unit* next_unit() { return (st_select_lex_unit*) next; } private: bool create_total_list_n_last_return(THD *thd, st_lex *lex, TABLE_LIST ***result); @@ -240,9 +243,12 @@ struct st_select_lex: public st_select_lex_node { List ftfunc_list; uint in_sum_expr, sort_default; bool create_refs, - braces; /* SELECT ... UNION (SELECT ... ) <- this braces */ + braces, /* SELECT ... UNION (SELECT ... ) <- this braces */ + depended; /* depended from outer select subselect */ void init_query(); void init_select(); + st_select_lex* outer_select() { return (st_select_lex*) master->master; } + st_select_lex* next_select() { return (st_select_lex*) next; } }; typedef struct st_select_lex SELECT_LEX; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index c5e5e971e33..115e5a058ed 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -213,7 +213,8 @@ JOIN::prepare(TABLE_LIST *tables_init, proc_param= proc_param_init; tables_list= tables_init; select_lex= select; - + union_part= (unit->first_select()->next_select() != 0); + /* Check that all tables, fields, conds and order are ok */ if (setup_tables(tables_list) || @@ -334,7 +335,6 @@ int JOIN::optimize() { DBUG_ENTER("JOIN::optimize"); - SELECT_LEX *select_lex = &(thd->lex.select_lex); #ifdef HAVE_REF_TO_FIELDS // Not done yet /* Add HAVING to WHERE if possible */ @@ -380,7 +380,7 @@ JOIN::optimize() } if (select_options & SELECT_DESCRIBE) { - if (select_lex->next) + if (union_part) select_describe(this, false, false, false, "Select tables optimized away"); else @@ -406,6 +406,17 @@ JOIN::optimize() if (make_join_statistics(this, tables_list, conds, &keyuse) || thd->fatal_error) DBUG_RETURN(-1); + + if (select_lex->depended) + { + /* + Just remove all const-table optimization in case of depended query + TODO: optimize + */ + const_table_map= 0; + const_tables= 0; + found_const_table_map= 0; + } thd->proc_info= "preparing"; result->initialize_tables(this); if (const_table_map != found_const_table_map && @@ -576,7 +587,7 @@ JOIN::optimize() } /* - global uptimisation (with subselect) must be here (TODO) + Global optimization (with subselect) must be here (TODO) */ int @@ -585,8 +596,25 @@ JOIN::global_optimize() return 0; } +int +JOIN::reinit() +{ + DBUG_ENTER("JOIN::reinit"); + //TODO move to unit reinit + unit->offset_limit_cnt =select_lex->offset_limit; + unit->select_limit_cnt =select_lex->select_limit+select_lex->offset_limit; + if (unit->select_limit_cnt < select_lex->select_limit) + unit->select_limit_cnt= HA_POS_ERROR; // no limit + if (unit->select_limit_cnt == HA_POS_ERROR) + select_lex->options&= ~OPTION_FOUND_ROWS; + + if (setup_tables(tables_list)) + DBUG_RETURN(1); + DBUG_RETURN(0); +} + /* - exec select + Exec select */ void JOIN::exec() @@ -600,7 +628,7 @@ JOIN::exec() error=0; if (select_options & SELECT_DESCRIBE) { - if (select_lex->next) + if (union_part) select_describe(this, false, false, false, "No tables used"); else describe_info(thd, "No tables used"); @@ -627,7 +655,7 @@ JOIN::exec() if (zero_result_cause) { - if (select_options & SELECT_DESCRIBE && select_lex->next) + if (select_options & SELECT_DESCRIBE && union_part) select_describe(this, false, false, false, zero_result_cause); else error=return_zero_rows(result, tables_list, fields_list, diff --git a/sql/sql_select.h b/sql/sql_select.h index ba27c5b4b3b..84d4207bdb5 100644 --- a/sql/sql_select.h +++ b/sql/sql_select.h @@ -196,6 +196,8 @@ class JOIN :public Sql_alloc{ my_bool test_function_query; // need to return select items 1 row const char *zero_result_cause; // not 0 if exec must return zero result + + my_bool union_part; // this subselect is part of union JOIN(THD *thd, List &fields, ulong select_options, select_result *result): @@ -236,6 +238,7 @@ class JOIN :public Sql_alloc{ ORDER *proc_param, SELECT_LEX *select, SELECT_LEX_UNIT *unit); int optimize(); int global_optimize(); + int reinit(); void exec(); int cleanup(THD *thd); }; -- cgit v1.2.1 From 807b50855c4db0759aa93b84881c2559c24d01d4 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 27 May 2002 20:52:54 +0300 Subject: Hiding internal pointers of SELECT_LEX structures --- sql/item_subselect.cc | 2 +- sql/item_sum.cc | 2 +- sql/sql_derived.cc | 2 +- sql/sql_lex.cc | 13 +++++++------ sql/sql_lex.h | 44 +++++++++++++++++++++++++++++++++++--------- sql/sql_parse.cc | 10 +++++----- sql/sql_select.cc | 8 ++++---- sql/sql_union.cc | 2 +- sql/sql_yacc.yy | 18 +++++++++--------- 9 files changed, 64 insertions(+), 37 deletions(-) diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index d71271b98fd..777e46ce6b0 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -108,7 +108,7 @@ bool Item_subselect::fix_fields(THD *thd,TABLE_LIST *tables) (ORDER*) select_lex->group_list.first, select_lex->having, (ORDER*) 0, select_lex, - (SELECT_LEX_UNIT*) select_lex->master)) + select_lex->master_unit())) return 1; thd->lex.select= save_select; return 0; diff --git a/sql/item_sum.cc b/sql/item_sum.cc index 698f80928bb..a1ffae2ed82 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -965,7 +965,7 @@ bool Item_sum_count_distinct::setup(THD *thd) if (!(table= create_tmp_table(thd, tmp_table_param, list, (ORDER*) 0, 1, 0, 0, select_lex->options | thd->options, - (SELECT_LEX_UNIT*) select_lex->master))) + select_lex->master_unit()))) return 1; table->file->extra(HA_EXTRA_NO_ROWS); // Don't update rows table->no_rows=1; diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index 41f166c6ad0..4a64c30e7e5 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -34,7 +34,7 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t) TODO: make derived tables with union inside (now only 1 SELECT may be procesed) */ - SELECT_LEX *sl= (SELECT_LEX*)unit->slave; + SELECT_LEX *sl= unit->first_select(); List item_list; TABLE *table; int res; diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 496d21b333c..008ef44d83a 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -1021,18 +1021,19 @@ bool st_select_lex_unit::create_total_list_n_last_return(THD *thd, st_lex *lex, TABLE_LIST *slave_list_first=0, **slave_list_last= &slave_list_first; TABLE_LIST **new_table_list= *result, *aux; SELECT_LEX *sl= (SELECT_LEX*)slave; - for (; sl; sl= (SELECT_LEX*)sl->next) + for (; sl; sl= sl->next_select()) { // check usage of ORDER BY in union - if (sl->order_list.first && sl->next && !sl->braces) + if (sl->order_list.first && sl->next_select() && !sl->braces) { net_printf(&thd->net,ER_WRONG_USAGE,"UNION","ORDER BY"); return 1; } - if (sl->slave) - if (((SELECT_LEX_UNIT *) - sl->slave)->create_total_list_n_last_return(thd, lex, - &slave_list_last)) + for (SELECT_LEX_UNIT *inner= sl->first_inner_unit(); + inner; + inner= inner->next_unit()) + if (inner->create_total_list_n_last_return(thd, lex, + &slave_list_last)) return 1; if ((aux= (TABLE_LIST*) sl->table_list.first)) { diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 22e682fef38..5c113e46a2b 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -186,11 +186,15 @@ enum sub_select_type {UNSPECIFIED_TYPE,UNION_TYPE, INTERSECT_TYPE, Base class for st_select_lex (SELECT_LEX) & st_select_lex_unit (SELECT_LEX_UNIT) */ -struct st_select_lex_node { - enum sub_select_type linkage; +class st_select_lex_node { +protected: st_select_lex_node *next, **prev, /* neighbor list */ *master, *slave, /* vertical links */ *link_next, **link_prev; /* list of whole SELECT_LEX */ +public: + ulong options; + enum sub_select_type linkage; + //uint sort_default; SQL_LIST order_list; /* ORDER clause */ ha_rows select_limit, offset_limit; /* LIMIT clause parameters */ void init_query(); @@ -207,9 +211,10 @@ private: SELECT_LEX_UNIT - unit of selects (UNION, INTERSECT, ...) group SELECT_LEXs */ -struct st_lex; -struct st_select_lex; -struct st_select_lex_unit: public st_select_lex_node { +class st_lex; +class st_select_lex; +class st_select_lex_unit: public st_select_lex_node { +public: /* Pointer to 'last' select or pointer to unit where stored global parameters for union @@ -219,8 +224,11 @@ struct st_select_lex_unit: public st_select_lex_node { ha_rows select_limit_cnt, offset_limit_cnt; void init_query(); bool create_total_list(THD *thd, st_lex *lex, TABLE_LIST **result); + st_select_lex* outer_select() { return (st_select_lex*) master; } st_select_lex* first_select() { return (st_select_lex*) slave; } st_select_lex_unit* next_unit() { return (st_select_lex_unit*) next; } + + friend void mysql_init_query(THD *thd); private: bool create_total_list_n_last_return(THD *thd, st_lex *lex, TABLE_LIST ***result); @@ -230,10 +238,10 @@ typedef struct st_select_lex_unit SELECT_LEX_UNIT; /* SELECT_LEX - store information of parsed SELECT_LEX statment */ -struct st_select_lex: public st_select_lex_node { +class st_select_lex: public st_select_lex_node { +public: char *db, *db1, *table1, *db2, *table2; /* For outer join using .. */ Item *where, *having; /* WHERE & HAVING clauses */ - ulong options; List expr_list; List when_list; /* WHEN clause */ SQL_LIST table_list, group_list; /* FROM & GROUP BY clauses */ @@ -241,14 +249,32 @@ struct st_select_lex: public st_select_lex_node { List interval_list, use_index, *use_index_ptr, ignore_index, *ignore_index_ptr; List ftfunc_list; - uint in_sum_expr, sort_default; + uint in_sum_expr; bool create_refs, braces, /* SELECT ... UNION (SELECT ... ) <- this braces */ depended; /* depended from outer select subselect */ void init_query(); void init_select(); - st_select_lex* outer_select() { return (st_select_lex*) master->master; } + st_select_lex_unit* master_unit() { return (st_select_lex_unit*) master; } + st_select_lex_unit* first_inner_unit() + { + return (st_select_lex_unit*) slave; + } + st_select_lex* outer_select() + { + return (st_select_lex*) master_unit()->outer_select(); + } st_select_lex* next_select() { return (st_select_lex*) next; } + st_select_lex* next_select_in_list() + { + return (st_select_lex*) link_next; + } + st_select_lex_node** next_select_in_list_addr() + { + return &link_next; + } + + friend void mysql_init_query(THD *thd); }; typedef struct st_select_lex SELECT_LEX; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 8abd7a15bd4..6affc0199a5 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -65,7 +65,7 @@ static void decrease_user_connections(UC *uc); static bool check_db_used(THD *thd,TABLE_LIST *tables); static bool check_merge_table_access(THD *thd, char *db, TABLE_LIST *tables); static bool check_dup(const char *db, const char *name, TABLE_LIST *tables); -static void mysql_init_query(THD *thd); +void mysql_init_query(THD *thd); static void remove_escape(char *name); static void refresh_status(void); static bool append_file_to_dir(THD *thd, char **filename_ptr, @@ -1246,7 +1246,7 @@ mysql_execute_command(void) cursor)) DBUG_VOID_RETURN; } - if ((lex->select_lex.link_next && + if ((lex->select_lex.next_select_in_list() && lex->unit.create_total_list(thd, lex, &tables)) || (table_rules_on && tables && thd->slave_thread && !tables_ok(thd,tables))) @@ -2664,7 +2664,7 @@ bool my_yyoverflow(short **yyss, YYSTYPE **yyvs, int *yystacksize) Initialize global thd variables needed for query ****************************************************************************/ -static void +void mysql_init_query(THD *thd) { DBUG_ENTER("mysql_init_query"); @@ -2720,8 +2720,8 @@ mysql_new_select(LEX *lex, bool move_down) else select_lex->include_neighbour(lex->select); - ((SELECT_LEX_UNIT*)select_lex->master)->global_parameters= select_lex; - select_lex->include_global(&lex->select->link_next); + select_lex->master_unit()->global_parameters= select_lex; + select_lex->include_global(lex->select->next_select_in_list_addr()); lex->select= select_lex; return 0; } diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 60b092652aa..4748e857276 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -156,12 +156,12 @@ int handle_select(THD *thd, LEX *lex, select_result *result) { int res; register SELECT_LEX *select_lex = &lex->select_lex; - if (select_lex->link_next) + if (select_lex->next_select_in_list()) { /* Fix tables 'to-be-unioned-from' list to point at opened tables */ for (SELECT_LEX *sl= select_lex; sl; - sl= (SELECT_LEX*)sl->link_next) + sl= sl->next_select_in_list()) { for (TABLE_LIST *cursor= (TABLE_LIST *)sl->table_list.first; cursor; @@ -169,7 +169,7 @@ int handle_select(THD *thd, LEX *lex, select_result *result) cursor->table= cursor->table_list->table; } } - if (select_lex->next) + if (select_lex->next_select()) res=mysql_union(thd,lex,result); else res=mysql_select(thd,(TABLE_LIST*) select_lex->table_list.first, @@ -7275,7 +7275,7 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, result->send_error(0,NullS); } } - if (!join->thd->lex.select->next) + if (!join->thd->lex.select->next_select()) { save_lock=thd->lock; thd->lock=(MYSQL_LOCK *)0; diff --git a/sql/sql_union.cc b/sql/sql_union.cc index b5db593a234..585b5de11ab 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -104,7 +104,7 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) } union_result->save_time_stamp=!describe; - for (sl= &lex->select_lex; sl; sl= (SELECT_LEX*) sl->next) + for (sl= &lex->select_lex; sl; sl= sl->next_select()) { lex->select=sl; unit->offset_limit_cnt= sl->offset_limit; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index c5addfee15e..ebd26939ad5 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1477,8 +1477,8 @@ select_init: SELECT_LEX * sel=Select; sel->braces=true; /* select in braces, can't contain global parameters */ - ((SELECT_LEX_UNIT*)sel->master)->global_parameters= - sel->master; + sel->master_unit()->global_parameters= + sel->master_unit(); } union_opt @@ -2186,8 +2186,8 @@ join_table: | '(' SELECT_SYM select_part3 ')' opt_table_alias { LEX *lex=Lex; - SELECT_LEX_UNIT *unit= (SELECT_LEX_UNIT*) lex->select->master; - lex->select= (SELECT_LEX*) unit->master; + SELECT_LEX_UNIT *unit= lex->select->master_unit(); + lex->select= unit->outer_select(); if (!($$= add_table_to_list(new Table_ident(unit), $5,0,TL_UNLOCK))) YYABORT; @@ -2325,7 +2325,7 @@ order_clause: LEX *lex=Lex; if (lex->sql_command == SQLCOM_MULTI_UPDATE) YYABORT; - lex->select->sort_default=1; + /*lex->select->sort_default=1;*/ } order_list order_list: @@ -3859,13 +3859,13 @@ optional_order_or_limit: LEX *lex=Lex; if (!lex->select->braces) YYABORT; - ((SELECT_LEX_UNIT*)lex->select->master)->global_parameters= - lex->select->master; + lex->select->master_unit()->global_parameters= + lex->select->master_unit(); /* Following type conversion looks like hack, but all that need SELECT_LEX fields always check linkage type. */ - lex->select= (SELECT_LEX*)lex->select->master; + lex->select= (SELECT_LEX*)lex->select->master_unit(); lex->select->select_limit=lex->thd->default_select_limit; } opt_order_clause limit_clause @@ -3898,5 +3898,5 @@ subselect_end: ')' { LEX *lex=Lex; - lex->select = (SELECT_LEX*)lex->select->master->master; + lex->select = lex->select->outer_select(); } -- cgit v1.2.1 From c78685e0c27fd15933a1aaf2733c4035aadf4e0d Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 28 May 2002 20:46:35 +0500 Subject: Removed unnecessary key search in the hp_rb_write_key() function --- heap/hp_open.c | 4 ++-- heap/hp_write.c | 27 ++++++++++++++------------- include/my_tree.h | 5 ++++- mysys/tree.c | 5 +++++ 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/heap/hp_open.c b/heap/hp_open.c index 3aa35e2cf88..d48423c506a 100644 --- a/heap/hp_open.c +++ b/heap/hp_open.c @@ -99,8 +99,8 @@ HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef, if (keydef[i].algorithm == HA_KEY_ALG_BTREE) { - init_tree(&keyinfo->rb_tree, 0, 0, 0, (qsort_cmp2)keys_compare, 1, - NULL, NULL); + init_tree(&keyinfo->rb_tree, 0, 0, sizeof(byte*), + (qsort_cmp2)keys_compare, 1, NULL, NULL); keyinfo->delete_key= hp_rb_delete_key; keyinfo->write_key= hp_rb_write_key; nsegs++; diff --git a/heap/hp_write.c b/heap/hp_write.c index fcfe922d9c0..3e74a98b23c 100644 --- a/heap/hp_write.c +++ b/heap/hp_write.c @@ -96,22 +96,23 @@ int hp_rb_write_key(HP_INFO *info, HP_KEYDEF *keyinfo, const byte *record, info->last_pos= NULL; /* For heap_rnext/heap_rprev */ custom_arg.keyseg= keyinfo->seg; custom_arg.key_length= hp_rb_make_key(keyinfo, info->recbuf, record, recpos); - if ((keyinfo->flag & HA_NOSAME) && - (!(keyinfo->flag & HA_NULL_PART_KEY) || - !hp_if_null_in_key(keyinfo, record))) + if (keyinfo->flag & HA_NOSAME) { custom_arg.search_flag= SEARCH_FIND | SEARCH_SAME; - if (tree_search_key(&keyinfo->rb_tree, info->recbuf, info->parents, - &info->last_pos, 0, &custom_arg)) - { - my_errno= HA_ERR_FOUND_DUPP_KEY; - return 1; - } + keyinfo->rb_tree.flag= TREE_NO_DUPS; + } + else + { + custom_arg.search_flag= SEARCH_SAME; + keyinfo->rb_tree.flag= 0; + } + if (!tree_insert(&keyinfo->rb_tree, (void*)info->recbuf, + custom_arg.key_length, &custom_arg)) + { + my_errno= HA_ERR_FOUND_DUPP_KEY; + return 1; } - custom_arg.search_flag= SEARCH_SAME; - return tree_insert(&keyinfo->rb_tree, (void*)info->recbuf, - custom_arg.key_length + sizeof(byte*), - &custom_arg) ? 0 : 1; + return 0; } /* Find where to place new record */ diff --git a/include/my_tree.h b/include/my_tree.h index 826c2b7c808..bfe441f54a6 100644 --- a/include/my_tree.h +++ b/include/my_tree.h @@ -27,6 +27,8 @@ extern "C" { #define tree_set_pointer(element,ptr) *((byte **) (element+1))=((byte*) (ptr)) +#define TREE_NO_DUPS 1 + typedef enum { left_root_right, right_root_left } TREE_WALK; typedef uint32 element_count; typedef int (*tree_walk_action)(void *,element_count,void *); @@ -55,10 +57,11 @@ typedef struct st_tree { TREE_ELEMENT **parents[MAX_TREE_HEIGHT]; uint offset_to_key,elements_in_tree,size_of_element,memory_limit,allocated; qsort_cmp2 compare; - void* custom_arg; + void *custom_arg; MEM_ROOT mem_root; my_bool with_delete; tree_element_free free; + uint flag; } TREE; /* Functions on whole tree */ diff --git a/mysys/tree.c b/mysys/tree.c index 1bd49ef5182..489262fcdc7 100644 --- a/mysys/tree.c +++ b/mysys/tree.c @@ -86,6 +86,7 @@ void init_tree(TREE *tree, uint default_alloc_size, uint memory_limit, tree->custom_arg = custom_arg; tree->null_element.colour=BLACK; tree->null_element.left=tree->null_element.right=0; + tree->flag= 0; if (!free_element && size >= 0 && ((uint) size <= sizeof(void*) || ((uint) size & (sizeof(void*)-1)))) { @@ -231,7 +232,11 @@ TREE_ELEMENT *tree_insert(TREE *tree, void *key, uint key_size, rb_insert(tree,parent,element); /* rebalance tree */ } else + { + if (tree->flag & TREE_NO_DUPS) + return(NULL); element->count++; + } DBUG_EXECUTE("check_tree", test_rb_tree(tree->root);); return element; } -- cgit v1.2.1 From 0bef1099a224bacd2e95c976e19940bd1cdff21b Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 28 May 2002 20:49:17 +0300 Subject: derived table with * bug fixed mysql-test/r/derived.result: derived table with * bug test suite mysql-test/t/derived.test: derived table with * bug test suite --- mysql-test/r/derived.result | 4 ++++ mysql-test/t/derived.test | 1 + sql/sql_derived.cc | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/derived.result b/mysql-test/r/derived.result index 822993a7bf2..e05be96c6b7 100644 --- a/mysql-test/r/derived.result +++ b/mysql-test/r/derived.result @@ -7,6 +7,10 @@ select t1.a,t3.y from t1,(select a as y from t2 where b='c') as t3 where t1.a a y 3 3 3 3 +select t1.a,t3.a from t1,(select * from t2 where b='c') as t3 where t1.a = t3.a; +a a +3 3 +3 3 CREATE TABLE t3 (a int not null, b char (10) not null); insert into t3 values (3,'f'),(4,'y'),(5,'z'),(6,'c'); select t1.a,t4.y from t1,(select t2.a as y from t2,(select t3.b from t3 where t3.a>3) as t5 where t2.b=t5.b) as t4 where t1.a = t4.y; diff --git a/mysql-test/t/derived.test b/mysql-test/t/derived.test index c5f57007e54..76ef5fba351 100644 --- a/mysql-test/t/derived.test +++ b/mysql-test/t/derived.test @@ -4,6 +4,7 @@ insert into t1 values(1,'a'),(2,'b'),(3,'c'),(3,'c'); CREATE TABLE t2 (a int not null, b char (10) not null); insert into t2 values (3,'c'),(4,'d'),(5,'f'),(6,'e'); select t1.a,t3.y from t1,(select a as y from t2 where b='c') as t3 where t1.a = t3.y; +select t1.a,t3.a from t1,(select * from t2 where b='c') as t3 where t1.a = t3.a; CREATE TABLE t3 (a int not null, b char (10) not null); insert into t3 values (3,'f'),(4,'y'),(5,'z'),(6,'c'); select t1.a,t4.y from t1,(select t2.a as y from t2,(select t3.b from t3 where t3.a>3) as t5 where t2.b=t5.b) as t4 where t1.a = t4.y; diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index f1b60dd9b84..af43c5dcd96 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -71,7 +71,7 @@ int mysql_derived(THD *thd, LEX *lex,SELECT_LEX *s, TABLE_LIST *t) } bzero((char*) &tmp_table_param,sizeof(tmp_table_param)); tmp_table_param.field_count=item_list.elements; - if (!(table=create_tmp_table(thd, &tmp_table_param, sl->item_list, + if (!(table=create_tmp_table(thd, &tmp_table_param, item_list, (ORDER*) 0, 0, 1, 0, (sl->options | thd->options | TMP_TABLE_ALL_COLUMNS)))) { -- cgit v1.2.1 From 3d9cd36f47649a5693695576d3e6fb9dfd6648d9 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 28 May 2002 22:38:17 +0300 Subject: limit clause fixed --- mysql-test/r/subselect.result | 4 ++++ mysql-test/t/subselect.test | 7 +++++-- sql/item_subselect.cc | 13 ++++++++++--- sql/sql_class.cc | 11 +++++++++-- sql/sql_parse.cc | 9 +++++---- 5 files changed, 33 insertions(+), 11 deletions(-) diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index cda4300d5f4..64ceea72498 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -36,4 +36,8 @@ a b 1 7 2 7 3 8 +select (select a from t3 where a1) as tt; drop table t1,t2,t3,t4; diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 777e46ce6b0..72bbbcba5a7 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -24,7 +24,6 @@ SUBSELECT TODO: (sql_select.h/sql_select.cc) - add subselect union select (sql_union.cc) - - depended from outer select subselects */ @@ -41,6 +40,14 @@ Item_subselect::Item_subselect(THD *thd, st_select_lex *select_lex): DBUG_ENTER("Item_subselect::Item_subselect"); DBUG_PRINT("subs", ("select_lex 0x%xl", (long) select_lex)); result= new select_subselect(this); + SELECT_LEX_UNIT *unit= select_lex->master_unit(); + unit->offset_limit_cnt= unit->global_parameters->offset_limit; + unit->select_limit_cnt= unit->global_parameters->select_limit+ + select_lex->offset_limit; + if (unit->select_limit_cnt < unit->global_parameters->select_limit) + unit->select_limit_cnt= HA_POS_ERROR; // no limit + if (unit->select_limit_cnt == HA_POS_ERROR) + select_lex->options&= ~OPTION_FOUND_ROWS; join= new JOIN(thd, select_lex->item_list, select_lex->options, result); this->select_lex= select_lex; maybe_null= 1; @@ -141,9 +148,9 @@ int Item_subselect::exec() join->thd->lex.select= select_lex; join->exec(); join->thd->lex.select= save_select; - if (!executed) + //if (!executed) //No rows returned => value is null (returned as inited) - executed= 1; + // executed= 1; return join->error; } return 0; diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 751e4d25d41..975d36069f9 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -784,9 +784,15 @@ select_subselect::select_subselect(Item_subselect *item) bool select_subselect::send_data(List &items) { + DBUG_ENTER("select_subselect::send_data"); if (item->executed){ my_printf_error(ER_SUBSELECT_NO_1_ROW, ER(ER_SUBSELECT_NO_1_ROW), MYF(0)); - return 1; + DBUG_RETURN(1); + } + if (unit->offset_limit_cnt) + { // using limit offset,count + unit->offset_limit_cnt--; + DBUG_RETURN(0); } Item *val_item= (Item *)item->select_lex->item_list.head(); if ((item->null_value= val_item->is_null())) @@ -801,5 +807,6 @@ bool select_subselect::send_data(List &items) item->real_value= val_item->val(); item->res_type= val_item->result_type(); } - return 0; + item->executed= 1; + DBUG_RETURN(0); } diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 6affc0199a5..3492854329a 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1275,9 +1275,10 @@ mysql_execute_command(void) break; // Error message is given } - unit->offset_limit_cnt =select_lex->offset_limit; - unit->select_limit_cnt =select_lex->select_limit+select_lex->offset_limit; - if (unit->select_limit_cnt < select_lex->select_limit) + unit->offset_limit_cnt= unit->global_parameters->offset_limit; + unit->select_limit_cnt= unit->global_parameters->select_limit+ + unit->global_parameters->offset_limit; + if (unit->select_limit_cnt < unit->global_parameters->select_limit) unit->select_limit_cnt= HA_POS_ERROR; // no limit if (unit->select_limit_cnt == HA_POS_ERROR) select_lex->options&= ~OPTION_FOUND_ROWS; @@ -2672,7 +2673,7 @@ mysql_init_query(THD *thd) thd->lex.unit.init_select(); thd->lex.select_lex.init_query(); thd->lex.unit.slave= &thd->lex.select_lex; - thd->lex.unit.select_limit= thd->default_select_limit; //Global limit + thd->lex.unit.global_parameters= &thd->lex.select_lex; //Global limit & order thd->lex.select_lex.master= &thd->lex.unit; thd->lex.select_lex.prev= &thd->lex.unit.slave; thd->lex.value_list.empty(); -- cgit v1.2.1 From 58e4105b62cbc8080a67fc9f6e6f9c9de75142af Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 31 May 2002 21:04:47 +0500 Subject: Added filling of unicode mapping arrays during charset.conf loading All charset.conf files were extended to supply unicode mapping array CONVERT() now uses more common order of arguments: CONVERT(expr,charset_from,charset_to) Dynamic charset can be used as CONVERT() argument mysys/charset.c: Added filling of unicode mapping arrays during charset.conf loading sql/share/charsets/armscii8.conf: Added filling of unicode mapping arrays during charset.conf loading sql/share/charsets/cp1251.conf: Added filling of unicode mapping arrays during charset.conf loading sql/share/charsets/cp1257.conf: Added filling of unicode mapping arrays during charset.conf loading sql/share/charsets/croat.conf: Added filling of unicode mapping arrays during charset.conf loading sql/share/charsets/danish.conf: Added filling of unicode mapping arrays during charset.conf loading sql/share/charsets/dec8.conf: Added filling of unicode mapping arrays during charset.conf loading sql/share/charsets/dos.conf: Added filling of unicode mapping arrays during charset.conf loading sql/share/charsets/estonia.conf: Added filling of unicode mapping arrays during charset.conf loading sql/share/charsets/german1.conf: Added filling of unicode mapping arrays during charset.conf loading sql/share/charsets/greek.conf: Added filling of unicode mapping arrays during charset.conf loading sql/share/charsets/hebrew.conf: Added filling of unicode mapping arrays during charset.conf loading sql/share/charsets/hp8.conf: Added filling of unicode mapping arrays during charset.conf loading sql/share/charsets/hungarian.conf: Added filling of unicode mapping arrays during charset.conf loading sql/share/charsets/koi8_ru.conf: Added filling of unicode mapping arrays during charset.conf loading sql/share/charsets/koi8_ukr.conf: Added filling of unicode mapping arrays during charset.conf loading sql/share/charsets/latin1.conf: Added filling of unicode mapping arrays during charset.conf loading sql/share/charsets/latin2.conf: Added filling of unicode mapping arrays during charset.conf loading sql/share/charsets/latin5.conf: Added filling of unicode mapping arrays during charset.conf loading sql/share/charsets/swe7.conf: Added filling of unicode mapping arrays during charset.conf loading sql/share/charsets/usa7.conf: Added filling of unicode mapping arrays during charset.conf loading sql/share/charsets/win1250.conf: Added filling of unicode mapping arrays during charset.conf loading sql/share/charsets/win1251.conf: Added filling of unicode mapping arrays during charset.conf loading sql/share/charsets/win1251ukr.conf: Added filling of unicode mapping arrays during charset.conf loading sql/sql_yacc.yy: Changed the order of arguments to Convert(expr,charset_from,charset_to) Dynamic charsets are now resolved too for Convert() arguments --- mysys/charset.c | 33 ++++++++++++++++++++++++++++----- sql/share/charsets/armscii8.conf | 19 +++++++++++++++++++ sql/share/charsets/cp1251.conf | 19 +++++++++++++++++++ sql/share/charsets/cp1257.conf | 18 ++++++++++++++++++ sql/share/charsets/croat.conf | 18 ++++++++++++++++++ sql/share/charsets/danish.conf | 18 ++++++++++++++++++ sql/share/charsets/dec8.conf | 19 +++++++++++++++++++ sql/share/charsets/dos.conf | 19 +++++++++++++++++++ sql/share/charsets/estonia.conf | 18 ++++++++++++++++++ sql/share/charsets/german1.conf | 18 ++++++++++++++++++ sql/share/charsets/greek.conf | 18 ++++++++++++++++++ sql/share/charsets/hebrew.conf | 18 ++++++++++++++++++ sql/share/charsets/hp8.conf | 19 +++++++++++++++++++ sql/share/charsets/hungarian.conf | 18 ++++++++++++++++++ sql/share/charsets/koi8_ru.conf | 19 +++++++++++++++++++ sql/share/charsets/koi8_ukr.conf | 18 ++++++++++++++++++ sql/share/charsets/latin1.conf | 18 ++++++++++++++++++ sql/share/charsets/latin2.conf | 18 ++++++++++++++++++ sql/share/charsets/latin5.conf | 18 ++++++++++++++++++ sql/share/charsets/swe7.conf | 18 ++++++++++++++++++ sql/share/charsets/usa7.conf | 18 ++++++++++++++++++ sql/share/charsets/win1250.conf | 18 ++++++++++++++++++ sql/share/charsets/win1251.conf | 18 ++++++++++++++++++ sql/share/charsets/win1251ukr.conf | 18 ++++++++++++++++++ sql/sql_yacc.yy | 4 ++-- 25 files changed, 450 insertions(+), 7 deletions(-) diff --git a/mysys/charset.c b/mysys/charset.c index de6ccbf7ea9..5bc2f65468d 100644 --- a/mysys/charset.c +++ b/mysys/charset.c @@ -36,6 +36,7 @@ static int charset_initialized=0; #define TO_LOWER_TABLE_SIZE 256 #define TO_UPPER_TABLE_SIZE 256 #define SORT_ORDER_TABLE_SIZE 256 +#define TO_UNI_TABLE_SIZE 256 struct simpleconfig_buf_st { FILE *f; @@ -214,6 +215,21 @@ static my_bool fill_array(uchar *array, int sz, struct simpleconfig_buf_st *fb) return 0; } +static my_bool fill_uint16_array(uint16 *array, int sz, struct simpleconfig_buf_st *fb) +{ + char buf[MAX_LINE]; + while (sz--) + { + if (get_word(fb, buf)) + { + DBUG_PRINT("error",("get_word failed, expecting %d more words", sz + 1)); + return 1; + } + *array++ = (uint16) strtol(buf, NULL, 16); + } + return 0; +} + static void get_charset_conf_name(uint cs_number, char *buf) { @@ -247,7 +263,8 @@ static my_bool read_charset_file(uint cs_number, CHARSET_INFO *set, if (fill_array(set->ctype, CTYPE_TABLE_SIZE, &fb) || fill_array(set->to_lower, TO_LOWER_TABLE_SIZE, &fb) || fill_array(set->to_upper, TO_UPPER_TABLE_SIZE, &fb) || - fill_array(set->sort_order, SORT_ORDER_TABLE_SIZE, &fb)) + fill_array(set->sort_order, SORT_ORDER_TABLE_SIZE, &fb) || + fill_uint16_array(set->tab_to_uni,TO_UNI_TABLE_SIZE,&fb)) result=TRUE; my_fclose(fb.f, MYF(0)); @@ -299,10 +316,11 @@ static CHARSET_INFO *find_charset_by_name(CHARSET_INFO **table, static CHARSET_INFO *add_charset(uint cs_number, const char *cs_name, myf flags) { CHARSET_INFO tmp_cs,*cs; - uchar tmp_ctype[CTYPE_TABLE_SIZE]; - uchar tmp_to_lower[TO_LOWER_TABLE_SIZE]; - uchar tmp_to_upper[TO_UPPER_TABLE_SIZE]; - uchar tmp_sort_order[SORT_ORDER_TABLE_SIZE]; + uchar tmp_ctype[CTYPE_TABLE_SIZE]; + uchar tmp_to_lower[TO_LOWER_TABLE_SIZE]; + uchar tmp_to_upper[TO_UPPER_TABLE_SIZE]; + uchar tmp_sort_order[SORT_ORDER_TABLE_SIZE]; + uint16 tmp_to_uni[TO_UNI_TABLE_SIZE]; /* Don't allocate memory if we are not sure we can find the char set */ cs= &tmp_cs; @@ -311,6 +329,7 @@ static CHARSET_INFO *add_charset(uint cs_number, const char *cs_name, myf flags) cs->to_lower=tmp_to_lower; cs->to_upper=tmp_to_upper; cs->sort_order=tmp_sort_order; + cs->tab_to_uni=tmp_to_uni; if (read_charset_file(cs_number, cs, flags)) return NULL; @@ -322,6 +341,7 @@ static CHARSET_INFO *add_charset(uint cs_number, const char *cs_name, myf flags) cs->to_lower = (uchar*) my_once_alloc(TO_LOWER_TABLE_SIZE, MYF(MY_WME)); cs->to_upper = (uchar*) my_once_alloc(TO_UPPER_TABLE_SIZE, MYF(MY_WME)); cs->sort_order=(uchar*) my_once_alloc(SORT_ORDER_TABLE_SIZE, MYF(MY_WME)); + cs->tab_to_uni=(uint16*)my_once_alloc(TO_UNI_TABLE_SIZE*sizeof(uint16), MYF(MY_WME)); cs->number = cs_number; memcpy((char*) cs->name, (char*) cs_name, strlen(cs_name) + 1); memcpy((char*) cs->ctype, (char*) tmp_ctype, sizeof(tmp_ctype)); @@ -329,6 +349,7 @@ static CHARSET_INFO *add_charset(uint cs_number, const char *cs_name, myf flags) memcpy((char*) cs->to_upper, (char*) tmp_to_upper, sizeof(tmp_to_upper)); memcpy((char*) cs->sort_order, (char*) tmp_sort_order, sizeof(tmp_sort_order)); + memcpy((char*) cs->tab_to_uni, (char*) tmp_to_uni, sizeof(tmp_to_uni)); cs->caseup_str = my_caseup_str_8bit; cs->casedn_str = my_casedn_str_8bit; @@ -336,6 +357,8 @@ static CHARSET_INFO *add_charset(uint cs_number, const char *cs_name, myf flags) cs->casedn = my_casedn_8bit; cs->strcasecmp = my_strcasecmp_8bit; cs->strncasecmp = my_strncasecmp_8bit; + cs->mb_wc = my_mb_wc_8bit; + cs->wc_mb = my_wc_mb_8bit; insert_dynamic(&cs_info_table, (gptr) &cs); return cs; diff --git a/sql/share/charsets/armscii8.conf b/sql/share/charsets/armscii8.conf index 15c232c7e94..54d2d0fec47 100644 --- a/sql/share/charsets/armscii8.conf +++ b/sql/share/charsets/armscii8.conf @@ -72,3 +72,22 @@ D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + + +# Unicode mapping (256 elements) +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F +0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F +0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F +0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008A 008B 008C 008D 008E 008F +0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009A 009B 009C 009D 009E 009F +00A0 2741 00A7 0589 0029 0028 00BB 00AB 2014 002E 055D 002C 002D 055F 2026 055C +055B 055E 0531 0561 0532 0562 0533 0563 0534 0564 0535 0565 0536 0566 0537 0567 +0538 0568 0539 0569 053A 056A 053B 056B 053C 056C 053D 056D 053E 056E 053F 056F +0540 0570 0541 0571 0542 0572 0543 0573 0544 0574 0545 0575 0546 0576 0547 0577 +0548 0578 0549 0579 054A 057A 054B 057B 054C 057C 054D 057D 054E 057E 054F 057F +0550 0580 0551 0581 0552 0582 0553 0583 0554 0584 0555 0585 0556 0586 2019 0027 diff --git a/sql/share/charsets/cp1251.conf b/sql/share/charsets/cp1251.conf index 6af97c891b8..4418bf48289 100644 --- a/sql/share/charsets/cp1251.conf +++ b/sql/share/charsets/cp1251.conf @@ -72,3 +72,22 @@ 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 5B 5C 5D 5E 5F 60 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B + + +# Unicode mapping (256 elements) +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F +0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F +0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F +0402 0403 201A 0453 201E 2026 2020 2021 003F 2030 0409 2039 040A 040C 040B 040F +0452 2018 2019 201C 201D 2022 2013 2014 003F 2122 0459 203A 045A 045C 045B 045F +00A0 040E 045E 0408 00A4 0490 00A6 00A7 0401 00A9 0404 00AB 00AC 00AD 00AE 0407 +00B0 00B1 0406 0456 0491 00B5 00B6 00B7 0451 2116 0454 00BB 0458 0405 0455 0457 +0410 0411 0412 0413 0414 0415 0416 0417 0418 0419 041A 041B 041C 041D 041E 041F +0420 0421 0422 0423 0424 0425 0426 0427 0428 0429 042A 042B 042C 042D 042E 042F +0430 0431 0432 0433 0434 0435 0436 0437 0438 0439 043A 043B 043C 043D 043E 043F +0440 0441 0442 0443 0444 0445 0446 0447 0448 0449 044A 044B 044C 044D 044E 044F diff --git a/sql/share/charsets/cp1257.conf b/sql/share/charsets/cp1257.conf index 610ed5a646f..b0e89bb67c4 100644 --- a/sql/share/charsets/cp1257.conf +++ b/sql/share/charsets/cp1257.conf @@ -72,3 +72,21 @@ 5A FF FF FF FF FF FF FF 5E FF FF 5D FF FF FF FF FF 4F FF FF FF FF 48 FF 45 FF FF 49 FF FF FF FF 5A FF FF FF FF FF FF FF 5E FF FF 5D FF FF FF FF + +# Unicode mapping (256 elements) +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F +0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F +0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F +20AC 003F 201A 003F 201E 2026 2020 2021 003F 2030 003F 2039 003F 00A8 02C7 00B8 +003F 2018 2019 201C 201D 2022 2013 2014 003F 2122 003F 203A 003F 00AF 02DB 003F +00A0 003F 00A2 00A3 00A4 003F 00A6 00A7 00D8 00A9 0156 00AB 00AC 00AD 00AE 00C6 +00B0 00B1 00B2 00B3 00B4 00B5 00B6 00B7 00F8 00B9 0157 00BB 00BC 00BD 00BE 00E6 +0104 012E 0100 0106 00C4 00C5 0118 0112 010C 00C9 0179 0116 0122 0136 012A 013B +0160 0143 0145 00D3 014C 00D5 00D6 00D7 0172 0141 015A 016A 00DC 017B 017D 00DF +0105 012F 0101 0107 00E4 00E5 0119 0113 010D 00E9 017A 0117 0123 0137 012B 013C +0161 0144 0146 00F3 014D 00F5 00F6 00F7 0173 0142 015B 016B 00FC 017C 017E 02D9 diff --git a/sql/share/charsets/croat.conf b/sql/share/charsets/croat.conf index fbbe3328547..bc8c1a376eb 100644 --- a/sql/share/charsets/croat.conf +++ b/sql/share/charsets/croat.conf @@ -72,3 +72,21 @@ 47 4E 4F 4F 4F 4F 5D D7 D8 55 55 55 59 59 DE DF 41 41 41 41 5C 5B 45 43 44 45 45 45 49 49 49 49 47 4E 4F 4F 4F 4F 5D F7 D8 55 55 55 59 59 DE FF + +# Unicode mapping (256 elements) +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F +0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F +0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F +0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008A 008B 008C 008D 008E 008F +0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009A 009B 009C 009D 009E 009F +00A0 0104 02D8 0141 00A4 013D 015A 00A7 00A8 0160 015E 0164 0179 00AD 017D 017B +00B0 0105 02DB 0142 00B4 013E 015B 02C7 00B8 0161 015F 0165 017A 02DD 017E 017C +0154 00C1 00C2 0102 00C4 0139 0106 00C7 010C 00C9 0118 00CB 011A 00CD 00CE 010E +0110 0143 0147 00D3 00D4 0150 00D6 00D7 0158 016E 00DA 0170 00DC 00DD 0162 00DF +0155 00E1 00E2 0103 00E4 013A 0107 00E7 010D 00E9 0119 00EB 011B 00ED 00EE 010F +0111 0144 0148 00F3 00F4 0151 00F6 00F7 0159 016F 00FA 0171 00FC 00FD 0163 02D9 diff --git a/sql/share/charsets/danish.conf b/sql/share/charsets/danish.conf index f99590ed6f3..1543a64d7c3 100644 --- a/sql/share/charsets/danish.conf +++ b/sql/share/charsets/danish.conf @@ -72,3 +72,21 @@ 44 4E 4F 4F 4F 4F 5C D7 5C 55 55 55 59 59 DE DF 41 41 41 41 5B 5D 5B 43 45 45 45 45 49 49 49 49 44 4E 4F 4F 4F 4F 5C F7 5C 55 55 55 59 59 DE FF + +# Unicode mapping (256 elements) +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F +0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F +0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F +0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008A 008B 008C 008D 008E 008F +0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009A 009B 009C 009D 009E 009F +00A0 00A1 00A2 00A3 00A4 00A5 00A6 00A7 00A8 00A9 00AA 00AB 00AC 00AD 00AE 00AF +00B0 00B1 00B2 00B3 00B4 00B5 00B6 00B7 00B8 00B9 00BA 00BB 00BC 00BD 00BE 00BF +00C0 00C1 00C2 00C3 00C4 00C5 00C6 00C7 00C8 00C9 00CA 00CB 00CC 00CD 00CE 00CF +00D0 00D1 00D2 00D3 00D4 00D5 00D6 00D7 00D8 00D9 00DA 00DB 00DC 00DD 00DE 00DF +00E0 00E1 00E2 00E3 00E4 00E5 00E6 00E7 00E8 00E9 00EA 00EB 00EC 00ED 00EE 00EF +00F0 00F1 00F2 00F3 00F4 00F5 00F6 00F7 00F8 00F9 00FA 00FB 00FC 00FD 00FE 00FF diff --git a/sql/share/charsets/dec8.conf b/sql/share/charsets/dec8.conf index a4849aaa04c..87af7071f8c 100644 --- a/sql/share/charsets/dec8.conf +++ b/sql/share/charsets/dec8.conf @@ -72,3 +72,22 @@ 44 4E 4F 4F 4F 4F 5D D7 D8 55 55 55 59 59 DE DF 41 41 41 41 5C 5B 5C 43 45 45 45 45 49 49 49 49 44 4E 4F 4F 4F 4F 5D F7 D8 55 55 55 59 59 DE FF + +# Unicode mapping (256 elements) +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F +0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F +0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F +0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008A 008B 008C 008D 008E 008F +0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009A 009B 009C 009D 009E 009F +00A0 00A1 00A2 00A3 003F 00A5 003F 00A7 00A4 00A9 00AA 00AB 003F 003F 003F 003F +00B0 00B1 00B2 00B3 003F 00B5 00B6 00B7 003F 00B9 00BA 00BB 00BC 00BD 003F 00BF +00C0 00C1 00C2 00C3 00C4 00C5 00C6 00C7 00C8 00C9 00CA 00CB 00CC 00CD 00CE 00CF +003F 00D1 00D2 00D3 00D4 00D5 00D6 0152 00D8 00D9 00DA 00DB 00DC 0178 003F 00DF +00E0 00E1 00E2 00E3 00E4 00E5 00E6 00E7 00E8 00E9 00EA 00EB 00EC 00ED 00EE 00EF +003F 00F1 00F2 00F3 00F4 00F5 00F6 0153 00F8 00F9 00FA 00FB 00FC 00FF 003F 003F + diff --git a/sql/share/charsets/dos.conf b/sql/share/charsets/dos.conf index dda86d0f3e8..fc4d4cee5c4 100644 --- a/sql/share/charsets/dos.conf +++ b/sql/share/charsets/dos.conf @@ -72,3 +72,22 @@ D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# Unicode mapping (256 elements) + +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f +0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f +0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f +00c7 00fc 00e9 00e2 00e4 00e0 00e5 00e7 00ea 00eb 00e8 00ef 00ee 00ec 00c4 00c5 +00c9 00e6 00c6 00f4 00f6 00f2 00fb 00f9 00ff 00d6 00dc 00a2 00a3 00a5 20a7 0192 +00e1 00ed 00f3 00fa 00f1 00d1 00aa 00ba 00bf 2310 00ac 00bd 00bc 00a1 00ab 00bb +2591 2592 2593 2502 2524 2561 2562 2556 2555 2563 2551 2557 255d 255c 255b 2510 +2514 2534 252c 251c 2500 253c 255e 255f 255a 2554 2569 2566 2560 2550 256c 2567 +2568 2564 2565 2559 2558 2552 2553 256b 256a 2518 250c 2588 2584 258c 2590 2580 +03b1 00df 0393 03c0 03a3 03c3 00b5 03c4 03a6 0398 03a9 03b4 221e 03c6 03b5 2229 +2261 00b1 2265 2264 2320 2321 00f7 2248 00b0 2219 00b7 221a 207f 00b2 25a0 00a0 diff --git a/sql/share/charsets/estonia.conf b/sql/share/charsets/estonia.conf index 76bbc021b0c..0226fd1fe82 100644 --- a/sql/share/charsets/estonia.conf +++ b/sql/share/charsets/estonia.conf @@ -72,3 +72,21 @@ DB C2 C4 C8 CA F2 F6 64 EC BC D8 EA F8 E1 E3 DA 8D B1 89 95 F5 8B A3 A1 97 9D E0 9F A9 B7 AF BB DC C3 C5 C9 CB F3 F7 65 ED BD D9 EB F9 E2 E4 53 + +# Unicode mapping (256 elements) +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F +0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F +0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F +0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008A 008B 008C 008D 008E 008F +0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009A 009B 009C 009D 009E 009F +00A0 201D 00A2 00A3 00A4 201E 00A6 00A7 00D8 00A9 0156 00AB 00AC 00AD 00AE 00C6 +00B0 00B1 00B2 00B3 201C 00B5 00B6 00B7 00F8 00B9 0157 00BB 00BC 00BD 00BE 00E6 +0104 012E 0100 0106 00C4 00C5 0118 0112 010C 00C9 0179 0116 0122 0136 012A 013B +0160 0143 0145 00D3 014C 00D5 00D6 00D7 0172 0141 015A 016A 00DC 017B 017D 00DF +0105 012F 0101 0107 00E4 00E5 0119 0113 010D 00E9 017A 0117 0123 0137 012B 013C +0161 0144 0146 00F3 014D 00F5 00F6 00F7 0173 0142 015B 016B 00FC 017C 017E 2019 diff --git a/sql/share/charsets/german1.conf b/sql/share/charsets/german1.conf index 3090c921ebe..64f27da3499 100644 --- a/sql/share/charsets/german1.conf +++ b/sql/share/charsets/german1.conf @@ -72,3 +72,21 @@ D0 4E 4F 4F 4F 4F 4F D7 4F 55 55 55 55 59 DE 53 41 41 41 41 41 41 41 43 45 45 45 45 49 49 49 49 D0 4E 4F 4F 4F 4F 4F F7 4F 55 55 55 55 59 DE FF + +# Unicode mapping (256 elements) +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F +0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F +0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F +0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008A 008B 008C 008D 008E 008F +0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009A 009B 009C 009D 009E 009F +00A0 00A1 00A2 00A3 00A4 00A5 00A6 00A7 00A8 00A9 00AA 00AB 00AC 00AD 00AE 00AF +00B0 00B1 00B2 00B3 00B4 00B5 00B6 00B7 00B8 00B9 00BA 00BB 00BC 00BD 00BE 00BF +00C0 00C1 00C2 00C3 00C4 00C5 00C6 00C7 00C8 00C9 00CA 00CB 00CC 00CD 00CE 00CF +00D0 00D1 00D2 00D3 00D4 00D5 00D6 00D7 00D8 00D9 00DA 00DB 00DC 00DD 00DE 00DF +00E0 00E1 00E2 00E3 00E4 00E5 00E6 00E7 00E8 00E9 00EA 00EB 00EC 00ED 00EE 00EF +00F0 00F1 00F2 00F3 00F4 00F5 00F6 00F7 00F8 00F9 00FA 00FB 00FC 00FD 00FE 00FF diff --git a/sql/share/charsets/greek.conf b/sql/share/charsets/greek.conf index 73d67d6ee71..3b5108b561b 100644 --- a/sql/share/charsets/greek.conf +++ b/sql/share/charsets/greek.conf @@ -72,3 +72,21 @@ D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 C9 D5 C1 C5 C7 C9 D5 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D3 D3 D4 D5 D6 D7 D8 D9 C9 D5 CF D5 D9 FF + +# Unicode mapping (256 elements) +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F +0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F +0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F +0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008A 008B 008C 008D 008E 008F +0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009A 009B 009C 009D 009E 009F +00A0 02BD 02BC 00A3 003F 003F 00A6 00A7 00A8 00A9 003F 00AB 00AC 00AD 003F 2015 +00B0 00B1 00B2 00B3 0384 0385 0386 00B7 0388 0389 038A 00BB 038C 00BD 038E 038F +0390 0391 0392 0393 0394 0395 0396 0397 0398 0399 039A 039B 039C 039D 039E 039F +03A0 03A1 003F 03A3 03A4 03A5 03A6 03A7 03A8 03A9 03AA 03AB 03AC 03AD 03AE 03AF +03B0 03B1 03B2 03B3 03B4 03B5 03B6 03B7 03B8 03B9 03BA 03BB 03BC 03BD 03BE 03BF +03C0 03C1 03C2 03C3 03C4 03C5 03C6 03C7 03C8 03C9 03CA 03CB 03CC 03CD 03CE 003F diff --git a/sql/share/charsets/hebrew.conf b/sql/share/charsets/hebrew.conf index 6a5f88eb228..0475db02b24 100644 --- a/sql/share/charsets/hebrew.conf +++ b/sql/share/charsets/hebrew.conf @@ -72,3 +72,21 @@ D0 D1 D2 D3 D4 D5 D6 F7 D8 D9 DA DB DC DD DE FF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# Unicode mapping (256 elements) +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F +0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F +0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F +0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008A 008B 008C 008D 008E 008F +0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009A 009B 009C 009D 009E 009F +00A0 003F 00A2 00A3 00A4 00A5 00A6 00A7 00A8 00A9 00D7 00AB 00AC 00AD 00AE 203E +00B0 00B1 00B2 00B3 00B4 00B5 00B6 00B7 00B8 00B9 00F7 00BB 00BC 00BD 00BE 003F +003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F +003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 2017 +05D0 05D1 05D2 05D3 05D4 05D5 05D6 05D7 05D8 05D9 05DA 05DB 05DC 05DD 05DE 05DF +05E0 05E1 05E2 05E3 05E4 05E5 05E6 05E7 05E8 05E9 05EA 003F 003F 003F 003F 003F diff --git a/sql/share/charsets/hp8.conf b/sql/share/charsets/hp8.conf index e9fadacbf76..d0fd37f5f24 100644 --- a/sql/share/charsets/hp8.conf +++ b/sql/share/charsets/hp8.conf @@ -72,3 +72,22 @@ D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# Unicode mapping (256 elements) +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F +0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F +0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F +0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008A 008B 008C 008D 008E 008F +0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009A 009B 009C 009D 009E 009F +00A0 00C0 00C2 00C8 00CA 00CB 00CE 00CF 00B4 02CB 02C6 00A8 02DC 00D9 00DB 20A4 +00AF 00DD 00FD 00B0 00C7 00E7 00D1 00F1 00A1 00BF 00A4 00A3 00A5 00A7 0192 00A2 +00E2 00EA 00F4 00FB 00E1 00E9 00F3 00FA 00E0 00E8 00F2 00F9 00E4 00EB 00F6 00FC +00C5 00EE 00D8 00C6 00E5 00ED 00F8 00E6 00C4 00EC 00D6 00DC 00C9 00EF 00DF 00D4 +00C1 00C3 00E3 00D0 00F0 00CD 00CC 00D3 00D2 00D5 00F5 0160 0161 00DA 0178 00FF +00DE 00FE 00B7 00B5 00B6 00BE 2014 00BC 00BD 00AA 00BA 00AB 25A0 00BB 00B1 003F + diff --git a/sql/share/charsets/hungarian.conf b/sql/share/charsets/hungarian.conf index db58d62575f..dffaff9348d 100644 --- a/sql/share/charsets/hungarian.conf +++ b/sql/share/charsets/hungarian.conf @@ -72,3 +72,21 @@ FF 62 63 64 66 67 67 FF 6D 77 75 78 78 7E 74 FF 64 41 44 45 46 5F 49 4B 4A 4E 51 78 50 56 58 4D FF 62 63 64 66 67 67 FF 6D 77 75 78 78 7E 74 FF + +# Unicode mapping (256 elements) +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F +0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F +0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F +0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008A 008B 008C 008D 008E 008F +0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009A 009B 009C 009D 009E 009F +00A0 0104 02D8 0141 00A4 013D 015A 00A7 00A8 0160 015E 0164 0179 00AD 017D 017B +00B0 0105 02DB 0142 00B4 013E 015B 02C7 00B8 0161 015F 0165 017A 02DD 017E 017C +0154 00C1 00C2 0102 00C4 0139 0106 00C7 010C 00C9 0118 00CB 011A 00CD 00CE 010E +0110 0143 0147 00D3 00D4 0150 00D6 00D7 0158 016E 00DA 0170 00DC 00DD 0162 00DF +0155 00E1 00E2 0103 00E4 013A 0107 00E7 010D 00E9 0119 00EB 011B 00ED 00EE 010F +0111 0144 0148 00F3 00F4 0151 00F6 00F7 0159 016F 00FA 0171 00FC 00FD 0163 02D9 diff --git a/sql/share/charsets/koi8_ru.conf b/sql/share/charsets/koi8_ru.conf index 4cfee67a236..b1d9755173f 100644 --- a/sql/share/charsets/koi8_ru.conf +++ b/sql/share/charsets/koi8_ru.conf @@ -72,3 +72,22 @@ EF FF F0 F1 F2 F3 E6 E1 FC FB E7 F8 FD F9 F7 FA FE DF E0 F6 E3 E4 F4 E2 F5 E8 E9 EA EB EC ED EE EF FF F0 F1 F2 F3 E6 E1 FC FB E7 F8 FD F9 F7 FA + +# Unicode mapping table (256 elements) + +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f +0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f +0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f +2500 2502 250c 2510 2514 2518 251c 2524 252c 2534 253c 2580 2584 2588 258c 2590 +2591 2592 2593 2320 25a0 2219 221a 2248 2264 2265 00a0 2321 00b0 00b2 00b7 00f7 +2550 2551 2552 0451 2553 2554 2555 2556 2557 2558 2559 255a 255b 255c 255d 255e +255f 2560 2561 0401 2562 2563 2564 2565 2566 2567 2568 2569 256a 256b 256c 00a9 +044e 0430 0431 0446 0434 0435 0444 0433 0445 0438 0439 043a 043b 043c 043d 043e +043f 044f 0440 0441 0442 0443 0436 0432 044c 044b 0437 0448 044d 0449 0447 044a +042e 0410 0411 0426 0414 0415 0424 0413 0425 0418 0419 041a 041b 041c 041d 041e +041f 042f 0420 0421 0422 0423 0416 0412 042c 042b 0417 0428 042d 0429 0427 042a diff --git a/sql/share/charsets/koi8_ukr.conf b/sql/share/charsets/koi8_ukr.conf index 3e2c8e27325..5a552900544 100644 --- a/sql/share/charsets/koi8_ukr.conf +++ b/sql/share/charsets/koi8_ukr.conf @@ -72,3 +72,21 @@ 94 A4 95 96 97 98 89 82 A1 A0 8A 9D A2 9E 9C 9F A3 80 81 9B 85 86 99 83 9A 8B 8E 8F 90 91 92 93 94 A4 95 96 97 98 89 82 A1 A0 8A 9D A2 9E 9C 9F + +# Unicode mapping (256 elements) +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F +0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F +0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F +2500 2502 250C 2510 2514 2518 251C 2524 252C 2534 253C 2580 2584 2588 258C 2590 +2591 2592 2593 2320 25A0 2022 221A 2248 2264 2265 00A0 2321 00B0 00B2 00B7 00F7 +2550 2551 2552 0451 0454 2554 0456 0457 2557 2558 2559 255A 255B 0491 255D 255E +255F 2560 2561 0401 0404 2563 0406 0407 2566 2567 2568 2569 256A 0490 256C 00A9 +044E 0430 0431 0446 0434 0435 0444 0433 0445 0438 0439 043A 043B 043C 043D 043E +043F 044F 0440 0441 0442 0443 0436 0432 044C 044B 0437 0448 044D 0449 0447 044A +042E 0410 0411 0426 0414 0415 0424 0413 0425 0418 0419 041A 041B 041C 041D 041E +041F 042F 0420 0421 0422 0423 0416 0412 042C 042B 0417 0428 042D 0429 0427 042A diff --git a/sql/share/charsets/latin1.conf b/sql/share/charsets/latin1.conf index cf974aefa14..7cb5cfb3cfd 100644 --- a/sql/share/charsets/latin1.conf +++ b/sql/share/charsets/latin1.conf @@ -72,3 +72,21 @@ 44 4E 4F 4F 4F 4F 5D D7 D8 55 55 55 59 59 DE DF 41 41 41 41 5C 5B 5C 43 45 45 45 45 49 49 49 49 44 4E 4F 4F 4F 4F 5D F7 D8 55 55 55 59 59 DE FF + +# Unicode mapping (256 elements) +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F +0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F +0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F +0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008A 008B 008C 008D 008E 008F +0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009A 009B 009C 009D 009E 009F +00A0 00A1 00A2 00A3 00A4 00A5 00A6 00A7 00A8 00A9 00AA 00AB 00AC 00AD 00AE 00AF +00B0 00B1 00B2 00B3 00B4 00B5 00B6 00B7 00B8 00B9 00BA 00BB 00BC 00BD 00BE 00BF +00C0 00C1 00C2 00C3 00C4 00C5 00C6 00C7 00C8 00C9 00CA 00CB 00CC 00CD 00CE 00CF +00D0 00D1 00D2 00D3 00D4 00D5 00D6 00D7 00D8 00D9 00DA 00DB 00DC 00DD 00DE 00DF +00E0 00E1 00E2 00E3 00E4 00E5 00E6 00E7 00E8 00E9 00EA 00EB 00EC 00ED 00EE 00EF +00F0 00F1 00F2 00F3 00F4 00F5 00F6 00F7 00F8 00F9 00FA 00FB 00FC 00FD 00FE 00FF diff --git a/sql/share/charsets/latin2.conf b/sql/share/charsets/latin2.conf index cc18c22c0a2..cc21af9faa1 100644 --- a/sql/share/charsets/latin2.conf +++ b/sql/share/charsets/latin2.conf @@ -72,3 +72,21 @@ FF 55 54 57 56 56 56 FF 5A 5F 5F 5F 5F 63 5E FF 5A 43 43 43 43 51 46 45 47 49 4A 49 49 4E 4E 48 FF 55 54 57 56 56 56 FF 5A 5F 5F 5F 5F 63 5E FF + +# Unicode mapping (256 elements) +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F +0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F +0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F +0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008A 008B 008C 008D 008E 008F +0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009A 009B 009C 009D 009E 009F +00A0 0104 02D8 0141 00A4 013D 015A 00A7 00A8 0160 015E 0164 0179 00AD 017D 017B +00B0 0105 02DB 0142 00B4 013E 015B 02C7 00B8 0161 015F 0165 017A 02DD 017E 017C +0154 00C1 00C2 0102 00C4 0139 0106 00C7 010C 00C9 0118 00CB 011A 00CD 00CE 010E +0110 0143 0147 00D3 00D4 0150 00D6 00D7 0158 016E 00DA 0170 00DC 00DD 0162 00DF +0155 00E1 00E2 0103 00E4 013A 0107 00E7 010D 00E9 0119 00EB 011B 00ED 00EE 010F +0111 0144 0148 00F3 00F4 0151 00F6 00F7 0159 016F 00FA 0171 00FC 00FD 0163 02D9 diff --git a/sql/share/charsets/latin5.conf b/sql/share/charsets/latin5.conf index 92fbd2299bb..d603d019ce6 100644 --- a/sql/share/charsets/latin5.conf +++ b/sql/share/charsets/latin5.conf @@ -76,3 +76,21 @@ 49 DB DC DD DE DF 53 E0 E1 E2 E3 E4 5B 4C 58 E5 CC CD CE CF D0 D1 D2 44 D3 D4 D5 D6 D7 D8 D9 DA 49 DB DC DD DE DF 53 FA E1 E2 E3 E4 5B 4B 58 FF + +# Unicode mapping (256 elements) +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F +0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F +0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F +0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008A 008B 008C 008D 008E 008F +0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009A 009B 009C 009D 009E 009F +00A0 00A1 00A2 00A3 00A4 00A5 00A6 00A7 00A8 00A9 00AA 00AB 00AC 00AD 00AE 00AF +00B0 00B1 00B2 00B3 00B4 00B5 00B6 00B7 00B8 00B9 00BA 00BB 00BC 00BD 00BE 00BF +00C0 00C1 00C2 00C3 00C4 00C5 00C6 00C7 00C8 00C9 00CA 00CB 00CC 00CD 00CE 00CF +011E 00D1 00D2 00D3 00D4 00D5 00D6 00D7 00D8 00D9 00DA 00DB 00DC 0130 015E 00DF +00E0 00E1 00E2 00E3 00E4 00E5 00E6 00E7 00E8 00E9 00EA 00EB 00EC 00ED 00EE 00EF +011F 00F1 00F2 00F3 00F4 00F5 00F6 00F7 00F8 00F9 00FA 00FB 00FC 0131 015F 00FF diff --git a/sql/share/charsets/swe7.conf b/sql/share/charsets/swe7.conf index d2de48b4d1c..c68593a351c 100644 --- a/sql/share/charsets/swe7.conf +++ b/sql/share/charsets/swe7.conf @@ -72,3 +72,21 @@ D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# Unicode mapping (256 elements) +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F +00C9 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 00C4 00D6 00C5 00DC 005F +00E9 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 00E4 00F6 00E5 00FC 003F +003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F +003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F +003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F +003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F +003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F +003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F +003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F +003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F diff --git a/sql/share/charsets/usa7.conf b/sql/share/charsets/usa7.conf index b9e7a44c894..45e260870ba 100644 --- a/sql/share/charsets/usa7.conf +++ b/sql/share/charsets/usa7.conf @@ -72,3 +72,21 @@ D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# Unicode mapping (256 elements) +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F +0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F +0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 003F +003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F +003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F +003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F +003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F +003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F +003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F +003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F +003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F diff --git a/sql/share/charsets/win1250.conf b/sql/share/charsets/win1250.conf index 31d253d7381..abe0a9a8702 100644 --- a/sql/share/charsets/win1250.conf +++ b/sql/share/charsets/win1250.conf @@ -72,3 +72,21 @@ 47 53 53 55 55 55 55 D7 58 5C 5C 5C 5C 60 5B 59 58 41 41 41 41 50 45 43 44 49 49 49 49 4D 4D 46 47 53 53 55 55 55 55 F7 58 5C 5C 5C 5C 60 5B FF + +# Unicode mapping table (256 elements) +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F +0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F +0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F +20AC 003F 201A 003F 201E 2026 2020 2021 003F 2030 0160 2039 015A 0164 017D 0179 +003F 2018 2019 201C 201D 2022 2013 2014 003F 2122 0161 203A 015B 0165 017E 017A +00A0 02C7 02D8 0141 00A4 0104 00A6 00A7 00A8 00A9 015E 00AB 00AC 00AD 00AE 017B +00B0 00B1 02DB 0142 00B4 00B5 00B6 00B7 00B8 0105 015F 00BB 013D 02DD 013E 017C +0154 00C1 00C2 0102 00C4 0139 0106 00C7 010C 00C9 0118 00CB 011A 00CD 00CE 010E +0110 0143 0147 00D3 00D4 0150 00D6 00D7 0158 016E 00DA 0170 00DC 00DD 0162 00DF +0155 00E1 00E2 0103 00E4 013A 0107 00E7 010D 00E9 0119 00EB 011B 00ED 00EE 010F +0111 0144 0148 00F3 00F4 0151 00F6 00F7 0159 016F 00FA 0171 00FC 00FD 0163 02D9 diff --git a/sql/share/charsets/win1251.conf b/sql/share/charsets/win1251.conf index a5ccc3190ad..55f688f59b9 100644 --- a/sql/share/charsets/win1251.conf +++ b/sql/share/charsets/win1251.conf @@ -80,3 +80,21 @@ D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 C0 C1 C2 C3 C4 C5 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 + +# Unicode mapping (256 elements) +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F +0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F +0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F +0402 0403 201A 0453 201E 2026 2020 2021 003F 2030 0409 2039 040A 040C 040B 040F +0452 2018 2019 201C 201D 2022 2013 2014 003F 2122 0459 203A 045A 045C 045B 045F +00A0 040E 045E 0408 00A4 0490 00A6 00A7 0401 00A9 0404 00AB 00AC 00AD 00AE 0407 +00B0 00B1 0406 0456 0491 00B5 00B6 00B7 0451 2116 0454 00BB 0458 0405 0455 0457 +0410 0411 0412 0413 0414 0415 0416 0417 0418 0419 041A 041B 041C 041D 041E 041F +0420 0421 0422 0423 0424 0425 0426 0427 0428 0429 042A 042B 042C 042D 042E 042F +0430 0431 0432 0433 0434 0435 0436 0437 0438 0439 043A 043B 043C 043D 043E 043F +0440 0441 0442 0443 0444 0445 0446 0447 0448 0449 044A 044B 044C 044D 044E 044F diff --git a/sql/share/charsets/win1251ukr.conf b/sql/share/charsets/win1251ukr.conf index e693958910e..2fbab363e5e 100644 --- a/sql/share/charsets/win1251ukr.conf +++ b/sql/share/charsets/win1251ukr.conf @@ -75,3 +75,21 @@ 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 80 81 82 83 85 86 89 8A 8B 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 + +# Unicode mapping (256 elements) +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F +0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F +0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F +0402 0403 201A 0453 201E 2026 2020 2021 003F 2030 0409 2039 040A 040C 040B 040F +0452 2018 2019 201C 201D 2022 2013 2014 003F 2122 0459 203A 045A 045C 045B 045F +00A0 040E 045E 0408 00A4 0490 00A6 00A7 0401 00A9 0404 00AB 00AC 00AD 00AE 0407 +00B0 00B1 0406 0456 0491 00B5 00B6 00B7 0451 2116 0454 00BB 0458 0405 0455 0457 +0410 0411 0412 0413 0414 0415 0416 0417 0418 0419 041A 041B 041C 041D 041E 041F +0420 0421 0422 0423 0424 0425 0426 0427 0428 0429 042A 042B 042C 042D 042E 042F +0430 0431 0432 0433 0434 0435 0436 0437 0438 0439 043A 043B 043C 043D 043E 043F +0440 0441 0442 0443 0444 0445 0446 0447 0448 0449 044A 044B 044C 044D 044E 044F diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 756afbd7a09..61d97cb43f2 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1718,7 +1718,7 @@ simple_expr: | CONVERT_SYM '(' expr ',' cast_type ')' { $$= create_func_cast($3, $5); } | CONVERT_SYM '(' expr USING IDENT ')' { - CHARSET_INFO *cs=find_compiled_charset_by_name($5.str); + CHARSET_INFO *cs=get_charset_by_name($5.str,MYF(MY_WME)); if (!cs) { net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$5); @@ -1728,7 +1728,7 @@ simple_expr: } | CONVERT_SYM '(' expr ',' expr ',' expr ')' { - $$= new Item_func_conv_charset3($3,$5,$7); + $$= new Item_func_conv_charset3($3,$7,$5); } | FUNC_ARG0 '(' ')' { $$= ((Item*(*)(void))($1.symbol->create_func))();} -- cgit v1.2.1 From a532bfb2ea0a0d1cfc0c8d25e6a18cf5a8c0c5bc Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 1 Jun 2002 23:35:36 +0300 Subject: new subselect tests LIMIT fixed AVG & STD with subselect fixed join_free fixed to be depended queries compatible sort_default removed from SELECT_LEX mysql-test/r/subselect.result: new subselect tests mysql-test/t/subselect.test: new subselect tests sql/item.cc: marking as depended _ALL_ subselects under select from wich depend sql/item_subselect.cc: limit fixed TODO added sql/sql_class.cc: AVG & STD function with subselects fixed sql/sql_lex.h: sort_default removed sql/sql_parse.cc: limit fixed sql/sql_select.cc: fixed to be subselect compatible sql/sql_yacc.yy: sort_default removed --- mysql-test/r/subselect.result | 31 +++++++++++++++++++++++++++++-- mysql-test/t/subselect.test | 8 +++++++- sql/item.cc | 29 +++++++++++++++++++---------- sql/item_subselect.cc | 6 ++---- sql/sql_class.cc | 11 ++++++++--- sql/sql_lex.h | 1 - sql/sql_parse.cc | 10 +++++----- sql/sql_select.cc | 7 +++++-- sql/sql_yacc.yy | 1 - 9 files changed, 75 insertions(+), 29 deletions(-) diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index 64ceea72498..2e40d0a92d8 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -1,3 +1,6 @@ +select (select 2); +(select 2) +2 drop table if exists t1,t2,t3,t4; create table t1 (a int); create table t2 (a int, b int); @@ -26,18 +29,42 @@ select * from t2 where t2.a=(select a from t1); a b 2 7 insert into t3 values (6),(7),(3); -select * from t2 where t2.b=(select a from t3 order by 1 limit 1); +select * from t2 where t2.b=(select a from t3 order by 1 desc limit 1); a b 1 7 2 7 -select * from t2 where t2.b=(select a from t3 order by 1 limit 1) +select * from t2 where t2.b=(select a from t3 order by 1 desc limit 1) union (select * from t4 order by a limit 2) limit 3; a b 1 7 2 7 3 8 +select * from t2 where t2.b=(select a from t3 order by 1 desc limit 1) +union (select * from t4 where t4.b=(select max(t2.a)*4 from t2) order by a); +a b +1 7 +2 7 +3 8 +4 8 select (select a from t3 where a1) as tt; +(select t3.a from t3 where a<8 order by 1 desc limit 1) a +7 2 +select * from t1 where t1.a=(select t2.a from t2 where t2.b=(select max(a) from t3) order by 1 desc limit 1); +a +2 +select * from t1 where t1.a=(select t2.a from t2 where t2.b=(select max(a) from t3 where t3.a > t1.a) order by 1 desc limit 1); +a +2 +select * from t1 where t1.a=(select t2.a from t2 where t2.b=(select max(a) from t3 where t3.a < t1.a) order by 1 desc limit 1); +a +select b,(select avg(t2.a+(select min(t3.a) from t3 where t3.a >= t4.a)) from t2) from t4; +b (select avg(t2.a+(select min(t3.a) from t3 where t3.a >= t4.a)) from t2) +8 7.5000 +8 6.0000 +9 5.5000 drop table t1,t2,t3,t4; diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 7383608ed9e..c94522fde8f 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -1,5 +1,5 @@ -#select (select 2); +select (select 2); drop table if exists t1,t2,t3,t4; create table t1 (a int); create table t2 (a int, b int); @@ -17,7 +17,13 @@ insert into t3 values (6),(7),(3); select * from t2 where t2.b=(select a from t3 order by 1 desc limit 1); select * from t2 where t2.b=(select a from t3 order by 1 desc limit 1) union (select * from t4 order by a limit 2) limit 3; +select * from t2 where t2.b=(select a from t3 order by 1 desc limit 1) +union (select * from t4 where t4.b=(select max(t2.a)*4 from t2) order by a); select (select a from t3 where a1) as tt; +select * from t1 where t1.a=(select t2.a from t2 where t2.b=(select max(a) from t3) order by 1 desc limit 1); +select * from t1 where t1.a=(select t2.a from t2 where t2.b=(select max(a) from t3 where t3.a > t1.a) order by 1 desc limit 1); +select * from t1 where t1.a=(select t2.a from t2 where t2.b=(select max(a) from t3 where t3.a < t1.a) order by 1 desc limit 1); +select b,(select avg(t2.a+(select min(t3.a) from t3 where t3.a >= t4.a)) from t2) from t4; drop table t1,t2,t3,t4; diff --git a/sql/item.cc b/sql/item.cc index 8a785ee3902..45564bcd98e 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -330,23 +330,32 @@ bool Item_field::fix_fields(THD *thd,TABLE_LIST *tables) mention of table name, but if we join tables in one list it will cause error ER_NON_UNIQ_ERROR in find_field_in_tables. */ + SELECT_LEX *last; for (SELECT_LEX *sl= thd->lex.select->outer_select(); sl && !tmp; sl= sl->outer_select()) tmp=find_field_in_tables(thd, this, - (TABLE_LIST*)sl->table_list.first); + (TABLE_LIST*)(last= sl)->table_list.first); if (!tmp) return 1; else - if( !thd->lex.select->depended ) - { - thd->lex.select->depended= 1; //Select is depended of outer select(s) - //Tables will be reopened many times - for (TABLE_LIST *tbl= (TABLE_LIST*)thd->lex.select->table_list.first; - tbl; - tbl= tbl->next) - tbl->shared= 1; - } + /* + Mark all selects from resolved to 1 before select where was + found table as depended (of select where was found table) + */ + for (SELECT_LEX *s= thd->lex.select; + s &&s != last; + s= s->outer_select()) + if( !s->depended ) + { + s->depended= 1; //Select is depended of outer select + //Tables will be reopened many times + for (TABLE_LIST *tbl= + (TABLE_LIST*)s->table_list.first; + tbl; + tbl= tbl->next) + tbl->shared= 1; + } } set_field(tmp); } diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 72bbbcba5a7..e18c8d78830 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -23,6 +23,7 @@ SUBSELECT TODO: - remove double 'having' & 'having_list' from JOIN (sql_select.h/sql_select.cc) + - subselect in HAVING clause - add subselect union select (sql_union.cc) */ @@ -43,7 +44,7 @@ Item_subselect::Item_subselect(THD *thd, st_select_lex *select_lex): SELECT_LEX_UNIT *unit= select_lex->master_unit(); unit->offset_limit_cnt= unit->global_parameters->offset_limit; unit->select_limit_cnt= unit->global_parameters->select_limit+ - select_lex->offset_limit; + unit->global_parameters ->offset_limit; if (unit->select_limit_cnt < unit->global_parameters->select_limit) unit->select_limit_cnt= HA_POS_ERROR; // no limit if (unit->select_limit_cnt == HA_POS_ERROR) @@ -148,9 +149,6 @@ int Item_subselect::exec() join->thd->lex.select= select_lex; join->exec(); join->thd->lex.select= save_select; - //if (!executed) - //No rows returned => value is null (returned as inited) - // executed= 1; return join->error; } return 0; diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 975d36069f9..d3bd957c308 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -790,11 +790,17 @@ bool select_subselect::send_data(List &items) DBUG_RETURN(1); } if (unit->offset_limit_cnt) - { // using limit offset,count + { // Using limit offset,count unit->offset_limit_cnt--; DBUG_RETURN(0); } - Item *val_item= (Item *)item->select_lex->item_list.head(); + List_iterator_fast li(items); + Item *val_item= li++; // Only one (single value subselect) + /* + Following val() call have to be first, because function AVG() & STD() + calculate value on it & determinate "is it NULL?". + */ + item->real_value= val_item->val(); if ((item->null_value= val_item->is_null())) { item->assign_null(); @@ -804,7 +810,6 @@ bool select_subselect::send_data(List &items) item->binary= val_item->binary; val_item->val_str(&item->str_value); item->int_value= val_item->val_int(); - item->real_value= val_item->val(); item->res_type= val_item->result_type(); } item->executed= 1; diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 5c113e46a2b..47bbfea3030 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -194,7 +194,6 @@ protected: public: ulong options; enum sub_select_type linkage; - //uint sort_default; SQL_LIST order_list; /* ORDER clause */ ha_rows select_limit, offset_limit; /* LIMIT clause parameters */ void init_query(); diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 3492854329a..ab49645dbae 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2690,12 +2690,12 @@ mysql_init_query(THD *thd) void mysql_init_select(LEX *lex) { - SELECT_LEX *select_lex = lex->select; + SELECT_LEX *select_lex= lex->select; select_lex->init_select(); - select_lex->select_limit=lex->thd->default_select_limit; - select_lex->offset_limit=0; - lex->exchange = 0; - lex->proc_list.first=0; + select_lex->master_unit()->select_limit= select_lex->select_limit= + lex->thd->default_select_limit; + lex->exchange= 0; + lex->proc_list.first= 0; } bool diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 4748e857276..62418a12497 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -607,9 +607,10 @@ JOIN::reinit() unit->select_limit_cnt= HA_POS_ERROR; // no limit if (unit->select_limit_cnt == HA_POS_ERROR) select_lex->options&= ~OPTION_FOUND_ROWS; - + if (setup_tables(tables_list)) DBUG_RETURN(1); + DBUG_RETURN(0); } @@ -2830,7 +2831,9 @@ join_free(JOIN *join) } end_read_record(&tab->read_record); } - join->table=0; + //TODO: is enough join_free at the end of mysql_select? + if (!join->select_lex->depended) + join->table=0; } // We are not using tables anymore // Unlock all tables. We may be in an INSERT .... SELECT statement. diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index ebd26939ad5..9b95ab05977 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2325,7 +2325,6 @@ order_clause: LEX *lex=Lex; if (lex->sql_command == SQLCOM_MULTI_UPDATE) YYABORT; - /*lex->select->sort_default=1;*/ } order_list order_list: -- cgit v1.2.1 From 7aef75a9a9b3f1965f1989bf224d8c9ba0090f86 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 2 Jun 2002 21:32:02 +0500 Subject: Changed 003F -> 0000 for undefinite characters in charset.conf Charset convertion FROM dynamic charset is now working too Allow dynamic charsets in CONVERT() mysys/charset.c: Charset convertion FROM dynamic charset is now working too sql/item_strfunc.cc: Allow dynamic charsets in CONVERT() sql/share/charsets/cp1251.conf: Change 003F -> 0000 for undefinite characters sql/share/charsets/cp1257.conf: Change 003F -> 0000 for undefinite characters sql/share/charsets/dec8.conf: Change 003F -> 0000 for undefinite characters sql/share/charsets/greek.conf: Change 003F -> 0000 for undefinite characters sql/share/charsets/hebrew.conf: Change 003F -> 0000 for undefinite characters sql/share/charsets/hp8.conf: Change 003F -> 0000 for undefinite characters sql/share/charsets/swe7.conf: Change 003F -> 0000 for undefinite characters sql/share/charsets/usa7.conf: Change 003F -> 0000 for undefinite characters sql/share/charsets/win1250.conf: Change 003F -> 0000 for undefinite characters sql/share/charsets/win1251.conf: Change 003F -> 0000 for undefinite characters sql/share/charsets/win1251ukr.conf: Change 003F -> 0000 for undefinite characters --- mysys/charset.c | 86 ++++++++++++++++++++++++++++++++++++++ sql/item_strfunc.cc | 4 +- sql/share/charsets/cp1251.conf | 4 +- sql/share/charsets/cp1257.conf | 6 +-- sql/share/charsets/dec8.conf | 9 ++-- sql/share/charsets/greek.conf | 7 ++-- sql/share/charsets/hebrew.conf | 11 ++--- sql/share/charsets/hp8.conf | 2 +- sql/share/charsets/swe7.conf | 18 ++++---- sql/share/charsets/usa7.conf | 18 ++++---- sql/share/charsets/win1250.conf | 4 +- sql/share/charsets/win1251.conf | 4 +- sql/share/charsets/win1251ukr.conf | 4 +- 13 files changed, 132 insertions(+), 45 deletions(-) diff --git a/mysys/charset.c b/mysys/charset.c index 5bc2f65468d..d6d0c91b028 100644 --- a/mysys/charset.c +++ b/mysys/charset.c @@ -237,6 +237,91 @@ static void get_charset_conf_name(uint cs_number, char *buf) name_from_csnum(available_charsets, cs_number), ".conf", NullS); } +typedef struct { + int nchars; + MY_UNI_IDX uidx; +} uni_idx; + +#define PLANE_SIZE 0x100 +#define PLANE_NUM 0x100 +#define PLANE_NUMBER(x) (((x)>>8) % PLANE_NUM) + +static int pcmp(const void * f, const void * s) +{ + const uni_idx *F=(const uni_idx*)f; + const uni_idx *S=(const uni_idx*)s; + int res; + + if(!(res=((S->nchars)-(F->nchars)))) + res=((F->uidx.from)-(S->uidx.to)); + return res; +} + +static my_bool create_fromuni(CHARSET_INFO *cs){ + uni_idx idx[PLANE_NUM]; + int i,n; + + /* Clear plane statistics */ + bzero(idx,sizeof(idx)); + + /* Count number of characters in each plane */ + for(i=0;i<0x100;i++) + { + uint16 wc=cs->tab_to_uni[i]; + int pl= PLANE_NUMBER(wc); + + if(wc || !i) + { + if(!idx[pl].nchars) + { + idx[pl].uidx.from=wc; + idx[pl].uidx.to=wc; + }else + { + idx[pl].uidx.from=wcidx[pl].uidx.to?wc:idx[pl].uidx.to; + } + idx[pl].nchars++; + } + } + + /* Sort planes in descending order */ + qsort(&idx,PLANE_NUM,sizeof(uni_idx),&pcmp); + + for(i=0;itab_to_uni[ch]; + if(wc>=idx[i].uidx.from && wc<=idx[i].uidx.to && wc) + { + int ofs=wc-idx[i].uidx.from; + idx[i].uidx.tab[ofs]=ch; + } + } + } + + /* Allocate and fill reverse table for each plane */ + n=i; + cs->tab_from_uni=(MY_UNI_IDX*)my_once_alloc(sizeof(MY_UNI_IDX)*(n+1),MYF(MY_WME)); + for(i=0;itab_from_uni[i]=idx[i].uidx; + + /* Set end-of-list marker */ + bzero(&cs->tab_from_uni[i],sizeof(MY_UNI_IDX)); + return FALSE; +} + static my_bool read_charset_file(uint cs_number, CHARSET_INFO *set, myf myflags) @@ -268,6 +353,7 @@ static my_bool read_charset_file(uint cs_number, CHARSET_INFO *set, result=TRUE; my_fclose(fb.f, MYF(0)); + create_fromuni(set); DBUG_RETURN(result); } diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index e3436ac4641..8f77f736c86 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1860,8 +1860,8 @@ String *Item_func_conv_charset3::val_str(String *str) if (!arg || args[0]->null_value || !to_cs || args[1]->null_value || !from_cs || args[2]->null_value || - !(from_charset=find_compiled_charset_by_name(from_cs->ptr())) || - !(to_charset=find_compiled_charset_by_name(to_cs->ptr()))) + !(from_charset=get_charset_by_name(from_cs->ptr(), MYF(MY_WME))) || + !(to_charset=get_charset_by_name(to_cs->ptr(), MYF(MY_WME)))) { null_value=1; return 0; diff --git a/sql/share/charsets/cp1251.conf b/sql/share/charsets/cp1251.conf index 4418bf48289..653f7d26879 100644 --- a/sql/share/charsets/cp1251.conf +++ b/sql/share/charsets/cp1251.conf @@ -83,8 +83,8 @@ 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F -0402 0403 201A 0453 201E 2026 2020 2021 003F 2030 0409 2039 040A 040C 040B 040F -0452 2018 2019 201C 201D 2022 2013 2014 003F 2122 0459 203A 045A 045C 045B 045F +0402 0403 201A 0453 201E 2026 2020 2021 0000 2030 0409 2039 040A 040C 040B 040F +0452 2018 2019 201C 201D 2022 2013 2014 0000 2122 0459 203A 045A 045C 045B 045F 00A0 040E 045E 0408 00A4 0490 00A6 00A7 0401 00A9 0404 00AB 00AC 00AD 00AE 0407 00B0 00B1 0406 0456 0491 00B5 00B6 00B7 0451 2116 0454 00BB 0458 0405 0455 0457 0410 0411 0412 0413 0414 0415 0416 0417 0418 0419 041A 041B 041C 041D 041E 041F diff --git a/sql/share/charsets/cp1257.conf b/sql/share/charsets/cp1257.conf index b0e89bb67c4..8338f99c83b 100644 --- a/sql/share/charsets/cp1257.conf +++ b/sql/share/charsets/cp1257.conf @@ -82,9 +82,9 @@ 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F -20AC 003F 201A 003F 201E 2026 2020 2021 003F 2030 003F 2039 003F 00A8 02C7 00B8 -003F 2018 2019 201C 201D 2022 2013 2014 003F 2122 003F 203A 003F 00AF 02DB 003F -00A0 003F 00A2 00A3 00A4 003F 00A6 00A7 00D8 00A9 0156 00AB 00AC 00AD 00AE 00C6 +20AC 0000 201A 0000 201E 2026 2020 2021 0000 2030 0000 2039 0000 00A8 02C7 00B8 +0000 2018 2019 201C 201D 2022 2013 2014 0000 2122 0000 203A 0000 00AF 02DB 0000 +00A0 0000 00A2 00A3 00A4 0000 00A6 00A7 00D8 00A9 0156 00AB 00AC 00AD 00AE 00C6 00B0 00B1 00B2 00B3 00B4 00B5 00B6 00B7 00F8 00B9 0157 00BB 00BC 00BD 00BE 00E6 0104 012E 0100 0106 00C4 00C5 0118 0112 010C 00C9 0179 0116 0122 0136 012A 013B 0160 0143 0145 00D3 014C 00D5 00D6 00D7 0172 0141 015A 016A 00DC 017B 017D 00DF diff --git a/sql/share/charsets/dec8.conf b/sql/share/charsets/dec8.conf index 87af7071f8c..d1ffe45032d 100644 --- a/sql/share/charsets/dec8.conf +++ b/sql/share/charsets/dec8.conf @@ -84,10 +84,9 @@ 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008A 008B 008C 008D 008E 008F 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009A 009B 009C 009D 009E 009F -00A0 00A1 00A2 00A3 003F 00A5 003F 00A7 00A4 00A9 00AA 00AB 003F 003F 003F 003F -00B0 00B1 00B2 00B3 003F 00B5 00B6 00B7 003F 00B9 00BA 00BB 00BC 00BD 003F 00BF +00A0 00A1 00A2 00A3 0000 00A5 0000 00A7 00A4 00A9 00AA 00AB 0000 0000 0000 0000 +00B0 00B1 00B2 00B3 0000 00B5 00B6 00B7 0000 00B9 00BA 00BB 00BC 00BD 0000 00BF 00C0 00C1 00C2 00C3 00C4 00C5 00C6 00C7 00C8 00C9 00CA 00CB 00CC 00CD 00CE 00CF -003F 00D1 00D2 00D3 00D4 00D5 00D6 0152 00D8 00D9 00DA 00DB 00DC 0178 003F 00DF +0000 00D1 00D2 00D3 00D4 00D5 00D6 0152 00D8 00D9 00DA 00DB 00DC 0178 0000 00DF 00E0 00E1 00E2 00E3 00E4 00E5 00E6 00E7 00E8 00E9 00EA 00EB 00EC 00ED 00EE 00EF -003F 00F1 00F2 00F3 00F4 00F5 00F6 0153 00F8 00F9 00FA 00FB 00FC 00FF 003F 003F - +0000 00F1 00F2 00F3 00F4 00F5 00F6 0153 00F8 00F9 00FA 00FB 00FC 00FF 0000 0000 diff --git a/sql/share/charsets/greek.conf b/sql/share/charsets/greek.conf index 3b5108b561b..5eb38e2efbe 100644 --- a/sql/share/charsets/greek.conf +++ b/sql/share/charsets/greek.conf @@ -84,9 +84,10 @@ 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008A 008B 008C 008D 008E 008F 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009A 009B 009C 009D 009E 009F -00A0 02BD 02BC 00A3 003F 003F 00A6 00A7 00A8 00A9 003F 00AB 00AC 00AD 003F 2015 +00A0 02BD 02BC 00A3 0000 0000 00A6 00A7 00A8 00A9 0000 00AB 00AC 00AD 0000 2015 00B0 00B1 00B2 00B3 0384 0385 0386 00B7 0388 0389 038A 00BB 038C 00BD 038E 038F 0390 0391 0392 0393 0394 0395 0396 0397 0398 0399 039A 039B 039C 039D 039E 039F -03A0 03A1 003F 03A3 03A4 03A5 03A6 03A7 03A8 03A9 03AA 03AB 03AC 03AD 03AE 03AF +03A0 03A1 0000 03A3 03A4 03A5 03A6 03A7 03A8 03A9 03AA 03AB 03AC 03AD 03AE 03AF 03B0 03B1 03B2 03B3 03B4 03B5 03B6 03B7 03B8 03B9 03BA 03BB 03BC 03BD 03BE 03BF -03C0 03C1 03C2 03C3 03C4 03C5 03C6 03C7 03C8 03C9 03CA 03CB 03CC 03CD 03CE 003F +03C0 03C1 03C2 03C3 03C4 03C5 03C6 03C7 03C8 03C9 03CA 03CB 03CC 03CD 03CE 0000 + \ No newline at end of file diff --git a/sql/share/charsets/hebrew.conf b/sql/share/charsets/hebrew.conf index 0475db02b24..84581f6f1bb 100644 --- a/sql/share/charsets/hebrew.conf +++ b/sql/share/charsets/hebrew.conf @@ -84,9 +84,10 @@ 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008A 008B 008C 008D 008E 008F 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009A 009B 009C 009D 009E 009F -00A0 003F 00A2 00A3 00A4 00A5 00A6 00A7 00A8 00A9 00D7 00AB 00AC 00AD 00AE 203E -00B0 00B1 00B2 00B3 00B4 00B5 00B6 00B7 00B8 00B9 00F7 00BB 00BC 00BD 00BE 003F -003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F -003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 2017 +00A0 0000 00A2 00A3 00A4 00A5 00A6 00A7 00A8 00A9 00D7 00AB 00AC 00AD 00AE 203E +00B0 00B1 00B2 00B3 00B4 00B5 00B6 00B7 00B8 00B9 00F7 00BB 00BC 00BD 00BE 0000 +0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 2017 05D0 05D1 05D2 05D3 05D4 05D5 05D6 05D7 05D8 05D9 05DA 05DB 05DC 05DD 05DE 05DF -05E0 05E1 05E2 05E3 05E4 05E5 05E6 05E7 05E8 05E9 05EA 003F 003F 003F 003F 003F +05E0 05E1 05E2 05E3 05E4 05E5 05E6 05E7 05E8 05E9 05EA 0000 0000 0000 0000 0000 + \ No newline at end of file diff --git a/sql/share/charsets/hp8.conf b/sql/share/charsets/hp8.conf index d0fd37f5f24..07036d6f186 100644 --- a/sql/share/charsets/hp8.conf +++ b/sql/share/charsets/hp8.conf @@ -89,5 +89,5 @@ 00E2 00EA 00F4 00FB 00E1 00E9 00F3 00FA 00E0 00E8 00F2 00F9 00E4 00EB 00F6 00FC 00C5 00EE 00D8 00C6 00E5 00ED 00F8 00E6 00C4 00EC 00D6 00DC 00C9 00EF 00DF 00D4 00C1 00C3 00E3 00D0 00F0 00CD 00CC 00D3 00D2 00D5 00F5 0160 0161 00DA 0178 00FF -00DE 00FE 00B7 00B5 00B6 00BE 2014 00BC 00BD 00AA 00BA 00AB 25A0 00BB 00B1 003F +00DE 00FE 00B7 00B5 00B6 00BE 2014 00BC 00BD 00AA 00BA 00AB 25A0 00BB 00B1 0000 diff --git a/sql/share/charsets/swe7.conf b/sql/share/charsets/swe7.conf index c68593a351c..49938800f39 100644 --- a/sql/share/charsets/swe7.conf +++ b/sql/share/charsets/swe7.conf @@ -81,12 +81,12 @@ 00C9 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 00C4 00D6 00C5 00DC 005F 00E9 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F -0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 00E4 00F6 00E5 00FC 003F -003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F -003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F -003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F -003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F -003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F -003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F -003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F -003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 00E4 00F6 00E5 00FC 0000 +0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 diff --git a/sql/share/charsets/usa7.conf b/sql/share/charsets/usa7.conf index 45e260870ba..380fc9b5d8b 100644 --- a/sql/share/charsets/usa7.conf +++ b/sql/share/charsets/usa7.conf @@ -81,12 +81,12 @@ 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F -0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 003F -003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F -003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F -003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F -003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F -003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F -003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F -003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F -003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F 003F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 0000 +0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 diff --git a/sql/share/charsets/win1250.conf b/sql/share/charsets/win1250.conf index abe0a9a8702..0a5b5074bde 100644 --- a/sql/share/charsets/win1250.conf +++ b/sql/share/charsets/win1250.conf @@ -82,8 +82,8 @@ 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F -20AC 003F 201A 003F 201E 2026 2020 2021 003F 2030 0160 2039 015A 0164 017D 0179 -003F 2018 2019 201C 201D 2022 2013 2014 003F 2122 0161 203A 015B 0165 017E 017A +20AC 0000 201A 0000 201E 2026 2020 2021 0000 2030 0160 2039 015A 0164 017D 0179 +0000 2018 2019 201C 201D 2022 2013 2014 0000 2122 0161 203A 015B 0165 017E 017A 00A0 02C7 02D8 0141 00A4 0104 00A6 00A7 00A8 00A9 015E 00AB 00AC 00AD 00AE 017B 00B0 00B1 02DB 0142 00B4 00B5 00B6 00B7 00B8 0105 015F 00BB 013D 02DD 013E 017C 0154 00C1 00C2 0102 00C4 0139 0106 00C7 010C 00C9 0118 00CB 011A 00CD 00CE 010E diff --git a/sql/share/charsets/win1251.conf b/sql/share/charsets/win1251.conf index 55f688f59b9..2164cb36b9e 100644 --- a/sql/share/charsets/win1251.conf +++ b/sql/share/charsets/win1251.conf @@ -90,8 +90,8 @@ 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F -0402 0403 201A 0453 201E 2026 2020 2021 003F 2030 0409 2039 040A 040C 040B 040F -0452 2018 2019 201C 201D 2022 2013 2014 003F 2122 0459 203A 045A 045C 045B 045F +0402 0403 201A 0453 201E 2026 2020 2021 0000 2030 0409 2039 040A 040C 040B 040F +0452 2018 2019 201C 201D 2022 2013 2014 0000 2122 0459 203A 045A 045C 045B 045F 00A0 040E 045E 0408 00A4 0490 00A6 00A7 0401 00A9 0404 00AB 00AC 00AD 00AE 0407 00B0 00B1 0406 0456 0491 00B5 00B6 00B7 0451 2116 0454 00BB 0458 0405 0455 0457 0410 0411 0412 0413 0414 0415 0416 0417 0418 0419 041A 041B 041C 041D 041E 041F diff --git a/sql/share/charsets/win1251ukr.conf b/sql/share/charsets/win1251ukr.conf index 2fbab363e5e..da08e4c7d6f 100644 --- a/sql/share/charsets/win1251ukr.conf +++ b/sql/share/charsets/win1251ukr.conf @@ -85,8 +85,8 @@ 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F -0402 0403 201A 0453 201E 2026 2020 2021 003F 2030 0409 2039 040A 040C 040B 040F -0452 2018 2019 201C 201D 2022 2013 2014 003F 2122 0459 203A 045A 045C 045B 045F +0402 0403 201A 0453 201E 2026 2020 2021 0000 2030 0409 2039 040A 040C 040B 040F +0452 2018 2019 201C 201D 2022 2013 2014 0000 2122 0459 203A 045A 045C 045B 045F 00A0 040E 045E 0408 00A4 0490 00A6 00A7 0401 00A9 0404 00AB 00AC 00AD 00AE 0407 00B0 00B1 0406 0456 0491 00B5 00B6 00B7 0451 2116 0454 00BB 0458 0405 0455 0457 0410 0411 0412 0413 0414 0415 0416 0417 0418 0419 041A 041B 041C 041D 041E 041F -- cgit v1.2.1 From bdb74237346fefff8829d9f4d5f61ec48b35a8f3 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 2 Jun 2002 21:22:20 +0300 Subject: Extension of .frm file (not yet ready for push) include/m_ctype.h: cleanup include/mysqld_error.h: New error messages sql/field.cc: Extension of .frm file sql/field.h: Extension of .frm file sql/handler.h: cleanup Added CHARSET_INFO to ha_create_information sql/item_strfunc.cc: cleanup sql/lex.h: Update for FOREIGN KEYS sql/mysql_priv.h: Extension of .frm file sql/slave.cc: Fixed bug in wait_for_relay_log_space() sql/spatial.h: Cleanup sql/sql_class.h: Cleanup sql/sql_lex.h: Extension of .frm file sql/sql_parse.cc: Extension of .frm file sql/sql_show.cc: Extension of .frm file sql/sql_table.cc: Extension of .frm file sql/sql_yacc.yy: Extension of .frm file sql/table.cc: Extension of .frm file sql/unireg.cc: Extension of .frm file --- include/m_ctype.h | 80 +++++++++++++++-------------- include/mysqld_error.h | 4 +- sql/field.cc | 14 +++-- sql/field.h | 6 ++- sql/handler.h | 19 +++---- sql/item_strfunc.cc | 114 ++++++++++++++++++++--------------------- sql/lex.h | 1 + sql/mysql_priv.h | 7 +-- sql/slave.cc | 4 +- sql/spatial.h | 4 +- sql/sql_class.h | 96 +++++++++++++++++++++------------- sql/sql_lex.h | 8 +-- sql/sql_parse.cc | 20 ++++++-- sql/sql_show.cc | 54 +++++++++++++------- sql/sql_table.cc | 68 ++++++++++++++++--------- sql/sql_yacc.yy | 99 +++++++++++++++++++---------------- sql/table.cc | 136 +++++++++++++++++++++++++++---------------------- sql/unireg.cc | 52 ++++++++++++------- 18 files changed, 459 insertions(+), 327 deletions(-) diff --git a/include/m_ctype.h b/include/m_ctype.h index 6e116b95428..d8593e20fd1 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -51,52 +51,54 @@ typedef struct my_uni_idx_st { typedef struct charset_info_st { - uint number; - const char *name; - uchar *ctype; - uchar *to_lower; - uchar *to_upper; - uchar *sort_order; - uint16 *tab_to_uni; - MY_UNI_IDX *tab_from_uni; + uint number; + const char *name; + uchar *ctype; + uchar *to_lower; + uchar *to_upper; + uchar *sort_order; + uint16 *tab_to_uni; + MY_UNI_IDX *tab_from_uni; - /* Collation routines */ - uint strxfrm_multiply; - int (*strnncoll)(struct charset_info_st *, - const uchar *, uint, const uchar *, uint); - int (*strnxfrm)(struct charset_info_st *, - uchar *, uint, const uchar *, uint); - my_bool (*like_range)(struct charset_info_st *, - const char *, uint, pchar, uint, - char *, char *, uint *, uint *); + /* Collation routines */ + uint strxfrm_multiply; + int (*strnncoll)(struct charset_info_st *, + const uchar *, uint, const uchar *, uint); + int (*strnxfrm)(struct charset_info_st *, + uchar *, uint, const uchar *, uint); + my_bool (*like_range)(struct charset_info_st *, + const char *, uint, pchar, uint, + char *, char *, uint *, uint *); - /* Multibyte routines */ - uint mbmaxlen; - int (*ismbchar)(struct charset_info_st *, const char *, const char *); - my_bool (*ismbhead)(struct charset_info_st *, uint); - int (*mbcharlen)(struct charset_info_st *, uint); + /* Multibyte routines */ + uint mbmaxlen; + int (*ismbchar)(struct charset_info_st *, const char *, const char *); + my_bool (*ismbhead)(struct charset_info_st *, uint); + int (*mbcharlen)(struct charset_info_st *, uint); - /* Unicode convertion */ - int (*mb_wc)(struct charset_info_st *cs,my_wc_t *wc, - const unsigned char *s,const unsigned char *e); - int (*wc_mb)(struct charset_info_st *cs,my_wc_t wc, - unsigned char *s,unsigned char *e); + /* Unicode convertion */ + int (*mb_wc)(struct charset_info_st *cs,my_wc_t *wc, + const unsigned char *s,const unsigned char *e); + int (*wc_mb)(struct charset_info_st *cs,my_wc_t wc, + unsigned char *s,unsigned char *e); - /* Functions for case convertion */ - void (*caseup_str)(struct charset_info_st *, char *); - void (*casedn_str)(struct charset_info_st *, char *); - void (*caseup)(struct charset_info_st *, char *, uint); - void (*casedn)(struct charset_info_st *, char *, uint); + /* Functions for case convertion */ + void (*caseup_str)(struct charset_info_st *, char *); + void (*casedn_str)(struct charset_info_st *, char *); + void (*caseup)(struct charset_info_st *, char *, uint); + void (*casedn)(struct charset_info_st *, char *, uint); - /* Functions for case comparison */ - int (*strcasecmp)(struct charset_info_st *, const char *, const char *); - int (*strncasecmp)(struct charset_info_st *, const char *, const char *, uint); + /* Functions for case comparison */ + int (*strcasecmp)(struct charset_info_st *, const char *, const char *); + int (*strncasecmp)(struct charset_info_st *, const char *, const char *, + uint); - /* Hash calculation */ - uint (*hash_caseup)(struct charset_info_st *cs, const byte *key, uint len); - void (*hash_sort)(struct charset_info_st *cs, const uchar *key, uint len, ulong *nr1, ulong *nr2); + /* Hash calculation */ + uint (*hash_caseup)(struct charset_info_st *cs, const byte *key, uint len); + void (*hash_sort)(struct charset_info_st *cs, const uchar *key, uint len, + ulong *nr1, ulong *nr2); - char max_sort_char; /* For LIKE otimization */ + char max_sort_char; /* For LIKE optimization */ } CHARSET_INFO; /* strings/ctype.c */ diff --git a/include/mysqld_error.h b/include/mysqld_error.h index c910078331e..61442247ea8 100644 --- a/include/mysqld_error.h +++ b/include/mysqld_error.h @@ -243,4 +243,6 @@ #define ER_MIXING_NOT_ALLOWED 1224 #define ER_DUP_ARGUMENT 1225 #define ER_USER_LIMIT_REACHED 1226 -#define ER_ERROR_MESSAGES 227 +#define ER_WRONG_FK_DEF 1227 +#define ER_KEY_REF_DO_NOT_MATCH_TABLE_REF 1228 +#define ER_ERROR_MESSAGES 229 diff --git a/sql/field.cc b/sql/field.cc index 75cbedbb71b..819583ba9fb 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -4489,9 +4489,7 @@ void Field_enum::sql_type(String &res) const { if (flag) res.append(','); - res.append('\''); - append_unescaped(&res,*pos); - res.append('\''); + append_unescaped(&res, *pos, strlen(*pos)); flag=1; } res.append(')'); @@ -4610,9 +4608,7 @@ void Field_set::sql_type(String &res) const { if (flag) res.append(','); - res.append('\''); - append_unescaped(&res,*pos); - res.append('\''); + append_unescaped(&res, *pos, strlen(*pos)); flag=1; } res.append(')'); @@ -4713,6 +4709,7 @@ uint pack_length_to_packflag(uint type) Field *make_field(char *ptr, uint32 field_length, uchar *null_pos, uchar null_bit, uint pack_flag, + enum_field_types field_type, Field::utype unireg_check, TYPELIB *interval, const char *field_name, @@ -4728,7 +4725,8 @@ Field *make_field(char *ptr, uint32 field_length, if (!f_is_packed(pack_flag)) return new Field_string(ptr,field_length,null_pos,null_bit, unireg_check, field_name, table, - f_is_binary(pack_flag) != 0, default_charset_info); + f_is_binary(pack_flag) != 0, + default_charset_info); uint pack_length=calc_pack_length((enum_field_types) f_packtype(pack_flag), @@ -4756,7 +4754,7 @@ Field *make_field(char *ptr, uint32 field_length, } } - switch ((enum enum_field_types) f_packtype(pack_flag)) { + switch (field_type) { case FIELD_TYPE_DECIMAL: return new Field_decimal(ptr,field_length,null_pos,null_bit, unireg_check, field_name, table, diff --git a/sql/field.h b/sql/field.h index cf7c2a50218..7fb43ddd29f 100644 --- a/sql/field.h +++ b/sql/field.h @@ -41,6 +41,7 @@ public: uchar *null_ptr; // Byte where null_bit is struct st_table *table; // Pointer for table const char *table_name,*field_name; + LEX_STRING comment; ulong query_id; // For quick test of used fields // Field is part of the following keys key_map key_start,part_of_key,part_of_sortkey; @@ -1013,6 +1014,7 @@ public: const char *field_name; const char *change; // If done with alter table const char *after; // Put column after this one + LEX_STRING comment; // Comment for field Item *def; // Default value enum enum_field_types sql_type; uint32 length; @@ -1020,6 +1022,7 @@ public: Field::utype unireg_check; TYPELIB *interval; // Which interval to use Field *field; // For alter table + CHARSET_INFO *charset; uint8 row,col,sc_length,interval_id; // For rea_create_table uint offset,pack_flag; @@ -1067,7 +1070,8 @@ public: Field *make_field(char *ptr, uint32 field_length, uchar *null_pos, uchar null_bit, - uint pack_flag, Field::utype unireg_check, + uint pack_flag, enum_field_types field_type, + Field::utype unireg_check, TYPELIB *interval, const char *field_name, struct st_table *table); uint pack_length_to_packflag(uint type); diff --git a/sql/handler.h b/sql/handler.h index 668453f8905..45865c39154 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -149,22 +149,23 @@ enum enum_tx_isolation { ISO_READ_UNCOMMITTED, ISO_READ_COMMITTED, typedef struct st_ha_create_information { - ulong table_options; - enum db_type db_type; - enum row_type row_type; - ulong avg_row_length; - ulonglong max_rows,min_rows; - ulonglong auto_increment_value; + CHARSET_INFO *table_charset; char *comment,*password; char *data_file_name, *index_file_name; char *create_statement; - uint options; /* OR of HA_CREATE_ options */ - uint raid_type,raid_chunks; + ulonglong max_rows,min_rows; + ulonglong auto_increment_value; + ulong table_options; + ulong avg_row_length; ulong raid_chunksize; - bool if_not_exists; ulong used_fields; SQL_LIST merge_list; + enum db_type db_type; + enum row_type row_type; + uint options; /* OR of HA_CREATE_ options */ + uint raid_type,raid_chunks; uint merge_insert_method; + bool if_not_exists; } HA_CREATE_INFO; diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index e3436ac4641..b0ab03363d3 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -2342,7 +2342,8 @@ String *Item_func_spatial_collection::val_str(String *str) } else { - uint32 wkb_type, len=res->length(); + enum Geometry::wkbType wkb_type; + uint32 len=res->length(); const char *data=res->ptr()+1; /* @@ -2351,75 +2352,74 @@ String *Item_func_spatial_collection::val_str(String *str) do this checking now */ - if (len<5) + if (len < 5) goto ret; - wkb_type=uint4korr(data); + wkb_type= (Geometry::wkbType) uint4korr(data); data+=4; len-=5; - if ( wkb_type != item_type ) + if (wkb_type != item_type) goto ret; - switch(coll_type) - { - case Geometry::wkbMultiPoint: - case Geometry::wkbMultiLineString: - case Geometry::wkbMultiPolygon: - if (lenreserve(len,512)) - goto ret; - str->q_append(data,len); - break; - - case Geometry::wkbLineString: - if (str->reserve(POINT_DATA_SIZE,512)) - goto ret; - str->q_append(data,POINT_DATA_SIZE); - break; - - case Geometry::wkbPolygon: - { - uint32 n_points; - double x1, y1, x2, y2; - - if (len < WKB_HEADER_SIZE + 4 + 8 + 8) - goto ret; - data+=WKB_HEADER_SIZE; - len-=WKB_HEADER_SIZE; - - uint32 llen=len; - const char *ldata=data; + data+=WKB_HEADER_SIZE; + len-=WKB_HEADER_SIZE; + if (str->reserve(len,512)) + goto ret; + str->q_append(data,len); + break; + + case Geometry::wkbLineString: + if (str->reserve(POINT_DATA_SIZE,512)) + goto ret; + str->q_append(data,POINT_DATA_SIZE); + break; + + case Geometry::wkbPolygon: + { + uint32 n_points; + double x1, y1, x2, y2; + + if (len < WKB_HEADER_SIZE + 4 + 8 + 8) + goto ret; + data+=WKB_HEADER_SIZE; + len-=WKB_HEADER_SIZE; + + uint32 llen=len; + const char *ldata=data; - n_points=uint4korr(data); - data+=4; - float8get(x1,data); - data+=8; - float8get(y1,data); - data+=8; + n_points=uint4korr(data); + data+=4; + float8get(x1,data); + data+=8; + float8get(y1,data); + data+=8; - len-= 4 + 8 + 8; + len-= 4 + 8 + 8; - if (len < n_points * POINT_DATA_SIZE) - goto ret; - data+=(n_points-2) * POINT_DATA_SIZE; + if (len < n_points * POINT_DATA_SIZE) + goto ret; + data+=(n_points-2) * POINT_DATA_SIZE; - float8get(x2,data); - float8get(y2,data+8); + float8get(x2,data); + float8get(y2,data+8); - if ((x1 != x2) || (y1 != y2)) - goto ret; + if ((x1 != x2) || (y1 != y2)) + goto ret; - if (str->reserve(llen,512)) - goto ret; - str->q_append(ldata, llen); - } - break; + if (str->reserve(llen,512)) + goto ret; + str->q_append(ldata, llen); + } + break; - default: - goto ret; + default: + goto ret; } } } diff --git a/sql/lex.h b/sql/lex.h index ea712523993..482a73cf11b 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -309,6 +309,7 @@ static SYMBOL symbols[] = { { "SESSION", SYM(SESSION_SYM),0,0}, { "SET", SYM(SET),0,0}, { "SIGNED", SYM(SIGNED_SYM),0,0}, + { "SIMPLE", SYM(SIMPLE_SYM),0,0}, { "SHARE", SYM(SHARE_SYM),0,0}, { "SHOW", SYM(SHOW),0,0}, { "SHUTDOWN", SYM(SHUTDOWN),0,0}, diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 4c71e845207..7d43ed1b38f 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -474,8 +474,9 @@ int mysql_ha_read(THD *, TABLE_LIST *,enum enum_ha_read_modes,char *, void set_item_name(Item *item,char *pos,uint length); bool add_field_to_list(char *field_name, enum enum_field_types type, char *length, char *decimal, - uint type_modifier, Item *default_value,char *change, - TYPELIB *interval); + uint type_modifier, + Item *default_value, Item *comment, + char *change, TYPELIB *interval); void store_position_for_column(const char *name); bool add_to_list(SQL_LIST &list,Item *group,bool asc=0); TABLE_LIST *add_table_to_list(Table_ident *table,LEX_STRING *alias, @@ -726,7 +727,7 @@ ulong get_form_pos(File file, uchar *head, TYPELIB *save_names); ulong make_new_entry(File file,uchar *fileinfo,TYPELIB *formnames, const char *newname); ulong next_io_size(ulong pos); -void append_unescaped(String *res,const char *pos); +void append_unescaped(String *res, const char *pos, uint length); int create_frm(char *name,uint reclength,uchar *fileinfo, HA_CREATE_INFO *create_info, uint keys); void update_create_info_from_table(HA_CREATE_INFO *info, TABLE *form); diff --git a/sql/slave.cc b/sql/slave.cc index 8461b72f4c6..7de3022f551 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -1104,14 +1104,16 @@ static inline int add_relay_log(RELAY_LOG_INFO* rli,LOG_INFO* linfo) static bool wait_for_relay_log_space(RELAY_LOG_INFO* rli) { - bool slave_killed; + bool slave_killed=0; MASTER_INFO* mi = rli->mi; const char* save_proc_info; THD* thd = mi->io_thd; DBUG_ENTER("wait_for_relay_log_space"); + pthread_mutex_lock(&rli->log_space_lock); save_proc_info = thd->proc_info; thd->proc_info = "Waiting for relay log space to free"; + while (rli->log_space_limit < rli->log_space_total && !(slave_killed=io_slave_killed(thd,mi))) { diff --git a/sql/spatial.h b/sql/spatial.h index 09e8722a85e..2daa8e856c9 100644 --- a/sql/spatial.h +++ b/sql/spatial.h @@ -3,8 +3,8 @@ #include "gstream.h" -const int POINT_DATA_SIZE = 8+8; -const int WKB_HEADER_SIZE = 1+4; +const uint POINT_DATA_SIZE = 8+8; +const uint WKB_HEADER_SIZE = 1+4; struct stPoint2D { diff --git a/sql/sql_class.h b/sql/sql_class.h index 5dc761ff811..cc1caa91a73 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -69,11 +69,13 @@ class MYSQL_LOG { char log_file_name[FN_REFLEN],index_file_name[FN_REFLEN]; bool write_error,inited; uint file_id; // current file sequence number for load data infile - // binary logging - bool no_rotate; // for binlog - if log name can never change - // we should not try to rotate it or write any rotation events - // the user should use FLUSH MASTER instead of FLUSH LOGS for - // purging + /* + For binlog - if log name can never change + we should not try to rotate it or write any rotation events + the user should use FLUSH MASTER instead of FLUSH LOGS for + purging + */ + bool no_rotate; enum cache_type io_cache_type; bool need_start_event; pthread_cond_t update_cond; @@ -215,19 +217,40 @@ public: class Key :public Sql_alloc { public: - enum Keytype { PRIMARY, UNIQUE, MULTIPLE, FULLTEXT, SPATIAL }; + enum Keytype { PRIMARY, UNIQUE, MULTIPLE, FULLTEXT, SPATIAL, FOREIGN_KEY}; enum Keytype type; enum ha_key_alg algorithm; List columns; - const char *Name; + const char *name; - Key(enum Keytype type_par, enum ha_key_alg alg_par, const char *name_arg, List &cols) - :type(type_par), algorithm(alg_par), columns(cols), Name(name_arg) + Key(enum Keytype type_par, const char *name_arg, enum ha_key_alg alg_par, + List &cols) + :type(type_par), algorithm(alg_par), columns(cols), name(name_arg) {} ~Key() {} - const char *name() { return Name; } }; +class Table_ident; + +class foreign_key: public Key { +public: + enum fk_match_opt { FK_MATCH_UNDEF, FK_MATCH_FULL, + FK_MATCH_PARTIAL, FK_MATCH_SIMPLE}; + enum fk_option { FK_OPTION_UNDEF, FK_OPTION_RESTRICT, FK_OPTION_CASCADE, + FK_OPTION_SET_NULL, FK_OPTION_NO_ACTION, FK_OPTION_DEFAULT}; + + Table_ident *ref_table; + List ref_columns; + uint delete_opt, update_opt, match_opt; + foreign_key(const char *name_arg, List &cols, + Table_ident *table, List &ref_cols, + uint delete_opt_arg, uint update_opt_arg, uint match_opt_arg) + :Key(FOREIGN_KEY, name_arg, HA_KEY_ALG_UNDEF, cols), + ref_table(table), ref_columns(cols), + delete_opt(delete_opt_arg), update_opt(update_opt_arg), + match_opt(match_opt_arg) + {} +}; typedef struct st_mysql_lock { @@ -247,8 +270,8 @@ public: #include "sql_lex.h" /* Must be here */ -// needed to be able to have an I_List of char* strings.in mysqld.cc where we cannot use String -// because it is Sql_alloc'ed +/* Needed to be able to have an I_List of char* strings in mysqld.cc. */ + class i_string: public ilink { public: @@ -257,7 +280,7 @@ public: i_string(char* s) : ptr(s) {} }; -//needed for linked list of two strings for replicate-rewrite-db +/* needed for linked list of two strings for replicate-rewrite-db */ class i_string_pair: public ilink { public: @@ -275,39 +298,42 @@ class delayed_insert; #define THD_CHECK_SENTRY(thd) DBUG_ASSERT(thd->dbug_sentry == THD_SENTRY_MAGIC) -/* For each client connection we create a separate thread with THD serving as - a thread/connection descriptor */ +/* + For each client connection we create a separate thread with THD serving as + a thread/connection descriptor. +*/ class THD :public ilink { public: - NET net; // client connection descriptor - LEX lex; // parse tree descriptor - MEM_ROOT mem_root; // 1 command-life memory allocation pool - HASH user_vars; // hash for user variables - String packet; // dynamic string buffer used for network I/O - struct sockaddr_in remote; // client socket address - struct rand_struct rand; // used for authentication + NET net; // client connection descriptor + LEX lex; // parse tree descriptor + MEM_ROOT mem_root; // 1 command-life memory + HASH user_vars; // hash for user variables + String packet; // buffer used for network I/O + struct sockaddr_in remote; // client socket address + struct rand_struct rand; // used for authentication - /* query points to the current query, - thread_stack is a pointer to the stack frame of handle_one_connection(), - which is called first in the thread for handling a client - */ + /* + Query points to the current query, + thread_stack is a pointer to the stack frame of handle_one_connection(), + which is called first in the thread for handling a client + */ char *query,*thread_stack; /* host - host of the client user - user of the client, set to NULL until the user has been read from the connection - priv_user - not sure why we have it, but it is set to "boot" when we run - with --bootstrap + priv_user - The user privilege we are using. May be '' for anonymous user. db - currently selected database ip - client IP */ char *host,*user,*priv_user,*db,*ip; - /* proc_info points to a string that will show in the Info column of - SHOW PROCESSLIST output - host_or_ip points to host if host is available, otherwise points to ip - */ + /* + Proc_info points to a string that will show in the Info column of + SHOW PROCESSLIST output + host_or_ip points to host if host is available, otherwise points to ip + */ const char *proc_info, *host_or_ip; /* @@ -334,7 +360,8 @@ public: */ TABLE *open_tables,*temporary_tables, *handler_tables; // TODO: document the variables below - MYSQL_LOCK *lock,*locked_tables; + MYSQL_LOCK *lock; /* Current locks */ + MYSQL_LOCK *locked_tables; /* Tables locked with LOCK */ ULL *ull; #ifndef DBUG_OFF uint dbug_sentry; // watch out for memory corruption @@ -538,7 +565,7 @@ public: #include "log_event.h" /* -** This is used to get result from a select + This is used to get result from a select */ class JOIN; @@ -787,7 +814,6 @@ public: class multi_update : public select_result { TABLE_LIST *update_tables, *table_being_updated; -// Unique **tempfiles; COPY_INFO *infos; TABLE **tmp_tables; THD *thd; diff --git a/sql/sql_lex.h b/sql/sql_lex.h index e53a2e7bda8..27ca601ed87 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -154,6 +154,7 @@ typedef struct st_lex { sql_exchange *exchange; List col_list; + List ref_list; List drop_list; List alter_list; List interval_list; @@ -167,7 +168,7 @@ typedef struct st_lex { SQL_LIST proc_list, auxilliary_table_list; TYPELIB *interval; create_field *last_field; - Item *default_value; + Item *default_value, *comment; CONVERT *convert_set; LEX_USER *grant_user; gptr yacc_yyss,yacc_yyvs; @@ -178,14 +179,15 @@ typedef struct st_lex { LEX_MASTER_INFO mi; // used by CHANGE MASTER ulong thread_id,type; enum_sql_command sql_command; + thr_lock_type lock_option; enum lex_states next_state; enum enum_duplicates duplicates; enum enum_tx_isolation tx_isolation; enum enum_ha_read_modes ha_read_mode; enum ha_rkey_function ha_rkey_mode; enum enum_enable_or_disable alter_keys_onoff; - uint grant,grant_tot_col,which_columns, union_option, mqh; - thr_lock_type lock_option; + uint grant, grant_tot_col, which_columns, union_option, mqh; + uint fk_delete_opt, fk_update_opt, fk_match_option; bool drop_primary,drop_if_exists,local_file; bool in_comment,ignore_space,verbose,simple_alter, option_type, derived_tables; uint slave_thd_opt; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 469de136fbb..f0842c0896e 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2770,8 +2770,9 @@ link_in_list(SQL_LIST *list,byte *element,byte **next) bool add_field_to_list(char *field_name, enum_field_types type, char *length, char *decimals, - uint type_modifier, Item *default_value,char *change, - TYPELIB *interval) + uint type_modifier, + Item *default_value, Item *comment, + char *change, TYPELIB *interval) { register create_field *new_field; THD *thd=current_thd; @@ -2787,14 +2788,14 @@ bool add_field_to_list(char *field_name, enum_field_types type, if (type_modifier & PRI_KEY_FLAG) { lex->col_list.push_back(new key_part_spec(field_name,0)); - lex->key_list.push_back(new Key(Key::PRIMARY, HA_KEY_ALG_UNDEF, NullS, + lex->key_list.push_back(new Key(Key::PRIMARY, NullS, HA_KEY_ALG_UNDEF, lex->col_list)); lex->col_list.empty(); } if (type_modifier & (UNIQUE_FLAG | UNIQUE_KEY_FLAG)) { lex->col_list.push_back(new key_part_spec(field_name,0)); - lex->key_list.push_back(new Key(Key::UNIQUE, HA_KEY_ALG_UNDEF, NullS, + lex->key_list.push_back(new Key(Key::UNIQUE, NullS, HA_KEY_ALG_UNDEF, lex->col_list)); lex->col_list.empty(); } @@ -2824,6 +2825,17 @@ bool add_field_to_list(char *field_name, enum_field_types type, new_field->change=change; new_field->interval=0; new_field->pack_length=0; + if (!comment) + { + new_field->comment.str=0; + new_field->comment.length=0; + } + else + { + /* In this case comment is always of type Item_string */ + new_field->comment.str= (char*) comment->str_value.ptr(); + new_field->comment.length=comment->str_value.length(); + } if (length) if (!(new_field->length= (uint) atoi(length))) length=0; /* purecov: inspected */ diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 849a803a622..359ed48ed48 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -454,8 +454,10 @@ mysqld_show_fields(THD *thd, TABLE_LIST *table_list,const char *wild, field_list.push_back(new Item_empty_string("Default",NAME_LEN)); field_list.push_back(new Item_empty_string("Extra",20)); if (verbose) + { field_list.push_back(new Item_empty_string("Privileges",80)); - + field_list.push_back(new Item_empty_string("Comment",255)); + } // Send first number of fields and records { char *pos; @@ -522,7 +524,7 @@ mysqld_show_fields(THD *thd, TABLE_LIST *table_list,const char *wild, if (verbose) { - /* Add grant options */ + /* Add grant options & comments */ col_access= get_column_grant(thd,table_list,field) & COL_ACLS; end=tmp; for (uint bitnr=0; col_access ; col_access>>=1,bitnr++) @@ -534,6 +536,7 @@ mysqld_show_fields(THD *thd, TABLE_LIST *table_list,const char *wild, } } net_store_data(packet,convert, tmp+1,end == tmp ? 0 : (uint) (end-tmp-1)); + net_store_data(packet, field->comment.str,field->comment.length); } if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length())) DBUG_RETURN(1); @@ -571,21 +574,28 @@ mysqld_show_create(THD *thd, TABLE_LIST *table_list) { packet->length(0); net_store_data(packet,convert, table->table_name); - // a hack - we need to reserve some space for the length before - // we know what it is - let's assume that the length of create table - // statement will fit into 3 bytes ( 16 MB max :-) ) + /* + A hack - we need to reserve some space for the length before + we know what it is - let's assume that the length of create table + statement will fit into 3 bytes ( 16 MB max :-) ) + */ ulong store_len_offset = packet->length(); packet->length(store_len_offset + 4); if (store_create_info(thd, table, packet)) DBUG_RETURN(-1); ulong create_len = packet->length() - store_len_offset - 4; + /* + Just in case somebody manages to create a table + with *that* much stuff in the definition + */ if (create_len > 0x00ffffff) // better readable in HEX ... - DBUG_RETURN(1); // just in case somebody manages to create a table - // with *that* much stuff in the definition + DBUG_RETURN(1); - // now we have to store the length in three bytes, even if it would fit - // into fewer, so we cannot use net_store_data() anymore, - // and do it ourselves + /* + Now we have to store the length in three bytes, even if it would fit + into fewer, so we cannot use net_store_data() anymore, + and do it ourselves + */ char* p = (char*)packet->ptr() + store_len_offset; *p++ = (char) 253; // The client the length is stored using 3-bytes int3store(p, create_len); @@ -848,10 +858,10 @@ store_create_info(THD *thd, TABLE *table, String *packet) { // Not null by default type.set(tmp,sizeof(tmp),default_charset_info); field->val_str(&type,&type); - packet->append('\''); if (type.length()) - append_unescaped(packet, type.c_ptr()); - packet->append('\''); + append_unescaped(packet, type.ptr(), type.length()); + else + packet->append("''",2); } else if (field->maybe_null()) packet->append("NULL", 4); // Null as default @@ -860,7 +870,13 @@ store_create_info(THD *thd, TABLE *table, String *packet) } if (field->unireg_check == Field::NEXT_NUMBER) - packet->append(" auto_increment", 15 ); + packet->append(" auto_increment", 15 ); + + if (field->comment.length) + { + packet->append(" COMMENT ",9); + append_unescaped(packet, field->comment.str, field->comment.length); + } } KEY *key_info=table->key_info; @@ -890,8 +906,9 @@ store_create_info(THD *thd, TABLE *table, String *packet) append_identifier(thd,packet,key_info->name); // +BAR: send USING only in non-default case: non-spatial rtree - if((key_info->algorithm == HA_KEY_ALG_RTREE) && !(key_info->flags & HA_SPATIAL)) - packet->append(" USING RTREE",12); + if((key_info->algorithm == HA_KEY_ALG_RTREE) && + !(key_info->flags & HA_SPATIAL)) + packet->append(" USING RTREE",12); packet->append(" (", 2); @@ -972,9 +989,8 @@ store_create_info(THD *thd, TABLE *table, String *packet) table->file->append_create_info(packet); if (table->comment && table->comment[0]) { - packet->append(" COMMENT='", 10); - append_unescaped(packet, table->comment); - packet->append('\''); + packet->append(" COMMENT=", 9); + append_unescaped(packet, table->comment, strlen(table->comment)); } if (file->raid_type) { diff --git a/sql/sql_table.cc b/sql/sql_table.cc index bdcb325774b..5c7d9e538e4 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -266,7 +266,7 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, DBUG_ENTER("mysql_create_table"); /* - ** Check for duplicate fields and check type of table to create + Check for duplicate fields and check type of table to create */ if (!fields.elements) @@ -398,35 +398,50 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, /* Create keys */ List_iterator key_iterator(keys); - uint key_parts=0,key_count=keys.elements; + uint key_parts=0, key_count=0, fk_key_count=0; List keys_in_order; // Add new keys here bool primary_key=0,unique_key=0; Key *key; uint tmp, key_number; - tmp=min(file->max_keys(), MAX_KEY); - if (key_count > tmp) - { - my_error(ER_TOO_MANY_KEYS,MYF(0),tmp); - DBUG_RETURN(-1); - } /* Calculate number of key segements */ while ((key=key_iterator++)) { + if (key->type == Key::FOREIGN_KEY) + { + fk_key_count++; + foreign_key *fk_key= (foreign_key*) key; + if (fk_key->ref_columns.elements && + fk_key->ref_columns.elements != fk_key->columns.elements) + { + my_error(ER_WRONG_FK_DEF, MYF(0), fk_key->name ? fk_key->name : + "foreign key without name", + ER(ER_KEY_REF_DO_NOT_MATCH_TABLE_REF)); + DBUG_RETURN(-1); + } + continue; + } + key_count++; tmp=max(file->max_key_parts(),MAX_REF_PARTS); if (key->columns.elements > tmp) { my_error(ER_TOO_MANY_KEY_PARTS,MYF(0),tmp); DBUG_RETURN(-1); } - if (key->name() && strlen(key->name()) > NAME_LEN) + if (key->name && strlen(key->name) > NAME_LEN) { - my_error(ER_TOO_LONG_IDENT, MYF(0), key->name()); + my_error(ER_TOO_LONG_IDENT, MYF(0), key->name); DBUG_RETURN(-1); } key_parts+=key->columns.elements; } + tmp=min(file->max_keys(), MAX_KEY); + if (key_count > tmp) + { + my_error(ER_TOO_MANY_KEYS,MYF(0),tmp); + DBUG_RETURN(-1); + } key_info_buffer=key_info=(KEY*) sql_calloc(sizeof(KEY)*key_count); key_part_info=(KEY_PART_INFO*) sql_calloc(sizeof(KEY_PART_INFO)*key_parts); @@ -450,7 +465,10 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, case Key::SPATIAL: key_info->flags = HA_SPATIAL; break; - default: + case Key::FOREIGN_KEY: + key_number--; // Skip this key + continue; + default: key_info->flags = HA_NOSAME; } @@ -623,7 +641,7 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, key_name=primary_key_name; primary_key=1; } - else if (!(key_name = key->name())) + else if (!(key_name = key->name)) key_name=make_unique_key_name(sql_field->field_name, key_info_buffer,key_info); if (check_if_keyname_exists(key_name,key_info_buffer,key_info)) @@ -1395,7 +1413,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, List key_list; // Add new keys here /* - ** First collect all fields from table which isn't in drop_list + First collect all fields from table which isn't in drop_list */ create_field *def; @@ -1511,8 +1529,8 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, } /* - ** Collect all keys which isn't in drop list. Add only those - ** for which some fields exists. + Collect all keys which isn't in drop list. Add only those + for which some fields exists. */ List_iterator key_it(keys); @@ -1583,18 +1601,20 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, (!my_strcasecmp(system_charset_info, key_name, "PRIMARY") ? Key::PRIMARY : Key::UNIQUE) : - (key_info->flags & HA_FULLTEXT ? - Key::FULLTEXT : Key::MULTIPLE)), + (key_info->flags & HA_FULLTEXT ? + Key::FULLTEXT : Key::MULTIPLE)), + key_name, key_info->algorithm, - key_name,key_parts)); + key_parts)); } - key_it.rewind(); { Key *key; while ((key=key_it++)) // Add new keys - key_list.push_back(key); + { + if (key->type != Key::FOREIGN_KEY) + key_list.push_back(key); + } } - if (drop_list.elements) { my_error(ER_CANT_DROP_FIELD_OR_KEY,MYF(0),drop_list.head()->name); @@ -1764,9 +1784,9 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, goto err; } /* - ** Data is copied. Now we rename the old table to a temp name, - ** rename the new one to the old name, remove all entries from the old table - ** from the cash, free all locks, close the old table and remove it. + Data is copied. Now we rename the old table to a temp name, + rename the new one to the old name, remove all entries from the old table + from the cash, free all locks, close the old table and remove it. */ thd->proc_info="rename result table"; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 756afbd7a09..a9961090197 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -302,6 +302,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token SET %token SERIALIZABLE_SYM %token SESSION_SYM +%token SIMPLE_SYM %token SHUTDOWN %token SPATIAL_SYM %token SQL_CACHE_SYM @@ -520,7 +521,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); opt_table_alias %type - table_ident + table_ident references %type remember_name remember_end opt_len opt_ident opt_db text_or_password @@ -532,7 +533,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %type type int_type real_type order_dir opt_field_spec set_option lock_option udf_type if_exists opt_local opt_table_options table_options - table_option opt_if_not_exists + table_option opt_if_not_exists delete_option %type ULONG_NUM raid_types merge_insert_types @@ -600,7 +601,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); opt_precision opt_ignore opt_column opt_restrict grant revoke set lock unlock string_list field_options field_option field_opt_list opt_binary table_lock_list table_lock varchar - references opt_on_delete opt_on_delete_list opt_on_delete_item use + ref_list opt_on_delete opt_on_delete_list opt_on_delete_item use opt_delete_options opt_delete_option opt_outer table_list table_name opt_option opt_place opt_low_priority opt_attribute opt_attribute_list attribute column_list column_list_id @@ -612,7 +613,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); table_to_table_list table_to_table opt_table_list opt_as handler_rkey_function handler_read_or_scan single_multi table_wild_list table_wild_one opt_wild union union_list - precision union_option + precision union_option opt_on_delete_item END_OF_INPUT %type @@ -756,6 +757,7 @@ create: bzero((char*) &lex->create_info,sizeof(lex->create_info)); lex->create_info.options=$2 | $4; lex->create_info.db_type= default_table_type; + lex->create_info.table_charset=default_charset_info; } create2 @@ -774,7 +776,7 @@ create: { LEX *lex=Lex; - lex->key_list.push_back(new Key($2,$5,$4.str,lex->col_list)); + lex->key_list.push_back(new Key($2,$4.str, $5, lex->col_list)); lex->col_list.empty(); } | CREATE DATABASE opt_if_not_exists ident default_charset @@ -924,12 +926,19 @@ field_list_item: | key_type opt_ident key_alg '(' key_list ')' { LEX *lex=Lex; - lex->key_list.push_back(new Key($1,$3,$2,lex->col_list)); + lex->key_list.push_back(new Key($1,$2, $3, lex->col_list)); lex->col_list.empty(); /* Alloced by sql_alloc */ } | opt_constraint FOREIGN KEY_SYM opt_ident '(' key_list ')' references { - Lex->col_list.empty(); /* Alloced by sql_alloc */ + LEX *lex=Lex; + lex->key_list.push_back(new foreign_key($4, lex->col_list, + $8, + lex->ref_list, + lex->fk_delete_opt, + lex->fk_update_opt, + lex->fk_match_option)); + lex->col_list.empty(); /* Alloced by sql_alloc */ } | opt_constraint CHECK_SYM '(' expr ')' { @@ -945,7 +954,7 @@ field_spec: { LEX *lex=Lex; lex->length=lex->dec=0; lex->type=0; lex->interval=0; - lex->default_value=0; + lex->default_value=lex->comment=0; } type opt_attribute { @@ -953,8 +962,8 @@ field_spec: if (add_field_to_list($1.str, (enum enum_field_types) $3, lex->length,lex->dec,lex->type, - lex->default_value,lex->change, - lex->interval)) + lex->default_value, lex->comment, + lex->change,lex->interval)) YYABORT; } @@ -1093,6 +1102,7 @@ attribute: | PRIMARY_SYM KEY_SYM { Lex->type|= PRI_KEY_FLAG | NOT_NULL_FLAG; } | UNIQUE_SYM { Lex->type|= UNIQUE_FLAG; } | UNIQUE_SYM KEY_SYM { Lex->type|= UNIQUE_KEY_FLAG; } + | COMMENT_SYM text_literal { Lex->comment= $2; } opt_binary: /* empty */ { Lex->charset=default_charset_info; } @@ -1122,11 +1132,25 @@ default_charset: } references: - REFERENCES table_ident opt_on_delete {} - | REFERENCES table_ident '(' key_list ')' opt_on_delete - { - Lex->col_list.empty(); /* Alloced by sql_alloc */ - } + REFERENCES table_ident + { + LEX *lex=Lex; + lex->fk_delete_opt= lex->fk_update_opt= lex->fk_match_option= 0; + lex->ref_list.empty(); + } + opt_ref_list + { + $$=$2; + } + +opt_ref_list: + /* empty */ {} + | '(' ref_list ')' opt_on_delete {} + +ref_list: + ref_list ',' ident { Lex->ref_list.push_back(new key_part_spec($3.str)); } + | ident { Lex->ref_list.push_back(new key_part_spec($1.str)); } + opt_on_delete: /* empty */ {} @@ -1136,19 +1160,19 @@ opt_on_delete_list: opt_on_delete_list opt_on_delete_item {} | opt_on_delete_item {} - opt_on_delete_item: - ON DELETE_SYM delete_option {} - | ON UPDATE_SYM delete_option {} - | MATCH FULL {} - | MATCH PARTIAL {} + ON DELETE_SYM delete_option { Lex->fk_delete_opt= $3; } + | ON UPDATE_SYM delete_option { Lex->fk_update_opt= $3; } + | MATCH FULL { Lex->fk_match_option= foreign_key::FK_MATCH_FULL; } + | MATCH PARTIAL { Lex->fk_match_option= foreign_key::FK_MATCH_PARTIAL; } + | MATCH SIMPLE_SYM { Lex->fk_match_option= foreign_key::FK_MATCH_SIMPLE; } delete_option: - RESTRICT {} - | CASCADE {} - | SET NULL_SYM {} - | NO_SYM ACTION {} - | SET DEFAULT {} + RESTRICT { $$= (int) foreign_key::FK_OPTION_RESTRICT; } + | CASCADE { $$= (int) foreign_key::FK_OPTION_CASCADE; } + | SET NULL_SYM { $$= (int) foreign_key::FK_OPTION_SET_NULL; } + | NO_SYM ACTION { $$= (int) foreign_key::FK_OPTION_NO_ACTION; } + | SET DEFAULT { $$= (int) foreign_key::FK_OPTION_DEFAULT; } key_type: opt_constraint PRIMARY_SYM KEY_SYM { $$= Key::PRIMARY; } @@ -1225,6 +1249,7 @@ alter: bzero((char*) &lex->create_info,sizeof(lex->create_info)); lex->create_info.db_type= DB_TYPE_DEFAULT; lex->create_info.row_type= ROW_TYPE_NOT_USED; + lex->create_info.table_charset=default_charset_info; lex->alter_keys_onoff=LEAVE_AS_IS; lex->simple_alter=1; } @@ -1246,23 +1271,9 @@ alter_list_item: lex->change= $3.str; lex->simple_alter=0; } field_spec opt_place - | MODIFY_SYM opt_column field_ident + | MODIFY_SYM opt_column field_spec { - LEX *lex=Lex; - lex->length=lex->dec=0; lex->type=0; lex->interval=0; - lex->default_value=0; - lex->simple_alter=0; - } - type opt_attribute - { - LEX *lex=Lex; - if (add_field_to_list($3.str, - (enum enum_field_types) $5, - lex->length,lex->dec,lex->type, - lex->default_value, $3.str, - lex->interval)) - YYABORT; - lex->simple_alter=0; + Lex->simple_alter=0; } opt_place | DROP opt_column field_ident opt_restrict @@ -3209,6 +3220,7 @@ keyword: | OFF {} | OPEN_SYM {} | PACK_KEYS_SYM {} + | PARTIAL {} | PASSWORD {} | PREV_SYM {} | PROCESS {} @@ -3220,8 +3232,8 @@ keyword: | RAID_CHUNKSIZE {} | RAID_STRIPED_SYM {} | RAID_TYPE {} - | RELAY_LOG_FILE_SYM {} - | RELAY_LOG_POS_SYM {} + | RELAY_LOG_FILE_SYM {} + | RELAY_LOG_POS_SYM {} | RELOAD {} | REPAIR {} | REPEATABLE_SYM {} @@ -3235,6 +3247,7 @@ keyword: | SERIALIZABLE_SYM {} | SESSION_SYM {} | SIGNED_SYM {} + | SIMPLE_SYM {} | SHARE_SYM {} | SHUTDOWN {} | SLAVE {} diff --git a/sql/table.cc b/sql/table.cc index 05a5c5e6bd2..a7571d2183f 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -47,19 +47,19 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, int j,error; uint rec_buff_length,n_length,int_length,records,key_parts,keys, interval_count,interval_parts,read_length,db_create_options; - uint key_info_length; + uint key_info_length, com_length; ulong pos; char index_file[FN_REFLEN], *names,*keynames; uchar head[288],*disk_buff,new_field_pack_flag; my_string record; const char **int_array; - bool new_frm_ver,use_hash, null_field_first; + bool use_hash, null_field_first; File file; Field **field_ptr,*reg_field; KEY *keyinfo; KEY_PART_INFO *key_part; - uchar *null_pos; - uint null_bit; + uchar *null_pos, *comment_pos; + uint null_bit, new_frm_ver, field_pack_length; SQL_CRYPT *crypted=0; DBUG_ENTER("openfrm"); DBUG_PRINT("enter",("name: '%s' form: %lx",name,outparam)); @@ -95,10 +95,11 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, if (my_read(file,(byte*) head,64,MYF(MY_NABP))) goto err_not_open; if (head[0] != (uchar) 254 || head[1] != 1 || - (head[2] != FRM_VER && head[2] != FRM_VER+1)) + (head[2] < FRM_VER && head[2] > FRM_VER+2)) goto err_not_open; /* purecov: inspected */ new_field_pack_flag=head[27]; - new_frm_ver= (head[2] == FRM_VER+1); + new_frm_ver= (head[2] - FRM_VER); + field_pack_length= new_frm_ver < 2 ? 11 : 15; error=3; if (!(pos=get_form_pos(file,head,(TYPELIB*) 0))) @@ -116,6 +117,8 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, outparam->raid_type= head[41]; outparam->raid_chunks= head[42]; outparam->raid_chunksize= uint4korr(head+43); + if (!(outparam->table_charset=get_charset((uint) head[38],MYF(0)))) + outparam->table_charset=default_charset_info; null_field_first=1; } outparam->db_record_offset=1; @@ -153,10 +156,22 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, for (i=0 ; i < keys ; i++, keyinfo++) { - keyinfo->flags= ((uint) strpos[0]) ^ HA_NOSAME; - keyinfo->key_length= (uint) uint2korr(strpos+1); - keyinfo->key_parts= (uint) strpos[3]; - strpos+=4; + if (new_frm_ver == 2) + { + keyinfo->flags= (uint) uint2korr(strpos) ^ HA_NOSAME; + keyinfo->key_length= (uint) uint2korr(strpos+2); + keyinfo->key_parts= (uint) strpos[4]; + keyinfo->algorithm= (enum ha_key_alg) strpos[5]; + strpos+=8; + } + else + { + keyinfo->flags= ((uint) strpos[0]) ^ HA_NOSAME; + keyinfo->key_length= (uint) uint2korr(strpos+1); + keyinfo->key_parts= (uint) strpos[3]; + keyinfo->algorithm= HA_KEY_ALG_UNDEF; + strpos+=4; + } keyinfo->key_part= key_part; keyinfo->rec_per_key= rec_per_key; @@ -167,7 +182,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, key_part->offset= (uint) uint2korr(strpos+2)-1; key_part->key_type= (uint) uint2korr(strpos+5); // key_part->field= (Field*) 0; // Will be fixed later - if (new_frm_ver) + if (new_frm_ver >= 1) { key_part->key_part_flag= *(strpos+4); key_part->length= (uint) uint2korr(strpos+7); @@ -193,26 +208,6 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, } keynames=(char*) key_part; strpos+= (strmov(keynames, (char *) strpos) - keynames)+1; - /* Test if new 4.0 format */ - if ((uint) (strpos - disk_buff) < key_info_length) - { - /* Read key types */ - keyinfo=outparam->key_info; - for (i=0 ; i < keys ; i++, keyinfo++) - { - keyinfo->algorithm= (enum ha_key_alg) *(strpos++); - /* Temporary fix to get spatial index to work */ - if (keyinfo->algorithm == HA_KEY_ALG_RTREE) - keyinfo->flags|= HA_SPATIAL; - } - } - else - { - /* Set key types to BTREE, BAR TODO: how to be with HASH/RBTREE? */ - keyinfo=outparam->key_info; - for (i=0 ; i < keys ; i++, keyinfo++) - keyinfo->algorithm= HA_KEY_ALG_BTREE; - } outparam->reclength = uint2korr((head+16)); if (*(head+26) == 1) outparam->system=1; /* one-record-database */ @@ -280,10 +275,11 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, interval_parts=uint2korr(head+272); int_length=uint2korr(head+274); outparam->null_fields=uint2korr(head+282); + com_length=uint2korr(head+284); outparam->comment=strdup_root(&outparam->mem_root, (char*) head+47); - DBUG_PRINT("info",("i_count: %d i_parts: %d index: %d n_length: %d int_length: %d", interval_count,interval_parts, outparam->keys,n_length,int_length)); + DBUG_PRINT("info",("i_count: %d i_parts: %d index: %d n_length: %d int_length: %d com_length: %d", interval_count,interval_parts, outparam->keys,n_length,int_length, com_length)); if (!(field_ptr = (Field **) alloc_root(&outparam->mem_root, @@ -291,12 +287,12 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, interval_count*sizeof(TYPELIB)+ (outparam->fields+interval_parts+ keys+3)*sizeof(my_string)+ - (n_length+int_length))))) + (n_length+int_length+com_length))))) goto err_not_open; /* purecov: inspected */ outparam->field=field_ptr; - read_length=((uint) (outparam->fields*11)+pos+ - (uint) (n_length+int_length)); + read_length=(uint) (outparam->fields * field_pack_length + + pos+ (uint) (n_length+int_length)); if (read_string(file,(gptr*) &disk_buff,read_length)) goto err_not_open; /* purecov: inspected */ if (crypted) @@ -306,13 +302,14 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, crypted=0; } strpos= disk_buff+pos; + comment_pos=disk_buff+read_length-com_length; outparam->intervals= (TYPELIB*) (field_ptr+outparam->fields+1); int_array= (const char **) (outparam->intervals+interval_count); names= (char*) (int_array+outparam->fields+interval_parts+keys+3); if (!interval_count) outparam->intervals=0; // For better debugging - memcpy((char*) names, strpos+(outparam->fields*11), + memcpy((char*) names, strpos+(outparam->fields*field_pack_length), (uint) (n_length+int_length)); fix_type_pointers(&int_array,&outparam->fieldnames,1,&names); @@ -346,43 +343,55 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, (hash_get_key) get_field_name,0, HASH_CASE_INSENSITIVE); -// BAR: dirty hack while waiting for new FRM -// BAR: take a charset information from table name -{ - const char* csname=strstr(alias,"_cs_"); - if(!csname || - !(outparam->table_charset=get_charset_by_name(csname+4,MYF(MY_WME)))) - outparam->table_charset=default_charset_info; -} - - for (i=0 ; i < outparam->fields; i++, strpos+= 11, field_ptr++) + for (i=0 ; i < outparam->fields; i++, strpos+=field_pack_length, field_ptr++) { uint pack_flag= uint2korr(strpos+6); uint interval_nr= (uint) strpos[10]; + enum_field_types field_type; + CHARSET_INFO *charset; + LEX_STRING comment; + if (new_frm_ver == 2) + { + /* new frm file in 4.1 */ + uint comment_length=uint2korr(strpos+13); + field_type=(enum_field_types) (uint) strpos[11]; + if (!(charset=get_charset((uint) strpos[12], MYF(0)))) + charset=outparam->table_charset; + if (!comment_length) + { + comment.str= (char*) ""; + comment.length=0; + } + else + { + comment.str= (char*) comment_pos; + comment.length= comment_length; + comment_pos+= comment_length; + } + } + else + { + /* old frm file */ + field_type= (enum_field_types) f_packtype(pack_flag); + charset=outparam->table_charset; + bzero((char*) &comment, sizeof(comment)); + } *field_ptr=reg_field= make_field(record+uint2korr(strpos+4), (uint32) strpos[3], // field_length null_pos,null_bit, pack_flag, + field_type, (Field::utype) MTYP_TYPENR((uint) strpos[8]), (interval_nr ? outparam->intervals+interval_nr-1 : (TYPELIB*) 0), outparam->fieldnames.type_names[i], outparam); + reg_field->comment=comment; if (!reg_field->binary()) - { - // BAR: dirty hack while waiting for new FRM - // BAR: take a charset information from field name - - Field_str* str_field=(Field_str*)reg_field; - const char* csname=strstr(str_field->field_name,"_cs_"); - CHARSET_INFO *fcs; - if (!csname || (!(fcs=get_charset_by_name(csname+4,MYF(MY_WME))))) - fcs=outparam->table_charset; - str_field->set_charset(fcs); - } + ((Field_str*) reg_field)->set_charset(charset); if (!(reg_field->flags & NOT_NULL_FLAG)) { if ((null_bit<<=1) == 256) @@ -956,9 +965,14 @@ ulong next_io_size(register ulong pos) } /* next_io_size */ -void append_unescaped(String *res,const char *pos) + /* Store in String an SQL quoted string */ + +void append_unescaped(String *res,const char *pos, uint length) { - for ( ; *pos ; pos++) + const char *end= pos+length; + res->append('\''); + + for (; pos != end ; pos++) { switch (*pos) { case 0: /* Must be escaped for 'mysql' */ @@ -986,6 +1000,7 @@ void append_unescaped(String *res,const char *pos) break; } } + res->append('\''); } /* Create a .frm file */ @@ -1009,7 +1024,7 @@ File create_frm(register my_string name, uint reclength, uchar *fileinfo, if ((file=my_create(name,CREATE_MODE,O_RDWR | O_TRUNC,MYF(MY_WME))) >= 0) { bzero((char*) fileinfo,64); - fileinfo[0]=(uchar) 254; fileinfo[1]= 1; fileinfo[2]= FRM_VER+1; // Header + fileinfo[0]=(uchar) 254; fileinfo[1]= 1; fileinfo[2]= FRM_VER+2; // Header fileinfo[3]= (uchar) ha_checktype(create_info->db_type); fileinfo[4]=1; int2store(fileinfo+6,IO_SIZE); /* Next block starts here */ @@ -1025,6 +1040,7 @@ File create_frm(register my_string name, uint reclength, uchar *fileinfo, int2store(fileinfo+30,create_info->table_options); fileinfo[32]=0; // No filename anymore int4store(fileinfo+34,create_info->avg_row_length); + fileinfo[38]= create_info->table_charset->number; fileinfo[40]= (uchar) create_info->row_type; fileinfo[41]= (uchar) create_info->raid_type; fileinfo[42]= (uchar) create_info->raid_chunks; diff --git a/sql/unireg.cc b/sql/unireg.cc index 16f51658313..7c4f199ab7f 100644 --- a/sql/unireg.cc +++ b/sql/unireg.cc @@ -28,7 +28,7 @@ #include "mysql_priv.h" #include -#define FCOMP 11 /* Byte per packat f{lt */ +#define FCOMP 11 /* Byte for packed field */ static uchar * pack_screens(List &create_fields, uint *info_length, uint *screens, bool small_file); @@ -255,10 +255,11 @@ static uint pack_keys(uchar *keybuff,uint key_count,KEY *keyinfo) key_parts=0; for (key=keyinfo,end=keyinfo+key_count ; key != end ; key++) { - pos[0]=(uchar) (key->flags ^ HA_NOSAME); - int2store(pos+1,key->key_length); - pos[3]=key->key_parts; - pos+=4; + int2store(pos, (key->flags ^ HA_NOSAME)); + int2store(pos+2,key->key_length); + pos[4]= (uchar) key->key_parts; + pos[5]= (uchar) key->algorithm; + pos+=8; key_parts+=key->key_parts; DBUG_PRINT("loop",("flags: %d key_parts: %d at %lx", key->flags,key->key_parts, @@ -290,13 +291,6 @@ static uint pack_keys(uchar *keybuff,uint key_count,KEY *keyinfo) } *(pos++)=0; - /* For MySQL 4.0; Store key algoritms last */ - key_alg_pos= pos; - for (key=keyinfo ; key != end ; key++) - { - *(pos++)= (uchar) key->algorithm; - } - keybuff[0]=(uchar) key_count; keybuff[1]=(uchar) key_parts; length=(uint) (keyname_pos-keybuff); @@ -314,8 +308,8 @@ static bool pack_header(uchar *forminfo, enum db_type table_type, uint info_length, uint screens,uint table_options, handler *file) { - uint length,int_count,int_length,no_empty, int_parts, - time_stamp_pos,null_fields; + uint length,int_count,int_length,no_empty, int_parts; + uint time_stamp_pos,null_fields, com_length; ulong reclength,totlength,n_length; DBUG_ENTER("pack_header"); @@ -326,7 +320,8 @@ static bool pack_header(uchar *forminfo, enum db_type table_type, } totlength=reclength=0L; - no_empty=int_count=int_parts=int_length=time_stamp_pos=null_fields=0; + no_empty=int_count=int_parts=int_length=time_stamp_pos=null_fields= + com_length=0; n_length=2L; /* Check fields */ @@ -336,6 +331,7 @@ static bool pack_header(uchar *forminfo, enum db_type table_type, while ((field=it++)) { totlength+= field->length; + com_length+= field->comment.length; if (MTYP_TYPENR(field->unireg_check) == Field::NOEMPTY || field->unireg_check & MTYP_NOEMPTY_BIT) { @@ -378,14 +374,15 @@ static bool pack_header(uchar *forminfo, enum db_type table_type, /* Hack to avoid bugs with small static rows in MySQL */ reclength=max(file->min_record_length(table_options),reclength); if (info_length+(ulong) create_fields.elements*FCOMP+288+ - n_length+int_length > 65535L || int_count > 255) + n_length+int_length+com_length > 65535L || int_count > 255) { my_error(ER_TOO_MANY_FIELDS,MYF(0)); DBUG_RETURN(1); } bzero((char*)forminfo,288); - length=info_length+create_fields.elements*FCOMP+288+n_length+int_length; + length=(info_length+create_fields.elements*FCOMP+288+n_length+int_length+ + com_length); int2store(forminfo,length); forminfo[256] = (uint8) screens; int2store(forminfo+258,create_fields.elements); @@ -401,6 +398,7 @@ static bool pack_header(uchar *forminfo, enum db_type table_type, int2store(forminfo+278,80); /* Columns needed */ int2store(forminfo+280,22); /* Rows needed */ int2store(forminfo+282,null_fields); + int2store(forminfo+284,com_length); DBUG_RETURN(0); } /* pack_header */ @@ -438,7 +436,7 @@ static uint get_interval_id(uint *int_count,List &create_fields, static bool pack_fields(File file,List &create_fields) { reg2 uint i; - uint int_count; + uint int_count, comment_length=0; uchar buff[MAX_FIELD_WIDTH]; create_field *field; DBUG_ENTER("pack_fields"); @@ -459,6 +457,11 @@ static bool pack_fields(File file,List &create_fields) int2store(buff+6,field->pack_flag); int2store(buff+8,field->unireg_check); buff[10]= (uchar) field->interval_id; + buff[11]= (uchar) field->sql_type; + buff[12]= (uchar) (field->charset ? field->charset->number : + default_charset_info->number); + int2store(buff, field->comment.length); + comment_length+= field->comment.length; set_if_bigger(int_count,field->interval_id); if (my_write(file,(byte*) buff,FCOMP,MYF_RW)) DBUG_RETURN(1); @@ -505,6 +508,18 @@ static bool pack_fields(File file,List &create_fields) if (my_write(file,(byte*) tmp.ptr(),tmp.length(),MYF_RW)) DBUG_RETURN(1); } + if (comment_length) + { + it.rewind(); + int_count=0; + while ((field=it++)) + { + if (field->comment.length) + if (my_write(file, (byte*) field->comment.str, field->comment.length, + MYF_RW)) + DBUG_RETURN(1); + } + } DBUG_RETURN(0); } @@ -557,6 +572,7 @@ static bool make_empty_rec(File file,enum db_type table_type, null_pos+null_count/8, 1 << (null_count & 7), field->pack_flag, + field->sql_type, field->unireg_check, field->interval, field->field_name, -- cgit v1.2.1 From ebbcb0f391d7df364e0ccc6bca706456e9aadbf7 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 3 Jun 2002 10:50:19 +0300 Subject: new error messages (foreign key) --- sql/share/czech/errmsg.txt | 6 ++++-- sql/share/danish/errmsg.txt | 4 +++- sql/share/dutch/errmsg.txt | 6 ++++-- sql/share/english/errmsg.txt | 4 +++- sql/share/estonian/errmsg.txt | 4 +++- sql/share/french/errmsg.txt | 6 ++++-- sql/share/german/errmsg.txt | 4 +++- sql/share/greek/errmsg.txt | 4 +++- sql/share/hungarian/errmsg.txt | 6 ++++-- sql/share/italian/errmsg.txt | 6 ++++-- sql/share/japanese/errmsg.txt | 6 ++++-- sql/share/korean/errmsg.txt | 6 ++++-- sql/share/norwegian-ny/errmsg.txt | 6 ++++-- sql/share/norwegian/errmsg.txt | 6 ++++-- sql/share/polish/errmsg.txt | 6 ++++-- sql/share/portuguese/errmsg.txt | 4 +++- sql/share/romanian/errmsg.txt | 4 +++- sql/share/russian/errmsg.txt | 4 +++- sql/share/serbian/errmsg.txt | 4 +++- sql/share/slovak/errmsg.txt | 6 ++++-- sql/share/spanish/errmsg.txt | 6 ++++-- sql/share/swedish/errmsg.txt | 8 +++++--- sql/share/ukrainian/errmsg.txt | 4 +++- 23 files changed, 83 insertions(+), 37 deletions(-) diff --git a/sql/share/czech/errmsg.txt b/sql/share/czech/errmsg.txt index 950ca4f6623..48c42b98261 100644 --- a/sql/share/czech/errmsg.txt +++ b/sql/share/czech/errmsg.txt @@ -156,7 +156,7 @@ "%-.16s p-Bøíkaz nepøístupný pro u¾ivatele: '%-.32s@%-.64s' pro sloupec '%-.64s' v tabulce '%-.64s'", "Neplatn-Bý pøíkaz GRANT/REVOKE. Prosím, pøeètìte si v manuálu, jaká privilegia je mo¾né pou¾ít.", "Argument p-Bøíkazu GRANT u¾ivatel nebo stroj je pøíli¹ dlouhý", -"Tabulka '%-64s.%s' neexistuje", +"Tabulka '%-.64s.%s' neexistuje", "Neexistuje odpov-Bídající grant pro u¾ivatele '%-.32s' na stroji '%-.64s' pro tabulku '%-.64s'", "Pou-B¾itý pøíkaz není v této verzi MySQL povolen", "Va-B¹e syntaxe je nìjaká divná", @@ -236,4 +236,6 @@ "Can't execute the query because you have a conflicting read lock", "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", -"User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"User '%-.64s' has exceeded the '%s' resource (current value: %ld)", +"Wrong foreign key definition for '%-.64s': %s", +"Key reference and table reference doesn't match", diff --git a/sql/share/danish/errmsg.txt b/sql/share/danish/errmsg.txt index d87ed4ee629..5fde80fd631 100644 --- a/sql/share/danish/errmsg.txt +++ b/sql/share/danish/errmsg.txt @@ -230,4 +230,6 @@ "Can't execute the query because you have a conflicting read lock", "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", -"User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"User '%-.64s' has exceeded the '%s' resource (current value: %ld)", +"Wrong foreign key definition for '%-.64s': %s", +"Key reference and table reference doesn't match", diff --git a/sql/share/dutch/errmsg.txt b/sql/share/dutch/errmsg.txt index c8b47cb3c19..6d48be9e724 100644 --- a/sql/share/dutch/errmsg.txt +++ b/sql/share/dutch/errmsg.txt @@ -155,7 +155,7 @@ "%-.16s commando geweigerd voor gebruiker: '%-.32s@%-.64s' voor kolom '%-.64s' in tabel '%-.64s'", "Foutief GRANT/REVOKE commando. Raadpleeg de handleiding welke priveleges gebruikt kunnen worden.", "De host of gebruiker parameter voor GRANT is te lang", -"Tabel '%-64s.%s' bestaat niet", +"Tabel '%-.64s.%s' bestaat niet", "Deze toegang (GRANT) is niet toegekend voor gebruiker '%-.32s' op host '%-.64s' op tabel '%-.64s'", "Het used commando is niet toegestaan in deze MySQL versie", "Er is iets fout in de gebruikte syntax", @@ -235,4 +235,6 @@ "Kan de query niet uitvoeren vanwege een conflicterende read lock", "Het combineren van transactionele en niet-transactionele tabellen is uitgeschakeld.", "Optie '%s' tweemaal gebruikt in opdracht", -"Gebruiker '%-64s' heeft het maximale gebruik van de '%s' faciliteit overschreden (huidige waarde: %ld)", +"Gebruiker '%-.64s' heeft het maximale gebruik van de '%s' faciliteit overschreden (huidige waarde: %ld)", +"Wrong foreign key definition for '%-.64s': %s", +"Key reference and table reference doesn't match", diff --git a/sql/share/english/errmsg.txt b/sql/share/english/errmsg.txt index 5033449c266..60710a07728 100644 --- a/sql/share/english/errmsg.txt +++ b/sql/share/english/errmsg.txt @@ -227,4 +227,6 @@ "Can't execute the query because you have a conflicting read lock", "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", -"User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"User '%-.64s' has exceeded the '%s' resource (current value: %ld)", +"Wrong foreign key definition for '%-.64s': %s", +"Key reference and table reference doesn't match", diff --git a/sql/share/estonian/errmsg.txt b/sql/share/estonian/errmsg.txt index 6a83468eae5..f902b93aa1f 100644 --- a/sql/share/estonian/errmsg.txt +++ b/sql/share/estonian/errmsg.txt @@ -232,4 +232,6 @@ "Ei suuda täita päringut konfliktse luku tõttu", "Transaktsioone toetavate ning mittetoetavate tabelite kooskasutamine ei ole lubatud", "Määrangut '%s' on lauses kasutatud topelt", -"User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"User '%-.64s' has exceeded the '%s' resource (current value: %ld)", +"Wrong foreign key definition for '%-.64s': %s", +"Key reference and table reference doesn't match", diff --git a/sql/share/french/errmsg.txt b/sql/share/french/errmsg.txt index cf3e3e845e4..6473b2a71f3 100644 --- a/sql/share/french/errmsg.txt +++ b/sql/share/french/errmsg.txt @@ -147,7 +147,7 @@ "%-.16s command denied to user: '%-.32s@%-.64s' for column '%-.64s' in table '%-.64s'", "Illegal GRANT/REVOKE command. Please consult the manual which privleges can be used.", "The host or user argument to GRANT is too long", -"Table '%-64s.%s' doesn't exist", +"Table '%-.64s.%s' doesn't exist", "There is no such grant defined for user '%-.32s' on host '%-.64s' on table '%-.64s'", "The used command is not allowed with this MySQL version", "Something is wrong in your syntax", @@ -227,4 +227,6 @@ "Can't execute the query because you have a conflicting read lock", "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", -"User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"User '%-.64s' has exceeded the '%s' resource (current value: %ld)", +"Wrong foreign key definition for '%-.64s': %s", +"Key reference and table reference doesn't match", diff --git a/sql/share/german/errmsg.txt b/sql/share/german/errmsg.txt index 19d46fabab8..271fe8cbb66 100644 --- a/sql/share/german/errmsg.txt +++ b/sql/share/german/errmsg.txt @@ -230,4 +230,6 @@ "Can't execute the query because you have a conflicting read lock", "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", -"User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"User '%-.64s' has exceeded the '%s' resource (current value: %ld)", +"Wrong foreign key definition for '%-.64s': %s", +"Key reference and table reference doesn't match", diff --git a/sql/share/greek/errmsg.txt b/sql/share/greek/errmsg.txt index f9b4f137f82..d003c5c8ce6 100644 --- a/sql/share/greek/errmsg.txt +++ b/sql/share/greek/errmsg.txt @@ -227,4 +227,6 @@ "Can't execute the query because you have a conflicting read lock", "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", -"User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"User '%-.64s' has exceeded the '%s' resource (current value: %ld)", +"Wrong foreign key definition for '%-.64s': %s", +"Key reference and table reference doesn't match", diff --git a/sql/share/hungarian/errmsg.txt b/sql/share/hungarian/errmsg.txt index 38877371243..84ba644ce45 100644 --- a/sql/share/hungarian/errmsg.txt +++ b/sql/share/hungarian/errmsg.txt @@ -149,7 +149,7 @@ "%-.16s parancs a '%-.32s@%-.64s' felhasznalo szamara nem engedelyezett a '%-.64s' mezo eseten a '%-.64s' tablaban", "Ervenytelen GRANT/REVOKE parancs. Kerem, nezze meg a kezikonyvben, milyen jogok lehetsegesek", "A host vagy felhasznalo argumentuma tul hosszu a GRANT parancsban", -"A '%-64s.%s' tabla nem letezik", +"A '%-.64s.%s' tabla nem letezik", "A '%-.32s' felhasznalo szamara a '%-.64s' host '%-.64s' tablajaban ez a parancs nem engedelyezett", "A hasznalt parancs nem engedelyezett ebben a MySQL verzioban", "Szintaktikai hiba", @@ -229,4 +229,6 @@ "Can't execute the query because you have a conflicting read lock", "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", -"User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"User '%-.64s' has exceeded the '%s' resource (current value: %ld)", +"Wrong foreign key definition for '%-.64s': %s", +"Key reference and table reference doesn't match", diff --git a/sql/share/italian/errmsg.txt b/sql/share/italian/errmsg.txt index e8cfd5a63a9..37f574966b6 100644 --- a/sql/share/italian/errmsg.txt +++ b/sql/share/italian/errmsg.txt @@ -147,7 +147,7 @@ "Comando %-.16s negato per l'utente: '%-.32s@%-.64s' sulla colonna '%-.64s' della tabella '%-.64s'", "Comando GRANT/REVOKE illegale. Prego consultare il manuale per sapere quali privilegi possono essere usati.", "L'argomento host o utente per la GRANT e` troppo lungo", -"La tabella '%-64s.%s' non esiste", +"La tabella '%-.64s.%s' non esiste", "GRANT non definita per l'utente '%-.32s' dalla macchina '%-.64s' sulla tabella '%-.64s'", "Il comando utilizzato non e` supportato in questa versione di MySQL", "Errore di sintassi nella query SQL", @@ -227,4 +227,6 @@ "Can't execute the query because you have a conflicting read lock", "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", -"User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"User '%-.64s' has exceeded the '%s' resource (current value: %ld)", +"Wrong foreign key definition for '%-.64s': %s", +"Key reference and table reference doesn't match", diff --git a/sql/share/japanese/errmsg.txt b/sql/share/japanese/errmsg.txt index 98bc099954f..157f891b310 100644 --- a/sql/share/japanese/errmsg.txt +++ b/sql/share/japanese/errmsg.txt @@ -149,7 +149,7 @@ "¥³¥Þ¥ó¥É %-.16s ¤Ï ¥æ¡¼¥¶¡¼ '%-.32s@%-.64s'\n ¥«¥é¥à '%-.64s' ¥Æ¡¼¥Ö¥ë '%-.64s' ¤ËÂФ·¤Æµö²Ä¤µ¤ì¤Æ¤¤¤Þ¤»¤ó", "Illegal GRANT/REVOKE command. Please consult the manual which privleges can be used.", "The host or user argument to GRANT is too long", -"Table '%-64s.%s' doesn't exist", +"Table '%-.64s.%s' doesn't exist", "There is no such grant defined for user '%-.32s' on host '%-.64s' on table '%-.64s'", "The used command is not allowed with this MySQL version", "Something is wrong in your syntax", @@ -229,4 +229,6 @@ "Can't execute the query because you have a conflicting read lock", "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", -"User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"User '%-.64s' has exceeded the '%s' resource (current value: %ld)", +"Wrong foreign key definition for '%-.64s': %s", +"Key reference and table reference doesn't match", diff --git a/sql/share/korean/errmsg.txt b/sql/share/korean/errmsg.txt index f6cc890cb39..12389919463 100644 --- a/sql/share/korean/errmsg.txt +++ b/sql/share/korean/errmsg.txt @@ -147,7 +147,7 @@ "'%-.16s' ¸í·ÉÀº ´ÙÀ½ »ç¿ëÀÚ¿¡°Ô °ÅºÎµÇ¾ú½À´Ï´Ù. : '%-.32s@%-.64s' for Ä®·³ '%-.64s' in Å×À̺í '%-.64s'", "À߸øµÈ GRANT/REVOKE ¸í·É. ¾î¶² ±Ç¸®¿Í ½ÂÀÎÀÌ »ç¿ëµÇ¾î Áú ¼ö ÀÖ´ÂÁö ¸Þ´º¾óÀ» º¸½Ã¿À.", "½ÂÀÎ(GRANT)À» À§ÇÏ¿© »ç¿ëÇÑ »ç¿ëÀÚ³ª È£½ºÆ®ÀÇ °ªµéÀÌ ³Ê¹« ±é´Ï´Ù.", -"Å×À̺í '%-64s.%s' ´Â Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù.", +"Å×À̺í '%-.64s.%s' ´Â Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù.", "»ç¿ëÀÚ '%-.32s'(È£½ºÆ® '%-.64s')´Â Å×À̺í '%-.64s'¸¦ »ç¿ëÇϱâ À§ÇÏ¿© Á¤ÀÇµÈ ½ÂÀÎÀº ¾ø½À´Ï´Ù. ", "»ç¿ëµÈ ¸í·ÉÀº ÇöÀçÀÇ MySQL ¹öÁ¯¿¡¼­´Â ÀÌ¿ëµÇÁö ¾Ê½À´Ï´Ù.", "SQL ±¸¹®¿¡ ¿À·ù°¡ ÀÖ½À´Ï´Ù.", @@ -227,4 +227,6 @@ "Can't execute the query because you have a conflicting read lock", "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", -"User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"User '%-.64s' has exceeded the '%s' resource (current value: %ld)", +"Wrong foreign key definition for '%-.64s': %s", +"Key reference and table reference doesn't match", diff --git a/sql/share/norwegian-ny/errmsg.txt b/sql/share/norwegian-ny/errmsg.txt index adffc27949f..40a25ac35b4 100644 --- a/sql/share/norwegian-ny/errmsg.txt +++ b/sql/share/norwegian-ny/errmsg.txt @@ -149,7 +149,7 @@ "%-.16s command denied to user: '%-.32s@%-.64s' for column '%-.64s' in table '%-.64s'", "Illegal GRANT/REVOKE command. Please consult the manual which privleges can be used.", "The host or user argument to GRANT is too long", -"Table '%-64s.%s' doesn't exist", +"Table '%-.64s.%s' doesn't exist", "There is no such grant defined for user '%-.32s' on host '%-.64s' on table '%-.64s'", "The used command is not allowed with this MySQL version", "Something is wrong in your syntax", @@ -229,4 +229,6 @@ "Can't execute the query because you have a conflicting read lock", "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", -"User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"User '%-.64s' has exceeded the '%s' resource (current value: %ld)", +"Wrong foreign key definition for '%-.64s': %s", +"Key reference and table reference doesn't match", diff --git a/sql/share/norwegian/errmsg.txt b/sql/share/norwegian/errmsg.txt index 09a1ea4684c..afe15ba3e44 100644 --- a/sql/share/norwegian/errmsg.txt +++ b/sql/share/norwegian/errmsg.txt @@ -149,7 +149,7 @@ "%-.16s command denied to user: '%-.32s@%-.64s' for column '%-.64s' in table '%-.64s'", "Illegal GRANT/REVOKE command. Please consult the manual which privleges can be used.", "The host or user argument to GRANT is too long", -"Table '%-64s.%s' doesn't exist", +"Table '%-.64s.%s' doesn't exist", "There is no such grant defined for user '%-.32s' on host '%-.64s' on table '%-.64s'", "The used command is not allowed with this MySQL version", "Something is wrong in your syntax", @@ -229,4 +229,6 @@ "Can't execute the query because you have a conflicting read lock", "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", -"User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"User '%-.64s' has exceeded the '%s' resource (current value: %ld)", +"Wrong foreign key definition for '%-.64s': %s", +"Key reference and table reference doesn't match", diff --git a/sql/share/polish/errmsg.txt b/sql/share/polish/errmsg.txt index 12a9bd358b5..ff8dcc70d49 100644 --- a/sql/share/polish/errmsg.txt +++ b/sql/share/polish/errmsg.txt @@ -151,7 +151,7 @@ "%-.16s command denied to user: '%-.32s@%-.64s' for column '%-.64s' in table '%-.64s'", "Illegal GRANT/REVOKE command. Please consult the manual which privleges can be used.", "The host or user argument to GRANT is too long", -"Table '%-64s.%s' doesn't exist", +"Table '%-.64s.%s' doesn't exist", "There is no such grant defined for user '%-.32s' on host '%-.64s' on table '%-.64s'", "The used command is not allowed with this MySQL version", "Something is wrong in your syntax", @@ -231,4 +231,6 @@ "Can't execute the query because you have a conflicting read lock", "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", -"User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"User '%-.64s' has exceeded the '%s' resource (current value: %ld)", +"Wrong foreign key definition for '%-.64s': %s", +"Key reference and table reference doesn't match", diff --git a/sql/share/portuguese/errmsg.txt b/sql/share/portuguese/errmsg.txt index b7feb0a7b0d..55f986d14a3 100644 --- a/sql/share/portuguese/errmsg.txt +++ b/sql/share/portuguese/errmsg.txt @@ -227,4 +227,6 @@ "Can't execute the query because you have a conflicting read lock", "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", -"User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"User '%-.64s' has exceeded the '%s' resource (current value: %ld)", +"Wrong foreign key definition for '%-.64s': %s", +"Key reference and table reference doesn't match", diff --git a/sql/share/romanian/errmsg.txt b/sql/share/romanian/errmsg.txt index 8e48cabfc39..7a56df6e74e 100644 --- a/sql/share/romanian/errmsg.txt +++ b/sql/share/romanian/errmsg.txt @@ -231,4 +231,6 @@ "Can't execute the query because you have a conflicting read lock", "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", -"User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"User '%-.64s' has exceeded the '%s' resource (current value: %ld)", +"Wrong foreign key definition for '%-.64s': %s", +"Key reference and table reference doesn't match", diff --git a/sql/share/russian/errmsg.txt b/sql/share/russian/errmsg.txt index 8ed33ec21a0..f3e778d6e28 100644 --- a/sql/share/russian/errmsg.txt +++ b/sql/share/russian/errmsg.txt @@ -230,4 +230,6 @@ "îÅ×ÏÚÍÏÖÎÏ ×ÙÐÏÌÎÉÔØ ÚÁÐÒÏÓ ÉÚ-ÚÁ ËÏÎÆÌÉËÔÎÏÊ ÂÌÏËÉÒÏ×ËÉ ÞÔÅÎÉÑ", "ïÄÎÏ×ÒÅÍÅÎÎÏÅ ÉÓÐÏÌØÚÏ×ÁÎÉÅ transactional É non-transactional ÔÁÂÌÉà ÏÔËÌÀÞÅÎÏ", "ïÐÃÉÑ '%s' ÉÓÐÏÌØÚÏ×ÁÎÁ Ä×ÁÖÄÙ", -"User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"User '%-.64s' has exceeded the '%s' resource (current value: %ld)", +"Wrong foreign key definition for '%-.64s': %s", +"Key reference and table reference doesn't match", diff --git a/sql/share/serbian/errmsg.txt b/sql/share/serbian/errmsg.txt index 105860f0e4b..1b9ffe755f1 100644 --- a/sql/share/serbian/errmsg.txt +++ b/sql/share/serbian/errmsg.txt @@ -233,4 +233,6 @@ "Ne mogu da izvršim upit zbog toga što imate zakljuèavanja èitanja podataka u konfliktu", "Mešanje tabela koje podržavaju transakcije i onih koje ne podržavaju transakcije je iskljuèeno", "Opcija '%s' je upotrebljena dva puta u istom iskazu", -"User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"User '%-.64s' has exceeded the '%s' resource (current value: %ld)", +"Wrong foreign key definition for '%-.64s': %s", +"Key reference and table reference doesn't match", diff --git a/sql/share/slovak/errmsg.txt b/sql/share/slovak/errmsg.txt index 06503cdf69e..aa2701022cc 100644 --- a/sql/share/slovak/errmsg.txt +++ b/sql/share/slovak/errmsg.txt @@ -155,7 +155,7 @@ "%-.16s command denied to user: '%-.32s@%-.64s' for column '%-.64s' in table '%-.64s'", "Illegal GRANT/REVOKE command. Please consult the manual which privleges can be used.", "The host or user argument to GRANT is too long", -"Table '%-64s.%s' doesn't exist", +"Table '%-.64s.%s' doesn't exist", "There is no such grant defined for user '%-.32s' on host '%-.64s' on table '%-.64s'", "The used command is not allowed with this MySQL version", "Something is wrong in your syntax", @@ -235,4 +235,6 @@ "Can't execute the query because you have a conflicting read lock", "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", -"User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"User '%-.64s' has exceeded the '%s' resource (current value: %ld)", +"Wrong foreign key definition for '%-.64s': %s", +"Key reference and table reference doesn't match", diff --git a/sql/share/spanish/errmsg.txt b/sql/share/spanish/errmsg.txt index 4240581c5b8..26306dfa3d9 100644 --- a/sql/share/spanish/errmsg.txt +++ b/sql/share/spanish/errmsg.txt @@ -148,7 +148,7 @@ "%-.16s comando negado para usuario: '%-.32s@%-.64s' para columna '%-.64s' en la tabla '%-.64s'", "Ilegal comando GRANT/REVOKE. Por favor consulte el manual para cuales permisos pueden ser usados.", "El argumento para servidor o usuario para GRANT es demasiado grande", -"Tabla '%-64s.%s' no existe", +"Tabla '%-.64s.%s' no existe", "No existe tal permiso definido para usuario '%-.32s' en el servidor '%-.64s' en la tabla '%-.64s'", "El comando usado no es permitido con esta versión de MySQL", "Algo está equivocado en su sintax", @@ -228,4 +228,6 @@ "Can't execute the query because you have a conflicting read lock", "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", -"User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"User '%-.64s' has exceeded the '%s' resource (current value: %ld)", +"Wrong foreign key definition for '%-.64s': %s", +"Key reference and table reference doesn't match", diff --git a/sql/share/swedish/errmsg.txt b/sql/share/swedish/errmsg.txt index e774f4a2c5c..3040d434354 100644 --- a/sql/share/swedish/errmsg.txt +++ b/sql/share/swedish/errmsg.txt @@ -61,7 +61,7 @@ "Kommandot har både sum functions och enkla funktioner", "Antalet kolumner motsvarar inte antalet värden", "Kolumn namn '%-.64s' är för långt", -"Kolumn namn '%-64s finns flera gånger", +"Kolumn namn '%-.64s finns flera gånger", "Nyckel namn '%-.64s' finns flera gånger", "Dubbel nyckel '%-.64s' för nyckel: %d", "Felaktigt kolumn typ för kolumn: '%-.64s'", @@ -147,7 +147,7 @@ "%-.16s ej tillåtet för '%-.32s@%-.64s'\n för kolumn '%-.64s' i tabell '%-.64s'", "Felaktigt GRANT privilegium använt", "Felaktigt maskinnamn eller användarnamn använt med GRANT", -"Det finns ingen tabell som heter '%-64s.%s'" +"Det finns ingen tabell som heter '%-.64s.%s'" "Det finns inget privilegium definierat för användare '%-.32s' på '%-.64s' för tabell '%-.64s'", "Du kan inte använda detta kommando med denna MySQL version", "Du har något fel i din syntax", @@ -227,4 +227,6 @@ "Kan inte utföra kommandot emedan du har ett READ lås", "Blandning av transaktionella och icke-transaktionella tabeller är inaktiverat", "Option '%s' användes två gånger", -"Användare '%-64s' har överskridit '%s' (nuvarande värde: %ld)", +"Användare '%-.64s' har överskridit '%s' (nuvarande värde: %ld)", +"Wrong foreign key definition for '%-.64s': %s", +"Key reference and table reference doesn't match", diff --git a/sql/share/ukrainian/errmsg.txt b/sql/share/ukrainian/errmsg.txt index c4c89433331..d32ec16952e 100644 --- a/sql/share/ukrainian/errmsg.txt +++ b/sql/share/ukrainian/errmsg.txt @@ -232,4 +232,6 @@ "Can't execute the query because you have a conflicting read lock", "Mixing of transactional and non-transactional tables is disabled", "Option '%s' used twice in statement", -"User '%-64s' has exceeded the '%s' resource (current value: %ld)", +"User '%-.64s' has exceeded the '%s' resource (current value: %ld)", +"Wrong foreign key definition for '%-.64s': %s", +"Key reference and table reference doesn't match", -- cgit v1.2.1 From 08526ba32d9f4c353640b928edfdde862efc8596 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 4 Jun 2002 08:23:57 +0300 Subject: Changes for new binary .frm format Fixes after last merge from 4.0. (Code not yet complete, need anoter merge from 4.0) heap/hp_write.c: cleanup myisam/ft_boolean_search.c: Fixed tree handling to new format mysql-test/r/alter_table.result: SHOW FULL COLUMN FROM TABLE now returns comment mysql-test/r/func_math.result: Updated results mysql-test/r/heap_btree.result: Portability fix mysql-test/r/isam.result: SHOW FULL COLUMN FROM TABLE now returns comment mysql-test/r/show_check.result: SHOW FULL COLUMN FROM TABLE now returns comment mysql-test/t/heap_btree.test: Portability fix mysql-test/t/show_check.test: SHOW FULL COLUMN FROM TABLE now returns comment sql/field.cc: Fix for comment handling sql/field.h: Added CHARSET_INFO to field structure sql/item_cmpfunc.cc: Fixed like to use system charset (need to be updated) sql/item_func.cc: Update to new charset handling sql/mysql_priv.h: cleanup sql/sql_base.cc: Added charset to HA_CREATE_INFO sql/sql_delete.cc: Added charset to HA_CREATE_INFO sql/sql_parse.cc: Added charset to HA_CREATE_INFO sql/sql_select.cc: cleanup sql/sql_show.cc: charset change sql/sql_string.h: cleanup sql/sql_table.cc: cleanup sql/sql_yacc.yy: Go back to old code for ALTER table ... MODIFY sql/table.cc: fixed comment handling sql/unireg.cc: new field format --- heap/hp_write.c | 2 +- myisam/ft_boolean_search.c | 15 +++++++++------ mysql-test/r/alter_table.result | 8 ++++---- mysql-test/r/func_math.result | 2 ++ mysql-test/r/heap_btree.result | 25 +++++++++++++++++++------ mysql-test/r/isam.result | 8 ++++---- mysql-test/r/show_check.result | 19 +++++++++++++++++-- mysql-test/t/heap_btree.test | 9 ++++++++- mysql-test/t/show_check.test | 5 ++++- sql/field.cc | 5 +++++ sql/field.h | 7 ++++--- sql/item_cmpfunc.cc | 31 ++++++++++++++++++++----------- sql/item_func.cc | 10 ++++++---- sql/mysql_priv.h | 2 +- sql/sql_base.cc | 10 ++++++---- sql/sql_delete.cc | 8 ++++++-- sql/sql_parse.cc | 3 +++ sql/sql_select.cc | 1 + sql/sql_show.cc | 3 ++- sql/sql_string.h | 9 +++++---- sql/sql_table.cc | 6 ++++-- sql/sql_yacc.yy | 25 +++++++++++++++++++------ sql/table.cc | 21 +++++++++++---------- sql/unireg.cc | 13 +++++++------ 24 files changed, 168 insertions(+), 79 deletions(-) diff --git a/heap/hp_write.c b/heap/hp_write.c index fcfe922d9c0..45797d7a733 100644 --- a/heap/hp_write.c +++ b/heap/hp_write.c @@ -89,7 +89,7 @@ err: */ int hp_rb_write_key(HP_INFO *info, HP_KEYDEF *keyinfo, const byte *record, - byte *recpos) + byte *recpos) { heap_rb_param custom_arg; diff --git a/myisam/ft_boolean_search.c b/myisam/ft_boolean_search.c index f2f3a806892..6829ac95f1e 100644 --- a/myisam/ft_boolean_search.c +++ b/myisam/ft_boolean_search.c @@ -426,10 +426,11 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record) if (!ftb->queue.elements) return my_errno=HA_ERR_END_OF_FILE; - while(ftb->state == INDEX_SEARCH && - (curdoc=((FTB_WORD *)queue_top(& ftb->queue))->docid[0]) != HA_POS_ERROR) + while (ftb->state == INDEX_SEARCH && + (curdoc=((FTB_WORD *)queue_top(& ftb->queue))->docid[0]) != + HA_POS_ERROR) { - while (curdoc==(ftbw=(FTB_WORD *)queue_top(& ftb->queue))->docid[0]) + while (curdoc == (ftbw=(FTB_WORD *)queue_top(& ftb->queue))->docid[0]) { _ftb_climb_the_tree(ftb, ftbw, 0); @@ -467,13 +468,15 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record) ftbe->yesses>=(ftbe->ythresh-ftbe->yweaks) && !ftbe->nos) { /* curdoc matched ! */ - if (is_tree_inited(& ftb->no_dupes) && - tree_insert(& ftb->no_dupes, &curdoc, 0)->count >1) + if (is_tree_inited(&ftb->no_dupes) && + tree_insert(&ftb->no_dupes, &curdoc, 0, + ftb->no_dupes.custom_arg)->count >1) /* but it managed to get past this line once */ continue; info->lastpos=curdoc; - info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED); /* why is this ? */ + /* Clear all states, except that the table was updated */ + info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED); if (!(*info->read_record)(info,curdoc,record)) { diff --git a/mysql-test/r/alter_table.result b/mysql-test/r/alter_table.result index f0c3e2d162a..ab03cfde2c8 100644 --- a/mysql-test/r/alter_table.result +++ b/mysql-test/r/alter_table.result @@ -50,10 +50,10 @@ PRIMARY KEY (GROUP_ID,LANG_ID), KEY NAME (NAME)); ALTER TABLE t1 CHANGE NAME NAME CHAR(80) not null; SHOW FULL COLUMNS FROM t1; -Field Type Null Key Default Extra Privileges -GROUP_ID int(10) unsigned PRI 0 select,insert,update,references -LANG_ID smallint(5) unsigned PRI 0 select,insert,update,references -NAME char(80) MUL select,insert,update,references +Field Type Null Key Default Extra Privileges Comment +GROUP_ID int(10) unsigned PRI 0 select,insert,update,references +LANG_ID smallint(5) unsigned PRI 0 select,insert,update,references +NAME char(80) MUL select,insert,update,references DROP TABLE t1; create table t1 (n int); insert into t1 values(9),(3),(12),(10); diff --git a/mysql-test/r/func_math.result b/mysql-test/r/func_math.result index b961c839510..f067d1f651e 100644 --- a/mysql-test/r/func_math.result +++ b/mysql-test/r/func_math.result @@ -4,8 +4,10 @@ floor(5.5) floor(-5.5) select ceiling(5.5),ceiling(-5.5); ceiling(5.5) ceiling(-5.5) 6 -5 +select truncate(52.64,1),truncate(52.64,2),truncate(52.64,-1),truncate(52.64,-2), truncate(-52.64,1),truncate(-52.64,-1); truncate(52.64,1) truncate(52.64,2) truncate(52.64,-1) truncate(52.64,-2) truncate(-52.64,1) truncate(-52.64,-1) 52.6 52.64 50 0 -52.6 -50 +select round(5.5),round(-5.5); round(5.5) round(-5.5) 6 -6 select round(5.64,1),round(5.64,2),round(5.64,-1),round(5.64,-2); diff --git a/mysql-test/r/heap_btree.result b/mysql-test/r/heap_btree.result index 4e101229b0e..c3080389999 100644 --- a/mysql-test/r/heap_btree.result +++ b/mysql-test/r/heap_btree.result @@ -94,7 +94,7 @@ select max(a) from t1; max(a) 1 drop table t1; -CREATE TABLE t1 ( a int not null default 0, b int not null default 0, key using BTREE (a), key using BTREE (b) ) TYPE=HEAP; +CREATE TABLE t1 ( a int not null default 0, b int not null default 0, key using BTREE (a,b), key using BTREE (b) ) TYPE=HEAP; insert into t1 values(1,1),(1,2),(2,3),(1,3),(1,4),(1,5),(1,6); select * from t1 where a=1; a b @@ -108,17 +108,30 @@ insert into t1 values(1,1),(1,2),(2,3),(1,3),(1,4),(1,5),(1,6); select * from t1 where a=1; a b 1 1 -1 2 -1 3 -1 4 -1 5 -1 6 1 1 1 2 +1 2 1 3 +1 3 +1 4 1 4 1 5 +1 5 +1 6 1 6 +explain select * from tx where a=x order by a,b; +table type possible_keys key key_len ref rows Extra +tx ref a a x const x where used +explain select * from tx where a=x order by b; +table type possible_keys key key_len ref rows Extra +tx ref a a x const x where used +select * from t1 where b=1; +a b +1 1 +1 1 +explain select * from tx where b=x; +table type possible_keys key key_len ref rows Extra +tx ref b b x const x where used drop table t1; create table t1 (id int unsigned not null, primary key using BTREE (id)) type=HEAP; insert into t1 values(1); diff --git a/mysql-test/r/isam.result b/mysql-test/r/isam.result index d19352aad42..5cb218dc4ce 100644 --- a/mysql-test/r/isam.result +++ b/mysql-test/r/isam.result @@ -67,10 +67,10 @@ a int(11) PRI 0 b int(11) MUL 0 c int(11) 0 show full columns from t1; -Field Type Null Key Default Extra Privileges -a int(11) PRI 0 select,insert,update,references -b int(11) MUL 0 select,insert,update,references -c int(11) 0 select,insert,update,references +Field Type Null Key Default Extra Privileges Comment +a int(11) PRI 0 select,insert,update,references +b int(11) MUL 0 select,insert,update,references +c int(11) 0 select,insert,update,references show index from t1; Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment t1 0 PRIMARY 1 a A 4 NULL NULL BTREE diff --git a/mysql-test/r/show_check.result b/mysql-test/r/show_check.result index 2c32d766a38..3766332cf39 100644 --- a/mysql-test/r/show_check.result +++ b/mysql-test/r/show_check.result @@ -87,14 +87,21 @@ t2 CREATE TEMPORARY TABLE `t2` ( drop table t2; create table t1 ( test_set set( 'val1', 'val2', 'val3' ) not null default '', -name char(20) default 'O''Brien' +name char(20) default 'O''Brien' comment 'O''Brien as default', +c int not null comment 'int column' ) comment = 'it\'s a table' ; show create table t1 ; Table Create Table t1 CREATE TABLE `t1` ( `test_set` set('val1','val2','val3') NOT NULL default '', - `name` char(20) default 'O''Brien' + `name` char(20) default 'O''Brien' COMMENT 'O''Brien as default', + `c` int(11) NOT NULL default '0' COMMENT 'int column' ) TYPE=MyISAM COMMENT='it''s a table' +show full columns from t1; +Field Type Null Key Default Extra Privileges Comment +test_set set('val1','val2','val3') select,insert,update,references +name char(20) YES O'Brien select,insert,update,references O'Brien as default +c int(11) 0 select,insert,update,references int column drop table t1; create table t1 (a int not null, unique aa (a)); show create table t1; @@ -155,6 +162,14 @@ e double(9,2) YES NULL f double(5,0) YES NULL h float(3,2) YES NULL i float(3,0) YES NULL +show full columns from t1; +Field Type Null Key Default Extra Privileges Comment +a decimal(9,2) YES NULL select,insert,update,references +b decimal(9,0) YES NULL select,insert,update,references +e double(9,2) YES NULL select,insert,update,references +f double(5,0) YES NULL select,insert,update,references +h float(3,2) YES NULL select,insert,update,references +i float(3,0) YES NULL select,insert,update,references drop table t1; create table t1 (c decimal, d double, f float, r real); show columns from t1; diff --git a/mysql-test/t/heap_btree.test b/mysql-test/t/heap_btree.test index 28fc209525b..2793a22e94d 100644 --- a/mysql-test/t/heap_btree.test +++ b/mysql-test/t/heap_btree.test @@ -55,11 +55,18 @@ insert into t1 values(1); select max(a) from t1; drop table t1; -CREATE TABLE t1 ( a int not null default 0, b int not null default 0, key using BTREE (a), key using BTREE (b) ) TYPE=HEAP; +CREATE TABLE t1 ( a int not null default 0, b int not null default 0, key using BTREE (a,b), key using BTREE (b) ) TYPE=HEAP; insert into t1 values(1,1),(1,2),(2,3),(1,3),(1,4),(1,5),(1,6); select * from t1 where a=1; insert into t1 values(1,1),(1,2),(2,3),(1,3),(1,4),(1,5),(1,6); select * from t1 where a=1; +--replace_result 0 x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x +explain select * from t1 where a=1 order by a,b; +--replace_result 0 x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x +explain select * from t1 where a=1 order by b; +select * from t1 where b=1; +--replace_result 0 x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x +explain select * from t1 where b=1; drop table t1; create table t1 (id int unsigned not null, primary key using BTREE (id)) type=HEAP; diff --git a/mysql-test/t/show_check.test b/mysql-test/t/show_check.test index 5e10ebf23a3..eb15eac8bad 100644 --- a/mysql-test/t/show_check.test +++ b/mysql-test/t/show_check.test @@ -49,9 +49,11 @@ drop table t2; create table t1 ( test_set set( 'val1', 'val2', 'val3' ) not null default '', - name char(20) default 'O''Brien' + name char(20) default 'O''Brien' comment 'O''Brien as default', + c int not null comment 'int column' ) comment = 'it\'s a table' ; show create table t1 ; +show full columns from t1; drop table t1; create table t1 (a int not null, unique aa (a)); @@ -78,6 +80,7 @@ drop table t1; create table t1 (a decimal(9,2), b decimal (9,0), e double(9,2), f double(5,0), h float(3,2), i float(3,0)); show columns from t1; +show full columns from t1; drop table t1; # Check auto conversions of types diff --git a/sql/field.cc b/sql/field.cc index 43a46bb67a0..39e32a9cdc4 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -233,6 +233,8 @@ Field::Field(char *ptr_arg,uint32 length_arg,uchar *null_ptr_arg, field_length(length_arg),null_bit(null_bit_arg) { flags=null_ptr ? 0: NOT_NULL_FLAG; + comment.str= (char*) ""; + comment.length=0; } uint Field::offset() @@ -4861,6 +4863,8 @@ create_field::create_field(Field *old_field,Field *orig_field) unireg_check=old_field->unireg_check; pack_length=old_field->pack_length(); sql_type= old_field->real_type(); + charset= old_field->charset(); // May be NULL ptr + comment= old_field->comment; /* Fix if the original table had 4 byte pointer blobs */ if (flags & BLOB_FLAG) @@ -4869,6 +4873,7 @@ create_field::create_field(Field *old_field,Field *orig_field) decimals= old_field->decimals(); if (sql_type == FIELD_TYPE_STRING) { + /* Change CHAR -> VARCHAR if dynamic record length */ sql_type=old_field->type(); decimals=0; } diff --git a/sql/field.h b/sql/field.h index 7fb43ddd29f..f84b54271ce 100644 --- a/sql/field.h +++ b/sql/field.h @@ -190,6 +190,7 @@ public: uint fill_cache_field(struct st_cache_field *copy); virtual bool get_date(TIME *ltime,bool fuzzydate); virtual bool get_time(TIME *ltime); + virtual CHARSET_INFO *charset(void) { return 0; } friend bool reopen_table(THD *,struct st_table *,bool); friend int cre_myisam(my_string name, register TABLE *form, uint options, ulonglong auto_increment_value); @@ -249,10 +250,10 @@ public: { field_charset=charset; } Item_result result_type () const { return STRING_RESULT; } uint decimals() const { return NOT_FIXED_DEC; } - friend class create_field; void make_field(Send_field *); uint size_of() const { return sizeof(*this); } - inline CHARSET_INFO *charset() const { return field_charset; } + CHARSET_INFO *charset(void) { return field_charset; } + inline void set_charset(CHARSET_INFO *charset) { field_charset=charset; } inline int cmp_image(char *buff,uint length) { @@ -261,7 +262,7 @@ public: else return my_strncasecmp(field_charset,ptr,buff,length); } - + friend class create_field; }; diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 5fe232b6b80..4e25fae56b2 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -1420,9 +1420,9 @@ Item_func_regex::~Item_func_regex() #ifdef LIKE_CMP_TOUPPER -#define likeconv(A) (uchar) toupper(A) +#define likeconv(cs,A) (uchar) (cs)->toupper(A) #else -#define likeconv(A) (uchar) my_sort_order[(uchar) (A)] +#define likeconv(cs,A) (uchar) (cs)->sort_order[(uchar) (A)] #endif @@ -1436,7 +1436,8 @@ void Item_func_like::turboBM_compute_suffixes(int* suff) const int plm1 = pattern_len - 1; int f = 0; int g = plm1; - int* const splm1 = suff + plm1; + int *const splm1 = suff + plm1; + CHARSET_INFO *cs=system_charset_info; // QQ Needs to be fixed *splm1 = pattern_len; @@ -1472,7 +1473,8 @@ void Item_func_like::turboBM_compute_suffixes(int* suff) if (i < g) g = i; // g = min(i, g) f = i; - while (g >= 0 && likeconv(pattern[g]) == likeconv(pattern[g + plm1 - f])) + while (g >= 0 && likeconv(cs, pattern[g]) == + likeconv(cs, pattern[g + plm1 - f])) g--; suff[i] = f - g; } @@ -1533,19 +1535,25 @@ void Item_func_like::turboBM_compute_good_suffix_shifts(int* suff) void Item_func_like::turboBM_compute_bad_character_shifts() { - int* i; - int* end = bmBc + alphabet_size; + int *i; + int *end = bmBc + alphabet_size; + int j; + const int plm1 = pattern_len - 1; + CHARSET_INFO *cs=system_charset_info; // QQ Needs to be fixed + for (i = bmBc; i < end; i++) *i = pattern_len; - int j; - const int plm1 = pattern_len - 1; if (binary) + { for (j = 0; j < plm1; j++) bmBc[pattern[j]] = plm1 - j; + } else + { for (j = 0; j < plm1; j++) - bmBc[likeconv(pattern[j])] = plm1 - j; + bmBc[likeconv(cs,pattern[j])] = plm1 - j; + } } @@ -1561,6 +1569,7 @@ bool Item_func_like::turboBM_matches(const char* text, int text_len) const int shift = pattern_len; int j = 0; int u = 0; + CHARSET_INFO *cs=system_charset_info; // QQ Needs to be fixed const int plm1 = pattern_len - 1; const int tlmpl = text_len - pattern_len; @@ -1602,7 +1611,7 @@ bool Item_func_like::turboBM_matches(const char* text, int text_len) const while (j <= tlmpl) { register int i = plm1; - while (i >= 0 && likeconv(pattern[i]) == likeconv(text[i + j])) + while (i >= 0 && likeconv(cs,pattern[i]) == likeconv(cs,text[i + j])) { i--; if (i == plm1 - shift) @@ -1613,7 +1622,7 @@ bool Item_func_like::turboBM_matches(const char* text, int text_len) const register const int v = plm1 - i; turboShift = u - v; - bcShift = bmBc[likeconv(text[i + j])] - plm1 + i; + bcShift = bmBc[likeconv(cs, text[i + j])] - plm1 + i; shift = max(turboShift, bcShift); shift = max(shift, bmGs[i]); if (shift == bmGs[i]) diff --git a/sql/item_func.cc b/sql/item_func.cc index a9264b78b64..0675bf81dab 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -2048,7 +2048,9 @@ void Item_func_match::init_search(bool no_order) return; if (key == NO_SUCH_KEY) - concat=new Item_func_concat_ws(new Item_string(" ",1), default_charset_info, fields); + concat=new Item_func_concat_ws(new Item_string(" ",1, + default_charset_info), + fields); if (master) { @@ -2256,12 +2258,12 @@ double Item_func_match::val() Item *get_system_var(LEX_STRING name) { - if (!my_strcasecmp(name.str,"IDENTITY")) + if (!my_strcasecmp(system_charset_info, name.str, "IDENTITY")) return new Item_int((char*) "@@IDENTITY", current_thd->insert_id(),21); - if (!my_strcasecmp(name.str,"VERSION")) + if (!my_strcasecmp(system_charset_info, name.str, "VERSION")) return new Item_string("@@VERSION",server_version, - (uint) strlen(server_version)); + (uint) strlen(server_version), system_charset_info); net_printf(¤t_thd->net, ER_UNKNOWN_SYSTEM_VARIABLE, name.str); return 0; } diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index d98d44efb1f..e6c44f949ab 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -748,7 +748,7 @@ int wild_case_compare(CHARSET_INFO *cs, const char *str,const char *wildstr); int wild_compare(const char *str,const char *str_end, const char *wildstr,const char *wildend,char escape); int wild_case_compare(CHARSET_INFO *cs, const char *str,const char *str_end, - const char *wildstr,const char *wildend,char escape); + const char *wildstr,const char *wildend,char escape); /* from hostname.cc */ struct in_addr; diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 98b8ab83e9d..c9ef64b6da9 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -2051,10 +2051,10 @@ static void mysql_rm_tmp_tables(void) /* -** CREATE INDEX and DROP INDEX are implemented by calling ALTER TABLE with -** the proper arguments. This isn't very fast but it should work for most -** cases. -** One should normally create all indexes with CREATE TABLE or ALTER TABLE. + CREATE INDEX and DROP INDEX are implemented by calling ALTER TABLE with + the proper arguments. This isn't very fast but it should work for most + cases. + One should normally create all indexes with CREATE TABLE or ALTER TABLE. */ int mysql_create_index(THD *thd, TABLE_LIST *table_list, List &keys) @@ -2066,6 +2066,7 @@ int mysql_create_index(THD *thd, TABLE_LIST *table_list, List &keys) DBUG_ENTER("mysql_create_index"); bzero((char*) &create_info,sizeof(create_info)); create_info.db_type=DB_TYPE_DEFAULT; + create_info.table_charset=default_charset_info; DBUG_RETURN(mysql_alter_table(thd,table_list->db,table_list->real_name, &create_info, table_list, fields, keys, drop, alter, (ORDER*)0, FALSE, @@ -2082,6 +2083,7 @@ int mysql_drop_index(THD *thd, TABLE_LIST *table_list, List &drop) DBUG_ENTER("mysql_drop_index"); bzero((char*) &create_info,sizeof(create_info)); create_info.db_type=DB_TYPE_DEFAULT; + create_info.table_charset=default_charset_info; DBUG_RETURN(mysql_alter_table(thd,table_list->db,table_list->real_name, &create_info, table_list, fields, keys, drop, alter, (ORDER*)0, FALSE, diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index c8ed74c9bca..48a738f9f6b 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -516,8 +516,9 @@ int mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok) table->file->info(HA_STATUS_AUTO | HA_STATUS_NO_LOCK); bzero((char*) &create_info,sizeof(create_info)); create_info.auto_increment_value= table->file->auto_increment_value; - db_type table_type=table->db_type; + create_info.table_charset=default_charset_info; + db_type table_type=table->db_type; strmov(path,table->path); *table_ptr= table->next; // Unlink table from list close_temporary(table,0); @@ -527,7 +528,8 @@ int mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok) if ((error= (int) !(open_temporary_table(thd, path, table_list->db, table_list->real_name, 1)))) (void) rm_temporary_table(table_type, path); - /* Sasha: if we return here we will not have binloged the truncation and + /* + If we return here we will not have binloged the truncation and we will not send_ok() to the client. Yes, we do need better coverage testing, this bug has been here for a few months :-). */ @@ -557,6 +559,8 @@ int mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok) } bzero((char*) &create_info,sizeof(create_info)); + create_info.table_charset=default_charset_info; + *fn_ext(path)=0; // Remove the .frm extension error= ha_create_table(path,&create_info,1) ? -1 : 0; query_cache_invalidate3(thd, table_list, 0); diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 4dc6aef6154..d999271e3df 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1749,6 +1749,7 @@ mysql_execute_command(void) bzero((char*) &create_info,sizeof(create_info)); create_info.db_type=DB_TYPE_DEFAULT; create_info.row_type=ROW_TYPE_DEFAULT; + create_info.table_charset=default_charset_info; res= mysql_alter_table(thd, NullS, NullS, &create_info, tables, lex->create_list, lex->key_list, lex->drop_list, lex->alter_list, @@ -2866,6 +2867,8 @@ bool add_field_to_list(char *field_name, enum_field_types type, new_field->change=change; new_field->interval=0; new_field->pack_length=0; + new_field->charset=0; // QQ: To be fixed + if (!comment) { new_field->comment.str=0; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index a4a0a73dfb6..5e18299ef87 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -4019,6 +4019,7 @@ static bool create_myisam_tmp_table(TABLE *table,TMP_TABLE_PARAM *param, } MI_CREATE_INFO create_info; bzero((char*) &create_info,sizeof(create_info)); + if ((options & (OPTION_BIG_TABLES | SELECT_SMALL_RESULT)) == OPTION_BIG_TABLES) create_info.data_file_length= ~(ulonglong) 0; diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 86247397e0a..995142d6566 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1180,7 +1180,8 @@ int mysqld_show(THD *thd, const char *wild, show_var_st *variables) pthread_mutex_lock(&LOCK_status); for (i=0; variables[i].name; i++) { - if (!(wild && wild[0] && wild_case_compare(variables[i].name,wild))) + if (!(wild && wild[0] && wild_case_compare(system_charset_info, + variables[i].name,wild))) { packet2.length(0); net_store_data(&packet2,convert,variables[i].name); diff --git a/sql/sql_string.h b/sql/sql_string.h index 5e5c9001590..e94981d22c3 100644 --- a/sql/sql_string.h +++ b/sql/sql_string.h @@ -213,16 +213,17 @@ public: uint32 numchars(); int charpos(int i,uint32 offset=0); -// added by Holyfoot for "geometry" needs int reserve(uint32 space_needed) { return realloc(str_length + space_needed); } int reserve(uint32 space_needed, uint32 grow_by); -// these append operations do NOT check alloced memory -// q_*** methods writes values of parameters itself -// qs_*** methods writes string representation of value + /* + The following append operations do NOT check alloced memory + q_*** methods writes values of parameters itself + qs_*** methods writes string representation of value + */ void q_append(const char &c) { Ptr[str_length++] = c; diff --git a/sql/sql_table.cc b/sql/sql_table.cc index a032adb1520..977571e1ff5 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -1577,12 +1577,13 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, { if (cfield->change) { - if (!my_strcasecmp(system_charset_info,key_part_name, cfield->change)) + if (!my_strcasecmp(system_charset_info, key_part_name, + cfield->change)) break; } else if (!my_strcasecmp(system_charset_info, key_part_name, cfield->field_name)) - break; + break; } if (!cfield) continue; // Field is removed @@ -1618,6 +1619,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, key_list.push_back(key); } } + if (drop_list.elements) { my_error(ER_CANT_DROP_FIELD_OR_KEY,MYF(0),drop_list.head()->name); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 32af9a0197f..578cad25bb4 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1147,7 +1147,7 @@ references: }; opt_ref_list: - /* empty */ {} + /* empty */ opt_on_delete {} | '(' ref_list ')' opt_on_delete {}; ref_list: @@ -1273,11 +1273,24 @@ alter_list_item: lex->change= $3.str; lex->simple_alter=0; } field_spec opt_place - | MODIFY_SYM opt_column field_spec - { - Lex->simple_alter=0; - } - opt_place + | MODIFY_SYM opt_column field_ident + { + LEX *lex=Lex; + lex->length=lex->dec=0; lex->type=0; lex->interval=0; + lex->default_value=lex->comment=0; + lex->simple_alter=0; + } + type opt_attribute + { + LEX *lex=Lex; + if (add_field_to_list($3.str, + (enum enum_field_types) $5, + lex->length,lex->dec,lex->type, + lex->default_value, lex->comment, + $3.str, lex->interval)) + YYABORT; + } + opt_place | DROP opt_column field_ident opt_restrict { LEX *lex=Lex; diff --git a/sql/table.cc b/sql/table.cc index a7571d2183f..201b67032bf 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -49,7 +49,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, interval_count,interval_parts,read_length,db_create_options; uint key_info_length, com_length; ulong pos; - char index_file[FN_REFLEN], *names,*keynames; + char index_file[FN_REFLEN], *names, *keynames, *comment_pos; uchar head[288],*disk_buff,new_field_pack_flag; my_string record; const char **int_array; @@ -58,7 +58,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, Field **field_ptr,*reg_field; KEY *keyinfo; KEY_PART_INFO *key_part; - uchar *null_pos, *comment_pos; + uchar *null_pos; uint null_bit, new_frm_ver, field_pack_length; SQL_CRYPT *crypted=0; DBUG_ENTER("openfrm"); @@ -292,7 +292,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, outparam->field=field_ptr; read_length=(uint) (outparam->fields * field_pack_length + - pos+ (uint) (n_length+int_length)); + pos+ (uint) (n_length+int_length+com_length)); if (read_string(file,(gptr*) &disk_buff,read_length)) goto err_not_open; /* purecov: inspected */ if (crypted) @@ -302,7 +302,6 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, crypted=0; } strpos= disk_buff+pos; - comment_pos=disk_buff+read_length-com_length; outparam->intervals= (TYPELIB*) (field_ptr+outparam->fields+1); int_array= (const char **) (outparam->intervals+interval_count); @@ -311,6 +310,8 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, outparam->intervals=0; // For better debugging memcpy((char*) names, strpos+(outparam->fields*field_pack_length), (uint) (n_length+int_length)); + comment_pos=names+(n_length+int_length); + memcpy(comment_pos, disk_buff+read_length-com_length, com_length); fix_type_pointers(&int_array,&outparam->fieldnames,1,&names); fix_type_pointers(&int_array,outparam->intervals,interval_count, @@ -489,13 +490,13 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, keyinfo->key_length ? UNIQUE_KEY_FLAG : MULTIPLE_KEY_FLAG); if (i == 0) field->key_start|= ((key_map) 1 << key); - if ((ha_option & HA_HAVE_KEY_READ_ONLY) && - field->key_length() == key_part->length && + if (field->key_length() == key_part->length && field->type() != FIELD_TYPE_BLOB) { - if (field->key_type() != HA_KEYTYPE_TEXT || - (!(ha_option & HA_KEY_READ_WRONG_STR) && - !(keyinfo->flags & HA_FULLTEXT))) + if ((ha_option & HA_HAVE_KEY_READ_ONLY) && + (field->key_type() != HA_KEYTYPE_TEXT || + (!(ha_option & HA_KEY_READ_WRONG_STR) && + !(keyinfo->flags & HA_FULLTEXT)))) field->part_of_key|= ((key_map) 1 << key); if ((field->key_type() != HA_KEYTYPE_TEXT || !(keyinfo->flags & HA_FULLTEXT)) && @@ -1200,7 +1201,7 @@ db_type get_table_type(const char *name) error=my_read(file,(byte*) head,4,MYF(MY_NABP)); my_close(file,MYF(0)); if (error || head[0] != (uchar) 254 || head[1] != 1 || - (head[2] != FRM_VER && head[2] != FRM_VER+1)) + (head[2] < FRM_VER && head[2] > FRM_VER+2)) DBUG_RETURN(DB_TYPE_UNKNOWN); DBUG_RETURN(ha_checktype((enum db_type) (uint) *(head+3))); } diff --git a/sql/unireg.cc b/sql/unireg.cc index 7c4f199ab7f..863f71d1cce 100644 --- a/sql/unireg.cc +++ b/sql/unireg.cc @@ -28,7 +28,7 @@ #include "mysql_priv.h" #include -#define FCOMP 11 /* Byte for packed field */ +#define FCOMP 15 /* Bytes for a packed field */ static uchar * pack_screens(List &create_fields, uint *info_length, uint *screens, bool small_file); @@ -246,7 +246,7 @@ static uchar * pack_screens(List &create_fields, static uint pack_keys(uchar *keybuff,uint key_count,KEY *keyinfo) { uint key_parts,length; - uchar *pos, *keyname_pos, *key_alg_pos; + uchar *pos, *keyname_pos; KEY *key,*end; KEY_PART_INFO *key_part,*key_part_end; DBUG_ENTER("pack_keys"); @@ -259,6 +259,7 @@ static uint pack_keys(uchar *keybuff,uint key_count,KEY *keyinfo) int2store(pos+2,key->key_length); pos[4]= (uchar) key->key_parts; pos[5]= (uchar) key->algorithm; + pos[6]=pos[7]=0; // For the future pos+=8; key_parts+=key->key_parts; DBUG_PRINT("loop",("flags: %d key_parts: %d at %lx", @@ -295,7 +296,7 @@ static uint pack_keys(uchar *keybuff,uint key_count,KEY *keyinfo) keybuff[1]=(uchar) key_parts; length=(uint) (keyname_pos-keybuff); int2store(keybuff+2,length); - length=(uint) (key_alg_pos-keyname_pos); + length=(uint) (pos-keyname_pos); int2store(keybuff+4,length); DBUG_RETURN((uint) (pos-keybuff)); } /* pack_keys */ @@ -309,8 +310,8 @@ static bool pack_header(uchar *forminfo, enum db_type table_type, handler *file) { uint length,int_count,int_length,no_empty, int_parts; - uint time_stamp_pos,null_fields, com_length; - ulong reclength,totlength,n_length; + uint time_stamp_pos,null_fields; + ulong reclength, totlength, n_length, com_length; DBUG_ENTER("pack_header"); if (create_fields.elements > MAX_FIELDS) @@ -460,7 +461,7 @@ static bool pack_fields(File file,List &create_fields) buff[11]= (uchar) field->sql_type; buff[12]= (uchar) (field->charset ? field->charset->number : default_charset_info->number); - int2store(buff, field->comment.length); + int2store(buff+13, field->comment.length); comment_length+= field->comment.length; set_if_bigger(int_count,field->interval_id); if (my_write(file,(byte*) buff,FCOMP,MYF_RW)) -- cgit v1.2.1 From f45dc577290c7298b33ba70eba1c8a80037201ff Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 4 Jun 2002 11:32:33 +0300 Subject: Update results for new SHOW FULL COLUMNS Portability fixes include/my_tree.h: Add missing include file. mysql-test/r/select.result: Update results for new SHOW FULL COLUMNS mysql-test/r/type_blob.result: Update results for new SHOW FULL COLUMNS mysql-test/r/type_float.result: Update results for new SHOW FULL COLUMNS mysql-test/r/type_ranges.result: Update results for new SHOW FULL COLUMNS mysql-test/t/heap_btree.test: Update results for new SHOW FULL COLUMNS --- include/my_tree.h | 2 + mysql-test/r/select.result | 30 +++---- mysql-test/r/type_blob.result | 20 ++--- mysql-test/r/type_float.result | 32 ++++---- mysql-test/r/type_ranges.result | 170 ++++++++++++++++++++-------------------- mysql-test/t/heap_btree.test | 6 +- 6 files changed, 131 insertions(+), 129 deletions(-) diff --git a/include/my_tree.h b/include/my_tree.h index 826c2b7c808..90139494f94 100644 --- a/include/my_tree.h +++ b/include/my_tree.h @@ -20,6 +20,8 @@ extern "C" { #endif +#include "my_base.h" /* get 'enum ha_rkey_function' */ + #define MAX_TREE_HEIGHT 40 /* = max 1048576 leafs in tree */ #define ELEMENT_KEY(tree,element)\ (tree->offset_to_key ? (void*)((byte*) element+tree->offset_to_key) :\ diff --git a/mysql-test/r/select.result b/mysql-test/r/select.result index 051aeb43b43..8c8e3b492b6 100644 --- a/mysql-test/r/select.result +++ b/mysql-test/r/select.result @@ -3207,23 +3207,23 @@ Tables_in_test (s%) show tables from test like "t?"; Tables_in_test (t?) show full columns from t2; -Field Type Null Key Default Extra Privileges -auto int(11) PRI NULL auto_increment select,insert,update,references -fld1 int(6) unsigned zerofill UNI 000000 select,insert,update,references -companynr tinyint(2) unsigned zerofill 00 select,insert,update,references -fld3 char(30) MUL select,insert,update,references -fld4 char(35) select,insert,update,references -fld5 char(35) select,insert,update,references -fld6 char(4) select,insert,update,references +Field Type Null Key Default Extra Privileges Comment +auto int(11) PRI NULL auto_increment select,insert,update,references +fld1 int(6) unsigned zerofill UNI 000000 select,insert,update,references +companynr tinyint(2) unsigned zerofill 00 select,insert,update,references +fld3 char(30) MUL select,insert,update,references +fld4 char(35) select,insert,update,references +fld5 char(35) select,insert,update,references +fld6 char(4) select,insert,update,references show full columns from t2 from test like 'f%'; -Field Type Null Key Default Extra Privileges -fld1 int(6) unsigned zerofill UNI 000000 select,insert,update,references -fld3 char(30) MUL select,insert,update,references -fld4 char(35) select,insert,update,references -fld5 char(35) select,insert,update,references -fld6 char(4) select,insert,update,references +Field Type Null Key Default Extra Privileges Comment +fld1 int(6) unsigned zerofill UNI 000000 select,insert,update,references +fld3 char(30) MUL select,insert,update,references +fld4 char(35) select,insert,update,references +fld5 char(35) select,insert,update,references +fld6 char(4) select,insert,update,references show full columns from t2 from test like 's%'; -Field Type Null Key Default Extra Privileges +Field Type Null Key Default Extra Privileges Comment show keys from t2; Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment t2 0 PRIMARY 1 auto A 1199 NULL NULL BTREE diff --git a/mysql-test/r/type_blob.result b/mysql-test/r/type_blob.result index 2047eed6227..6778679bda9 100644 --- a/mysql-test/r/type_blob.result +++ b/mysql-test/r/type_blob.result @@ -37,18 +37,18 @@ insert into t1 values (NULL,NULL,NULL,NULL); update t1 set c="",b=null where c="1"; lock tables t1 READ; show full fields from t1; -Field Type Null Key Default Extra Privileges -t text YES NULL select,insert,update,references -c varchar(10) YES NULL select,insert,update,references -b blob YES NULL select,insert,update,references -d varchar(10) binary YES NULL select,insert,update,references +Field Type Null Key Default Extra Privileges Comment +t text YES NULL select,insert,update,references +c varchar(10) YES NULL select,insert,update,references +b blob YES NULL select,insert,update,references +d varchar(10) binary YES NULL select,insert,update,references lock tables t1 WRITE; show full fields from t1; -Field Type Null Key Default Extra Privileges -t text YES NULL select,insert,update,references -c varchar(10) YES NULL select,insert,update,references -b blob YES NULL select,insert,update,references -d varchar(10) binary YES NULL select,insert,update,references +Field Type Null Key Default Extra Privileges Comment +t text YES NULL select,insert,update,references +c varchar(10) YES NULL select,insert,update,references +b blob YES NULL select,insert,update,references +d varchar(10) binary YES NULL select,insert,update,references unlock tables; select t from t1 where t like "hello"; t diff --git a/mysql-test/r/type_float.result b/mysql-test/r/type_float.result index e85bced353a..c6eca3abe8b 100644 --- a/mysql-test/r/type_float.result +++ b/mysql-test/r/type_float.result @@ -10,9 +10,9 @@ SELECT 1e1,1.e1,1.0e1,1e+1,1.e+1,1.0e+1,1e-1,1.e-1,1.0e-1; drop table if exists t1; create table t1 (f1 float(24),f2 float(52)); show full columns from t1; -Field Type Null Key Default Extra Privileges -f1 float YES NULL select,insert,update,references -f2 double YES NULL select,insert,update,references +Field Type Null Key Default Extra Privileges Comment +f1 float YES NULL select,insert,update,references +f2 double YES NULL select,insert,update,references insert into t1 values(10,10),(1e+5,1e+5),(1234567890,1234567890),(1e+10,1e+10),(1e+15,1e+15),(1e+20,1e+20),(1e+50,1e+50),(1e+150,1e+150); insert into t1 values(-10,-10),(1e-5,1e-5),(1e-10,1e-10),(1e-15,1e-15),(1e-20,1e-20),(1e-50,1e-50),(1e-150,1e-150); select * from t1; @@ -69,19 +69,19 @@ min(a) drop table t1; create table t1 (f float, f2 float(24), f3 float(6,2), d double, d2 float(53), d3 double(10,3), de decimal, de2 decimal(6), de3 decimal(5,2), n numeric, n2 numeric(8), n3 numeric(5,6)); show full columns from t1; -Field Type Null Key Default Extra Privileges -f float YES NULL select,insert,update,references -f2 float YES NULL select,insert,update,references -f3 float(6,2) YES NULL select,insert,update,references -d double YES NULL select,insert,update,references -d2 double YES NULL select,insert,update,references -d3 double(10,3) YES NULL select,insert,update,references -de decimal(10,0) YES NULL select,insert,update,references -de2 decimal(6,0) YES NULL select,insert,update,references -de3 decimal(5,2) YES NULL select,insert,update,references -n decimal(10,0) YES NULL select,insert,update,references -n2 decimal(8,0) YES NULL select,insert,update,references -n3 decimal(7,6) YES NULL select,insert,update,references +Field Type Null Key Default Extra Privileges Comment +f float YES NULL select,insert,update,references +f2 float YES NULL select,insert,update,references +f3 float(6,2) YES NULL select,insert,update,references +d double YES NULL select,insert,update,references +d2 double YES NULL select,insert,update,references +d3 double(10,3) YES NULL select,insert,update,references +de decimal(10,0) YES NULL select,insert,update,references +de2 decimal(6,0) YES NULL select,insert,update,references +de3 decimal(5,2) YES NULL select,insert,update,references +n decimal(10,0) YES NULL select,insert,update,references +n2 decimal(8,0) YES NULL select,insert,update,references +n3 decimal(7,6) YES NULL select,insert,update,references drop table t1; create table t1 (a decimal(7,3) not null, key (a)); insert into t1 values ("0"),("-0.00"),("-0.01"),("-0.002"),("1"); diff --git a/mysql-test/r/type_ranges.result b/mysql-test/r/type_ranges.result index fc7cc5255cf..54d8ff87b37 100644 --- a/mysql-test/r/type_ranges.result +++ b/mysql-test/r/type_ranges.result @@ -38,31 +38,31 @@ KEY (ulonglong,ulong), KEY (options,flags) ); show full fields from t1; -Field Type Null Key Default Extra Privileges -auto int(5) unsigned PRI NULL auto_increment select,insert,update,references -string varchar(10) YES hello select,insert,update,references -tiny tinyint(4) MUL 0 select,insert,update,references -short smallint(6) MUL 1 select,insert,update,references -medium mediumint(8) MUL 0 select,insert,update,references -long_int int(11) 0 select,insert,update,references -longlong bigint(13) MUL 0 select,insert,update,references -real_float float(13,1) MUL 0.0 select,insert,update,references -real_double double(16,4) YES NULL select,insert,update,references -utiny tinyint(3) unsigned MUL 0 select,insert,update,references -ushort smallint(5) unsigned zerofill MUL 00000 select,insert,update,references -umedium mediumint(8) unsigned MUL 0 select,insert,update,references -ulong int(11) unsigned MUL 0 select,insert,update,references -ulonglong bigint(13) unsigned MUL 0 select,insert,update,references -time_stamp timestamp(14) YES NULL select,insert,update,references -date_field date YES NULL select,insert,update,references -time_field time YES NULL select,insert,update,references -date_time datetime YES NULL select,insert,update,references -blob_col blob YES NULL select,insert,update,references -tinyblob_col tinyblob YES NULL select,insert,update,references -mediumblob_col mediumblob select,insert,update,references -longblob_col longblob select,insert,update,references -options enum('one','two','tree') MUL one select,insert,update,references -flags set('one','two','tree') select,insert,update,references +Field Type Null Key Default Extra Privileges Comment +auto int(5) unsigned PRI NULL auto_increment select,insert,update,references +string varchar(10) YES hello select,insert,update,references +tiny tinyint(4) MUL 0 select,insert,update,references +short smallint(6) MUL 1 select,insert,update,references +medium mediumint(8) MUL 0 select,insert,update,references +long_int int(11) 0 select,insert,update,references +longlong bigint(13) MUL 0 select,insert,update,references +real_float float(13,1) MUL 0.0 select,insert,update,references +real_double double(16,4) YES NULL select,insert,update,references +utiny tinyint(3) unsigned MUL 0 select,insert,update,references +ushort smallint(5) unsigned zerofill MUL 00000 select,insert,update,references +umedium mediumint(8) unsigned MUL 0 select,insert,update,references +ulong int(11) unsigned MUL 0 select,insert,update,references +ulonglong bigint(13) unsigned MUL 0 select,insert,update,references +time_stamp timestamp(14) YES NULL select,insert,update,references +date_field date YES NULL select,insert,update,references +time_field time YES NULL select,insert,update,references +date_time datetime YES NULL select,insert,update,references +blob_col blob YES NULL select,insert,update,references +tinyblob_col tinyblob YES NULL select,insert,update,references +mediumblob_col mediumblob select,insert,update,references +longblob_col longblob select,insert,update,references +options enum('one','two','tree') MUL one select,insert,update,references +flags set('one','two','tree') select,insert,update,references show keys from t1; Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment t1 0 PRIMARY 1 auto A 0 NULL NULL BTREE @@ -168,57 +168,57 @@ drop table t2; create table t2 select * from t1; update t2 set string="changed" where auto=16; show full columns from t1; -Field Type Null Key Default Extra Privileges -auto int(5) unsigned MUL NULL auto_increment select,insert,update,references -string varchar(10) YES new defaul select,insert,update,references -tiny tinyint(4) MUL 0 select,insert,update,references -short smallint(6) MUL 0 select,insert,update,references -medium mediumint(8) MUL 0 select,insert,update,references -long_int int(11) 0 select,insert,update,references -longlong bigint(13) MUL 0 select,insert,update,references -real_float float(13,1) MUL 0.0 select,insert,update,references -real_double double(16,4) YES NULL select,insert,update,references -utiny tinyint(3) unsigned 0 select,insert,update,references -ushort smallint(5) unsigned zerofill 00000 select,insert,update,references -umedium mediumint(8) unsigned MUL 0 select,insert,update,references -ulong int(11) unsigned MUL 0 select,insert,update,references -ulonglong bigint(13) unsigned MUL 0 select,insert,update,references -time_stamp timestamp(14) YES NULL select,insert,update,references -date_field varchar(10) YES NULL select,insert,update,references -time_field time YES NULL select,insert,update,references -date_time datetime YES NULL select,insert,update,references -new_blob_col varchar(20) YES NULL select,insert,update,references -tinyblob_col tinyblob YES NULL select,insert,update,references -mediumblob_col mediumblob select,insert,update,references -options enum('one','two','tree') MUL one select,insert,update,references -flags set('one','two','tree') select,insert,update,references -new_field varchar(10) new select,insert,update,references +Field Type Null Key Default Extra Privileges Comment +auto int(5) unsigned MUL NULL auto_increment select,insert,update,references +string varchar(10) YES new defaul select,insert,update,references +tiny tinyint(4) MUL 0 select,insert,update,references +short smallint(6) MUL 0 select,insert,update,references +medium mediumint(8) MUL 0 select,insert,update,references +long_int int(11) 0 select,insert,update,references +longlong bigint(13) MUL 0 select,insert,update,references +real_float float(13,1) MUL 0.0 select,insert,update,references +real_double double(16,4) YES NULL select,insert,update,references +utiny tinyint(3) unsigned 0 select,insert,update,references +ushort smallint(5) unsigned zerofill 00000 select,insert,update,references +umedium mediumint(8) unsigned MUL 0 select,insert,update,references +ulong int(11) unsigned MUL 0 select,insert,update,references +ulonglong bigint(13) unsigned MUL 0 select,insert,update,references +time_stamp timestamp(14) YES NULL select,insert,update,references +date_field varchar(10) YES NULL select,insert,update,references +time_field time YES NULL select,insert,update,references +date_time datetime YES NULL select,insert,update,references +new_blob_col varchar(20) YES NULL select,insert,update,references +tinyblob_col tinyblob YES NULL select,insert,update,references +mediumblob_col mediumblob select,insert,update,references +options enum('one','two','tree') MUL one select,insert,update,references +flags set('one','two','tree') select,insert,update,references +new_field varchar(10) new select,insert,update,references show full columns from t2; -Field Type Null Key Default Extra Privileges -auto int(5) unsigned 0 select,insert,update,references -string varchar(10) YES new defaul select,insert,update,references -tiny tinyint(4) 0 select,insert,update,references -short smallint(6) 0 select,insert,update,references -medium mediumint(8) 0 select,insert,update,references -long_int int(11) 0 select,insert,update,references -longlong bigint(13) 0 select,insert,update,references -real_float float(13,1) 0.0 select,insert,update,references -real_double double(16,4) YES NULL select,insert,update,references -utiny tinyint(3) unsigned 0 select,insert,update,references -ushort smallint(5) unsigned zerofill 00000 select,insert,update,references -umedium mediumint(8) unsigned 0 select,insert,update,references -ulong int(11) unsigned 0 select,insert,update,references -ulonglong bigint(13) unsigned 0 select,insert,update,references -time_stamp timestamp(14) YES NULL select,insert,update,references -date_field varchar(10) YES NULL select,insert,update,references -time_field time YES NULL select,insert,update,references -date_time datetime YES NULL select,insert,update,references -new_blob_col varchar(20) YES NULL select,insert,update,references -tinyblob_col tinyblob YES NULL select,insert,update,references -mediumblob_col mediumblob select,insert,update,references -options enum('one','two','tree') one select,insert,update,references -flags set('one','two','tree') select,insert,update,references -new_field varchar(10) new select,insert,update,references +Field Type Null Key Default Extra Privileges Comment +auto int(5) unsigned 0 select,insert,update,references +string varchar(10) YES new defaul select,insert,update,references +tiny tinyint(4) 0 select,insert,update,references +short smallint(6) 0 select,insert,update,references +medium mediumint(8) 0 select,insert,update,references +long_int int(11) 0 select,insert,update,references +longlong bigint(13) 0 select,insert,update,references +real_float float(13,1) 0.0 select,insert,update,references +real_double double(16,4) YES NULL select,insert,update,references +utiny tinyint(3) unsigned 0 select,insert,update,references +ushort smallint(5) unsigned zerofill 00000 select,insert,update,references +umedium mediumint(8) unsigned 0 select,insert,update,references +ulong int(11) unsigned 0 select,insert,update,references +ulonglong bigint(13) unsigned 0 select,insert,update,references +time_stamp timestamp(14) YES NULL select,insert,update,references +date_field varchar(10) YES NULL select,insert,update,references +time_field time YES NULL select,insert,update,references +date_time datetime YES NULL select,insert,update,references +new_blob_col varchar(20) YES NULL select,insert,update,references +tinyblob_col tinyblob YES NULL select,insert,update,references +mediumblob_col mediumblob select,insert,update,references +options enum('one','two','tree') one select,insert,update,references +flags set('one','two','tree') select,insert,update,references +new_field varchar(10) new select,insert,update,references select t1.auto,t2.auto from t1,t2 where t1.auto=t2.auto and ((t1.string<>t2.string and (t1.string is not null or t2.string is not null)) or (t1.tiny<>t2.tiny and (t1.tiny is not null or t2.tiny is not null)) or (t1.short<>t2.short and (t1.short is not null or t2.short is not null)) or (t1.medium<>t2.medium and (t1.medium is not null or t2.medium is not null)) or (t1.long_int<>t2.long_int and (t1.long_int is not null or t2.long_int is not null)) or (t1.longlong<>t2.longlong and (t1.longlong is not null or t2.longlong is not null)) or (t1.real_float<>t2.real_float and (t1.real_float is not null or t2.real_float is not null)) or (t1.real_double<>t2.real_double and (t1.real_double is not null or t2.real_double is not null)) or (t1.utiny<>t2.utiny and (t1.utiny is not null or t2.utiny is not null)) or (t1.ushort<>t2.ushort and (t1.ushort is not null or t2.ushort is not null)) or (t1.umedium<>t2.umedium and (t1.umedium is not null or t2.umedium is not null)) or (t1.ulong<>t2.ulong and (t1.ulong is not null or t2.ulong is not null)) or (t1.ulonglong<>t2.ulonglong and (t1.ulonglong is not null or t2.ulonglong is not null)) or (t1.time_stamp<>t2.time_stamp and (t1.time_stamp is not null or t2.time_stamp is not null)) or (t1.date_field<>t2.date_field and (t1.date_field is not null or t2.date_field is not null)) or (t1.time_field<>t2.time_field and (t1.time_field is not null or t2.time_field is not null)) or (t1.date_time<>t2.date_time and (t1.date_time is not null or t2.date_time is not null)) or (t1.new_blob_col<>t2.new_blob_col and (t1.new_blob_col is not null or t2.new_blob_col is not null)) or (t1.tinyblob_col<>t2.tinyblob_col and (t1.tinyblob_col is not null or t2.tinyblob_col is not null)) or (t1.mediumblob_col<>t2.mediumblob_col and (t1.mediumblob_col is not null or t2.mediumblob_col is not null)) or (t1.options<>t2.options and (t1.options is not null or t2.options is not null)) or (t1.flags<>t2.flags and (t1.flags is not null or t2.flags is not null)) or (t1.new_field<>t2.new_field and (t1.new_field is not null or t2.new_field is not null))); auto auto 16 16 @@ -228,12 +228,12 @@ auto auto drop table t2; create table t2 (primary key (auto)) select auto+1 as auto,1 as t1, "a" as t2, repeat("a",256) as t3, binary repeat("b",256) as t4 from t1; show full columns from t2; -Field Type Null Key Default Extra Privileges -auto bigint(17) unsigned PRI 0 select,insert,update,references -t1 bigint(1) 0 select,insert,update,references -t2 char(1) select,insert,update,references -t3 mediumtext select,insert,update,references -t4 mediumblob select,insert,update,references +Field Type Null Key Default Extra Privileges Comment +auto bigint(17) unsigned PRI 0 select,insert,update,references +t1 bigint(1) 0 select,insert,update,references +t2 char(1) select,insert,update,references +t3 mediumtext select,insert,update,references +t4 mediumblob select,insert,update,references select * from t2; auto t1 t2 t3 t4 11 1 a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb @@ -251,10 +251,10 @@ create table t3 select * from t1, t2; Duplicate column name 'c' create table t3 select t1.c AS c1, t2.c AS c2,1 as "const" from t1, t2; show full columns from t3; -Field Type Null Key Default Extra Privileges -c1 int(11) YES NULL select,insert,update,references -c2 int(11) YES NULL select,insert,update,references -const bigint(1) 0 select,insert,update,references +Field Type Null Key Default Extra Privileges Comment +c1 int(11) YES NULL select,insert,update,references +c2 int(11) YES NULL select,insert,update,references +const bigint(1) 0 select,insert,update,references drop table t1,t2,t3; create table t1 ( myfield INT NOT NULL, UNIQUE INDEX (myfield), unique (myfield), index(myfield)); drop table t1; diff --git a/mysql-test/t/heap_btree.test b/mysql-test/t/heap_btree.test index 2793a22e94d..e4b7d8674b9 100644 --- a/mysql-test/t/heap_btree.test +++ b/mysql-test/t/heap_btree.test @@ -60,12 +60,12 @@ insert into t1 values(1,1),(1,2),(2,3),(1,3),(1,4),(1,5),(1,6); select * from t1 where a=1; insert into t1 values(1,1),(1,2),(2,3),(1,3),(1,4),(1,5),(1,6); select * from t1 where a=1; ---replace_result 0 x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x +--replace_result 0 x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x 11 x 12 x 13 x 14 x explain select * from t1 where a=1 order by a,b; ---replace_result 0 x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x +--replace_result 0 x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x 11 x 12 x 13 x 14 x explain select * from t1 where a=1 order by b; select * from t1 where b=1; ---replace_result 0 x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x +--replace_result 0 x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x 11 x 12 x 13 x 14 x explain select * from t1 where b=1; drop table t1; -- cgit v1.2.1 From cb27688b4866c7c8c68cd05411902a5424ea9e94 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 5 Jun 2002 21:16:18 +0500 Subject: configure.in: changed version number --- configure.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.in b/configure.in index b4c25021b7e..53c235fd9e1 100644 --- a/configure.in +++ b/configure.in @@ -4,7 +4,7 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(sql/mysqld.cc) AC_CANONICAL_SYSTEM # The Docs Makefile.am parses this line! -AM_INIT_AUTOMAKE(mysql, 4.0.2-alpha) +AM_INIT_AUTOMAKE(mysql, 4.1.0-alpha) AM_CONFIG_HEADER(config.h) PROTOCOL_VERSION=10 -- cgit v1.2.1 From 05bb861ba7d1eeefcc4a815055d39c6c0bf5a8b4 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 5 Jun 2002 21:35:23 +0300 Subject: fixing after mergin --- include/mysqld_error.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/mysqld_error.h b/include/mysqld_error.h index fbdb4a4f984..854005d17bc 100644 --- a/include/mysqld_error.h +++ b/include/mysqld_error.h @@ -246,5 +246,5 @@ #define ER_WRONG_FK_DEF 1227 #define ER_KEY_REF_DO_NOT_MATCH_TABLE_REF 1228 #define ER_SUBSELECT_NO_1_COL 1229 -#define ER_SUBSELECT_NO_1_ROW 1231 +#define ER_SUBSELECT_NO_1_ROW 1230 #define ER_ERROR_MESSAGES 231 -- cgit v1.2.1 From 4a1dec3dfbf750dab7fcd6a5c6785c28b96a3c65 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 5 Jun 2002 22:05:08 +0300 Subject: post-merged fixing --- sql/sql_parse.cc | 4 ++-- sql/sql_select.cc | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 621f1d60a95..61a7f5e0ae5 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1809,7 +1809,7 @@ mysql_execute_command(void) tables->grant.want_privilege=(SELECT_ACL & ~tables->grant.privilege); if ((res=open_and_lock_tables(thd,tables))) break; - thd->select_limit=HA_POS_ERROR; + unit->select_limit_cnt= HA_POS_ERROR; if (!setup_fields(thd,tables,select_lex->item_list,1,0,0) && !setup_fields(thd,tables,lex->value_list,0,0,0) && ! thd->fatal_error && (result=new multi_update(thd,tables,select_lex->item_list,lex->duplicates, @@ -2776,7 +2776,7 @@ void mysql_init_multi_delete(LEX *lex) { lex->sql_command= SQLCOM_DELETE_MULTI; mysql_init_select(lex); - lex->select->select_limit= lex->select->master_union()->select_limit_cnt= + lex->select->select_limit= lex->select->master_unit()->select_limit_cnt= HA_POS_ERROR; lex->auxilliary_table_list= lex->select_lex.table_list; lex->select->init_query(); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 7e5130e93ab..d4f6504ec32 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -2480,7 +2480,7 @@ make_simple_join(JOIN *join,TABLE *tmp_table) join->send_records=(ha_rows) 0; join->group=0; join->do_send_rows = 1; - join->row_limit=join->thd->select_limit; + join->row_limit=join->unit->select_limit_cnt; join_tab->cache.buff=0; /* No cacheing */ join_tab->table=tmp_table; @@ -7119,7 +7119,7 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, /* Don't log this into the slow query log */ select_lex->options&= ~(QUERY_NO_INDEX_USED | QUERY_NO_GOOD_INDEX_USED); - thd->offset_limit=0; + join->unit->offset_limit_cnt= 0; if (thd->lex.select == select_lex) { field_list.push_back(new Item_empty_string("table",NAME_LEN)); -- cgit v1.2.1 From 90ced85443e4563ab1a7f94581691d2b7e30bdaa Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 6 Jun 2002 16:28:22 +0300 Subject: Prevent needless rexecuting empty subselects --- sql/item_subselect.cc | 5 +++-- sql/item_subselect.h | 2 ++ sql/sql_class.cc | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index e18c8d78830..fc0228455ff 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -36,7 +36,7 @@ SUBSELECT TODO: #include "sql_select.h" Item_subselect::Item_subselect(THD *thd, st_select_lex *select_lex): - executed(0), optimized(0), error(0) + assigned(0), executed(0), optimized(0), error(0) { DBUG_ENTER("Item_subselect::Item_subselect"); DBUG_PRINT("subs", ("select_lex 0x%xl", (long) select_lex)); @@ -141,7 +141,7 @@ int Item_subselect::exec() return 1; } assign_null(); - executed= 0; + executed= assigned= 0; } if (!executed) { @@ -149,6 +149,7 @@ int Item_subselect::exec() join->thd->lex.select= select_lex; join->exec(); join->thd->lex.select= save_select; + executed= 1; return join->error; } return 0; diff --git a/sql/item_subselect.h b/sql/item_subselect.h index e27f14fb83d..c6963df2d53 100644 --- a/sql/item_subselect.h +++ b/sql/item_subselect.h @@ -31,6 +31,7 @@ class Item_subselect :public Item protected: longlong int_value; double real_value; + my_bool assigned; /* value already assigned to subselect */ my_bool executed; /* simple subselect is executed */ my_bool optimized; /* simple subselect is optimized */ my_bool error; /* error in query */ @@ -59,6 +60,7 @@ public: max_length= item->max_length; decimals= item->decimals; res_type= item->res_type; + assigned= item->assigned; executed= item->executed; select_lex= item->select_lex; join= item->join; diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 0fb15c4342f..cd548f36cff 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -785,7 +785,7 @@ select_subselect::select_subselect(Item_subselect *item) bool select_subselect::send_data(List &items) { DBUG_ENTER("select_subselect::send_data"); - if (item->executed){ + if (item->assigned){ my_printf_error(ER_SUBSELECT_NO_1_ROW, ER(ER_SUBSELECT_NO_1_ROW), MYF(0)); DBUG_RETURN(1); } @@ -812,6 +812,6 @@ bool select_subselect::send_data(List &items) item->int_value= val_item->val_int(); item->res_type= val_item->result_type(); } - item->executed= 1; + item->assigned= 1; DBUG_RETURN(0); } -- cgit v1.2.1 From 6192996d17bb37e87a62a5e92f9e89330ccc6f28 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 7 Jun 2002 16:47:36 +0500 Subject: heap_create() <-> heap_open() --- heap/hp_create.c | 166 +++++++++++++++++++++++++++++++++++++++++++------- heap/hp_open.c | 155 ++++------------------------------------------- heap/hp_test1.c | 6 +- heap/hp_test2.c | 16 +++-- include/heap.h | 7 +-- sql/ha_heap.cc | 180 +++++++++++++++++++++++++++---------------------------- 6 files changed, 265 insertions(+), 265 deletions(-) diff --git a/heap/hp_create.c b/heap/hp_create.c index 99f4cb0146d..4163f5b0217 100644 --- a/heap/hp_create.c +++ b/heap/hp_create.c @@ -14,29 +14,156 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* - Create is done by simply remove the database from memory if it exists. - Open creates the database when neaded -*/ - #include "heapdef.h" -int heap_create(const char *name) +static int keys_compare(heap_rb_param *param, uchar *key1, uchar *key2); +static void init_block(HP_BLOCK *block,uint reclength,ulong min_records, + ulong max_records); + +int heap_create(const char *name, uint keys, HP_KEYDEF *keydef, + uint reclength, ulong max_records, ulong min_records) { - reg1 HP_SHARE *share; + uint i, j, key_segs, max_length, length; + HP_SHARE *share; + HA_KEYSEG *keyseg; + DBUG_ENTER("heap_create"); pthread_mutex_lock(&THR_LOCK_heap); - if ((share=hp_find_named_heap(name))) + + if ((share= hp_find_named_heap(name)) && share->open_count == 0) { - if (share->open_count == 0) - hp_free(share); + hp_free(share); + share= NULL; } - else + + if (!share) { - my_errno=ENOENT; + HP_KEYDEF *keyinfo; + DBUG_PRINT("info",("Initializing new table")); + for (i= key_segs= max_length= 0, keyinfo= keydef; i < keys; i++, keyinfo++) + { + bzero((char*) &keyinfo->block,sizeof(keyinfo->block)); + bzero((char*) &keyinfo->rb_tree ,sizeof(keyinfo->rb_tree)); + for (j= length= 0; j < keyinfo->keysegs; j++) + { + length+= keyinfo->seg[j].length; + if (keyinfo->seg[j].null_bit) + { + if (!(keyinfo->flag & HA_NULL_ARE_EQUAL)) + keyinfo->flag|= HA_NULL_PART_KEY; + if (keyinfo->algorithm == HA_KEY_ALG_BTREE) + keyinfo->rb_tree.size_of_element++; + } + } + keyinfo->length= length; + length+= keyinfo->rb_tree.size_of_element + + ((keyinfo->algorithm == HA_KEY_ALG_BTREE) ? sizeof(byte*) : 0); + if (length > max_length) + max_length= length; + key_segs+= keyinfo->keysegs; + if (keyinfo->algorithm == HA_KEY_ALG_BTREE) + { + key_segs++; /* additional HA_KEYTYPE_END segment */ + if (keyinfo->flag & HA_NULL_PART_KEY) + keyinfo->get_key_length= hp_rb_null_key_length; + else + keyinfo->get_key_length= hp_rb_key_length; + } + } + if (!(share= (HP_SHARE*) my_malloc((uint) sizeof(HP_SHARE)+ + keys*sizeof(HP_KEYDEF)+ + key_segs*sizeof(HA_KEYSEG), + MYF(MY_ZEROFILL)))) + { + pthread_mutex_unlock(&THR_LOCK_heap); + DBUG_RETURN(1); + } + share->keydef= (HP_KEYDEF*) (share + 1); + keyseg= (HA_KEYSEG*) (share->keydef + keys); + init_block(&share->block, reclength + 1, min_records, max_records); + /* Fix keys */ + memcpy(share->keydef, keydef, (size_t) (sizeof(keydef[0]) * keys)); + for (i= 0, keyinfo= share->keydef; i < keys; i++, keyinfo++) + { + uint nsegs= keydef[i].keysegs; + + if (keydef[i].algorithm == HA_KEY_ALG_BTREE) + { + init_tree(&keyinfo->rb_tree, 0, 0, sizeof(byte*), + (qsort_cmp2)keys_compare, 1, NULL, NULL); + keyinfo->delete_key= hp_rb_delete_key; + keyinfo->write_key= hp_rb_write_key; + nsegs++; + } + else + { + init_block(&keyinfo->block, sizeof(HASH_INFO), min_records, + max_records); + keyinfo->delete_key= hp_delete_key; + keyinfo->write_key= hp_write_key; + } + keyinfo->seg= keyseg; + memcpy(keyseg, keydef[i].seg, + (size_t) (sizeof(keyseg[0]) * nsegs)); + keyseg+= nsegs; + } + + share->min_records= min_records; + share->max_records= max_records; + share->data_length= share->index_length= 0; + share->reclength= reclength; + share->blength= 1; + share->keys= keys; + share->max_key_length= max_length; + share->changed= 0; + if (!(share->name= my_strdup(name,MYF(0)))) + { + my_free((gptr) share,MYF(0)); + pthread_mutex_unlock(&THR_LOCK_heap); + DBUG_RETURN(1); + } +#ifdef THREAD + thr_lock_init(&share->lock); + VOID(pthread_mutex_init(&share->intern_lock,MY_MUTEX_INIT_FAST)); +#endif + share->open_list.data= (void*) share; + heap_share_list= list_add(heap_share_list,&share->open_list); } pthread_mutex_unlock(&THR_LOCK_heap); DBUG_RETURN(0); +} /* heap_create */ + +static int keys_compare(heap_rb_param *param, uchar *key1, uchar *key2) +{ + uint not_used; + return ha_key_cmp(param->keyseg, key1, key2, param->key_length, + param->search_flag, ¬_used); +} + +static void init_block(HP_BLOCK *block, uint reclength, ulong min_records, + ulong max_records) +{ + uint i,recbuffer,records_in_block; + + max_records= max(min_records,max_records); + if (!max_records) + max_records= 1000; /* As good as quess as anything */ + recbuffer= (uint) (reclength + sizeof(byte**) - 1) & ~(sizeof(byte**) - 1); + records_in_block= max_records / 10; + if (records_in_block < 10 && max_records) + records_in_block= 10; + if (!records_in_block || records_in_block*recbuffer > + (my_default_record_cache_size-sizeof(HP_PTRS)*HP_MAX_LEVELS)) + records_in_block= (my_default_record_cache_size - sizeof(HP_PTRS) * + HP_MAX_LEVELS) / recbuffer + 1; + block->records_in_block= records_in_block; + block->recbuffer= recbuffer; + block->last_allocated= 0L; + + for (i= 0; i <= HP_MAX_LEVELS; i++) + block->level_info[i].records_under_level= + (!i ? 1 : i == 1 ? records_in_block : + HP_PTRS_IN_NOD * block->level_info[i - 1].records_under_level); } int heap_delete_table(const char *name) @@ -46,32 +173,31 @@ int heap_delete_table(const char *name) DBUG_ENTER("heap_delete_table"); pthread_mutex_lock(&THR_LOCK_heap); - if ((share = hp_find_named_heap(name))) + if ((share= hp_find_named_heap(name))) { if (share->open_count == 0) hp_free(share); else - share->delete_on_close=1; - result=0; + share->delete_on_close= 1; + result= 0; } else { - result=my_errno=ENOENT; + result= my_errno=ENOENT; } pthread_mutex_unlock(&THR_LOCK_heap); DBUG_RETURN(result); } - void hp_free(HP_SHARE *share) { - heap_share_list=list_delete(heap_share_list,&share->open_list); + heap_share_list= list_delete(heap_share_list, &share->open_list); hp_clear(share); /* Remove blocks from memory */ #ifdef THREAD thr_lock_delete(&share->lock); VOID(pthread_mutex_destroy(&share->intern_lock)); #endif - my_free((gptr) share->name,MYF(0)); - my_free((gptr) share,MYF(0)); + my_free((gptr) share->name, MYF(0)); + my_free((gptr) share, MYF(0)); return; } diff --git a/heap/hp_open.c b/heap/hp_open.c index d48423c506a..1fa832208fb 100644 --- a/heap/hp_open.c +++ b/heap/hp_open.c @@ -23,130 +23,27 @@ #include "my_sys.h" -static int keys_compare(heap_rb_param *param, uchar *key1, uchar *key2) +HP_INFO *heap_open(const char *name, int mode) { - uint not_used; - return ha_key_cmp(param->keyseg, key1, key2, param->key_length, - param->search_flag, ¬_used); -} - -static void init_block(HP_BLOCK *block,uint reclength,ulong min_records, - ulong max_records); - - /* open a heap database. */ - -HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef, - uint reclength, ulong max_records, ulong min_records) -{ - uint i,j,key_segs,max_length,length; HP_INFO *info; HP_SHARE *share; - HA_KEYSEG *keyseg; DBUG_ENTER("heap_open"); - pthread_mutex_lock(&THR_LOCK_heap); - if (!(share = hp_find_named_heap(name))) + if (!(share= hp_find_named_heap(name))) { - HP_KEYDEF *keyinfo; - DBUG_PRINT("info",("Initializing new table")); - for (i=key_segs=max_length=0, keyinfo= keydef; i < keys; i++, keyinfo++) - { - bzero((char*) &keyinfo->block,sizeof(keyinfo->block)); - bzero((char*) &keyinfo->rb_tree ,sizeof(keyinfo->rb_tree)); - for (j=length=0 ; j < keyinfo->keysegs; j++) - { - length+=keyinfo->seg[j].length; - if (keyinfo->seg[j].null_bit) - { - if (!(keyinfo->flag & HA_NULL_ARE_EQUAL)) - keyinfo->flag |= HA_NULL_PART_KEY; - if (keyinfo->algorithm == HA_KEY_ALG_BTREE) - keyinfo->rb_tree.size_of_element++; - } - } - keyinfo->length= length; - length+= keyinfo->rb_tree.size_of_element + - ((keyinfo->algorithm == HA_KEY_ALG_BTREE) ? sizeof(byte*) : 0); - if (length > max_length) - max_length= length; - key_segs+= keyinfo->keysegs; - if (keyinfo->algorithm == HA_KEY_ALG_BTREE) - { - key_segs++; /* additional HA_KEYTYPE_END segment */ - if (keyinfo->flag & HA_NULL_PART_KEY) - keyinfo->get_key_length = hp_rb_null_key_length; - else - keyinfo->get_key_length = hp_rb_key_length; - } - } - if (!(share= (HP_SHARE*) my_malloc((uint) sizeof(HP_SHARE)+ - keys*sizeof(HP_KEYDEF)+ - key_segs*sizeof(HA_KEYSEG), - MYF(MY_ZEROFILL)))) - { - pthread_mutex_unlock(&THR_LOCK_heap); - DBUG_RETURN(0); - } - share->keydef= (HP_KEYDEF*) (share + 1); - keyseg= (HA_KEYSEG*) (share->keydef + keys); - init_block(&share->block, reclength + 1, min_records, max_records); - /* Fix keys */ - memcpy(share->keydef, keydef, (size_t) (sizeof(keydef[0]) * keys)); - for (i= 0, keyinfo= share->keydef; i < keys; i++, keyinfo++) - { - uint nsegs= keydef[i].keysegs; - - if (keydef[i].algorithm == HA_KEY_ALG_BTREE) - { - init_tree(&keyinfo->rb_tree, 0, 0, sizeof(byte*), - (qsort_cmp2)keys_compare, 1, NULL, NULL); - keyinfo->delete_key= hp_rb_delete_key; - keyinfo->write_key= hp_rb_write_key; - nsegs++; - } - else - { - init_block(&keyinfo->block, sizeof(HASH_INFO), min_records, - max_records); - keyinfo->delete_key= hp_delete_key; - keyinfo->write_key= hp_write_key; - } - keyinfo->seg= keyseg; - memcpy(keyseg, keydef[i].seg, - (size_t) (sizeof(keyseg[0]) * nsegs)); - keyseg+= nsegs; - } - - share->min_records= min_records; - share->max_records= max_records; - share->data_length= share->index_length= 0; - share->reclength= reclength; - share->blength= 1; - share->keys= keys; - share->max_key_length= max_length; - share->changed= 0; - if (!(share->name= my_strdup(name,MYF(0)))) - { - my_free((gptr) share,MYF(0)); - pthread_mutex_unlock(&THR_LOCK_heap); - DBUG_RETURN(0); - } -#ifdef THREAD - thr_lock_init(&share->lock); - VOID(pthread_mutex_init(&share->intern_lock,MY_MUTEX_INIT_FAST)); -#endif - share->open_list.data= (void*) share; - heap_share_list= list_add(heap_share_list,&share->open_list); + my_errno= ENOENT; + pthread_mutex_unlock(&THR_LOCK_heap); + DBUG_RETURN(0); } - if (!(info= (HP_INFO*) my_malloc((uint) sizeof(HP_INFO)+ + if (!(info= (HP_INFO*) my_malloc((uint) sizeof(HP_INFO) + 2 * share->max_key_length, MYF(MY_ZEROFILL)))) { pthread_mutex_unlock(&THR_LOCK_heap); DBUG_RETURN(0); } - share->open_count++; + share->open_count++; #ifdef THREAD thr_lock_data_init(&share->lock,&info->lock,NULL); #endif @@ -169,8 +66,7 @@ HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef, DBUG_PRINT("exit",("heap: %lx reclength: %d records_in_block: %d", info,share->reclength,share->block.records_in_block)); DBUG_RETURN(info); -} /* heap_open */ - +} /* map name to a heap-nr. If name isn't found return 0 */ @@ -181,41 +77,16 @@ HP_SHARE *hp_find_named_heap(const char *name) DBUG_ENTER("heap_find"); DBUG_PRINT("enter",("name: %s",name)); - for (pos=heap_share_list ; pos ; pos=pos->next) + for (pos= heap_share_list; pos; pos= pos->next) { - info=(HP_SHARE*) pos->data; - if (!strcmp(name,info->name)) + info= (HP_SHARE*) pos->data; + if (!strcmp(name, info->name)) { - DBUG_PRINT("exit",("Old heap_database: %lx",info)); + DBUG_PRINT("exit", ("Old heap_database: %lx",info)); DBUG_RETURN(info); } } - DBUG_RETURN((HP_SHARE *)0); + DBUG_RETURN((HP_SHARE *) 0); } -static void init_block(HP_BLOCK *block, uint reclength, ulong min_records, - ulong max_records) -{ - uint i,recbuffer,records_in_block; - - max_records=max(min_records,max_records); - if (!max_records) - max_records=1000; /* As good as quess as anything */ - recbuffer=(uint) (reclength+sizeof(byte**)-1) & ~(sizeof(byte**)-1); - records_in_block=max_records/10; - if (records_in_block < 10 && max_records) - records_in_block=10; - if (!records_in_block || records_in_block*recbuffer > - (my_default_record_cache_size-sizeof(HP_PTRS)*HP_MAX_LEVELS)) - records_in_block=(my_default_record_cache_size-sizeof(HP_PTRS)* - HP_MAX_LEVELS)/recbuffer+1; - block->records_in_block=records_in_block; - block->recbuffer=recbuffer; - block->last_allocated= 0L; - - for (i=0 ; i <= HP_MAX_LEVELS ; i++) - block->level_info[i].records_under_level= - (!i ? 1 : i == 1 ? records_in_block : - HP_PTRS_IN_NOD * block->level_info[i-1].records_under_level); -} diff --git a/heap/hp_test1.c b/heap/hp_test1.c index 79edfe2effc..f619ac2e8db 100644 --- a/heap/hp_test1.c +++ b/heap/hp_test1.c @@ -53,8 +53,8 @@ int main(int argc, char **argv) bzero((gptr) flags,sizeof(flags)); printf("- Creating heap-file\n"); - heap_create(filename); - if (!(file=heap_open(filename,2,1,keyinfo,30,(ulong) flag*100000l,10l))) + if (heap_create(filename,1,keyinfo,30,(ulong) flag*100000l,10l) || + !(file= heap_open(filename, 2))) goto err; printf("- Writing records:s\n"); strmov(record," ..... key "); @@ -77,7 +77,7 @@ int main(int argc, char **argv) if (heap_close(file)) goto err; printf("- Reopening file\n"); - if (!(file=heap_open(filename,2,1,keyinfo,30,(ulong) flag*100000l,10l))) + if (!(file=heap_open(filename, 2))) goto err; printf("- Removing records\n"); diff --git a/heap/hp_test2.c b/heap/hp_test2.c index a972e7073e0..e687bdab127 100644 --- a/heap/hp_test2.c +++ b/heap/hp_test2.c @@ -81,6 +81,7 @@ int main(int argc, char *argv[]) keyinfo[0].seg[0].start=0; keyinfo[0].seg[0].length=6; keyinfo[0].seg[0].null_bit=0; + keyinfo[0].seg[0].charset=default_charset_info; keyinfo[1].seg=keyseg+1; keyinfo[1].keysegs=2; keyinfo[1].flag=0; @@ -88,10 +89,12 @@ int main(int argc, char *argv[]) keyinfo[1].seg[0].start=7; keyinfo[1].seg[0].length=6; keyinfo[1].seg[0].null_bit=0; + keyinfo[1].seg[0].charset=default_charset_info; keyinfo[1].seg[1].type=HA_KEYTYPE_TEXT; keyinfo[1].seg[1].start=0; /* key in two parts */ keyinfo[1].seg[1].length=6; keyinfo[1].seg[1].null_bit=0; + keyinfo[1].seg[1].charset=default_charset_info; keyinfo[2].seg=keyseg+3; keyinfo[2].keysegs=1; keyinfo[2].flag=HA_NOSAME; @@ -99,6 +102,7 @@ int main(int argc, char *argv[]) keyinfo[2].seg[0].start=12; keyinfo[2].seg[0].length=8; keyinfo[2].seg[0].null_bit=0; + keyinfo[2].seg[0].charset=default_charset_info; keyinfo[3].keysegs=1; keyinfo[3].flag=HA_NOSAME; keyinfo[3].seg=keyseg+4; @@ -107,15 +111,15 @@ int main(int argc, char *argv[]) keyinfo[3].seg[0].length=1; keyinfo[3].seg[0].null_bit=1; keyinfo[3].seg[0].null_pos=38; + keyinfo[3].seg[0].charset=default_charset_info; bzero((char*) key1,sizeof(key1)); bzero((char*) key3,sizeof(key3)); printf("- Creating heap-file\n"); - if (heap_create(filename)) - goto err; - if (!(file=heap_open(filename,2,keys,keyinfo,reclength,(ulong) flag*100000L, - (ulong) recant/2))) + if (heap_create(filename,keys,keyinfo,reclength,(ulong) flag*100000L, + (ulong) recant/2) || + !(file= heap_open(filename, 2))) goto err; signal(SIGINT,endprog); @@ -530,7 +534,7 @@ int main(int argc, char *argv[]) if (testflag == 4) goto end; printf("- Reading through all rows through keys\n"); - if (!(file2=heap_open(filename,2,0,0,0,0,0))) + if (!(file2=heap_open(filename, 2))) goto err; if (heap_scan_init(file)) goto err; @@ -549,7 +553,7 @@ int main(int argc, char *argv[]) heap_close(file2); printf("- Creating output heap-file 2\n"); - if (!(file2=heap_open(filename2,2,1,keyinfo,reclength,0L,0L))) + if (!(file2=heap_open(filename2, 2))) goto err; printf("- Copying and removing records\n"); diff --git a/include/heap.h b/include/heap.h index 53757f51e73..359c4346a5d 100644 --- a/include/heap.h +++ b/include/heap.h @@ -142,9 +142,7 @@ typedef struct st_heap_info /* Prototypes for heap-functions */ -extern HP_INFO* heap_open(const char *name,int mode,uint keys, - HP_KEYDEF *keydef,uint reclength, - ulong max_records,ulong min_reloc); +extern HP_INFO *heap_open(const char *name, int mode); extern int heap_close(HP_INFO *info); extern int heap_write(HP_INFO *info,const byte *buff); extern int heap_update(HP_INFO *info,const byte *old,const byte *newdata); @@ -153,7 +151,8 @@ extern int heap_scan_init(HP_INFO *info); extern int heap_scan(register HP_INFO *info, byte *record); extern int heap_delete(HP_INFO *info,const byte *buff); extern int heap_info(HP_INFO *info,HEAPINFO *x,int flag); -extern int heap_create(const char *name); +extern int heap_create(const char *name, uint keys, HP_KEYDEF *keydef, + uint reclength, ulong max_records, ulong min_records); extern int heap_delete_table(const char *name); extern int heap_extra(HP_INFO *info,enum ha_extra_function function); extern int heap_rename(const char *old_name,const char *new_name); diff --git a/sql/ha_heap.cc b/sql/ha_heap.cc index 70409be4e42..f56bfe74265 100644 --- a/sql/ha_heap.cc +++ b/sql/ha_heap.cc @@ -33,92 +33,12 @@ const char **ha_heap::bas_ext() const int ha_heap::open(const char *name, int mode, uint test_if_locked) { - uint key,parts,mem_per_row=0; - ulong max_rows; - HP_KEYDEF *keydef; - HA_KEYSEG *seg; - - for (key=parts=0 ; key < table->keys ; key++) + if (!(file= heap_open(name, mode)) && my_errno == ENOENT) { - parts+=table->key_info[key].key_parts; - if (table->key_info[key].algorithm == HA_KEY_ALG_BTREE) - parts++; /* additional HA_KEYTYPE_END keyseg */ + if (!create(name, table, NULL)) + file= heap_open(name, mode); } - - if (!(keydef=(HP_KEYDEF*) my_malloc(table->keys*sizeof(HP_KEYDEF)+ - parts*sizeof(HA_KEYSEG),MYF(MY_WME)))) - return my_errno; - seg=my_reinterpret_cast(HA_KEYSEG*) (keydef+table->keys); - for (key=0 ; key < table->keys ; key++) - { - KEY *pos=table->key_info+key; - KEY_PART_INFO *key_part= pos->key_part; - KEY_PART_INFO *key_part_end= key_part + pos->key_parts; - - mem_per_row+= (pos->key_length + (sizeof(char*) * 2)); - - keydef[key].keysegs= (uint) pos->key_parts; - keydef[key].flag= (pos->flags & (HA_NOSAME | HA_NULL_ARE_EQUAL)); - keydef[key].seg= seg; - keydef[key].algorithm= pos->algorithm == HA_KEY_ALG_UNDEF ? - HA_KEY_ALG_HASH : pos->algorithm; - - for (; key_part != key_part_end ; key_part++, seg++) - { - uint flag= key_part->key_type; - Field *field= key_part->field; - if (pos->algorithm == HA_KEY_ALG_BTREE) - { - seg->type= field->key_type(); - } - else - { - if (!f_is_packed(flag) && - f_packtype(flag) == (int) FIELD_TYPE_DECIMAL && - !(flag & FIELDFLAG_BINARY)) - seg->type= (int) HA_KEYTYPE_TEXT; - else - seg->type= (int) HA_KEYTYPE_BINARY; - } - seg->start= (uint) key_part->offset; - seg->length= (uint) key_part->length; - seg->flag = 0; - seg->charset= field->binary() ? NULL : ((Field_str*)field)->charset(); - if (field->null_ptr) - { - seg->null_bit= field->null_bit; - seg->null_pos= (uint) (field->null_ptr- - (uchar*) table->record[0]); - } - else - { - seg->null_bit= 0; - seg->null_pos= 0; - } - } - if (pos->algorithm == HA_KEY_ALG_BTREE) - { - /* additional HA_KEYTYPE_END keyseg */ - seg->type= HA_KEYTYPE_END; - seg->length= sizeof(byte*); - seg->flag= 0; - seg->null_bit= 0; - seg++; - } - } - mem_per_row += MY_ALIGN(table->reclength+1, sizeof(char*)); - max_rows = (ulong) (max_heap_table_size / mem_per_row); - file=heap_open(name,mode, - table->keys,keydef, - table->reclength, - ((table->max_rows < max_rows && table->max_rows) ? - table->max_rows : max_rows), - table->min_rows); - my_free((gptr) keydef,MYF(0)); - if (file) - info(HA_STATUS_NO_LOCK | HA_STATUS_CONST | HA_STATUS_VARIABLE); - ref_length=sizeof(HEAP_PTR); - return (!file ? errno : 0); + return (file ? 0 : 1); } int ha_heap::close(void) @@ -274,7 +194,6 @@ THR_LOCK_DATA **ha_heap::store_lock(THD *thd, return to; } - /* We have to ignore ENOENT entries as the HEAP table is created on open and not when doing a CREATE on the table. @@ -291,7 +210,6 @@ int ha_heap::rename_table(const char * from, const char * to) return heap_rename(from,to); } - ha_rows ha_heap::records_in_range(int inx, const byte *start_key,uint start_key_len, enum ha_rkey_function start_search_flag, @@ -315,10 +233,92 @@ ha_rows ha_heap::records_in_range(int inx, } } - -int ha_heap::create(const char *name, TABLE *form, HA_CREATE_INFO *create_info) - +int ha_heap::create(const char *name, TABLE *table, HA_CREATE_INFO *create_info) { + uint key, parts, mem_per_row= 0; + ulong max_rows; + HP_KEYDEF *keydef; + HA_KEYSEG *seg; char buff[FN_REFLEN]; - return heap_create(fn_format(buff,name,"","",4+2)); + int error; + + for (key= parts= 0; key < table->keys; key++) + { + parts+= table->key_info[key].key_parts; + if (table->key_info[key].algorithm == HA_KEY_ALG_BTREE) + parts++; /* additional HA_KEYTYPE_END keyseg */ + } + + if (!(keydef= (HP_KEYDEF*) my_malloc(table->keys * sizeof(HP_KEYDEF) + + parts * sizeof(HA_KEYSEG), MYF(MY_WME)))) + return my_errno; + seg= my_reinterpret_cast(HA_KEYSEG*) (keydef + table->keys); + for (key= 0; key < table->keys; key++) + { + KEY *pos= table->key_info+key; + KEY_PART_INFO *key_part= pos->key_part; + KEY_PART_INFO *key_part_end= key_part + pos->key_parts; + + mem_per_row+= (pos->key_length + (sizeof(char*) * 2)); + + keydef[key].keysegs= (uint) pos->key_parts; + keydef[key].flag= (pos->flags & (HA_NOSAME | HA_NULL_ARE_EQUAL)); + keydef[key].seg= seg; + keydef[key].algorithm= pos->algorithm == HA_KEY_ALG_UNDEF ? + HA_KEY_ALG_HASH : pos->algorithm; + + for (; key_part != key_part_end; key_part++, seg++) + { + uint flag= key_part->key_type; + Field *field= key_part->field; + if (pos->algorithm == HA_KEY_ALG_BTREE) + { + seg->type= field->key_type(); + } + else + { + if (!f_is_packed(flag) && + f_packtype(flag) == (int) FIELD_TYPE_DECIMAL && + !(flag & FIELDFLAG_BINARY)) + seg->type= (int) HA_KEYTYPE_TEXT; + else + seg->type= (int) HA_KEYTYPE_BINARY; + } + seg->start= (uint) key_part->offset; + seg->length= (uint) key_part->length; + seg->flag = 0; + seg->charset= field->binary() ? NULL : ((Field_str*)field)->charset(); + if (field->null_ptr) + { + seg->null_bit= field->null_bit; + seg->null_pos= (uint) (field->null_ptr - (uchar*) table->record[0]); + } + else + { + seg->null_bit= 0; + seg->null_pos= 0; + } + } + if (pos->algorithm == HA_KEY_ALG_BTREE) + { + /* additional HA_KEYTYPE_END keyseg */ + seg->type= HA_KEYTYPE_END; + seg->length= sizeof(byte*); + seg->flag= 0; + seg->null_bit= 0; + seg++; + } + } + mem_per_row+= MY_ALIGN(table->reclength + 1, sizeof(char*)); + max_rows= (ulong) (max_heap_table_size / mem_per_row); + error= heap_create(fn_format(buff,name,"","",4+2), + table->keys,keydef, table->reclength, + ((table->max_rows < max_rows && table->max_rows) ? + table->max_rows : max_rows), + table->min_rows); + my_free((gptr) keydef, MYF(0)); + if (file) + info(HA_STATUS_NO_LOCK | HA_STATUS_CONST | HA_STATUS_VARIABLE); + ref_length= sizeof(HEAP_PTR); + return (error); } -- cgit v1.2.1 From 33a65cb2277b03a86d541ab2762ba2aa485b177c Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 7 Jun 2002 17:09:14 +0500 Subject: tests fixes --- heap/hp_test1.c | 4 +++- heap/hp_test2.c | 9 +++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/heap/hp_test1.c b/heap/hp_test1.c index f619ac2e8db..58a13efc12f 100644 --- a/heap/hp_test1.c +++ b/heap/hp_test1.c @@ -44,11 +44,13 @@ int main(int argc, char **argv) keyinfo[0].keysegs=1; keyinfo[0].seg=keyseg; + keyinfo[0].algorithm= HA_KEY_ALG_HASH; keyinfo[0].seg[0].type=HA_KEYTYPE_BINARY; keyinfo[0].seg[0].start=1; keyinfo[0].seg[0].length=6; + keyinfo[0].seg[0].charset=default_charset_info; keyinfo[0].flag = HA_NOSAME; - + deleted=0; bzero((gptr) flags,sizeof(flags)); diff --git a/heap/hp_test2.c b/heap/hp_test2.c index e687bdab127..3355c94727b 100644 --- a/heap/hp_test2.c +++ b/heap/hp_test2.c @@ -77,6 +77,7 @@ int main(int argc, char *argv[]) keyinfo[0].seg=keyseg; keyinfo[0].keysegs=1; keyinfo[0].flag= 0; + keyinfo[0].algorithm= HA_KEY_ALG_HASH; keyinfo[0].seg[0].type=HA_KEYTYPE_BINARY; keyinfo[0].seg[0].start=0; keyinfo[0].seg[0].length=6; @@ -85,6 +86,7 @@ int main(int argc, char *argv[]) keyinfo[1].seg=keyseg+1; keyinfo[1].keysegs=2; keyinfo[1].flag=0; + keyinfo[1].algorithm= HA_KEY_ALG_HASH; keyinfo[1].seg[0].type=HA_KEYTYPE_BINARY; keyinfo[1].seg[0].start=7; keyinfo[1].seg[0].length=6; @@ -98,14 +100,16 @@ int main(int argc, char *argv[]) keyinfo[2].seg=keyseg+3; keyinfo[2].keysegs=1; keyinfo[2].flag=HA_NOSAME; + keyinfo[2].algorithm= HA_KEY_ALG_HASH; keyinfo[2].seg[0].type=HA_KEYTYPE_BINARY; keyinfo[2].seg[0].start=12; keyinfo[2].seg[0].length=8; keyinfo[2].seg[0].null_bit=0; keyinfo[2].seg[0].charset=default_charset_info; + keyinfo[3].seg=keyseg+4; keyinfo[3].keysegs=1; keyinfo[3].flag=HA_NOSAME; - keyinfo[3].seg=keyseg+4; + keyinfo[3].algorithm= HA_KEY_ALG_HASH; keyinfo[3].seg[0].type=HA_KEYTYPE_BINARY; keyinfo[3].seg[0].start=37; keyinfo[3].seg[0].length=1; @@ -553,7 +557,8 @@ int main(int argc, char *argv[]) heap_close(file2); printf("- Creating output heap-file 2\n"); - if (!(file2=heap_open(filename2, 2))) + if (heap_create(filename2,1,keyinfo,reclength,0L,0L) || + !(file2= heap_open(filename2, 2))) goto err; printf("- Copying and removing records\n"); -- cgit v1.2.1 From 6c2dcd86a3145177028b114def5c9fd3327cfb61 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 7 Jun 2002 17:23:33 +0500 Subject: Charset of any string field now can be specified during CREATE TABLE mysql-test/r/alter_table.result: Fix test result according to new SHOW CREATE TABLE and SHOW FIELDS mysql-test/r/create.result: Fix test result according to new SHOW CREATE TABLE and SHOW FIELDS mysql-test/r/fulltext.result: Fix test result according to new SHOW CREATE TABLE and SHOW FIELDS mysql-test/r/innodb.result: Fix test result according to new SHOW CREATE TABLE and SHOW FIELDS mysql-test/r/merge.result: Fix test result according to new SHOW CREATE TABLE and SHOW FIELDS mysql-test/r/select.result: Fix test result according to new SHOW CREATE TABLE and SHOW FIELDS mysql-test/r/show_check.result: Fix test result according to new SHOW CREATE TABLE and SHOW FIELDS mysql-test/r/symlink.result: Fix test result according to new SHOW CREATE TABLE and SHOW FIELDS mysql-test/r/type_blob.result: Fix test result according to new SHOW CREATE TABLE and SHOW FIELDS mysql-test/r/type_ranges.result: Fix test result according to new SHOW CREATE TABLE and SHOW FIELDS sql/field.cc: New format for string fields in SHOW CREATE TABLE and SHOW FIELDS sql/mysql_priv.h: pass charset sql/sql_parse.cc: QQ is now fixed :) sql/sql_yacc.yy: New format for string fields in SHOW CREATE TABLE and SHOW FIELDS --- mysql-test/r/alter_table.result | 4 ++-- mysql-test/r/create.result | 4 ++-- mysql-test/r/fulltext.result | 2 +- mysql-test/r/innodb.result | 2 +- mysql-test/r/merge.result | 2 +- mysql-test/r/select.result | 16 ++++++++-------- mysql-test/r/show_check.result | 10 +++++----- mysql-test/r/symlink.result | 4 ++-- mysql-test/r/type_blob.result | 8 ++++---- mysql-test/r/type_ranges.result | 22 +++++++++++----------- sql/field.cc | 15 +++++++++++++++ sql/mysql_priv.h | 2 +- sql/sql_parse.cc | 4 ++-- sql/sql_yacc.yy | 15 ++++++++------- 14 files changed, 63 insertions(+), 47 deletions(-) diff --git a/mysql-test/r/alter_table.result b/mysql-test/r/alter_table.result index 0356f14db8a..159421e8f88 100644 --- a/mysql-test/r/alter_table.result +++ b/mysql-test/r/alter_table.result @@ -53,7 +53,7 @@ SHOW FULL COLUMNS FROM t1; Field Type Null Key Default Extra Privileges Comment GROUP_ID int(10) unsigned PRI 0 select,insert,update,references LANG_ID smallint(5) unsigned PRI 0 select,insert,update,references -NAME char(80) MUL select,insert,update,references +NAME char(80) character set latin1 MUL select,insert,update,references DROP TABLE t1; create table t1 (n int); insert into t1 values(9),(3),(12),(10); @@ -120,5 +120,5 @@ alter table t2 rename t1, add c char(10) comment "no comment"; show columns from t1; Field Type Null Key Default Extra i int(10) unsigned PRI NULL auto_increment -c char(10) YES NULL +c char(10) character set latin1 YES NULL drop table t1; diff --git a/mysql-test/r/create.result b/mysql-test/r/create.result index ef44e840a79..c3438ae211a 100644 --- a/mysql-test/r/create.result +++ b/mysql-test/r/create.result @@ -72,10 +72,10 @@ create table t1(x varchar(50) ); create table t2 select x from t1 where 1=2; describe t1; Field Type Null Key Default Extra -x varchar(50) YES NULL +x varchar(50) character set latin1 YES NULL describe t2; Field Type Null Key Default Extra -x char(50) YES NULL +x char(50) character set latin1 YES NULL drop table t2; create table t2 select now() as a , curtime() as b, curdate() as c , 1+1 as d , 1.0 + 1 as e , 33333333333333333 + 3 as f; describe t2; diff --git a/mysql-test/r/fulltext.result b/mysql-test/r/fulltext.result index 5ecab7278db..e6598ca9ca4 100644 --- a/mysql-test/r/fulltext.result +++ b/mysql-test/r/fulltext.result @@ -136,7 +136,7 @@ show create table t2; Table Create Table t2 CREATE TABLE `t2` ( `ticket` int(11) default NULL, - `inhalt` text, + `inhalt` text character set latin1, KEY `tig` (`ticket`), FULLTEXT KEY `tix` (`inhalt`) ) TYPE=MyISAM diff --git a/mysql-test/r/innodb.result b/mysql-test/r/innodb.result index 89a857ef098..b75248b5d5a 100644 --- a/mysql-test/r/innodb.result +++ b/mysql-test/r/innodb.result @@ -805,7 +805,7 @@ create table t1 (a char(20), index (a(5))) type=innodb; show create table t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` char(20) default NULL, + `a` char(20) character set latin1 default NULL, KEY `a` (`a`) ) TYPE=InnoDB drop table t1; diff --git a/mysql-test/r/merge.result b/mysql-test/r/merge.result index 9b72ff26350..6de77f7bdaa 100644 --- a/mysql-test/r/merge.result +++ b/mysql-test/r/merge.result @@ -172,7 +172,7 @@ show create table t3; Table Create Table t3 CREATE TABLE `t3` ( `a` int(11) NOT NULL default '0', - `b` char(20) default NULL, + `b` char(20) character set latin1 default NULL, KEY `a` (`a`) ) TYPE=MRG_MyISAM UNION=(t1,t2) create table t4 (a int not null, b char(10), key(a)) type=MERGE UNION=(t1,t2); diff --git a/mysql-test/r/select.result b/mysql-test/r/select.result index 8c8e3b492b6..49ce0608fc5 100644 --- a/mysql-test/r/select.result +++ b/mysql-test/r/select.result @@ -3211,17 +3211,17 @@ Field Type Null Key Default Extra Privileges Comment auto int(11) PRI NULL auto_increment select,insert,update,references fld1 int(6) unsigned zerofill UNI 000000 select,insert,update,references companynr tinyint(2) unsigned zerofill 00 select,insert,update,references -fld3 char(30) MUL select,insert,update,references -fld4 char(35) select,insert,update,references -fld5 char(35) select,insert,update,references -fld6 char(4) select,insert,update,references +fld3 char(30) character set latin1 MUL select,insert,update,references +fld4 char(35) character set latin1 select,insert,update,references +fld5 char(35) character set latin1 select,insert,update,references +fld6 char(4) character set latin1 select,insert,update,references show full columns from t2 from test like 'f%'; Field Type Null Key Default Extra Privileges Comment fld1 int(6) unsigned zerofill UNI 000000 select,insert,update,references -fld3 char(30) MUL select,insert,update,references -fld4 char(35) select,insert,update,references -fld5 char(35) select,insert,update,references -fld6 char(4) select,insert,update,references +fld3 char(30) character set latin1 MUL select,insert,update,references +fld4 char(35) character set latin1 select,insert,update,references +fld5 char(35) character set latin1 select,insert,update,references +fld6 char(4) character set latin1 select,insert,update,references show full columns from t2 from test like 's%'; Field Type Null Key Default Extra Privileges Comment show keys from t2; diff --git a/mysql-test/r/show_check.result b/mysql-test/r/show_check.result index 3766332cf39..1f83bc61cdc 100644 --- a/mysql-test/r/show_check.result +++ b/mysql-test/r/show_check.result @@ -94,13 +94,13 @@ show create table t1 ; Table Create Table t1 CREATE TABLE `t1` ( `test_set` set('val1','val2','val3') NOT NULL default '', - `name` char(20) default 'O''Brien' COMMENT 'O''Brien as default', + `name` char(20) character set latin1 default 'O''Brien' COMMENT 'O''Brien as default', `c` int(11) NOT NULL default '0' COMMENT 'int column' ) TYPE=MyISAM COMMENT='it''s a table' show full columns from t1; Field Type Null Key Default Extra Privileges Comment test_set set('val1','val2','val3') select,insert,update,references -name char(20) YES O'Brien select,insert,update,references O'Brien as default +name char(20) character set latin1 YES O'Brien select,insert,update,references O'Brien as default c int(11) 0 select,insert,update,references int column drop table t1; create table t1 (a int not null, unique aa (a)); @@ -133,7 +133,7 @@ show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `a` int(11) NOT NULL default '0', - `b` char(10) default NULL, + `b` char(10) character set latin1 default NULL, KEY `b` (`b`) ) TYPE=MyISAM MIN_ROWS=10 MAX_ROWS=100 AVG_ROW_LENGTH=10 PACK_KEYS=1 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=FIXED COMMENT='test' alter table t1 MAX_ROWS=200 ROW_FORMAT=dynamic PACK_KEYS=0; @@ -141,7 +141,7 @@ show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `a` int(11) NOT NULL default '0', - `b` varchar(10) default NULL, + `b` varchar(10) character set latin1 default NULL, KEY `b` (`b`) ) TYPE=MyISAM MIN_ROWS=10 MAX_ROWS=200 AVG_ROW_LENGTH=10 PACK_KEYS=0 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='test' ALTER TABLE t1 AVG_ROW_LENGTH=0 CHECKSUM=0 COMMENT="" MIN_ROWS=0 MAX_ROWS=0 PACK_KEYS=DEFAULT DELAY_KEY_WRITE=0 ROW_FORMAT=default; @@ -149,7 +149,7 @@ show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `a` int(11) NOT NULL default '0', - `b` varchar(10) default NULL, + `b` varchar(10) character set latin1 default NULL, KEY `b` (`b`) ) TYPE=MyISAM drop table t1; diff --git a/mysql-test/r/symlink.result b/mysql-test/r/symlink.result index 5626bc0fe11..b5b5b774ee5 100644 --- a/mysql-test/r/symlink.result +++ b/mysql-test/r/symlink.result @@ -36,7 +36,7 @@ show create table t9; Table Create Table t9 CREATE TABLE `t9` ( `a` int(11) NOT NULL auto_increment, - `b` char(16) NOT NULL default '', + `b` char(16) character set latin1 NOT NULL default '', `c` int(11) NOT NULL default '0', PRIMARY KEY (`a`) ) TYPE=MyISAM @@ -57,7 +57,7 @@ show create table test_mysqltest.t9; Table Create Table t9 CREATE TABLE `t9` ( `a` int(11) NOT NULL auto_increment, - `b` char(16) NOT NULL default '', + `b` char(16) character set latin1 NOT NULL default '', `c` int(11) NOT NULL default '0', `d` int(11) NOT NULL default '0', PRIMARY KEY (`a`) diff --git a/mysql-test/r/type_blob.result b/mysql-test/r/type_blob.result index 6778679bda9..c99d22c2889 100644 --- a/mysql-test/r/type_blob.result +++ b/mysql-test/r/type_blob.result @@ -38,15 +38,15 @@ update t1 set c="",b=null where c="1"; lock tables t1 READ; show full fields from t1; Field Type Null Key Default Extra Privileges Comment -t text YES NULL select,insert,update,references -c varchar(10) YES NULL select,insert,update,references +t text character set latin1 YES NULL select,insert,update,references +c varchar(10) character set latin1 YES NULL select,insert,update,references b blob YES NULL select,insert,update,references d varchar(10) binary YES NULL select,insert,update,references lock tables t1 WRITE; show full fields from t1; Field Type Null Key Default Extra Privileges Comment -t text YES NULL select,insert,update,references -c varchar(10) YES NULL select,insert,update,references +t text character set latin1 YES NULL select,insert,update,references +c varchar(10) character set latin1 YES NULL select,insert,update,references b blob YES NULL select,insert,update,references d varchar(10) binary YES NULL select,insert,update,references unlock tables; diff --git a/mysql-test/r/type_ranges.result b/mysql-test/r/type_ranges.result index 54d8ff87b37..01149b68935 100644 --- a/mysql-test/r/type_ranges.result +++ b/mysql-test/r/type_ranges.result @@ -40,7 +40,7 @@ KEY (options,flags) show full fields from t1; Field Type Null Key Default Extra Privileges Comment auto int(5) unsigned PRI NULL auto_increment select,insert,update,references -string varchar(10) YES hello select,insert,update,references +string varchar(10) character set latin1 YES hello select,insert,update,references tiny tinyint(4) MUL 0 select,insert,update,references short smallint(6) MUL 1 select,insert,update,references medium mediumint(8) MUL 0 select,insert,update,references @@ -170,7 +170,7 @@ update t2 set string="changed" where auto=16; show full columns from t1; Field Type Null Key Default Extra Privileges Comment auto int(5) unsigned MUL NULL auto_increment select,insert,update,references -string varchar(10) YES new defaul select,insert,update,references +string varchar(10) character set latin1 YES new defaul select,insert,update,references tiny tinyint(4) MUL 0 select,insert,update,references short smallint(6) MUL 0 select,insert,update,references medium mediumint(8) MUL 0 select,insert,update,references @@ -184,19 +184,19 @@ umedium mediumint(8) unsigned MUL 0 select,insert,update,references ulong int(11) unsigned MUL 0 select,insert,update,references ulonglong bigint(13) unsigned MUL 0 select,insert,update,references time_stamp timestamp(14) YES NULL select,insert,update,references -date_field varchar(10) YES NULL select,insert,update,references +date_field varchar(10) character set latin1 YES NULL select,insert,update,references time_field time YES NULL select,insert,update,references date_time datetime YES NULL select,insert,update,references -new_blob_col varchar(20) YES NULL select,insert,update,references +new_blob_col varchar(20) character set latin1 YES NULL select,insert,update,references tinyblob_col tinyblob YES NULL select,insert,update,references mediumblob_col mediumblob select,insert,update,references options enum('one','two','tree') MUL one select,insert,update,references flags set('one','two','tree') select,insert,update,references -new_field varchar(10) new select,insert,update,references +new_field varchar(10) character set latin1 new select,insert,update,references show full columns from t2; Field Type Null Key Default Extra Privileges Comment auto int(5) unsigned 0 select,insert,update,references -string varchar(10) YES new defaul select,insert,update,references +string varchar(10) character set latin1 YES new defaul select,insert,update,references tiny tinyint(4) 0 select,insert,update,references short smallint(6) 0 select,insert,update,references medium mediumint(8) 0 select,insert,update,references @@ -210,15 +210,15 @@ umedium mediumint(8) unsigned 0 select,insert,update,references ulong int(11) unsigned 0 select,insert,update,references ulonglong bigint(13) unsigned 0 select,insert,update,references time_stamp timestamp(14) YES NULL select,insert,update,references -date_field varchar(10) YES NULL select,insert,update,references +date_field varchar(10) character set latin1 YES NULL select,insert,update,references time_field time YES NULL select,insert,update,references date_time datetime YES NULL select,insert,update,references -new_blob_col varchar(20) YES NULL select,insert,update,references +new_blob_col varchar(20) character set latin1 YES NULL select,insert,update,references tinyblob_col tinyblob YES NULL select,insert,update,references mediumblob_col mediumblob select,insert,update,references options enum('one','two','tree') one select,insert,update,references flags set('one','two','tree') select,insert,update,references -new_field varchar(10) new select,insert,update,references +new_field varchar(10) character set latin1 new select,insert,update,references select t1.auto,t2.auto from t1,t2 where t1.auto=t2.auto and ((t1.string<>t2.string and (t1.string is not null or t2.string is not null)) or (t1.tiny<>t2.tiny and (t1.tiny is not null or t2.tiny is not null)) or (t1.short<>t2.short and (t1.short is not null or t2.short is not null)) or (t1.medium<>t2.medium and (t1.medium is not null or t2.medium is not null)) or (t1.long_int<>t2.long_int and (t1.long_int is not null or t2.long_int is not null)) or (t1.longlong<>t2.longlong and (t1.longlong is not null or t2.longlong is not null)) or (t1.real_float<>t2.real_float and (t1.real_float is not null or t2.real_float is not null)) or (t1.real_double<>t2.real_double and (t1.real_double is not null or t2.real_double is not null)) or (t1.utiny<>t2.utiny and (t1.utiny is not null or t2.utiny is not null)) or (t1.ushort<>t2.ushort and (t1.ushort is not null or t2.ushort is not null)) or (t1.umedium<>t2.umedium and (t1.umedium is not null or t2.umedium is not null)) or (t1.ulong<>t2.ulong and (t1.ulong is not null or t2.ulong is not null)) or (t1.ulonglong<>t2.ulonglong and (t1.ulonglong is not null or t2.ulonglong is not null)) or (t1.time_stamp<>t2.time_stamp and (t1.time_stamp is not null or t2.time_stamp is not null)) or (t1.date_field<>t2.date_field and (t1.date_field is not null or t2.date_field is not null)) or (t1.time_field<>t2.time_field and (t1.time_field is not null or t2.time_field is not null)) or (t1.date_time<>t2.date_time and (t1.date_time is not null or t2.date_time is not null)) or (t1.new_blob_col<>t2.new_blob_col and (t1.new_blob_col is not null or t2.new_blob_col is not null)) or (t1.tinyblob_col<>t2.tinyblob_col and (t1.tinyblob_col is not null or t2.tinyblob_col is not null)) or (t1.mediumblob_col<>t2.mediumblob_col and (t1.mediumblob_col is not null or t2.mediumblob_col is not null)) or (t1.options<>t2.options and (t1.options is not null or t2.options is not null)) or (t1.flags<>t2.flags and (t1.flags is not null or t2.flags is not null)) or (t1.new_field<>t2.new_field and (t1.new_field is not null or t2.new_field is not null))); auto auto 16 16 @@ -231,8 +231,8 @@ show full columns from t2; Field Type Null Key Default Extra Privileges Comment auto bigint(17) unsigned PRI 0 select,insert,update,references t1 bigint(1) 0 select,insert,update,references -t2 char(1) select,insert,update,references -t3 mediumtext select,insert,update,references +t2 char(1) character set latin1 select,insert,update,references +t3 mediumtext character set latin1 select,insert,update,references t4 mediumblob select,insert,update,references select * from t2; auto t1 t2 t3 t4 diff --git a/sql/field.cc b/sql/field.cc index 39e32a9cdc4..1561f1831de 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -3471,6 +3471,11 @@ void Field_string::sql_type(String &res) const res.length((uint) strlen(res.ptr())); if (binary_flag) res.append(" binary"); + else + { + res.append(" character set "); + res.append(field_charset->name); + } } @@ -3667,6 +3672,11 @@ void Field_varstring::sql_type(String &res) const res.length((uint) strlen(res.ptr())); if (binary_flag) res.append(" binary"); + else + { + res.append(" character set "); + res.append(field_charset->name); + } } char *Field_varstring::pack(char *to, const char *from, uint max_length) @@ -4154,6 +4164,11 @@ void Field_blob::sql_type(String &res) const } res.set(str,(uint) strlen(str),default_charset_info); res.append(binary_flag ? "blob" : "text"); + if (!binary_flag) + { + res.append(" character set "); + res.append(field_charset->name); + } } diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index e6c44f949ab..6d26f5a1b9a 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -484,7 +484,7 @@ bool add_field_to_list(char *field_name, enum enum_field_types type, char *length, char *decimal, uint type_modifier, Item *default_value, Item *comment, - char *change, TYPELIB *interval); + char *change, TYPELIB *interval,CHARSET_INFO *cs); void store_position_for_column(const char *name); bool add_to_list(SQL_LIST &list,Item *group,bool asc=0); TABLE_LIST *add_table_to_list(Table_ident *table,LEX_STRING *alias, diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 790994b897e..b8ec541225a 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2824,7 +2824,7 @@ bool add_field_to_list(char *field_name, enum_field_types type, char *length, char *decimals, uint type_modifier, Item *default_value, Item *comment, - char *change, TYPELIB *interval) + char *change, TYPELIB *interval, CHARSET_INFO *cs) { register create_field *new_field; THD *thd=current_thd; @@ -2877,7 +2877,7 @@ bool add_field_to_list(char *field_name, enum_field_types type, new_field->change=change; new_field->interval=0; new_field->pack_length=0; - new_field->charset=0; // QQ: To be fixed + new_field->charset=cs; if (!comment) { diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index d9595e841b3..316996ac7c2 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -958,6 +958,7 @@ field_spec: LEX *lex=Lex; lex->length=lex->dec=0; lex->type=0; lex->interval=0; lex->default_value=lex->comment=0; + lex->charset=default_charset_info; } type opt_attribute { @@ -966,7 +967,7 @@ field_spec: (enum enum_field_types) $3, lex->length,lex->dec,lex->type, lex->default_value, lex->comment, - lex->change,lex->interval)) + lex->change,lex->interval,lex->charset)) YYABORT; }; @@ -1009,11 +1010,11 @@ type: $$=FIELD_TYPE_LONG_BLOB; } | LONG_SYM VARBINARY { Lex->type|=BINARY_FLAG; $$=FIELD_TYPE_MEDIUM_BLOB; } - | LONG_SYM varchar { $$=FIELD_TYPE_MEDIUM_BLOB; } - | TINYTEXT { $$=FIELD_TYPE_TINY_BLOB; } - | TEXT_SYM { $$=FIELD_TYPE_BLOB; } - | MEDIUMTEXT { $$=FIELD_TYPE_MEDIUM_BLOB; } - | LONGTEXT { $$=FIELD_TYPE_LONG_BLOB; } + | LONG_SYM varchar opt_binary { $$=FIELD_TYPE_MEDIUM_BLOB; } + | TINYTEXT opt_binary { $$=FIELD_TYPE_TINY_BLOB; } + | TEXT_SYM opt_binary { $$=FIELD_TYPE_BLOB; } + | MEDIUMTEXT opt_binary { $$=FIELD_TYPE_MEDIUM_BLOB; } + | LONGTEXT opt_binary { $$=FIELD_TYPE_LONG_BLOB; } | DECIMAL_SYM float_options field_options { $$=FIELD_TYPE_DECIMAL;} | NUMERIC_SYM float_options field_options @@ -1287,7 +1288,7 @@ alter_list_item: (enum enum_field_types) $5, lex->length,lex->dec,lex->type, lex->default_value, lex->comment, - $3.str, lex->interval)) + $3.str, lex->interval, lex->charset)) YYABORT; } opt_place -- cgit v1.2.1 From 6d28930327f61c07af330dcaf5f0bac816260ca3 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 7 Jun 2002 22:13:59 +0500 Subject: check_one_rb_key() func --- heap/_check.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 4 deletions(-) diff --git a/heap/_check.c b/heap/_check.c index 3498625bffc..3b2fc9afad9 100644 --- a/heap/_check.c +++ b/heap/_check.c @@ -20,10 +20,12 @@ static int check_one_key(HP_KEYDEF *keydef, uint keynr, ulong records, ulong blength, my_bool print_status); +static int check_one_rb_key(HP_INFO *info, uint keynr, ulong records, + my_bool print_status); /* Returns 0 if the HEAP is ok */ -int heap_check_heap(HP_INFO *info,my_bool print_status) +int heap_check_heap(HP_INFO *info, my_bool print_status) { int error; uint key; @@ -32,9 +34,11 @@ int heap_check_heap(HP_INFO *info,my_bool print_status) for (error=key=0 ; key < share->keys ; key++) { - if (!(share->keydef[key].algorithm == HA_KEY_ALG_BTREE)) - error|=check_one_key(share->keydef+key,key, share->records,share->blength, - print_status); + if (share->keydef[key].algorithm == HA_KEY_ALG_BTREE) + error|= check_one_rb_key(info, key, share->records, print_status); + else + error|= check_one_key(share->keydef + key, key, share->records, + share->blength, print_status); } DBUG_RETURN(error); @@ -90,3 +94,46 @@ static int check_one_key(HP_KEYDEF *keydef, uint keynr, ulong records, (float) seek / (float) (records ? records : 1)); return error; } + +static int check_one_rb_key(HP_INFO *info, uint keynr, ulong records, + my_bool print_status) +{ + HP_KEYDEF *keydef= info->s->keydef + keynr; + int error= 0; + ulong found= 0; + byte *key, *recpos; + uint key_length; + uint not_used; + + if ((key= tree_search_edge(&keydef->rb_tree, info->parents, + &info->last_pos, offsetof(TREE_ELEMENT, left)))) + { + do + { + memcpy(&recpos, key + (*keydef->get_key_length)(keydef,key), sizeof(byte*)); + key_length= hp_rb_make_key(keydef, info->recbuf, recpos, 0); + if (ha_key_cmp(keydef->seg, info->recbuf, key, key_length, + SEARCH_FIND | SEARCH_SAME, ¬_used)) + { + error= 1; + DBUG_PRINT("error",("Record in wrong link: Link %d Record: %lx\n", + link, recpos)); + } + else + { + found++; + } + key= tree_search_next(&keydef->rb_tree, &info->last_pos, + offsetof(TREE_ELEMENT, left), + offsetof(TREE_ELEMENT, right)); + } while (key); + } + if (found != records) + { + DBUG_PRINT("error",("Found %ld of %ld records")); + error= 1; + } + if (print_status) + printf("Key: %d records: %ld\n", keynr, records); + return error; +} -- cgit v1.2.1 From b0c1e004670c7119b75e517cea77bf9894a00cb4 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 7 Jun 2002 21:26:43 +0300 Subject: temporary preventing subselect in HAVING clause --- sql/item_subselect.cc | 7 +++++++ sql/sql_class.cc | 4 ++-- sql/sql_class.h | 2 ++ sql/sql_select.cc | 6 +++++- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index fc0228455ff..c2349ed414c 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -102,6 +102,13 @@ void Item_subselect::make_field (Send_field *tmp_field) bool Item_subselect::fix_fields(THD *thd,TABLE_LIST *tables) { + + if (thd->having_fix_field) + { + //TODO: subselects in having do not suported now + my_printf_error(ER_SYNTAX_ERROR, ER(ER_SYNTAX_ERROR), MYF(0)); + return 1; + } // Is it one field subselect? if (select_lex->item_list.elements != 1) { diff --git a/sql/sql_class.cc b/sql/sql_class.cc index cd548f36cff..86e4e6896e6 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -80,8 +80,8 @@ static void free_var(user_var_entry *entry) ****************************************************************************/ THD::THD():user_time(0),fatal_error(0),last_insert_id_used(0), - insert_id_used(0),in_lock_tables(0), - global_read_lock(0),bootstrap(0) + insert_id_used(0), in_lock_tables(0), + global_read_lock(0), bootstrap(0), having_fix_field(0) { host=user=priv_user=db=query=ip=0; host_or_ip="unknown ip"; diff --git a/sql/sql_class.h b/sql/sql_class.h index 019217cb656..8a1a299ceee 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -428,6 +428,8 @@ public: bool query_error, bootstrap, cleanup_done; bool safe_to_cache_query; bool volatile killed; + // TRUE when having fix field called + bool having_fix_field; /* If we do a purge of binary logs, log index info of the threads that are currently reading it needs to be adjusted. To do that diff --git a/sql/sql_select.cc b/sql/sql_select.cc index d4f6504ec32..c10174a7b71 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -229,7 +229,11 @@ JOIN::prepare(TABLE_LIST *tables_init, { thd->where="having clause"; thd->allow_sum_func=1; - if (having->fix_fields(thd,tables_list) || thd->fatal_error) + bool having_fix_field_store= thd->having_fix_field; + thd->having_fix_field= 1; + bool having_fix_rc= having->fix_fields(thd,tables_list); + thd->having_fix_field= having_fix_field_store; + if (having_fix_rc || thd->fatal_error) DBUG_RETURN(-1); /* purecov: inspected */ if (having->with_sum_func) having->split_sum_func(all_fields); -- cgit v1.2.1 -- cgit v1.2.1 From aecb6fe0ada83bc5cb11e11636c15329fb43d1e1 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 10 Jun 2002 16:17:49 +0500 Subject: strto.c: Fix for typos in system_charset_info strings/strto.c: Fix for typos in system_charset_info --- strings/strto.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/strings/strto.c b/strings/strto.c index 9af101296a3..cd70616d294 100644 --- a/strings/strto.c +++ b/strings/strto.c @@ -124,7 +124,7 @@ function (const char *nptr,char **endptr,int base) { if (*s == '0') { - if (my_toupper (system_charset_into, s[1]) == 'X') + if (my_toupper (system_charset_info, s[1]) == 'X') { s += 2; base = 16; @@ -149,7 +149,7 @@ function (const char *nptr,char **endptr,int base) if (my_isdigit (system_charset_info, c)) c -= '0'; else if (my_isalpha (system_charset_info, c)) - c = my_toupper (system_charset_into, c) - 'A' + 10; + c = my_toupper (system_charset_info, c) - 'A' + 10; else break; if (c >= base) -- cgit v1.2.1 From 9c7d06273b3f96625b7c6a3bbd57a6bf5fd19898 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 10 Jun 2002 21:10:57 +0500 Subject: Fixed that charset was not properly strored in index segment on myisam table --- sql/ha_myisam.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc index a8bbc03aa91..e32656b44d3 100644 --- a/sql/ha_myisam.cc +++ b/sql/ha_myisam.cc @@ -1046,7 +1046,8 @@ int ha_myisam::create(const char *name, register TABLE *table, keydef[i].seg[j].start= pos->key_part[j].offset; keydef[i].seg[j].length= pos->key_part[j].length; keydef[i].seg[j].bit_start=keydef[i].seg[j].bit_end=0; - keydef[i].seg[j].language=MY_CHARSET_CURRENT; + keydef[i].seg[j].language = field->binary() ? MY_CHARSET_CURRENT : + ((Field_str*)field)->charset()->number; if (field->null_ptr) { -- cgit v1.2.1 From e557317598691727af876a7155ec95a1e3071139 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 10 Jun 2002 20:22:31 +0300 Subject: deleted accidentally pushed file BitKeeper/deleted/.del-sql_select.cc.rej~b567fd439ef37cc8: Delete: sql/sql_select.cc.rej --- sql/sql_select.cc.rej | 1576 ------------------------------------------------- 1 file changed, 1576 deletions(-) delete mode 100644 sql/sql_select.cc.rej diff --git a/sql/sql_select.cc.rej b/sql/sql_select.cc.rej deleted file mode 100644 index e5be98e9859..00000000000 --- a/sql/sql_select.cc.rej +++ /dev/null @@ -1,1576 +0,0 @@ -*************** -*** 65,71 **** - static int return_zero_rows(select_result *res,TABLE_LIST *tables, - List &fields, bool send_row, - uint select_options, const char *info, -- Item *having, Procedure *proc); - static COND *optimize_cond(COND *conds,Item::cond_result *cond_value); - static COND *remove_eq_conds(COND *cond,Item::cond_result *cond_value); - static bool const_expression_in_where(COND *conds,Item *item, Item **comp_item); ---- 65,72 ---- - static int return_zero_rows(select_result *res,TABLE_LIST *tables, - List &fields, bool send_row, - uint select_options, const char *info, -+ Item *having, Procedure *proc, -+ SELECT_LEX *select_lex); - static COND *optimize_cond(COND *conds,Item::cond_result *cond_value); - static COND *remove_eq_conds(COND *cond,Item::cond_result *cond_value); - static bool const_expression_in_where(COND *conds,Item *item, Item **comp_item); -*************** -*** 180,228 **** - ** mysql_select assumes that all tables are already opened - *****************************************************************************/ - - int -- mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, -- ORDER *order, ORDER *group,Item *having,ORDER *proc_param, -- ulong select_options,select_result *result) -- { -- TABLE *tmp_table; -- int error, tmp_error; -- bool need_tmp,hidden_group_fields; -- bool simple_order,simple_group,no_order, skip_sort_order, buffer_result; -- Item::cond_result cond_value; -- SQL_SELECT *select; -- DYNAMIC_ARRAY keyuse; -- JOIN join; -- Procedure *procedure; -- List all_fields(fields); -- bool select_distinct; -- SELECT_LEX *select_lex = &(thd->lex.select_lex); -- SELECT_LEX *cur_sel = thd->lex.select; -- DBUG_ENTER("mysql_select"); - -- /* Check that all tables, fields, conds and order are ok */ - -- select_distinct=test(select_options & SELECT_DISTINCT); -- buffer_result=test(select_options & OPTION_BUFFER_RESULT) && !test(select_options & OPTION_FOUND_ROWS); -- tmp_table=0; -- select=0; -- no_order=skip_sort_order=0; -- bzero((char*) &keyuse,sizeof(keyuse)); -- thd->proc_info="init"; -- thd->used_tables=0; // Updated by setup_fields - -- if (setup_tables(tables) || -- setup_fields(thd,tables,fields,1,&all_fields,1) || -- setup_conds(thd,tables,&conds) || -- setup_order(thd,tables,fields,all_fields,order) || -- setup_group(thd,tables,fields,all_fields,group,&hidden_group_fields)) - DBUG_RETURN(-1); /* purecov: inspected */ - - if (having) - { - thd->where="having clause"; - thd->allow_sum_func=1; -- if (having->fix_fields(thd,tables) || thd->fatal_error) - DBUG_RETURN(-1); /* purecov: inspected */ - if (having->with_sum_func) - having->split_sum_func(all_fields); ---- 195,237 ---- - ** mysql_select assumes that all tables are already opened - *****************************************************************************/ - -+ /* -+ Prepare of whole select (including subselect in future). -+ return -1 on error -+ 0 on success -+ */ - int - -+ JOIN::prepare(TABLE_LIST *tables_init, -+ COND *conds_init, ORDER *order_init, ORDER *group_init, -+ Item *having_init, -+ ORDER *proc_param_init, SELECT_LEX *select) -+ { -+ DBUG_ENTER("JOIN::prepare"); -+ -+ conds= conds_init; -+ order= order_init; -+ group_list= group_init; -+ having= having_init; -+ proc_param= proc_param_init; -+ tables_list= tables_init; -+ select_lex= select; - -+ /* Check that all tables, fields, conds and order are ok */ - -+ if (setup_tables(tables_list) || -+ setup_fields(thd,tables_list,fields_list,1,&all_fields,1) || -+ setup_conds(thd,tables_list,&conds) || -+ setup_order(thd,tables_list,fields_list,all_fields,order) || -+ setup_group(thd,tables_list,fields_list,all_fields,group_list, -+ &hidden_group_fields)) - DBUG_RETURN(-1); /* purecov: inspected */ - - if (having) - { - thd->where="having clause"; - thd->allow_sum_func=1; -+ if (having->fix_fields(thd,tables_list) || thd->fatal_error) - DBUG_RETURN(-1); /* purecov: inspected */ - if (having->with_sum_func) - having->split_sum_func(all_fields); -*************** -*** 297,347 **** - } - - /* Init join struct */ -- join.thd=thd; -- join.lock=thd->lock; -- join.join_tab=0; -- join.tmp_table_param.copy_field=0; -- join.sum_funcs=0; -- join.send_records=join.found_records=join.examined_rows=0; -- join.tmp_table_param.end_write_records= HA_POS_ERROR; -- join.first_record=join.sort_and_group=0; -- join.select_options=select_options; -- join.result=result; -- count_field_types(&join.tmp_table_param,all_fields,0); -- join.const_tables=0; -- join.having=0; -- join.do_send_rows = 1; -- join.group= group != 0; -- join.row_limit= ((select_distinct || order || group) ? HA_POS_ERROR : -- thd->select_limit); - - #ifdef RESTRICTED_GROUP -- if (join.sum_func_count && !group && (join.func_count || join.field_count)) - { - my_message(ER_WRONG_SUM_SELECT,ER(ER_WRONG_SUM_SELECT),MYF(0)); - delete procedure; - DBUG_RETURN(-1); - } - #endif -- if (!procedure && result->prepare(fields)) - { /* purecov: inspected */ - DBUG_RETURN(-1); /* purecov: inspected */ - } - - #ifdef HAVE_REF_TO_FIELDS // Not done yet - /* Add HAVING to WHERE if possible */ -- if (having && !group && ! join.sum_func_count) - { - if (!conds) - { -- conds=having; -- having=0; - } - else if ((conds=new Item_cond_and(conds,having))) - { -- conds->fix_fields(thd,tables); -- conds->change_ref_to_fields(thd,tables); -- having=0; - } - } - #endif ---- 305,358 ---- - } - - /* Init join struct */ -+ count_field_types(&tmp_table_param, all_fields, 0); -+ this->group= group_list != 0; -+ row_limit= ((select_distinct || order || group_list) ? HA_POS_ERROR : -+ select_lex->first_in_union->select_limit_cnt); - - #ifdef RESTRICTED_GROUP -+ if (sum_func_count && !group_list && (func_count || field_count)) - { - my_message(ER_WRONG_SUM_SELECT,ER(ER_WRONG_SUM_SELECT),MYF(0)); - delete procedure; - DBUG_RETURN(-1); - } - #endif -+ if (!procedure && result->prepare(fields_list, select_lex->first_in_union)) - { /* purecov: inspected */ - DBUG_RETURN(-1); /* purecov: inspected */ - } -+ DBUG_RETURN(0); // All OK -+ } -+ -+ /* -+ global select optimisation. -+ return 0 - success -+ 1 - go out -+ -1 - go out with cleaning -+ -+ error code saved in field 'error' -+ */ -+ int -+ JOIN::optimize() -+ { -+ DBUG_ENTER("JOIN::optimize"); -+ SELECT_LEX *select_lex = &(thd->lex.select_lex); - - #ifdef HAVE_REF_TO_FIELDS // Not done yet - /* Add HAVING to WHERE if possible */ -+ if (having && !group_list && ! sum_func_count) - { - if (!conds) - { -+ conds= having; -+ having= 0; - } - else if ((conds=new Item_cond_and(conds,having))) - { -+ conds->fix_fields(thd, tables_list); -+ conds->change_ref_to_fields(thd, tables_list); -+ having= 0; - } - } - #endif -*************** -*** 350,459 **** - if (thd->fatal_error) // Out of memory - { - delete procedure; -- DBUG_RETURN(0); - } -- if (cond_value == Item::COND_FALSE || !thd->select_limit) - { /* Impossible cond */ -- if (select_options & SELECT_DESCRIBE && select_lex->next) -- select_describe(&join,false,false,false,"Impossible WHERE"); -- else -- error=return_zero_rows(result, tables, fields, -- join.tmp_table_param.sum_func_count != 0 && !group, -- select_options,"Impossible WHERE",having, -- procedure); -- delete procedure; -- DBUG_RETURN(error); - } - - /* Optimize count(*), min() and max() */ -- if (tables && join.tmp_table_param.sum_func_count && ! group) - { - int res; -- if ((res=opt_sum_query(tables, all_fields, conds))) - { - if (res < 0) - { -- if (select_options & SELECT_DESCRIBE && select_lex->next) -- select_describe(&join,false,false,false,"No matching min/max row"); -- else -- error=return_zero_rows(result, tables, fields, !group, -- select_options,"No matching min/max row", -- having,procedure); -- delete procedure; -- DBUG_RETURN(error); - } - if (select_options & SELECT_DESCRIBE) - { - if (select_lex->next) -- select_describe(&join,false,false,false,"Select tables optimized away"); - else -- describe_info(thd,"Select tables optimized away"); - delete procedure; -- DBUG_RETURN(error); - } -- tables=0; // All tables resolved - } - } -- if (!tables) -- { // Only test of functions -- error=0; -- if (select_options & SELECT_DESCRIBE) -- { -- if (select_lex->next) -- select_describe(&join,false,false,false,"No tables used"); -- else -- describe_info(thd,"No tables used"); -- } -- else -- { -- result->send_fields(fields,1); -- if (!having || having->val_int()) -- { -- if (join.do_send_rows && result->send_data(fields)) -- { -- result->send_error(0,NullS); /* purecov: inspected */ -- error=1; -- } -- else -- error=(int) result->send_eof(); -- } -- else -- error=(int) result->send_eof(); -- } -- delete procedure; -- DBUG_RETURN(error); - } - -- error = -1; -- join.sort_by_table=get_sort_by_table(order,group,tables); - - /* Calculate how to do the join */ -- thd->proc_info="statistics"; -- if (make_join_statistics(&join,tables,conds,&keyuse) || thd->fatal_error) -- goto err; -- thd->proc_info="preparing"; -- result->initialize_tables(&join); -- if (join.const_table_map != join.found_const_table_map && - !(select_options & SELECT_DESCRIBE)) - { -- error=return_zero_rows(result,tables,fields, -- join.tmp_table_param.sum_func_count != 0 && -- !group,0,"",having,procedure); -- goto err; - } - if (!(thd->options & OPTION_BIG_SELECTS) && -- join.best_read > (double) thd->max_join_size && - !(select_options & SELECT_DESCRIBE)) - { /* purecov: inspected */ - result->send_error(ER_TOO_BIG_SELECT,ER(ER_TOO_BIG_SELECT)); /* purecov: inspected */ - error= 1; /* purecov: inspected */ -- goto err; /* purecov: inspected */ - } -- if (join.const_tables && !thd->locked_tables && - !(select_options & SELECT_NO_UNLOCK)) - { - TABLE **table, **end; -- for (table=join.table, end=table + join.const_tables ; - table != end; - table++) - { ---- 361,436 ---- - if (thd->fatal_error) // Out of memory - { - delete procedure; -+ error = 0; -+ DBUG_RETURN(1); - } -+ if (cond_value == Item::COND_FALSE || -+ !select_lex->first_in_union->select_limit_cnt) - { /* Impossible cond */ -+ zero_result_cause= "Impossible WHERE"; -+ DBUG_RETURN(0); - } - - /* Optimize count(*), min() and max() */ -+ if (tables_list && tmp_table_param.sum_func_count && ! group_list) - { - int res; -+ if ((res=opt_sum_query(tables_list, all_fields, conds))) - { - if (res < 0) - { -+ zero_result_cause= "No matching min/max row"; -+ DBUG_RETURN(0); - } - if (select_options & SELECT_DESCRIBE) - { - if (select_lex->next) -+ select_describe(this, false, false, false, -+ "Select tables optimized away"); - else -+ describe_info(thd, "Select tables optimized away"); - delete procedure; -+ DBUG_RETURN(1); - } -+ tables_list=0; // All tables resolved - } - } -+ if (!tables_list) -+ { -+ test_function_query= 1; -+ DBUG_RETURN(0); - } - -+ error= -1; -+ sort_by_table= get_sort_by_table(order, group_list, tables_list); - - /* Calculate how to do the join */ -+ thd->proc_info= "statistics"; -+ if (make_join_statistics(this, tables_list, conds, &keyuse) || -+ thd->fatal_error) -+ DBUG_RETURN(-1); -+ thd->proc_info= "preparing"; -+ result->initialize_tables(this); -+ if (const_table_map != found_const_table_map && - !(select_options & SELECT_DESCRIBE)) - { -+ zero_result_cause= ""; -+ select_options= 0; //TODO why option in return_zero_rows was droped -+ DBUG_RETURN(0); - } - if (!(thd->options & OPTION_BIG_SELECTS) && -+ best_read > (double) thd->max_join_size && - !(select_options & SELECT_DESCRIBE)) - { /* purecov: inspected */ - result->send_error(ER_TOO_BIG_SELECT,ER(ER_TOO_BIG_SELECT)); /* purecov: inspected */ - error= 1; /* purecov: inspected */ -+ DBUG_RETURN(-1); - } -+ if (const_tables && !thd->locked_tables && - !(select_options & SELECT_NO_UNLOCK)) - { - TABLE **table, **end; -+ for (table=this->table, end=table + const_tables ; - table != end; - table++) - { -*************** -*** 465,561 **** - } - (*table)->file->index_end(); - } -- mysql_unlock_some_tables(thd, join.table,join.const_tables); - } -- if (!conds && join.outer_join) - { - /* Handle the case where we have an OUTER JOIN without a WHERE */ - conds=new Item_int((longlong) 1,1); // Always true - } -- select=make_select(*join.table, join.const_table_map, -- join.const_table_map,conds,&error); - if (error) - { /* purecov: inspected */ - error= -1; /* purecov: inspected */ -- goto err; /* purecov: inspected */ - } -- if (make_join_select(&join,select,conds)) - { -- if (select_options & SELECT_DESCRIBE && select_lex->next) -- select_describe(&join,false,false,false,"Impossible WHERE noticed after reading const tables"); -- else -- error=return_zero_rows(result,tables,fields, -- join.tmp_table_param.sum_func_count != 0 && !group, -- select_options, -- "Impossible WHERE noticed after reading const tables", -- having,procedure); -- goto err; - } - - error= -1; /* if goto err */ - - /* Optimize distinct away if possible */ -- order=remove_const(&join,order,conds,&simple_order); -- if (group || join.tmp_table_param.sum_func_count) - { - if (! hidden_group_fields) - select_distinct=0; - } -- else if (select_distinct && join.tables - join.const_tables == 1 && -- (thd->select_limit == HA_POS_ERROR || -- (join.select_options & OPTION_FOUND_ROWS) || - order && - !(skip_sort_order= -- test_if_skip_sort_order(&join.join_tab[join.const_tables], -- order, thd->select_limit,1)))) - { -- if ((group=create_distinct_group(order,fields))) - { - select_distinct=0; - no_order= !order; -- join.group=1; // For end_write_group - } - else if (thd->fatal_error) // End of memory -- goto err; - } -- group=remove_const(&join,group,conds,&simple_group); -- if (!group && join.group) - { - order=0; // The output has only one row - simple_order=1; - } - -- calc_group_buffer(&join,group); -- join.send_group_parts=join.tmp_table_param.group_parts; /* Save org parts */ - if (procedure && procedure->group) - { -- group=procedure->group=remove_const(&join,procedure->group,conds, -- &simple_group); -- calc_group_buffer(&join,group); - } - -- if (test_if_subpart(group,order) || -- (!group && join.tmp_table_param.sum_func_count)) - order=0; - - // Can't use sort on head table if using row cache -- if (join.full_join) - { -- if (group) - simple_group=0; - if (order) - simple_order=0; - } - -- need_tmp= (join.const_tables != join.tables && - ((select_distinct || !simple_order || !simple_group) || -- (group && order) || buffer_result)); - - // No cache for MATCH -- make_join_readinfo(&join, - (select_options & (SELECT_DESCRIBE | - SELECT_NO_JOIN_CACHE)) | -- (cur_sel->ftfunc_list.elements ? SELECT_NO_JOIN_CACHE : 0)); - - /* Need to tell Innobase that to play it safe, it should fetch all - columns of the tables: this is because MySQL ---- 442,535 ---- - } - (*table)->file->index_end(); - } -+ mysql_unlock_some_tables(thd, this->table, const_tables); - } -+ if (!conds && outer_join) - { - /* Handle the case where we have an OUTER JOIN without a WHERE */ - conds=new Item_int((longlong) 1,1); // Always true - } -+ select=make_select(*table, const_table_map, -+ const_table_map, conds, &error); - if (error) - { /* purecov: inspected */ - error= -1; /* purecov: inspected */ -+ DBUG_RETURN(-1); - } -+ if (make_join_select(this, select, conds)) - { -+ zero_result_cause= -+ "Impossible WHERE noticed after reading const tables"; -+ DBUG_RETURN(0); - } - - error= -1; /* if goto err */ - - /* Optimize distinct away if possible */ -+ order=remove_const(this,order,conds,&simple_order); -+ if (group_list || tmp_table_param.sum_func_count) - { - if (! hidden_group_fields) - select_distinct=0; - } -+ else if (select_distinct && tables - const_tables == 1 && -+ (select_lex->first_in_union->select_limit_cnt == HA_POS_ERROR || -+ (select_options & OPTION_FOUND_ROWS) || - order && - !(skip_sort_order= -+ test_if_skip_sort_order(&join_tab[const_tables], -+ order, -+ select_lex->first_in_union->select_limit_cnt, -+ 1)))) - { -+ if ((group_list=create_distinct_group(order, fields_list))) - { - select_distinct=0; - no_order= !order; -+ group=1; // For end_write_group - } - else if (thd->fatal_error) // End of memory -+ DBUG_RETURN(-1); - } -+ group_list= remove_const(this, group_list, conds, &simple_group); -+ if (!group_list && group) - { - order=0; // The output has only one row - simple_order=1; - } - -+ calc_group_buffer(this, group_list); -+ send_group_parts=tmp_table_param.group_parts; /* Save org parts */ - if (procedure && procedure->group) - { -+ group_list= procedure->group= remove_const(this, procedure->group, conds, -+ &simple_group); -+ calc_group_buffer(this, group_list); - } - -+ if (test_if_subpart(group_list, order) || -+ (!group_list && tmp_table_param.sum_func_count)) - order=0; - - // Can't use sort on head table if using row cache -+ if (full_join) - { -+ if (group_list) - simple_group=0; - if (order) - simple_order=0; - } - -+ need_tmp= (const_tables != tables && - ((select_distinct || !simple_order || !simple_group) || -+ (group_list && order) || buffer_result)); - - // No cache for MATCH -+ make_join_readinfo(this, - (select_options & (SELECT_DESCRIBE | - SELECT_NO_JOIN_CACHE)) | -+ (thd->lex.select->ftfunc_list.elements ? -+ SELECT_NO_JOIN_CACHE : 0)); - - /* Need to tell Innobase that to play it safe, it should fetch all - columns of the tables: this is because MySQL -*************** -*** 564,624 **** - by MySQL. */ - - #ifdef HAVE_INNOBASE_DB -- if (need_tmp || select_distinct || group || order) - { -- for (uint i_h = join.const_tables; i_h < join.tables; i_h++) - { -- TABLE* table_h = join.join_tab[i_h].table; - if (table_h->db_type == DB_TYPE_INNODB) - table_h->file->extra(HA_EXTRA_DONT_USE_CURSOR_TO_UPDATE); - } - } - #endif - -- DBUG_EXECUTE("info",TEST_join(&join);); - /* - Because filesort always does a full table scan or a quick range scan - we must add the removed reference to the select for the table. - We only need to do this when we have a simple_order or simple_group - as in other cases the join is done before the sort. - */ -- if ((order || group) && join.join_tab[join.const_tables].type != JT_ALL && -- join.join_tab[join.const_tables].type != JT_FT && -- (order && simple_order || group && simple_group)) - { -- if (add_ref_to_table_cond(thd,&join.join_tab[join.const_tables])) -- goto err; - } - - if (!(select_options & SELECT_BIG_RESULT) && -- ((group && join.const_tables != join.tables && - (!simple_group || -- !test_if_skip_sort_order(&join.join_tab[join.const_tables], group, -- thd->select_limit,0))) || - select_distinct) && -- join.tmp_table_param.quick_group && !procedure) - { - need_tmp=1; simple_order=simple_group=0; // Force tmp table without sort - } - - if (select_options & SELECT_DESCRIBE) - { - if (!order && !no_order) -- order=group; - if (order && -- (join.const_tables == join.tables || - (simple_order && -- test_if_skip_sort_order(&join.join_tab[join.const_tables], order, -- (join.const_tables != join.tables - 1 || -- (join.select_options & OPTION_FOUND_ROWS)) ? -- HA_POS_ERROR : thd->select_limit,0)))) - order=0; -- select_describe(&join,need_tmp, - (order != 0 && -- (!need_tmp || order != group || simple_group)), - select_distinct); - error=0; -- goto err; - } - - /* Perform FULLTEXT search before all regular searches */ ---- 538,672 ---- - by MySQL. */ - - #ifdef HAVE_INNOBASE_DB -+ if (need_tmp || select_distinct || group_list || order) - { -+ for (uint i_h = const_tables; i_h < tables; i_h++) - { -+ TABLE* table_h = join_tab[i_h].table; - if (table_h->db_type == DB_TYPE_INNODB) - table_h->file->extra(HA_EXTRA_DONT_USE_CURSOR_TO_UPDATE); - } - } - #endif - -+ DBUG_EXECUTE("info",TEST_join(this);); - /* - Because filesort always does a full table scan or a quick range scan - we must add the removed reference to the select for the table. - We only need to do this when we have a simple_order or simple_group - as in other cases the join is done before the sort. - */ -+ if ((order || group_list) && join_tab[const_tables].type != JT_ALL && -+ join_tab[const_tables].type != JT_FT && -+ (order && simple_order || group_list && simple_group)) - { -+ if (add_ref_to_table_cond(thd,&join_tab[const_tables])) -+ DBUG_RETURN(-1); - } - - if (!(select_options & SELECT_BIG_RESULT) && -+ ((group_list && const_tables != tables && - (!simple_group || -+ !test_if_skip_sort_order(&join_tab[const_tables], group_list, -+ select_lex->first_in_union->select_limit_cnt, -+ 0))) || - select_distinct) && -+ tmp_table_param.quick_group && !procedure) - { - need_tmp=1; simple_order=simple_group=0; // Force tmp table without sort - } -+ DBUG_RETURN(0); -+ } -+ -+ /* -+ global uptimisation (with subselect) must be here (TODO) -+ */ -+ -+ int -+ JOIN::global_optimize() -+ { -+ return 0; -+ } -+ -+ /* -+ exec select -+ */ -+ -+ void -+ JOIN::exec() -+ { -+ int tmp_error; -+ -+ DBUG_ENTER("JOIN::exec"); -+ -+ if (test_function_query) -+ { // Only test of functions -+ error=0; -+ if (select_options & SELECT_DESCRIBE) -+ { -+ if (select_lex->next) -+ select_describe(this, false, false, false, "No tables used"); -+ else -+ describe_info(thd, "No tables used"); -+ } -+ else -+ { -+ result->send_fields(fields_list,1); -+ if (!having || having->val_int()) -+ { -+ if (do_send_rows && result->send_data(fields_list)) -+ { -+ result->send_error(0,NullS); /* purecov: inspected */ -+ error=1; -+ } -+ else -+ error=(int) result->send_eof(); -+ } -+ else -+ error=(int) result->send_eof(); -+ } -+ delete procedure; -+ DBUG_VOID_RETURN; -+ } -+ -+ if (zero_result_cause) -+ { -+ if (select_options & SELECT_DESCRIBE && select_lex->next) -+ select_describe(this, false, false, false, zero_result_cause); -+ else -+ error=return_zero_rows(result, tables_list, fields_list, -+ tmp_table_param.sum_func_count != 0 && -+ !group_list, -+ select_options, -+ zero_result_cause, -+ having,procedure, -+ select_lex->first_in_union); -+ DBUG_VOID_RETURN; -+ } -+ -+ Item *having_list = having; -+ having = 0; - - if (select_options & SELECT_DESCRIBE) - { - if (!order && !no_order) -+ order=group_list; - if (order && -+ (const_tables == tables || - (simple_order && -+ test_if_skip_sort_order(&join_tab[const_tables], order, -+ (const_tables != tables - 1 || -+ (select_options & OPTION_FOUND_ROWS)) ? -+ HA_POS_ERROR : -+ select_lex->first_in_union->select_limit_cnt, -+ 0)))) - order=0; -+ select_describe(this, need_tmp, - (order != 0 && -+ (!need_tmp || order != group_list || simple_group)), - select_distinct); - error=0; -+ DBUG_VOID_RETURN; - } - - /* Perform FULLTEXT search before all regular searches */ -*************** -*** 630,673 **** - DBUG_PRINT("info",("Creating tmp table")); - thd->proc_info="Creating tmp table"; - -- if (!(tmp_table = -- create_tmp_table(thd,&join.tmp_table_param,all_fields, - ((!simple_group && !procedure && - !(test_flags & TEST_NO_KEY_GROUP)) ? -- group : (ORDER*) 0), -- group ? 0 : select_distinct, -- group && simple_group, - (order == 0 || skip_sort_order) && -- !(join.select_options & OPTION_FOUND_ROWS), -- join.select_options))) -- goto err; /* purecov: inspected */ -- -- if (having && (join.sort_and_group || (tmp_table->distinct && !group))) -- join.having=having; - - /* if group or order on first table, sort first */ -- if (group && simple_group) - { - DBUG_PRINT("info",("Sorting for group")); - thd->proc_info="Sorting for group"; -- if (create_sort_index(&join.join_tab[join.const_tables],group, - HA_POS_ERROR) || -- make_sum_func_list(&join,all_fields) || -- alloc_group_fields(&join,group)) -- goto err; -- group=0; - } - else - { -- if (make_sum_func_list(&join,all_fields)) -- goto err; -- if (!group && ! tmp_table->distinct && order && simple_order) - { - DBUG_PRINT("info",("Sorting for order")); - thd->proc_info="Sorting for order"; -- if (create_sort_index(&join.join_tab[join.const_tables],order, - HA_POS_ERROR)) -- goto err; /* purecov: inspected */ - order=0; - } - } ---- 678,722 ---- - DBUG_PRINT("info",("Creating tmp table")); - thd->proc_info="Creating tmp table"; - -+ if (!(exec_tmp_table = -+ create_tmp_table(thd,&tmp_table_param,all_fields, - ((!simple_group && !procedure && - !(test_flags & TEST_NO_KEY_GROUP)) ? -+ group_list : (ORDER*) 0), -+ group_list ? 0 : select_distinct, -+ group_list && simple_group, - (order == 0 || skip_sort_order) && -+ !(select_options & OPTION_FOUND_ROWS), -+ select_options, select_lex->first_in_union))) -+ DBUG_VOID_RETURN; -+ -+ if (having_list && -+ (sort_and_group || (exec_tmp_table->distinct && !group_list))) -+ having=having_list; - - /* if group or order on first table, sort first */ -+ if (group_list && simple_group) - { - DBUG_PRINT("info",("Sorting for group")); - thd->proc_info="Sorting for group"; -+ if (create_sort_index(&join_tab[const_tables],group_list, - HA_POS_ERROR) || -+ make_sum_func_list(this, all_fields) || -+ alloc_group_fields(this, group_list)) -+ DBUG_VOID_RETURN; -+ group_list=0; - } - else - { -+ if (make_sum_func_list(this, all_fields)) -+ DBUG_VOID_RETURN; -+ if (!group_list && ! exec_tmp_table->distinct && order && simple_order) - { - DBUG_PRINT("info",("Sorting for order")); - thd->proc_info="Sorting for order"; -+ if (create_sort_index(&join_tab[const_tables], order, - HA_POS_ERROR)) -+ DBUG_VOID_RETURN; - order=0; - } - } -*************** -*** 678,735 **** - In this case we can stop scanning t2 when we have found one t1.a - */ - -- if (tmp_table->distinct) - { - table_map used_tables= thd->used_tables; -- JOIN_TAB *join_tab=join.join_tab+join.tables-1; - do - { - if (used_tables & join_tab->table->map) - break; - join_tab->not_used_in_distinct=1; -- } while (join_tab-- != join.join_tab); - /* Optimize "select distinct b from t1 order by key_part_1 limit #" */ - if (order && skip_sort_order) - { -- (void) test_if_skip_sort_order(&join.join_tab[join.const_tables], -- order, thd->select_limit,0); - order=0; - } - } - - /* Copy data to the temporary table */ - thd->proc_info="Copying to tmp table"; -- if ((tmp_error=do_select(&join,(List *) 0,tmp_table,0))) - { -- error=tmp_error; -- goto err; /* purecov: inspected */ - } -- if (join.having) -- join.having=having=0; // Allready done - - /* Change sum_fields reference to calculated fields in tmp_table */ -- if (join.sort_and_group || tmp_table->group) - { - if (change_to_use_tmp_fields(all_fields)) -- goto err; -- join.tmp_table_param.field_count+=join.tmp_table_param.sum_func_count+ -- join.tmp_table_param.func_count; -- join.tmp_table_param.sum_func_count=join.tmp_table_param.func_count=0; - } - else - { - if (change_refs_to_tmp_fields(thd,all_fields)) -- goto err; -- join.tmp_table_param.field_count+=join.tmp_table_param.func_count; -- join.tmp_table_param.func_count=0; - } - if (procedure) - procedure->update_refs(); -- if (tmp_table->group) - { // Already grouped - if (!order && !no_order) -- order=group; /* order by group */ -- group=0; - } - - /* ---- 727,786 ---- - In this case we can stop scanning t2 when we have found one t1.a - */ - -+ if (exec_tmp_table->distinct) - { - table_map used_tables= thd->used_tables; -+ JOIN_TAB *join_tab= this->join_tab+tables-1; - do - { - if (used_tables & join_tab->table->map) - break; - join_tab->not_used_in_distinct=1; -+ } while (join_tab-- != this->join_tab); - /* Optimize "select distinct b from t1 order by key_part_1 limit #" */ - if (order && skip_sort_order) - { -+ (void) test_if_skip_sort_order(&this->join_tab[const_tables], -+ order, -+ select_lex->first_in_union->select_limit_cnt, -+ 0); - order=0; - } - } - - /* Copy data to the temporary table */ - thd->proc_info="Copying to tmp table"; -+ if ((tmp_error=do_select(this, (List *) 0, exec_tmp_table, 0))) - { -+ error= tmp_error; -+ DBUG_VOID_RETURN; - } -+ if (having) -+ having= having_list= 0; // Allready done - - /* Change sum_fields reference to calculated fields in tmp_table */ -+ if (sort_and_group || exec_tmp_table->group) - { - if (change_to_use_tmp_fields(all_fields)) -+ DBUG_VOID_RETURN; -+ tmp_table_param.field_count+= tmp_table_param.sum_func_count+ -+ tmp_table_param.func_count; -+ tmp_table_param.sum_func_count= tmp_table_param.func_count= 0; - } - else - { - if (change_refs_to_tmp_fields(thd,all_fields)) -+ DBUG_VOID_RETURN; -+ tmp_table_param.field_count+= tmp_table_param.func_count; -+ tmp_table_param.func_count= 0; - } - if (procedure) - procedure->update_refs(); -+ if (exec_tmp_table->group) - { // Already grouped - if (!order && !no_order) -+ order= group_list; /* order by group */ -+ group_list= 0; - } - - /* -*************** -*** 740,892 **** - ** like SEC_TO_TIME(SUM(...)). - */ - -- if (group && (!test_if_subpart(group,order) || select_distinct) || - (select_distinct && -- join.tmp_table_param.using_indirect_summary_function)) - { /* Must copy to another table */ - TABLE *tmp_table2; - DBUG_PRINT("info",("Creating group table")); - - /* Free first data from old join */ -- join_free(&join); -- if (make_simple_join(&join,tmp_table)) -- goto err; -- calc_group_buffer(&join,group); -- count_field_types(&join.tmp_table_param,all_fields, -- select_distinct && !group); -- join.tmp_table_param.hidden_field_count=(all_fields.elements- -- fields.elements); - - /* group data to new table */ -- if (!(tmp_table2 = create_tmp_table(thd,&join.tmp_table_param,all_fields, - (ORDER*) 0, -- select_distinct && !group, - 1, 0, -- join.select_options))) -- goto err; /* purecov: inspected */ -- if (group) - { - thd->proc_info="Creating sort index"; -- if (create_sort_index(join.join_tab,group,HA_POS_ERROR) || -- alloc_group_fields(&join,group)) - { - free_tmp_table(thd,tmp_table2); /* purecov: inspected */ -- goto err; /* purecov: inspected */ - } -- group=0; - } - thd->proc_info="Copying to group table"; - tmp_error= -1; -- if (make_sum_func_list(&join,all_fields) || -- (tmp_error=do_select(&join,(List *) 0,tmp_table2,0))) - { - error=tmp_error; - free_tmp_table(thd,tmp_table2); -- goto err; /* purecov: inspected */ - } -- end_read_record(&join.join_tab->read_record); -- free_tmp_table(thd,tmp_table); -- join.const_tables=join.tables; // Mark free for join_free() -- tmp_table=tmp_table2; -- join.join_tab[0].table=0; // Table is freed - - if (change_to_use_tmp_fields(all_fields)) // No sum funcs anymore -- goto err; -- join.tmp_table_param.field_count+=join.tmp_table_param.sum_func_count; -- join.tmp_table_param.sum_func_count=0; - } - -- if (tmp_table->distinct) - select_distinct=0; /* Each row is unique */ - -- join_free(&join); /* Free quick selects */ -- if (select_distinct && ! group) - { - thd->proc_info="Removing duplicates"; -- if (having) -- having->update_used_tables(); -- if (remove_duplicates(&join,tmp_table,fields, having)) -- goto err; /* purecov: inspected */ -- having=0; - select_distinct=0; - } -- tmp_table->reginfo.lock_type=TL_UNLOCK; -- if (make_simple_join(&join,tmp_table)) -- goto err; -- calc_group_buffer(&join,group); -- count_field_types(&join.tmp_table_param,all_fields,0); - } - if (procedure) - { -- if (procedure->change_columns(fields) || -- result->prepare(fields)) -- goto err; -- count_field_types(&join.tmp_table_param,all_fields,0); - } -- if (join.group || join.tmp_table_param.sum_func_count || - (procedure && (procedure->flags & PROC_GROUP))) - { -- alloc_group_fields(&join,group); -- setup_copy_fields(thd, &join.tmp_table_param,all_fields); -- if (make_sum_func_list(&join,all_fields) || thd->fatal_error) -- goto err; /* purecov: inspected */ - } -- if (group || order) - { - DBUG_PRINT("info",("Sorting for send_fields")); - thd->proc_info="Sorting result"; - /* If we have already done the group, add HAVING to sorted table */ -- if (having && ! group && ! join.sort_and_group) - { -- having->update_used_tables(); // Some tables may have been const -- JOIN_TAB *table=&join.join_tab[join.const_tables]; -- table_map used_tables= join.const_table_map | table->table->map; - -- Item* sort_table_cond=make_cond_for_table(having,used_tables,used_tables); - if (sort_table_cond) - { - if (!table->select) - if (!(table->select=new SQL_SELECT)) -- goto err; - if (!table->select->cond) - table->select->cond=sort_table_cond; - else // This should never happen - if (!(table->select->cond=new Item_cond_and(table->select->cond, - sort_table_cond))) -- goto err; - table->select_cond=table->select->cond; - DBUG_EXECUTE("where",print_where(table->select->cond, - "select and having");); -- having=make_cond_for_table(having,~ (table_map) 0,~used_tables); - DBUG_EXECUTE("where",print_where(conds,"having after sort");); - } - } -- if (create_sort_index(&join.join_tab[join.const_tables], -- group ? group : order, -- (having || group || -- join.const_tables != join.tables - 1 || -- (join.select_options & OPTION_FOUND_ROWS)) ? -- HA_POS_ERROR : thd->select_limit)) -- goto err; /* purecov: inspected */ - } -- join.having=having; // Actually a parameter - thd->proc_info="Sending data"; -- error=do_select(&join,&fields,NULL,procedure); - -- err: -- thd->limit_found_rows = join.send_records; -- thd->examined_row_count = join.examined_rows; -- thd->proc_info="end"; -- join.lock=0; // It's faster to unlock later -- join_free(&join); -- thd->proc_info="end2"; // QQ -- if (tmp_table) -- free_tmp_table(thd,tmp_table); -- thd->proc_info="end3"; // QQ - delete select; - delete_dynamic(&keyuse); - delete procedure; -- thd->proc_info="end4"; // QQ - DBUG_RETURN(error); - } - ---- 791,987 ---- - ** like SEC_TO_TIME(SUM(...)). - */ - -+ if (group_list && (!test_if_subpart(group_list,order) || select_distinct) || - (select_distinct && -+ tmp_table_param.using_indirect_summary_function)) - { /* Must copy to another table */ - TABLE *tmp_table2; - DBUG_PRINT("info",("Creating group table")); - - /* Free first data from old join */ -+ join_free(this); -+ if (make_simple_join(this, exec_tmp_table)) -+ DBUG_VOID_RETURN; -+ calc_group_buffer(this, group_list); -+ count_field_types(&tmp_table_param, all_fields, -+ select_distinct && !group_list); -+ tmp_table_param.hidden_field_count= (all_fields.elements- -+ fields_list.elements); - - /* group data to new table */ -+ if (!(tmp_table2 = create_tmp_table(thd,&tmp_table_param, all_fields, - (ORDER*) 0, -+ select_distinct && !group_list, - 1, 0, -+ select_options, -+ select_lex->first_in_union))) -+ DBUG_VOID_RETURN; -+ if (group_list) - { - thd->proc_info="Creating sort index"; -+ if (create_sort_index(join_tab,group_list,HA_POS_ERROR) || -+ alloc_group_fields(this, group_list)) - { - free_tmp_table(thd,tmp_table2); /* purecov: inspected */ -+ DBUG_VOID_RETURN; - } -+ group_list=0; - } - thd->proc_info="Copying to group table"; - tmp_error= -1; -+ if (make_sum_func_list(this, all_fields) || -+ (tmp_error=do_select(this, (List *) 0,tmp_table2,0))) - { - error=tmp_error; - free_tmp_table(thd,tmp_table2); -+ DBUG_VOID_RETURN; - } -+ end_read_record(&join_tab->read_record); -+ free_tmp_table(thd,exec_tmp_table); -+ const_tables= tables; // Mark free for join_free() -+ exec_tmp_table= tmp_table2; -+ join_tab[0].table= 0; // Table is freed - - if (change_to_use_tmp_fields(all_fields)) // No sum funcs anymore -+ DBUG_VOID_RETURN; -+ tmp_table_param.field_count+= tmp_table_param.sum_func_count; -+ tmp_table_param.sum_func_count=0; - } - -+ if (exec_tmp_table->distinct) - select_distinct=0; /* Each row is unique */ - -+ join_free(this); /* Free quick selects */ -+ if (select_distinct && ! group_list) - { - thd->proc_info="Removing duplicates"; -+ if (having_list) -+ having_list->update_used_tables(); -+ if (remove_duplicates(this, exec_tmp_table, fields_list, having_list)) -+ DBUG_VOID_RETURN; -+ having_list=0; - select_distinct=0; - } -+ exec_tmp_table->reginfo.lock_type=TL_UNLOCK; -+ if (make_simple_join(this, exec_tmp_table)) -+ DBUG_VOID_RETURN; -+ calc_group_buffer(this, group_list); -+ count_field_types(&tmp_table_param, all_fields, 0); - } - if (procedure) - { -+ if (procedure->change_columns(fields_list) || -+ result->prepare(fields_list, select_lex->first_in_union)) -+ DBUG_VOID_RETURN; -+ count_field_types(&tmp_table_param,all_fields,0); - } -+ if (group || tmp_table_param.sum_func_count || - (procedure && (procedure->flags & PROC_GROUP))) - { -+ alloc_group_fields(this, group_list); -+ setup_copy_fields(thd, &tmp_table_param,all_fields); -+ if (make_sum_func_list(this, all_fields) || thd->fatal_error) -+ DBUG_VOID_RETURN; - } -+ if (group_list || order) - { - DBUG_PRINT("info",("Sorting for send_fields")); - thd->proc_info="Sorting result"; - /* If we have already done the group, add HAVING to sorted table */ -+ if (having_list && ! group_list && ! sort_and_group) - { -+ having_list->update_used_tables(); // Some tables may have been const -+ JOIN_TAB *table=&join_tab[const_tables]; -+ table_map used_tables= const_table_map | table->table->map; - -+ Item* sort_table_cond=make_cond_for_table(having_list, used_tables, -+ used_tables); - if (sort_table_cond) - { - if (!table->select) - if (!(table->select=new SQL_SELECT)) -+ DBUG_VOID_RETURN; - if (!table->select->cond) - table->select->cond=sort_table_cond; - else // This should never happen - if (!(table->select->cond=new Item_cond_and(table->select->cond, - sort_table_cond))) -+ DBUG_VOID_RETURN; - table->select_cond=table->select->cond; - DBUG_EXECUTE("where",print_where(table->select->cond, - "select and having");); -+ having_list= make_cond_for_table(having_list, ~ (table_map) 0, -+ ~used_tables); - DBUG_EXECUTE("where",print_where(conds,"having after sort");); - } - } -+ if (create_sort_index(&join_tab[const_tables], -+ group_list ? group_list : order, -+ (having_list || group_list || -+ const_tables != tables - 1 || -+ (select_options & OPTION_FOUND_ROWS)) ? -+ HA_POS_ERROR : -+ select_lex->first_in_union->select_limit_cnt)) -+ DBUG_VOID_RETURN; - } -+ having=having_list; // Actually a parameter - thd->proc_info="Sending data"; -+ error=do_select(this, &fields_list, NULL, procedure); -+ DBUG_VOID_RETURN; -+ } - -+ /* -+ Clean up join. Return error that hold JOIN. -+ */ -+ -+ int -+ JOIN::cleanup(THD *thd) -+ { -+ lock=0; // It's faster to unlock later -+ join_free(this); -+ if (exec_tmp_table) -+ free_tmp_table(thd, exec_tmp_table); - delete select; - delete_dynamic(&keyuse); - delete procedure; -+ return error; -+ } -+ -+ int -+ mysql_select(THD *thd,TABLE_LIST *tables,List &fields,COND *conds, -+ ORDER *order, ORDER *group,Item *having,ORDER *proc_param, -+ ulong select_options,select_result *result) -+ { -+ JOIN *join = new JOIN(thd, fields, select_options, result); -+ -+ DBUG_ENTER("mysql_select"); -+ thd->proc_info="init"; -+ thd->used_tables=0; // Updated by setup_fields -+ -+ if (join->prepare(tables, conds, order, group, having, proc_param, -+ &(thd->lex.select_lex))) -+ { -+ DBUG_RETURN(-1); -+ } -+ switch(join->optimize()) -+ { -+ case 1: -+ DBUG_RETURN(join->error); -+ case -1: -+ goto err; -+ } -+ -+ if(join->global_optimize()) -+ goto err; -+ -+ join->exec(); -+ -+ err: -+ thd->limit_found_rows = join->send_records; -+ thd->examined_row_count = join->examined_rows; -+ thd->proc_info="end"; -+ int error= join->cleanup(thd); -+ delete join; - DBUG_RETURN(error); - } - -*************** -*** 2480,2486 **** - - if ((tab->keys & ~ tab->const_keys && i > 0) || - (tab->const_keys && i == join->const_tables && -- join->thd->select_limit < join->best_positions[i].records_read && - !(join->select_options & OPTION_FOUND_ROWS))) - { - /* Join with outer join condition */ ---- 2575,2582 ---- - - if ((tab->keys & ~ tab->const_keys && i > 0) || - (tab->const_keys && i == join->const_tables && -+ join->select_lex->first_in_union->select_limit_cnt < -+ join->best_positions[i].records_read && - !(join->select_options & OPTION_FOUND_ROWS))) - { - /* Join with outer join condition */ -*************** -*** 2491,2497 **** - (join->select_options & - OPTION_FOUND_ROWS ? - HA_POS_ERROR : -- join->thd->select_limit)) < 0) - DBUG_RETURN(1); // Impossible range - sel->cond=orig_cond; - } ---- 2587,2593 ---- - (join->select_options & - OPTION_FOUND_ROWS ? - HA_POS_ERROR : -+ join->select_lex->first_in_union->select_limit_cnt)) < 0) - DBUG_RETURN(1); // Impossible range - sel->cond=orig_cond; - } -*************** -*** 2933,2939 **** - static int - return_zero_rows(select_result *result,TABLE_LIST *tables,List &fields, - bool send_row, uint select_options,const char *info, -- Item *having, Procedure *procedure) - { - DBUG_ENTER("return_zero_rows"); - ---- 3029,3035 ---- - static int - return_zero_rows(select_result *result,TABLE_LIST *tables,List &fields, - bool send_row, uint select_options,const char *info, -+ Item *having, Procedure *procedure, SELECT_LEX *select_lex) - { - DBUG_ENTER("return_zero_rows"); - -*************** -*** 2944,2950 **** - } - if (procedure) - { -- if (result->prepare(fields)) // This hasn't been done yet - DBUG_RETURN(-1); - } - if (send_row) ---- 3040,3047 ---- - } - if (procedure) - { -+ if (result->prepare(fields, -+ select_lex->first_in_union))//This hasn't been done yet - DBUG_RETURN(-1); - } - if (send_row) -*************** -*** 3479,3485 **** - TABLE * - create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List &fields, - ORDER *group, bool distinct, bool save_sum_fields, -- bool allow_distinct_limit, ulong select_options) - { - TABLE *table; - uint i,field_count,reclength,null_count,null_pack_length, ---- 3576,3583 ---- - TABLE * - create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List &fields, - ORDER *group, bool distinct, bool save_sum_fields, -+ bool allow_distinct_limit, ulong select_options, -+ SELECT_LEX *first_select) - { - TABLE *table; - uint i,field_count,reclength,null_count,null_pack_length, -*************** -*** 3850,3857 **** - test(null_pack_length)); - if (allow_distinct_limit) - { -- set_if_smaller(table->max_rows,thd->select_limit); -- param->end_write_records=thd->select_limit; - } - else - param->end_write_records= HA_POS_ERROR; ---- 3948,3955 ---- - test(null_pack_length)); - if (allow_distinct_limit) - { -+ set_if_smaller(table->max_rows,first_select->select_limit_cnt); -+ param->end_write_records=first_select->select_limit_cnt; - } - else - param->end_write_records= HA_POS_ERROR; -*************** -*** 4896,4902 **** - error=join->result->send_data(*join->fields); - if (error) - DBUG_RETURN(-1); /* purecov: inspected */ -- if (++join->send_records >= join->thd->select_limit && join->do_send_rows) - { - if (join->select_options & OPTION_FOUND_ROWS) - { ---- 4994,5002 ---- - error=join->result->send_data(*join->fields); - if (error) - DBUG_RETURN(-1); /* purecov: inspected */ -+ if (++join->send_records >= -+ join->select_lex->first_in_union->select_limit_cnt && -+ join->do_send_rows) - { - if (join->select_options & OPTION_FOUND_ROWS) - { -*************** -*** 4912,4918 **** - else - { - join->do_send_rows=0; -- join->thd->select_limit = HA_POS_ERROR; - DBUG_RETURN(0); - } - } ---- 5012,5018 ---- - else - { - join->do_send_rows=0; -+ join->select_lex->first_in_union->select_limit_cnt = HA_POS_ERROR; - DBUG_RETURN(0); - } - } -*************** -*** 4973,4985 **** - DBUG_RETURN(-1); /* purecov: inspected */ - if (end_of_records) - DBUG_RETURN(0); -- if (!error && ++join->send_records >= join->thd->select_limit && - join->do_send_rows) - { - if (!(join->select_options & OPTION_FOUND_ROWS)) - DBUG_RETURN(-3); // Abort nicely - join->do_send_rows=0; -- join->thd->select_limit = HA_POS_ERROR; - } - } - } ---- 5073,5086 ---- - DBUG_RETURN(-1); /* purecov: inspected */ - if (end_of_records) - DBUG_RETURN(0); -+ if (!error && ++join->send_records >= -+ join->select_lex->first_in_union->select_limit_cnt && - join->do_send_rows) - { - if (!(join->select_options & OPTION_FOUND_ROWS)) - DBUG_RETURN(-3); // Abort nicely - join->do_send_rows=0; -+ join->select_lex->first_in_union->select_limit_cnt = HA_POS_ERROR; - } - } - } -*************** -*** 5060,5066 **** - if (!(join->select_options & OPTION_FOUND_ROWS)) - DBUG_RETURN(-3); - join->do_send_rows=0; -- join->thd->select_limit = HA_POS_ERROR; - DBUG_RETURN(0); - } - } ---- 5161,5167 ---- - if (!(join->select_options & OPTION_FOUND_ROWS)) - DBUG_RETURN(-3); - join->do_send_rows=0; -+ join->select_lex->first_in_union->select_limit_cnt = HA_POS_ERROR; - DBUG_RETURN(0); - } - } -*************** -*** 5743,5749 **** - - if (!field_count) - { // only const items -- join->thd->select_limit=1; // Only send first row - DBUG_RETURN(0); - } - Field **first_field=entry->field+entry->fields - field_count; ---- 5844,5850 ---- - - if (!field_count) - { // only const items -+ join->select_lex->first_in_union->select_limit_cnt=1;// Only send first row - DBUG_RETURN(0); - } - Field **first_field=entry->field+entry->fields - field_count; -- cgit v1.2.1 From e4437030b20a6b7df2b8368215af85d260c43b52 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 11 Jun 2002 17:40:06 +0500 Subject: New command: SHOW CHARACTER SET [LIKE 'wild'] --- sql/mysql_priv.h | 1 + sql/sql_lex.h | 2 +- sql/sql_parse.cc | 3 +++ sql/sql_show.cc | 38 ++++++++++++++++++++++++++++++++++++++ sql/sql_yacc.yy | 2 ++ 5 files changed, 45 insertions(+), 1 deletion(-) diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 4753435bbfa..268a452095e 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -472,6 +472,7 @@ void mysqld_list_processes(THD *thd,const char *user,bool verbose); int mysqld_show_status(THD *thd); int mysqld_show_variables(THD *thd,const char *wild); int mysqld_show(THD *thd, const char *wild, show_var_st *variables); +int mysqld_show_charsets(THD *thd,const char *wild); /* sql_handler.cc */ int mysql_ha_open(THD *thd, TABLE_LIST *tables); diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 25798bbf079..ee0209f9329 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -41,7 +41,7 @@ enum enum_sql_command { SQLCOM_SHOW_DATABASES, SQLCOM_SHOW_TABLES, SQLCOM_SHOW_FIELDS, SQLCOM_SHOW_KEYS, SQLCOM_SHOW_VARIABLES, SQLCOM_SHOW_LOGS, SQLCOM_SHOW_STATUS, SQLCOM_SHOW_PROCESSLIST, SQLCOM_SHOW_MASTER_STAT, SQLCOM_SHOW_SLAVE_STAT, - SQLCOM_SHOW_GRANTS, SQLCOM_SHOW_CREATE, + SQLCOM_SHOW_GRANTS, SQLCOM_SHOW_CREATE, SQLCOM_SHOW_CHARSETS, SQLCOM_LOAD,SQLCOM_SET_OPTION,SQLCOM_LOCK_TABLES,SQLCOM_UNLOCK_TABLES, SQLCOM_GRANT, SQLCOM_CHANGE_DB, SQLCOM_CREATE_DB, SQLCOM_DROP_DB, diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 174942054e1..a5d8aa3185e 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2101,6 +2101,9 @@ mysql_execute_command(void) case SQLCOM_SHOW_OPEN_TABLES: res= mysqld_show_open_tables(thd,(lex->wild ? lex->wild->ptr() : NullS)); break; + case SQLCOM_SHOW_CHARSETS: + res= mysqld_show_charsets(thd,(lex->wild ? lex->wild->ptr() : NullS)); + break; case SQLCOM_SHOW_FIELDS: #ifdef DONT_ALLOW_SHOW_COMMANDS send_error(&thd->net,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */ diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 995142d6566..1421eac168f 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1162,6 +1162,44 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose) ** Status functions *****************************************************************************/ +int mysqld_show_charsets(THD *thd, const char *wild) +{ + uint i; + char buff[8192]; + String packet2(buff,sizeof(buff),default_charset_info); + List field_list; + CONVERT *convert=thd->convert_set; + CHARSET_INFO *cs; + DBUG_ENTER("mysqld_show_charsets"); + + field_list.push_back(new Item_empty_string("Name",30)); + field_list.push_back(new Item_int("Id",0,7)); + field_list.push_back(new Item_int("strx_maxlen",0,7)); + field_list.push_back(new Item_int("mb_maxlen",0,7)); + + if (send_fields(thd,field_list,1)) + DBUG_RETURN(1); + + for (cs=compiled_charsets ; cs->name ; cs++ ) + { + if (!(wild && wild[0] && wild_case_compare(system_charset_info,cs->name,wild))) + { + packet2.length(0); + net_store_data(&packet2,convert,cs->name); + net_store_data(&packet2,(uint32) cs->number); + net_store_data(&packet2,(uint32) cs->strxfrm_multiply); + net_store_data(&packet2,(uint32) cs->mbmaxlen); + + if (my_net_write(&thd->net, (char*) packet2.ptr(),packet2.length())) + goto err; /* purecov: inspected */ + } + } + send_eof(&thd->net); + DBUG_RETURN(0); +err: + DBUG_RETURN(1); +} + int mysqld_show(THD *thd, const char *wild, show_var_st *variables) { diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index efc8b8b5389..25d8dbbab16 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2801,6 +2801,8 @@ show_param: { Lex->sql_command= SQLCOM_SHOW_PROCESSLIST;} | VARIABLES wild { Lex->sql_command= SQLCOM_SHOW_VARIABLES; } + | CHAR_SYM SET wild + { Lex->sql_command= SQLCOM_SHOW_CHARSETS; } | LOGS_SYM { Lex->sql_command= SQLCOM_SHOW_LOGS; } | GRANTS FOR_SYM user -- cgit v1.2.1 From e413fd4c38735663c6122c7f7e509e3982f9296b Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 11 Jun 2002 21:04:14 +0500 Subject: test_charset.c: fix: use my_free() instead of free() mysys/test_charset.c: fix: use my_free() instead of free() --- mysys/test_charset.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mysys/test_charset.c b/mysys/test_charset.c index 15e46f3ff82..224a4120614 100644 --- a/mysys/test_charset.c +++ b/mysys/test_charset.c @@ -48,11 +48,11 @@ int main(int argc, char **argv) { cs_list = list_charsets(MYF(MY_COMPILED_SETS | MY_CONFIG_SETS)); printf("LIST OF CHARSETS (compiled + *.conf):\n%s\n", cs_list); - free(cs_list); + my_free(cs_list,MYF(0)); cs_list = list_charsets(MYF(MY_INDEX_SETS | MY_LOADED_SETS)); printf("LIST OF CHARSETS (index + loaded):\n%s\n", cs_list); - free(cs_list); + my_free(cs_list,MYF(0)); return 0; } -- cgit v1.2.1 From 049a8386f3ce99e689f1dc3e562c29e7d8113e71 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 12 Jun 2002 13:47:32 -0700 Subject: Client-Server Protocol 4.1 changes - Client side: - Support of prepared execution - Support of Original Table and Column names - Support of direct transactional API - And lot of misc handling (Note that, the pull will not work, unless you have the Server side changes also which will be followed by this commit) BitKeeper/etc/logging_ok: Logging to logging@openlogging.org accepted --- BitKeeper/etc/logging_ok | 1 + include/errmsg.h | 14 + include/mysql.h | 114 ++++- include/mysql_com.h | 80 ++- libmysql/errmsg.c | 39 +- libmysql/libmysql.c | 1280 ++++++++++++++++++++++++++++++++++++++++++++-- 6 files changed, 1464 insertions(+), 64 deletions(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index c066d743ee1..0ed14928cdb 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -67,3 +67,4 @@ venu@work.mysql.com worm@altair.is.lan zak@balfor.local zak@linux.local +venu@myvenu.com diff --git a/include/errmsg.h b/include/errmsg.h index 76a57f47611..175089ba371 100644 --- a/include/errmsg.h +++ b/include/errmsg.h @@ -61,3 +61,17 @@ extern const char *client_errors[]; /* Error messages */ #define CR_PROBE_SLAVE_HOSTS 2023 #define CR_PROBE_SLAVE_CONNECT 2024 #define CR_PROBE_MASTER_CONNECT 2025 + +/* new 4.1 error codes */ +#define CR_INVALID_CONN_HANDLE 2026 +#define CR_NULL_POINTER 2027 +#define CR_MEMORY_ERROR 2028 +#define CR_NO_PREPARE_STMT 2029 +#define CR_NOT_ALL_PARAMS_BOUND 2030 +#define CR_DATA_TRUNCATED 2031 +#define CR_NOT_ALL_BUFFERS_BOUND 2032 +#define CR_FAILED_TO_SET_PARAM_DATA 2033 +#define CR_NO_PARAMETERS_EXISTS 2033 +#define CR_INVALID_PARAMETER_NO 2035 +#define CR_INVALID_BUFFER_USE 2036 + diff --git a/include/mysql.h b/include/mysql.h index 5bcdca636c0..d667647d46d 100644 --- a/include/mysql.h +++ b/include/mysql.h @@ -68,16 +68,17 @@ extern char *mysql_unix_port; #define INTERNAL_NUM_FIELD(f) (((f)->type <= FIELD_TYPE_INT24 && ((f)->type != FIELD_TYPE_TIMESTAMP || (f)->length == 14 || (f)->length == 8)) || (f)->type == FIELD_TYPE_YEAR) typedef struct st_mysql_field { - char *name; /* Name of column */ - char *table; /* Table of column if column was a field */ - char *org_table; /* Org table name if table was an alias */ - char *db; /* Database for table */ - char *def; /* Default value (set by mysql_list_fields) */ - unsigned long length; /* Width of column */ - unsigned long max_length; /* Max width of selected set */ - unsigned int flags; /* Div flags */ - unsigned int decimals; /* Number of decimals in field */ - enum enum_field_types type; /* Type of field. Se mysql_com.h for types */ + char *name; /* Name of column */ + char *org_name; /* Original column name, if column was an alias */ + char *table; /* Table of column if column was a field */ + char *org_table; /* Org table name, if table was an alias */ + char *db; /* Database for table */ + char *def; /* Default value (set by mysql_list_fields) */ + unsigned long length; /* Width of column */ + unsigned long max_length; /* Max width of selected set */ + unsigned int flags; /* Div flags */ + unsigned int decimals; /* Number of decimals in field */ + enum enum_field_types type; /* Type of field. Se mysql_com.h for types */ } MYSQL_FIELD; typedef char **MYSQL_ROW; /* return data as array of strings */ @@ -101,6 +102,23 @@ typedef struct st_mysql_rows { typedef MYSQL_ROWS *MYSQL_ROW_OFFSET; /* offset to current row */ #include +#ifndef ST_USED_MEM_DEFINED +#define ST_USED_MEM_DEFINED +typedef struct st_used_mem { /* struct for once_alloc */ + struct st_used_mem *next; /* Next block in use */ + unsigned int left; /* memory left in block */ + unsigned int size; /* size of block */ +} USED_MEM; +typedef struct st_mem_root { + USED_MEM *free; + USED_MEM *used; + USED_MEM *pre_alloc; + unsigned int min_malloc; + unsigned int block_size; + + void (*error_handler)(void); +} MEM_ROOT; +#endif typedef struct st_mysql_data { my_ulonglong rows; @@ -391,6 +409,82 @@ int STDCALL mysql_manager_command(MYSQL_MANAGER* con, int STDCALL mysql_manager_fetch_line(MYSQL_MANAGER* con, char* res_buf, int res_buf_size); + + + +/* + The following definations are added for the enhanced + client-server protocol +*/ + +/* statement state */ +enum MY_STMT_STATE { MY_ST_UNKNOWN, MY_ST_PREPARE, MY_ST_EXECUTE }; + +/* bind structure */ +typedef struct st_mysql_bind { + + enum enum_field_types buffer_type; /* buffer type */ + enum enum_field_types field_type; /* field type */ + gptr buffer; /* buffer */ + long *length; /* output length pointer */ + ulong buffer_length; /* buffer length */ + ulong bind_length; /* internal use */ + my_bool is_null; /* NULL indicator */ + my_bool is_long_data; /* long data indicator */ + my_bool long_ended; /* internal use */ + +} MYSQL_BIND; + +/* statement handler */ +typedef struct st_mysql_stmt { + + MYSQL *mysql; /* connection handle */ + MYSQL_BIND *params; /* input parameters */ + MYSQL_RES *result; /* resultset */ + MYSQL_BIND *bind; /* row binding */ + MYSQL_FIELD *fields; /* prepare meta info */ + MEM_ROOT mem_root; /* root allocations */ + ulong param_count; /* parameters count */ + ulong field_count; /* fields count */ + ulong long_length; /* long buffer alloced length */ + uint err_no; /* error code */ + char error[MYSQL_ERRMSG_SIZE]; /* error message */ + char *query; /* query buffer */ + char *long_data; /* long buffer */ + enum MY_STMT_STATE state; /* statement state */ + my_bool long_alloced; /* flag to indicate long alloced */ + my_bool types_supplied; /* to indicate types supply */ + +} MYSQL_STMT; + + +MYSQL_STMT * STDCALL mysql_prepare(MYSQL * mysql, const char *query); +int STDCALL mysql_execute(MYSQL_STMT * stmt); +ulong STDCALL mysql_param_count(MYSQL_STMT * stmt); +int STDCALL mysql_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bind); +int STDCALL mysql_bind_result(MYSQL_STMT * stmt, MYSQL_BIND * bind); +int STDCALL mysql_stmt_close(MYSQL_STMT * stmt); +uint STDCALL mysql_stmt_errno(MYSQL_STMT * stmt); +const char *STDCALL mysql_stmt_error(MYSQL_STMT * stmt); +int STDCALL mysql_commit(MYSQL * mysql); +int STDCALL mysql_rollback(MYSQL * mysql); +int STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode); +int STDCALL mysql_fetch(MYSQL_STMT *stmt); +my_bool STDCALL mysql_send_long_data(MYSQL_STMT *stmt, + uint param_number,gptr data, ulong length); +int STDCALL mysql_multi_query(MYSQL *mysql,const char *query,ulong length); +MYSQL_RES *STDCALL mysql_next_result(MYSQL *mysql); +MYSQL_RES * STDCALL mysql_prepare_result(MYSQL_STMT *stmt); + + +/* new status messages */ +#define MYSQL_SUCCESS 0 +#define MYSQL_WARNING 1 +#define MYSQL_ERROR -1 +#define MYSQL_NO_DATA 100 +#define MYSQL_NEED_DATA 99 +#define MYSQL_LONG_DATA_END 0xFF + #define mysql_reload(mysql) mysql_refresh((mysql),REFRESH_GRANT) #ifdef USE_OLD_FUNCTIONS diff --git a/include/mysql_com.h b/include/mysql_com.h index c30eb30f779..c259259c9e2 100644 --- a/include/mysql_com.h +++ b/include/mysql_com.h @@ -42,7 +42,8 @@ enum enum_server_command {COM_SLEEP,COM_QUIT,COM_INIT_DB,COM_QUERY, COM_DEBUG,COM_PING,COM_TIME,COM_DELAYED_INSERT, COM_CHANGE_USER, COM_BINLOG_DUMP, COM_TABLE_DUMP, COM_CONNECT_OUT, - COM_REGISTER_SLAVE}; + COM_REGISTER_SLAVE, + COM_PREPARE,COM_EXECUTE,COM_LONG_DATA }; #define NOT_NULL_FLAG 1 /* Field can't be NULL */ #define PRI_KEY_FLAG 2 /* Field is part of a primary key */ @@ -96,6 +97,7 @@ enum enum_server_command {COM_SLEEP,COM_QUIT,COM_INIT_DB,COM_QUERY, #define CLIENT_SSL 2048 /* Switch to SSL after handshake */ #define CLIENT_IGNORE_SIGPIPE 4096 /* IGNORE sigpipes */ #define CLIENT_TRANSACTIONS 8192 /* Client knows about transactions */ +#define CLIENT_PROTOCOL_41 16384 /* New 4.1 protocol */ #define SERVER_STATUS_IN_TRANS 1 /* Transaction has started */ #define SERVER_STATUS_AUTOCOMMIT 2 /* Server in auto_commit mode */ @@ -136,27 +138,64 @@ typedef struct st_net { #define packet_error (~(unsigned long) 0) -enum enum_field_types { FIELD_TYPE_DECIMAL, FIELD_TYPE_TINY, - FIELD_TYPE_SHORT, FIELD_TYPE_LONG, - FIELD_TYPE_FLOAT, FIELD_TYPE_DOUBLE, - FIELD_TYPE_NULL, FIELD_TYPE_TIMESTAMP, - FIELD_TYPE_LONGLONG,FIELD_TYPE_INT24, - FIELD_TYPE_DATE, FIELD_TYPE_TIME, - FIELD_TYPE_DATETIME, FIELD_TYPE_YEAR, - FIELD_TYPE_NEWDATE, - FIELD_TYPE_ENUM=247, - FIELD_TYPE_SET=248, - FIELD_TYPE_TINY_BLOB=249, - FIELD_TYPE_MEDIUM_BLOB=250, - FIELD_TYPE_LONG_BLOB=251, - FIELD_TYPE_BLOB=252, - FIELD_TYPE_VAR_STRING=253, - FIELD_TYPE_STRING=254, - FIELD_TYPE_GEOMETRY=255 +enum enum_field_types { MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY, + MYSQL_TYPE_SHORT, MYSQL_TYPE_LONG, + MYSQL_TYPE_FLOAT, MYSQL_TYPE_DOUBLE, + MYSQL_TYPE_NULL, MYSQL_TYPE_TIMESTAMP, + MYSQL_TYPE_LONGLONG,MYSQL_TYPE_INT24, + MYSQL_TYPE_DATE, MYSQL_TYPE_TIME, + MYSQL_TYPE_DATETIME, MYSQL_TYPE_YEAR, + MYSQL_TYPE_NEWDATE, + MYSQL_TYPE_ENUM=247, + MYSQL_TYPE_SET=248, + MYSQL_TYPE_TINY_BLOB=249, + MYSQL_TYPE_MEDIUM_BLOB=250, + MYSQL_TYPE_LONG_BLOB=251, + MYSQL_TYPE_BLOB=252, + MYSQL_TYPE_VAR_STRING=253, + MYSQL_TYPE_STRING=254, + MYSQL_TYPE_GEOMETRY=255 + }; -#define FIELD_TYPE_CHAR FIELD_TYPE_TINY /* For compability */ -#define FIELD_TYPE_INTERVAL FIELD_TYPE_ENUM /* For compability */ +/* For backward compatibility */ +#define FIELD_TYPE_DECIMAL MYSQL_TYPE_DECIMAL +#define FIELD_TYPE_TINY MYSQL_TYPE_TINY +#define FIELD_TYPE_SHORT MYSQL_TYPE_SHORT +#define FIELD_TYPE_LONG MYSQL_TYPE_LONG +#define FIELD_TYPE_FLOAT MYSQL_TYPE_FLOAT +#define FIELD_TYPE_DOUBLE MYSQL_TYPE_DOUBLE +#define FIELD_TYPE_NULL MYSQL_TYPE_NULL +#define FIELD_TYPE_TIMESTAMP MYSQL_TYPE_TIMESTAMP +#define FIELD_TYPE_LONGLONG MYSQL_TYPE_LONGLONG +#define FIELD_TYPE_INT24 MYSQL_TYPE_INT24 +#define FIELD_TYPE_DATE MYSQL_TYPE_DATE +#define FIELD_TYPE_TIME MYSQL_TYPE_TIME +#define FIELD_TYPE_DATETIME MYSQL_TYPE_DATETIME +#define FIELD_TYPE_YEAR MYSQL_TYPE_YEAR +#define FIELD_TYPE_NEWDATE MYSQL_TYPE_NEWDATE +#define FIELD_TYPE_ENUM MYSQL_TYPE_ENUM +#define FIELD_TYPE_SET MYSQL_TYPE_SET +#define FIELD_TYPE_TINY_BLOB MYSQL_TYPE_TINY_BLOB +#define FIELD_TYPE_MEDIUM_BLOB MYSQL_TYPE_MEDIUM_BLOB +#define FIELD_TYPE_LONG_BLOB MYSQL_TYPE_LONG_BLOB +#define FIELD_TYPE_BLOB MYSQL_TYPE_BLOB +#define FIELD_TYPE_VAR_STRING MYSQL_TYPE_VAR_STRING +#define FIELD_TYPE_STRING MYSQL_TYPE_STRING +#define FIELD_TYPE_CHAR MYSQL_TYPE_TINY +#define FIELD_TYPE_INTERVAL MYSQL_TYPE_ENUM +#define FIELD_TYPE_GEOMETRY MYSQL_TYPE_GEOMETRY + +#if TO_BE_INCLUDED_LATER +/* For bind applications, to indicate unsigned buffers */ +#define MYSQL_TYPE_UTINY -10 +#define MYSQL_TYPE_USHORT -9 +#define MYSQL_TYPE_ULONG -8 +#define MYSQL_TYPE_UFLOAT -7 +#define MYSQL_TYPE_UDOUBLE -6 +#define MYSQL_TYPE_ULONGLONG -5 +#define MYSQL_TYPE_UINT24 -4 +#endif #define net_new_transaction(net) ((net)->pkt_nr=0) @@ -251,5 +290,6 @@ void my_thread_end(void); #endif #define NULL_LENGTH ((unsigned long) ~0) /* For net_store_length */ +#define MYSQL_LONG_DATA_END 0xFF /* For indication of long data ending */ #endif diff --git a/libmysql/errmsg.c b/libmysql/errmsg.c index 3fdb9c0ddc6..f1cf667f774 100644 --- a/libmysql/errmsg.c +++ b/libmysql/errmsg.c @@ -49,7 +49,18 @@ const char *client_errors[]= "Error on SHOW SLAVE STATUS:", "Error on SHOW SLAVE HOSTS:", "Error connecting to slave:", - "Error connecting to master:" + "Error connecting to master:", + "Invalid connection handle", + "Invalid use of null pointer", + "Memory allocation error", + "Statement not prepared", + "Not all parameters data supplied", + "Data truncated", + "Not all parameters bound for the row fetch", + "Failed to send the parameter data", + "No parameters exists in the statement", + "Invalid parameter number", + "Can't send long data for non string or binary data types" }; /* Start of code added by Roberto M. Serqueira - martinsc@uol.com.br - 05.24.2001 */ @@ -82,7 +93,18 @@ const char *client_errors[]= "Error on SHOW SLAVE STATUS:", "Error on SHOW SLAVE HOSTS:", "Error connecting to slave:", - "Error connecting to master:" + "Error connecting to master:", + "Invalid connection handle", + "Invalid use of null pointer", + "Memory allocation error", + "Statement not prepared", + "Not all parameters data supplied", + "Data truncated", + "Not all parameters bound for the row fetch", + "Failed to send the parameter data", + "No parameters exists in the statement", + "Invalid parameter number", + "Can't send long data for non string or binary data types" }; #else /* ENGLISH */ @@ -113,7 +135,18 @@ const char *client_errors[]= "Error on SHOW SLAVE STATUS:", "Error on SHOW SLAVE HOSTS:", "Error connecting to slave:", - "Error connecting to master:" + "Error connecting to master:", + "Invalid connection handle", + "Invalid use of null pointer", + "Memory allocation error", + "Statement not prepared", + "Not all parameters data supplied", + "Data truncated", + "Not all parameters bound for the row fetch", + "Failed to send the parameter data", + "No parameters exists in the statement", + "Invalid parameter number", + "Can't send long data for non string or binary data types" }; #endif diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index e054b6777c9..0451e3a89c0 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -40,7 +40,7 @@ #include #include #ifdef HAVE_SELECT_H -# include +#include #endif #ifdef HAVE_SYS_SELECT_H #include @@ -56,11 +56,16 @@ #define INADDR_NONE -1 #endif +#include /* for DBUG_ASSERT() */ + static my_bool mysql_client_init=0; uint mysql_port=0; my_string mysql_unix_port=0; -#define CLIENT_CAPABILITIES (CLIENT_LONG_PASSWORD | CLIENT_LONG_FLAG | CLIENT_TRANSACTIONS) +#define CLIENT_CAPABILITIES (CLIENT_LONG_PASSWORD | CLIENT_LONG_FLAG\ + | CLIENT_LOCAL_FILES | CLIENT_TRANSACTIONS\ + | CLIENT_PROTOCOL_41) + #ifdef __WIN__ #define CONNECT_TIMEOUT 20 @@ -76,6 +81,13 @@ my_string mysql_unix_port=0; #define SOCKET_ERROR -1 #endif /* __WIN__ */ +#define MAX_LONG_DATA_LENGTH 8192 /* if allowed through some + configuration, then this needs to + be changed + */ +#define protocol_41(A) ((A)->server_capabilities & CLIENT_PROTOCOL_41) +#define unsigned_field(A) ((A)->flags & UNSIGNED_FLAG) + static void mysql_once_init(void); static MYSQL_DATA *read_rows (MYSQL *mysql,MYSQL_FIELD *fields, uint field_count); @@ -884,7 +896,7 @@ static void mysql_read_default_options(struct st_mysql_options *options, static MYSQL_FIELD * unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields, - my_bool default_value, my_bool long_flag_protocol) + my_bool default_value, uint server_capabilities) { MYSQL_ROWS *row; MYSQL_FIELD *field,*result; @@ -895,29 +907,58 @@ unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields, if (!result) DBUG_RETURN(0); - for (row=data->data; row ; row = row->next,field++) + if(server_capabilities & CLIENT_PROTOCOL_41) { - field->org_table= field->table= strdup_root(alloc,(char*) row->data[0]); - field->name= strdup_root(alloc,(char*) row->data[1]); - field->length= (uint) uint3korr(row->data[2]); - field->type= (enum enum_field_types) (uchar) row->data[3][0]; - if (long_flag_protocol) + /* server is 4.1, and returns the new field result format */ + for (row=data->data; row ; row = row->next,field++) { - field->flags= uint2korr(row->data[4]); - field->decimals=(uint) (uchar) row->data[4][2]; + field->db = strdup_root(alloc,(char*) row->data[0]); + field->table = strdup_root(alloc,(char*) row->data[1]); + field->org_table= strdup_root(alloc,(char*) row->data[2]); + field->name = strdup_root(alloc,(char*) row->data[3]); + field->org_name = strdup_root(alloc,(char*) row->data[4]); + field->length = (uint) uint3korr(row->data[5]); + field->type = (enum enum_field_types) (uchar) row->data[6][0]; + + field->flags= uint2korr(row->data[7]); + field->decimals=(uint) (uchar) row->data[7][2]; + + if (INTERNAL_NUM_FIELD(field)) + field->flags|= NUM_FLAG; + if (default_value && row->data[8]) + field->def=strdup_root(alloc,(char*) row->data[8]); + else + field->def=0; + field->max_length= 0; } - else + } + else /* old ones, for backward compatibility */ + { + for (row=data->data; row ; row = row->next,field++) { - field->flags= (uint) (uchar) row->data[4][0]; - field->decimals=(uint) (uchar) row->data[4][1]; + field->org_table= field->table= strdup_root(alloc,(char*) row->data[0]); + field->name= strdup_root(alloc,(char*) row->data[1]); + field->length= (uint) uint3korr(row->data[2]); + field->type= (enum enum_field_types) (uchar) row->data[3][0]; + + if (server_capabilities & CLIENT_LONG_FLAG) + { + field->flags= uint2korr(row->data[4]); + field->decimals=(uint) (uchar) row->data[4][2]; + } + else + { + field->flags= (uint) (uchar) row->data[4][0]; + field->decimals=(uint) (uchar) row->data[4][1]; + } + if (INTERNAL_NUM_FIELD(field)) + field->flags|= NUM_FLAG; + if (default_value && row->data[5]) + field->def=strdup_root(alloc,(char*) row->data[5]); + else + field->def=0; + field->max_length= 0; } - if (INTERNAL_NUM_FIELD(field)) - field->flags|= NUM_FLAG; - if (default_value && row->data[5]) - field->def=strdup_root(alloc,(char*) row->data[5]); - else - field->def=0; - field->max_length= 0; } free_rows(data); /* Free old data */ DBUG_RETURN(result); @@ -2203,12 +2244,12 @@ get_info: mysql->server_status|= SERVER_STATUS_IN_TRANS; mysql->extra_info= net_field_length_ll(&pos); /* Maybe number of rec */ - if (!(fields=read_rows(mysql,(MYSQL_FIELD*) 0,5))) + + if (!(fields=read_rows(mysql,(MYSQL_FIELD*)0,protocol_41(mysql) ? 8:5))) DBUG_RETURN(-1); if (!(mysql->fields=unpack_fields(fields,&mysql->field_alloc, (uint) field_count,0, - (my_bool) test(mysql->server_capabilities & - CLIENT_LONG_FLAG)))) + mysql->server_capabilities))) DBUG_RETURN(-1); mysql->status=MYSQL_STATUS_GET_RESULT; mysql->field_count= (uint) field_count; @@ -2573,7 +2614,7 @@ mysql_list_fields(MYSQL *mysql, const char *table, const char *wild) end=strmake(strmake(buff, table,128)+1,wild ? wild : "",128); if (simple_command(mysql,COM_FIELD_LIST,buff,(ulong) (end-buff),1) || - !(query = read_rows(mysql,(MYSQL_FIELD*) 0,6))) + !(query = read_rows(mysql,(MYSQL_FIELD*)0,protocol_41(mysql) ? 9:6))) DBUG_RETURN(NULL); free_old_query(mysql); @@ -2587,9 +2628,7 @@ mysql_list_fields(MYSQL *mysql, const char *table, const char *wild) mysql->fields=0; result->field_count = (uint) query->rows; result->fields= unpack_fields(query,&result->field_alloc, - result->field_count,1, - (my_bool) test(mysql->server_capabilities & - CLIENT_LONG_FLAG)); + result->field_count,1,mysql->server_capabilities); result->eof=1; DBUG_RETURN(result); } @@ -2610,11 +2649,10 @@ mysql_list_processes(MYSQL *mysql) free_old_query(mysql); pos=(uchar*) mysql->net.read_pos; field_count=(uint) net_field_length(&pos); - if (!(fields = read_rows(mysql,(MYSQL_FIELD*) 0,5))) + if (!(fields = read_rows(mysql,(MYSQL_FIELD*)0,protocol_41(mysql) ? 8: 5))) DBUG_RETURN(NULL); if (!(mysql->fields=unpack_fields(fields,&mysql->field_alloc,field_count,0, - (my_bool) test(mysql->server_capabilities & - CLIENT_LONG_FLAG)))) + mysql->server_capabilities))) DBUG_RETURN(0); mysql->status=MYSQL_STATUS_GET_RESULT; mysql->field_count=field_count; @@ -3052,3 +3090,1183 @@ myodbc_remove_escape(MYSQL *mysql,char *name) } *to=0; } + +/******************************************************************** + + Implementation of new client-server prototypes for 4.1 version + starts from here .. + + my_* and genaral function names are internal implementations + mysql_* are real prototypes used by applications + +*********************************************************************/ + +/******************************************************************** + Misc Utility functions +********************************************************************/ + +/* + Set the internal stmt error messages +*/ + +static void set_stmt_error(MYSQL_STMT * stmt, int errcode) +{ + DBUG_ENTER("set_stmt_error"); + DBUG_PRINT("enter", ("error :[%d][%s]", errcode, ER(errcode))); + DBUG_ASSERT(stmt != 0); + + stmt->err_no = errcode; + strmov(stmt->error, ER(errcode)); + + DBUG_VOID_RETURN; +} + +/* + Copy error message to statement handler +*/ + +static void set_stmt_errmsg(MYSQL_STMT * stmt, char *err, int errcode) +{ + DBUG_ENTER("set_stmt_error_msg"); + DBUG_PRINT("enter", ("error :[%d][%s]", errcode, err)); + DBUG_ASSERT(stmt != 0); + + stmt->err_no = errcode; + + if (err && err[0]) + strmov(stmt->error, err); + + DBUG_VOID_RETURN; +} + +/* + Set the internal error message to mysql handler +*/ + +static void set_mysql_error(MYSQL * mysql, int errcode) +{ + DBUG_ENTER("set_mysql_error"); + DBUG_PRINT("enter", ("error :[%d][%s]", errcode, ER(errcode))); + DBUG_ASSERT(mysql != 0); + + mysql->net.last_errno = errcode; + strmov(mysql->net.last_error, ER(errcode)); +} + +/* + Return the duplicate string by allocating the memory +*/ + +static char *my_dupp_str(const char *from, int length) +{ + char *str; + + if ((str = my_malloc(length + 1, MYF(MY_WME)))) + { + memcpy(str, from, length); + str[length] = 0; + } + return str; +} + + +/* + Return the reallocted string +*/ + +static char *my_realloc_str(NET *net, int length) +{ + char *from = net->buff; + ulong nead = net->buf_length + length; + DBUG_ENTER("my_realloc_str"); + + if ( nead > net->max_packet ) + { + char *new_buff; + ulong pkt_length = nead + 8192; + + if (pkt_length > max_allowed_packet) + { + DBUG_PRINT("error",("Needed %ld but max_allowed_packet is %ld", + pkt_length,max_allowed_packet)); + DBUG_RETURN(0); + } + if (!(new_buff = (char *)my_realloc(from, pkt_length, MYF(MY_WME)))) + DBUG_RETURN(0); + + net->max_packet = pkt_length; + DBUG_RETURN(new_buff); + } + DBUG_RETURN(from); +} + +/* + Return the type length +*/ + +static ulong return_result_length(uint field_type, ulong length) +{ + switch (field_type) { + case MYSQL_TYPE_TINY: + return 1; + case MYSQL_TYPE_SHORT: + return 2; + case MYSQL_TYPE_INT24: + return 3; + case MYSQL_TYPE_LONG: + return 4; + case MYSQL_TYPE_LONGLONG: + return 8; + case MYSQL_TYPE_FLOAT: + return 4; + case MYSQL_TYPE_DOUBLE: + return 8; + default: + return length; + } +} + +/* + Get the parameter count value +*/ + +static ulong my_get_param_count(MYSQL *mysql) +{ + uchar *pos; + + mysql = mysql->last_used_con; + + if (net_safe_read(mysql) == packet_error) + return 0; + + pos=(uchar*) mysql->net.read_pos; + if (!net_field_length(&pos)) + { + return (ulong)net_field_length(&pos); + } + return 0; +} + +/******************************************************************** + Prepare related implementations +********************************************************************/ + +/* + Read the prepare statement results .. +*/ + +int my_read_prepare_result(MYSQL *mysql,MYSQL_STMT *stmt) +{ + uchar *pos; + ulong field_count; + MYSQL_DATA *fields_data; + ulong length; + + DBUG_ENTER("my_read_prepare_result"); + + mysql = mysql->last_used_con; + + if ((length = net_safe_read(mysql)) == packet_error) + DBUG_RETURN(-1); + + if (stmt->fields) + free_root(&stmt->mem_root,MYF(0)); + init_alloc_root(&stmt->mem_root,8192,0); + stmt->fields=0; + stmt->field_count=0; + + pos=(uchar*) mysql->net.read_pos; + if ((field_count= net_field_length(&pos)) == 0) + { + stmt->param_count= (ulong)net_field_length_ll(&pos); + DBUG_RETURN(0); + } + if (!(mysql->server_status & SERVER_STATUS_AUTOCOMMIT)) + mysql->server_status|= SERVER_STATUS_IN_TRANS; + + mysql->extra_info= net_field_length_ll(&pos); + + if (!(fields_data=read_rows(mysql,(MYSQL_FIELD*)0,protocol_41(mysql) ? 8:5))) + DBUG_RETURN(-1); + + if (!(stmt->fields=unpack_fields(fields_data,&stmt->mem_root, + (uint) field_count,0, + mysql->server_capabilities))) + DBUG_RETURN(-1); + mysql->status = MYSQL_STATUS_READY; + stmt->field_count= (uint) field_count; + DBUG_RETURN(0); +} + + +/* + Prepare the query and return the new statement handle to + caller. + + Also update the total parameter count along with resultset + metadata information by reading from server +*/ + +MYSQL_STMT *STDCALL +mysql_real_prepare(MYSQL *mysql, const char *query, ulong length) +{ + MYSQL_STMT *stmt; + + DBUG_ENTER("mysql_real_prepare"); + DBUG_ASSERT(mysql != 0); + +#ifdef EXTRA_CHECK_ARGUMENTS + if (!query) + { + set_mysql_error(mysql, CR_NULL_POINTER); + DBUG_RETURN(0); + } +#endif + + if (simple_command(mysql, COM_PREPARE, query, length, 1)) + DBUG_RETURN(0); + + if (!(stmt = (MYSQL_STMT *) my_malloc(sizeof(MYSQL_STMT), + MYF(MY_WME | MY_ZEROFILL))) || + !(stmt->query = my_dupp_str((char *)query, length))) + { + my_free((gptr)stmt, MY_ALLOW_ZERO_PTR); + set_mysql_error(mysql, CR_MEMORY_ERROR); + DBUG_RETURN(0); + } + + DBUG_ASSERT(stmt != 0); + + if (my_read_prepare_result(mysql,stmt)) + { + my_free((gptr)stmt, MYF(MY_WME)); + DBUG_RETURN(0); + } + + if (stmt->fields) + stmt->param_count = my_get_param_count(mysql); + + stmt->mysql = mysql; + stmt->state = MY_ST_PREPARE; + stmt->err_no = 0; + stmt->types_supplied = 0; + + DBUG_PRINT("info", ("Parameter count: %ld", stmt->param_count)); + DBUG_RETURN(stmt); +} + +/* + Prepare the query and return the new statement handle to + caller. + + Also update the total parameter count along with resultset + metadata information by reading from server +*/ + +MYSQL_STMT *STDCALL mysql_prepare(MYSQL *mysql, const char *query) +{ + DBUG_ENTER("mysql_prepare"); + DBUG_ASSERT(query != 0); + DBUG_RETURN(mysql_real_prepare(mysql,query,strlen(query))); +} + +/* + Returns prepared meta information in the form of resultset + to client.. +*/ + + +MYSQL_RES * STDCALL +mysql_prepare_result(MYSQL_STMT *stmt) +{ + MYSQL_RES *result; + DBUG_ENTER("mysql_prepare_result"); + + if (!stmt->fields) + DBUG_RETURN(0); + + /* Will be freed during mysql_stmt_close as the prepare + meta info should live till the stmt life + */ + if (!(result=(MYSQL_RES*) alloc_root(&stmt->mem_root, + (uint) (sizeof(MYSQL_RES)+ sizeof(ulong) * + stmt->field_count)))) + { + set_stmt_error(stmt, CR_MEMORY_ERROR); + DBUG_RETURN(0); + } + bzero((char*) result, sizeof(MYSQL_RES)); + result->eof=1; /* Marker for buffered */ + result->lengths=(ulong*) (result+1); + result->row_count= 0; + result->fields= stmt->fields; + result->field_count= stmt->field_count; + DBUG_RETURN(result); +} + +/******************************************************************** + Prepare-execute, and param handling +*********************************************************************/ + + +/* + Store the buffer type +*/ + +static void my_store_param_type(NET *net, uint type) +{ + int2store(net->buff+net->buf_length, type); + net->buf_length+=2; +} + +/* + Store the length of parameter data +*/ +static char * my_store_param_length(char *pkg, ulong length) +{ + uchar *packet=(uchar*) pkg; + + if (length < 251) + { + *packet=(uchar) length; + return (char*) packet+1; + } + *packet++ = 252; + int2store(packet,(uint) length); + return (char*) packet+2; +} + +/* + Store the integer data +*/ + +static bool my_store_param_long(NET *net, longlong *data, uint length) +{ + char *packet; + + if (!(net->buff = my_realloc_str(net, net->buf_length + length + 1))) + return 1; + + packet = (char *)net->buff+net->buf_length; + + switch(length) { + case 1: + { + char value = (char)*data; + *packet = value; + } + break; + case 2: + { + short value = (short)*data; + int2store(packet,value); + } + break; + case 3: + { + int value = (int)*data; + int3store(packet,value); + } + break; + case 4: + { + long value = (long)*data; + int4store(packet, value); + } + break; + default: + { + longlong value = (longlong)*data; + int8store(packet, value); + } + } + net->buf_length += length; + return 0; +} + +/* + Store the float data +*/ + +static bool my_store_param_double(NET *net, double *data, uint length) +{ + char *packet; + + if (!(net->buff = my_realloc_str(net, net->buf_length + length + 1))) + return 1; + + packet = (char *)net->buff+net->buf_length; + if (length == 4) + { + float value = (float)*data; + float4store(packet, value); + } + else + { + double value = (double)*data; + float8store(packet, value); + } + net->buf_length += length; + return 0; +} + +/* + Store NULL data +*/ + +static my_bool my_store_param_null(NET * net) +{ + if (!(net->buff = my_realloc_str(net, net->buf_length + 1))) + return 1; /* Signal error */ + + net->buff[net->buf_length++] = (char)251; + return 0; +} + +/* + Store string and binary data +*/ + +static my_bool my_store_param_str(NET * net, const char *from, uint length) +{ + char *to; + + if (!(net->buff = my_realloc_str(net, net->buf_length + 5 + length))) + return 1; + + to = (char *)my_store_param_length((char *)net->buff + net->buf_length, + (ulong) length); + memcpy(to, from, length); + net->buf_length = (ulong) ((char *)(to + length) - (char *)(net->buff)); + return 0; +} + + +/* + Set parameter data by reading from input buffers from the + client application +*/ + +static my_bool my_store_param(MYSQL_STMT * stmt, MYSQL_BIND * param) +{ + MYSQL *mysql = stmt->mysql; + NET *net = &mysql->net; + + DBUG_ENTER("my_store_param"); + DBUG_PRINT("enter",("type : %d, buffer :%lx", param->buffer_type, + param->buffer)); + + if (!stmt->types_supplied) + my_store_param_type(net, (uint)param->buffer_type); + + if (!param->buffer) + { + if (my_store_param_null(net)) + goto err; + + DBUG_RETURN(0); + } + switch (param->buffer_type) + { + case MYSQL_TYPE_TINY: + case MYSQL_TYPE_SHORT: + case MYSQL_TYPE_INT24: + case MYSQL_TYPE_LONG: + case MYSQL_TYPE_LONGLONG: + if (my_store_param_long(net,(longlong *)param->buffer,param->bind_length)) + goto err; + break; + + case MYSQL_TYPE_FLOAT: + case MYSQL_TYPE_DOUBLE: + if (my_store_param_double(net,(double *)param->buffer,param->bind_length)) + goto err; + break; + + case MYSQL_TYPE_TINY_BLOB: + case MYSQL_TYPE_MEDIUM_BLOB: + case MYSQL_TYPE_LONG_BLOB: + case MYSQL_TYPE_BLOB: + { + /* + Binary handling, application should supply valid length else + will lead into problems + */ + ulong length = param->buffer_length; + if(param->length) /* ovverite, if length pointer exists */ + length = *param->length; + if (my_store_param_str(net, (char *)param->buffer, length)) + goto err; + } + break; + + default: + { + /* All other conversions should fall through to string type .. */ + char *data = param->buffer; + ulong length; + + if (!param->length) + { + /* + This case is not supose to happen, application should + supply the length for strings and binary data + */ + if (data) + length = param->buffer_length ? strnlen(data,param->buffer_length) : + strlen(data); + else + { + DBUG_PRINT("warning",("data is a null pointer")); + length=0; + } + } + else + length= *param->length; + + if (my_store_param_str(net,data,length)) + goto err; + } + } + DBUG_RETURN(0); + +err: + set_stmt_error(stmt, CR_MEMORY_ERROR); + DBUG_RETURN(1); +} + +/* + Send the prepare query to server for execution +*/ + +static int my_execute(MYSQL_STMT * stmt, char *packet, ulong length) +{ + MYSQL *mysql = stmt->mysql; + NET *net = &mysql->net; + + DBUG_ENTER("my_execute"); + DBUG_PRINT("enter",("packet: %s, length :%d",packet ? packet :" ", length)); + + mysql->last_used_con = mysql; + + if (simple_command(mysql, COM_EXECUTE, packet, length, 1) || + mysql_read_query_result(mysql)) + { + set_stmt_errmsg(stmt, net->last_error, net->last_errno); + DBUG_RETURN(-1); + } + stmt->state = MY_ST_EXECUTE; + + if (stmt->bind) + { + mysql_free_result(stmt->result); + stmt->result = mysql_store_result(mysql); + } + DBUG_RETURN(0); +} + +/* + Execute the prepare query +*/ + +int STDCALL mysql_execute(MYSQL_STMT * stmt) +{ + DBUG_ENTER("mysql_execute"); + DBUG_ASSERT(stmt != 0); + + if (stmt->state == MY_ST_UNKNOWN) + { + set_stmt_error(stmt, CR_NO_PREPARE_STMT); + DBUG_RETURN(-1); + } + stmt->mysql->fields = stmt->fields; + if (stmt->param_count) + { + NET *net = &stmt->mysql->net; + MYSQL_BIND *param; + ulong param_count; + char *param_data; + + if (!stmt->params) + { + /* Parameters exists, but no bound buffers */ + set_stmt_error(stmt, CR_NOT_ALL_PARAMS_BOUND); + DBUG_RETURN(-1); + } + net_clear(net); + net->buf_length = 0; /* clear net */ + + /* In case if buffers (type) alterned, indicate to server */ + net->buff[net->buf_length++] = (char)stmt->types_supplied; + + for (param=stmt->params, param_count = 0; + param_count < stmt->param_count; param_count++, param++) + { + /* Check if any long data, run-time supply exists */ + if (param->is_long_data && !param->long_ended) + DBUG_RETURN(MYSQL_NEED_DATA); + + if (my_store_param(stmt, param)) + DBUG_RETURN(-1); + } + if (!(param_data = my_memdup((byte *) net->buff, + net->buf_length, MYF(MY_WME)))) + { + set_stmt_error(stmt, CR_MEMORY_ERROR); + DBUG_RETURN(-1); + } + if (my_execute(stmt,param_data,net->buf_length)) + { + my_free(param_data, MYF(MY_WME)); + DBUG_RETURN(-1); + } + my_free(param_data, MYF(MY_WME)); + stmt->types_supplied = 1; + DBUG_RETURN(0); + } + DBUG_RETURN(my_execute(stmt,0,0)); +} + +/* + Return total parameters count in the statement +*/ + +ulong STDCALL mysql_param_count(MYSQL_STMT * stmt) +{ + DBUG_ENTER("mysql_param_count"); + DBUG_ASSERT(stmt != 0); + + DBUG_RETURN(stmt->param_count); +} + + +/* + Setup the parameter data buffers from application +*/ + +int STDCALL mysql_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bind) +{ + MYSQL_BIND *param; + ulong count; + + DBUG_ENTER("mysql_bind_param"); + DBUG_ASSERT(stmt != 0); + +#ifdef CHECK_EXTRA_ARGUMENTS + if (!bind) + { + set_stmt_error(stmt, CR_NULL_POINTER); + DBUG_RETURN(-1); + } + if (stmt->state == MY_ST_UNKNOWN) + { + set_stmt_error(stmt, CR_NO_PREPARE_STMT); + DBUG_RETURN(-1); + } + if (!stmt->param_count) + { + set_stmt_error(stmt, CR_NO_PARAMETERS_EXISTS); + DBUG_RETURN(-1); + } +#endif + + /* In case if buffers bounded previously, free it */ + my_free((gptr) stmt->params, MY_ALLOW_ZERO_PTR); + if (!(stmt->params=(MYSQL_BIND *)my_memdup((byte *) bind, + sizeof(MYSQL_BIND) * stmt->param_count, MYF(MY_WME)))) + { + set_stmt_error(stmt, CR_MEMORY_ERROR); + DBUG_RETURN(0); + } + + for (param=stmt->params, count=0; + count < stmt->param_count; count++, param++) + { + if (!param) + { + /* Not all parameters bound by the application */ + my_free((gptr) stmt->params, MY_ALLOW_ZERO_PTR); + set_stmt_error(stmt, CR_NOT_ALL_PARAMS_BOUND); + DBUG_RETURN(-1); + } + if (param->is_long_data && + (param->buffer_type < MYSQL_TYPE_TINY_BLOB || + param->buffer_type > MYSQL_TYPE_STRING)) + { + /* + Long data handling should be used only for string/binary + types only + */ + my_free((gptr) stmt->params, MY_ALLOW_ZERO_PTR); + set_stmt_error(stmt, CR_INVALID_BUFFER_USE); + DBUG_RETURN(-1); + } + /* setup default buffer_length for int and double types */ + param->bind_length = return_result_length(param->buffer_type, + param->buffer_length); + } + stmt->types_supplied = 0; + DBUG_RETURN(0); +} + +/******************************************************************** + Long data implementation +*********************************************************************/ + +/* + Store long data buffer type, to distinguish string and binary +*/ + +static char* my_store_long_type(MYSQL_STMT *stmt, char *packet, uint type) +{ + *packet++ = (char)stmt->types_supplied; + if (!stmt->types_supplied) + { + int2store(packet, type); + packet += 2; + } + return(packet); +} + +/* + Long data in pieces, if buffured successfully send '0' as + status else send '1' + + if length == MYSQL_END_OF_DATA, then thats the last data + piece for the parameter +*/ + +my_bool STDCALL +mysql_send_long_data(MYSQL_STMT *stmt, uint param_number, + gptr data, ulong length) +{ + MYSQL_BIND *param; + MYSQL *mysql; + char *packet; + ulong packet_length, long_length; + + DBUG_ENTER("mysql_send_long_data"); + DBUG_ASSERT( stmt != 0 ); + + DBUG_PRINT("enter",("param no : %d, data : %lx, length : %ld", + param_number, data, length)); + + if (!(param = (stmt->params+param_number))) + { + set_stmt_error(stmt, CR_INVALID_PARAMETER_NO); + DBUG_RETURN(1); + } + + mysql = stmt->mysql; + if (length == MYSQL_LONG_DATA_END || param->long_ended) + { + if (!stmt->long_alloced) + { + stmt->long_length = MAX_LONG_DATA_LENGTH; + my_free(stmt->long_data, MY_ALLOW_ZERO_PTR); + + if (!(stmt->long_data = (char*) my_malloc(stmt->long_length,MYF(0)))) + { + set_stmt_error(stmt, CR_MEMORY_ERROR); + DBUG_RETURN(1); + } + stmt->long_alloced = 1; + } + packet = stmt->long_data; + packet = my_store_param_length(packet, param_number);/* number */ + packet = my_store_long_type(stmt, packet, param->buffer_type);/* type */ + packet_length = (ulong) ((char *)packet - (char *)(stmt->long_data)); + *packet = (char )MYSQL_LONG_DATA_END; /* data end indicator */ + packet_length++; + + if (simple_command(mysql,COM_LONG_DATA,stmt->long_data,packet_length,0)) + goto err; + + stmt->types_supplied = 1; + param->long_ended = 1; + DBUG_RETURN(0); + } + if (!stmt->long_alloced || stmt->long_length < length+7) + { + stmt->long_length = ( MAX_LONG_DATA_LENGTH > (length + 7)) ? + MAX_LONG_DATA_LENGTH : length + 7; + + my_free(stmt->long_data, MY_ALLOW_ZERO_PTR); + if (!(stmt->long_data = (char*) my_malloc(stmt->long_length ,MYF(0)))) + { + set_stmt_error(stmt, CR_MEMORY_ERROR); + DBUG_RETURN(1); + } + stmt->long_alloced = 1; + } + packet = stmt->long_data; + long_length = stmt->long_length; + packet = my_store_param_length(packet, param_number);/* number */ + packet = my_store_long_type(stmt, packet, param->buffer_type);/* type */ + { + char *to = my_store_param_length(packet, length); /* data length */ + memcpy(to, data, length); /* data */ + packet_length = (ulong)((char *)(to + length) - (char *)(stmt->long_data)); + } + /* + Send the data to server directly for buffering .. + + TO_BE_DELETED : cross check this with Monty, becuase over the phone + Monty said not to have check for max_packet_length for long data to + have a local storage, instead send it to server directlty, but in + one of his e-mail says to store upto max_packet_size locally.. + */ + if (simple_command(mysql, COM_LONG_DATA, stmt->long_data, packet_length, 0)) + goto err; + + stmt->types_supplied = 1; + DBUG_RETURN(0); + +err: + set_stmt_errmsg(stmt,(char *)mysql->net.last_error, mysql->net.last_errno); + DBUG_RETURN(-1); +} + +/******************************************************************** + Fetch-bind related implementations +*********************************************************************/ + +/* + Setup the bind buffers for resultset processing +*/ + +int STDCALL mysql_bind_result(MYSQL_STMT * stmt, MYSQL_BIND * bind) +{ + MYSQL_BIND *param; + ulong count,bind_count, *length; + + DBUG_ENTER("mysql_bind_result"); + DBUG_ASSERT(stmt != 0); + + if (!bind) + { + set_stmt_error(stmt, CR_NULL_POINTER); + DBUG_RETURN(-1); + } + count = sizeof(*bind) / sizeof(MYSQL_BIND) + 1; + bind_count = stmt->result ? stmt->result->field_count : count; + + /* bind_count now will have total fields, if no resultset + exists, then this points to sizeof(bind) + */ + if (bind_count < count) + { + set_stmt_error(stmt, CR_NOT_ALL_BUFFERS_BOUND); + DBUG_RETURN(-1); + } + /* In case previously bound, free it */ + my_free((gptr)stmt->bind, MY_ALLOW_ZERO_PTR); + if (!(stmt->bind=(MYSQL_BIND *)my_memdup((byte *) bind, + sizeof(MYSQL_BIND) * bind_count, MYF(MY_WME)))) + { + set_stmt_error(stmt, CR_MEMORY_ERROR); + DBUG_RETURN(0); + } + /* set the lengths */ + for (param=stmt->bind,count=0; countlength)) + *length = return_result_length(bind->buffer_type, bind->buffer_length); + } + DBUG_RETURN(0); +} + +/* + Copy a row of data to bound buffers, used in myql_fetch +*/ + +static int +my_fetch_record(MYSQL_BIND *bind, MYSQL_FIELD *field, + char *value) +{ + gptr buff = bind->buffer; + ulong buff_length = bind->buffer_length; + long *length = bind->length , tmp_length; + enum enum_field_types buff_type = bind->buffer_type; + + DBUG_ENTER("my_fetch_record"); + + if (!value) + { + buff = NullS; + DBUG_RETURN(0); + } + if (!length) + length= &tmp_length; + + /* Copy the data which is in string format to application buffers + based on its type .. no cross conversion needed as everything + is in string buffers in result->row. + + When the server supports the sending of data in its own format, + then this needs to be cleaned to have all cross combinations + */ + switch (buff_type) + { + case MYSQL_TYPE_TINY: + if (unsigned_field(field)) + *((uchar *) buff) = ((uchar) (uint) atoi(value)); + else + *((char *) buff) = ((char)atoi(value)); + break; + + case MYSQL_TYPE_SHORT: + if (unsigned_field(field)) + *((ushort *) buff) = (ushort) (uint) atol(value); + else + *((short *) buff) = (short)atoi(value); + break; + + case MYSQL_TYPE_LONG: + if (unsigned_field(field)) + { + char *end_ptr; + *((ulong *) buff) = strtoul(value, &end_ptr, 10); + } + else + { + uint actual_length = strlen(value); + if (actual_length >= 10 && value[4] == '-' && value[7] == '-' && + (!value[10] || value[10] == ' ')) + { + *((long *) buff) = ((long)atol(value) * 10000L + + (long)atol(value + 5) * 100L + + (long)atol(value + 8)); + } + else + *((long *) buff) = (long)atol(value); + } + break; + + case MYSQL_TYPE_LONGLONG: + if (unsigned_field(field)) + *((ulonglong *) buff) = (ulonglong) strtoull(value, NULL, 10); + else + *((longlong *) buff) = (longlong) strtoll(value, NULL, 10); + break; + + case MYSQL_TYPE_FLOAT: + *((float *) buff) = (float)atof(value); + break; + + case MYSQL_TYPE_DOUBLE: + *((double *) buff) = (double)atof(value); + break; + + /* TODO : for strings and blobs, Monty comments + + For strings: We should also support letting the user specify + a pointer to a char * which we would update to where the + date is in the memory. In this case we would only update the + pointer to where we have the string in memory. This would make + things twice as fast for us as we would not have to move things + around and would also require much less memoryfrom the application. + + so, just return the address with the length pointer updated ? + + confirm with Monty and enble the following lines of code by + disbling the existing code which follows next to this. + + If this is enabled, then there is no need of buffer_length in + MYSQL_BIND structure, and clean the code related to that + */ +#if TO_BE_IMPLEMENTED + case MYSQL_TYPE_BLOB: + case MYSQL_TYPE_TINY_BLOB: + case MYSQL_TYPE_MEDIUM_BLOB: + case MYSQL_TYPE_LONG_BLOB: + *length = sizeof(value);/* will contain size */ + (char *)bind->buffer = value; /* send the data address to application */ + break; + + default: + *length = strlen(value);/* will contain string length */ + (char *)bind->buffer = value; /* send the data address to application */ + break; +#endif + case MYSQL_TYPE_BLOB: + case MYSQL_TYPE_TINY_BLOB: + case MYSQL_TYPE_MEDIUM_BLOB: + case MYSQL_TYPE_LONG_BLOB: + *length = sizeof(value); + memcpy((char *)buff, value, buff_length); + break; + + default: + buff_length--; + *length = strlen(value); + strmake((char *)buff, value, buff_length); + } + DBUG_RETURN(0); +} + +/* + Fetch row data to bind buffers +*/ + +static int my_fetch_row(MYSQL_STMT *stmt, MYSQL_RES *result, MYSQL_ROW values) +{ + MYSQL_BIND *bind, *end; + MYSQL_FIELD *field; + ulong record=0; + + result->current_row = values; + result->row_count++; + + /* Copy complete row to application buffers */ + for (bind = stmt->bind, end = (MYSQL_BIND *) bind + result->field_count; + bind < end; + bind++, values++) + { + field = &result->fields[record++]; + + if (my_fetch_record(bind, field, *values)) + return -1; + } + return 0; +} + +/* + Fetch and return row data to bound buffers, if any +*/ + +int STDCALL mysql_fetch(MYSQL_STMT * stmt) +{ + MYSQL_RES *result; + + DBUG_ENTER("mysql_fetch"); + DBUG_ASSERT(stmt != 0); + + result = stmt->result; + + if (!result) + DBUG_RETURN(MYSQL_NO_DATA); + + if (!result->data) + { + if (!result->eof) + { + if (!(read_one_row(result->handle, result->field_count, + result->row, result->lengths))) + { + DBUG_RETURN(my_fetch_row(stmt, result, result->row)); + } + else + { + DBUG_PRINT("info", ("end of data")); + result->eof = 1; + result->handle->status = MYSQL_STATUS_READY; + /* Don't clear handle in mysql_free_results */ + result->handle = 0; + } + } + DBUG_RETURN(MYSQL_NO_DATA); /* no more data */ + } + { + MYSQL_ROW values; + + if (!result->data_cursor) + { + DBUG_PRINT("info", ("end of data")); + result->current_row = (MYSQL_ROW) NULL; + DBUG_RETURN(MYSQL_NO_DATA); + } + values = result->data_cursor->data; + result->data_cursor = result->data_cursor->next; + + DBUG_RETURN(my_fetch_row(stmt,result,values)); + } + DBUG_RETURN(0); +} + + +/******************************************************************** + Misc function implementations +*********************************************************************/ +/* + Close the statement handle by freeing all resources +*/ + +int STDCALL mysql_stmt_close(MYSQL_STMT * stmt) +{ + DBUG_ENTER("mysql_stmt_close"); + DBUG_ASSERT(stmt != 0); + + free_root(&stmt->mem_root,MY_ALLOW_ZERO_PTR); + my_free((gptr) stmt->query, MYF(MY_WME)); + my_free((gptr) stmt->bind, MY_ALLOW_ZERO_PTR); + my_free((gptr) stmt->params, MY_ALLOW_ZERO_PTR); + my_free((gptr) stmt->long_data, MY_ALLOW_ZERO_PTR); + my_free((gptr) stmt, MYF(MY_WME)); + DBUG_RETURN(0); +} + +/* + Return statement error code +*/ + +uint STDCALL mysql_stmt_errno(MYSQL_STMT * stmt) +{ + DBUG_ENTER("mysql_stmt_errno"); + DBUG_ASSERT(stmt != 0); + + DBUG_RETURN(stmt->err_no); +} + +/* + Return statement error message +*/ + +const char *STDCALL mysql_stmt_error(MYSQL_STMT * stmt) +{ + DBUG_ENTER("mysql_stmt_error"); + DBUG_ASSERT(stmt != 0); + + DBUG_RETURN(stmt->error); +} + +/* + Commit the current transaction +*/ + +int STDCALL mysql_commit(MYSQL * mysql) +{ + DBUG_ENTER("mysql_commit"); + DBUG_ASSERT(mysql != 0); + + DBUG_RETURN(mysql_real_query(mysql, "commit", 6)); +} + +/* + Rollback the current transaction +*/ + +int STDCALL mysql_rollback(MYSQL * mysql) +{ + DBUG_ENTER("mysql_rollback"); + DBUG_ASSERT(mysql != 0); + + DBUG_RETURN(mysql_real_query(mysql, "rollback", 8)); +} + + +/* + Set autocommit to either true or false +*/ + +int STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode) +{ + DBUG_ENTER("mysql_autocommit"); + DBUG_ASSERT(mysql != 0); + + DBUG_PRINT("enter", ("mode : %d", auto_mode)); + + if (auto_mode) /* set to true */ + DBUG_RETURN(mysql_real_query(mysql, "set autocommit=1", 16)); + DBUG_RETURN(mysql_real_query(mysql, "set autocommit=0", 16)); +} -- cgit v1.2.1 From 6cdebb33d7849adb90015ecd4a7312de81200de0 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 12 Jun 2002 14:13:12 -0700 Subject: sql_error.cc, sql_prepare.cc: new file Client-server protocol 4.1 changes - Server side: * Enhanced metadata information: - SHOW [COUNT(*)] ERRORS [LIMIT [offset,] rows] - SHOW [COUNT(*)] WARNING [LIMIT [offset,] rows] - SHOW TABLE TYPES - SHOW PRIVILEGES - SHOW COLUMN TYPES (Not fully implemented) * Prepared execution * Long data handling in pieces * And other misc changes --- sql/Makefile.am | 1 + sql/field.cc | 8 +- sql/field.h | 4 +- sql/item.cc | 139 ++++++++++- sql/item.h | 34 +++ sql/item_sum.cc | 5 +- sql/lex.h | 4 + sql/mysql_priv.h | 28 ++- sql/net_pkg.cc | 11 +- sql/sql_base.cc | 188 +++++++++++--- sql/sql_class.cc | 3 + sql/sql_class.h | 36 ++- sql/sql_error.cc | 219 +++++++++++++++++ sql/sql_insert.cc | 2 +- sql/sql_lex.h | 7 +- sql/sql_list.h | 121 +++++++++ sql/sql_parse.cc | 54 +++- sql/sql_prepare.cc | 709 +++++++++++++++++++++++++++++++++++++++++++++++++++++ sql/sql_select.cc | 4 +- sql/sql_show.cc | 195 +++++++++++++++ sql/sql_yacc.yy | 57 ++++- sql/structs.h | 23 ++ 22 files changed, 1794 insertions(+), 58 deletions(-) create mode 100644 sql/sql_error.cc create mode 100644 sql/sql_prepare.cc diff --git a/sql/Makefile.am b/sql/Makefile.am index bd626ea10b7..81fe927ce5a 100644 --- a/sql/Makefile.am +++ b/sql/Makefile.am @@ -67,6 +67,7 @@ mysqld_SOURCES = sql_lex.cc sql_handler.cc \ mysqld.cc password.c hash_filo.cc hostname.cc \ convert.cc sql_parse.cc sql_yacc.yy \ sql_base.cc table.cc sql_select.cc sql_insert.cc \ + sql_prepare.cc sql_error.cc \ sql_update.cc sql_delete.cc uniques.cc sql_do.cc \ procedure.cc item_uniq.cc sql_test.cc \ log.cc log_event.cc init.cc derror.cc sql_acl.cc \ diff --git a/sql/field.cc b/sql/field.cc index 1561f1831de..8b1073d32f3 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -279,8 +279,10 @@ void Field_num::add_zerofill_and_unsigned(String &res) const void Field_num::make_field(Send_field *field) { + field->db_name=table->table_cache_key ? table->table_cache_key : ""; + field->org_table_name=table->real_name; field->table_name=table_name; - field->col_name=field_name; + field->col_name=field->org_col_name=field_name; field->length=field_length; field->type=type(); field->flags=table->maybe_null ? (flags & ~NOT_NULL_FLAG) : flags; @@ -290,8 +292,10 @@ void Field_num::make_field(Send_field *field) void Field_str::make_field(Send_field *field) { + field->db_name=table->table_cache_key ? table->table_cache_key : ""; + field->org_table_name=table->real_name; field->table_name=table_name; - field->col_name=field_name; + field->col_name=field->org_col_name=field_name; field->length=field_length; field->type=type(); field->flags=table->maybe_null ? (flags & ~NOT_NULL_FLAG) : flags; diff --git a/sql/field.h b/sql/field.h index f84b54271ce..5b9723654d9 100644 --- a/sql/field.h +++ b/sql/field.h @@ -1038,7 +1038,9 @@ public: class Send_field { public: - const char *table_name,*col_name; + const char *db_name; + const char *table_name,*org_table_name; + const char *col_name,*org_col_name; uint length,flags,decimals; enum_field_types type; Send_field() {} diff --git a/sql/item.cc b/sql/item.cc index 45564bcd98e..d01a06e5eba 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -287,6 +287,140 @@ String *Item_null::val_str(String *str) { null_value=1; return 0;} +/* Item_param related */ +void Item_param::set_null() +{ + maybe_null=null_value=1; +} + +void Item_param::set_int(longlong i) +{ + int_value=(longlong)i; + item_result_type = INT_RESULT; + item_type = INT_ITEM; +} + +void Item_param::set_double(double i) +{ + double value = (double)i; + real_value=value; + item_result_type = REAL_RESULT; + item_type = REAL_ITEM; +} + +void Item_param::set_double(float i) +{ + float value = (float)i; + real_value=(double)value; + item_result_type = REAL_RESULT; + item_type = REAL_ITEM; +} + +void Item_param::set_value(const char *str, uint length) +{ + str_value.set(str,length,default_charset_info); + item_result_type = STRING_RESULT; + item_type = STRING_ITEM; +} + +void Item_param::set_longdata(const char *str, ulong length) +{ + /* TODO: Fix this for binary handling by making use of + buffer_type.. + */ + str_value.append(str,length); +} + +void Item_param::set_long_end() +{ + long_data_supplied = true; + item_result_type = STRING_RESULT; +}; + +bool Item_param::save_in_field(Field *field) +{ + if (null_value) + return set_field_to_null(field); + + field->set_notnull(); + if (item_result_type == INT_RESULT) + { + longlong nr=val_int(); + field->store(nr); + return 0; + } + if (item_result_type == REAL_RESULT) + { + double nr=val(); + field->store(nr); + return 0; + } + String *result; + CHARSET_INFO *cs=default_charset_info;//fix this + result=val_str(&str_value); + field->store(result->ptr(),result->length(),cs); + return 0; +} + +void Item_param::make_field(Send_field *tmp_field) +{ + init_make_field(tmp_field,FIELD_TYPE_STRING); +} + +double Item_param::val() +{ + /* Cross check whether we need need this conversions ? or direct + return(real_value) is enough ? + */ + + switch(item_result_type) { + + case STRING_RESULT: + return (double)atof(str_value.ptr()); + case INT_RESULT: + return (double)int_value; + default: + return real_value; + } +} + +longlong Item_param::val_int() +{ + /* Cross check whether we need need this conversions ? or direct + return(int_value) is enough ? + */ + + switch(item_result_type) { + + case STRING_RESULT: + return (longlong)strtoll(str_value.ptr(),(char**) 0,10); + case REAL_RESULT: + return (longlong) (real_value+(real_value > 0 ? 0.5 : -0.5)); + default: + return int_value; + } +} + +String *Item_param::val_str(String* str) +{ + /* Cross check whether we need need this conversions ? or direct + return(&str_value) is enough ? + */ + + switch(item_result_type) { + + case INT_RESULT: + str->set(int_value); + return str; + case REAL_RESULT: + str->set(real_value); + return str; + default: + return (String*) &str_value; + } +} +/* End of Item_param related */ + void Item_copy_string::copy() { String *res=item->val_str(&str_value); @@ -373,7 +507,10 @@ bool Item_field::fix_fields(THD *thd,TABLE_LIST *tables) void Item::init_make_field(Send_field *tmp_field, enum enum_field_types field_type) -{ +{ + tmp_field->db_name=(char*) ""; + tmp_field->org_table_name=(char*) ""; + tmp_field->org_col_name=(char*) ""; tmp_field->table_name=(char*) ""; tmp_field->col_name=name; tmp_field->flags=maybe_null ? 0 : NOT_NULL_FLAG; diff --git a/sql/item.h b/sql/item.h index 8e8b44a5006..e6debdf2afc 100644 --- a/sql/item.h +++ b/sql/item.h @@ -155,6 +155,40 @@ public: bool is_null() { return 1; } }; +class Item_param :public Item +{ +public: + longlong int_value; + double real_value; + enum Item_result item_result_type; + enum Type item_type; + enum enum_field_types buffer_type; + my_bool long_data_supplied; + + Item_param(char *name_par=0){ + name= name_par ? name_par : (char*) "?"; + long_data_supplied = false; + item_type = STRING_ITEM; item_result_type = STRING_RESULT; + } + enum Type type() const { return item_type; } + double val(); + longlong val_int(); + String *val_str(String*); + void make_field(Send_field *field); + bool save_in_field(Field *field); + void set_null(); + void set_int(longlong i); + void set_double(float i); + void set_double(double i); + void set_value(const char *str, uint length); + void set_long_str(const char *str, ulong length); + void set_long_binary(const char *str, ulong length); + void set_longdata(const char *str, ulong length); + void set_long_end(); + enum Item_result result_type () const + { return item_result_type; } + Item *new_item() { return new Item_param(name); } +}; class Item_int :public Item { diff --git a/sql/item_sum.cc b/sql/item_sum.cc index a1ffae2ed82..6ef968c33f7 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -60,8 +60,9 @@ void Item_sum::make_field(Send_field *tmp_field) result_type() == REAL_RESULT ? FIELD_TYPE_DOUBLE : FIELD_TYPE_VAR_STRING); } - tmp_field->table_name=(char*)""; - tmp_field->col_name=name; + tmp_field->db_name=(char*)""; + tmp_field->org_table_name=tmp_field->table_name=(char*)""; + tmp_field->org_col_name=tmp_field->col_name=name; } void Item_sum::print(String *str) diff --git a/sql/lex.h b/sql/lex.h index dd1a69f9c83..da0a71a135e 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -129,6 +129,7 @@ static SYMBOL symbols[] = { { "DROP", SYM(DROP),0,0}, { "DUMPFILE", SYM(DUMPFILE),0,0}, { "DYNAMIC", SYM(DYNAMIC_SYM),0,0}, + { "ERRORS", SYM(ERRORS),0,0}, { "END", SYM(END),0,0}, { "ELSE", SYM(ELSE),0,0}, { "ESCAPE", SYM(ESCAPE_SYM),0,0}, @@ -327,6 +328,7 @@ static SYMBOL symbols[] = { { "SQL_BUFFER_RESULT", SYM(SQL_BUFFER_RESULT),0,0}, { "SQL_CACHE", SYM(SQL_CACHE_SYM), 0, 0}, { "SQL_CALC_FOUND_ROWS", SYM(SQL_CALC_FOUND_ROWS),0,0}, + { "SQL_ERROR_COUNT", SYM(SQL_ERROR_COUNT),0,0}, { "SQL_LOG_BIN", SYM(SQL_LOG_BIN),0,0}, { "SQL_LOG_OFF", SYM(SQL_LOG_OFF),0,0}, { "SQL_LOG_UPDATE", SYM(SQL_LOG_UPDATE),0,0}, @@ -366,6 +368,7 @@ static SYMBOL symbols[] = { { "TRUNCATE", SYM(TRUNCATE_SYM),0,0}, { "TO", SYM(TO_SYM),0,0}, { "TYPE", SYM(TYPE_SYM),0,0}, + { "TYPES", SYM(TYPES_SYM),0,0}, { "UNCOMMITTED", SYM(UNCOMMITTED_SYM),0,0}, { "UNION", SYM(UNION_SYM),0,0}, { "UNIQUE", SYM(UNIQUE_SYM),0,0}, @@ -381,6 +384,7 @@ static SYMBOL symbols[] = { { "VARIABLES", SYM(VARIABLES),0,0}, { "VARYING", SYM(VARYING),0,0}, { "VARBINARY", SYM(VARBINARY),0,0}, + { "WARNINGS", SYM(WARNINGS),0,0}, { "WITH", SYM(WITH),0,0}, { "WORK", SYM(WORK_SYM),0,0}, { "WRITE", SYM(WRITE_SYM),0,0}, diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 268a452095e..011b7823dd0 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -287,6 +287,8 @@ inline THD *_current_thd(void) #define query_cache_invalidate_by_MyISAM_filename_ref NULL #endif /*HAVE_QUERY_CACHE*/ +#define prepare_execute(A) ((A)->command == COM_EXECUTE) + int mysql_create_db(THD *thd, char *db, uint create_info, bool silent); int mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent); void mysql_binlog_send(THD* thd, char* log_ident, ulong pos, ushort flags); @@ -363,6 +365,8 @@ bool net_store_data(String *packet, CONVERT *convert, const char *from); SORT_FIELD * make_unireg_sortorder(ORDER *order, uint *length); int setup_order(THD *thd,TABLE_LIST *tables, List &fields, List &all_fields, ORDER *order); +int setup_group(THD *thd,TABLE_LIST *tables,List &fields, + List &all_fields, ORDER *order, bool *hidden_group_fields); int handle_select(THD *thd, LEX *lex, select_result *result); int mysql_select(THD *thd,TABLE_LIST *tables,List &list,COND *conds, @@ -455,7 +459,7 @@ bool load_des_key_file(const char *file_name); /* sql_do.cc */ int mysql_do(THD *thd, List &values); -/* sql_list.c */ +/* sql_show.c */ int mysqld_show_dbs(THD *thd,const char *wild); int mysqld_show_open_tables(THD *thd,const char *wild); int mysqld_show_tables(THD *thd,const char *db,const char *wild); @@ -473,6 +477,24 @@ int mysqld_show_status(THD *thd); int mysqld_show_variables(THD *thd,const char *wild); int mysqld_show(THD *thd, const char *wild, show_var_st *variables); int mysqld_show_charsets(THD *thd,const char *wild); +int mysqld_show_privileges(THD *thd); +int mysqld_show_column_types(THD *thd); + +/* sql_prepare.cc */ +void mysql_com_prepare(THD *thd,char*packet,uint packet_length); +void mysql_init_query(THD *thd);/* sql_parse. cc */ +void mysql_com_execute(THD *thd); +void mysql_com_longdata(THD *thd); +int check_insert_fields(THD *thd,TABLE *table,List &fields, + List &values, ulong counter); + +/* sql_error.cc */ +void push_error(uint code, const char *msg); +void push_warning(uint code, const char *msg); +int mysqld_show_warnings(THD *thd); +int mysqld_show_errors(THD *thd); +int mysqld_show_warnings_count(THD *thd); +int mysqld_show_errors_count(THD *); /* sql_handler.cc */ int mysql_ha_open(THD *thd, TABLE_LIST *tables); @@ -654,6 +676,10 @@ extern const char *default_tx_isolation_name; extern String empty_string; extern struct show_var_st init_vars[]; extern struct show_var_st status_vars[]; +extern struct show_table_type_st table_type_vars[]; +extern SHOW_COMP_OPTION have_isam; +extern SHOW_COMP_OPTION have_innodb; +extern SHOW_COMP_OPTION have_berkeley_db; extern enum db_type default_table_type; extern enum enum_tx_isolation default_tx_isolation; extern char glob_hostname[FN_REFLEN]; diff --git a/sql/net_pkg.cc b/sql/net_pkg.cc index a201651fc2f..fa3abc68bfa 100644 --- a/sql/net_pkg.cc +++ b/sql/net_pkg.cc @@ -48,6 +48,7 @@ void send_error(NET *net, uint sql_errno, const char *err) } } } + push_error(sql_errno, err); if (net->vio == 0) { if (thd && thd->bootstrap) @@ -82,7 +83,14 @@ void send_error(NET *net, uint sql_errno, const char *err) void send_warning(NET *net, uint sql_errno, const char *err) { - DBUG_ENTER("send_warning"); + DBUG_ENTER("send_warning"); + push_warning(sql_errno, err ? err : ER(sql_errno)); + + /* + TODO : + Try to return ok with warning status to client, instead + of returning error .. + */ send_error(net,sql_errno,err); DBUG_VOID_RETURN; } @@ -123,6 +131,7 @@ net_printf(NET *net, uint errcode, ...) length=sizeof(net->last_error)-1; /* purecov: inspected */ va_end(args); + push_error(errcode, text_pos); if (net->vio == 0) { if (thd && thd->bootstrap) diff --git a/sql/sql_base.cc b/sql/sql_base.cc index c9ef64b6da9..92606716c63 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -179,56 +179,58 @@ OPEN_TABLE_LIST *list_open_tables(THD *thd, const char *wild) DBUG_RETURN(open_list); } - -/****************************************************************************** -** Send name and type of result to client. -** Sum fields has table name empty and field_name. -** flag is a bit mask with the following functions: -** 1 send number of rows -** 2 send default values -** 4 Don't convert field names -******************************************************************************/ +/* + Send name and type of result to client. + Sum fields has table name empty and field_name. + flag is a bit mask with the following functions: + 1 send number of rows + 2 send default values + 4 Don't convert field names +*/ bool -send_fields(THD *thd,List &list,uint flag) +send_convert_fields(THD *thd,List &list,CONVERT *convert,uint flag) { List_iterator_fast it(list); Item *item; char buff[80]; - CONVERT *convert= (flag & 4) ? (CONVERT*) 0 : thd->convert_set; - DBUG_ENTER("send_fields"); - + String tmp((char*) buff,sizeof(buff),default_charset_info); String *res,*packet= &thd->packet; - - if (thd->fatal_error) // We have got an error - goto err; - - if (flag & 1) - { // Packet with number of elements - char *pos=net_store_length(buff,(uint) list.elements); - (void) my_net_write(&thd->net, buff,(uint) (pos-buff)); - } + while ((item=it++)) { char *pos; Send_field field; item->make_field(&field); + packet->length(0); - if (convert) + if (thd->client_capabilities & CLIENT_PROTOCOL_41) { - if (convert->store(packet,field.table_name, + if (convert->store(packet,field.db_name, + (uint) strlen(field.db_name)) || + convert->store(packet,field.table_name, (uint) strlen(field.table_name)) || + convert->store(packet,field.org_table_name, + (uint) strlen(field.org_table_name)) || convert->store(packet,field.col_name, (uint) strlen(field.col_name)) || + convert->store(packet,field.org_col_name, + (uint) strlen(field.org_col_name)) || packet->realloc(packet->length()+10)) - goto err; + return 1; + } + else + { + if (convert->store(packet,field.table_name, + (uint) strlen(field.table_name)) || + convert->store(packet,field.col_name, + (uint) strlen(field.col_name)) || + packet->realloc(packet->length()+10)) + return 1; } - else if (net_store_data(packet,field.table_name) || - net_store_data(packet,field.col_name) || - packet->realloc(packet->length()+10)) - goto err; /* purecov: inspected */ + pos= (char*) packet->ptr()+packet->length(); if (!(thd->client_capabilities & CLIENT_LONG_FLAG)) @@ -250,19 +252,135 @@ send_fields(THD *thd,List &list,uint flag) if (!(res=item->val_str(&tmp))) { if (net_store_null(packet)) - goto err; + return 1; } else if (net_store_data(packet,res->ptr(),res->length())) - goto err; + return 1; } if (my_net_write(&thd->net, (char*) packet->ptr(),packet->length())) break; /* purecov: inspected */ } - send_eof(&thd->net,1); - DBUG_RETURN(0); - err: + return 0; +} + +/* + Send name and type of result to client. + Sum fields has table name empty and field_name + flag is a bit mask with the following functios: + 1 send number of rows + 2 send default values + 4 Don't convert field names +*/ + +bool +send_non_convert_fields(THD *thd,List &list,uint flag) +{ + List_iterator_fast it(list); + Item *item; + char buff[80]; + + String tmp((char*) buff,sizeof(buff),default_charset_info); + String *res,*packet= &thd->packet; + + while ((item=it++)) + { + char *pos; + Send_field field; + item->make_field(&field); + + packet->length(0); + + if (thd->client_capabilities & CLIENT_PROTOCOL_41) + { + if (net_store_data(packet,field.db_name) || + net_store_data(packet,field.table_name) || + net_store_data(packet,field.org_table_name) || + net_store_data(packet,field.col_name) || + net_store_data(packet,field.org_col_name) || + packet->realloc(packet->length()+10)) + return 1; + } + else + { + if (net_store_data(packet,field.table_name) || + net_store_data(packet,field.col_name) || + packet->realloc(packet->length()+10)) + return 1; + } + + pos= (char*) packet->ptr()+packet->length(); + + if (!(thd->client_capabilities & CLIENT_LONG_FLAG)) + { + packet->length(packet->length()+9); + pos[0]=3; int3store(pos+1,field.length); + pos[4]=1; pos[5]=field.type; + pos[6]=2; pos[7]=(char) field.flags; pos[8]= (char) field.decimals; + } + else + { + packet->length(packet->length()+10); + pos[0]=3; int3store(pos+1,field.length); + pos[4]=1; pos[5]=field.type; + pos[6]=3; int2store(pos+7,field.flags); pos[9]= (char) field.decimals; + } + if (flag & 2) + { // Send default value + if (!(res=item->val_str(&tmp))) + { + if (net_store_null(packet)) + return 1; + } + else if (net_store_data(packet,res->ptr(),res->length())) + return 1; + } + if (my_net_write(&thd->net, (char*) packet->ptr(),packet->length())) + break; + } + return 0; +} + +/****************************************************************************** +** Send name and type of result to client. +** Sum fields has table name empty and field_name. +** flag is a bit mask with the following functions: +** 1 send number of rows +** 2 send default values +** 4 Don't convert field names +******************************************************************************/ + +bool +send_fields(THD *thd,List &list,uint flag) +{ + List_iterator_fast it(list); + char buff[80]; + CONVERT *convert= (flag & 4) ? (CONVERT*) 0 : thd->convert_set; + + String tmp((char*) buff,sizeof(buff),default_charset_info); + + if (thd->fatal_error) // We have got an error + goto err; + + if (flag & 1) + { // Packet with number of elements + char *pos=net_store_length(buff,(uint) list.elements); + (void) my_net_write(&thd->net, buff,(uint) (pos-buff)); + } + + /* Avoid check conditions on convert() for each field + by having two diffrent functions + */ + if (convert && send_convert_fields(thd,list,convert,flag)) + goto err; + + else if(send_non_convert_fields(thd,list,flag)) + goto err; + + send_eof(&thd->net); + return 0; +err: send_error(&thd->net,ER_OUT_OF_RESOURCES); /* purecov: inspected */ - DBUG_RETURN(1); /* purecov: inspected */ + return 1; /* purecov: inspected */ } diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 86e4e6896e6..f91c508e8af 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -140,6 +140,7 @@ THD::THD():user_time(0),fatal_error(0),last_insert_id_used(0), command=COM_CONNECT; set_query_id=1; default_select_limit= HA_POS_ERROR; + max_error_count=max_warning_count=MYSQL_DEFAULT_ERROR_COUNT; max_join_size= ((::max_join_size != ~ (ulong) 0L) ? ::max_join_size : HA_POS_ERROR); db_access=NO_ACCESS; @@ -147,6 +148,7 @@ THD::THD():user_time(0),fatal_error(0),last_insert_id_used(0), /* Initialize sub structures */ bzero((char*) &mem_root,sizeof(mem_root)); bzero((char*) &transaction.mem_root,sizeof(transaction.mem_root)); + bzero((char*) &con_root,sizeof(con_root)); user_connect=(USER_CONN *)0; hash_init(&user_vars, system_charset_info, USER_VARS_HASH_SIZE, 0, 0, (hash_get_key) get_var_key, @@ -223,6 +225,7 @@ THD::~THD() safeFree(db); safeFree(ip); free_root(&mem_root,MYF(0)); + free_root(&con_root,MYF(0)); free_root(&transaction.mem_root,MYF(0)); mysys_var=0; // Safety (shouldn't be needed) #ifdef SIGNAL_WITH_VIO_CLOSE diff --git a/sql/sql_class.h b/sql/sql_class.h index 8a1a299ceee..016df485245 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -289,7 +289,30 @@ public: i_string_pair():key(0),val(0) { } i_string_pair(char* key_arg, char* val_arg) : key(key_arg),val(val_arg) {} }; +#define MYSQL_DEFAULT_ERROR_COUNT 500 +class mysql_st_error +{ +public: + uint code; + char msg[MYSQL_ERRMSG_SIZE+1]; + char query[NAME_LEN+1]; + + static void *operator new(size_t size) + { + return (void*)my_malloc((uint)size, MYF(MY_WME | MY_FAE)); + } + static void operator delete(void* ptr_arg, size_t size) + { + my_free((gptr)ptr_arg, MYF(MY_WME|MY_ALLOW_ZERO_PTR)); + } + mysql_st_error(uint ecode, const char *emsg, const char *equery) + { + code = ecode; + strmov(msg, emsg); + strnmov(query, equery ? equery : "", NAME_LEN); + } +}; class delayed_insert; @@ -308,6 +331,7 @@ public: NET net; // client connection descriptor LEX lex; // parse tree descriptor MEM_ROOT mem_root; // 1 command-life memory + MEM_ROOT con_root; // connection-life memory HASH user_vars; // hash for user variables String packet; // buffer used for network I/O struct sockaddr_in remote; // client socket address @@ -410,7 +434,8 @@ public: max_join_size, sent_row_count, examined_row_count; table_map used_tables; USER_CONN *user_connect; - ulong query_id,version, inactive_timeout,options,thread_id; + ulong query_id,version, inactive_timeout,options,thread_id, + max_error_count, max_warning_count; long dbug_thread_id; pthread_t real_id; uint current_tablenr,tmp_table,cond_count,col_access; @@ -428,8 +453,13 @@ public: bool query_error, bootstrap, cleanup_done; bool safe_to_cache_query; bool volatile killed; - // TRUE when having fix field called - bool having_fix_field; + bool having_fix_field; //TRUE when having fix field called + bool prepare_command; + ulong param_count,current_param_number; + Error err_list; + Error warn_list; + Item_param *current_param; + /* If we do a purge of binary logs, log index info of the threads that are currently reading it needs to be adjusted. To do that diff --git a/sql/sql_error.cc b/sql/sql_error.cc new file mode 100644 index 00000000000..13466f454c5 --- /dev/null +++ b/sql/sql_error.cc @@ -0,0 +1,219 @@ +/* Copyright (C) 1995-2002 MySQL AB + + 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; either version 2 of the License, or + (at your option) any later version. + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +/********************************************************************** +This file contains the implementation of error and warnings related + + - Whenever an error or warning occured, it pushes the same to + the respective list along with sending it to client. + + - When client requests the information using SHOW command, then + server processes from this list and returns back in the form of + resultset. + + syntax : SHOW [COUNT(*)] ERRORS [LIMIT [offset,] rows] + SHOW [COUNT(*)] WARNINGS [LIMIT [offset,] rows] + +***********************************************************************/ +/* Handles errors and warnings .. */ + +#include "mysql_priv.h" + +/* + Push the error to error list +*/ + +void push_error(uint code, const char *msg) +{ + THD *thd=current_thd; + + mysql_st_error *err = new mysql_st_error(code,msg,(const char*)thd->query); + + if (thd->err_list.elements >= thd->max_error_count) + { + /* Remove the old elements and always maintain the max size + equal to sql_error_count. + + If one max_error_count using sets sql_error_count less than + the current list size, then make sure it always grows upto + sql_error_count size only + + ** BUG ** : Doesn't work in removing the old one + from the list, and thus SET SQL_ERROR_COUNT=x doesn't work + */ + for (uint count=thd->err_list.elements-1; + count <= thd->max_error_count-1; count++) + { + thd->err_list.remove_last(); + } + } + thd->err_list.push_front(err); +} + +/* + Push the warning to warning list +*/ + +void push_warning(uint code, const char *msg) +{ + THD *thd=current_thd; + + mysql_st_error *warn = new mysql_st_error(code,msg,(const char *)thd->query); + + if (thd->warn_list.elements >= thd->max_warning_count) + { + /* Remove the old elements and always maintian the max size + equal to sql_error_count + */ + for (uint count=thd->warn_list.elements; + count <= thd->max_warning_count-1; count++) + { + thd->warn_list.remove_last(); + } + } + thd->warn_list.push_front(warn); +} + +/* + List all errors +*/ + +int mysqld_show_errors(THD *thd) +{ + List field_list; + DBUG_ENTER("mysqld_show_errors"); + + field_list.push_back(new Item_int("CODE",0,4)); + field_list.push_back(new Item_empty_string("MESSAGE",MYSQL_ERRMSG_SIZE)); + field_list.push_back(new Item_empty_string("QUERY",NAME_LEN)); + + if (send_fields(thd,field_list,1)) + DBUG_RETURN(1); + + mysql_st_error *err; + SELECT_LEX *sel=&thd->lex.select_lex; + ha_rows offset = sel->offset_limit,limit = sel->select_limit; + uint num_rows = 0; + + Error_iterator it(thd->err_list); + + while(offset-- && (err = it++));/* Should be fixed with overloaded + operator '+' or with new funtion + goto() in list ? + */ + + while((num_rows++ < limit) && (err = it++)) + { + thd->packet.length(0); + net_store_data(&thd->packet,(uint32)err->code); + net_store_data(&thd->packet,err->msg); + net_store_data(&thd->packet,err->query); + + if (my_net_write(&thd->net,(char*)thd->packet.ptr(),thd->packet.length())) + DBUG_RETURN(-1); + } + send_eof(&thd->net); + DBUG_RETURN(0); +} + +/* + Return errors count +*/ + +int mysqld_show_errors_count(THD *thd) +{ + List field_list; + DBUG_ENTER("mysqld_show_errors_count"); + + field_list.push_back(new Item_int("COUNT(*)",0,4)); + + if (send_fields(thd,field_list,1)) + DBUG_RETURN(1); + + thd->packet.length(0); + net_store_data(&thd->packet,(uint32)thd->err_list.elements); + + if (my_net_write(&thd->net,(char*) thd->packet.ptr(),thd->packet.length())) + DBUG_RETURN(-1); + + send_eof(&thd->net); + DBUG_RETURN(0); +} + +/* + List all warnings +*/ + +int mysqld_show_warnings(THD *thd) +{ + List field_list; + DBUG_ENTER("mysqld_show_warnings"); + + field_list.push_back(new Item_int("CODE",0,21)); + field_list.push_back(new Item_empty_string("MESSAGE",MYSQL_ERRMSG_SIZE)); + field_list.push_back(new Item_empty_string("QUERY",NAME_LEN)); + + if (send_fields(thd,field_list,1)) + DBUG_RETURN(1); + + mysql_st_error *warn; + + + SELECT_LEX *sel=&thd->lex.select_lex; + ha_rows offset = sel->offset_limit,limit = sel->select_limit; + uint num_rows = 0; + + Error_iterator it(thd->warn_list); + while(offset-- && (warn = it++)); + while((num_rows++ < limit) && (warn = it++)) + { + thd->packet.length(0); + net_store_data(&thd->packet,(uint32)warn->code); + net_store_data(&thd->packet,warn->msg); + net_store_data(&thd->packet,warn->query); + + if (my_net_write(&thd->net,(char*) thd->packet.ptr(),thd->packet.length())) + DBUG_RETURN(-1); + } + send_eof(&thd->net); + DBUG_RETURN(0); +} + +/* + Return warnings count +*/ + +int mysqld_show_warnings_count(THD *thd) +{ + List field_list; + DBUG_ENTER("mysqld_show_warnings_count"); + + field_list.push_back(new Item_int("COUNT(*)",0,21)); + + if (send_fields(thd,field_list,1)) + DBUG_RETURN(1); + + thd->packet.length(0); + net_store_data(&thd->packet,(uint32)thd->warn_list.elements); + + if (my_net_write(&thd->net,(char*)thd->packet.ptr(),thd->packet.length())) + DBUG_RETURN(-1); + + send_eof(&thd->net); + DBUG_RETURN(0); +} + diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index c181e299d05..c3aeca1fff8 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -44,7 +44,7 @@ static void unlink_blobs(register TABLE *table); Resets form->time_stamp if a timestamp value is set */ -static int +int check_insert_fields(THD *thd,TABLE *table,List &fields, List &values, ulong counter) { diff --git a/sql/sql_lex.h b/sql/sql_lex.h index ee0209f9329..ca824b3eab8 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -57,8 +57,10 @@ enum enum_sql_command { SQLCOM_HA_OPEN, SQLCOM_HA_CLOSE, SQLCOM_HA_READ, SQLCOM_SHOW_SLAVE_HOSTS, SQLCOM_DELETE_MULTI, SQLCOM_MULTI_UPDATE, SQLCOM_SHOW_BINLOG_EVENTS, SQLCOM_SHOW_NEW_MASTER, SQLCOM_DO, - SQLCOM_EMPTY_QUERY, - SQLCOM_END + SQLCOM_END, SQLCOM_SHOW_WARNS, SQLCOM_SHOW_WARNS_COUNT, + SQLCOM_EMPTY_QUERY, SQLCOM_SHOW_ERRORS, + SQLCOM_SHOW_ERRORS_COUNT, SQLCOM_SHOW_COLUMN_TYPES, + SQLCOM_SHOW_TABLE_TYPES, SQLCOM_SHOW_PRIVILEGES }; enum lex_states { STATE_START, STATE_CHAR, STATE_IDENT, @@ -318,6 +320,7 @@ typedef struct st_lex { List *insert_list,field_list,value_list; List many_values; List option_list; + List param_list; SQL_LIST proc_list, auxilliary_table_list; TYPELIB *interval; create_field *last_field; diff --git a/sql/sql_list.h b/sql/sql_list.h index 542eef623f0..541db4ec166 100644 --- a/sql/sql_list.h +++ b/sql/sql_list.h @@ -122,11 +122,14 @@ public: last= &first; return tmp->info; } + inline list_node* last_node() { return *last; } + inline list_node* first_node() { return first;} inline void *head() { return first->info; } inline void **head_ref() { return first != &end_of_list ? &first->info : 0; } inline bool is_empty() { return first == &end_of_list ; } inline list_node *last_ref() { return &end_of_list; } friend class base_list_iterator; + friend class error_list; protected: void after(void *info,list_node *node) @@ -204,6 +207,7 @@ public: { return el == &list->last_ref()->next; } + friend class error_list_iterator; }; @@ -356,3 +360,120 @@ public: I_List_iterator(I_List &a) : base_ilist_iterator(a) {} inline T* operator++(int) { return (T*) base_ilist_iterator::next(); } }; + +/* + New error list without mem_root from THD, to have the life of the + allocation becomes connection level . by ovveriding new from Sql_alloc. +*/ +class Error_alloc +{ +public: + static void *operator new(size_t size) + { + return (void*)my_malloc((uint)size, MYF(MY_WME | MY_FAE)); + } +#if 0 + static void operator delete(void* ptr_arg, size_t size) + { + my_free((gptr)ptr_arg, MYF(MY_WME|MY_ALLOW_ZERO_PTR)); + } +#endif + friend class error_node; + friend class error_list; +}; + +class error_node :public Error_alloc, public list_node +{ +public: + static void *operator new(size_t size) + { + return (void*)my_malloc((uint)size, MYF(MY_WME | MY_FAE)); + } +#if 0 + static void operator delete(void* ptr_arg, size_t size) + { + my_free((gptr)ptr_arg, MYF(MY_WME|MY_ALLOW_ZERO_PTR)); + } +#endif + error_node(void *info_par,list_node *next_par):list_node(info_par,next_par){}; + error_node() : list_node() {}; + friend class error_list; + friend class error_list_iterator; +}; + +class error_list: public Error_alloc, public base_list +{ +public: + inline error_list() : base_list() { }; + inline error_list(const error_list &tmp) : Error_alloc() + { + elements=tmp.elements; + first=tmp.first; + last=tmp.last; + } + inline bool push_front(void *info) + { + error_node *node=new error_node(info,first); + if (node) + { + if (last == &first) + last= &node->next; + first=node; + elements++; + return 0; + } + return 1; + } + inline void remove_last(void) + { + remove(last); + } +protected: + void after(void *info,list_node *node) + { + error_node *new_node=new error_node(info,node->next); + node->next=new_node; + elements++; + if (last == &(node->next)) + last= &new_node->next; + } +}; + +class error_list_iterator : public base_list_iterator +{ + inline error_list_iterator(base_list &base_ptr): base_list_iterator(base_ptr) {}; +}; + +template class Error :public error_list +{ +public: + inline Error() :error_list() {} + inline Error(const Error &tmp) :error_list(tmp) {} + inline bool push_back(T *a) { return error_list::push_back(a); } + inline bool push_front(T *a) { return error_list::push_front(a); } + inline T* head() {return (T*) error_list::head(); } + inline T** head_ref() {return (T**) error_list::head_ref(); } + inline T* pop() {return (T*) error_list::pop(); } + void delete_elements(void) + { + error_node *element,*next; + for (element=first; element != &error_end_of_list; element=next) + { + next=element->next; + delete (T*) element->info; + } + empty(); + } +}; + +template class Error_iterator :public base_list_iterator +{ +public: + Error_iterator(Error &a) : base_list_iterator(a) {} + inline T* operator++(int) { return (T*) base_list_iterator::next(); } + inline T *replace(T *a) { return (T*) base_list_iterator::replace(a); } + inline T *replace(Error &a) { return (T*) base_list_iterator::replace(a); } + inline void after(T *a) { base_list_iterator::after(a); } + inline T** ref(void) { return (T**) base_list_iterator::ref(); } +}; + diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index a5d8aa3185e..70f50483114 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -65,7 +65,6 @@ static void decrease_user_connections(USER_CONN *uc); static bool check_db_used(THD *thd,TABLE_LIST *tables); static bool check_merge_table_access(THD *thd, char *db, TABLE_LIST *tables); static bool check_dup(const char *db, const char *name, TABLE_LIST *tables); -void mysql_init_query(THD *thd); static void remove_escape(char *name); static void refresh_status(void); static bool append_file_to_dir(THD *thd, char **filename_ptr, @@ -77,7 +76,8 @@ const char *command_name[]={ "Sleep", "Quit", "Init DB", "Query", "Field List", "Create DB", "Drop DB", "Refresh", "Shutdown", "Statistics", "Processlist", "Connect","Kill","Debug","Ping","Time","Delayed_insert","Change user", - "Binlog Dump","Table Dump", "Connect Out", "Register Slave" + "Binlog Dump","Table Dump", "Connect Out", "Register Slave", + "Prepare", "Prepare Execute", "Long Data" }; bool volatile abort_slave = 0; @@ -486,7 +486,7 @@ check_connections(THD *thd) { /* buff[] needs to big enough to hold the server_version variable */ char buff[SERVER_VERSION_LENGTH + SCRAMBLE_LENGTH+32],*end; - int client_flags = CLIENT_LONG_FLAG | CLIENT_CONNECT_WITH_DB; + int client_flags = CLIENT_LONG_FLAG | CLIENT_CONNECT_WITH_DB | CLIENT_PROTOCOL_41; if (opt_using_transactions) client_flags|=CLIENT_TRANSACTIONS; @@ -957,7 +957,21 @@ bool dispatch_command(enum enum_server_command command, THD *thd, thd->password=test(passwd[0]); break; } - + case COM_EXECUTE: + { + mysql_com_execute(thd); + break; + } + case COM_LONG_DATA: + { + mysql_com_longdata(thd); + break; + } + case COM_PREPARE: + { + mysql_com_prepare(thd,packet,packet_length); + break; + } case COM_QUERY: { packet_length--; // Remove end null @@ -1380,6 +1394,26 @@ mysql_execute_command(void) res = purge_master_logs(thd, lex->to_log); break; } + case SQLCOM_SHOW_WARNS_COUNT: + { + res = mysqld_show_warnings_count(thd); + break; + } + case SQLCOM_SHOW_WARNS: + { + res = mysqld_show_warnings(thd); + break; + } + case SQLCOM_SHOW_ERRORS_COUNT: + { + res = mysqld_show_errors_count(thd); + break; + } + case SQLCOM_SHOW_ERRORS: + { + res = mysqld_show_errors(thd); + break; + } case SQLCOM_SHOW_NEW_MASTER: { if (check_access(thd, FILE_ACL, any_db)) @@ -2048,6 +2082,15 @@ mysql_execute_command(void) mysqld_list_processes(thd,thd->master_access & PROCESS_ACL ? NullS : thd->priv_user,lex->verbose); break; + case SQLCOM_SHOW_TABLE_TYPES: + res= mysqld_show_table_types(thd); + break; + case SQLCOM_SHOW_PRIVILEGES: + res= mysqld_show_privileges(thd); + break; + case SQLCOM_SHOW_COLUMN_TYPES: + res= mysqld_show_column_types(thd); + break; case SQLCOM_SHOW_STATUS: res= mysqld_show(thd,(lex->wild ? lex->wild->ptr() : NullS),status_vars); break; @@ -2732,6 +2775,9 @@ mysql_init_query(THD *thd) thd->last_insert_id_used= thd->query_start_used= thd->insert_id_used=0; thd->sent_row_count= thd->examined_row_count= 0; thd->safe_to_cache_query= 1; + thd->param_count=0; + thd->prepare_command=false; + thd->lex.param_list.empty(); DBUG_VOID_RETURN; } diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc new file mode 100644 index 00000000000..d5896901935 --- /dev/null +++ b/sql/sql_prepare.cc @@ -0,0 +1,709 @@ +/* Copyright (C) 1995-2002 MySQL AB + + 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; either version 2 of the License, or + (at your option) any later version. + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +/********************************************************************** +This file contains the implementation of prepare and executes. + +Prepare: + + - Server gets the query from client with command 'COM_PREPARE' + - Parse the query and recognize any parameter markers '?' and + store its information list lex->param_list + - Without executing the query, return back to client the total + number of parameters along with result-set metadata information + (if any ) + +Prepare-execute: + + - Server gets the command 'COM_EXECUTE' to execute the + previously prepared query. + - If there is are any parameters, then replace the markers with the + data supplied by client with the following format: + [types_specified(0/1)][type][length][data] .. [type][length].. + - Execute the query without re-parsing and send back the results + to client + +Long data handling: + + - Server gets the long data in pieces with command type 'COM_LONG_DATA'. + - The packet recieved will have the format as: + [type_spec_exists][type][length][data] + - Checks if the type is specified by client, and if yes reads the type, + and stores the data in that format. + - If length == MYSQL_END_OF_DATA, then server sets up the data read ended. +***********************************************************************/ + +#include "mysql_priv.h" +#include "sql_acl.h" +#include // for DEBUG_ASSERT() +#include // for isspace() + +/**************************************************************************/ +extern int yyparse(void); +static ulong get_param_length(uchar **packet); +static uint get_buffer_type(uchar **packet); +static bool param_is_null(uchar **packet); +static bool setup_param_fields(THD *thd,List ¶ms); +static uchar* setup_param_field(Item_param *item_param, uchar *pos, uint buffer_type); +static void setup_longdata_field(Item_param *item_param, uchar *pos); +static bool setup_longdata(THD *thd,List ¶ms); +static void send_prepare_results(THD *thd); +static void mysql_parse_prepare_query(THD *thd,char *packet,uint length); +static bool mysql_send_insert_fields(THD *thd,TABLE_LIST *table_list, + List &fields, + List &values_list,thr_lock_type lock_type); +static bool mysql_test_insert_fields(THD *thd,TABLE_LIST *table_list, + List &fields, + List &values_list,thr_lock_type lock_type); +static bool mysql_test_upd_fields(THD *thd,TABLE_LIST *table_list, + List &fields, List &values, + COND *conds,thr_lock_type lock_type); +static bool mysql_test_select_fields(THD *thd, TABLE_LIST *tables, + List &fields, List &values, + COND *conds, ORDER *order, ORDER *group, + Item *having,thr_lock_type lock_type); +extern const char *any_db; +/**************************************************************************/ + +/* + Read the buffer type, this happens only first time +*/ + +static uint get_buffer_type(uchar **packet) +{ + reg1 uchar *pos= *packet; + (*packet)+= 2; + return (uint) uint2korr(pos); +} + +/* + Check for NULL param data +*/ + +static bool param_is_null(uchar **packet) +{ + reg1 uchar *pos= *packet; + if (*pos == 251) + { + (*packet)++; + return 1; + } + return 0; +} + +/* + Read the length of the parameter data and retun back to + caller by positing the pointer to param data +*/ + +static ulong get_param_length(uchar **packet) +{ + reg1 uchar *pos= *packet; + if (*pos < 251) + { + (*packet)++; + return (ulong) *pos; + } + if (*pos == 252) + { + (*packet)+=3; + return (ulong) uint2korr(pos+1); + } + if (*pos == 253) + { + (*packet)+=4; + return (ulong) uint3korr(pos+1); + } + (*packet)+=9; // Must be 254 when here + return (ulong) uint4korr(pos+1); +} + +/* + Read and return the data for parameters supplied by client +*/ + +static uchar* setup_param_field(Item_param *item_param, + uchar *pos, uint buffer_type) +{ + if (param_is_null(&pos)) + { + item_param->set_null(); + return(pos); + } + switch (buffer_type) + { + case FIELD_TYPE_TINY: + item_param->set_int((longlong)(*pos)); + pos += 1; + break; + case FIELD_TYPE_SHORT: + item_param->set_int((longlong)sint2korr(pos)); + pos += 2; + break; + case FIELD_TYPE_INT24: + item_param->set_int((longlong)sint4korr(pos)); + pos += 3; + break; + case FIELD_TYPE_LONG: + item_param->set_int((longlong)sint4korr(pos)); + pos += 4; + break; + case FIELD_TYPE_LONGLONG: + item_param->set_int((longlong)sint8korr(pos)); + pos += 8; + break; + case FIELD_TYPE_FLOAT: + float data; + float4get(data,pos); + item_param->set_double(data); + pos += 4; + break; + case FIELD_TYPE_DOUBLE: + double j; + float8get(j,pos) + item_param->set_double(j); + pos += 8; + break; + default: + { + ulong len=get_param_length(&pos); + item_param->set_value((const char*)pos,len); + pos+=len; + } + } + return(pos); +} + +/* + Update the parameter markers by reading the data + from client .. +*/ + +static bool setup_param_fields(THD *thd, List ¶ms) +{ + reg2 Item_param *item_param; + List_iterator it(params); + NET *net = &thd->net; + DBUG_ENTER("setup_param_fields"); + + ulong param_count=0; + uchar *pos=(uchar*)net->read_pos+1;// skip command type + + if(*pos++) // No types supplied, read only param data + { + while ((item_param=(Item_param *)it++) && + (param_count++ < thd->param_count)) + { + if (item_param->long_data_supplied) + continue; + + if (!(pos=setup_param_field(item_param,pos,item_param->buffer_type))) + DBUG_RETURN(1); + } + } + else // Types supplied, read and store it along with param data + { + while ((item_param=(Item_param *)it++) && + (param_count++ < thd->param_count)) + { + if (item_param->long_data_supplied) + continue; + + if (!(pos=setup_param_field(item_param,pos, + item_param->buffer_type=(enum_field_types)get_buffer_type(&pos)))) + DBUG_RETURN(1); + } + } + DBUG_RETURN(0); +} + +/* + Buffer the long data and update the flags +*/ + +static void setup_longdata_field(Item_param *item_param, uchar *pos) +{ + ulong len; + + if (!*pos++) + item_param->buffer_type=(enum_field_types)get_buffer_type(&pos); + + if (*pos == MYSQL_LONG_DATA_END) + item_param->set_long_end(); + + else + { + len = get_param_length(&pos); + item_param->set_longdata((const char *)pos, len); + } +} + +/* + Store the long data from client in pieces +*/ + +static bool setup_longdata(THD *thd, List ¶ms) +{ + NET *net=&thd->net; + List_iterator it(params); + DBUG_ENTER("setup_longdata"); + + uchar *pos=(uchar*)net->read_pos+1;// skip command type at first position + ulong param_number = get_param_length(&pos); + Item_param *item_param = thd->current_param; + + if (thd->current_param_number != param_number) + { + thd->current_param_number = param_number; + while (param_number--) /* TODO: + Change this loop by either having operator '+' + overloaded to point to desired 'item' or + add another memeber in list as 'goto' with + location count as parameter number, but what + is the best way to traverse ? + */ + { + it++; + } + thd->current_param = item_param = (Item_param *)it++; + } + setup_longdata_field(item_param,pos); + DBUG_RETURN(0); +} + + + +/* + Validates insert fields +*/ + +static int check_prepare_fields(THD *thd,TABLE *table, List &fields, + List &values, ulong counter) +{ + if (fields.elements == 0 && values.elements != 0) + { + if (values.elements != table->fields) + { + my_printf_error(ER_WRONG_VALUE_COUNT_ON_ROW, + ER(ER_WRONG_VALUE_COUNT_ON_ROW), + MYF(0),counter); + return -1; + } + } + else + { + if (fields.elements != values.elements) + { + my_printf_error(ER_WRONG_VALUE_COUNT_ON_ROW, + ER(ER_WRONG_VALUE_COUNT_ON_ROW), + MYF(0),counter); + return -1; + } + TABLE_LIST table_list; + bzero((char*) &table_list,sizeof(table_list)); + table_list.name=table->table_name; + table_list.table=table; + table_list.grant=table->grant; + + thd->dupp_field=0; + if (setup_tables(&table_list) || + setup_fields(thd,&table_list,fields,1,0,0)) + return -1; + if (thd->dupp_field) + { + my_error(ER_FIELD_SPECIFIED_TWICE,MYF(0), thd->dupp_field->field_name); + return -1; + } + } + return 0; +} + + +/* + Validate the following information for INSERT statement: + - field existance + - fields count + + If there is no column list spec exists, then update the field_list + with all columns from the table, and send fields info back to client +*/ + +static bool mysql_test_insert_fields(THD *thd, TABLE_LIST *table_list, + List &fields, + List &values_list, + thr_lock_type lock_type) +{ + TABLE *table; + List_iterator_fast its(values_list); + List_item *values; + DBUG_ENTER("mysql_test_insert_fields"); + + if (!(table = open_ltable(thd,table_list,lock_type))) + DBUG_RETURN(1); + + if ((values= its++)) + { + uint value_count; + ulong counter=0; + + if (check_insert_fields(thd,table,fields,*values,1)) + DBUG_RETURN(1); + + value_count= values->elements; + its.rewind(); + + while ((values = its++)) + { + counter++; + if (values->elements != value_count) + { + my_printf_error(ER_WRONG_VALUE_COUNT_ON_ROW, + ER(ER_WRONG_VALUE_COUNT_ON_ROW), + MYF(0),counter); + DBUG_RETURN(1); + } + } + if (fields.elements == 0) + { + /* No field listing, so setup all fields */ + List all_fields; + Field **ptr,*field; + for (ptr=table->field; (field= *ptr) ; ptr++) + { + all_fields.push_back(new Item_field(table->table_cache_key, + table->real_name, + field->field_name)); + } + if ((setup_fields(thd,table_list,all_fields,1,0,0) || + send_fields(thd,all_fields,1))) + DBUG_RETURN(1); + } + else if (send_fields(thd,fields,1)) + DBUG_RETURN(1); + } + DBUG_RETURN(0); +} + + +/* + Validate the following information + UPDATE - set and where clause DELETE - where clause + + And send update-set cluase column list fields info + back to client. For DELETE, just validate where cluase + and return no fields information back to client. +*/ + +static bool mysql_test_upd_fields(THD *thd, TABLE_LIST *table_list, + List &fields, List &values, + COND *conds, thr_lock_type lock_type) +{ + TABLE *table; + DBUG_ENTER("mysql_test_upd_fields"); + + if (!(table = open_ltable(thd,table_list,lock_type))) + DBUG_RETURN(1); + + if (setup_tables(table_list) || setup_fields(thd,table_list,fields,1,0,0) || + setup_conds(thd,table_list,&conds)) + DBUG_RETURN(1); + + /* + Currently return only column list info only, and we are not + sending any info on where clause. + */ + if (fields.elements && send_fields(thd,fields,1)) + DBUG_RETURN(1); + + DBUG_RETURN(0); +} + +/* + Validate the following information: + + SELECT - column list + - where clause + - orderr clause + - having clause + - group by clause + - if no column spec i.e. '*', then setup all fields + + And send column list fields info back to client. +*/ + +static bool mysql_test_select_fields(THD *thd, TABLE_LIST *tables, + List &fields, List &values, + COND *conds, ORDER *order, ORDER *group, + Item *having,thr_lock_type lock_type) +{ + TABLE *table; + bool hidden_group_fields; + List all_fields(fields); + DBUG_ENTER("mysql_test_select_fields"); + + if (!(table = open_ltable(thd,tables,lock_type))) + DBUG_RETURN(1); + + thd->used_tables=0; // Updated by setup_fields + if (setup_tables(tables) || + setup_fields(thd,tables,fields,1,&all_fields,1) || + setup_conds(thd,tables,&conds) || + setup_order(thd,tables,fields,all_fields,order) || + setup_group(thd,tables,fields,all_fields,group,&hidden_group_fields)) + DBUG_RETURN(1); + + if (having) + { + thd->where="having clause"; + thd->allow_sum_func=1; + if (having->fix_fields(thd,tables) || thd->fatal_error) + DBUG_RETURN(1); + if (having->with_sum_func) + having->split_sum_func(all_fields); + } + if (setup_ftfuncs(thd)) + DBUG_RETURN(1); + + /* + Currently return only column list info only, and we are not + sending any info on where clause. + */ + if (fields.elements && send_fields(thd,fields,1)) + DBUG_RETURN(1); + DBUG_RETURN(0); +} + +/* + Check the access privileges +*/ + +static bool check_prepare_access(THD *thd, TABLE_LIST *tables, + uint type) +{ + if (check_access(thd,type,tables->db,&tables->grant.privilege)) + return 1; + if (grant_option && check_grant(thd,type,tables)) + return 1; + return 0; +} + +/* + Send the prepare query results back to client +*/ + +static void send_prepare_results(THD *thd) +{ + DBUG_ENTER("send_prepare_results"); + enum enum_sql_command sql_command = thd->lex.sql_command; + + DBUG_PRINT("enter",("command :%d, param_count :%ld", + sql_command,thd->param_count)); + + LEX *lex=&thd->lex; + SELECT_LEX *select_lex = lex->select; + TABLE_LIST *tables=(TABLE_LIST*) select_lex->table_list.first; + + switch(sql_command) { + + case SQLCOM_INSERT: + if (mysql_test_insert_fields(thd,tables, lex->field_list, + lex->many_values, lex->lock_option)) + goto abort; + break; + + case SQLCOM_UPDATE: + if (mysql_test_upd_fields(thd,tables, select_lex->item_list, + lex->value_list, select_lex->where, + lex->lock_option)) + goto abort; + break; + + case SQLCOM_DELETE: + if (mysql_test_upd_fields(thd,tables, select_lex->item_list, + lex->value_list, select_lex->where, + lex->lock_option)) + goto abort; + break; + + case SQLCOM_SELECT: + if (mysql_test_select_fields(thd,tables, select_lex->item_list, + lex->value_list, select_lex->where, + (ORDER*) select_lex->order_list.first, + (ORDER*) select_lex->group_list.first, + select_lex->having, lex->lock_option)) + goto abort; + break; + + default: + { + /* + Rest fall through to default category, no parsing + for non-DML statements + */ + } + } + send_ok(&thd->net,thd->param_count,0); + DBUG_VOID_RETURN; + +abort: + send_error(&thd->net,thd->killed ? ER_SERVER_SHUTDOWN : 0); + DBUG_VOID_RETURN; +} + +/* + Parse the prepare query +*/ + +static void mysql_parse_prepare_query(THD *thd, char *packet, uint length) +{ + DBUG_ENTER("mysql_parse_prepare_query"); + + mysql_log.write(thd,COM_PREPARE,"%s",packet); + mysql_init_query(thd); + thd->prepare_command=true; + + if (query_cache.send_result_to_client(thd, packet, length) <= 0) + { + LEX *lex=lex_start(thd, (uchar*)packet, length); + + if (!yyparse() && !thd->fatal_error) + { + send_prepare_results(thd); + query_cache_end_of_result(&thd->net); + } + else + query_cache_abort(&thd->net); + lex_end(lex); + } + DBUG_VOID_RETURN; +} + +/* + Parse the query and send the total number of parameters + and resultset metadata information back to client (if any), + without executing the query i.e. with out any log/disk + writes. This will allow the queries to be re-executed + without re-parsing during execute. + + If parameter markers are found in the query, then store + the information using Item_param along with maintaining a + list in lex->param_list, so that a fast and direct + retrieveal can be made without going through all field + items. +*/ + +void mysql_com_prepare(THD *thd, char *packet, uint packet_length) +{ + MEM_ROOT thd_root = thd->mem_root; + DBUG_ENTER("mysql_com_prepare"); + + packet_length--; + + while (isspace(packet[0]) && packet_length > 0) + { + packet++; + packet_length--; + } + char *pos=packet+packet_length; + while (packet_length > 0 && (pos[-1] == ';' || isspace(pos[-1]))) + { + pos--; + packet_length--; + } + /* + Have the prepare items to have a connection level scope or + till next prepare statement by doing all allocations using + connection level memory allocator 'con_root' from THD. + */ + free_root(&thd->con_root,MYF(0)); + init_sql_alloc(&thd->con_root,8192,8192); + thd->mem_root = thd->con_root; + + if (!(thd->query= (char*) thd->memdup_w_gap((gptr) (packet), + packet_length, + thd->db_length+2))) + DBUG_VOID_RETURN; + thd->query[packet_length]=0; + thd->packet.shrink(net_buffer_length); + thd->query_length = packet_length; + + if (!(specialflag & SPECIAL_NO_PRIOR)) + my_pthread_setprio(pthread_self(),QUERY_PRIOR); + + mysql_parse_prepare_query(thd,thd->query,packet_length); + + if (!(specialflag & SPECIAL_NO_PRIOR)) + my_pthread_setprio(pthread_self(),WAIT_PRIOR); + + thd->mem_root = thd_root; // restore main mem_root + DBUG_PRINT("exit",("prepare query ready")); + DBUG_VOID_RETURN; +} + + +/* + Executes previously prepared query + + If there is any parameters(thd->param_count), then replace + markers with the data supplied from client, and then + execute the query +*/ + +void mysql_com_execute(THD *thd) +{ + MEM_ROOT thd_root=thd->mem_root; + DBUG_ENTER("mysql_com_execute"); + DBUG_PRINT("enter", ("parameters : %ld", thd->param_count)); + + thd->mem_root = thd->con_root; + if (thd->param_count && setup_param_fields(thd, thd->lex.param_list)) + DBUG_VOID_RETURN; + + if (!(specialflag & SPECIAL_NO_PRIOR)) + my_pthread_setprio(pthread_self(),QUERY_PRIOR); + + /* TODO: + Also, have checks on basic executions such as mysql_insert(), + mysql_delete(), mysql_update() and mysql_select() to not to + have re-check on setup_* and other things .. + */ + mysql_execute_command(); + + if (!(specialflag & SPECIAL_NO_PRIOR)) + my_pthread_setprio(pthread_self(),WAIT_PRIOR); + + thd->mem_root = (MEM_ROOT )thd_root; + DBUG_PRINT("exit",("prepare-execute done!")); + DBUG_VOID_RETURN; +} + +/* + Long data in pieces from client +*/ + +void mysql_com_longdata(THD *thd) +{ + DBUG_ENTER("mysql_com_execute"); + + if(thd->param_count && setup_longdata(thd,thd->lex.param_list)) + DBUG_VOID_RETURN; + + send_ok(&thd->net,0,0);// ok status to client + DBUG_PRINT("exit",("longdata-buffering done!")); + DBUG_VOID_RETURN; +} + diff --git a/sql/sql_select.cc b/sql/sql_select.cc index c10174a7b71..4737e068d3e 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -126,8 +126,6 @@ static bool store_record_in_cache(JOIN_CACHE *cache); static void reset_cache(JOIN_CACHE *cache); static void read_cached_record(JOIN_TAB *tab); static bool cmp_buffer_with_ref(JOIN_TAB *tab); -static int setup_group(THD *thd,TABLE_LIST *tables,List &fields, - List &all_fields, ORDER *order, bool *hidden); static bool setup_new_fields(THD *thd,TABLE_LIST *tables,List &fields, List &all_fields,ORDER *new_order); static ORDER *create_distinct_group(ORDER *order, List &fields); @@ -6456,7 +6454,7 @@ int setup_order(THD *thd,TABLE_LIST *tables,List &fields, } -static int +int setup_group(THD *thd,TABLE_LIST *tables,List &fields, List &all_fields, ORDER *order, bool *hidden_group_fields) { diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 1421eac168f..48d6bc7471f 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -169,6 +169,201 @@ int mysqld_show_tables(THD *thd,const char *db,const char *wild) DBUG_RETURN(0); } +/*************************************************************************** +** List all table types supported +***************************************************************************/ + +static struct show_table_type_st sys_table_types[]= { + {"MyISAM", (char *)"YES", "Default type from 3.23 with great performance"}, + {"HEAP" , (char *)"YES", "Hash based, stored in memory, useful for temporary tables"}, + {"MERGE", (char *)"YES", "Collection of identical MyISAM tables"}, + {"ISAM", (char*) &have_isam,"Obsolete table type"}, + {"InnoDB", (char*) &have_innodb,"Supports transactions, row-level locking and foreign keys"}, + {"BDB", (char*) &have_berkeley_db, "Supports transactions and page-level locking"}, +}; + +int mysqld_show_table_types(THD *thd) +{ + List field_list; + DBUG_ENTER("mysqld_show_table_types"); + + field_list.push_back(new Item_empty_string("Type",10)); + field_list.push_back(new Item_empty_string("Support",10)); + field_list.push_back(new Item_empty_string("Comment",NAME_LEN)); + + if (send_fields(thd,field_list,1)) + DBUG_RETURN(1); + + const char *default_type_name=ha_table_typelib.type_names[default_table_type-1]; + show_table_type_st *types = sys_table_types; + + uint i; + for (i = 0; i < 3; i++) + { + thd->packet.length(0); + net_store_data(&thd->packet,types[i].type); + if (!strcasecmp(default_type_name,types[i].type)) + net_store_data(&thd->packet,"DEFAULT"); + else + net_store_data(&thd->packet,types[i].value); + net_store_data(&thd->packet,types[i].comment); + if (my_net_write(&thd->net,(char*) thd->packet.ptr(),thd->packet.length())) + DBUG_RETURN(-1); + } + + for (; i < sizeof(sys_table_types)/sizeof(sys_table_types[0]); i++) + { + thd->packet.length(0); + net_store_data(&thd->packet,types[i].type); + SHOW_COMP_OPTION tmp= *(SHOW_COMP_OPTION*) types[i].value; + + if (tmp == SHOW_OPTION_NO) + net_store_data(&thd->packet,"NO"); + else + { + if (tmp == SHOW_OPTION_YES) + { + if (!strcasecmp(default_type_name,types[i].type)) + net_store_data(&thd->packet,"DEFAULT"); + else + net_store_data(&thd->packet,"YES"); + } + else net_store_data(&thd->packet,"DISABLED"); + } + net_store_data(&thd->packet,types[i].comment); + if (my_net_write(&thd->net,(char*) thd->packet.ptr(),thd->packet.length())) + DBUG_RETURN(-1); + } + send_eof(&thd->net); + DBUG_RETURN(0); +} + +/*************************************************************************** +** List all privileges supported +***************************************************************************/ + +static struct show_table_type_st sys_privileges[]= { + {"Select", (char *)"Tables", "To retrieve rows from table"}, + {"Insert", (char *)"Tables", "To insert data into tables"}, + {"Update", (char *)"Tables", "To update existing rows "}, + {"Delete", (char *)"Tables", "To delete existing rows"}, + {"Index", (char *)"Tables", "To create or drop indexes"}, + {"Alter", (char *)"Tables", "To alter the table"}, + {"Create", (char *)"Databases,Tables,Indexes", "To create new databases and tables"}, + {"Drop", (char *)"Databases,Tables", "To drop databases and tables"}, + {"Grant", (char *)"Databases,Tables", "To give to other users those privileges you possesed"}, + {"References", (char *)"Databases,Tables", "To have references on tables"}, + {"Reload", (char *)"Server Admin", "To reload or refresh tables, logs and privileges"}, + {"Shutdown",(char *)"Server Admin", "To shutdown the server"}, + {"Process", (char *)"Server Admin", "To view the plain text of currently executing queries"}, + {"File", (char *)"File access on server", "To read and write files on the server"}, +}; + +int mysqld_show_privileges(THD *thd) +{ + List field_list; + DBUG_ENTER("mysqld_show_privileges"); + + field_list.push_back(new Item_empty_string("Privilege",10)); + field_list.push_back(new Item_empty_string("Context",15)); + field_list.push_back(new Item_empty_string("Comment",NAME_LEN)); + + if (send_fields(thd,field_list,1)) + DBUG_RETURN(1); + + for (uint i=0; i < sizeof(sys_privileges)/sizeof(sys_privileges[0]); i++) + { + thd->packet.length(0); + net_store_data(&thd->packet,sys_privileges[i].type); + net_store_data(&thd->packet,sys_privileges[i].value); + net_store_data(&thd->packet,sys_privileges[i].comment); + if (my_net_write(&thd->net,(char*) thd->packet.ptr(),thd->packet.length())) + DBUG_RETURN(-1); + } + send_eof(&thd->net); + DBUG_RETURN(0); +} + + +/*************************************************************************** +** List all column types +***************************************************************************/ + +#if 0 +struct show_column_type_st { + const char *type; + uint size; + char *min_value; + char *max_value; + uint precision, + uint scale, + char *nullable; + char *auto_increment; + char *unsigned_attr; + char *zerofill; + char *searchable; + char *case_sensitivity; + char *default_value; + char *comment; +}; +#endif +static struct show_column_type_st sys_column_types[]= { + {"tinyint", + 1, "-128", "127", 0, 0, "YES", "YES", + "NO", "YES", "YES", "NO", "NULL,0", + "A very small integer"}, + {"tinyint unsigned", + 1, "0" , "255", 0, 0, "YES", "YES", + "YES", "YES", "YES", "NO", "NULL,0", + "A very small integer"}, +}; + +int mysqld_show_column_types(THD *thd) +{ + List field_list; + DBUG_ENTER("mysqld_show_column_types"); + + field_list.push_back(new Item_empty_string("Type",30)); + field_list.push_back(new Item_int("Size",(longlong) 1,21)); + field_list.push_back(new Item_empty_string("Min_Value",20)); + field_list.push_back(new Item_empty_string("Max_Value",20)); + field_list.push_back(new Item_int("Prec", 0,4)); + field_list.push_back(new Item_int("Scale", 0,4)); + field_list.push_back(new Item_empty_string("Nullable",4)); + field_list.push_back(new Item_empty_string("Auto_Increment",4)); + field_list.push_back(new Item_empty_string("Unsigned",4)); + field_list.push_back(new Item_empty_string("Zerofill",4)); + field_list.push_back(new Item_empty_string("Searchable",4)); + field_list.push_back(new Item_empty_string("Case_Sensitive",4)); + field_list.push_back(new Item_empty_string("Default",NAME_LEN)); + field_list.push_back(new Item_empty_string("Comment",NAME_LEN)); + + if (send_fields(thd,field_list,1)) + DBUG_RETURN(1); + + for (uint i=0; i < sizeof(sys_column_types)/sizeof(sys_column_types[0]); i++) + { + thd->packet.length(0); + net_store_data(&thd->packet,sys_column_types[i].type); + net_store_data(&thd->packet,(longlong)sys_column_types[i].size); + net_store_data(&thd->packet,sys_column_types[i].min_value); + net_store_data(&thd->packet,sys_column_types[i].max_value); + net_store_data(&thd->packet,(uint32)sys_column_types[i].precision); + net_store_data(&thd->packet,(uint32)sys_column_types[i].scale); + net_store_data(&thd->packet,sys_column_types[i].nullable); + net_store_data(&thd->packet,sys_column_types[i].auto_increment); + net_store_data(&thd->packet,sys_column_types[i].unsigned_attr); + net_store_data(&thd->packet,sys_column_types[i].zerofill); + net_store_data(&thd->packet,sys_column_types[i].searchable); + net_store_data(&thd->packet,sys_column_types[i].case_sensitivity); + net_store_data(&thd->packet,sys_column_types[i].default_value); + net_store_data(&thd->packet,sys_column_types[i].comment); + if (my_net_write(&thd->net,(char*) thd->packet.ptr(),thd->packet.length())) + DBUG_RETURN(-1); + } + send_eof(&thd->net); + DBUG_RETURN(0); +} static int mysql_find_files(THD *thd,List *files, const char *db,const char *path, diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 25d8dbbab16..d140cd4dcdd 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -324,6 +324,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token TRAILING %token TRANSACTION_SYM %token TYPE_SYM +%token TYPES_SYM %token FUNC_ARG0 %token FUNC_ARG1 %token FUNC_ARG2 @@ -346,6 +347,11 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token X509_SYM %token COMPRESSED_SYM +%token ERRORS +%token SQL_ERROR_COUNT +%token WARNINGS +%token SQL_WARNING_COUNT + %token BIGINT %token BLOB_SYM %token CHAR_SYM @@ -548,7 +554,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); literal text_literal insert_ident order_ident simple_ident select_item2 expr opt_expr opt_else sum_expr in_sum_expr table_wild opt_pad no_in_expr expr_expr simple_expr no_and_expr - using_list subselect subselect_init + using_list param_marker subselect subselect_init %type expr_list udf_expr_list when_list ident_list ident_list_arg @@ -1720,6 +1726,7 @@ no_and_expr: simple_expr: simple_ident | literal + | param_marker | '@' ident_or_text SET_VAR expr { $$= new Item_func_set_user_var($2,$4); current_thd->safe_to_cache_query=0; @@ -2795,6 +2802,29 @@ show_param: if (!add_table_to_list($3,NULL,0)) YYABORT; } + | COLUMN_SYM TYPES_SYM + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_COLUMN_TYPES; + } + | TABLE_SYM TYPES_SYM + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_TABLE_TYPES; + } + | PRIVILEGES + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_PRIVILEGES; + } + | COUNT_SYM '(' '*' ')' WARNINGS + { Lex->sql_command = SQLCOM_SHOW_WARNS_COUNT;} + | COUNT_SYM '(' '*' ')' ERRORS + { Lex->sql_command = SQLCOM_SHOW_ERRORS_COUNT;} + | WARNINGS {Select->offset_limit=0L;} limit_clause + { Lex->sql_command = SQLCOM_SHOW_WARNS;} + | ERRORS {Select->offset_limit=0L;} limit_clause + { Lex->sql_command = SQLCOM_SHOW_ERRORS;} | STATUS_SYM wild { Lex->sql_command= SQLCOM_SHOW_STATUS; } | opt_full PROCESSLIST_SYM @@ -3055,7 +3085,20 @@ text_string: Item *tmp = new Item_varbinary($1.str,$1.length,default_charset_info); $$= tmp ? tmp->val_str((String*) 0) : (String*) 0; }; - +param_marker: + '?' + { + if(current_thd->prepare_command) + { + Lex->param_list.push_back($$=new Item_param()); + current_thd->param_count++; + } + else + { + yyerror("You have an error in your SQL syntax"); + YYABORT; + } + } literal: text_literal { $$ = $1; } | NUM { $$ = new Item_int($1.str, (longlong) atol($1.str),$1.length); } @@ -3411,6 +3454,16 @@ option_value: YYABORT; } | SQL_QUERY_CACHE_TYPE_SYM equal query_cache_type + | SQL_ERROR_COUNT equal ULONG_NUM + { + LEX *lex = Lex; + lex->thd->max_error_count = $3; + } + | SQL_WARNING_COUNT equal ULONG_NUM + { + LEX *lex = Lex; + lex->thd->max_warning_count = $3; + } | '@' ident_or_text equal expr { Item_func_set_user_var *item = new Item_func_set_user_var($2,$4); diff --git a/sql/structs.h b/sql/structs.h index 75280b34715..c4cb6c82209 100644 --- a/sql/structs.h +++ b/sql/structs.h @@ -152,6 +152,29 @@ struct show_var_st { SHOW_TYPE type; }; +struct show_table_type_st { + const char *type; + char *value; + const char *comment; +}; + +struct show_column_type_st { + const char *type; + uint size; + const char *min_value; + const char *max_value; + uint precision; + uint scale; + const char *nullable; + const char *auto_increment; + const char *unsigned_attr; + const char *zerofill; + const char *searchable; + const char *case_sensitivity; + const char *default_value; + const char *comment; +}; + typedef struct lex_string { char *str; uint length; -- cgit v1.2.1 From 25a38bb96fc286a0682d08dcc44c9daf20cd29d7 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 12 Jun 2002 15:47:05 -0700 Subject: mysql_priv.h: Missed change from previous resolve sql/mysql_priv.h: Missed change from previous resolve --- sql/mysql_priv.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 011b7823dd0..4f0bc2fe14a 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -459,7 +459,7 @@ bool load_des_key_file(const char *file_name); /* sql_do.cc */ int mysql_do(THD *thd, List &values); -/* sql_show.c */ +/* sql_show.cc */ int mysqld_show_dbs(THD *thd,const char *wild); int mysqld_show_open_tables(THD *thd,const char *wild); int mysqld_show_tables(THD *thd,const char *db,const char *wild); @@ -477,6 +477,7 @@ int mysqld_show_status(THD *thd); int mysqld_show_variables(THD *thd,const char *wild); int mysqld_show(THD *thd, const char *wild, show_var_st *variables); int mysqld_show_charsets(THD *thd,const char *wild); +int mysqld_show_table_types(THD *thd); int mysqld_show_privileges(THD *thd); int mysqld_show_column_types(THD *thd); -- cgit v1.2.1 From 1fac9fecf7d93e42cefbecef6c1636b03af54955 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 12 Jun 2002 17:20:16 -0700 Subject: sql_list.h: One more missed fix from Windows sql/sql_list.h: One more missed fix from Windows --- sql/sql_list.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sql/sql_list.h b/sql/sql_list.h index 541db4ec166..ef8a0c41a1b 100644 --- a/sql/sql_list.h +++ b/sql/sql_list.h @@ -82,6 +82,7 @@ public: first=tmp.first; last=tmp.last; } + inline base_list(bool error) { } inline bool push_back(void *info) { if (((*last)=new list_node(info, &end_of_list))) @@ -130,6 +131,7 @@ public: inline list_node *last_ref() { return &end_of_list; } friend class base_list_iterator; friend class error_list; + friend class error_list_iterator; protected: void after(void *info,list_node *node) @@ -405,7 +407,7 @@ class error_list: public Error_alloc, public base_list { public: inline error_list() : base_list() { }; - inline error_list(const error_list &tmp) : Error_alloc() + inline error_list(const error_list &tmp) : base_list(tmp) { elements=tmp.elements; first=tmp.first; -- cgit v1.2.1 From 7fb7a8f210cb38830fe3185735256ab0f284305e Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 13 Jun 2002 17:28:25 -0700 Subject: client_test.c: new file 'C' Test case for all prototype changes - Assert based which covers all most all scenarios --- tests/Makefile.am | 15 +- tests/client_test.c | 2539 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 2553 insertions(+), 1 deletion(-) create mode 100644 tests/client_test.c diff --git a/tests/Makefile.am b/tests/Makefile.am index cdb623fa2a0..241caf74465 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -24,7 +24,20 @@ EXTRA_DIST = auto_increment.res auto_increment.tst \ insert_and_repair.pl \ grant.pl grant.res test_delayed_insert.pl \ pmail.pl mail_to_db.pl table_types.pl \ - udf_test udf_test.res + udf_test udf_test.res + +# +# C Test for 4.1 protocol +# +INCLUDES = -I$(srcdir)/../include $(openssl_includes) \ + -I../include -I$(srcdir)/.. -I$(top_srcdir) \ + -I.. +LIBS = @CLIENT_LIBS@ +LDADD = @CLIENT_EXTRA_LDFLAGS@ ../libmysql/libmysqlclient.la +noinst_PROGRAMS = client_test +client_test_LDADD= $(LDADD) $(CXXLDFLAGS) +client_test_SOURCES= client_test.c +client_test_DEPENDENCIES= $(LIBRARIES) $(pkglib_LTLIBRARIES) # Don't update the files from bitkeeper %::SCCS/s.% diff --git a/tests/client_test.c b/tests/client_test.c new file mode 100644 index 00000000000..169ab9556d1 --- /dev/null +++ b/tests/client_test.c @@ -0,0 +1,2539 @@ +/*************************************************************************** + client_test.c - description + ------------------------- + begin : Sun Feb 3 2002 + copyright : (C) MySQL AB 1995-2002, www.mysql.com + author : venu ( venu@mysql.com ) + ***************************************************************************/ + +/*************************************************************************** + * * + * 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; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +/*************************************************************************** + * * + * This is a test sample to test the new features in MySQL client-server * + * protocol * + * * + ***************************************************************************/ + +#include + +#if defined(__WIN__) || defined(_WIN32) || defined(_WIN64) +#include +#endif + +/* standrad headers */ +#include +#include + +#include + + +/* mysql client headers */ +#include +#include +#include + +#ifndef true +#define true 1 +#endif + +#ifndef false +#define false 0 +#endif + +static char *opt_db="test", *opt_user="venu", *opt_password="venu"; +static char *opt_host=0, *opt_mysql_unix_port=0; +static uint opt_mysql_port; + +#define myheader(str) { printf("\n\n#######################\n"); \ + printf("%s",str); \ + printf("\n#######################\n"); \ + } + +void print_error(MYSQL *mysql, const char *msg, int line, char *file) +{ + if(mysql) + { + fprintf(stderr,"\n %d@[MySQL]%s\n",line,mysql_error(mysql)); + } + else if(msg) fprintf(stderr, " %d@%s\n", line,msg); +} + +void print_st_error(MYSQL_STMT *stmt, const char *msg, int line, char *file) +{ + if(stmt) + { + fprintf(stderr,"\n %d@[MySQL]%s\n",line, mysql_stmt_error(stmt)); + } + else if(msg) fprintf(stderr, " %d@%s\n", line,msg); +} + +#define myerror(mysql, msg) print_error(mysql, msg, __LINE__, __FILE__) +#define mysterror(stmt, msg) print_st_error(stmt, msg, __LINE__, __FILE__) + +#define myassert(x) if(x) {\ + fprintf(stderr,"ASSERTION FAILED AT %d@%s\n",__LINE__, __FILE__);\ + exit(1);\ +} +#define myassert_r(x) if(!x) {\ + fprintf(stderr,"ASSERTION FAILED AT %d@%s\n",__LINE__, __FILE__);\ + exit(1);\ +} + +#define myquery(mysql,r) \ +if( r != 0) \ +{ \ + myerror(mysql,NULL); \ + myassert(true);\ +} + +#define myquery_r(mysql,r) \ +if( r != 0) \ +{ \ + myerror(mysql,NULL); \ + myassert_r(true);\ +} + +#define mystmt(stmt,r) \ +if( r != 0) \ +{ \ + mysterror(stmt,NULL); \ + myassert(true);\ +} + +#define myxquery(mysql,stmt) \ +if( stmt == 0) \ +{ \ + myerror(mysql,NULL); \ + myassert(true);\ +} + +#define myxquery_r(mysql,stmt) \ +if( stmt == 0) \ +{ \ + myerror(mysql,NULL); \ + myassert_r(true);\ +} \ +else myassert(true); + +#define mystmt_r(stmt,r) \ +if( r != 0) \ +{ \ + mysterror(stmt,NULL); \ + myassert_r(true);\ +} + +#define mytest(mysql,x) if(!x) {myerror(mysql,NULL);myassert(true);} +#define mytest_r(mysql,x) if(x) {myerror(mysql,NULL);myassert(true);} + +/******************************************************** +* connect to the server * +*********************************************************/ +MYSQL *client_connect() +{ + MYSQL *mysql; + + myheader("client_connect"); + + if(!(mysql = mysql_init(NULL))) + { + myerror(NULL, "mysql_init() failed"); + exit(0); + } + if (!(mysql_real_connect(mysql,opt_host,opt_user, + opt_password, opt_db, opt_mysql_port, + opt_mysql_unix_port, 0))) + { + myerror(mysql, "connection failed"); + exit(0); + } + + /* set AUTOCOMMIT to ON*/ + mysql_autocommit(mysql, true); + return(mysql); +} + +/******************************************************** +* close the connection * +*********************************************************/ +void client_disconnect(MYSQL *mysql) +{ + myheader("client_disconnect"); + + mysql_close(mysql); +} + +/******************************************************** +* query processing * +*********************************************************/ +void client_query(MYSQL *mysql) +{ + int rc; + + myheader("client_query"); + + rc = mysql_query(mysql,"DROP TABLE IF EXISTS myclient_test"); + myquery(mysql,rc); + + rc = mysql_query(mysql,"CREATE TABLE myclient_test(id int primary key auto_increment,\ + name varchar(20))"); + myquery(mysql,rc); + + rc = mysql_query(mysql,"CREATE TABLE myclient_test(id int, name varchar(20))"); + myquery_r(mysql,rc); + + rc = mysql_query(mysql,"INSERT INTO myclient_test(name) VALUES('mysql')"); + myquery(mysql,rc); + + rc = mysql_query(mysql,"INSERT INTO myclient_test(name) VALUES('monty')"); + myquery(mysql,rc); + + rc = mysql_query(mysql,"INSERT INTO myclient_test(name) VALUES('venu')"); + myquery(mysql,rc); + + rc = mysql_query(mysql,"INSERT INTO myclient_test(name) VALUES('deleted')"); + myquery(mysql,rc); + + rc = mysql_query(mysql,"UPDATE myclient_test SET name='updated' WHERE name='deleted'"); + myquery(mysql,rc); + + rc = mysql_query(mysql,"UPDATE myclient_test SET id=3 WHERE name='updated'"); + myquery_r(mysql,rc); +} + +/******************************************************** +* print dashes * +*********************************************************/ +void my_print_dashes(MYSQL_RES *result) +{ + MYSQL_FIELD *field; + unsigned int i,j; + + mysql_field_seek(result,0); + fputc('\t',stdout); + fputc('+', stdout); + + for(i=0; i< mysql_num_fields(result); i++) + { + field = mysql_fetch_field(result); + for(j=0; j < field->max_length+2; j++) + fputc('-',stdout); + fputc('+',stdout); + } + fputc('\n',stdout); +} + +/******************************************************** +* print resultset metadata information * +*********************************************************/ +void my_print_result_metadata(MYSQL_RES *result) +{ + MYSQL_FIELD *field; + unsigned int i,j; + unsigned int field_count; + + mysql_field_seek(result,0); + fputc('\n', stdout); + + field_count = mysql_num_fields(result); + for(i=0; i< field_count; i++) + { + field = mysql_fetch_field(result); + j = strlen(field->name); + if(j < field->max_length) + j = field->max_length; + if(j < 4 && !IS_NOT_NULL(field->flags)) + j = 4; + field->max_length = j; + } + my_print_dashes(result); + fputc('\t',stdout); + fputc('|', stdout); + + mysql_field_seek(result,0); + for(i=0; i< field_count; i++) + { + field = mysql_fetch_field(result); + fprintf(stdout, " %-*s |",field->max_length, field->name); + } + fputc('\n', stdout); + my_print_dashes(result); +} + +/******************************************************** +* process the result set * +*********************************************************/ +int my_process_result_set(MYSQL *mysql, MYSQL_RES *result) +{ + MYSQL_ROW row; + MYSQL_FIELD *field; + unsigned int i; + unsigned int row_count=0; + + my_print_result_metadata(result); + + while((row = mysql_fetch_row(result)) != NULL) + { + mysql_field_seek(result,0); + fputc('\t',stdout); + fputc('|',stdout); + + for(i=0; i< mysql_num_fields(result); i++) + { + field = mysql_fetch_field(result); + if(row[i] == NULL) + fprintf(stdout, " %-*s |", field->max_length, "NULL"); + else if (IS_NUM(field->type)) + fprintf(stdout, " %*s |", field->max_length, row[i]); + else + fprintf(stdout, " %-*s |", field->max_length, row[i]); + } + fputc('\t',stdout); + fputc('\n',stdout); + row_count++; + } + my_print_dashes(result); + + if (mysql_errno(mysql) != 0) + fprintf(stderr, "\n\tmysql_fetch_row() failed\n"); + else + fprintf(stdout,"\n\t%lu rows returned\n", row_count); + return(row_count); +} + +/******************************************************** +* store result processing * +*********************************************************/ +void client_store_result(MYSQL *mysql) +{ + MYSQL_RES *result; + int rc; + + myheader("client_store_result"); + + rc = mysql_query(mysql, "SELECT * FROM myclient_test"); + myquery(mysql,rc); + + /* get the result */ + result = mysql_store_result(mysql); + mytest(mysql,result); + + my_process_result_set(mysql,result); + mysql_free_result(result); +} + +/******************************************************** +* use result processing * +*********************************************************/ +void client_use_result(MYSQL *mysql) +{ + MYSQL_RES *result; + int rc; + myheader("client_use_result"); + + rc = mysql_query(mysql, "SELECT * FROM myclient_test"); + myquery(mysql,rc); + + /* get the result */ + result = mysql_use_result(mysql); + mytest(mysql,result); + + my_process_result_set(mysql,result); + mysql_free_result(result); +} + + +/******************************************************** +* query processing * +*********************************************************/ +void test_debug_example(MYSQL *mysql) +{ + int rc; + MYSQL_RES *result; + + myheader("test_debug_example"); + + rc = mysql_query(mysql,"DROP TABLE IF EXISTS test_debug_example"); + myquery(mysql,rc); + + rc = mysql_query(mysql,"CREATE TABLE test_debug_example(id int primary key auto_increment,\ + name varchar(20),xxx int)"); + myquery(mysql,rc); + + rc = mysql_query(mysql,"INSERT INTO test_debug_example(name) VALUES('mysql')"); + myquery(mysql,rc); + + rc = mysql_query(mysql,"UPDATE test_debug_example SET name='updated' WHERE name='deleted'"); + myquery(mysql,rc); + + rc = mysql_query(mysql,"SELECT * FROM test_debug_example"); + myquery(mysql,rc); + + result = mysql_use_result(mysql); + mytest(mysql,result); + + my_process_result_set(mysql,result); + mysql_free_result(result); + + rc = mysql_query(mysql,"DROP TABLE test_debug_example"); + myquery(mysql,rc); +} + +/******************************************************** +* to test autocommit feature * +*********************************************************/ +void test_tran_bdb(MYSQL *mysql) +{ + MYSQL_RES *result; + MYSQL_ROW row; + int rc; + + myheader("test_tran_bdb"); + + /* set AUTOCOMMIT to OFF */ + rc = mysql_autocommit(mysql, false); + myquery(mysql,rc); + + rc = mysql_query(mysql,"DROP TABLE IF EXISTS my_demo_transaction"); + myquery(mysql,rc); + + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + /* create the table 'mytran_demo' of type BDB' or 'InnoDB' */ + rc = mysql_query(mysql,"CREATE TABLE my_demo_transaction(col1 int ,col2 varchar(30)) TYPE = BDB"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + /* insert a row and commit the transaction */ + rc = mysql_query(mysql,"INSERT INTO my_demo_transaction VALUES(10,'venu')"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + /* now insert the second row, and rollback the transaction */ + rc = mysql_query(mysql,"INSERT INTO my_demo_transaction VALUES(20,'mysql')"); + myquery(mysql,rc); + + rc = mysql_rollback(mysql); + myquery(mysql,rc); + + /* delete first row, and rollback it */ + rc = mysql_query(mysql,"DELETE FROM my_demo_transaction WHERE col1 = 10"); + myquery(mysql,rc); + + rc = mysql_rollback(mysql); + myquery(mysql,rc); + + /* test the results now, only one row should exists */ + rc = mysql_query(mysql,"SELECT * FROM my_demo_transaction"); + myquery(mysql,rc); + + /* get the result */ + result = mysql_store_result(mysql); + mytest(mysql,result); + + my_process_result_set(mysql,result); + + /* test the results now, only one row should exists */ + rc = mysql_query(mysql,"SELECT * FROM my_demo_transaction"); + myquery(mysql,rc); + + /* get the result */ + result = mysql_use_result(mysql); + mytest(mysql,result); + + row = mysql_fetch_row(result); + mytest(mysql,row); + + row = mysql_fetch_row(result); + mytest_r(mysql,row); + + mysql_free_result(result); + mysql_autocommit(mysql,true); +} + +/******************************************************** +* to test autocommit feature * +*********************************************************/ +void test_tran_innodb(MYSQL *mysql) +{ + MYSQL_RES *result; + MYSQL_ROW row; + int rc; + + myheader("test_tran_innodb"); + + /* set AUTOCOMMIT to OFF */ + rc = mysql_autocommit(mysql, false); + myquery(mysql,rc); + + rc = mysql_query(mysql,"DROP TABLE IF EXISTS my_demo_transaction"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + /* create the table 'mytran_demo' of type BDB' or 'InnoDB' */ + rc = mysql_query(mysql,"CREATE TABLE my_demo_transaction(col1 int ,col2 varchar(30)) TYPE = InnoDB"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + /* insert a row and commit the transaction */ + rc = mysql_query(mysql,"INSERT INTO my_demo_transaction VALUES(10,'venu')"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + /* now insert the second row, and rollback the transaction */ + rc = mysql_query(mysql,"INSERT INTO my_demo_transaction VALUES(20,'mysql')"); + myquery(mysql,rc); + + rc = mysql_rollback(mysql); + myquery(mysql,rc); + + /* delete first row, and rollback it */ + rc = mysql_query(mysql,"DELETE FROM my_demo_transaction WHERE col1 = 10"); + myquery(mysql,rc); + + rc = mysql_rollback(mysql); + myquery(mysql,rc); + + /* test the results now, only one row should exists */ + rc = mysql_query(mysql,"SELECT * FROM my_demo_transaction"); + myquery(mysql,rc); + + /* get the result */ + result = mysql_store_result(mysql); + mytest(mysql,result); + + my_process_result_set(mysql,result); + + /* test the results now, only one row should exists */ + rc = mysql_query(mysql,"SELECT * FROM my_demo_transaction"); + myquery(mysql,rc); + + /* get the result */ + result = mysql_use_result(mysql); + mytest(mysql,result); + + row = mysql_fetch_row(result); + mytest(mysql,row); + + row = mysql_fetch_row(result); + mytest_r(mysql,row); + + mysql_free_result(result); + mysql_autocommit(mysql,true); +} + +/******************************************************** +* to test simple prepares of all DML statements * +*********************************************************/ +void test_prepare_simple(MYSQL *mysql) +{ + MYSQL_STMT *stmt; + int rc,param_count,length; + const char *query; + + myheader("test_prepare_simple"); + + rc = mysql_query(mysql,"DROP TABLE IF EXISTS test_prepare_simple"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + rc = mysql_query(mysql,"CREATE TABLE test_prepare_simple(id int, name varchar(50))"); + myquery(mysql,rc); + + /* alter table */ + query = "ALTER TABLE test_prepare_simple ADD new char(20)"; + length = strlen(query); + stmt = mysql_prepare(mysql, query); + myxquery(mysql,stmt); + + param_count = mysql_param_count(stmt); + fprintf(stdout,"\n total parameters in alter:%d\n", param_count); + assert(param_count == 0); + mysql_stmt_close(stmt); + + /* insert */ + query = "INSERT INTO test_prepare_simple VALUES(?,?)"; + length = strlen(query); + stmt = mysql_prepare(mysql, query); + myxquery(mysql,stmt); + + param_count = mysql_param_count(stmt); + fprintf(stdout,"\n total parameters in insert:%d\n", param_count); + assert(param_count == 2); + mysql_stmt_close(stmt); + + /* update */ + query = "UPDATE test_prepare_simple SET id=? WHERE id=? AND name= ?"; + length = strlen(query); + stmt = mysql_prepare(mysql, query); + myxquery(mysql,stmt); + + param_count = mysql_param_count(stmt); + fprintf(stdout,"\n total parameters in update:%d\n", param_count); + assert(param_count == 3); + mysql_stmt_close(stmt); + + /* delete */ + query = "DELETE FROM test_prepare_simple WHERE id=10"; + length = strlen(query); + stmt = mysql_prepare(mysql, query); + myxquery(mysql,stmt); + + param_count = mysql_param_count(stmt); + fprintf(stdout,"\n total parameters in delete:%d\n", param_count); + assert(param_count == 0); + + rc = mysql_execute(stmt); + mystmt(stmt, rc); + mysql_stmt_close(stmt); + + /* delete */ + query = "DELETE FROM test_prepare_simple WHERE id=?"; + length = strlen(query); + stmt = mysql_prepare(mysql, query); + myxquery(mysql,stmt); + + param_count = mysql_param_count(stmt); + fprintf(stdout,"\n total parameters in delete:%d\n", param_count); + assert(param_count == 1); + + rc = mysql_execute(stmt); + mystmt_r(stmt, rc); + mysql_stmt_close(stmt); + + /* select */ + query = "SELECT * FROM test_prepare_simple WHERE id=? AND name= ?"; + length = strlen(query); + stmt = mysql_prepare(mysql, query); + myxquery(mysql,stmt); + + param_count = mysql_param_count(stmt); + fprintf(stdout,"\n total parameters in select:%d\n", param_count); + assert(param_count == 2); + + mysql_stmt_close(stmt); + + /* now fetch the results ..*/ + rc = mysql_commit(mysql); + myquery(mysql,rc); +} + + +/******************************************************** +* to test simple prepare field results * +*********************************************************/ +void test_prepare_field_result(MYSQL *mysql) +{ + MYSQL_STMT *stmt; + int rc,param_count,length; + const char *query; + + myheader("test_prepare_field_result"); + + rc = mysql_query(mysql,"DROP TABLE IF EXISTS test_prepare_field_result"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + rc = mysql_query(mysql,"CREATE TABLE test_prepare_field_result(id int, name varchar(50), extra int)"); + myquery(mysql,rc); + + + /* insert */ + query = "SELECT id,name FROM test_prepare_field_result WHERE id=?"; + length = strlen(query); + stmt = mysql_prepare(mysql, query); + myxquery(mysql,stmt); + + param_count = mysql_param_count(stmt); + fprintf(stdout,"\n total parameters in insert:%d\n", param_count); + assert(param_count == 1); + mysql_stmt_close(stmt); + + /* now fetch the results ..*/ + rc = mysql_commit(mysql); + myquery(mysql,rc); +} + + +/******************************************************** +* to test simple prepare field results * +*********************************************************/ +void test_prepare_syntax(MYSQL *mysql) +{ + MYSQL_STMT *stmt; + int rc,length; + const char *query; + + myheader("test_prepare_syntax"); + + rc = mysql_query(mysql,"DROP TABLE IF EXISTS test_prepare_syntax"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + rc = mysql_query(mysql,"CREATE TABLE test_prepare_syntax(id int, name varchar(50), extra int)"); + myquery(mysql,rc); + + query = "INSERT INTO test_prepare_syntax VALUES(?"; + length = strlen(query); + stmt = mysql_prepare(mysql, query); + myxquery_r(mysql,stmt); + + query = "SELECT id,name FROM test_prepare_syntax WHERE id=? AND WHERE"; + length = strlen(query); + stmt = mysql_prepare(mysql, query); + myxquery_r(mysql,stmt); + + /* now fetch the results ..*/ + rc = mysql_commit(mysql); + myquery(mysql,rc); +} + + +/******************************************************** +* to test simple prepare * +*********************************************************/ +void test_prepare(MYSQL *mysql) +{ + MYSQL_STMT *stmt; + int rc,param_count; + char query[200]; + long int_data; + char str_data[50]; + char tiny_data; + short small_data; + longlong big_data; + double real_data; + double double_data; + MYSQL_RES *result; + MYSQL_BIND bind[8]={0}; + + myheader("test_prepare"); + + rc = mysql_autocommit(mysql, true); + myquery(mysql,rc); + + rc = mysql_query(mysql,"DROP TABLE IF EXISTS my_prepare"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + rc = mysql_query(mysql,"CREATE TABLE my_prepare(col1 tinyint,\ + col2 varchar(50), col3 int,\ + col4 smallint, col5 bigint, \ + col6 float, col7 double )"); + myquery(mysql,rc); + + /* insert by prepare */ + strcpy(query,"INSERT INTO my_prepare VALUES(?,?,?,?,?,?,?)"); + stmt = mysql_prepare(mysql, query); + myxquery(mysql,stmt); + + param_count = mysql_param_count(stmt); + fprintf(stdout," total parameters in insert:%d\n", param_count); + assert(param_count == 7); + + /* tinyint */ + bind[0].buffer_type=FIELD_TYPE_TINY; + bind[0].buffer=(gptr)&tiny_data; + /* string */ + bind[1].buffer_type=FIELD_TYPE_STRING; + bind[1].buffer=str_data; + /* integer */ + bind[2].buffer_type=FIELD_TYPE_LONG; + bind[2].buffer= (gptr)&int_data; + /* short */ + bind[3].buffer_type=FIELD_TYPE_SHORT; + bind[3].buffer= (gptr)&small_data; + /* bigint */ + bind[4].buffer_type=FIELD_TYPE_LONGLONG; + bind[4].buffer= (gptr)&big_data; + /* float */ + bind[5].buffer_type=FIELD_TYPE_DOUBLE; + bind[5].buffer= (gptr)&real_data; + /* double */ + bind[6].buffer_type=FIELD_TYPE_DOUBLE; + bind[6].buffer= (gptr)&double_data; + + rc = mysql_bind_param(stmt,bind); + mystmt(stmt, rc); + + int_data = 320; + small_data = 1867; + big_data = 1000; + real_data = 2; + double_data = 6578.001; + + /* now, execute the prepared statement to insert 10 records.. */ + for (tiny_data=0; tiny_data < 100; tiny_data++) + { + bind[1].buffer_length = sprintf(str_data,"MySQL%d",int_data); + rc = mysql_execute(stmt); + mystmt(stmt, rc); + int_data += 25; + small_data += 10; + big_data += 100; + real_data += 1; + double_data += 10.09; + } + + mysql_stmt_close(stmt); + + /* now fetch the results ..*/ + rc = mysql_commit(mysql); + myquery(mysql,rc); + + /* test the results now, only one row should exists */ + rc = mysql_query(mysql,"SELECT * FROM my_prepare"); + myquery(mysql,rc); + + /* get the result */ + result = mysql_store_result(mysql); + mytest(mysql,result); + + assert((int)tiny_data == my_process_result_set(mysql,result)); + mysql_free_result(result); + +} + +/******************************************************** +* to test double comparision * +*********************************************************/ +void test_double_compare(MYSQL *mysql) +{ + MYSQL_STMT *stmt; + int rc,param_count; + char query[200],real_data[10], tiny_data; + double double_data; + MYSQL_RES *result; + MYSQL_BIND bind[3]={0}; + + myheader("test_double_compare"); + + rc = mysql_autocommit(mysql, true); + myquery(mysql,rc); + + rc = mysql_query(mysql,"DROP TABLE IF EXISTS test_double_compare"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + rc = mysql_query(mysql,"CREATE TABLE test_double_compare(col1 tinyint,\ + col2 float, col3 double )"); + myquery(mysql,rc); + + rc = mysql_query(mysql,"INSERT INTO test_double_compare VALUES(1,10.2,34.5)"); + myquery(mysql,rc); + + strcpy(query, "UPDATE test_double_compare SET col1=100 WHERE col1 = ? AND col2 = ? AND COL3 = ?"); + stmt = mysql_prepare(mysql,query); + myxquery(mysql,stmt); + + param_count = mysql_param_count(stmt); + fprintf(stdout," total parameters in update:%d\n", param_count); + + /* tinyint */ + bind[0].buffer_type=FIELD_TYPE_TINY; + bind[0].buffer=(gptr)&tiny_data; + /* string->float */ + bind[1].buffer_type=FIELD_TYPE_STRING; + bind[1].buffer= (gptr)&real_data; + /* double */ + bind[2].buffer_type=FIELD_TYPE_DOUBLE; + bind[2].buffer= (gptr)&double_data; + + tiny_data = 1; + strcpy(real_data,"10.2"); + double_data = 34.5; + rc = mysql_bind_param(stmt,bind); + mystmt(stmt, rc); + + rc = mysql_execute(stmt); + mystmt(stmt, rc); + + rc = (int)mysql_affected_rows(mysql); + printf("\n total affected rows:%d",rc); + + mysql_stmt_close(stmt); + + /* now fetch the results ..*/ + rc = mysql_commit(mysql); + myquery(mysql,rc); + + /* test the results now, only one row should exists */ + rc = mysql_query(mysql,"SELECT * FROM test_double_compare"); + myquery(mysql,rc); + + /* get the result */ + result = mysql_store_result(mysql); + mytest(mysql,result); + + assert((int)tiny_data == my_process_result_set(mysql,result)); + mysql_free_result(result); + +} + + + + +/******************************************************** +* to test simple null * +*********************************************************/ +void test_null(MYSQL *mysql) +{ + MYSQL_STMT *stmt; + int rc,param_count; + const char *query; + int nData=1; + MYSQL_RES *result; + MYSQL_BIND bind[2]={0}; + + myheader("test_null"); + + rc = mysql_query(mysql,"DROP TABLE IF EXISTS test_null"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + rc = mysql_query(mysql,"CREATE TABLE test_null(col1 int,col2 varchar(50))"); + myquery(mysql,rc); + + /* insert by prepare, wrong column name */ + query = "INSERT INTO test_null(col3,col2) VALUES(?,?)"; + nData = strlen(query); + stmt = mysql_prepare(mysql, query); + myxquery_r(mysql,stmt); + + query = "INSERT INTO test_null(col1,col2) VALUES(?,?)"; + nData = strlen(query); + stmt = mysql_prepare(mysql, query); + myxquery(mysql,stmt); + + param_count = mysql_param_count(stmt); + fprintf(stdout," total parameters in insert:%d\n", param_count); + assert(param_count == 2); + + bind[0].is_null=1; + bind[1].is_null=1; /* string data */ + + rc = mysql_bind_param(stmt,bind); + mystmt(stmt, rc); + + /* now, execute the prepared statement to insert 10 records.. */ + for (nData=0; nData<9; nData++) + { + rc = mysql_execute(stmt); + mystmt(stmt, rc); + } + mysql_stmt_close(stmt); + + /* now fetch the results ..*/ + rc = mysql_commit(mysql); + myquery(mysql,rc); + + /* test the results now, only one row should exists */ + rc = mysql_query(mysql,"SELECT * FROM test_null"); + myquery(mysql,rc); + + /* get the result */ + result = mysql_store_result(mysql); + mytest(mysql,result); + + assert(nData == my_process_result_set(mysql,result)); + mysql_free_result(result); + +} + + + +/******************************************************** +* to test simple select * +*********************************************************/ +void test_select_simple(MYSQL *mysql) +{ + MYSQL_STMT *stmt; + int rc,length; + const char query[100]; + MYSQL_RES *result; + + myheader("test_select_simple"); + + + /* insert by prepare */ + strcpy((char *)query, "SHOW TABLES FROM mysql"); + length = strlen(query); + stmt = mysql_prepare(mysql, query); + myxquery(mysql,stmt); + + length = mysql_param_count(stmt); + fprintf(stdout," total parameters in select:%d\n", length); + assert(length == 0); + + rc = mysql_execute(stmt); + mystmt(stmt, rc); + + /* get the result */ + result = mysql_store_result(mysql); + mytest(mysql,result); + + my_process_result_set(mysql,result); + mysql_free_result(result); + +#if 0 + strcpy((char *)query , "SELECT @@ VERSION"); + length = strlen(query); + rc = mysql_query(mysql,query); + mytest(mysql,rc); + + /* get the result */ + result = mysql_store_result(mysql); + mytest(mysql,result); + + my_process_result_set(mysql,result); + mysql_free_result(result); +#endif +} + + + +/******************************************************** +* to test simple select * +*********************************************************/ +void test_select(MYSQL *mysql) +{ + MYSQL_STMT *stmt; + int rc,param_count=0; + const char *query; + char *szData="updated-value"; + int nData=1; + MYSQL_BIND bind[2]={0}; + MYSQL_RES *result; + + + myheader("test_select"); + + rc = mysql_autocommit(mysql,true); + myquery(mysql,rc); + + rc = mysql_query(mysql,"DROP TABLE IF EXISTS test_select"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + rc = mysql_query(mysql,"CREATE TABLE test_select(id int,name varchar(50))"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + /* insert a row and commit the transaction */ + rc = mysql_query(mysql,"INSERT INTO test_select VALUES(10,'venu')"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + /* now insert the second row, and rollback the transaction */ + rc = mysql_query(mysql,"INSERT INTO test_select VALUES(20,'mysql')"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + query = "SELECT * FROM test_select WHERE id=? AND name=?"; + nData = strlen(query); + stmt = mysql_prepare(mysql, query); + myxquery(mysql,stmt); + + param_count = mysql_param_count(stmt); + fprintf(stdout," total parameters in select:%d\n", param_count); + assert(param_count == 2); + + /* string data */ + nData=10;szData="venu"; + bind[1].buffer_type=FIELD_TYPE_STRING; + bind[1].buffer=szData; + bind[0].buffer=(gptr)&nData; + bind[0].buffer_type=FIELD_TYPE_LONG; + + rc = mysql_bind_param(stmt,bind); + mystmt(stmt, rc); + + rc = mysql_execute(stmt); + mystmt(stmt, rc); + + /* get the result */ + result = mysql_store_result(mysql); + mytest(mysql,result); + + assert( 1 == my_process_result_set(mysql,result)); + mysql_free_result(result); + + mysql_stmt_close(stmt); + + /* bit complicated SELECT */ +} + + + + +/******************************************************** +* to test simple update * +*********************************************************/ +void test_simple_update(MYSQL *mysql) +{ + MYSQL_STMT *stmt; + int rc,param_count; + const char *query; + char *szData="updated-value"; + int nData=1; + MYSQL_RES *result; + MYSQL_BIND bind[2]={0}; + + + myheader("test_simple_update"); + + rc = mysql_autocommit(mysql,true); + myquery(mysql,rc); + + rc = mysql_query(mysql,"DROP TABLE IF EXISTS test_update"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + rc = mysql_query(mysql,"CREATE TABLE test_update(col1 int,\ + col2 varchar(50), col3 int )"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + rc = mysql_query(mysql,"INSERT INTO test_update VALUES(1,'MySQL',100)"); + myquery(mysql,rc); + + assert(1 == mysql_affected_rows(mysql)); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + /* insert by prepare */ + query = "UPDATE test_update SET col2=? WHERE col1=?"; + nData = strlen(query); + stmt = mysql_prepare(mysql, query); + myxquery(mysql,stmt); + + param_count = mysql_param_count(stmt); + fprintf(stdout," total parameters in update:%d\n", param_count); + assert(param_count == 2); + + nData=1; + bind[0].buffer_type=FIELD_TYPE_STRING; + bind[0].buffer=szData; /* string data */ + bind[1].buffer=(gptr)&nData; + bind[1].buffer_type=FIELD_TYPE_LONG; + + rc = mysql_bind_param(stmt,bind); + mystmt(stmt, rc); + + rc = mysql_execute(stmt); + mystmt(stmt, rc); + assert(1 == mysql_affected_rows(mysql)); + + mysql_stmt_close(stmt); + + /* now fetch the results ..*/ + rc = mysql_commit(mysql); + myquery(mysql,rc); + + /* test the results now, only one row should exists */ + rc = mysql_query(mysql,"SELECT * FROM test_update"); + myquery(mysql,rc); + + /* get the result */ + result = mysql_store_result(mysql); + mytest(mysql,result); + + assert(1 == my_process_result_set(mysql,result)); + mysql_free_result(result); +} + + +/******************************************************** +* to test simple long data handling * +*********************************************************/ +void test_long_data(MYSQL *mysql) +{ + MYSQL_STMT *stmt; + int rc,param_count; + const char *query; + char *data=NullS; + int length; + MYSQL_RES *result; + MYSQL_BIND bind[2]={0}; + + + myheader("test_long_data"); + + rc = mysql_autocommit(mysql,true); + myquery(mysql,rc); + + rc = mysql_query(mysql,"DROP TABLE IF EXISTS test_long_data"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + rc = mysql_query(mysql,"CREATE TABLE test_long_data(col1 int,\ + col2 long varchar, col3 long varbinary)"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + query = "INSERT INTO test_long_data(col2) VALUES(?)"; + length=strlen(query); + stmt = mysql_prepare(mysql, query); + myxquery(mysql,stmt); + + param_count = mysql_param_count(stmt); + fprintf(stdout," total parameters in insert:%d\n", param_count); + assert(param_count == 1); + + bind[0].buffer=data; /* string data */ + bind[0].is_long_data=1; /* specify long data suppy during run-time */ + + /* Non string or binary type, error */ + bind[0].buffer_type=FIELD_TYPE_LONG; + rc = mysql_bind_param(stmt,bind); + fprintf(stdout,"mysql_bind_param() returned %d\n",rc); + mystmt_r(stmt, rc); + + bind[0].buffer_type=FIELD_TYPE_STRING; + rc = mysql_bind_param(stmt,bind); + mystmt(stmt, rc); + + rc = mysql_execute(stmt); + fprintf(stdout,"mysql_execute() returned %d\n",rc); + assert(rc == MYSQL_NEED_DATA); + + data = "Micheal"; + + /* supply data in pieces */ + rc = mysql_send_long_data(stmt,0,data,7); + mystmt(stmt, rc); + + /* try to execute mysql_execute() now, it should return + MYSQL_NEED_DATA as the long data supply is not yet over + */ + rc = mysql_execute(stmt); + fprintf(stdout,"mysql_execute() returned %d\n",rc); + assert(rc == MYSQL_NEED_DATA); + + /* append data again ..*/ + + /* supply data in pieces */ + data = " 'monty' widenius"; + rc = mysql_send_long_data(stmt,0,data,17); + mystmt(stmt, rc); + + /* Indiate end of data supply */ + rc = mysql_send_long_data(stmt,0,0,MYSQL_LONG_DATA_END); + mystmt(stmt, rc); + + /* execute */ + rc = mysql_execute(stmt); + fprintf(stdout,"mysql_execute() returned %d\n",rc); + mystmt(stmt,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + /* now fetch the results ..*/ + rc = mysql_query(mysql,"SELECT col2 FROM test_long_data"); + myquery(mysql,rc); + + /* get the result */ + result = mysql_store_result(mysql); + mytest(mysql,result); + + assert(1 == my_process_result_set(mysql,result)); + mysql_free_result(result); +} + +/******************************************************** +* to test long data (string) handling * +*********************************************************/ +void test_long_data_str(MYSQL *mysql) +{ + MYSQL_STMT *stmt; + int rc,param_count; + const char *query; + char data[255]; + int length; + MYSQL_RES *result; + MYSQL_BIND bind[2]={0}; + + + myheader("test_long_data_str"); + + rc = mysql_autocommit(mysql,true); + myquery(mysql,rc); + + rc = mysql_query(mysql,"DROP TABLE IF EXISTS test_long_data_str"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + rc = mysql_query(mysql,"CREATE TABLE test_long_data_str(id int, longstr long varchar)"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + query = "INSERT INTO test_long_data_str VALUES(?,?)"; + length=strlen(query); + stmt = mysql_prepare(mysql, query); + myxquery(mysql,stmt); + + param_count = mysql_param_count(stmt); + fprintf(stdout," total parameters in insert:%d\n", param_count); + assert(param_count == 2); + + bind[0].buffer = (gptr)&length; + bind[0].buffer_type = FIELD_TYPE_LONG; + + bind[1].buffer=data; /* string data */ + bind[1].is_long_data=1; /* specify long data suppy during run-time */ + bind[1].buffer_type=FIELD_TYPE_STRING; + rc = mysql_bind_param(stmt,bind); + mystmt(stmt, rc); + + length = 10; + rc = mysql_execute(stmt); + fprintf(stdout,"mysql_execute() returned %d\n",rc); + assert(rc == MYSQL_NEED_DATA); + + length = 40; + sprintf(data,"MySQL AB"); + + /* supply data in pieces */ + { + int i; + for(i=0; i < 4; i++) + { + rc = mysql_send_long_data(stmt,1,(char *)data,5); + mystmt(stmt, rc); + } + + /* try to execute mysql_execute() now, it should return + MYSQL_NEED_DATA as the long data supply is not yet over + */ + rc = mysql_execute(stmt); + fprintf(stdout,"mysql_execute() returned %d\n",rc); + assert(rc == MYSQL_NEED_DATA); + } + + /* Indiate end of data supply */ + rc = mysql_send_long_data(stmt,1,0,MYSQL_LONG_DATA_END); + mystmt(stmt, rc); + + /* execute */ + rc = mysql_execute(stmt); + fprintf(stdout,"mysql_execute() returned %d\n",rc); + mystmt(stmt,rc); + + mysql_stmt_close(stmt); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + /* now fetch the results ..*/ + rc = mysql_query(mysql,"SELECT LENGTH(longstr), longstr FROM test_long_data_str"); + myquery(mysql,rc); + + /* get the result */ + result = mysql_store_result(mysql); + mytest(mysql,result); + + assert(1 == my_process_result_set(mysql,result)); + mysql_free_result(result); +} + + +/******************************************************** +* to test long data (string) handling * +*********************************************************/ +void test_long_data_str1(MYSQL *mysql) +{ + MYSQL_STMT *stmt; + int rc,param_count; + const char *query; + char *data="MySQL AB"; + int length; + MYSQL_RES *result; + MYSQL_BIND bind[2]={0}; + + + myheader("test_long_data_str1"); + + rc = mysql_autocommit(mysql,true); + myquery(mysql,rc); + + rc = mysql_query(mysql,"DROP TABLE IF EXISTS test_long_data_str"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + rc = mysql_query(mysql,"CREATE TABLE test_long_data_str(longstr long varchar,blb long varbinary)"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + query = "INSERT INTO test_long_data_str VALUES(?,?)"; + length=strlen(query); + stmt = mysql_prepare(mysql, query); + myxquery(mysql,stmt); + + param_count = mysql_param_count(stmt); + fprintf(stdout," total parameters in insert:%d\n", param_count); + assert(param_count == 2); + + bind[0].buffer=data; /* string data */ + bind[0].is_long_data=1; /* specify long data suppy during run-time */ + bind[0].buffer_type=FIELD_TYPE_STRING; + + bind[1] = bind[0]; + bind[1].buffer_type=FIELD_TYPE_BLOB; + + rc = mysql_bind_param(stmt,bind); + mystmt(stmt, rc); + + length = 10; + rc = mysql_execute(stmt); + fprintf(stdout,"mysql_execute() returned %d\n",rc); + assert(rc == MYSQL_NEED_DATA); + + length = strlen(data); + + /* supply data in pieces */ + { + int i; + for(i=0; i < 2; i++) + { + rc = mysql_send_long_data(stmt,0,data,length); + mystmt(stmt, rc); + + rc = mysql_send_long_data(stmt,1,data,2); + mystmt(stmt, rc); + } + /* try to execute mysql_execute() now, it should return + MYSQL_NEED_DATA as the long data supply is not yet over + */ + rc = mysql_execute(stmt); + fprintf(stdout,"mysql_execute() returned %d\n",rc); + assert(rc == MYSQL_NEED_DATA); + } + + /* Indiate end of data supply */ + rc = mysql_send_long_data(stmt,1,0,MYSQL_LONG_DATA_END); + mystmt(stmt, rc); + + rc = mysql_execute(stmt); + fprintf(stdout,"mysql_execute() returned %d\n",rc); + assert(rc == MYSQL_NEED_DATA); + + rc = mysql_send_long_data(stmt,0,0,MYSQL_LONG_DATA_END); + mystmt(stmt, rc); + + /* execute */ + rc = mysql_execute(stmt); + fprintf(stdout,"mysql_execute() returned %d\n",rc); + mystmt(stmt,rc); + + mysql_stmt_close(stmt); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + /* now fetch the results ..*/ + rc = mysql_query(mysql,"SELECT LENGTH(longstr),longstr,LENGTH(blb),blb FROM test_long_data_str"); + myquery(mysql,rc); + + /* get the result */ + result = mysql_store_result(mysql); + mytest(mysql,result); + + assert(1 == my_process_result_set(mysql,result)); + mysql_free_result(result); +} + + +/******************************************************** +* to test long data (binary) handling * +*********************************************************/ +void test_long_data_bin(MYSQL *mysql) +{ + MYSQL_STMT *stmt; + int rc,param_count; + const char *query; + char data[255]; + int length; + MYSQL_RES *result; + MYSQL_BIND bind[2]={0}; + + + myheader("test_long_data_bin"); + + rc = mysql_autocommit(mysql,true); + myquery(mysql,rc); + + rc = mysql_query(mysql,"DROP TABLE IF EXISTS test_long_data_bin"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + rc = mysql_query(mysql,"CREATE TABLE test_long_data_bin(id int, longbin long varbinary)"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + query = "INSERT INTO test_long_data_bin VALUES(?,?)"; + length=strlen(query); + stmt = mysql_prepare(mysql, query); + myxquery(mysql,stmt); + + param_count = mysql_param_count(stmt); + fprintf(stdout," total parameters in insert:%d\n", param_count); + assert(param_count == 2); + + bind[0].buffer = (gptr)&length; + bind[0].buffer_type = FIELD_TYPE_LONG; + + bind[1].buffer=data; /* string data */ + bind[1].is_long_data=1; /* specify long data suppy during run-time */ + bind[1].buffer_type=FIELD_TYPE_LONG_BLOB; + rc = mysql_bind_param(stmt,bind); + mystmt(stmt, rc); + + length = 10; + rc = mysql_execute(stmt); + fprintf(stdout,"mysql_execute() returned %d\n",rc); + assert(rc == MYSQL_NEED_DATA); + + sprintf(data,"MySQL AB"); + + /* supply data in pieces */ + { + int i; + for(i=0; i < 100; i++) + { + rc = mysql_send_long_data(stmt,1,(char *)data,4); + mystmt(stmt, rc); + } + + /* try to execute mysql_execute() now, it should return + MYSQL_NEED_DATA as the long data supply is not yet over + */ + rc = mysql_execute(stmt); + fprintf(stdout,"mysql_execute() returned %d\n",rc); + assert(rc == MYSQL_NEED_DATA); + } + + /* Indiate end of data supply */ + rc = mysql_send_long_data(stmt,1,0,MYSQL_LONG_DATA_END); + mystmt(stmt, rc); + + /* execute */ + rc = mysql_execute(stmt); + fprintf(stdout,"mysql_execute() returned %d\n",rc); + mystmt(stmt,rc); + + mysql_stmt_close(stmt); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + /* now fetch the results ..*/ + rc = mysql_query(mysql,"SELECT LENGTH(longbin), longbin FROM test_long_data_bin"); + myquery(mysql,rc); + + /* get the result */ + result = mysql_store_result(mysql); + mytest(mysql,result); + + assert(1 == my_process_result_set(mysql,result)); + mysql_free_result(result); + free(data); +} + + +/******************************************************** +* to test simple delete * +*********************************************************/ +void test_simple_delete(MYSQL *mysql) +{ + MYSQL_STMT *stmt; + int rc,param_count; + const char *query; + char szData[30]={0}; + int nData=1; + MYSQL_RES *result; + MYSQL_BIND bind[2]={0}; + + + myheader("test_simple_delete"); + + rc = mysql_autocommit(mysql,true); + myquery(mysql,rc); + + rc = mysql_query(mysql,"DROP TABLE IF EXISTS test_simple_delete"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + rc = mysql_query(mysql,"CREATE TABLE test_simple_delete(col1 int,\ + col2 varchar(50), col3 int )"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + rc = mysql_query(mysql,"INSERT INTO test_simple_delete VALUES(1,'MySQL',100)"); + myquery(mysql,rc); + + assert(1 == mysql_affected_rows(mysql)); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + /* insert by prepare */ + query = "DELETE FROM test_simple_delete WHERE col1=? AND col2=? AND col3=100"; + nData = strlen(query); + stmt = mysql_prepare(mysql, query); + myxquery(mysql,stmt); + + param_count = mysql_param_count(stmt); + fprintf(stdout," total parameters in delete:%d\n", param_count); + assert(param_count == 2); + + nData=1; + bind[1].buffer_type=FIELD_TYPE_STRING; + bind[1].buffer=szData; /* string data */ + bind[0].buffer=(gptr)&nData; + bind[0].buffer_type=FIELD_TYPE_LONG; + + rc = mysql_bind_param(stmt,bind); + mystmt(stmt, rc); + + strcpy(szData,"MySQL"); + //bind[1].buffer_length = 5; + nData=1; + rc = mysql_execute(stmt); + mystmt(stmt, rc); + assert(1 == mysql_affected_rows(mysql)); + + mysql_stmt_close(stmt); + + /* now fetch the results ..*/ + rc = mysql_commit(mysql); + myquery(mysql,rc); + + /* test the results now, only one row should exists */ + rc = mysql_query(mysql,"SELECT * FROM test_simple_delete"); + myquery(mysql,rc); + + /* get the result */ + result = mysql_store_result(mysql); + mytest(mysql,result); + + assert(0 == my_process_result_set(mysql,result)); + mysql_free_result(result); +} + + + +/******************************************************** +* to test simple update * +*********************************************************/ +void test_update(MYSQL *mysql) +{ + MYSQL_STMT *stmt; + int rc,param_count; + const char *query; + char *szData="updated-value"; + int nData=1; + MYSQL_RES *result; + MYSQL_BIND bind[2]={0}; + + + myheader("test_update"); + + rc = mysql_autocommit(mysql,true); + myquery(mysql,rc); + + rc = mysql_query(mysql,"DROP TABLE IF EXISTS test_update"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + rc = mysql_query(mysql,"CREATE TABLE test_update(col1 int primary key auto_increment,\ + col2 varchar(50), col3 int )"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + query = "INSERT INTO test_update(col2,col3) VALUES(?,?)"; + nData = strlen(query); + stmt = mysql_prepare(mysql, query); + myxquery(mysql,stmt); + + param_count = mysql_param_count(stmt); + fprintf(stdout," total parameters in insert:%d\n", param_count); + assert(param_count == 2); + + /* string data */ + szData="inserted-data"; + bind[0].buffer_type=FIELD_TYPE_STRING; + bind[0].buffer=szData; + bind[1].buffer=(gptr)&nData; + bind[1].buffer_type=FIELD_TYPE_LONG; + + rc = mysql_bind_param(stmt,bind); + mystmt(stmt, rc); + + nData=100; + rc = mysql_execute(stmt); + mystmt(stmt, rc); + + assert(1 == mysql_affected_rows(mysql)); + mysql_stmt_close(stmt); + + /* insert by prepare */ + query = "UPDATE test_update SET col2=? WHERE col3=?"; + nData = strlen(query); + stmt = mysql_prepare(mysql, query); + myxquery(mysql,stmt); + + param_count = mysql_param_count(stmt); + fprintf(stdout," total parameters in update:%d\n", param_count); + assert(param_count == 2); + nData=100;szData="updated-data"; + + + bind[0].buffer_type=FIELD_TYPE_STRING; + bind[0].buffer=szData; + bind[1].buffer=(gptr)&nData; + bind[1].buffer_type=FIELD_TYPE_LONG; + + + rc = mysql_bind_param(stmt,bind); + mystmt(stmt, rc); + + rc = mysql_execute(stmt); + mystmt(stmt, rc); + assert(1 == mysql_affected_rows(mysql)); + + mysql_stmt_close(stmt); + + /* now fetch the results ..*/ + rc = mysql_commit(mysql); + myquery(mysql,rc); + + /* test the results now, only one row should exists */ + rc = mysql_query(mysql,"SELECT * FROM test_update"); + myquery(mysql,rc); + + /* get the result */ + result = mysql_store_result(mysql); + mytest(mysql,result); + + assert(1 == my_process_result_set(mysql,result)); + mysql_free_result(result); +} + + +/******************************************************** +* to test simple prepare * +*********************************************************/ +void test_init_prepare(MYSQL *mysql) +{ + MYSQL_STMT *stmt; + int length, param_count, rc; + const char *query; + MYSQL_RES *result; + + myheader("test_init_prepare"); + + rc = mysql_query(mysql,"DROP TABLE IF EXISTS my_prepare"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + rc = mysql_query(mysql,"CREATE TABLE my_prepare(col1 int ,col2 varchar(50))"); + myquery(mysql,rc); + + + /* insert by prepare */ + query = "INSERT INTO my_prepare VALUES(10,'venu')"; + length = strlen(query); + stmt = mysql_prepare(mysql, query); + myxquery(mysql,stmt); + + param_count = mysql_param_count(stmt); + fprintf(stdout," total parameters in insert:%d\n", param_count); + assert(param_count == 0); + + rc = mysql_execute(stmt); + mystmt(stmt, rc); + + mysql_stmt_close(stmt); + + /* now fetch the results ..*/ + rc = mysql_commit(mysql); + myquery(mysql,rc); + + /* test the results now, only one row should exists */ + rc = mysql_query(mysql,"SELECT * FROM my_prepare"); + myquery(mysql,rc); + + /* get the result */ + result = mysql_store_result(mysql); + mytest(mysql,result); + + assert(1 == my_process_result_set(mysql,result)); + mysql_free_result(result); +} + + +/******************************************************** +* to test simple bind result * +*********************************************************/ +void test_bind_result(MYSQL *mysql) +{ + MYSQL_STMT *stmt; + int rc; + const char query[100]; + int nData; + char szData[100]; + MYSQL_BIND bind[2]={0}; + + myheader("test_bind_result"); + + rc = mysql_query(mysql,"DROP TABLE IF EXISTS test_bind_result"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + rc = mysql_query(mysql,"CREATE TABLE test_bind_result(col1 int ,col2 varchar(50))"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + rc = mysql_query(mysql,"INSERT INTO test_bind_result VALUES(10,'venu')"); + myquery(mysql,rc); + + rc = mysql_query(mysql,"INSERT INTO test_bind_result VALUES(20,'MySQL')"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + /* fetch */ + + bind[0].buffer_type=FIELD_TYPE_LONG; + bind[0].buffer= (gptr) &nData; /* integer data */ + bind[1].buffer_type=FIELD_TYPE_STRING; + bind[1].buffer=szData; /* string data */ + + strcpy((char *)query , "SELECT * FROM test_bind_result"); + nData = strlen(query); + stmt = mysql_prepare(mysql, query); + myxquery(mysql,stmt); + + rc = mysql_bind_result(stmt,bind); + mystmt(stmt, rc); + + rc = mysql_execute(stmt); + mystmt(stmt, rc); + + rc = mysql_fetch(stmt); + mystmt(stmt,rc); + + printf("\n row 1:%d,%s",nData, szData); + assert(nData == 10); + assert(strcmp(szData,"venu")==0); + + rc = mysql_fetch(stmt); + mystmt(stmt,rc); + + printf("\n row 2:%d,%s",nData, szData); + assert(nData == 20); + assert(strcmp(szData,"MySQL")==0); + + rc = mysql_fetch(stmt); + assert(rc == MYSQL_NO_DATA); + + mysql_stmt_close(stmt); +} + +/******************************************************** +* to test simple prepare with all possible types * +*********************************************************/ +void test_prepare_ext(MYSQL *mysql) +{ + MYSQL_STMT *stmt; + int rc,param_count; + char *query; + int nData=1; + MYSQL_RES *result; + char tData=1; + short sData=10; + longlong bData=20; + MYSQL_BIND bind_int[6]={0}; + + + myheader("test_prepare_ext"); + + rc = mysql_query(mysql,"DROP TABLE IF EXISTS test_prepare_ext"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + query = "CREATE TABLE test_prepare_ext\ + (\ + c1 tinyint,\ + c2 smallint,\ + c3 mediumint,\ + c4 int,\ + c5 integer,\ + c6 bigint,\ + c7 float,\ + c8 double,\ + c9 double precision,\ + c10 real,\ + c11 decimal(7,4),\ + c12 numeric(8,4),\ + c13 date,\ + c14 datetime,\ + c15 timestamp(14),\ + c16 time,\ + c17 year,\ + c18 bit,\ + c19 bool,\ + c20 char,\ + c21 char(10),\ + c22 varchar(30),\ + c23 tinyblob,\ + c24 tinytext,\ + c25 blob,\ + c26 text,\ + c27 mediumblob,\ + c28 mediumtext,\ + c29 longblob,\ + c30 longtext,\ + c31 enum('one','two','three'),\ + c32 set('monday','tuesday','wednesday'))"; + + rc = mysql_query(mysql,query); + myquery(mysql,rc); + + /* insert by prepare - all integers */ + query = "INSERT INTO test_prepare_ext(c1,c2,c3,c4,c5,c6) VALUES(?,?,?,?,?,?)"; + stmt = mysql_prepare(mysql,query); + myquery(mysql,rc); + + param_count = mysql_param_count(stmt); + fprintf(stdout," total parameters in insert:%d\n", param_count); + assert(param_count == 6); + + /*tinyint*/ + bind_int[0].buffer_type=FIELD_TYPE_TINY; + bind_int[0].buffer= (void *)&tData; + + /*smallint*/ + bind_int[1].buffer_type=FIELD_TYPE_SHORT; + bind_int[1].buffer= (void *)&sData; + + /*mediumint*/ + bind_int[2].buffer_type=FIELD_TYPE_LONG; + bind_int[2].buffer= (void *)&nData; + + /*int*/ + bind_int[3].buffer_type=FIELD_TYPE_LONG; + bind_int[3].buffer= (void *)&nData; + + /*integer*/ + bind_int[4].buffer_type=FIELD_TYPE_LONG; + bind_int[4].buffer= (void *)&nData; + + /*bigint*/ + bind_int[5].buffer_type=FIELD_TYPE_LONGLONG; + bind_int[5].buffer= (void *)&bData; + + rc = mysql_bind_param(stmt,bind_int); + mystmt(stmt, rc); + + /* + * integer to integer + */ + for (nData=0; nData<10; nData++, tData++, sData++,bData++) + { + rc = mysql_execute(stmt); + mystmt(stmt, rc); + } + mysql_stmt_close(stmt); + + /* now fetch the results ..*/ + rc = mysql_commit(mysql); + myquery(mysql,rc); + + /* test the results now, only one row should exists */ + rc = mysql_query(mysql,"SELECT c1,c2,c3,c4,c5,c6 FROM test_prepare_ext"); + myquery(mysql,rc); + + /* get the result */ + result = mysql_store_result(mysql); + mytest(mysql,result); + + assert(nData == my_process_result_set(mysql,result)); + mysql_free_result(result); +} + + + + +/******************************************************** +* to test real and alias names * +*********************************************************/ +void test_field_names(MYSQL *mysql) +{ + int rc; + MYSQL_RES *result; + + myheader("test_field_names"); + + printf("\n%d,%d,%d",MYSQL_TYPE_DECIMAL,MYSQL_TYPE_NEWDATE,MYSQL_TYPE_ENUM); + rc = mysql_query(mysql,"DROP TABLE IF EXISTS test_field_names1"); + myquery(mysql,rc); + + rc = mysql_query(mysql,"DROP TABLE IF EXISTS test_field_names2"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + rc = mysql_query(mysql,"CREATE TABLE test_field_names1(id int,name varchar(50))"); + myquery(mysql,rc); + + rc = mysql_query(mysql,"CREATE TABLE test_field_names2(id int,name varchar(50))"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + /* with table name included with true column name */ + rc = mysql_query(mysql,"SELECT id as 'id-alias' FROM test_field_names1"); + myquery(mysql,rc); + + result = mysql_use_result(mysql); + mytest(mysql,result); + + assert(0 == my_process_result_set(mysql,result)); + mysql_free_result(result); + + /* with table name included with true column name */ + rc = mysql_query(mysql,"SELECT t1.id as 'id-alias',test_field_names2.name FROM test_field_names1 t1,test_field_names2"); + myquery(mysql,rc); + + result = mysql_use_result(mysql); + mytest(mysql,result); + + assert(0 == my_process_result_set(mysql,result)); + mysql_free_result(result); +} + + +/******************************************************** +* to test multi-query execution * +*********************************************************/ +void test_multi_query(MYSQL *mysql) +{ +#if 0 + int rc; + MYSQL_RES *result; + char *sql; + ulong length; + + myheader("test_multi_query"); + sql = "DROP TABLE IF EXISTS t_multi_query;CREATE TABLE t_multi_query(id int,str char(20));\ + INSERT INTO t_multi_query VALUES(10,'original;');\ + UPDATE t_multi_query SET id=100,str='upd;one' WHERE id = 10;\ + SELECT * FROM t_multi_query"; + + length = strlen(sql); + rc = mysql_multi_query(mysql,sql,length); + myquery(mysql,rc); + + while((result = mysql_next_result(mysql))) + { + my_process_result_set(mysql,result); + mysql_free_result(result); + } +#endif +} + +/******************************************************** +* to test warnings * +*********************************************************/ +void test_warnings(MYSQL *mysql) +{ + int rc; + MYSQL_RES *result; + + myheader("test_warnings"); + + rc = mysql_query(mysql,"USE test"); + myquery(mysql,rc); + + rc = mysql_query(mysql,"SHOW WARNINGS"); + myquery(mysql,rc); + + result = mysql_use_result(mysql); + mytest(mysql,result); + + my_process_result_set(mysql,result); + mysql_free_result(result); +} + +/******************************************************** +* to test errors * +*********************************************************/ +void test_errors(MYSQL *mysql) +{ + int rc; + MYSQL_RES *result; + + myheader("test_errors"); + + rc = mysql_query(mysql,"SHOW ERRORS"); + myquery(mysql,rc); + + result = mysql_use_result(mysql); + mytest(mysql,result); + + my_process_result_set(mysql,result); + mysql_free_result(result); +} + + + +/******************************************************** +* to test simple prepare-insert * +*********************************************************/ +void test_insert(MYSQL *mysql) +{ + MYSQL_STMT *stmt; + int rc,param_count; + char query[200]; + char str_data[50]; + char tiny_data; + MYSQL_RES *result; + MYSQL_BIND bind[2]={0}; + + myheader("test_insert"); + + rc = mysql_autocommit(mysql, true); + myquery(mysql,rc); + + rc = mysql_query(mysql,"DROP TABLE IF EXISTS test_prep_insert"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + rc = mysql_query(mysql,"CREATE TABLE test_prep_insert(col1 tinyint,\ + col2 varchar(50))"); + myquery(mysql,rc); + + /* insert by prepare */ + strcpy(query,"INSERT INTO test_prep_insert VALUES(?,?)"); + stmt = mysql_prepare(mysql, query); + myxquery(mysql,stmt); + + param_count = mysql_param_count(stmt); + fprintf(stdout," total parameters in insert:%d\n", param_count); + assert(param_count == 2); + + /* tinyint */ + bind[0].buffer_type=FIELD_TYPE_TINY; + bind[0].buffer=(gptr)&tiny_data; + /* string */ + bind[1].buffer_type=FIELD_TYPE_STRING; + bind[1].buffer=str_data; + + rc = mysql_bind_param(stmt,bind); + mystmt(stmt, rc); + + /* now, execute the prepared statement to insert 10 records.. */ + for (tiny_data=0; tiny_data < 3; tiny_data++) + { + bind[1].buffer_length = sprintf(str_data,"MySQL%d",tiny_data); + rc = mysql_execute(stmt); + mystmt(stmt, rc); + } + + mysql_stmt_close(stmt); + + /* now fetch the results ..*/ + rc = mysql_commit(mysql); + myquery(mysql,rc); + + /* test the results now, only one row should exists */ + rc = mysql_query(mysql,"SELECT * FROM test_prep_insert"); + myquery(mysql,rc); + + /* get the result */ + result = mysql_store_result(mysql); + mytest(mysql,result); + + assert((int)tiny_data == my_process_result_set(mysql,result)); + mysql_free_result(result); + +} + +/******************************************************** +* to test simple prepare-resultset info * +*********************************************************/ +void test_prepare_resultset(MYSQL *mysql) +{ + MYSQL_STMT *stmt; + int rc,param_count; + char query[200]; + MYSQL_RES *result; + MYSQL_BIND bind[2]={0}; + + myheader("test_prepare_resultset"); + + rc = mysql_autocommit(mysql, true); + myquery(mysql,rc); + + rc = mysql_query(mysql,"DROP TABLE IF EXISTS test_prepare_resultset"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + rc = mysql_query(mysql,"CREATE TABLE test_prepare_resultset(id int,\ + name varchar(50),extra double)"); + myquery(mysql,rc); + + /* insert by prepare */ + strcpy(query,"INSERT INTO test_prepare_resultset(id,name) VALUES(?,?)"); + stmt = mysql_prepare(mysql, query); + myxquery(mysql,stmt); + + param_count = mysql_param_count(stmt); + fprintf(stdout," total parameters in insert:%d\n", param_count); + assert(param_count == 2); + + rc = mysql_query(mysql,"SELECT * FROM test_prepare_resultset"); + myquery(mysql,rc); + + /* get the prepared-result */ + result = mysql_prepare_result(stmt); + assert( result != 0); + + my_print_result_metadata(result); + mysql_free_result(result); + + result = mysql_store_result(mysql); + mytest(mysql,result); + + assert(0 == my_process_result_set(mysql,result)); + mysql_free_result(result); + + /* get the prepared-result */ + result = mysql_prepare_result(stmt); + assert( result != 0); + + my_print_result_metadata(result); + mysql_free_result(result); + + + mysql_stmt_close(stmt); +} + +void test_extra() +{ + printf("\n sizeof(sshort):%d",sizeof(signed short)); + printf("\n sizeof(ushort):%d",sizeof(unsigned short)); + printf("\n sizeof(sint):%d",sizeof(signed int)); + printf("\n sizeof(uint):%d",sizeof(unsigned int)); + printf("\n sizeof(slong):%d",sizeof(signed long)); + printf("\n sizeof(ulong):%d",sizeof(unsigned long)); + printf("\n sizeof(float):%d",sizeof(float)); + printf("\n sizeof(double):%d",sizeof(double)); +} + +/******************************************************** +* to test field flags (verify .NET provider) * +*********************************************************/ + +void test_field_flags(MYSQL *mysql) +{ + int rc; + MYSQL_RES *result; + MYSQL_FIELD *field; + unsigned int i; + + + myheader("test_field_flags"); + + rc = mysql_query(mysql,"DROP TABLE IF EXISTS test_field_flags"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + rc = mysql_query(mysql,"CREATE TABLE test_field_flags(id int NOT NULL AUTO_INCREMENT PRIMARY KEY,\ + id1 int NOT NULL,\ + id2 int UNIQUE,\ + id3 int,\ + id4 int NOT NULL,\ + id5 int,\ + KEY(id3,id4))"); + myquery(mysql,rc); + + rc = mysql_commit(mysql); + myquery(mysql,rc); + + /* with table name included with true column name */ + rc = mysql_query(mysql,"SELECT * FROM test_field_flags"); + myquery(mysql,rc); + + result = mysql_use_result(mysql); + mytest(mysql,result); + + mysql_field_seek(result,0); + fputc('\n', stdout); + + for(i=0; i< mysql_num_fields(result); i++) + { + field = mysql_fetch_field(result); + printf("\nfield:%d",i); + if(field->flags & NOT_NULL_FLAG) + printf("\n NOT_NULL_FLAG"); + if(field->flags & PRI_KEY_FLAG) + printf("\n PRI_KEY_FLAG"); + if(field->flags & UNIQUE_KEY_FLAG) + printf("\n UNIQUE_KEY_FLAG"); + if(field->flags & MULTIPLE_KEY_FLAG) + printf("\n MULTIPLE_KEY_FLAG"); + if(field->flags & AUTO_INCREMENT_FLAG) + printf("\n AUTO_INCREMENT_FLAG"); + + } + mysql_free_result(result); +} + +/******************************************************** +* parsing the test arguments * +*********************************************************/ + +static struct my_option long_options[] = +{ + {"help", '?', "Display this help information and exit.", 0, 0, 0, + GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0 }, + {"database", 'D', "Initial database after connection.", (gptr*)&opt_db, (gptr*)&opt_db, 0, + GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, + {"host", 'h', "Connect to host", (gptr*)&opt_host, (gptr*)&opt_host, 0, + GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, +#ifdef __WIN__ + {"pipe", 'W', "Use named pipes to connect to server.", 0, 0, 0, + GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0 }, +#endif + {"port", 'P', "Port number to use for connection.", 0, 0, 0, + GET_LONG, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, + {"socket", 'S', "Socket file to use for connection.", 0, 0, 0, + GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, + {"user", 'u', "User for login if not current user.", (gptr*)&opt_user, (gptr*)&opt_user, 0, + GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, + {"password", 'p', "Password to use when connecting to server", 0, 0, 0, + GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0 }, + {0, 0, 0, 0} +}; + +static void usage(void) +{ + /* + * show the usage string when the user asks for this + */ + puts("***********************************************************************\n"); + puts(" Test for client-server protocol 4.1"); + puts(" By Monty & Venu \n"); + puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,"); + puts("and you are welcome to modify and redistribute it under the GPL license\n"); + puts(" Copyright (C) 1995-2002 MySQL AB "); + puts("-----------------------------------------------------------------------\n"); + printf("usage: %s [OPTIONS]\n\n", my_progname); + printf("\ + -?, --help Display this help message and exit.\n\ + -D --database=... Database name to be used for test.\n\ + -h, --host=... Connect to host.\n\ + -p, --password[=...] Password to use when connecting to server.\n"); +#ifdef __WIN__ + printf("\ + -W, --pipe Use named pipes to connect to server.\n"); +#endif + printf("\ + -P, --port=... Port number to use for connection.\n\ + -S, --socket=... Socket file to use for connection.\n"); +#ifndef DONT_ALLOW_USER_CHANGE + printf("\ + -u, --user=# User for login if not current user.\n"); +#endif + printf("*********************************************************************\n"); +} + + +static void get_options(register int *argc,register char ***argv) +{ + int c,option_index=0; + + while ((c=getopt_long(*argc,*argv,"D:h:p:u::WP:S:V", + long_options, &option_index)) != EOF) + { + switch(c) { + case 'D': + opt_db=optarg; + case 'h': + opt_host=optarg; + break; + case 'W': +#ifdef __WIN__ + opt_mysql_unix_port=MYSQL_NAMEDPIPE; +#endif + break; + case 'P': + opt_mysql_port= (unsigned int) atoi(optarg); + break; + case 'S': + opt_mysql_unix_port= optarg; + break; + case 'u': + opt_user=optarg; + break; + case 'p': + opt_password=optarg; + while (*optarg) *optarg++= 'x'; /* Destroy argument */ + break; + case '?': + usage(); + exit(0); + } + } + (*argc)-=optind; + (*argv)+=optind; + if (*argc != 0) + { + fprintf(stderr,"Too many arguments (%d)\n",*argc); + usage(); + exit(-1); + } + return; +} + + +/******************************************************** +* main routine * +*********************************************************/ +int main(int argc, char *argv[]) +{ + MYSQL *mysql; + + + MY_INIT(argv[0]); + get_options(&argc,&argv); + + mysql = client_connect(); /* connect to server */ + + test_select(mysql); /* simple prepare-select */ + test_insert(mysql); /* prepare with insert */ + test_bind_result(mysql); /* result bind test */ + test_prepare(mysql); /* prepare test */ + test_prepare_simple(mysql);/* simple prepare */ + test_null(mysql); /* test null data handling */ + test_debug_example(mysql); /* some debugging case */ + test_update(mysql); /* prepare-update test */ + test_simple_update(mysql); /* simple prepare with update */ + test_long_data(mysql); /* long data handling in pieces */ + test_simple_delete(mysql); /* prepare with delete */ + test_field_names(mysql); /* test for field names */ + test_double_compare(mysql);/* float comparision */ + client_query(mysql); /* simple client query test */ + client_store_result(mysql);/* usage of mysql_store_result() */ + client_use_result(mysql); /* usage of mysql_use_result() */ + test_tran_bdb(mysql); /* transaction test on BDB table type */ + test_tran_innodb(mysql); /* transaction test on InnoDB table type */ + test_prepare_ext(mysql); /* test prepare with all types conversion -- TODO */ + test_prepare_syntax(mysql);/* syntax check for prepares */ + test_prepare_field_result(mysql); /* prepare meta info */ + test_field_names(mysql); /* test for field names */ + test_field_flags(mysql); /* test to help .NET provider team */ + test_long_data_str(mysql); /* long data handling */ + test_long_data_str1(mysql);/* yet another long data handling */ + test_long_data_bin(mysql); /* long binary insertion */ + test_warnings(mysql); /* show warnings test */ + test_errors(mysql); /* show errors test */ + test_extra(); /* misc case */ + test_select_simple(mysql); /* simple select prepare */ + test_prepare_resultset(mysql);/* prepare meta info test */ + test_multi_query(mysql); /* Not yet supported */ + + + client_disconnect(mysql); /* disconnect from server */ + + fprintf(stdout,"\ndone !!!\n"); + return(0); +} -- cgit v1.2.1 From 450006e6d35a6d00f2790c8fbe8edb3443cc7a0c Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 13 Jun 2002 17:36:15 -0700 Subject: client_test.c: Forgot to include the portable changes from previous commit tests/client_test.c: Forgot to include the portable changes from previous commit --- tests/client_test.c | 277 ++++++++++++++++++++++------------------------------ 1 file changed, 119 insertions(+), 158 deletions(-) diff --git a/tests/client_test.c b/tests/client_test.c index 169ab9556d1..f988b7dec9a 100644 --- a/tests/client_test.c +++ b/tests/client_test.c @@ -48,35 +48,42 @@ #define false 0 #endif -static char *opt_db="test", *opt_user="venu", *opt_password="venu"; -static char *opt_host=0, *opt_mysql_unix_port=0; -static uint opt_mysql_port; +/* set default options */ +static char *opt_db=(char *)"test"; +static char *opt_user=(char *)"root"; +static char *opt_password=(char *)""; +static char *opt_host=0; +static char *opt_unix_socket=0; +static uint opt_port; +static my_bool tty_password=0; #define myheader(str) { printf("\n\n#######################\n"); \ printf("%s",str); \ printf("\n#######################\n"); \ } -void print_error(MYSQL *mysql, const char *msg, int line, char *file) +#define init_bind(x) (bzero(x,sizeof(x))) + +void print_error(MYSQL *mysql, const char *msg) { if(mysql) { - fprintf(stderr,"\n %d@[MySQL]%s\n",line,mysql_error(mysql)); + fprintf(stderr,"\n [MySQL]%s \n",mysql_error(mysql)); } - else if(msg) fprintf(stderr, " %d@%s\n", line,msg); + else if(msg) fprintf(stderr, "%s\n", msg); } -void print_st_error(MYSQL_STMT *stmt, const char *msg, int line, char *file) +void print_st_error(MYSQL_STMT *stmt, const char *msg) { if(stmt) { - fprintf(stderr,"\n %d@[MySQL]%s\n",line, mysql_stmt_error(stmt)); + fprintf(stderr,"\n [MySQL]%s \n",mysql_stmt_error(stmt)); } - else if(msg) fprintf(stderr, " %d@%s\n", line,msg); + else if(msg) fprintf(stderr, "%s\n", msg); } -#define myerror(mysql, msg) print_error(mysql, msg, __LINE__, __FILE__) -#define mysterror(stmt, msg) print_st_error(stmt, msg, __LINE__, __FILE__) +#define myerror(mysql, msg) print_error(mysql, msg) +#define mysterror(stmt, msg) print_st_error(stmt, msg) #define myassert(x) if(x) {\ fprintf(stderr,"ASSERTION FAILED AT %d@%s\n",__LINE__, __FILE__);\ @@ -148,8 +155,8 @@ MYSQL *client_connect() exit(0); } if (!(mysql_real_connect(mysql,opt_host,opt_user, - opt_password, opt_db, opt_mysql_port, - opt_mysql_unix_port, 0))) + opt_password, opt_db, opt_port, + opt_unix_socket, 0))) { myerror(mysql, "connection failed"); exit(0); @@ -304,7 +311,7 @@ int my_process_result_set(MYSQL *mysql, MYSQL_RES *result) if (mysql_errno(mysql) != 0) fprintf(stderr, "\n\tmysql_fetch_row() failed\n"); else - fprintf(stdout,"\n\t%lu rows returned\n", row_count); + fprintf(stdout,"\n\t%d rows returned\n", row_count); return(row_count); } @@ -722,7 +729,7 @@ void test_prepare(MYSQL *mysql) MYSQL_STMT *stmt; int rc,param_count; char query[200]; - long int_data; + int int_data; char str_data[50]; char tiny_data; short small_data; @@ -730,10 +737,11 @@ void test_prepare(MYSQL *mysql) double real_data; double double_data; MYSQL_RES *result; - MYSQL_BIND bind[8]={0}; + MYSQL_BIND bind[8]; myheader("test_prepare"); + init_bind(bind); rc = mysql_autocommit(mysql, true); myquery(mysql,rc); @@ -831,10 +839,11 @@ void test_double_compare(MYSQL *mysql) char query[200],real_data[10], tiny_data; double double_data; MYSQL_RES *result; - MYSQL_BIND bind[3]={0}; + MYSQL_BIND bind[3]; myheader("test_double_compare"); + init_bind(bind); rc = mysql_autocommit(mysql, true); myquery(mysql,rc); @@ -912,10 +921,11 @@ void test_null(MYSQL *mysql) const char *query; int nData=1; MYSQL_RES *result; - MYSQL_BIND bind[2]={0}; + MYSQL_BIND bind[2]; myheader("test_null"); + init_bind(bind); rc = mysql_query(mysql,"DROP TABLE IF EXISTS test_null"); myquery(mysql,rc); @@ -1022,7 +1032,6 @@ void test_select_simple(MYSQL *mysql) } - /******************************************************** * to test simple select * *********************************************************/ @@ -1031,14 +1040,15 @@ void test_select(MYSQL *mysql) MYSQL_STMT *stmt; int rc,param_count=0; const char *query; - char *szData="updated-value"; + char *szData=(char *)"updated-value"; int nData=1; - MYSQL_BIND bind[2]={0}; + MYSQL_BIND bind[2]; MYSQL_RES *result; myheader("test_select"); + init_bind(bind); rc = mysql_autocommit(mysql,true); myquery(mysql,rc); @@ -1078,7 +1088,8 @@ void test_select(MYSQL *mysql) assert(param_count == 2); /* string data */ - nData=10;szData="venu"; + nData=10; + szData=(char *)"venu"; bind[1].buffer_type=FIELD_TYPE_STRING; bind[1].buffer=szData; bind[0].buffer=(gptr)&nData; @@ -1113,14 +1124,15 @@ void test_simple_update(MYSQL *mysql) MYSQL_STMT *stmt; int rc,param_count; const char *query; - char *szData="updated-value"; + char *szData=(char *)"updated-value"; int nData=1; MYSQL_RES *result; - MYSQL_BIND bind[2]={0}; + MYSQL_BIND bind[2]; myheader("test_simple_update"); + init_bind(bind); rc = mysql_autocommit(mysql,true); myquery(mysql,rc); @@ -1198,11 +1210,12 @@ void test_long_data(MYSQL *mysql) char *data=NullS; int length; MYSQL_RES *result; - MYSQL_BIND bind[2]={0}; + MYSQL_BIND bind[2]; myheader("test_long_data"); + init_bind(bind); rc = mysql_autocommit(mysql,true); myquery(mysql,rc); @@ -1245,7 +1258,7 @@ void test_long_data(MYSQL *mysql) fprintf(stdout,"mysql_execute() returned %d\n",rc); assert(rc == MYSQL_NEED_DATA); - data = "Micheal"; + data = (char *)"Micheal"; /* supply data in pieces */ rc = mysql_send_long_data(stmt,0,data,7); @@ -1261,7 +1274,7 @@ void test_long_data(MYSQL *mysql) /* append data again ..*/ /* supply data in pieces */ - data = " 'monty' widenius"; + data = (char *)" 'monty' widenius"; rc = mysql_send_long_data(stmt,0,data,17); mystmt(stmt, rc); @@ -1300,11 +1313,12 @@ void test_long_data_str(MYSQL *mysql) char data[255]; int length; MYSQL_RES *result; - MYSQL_BIND bind[2]={0}; + MYSQL_BIND bind[2]; myheader("test_long_data_str"); + init_bind(bind); rc = mysql_autocommit(mysql,true); myquery(mysql,rc); @@ -1398,14 +1412,15 @@ void test_long_data_str1(MYSQL *mysql) MYSQL_STMT *stmt; int rc,param_count; const char *query; - char *data="MySQL AB"; + char *data=(char *)"MySQL AB"; int length; MYSQL_RES *result; - MYSQL_BIND bind[2]={0}; + MYSQL_BIND bind[2]; myheader("test_long_data_str1"); + init_bind(bind); rc = mysql_autocommit(mysql,true); myquery(mysql,rc); @@ -1511,11 +1526,12 @@ void test_long_data_bin(MYSQL *mysql) char data[255]; int length; MYSQL_RES *result; - MYSQL_BIND bind[2]={0}; + MYSQL_BIND bind[2]; myheader("test_long_data_bin"); + init_bind(bind); rc = mysql_autocommit(mysql,true); myquery(mysql,rc); @@ -1597,7 +1613,6 @@ void test_long_data_bin(MYSQL *mysql) assert(1 == my_process_result_set(mysql,result)); mysql_free_result(result); - free(data); } @@ -1612,11 +1627,12 @@ void test_simple_delete(MYSQL *mysql) char szData[30]={0}; int nData=1; MYSQL_RES *result; - MYSQL_BIND bind[2]={0}; + MYSQL_BIND bind[2]; myheader("test_simple_delete"); + init_bind(bind); rc = mysql_autocommit(mysql,true); myquery(mysql,rc); @@ -1695,14 +1711,15 @@ void test_update(MYSQL *mysql) MYSQL_STMT *stmt; int rc,param_count; const char *query; - char *szData="updated-value"; + char *szData=(char *)"updated-value"; int nData=1; MYSQL_RES *result; - MYSQL_BIND bind[2]={0}; + MYSQL_BIND bind[2]; myheader("test_update"); + init_bind(bind); rc = mysql_autocommit(mysql,true); myquery(mysql,rc); @@ -1729,7 +1746,7 @@ void test_update(MYSQL *mysql) assert(param_count == 2); /* string data */ - szData="inserted-data"; + szData=(char *)"inserted-data"; bind[0].buffer_type=FIELD_TYPE_STRING; bind[0].buffer=szData; bind[1].buffer=(gptr)&nData; @@ -1754,7 +1771,7 @@ void test_update(MYSQL *mysql) param_count = mysql_param_count(stmt); fprintf(stdout," total parameters in update:%d\n", param_count); assert(param_count == 2); - nData=100;szData="updated-data"; + nData=100;szData=(char *)"updated-data"; bind[0].buffer_type=FIELD_TYPE_STRING; @@ -1853,10 +1870,11 @@ void test_bind_result(MYSQL *mysql) const char query[100]; int nData; char szData[100]; - MYSQL_BIND bind[2]={0}; + MYSQL_BIND bind[2]; - myheader("test_bind_result"); + myheader("test_bind_result"); + init_bind(bind); rc = mysql_query(mysql,"DROP TABLE IF EXISTS test_bind_result"); myquery(mysql,rc); @@ -1929,10 +1947,12 @@ void test_prepare_ext(MYSQL *mysql) char tData=1; short sData=10; longlong bData=20; - MYSQL_BIND bind_int[6]={0}; + MYSQL_BIND bind_int[6]; myheader("test_prepare_ext"); + + init_bind(bind_int); rc = mysql_query(mysql,"DROP TABLE IF EXISTS test_prepare_ext"); myquery(mysql,rc); @@ -1940,7 +1960,7 @@ void test_prepare_ext(MYSQL *mysql) rc = mysql_commit(mysql); myquery(mysql,rc); - query = "CREATE TABLE test_prepare_ext\ + query = (char *)"CREATE TABLE test_prepare_ext\ (\ c1 tinyint,\ c2 smallint,\ @@ -1979,7 +1999,7 @@ void test_prepare_ext(MYSQL *mysql) myquery(mysql,rc); /* insert by prepare - all integers */ - query = "INSERT INTO test_prepare_ext(c1,c2,c3,c4,c5,c6) VALUES(?,?,?,?,?,?)"; + query = (char *)"INSERT INTO test_prepare_ext(c1,c2,c3,c4,c5,c6) VALUES(?,?,?,?,?,?)"; stmt = mysql_prepare(mysql,query); myquery(mysql,rc); @@ -2093,36 +2113,6 @@ void test_field_names(MYSQL *mysql) mysql_free_result(result); } - -/******************************************************** -* to test multi-query execution * -*********************************************************/ -void test_multi_query(MYSQL *mysql) -{ -#if 0 - int rc; - MYSQL_RES *result; - char *sql; - ulong length; - - myheader("test_multi_query"); - sql = "DROP TABLE IF EXISTS t_multi_query;CREATE TABLE t_multi_query(id int,str char(20));\ - INSERT INTO t_multi_query VALUES(10,'original;');\ - UPDATE t_multi_query SET id=100,str='upd;one' WHERE id = 10;\ - SELECT * FROM t_multi_query"; - - length = strlen(sql); - rc = mysql_multi_query(mysql,sql,length); - myquery(mysql,rc); - - while((result = mysql_next_result(mysql))) - { - my_process_result_set(mysql,result); - mysql_free_result(result); - } -#endif -} - /******************************************************** * to test warnings * *********************************************************/ @@ -2179,7 +2169,7 @@ void test_insert(MYSQL *mysql) char str_data[50]; char tiny_data; MYSQL_RES *result; - MYSQL_BIND bind[2]={0}; + MYSQL_BIND bind[2]; myheader("test_insert"); @@ -2197,6 +2187,7 @@ void test_insert(MYSQL *mysql) myquery(mysql,rc); /* insert by prepare */ + bzero(bind, sizeof(bind)); strcpy(query,"INSERT INTO test_prep_insert VALUES(?,?)"); stmt = mysql_prepare(mysql, query); myxquery(mysql,stmt); @@ -2251,7 +2242,6 @@ void test_prepare_resultset(MYSQL *mysql) int rc,param_count; char query[200]; MYSQL_RES *result; - MYSQL_BIND bind[2]={0}; myheader("test_prepare_resultset"); @@ -2299,23 +2289,10 @@ void test_prepare_resultset(MYSQL *mysql) my_print_result_metadata(result); mysql_free_result(result); - mysql_stmt_close(stmt); } -void test_extra() -{ - printf("\n sizeof(sshort):%d",sizeof(signed short)); - printf("\n sizeof(ushort):%d",sizeof(unsigned short)); - printf("\n sizeof(sint):%d",sizeof(signed int)); - printf("\n sizeof(uint):%d",sizeof(unsigned int)); - printf("\n sizeof(slong):%d",sizeof(signed long)); - printf("\n sizeof(ulong):%d",sizeof(unsigned long)); - printf("\n sizeof(float):%d",sizeof(float)); - printf("\n sizeof(double):%d",sizeof(double)); -} - /******************************************************** * to test field flags (verify .NET provider) * *********************************************************/ @@ -2377,31 +2354,24 @@ void test_field_flags(MYSQL *mysql) mysql_free_result(result); } -/******************************************************** -* parsing the test arguments * -*********************************************************/ - -static struct my_option long_options[] = +static struct my_option myctest_long_options[] = { - {"help", '?', "Display this help information and exit.", 0, 0, 0, - GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0 }, - {"database", 'D', "Initial database after connection.", (gptr*)&opt_db, (gptr*)&opt_db, 0, - GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, - {"host", 'h', "Connect to host", (gptr*)&opt_host, (gptr*)&opt_host, 0, - GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, -#ifdef __WIN__ - {"pipe", 'W', "Use named pipes to connect to server.", 0, 0, 0, - GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0 }, -#endif - {"port", 'P', "Port number to use for connection.", 0, 0, 0, - GET_LONG, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, - {"socket", 'S', "Socket file to use for connection.", 0, 0, 0, - GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, - {"user", 'u', "User for login if not current user.", (gptr*)&opt_user, (gptr*)&opt_user, 0, - GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, - {"password", 'p', "Password to use when connecting to server", 0, 0, 0, - GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0 }, - {0, 0, 0, 0} + {"help", '?', "Display this help and exit", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, + 0, 0, 0, 0, 0}, + {"database", 'D', "Database to use", (gptr*) &opt_db, (gptr*) &opt_db, + 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"host", 'h', "Connect to host", (gptr*) &opt_host, (gptr*) &opt_host, 0, GET_STR, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"password", 'p', + "Password to use when connecting to server. If password is not given it's asked from the tty.", + 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, + {"user", 'u', "User for login if not current user", (gptr*) &opt_user, + (gptr*) &opt_user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"port", 'P', "Port number to use for connection", (gptr*) &opt_port, + (gptr*) &opt_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"socket", 'S', "Socket file to use for connection", (gptr*) &opt_unix_socket, + (gptr*) &opt_unix_socket, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} }; static void usage(void) @@ -2436,65 +2406,58 @@ static void usage(void) printf("*********************************************************************\n"); } - -static void get_options(register int *argc,register char ***argv) +static my_bool +get_one_option(int optid, const struct my_option *opt __attribute__((unused)), + char *argument) { - int c,option_index=0; - - while ((c=getopt_long(*argc,*argv,"D:h:p:u::WP:S:V", - long_options, &option_index)) != EOF) - { - switch(c) { - case 'D': - opt_db=optarg; - case 'h': - opt_host=optarg; - break; - case 'W': -#ifdef __WIN__ - opt_mysql_unix_port=MYSQL_NAMEDPIPE; -#endif - break; - case 'P': - opt_mysql_port= (unsigned int) atoi(optarg); - break; - case 'S': - opt_mysql_unix_port= optarg; - break; - case 'u': - opt_user=optarg; - break; - case 'p': - opt_password=optarg; - while (*optarg) *optarg++= 'x'; /* Destroy argument */ - break; - case '?': - usage(); - exit(0); + switch (optid) { + case 'p': + if (argument) + { + my_free(opt_password, MYF(MY_ALLOW_ZERO_PTR)); + opt_password= my_strdup(argument, MYF(MY_FAE)); + while (*argument) *argument++= 'x'; /* Destroy argument */ } - } - (*argc)-=optind; - (*argv)+=optind; - if (*argc != 0) - { - fprintf(stderr,"Too many arguments (%d)\n",*argc); + else + tty_password= 1; + break; + case '?': + case 'I': /* Info */ usage(); - exit(-1); + exit(1); + break; } - return; + return 0; } +static const char *load_default_groups[]= { "client",0 }; + +static void get_options(int argc, char **argv) +{ + int ho_error; + + load_defaults("my",load_default_groups,&argc,&argv); + + if ((ho_error=handle_options(&argc, &argv, myctest_long_options, + get_one_option))) + exit(ho_error); + + free_defaults(argv); + if (tty_password) + opt_password=get_tty_password(NullS); + return; +} /******************************************************** * main routine * *********************************************************/ -int main(int argc, char *argv[]) +int main(int argc, char **argv) { MYSQL *mysql; MY_INIT(argv[0]); - get_options(&argc,&argv); + get_options(argc,argv); /* don't work -- options : TODO */ mysql = client_connect(); /* connect to server */ @@ -2526,14 +2489,12 @@ int main(int argc, char *argv[]) test_long_data_bin(mysql); /* long binary insertion */ test_warnings(mysql); /* show warnings test */ test_errors(mysql); /* show errors test */ - test_extra(); /* misc case */ test_select_simple(mysql); /* simple select prepare */ test_prepare_resultset(mysql);/* prepare meta info test */ - test_multi_query(mysql); /* Not yet supported */ - client_disconnect(mysql); /* disconnect from server */ fprintf(stdout,"\ndone !!!\n"); return(0); } + -- cgit v1.2.1 From a40a485b5cea523b74d8ebb2b27faa21488f7210 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 14 Jun 2002 15:08:50 -0700 Subject: Makefile.am: Added missing sql_prepare.cc & sql_error.cc to libmysqld sql_error.cc, sql_prepare.cc: new file libmysqld/Makefile.am: Added missing sql_prepare.cc & sql_error.cc to libmysqld --- libmysqld/Makefile.am | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libmysqld/Makefile.am b/libmysqld/Makefile.am index ee35011db3a..4c90c6e3e74 100644 --- a/libmysqld/Makefile.am +++ b/libmysqld/Makefile.am @@ -49,9 +49,10 @@ sqlsources = convert.cc derror.cc field.cc field_conv.cc filesort.cc \ opt_sum.cc procedure.cc records.cc sql_acl.cc \ repl_failsafe.cc slave.cc \ sql_analyse.cc sql_base.cc sql_cache.cc sql_class.cc \ - sql_crypt.cc sql_db.cc sql_delete.cc sql_insert.cc sql_lex.cc \ - sql_list.cc sql_manager.cc sql_map.cc sql_parse.cc sql_derived.cc \ - sql_rename.cc sql_repl.cc sql_select.cc sql_do.cc sql_show.cc \ + sql_crypt.cc sql_db.cc sql_delete.cc sql_error.cc sql_insert.cc \ + sql_lex.cc sql_list.cc sql_manager.cc sql_map.cc sql_parse.cc \ + sql_prepare.cc sql_derived.cc sql_rename.cc sql_repl.cc \ + sql_select.cc sql_do.cc sql_show.cc \ sql_string.cc sql_table.cc sql_test.cc sql_udf.cc \ sql_update.cc sql_yacc.cc table.cc thr_malloc.cc time.cc \ unireg.cc uniques.cc stacktrace.c sql_union.cc hash_filo.cc \ -- cgit v1.2.1 -- cgit v1.2.1 From 16c2fdffc0b168ab9a888589a376b0097a511bc5 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 17 Jun 2002 19:20:35 +0500 Subject: All instances of "ulong" were replaced with "unsigned long" for portability reasons. Failed to compile at least on freebsd. --- include/mysql.h | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/include/mysql.h b/include/mysql.h index d667647d46d..23da848a8b5 100644 --- a/include/mysql.h +++ b/include/mysql.h @@ -425,13 +425,13 @@ typedef struct st_mysql_bind { enum enum_field_types buffer_type; /* buffer type */ enum enum_field_types field_type; /* field type */ - gptr buffer; /* buffer */ - long *length; /* output length pointer */ - ulong buffer_length; /* buffer length */ - ulong bind_length; /* internal use */ - my_bool is_null; /* NULL indicator */ - my_bool is_long_data; /* long data indicator */ - my_bool long_ended; /* internal use */ + gptr buffer; /* buffer */ + long *length; /* output length pointer */ + unsigned long buffer_length; /* buffer length */ + unsigned long bind_length; /* internal use */ + my_bool is_null; /* NULL indicator */ + my_bool is_long_data; /* long data indicator */ + my_bool long_ended; /* internal use */ } MYSQL_BIND; @@ -444,9 +444,9 @@ typedef struct st_mysql_stmt { MYSQL_BIND *bind; /* row binding */ MYSQL_FIELD *fields; /* prepare meta info */ MEM_ROOT mem_root; /* root allocations */ - ulong param_count; /* parameters count */ - ulong field_count; /* fields count */ - ulong long_length; /* long buffer alloced length */ + unsigned long param_count; /* parameters count */ + unsigned long field_count; /* fields count */ + unsigned long long_length; /* long buffer alloced length */ uint err_no; /* error code */ char error[MYSQL_ERRMSG_SIZE]; /* error message */ char *query; /* query buffer */ @@ -460,7 +460,7 @@ typedef struct st_mysql_stmt { MYSQL_STMT * STDCALL mysql_prepare(MYSQL * mysql, const char *query); int STDCALL mysql_execute(MYSQL_STMT * stmt); -ulong STDCALL mysql_param_count(MYSQL_STMT * stmt); +unsigned long STDCALL mysql_param_count(MYSQL_STMT * stmt); int STDCALL mysql_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bind); int STDCALL mysql_bind_result(MYSQL_STMT * stmt, MYSQL_BIND * bind); int STDCALL mysql_stmt_close(MYSQL_STMT * stmt); @@ -471,8 +471,9 @@ int STDCALL mysql_rollback(MYSQL * mysql); int STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode); int STDCALL mysql_fetch(MYSQL_STMT *stmt); my_bool STDCALL mysql_send_long_data(MYSQL_STMT *stmt, - uint param_number,gptr data, ulong length); -int STDCALL mysql_multi_query(MYSQL *mysql,const char *query,ulong length); + uint param_number,gptr data, + unsigned long length); +int STDCALL mysql_multi_query(MYSQL *mysql,const char *query,unsigned long len); MYSQL_RES *STDCALL mysql_next_result(MYSQL *mysql); MYSQL_RES * STDCALL mysql_prepare_result(MYSQL_STMT *stmt); -- cgit v1.2.1 From 2ec3617476e7731c5f6b704b0321d6be60822b2d Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 17 Jun 2002 22:43:40 +0500 Subject: UCS2 charset has been added --- acconfig.h | 1 + configure.in | 8 +- include/m_ctype.h | 34 ++++++ sql/share/charsets/Index | 1 + strings/ctype-utf8.c | 309 +++++++++++++++++++++++++++++++++++++++++++++++ strings/ctype.c | 33 +++++ 6 files changed, 384 insertions(+), 2 deletions(-) diff --git a/acconfig.h b/acconfig.h index bcf07015534..cf276d0b848 100644 --- a/acconfig.h +++ b/acconfig.h @@ -94,6 +94,7 @@ #undef HAVE_CHARSET_sjis #undef HAVE_CHARSET_swe7 #undef HAVE_CHARSET_tis620 +#undef HAVE_CHARSET_ucs2 #undef HAVE_CHARSET_ujis #undef HAVE_CHARSET_usa7 #undef HAVE_CHARSET_utf8 diff --git a/configure.in b/configure.in index 53c235fd9e1..c8b3c7af13f 100644 --- a/configure.in +++ b/configure.in @@ -1942,10 +1942,10 @@ AC_DIVERT_PUSH(0) CHARSETS_AVAILABLE="armscii8 big5 cp1251 cp1257 croat czech danish dec8 dos estonia euc_kr gb2312 gbk german1 greek hebrew hp8 hungarian koi8_ru koi8_ukr - latin1 latin1_de latin2 latin5 sjis swe7 tis620 ujis + latin1 latin1_de latin2 latin5 sjis swe7 tis620 ucs2 ujis usa7 utf8 win1250 win1250ch win1251ukr" CHARSETS_DEPRECATED="win1251" -CHARSETS_COMPLEX="big5 czech euc_kr gb2312 gbk latin1_de sjis tis620 ujis utf8 win1250ch" +CHARSETS_COMPLEX="big5 czech euc_kr gb2312 gbk latin1_de sjis tis620 ucs2 ujis utf8 win1250ch" DEFAULT_CHARSET=latin1 AC_DIVERT_POP @@ -2067,6 +2067,10 @@ do tis620) AC_DEFINE(HAVE_CHARSET_tis620) ;; + ucs2) + AC_DEFINE(HAVE_CHARSET_ucs2) + use_mb="yes" + ;; ujis) AC_DEFINE(HAVE_CHARSET_ujis) use_mb="yes" diff --git a/include/m_ctype.h b/include/m_ctype.h index d8593e20fd1..3715402b4f4 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -287,6 +287,40 @@ void my_hash_sort_utf8(struct charset_info_st *cs, const uchar *key, uint len, u #endif + +#ifdef HAVE_CHARSET_ucs2 + +extern uchar ctype_ucs2[]; +extern uchar to_lower_ucs2[]; +extern uchar to_upper_ucs2[]; + +int my_strnncoll_ucs2(CHARSET_INFO *cs, + const uchar *s, uint s_len, const uchar *t, uint t_len); + +int my_strnxfrm_ucs2(CHARSET_INFO *cs, + uchar *dest, uint destlen, const uchar *src, uint srclen); + +int my_ismbchar_ucs2(CHARSET_INFO *cs, const char *b, const char *e); +my_bool my_ismbhead_ucs2(CHARSET_INFO * cs, uint ch); +int my_mbcharlen_ucs2(CHARSET_INFO *cs, uint c); + +void my_caseup_str_ucs2(CHARSET_INFO * cs, char * s); +void my_casedn_str_ucs2(CHARSET_INFO *cs, char * s); +void my_caseup_ucs2(CHARSET_INFO *cs, char *s, uint len); +void my_casedn_ucs2(CHARSET_INFO *cs, char *s, uint len); + +int my_strcasecmp_ucs2(CHARSET_INFO *cs, const char *s, const char *t); +int my_strncasecmp_ucs2(CHARSET_INFO *cs, const char *s,const char *t,uint l); + +int my_ucs2_uni (CHARSET_INFO *cs, my_wc_t *p, const uchar *s, const uchar *e); +int my_uni_ucs2 (CHARSET_INFO *cs, my_wc_t wc, uchar *b, uchar *e); + +uint my_hash_caseup_ucs2(struct charset_info_st *cs, const byte *key, uint len); +void my_hash_sort_ucs2(struct charset_info_st *cs, const uchar *key, uint len, ulong *nr1, ulong *nr2); + +#endif + + #define _U 01 /* Upper case */ #define _L 02 /* Lower case */ #define _NMR 04 /* Numeral (digit) */ diff --git a/sql/share/charsets/Index b/sql/share/charsets/Index index 075cdc9872b..52cb6b99705 100644 --- a/sql/share/charsets/Index +++ b/sql/share/charsets/Index @@ -39,3 +39,4 @@ latin1_de 31 armscii8 32 utf8 33 win1250ch 34 +ucs2 35 diff --git a/strings/ctype-utf8.c b/strings/ctype-utf8.c index a4485e1ef50..1cce8819619 100644 --- a/strings/ctype-utf8.c +++ b/strings/ctype-utf8.c @@ -25,6 +25,10 @@ #define HAVE_UNIDATA #endif +#ifdef HAVE_CHARSET_ucs2 +#define HAVE_UNIDATA +#endif + #ifdef HAVE_UNIDATA static MY_UNICASE_INFO plane00[]={ @@ -1999,4 +2003,309 @@ int main() #endif +#endif /* HAVE_CHARSET_UTF8 */ + + + +#ifdef HAVE_CHARSET_ucs2 + +uchar ctype_ucs2[] = { + 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +uchar to_lower_ucs2[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +uchar to_upper_ucs2[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + + +int my_ucs2_uni (CHARSET_INFO *cs __attribute__((unused)) , + my_wc_t * pwc, const uchar *s, const uchar *e) +{ + if (s+2 > e) /* Need 2 characters */ + return MY_CS_ILSEQ; + + *pwc= ((unsigned char)s[0]) * 256 + ((unsigned char)s[1]); + return 2; +} + +int my_uni_ucs2 (CHARSET_INFO *cs __attribute__((unused)) , + my_wc_t wc, uchar *r, uchar *e) +{ + if ( r+2 > e ) + return MY_CS_TOOSMALL; + + r[0]=wc >> 8; + r[1]=wc & 0xFF; + return 2; +} + + +void my_caseup_ucs2(CHARSET_INFO *cs, char *s, uint slen) +{ + my_wc_t wc; + int res; + char *e=s+slen; + + while ((s < e) && (res=my_ucs2_uni(cs,&wc, (uchar *)s, (uchar*)e))>0 ) + { + int plane = (wc>>8) & 0xFF; + wc = uni_plane[plane] ? uni_plane[plane][wc & 0xFF].toupper : wc; + if (res != my_uni_ucs2(cs,wc,(uchar*)s,(uchar*)e)) + break; + s+=res; + } +} + +uint my_hash_caseup_ucs2(CHARSET_INFO *cs, const byte *s, uint slen) +{ + my_wc_t wc; + register uint nr=1, nr2=4; + int res; + const char *e=s+slen; + + while ((s < e) && (res=my_ucs2_uni(cs,&wc, (uchar *)s, (uchar*)e))>0 ) + { + int plane = (wc>>8) & 0xFF; + wc = uni_plane[plane] ? uni_plane[plane][wc & 0xFF].toupper : wc; + nr^= (((nr & 63)+nr2)*(wc & 0xFF))+ (nr << 8); + nr2+=3; + nr^= (((nr & 63)+nr2)*(wc >> 8))+ (nr << 8); + nr2+=3; + + s+=res; + } + + return nr; +} + + +void my_hash_sort_ucs2(CHARSET_INFO *cs, const uchar *s, uint slen, ulong *n1, ulong *n2) +{ + my_wc_t wc; + int res; + const uchar *e=s+slen; + + while ((s < e) && (res=my_ucs2_uni(cs,&wc, (uchar *)s, (uchar*)e))>0 ) + { + int plane = (wc>>8) & 0xFF; + wc = uni_plane[plane] ? uni_plane[plane][wc & 0xFF].sort : wc; + n1[0]^= (((n1[0] & 63)+n2[0])*(wc & 0xFF))+ (n1[0] << 8); + n2[0]+=3; + n1[0]^= (((n1[0] & 63)+n2[0])*(wc >> 8))+ (n1[0] << 8); + n2[0]+=3; + s+=res; + } +} + + +void my_caseup_str_ucs2(CHARSET_INFO * cs __attribute__((unused)), + char * s __attribute__((unused))) +{ +} + + + +void my_casedn_ucs2(CHARSET_INFO *cs, char *s, uint slen) +{ + my_wc_t wc; + int res; + char *e=s+slen; + + while ((s < e) && (res=my_ucs2_uni(cs, &wc, (uchar*)s, (uchar*)e))>0) + { + int plane = (wc>>8) & 0xFF; + wc = uni_plane[plane] ? uni_plane[plane][wc & 0xFF].tolower : wc; + if (res != my_uni_ucs2(cs, wc, (uchar*)s, (uchar*)e)) + { + break; + } + s+=res; + } +} + +void my_casedn_str_ucs2(CHARSET_INFO *cs __attribute__((unused)), + char * s __attribute__((unused))) +{ +} + + +int my_strnncoll_ucs2(CHARSET_INFO *cs, + const uchar *s, uint slen, const uchar *t, uint tlen) +{ + int s_res,t_res; + my_wc_t s_wc,t_wc; + const uchar *se=s+slen; + const uchar *te=t+tlen; + + while ( s < se && t < te ) + { + int plane; + s_res=my_ucs2_uni(cs,&s_wc, s, se); + t_res=my_ucs2_uni(cs,&t_wc, t, te); + + if ( s_res <= 0 || t_res <= 0 ) + { + /* Incorrect string, compare by char value */ + return ((int)s[0]-(int)t[0]); + } + + plane=(s_wc>>8) & 0xFF; + s_wc = uni_plane[plane] ? uni_plane[plane][s_wc & 0xFF].sort : s_wc; + plane=(t_wc>>8) & 0xFF; + t_wc = uni_plane[plane] ? uni_plane[plane][t_wc & 0xFF].sort : t_wc; + if ( s_wc != t_wc ) + { + return ((int) s_wc) - ((int) t_wc); + } + + s+=s_res; + t+=t_res; + } + return ( (se-s) - (te-t) ); +} + +int my_strncasecmp_ucs2(CHARSET_INFO *cs, + const char *s, const char *t, uint len) +{ + int s_res,t_res; + my_wc_t s_wc,t_wc; + const char *se=s+len; + const char *te=t+len; + + while ( s < se && t < te ) + { + int plane; + + s_res=my_ucs2_uni(cs,&s_wc, (const uchar*)s, (const uchar*)se); + t_res=my_ucs2_uni(cs,&t_wc, (const uchar*)t, (const uchar*)te); + + if ( s_res <= 0 || t_res <= 0 ) + { + /* Incorrect string, compare by char value */ + return ((int)s[0]-(int)t[0]); + } + + plane=(s_wc>>8) & 0xFF; + s_wc = uni_plane[plane] ? uni_plane[plane][s_wc & 0xFF].tolower : s_wc; + + plane=(t_wc>>8) & 0xFF; + t_wc = uni_plane[plane] ? uni_plane[plane][t_wc & 0xFF].tolower : t_wc; + + if ( s_wc != t_wc ) + return ((int) s_wc) - ((int) t_wc); + + s+=s_res; + t+=t_res; + } + return ( (se-s) - (te-t) ); +} + +int my_strcasecmp_ucs2(CHARSET_INFO *cs, const char *s, const char *t) +{ + uint s_len=strlen(s); + uint t_len=strlen(t); + uint len = (s_len > t_len) ? s_len : t_len; + return my_strncasecmp_ucs2(cs, s, t, len); +} + +int my_strnxfrm_ucs2(CHARSET_INFO *cs, + uchar *dst, uint dstlen, const uchar *src, uint srclen) +{ + my_wc_t wc; + int res; + int plane; + uchar *de = dst + dstlen; + const uchar *se = src + srclen; + const uchar *dst_orig = dst; + + while( src < se && dst < de ) + { + if ((res=my_ucs2_uni(cs,&wc, src, se))<0) + { + break; + } + src+=res; + srclen-=res; + + plane=(wc>>8) & 0xFF; + wc = uni_plane[plane] ? uni_plane[plane][wc & 0xFF].sort : wc; + + if ((res=my_uni_ucs2(cs,wc,dst,de)) <0) + { + break; + } + dst+=res; + } + return dst - dst_orig; +} + +int my_ismbchar_ucs2(CHARSET_INFO *cs __attribute__((unused)), + const char *b __attribute__((unused)), + const char *e __attribute__((unused))) +{ + return 2; +} + +my_bool my_ismbhead_ucs2(CHARSET_INFO *cs __attribute__((unused)) , + uint ch __attribute__((unused))) +{ + return 1; +} + +int my_mbcharlen_ucs2(CHARSET_INFO *cs __attribute__((unused)) , + uint c __attribute__((unused))) +{ + return 2; +} + #endif diff --git a/strings/ctype.c b/strings/ctype.c index 0c20db35da2..7c37eeff986 100644 --- a/strings/ctype.c +++ b/strings/ctype.c @@ -3635,6 +3635,39 @@ CHARSET_INFO compiled_charsets[] = { }, #endif +#ifdef HAVE_CHARSET_ucs2 + { + 35, /* number */ + "ucs2", /* name */ + ctype_ucs2, /* ctype */ + to_lower_ucs2, /* to_lower */ + to_upper_ucs2, /* to_upper */ + to_upper_ucs2, /* sort_order */ + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + 1, /* strxfrm_multiply */ + my_strnncoll_ucs2, /* strnncoll */ + my_strnxfrm_ucs2, /* strnxfrm */ + NULL, /* like_range */ + 2, /* mbmaxlen */ + my_ismbchar_ucs2, /* ismbchar */ + my_ismbhead_ucs2, /* ismbhead */ + my_mbcharlen_ucs2, /* mbcharlen */ + my_ucs2_uni, /* mb_wc */ + my_uni_ucs2, /* wc_mb */ + my_caseup_str_ucs2, + my_casedn_str_ucs2, + my_caseup_ucs2, + my_casedn_ucs2, + my_strcasecmp_ucs2, + my_strncasecmp_ucs2, + my_hash_caseup_ucs2,/* hash_caseup */ + my_hash_sort_ucs2, /* hash_sort */ + 0 + }, +#endif + + #ifdef HAVE_CHARSET_ujis { 12, /* number */ -- cgit v1.2.1 From c6a2ae17a01d1f93257ea1ce5af0513d870585b0 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 19 Jun 2002 17:52:44 +0300 Subject: EXISTS type of subselect more correct parameters in result creation script mysql-test/create-test-result: more correct parameters in result creation script mysql-test/r/subselect.result: test of EXISTS mysql-test/t/subselect.test: test of EXISTS sql/item_subselect.cc: EXISTS type of subselect sql/item_subselect.h: EXISTS type of subselect sql/sql_class.cc: EXISTS type of subselect sql/sql_class.h: EXISTS type of subselect sql/sql_yacc.yy: EXISTS type of subselect --- mysql-test/create-test-result | 2 +- mysql-test/r/subselect.result | 7 +++ mysql-test/t/subselect.test | 2 + sql/item_subselect.cc | 121 +++++++++++++++++++++++++++++------------- sql/item_subselect.h | 89 ++++++++++++++++++++++++------- sql/sql_class.cc | 43 ++++++++++----- sql/sql_class.h | 23 ++++++-- sql/sql_yacc.yy | 27 +++++++--- 8 files changed, 235 insertions(+), 79 deletions(-) diff --git a/mysql-test/create-test-result b/mysql-test/create-test-result index bfd64f32fc5..a50b4c87641 100755 --- a/mysql-test/create-test-result +++ b/mysql-test/create-test-result @@ -32,7 +32,7 @@ result_file=$RESULT_DIR/$test_name.result touch $result_file echo "Running the test case against empty file, will fail, but don't worry" -./mysql-test-run --do-test=$test_name +./mysql-test-run --local $test_name reject_file=$result_file.reject diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index 2e40d0a92d8..37a66993ef2 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -67,4 +67,11 @@ b (select avg(t2.a+(select min(t3.a) from t3 where t3.a >= t4.a)) from t2) 8 7.5000 8 6.0000 9 5.5000 +select * from t3 where exists (select * from t2 where t2.b=t3.a); +a +7 +select * from t3 where not exists (select * from t2 where t2.b=t3.a); +a +6 +3 drop table t1,t2,t3,t4; diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index c94522fde8f..78300dc3e09 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -26,4 +26,6 @@ select * from t1 where t1.a=(select t2.a from t2 where t2.b=(select max(a) from select * from t1 where t1.a=(select t2.a from t2 where t2.b=(select max(a) from t3 where t3.a > t1.a) order by 1 desc limit 1); select * from t1 where t1.a=(select t2.a from t2 where t2.b=(select max(a) from t3 where t3.a < t1.a) order by 1 desc limit 1); select b,(select avg(t2.a+(select min(t3.a) from t3 where t3.a >= t4.a)) from t2) from t4; +select * from t3 where exists (select * from t2 where t2.b=t3.a); +select * from t3 where not exists (select * from t2 where t2.b=t3.a); drop table t1,t2,t3,t4; diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index c2349ed414c..d8f9cf40d50 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -35,12 +35,13 @@ SUBSELECT TODO: #include "mysql_priv.h" #include "sql_select.h" -Item_subselect::Item_subselect(THD *thd, st_select_lex *select_lex): +Item_subselect::Item_subselect(THD *thd, st_select_lex *select_lex, + select_subselect *result): assigned(0), executed(0), optimized(0), error(0) { DBUG_ENTER("Item_subselect::Item_subselect"); DBUG_PRINT("subs", ("select_lex 0x%xl", (long) select_lex)); - result= new select_subselect(this); + this->result= result; SELECT_LEX_UNIT *unit= select_lex->master_unit(); unit->offset_limit_cnt= unit->global_parameters->offset_limit; unit->select_limit_cnt= unit->global_parameters->select_limit+ @@ -51,41 +52,15 @@ Item_subselect::Item_subselect(THD *thd, st_select_lex *select_lex): select_lex->options&= ~OPTION_FOUND_ROWS; join= new JOIN(thd, select_lex->item_list, select_lex->options, result); this->select_lex= select_lex; - maybe_null= 1; + assign_null(); /* item value is NULL if select_subselect not changed this value (i.e. some rows will be found returned) */ - assign_null(); + null_value= 1; DBUG_VOID_RETURN; } -Item::Type Item_subselect::type() const -{ - return SUBSELECT_ITEM; -} - -double Item_subselect::val () -{ - if (exec()) - return 0; - return real_value; -} - -longlong Item_subselect::val_int () -{ - if (exec()) - return 0; - return int_value; -} - -String *Item_subselect::val_str (String *str) -{ - if (exec() || null_value) - return 0; - return &str_value; -} - void Item_subselect::make_field (Send_field *tmp_field) { if (null_value) @@ -108,9 +83,9 @@ bool Item_subselect::fix_fields(THD *thd,TABLE_LIST *tables) //TODO: subselects in having do not suported now my_printf_error(ER_SYNTAX_ERROR, ER(ER_SYNTAX_ERROR), MYF(0)); return 1; - } + } // Is it one field subselect? - if (select_lex->item_list.elements != 1) + if (select_lex->item_list.elements > max_columns) { my_printf_error(ER_SUBSELECT_NO_1_COL, ER(ER_SUBSELECT_NO_1_COL), MYF(0)); return 1; @@ -131,13 +106,14 @@ bool Item_subselect::fix_fields(THD *thd,TABLE_LIST *tables) int Item_subselect::exec() { + DBUG_ENTER("Item_subselect::exec"); if (!optimized) { optimized=1; if (join->optimize()) { executed= 1; - return (join->error?join->error:1); + DBUG_RETURN(join->error?join->error:1); } } if (join->select_lex->depended && executed) @@ -145,7 +121,7 @@ int Item_subselect::exec() if (join->reinit()) { error= 1; - return 1; + DBUG_RETURN(1); } assign_null(); executed= assigned= 0; @@ -157,7 +133,80 @@ int Item_subselect::exec() join->exec(); join->thd->lex.select= save_select; executed= 1; - return join->error; + DBUG_RETURN(join->error); } - return 0; + DBUG_RETURN(0); } + +inline table_map Item_subselect::used_tables() const +{ + return (table_map) select_lex->depended ? 1L : 0L; +} + +Item_singleval_subselect::Item_singleval_subselect(THD *thd, + st_select_lex *select_lex): + Item_subselect(thd, select_lex, new select_singleval_subselect(this)) +{ + max_columns= 1; + maybe_null= 1; +} + +Item::Type Item_subselect::type() const +{ + return SUBSELECT_ITEM; +} + +double Item_singleval_subselect::val () +{ + if (exec()) + return 0; + return real_value; +} + +longlong Item_singleval_subselect::val_int () +{ + if (exec()) + return 0; + return int_value; +} + +String *Item_singleval_subselect::val_str (String *str) +{ + if (exec() || null_value) + return 0; + return &str_value; +} + +Item_exists_subselect::Item_exists_subselect(THD *thd, + st_select_lex *select_lex): + Item_subselect(thd, select_lex, new select_singleval_subselect(this)) +{ + max_columns= UINT_MAX; + null_value= 0; //can't be NULL + maybe_null= 0; //can't be NULL + value= 0; + select_lex->select_limit= 1; // we need only 1 row to determinate existence +} + +double Item_exists_subselect::val () +{ + if (exec()) + return 0; + return (double) value; +} + +longlong Item_exists_subselect::val_int () +{ + if (exec()) + return 0; + return value; +} + +String *Item_exists_subselect::val_str(String *str) +{ + if (exec()) + return 0; + str->set(value); + return str; +} + diff --git a/sql/item_subselect.h b/sql/item_subselect.h index c6963df2d53..79832116c67 100644 --- a/sql/item_subselect.h +++ b/sql/item_subselect.h @@ -24,42 +24,34 @@ struct st_select_lex; class JOIN; class select_subselect; -/* simple (not depended of covered select ) subselect */ +/* base class for subselects */ class Item_subselect :public Item { protected: - longlong int_value; - double real_value; + uint max_columns; my_bool assigned; /* value already assigned to subselect */ my_bool executed; /* simple subselect is executed */ my_bool optimized; /* simple subselect is optimized */ my_bool error; /* error in query */ - enum Item_result res_type; int exec(); - void assign_null() + virtual void assign_null() { null_value= 1; - int_value= 0; - real_value= 0; - max_length= 4; - res_type= STRING_RESULT; } public: st_select_lex *select_lex; JOIN *join; select_subselect *result; - Item_subselect(THD *thd, st_select_lex *select_lex); + Item_subselect(THD *thd, st_select_lex *select_lex, + select_subselect* result); Item_subselect(Item_subselect *item) { null_value= item->null_value; - int_value= item->int_value; - real_value= item->real_value; - max_length= item->max_length; decimals= item->decimals; - res_type= item->res_type; + max_columns= item->max_columns; assigned= item->assigned; executed= item->executed; select_lex= item->select_lex; @@ -69,16 +61,75 @@ public: error= item->error; } enum Type type() const; - double val (); - longlong val_int (); - String *val_str (String *); bool is_null() { return null_value; } void make_field (Send_field *); bool fix_fields(THD *thd, TABLE_LIST *tables); - Item *new_item() { return new Item_subselect(this); } - enum Item_result result_type() const { return res_type; } + table_map used_tables() const; friend class select_subselect; }; +/* single value subselect */ + +class Item_singleval_subselect :public Item_subselect +{ +protected: + longlong int_value; + double real_value; + enum Item_result res_type; + + virtual void assign_null() + { + null_value= 1; + int_value= 0; + real_value= 0; + max_length= 4; + res_type= STRING_RESULT; + } +public: + Item_singleval_subselect(THD *thd, st_select_lex *select_lex); + Item_singleval_subselect(Item_singleval_subselect *item): + Item_subselect(item) + { + int_value= item->int_value; + real_value= item->real_value; + max_length= item->max_length; + decimals= item->decimals; + res_type= item->res_type; + } + double val (); + longlong val_int (); + String *val_str (String *); + Item *new_item() { return new Item_singleval_subselect(this); } + enum Item_result result_type() const { return res_type; } + + friend class select_singleval_subselect; +}; + +/* exists subselect */ + +class Item_exists_subselect :public Item_subselect +{ +protected: + longlong value; + + virtual void assign_null() + { + value= 0; + } +public: + Item_exists_subselect(THD *thd, st_select_lex *select_lex); + Item_exists_subselect(Item_exists_subselect *item): + Item_subselect(item) + { + value= item->value; + } + Item *new_item() { return new Item_exists_subselect(this); } + enum Item_result result_type() const { return INT_RESULT;} + longlong val_int(); + double val(); + String *val_str(String*); + + friend class select_exists_subselect; +}; diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 86e4e6896e6..85f5b3cb5f2 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -763,7 +763,6 @@ void select_dump::send_error(uint errcode,const char *err) file= -1; } - bool select_dump::send_eof() { int error=test(end_io_cache(&cache)); @@ -782,10 +781,11 @@ select_subselect::select_subselect(Item_subselect *item) this->item=item; } -bool select_subselect::send_data(List &items) +bool select_singleval_subselect::send_data(List &items) { - DBUG_ENTER("select_subselect::send_data"); - if (item->assigned){ + DBUG_ENTER("select_singleval_subselect::send_data"); + Item_singleval_subselect *it= (Item_singleval_subselect *)item; + if (it->assigned){ my_printf_error(ER_SUBSELECT_NO_1_ROW, ER(ER_SUBSELECT_NO_1_ROW), MYF(0)); DBUG_RETURN(1); } @@ -800,18 +800,33 @@ bool select_subselect::send_data(List &items) Following val() call have to be first, because function AVG() & STD() calculate value on it & determinate "is it NULL?". */ - item->real_value= val_item->val(); - if ((item->null_value= val_item->is_null())) + it->real_value= val_item->val(); + if ((it->null_value= val_item->is_null())) { - item->assign_null(); + it->assign_null(); } else { - item->max_length= val_item->max_length; - item->decimals= val_item->decimals; - item->binary= val_item->binary; - val_item->val_str(&item->str_value); - item->int_value= val_item->val_int(); - item->res_type= val_item->result_type(); + it->max_length= val_item->max_length; + it->decimals= val_item->decimals; + it->binary= val_item->binary; + val_item->val_str(&it->str_value); + it->int_value= val_item->val_int(); + it->res_type= val_item->result_type(); } - item->assigned= 1; + it->assigned= 1; DBUG_RETURN(0); } + +bool select_exists_subselect::send_data(List &items) +{ + DBUG_ENTER("select_exists_subselect::send_data"); + Item_exists_subselect *it= (Item_exists_subselect *)item; + if (unit->offset_limit_cnt) + { // Using limit offset,count + unit->offset_limit_cnt--; + DBUG_RETURN(0); + } + it->value= 1; + it->assigned= 1; + DBUG_RETURN(0); +} + diff --git a/sql/sql_class.h b/sql/sql_class.h index 8a1a299ceee..eb57b5828f6 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -712,19 +712,36 @@ class select_union :public select_result { bool flush(); }; -/* Single value subselect interface class */ +/* Base subselect interface class */ class select_subselect :public select_result { +protected: Item_subselect *item; public: select_subselect(Item_subselect *item); bool send_fields(List &list, uint flag) { return 0; }; - bool send_data(List &items); + bool send_data(List &items)=0; bool send_eof() { return 0; }; - + friend class Ttem_subselect; }; +/* Single value subselect interface class */ +class select_singleval_subselect :public select_subselect +{ +public: + select_singleval_subselect(Item_subselect *item):select_subselect(item){} + bool send_data(List &items); +}; + +/* EXISTS subselect interface class */ +class select_exists_subselect :public select_subselect +{ +public: + select_exists_subselect(Item_subselect *item):select_subselect(item){} + bool send_data(List &items); +}; + /* Structs used when sorting */ typedef struct st_sort_field { diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index efc8b8b5389..9047bc472ac 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -548,7 +548,8 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); literal text_literal insert_ident order_ident simple_ident select_item2 expr opt_expr opt_else sum_expr in_sum_expr table_wild opt_pad no_in_expr expr_expr simple_expr no_and_expr - using_list subselect subselect_init + using_list singleval_subselect singleval_subselect_init + exists_subselect exists_subselect_init %type expr_list udf_expr_list when_list ident_list ident_list_arg @@ -1738,7 +1739,8 @@ simple_expr: | NOT expr %prec NEG { $$= new Item_func_not($2); } | '!' expr %prec NEG { $$= new Item_func_not($2); } | '(' expr ')' { $$= $2; } - | subselect { $$= $1; } + | EXISTS exists_subselect { $$= $2; } + | singleval_subselect { $$= $1; } | '{' ident expr '}' { $$= $3; } | MATCH ident_list_arg AGAINST '(' expr ')' { Select->ftfunc_list.push_back((Item_func_match *) @@ -3918,17 +3920,30 @@ union_option: /* empty */ {} | ALL {Lex->union_option=1;}; -subselect: - subselect_start subselect_init +singleval_subselect: + subselect_start singleval_subselect_init subselect_end { $$= $2; }; -subselect_init: +singleval_subselect_init: select_init { - $$= new Item_subselect(current_thd, Lex->select); + $$= new Item_singleval_subselect(current_thd, Lex->select); + }; + +exists_subselect: + subselect_start exists_subselect_init + subselect_end + { + $$= $2; + }; + +exists_subselect_init: + select_init + { + $$= new Item_exists_subselect(current_thd, Lex->select); }; subselect_start: -- cgit v1.2.1 From e38f8e8ce21bc60f508ba15b3c01f3f1be4f7eef Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 19 Jun 2002 21:21:30 +0500 Subject: Default table character set has been added: CREATE TABLE a (field,...) TYPE=type CHARSET=cset; sql/handler.h: New flag to remember whether new table default charset has been passed in ALTER TABLE sql/lex.h: New language symbol sql/sql_show.cc: Display default table charset if exists sql/sql_table.cc: Check table charset before default server charset sql/sql_yacc.yy: New create table option: default table character set sql/table.cc: Table charset sql/unireg.cc: field->charset must be initialized before. So assumes it is not NULL --- sql/handler.h | 1 + sql/lex.h | 1 + sql/sql_show.cc | 8 +++++++- sql/sql_table.cc | 5 +++++ sql/sql_yacc.yy | 24 ++++++++++++++++++------ sql/table.cc | 11 ++++++----- sql/unireg.cc | 3 +-- 7 files changed, 39 insertions(+), 14 deletions(-) diff --git a/sql/handler.h b/sql/handler.h index 45865c39154..7260e8f2f8c 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -137,6 +137,7 @@ enum row_type { ROW_TYPE_NOT_USED=-1, ROW_TYPE_DEFAULT, ROW_TYPE_FIXED, #define HA_CREATE_USED_MAX_ROWS 32 #define HA_CREATE_USED_AVG_ROW_LENGTH 64 #define HA_CREATE_USED_PACK_KEYS 128 +#define HA_CREATE_USED_CHARSET 256 typedef struct st_thd_trans { void *bdb_tid; diff --git a/sql/lex.h b/sql/lex.h index da0a71a135e..4af36df58af 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -82,6 +82,7 @@ static SYMBOL symbols[] = { { "CASE", SYM(CASE_SYM),0,0}, { "CHAR", SYM(CHAR_SYM),0,0}, { "CHARACTER", SYM(CHAR_SYM),0,0}, + { "CHARSET", SYM(CHARSET),0,0}, { "CHANGE", SYM(CHANGE),0,0}, { "CHANGED", SYM(CHANGED),0,0}, { "CHECK", SYM(CHECK_SYM),0,0}, diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 48d6bc7471f..494607c7fff 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1156,6 +1156,12 @@ store_create_info(THD *thd, TABLE *table, String *packet) char buff[128]; char* p; + if (table->table_charset) + { + packet->append(" CHARSET="); + packet->append(table->table_charset->name); + } + if (table->min_rows) { packet->append(" MIN_ROWS="); @@ -1386,7 +1392,7 @@ int mysqld_show_charsets(THD *thd, const char *wild) net_store_data(&packet2,(uint32) cs->mbmaxlen); if (my_net_write(&thd->net, (char*) packet2.ptr(),packet2.length())) - goto err; /* purecov: inspected */ + goto err; } } send_eof(&thd->net); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index f4f4dd212bd..3a6ff3d6b16 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -375,6 +375,9 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, sql_field->offset= pos; if (MTYP_TYPENR(sql_field->unireg_check) == Field::NEXT_NUMBER) auto_increment++; + if(!sql_field->charset) + sql_field->charset = create_info->table_charset ? + create_info->table_charset : default_charset_info; pos+=sql_field->pack_length; } if (auto_increment > 1) @@ -1645,6 +1648,8 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, create_info->max_rows=table->max_rows; if (!(used_fields & HA_CREATE_USED_AVG_ROW_LENGTH)) create_info->avg_row_length=table->avg_row_length; + if (!(used_fields & HA_CREATE_USED_CHARSET)) + create_info->table_charset=table->table_charset; table->file->update_create_info(create_info); if ((create_info->table_options & diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index d140cd4dcdd..228e43f3954 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -162,6 +162,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token CACHE_SYM %token CASCADE %token CAST_SYM +%token CHARSET %token CHECKSUM_SYM %token CHECK_SYM %token CIPHER @@ -767,7 +768,7 @@ create: bzero((char*) &lex->create_info,sizeof(lex->create_info)); lex->create_info.options=$2 | $4; lex->create_info.db_type= default_table_type; - lex->create_info.table_charset=default_charset_info; + lex->create_info.table_charset=NULL; } create2 @@ -881,6 +882,17 @@ create_table_option: table_list->next=0; lex->create_info.used_fields|= HA_CREATE_USED_UNION; } + | CHARSET EQ ident + { + CHARSET_INFO *cs=get_charset_by_name($3.str,MYF(MY_WME)); + if (!cs) + { + net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$3); + YYABORT; + } + Lex->create_info.table_charset=cs; + Lex->create_info.used_fields|= HA_CREATE_USED_CHARSET; + } | INSERT_METHOD EQ merge_insert_types { Lex->create_info.merge_insert_method= $3; Lex->create_info.used_fields|= HA_CREATE_USED_INSERT_METHOD;} | DATA_SYM DIRECTORY_SYM EQ TEXT_STRING { Lex->create_info.data_file_name= $4.str; } | INDEX DIRECTORY_SYM EQ TEXT_STRING { Lex->create_info.index_file_name= $4.str; }; @@ -965,7 +977,7 @@ field_spec: LEX *lex=Lex; lex->length=lex->dec=0; lex->type=0; lex->interval=0; lex->default_value=lex->comment=0; - lex->charset=default_charset_info; + lex->charset=NULL; } type opt_attribute { @@ -1116,8 +1128,8 @@ attribute: | COMMENT_SYM text_literal { Lex->comment= $2; }; opt_binary: - /* empty */ { Lex->charset=default_charset_info; } - | BINARY { Lex->type|=BINARY_FLAG; Lex->charset=default_charset_info; } + /* empty */ { Lex->charset=NULL; } + | BINARY { Lex->type|=BINARY_FLAG; Lex->charset=NULL; } | CHAR_SYM SET ident { CHARSET_INFO *cs=get_charset_by_name($3.str,MYF(MY_WME)); @@ -1130,7 +1142,7 @@ opt_binary: }; default_charset: - /* empty */ { Lex->charset-default_charset_info; } + /* empty */ { Lex->charset=NULL; } | DEFAULT CHAR_SYM SET ident { CHARSET_INFO *cs=get_charset_by_name($4.str,MYF(MY_WME)); @@ -1259,7 +1271,7 @@ alter: bzero((char*) &lex->create_info,sizeof(lex->create_info)); lex->create_info.db_type= DB_TYPE_DEFAULT; lex->create_info.row_type= ROW_TYPE_NOT_USED; - lex->create_info.table_charset=default_charset_info; + lex->create_info.table_charset=NULL; lex->alter_keys_onoff=LEAVE_AS_IS; lex->simple_alter=1; } diff --git a/sql/table.cc b/sql/table.cc index 201b67032bf..8a7604687e7 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -118,7 +118,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, outparam->raid_chunks= head[42]; outparam->raid_chunksize= uint4korr(head+43); if (!(outparam->table_charset=get_charset((uint) head[38],MYF(0)))) - outparam->table_charset=default_charset_info; + outparam->table_charset=NULL; // QQ display error message? null_field_first=1; } outparam->db_record_offset=1; @@ -358,7 +358,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, uint comment_length=uint2korr(strpos+13); field_type=(enum_field_types) (uint) strpos[11]; if (!(charset=get_charset((uint) strpos[12], MYF(0)))) - charset=outparam->table_charset; + charset=outparam->table_charset?outparam->table_charset:default_charset_info; if (!comment_length) { comment.str= (char*) ""; @@ -375,7 +375,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, { /* old frm file */ field_type= (enum_field_types) f_packtype(pack_flag); - charset=outparam->table_charset; + charset=outparam->table_charset?outparam->table_charset:default_charset_info; bzero((char*) &comment, sizeof(comment)); } *field_ptr=reg_field= @@ -1041,7 +1041,7 @@ File create_frm(register my_string name, uint reclength, uchar *fileinfo, int2store(fileinfo+30,create_info->table_options); fileinfo[32]=0; // No filename anymore int4store(fileinfo+34,create_info->avg_row_length); - fileinfo[38]= create_info->table_charset->number; + fileinfo[38]= create_info->table_charset?create_info->table_charset->number:0; fileinfo[40]= (uchar) create_info->row_type; fileinfo[41]= (uchar) create_info->raid_type; fileinfo[42]= (uchar) create_info->raid_chunks; @@ -1072,6 +1072,7 @@ void update_create_info_from_table(HA_CREATE_INFO *create_info, TABLE *table) create_info->raid_type=table->raid_type; create_info->raid_chunks=table->raid_chunks; create_info->raid_chunksize=table->raid_chunksize; + create_info->table_charset=table->table_charset; DBUG_VOID_RETURN; } @@ -1094,7 +1095,7 @@ char *get_field(MEM_ROOT *mem, TABLE *table, uint fieldnr) { Field *field=table->field[fieldnr]; char buff[MAX_FIELD_WIDTH]; - String str(buff,sizeof(buff),table->table_charset); + String str(buff,sizeof(buff),default_charset_info); field->val_str(&str,&str); uint length=str.length(); if (!length) diff --git a/sql/unireg.cc b/sql/unireg.cc index 863f71d1cce..f2d8d6532a9 100644 --- a/sql/unireg.cc +++ b/sql/unireg.cc @@ -459,8 +459,7 @@ static bool pack_fields(File file,List &create_fields) int2store(buff+8,field->unireg_check); buff[10]= (uchar) field->interval_id; buff[11]= (uchar) field->sql_type; - buff[12]= (uchar) (field->charset ? field->charset->number : - default_charset_info->number); + buff[12]= (uchar) field->charset->number; int2store(buff+13, field->comment.length); comment_length+= field->comment.length; set_if_bigger(int_count,field->interval_id); -- cgit v1.2.1 From 83dfb9f88582d3501e5dbee0340051119c4193f5 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 19 Jun 2002 21:48:34 +0500 Subject: Now it is possible to drop default charset from table: ALTER TABLE a CHARSET=DEFAULT --- sql/sql_yacc.yy | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 228e43f3954..83343e429e8 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -882,6 +882,11 @@ create_table_option: table_list->next=0; lex->create_info.used_fields|= HA_CREATE_USED_UNION; } + | CHARSET EQ DEFAULT + { + Lex->create_info.table_charset=NULL; + Lex->create_info.used_fields|= HA_CREATE_USED_CHARSET; + } | CHARSET EQ ident { CHARSET_INFO *cs=get_charset_by_name($3.str,MYF(MY_WME)); -- cgit v1.2.1 From 2753972c39c5d07f9cd8899e086cc308dd09ca81 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 20 Jun 2002 18:47:55 +0500 Subject: New syntax for string with charset: _latin1'string' Remove dupicated code sql/sql_lex.cc: new UNDERSCORE_CHARSET language item --- sql/sql_lex.cc | 14 +++++++++++++- sql/sql_yacc.yy | 58 +++++++++++++++++++-------------------------------------- 2 files changed, 32 insertions(+), 40 deletions(-) diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 008ef44d83a..bcf212f6bd2 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -525,7 +525,19 @@ int yylex(void *arg) yylval->lex_str=get_token(lex,length); if (lex->convert_set) lex->convert_set->convert((char*) yylval->lex_str.str,lex->yytoklen); - return(IDENT); + + /* + Note: "SELECT _bla AS 'alias'" + _bla should be considered as a IDENT if charset haven't been found. + So we don't use MYF(MY_WME) with get_charset_by_name to avoid + producing an error. + */ + + if ((yylval->lex_str.str[0]=='_') && + (lex->charset=get_charset_by_name(yylval->lex_str.str+1,MYF(0)))) + return(UNDERSCORE_CHARSET); + else + return(IDENT); case STATE_IDENT_SEP: // Found ident and now '.' lex->next_state=STATE_IDENT_START;// Next is an ident (not a keyword) diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 78d03bbbd1a..f3c5ae6efaf 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -334,6 +334,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token UDF_SONAME_SYM %token UDF_SYM %token UNCOMMITTED_SYM +%token UNDERSCORE_CHARSET %token UNION_SYM %token UNIQUE_SYM %token USAGE @@ -525,7 +526,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %type IDENT TEXT_STRING REAL_NUM FLOAT_NUM NUM LONG_NUM HEX_NUM LEX_HOSTNAME - ULONGLONG_NUM field_ident select_alias ident ident_or_text + ULONGLONG_NUM field_ident select_alias ident ident_or_text UNDERSCORE_CHARSET %type opt_table_alias @@ -888,15 +889,9 @@ create_table_option: Lex->create_info.table_charset=NULL; Lex->create_info.used_fields|= HA_CREATE_USED_CHARSET; } - | CHARSET EQ ident + | CHARSET EQ charset { - CHARSET_INFO *cs=get_charset_by_name($3.str,MYF(MY_WME)); - if (!cs) - { - net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$3); - YYABORT; - } - Lex->create_info.table_charset=cs; + Lex->create_info.table_charset=Lex->charset; Lex->create_info.used_fields|= HA_CREATE_USED_CHARSET; } | INSERT_METHOD EQ merge_insert_types { Lex->create_info.merge_insert_method= $3; Lex->create_info.used_fields|= HA_CREATE_USED_INSERT_METHOD;} @@ -1133,32 +1128,24 @@ attribute: | UNIQUE_SYM KEY_SYM { Lex->type|= UNIQUE_KEY_FLAG; } | COMMENT_SYM text_literal { Lex->comment= $2; }; +charset: + ident + { + if (!(Lex->charset=get_charset_by_name($1.str,MYF(0)))) + { + net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$1); + YYABORT; + } + }; + opt_binary: /* empty */ { Lex->charset=NULL; } | BINARY { Lex->type|=BINARY_FLAG; Lex->charset=NULL; } - | CHAR_SYM SET ident - { - CHARSET_INFO *cs=get_charset_by_name($3.str,MYF(MY_WME)); - if (!cs) - { - net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$3); - YYABORT; - } - Lex->charset=cs; - }; + | CHAR_SYM SET charset {/* charset is already in Lex->charset */} ; default_charset: /* empty */ { Lex->charset=NULL; } - | DEFAULT CHAR_SYM SET ident - { - CHARSET_INFO *cs=get_charset_by_name($4.str,MYF(MY_WME)); - if (!cs) - { - net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$4); - YYABORT; - } - Lex->charset=cs; - }; + | DEFAULT CHAR_SYM SET charset ; references: REFERENCES table_ident @@ -1777,16 +1764,8 @@ simple_expr: | CASE_SYM opt_expr WHEN_SYM when_list opt_else END { $$= new Item_func_case(* $4, $2, $5 ); } | CONVERT_SYM '(' expr ',' cast_type ')' { $$= create_func_cast($3, $5); } - | CONVERT_SYM '(' expr USING IDENT ')' - { - CHARSET_INFO *cs=get_charset_by_name($5.str,MYF(MY_WME)); - if (!cs) - { - net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$5); - YYABORT; - } - $$= new Item_func_conv_charset($3,cs); - } + | CONVERT_SYM '(' expr USING charset ')' + { $$= new Item_func_conv_charset($3,Lex->charset); } | CONVERT_SYM '(' expr ',' expr ',' expr ')' { $$= new Item_func_conv_charset3($3,$7,$5); @@ -3094,6 +3073,7 @@ opt_ignore_lines: text_literal: TEXT_STRING { $$ = new Item_string($1.str,$1.length,default_charset_info); } + | UNDERSCORE_CHARSET TEXT_STRING { $$ = new Item_string($2.str,$2.length,Lex->charset); } | text_literal TEXT_STRING { ((Item_string*) $1)->append($2.str,$2.length); }; -- cgit v1.2.1 From 2583ecd6423922a89f75eec76f6cafbaba23c1f5 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 20 Jun 2002 22:52:56 +0500 Subject: SELECT left(non_default_charset_field,n) GROUP BY 1 now works more correctly. Still needs fixes. --- sql/item.cc | 3 +++ sql/item_func.cc | 11 +++++++++++ sql/item_strfunc.cc | 1 + sql/sql_select.cc | 3 ++- 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/sql/item.cc b/sql/item.cc index d01a06e5eba..415fe4d72af 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -133,6 +133,9 @@ void Item_field::set_field(Field *field_par) field_name=field_par->field_name; binary=field_par->binary(); unsigned_flag=test(field_par->flags & UNSIGNED_FLAG); + /* For string fields copy character set from original field */ + if (!field_par->binary()) + str_value.set_charset(((Field_str*)field_par)->charset()); } const char *Item_ident::full_name() const diff --git a/sql/item_func.cc b/sql/item_func.cc index 0675bf81dab..b14c1b38383 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -78,6 +78,17 @@ Item_func::fix_fields(THD *thd,TABLE_LIST *tables) maybe_null=1; if ((*arg)->binary) binary=1; + /* + Change charset to arg charset if it is not equal to + default_charset_info. This will work for many cases, + but generally this should be done more carefull. Each string + function should have it's own fix_fields() method to correctly + setup it's result's character set taking in account arguments. + For example: left(a,b) should take in account only first argument, + but ignore the second one. + */ + if ((*arg)->str_value.charset() != default_charset_info) + str_value.set_charset((*arg)->str_value.charset()); with_sum_func= with_sum_func || (*arg)->with_sum_func; used_tables_cache|=(*arg)->used_tables(); const_item_cache&= (*arg)->const_item(); diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 5275da95b6e..81d866bfe6d 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -759,6 +759,7 @@ String *Item_func_left::val_str(String *str) if (!res->alloced_length()) { // Don't change const str str_value= *res; // Not malloced string + str_value.set_charset(res->charset()); res= &str_value; } res->length((uint) length); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 4737e068d3e..025a5c600a5 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -3579,7 +3579,8 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, item->name,table,item->binary); else new_field= new Field_string(item->max_length,maybe_null, - item->name,table,item->binary,default_charset_info); + item->name,table,item->binary, + item->str_value.charset()); break; } if (copy_func) -- cgit v1.2.1 From f7322a3cbd0d606f0ce2cdedf15d3212e1873bd0 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 20 Jun 2002 23:26:04 +0500 Subject: New CHARSET() function --- sql/item_strfunc.cc | 13 +++++++++++++ sql/item_strfunc.h | 12 ++++++++++++ sql/sql_yacc.yy | 2 ++ 3 files changed, 27 insertions(+) diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 81d866bfe6d..a4f09f9103e 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1911,12 +1911,25 @@ outp: return str; } +String *Item_func_charset::val_str(String *str) +{ + String *res = args[0]->val_str(str); + + if ((null_value=(args[0]->null_value || !res->charset()))) + return 0; + str->copy(res->charset()->name,strlen(res->charset()->name)); + return str; +} + + void Item_func_conv_charset3::fix_length_and_dec() { /* BAR TODO: What to do here??? */ } + + String *Item_func_hex::val_str(String *str) { if (args[0]->result_type() != STRING_RESULT) diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index 03ef65c352a..a273abaf614 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -503,6 +503,18 @@ public: const char *func_name() const { return "conv_charset3"; } }; +class Item_func_charset :public Item_str_func +{ +public: + Item_func_charset(Item *a) :Item_str_func(a) {} + String *val_str(String *); + const char *func_name() const { return "charset"; } + void fix_length_and_dec() + { + max_length=20; // should be enough + }; +}; + /******************************************************* Spatial functions diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index f3c5ae6efaf..91c87e9b849 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1784,6 +1784,8 @@ simple_expr: { $$= new Item_func_atan($3,$5); } | CHAR_SYM '(' expr_list ')' { $$= new Item_func_char(*$3); } + | CHARSET '(' expr ')' + { $$= new Item_func_charset($3); } | COALESCE '(' expr_list ')' { $$= new Item_func_coalesce(* $3); } | CONCAT '(' expr_list ')' -- cgit v1.2.1 From 17b4e3ed9661cb7b8d55128254ad76509e0b2abc Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 21 Jun 2002 14:46:50 +0500 Subject: Fixed charset problem on UPDATE in non-default-charset field --- sql/field_conv.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sql/field_conv.cc b/sql/field_conv.cc index 3b6de1383e2..3b8a2ee791c 100644 --- a/sql/field_conv.cc +++ b/sql/field_conv.cc @@ -520,7 +520,9 @@ void field_conv(Field *to,Field *from) char buff[MAX_FIELD_WIDTH]; String result(buff,sizeof(buff),default_charset_info); from->val_str(&result,&result); - to->store(result.c_ptr_quick(),result.length(),default_charset_info); + to->store(result.c_ptr_quick(),result.length(), + to->binary()?default_charset_info:((Field_str*)to)->charset()); + // QQ: what to do if "from" and "to" are of dirrent charsets? } else if (from->result_type() == REAL_RESULT) to->store(from->val_real()); -- cgit v1.2.1 From 000828e0113e5fc79248ea38999ff67b3f19bac3 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 21 Jun 2002 16:55:55 +0500 Subject: database default character set is now stored in database directory --- sql/mysql_priv.h | 2 +- sql/sql_db.cc | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- sql/sql_parse.cc | 2 +- sql/sql_yacc.yy | 1 + 4 files changed, 59 insertions(+), 4 deletions(-) diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 4f0bc2fe14a..1d0e3c1a72f 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -289,7 +289,7 @@ inline THD *_current_thd(void) #define prepare_execute(A) ((A)->command == COM_EXECUTE) -int mysql_create_db(THD *thd, char *db, uint create_info, bool silent); +int mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create_info, bool silent); int mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent); void mysql_binlog_send(THD* thd, char* log_ident, ulong pos, ushort flags); int mysql_rm_table(THD *thd,TABLE_LIST *tables, my_bool if_exists); diff --git a/sql/sql_db.cc b/sql/sql_db.cc index 3f619b70244..5275403db40 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -31,13 +31,15 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, /* db-name is already validated when we come here */ -int mysql_create_db(THD *thd, char *db, uint create_options, bool silent) +int mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create_info, bool silent) { char path[FN_REFLEN+16]; MY_DIR *dirp; long result=1; int error = 0; DBUG_ENTER("mysql_create_db"); + register File file; + uint create_options = create_info ? create_info->options : 0; VOID(pthread_mutex_lock(&LOCK_mysql_create_db)); @@ -73,6 +75,37 @@ int mysql_create_db(THD *thd, char *db, uint create_options, bool silent) } } + /* + Create database options file: + Currently databse default charset is only stored there. + */ + + strcat(path,"/"); + unpack_dirname(path,path); + strcat(path,"db.opt"); + if ((file=my_create(path,CREATE_MODE,O_RDWR | O_TRUNC,MYF(MY_WME))) >= 0) + { + sprintf(path,"CREATE DATABASE %s DEFAULT CHARACTER SET=%s\n",db, + (create_info && create_info->table_charset) + ? create_info->table_charset->name : "DEFAULT"); + + if (my_write(file,(byte*) path,strlen(path),MYF(MY_NABP+MY_WME))) + { + // QQ : should we send more suitable error message? + my_error(ER_CANT_CREATE_DB,MYF(0),db,my_errno); + error = -1; + goto exit; + } + my_close(file,MYF(0)); + } + else + { + // QQ : should we send more suitable error message? + my_error(ER_CANT_CREATE_DB,MYF(0),db,my_errno); + error = -1; + goto exit; + } + if (!silent) { if (!thd->query) @@ -104,7 +137,7 @@ exit2: DBUG_RETURN(error); } -const char *del_exts[]= {".frm", ".BAK", ".TMD", NullS}; +const char *del_exts[]= {".frm", ".BAK", ".TMD",".opt", NullS}; static TYPELIB deletable_extentions= {array_elements(del_exts)-1,"del_exts", del_exts}; @@ -333,6 +366,7 @@ bool mysql_change_db(THD *thd,const char *name) char path[FN_REFLEN]; uint db_access; DBUG_ENTER("mysql_change_db"); + register File file; if (!dbname || !(db_length=strip_sp(dbname))) { @@ -382,5 +416,25 @@ bool mysql_change_db(THD *thd,const char *name) thd->db=dbname; thd->db_length=db_length; thd->db_access=db_access; + + /* + Load database options file: + */ + + strcat(path,"/"); + unpack_dirname(path,path); + strcat(path,"db.opt"); + if ((file=my_open(path,O_RDWR|O_BINARY,MYF(MY_WME))) >= 0) + { + int nbytes=my_read(file,(byte*) path,sizeof(path),MYF(0)); + if ( nbytes >= 0 ) + { + path[nbytes]='\0'; + // BAR TODO: parse create options + // and extract database default charset + } + my_close(file,MYF(0)); + } + DBUG_RETURN(0); } diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 70f50483114..1f7e05fbae0 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2308,7 +2308,7 @@ mysql_execute_command(void) } if (check_access(thd,CREATE_ACL,lex->name,0,1)) break; - res=mysql_create_db(thd,lex->name,lex->create_info.options,0); + res=mysql_create_db(thd,lex->name,&lex->create_info,0); break; } case SQLCOM_DROP_DB: diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 91c87e9b849..faa63afa6c7 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -798,6 +798,7 @@ create: lex->sql_command=SQLCOM_CREATE_DB; lex->name=$4.str; lex->create_info.options=$3; + lex->create_info.table_charset=lex->charset; } | CREATE udf_func_type UDF_SYM ident { -- cgit v1.2.1 From 969919146e96f7709f32ac882359372a45da7944 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 24 Jun 2002 21:50:08 +0500 Subject: Database default charset now works: CREATE DATABASE dbname DEFAULT CHARACTERSET=latin1 sql/sql_class.cc: Database default charset sql/sql_class.h: Database default charset sql/sql_db.cc: Database default charset sql/sql_table.cc: Database default charset BitKeeper/etc/ignore: Added tests/client_test to the ignore list --- .bzrignore | 1 + sql/sql_class.cc | 1 + sql/sql_class.h | 3 ++- sql/sql_db.cc | 45 ++++++++++++++++++++++++++++++++++++++------- sql/sql_table.cc | 4 +++- 5 files changed, 45 insertions(+), 9 deletions(-) diff --git a/.bzrignore b/.bzrignore index 4683dcd2fb7..3b9576a47f0 100644 --- a/.bzrignore +++ b/.bzrignore @@ -478,3 +478,4 @@ vio/test-ssl vio/test-sslclient vio/test-sslserver vio/viotest-ssl +tests/client_test diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 7a1ac4728da..c8914702ae7 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -103,6 +103,7 @@ THD::THD():user_time(0),fatal_error(0),last_insert_id_used(0), file_id = 0; cond_count=0; convert_set=0; + db_charset=default_charset_info; mysys_var=0; #ifndef DBUG_OFF dbug_sentry=THD_SENTRY_MAGIC; diff --git a/sql/sql_class.h b/sql/sql_class.h index 37eb366e21f..9b708e35a1e 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -473,7 +473,8 @@ public: ulong slave_proxy_id; NET* slave_net; // network connection from slave -> m. my_off_t log_pos; - + CHARSET_INFO *db_charset; + THD(); ~THD(); void cleanup(void); diff --git a/sql/sql_db.cc b/sql/sql_db.cc index 5275403db40..91f7474bb33 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -25,6 +25,8 @@ #include #endif +#define MY_DB_OPT_FILE ".db.opt" + static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db, const char *path, uint level); @@ -82,12 +84,12 @@ int mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create_info, bool silent strcat(path,"/"); unpack_dirname(path,path); - strcat(path,"db.opt"); + strcat(path,MY_DB_OPT_FILE); if ((file=my_create(path,CREATE_MODE,O_RDWR | O_TRUNC,MYF(MY_WME))) >= 0) { - sprintf(path,"CREATE DATABASE %s DEFAULT CHARACTER SET=%s\n",db, - (create_info && create_info->table_charset) - ? create_info->table_charset->name : "DEFAULT"); + sprintf(path,"default-character-set=%s\n", + (create_info && create_info->table_charset) ? + create_info->table_charset->name : "DEFAULT"); if (my_write(file,(byte*) path,strlen(path),MYF(MY_NABP+MY_WME))) { @@ -423,15 +425,44 @@ bool mysql_change_db(THD *thd,const char *name) strcat(path,"/"); unpack_dirname(path,path); - strcat(path,"db.opt"); + strcat(path,MY_DB_OPT_FILE); if ((file=my_open(path,O_RDWR|O_BINARY,MYF(MY_WME))) >= 0) { int nbytes=my_read(file,(byte*) path,sizeof(path),MYF(0)); if ( nbytes >= 0 ) { + char *ln=path; + char *pe=path+nbytes; + path[nbytes]='\0'; - // BAR TODO: parse create options - // and extract database default charset + for ( ln=path; lndb_charset=get_charset_by_name(val, MYF(0)); + } + goto cnt; + break; + } + } +cnt: + ln=le; + } } my_close(file,MYF(0)); } diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 3a6ff3d6b16..d8012c0c102 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -377,7 +377,9 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, auto_increment++; if(!sql_field->charset) sql_field->charset = create_info->table_charset ? - create_info->table_charset : default_charset_info; + create_info->table_charset : + thd->db_charset? thd->db_charset : + default_charset_info; pos+=sql_field->pack_length; } if (auto_increment > 1) -- cgit v1.2.1 From 1ff701ee0ccc7410a9dc42ce5ee11e4004002d3a Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 26 Jun 2002 16:00:43 +0500 Subject: Several problems were fixed (mostly BLOB+charset related) Fixed that MyISAM were not working properly with non-8bit charsets in some cases CONVERT() function now works properly myisam/mi_unique.c: Fix for non-8bit charsets sql/field.cc: Initialize blobs with charset sql/field.h: Initialize blobs with charset sql/field_conv.cc: Initialize blobs with charset sql/item_strfunc.cc: CONVERT() function now has working fix_lenght_and_dec(), and it's own fix_fields() sql/item_strfunc.h: CONVERT() function now has working fix_lenght_and_dec(), and it's own fix_fields() sql/sql_select.cc: Fixes for BLOBs Fixed that wrong charset was used in some cases --- myisam/mi_unique.c | 35 ++++++++++++++++++++++++++--------- sql/field.cc | 11 ++++++----- sql/field.h | 11 ++++++----- sql/field_conv.cc | 3 ++- sql/item_strfunc.cc | 38 ++++++++++++++++++++++++++++---------- sql/item_strfunc.h | 4 +++- sql/sql_select.cc | 9 ++++++--- 7 files changed, 77 insertions(+), 34 deletions(-) diff --git a/myisam/mi_unique.c b/myisam/mi_unique.c index 629523ec69a..7afaabfe75b 100644 --- a/myisam/mi_unique.c +++ b/myisam/mi_unique.c @@ -99,11 +99,20 @@ ha_checksum mi_unique_hash(MI_UNIQUEDEF *def, const byte *record) end= pos+length; if (type == HA_KEYTYPE_TEXT || type == HA_KEYTYPE_VARTEXT) { - uchar *sort_order=keyseg->charset->sort_order; - while (pos != end) - crc=((crc << 8) + - (((uchar) sort_order[*(uchar*) pos++]))) + - (crc >> (8*sizeof(ha_checksum)-8)); + if (keyseg->charset->hash_sort) + { + ulong nr=1, nr2=4; + keyseg->charset->hash_sort(keyseg->charset,(const uchar*)pos,length,&nr, &nr2); + crc=nr; + } + else + { + uchar *sort_order=keyseg->charset->sort_order; + while (pos != end) + crc=((crc << 8) + + (((uchar) sort_order[*(uchar*) pos++]))) + + (crc >> (8*sizeof(ha_checksum)-8)); + } } else while (pos != end) @@ -173,11 +182,19 @@ int mi_unique_comp(MI_UNIQUEDEF *def, const byte *a, const byte *b, end= pos_a+length; if (type == HA_KEYTYPE_TEXT || type == HA_KEYTYPE_VARTEXT) { - uchar *sort_order=keyseg->charset->sort_order; - while (pos_a != end) - if (sort_order[*(uchar*) pos_a++] != - sort_order[*(uchar*) pos_b++]) + if (use_strcoll(keyseg->charset)) + { + if (my_strnncoll(keyseg->charset,pos_a,length,pos_b,length)) return 1; + } + else + { + uchar *sort_order=keyseg->charset->sort_order; + while (pos_a != end) + if (sort_order[*(uchar*) pos_a++] != + sort_order[*(uchar*) pos_b++]) + return 1; + } } else while (pos_a != end) diff --git a/sql/field.cc b/sql/field.cc index 8b1073d32f3..a475612fbb0 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -3782,10 +3782,10 @@ uint Field_varstring::max_packed_col_length(uint max_length) Field_blob::Field_blob(char *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg, enum utype unireg_check_arg, const char *field_name_arg, struct st_table *table_arg,uint blob_pack_length, - bool binary_arg) + bool binary_arg, CHARSET_INFO *cs) :Field_str(ptr_arg, (1L << min(blob_pack_length,3)*8)-1L, null_ptr_arg, null_bit_arg, unireg_check_arg, field_name_arg, - table_arg, default_charset_info), + table_arg, cs), packlength(blob_pack_length),binary_flag(binary_arg), geom_flag(true) { flags|= BLOB_FLAG; @@ -3967,9 +3967,9 @@ String *Field_blob::val_str(String *val_buffer __attribute__((unused)), char *blob; memcpy_fixed(&blob,ptr+packlength,sizeof(char*)); if (!blob) - val_ptr->set("",0,default_charset_info); // A bit safer than ->length(0) + val_ptr->set("",0,field_charset); // A bit safer than ->length(0) else - val_ptr->set((const char*) blob,get_length(ptr),default_charset_info); + val_ptr->set((const char*) blob,get_length(ptr),field_charset); return val_ptr; } @@ -4782,7 +4782,8 @@ Field *make_field(char *ptr, uint32 field_length, if (f_is_blob(pack_flag)) return new Field_blob(ptr,null_pos,null_bit, unireg_check, field_name, table, - pack_length,f_is_binary(pack_flag) != 0); + pack_length,f_is_binary(pack_flag) != 0, + default_charset_info); if (f_is_geom(pack_flag)) return new Field_geom(ptr,null_pos,null_bit, unireg_check, field_name, table, diff --git a/sql/field.h b/sql/field.h index 5b9723654d9..5bc463af48d 100644 --- a/sql/field.h +++ b/sql/field.h @@ -842,11 +842,11 @@ public: Field_blob(char *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg, enum utype unireg_check_arg, const char *field_name_arg, struct st_table *table_arg,uint blob_pack_length, - bool binary_arg); + bool binary_arg, CHARSET_INFO *cs); Field_blob(uint32 len_arg,bool maybe_null_arg, const char *field_name_arg, - struct st_table *table_arg, bool binary_arg) + struct st_table *table_arg, bool binary_arg, CHARSET_INFO *cs) :Field_str((char*) 0,len_arg, maybe_null_arg ? (uchar*) "": 0,0, - NONE, field_name_arg, table_arg, default_charset_info), + NONE, field_name_arg, table_arg, cs), packlength(3),binary_flag(binary_arg), geom_flag(true) { flags|= BLOB_FLAG; @@ -930,11 +930,12 @@ public: struct st_table *table_arg,uint blob_pack_length, bool binary_arg) :Field_blob(ptr_arg, null_ptr_arg, null_bit_arg, unireg_check_arg, - field_name_arg, table_arg, blob_pack_length,binary_arg) {} + field_name_arg, table_arg, blob_pack_length,binary_arg, + default_charset_info) {} Field_geom(uint32 len_arg,bool maybe_null_arg, const char *field_name_arg, struct st_table *table_arg, bool binary_arg) :Field_blob(len_arg, maybe_null_arg, field_name_arg, - table_arg, binary_arg) {} + table_arg, binary_arg, default_charset_info) {} enum ha_base_keytype key_type() const { return HA_KEYTYPE_VARBINARY; } void get_key_image(char *buff,uint length, imagetype type); diff --git a/sql/field_conv.cc b/sql/field_conv.cc index 3b8a2ee791c..da7a1187a47 100644 --- a/sql/field_conv.cc +++ b/sql/field_conv.cc @@ -508,7 +508,8 @@ void field_conv(Field *to,Field *from) if (!blob->value.is_alloced() && from->real_type() != FIELD_TYPE_STRING) blob->value.copy(); - blob->store(blob->value.ptr(),blob->value.length(),default_charset_info); + blob->store(blob->value.ptr(),blob->value.length(), + to->binary()?default_charset_info:((Field_str*)to)->charset()); return; } if ((from->result_type() == STRING_RESULT && diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index a4f09f9103e..c2549ddc769 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1799,7 +1799,7 @@ String *Item_func_conv_charset::val_str(String *str) s=(const uchar*)arg->ptr(); se=s+arg->length(); - dmaxlen=arg->length()*(conv_charset->mbmaxlen?conv_charset->mbmaxlen:1)+1; + dmaxlen=arg->length()*(to->mbmaxlen?to->mbmaxlen:1)+1; str->alloc(dmaxlen); d0=d=(unsigned char*)str->ptr(); de=d+dmaxlen; @@ -1841,7 +1841,7 @@ outp: void Item_func_conv_charset::fix_length_and_dec() { - /* BAR TODO: What to do here??? */ + max_length = args[0]->max_length*(conv_charset->mbmaxlen?conv_charset->mbmaxlen:1); } @@ -1911,23 +1911,41 @@ outp: return str; } -String *Item_func_charset::val_str(String *str) -{ - String *res = args[0]->val_str(str); - if ((null_value=(args[0]->null_value || !res->charset()))) - return 0; - str->copy(res->charset()->name,strlen(res->charset()->name)); - return str; +bool Item_func_conv_charset::fix_fields(THD *thd,struct st_table_list *tables) +{ + char buff[STACK_BUFF_ALLOC]; // Max argument in function + binary=0; + used_tables_cache=0; + const_item_cache=1; + + if (thd && check_stack_overrun(thd,buff)) + return 0; // Fatal error if flag is set! + if (args[0]->fix_fields(thd,tables)) + return 1; + maybe_null=args[0]->maybe_null; + binary=args[0]->binary; + str_value.set_charset(conv_charset); + fix_length_and_dec(); + return 0; } void Item_func_conv_charset3::fix_length_and_dec() { - /* BAR TODO: What to do here??? */ + max_length = args[0]->max_length; } +String *Item_func_charset::val_str(String *str) +{ + String *res = args[0]->val_str(str); + + if ((null_value=(args[0]->null_value || !res->charset()))) + return 0; + str->copy(res->charset()->name,strlen(res->charset()->name)); + return str; +} String *Item_func_hex::val_str(String *str) diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index a273abaf614..74ec51274fc 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -40,7 +40,8 @@ public: if (!t_arg) return result_field; return (max_length > 255) ? - (Field *)new Field_blob(max_length,maybe_null, name,t_arg, binary) : + (Field *)new Field_blob(max_length,maybe_null, name,t_arg, binary, + default_charset_info) : (Field *) new Field_string(max_length,maybe_null, name,t_arg, binary, default_charset_info); } @@ -488,6 +489,7 @@ public: { conv_charset=cs; } + bool fix_fields(THD *thd,struct st_table_list *tables); String *val_str(String *); void fix_length_and_dec(); const char *func_name() const { return "conv_charset"; } diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 025a5c600a5..f528750341e 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -3523,7 +3523,7 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, case STRING_RESULT: if (item_sum->max_length > 255) return new Field_blob(item_sum->max_length,maybe_null, - item->name,table,item->binary); + item->name,table,item->binary,default_charset_info); return new Field_string(item_sum->max_length,maybe_null, item->name,table,item->binary,default_charset_info); } @@ -3576,7 +3576,8 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, case STRING_RESULT: if (item->max_length > 255) new_field= new Field_blob(item->max_length,maybe_null, - item->name,table,item->binary); + item->name,table,item->binary, + item->str_value.charset()); else new_field= new Field_string(item->max_length,maybe_null, item->name,table,item->binary, @@ -4104,7 +4105,9 @@ static bool create_myisam_tmp_table(TABLE *table,TMP_TABLE_PARAM *param, { Field *field=keyinfo->key_part[i].field; seg->flag= 0; - seg->language= MY_CHARSET_CURRENT; + seg->language= field->binary() ? MY_CHARSET_CURRENT : + ((Field_str*)field)->charset()->number; + seg->length= keyinfo->key_part[i].length; seg->start= keyinfo->key_part[i].offset; if (field->flags & BLOB_FLAG) -- cgit v1.2.1 From 328d6f42fcf06fb8bb62ab09bedf5a96dc955f22 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 26 Jun 2002 16:41:51 +0500 Subject: This now correctly substitutes charset to new table: CREATE TABLE a SELECT strfunc(non_default_charset_expr) --- sql/item_strfunc.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index 74ec51274fc..967fb1ee7f2 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -41,9 +41,9 @@ public: return result_field; return (max_length > 255) ? (Field *)new Field_blob(max_length,maybe_null, name,t_arg, binary, - default_charset_info) : + str_value.charset()) : (Field *) new Field_string(max_length,maybe_null, name,t_arg, binary, - default_charset_info); + str_value.charset()); } }; -- cgit v1.2.1 From 0d354e47ff13b0b3511a462f330e041e427061a0 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 26 Jun 2002 18:08:33 +0500 Subject: SELECT DISTINCT CONVERT(field USING charset) now works properly --- sql/item_strfunc.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index c2549ddc769..8fb3b7f6897 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1925,6 +1925,7 @@ bool Item_func_conv_charset::fix_fields(THD *thd,struct st_table_list *tables) return 1; maybe_null=args[0]->maybe_null; binary=args[0]->binary; + const_item_cache=args[0]->const_item(); str_value.set_charset(conv_charset); fix_length_and_dec(); return 0; -- cgit v1.2.1 From fce882261151614d2790aa9597eb668f3114c9d5 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 27 Jun 2002 14:41:02 +0500 Subject: ALTER DATABASE DEFAULT CHARACTER SET latin1; --- sql/mysql_priv.h | 3 +- sql/sql_db.cc | 227 ++++++++++++++++++++++++++++++++++++++----------------- sql/sql_lex.h | 3 +- sql/sql_parse.cc | 17 +++++ sql/sql_yacc.yy | 24 ++++-- 5 files changed, 195 insertions(+), 79 deletions(-) diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 1d0e3c1a72f..2992f11ef65 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -289,7 +289,8 @@ inline THD *_current_thd(void) #define prepare_execute(A) ((A)->command == COM_EXECUTE) -int mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create_info, bool silent); +int mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create, bool silent); +int mysql_alter_db(THD *thd, char *db, HA_CREATE_INFO *create, bool silent); int mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent); void mysql_binlog_send(THD* thd, char* log_ident, ulong pos, ushort flags); int mysql_rm_table(THD *thd,TABLE_LIST *tables, my_bool if_exists); diff --git a/sql/sql_db.cc b/sql/sql_db.cc index 91f7474bb33..aa8030e5a3e 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -31,6 +31,96 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db, const char *path, uint level); +/* + Create database options file: + Currently databse default charset is only stored there. +*/ + +static int write_db_opt(THD *thd, char *db, HA_CREATE_INFO *create, char *fn) +{ + register File file; + char buf[256]; // Should be enough + int error=0; + + if ((file=my_create(fn,CREATE_MODE,O_RDWR | O_TRUNC,MYF(MY_WME))) >= 0) + { + sprintf(buf,"default-character-set=%s\n", + (create && create->table_charset) ? + create->table_charset->name : "DEFAULT"); + + if (my_write(file,(byte*)buf,strlen(buf),MYF(MY_NABP+MY_WME))) + { + // QQ : should we send more suitable error message? + my_error(ER_CANT_CREATE_DB,MYF(0),db,my_errno); + error = -1; + goto exit; + } + my_close(file,MYF(0)); + } + else + { + // QQ : should we send more suitable error message? + my_error(ER_CANT_CREATE_DB,MYF(0),db,my_errno); + error = -1; + goto exit; + } +exit: + return error; +} + + + /* + Load database options file: + */ +static int load_db_opt(THD *thd,char *fn) +{ + register File file; + char buf[256]=""; + + if ((file=my_open(fn,O_RDWR|O_BINARY,MYF(MY_WME))) >= 0) + { + int nbytes=my_read(file,(byte*)buf,sizeof(buf)-1,MYF(0)); + if ( nbytes >= 0 ) + { + char *ln=buf; + char *pe=buf+nbytes; + + buf[nbytes]='\0'; + + for ( ln=buf; lndb_charset=get_charset_by_name(val, MYF(0)); + } + goto cnt; + break; + } + } +cnt: + ln=le; + } + } + my_close(file,MYF(0)); + } + return 0; +} + /* db-name is already validated when we come here */ int mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create_info, bool silent) @@ -39,10 +129,10 @@ int mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create_info, bool silent MY_DIR *dirp; long result=1; int error = 0; - DBUG_ENTER("mysql_create_db"); - register File file; uint create_options = create_info ? create_info->options : 0; - + + DBUG_ENTER("mysql_create_db"); + VOID(pthread_mutex_lock(&LOCK_mysql_create_db)); // do not create database if another thread is holding read lock @@ -77,43 +167,81 @@ int mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create_info, bool silent } } - /* - Create database options file: - Currently databse default charset is only stored there. - */ - strcat(path,"/"); unpack_dirname(path,path); strcat(path,MY_DB_OPT_FILE); - if ((file=my_create(path,CREATE_MODE,O_RDWR | O_TRUNC,MYF(MY_WME))) >= 0) + if ((error=write_db_opt(thd,db,create_info,path))) + goto exit; + + if (!silent) { - sprintf(path,"default-character-set=%s\n", - (create_info && create_info->table_charset) ? - create_info->table_charset->name : "DEFAULT"); - - if (my_write(file,(byte*) path,strlen(path),MYF(MY_NABP+MY_WME))) + if (!thd->query) { - // QQ : should we send more suitable error message? - my_error(ER_CANT_CREATE_DB,MYF(0),db,my_errno); - error = -1; - goto exit; + thd->query = path; + thd->query_length = (uint) (strxmov(path,"create database ", db, NullS)- + path); } - my_close(file,MYF(0)); + { + mysql_update_log.write(thd,thd->query, thd->query_length); + if (mysql_bin_log.is_open()) + { + Query_log_event qinfo(thd, thd->query); + mysql_bin_log.write(&qinfo); + } + } + if (thd->query == path) + { + thd->query = 0; // just in case + thd->query_length = 0; + } + send_ok(&thd->net, result); } - else + +exit: + start_waiting_global_read_lock(thd); +exit2: + VOID(pthread_mutex_unlock(&LOCK_mysql_create_db)); + DBUG_RETURN(error); +} + + +/* db-name is already validated when we come here */ + +int mysql_alter_db(THD *thd, char *db, HA_CREATE_INFO *create_info, bool silent) +{ + char path[FN_REFLEN+16]; + MY_DIR *dirp; + long result=1; + int error = 0; + DBUG_ENTER("mysql_create_db"); + register File file; + uint create_options = create_info ? create_info->options : 0; + + printf("alter database\n"); + + VOID(pthread_mutex_lock(&LOCK_mysql_create_db)); + + // do not alter database if another thread is holding read lock + if (wait_if_global_read_lock(thd,0)) { - // QQ : should we send more suitable error message? - my_error(ER_CANT_CREATE_DB,MYF(0),db,my_errno); - error = -1; - goto exit; + error= -1; + goto exit2; } + /* Check directory */ + (void)sprintf(path,"%s/%s", mysql_data_home, db); + strcat(path,"/"); + unpack_dirname(path,path); // Convert if not unix + strcat(path,MY_DB_OPT_FILE); + if ((error=write_db_opt(thd,db,create_info,path))) + goto exit; + if (!silent) { if (!thd->query) { thd->query = path; - thd->query_length = (uint) (strxmov(path,"create database ", db, NullS)- + thd->query_length = (uint) (strxmov(path,"alter database ", db, NullS)- path); } { @@ -139,6 +267,10 @@ exit2: DBUG_RETURN(error); } + + + + const char *del_exts[]= {".frm", ".BAK", ".TMD",".opt", NullS}; static TYPELIB deletable_extentions= {array_elements(del_exts)-1,"del_exts", del_exts}; @@ -368,7 +500,6 @@ bool mysql_change_db(THD *thd,const char *name) char path[FN_REFLEN]; uint db_access; DBUG_ENTER("mysql_change_db"); - register File file; if (!dbname || !(db_length=strip_sp(dbname))) { @@ -419,53 +550,11 @@ bool mysql_change_db(THD *thd,const char *name) thd->db_length=db_length; thd->db_access=db_access; - /* - Load database options file: - */ - strcat(path,"/"); unpack_dirname(path,path); strcat(path,MY_DB_OPT_FILE); - if ((file=my_open(path,O_RDWR|O_BINARY,MYF(MY_WME))) >= 0) - { - int nbytes=my_read(file,(byte*) path,sizeof(path),MYF(0)); - if ( nbytes >= 0 ) - { - char *ln=path; - char *pe=path+nbytes; + load_db_opt(thd,path); - path[nbytes]='\0'; - for ( ln=path; lndb_charset=get_charset_by_name(val, MYF(0)); - } - goto cnt; - break; - } - } -cnt: - ln=le; - } - } - my_close(file,MYF(0)); - } DBUG_RETURN(0); } diff --git a/sql/sql_lex.h b/sql/sql_lex.h index ca824b3eab8..545300b2629 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -44,7 +44,8 @@ enum enum_sql_command { SQLCOM_SHOW_GRANTS, SQLCOM_SHOW_CREATE, SQLCOM_SHOW_CHARSETS, SQLCOM_LOAD,SQLCOM_SET_OPTION,SQLCOM_LOCK_TABLES,SQLCOM_UNLOCK_TABLES, - SQLCOM_GRANT, SQLCOM_CHANGE_DB, SQLCOM_CREATE_DB, SQLCOM_DROP_DB, + SQLCOM_GRANT, + SQLCOM_CHANGE_DB, SQLCOM_CREATE_DB, SQLCOM_DROP_DB, SQLCOM_ALTER_DB, SQLCOM_REPAIR, SQLCOM_REPLACE, SQLCOM_REPLACE_SELECT, SQLCOM_CREATE_FUNCTION, SQLCOM_DROP_FUNCTION, SQLCOM_REVOKE,SQLCOM_OPTIMIZE, SQLCOM_CHECK, diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 1f7e05fbae0..43cb056ffc8 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2328,6 +2328,23 @@ mysql_execute_command(void) res=mysql_rm_db(thd,lex->name,lex->drop_if_exists,0); break; } + case SQLCOM_ALTER_DB: + { + if (!strip_sp(lex->name) || check_db_name(lex->name)) + { + net_printf(&thd->net,ER_WRONG_DB_NAME, lex->name); + break; + } + if (check_access(thd,DROP_ACL,lex->name,0,1)) + break; + if (thd->locked_tables || thd->active_transaction()) + { + send_error(&thd->net,ER_LOCK_OR_ACTIVE_TRANSACTION); + goto error; + } + res=mysql_alter_db(thd,lex->name,&lex->create_info,0); + break; + } case SQLCOM_CREATE_FUNCTION: if (check_access(thd,INSERT_ACL,"mysql",0,1)) break; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index faa63afa6c7..303a539eb49 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -885,12 +885,7 @@ create_table_option: table_list->next=0; lex->create_info.used_fields|= HA_CREATE_USED_UNION; } - | CHARSET EQ DEFAULT - { - Lex->create_info.table_charset=NULL; - Lex->create_info.used_fields|= HA_CREATE_USED_CHARSET; - } - | CHARSET EQ charset + | CHARSET EQ charset_or_nocharset { Lex->create_info.table_charset=Lex->charset; Lex->create_info.used_fields|= HA_CREATE_USED_CHARSET; @@ -1139,6 +1134,10 @@ charset: } }; +charset_or_nocharset: + charset + | DEFAULT {Lex->charset=NULL; } + opt_binary: /* empty */ { Lex->charset=NULL; } | BINARY { Lex->type|=BINARY_FLAG; Lex->charset=NULL; } @@ -1146,7 +1145,7 @@ opt_binary: default_charset: /* empty */ { Lex->charset=NULL; } - | DEFAULT CHAR_SYM SET charset ; + | DEFAULT CHAR_SYM SET charset_or_nocharset ; references: REFERENCES table_ident @@ -1270,7 +1269,16 @@ alter: lex->simple_alter=1; } alter_list; - + + | ALTER DATABASE ident default_charset + { + LEX *lex=Lex; + lex->sql_command=SQLCOM_ALTER_DB; + lex->name=$3.str; + lex->create_info.table_charset=lex->charset; + } + + alter_list: | alter_list_item | alter_list ',' alter_list_item; -- cgit v1.2.1 From e6a32a67ba7a1ec636df9d05a67a241cef2e5b4a Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 27 Jun 2002 15:21:52 +0500 Subject: Now database default character is changed during ALTER DATABASE if the current db is being altered --- sql/sql_db.cc | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/sql/sql_db.cc b/sql/sql_db.cc index aa8030e5a3e..63edebd4ac7 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -36,7 +36,7 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, Currently databse default charset is only stored there. */ -static int write_db_opt(THD *thd, char *db, HA_CREATE_INFO *create, char *fn) +static int write_db_opt(THD *thd,const char *db,HA_CREATE_INFO *create,char *fn) { register File file; char buf[256]; // Should be enough @@ -72,7 +72,7 @@ exit: /* Load database options file: */ -static int load_db_opt(THD *thd,char *fn) +static int load_db_opt(THD *thd,const char *db,HA_CREATE_INFO *create,char *fn) { register File file; char buf[256]=""; @@ -217,8 +217,6 @@ int mysql_alter_db(THD *thd, char *db, HA_CREATE_INFO *create_info, bool silent) register File file; uint create_options = create_info ? create_info->options : 0; - printf("alter database\n"); - VOID(pthread_mutex_lock(&LOCK_mysql_create_db)); // do not alter database if another thread is holding read lock @@ -236,6 +234,15 @@ int mysql_alter_db(THD *thd, char *db, HA_CREATE_INFO *create_info, bool silent) if ((error=write_db_opt(thd,db,create_info,path))) goto exit; + /* + Change options if current + database is being altered + */ + if (thd->db && !strcmp(thd->db,db)) + { + thd->db_charset= create_info ? create_info->table_charset : NULL; + } + if (!silent) { if (!thd->query) @@ -499,6 +506,8 @@ bool mysql_change_db(THD *thd,const char *name) char *dbname=my_strdup((char*) name,MYF(MY_WME)); char path[FN_REFLEN]; uint db_access; + HA_CREATE_INFO create; + DBUG_ENTER("mysql_change_db"); if (!dbname || !(db_length=strip_sp(dbname))) @@ -553,8 +562,9 @@ bool mysql_change_db(THD *thd,const char *name) strcat(path,"/"); unpack_dirname(path,path); strcat(path,MY_DB_OPT_FILE); - load_db_opt(thd,path); - + bzero(&create,sizeof(create)); + load_db_opt(thd,name,&create,path); + thd->db_charset=create.table_charset; DBUG_RETURN(0); } -- cgit v1.2.1 From 96d34f547b59fa5bd1f36956cfe9b92778f1b39e Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 27 Jun 2002 19:00:49 +0500 Subject: Fix --- sql/item_strfunc.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 8fb3b7f6897..5bb2c4015ad 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1792,6 +1792,7 @@ String *Item_func_conv_charset::val_str(String *str) null_value=1; return 0; } + null_value=0; from=arg->charset(); to=conv_charset; -- cgit v1.2.1 From 0a47ee155b9b7550e49eae7c967e9d203b3dad5b Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 27 Jun 2002 19:36:18 +0500 Subject: Added test for new charset features --- mysql-test/r/ctype_many.result | 1334 ++++++++++++++++++++++++++++++++++++++++ mysql-test/t/ctype_many.test | 189 ++++++ 2 files changed, 1523 insertions(+) create mode 100644 mysql-test/r/ctype_many.result create mode 100644 mysql-test/t/ctype_many.test diff --git a/mysql-test/r/ctype_many.result b/mysql-test/r/ctype_many.result new file mode 100644 index 00000000000..b6c0f25853d --- /dev/null +++ b/mysql-test/r/ctype_many.result @@ -0,0 +1,1334 @@ +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 ( +comment CHAR(32) CHARACTER SET latin1 NOT NULL, +koi8_ru_f CHAR(32) CHARACTER SET koi8_ru NOT NULL +) CHARSET=latin5; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `comment` char(32) character set latin1 NOT NULL default '', + `koi8_ru_f` char(32) character set koi8_ru NOT NULL default '' +) TYPE=MyISAM CHARSET=latin5 +ALTER TABLE t1 CHANGE comment comment CHAR(32) CHARACTER SET latin2 NOT NULL; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `comment` char(32) character set latin2 NOT NULL default '', + `koi8_ru_f` char(32) character set koi8_ru NOT NULL default '' +) TYPE=MyISAM CHARSET=latin5 +ALTER TABLE t1 ADD latin5_f CHAR(32) NOT NULL; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `comment` char(32) character set latin2 NOT NULL default '', + `koi8_ru_f` char(32) character set koi8_ru NOT NULL default '', + `latin5_f` char(32) character set latin5 NOT NULL default '' +) TYPE=MyISAM CHARSET=latin5 +ALTER TABLE t1 CHARSET=latin2; +ALTER TABLE t1 ADD latin2_f CHAR(32) NOT NULL; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `comment` char(32) character set latin2 NOT NULL default '', + `koi8_ru_f` char(32) character set koi8_ru NOT NULL default '', + `latin5_f` char(32) character set latin5 NOT NULL default '', + `latin2_f` char(32) character set latin2 NOT NULL default '' +) TYPE=MyISAM CHARSET=latin2 +ALTER TABLE t1 DROP latin2_f, DROP latin5_f; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `comment` char(32) character set latin2 NOT NULL default '', + `koi8_ru_f` char(32) character set koi8_ru NOT NULL default '' +) TYPE=MyISAM CHARSET=latin2 +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('a','LAT SMALL A'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('b','LAT SMALL B'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('c','LAT SMALL C'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('d','LAT SMALL D'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('e','LAT SMALL E'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('f','LAT SMALL F'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('g','LAT SMALL G'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('h','LAT SMALL H'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('i','LAT SMALL I'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('j','LAT SMALL J'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('k','LAT SMALL K'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('l','LAT SMALL L'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('m','LAT SMALL M'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('n','LAT SMALL N'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('o','LAT SMALL O'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('p','LAT SMALL P'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('q','LAT SMALL Q'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('r','LAT SMALL R'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('s','LAT SMALL S'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('t','LAT SMALL T'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('u','LAT SMALL U'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('v','LAT SMALL V'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('w','LAT SMALL W'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('x','LAT SMALL X'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('y','LAT SMALL Y'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('z','LAT SMALL Z'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('A','LAT CAPIT A'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('B','LAT CAPIT B'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('C','LAT CAPIT C'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('D','LAT CAPIT D'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('E','LAT CAPIT E'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('F','LAT CAPIT F'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('G','LAT CAPIT G'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('H','LAT CAPIT H'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('I','LAT CAPIT I'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('J','LAT CAPIT J'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('K','LAT CAPIT K'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('L','LAT CAPIT L'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('M','LAT CAPIT M'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('N','LAT CAPIT N'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('O','LAT CAPIT O'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('P','LAT CAPIT P'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Q','LAT CAPIT Q'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('R','LAT CAPIT R'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('S','LAT CAPIT S'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('T','LAT CAPIT T'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('U','LAT CAPIT U'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('V','LAT CAPIT V'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('W','LAT CAPIT W'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('X','LAT CAPIT X'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Y','LAT CAPIT Y'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Z','LAT CAPIT Z'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Á','CYR SMALL A'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Â','CYR SMALL BE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('×','CYR SMALL VE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ç','CYR SMALL GE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ä','CYR SMALL DE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Å','CYR SMALL IE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('£','CYR SMALL IO'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ö','CYR SMALL ZHE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ú','CYR SMALL ZE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('É','CYR SMALL I'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ë','CYR SMALL KA'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ì','CYR SMALL EL'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Í','CYR SMALL EM'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Î','CYR SMALL EN'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ï','CYR SMALL O'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ð','CYR SMALL PE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ò','CYR SMALL ER'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ó','CYR SMALL ES'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ô','CYR SMALL TE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Õ','CYR SMALL U'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Æ','CYR SMALL EF'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('È','CYR SMALL HA'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ã','CYR SMALL TSE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Þ','CYR SMALL CHE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Û','CYR SMALL SHA'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ý','CYR SMALL SCHA'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ß','CYR SMALL HARD SIGN'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ù','CYR SMALL YERU'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ø','CYR SMALL SOFT SIGN'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ü','CYR SMALL E'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('À','CYR SMALL YU'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ñ','CYR SMALL YA'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('á','CYR CAPIT A'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('â','CYR CAPIT BE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('÷','CYR CAPIT VE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ç','CYR CAPIT GE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ä','CYR CAPIT DE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('å','CYR CAPIT IE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('³','CYR CAPIT IO'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ö','CYR CAPIT ZHE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ú','CYR CAPIT ZE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('é','CYR CAPIT I'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ë','CYR CAPIT KA'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ì','CYR CAPIT EL'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('í','CYR CAPIT EM'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('î','CYR CAPIT EN'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ï','CYR CAPIT O'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ð','CYR CAPIT PE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ò','CYR CAPIT ER'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ó','CYR CAPIT ES'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ô','CYR CAPIT TE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('õ','CYR CAPIT U'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('æ','CYR CAPIT EF'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('è','CYR CAPIT HA'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ã','CYR CAPIT TSE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('þ','CYR CAPIT CHE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('û','CYR CAPIT SHA'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ý','CYR CAPIT SCHA'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ÿ','CYR CAPIT HARD SIGN'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ù','CYR CAPIT YERU'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ø','CYR CAPIT SOFT SIGN'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ü','CYR CAPIT E'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('à','CYR CAPIT YU'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ñ','CYR CAPIT YA'); +ALTER TABLE t1 ADD utf8_f CHAR(32) CHARACTER SET utf8 NOT NULL; +UPDATE t1 SET utf8_f=CONVERT(koi8_ru_f USING utf8); +SELECT * FROM t1; +comment koi8_ru_f utf8_f +LAT SMALL A a a +LAT SMALL B b b +LAT SMALL C c c +LAT SMALL D d d +LAT SMALL E e e +LAT SMALL F f f +LAT SMALL G g g +LAT SMALL H h h +LAT SMALL I i i +LAT SMALL J j j +LAT SMALL K k k +LAT SMALL L l l +LAT SMALL M m m +LAT SMALL N n n +LAT SMALL O o o +LAT SMALL P p p +LAT SMALL Q q q +LAT SMALL R r r +LAT SMALL S s s +LAT SMALL T t t +LAT SMALL U u u +LAT SMALL V v v +LAT SMALL W w w +LAT SMALL X x x +LAT SMALL Y y y +LAT SMALL Z z z +LAT CAPIT A A A +LAT CAPIT B B B +LAT CAPIT C C C +LAT CAPIT D D D +LAT CAPIT E E E +LAT CAPIT F F F +LAT CAPIT G G G +LAT CAPIT H H H +LAT CAPIT I I I +LAT CAPIT J J J +LAT CAPIT K K K +LAT CAPIT L L L +LAT CAPIT M M M +LAT CAPIT N N N +LAT CAPIT O O O +LAT CAPIT P P P +LAT CAPIT Q Q Q +LAT CAPIT R R R +LAT CAPIT S S S +LAT CAPIT T T T +LAT CAPIT U U U +LAT CAPIT V V V +LAT CAPIT W W W +LAT CAPIT X X X +LAT CAPIT Y Y Y +LAT CAPIT Z Z Z +CYR SMALL A Á а +CYR SMALL BE  б +CYR SMALL VE × Ð² +CYR SMALL GE Ç Ð³ +CYR SMALL DE Ä Ð´ +CYR SMALL IE Šе +CYR SMALL IO £ Ñ‘ +CYR SMALL ZHE Ö Ð¶ +CYR SMALL ZE Ú Ð· +CYR SMALL I É Ð¸ +CYR SMALL KA Ë Ðº +CYR SMALL EL Ì Ð» +CYR SMALL EM Í Ð¼ +CYR SMALL EN Πн +CYR SMALL O Ï Ð¾ +CYR SMALL PE Рп +CYR SMALL ER Ò Ñ€ +CYR SMALL ES Ó Ñ +CYR SMALL TE Ô Ñ‚ +CYR SMALL U Õ Ñƒ +CYR SMALL EF Æ Ñ„ +CYR SMALL HA È Ñ… +CYR SMALL TSE à ц +CYR SMALL CHE Þ Ñ‡ +CYR SMALL SHA Û Ñˆ +CYR SMALL SCHA Ý Ñ‰ +CYR SMALL HARD SIGN ß ÑŠ +CYR SMALL YERU Ù Ñ‹ +CYR SMALL SOFT SIGN Ø ÑŒ +CYR SMALL E Ü Ñ +CYR SMALL YU À ÑŽ +CYR SMALL YA Ñ Ñ +CYR CAPIT A á Ð +CYR CAPIT BE â Б +CYR CAPIT VE ÷ Ð’ +CYR CAPIT GE ç Г +CYR CAPIT DE ä Д +CYR CAPIT IE å Е +CYR CAPIT IO ³ Ð +CYR CAPIT ZHE ö Ж +CYR CAPIT ZE ú З +CYR CAPIT I é И +CYR CAPIT KA ë К +CYR CAPIT EL ì Л +CYR CAPIT EM í Ðœ +CYR CAPIT EN î Ð +CYR CAPIT O ï О +CYR CAPIT PE ð П +CYR CAPIT ER ò Р +CYR CAPIT ES ó С +CYR CAPIT TE ô Т +CYR CAPIT U õ У +CYR CAPIT EF æ Ф +CYR CAPIT HA è Ð¥ +CYR CAPIT TSE ã Ц +CYR CAPIT CHE þ Ч +CYR CAPIT SHA û Ш +CYR CAPIT SCHA ý Щ +CYR CAPIT HARD SIGN ÿ Ъ +CYR CAPIT YERU ù Ы +CYR CAPIT SOFT SIGN ø Ь +CYR CAPIT E ü Э +CYR CAPIT YU à Ю +CYR CAPIT YA ñ Я +SELECT koi8_ru_f,MIN(comment) FROM t1 GROUP BY 1; +koi8_ru_f MIN(comment) +a LAT CAPIT A +b LAT CAPIT B +c LAT CAPIT C +d LAT CAPIT D +e LAT CAPIT E +f LAT CAPIT F +g LAT CAPIT G +h LAT CAPIT H +i LAT CAPIT I +j LAT CAPIT J +k LAT CAPIT K +l LAT CAPIT L +m LAT CAPIT M +n LAT CAPIT N +o LAT CAPIT O +p LAT CAPIT P +q LAT CAPIT Q +r LAT CAPIT R +s LAT CAPIT S +t LAT CAPIT T +u LAT CAPIT U +v LAT CAPIT V +w LAT CAPIT W +x LAT CAPIT X +y LAT CAPIT Y +z LAT CAPIT Z +Á CYR CAPIT A + CYR CAPIT BE +× CYR CAPIT VE +Ç CYR CAPIT GE +Ä CYR CAPIT DE +Å CYR CAPIT IE +£ CYR CAPIT IO +Ö CYR CAPIT ZHE +Ú CYR CAPIT ZE +É CYR CAPIT I +Ë CYR CAPIT KA +Ì CYR CAPIT EL +Í CYR CAPIT EM +Î CYR CAPIT EN +Ï CYR CAPIT O +Ð CYR CAPIT PE +Ò CYR CAPIT ER +Ó CYR CAPIT ES +Ô CYR CAPIT TE +Õ CYR CAPIT U +Æ CYR CAPIT EF +È CYR CAPIT HA +à CYR CAPIT TSE +Þ CYR CAPIT CHE +Û CYR CAPIT SHA +Ý CYR CAPIT SCHA +ß CYR CAPIT HARD SIGN +Ù CYR CAPIT YERU +Ø CYR CAPIT SOFT SIGN +Ü CYR CAPIT E +À CYR CAPIT YU +Ñ CYR CAPIT YA +SELECT utf8_f,MIN(comment) FROM t1 GROUP BY 1; +utf8_f MIN(comment) +a LAT CAPIT A +b LAT CAPIT B +c LAT CAPIT C +d LAT CAPIT D +e LAT CAPIT E +f LAT CAPIT F +g LAT CAPIT G +h LAT CAPIT H +i LAT CAPIT I +j LAT CAPIT J +k LAT CAPIT K +l LAT CAPIT L +m LAT CAPIT M +n LAT CAPIT N +o LAT CAPIT O +p LAT CAPIT P +q LAT CAPIT Q +r LAT CAPIT R +s LAT CAPIT S +t LAT CAPIT T +u LAT CAPIT U +v LAT CAPIT V +w LAT CAPIT W +x LAT CAPIT X +y LAT CAPIT Y +z LAT CAPIT Z +а CYR CAPIT A +б CYR CAPIT BE +в CYR CAPIT VE +г CYR CAPIT GE +д CYR CAPIT DE +е CYR CAPIT IE +ж CYR CAPIT ZHE +з CYR CAPIT ZE +и CYR CAPIT I +к CYR CAPIT KA +л CYR CAPIT EL +м CYR CAPIT EM +н CYR CAPIT EN +о CYR CAPIT O +п CYR CAPIT PE +Ñ€ CYR CAPIT ER +Ñ CYR CAPIT ES +Ñ‚ CYR CAPIT TE +у CYR CAPIT U +Ñ„ CYR CAPIT EF +Ñ… CYR CAPIT HA +ц CYR CAPIT TSE +ч CYR CAPIT CHE +ш CYR CAPIT SHA +щ CYR CAPIT SCHA +ÑŠ CYR CAPIT HARD SIGN +Ñ‹ CYR CAPIT YERU +ÑŒ CYR CAPIT SOFT SIGN +Ñ CYR CAPIT E +ÑŽ CYR CAPIT YU +Ñ CYR CAPIT YA +SELECT DISTINCT koi8_ru_f FROM t1; +koi8_ru_f +a +b +c +d +e +f +g +h +i +j +k +l +m +n +o +p +q +r +s +t +u +v +w +x +y +z +Á + +× +Ç +Ä +Å +£ +Ö +Ú +É +Ë +Ì +Í +Î +Ï +Ð +Ò +Ó +Ô +Õ +Æ +È +à +Þ +Û +Ý +ß +Ù +Ø +Ü +À +Ñ +SELECT DISTINCT utf8_f FROM t1; +utf8_f +a +b +c +d +e +f +g +h +i +j +k +l +m +n +o +p +q +r +s +t +u +v +w +x +y +z +а +б +в +г +д +е +ж +з +и +к +л +м +н +о +п +Ñ€ +Ñ +Ñ‚ +у +Ñ„ +Ñ… +ц +ч +ш +щ +ÑŠ +Ñ‹ +ÑŒ +Ñ +ÑŽ +Ñ +SELECT lower(koi8_ru_f) FROM t1 ORDER BY 1 DESC; +lower(koi8_ru_f) +Ñ +Ñ +À +À +Ü +Ü +Ø +Ø +Ù +Ù +ß +ß +Ý +Ý +Û +Û +Þ +Þ +à +à +È +È +Æ +Æ +Õ +Õ +Ô +Ô +Ó +Ó +Ò +Ò +Ð +Ð +Ï +Ï +Î +Î +Í +Í +Ì +Ì +Ë +Ë +É +É +Ú +Ú +Ö +Ö +£ +£ +Å +Å +Ä +Ä +Ç +Ç +× +× + + +Á +Á +z +z +y +y +x +x +w +w +v +v +u +u +t +t +s +s +r +r +q +q +p +p +o +o +n +n +m +m +l +l +k +k +j +j +i +i +h +h +g +g +f +f +e +e +d +d +c +c +b +b +a +a +SELECT lower(utf8_f) FROM t1 ORDER BY 1 DESC; +lower(utf8_f) +Ñ +Ñ +ÑŽ +ÑŽ +Ñ +Ñ +ÑŒ +ÑŒ +Ñ‹ +Ñ‹ +ÑŠ +ÑŠ +щ +щ +ш +ш +ч +ч +ц +ц +Ñ… +Ñ… +Ñ„ +Ñ„ +у +у +Ñ‚ +Ñ‚ +Ñ +Ñ +Ñ€ +Ñ€ +п +п +о +о +н +н +м +м +л +л +к +к +и +и +з +з +ж +ж +е +Ñ‘ +е +Ñ‘ +д +д +г +г +в +в +б +б +а +а +z +z +y +y +x +x +w +w +v +v +u +u +t +t +s +s +r +r +q +q +p +p +o +o +n +n +m +m +l +l +k +k +j +j +i +i +h +h +g +g +f +f +e +e +d +d +c +c +b +b +a +a +SELECT t11.comment,t12.comment +FROM t1 t11,t1 t12 WHERE CONVERT(t11.koi8_ru_f USING utf8)=t12.utf8_f +ORDER BY t11.koi8_ru_f; +comment comment +LAT SMALL A LAT SMALL A +LAT SMALL A LAT CAPIT A +LAT CAPIT A LAT SMALL A +LAT CAPIT A LAT CAPIT A +LAT SMALL B LAT CAPIT B +LAT CAPIT B LAT SMALL B +LAT CAPIT B LAT CAPIT B +LAT SMALL B LAT SMALL B +LAT CAPIT C LAT SMALL C +LAT CAPIT C LAT CAPIT C +LAT SMALL C LAT SMALL C +LAT SMALL C LAT CAPIT C +LAT CAPIT D LAT CAPIT D +LAT SMALL D LAT SMALL D +LAT SMALL D LAT CAPIT D +LAT CAPIT D LAT SMALL D +LAT SMALL E LAT SMALL E +LAT SMALL E LAT CAPIT E +LAT CAPIT E LAT SMALL E +LAT CAPIT E LAT CAPIT E +LAT SMALL F LAT SMALL F +LAT SMALL F LAT CAPIT F +LAT CAPIT F LAT SMALL F +LAT CAPIT F LAT CAPIT F +LAT SMALL G LAT CAPIT G +LAT CAPIT G LAT SMALL G +LAT CAPIT G LAT CAPIT G +LAT SMALL G LAT SMALL G +LAT CAPIT H LAT CAPIT H +LAT SMALL H LAT SMALL H +LAT SMALL H LAT CAPIT H +LAT CAPIT H LAT SMALL H +LAT CAPIT I LAT CAPIT I +LAT SMALL I LAT SMALL I +LAT SMALL I LAT CAPIT I +LAT CAPIT I LAT SMALL I +LAT SMALL J LAT SMALL J +LAT SMALL J LAT CAPIT J +LAT CAPIT J LAT SMALL J +LAT CAPIT J LAT CAPIT J +LAT SMALL K LAT CAPIT K +LAT CAPIT K LAT SMALL K +LAT CAPIT K LAT CAPIT K +LAT SMALL K LAT SMALL K +LAT SMALL L LAT CAPIT L +LAT CAPIT L LAT SMALL L +LAT CAPIT L LAT CAPIT L +LAT SMALL L LAT SMALL L +LAT CAPIT M LAT CAPIT M +LAT SMALL M LAT SMALL M +LAT SMALL M LAT CAPIT M +LAT CAPIT M LAT SMALL M +LAT SMALL N LAT SMALL N +LAT SMALL N LAT CAPIT N +LAT CAPIT N LAT SMALL N +LAT CAPIT N LAT CAPIT N +LAT SMALL O LAT SMALL O +LAT SMALL O LAT CAPIT O +LAT CAPIT O LAT SMALL O +LAT CAPIT O LAT CAPIT O +LAT SMALL P LAT CAPIT P +LAT CAPIT P LAT SMALL P +LAT CAPIT P LAT CAPIT P +LAT SMALL P LAT SMALL P +LAT CAPIT Q LAT SMALL Q +LAT CAPIT Q LAT CAPIT Q +LAT SMALL Q LAT SMALL Q +LAT SMALL Q LAT CAPIT Q +LAT CAPIT R LAT CAPIT R +LAT SMALL R LAT SMALL R +LAT SMALL R LAT CAPIT R +LAT CAPIT R LAT SMALL R +LAT SMALL S LAT SMALL S +LAT SMALL S LAT CAPIT S +LAT CAPIT S LAT SMALL S +LAT CAPIT S LAT CAPIT S +LAT SMALL T LAT CAPIT T +LAT CAPIT T LAT SMALL T +LAT CAPIT T LAT CAPIT T +LAT SMALL T LAT SMALL T +LAT SMALL U LAT CAPIT U +LAT CAPIT U LAT SMALL U +LAT CAPIT U LAT CAPIT U +LAT SMALL U LAT SMALL U +LAT CAPIT V LAT CAPIT V +LAT SMALL V LAT SMALL V +LAT SMALL V LAT CAPIT V +LAT CAPIT V LAT SMALL V +LAT CAPIT W LAT CAPIT W +LAT SMALL W LAT SMALL W +LAT SMALL W LAT CAPIT W +LAT CAPIT W LAT SMALL W +LAT SMALL X LAT SMALL X +LAT SMALL X LAT CAPIT X +LAT CAPIT X LAT SMALL X +LAT CAPIT X LAT CAPIT X +LAT SMALL Y LAT CAPIT Y +LAT CAPIT Y LAT SMALL Y +LAT CAPIT Y LAT CAPIT Y +LAT SMALL Y LAT SMALL Y +LAT CAPIT Z LAT SMALL Z +LAT CAPIT Z LAT CAPIT Z +LAT SMALL Z LAT SMALL Z +LAT SMALL Z LAT CAPIT Z +CYR CAPIT A CYR SMALL A +CYR SMALL A CYR CAPIT A +CYR CAPIT A CYR CAPIT A +CYR SMALL A CYR SMALL A +CYR SMALL BE CYR CAPIT BE +CYR CAPIT BE CYR CAPIT BE +CYR SMALL BE CYR SMALL BE +CYR CAPIT BE CYR SMALL BE +CYR CAPIT VE CYR CAPIT VE +CYR SMALL VE CYR SMALL VE +CYR CAPIT VE CYR SMALL VE +CYR SMALL VE CYR CAPIT VE +CYR CAPIT GE CYR CAPIT GE +CYR SMALL GE CYR SMALL GE +CYR CAPIT GE CYR SMALL GE +CYR SMALL GE CYR CAPIT GE +CYR CAPIT DE CYR SMALL DE +CYR SMALL DE CYR CAPIT DE +CYR CAPIT DE CYR CAPIT DE +CYR SMALL DE CYR SMALL DE +CYR SMALL IE CYR SMALL IO +CYR SMALL IE CYR CAPIT IE +CYR CAPIT IE CYR SMALL IE +CYR CAPIT IE CYR CAPIT IO +CYR SMALL IE CYR SMALL IE +CYR SMALL IE CYR CAPIT IO +CYR CAPIT IE CYR SMALL IO +CYR CAPIT IE CYR CAPIT IE +CYR SMALL IO CYR SMALL IE +CYR SMALL IO CYR CAPIT IO +CYR CAPIT IO CYR SMALL IO +CYR CAPIT IO CYR CAPIT IE +CYR SMALL IO CYR SMALL IO +CYR SMALL IO CYR CAPIT IE +CYR CAPIT IO CYR SMALL IE +CYR CAPIT IO CYR CAPIT IO +CYR CAPIT ZHE CYR SMALL ZHE +CYR SMALL ZHE CYR CAPIT ZHE +CYR CAPIT ZHE CYR CAPIT ZHE +CYR SMALL ZHE CYR SMALL ZHE +CYR SMALL ZE CYR CAPIT ZE +CYR CAPIT ZE CYR CAPIT ZE +CYR SMALL ZE CYR SMALL ZE +CYR CAPIT ZE CYR SMALL ZE +CYR CAPIT I CYR CAPIT I +CYR SMALL I CYR SMALL I +CYR CAPIT I CYR SMALL I +CYR SMALL I CYR CAPIT I +CYR CAPIT KA CYR CAPIT KA +CYR SMALL KA CYR SMALL KA +CYR CAPIT KA CYR SMALL KA +CYR SMALL KA CYR CAPIT KA +CYR CAPIT EL CYR SMALL EL +CYR SMALL EL CYR CAPIT EL +CYR CAPIT EL CYR CAPIT EL +CYR SMALL EL CYR SMALL EL +CYR CAPIT EM CYR SMALL EM +CYR SMALL EM CYR CAPIT EM +CYR CAPIT EM CYR CAPIT EM +CYR SMALL EM CYR SMALL EM +CYR SMALL EN CYR CAPIT EN +CYR CAPIT EN CYR CAPIT EN +CYR SMALL EN CYR SMALL EN +CYR CAPIT EN CYR SMALL EN +CYR CAPIT O CYR CAPIT O +CYR SMALL O CYR SMALL O +CYR CAPIT O CYR SMALL O +CYR SMALL O CYR CAPIT O +CYR SMALL PE CYR SMALL PE +CYR CAPIT PE CYR SMALL PE +CYR SMALL PE CYR CAPIT PE +CYR CAPIT PE CYR CAPIT PE +CYR CAPIT ER CYR SMALL ER +CYR SMALL ER CYR CAPIT ER +CYR CAPIT ER CYR CAPIT ER +CYR SMALL ER CYR SMALL ER +CYR SMALL ES CYR CAPIT ES +CYR CAPIT ES CYR CAPIT ES +CYR SMALL ES CYR SMALL ES +CYR CAPIT ES CYR SMALL ES +CYR CAPIT TE CYR CAPIT TE +CYR SMALL TE CYR SMALL TE +CYR CAPIT TE CYR SMALL TE +CYR SMALL TE CYR CAPIT TE +CYR CAPIT U CYR CAPIT U +CYR SMALL U CYR SMALL U +CYR CAPIT U CYR SMALL U +CYR SMALL U CYR CAPIT U +CYR CAPIT EF CYR SMALL EF +CYR SMALL EF CYR CAPIT EF +CYR CAPIT EF CYR CAPIT EF +CYR SMALL EF CYR SMALL EF +CYR CAPIT HA CYR SMALL HA +CYR SMALL HA CYR CAPIT HA +CYR CAPIT HA CYR CAPIT HA +CYR SMALL HA CYR SMALL HA +CYR SMALL TSE CYR CAPIT TSE +CYR CAPIT TSE CYR CAPIT TSE +CYR SMALL TSE CYR SMALL TSE +CYR CAPIT TSE CYR SMALL TSE +CYR CAPIT CHE CYR CAPIT CHE +CYR SMALL CHE CYR SMALL CHE +CYR CAPIT CHE CYR SMALL CHE +CYR SMALL CHE CYR CAPIT CHE +CYR CAPIT SHA CYR CAPIT SHA +CYR SMALL SHA CYR SMALL SHA +CYR CAPIT SHA CYR SMALL SHA +CYR SMALL SHA CYR CAPIT SHA +CYR CAPIT SCHA CYR SMALL SCHA +CYR SMALL SCHA CYR CAPIT SCHA +CYR CAPIT SCHA CYR CAPIT SCHA +CYR SMALL SCHA CYR SMALL SCHA +CYR CAPIT HARD SIGN CYR SMALL HARD SIGN +CYR SMALL HARD SIGN CYR CAPIT HARD SIGN +CYR CAPIT HARD SIGN CYR CAPIT HARD SIGN +CYR SMALL HARD SIGN CYR SMALL HARD SIGN +CYR CAPIT YERU CYR CAPIT YERU +CYR SMALL YERU CYR SMALL YERU +CYR CAPIT YERU CYR SMALL YERU +CYR SMALL YERU CYR CAPIT YERU +CYR CAPIT SOFT SIGN CYR CAPIT SOFT SIGN +CYR SMALL SOFT SIGN CYR SMALL SOFT SIGN +CYR CAPIT SOFT SIGN CYR SMALL SOFT SIGN +CYR SMALL SOFT SIGN CYR CAPIT SOFT SIGN +CYR CAPIT E CYR SMALL E +CYR SMALL E CYR CAPIT E +CYR CAPIT E CYR CAPIT E +CYR SMALL E CYR SMALL E +CYR CAPIT YU CYR SMALL YU +CYR SMALL YU CYR CAPIT YU +CYR CAPIT YU CYR CAPIT YU +CYR SMALL YU CYR SMALL YU +CYR SMALL YA CYR CAPIT YA +CYR CAPIT YA CYR CAPIT YA +CYR SMALL YA CYR SMALL YA +CYR CAPIT YA CYR SMALL YA +SELECT t11.comment,t12.comment +FROM t1 t11,t1 t12 +WHERE t11.koi8_ru_f=CONVERT(t12.utf8_f USING koi8_ru) +ORDER BY t12.utf8_f; +comment comment +LAT SMALL A LAT SMALL A +LAT SMALL A LAT CAPIT A +LAT CAPIT A LAT SMALL A +LAT CAPIT A LAT CAPIT A +LAT SMALL B LAT CAPIT B +LAT CAPIT B LAT SMALL B +LAT CAPIT B LAT CAPIT B +LAT SMALL B LAT SMALL B +LAT CAPIT C LAT SMALL C +LAT CAPIT C LAT CAPIT C +LAT SMALL C LAT SMALL C +LAT SMALL C LAT CAPIT C +LAT CAPIT D LAT CAPIT D +LAT SMALL D LAT SMALL D +LAT SMALL D LAT CAPIT D +LAT CAPIT D LAT SMALL D +LAT SMALL E LAT SMALL E +LAT SMALL E LAT CAPIT E +LAT CAPIT E LAT SMALL E +LAT CAPIT E LAT CAPIT E +LAT SMALL F LAT SMALL F +LAT SMALL F LAT CAPIT F +LAT CAPIT F LAT SMALL F +LAT CAPIT F LAT CAPIT F +LAT SMALL G LAT CAPIT G +LAT CAPIT G LAT SMALL G +LAT CAPIT G LAT CAPIT G +LAT SMALL G LAT SMALL G +LAT CAPIT H LAT CAPIT H +LAT SMALL H LAT SMALL H +LAT SMALL H LAT CAPIT H +LAT CAPIT H LAT SMALL H +LAT CAPIT I LAT CAPIT I +LAT SMALL I LAT SMALL I +LAT SMALL I LAT CAPIT I +LAT CAPIT I LAT SMALL I +LAT SMALL J LAT SMALL J +LAT SMALL J LAT CAPIT J +LAT CAPIT J LAT SMALL J +LAT CAPIT J LAT CAPIT J +LAT SMALL K LAT CAPIT K +LAT CAPIT K LAT SMALL K +LAT CAPIT K LAT CAPIT K +LAT SMALL K LAT SMALL K +LAT SMALL L LAT CAPIT L +LAT CAPIT L LAT SMALL L +LAT CAPIT L LAT CAPIT L +LAT SMALL L LAT SMALL L +LAT CAPIT M LAT CAPIT M +LAT SMALL M LAT SMALL M +LAT SMALL M LAT CAPIT M +LAT CAPIT M LAT SMALL M +LAT SMALL N LAT SMALL N +LAT SMALL N LAT CAPIT N +LAT CAPIT N LAT SMALL N +LAT CAPIT N LAT CAPIT N +LAT SMALL O LAT SMALL O +LAT SMALL O LAT CAPIT O +LAT CAPIT O LAT SMALL O +LAT CAPIT O LAT CAPIT O +LAT SMALL P LAT CAPIT P +LAT CAPIT P LAT SMALL P +LAT CAPIT P LAT CAPIT P +LAT SMALL P LAT SMALL P +LAT CAPIT Q LAT SMALL Q +LAT CAPIT Q LAT CAPIT Q +LAT SMALL Q LAT SMALL Q +LAT SMALL Q LAT CAPIT Q +LAT CAPIT R LAT CAPIT R +LAT SMALL R LAT SMALL R +LAT SMALL R LAT CAPIT R +LAT CAPIT R LAT SMALL R +LAT SMALL S LAT SMALL S +LAT SMALL S LAT CAPIT S +LAT CAPIT S LAT SMALL S +LAT CAPIT S LAT CAPIT S +LAT SMALL T LAT CAPIT T +LAT CAPIT T LAT SMALL T +LAT CAPIT T LAT CAPIT T +LAT SMALL T LAT SMALL T +LAT SMALL U LAT CAPIT U +LAT CAPIT U LAT SMALL U +LAT CAPIT U LAT CAPIT U +LAT SMALL U LAT SMALL U +LAT CAPIT V LAT CAPIT V +LAT SMALL V LAT SMALL V +LAT SMALL V LAT CAPIT V +LAT CAPIT V LAT SMALL V +LAT CAPIT W LAT CAPIT W +LAT SMALL W LAT SMALL W +LAT SMALL W LAT CAPIT W +LAT CAPIT W LAT SMALL W +LAT SMALL X LAT SMALL X +LAT SMALL X LAT CAPIT X +LAT CAPIT X LAT SMALL X +LAT CAPIT X LAT CAPIT X +LAT SMALL Y LAT CAPIT Y +LAT CAPIT Y LAT SMALL Y +LAT CAPIT Y LAT CAPIT Y +LAT SMALL Y LAT SMALL Y +LAT CAPIT Z LAT SMALL Z +LAT CAPIT Z LAT CAPIT Z +LAT SMALL Z LAT SMALL Z +LAT SMALL Z LAT CAPIT Z +CYR CAPIT A CYR SMALL A +CYR CAPIT A CYR CAPIT A +CYR SMALL A CYR SMALL A +CYR SMALL A CYR CAPIT A +CYR SMALL BE CYR SMALL BE +CYR SMALL BE CYR CAPIT BE +CYR CAPIT BE CYR SMALL BE +CYR CAPIT BE CYR CAPIT BE +CYR SMALL VE CYR SMALL VE +CYR SMALL VE CYR CAPIT VE +CYR CAPIT VE CYR SMALL VE +CYR CAPIT VE CYR CAPIT VE +CYR SMALL GE CYR SMALL GE +CYR SMALL GE CYR CAPIT GE +CYR CAPIT GE CYR SMALL GE +CYR CAPIT GE CYR CAPIT GE +CYR CAPIT DE CYR SMALL DE +CYR CAPIT DE CYR CAPIT DE +CYR SMALL DE CYR SMALL DE +CYR SMALL DE CYR CAPIT DE +CYR CAPIT IE CYR SMALL IE +CYR CAPIT IE CYR CAPIT IE +CYR SMALL IO CYR SMALL IO +CYR SMALL IO CYR CAPIT IO +CYR SMALL IE CYR SMALL IE +CYR SMALL IE CYR CAPIT IE +CYR CAPIT IO CYR SMALL IO +CYR CAPIT IO CYR CAPIT IO +CYR SMALL ZHE CYR SMALL ZHE +CYR SMALL ZHE CYR CAPIT ZHE +CYR CAPIT ZHE CYR SMALL ZHE +CYR CAPIT ZHE CYR CAPIT ZHE +CYR CAPIT ZE CYR SMALL ZE +CYR CAPIT ZE CYR CAPIT ZE +CYR SMALL ZE CYR SMALL ZE +CYR SMALL ZE CYR CAPIT ZE +CYR CAPIT I CYR SMALL I +CYR CAPIT I CYR CAPIT I +CYR SMALL I CYR SMALL I +CYR SMALL I CYR CAPIT I +CYR SMALL KA CYR SMALL KA +CYR SMALL KA CYR CAPIT KA +CYR CAPIT KA CYR SMALL KA +CYR CAPIT KA CYR CAPIT KA +CYR SMALL EL CYR SMALL EL +CYR SMALL EL CYR CAPIT EL +CYR CAPIT EL CYR SMALL EL +CYR CAPIT EL CYR CAPIT EL +CYR SMALL EM CYR SMALL EM +CYR SMALL EM CYR CAPIT EM +CYR CAPIT EM CYR SMALL EM +CYR CAPIT EM CYR CAPIT EM +CYR CAPIT EN CYR SMALL EN +CYR CAPIT EN CYR CAPIT EN +CYR SMALL EN CYR SMALL EN +CYR SMALL EN CYR CAPIT EN +CYR CAPIT O CYR SMALL O +CYR CAPIT O CYR CAPIT O +CYR SMALL O CYR SMALL O +CYR SMALL O CYR CAPIT O +CYR SMALL PE CYR SMALL PE +CYR SMALL PE CYR CAPIT PE +CYR CAPIT PE CYR SMALL PE +CYR CAPIT PE CYR CAPIT PE +CYR SMALL ER CYR SMALL ER +CYR SMALL ER CYR CAPIT ER +CYR CAPIT ER CYR SMALL ER +CYR CAPIT ER CYR CAPIT ER +CYR SMALL ES CYR SMALL ES +CYR SMALL ES CYR CAPIT ES +CYR CAPIT ES CYR SMALL ES +CYR CAPIT ES CYR CAPIT ES +CYR CAPIT TE CYR SMALL TE +CYR CAPIT TE CYR CAPIT TE +CYR SMALL TE CYR SMALL TE +CYR SMALL TE CYR CAPIT TE +CYR SMALL U CYR SMALL U +CYR SMALL U CYR CAPIT U +CYR CAPIT U CYR SMALL U +CYR CAPIT U CYR CAPIT U +CYR SMALL EF CYR SMALL EF +CYR SMALL EF CYR CAPIT EF +CYR CAPIT EF CYR SMALL EF +CYR CAPIT EF CYR CAPIT EF +CYR SMALL HA CYR SMALL HA +CYR SMALL HA CYR CAPIT HA +CYR CAPIT HA CYR SMALL HA +CYR CAPIT HA CYR CAPIT HA +CYR CAPIT TSE CYR SMALL TSE +CYR CAPIT TSE CYR CAPIT TSE +CYR SMALL TSE CYR SMALL TSE +CYR SMALL TSE CYR CAPIT TSE +CYR CAPIT CHE CYR SMALL CHE +CYR CAPIT CHE CYR CAPIT CHE +CYR SMALL CHE CYR SMALL CHE +CYR SMALL CHE CYR CAPIT CHE +CYR SMALL SHA CYR SMALL SHA +CYR SMALL SHA CYR CAPIT SHA +CYR CAPIT SHA CYR SMALL SHA +CYR CAPIT SHA CYR CAPIT SHA +CYR SMALL SCHA CYR SMALL SCHA +CYR SMALL SCHA CYR CAPIT SCHA +CYR CAPIT SCHA CYR SMALL SCHA +CYR CAPIT SCHA CYR CAPIT SCHA +CYR SMALL HARD SIGN CYR SMALL HARD SIGN +CYR SMALL HARD SIGN CYR CAPIT HARD SIGN +CYR CAPIT HARD SIGN CYR SMALL HARD SIGN +CYR CAPIT HARD SIGN CYR CAPIT HARD SIGN +CYR CAPIT YERU CYR SMALL YERU +CYR CAPIT YERU CYR CAPIT YERU +CYR SMALL YERU CYR SMALL YERU +CYR SMALL YERU CYR CAPIT YERU +CYR CAPIT SOFT SIGN CYR SMALL SOFT SIGN +CYR CAPIT SOFT SIGN CYR CAPIT SOFT SIGN +CYR SMALL SOFT SIGN CYR SMALL SOFT SIGN +CYR SMALL SOFT SIGN CYR CAPIT SOFT SIGN +CYR SMALL E CYR SMALL E +CYR SMALL E CYR CAPIT E +CYR CAPIT E CYR SMALL E +CYR CAPIT E CYR CAPIT E +CYR SMALL YU CYR SMALL YU +CYR SMALL YU CYR CAPIT YU +CYR CAPIT YU CYR SMALL YU +CYR CAPIT YU CYR CAPIT YU +CYR CAPIT YA CYR SMALL YA +CYR CAPIT YA CYR CAPIT YA +CYR SMALL YA CYR SMALL YA +CYR SMALL YA CYR CAPIT YA +ALTER TABLE t1 ADD ucs2_f CHAR(32) CHARACTER SET ucs2 NOT NULL; +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0391,'GREEK CAPIT ALPHA'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0392,'GREEK CAPIT BETA'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0393,'GREEK CAPIT GAMMA'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0394,'GREEK CAPIT DELTA'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0395,'GREEK CAPIT EPSILON'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x03B1,'GREEK SMALL ALPHA'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x03B2,'GREEK SMALL BETA'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x03B3,'GREEK SMALL GAMMA'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x03B4,'GREEK SMALL DELTA'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x03B5,'GREEK SMALL EPSILON'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0531,'ARMENIAN CAPIT AYB'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0532,'ARMENIAN CAPIT BEN'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0533,'ARMENIAN CAPIT GIM'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0534,'ARMENIAN CAPIT DA'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0535,'ARMENIAN CAPIT ECH'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0536,'ARMENIAN CAPIT ZA'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0561,'ARMENIAN SMALL YAB'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0562,'ARMENIAN SMALL BEN'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0563,'ARMENIAN SMALL GIM'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0564,'ARMENIAN SMALL DA'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0565,'ARMENIAN SMALL ECH'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0566,'ARMENIAN SMALL ZA'); +ALTER TABLE t1 ADD armscii8_f CHAR(32) CHARACTER SET armscii8 NOT NULL; +ALTER TABLE t1 ADD greek_f CHAR(32) CHARACTER SET greek NOT NULL; +UPDATE t1 SET greek_f=CONVERT(ucs2_f USING greek) WHERE comment LIKE 'GRE%'; +UPDATE t1 SET armscii8_f=CONVERT(ucs2_f USING armscii8) WHERE comment LIKE 'ARM%'; +UPDATE t1 SET utf8_f=CONVERT(ucs2_f USING utf8) WHERE utf8_f=''; +UPDATE t1 SET ucs2_f=CONVERT(utf8_f USING ucs2) WHERE ucs2_f=''; +SELECT min(comment),count(*) FROM t1 GROUP BY ucs2_f; +min(comment) count(*) +LAT CAPIT A 2 +LAT CAPIT B 2 +LAT CAPIT C 2 +LAT CAPIT D 2 +LAT CAPIT E 2 +LAT CAPIT F 2 +LAT CAPIT G 2 +LAT CAPIT H 2 +LAT CAPIT I 2 +LAT CAPIT J 2 +LAT CAPIT K 2 +LAT CAPIT L 2 +LAT CAPIT M 2 +LAT CAPIT N 2 +LAT CAPIT O 2 +LAT CAPIT P 2 +LAT CAPIT Q 2 +LAT CAPIT R 2 +LAT CAPIT S 2 +LAT CAPIT T 2 +LAT CAPIT U 2 +LAT CAPIT V 2 +LAT CAPIT W 2 +LAT CAPIT X 2 +LAT CAPIT Y 2 +LAT CAPIT Z 2 +GREEK CAPIT ALPHA 2 +GREEK CAPIT BETA 2 +GREEK CAPIT GAMMA 2 +GREEK CAPIT DELTA 2 +GREEK CAPIT EPSILON 2 +CYR CAPIT A 2 +CYR CAPIT BE 2 +CYR CAPIT VE 2 +CYR CAPIT GE 2 +CYR CAPIT DE 2 +CYR CAPIT IE 4 +CYR CAPIT ZHE 2 +CYR CAPIT ZE 2 +CYR CAPIT I 2 +CYR CAPIT KA 2 +CYR CAPIT EL 2 +CYR CAPIT EM 2 +CYR CAPIT EN 2 +CYR CAPIT O 2 +CYR CAPIT PE 2 +CYR CAPIT ER 2 +CYR CAPIT ES 2 +CYR CAPIT TE 2 +CYR CAPIT U 2 +CYR CAPIT EF 2 +CYR CAPIT HA 2 +CYR CAPIT TSE 2 +CYR CAPIT CHE 2 +CYR CAPIT SHA 2 +CYR CAPIT SCHA 2 +CYR CAPIT HARD SIGN 2 +CYR CAPIT YERU 2 +CYR CAPIT SOFT SIGN 2 +CYR CAPIT E 2 +CYR CAPIT YU 2 +CYR CAPIT YA 2 +ARMENIAN CAPIT AYB 2 +ARMENIAN CAPIT BEN 2 +ARMENIAN CAPIT GIM 2 +ARMENIAN CAPIT DA 2 +ARMENIAN CAPIT ECH 2 +ARMENIAN CAPIT ZA 2 +DROP TABLE t1; diff --git a/mysql-test/t/ctype_many.test b/mysql-test/t/ctype_many.test new file mode 100644 index 00000000000..7db8f49919b --- /dev/null +++ b/mysql-test/t/ctype_many.test @@ -0,0 +1,189 @@ +DROP TABLE IF EXISTS t1; + +CREATE TABLE t1 ( + comment CHAR(32) CHARACTER SET latin1 NOT NULL, + koi8_ru_f CHAR(32) CHARACTER SET koi8_ru NOT NULL +) CHARSET=latin5; + +SHOW CREATE TABLE t1; +ALTER TABLE t1 CHANGE comment comment CHAR(32) CHARACTER SET latin2 NOT NULL; +SHOW CREATE TABLE t1; +ALTER TABLE t1 ADD latin5_f CHAR(32) NOT NULL; +SHOW CREATE TABLE t1; +ALTER TABLE t1 CHARSET=latin2; +ALTER TABLE t1 ADD latin2_f CHAR(32) NOT NULL; +SHOW CREATE TABLE t1; +ALTER TABLE t1 DROP latin2_f, DROP latin5_f; +SHOW CREATE TABLE t1; + +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('a','LAT SMALL A'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('b','LAT SMALL B'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('c','LAT SMALL C'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('d','LAT SMALL D'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('e','LAT SMALL E'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('f','LAT SMALL F'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('g','LAT SMALL G'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('h','LAT SMALL H'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('i','LAT SMALL I'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('j','LAT SMALL J'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('k','LAT SMALL K'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('l','LAT SMALL L'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('m','LAT SMALL M'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('n','LAT SMALL N'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('o','LAT SMALL O'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('p','LAT SMALL P'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('q','LAT SMALL Q'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('r','LAT SMALL R'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('s','LAT SMALL S'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('t','LAT SMALL T'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('u','LAT SMALL U'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('v','LAT SMALL V'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('w','LAT SMALL W'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('x','LAT SMALL X'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('y','LAT SMALL Y'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('z','LAT SMALL Z'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('A','LAT CAPIT A'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('B','LAT CAPIT B'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('C','LAT CAPIT C'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('D','LAT CAPIT D'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('E','LAT CAPIT E'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('F','LAT CAPIT F'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('G','LAT CAPIT G'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('H','LAT CAPIT H'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('I','LAT CAPIT I'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('J','LAT CAPIT J'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('K','LAT CAPIT K'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('L','LAT CAPIT L'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('M','LAT CAPIT M'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('N','LAT CAPIT N'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('O','LAT CAPIT O'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('P','LAT CAPIT P'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Q','LAT CAPIT Q'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('R','LAT CAPIT R'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('S','LAT CAPIT S'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('T','LAT CAPIT T'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('U','LAT CAPIT U'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('V','LAT CAPIT V'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('W','LAT CAPIT W'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('X','LAT CAPIT X'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Y','LAT CAPIT Y'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Z','LAT CAPIT Z'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Á','CYR SMALL A'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Â','CYR SMALL BE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('×','CYR SMALL VE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ç','CYR SMALL GE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ä','CYR SMALL DE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Å','CYR SMALL IE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('£','CYR SMALL IO'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ö','CYR SMALL ZHE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ú','CYR SMALL ZE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('É','CYR SMALL I'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ë','CYR SMALL KA'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ì','CYR SMALL EL'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Í','CYR SMALL EM'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Î','CYR SMALL EN'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ï','CYR SMALL O'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ð','CYR SMALL PE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ò','CYR SMALL ER'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ó','CYR SMALL ES'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ô','CYR SMALL TE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Õ','CYR SMALL U'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Æ','CYR SMALL EF'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('È','CYR SMALL HA'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ã','CYR SMALL TSE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Þ','CYR SMALL CHE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Û','CYR SMALL SHA'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ý','CYR SMALL SCHA'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ß','CYR SMALL HARD SIGN'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ù','CYR SMALL YERU'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ø','CYR SMALL SOFT SIGN'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ü','CYR SMALL E'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('À','CYR SMALL YU'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('Ñ','CYR SMALL YA'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('á','CYR CAPIT A'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('â','CYR CAPIT BE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('÷','CYR CAPIT VE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ç','CYR CAPIT GE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ä','CYR CAPIT DE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('å','CYR CAPIT IE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('³','CYR CAPIT IO'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ö','CYR CAPIT ZHE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ú','CYR CAPIT ZE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('é','CYR CAPIT I'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ë','CYR CAPIT KA'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ì','CYR CAPIT EL'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('í','CYR CAPIT EM'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('î','CYR CAPIT EN'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ï','CYR CAPIT O'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ð','CYR CAPIT PE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ò','CYR CAPIT ER'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ó','CYR CAPIT ES'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ô','CYR CAPIT TE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('õ','CYR CAPIT U'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('æ','CYR CAPIT EF'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('è','CYR CAPIT HA'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ã','CYR CAPIT TSE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('þ','CYR CAPIT CHE'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('û','CYR CAPIT SHA'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ý','CYR CAPIT SCHA'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ÿ','CYR CAPIT HARD SIGN'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ù','CYR CAPIT YERU'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ø','CYR CAPIT SOFT SIGN'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ü','CYR CAPIT E'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('à','CYR CAPIT YU'); +INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ñ','CYR CAPIT YA'); + +ALTER TABLE t1 ADD utf8_f CHAR(32) CHARACTER SET utf8 NOT NULL; +UPDATE t1 SET utf8_f=CONVERT(koi8_ru_f USING utf8); + +SELECT * FROM t1; + +SELECT koi8_ru_f,MIN(comment) FROM t1 GROUP BY 1; +SELECT utf8_f,MIN(comment) FROM t1 GROUP BY 1; +SELECT DISTINCT koi8_ru_f FROM t1; +SELECT DISTINCT utf8_f FROM t1; +SELECT lower(koi8_ru_f) FROM t1 ORDER BY 1 DESC; +SELECT lower(utf8_f) FROM t1 ORDER BY 1 DESC; + +SELECT t11.comment,t12.comment +FROM t1 t11,t1 t12 WHERE CONVERT(t11.koi8_ru_f USING utf8)=t12.utf8_f +ORDER BY t11.koi8_ru_f; + +SELECT t11.comment,t12.comment +FROM t1 t11,t1 t12 +WHERE t11.koi8_ru_f=CONVERT(t12.utf8_f USING koi8_ru) +ORDER BY t12.utf8_f; + +ALTER TABLE t1 ADD ucs2_f CHAR(32) CHARACTER SET ucs2 NOT NULL; + +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0391,'GREEK CAPIT ALPHA'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0392,'GREEK CAPIT BETA'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0393,'GREEK CAPIT GAMMA'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0394,'GREEK CAPIT DELTA'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0395,'GREEK CAPIT EPSILON'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x03B1,'GREEK SMALL ALPHA'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x03B2,'GREEK SMALL BETA'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x03B3,'GREEK SMALL GAMMA'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x03B4,'GREEK SMALL DELTA'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x03B5,'GREEK SMALL EPSILON'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0531,'ARMENIAN CAPIT AYB'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0532,'ARMENIAN CAPIT BEN'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0533,'ARMENIAN CAPIT GIM'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0534,'ARMENIAN CAPIT DA'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0535,'ARMENIAN CAPIT ECH'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0536,'ARMENIAN CAPIT ZA'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0561,'ARMENIAN SMALL YAB'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0562,'ARMENIAN SMALL BEN'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0563,'ARMENIAN SMALL GIM'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0564,'ARMENIAN SMALL DA'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0565,'ARMENIAN SMALL ECH'); +INSERT INTO t1 (ucs2_f,comment) VALUES (0x0566,'ARMENIAN SMALL ZA'); + +ALTER TABLE t1 ADD armscii8_f CHAR(32) CHARACTER SET armscii8 NOT NULL; +ALTER TABLE t1 ADD greek_f CHAR(32) CHARACTER SET greek NOT NULL; +UPDATE t1 SET greek_f=CONVERT(ucs2_f USING greek) WHERE comment LIKE 'GRE%'; +UPDATE t1 SET armscii8_f=CONVERT(ucs2_f USING armscii8) WHERE comment LIKE 'ARM%'; +UPDATE t1 SET utf8_f=CONVERT(ucs2_f USING utf8) WHERE utf8_f=''; +UPDATE t1 SET ucs2_f=CONVERT(utf8_f USING ucs2) WHERE ucs2_f=''; +SELECT min(comment),count(*) FROM t1 GROUP BY ucs2_f; +DROP TABLE t1; -- cgit v1.2.1 From e5b5f45319a9fe1c90710e49faecc6a33eeac486 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 1 Jul 2002 14:14:51 +0300 Subject: subselect in having clause fixed bug in sum function in subselect mysql-test/r/subselect.result: subselect in having clause mysql-test/t/subselect.test: subselect in having clause sql/item.cc: subselect in having clause sql/item.h: subselect in having clause sql/item_cmpfunc.cc: subselect in having clause sql/item_cmpfunc.h: subselect in having clause sql/item_func.cc: subselect in having clause sql/item_func.h: subselect in having clause sql/item_strfunc.h: subselect in having clause sql/item_subselect.cc: subselect in having clause sql/item_subselect.h: subselect in having clause sql/item_uniq.h: subselect in having clause sql/sql_base.cc: subselect in having clause sql/sql_class.cc: subselect in having clause sql/sql_class.h: subselect in having clause sql/sql_handler.cc: subselect in having clause sql/sql_lex.cc: subselect in having clause sql/sql_lex.h: subselect in having clause sql/sql_prepare.cc: subselect in having clause sql/sql_yacc.yy: subselect in having clause --- mysql-test/r/subselect.result | 12 +++++++-- mysql-test/t/subselect.test | 5 ++++ sql/item.cc | 62 ++++++++++++++++++++++++++++++++++++++----- sql/item.h | 11 +++++--- sql/item_cmpfunc.cc | 21 ++++++++------- sql/item_cmpfunc.h | 18 +++++++------ sql/item_func.cc | 19 ++++++------- sql/item_func.h | 19 ++++++------- sql/item_strfunc.h | 16 ++++++----- sql/item_subselect.cc | 9 +------ sql/item_subselect.h | 2 +- sql/item_sum.cc | 13 ++++----- sql/item_sum.h | 8 +++--- sql/item_uniq.h | 2 +- sql/sql_base.cc | 6 ++--- sql/sql_class.cc | 2 +- sql/sql_class.h | 1 - sql/sql_handler.cc | 2 +- sql/sql_lex.cc | 4 +-- sql/sql_lex.h | 5 +++- sql/sql_prepare.cc | 4 +-- sql/sql_select.cc | 28 ++++++++++++------- sql/sql_yacc.yy | 7 ++--- 23 files changed, 177 insertions(+), 99 deletions(-) diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index 37a66993ef2..bd92c496f29 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -65,8 +65,8 @@ a select b,(select avg(t2.a+(select min(t3.a) from t3 where t3.a >= t4.a)) from t2) from t4; b (select avg(t2.a+(select min(t3.a) from t3 where t3.a >= t4.a)) from t2) 8 7.5000 -8 6.0000 -9 5.5000 +8 4.5000 +9 7.5000 select * from t3 where exists (select * from t2 where t2.b=t3.a); a 7 @@ -74,4 +74,12 @@ select * from t3 where not exists (select * from t2 where t2.b=t3.a); a 6 3 +insert into t4 values (12,7),(1,7),(10,9),(9,6),(7,6),(3,9); +select b,max(a) as ma from t4 group by b having b < (select max(t2.a) +from t2 where t2.b=t4.b); +b ma +select b,max(a) as ma from t4 group by b having b >= (select max(t2.a) +from t2 where t2.b=t4.b); +b ma +7 12 drop table t1,t2,t3,t4; diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 78300dc3e09..7b1ebdcbc27 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -28,4 +28,9 @@ select * from t1 where t1.a=(select t2.a from t2 where t2.b=(select max(a) from select b,(select avg(t2.a+(select min(t3.a) from t3 where t3.a >= t4.a)) from t2) from t4; select * from t3 where exists (select * from t2 where t2.b=t3.a); select * from t3 where not exists (select * from t2 where t2.b=t3.a); +insert into t4 values (12,7),(1,7),(10,9),(9,6),(7,6),(3,9); +select b,max(a) as ma from t4 group by b having b < (select max(t2.a) +from t2 where t2.b=t4.b); +select b,max(a) as ma from t4 group by b having b >= (select max(t2.a) +from t2 where t2.b=t4.b); drop table t1,t2,t3,t4; diff --git a/sql/item.cc b/sql/item.cc index 415fe4d72af..81c5168b72d 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -446,12 +446,13 @@ String *Item_copy_string::val_str(String *str) /* ARGSUSED */ bool Item::fix_fields(THD *thd, - struct st_table_list *list) + struct st_table_list *list, + Item ** ref) { return 0; } -bool Item_field::fix_fields(THD *thd,TABLE_LIST *tables) +bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) { if (!field) // If field is not checked { @@ -467,7 +468,7 @@ bool Item_field::fix_fields(THD *thd,TABLE_LIST *tables) mention of table name, but if we join tables in one list it will cause error ER_NON_UNIQ_ERROR in find_field_in_tables. */ - SELECT_LEX *last; + SELECT_LEX *last= 0; for (SELECT_LEX *sl= thd->lex.select->outer_select(); sl && !tmp; sl= sl->outer_select()) @@ -476,6 +477,8 @@ bool Item_field::fix_fields(THD *thd,TABLE_LIST *tables) if (!tmp) return 1; else + { + depended_from= last; /* Mark all selects from resolved to 1 before select where was found table as depended (of select where was found table) @@ -493,6 +496,7 @@ bool Item_field::fix_fields(THD *thd,TABLE_LIST *tables) tbl= tbl->next) tbl->shared= 1; } + } } set_field(tmp); } @@ -504,6 +508,14 @@ bool Item_field::fix_fields(THD *thd,TABLE_LIST *tables) table->used_fields++; table->used_keys&=field->part_of_key; } + if (depended_from != 0 && depended_from->having_fix_field) + { + *ref= new Item_ref((char *)db_name, (char *)table_name, + (char *)field_name); + if (!*ref) + return 1; + return (*ref)->fix_fields(thd, tables, ref); + } return 0; } @@ -787,12 +799,50 @@ bool Item_null::send(THD *thd, String *packet) Find field in select list having the same name */ -bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables) +bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference) { if (!ref) { - if (!(ref=find_item_in_list(this,thd->lex.select->item_list))) - return 1; + if (!(ref= find_item_in_list(this,thd->lex.select->item_list))) + { + /* + We can't find table field in table list of current select, + consequently we have to find it in outer subselect(s). + We can't join lists of outer & current select, because of scope + of view rules. For example if both tables (outer & current) have + field 'field' it is not mistake to refer to this field without + mention of table name, but if we join tables in one list it will + cause error ER_NON_UNIQ_ERROR in find_field_in_tables. + */ + SELECT_LEX *last=0; + for (SELECT_LEX *sl= thd->lex.select->outer_select(); + sl && !ref; + sl= sl->outer_select()) + ref= find_item_in_list(this, (last= sl)->item_list); + if (!ref) + return 1; + else + { + depended_from= last; + /* + Mark all selects from resolved to 1 before select where was + found table as depended (of select where was found table) + */ + for (SELECT_LEX *s= thd->lex.select; + s &&s != last; + s= s->outer_select()) + if( !s->depended ) + { + s->depended= 1; //Select is depended of outer select + //Tables will be reopened many times + for (TABLE_LIST *tbl= + (TABLE_LIST*)s->table_list.first; + tbl; + tbl= tbl->next) + tbl->shared= 1; + } + } + } max_length= (*ref)->max_length; maybe_null= (*ref)->maybe_null; decimals= (*ref)->decimals; diff --git a/sql/item.h b/sql/item.h index e6debdf2afc..187e3903b84 100644 --- a/sql/item.h +++ b/sql/item.h @@ -52,7 +52,7 @@ public: virtual ~Item() { name=0; } /*lint -e1509 */ void set_name(char* str,uint length=0); void init_make_field(Send_field *tmp_field,enum enum_field_types type); - virtual bool fix_fields(THD *,struct st_table_list *); + virtual bool fix_fields(THD *, struct st_table_list *, Item **); virtual bool save_in_field(Field *field); virtual void save_org_in_field(Field *field) { (void) save_in_field(field); } @@ -85,15 +85,18 @@ public: }; +class st_select_lex; class Item_ident :public Item { public: const char *db_name; const char *table_name; const char *field_name; + st_select_lex *depended_from; Item_ident(const char *db_name_par,const char *table_name_par, const char *field_name_par) - :db_name(db_name_par),table_name(table_name_par),field_name(field_name_par) + :db_name(db_name_par),table_name(table_name_par), + field_name(field_name_par), depended_from(0) { name = (char*) field_name_par; } const char *full_name() const; }; @@ -120,7 +123,7 @@ public: String *str_result(String* tmp); bool send(THD *thd, String *str_arg) { return result_field->send(thd,str_arg); } void make_field(Send_field *field); - bool fix_fields(THD *,struct st_table_list *); + bool fix_fields(THD *, struct st_table_list *, Item **); bool save_in_field(Field *field); void save_org_in_field(Field *field); table_map used_tables() const; @@ -390,7 +393,7 @@ public: } bool send(THD *thd, String *tmp) { return (*ref)->send(thd, tmp); } void make_field(Send_field *field) { (*ref)->make_field(field); } - bool fix_fields(THD *,struct st_table_list *); + bool fix_fields(THD *, struct st_table_list *, Item **); bool save_in_field(Field *field) { return (*ref)->save_in_field(field); } void save_org_in_field(Field *field) { (*ref)->save_org_in_field(field); } enum Item_result result_type () const { return (*ref)->result_type(); } diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 8433ae5bfba..0fc9a1f0e4c 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -727,12 +727,12 @@ double Item_func_case::val() bool -Item_func_case::fix_fields(THD *thd,TABLE_LIST *tables) +Item_func_case::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) { - if (first_expr && first_expr->fix_fields(thd,tables) || - else_expr && else_expr->fix_fields(thd,tables)) + if (first_expr && first_expr->fix_fields(thd, tables, &first_expr) || + else_expr && else_expr->fix_fields(thd, tables, &else_expr)) return 1; - if (Item_func::fix_fields(thd,tables)) + if (Item_func::fix_fields(thd, tables, ref)) return 1; if (first_expr) { @@ -1074,7 +1074,7 @@ longlong Item_func_bit_and::val_int() bool -Item_cond::fix_fields(THD *thd,TABLE_LIST *tables) +Item_cond::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) { List_iterator li(list); Item *item; @@ -1096,7 +1096,7 @@ Item_cond::fix_fields(THD *thd,TABLE_LIST *tables) #endif item= *li.ref(); // new current item } - if (item->fix_fields(thd,tables)) + if (item->fix_fields(thd, tables, li.ref())) return 1; /* purecov: inspected */ used_tables_cache|=item->used_tables(); with_sum_func= with_sum_func || item->with_sum_func; @@ -1272,9 +1272,9 @@ Item_func::optimize_type Item_func_like::select_optimize() const return OPTIMIZE_NONE; } -bool Item_func_like::fix_fields(THD *thd,struct st_table_list *tlist) +bool Item_func_like::fix_fields(THD *thd, TABLE_LIST *tlist, Item ** ref) { - if (Item_bool_func2::fix_fields(thd, tlist)) + if (Item_bool_func2::fix_fields(thd, tlist, ref)) return 1; /* @@ -1324,9 +1324,10 @@ bool Item_func_like::fix_fields(THD *thd,struct st_table_list *tlist) #ifdef USE_REGEX bool -Item_func_regex::fix_fields(THD *thd,TABLE_LIST *tables) +Item_func_regex::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) { - if (args[0]->fix_fields(thd,tables) || args[1]->fix_fields(thd,tables)) + if (args[0]->fix_fields(thd, tables, args) || + args[1]->fix_fields(thd,tables, args + 1)) return 1; /* purecov: inspected */ with_sum_func=args[0]->with_sum_func || args[1]->with_sum_func; max_length=1; decimals=0; diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index 302ad88905e..08c5a30c57c 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -177,9 +177,10 @@ public: Item_func_interval(Item *a,List &list) :Item_int_func(list),item(a),intervals(0) {} longlong val_int(); - bool fix_fields(THD *thd,struct st_table_list *tlist) + bool fix_fields(THD *thd, struct st_table_list *tlist, Item **ref) { - return (item->fix_fields(thd,tlist) || Item_func::fix_fields(thd,tlist)); + return (item->fix_fields(thd, tlist, &item) || + Item_func::fix_fields(thd, tlist, ref)); } void fix_length_and_dec(); ~Item_func_interval() { delete item; } @@ -259,7 +260,7 @@ public: enum Item_result result_type () const { return cached_result_type; } const char *func_name() const { return "case"; } void print(String *str); - bool fix_fields(THD *thd,struct st_table_list *tlist); + bool fix_fields(THD *thd, struct st_table_list *tlist, Item **ref); Item *find_item(String *str); }; @@ -409,9 +410,10 @@ class Item_func_in :public Item_int_func Item_func_in(Item *a,List &list) :Item_int_func(list),item(a),array(0),in_item(0) {} longlong val_int(); - bool fix_fields(THD *thd,struct st_table_list *tlist) + bool fix_fields(THD *thd, struct st_table_list *tlist, Item **ref) { - return (item->fix_fields(thd,tlist) || Item_func::fix_fields(thd,tlist)); + return (item->fix_fields(thd, tlist, &item) || + Item_func::fix_fields(thd, tlist, ref)); } void fix_length_and_dec(); ~Item_func_in() { delete item; delete array; delete in_item; } @@ -505,7 +507,7 @@ public: cond_result eq_cmp_result() const { return COND_TRUE; } const char *func_name() const { return "like"; } void fix_length_and_dec(); - bool fix_fields(THD *thd,struct st_table_list *tlist); + bool fix_fields(THD *thd, struct st_table_list *tlist, Item **ref); }; #ifdef USE_REGEX @@ -523,7 +525,7 @@ public: regex_compiled(0),regex_is_const(0) {} ~Item_func_regex(); longlong val_int(); - bool fix_fields(THD *thd,struct st_table_list *tlist); + bool fix_fields(THD *thd, struct st_table_list *tlist, Item **ref); const char *func_name() const { return "regex"; } }; @@ -552,7 +554,7 @@ public: { list.push_back(i1); list.push_back(i2); } ~Item_cond() { list.delete_elements(); } bool add(Item *item) { return list.push_back(item); } - bool fix_fields(THD *,struct st_table_list *); + bool fix_fields(THD *, struct st_table_list *, Item **ref); enum Type type() const { return COND_ITEM; } List* argument_list() { return &list; } diff --git a/sql/item_func.cc b/sql/item_func.cc index b14c1b38383..ae3fc7cb8f0 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -58,7 +58,7 @@ Item_func::Item_func(List &list) } bool -Item_func::fix_fields(THD *thd,TABLE_LIST *tables) +Item_func::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) { Item **arg,**arg_end; char buff[STACK_BUFF_ALLOC]; // Max argument in function @@ -72,7 +72,7 @@ Item_func::fix_fields(THD *thd,TABLE_LIST *tables) { // Print purify happy for (arg=args, arg_end=args+arg_count; arg != arg_end ; arg++) { - if ((*arg)->fix_fields(thd,tables)) + if ((*arg)->fix_fields(thd, tables, arg)) return 1; /* purecov: inspected */ if ((*arg)->maybe_null) maybe_null=1; @@ -1102,7 +1102,7 @@ udf_handler::~udf_handler() bool -udf_handler::fix_fields(THD *thd,TABLE_LIST *tables,Item_result_field *func, +udf_handler::fix_fields(THD *thd, TABLE_LIST *tables, Item_result_field *func, uint arg_count, Item **arguments) { char buff[STACK_BUFF_ALLOC]; // Max argument in function @@ -1146,7 +1146,7 @@ udf_handler::fix_fields(THD *thd,TABLE_LIST *tables,Item_result_field *func, arg != arg_end ; arg++,i++) { - if ((*arg)->fix_fields(thd,tables)) + if ((*arg)->fix_fields(thd, tables, arg)) return 1; if ((*arg)->binary) func->binary=1; @@ -1765,11 +1765,12 @@ static user_var_entry *get_variable(HASH *hash, LEX_STRING &name, } -bool Item_func_set_user_var::fix_fields(THD *thd,TABLE_LIST *tables) +bool Item_func_set_user_var::fix_fields(THD *thd, TABLE_LIST *tables, + Item **ref) { if (!thd) thd=current_thd; - if (Item_func::fix_fields(thd,tables) || + if (Item_func::fix_fields(thd, tables, ref) || !(entry= get_variable(&thd->user_vars, name, 1))) return 1; entry->update_query_id=thd->query_id; @@ -2095,7 +2096,7 @@ void Item_func_match::init_search(bool no_order) } } -bool Item_func_match::fix_fields(THD *thd,struct st_table_list *tlist) +bool Item_func_match::fix_fields(THD *thd, TABLE_LIST *tlist, Item **ref) { List_iterator li(fields); Item *item; @@ -2108,7 +2109,7 @@ bool Item_func_match::fix_fields(THD *thd,struct st_table_list *tlist) modifications to find_best and auto_close as complement to auto_init code above. */ - if (Item_func::fix_fields(thd,tlist) || !const_item()) + if (Item_func::fix_fields(thd, tlist, ref) || !const_item()) { my_error(ER_WRONG_ARGUMENTS,MYF(0),"AGAINST"); return 1; @@ -2116,7 +2117,7 @@ bool Item_func_match::fix_fields(THD *thd,struct st_table_list *tlist) while ((item=li++)) { - if (item->fix_fields(thd,tlist)) + if (item->fix_fields(thd, tlist, li.ref())) return 1; if (item->type() == Item::REF_ITEM) li.replace(item= *((Item_ref *)item)->ref); diff --git a/sql/item_func.h b/sql/item_func.h index 0056126d50e..86b2a17931d 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -99,7 +99,7 @@ public: } Item_func(List &list); ~Item_func() {} /* Nothing to do; Items are freed automaticly */ - bool fix_fields(THD *,struct st_table_list *); + bool fix_fields(THD *,struct st_table_list *, Item **ref); void make_field(Send_field *field); table_map used_tables() const; void update_used_tables(); @@ -567,9 +567,10 @@ public: Item_func_field(Item *a,List &list) :Item_int_func(list),item(a) {} ~Item_func_field() { delete item; } longlong val_int(); - bool fix_fields(THD *thd,struct st_table_list *tlist) + bool fix_fields(THD *thd,struct st_table_list *tlist, Item **ref) { - return (item->fix_fields(thd,tlist) || Item_func::fix_fields(thd,tlist)); + return (item->fix_fields(thd, tlist, &item) || + Item_func::fix_fields(thd, tlist, ref)); } void update_used_tables() { @@ -708,11 +709,11 @@ public: :Item_func(list), udf(udf_arg) {} ~Item_udf_func() {} const char *func_name() const { return udf.name(); } - bool fix_fields(THD *thd,struct st_table_list *tables) + bool fix_fields(THD *thd, struct st_table_list *tables, Item **ref) { - bool res=udf.fix_fields(thd,tables,this,arg_count,args); - used_tables_cache=udf.used_tables_cache; - const_item_cache=udf.const_item_cache; + bool res= udf.fix_fields(thd, tables, this, arg_count, args); + used_tables_cache= udf.used_tables_cache; + const_item_cache= udf.const_item_cache; return res; } Item_result result_type () const { return udf.result_type(); } @@ -867,7 +868,7 @@ public: void update_hash(void *ptr, uint length, enum Item_result type); bool update(); enum Item_result result_type () const { return cached_result_type; } - bool fix_fields(THD *thd,struct st_table_list *tables); + bool fix_fields(THD *thd, struct st_table_list *tables, Item **ref); void fix_length_and_dec(); void print(String *str); const char *func_name() const { return "set_user_var"; } @@ -941,7 +942,7 @@ public: } enum Functype functype() const { return FT_FUNC; } void update_used_tables() {} - bool fix_fields(THD *thd,struct st_table_list *tlist); + bool fix_fields(THD *thd, struct st_table_list *tlist, Item **ref); bool eq(const Item *, bool binary_cmp) const; longlong val_int() { return val()!=0.0; } double val(); diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index a273abaf614..6e15b8317d1 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -79,10 +79,10 @@ public: String *val_str(String *); void fix_length_and_dec(); void update_used_tables(); - bool fix_fields(THD *thd,struct st_table_list *tlist) + bool fix_fields(THD *thd, TABLE_LIST *tlist, Item **ref) { - return (separator->fix_fields(thd,tlist) - || Item_func::fix_fields(thd,tlist)); + return (separator->fix_fields(thd, tlist, &separator) + || Item_func::fix_fields(thd, tlist, ref)); } const char *func_name() const { return "concat_ws"; } }; @@ -325,9 +325,10 @@ public: double val(); longlong val_int(); String *val_str(String *str); - bool fix_fields(THD *thd,struct st_table_list *tlist) + bool fix_fields(THD *thd, TABLE_LIST *tlist, Item **ref) { - return (item->fix_fields(thd,tlist) || Item_func::fix_fields(thd,tlist)); + return (item->fix_fields(thd, tlist, &item) || + Item_func::fix_fields(thd, tlist, ref)); } void fix_length_and_dec(); void update_used_tables(); @@ -344,9 +345,10 @@ public: Item_func_make_set(Item *a,List &list) :Item_str_func(list),item(a) {} ~Item_func_make_set() { delete item; } String *val_str(String *str); - bool fix_fields(THD *thd,struct st_table_list *tlist) + bool fix_fields(THD *thd, TABLE_LIST *tlist, Item **ref) { - return (item->fix_fields(thd,tlist) || Item_func::fix_fields(thd,tlist)); + return (item->fix_fields(thd, tlist, &item) || + Item_func::fix_fields(thd, tlist, ref)); } void fix_length_and_dec(); void update_used_tables(); diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index d8f9cf40d50..2bff2af45e4 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -75,15 +75,8 @@ void Item_subselect::make_field (Send_field *tmp_field) } } -bool Item_subselect::fix_fields(THD *thd,TABLE_LIST *tables) +bool Item_subselect::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) { - - if (thd->having_fix_field) - { - //TODO: subselects in having do not suported now - my_printf_error(ER_SYNTAX_ERROR, ER(ER_SYNTAX_ERROR), MYF(0)); - return 1; - } // Is it one field subselect? if (select_lex->item_list.elements > max_columns) { diff --git a/sql/item_subselect.h b/sql/item_subselect.h index 79832116c67..3f363df33df 100644 --- a/sql/item_subselect.h +++ b/sql/item_subselect.h @@ -63,7 +63,7 @@ public: enum Type type() const; bool is_null() { return null_value; } void make_field (Send_field *); - bool fix_fields(THD *thd, TABLE_LIST *tables); + bool fix_fields(THD *thd, TABLE_LIST *tables, Item **ref); table_map used_tables() const; friend class select_subselect; diff --git a/sql/item_sum.cc b/sql/item_sum.cc index 6ef968c33f7..809dd65d52b 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -112,7 +112,7 @@ Item_sum_int::val_str(String *str) bool -Item_sum_num::fix_fields(THD *thd,TABLE_LIST *tables) +Item_sum_num::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) { if (!thd->allow_sum_func) { @@ -124,7 +124,7 @@ Item_sum_num::fix_fields(THD *thd,TABLE_LIST *tables) maybe_null=0; for (uint i=0 ; i < arg_count ; i++) { - if (args[i]->fix_fields(thd,tables)) + if (args[i]->fix_fields(thd, tables, args + i)) return 1; if (decimals < args[i]->decimals) decimals=args[i]->decimals; @@ -140,7 +140,7 @@ Item_sum_num::fix_fields(THD *thd,TABLE_LIST *tables) bool -Item_sum_hybrid::fix_fields(THD *thd,TABLE_LIST *tables) +Item_sum_hybrid::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) { Item *item=args[0]; if (!thd->allow_sum_func) @@ -149,7 +149,7 @@ Item_sum_hybrid::fix_fields(THD *thd,TABLE_LIST *tables) return 1; } thd->allow_sum_func=0; // No included group funcs - if (item->fix_fields(thd,tables)) + if (item->fix_fields(thd, tables, args)) return 1; hybrid_type=item->result_type(); if (hybrid_type == INT_RESULT) @@ -930,9 +930,10 @@ Item_sum_count_distinct::~Item_sum_count_distinct() } -bool Item_sum_count_distinct::fix_fields(THD *thd,TABLE_LIST *tables) +bool Item_sum_count_distinct::fix_fields(THD *thd, TABLE_LIST *tables, + Item **ref) { - if (Item_sum_num::fix_fields(thd,tables) || + if (Item_sum_num::fix_fields(thd, tables, ref) || !(tmp_table_param= new TMP_TABLE_PARAM)) return 1; return 0; diff --git a/sql/item_sum.h b/sql/item_sum.h index a963799b6a7..3e67f1e3624 100644 --- a/sql/item_sum.h +++ b/sql/item_sum.h @@ -80,7 +80,7 @@ public: Item_sum_num(Item *item_par) :Item_sum(item_par) {} Item_sum_num(Item *a, Item* b) :Item_sum(a,b) {} Item_sum_num(List &list) :Item_sum(list) {} - bool fix_fields(THD *,struct st_table_list *); + bool fix_fields(THD *, TABLE_LIST *, Item **); longlong val_int() { return (longlong) val(); } /* Real as default */ String *val_str(String*str); void reset_field(); @@ -146,7 +146,7 @@ class Item_sum_count_distinct :public Item_sum_int { TABLE *table; table_map used_table_cache; - bool fix_fields(THD *thd,TABLE_LIST *tables); + bool fix_fields(THD *thd, TABLE_LIST *tables, Item **ref); uint32 *field_lengths; TMP_TABLE_PARAM *tmp_table_param; TREE tree; @@ -283,7 +283,7 @@ class Item_sum_hybrid :public Item_sum Item_sum_hybrid(Item *item_par,int sign) :Item_sum(item_par),cmp_sign(sign), used_table_cache(~(table_map) 0) {} - bool fix_fields(THD *,struct st_table_list *); + bool fix_fields(THD *, TABLE_LIST *, Item **); table_map used_tables() const { return used_table_cache; } bool const_item() const { return !used_table_cache; } @@ -382,7 +382,7 @@ public: { quick_group=0;} ~Item_udf_sum() {} const char *func_name() const { return udf.name(); } - bool fix_fields(THD *thd,struct st_table_list *tables) + bool fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) { return udf.fix_fields(thd,tables,this,this->arg_count,this->args); } diff --git a/sql/item_uniq.h b/sql/item_uniq.h index 4be64ecc74a..e56632e7289 100644 --- a/sql/item_uniq.h +++ b/sql/item_uniq.h @@ -42,5 +42,5 @@ public: bool add() { return 0; } void reset_field() {} void update_field(int offset) {} - bool fix_fields(THD *thd,struct st_table_list *tlist) { return 0;} + bool fix_fields(THD *thd, TABLE_LIST *tlist, Item **ref) { return 0;} }; diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 92606716c63..b3ef043f582 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -1874,7 +1874,7 @@ int setup_fields(THD *thd, TABLE_LIST *tables, List &fields, } else { - if (item->fix_fields(thd,tables)) + if (item->fix_fields(thd, tables, it.ref())) DBUG_RETURN(-1); /* purecov: inspected */ if (item->with_sum_func && item->type() != Item::SUM_FUNC_ITEM && sum_func_list) @@ -2025,7 +2025,7 @@ int setup_conds(THD *thd,TABLE_LIST *tables,COND **conds) if (*conds) { thd->where="where clause"; - if ((*conds)->fix_fields(thd,tables)) + if ((*conds)->fix_fields(thd, tables, conds)) DBUG_RETURN(1); } @@ -2036,7 +2036,7 @@ int setup_conds(THD *thd,TABLE_LIST *tables,COND **conds) { /* Make a join an a expression */ thd->where="on clause"; - if (table->on_expr->fix_fields(thd,tables)) + if (table->on_expr->fix_fields(thd, tables, &table->on_expr)) DBUG_RETURN(1); thd->cond_count++; diff --git a/sql/sql_class.cc b/sql/sql_class.cc index c8914702ae7..9922eacdec1 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -81,7 +81,7 @@ static void free_var(user_var_entry *entry) THD::THD():user_time(0),fatal_error(0),last_insert_id_used(0), insert_id_used(0), in_lock_tables(0), - global_read_lock(0), bootstrap(0), having_fix_field(0) + global_read_lock(0), bootstrap(0) { host=user=priv_user=db=query=ip=0; host_or_ip="unknown ip"; diff --git a/sql/sql_class.h b/sql/sql_class.h index 9b708e35a1e..a6b7e45ab03 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -453,7 +453,6 @@ public: bool query_error, bootstrap, cleanup_done; bool safe_to_cache_query; bool volatile killed; - bool having_fix_field; //TRUE when having fix field called bool prepare_command; ulong param_count,current_param_number; Error err_list; diff --git a/sql/sql_handler.cc b/sql/sql_handler.cc index 4ecd5dbca36..a98012653b3 100644 --- a/sql/sql_handler.cc +++ b/sql/sql_handler.cc @@ -106,7 +106,7 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, } tables->table=table; - if (cond && cond->fix_fields(thd,tables)) + if (cond && cond->fix_fields(thd, tables, &cond)) return -1; if (keyname) diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index bcf212f6bd2..9ae5cdeeb15 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -942,8 +942,8 @@ void st_select_lex::init_select() interval_list.empty(); use_index.empty(); ftfunc_list.empty(); - linkage=UNSPECIFIED_TYPE; - depended= 0; + linkage= UNSPECIFIED_TYPE; + depended= having_fix_field= 0; } /* diff --git a/sql/sql_lex.h b/sql/sql_lex.h index ca824b3eab8..f4e788b67e2 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -253,7 +253,10 @@ public: uint in_sum_expr; bool create_refs, braces, /* SELECT ... UNION (SELECT ... ) <- this braces */ - depended; /* depended from outer select subselect */ + depended, /* depended from outer select subselect */ + /* TRUE when having fix field called in processing of this SELECT */ + having_fix_field; + void init_query(); void init_select(); st_select_lex_unit* master_unit() { return (st_select_lex_unit*) master; } diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index d5896901935..d41aca21fb8 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -448,7 +448,7 @@ static bool mysql_test_upd_fields(THD *thd, TABLE_LIST *table_list, static bool mysql_test_select_fields(THD *thd, TABLE_LIST *tables, List &fields, List &values, COND *conds, ORDER *order, ORDER *group, - Item *having,thr_lock_type lock_type) + Item *having, thr_lock_type lock_type) { TABLE *table; bool hidden_group_fields; @@ -470,7 +470,7 @@ static bool mysql_test_select_fields(THD *thd, TABLE_LIST *tables, { thd->where="having clause"; thd->allow_sum_func=1; - if (having->fix_fields(thd,tables) || thd->fatal_error) + if (having->fix_fields(thd, tables, &having) || thd->fatal_error) DBUG_RETURN(1); if (having->with_sum_func) having->split_sum_func(all_fields); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 025a5c600a5..d70b7dfdbed 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -227,10 +227,9 @@ JOIN::prepare(TABLE_LIST *tables_init, { thd->where="having clause"; thd->allow_sum_func=1; - bool having_fix_field_store= thd->having_fix_field; - thd->having_fix_field= 1; - bool having_fix_rc= having->fix_fields(thd,tables_list); - thd->having_fix_field= having_fix_field_store; + select_lex->having_fix_field= 1; + bool having_fix_rc= having->fix_fields(thd, tables_list, &having); + select_lex->having_fix_field= 0; if (having_fix_rc || thd->fatal_error) DBUG_RETURN(-1); /* purecov: inspected */ if (having->with_sum_func) @@ -349,7 +348,7 @@ JOIN::optimize() } else if ((conds=new Item_cond_and(conds,having))) { - conds->fix_fields(thd, tables_list); + conds->fix_fields(thd, tables_list, &conds); conds->change_ref_to_fields(thd, tables_list); having= 0; } @@ -612,6 +611,15 @@ JOIN::reinit() if (setup_tables(tables_list)) DBUG_RETURN(1); + + // Reset of sum functions + first_record= 0; + if (sum_funcs) + { + Item_sum *func, **func_ptr= sum_funcs; + while ((func= *(func_ptr++))) + func->null_value= 1; + } DBUG_RETURN(0); } @@ -3381,7 +3389,7 @@ remove_eq_conds(COND *cond,Item::cond_result *cond_value) 21)))) { cond=new_cond; - cond->fix_fields(thd,0); + cond->fix_fields(thd, 0, &cond); } thd->insert_id(0); // Clear for next request } @@ -3395,7 +3403,7 @@ remove_eq_conds(COND *cond,Item::cond_result *cond_value) if ((new_cond= new Item_func_eq(args[0],new Item_int("0", 0, 2)))) { cond=new_cond; - cond->fix_fields(thd,0); + cond->fix_fields(thd, 0, &cond); } } } @@ -6429,7 +6437,7 @@ find_order_in_list(THD *thd,TABLE_LIST *tables,ORDER *order,List &fields, return 0; } order->in_field_list=0; - if ((*order->item)->fix_fields(thd,tables) || thd->fatal_error) + if ((*order->item)->fix_fields(thd, tables, order->item) || thd->fatal_error) return 1; // Wrong field all_fields.push_front(*order->item); // Add new field to field list order->item=(Item**) all_fields.head_ref(); @@ -6527,7 +6535,7 @@ setup_new_fields(THD *thd,TABLE_LIST *tables,List &fields, else { thd->where="procedure list"; - if ((*new_field->item)->fix_fields(thd,tables)) + if ((*new_field->item)->fix_fields(thd, tables, new_field->item)) DBUG_RETURN(1); /* purecov: inspected */ thd->where=0; all_fields.push_front(*new_field->item); @@ -7092,7 +7100,7 @@ static bool add_ref_to_table_cond(THD *thd, JOIN_TAB *join_tab) Here we pass 0 as the first argument to fix_fields that don't need to do any stack checking (This is already done in the initial fix_fields). */ - cond->fix_fields((THD *) 0,(TABLE_LIST *) 0); + cond->fix_fields((THD *) 0,(TABLE_LIST *) 0, (Item**)&cond); if (join_tab->select) { error=(int) cond->add(join_tab->select->cond); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index faa63afa6c7..f237aac81d3 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2973,7 +2973,7 @@ kill: KILL_SYM expr { LEX *lex=Lex; - if ($2->fix_fields(lex->thd,0)) + if ($2->fix_fields(lex->thd, 0, &$2)) { send_error(&lex->thd->net, ER_SET_CONSTANTS_ONLY); YYABORT; @@ -3469,7 +3469,8 @@ option_value: | '@' ident_or_text equal expr { Item_func_set_user_var *item = new Item_func_set_user_var($2,$4); - if (item->fix_fields(current_thd,0) || item->update()) + if (item->fix_fields(current_thd, 0, (Item**) &item) || + item->update()) { send_error(¤t_thd->net, ER_SET_CONSTANTS_ONLY); YYABORT; @@ -3501,7 +3502,7 @@ option_value: { THD *thd=current_thd; Item *item= $3; - if (item->fix_fields(current_thd,0)) + if (item->fix_fields(current_thd, 0, &item)) { send_error(&thd->net, ER_SET_CONSTANTS_ONLY); YYABORT; -- cgit v1.2.1 From 5d2927e4a67dfc181cb4cae9fe74888676d83491 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 1 Jul 2002 19:06:24 +0300 Subject: subselect clean up fix after automerge sql/item_strfunc.cc: fix after automerge sql/sql_lex.h: subselect clean up sql/sql_select.cc: subselect clean up --- sql/item_strfunc.cc | 2 +- sql/sql_lex.h | 4 +++- sql/sql_select.cc | 16 ++++++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 5bb2c4015ad..1aee4e7d553 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1922,7 +1922,7 @@ bool Item_func_conv_charset::fix_fields(THD *thd,struct st_table_list *tables) if (thd && check_stack_overrun(thd,buff)) return 0; // Fatal error if flag is set! - if (args[0]->fix_fields(thd,tables)) + if (args[0]->fix_fields(thd, tables, args)) return 1; maybe_null=args[0]->maybe_null; binary=args[0]->binary; diff --git a/sql/sql_lex.h b/sql/sql_lex.h index c3a4526e052..658c1dc2cdb 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -240,6 +240,7 @@ typedef struct st_select_lex_unit SELECT_LEX_UNIT; /* SELECT_LEX - store information of parsed SELECT_LEX statment */ +class JOIN; class st_select_lex: public st_select_lex_node { public: char *db, *db1, *table1, *db2, *table2; /* For outer join using .. */ @@ -251,12 +252,13 @@ public: List interval_list, use_index, *use_index_ptr, ignore_index, *ignore_index_ptr; List ftfunc_list; + JOIN *join; /* after JOIN::prepare it is pointer to corresponding JOIN */ uint in_sum_expr; bool create_refs, braces, /* SELECT ... UNION (SELECT ... ) <- this braces */ depended, /* depended from outer select subselect */ /* TRUE when having fix field called in processing of this SELECT */ - having_fix_field; + having_fix_field;e void init_query(); void init_select(); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 8dd611add86..76f78009e84 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -211,6 +211,7 @@ JOIN::prepare(TABLE_LIST *tables_init, proc_param= proc_param_init; tables_list= tables_init; select_lex= select; + select->join= this; union_part= (unit->first_select()->next_select() != 0); /* Check that all tables, fields, conds and order are ok */ @@ -974,6 +975,21 @@ JOIN::cleanup(THD *thd) delete select; delete_dynamic(&keyuse); delete procedure; + for (SELECT_LEX_UNIT *unit= select_lex->first_inner_unit(); + unit != 0; + unit= unit->next_unit()) + for (SELECT_LEX *sl= unit->first_select(); + sl != 0; + sl= sl->next_select()) + { + if (sl->join) + { + int err= sl->join->cleanup(thd); + if (err) + error= err; + sl->join= 0; + } + } return error; } -- cgit v1.2.1 From ff5fadb71aced6b29d4c2466bc3813e8350103d0 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 1 Jul 2002 19:13:14 +0300 Subject: typo fixed --- sql/sql_lex.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 658c1dc2cdb..7234a7a92ff 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -258,7 +258,7 @@ public: braces, /* SELECT ... UNION (SELECT ... ) <- this braces */ depended, /* depended from outer select subselect */ /* TRUE when having fix field called in processing of this SELECT */ - having_fix_field;e + having_fix_field; void init_query(); void init_select(); -- cgit v1.2.1 From 1648e47889f6c981847ab300bf6e71d08c9f0667 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 2 Jul 2002 14:31:54 +0500 Subject: SHOW CREATE DATABASE name; Small fixes in database default charset code sql/mysql_priv.h: SHOW CREATE DATABASE name; sql/sql_db.cc: SHOW CREATE DATABASE name; sql/sql_lex.h: SHOW CREATE DATABASE name; sql/sql_parse.cc: SHOW CREATE DATABASE name; sql/sql_yacc.yy: SHOW CREATE DATABASE name; --- sql/mysql_priv.h | 1 + sql/sql_db.cc | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- sql/sql_lex.h | 1 + sql/sql_parse.cc | 19 +++++++++++- sql/sql_yacc.yy | 5 ++++ 5 files changed, 115 insertions(+), 2 deletions(-) diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 2992f11ef65..c0371d1e90c 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -472,6 +472,7 @@ int mysqld_show_logs(THD *thd); void mysqld_list_fields(THD *thd,TABLE_LIST *table, const char *wild); int mysqld_dump_create_info(THD *thd, TABLE *table, int fd = -1); int mysqld_show_create(THD *thd, TABLE_LIST *table_list); +int mysqld_show_create_db(THD *thd, const char *dbname); void mysqld_list_processes(THD *thd,const char *user,bool verbose); int mysqld_show_status(THD *thd); diff --git a/sql/sql_db.cc b/sql/sql_db.cc index 63edebd4ac7..7e82e1433b9 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -106,7 +106,7 @@ static int load_db_opt(THD *thd,const char *db,HA_CREATE_INFO *create,char *fn) for( ; (le[0]=='\r' || le[0]=='\n') ; le++); if (!strcmp(ln,"default-character-set") && val && val[0]) { - thd->db_charset=get_charset_by_name(val, MYF(0)); + create->table_charset=get_charset_by_name(val, MYF(0)); } goto cnt; break; @@ -568,3 +568,92 @@ bool mysql_change_db(THD *thd,const char *name) DBUG_RETURN(0); } + + +int mysqld_show_create_db(THD *thd,const char *name) +{ + int length, db_length; + char *dbname=my_strdup((char*) name,MYF(MY_WME)); + char path[FN_REFLEN]; + uint db_access; + HA_CREATE_INFO create; + CONVERT *convert=thd->convert_set; + + DBUG_ENTER("mysql_show_create_db"); + + if (!dbname || !(db_length=strip_sp(dbname))) + { + x_free(dbname); /* purecov: inspected */ + send_error(&thd->net,ER_NO_DB_ERROR); /* purecov: inspected */ + DBUG_RETURN(1); /* purecov: inspected */ + } + + if ((db_length > NAME_LEN) || check_db_name(dbname)) + { + net_printf(&thd->net,ER_WRONG_DB_NAME, dbname); + x_free(dbname); + DBUG_RETURN(1); + } + + if (test_all_bits(thd->master_access,DB_ACLS)) + db_access=DB_ACLS; + else + db_access= (acl_get(thd->host,thd->ip,(char*) &thd->remote.sin_addr, + thd->priv_user,dbname) | + thd->master_access); + if (!(db_access & DB_ACLS) && (!grant_option || check_grant_db(thd,dbname))) + { + net_printf(&thd->net,ER_DBACCESS_DENIED_ERROR, + thd->priv_user, + thd->host_or_ip, + dbname); + mysql_log.write(thd,COM_INIT_DB,ER(ER_DBACCESS_DENIED_ERROR), + thd->priv_user, + thd->host_or_ip, + dbname); + my_free(dbname,MYF(0)); + DBUG_RETURN(1); + } + + (void) sprintf(path,"%s/%s",mysql_data_home,dbname); + length=unpack_dirname(path,path); // Convert if not unix + if (length && path[length-1] == FN_LIBCHAR) + path[length-1]=0; // remove ending '\' + if (access(path,F_OK)) + { + net_printf(&thd->net,ER_BAD_DB_ERROR,dbname); + my_free(dbname,MYF(0)); + DBUG_RETURN(1); + } + + strcat(path,"/"); + unpack_dirname(path,path); + strcat(path,MY_DB_OPT_FILE); + bzero(&create,sizeof(create)); + load_db_opt(thd,name,&create,path); + + List field_list; + field_list.push_back(new Item_empty_string("Database",NAME_LEN)); + field_list.push_back(new Item_empty_string("Create Database",1024)); + + if (send_fields(thd,field_list,1)) + DBUG_RETURN(1); + + String *packet = &thd->packet; + packet->length(0); + net_store_data(packet, convert, name); + sprintf(path, "CREATE DATABASE %s", name); + if (create.table_charset) + { + strcat(path," DEFAULT CHARACTER SET "); + strcat(path,create.table_charset->name); + } + net_store_data(packet, convert, path); + + if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length())) + DBUG_RETURN(1); + + send_eof(&thd->net); + + DBUG_RETURN(0); +} diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 7234a7a92ff..470230c0999 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -42,6 +42,7 @@ enum enum_sql_command { SQLCOM_SHOW_KEYS, SQLCOM_SHOW_VARIABLES, SQLCOM_SHOW_LOGS, SQLCOM_SHOW_STATUS, SQLCOM_SHOW_PROCESSLIST, SQLCOM_SHOW_MASTER_STAT, SQLCOM_SHOW_SLAVE_STAT, SQLCOM_SHOW_GRANTS, SQLCOM_SHOW_CREATE, SQLCOM_SHOW_CHARSETS, + SQLCOM_SHOW_CREATE_DB, SQLCOM_LOAD,SQLCOM_SET_OPTION,SQLCOM_LOCK_TABLES,SQLCOM_UNLOCK_TABLES, SQLCOM_GRANT, diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 43cb056ffc8..e006855105c 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2335,7 +2335,7 @@ mysql_execute_command(void) net_printf(&thd->net,ER_WRONG_DB_NAME, lex->name); break; } - if (check_access(thd,DROP_ACL,lex->name,0,1)) + if (check_access(thd,ALTER_ACL,lex->name,0,1)) break; if (thd->locked_tables || thd->active_transaction()) { @@ -2345,6 +2345,23 @@ mysql_execute_command(void) res=mysql_alter_db(thd,lex->name,&lex->create_info,0); break; } + case SQLCOM_SHOW_CREATE_DB: + { + if (!strip_sp(lex->name) || check_db_name(lex->name)) + { + net_printf(&thd->net,ER_WRONG_DB_NAME, lex->name); + break; + } + if (check_access(thd,DROP_ACL,lex->name,0,1)) + break; + if (thd->locked_tables || thd->active_transaction()) + { + send_error(&thd->net,ER_LOCK_OR_ACTIVE_TRANSACTION); + goto error; + } + res=mysqld_show_create_db(thd,lex->name); + break; + } case SQLCOM_CREATE_FUNCTION: if (check_access(thd,INSERT_ACL,"mysql",0,1)) break; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index e96c72ab04b..160bc253dc9 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2851,6 +2851,11 @@ show_param: lex->grant_user=$3; lex->grant_user->password.str=NullS; } + | CREATE DATABASE ident + { + Lex->sql_command=SQLCOM_SHOW_CREATE_DB; + Lex->name=$3.str; + } | CREATE TABLE_SYM table_ident { Lex->sql_command = SQLCOM_SHOW_CREATE; -- cgit v1.2.1 From abba4bdaa5cfcff489afe357d39a1e70b843bb52 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 3 Jul 2002 07:17:35 +0200 Subject: server-cfg.sh remove %smds, remove conversation from date to int for mysql, server-cfg.sh set bdb as transactional sql-bench/server-cfg.sh: remove %smds, remove conversation from date to int for mysql, set bdb as transactional BitKeeper/etc/logging_ok: Logging to logging@openlogging.org accepted --- BitKeeper/etc/logging_ok | 1 + sql-bench/server-cfg.sh | 176 ++--------------------------------------------- 2 files changed, 6 insertions(+), 171 deletions(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index 0ed14928cdb..ffac1d8c3cd 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -68,3 +68,4 @@ worm@altair.is.lan zak@balfor.local zak@linux.local venu@myvenu.com +walrus@mysql.com diff --git a/sql-bench/server-cfg.sh b/sql-bench/server-cfg.sh index a4e74fcb4f9..e82fd5d5907 100644 --- a/sql-bench/server-cfg.sh +++ b/sql-bench/server-cfg.sh @@ -115,7 +115,6 @@ sub new $self->{'data_source'} = "DBI:mysql:database=$database;host=$host"; $self->{'data_source'} .= ";mysql_socket=$socket" if($socket); $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "blob"; $self->{'text'} = "text"; $self->{'double_quotes'} = 1; # Can handle: 'Walker''s' @@ -168,25 +167,6 @@ sub new $limits{'working_all_fields'} = 1; $limits{'working_blobs'} = 1; # If big varchar/blobs works - $smds{'time'} = 1; - $smds{'q1'} = 'b'; # with time not supp by mysql ('') - $smds{'q2'} = 'b'; - $smds{'q3'} = 'b'; # with time ('') - $smds{'q4'} = 'c'; # with time not supp by mysql (d) - $smds{'q5'} = 'b'; # with time not supp by mysql ('') - $smds{'q6'} = 'c'; # with time not supp by mysql ('') - $smds{'q7'} = 'c'; - $smds{'q8'} = 'f'; - $smds{'q9'} = 'c'; - $smds{'q10'} = 'b'; - $smds{'q11'} = 'b'; - $smds{'q12'} = 'd'; - $smds{'q13'} = 'c'; - $smds{'q14'} = 'd'; - $smds{'q15'} = 'd'; - $smds{'q16'} = 'a'; - $smds{'q17'} = 'c'; - # Some fixes that depends on the environment if (defined($main::opt_create_options) && $main::opt_create_options =~ /type=heap/i) @@ -199,6 +179,11 @@ sub new $limits{'max_text_size'} = 8000; # Limit in Innobase $self->{'transactions'} = 1; # Transactions enabled } + if (defined($main::opt_create_options) && + $main::opt_create_options =~ /type=bdb/i) + { + $self->{'transactions'} = 1; # Transactions enabled + } if (defined($main::opt_create_options) && $main::opt_create_options =~ /type=gemini/i) { @@ -266,7 +251,6 @@ sub create { $field =~ s/ decimal/ double(10,2)/i; $field =~ s/ big_decimal/ double(10,2)/i; - $field =~ s/ date/ int/i; # Because of tcp ? $query.= $field . ','; } foreach $index (@$index) @@ -575,7 +559,6 @@ sub new $self->{'cmp_name'} = "pg"; $self->{'data_source'} = "DBI:Pg:dbname=$database"; $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "text"; $self->{'text'} = "text"; $self->{'double_quotes'} = 1; @@ -626,27 +609,6 @@ sub new $limits{'working_all_fields'} = 1; $limits{'working_blobs'} = 1; # If big varchar/blobs works - # the different cases per query ... - $smds{'q1'} = 'b'; # with time - $smds{'q2'} = 'b'; - $smds{'q3'} = 'b'; # with time - $smds{'q4'} = 'c'; # with time - $smds{'q5'} = 'b'; # with time - $smds{'q6'} = 'c'; # strange error .... - $smds{'q7'} = 'c'; - $smds{'q8'} = 'f'; # needs 128M to execute - can't do insert ...group by - $smds{'q9'} = 'c'; - $smds{'q10'} = 'b'; - $smds{'q11'} = 'b'; # can't do float8 * int4 - create operator - $smds{'q12'} = 'd'; # strange error??? - $smds{'q13'} = 'c'; - $smds{'q14'} = 'd'; # strange error??? - $smds{'q15'} = 'd'; # strange error??? - $smds{'q16'} = 'a'; - $smds{'q17'} = 'c'; - $smds{'time'} = 1; # the use of the time table -> 1 is on. - # when 0 then the date field must be a - # date field not a int field!!! return $self; } @@ -871,7 +833,6 @@ sub new $self->{'cmp_name'} = "solid"; $self->{'data_source'} = "DBI:Solid:"; $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "long varchar"; $self->{'text'} = "long varchar"; $self->{'double_quotes'} = 1; @@ -922,28 +883,6 @@ sub new $limits{'order_by_unused'} = 1; $limits{'working_all_fields'} = 1; - # for the smds small benchmark test .... - # the different cases per query ... - $smds{'q1'} = 'a'; - $smds{'q2'} = ''; - $smds{'q3'} = 'b'; #doesn't work -> strange error about column -fixed - $smds{'q4'} = 'a'; - $smds{'q5'} = 'b'; - $smds{'q6'} = 'c'; - $smds{'q7'} = 'b'; - $smds{'q8'} = 'f'; - $smds{'q9'} = 'b'; - $smds{'q10'} = 'b'; - $smds{'q11'} = ''; - $smds{'q12'} = 'd'; - $smds{'q13'} = 'b'; - $smds{'q14'} = 'd'; - $smds{'q15'} = 'd'; - $smds{'q16'} = ''; - $smds{'q17'} = ''; - $smds{'time'} = 1; # the use of the time table -> 1 is on. - # when 0 then the date field must be a - # date field not a int field!!! return $self; } @@ -1119,7 +1058,6 @@ sub new $self->{'cmp_name'} = "empress"; $self->{'data_source'} = "DBI:EmpressNet:SERVER=$host;Database=/usr/local/empress/rdbms/bin/$database"; $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "text"; $self->{'text'} = "text"; $self->{'double_quotes'} = 1; # Can handle: 'Walker''s' @@ -1172,28 +1110,6 @@ sub new $limits{'order_by_unused'} = 1; $limits{'working_all_fields'} = 1; - # for the smds small benchmark test .... - # the different cases per query ... EMPRESS - $smds{'q1'} = 'a'; - $smds{'q2'} = ''; - $smds{'q3'} = 'a'; - $smds{'q4'} = 'a'; - $smds{'q5'} = 'a'; - $smds{'q6'} = 'a'; - $smds{'q7'} = 'b'; - $smds{'q8'} = 'd'; - $smds{'q9'} = 'b'; - $smds{'q10'} = 'a'; - $smds{'q11'} = ''; - $smds{'q12'} = 'd'; - $smds{'q13'} = 'b'; - $smds{'q14'} = 'b'; - $smds{'q15'} = 'a'; - $smds{'q16'} = ''; - $smds{'q17'} = ''; - $smds{'time'} = 1; # the use of the time table -> 1 is on. - # when 0 then the date field must be a - # date field not a int field!!! return $self; } @@ -1410,7 +1326,6 @@ sub new $self->{'cmp_name'} = "Oracle"; $self->{'data_source'} = "DBI:Oracle:$database"; $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "long"; $self->{'text'} = "long"; $self->{'double_quotes'} = 1; # Can handle: 'Walker''s' @@ -1464,24 +1379,6 @@ sub new $limits{'order_by_unused'} = 1; $limits{'working_all_fields'} = 1; - $smds{'time'} = 1; - $smds{'q1'} = 'b'; # with time not supp by mysql ('') - $smds{'q2'} = 'b'; - $smds{'q3'} = 'b'; # with time ('') - $smds{'q4'} = 'c'; # with time not supp by mysql (d) - $smds{'q5'} = 'b'; # with time not supp by mysql ('') - $smds{'q6'} = 'c'; # with time not supp by mysql ('') - $smds{'q7'} = 'c'; - $smds{'q8'} = 'f'; - $smds{'q9'} = 'c'; - $smds{'q10'} = 'b'; - $smds{'q11'} = 'b'; - $smds{'q12'} = 'd'; - $smds{'q13'} = 'c'; - $smds{'q14'} = 'd'; - $smds{'q15'} = 'd'; - $smds{'q16'} = 'a'; - $smds{'q17'} = 'c'; return $self; } @@ -1675,7 +1572,6 @@ sub new $self->{'cmp_name'} = "Informix"; $self->{'data_source'} = "DBI:Informix:$database"; $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "byte in table"; $self->{'text'} = "byte in table"; $self->{'double_quotes'} = 0; # Can handle: 'Walker''s' @@ -1888,7 +1784,6 @@ sub new $self->{'data_source'} .= ":$host"; } $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "blob"; $self->{'text'} = "blob"; # text ? $self->{'double_quotes'} = 1; # Can handle: 'Walker''s' @@ -2071,7 +1966,6 @@ sub new $self->{'data_source'} .= ":$host"; } $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "text"; $self->{'text'} = "text"; $self->{'double_quotes'} = 1; # Can handle: 'Walker''s' @@ -2264,7 +2158,6 @@ sub new $self->{'data_source'} .= ";hostname=$host"; } $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "text"; $self->{'text'} = "text"; $self->{'double_quotes'} = 1; # Can handle: 'Walker''s' @@ -2497,7 +2390,6 @@ sub new $self->{'cmp_name'} = "Adabas"; $self->{'data_source'} = "DBI:Adabas:$database"; $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "long"; $self->{'text'} = "long"; $self->{'double_quotes'} = 1; # Can handle: 'Walker''s' @@ -2549,24 +2441,6 @@ sub new $limits{'order_by_unused'} = 1; $limits{'working_all_fields'} = 1; - $smds{'time'} = 1; - $smds{'q1'} = 'b'; # with time not supp by mysql ('') - $smds{'q2'} = 'b'; - $smds{'q3'} = 'b'; # with time ('') - $smds{'q4'} = 'c'; # with time not supp by mysql (d) - $smds{'q5'} = 'b'; # with time not supp by mysql ('') - $smds{'q6'} = 'c'; # with time not supp by mysql ('') - $smds{'q7'} = 'c'; - $smds{'q8'} = 'f'; - $smds{'q9'} = 'c'; - $smds{'q10'} = 'b'; - $smds{'q11'} = 'b'; - $smds{'q12'} = 'd'; - $smds{'q13'} = 'c'; - $smds{'q14'} = 'd'; - $smds{'q15'} = 'd'; - $smds{'q16'} = 'a'; - $smds{'q17'} = 'c'; return $self; } @@ -2718,7 +2592,6 @@ sub new $self->{'data_source'} .= ":$host"; } $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "varchar(255)"; $self->{'text'} = "varchar(255)"; $self->{'double_quotes'} = 1; # Can handle: 'Walker''s' @@ -2894,7 +2767,6 @@ sub new $self->{'cmp_name'} = "mimer"; $self->{'data_source'} = "DBI:mimer:$database:$host"; $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "binary varying(15000)"; $self->{'text'} = "character varying(15000)"; $self->{'double_quotes'} = 1; # Can handle: 'Walker''s' @@ -2950,24 +2822,6 @@ sub new $limits{'order_by_unused'} = 1; $limits{'working_all_fields'} = 1; - $smds{'time'} = 1; - $smds{'q1'} = 'b'; # with time not supp by mysql ('') - $smds{'q2'} = 'b'; - $smds{'q3'} = 'b'; # with time ('') - $smds{'q4'} = 'c'; # with time not supp by mysql (d) - $smds{'q5'} = 'b'; # with time not supp by mysql ('') - $smds{'q6'} = 'c'; # with time not supp by mysql ('') - $smds{'q7'} = 'c'; - $smds{'q8'} = 'f'; - $smds{'q9'} = 'c'; - $smds{'q10'} = 'b'; - $smds{'q11'} = 'b'; - $smds{'q12'} = 'd'; - $smds{'q13'} = 'c'; - $smds{'q14'} = 'd'; - $smds{'q15'} = 'd'; - $smds{'q16'} = 'a'; - $smds{'q17'} = 'c'; return $self; } @@ -3112,7 +2966,6 @@ sub new $self->{'cmp_name'} = "interbase"; $self->{'data_source'} = "DBI:InterBase:database=$database:ib_dialect=3"; $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "blob"; $self->{'text'} = ""; $self->{'double_quotes'} = 1; # Can handle: 'Walker''s' @@ -3166,24 +3019,6 @@ sub new $limits{'order_by_unused'} = 1; $limits{'working_all_fields'} = 1; - $smds{'time'} = 1; - $smds{'q1'} = 'b'; # with time not supp by mysql ('') - $smds{'q2'} = 'b'; - $smds{'q3'} = 'b'; # with time ('') - $smds{'q4'} = 'c'; # with time not supp by mysql (d) - $smds{'q5'} = 'b'; # with time not supp by mysql ('') - $smds{'q6'} = 'c'; # with time not supp by mysql ('') - $smds{'q7'} = 'c'; - $smds{'q8'} = 'f'; - $smds{'q9'} = 'c'; - $smds{'q10'} = 'b'; - $smds{'q11'} = 'b'; - $smds{'q12'} = 'd'; - $smds{'q13'} = 'c'; - $smds{'q14'} = 'd'; - $smds{'q15'} = 'd'; - $smds{'q16'} = 'a'; - $smds{'q17'} = 'c'; return $self; } @@ -3331,7 +3166,6 @@ sub new $self->{'cmp_name'} = "FrontBase"; $self->{'data_source'} = "DBI:FB:dbname=$database;host=$host"; $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "varchar(8000000)"; $self->{'text'} = "varchar(8000000)"; $self->{'double_quotes'} = 1; # Can handle: 'Walker''s' -- cgit v1.2.1 From 7cbdd6de7eebbe76568d5de36b4457b9ffda5a84 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 5 Jul 2002 08:15:57 +0300 Subject: cleanup --- sql/item_subselect.h | 2 +- sql/sql_lex.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sql/item_subselect.h b/sql/item_subselect.h index 3f363df33df..88ea01f9c68 100644 --- a/sql/item_subselect.h +++ b/sql/item_subselect.h @@ -20,7 +20,7 @@ #pragma interface /* gcc class implementation */ #endif -struct st_select_lex; +class st_select_lex; class JOIN; class select_subselect; diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 470230c0999..af80b175cd3 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -236,7 +236,7 @@ private: bool create_total_list_n_last_return(THD *thd, st_lex *lex, TABLE_LIST ***result); }; -typedef struct st_select_lex_unit SELECT_LEX_UNIT; +typedef class st_select_lex_unit SELECT_LEX_UNIT; /* SELECT_LEX - store information of parsed SELECT_LEX statment @@ -284,7 +284,7 @@ public: friend void mysql_init_query(THD *thd); }; -typedef struct st_select_lex SELECT_LEX; +typedef class st_select_lex SELECT_LEX; class Set_option :public Sql_alloc { public: -- cgit v1.2.1 From d4e5d2dd3672ed0e9f8b968fb38b2972e03d155b Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 12 Jul 2002 13:12:32 +0500 Subject: Stupid bug has been fixed --- heap/hp_rfirst.c | 1 + heap/hp_rlast.c | 1 + 2 files changed, 2 insertions(+) diff --git a/heap/hp_rfirst.c b/heap/hp_rfirst.c index 39b0d4385f2..1668376ed1c 100644 --- a/heap/hp_rfirst.c +++ b/heap/hp_rfirst.c @@ -24,6 +24,7 @@ int heap_rfirst(HP_INFO *info, byte *record, int inx) HP_KEYDEF *keyinfo = share->keydef + inx; DBUG_ENTER("heap_rfirst"); + info->lastinx= inx; if (keyinfo->algorithm == HA_KEY_ALG_BTREE) { byte *pos; diff --git a/heap/hp_rlast.c b/heap/hp_rlast.c index e51a0e8a8f1..b1a49739108 100644 --- a/heap/hp_rlast.c +++ b/heap/hp_rlast.c @@ -25,6 +25,7 @@ int heap_rlast(HP_INFO *info, byte *record, int inx) HP_KEYDEF *keyinfo= share->keydef + inx; DBUG_ENTER("heap_rlast"); + info->lastinx= inx; if (keyinfo->algorithm == HA_KEY_ALG_BTREE) { byte *pos; -- cgit v1.2.1 From 2ed3a33855c1cc652c9d0ed3bf8de1636d5c61ce Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 20 Jul 2002 16:36:56 +0200 Subject: CREATE ... SELECT extension (WL 317) BitKeeper/etc/logging_ok: Logging to logging@openlogging.org accepted --- BitKeeper/etc/logging_ok | 1 + Docs/manual.texi | 18 ++++++++++++++++-- mysql-test/r/create.result | 18 ++++++++++++++++++ mysql-test/t/create.test | 16 ++++++++++++++++ sql/mysql_priv.h | 10 +++++++--- sql/sql_parse.cc | 2 +- sql/sql_table.cc | 45 ++++++++++++++++++++++++++++++++------------- 7 files changed, 91 insertions(+), 19 deletions(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index 457f314f1df..eccd185775f 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -70,3 +70,4 @@ zak@linux.local venu@myvenu.com walrus@mysql.com ram@ram.(none) +WAX@sergbook.mysql.com diff --git a/Docs/manual.texi b/Docs/manual.texi index 97a63abd8c5..c7d2095f601 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -35442,8 +35442,10 @@ mysql> CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT, This will create a @code{MyISAM} table with three columns, a, b, and c. Notice that the columns from the @code{SELECT} statement are appended to -the right side of the table, not overlapped onto it. Take the following -example: +the right side of the table, not overlapped onto it. +Still, the column from the @code{SELECT} will overlap the column from +the @code{CREATE} clause if they both have the same name. Take the following +examples: @example mysql> SELECT * FROM foo; @@ -35464,6 +35466,18 @@ mysql> SELECT * FROM bar; | NULL | 1 | +------+---+ 1 row in set (0.00 sec) + +mysql> CREATE TABLE foobar (n FLOAT(3,2), m INT) SELECT n FROM foo; +Query OK, 1 row affected (0.02 sec) +Records: 1 Duplicates: 0 Warnings: 0 + +mysql> SELECT * FROM foobar; ++------+------+ +| n | m | ++------+------+ +| 1.00 | NULL | ++------+------+ +1 row in set (0.00 sec) @end example For each row in table @code{foo}, a row is inserted in @code{bar} with diff --git a/mysql-test/r/create.result b/mysql-test/r/create.result index c3438ae211a..f9a3ef487f0 100644 --- a/mysql-test/r/create.result +++ b/mysql-test/r/create.result @@ -94,6 +94,24 @@ d date 0000-00-00 t time 00:00:00 dt datetime 0000-00-00 00:00:00 drop table t1,t2; +create table t1 (a tinyint); +create table t2 (a int) select * from t1; +describe t1; +Field Type Null Key Default Extra +a tinyint(4) YES NULL +describe t2; +Field Type Null Key Default Extra +a int(11) YES NULL +drop table if exists t2; +create table t2 (a int, a float) select * from t1; +Duplicate column name 'a' +drop table if exists t2; +create table t2 (a int) select a as b, a+1 as b from t1; +Duplicate column name 'b' +drop table if exists t2; +create table t2 (b int) select a as b, a+1 as b from t1; +Duplicate column name 'b' +drop table if exists t1,t2; create table t1 (a int not null, b int, primary key(a), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b)); show create table t1; Table Create Table diff --git a/mysql-test/t/create.test b/mysql-test/t/create.test index 99d4e5ae229..ac2f9cd5879 100644 --- a/mysql-test/t/create.test +++ b/mysql-test/t/create.test @@ -82,6 +82,22 @@ create table t2 select CAST("2001-12-29" AS DATE) as d, CAST("20:45:11" AS TIME) describe t2; drop table t1,t2; +# +# Test of CREATE ... SELECT with duplicate fields +# + +create table t1 (a tinyint); +create table t2 (a int) select * from t1; +describe t1; +describe t2; +drop table if exists t2; +!$1060 create table t2 (a int, a float) select * from t1; +drop table if exists t2; +!$1060 create table t2 (a int) select a as b, a+1 as b from t1; +drop table if exists t2; +!$1060 create table t2 (b int) select a as b, a+1 as b from t1; +drop table if exists t1,t2; + # # Test of primary key with 32 index # diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index c0371d1e90c..9fff4880573 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -382,9 +382,13 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, int mysql_create_table(THD *thd,const char *db, const char *table_name, HA_CREATE_INFO *create_info, List &fields, List &keys, - bool tmp_table, bool no_log); -// no_log is needed for the case of CREATE TABLE ... SELECT , as the logging -// will be done later in sql_insert.cc + bool tmp_table, bool no_log, uint select_field_count); +/* + no_log is needed for the case of CREATE ... SELECT, + as the logging will be done later in sql_insert.cc + select_field_count is also used for CREATE ... SELECT, + and must be zero for standart create of table +*/ TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info, const char *db, const char *name, diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index e006855105c..fef022ff513 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1598,7 +1598,7 @@ mysql_execute_command(void) res = mysql_create_table(thd,tables->db ? tables->db : thd->db, tables->real_name, &lex->create_info, lex->create_list, - lex->key_list,0, 0); // do logging + lex->key_list,0,0,0); // do logging if (!res) send_ok(&thd->net); } diff --git a/sql/sql_table.cc b/sql/sql_table.cc index d8012c0c102..3652b2512f4 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -70,7 +70,7 @@ int mysql_rm_table(THD *thd,TABLE_LIST *tables, my_bool if_exists) } error=mysql_rm_table_part2(thd,tables,if_exists,0); - err: + err: VOID(pthread_cond_broadcast(&COND_refresh)); // Signal to refresh pthread_mutex_unlock(&LOCK_open); @@ -209,7 +209,6 @@ int quick_rm_table(enum db_type base,const char *db, PRIMARY keys are prioritized. */ - static int sort_keys(KEY *a, KEY *b) { if (a->flags & HA_NOSAME) @@ -251,7 +250,8 @@ static int sort_keys(KEY *a, KEY *b) int mysql_create_table(THD *thd,const char *db, const char *table_name, HA_CREATE_INFO *create_info, List &fields, - List &keys,bool tmp_table,bool no_log) + List &keys,bool tmp_table,bool no_log, + uint select_field_count) { char path[FN_REFLEN]; const char *key_name; @@ -259,10 +259,11 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, int error= -1; uint db_options,field,null_fields,blob_columns; ulong pos; - KEY *key_info,*key_info_buffer; + KEY *key_info,*key_info_buffer; KEY_PART_INFO *key_part_info; int auto_increment=0; handler *file; + int field_no,dup_no; DBUG_ENTER("mysql_create_table"); /* @@ -275,6 +276,7 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, DBUG_RETURN(-1); } List_iterator it(fields),it2(fields); + int select_field_pos=fields.elements - select_field_count; null_fields=blob_columns=0; db_options=create_info->table_options; if (create_info->row_type == ROW_TYPE_DYNAMIC) @@ -288,10 +290,10 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, DBUG_RETURN(-1); } - /* Don't pack keys in old tables if the user has requested this */ - while ((sql_field=it++)) + for(field_no=0; (sql_field=it++) ; field_no++) { + /* Don't pack keys in old tables if the user has requested this */ if ((sql_field->flags & BLOB_FLAG) || sql_field->sql_type == FIELD_TYPE_VAR_STRING && create_info->row_type != ROW_TYPE_FIXED) @@ -300,14 +302,29 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, } if (!(sql_field->flags & NOT_NULL_FLAG)) null_fields++; - while ((dup_field=it2++) != sql_field) + for(dup_no=0; (dup_field=it2++) != sql_field; dup_no++) { - if (my_strcasecmp(system_charset_info, - sql_field->field_name, + if (my_strcasecmp(system_charset_info, + sql_field->field_name, dup_field->field_name) == 0) { - my_error(ER_DUP_FIELDNAME,MYF(0),sql_field->field_name); - DBUG_RETURN(-1); + if (field_no=select_field_pos) + { + my_error(ER_DUP_FIELDNAME,MYF(0),sql_field->field_name); + DBUG_RETURN(-1); + } + else + { + sql_field->length=dup_field->length; + sql_field->decimals=dup_field->decimals; + sql_field->flags=dup_field->flags; + sql_field->pack_length=dup_field->pack_length; + sql_field->unireg_check=dup_field->unireg_check; + sql_field->sql_type=dup_field->sql_type; + it2.remove(); + select_field_pos--; + break; + } } } it2.rewind(); @@ -793,6 +810,7 @@ TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info, TABLE tmp_table; // Used during 'create_field()' TABLE *table; tmp_table.table_name=0; + uint select_field_count=0; DBUG_ENTER("create_table_from_items"); /* Add selected items to field list */ @@ -826,11 +844,12 @@ TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info, (Field*) 0)))) DBUG_RETURN(0); extra_fields->push_back(cr_field); + select_field_count++; } /* create and lock table */ /* QQ: This should be done atomic ! */ if (mysql_create_table(thd,db,name,create_info,*extra_fields, - *keys,0,1)) // no logging + *keys,0,1,select_field_count)) // no logging DBUG_RETURN(0); if (!(table=open_table(thd,db,name,name,(bool*) 0))) { @@ -1719,7 +1738,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, if ((error=mysql_create_table(thd, new_db, tmp_name, create_info, - create_list,key_list,1,1))) // no logging + create_list,key_list,1,1,0))) // no logging DBUG_RETURN(error); if (table->tmp_table) -- cgit v1.2.1 From 8059cfabe04f97bc7acbf2b88de9306f1c5651cd Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 29 Jul 2002 17:34:20 +0500 Subject: Rows order has been made more explicit BitKeeper/etc/logging_ok: Logging to logging@openlogging.org accepted --- BitKeeper/etc/logging_ok | 1 + mysql-test/r/ctype_many.result | 510 ++++++++++++++++++++--------------------- mysql-test/t/ctype_many.test | 4 +- 3 files changed, 258 insertions(+), 257 deletions(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index eccd185775f..f318a1dc6ab 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -71,3 +71,4 @@ venu@myvenu.com walrus@mysql.com ram@ram.(none) WAX@sergbook.mysql.com +bar@bar.udmsearch.izhnet.ru diff --git a/mysql-test/r/ctype_many.result b/mysql-test/r/ctype_many.result index b6c0f25853d..7a09c008309 100644 --- a/mysql-test/r/ctype_many.result +++ b/mysql-test/r/ctype_many.result @@ -753,485 +753,485 @@ a a SELECT t11.comment,t12.comment FROM t1 t11,t1 t12 WHERE CONVERT(t11.koi8_ru_f USING utf8)=t12.utf8_f -ORDER BY t11.koi8_ru_f; +ORDER BY t11.koi8_ru_f,t11.comment,t12.comment; comment comment -LAT SMALL A LAT SMALL A -LAT SMALL A LAT CAPIT A -LAT CAPIT A LAT SMALL A LAT CAPIT A LAT CAPIT A -LAT SMALL B LAT CAPIT B -LAT CAPIT B LAT SMALL B +LAT CAPIT A LAT SMALL A +LAT SMALL A LAT CAPIT A +LAT SMALL A LAT SMALL A LAT CAPIT B LAT CAPIT B +LAT CAPIT B LAT SMALL B +LAT SMALL B LAT CAPIT B LAT SMALL B LAT SMALL B -LAT CAPIT C LAT SMALL C LAT CAPIT C LAT CAPIT C -LAT SMALL C LAT SMALL C +LAT CAPIT C LAT SMALL C LAT SMALL C LAT CAPIT C +LAT SMALL C LAT SMALL C LAT CAPIT D LAT CAPIT D -LAT SMALL D LAT SMALL D -LAT SMALL D LAT CAPIT D LAT CAPIT D LAT SMALL D -LAT SMALL E LAT SMALL E -LAT SMALL E LAT CAPIT E -LAT CAPIT E LAT SMALL E +LAT SMALL D LAT CAPIT D +LAT SMALL D LAT SMALL D LAT CAPIT E LAT CAPIT E -LAT SMALL F LAT SMALL F -LAT SMALL F LAT CAPIT F -LAT CAPIT F LAT SMALL F +LAT CAPIT E LAT SMALL E +LAT SMALL E LAT CAPIT E +LAT SMALL E LAT SMALL E LAT CAPIT F LAT CAPIT F -LAT SMALL G LAT CAPIT G -LAT CAPIT G LAT SMALL G +LAT CAPIT F LAT SMALL F +LAT SMALL F LAT CAPIT F +LAT SMALL F LAT SMALL F LAT CAPIT G LAT CAPIT G +LAT CAPIT G LAT SMALL G +LAT SMALL G LAT CAPIT G LAT SMALL G LAT SMALL G LAT CAPIT H LAT CAPIT H -LAT SMALL H LAT SMALL H -LAT SMALL H LAT CAPIT H LAT CAPIT H LAT SMALL H +LAT SMALL H LAT CAPIT H +LAT SMALL H LAT SMALL H LAT CAPIT I LAT CAPIT I -LAT SMALL I LAT SMALL I -LAT SMALL I LAT CAPIT I LAT CAPIT I LAT SMALL I -LAT SMALL J LAT SMALL J -LAT SMALL J LAT CAPIT J -LAT CAPIT J LAT SMALL J +LAT SMALL I LAT CAPIT I +LAT SMALL I LAT SMALL I LAT CAPIT J LAT CAPIT J -LAT SMALL K LAT CAPIT K -LAT CAPIT K LAT SMALL K +LAT CAPIT J LAT SMALL J +LAT SMALL J LAT CAPIT J +LAT SMALL J LAT SMALL J LAT CAPIT K LAT CAPIT K +LAT CAPIT K LAT SMALL K +LAT SMALL K LAT CAPIT K LAT SMALL K LAT SMALL K -LAT SMALL L LAT CAPIT L -LAT CAPIT L LAT SMALL L LAT CAPIT L LAT CAPIT L +LAT CAPIT L LAT SMALL L +LAT SMALL L LAT CAPIT L LAT SMALL L LAT SMALL L LAT CAPIT M LAT CAPIT M -LAT SMALL M LAT SMALL M -LAT SMALL M LAT CAPIT M LAT CAPIT M LAT SMALL M -LAT SMALL N LAT SMALL N -LAT SMALL N LAT CAPIT N -LAT CAPIT N LAT SMALL N +LAT SMALL M LAT CAPIT M +LAT SMALL M LAT SMALL M LAT CAPIT N LAT CAPIT N -LAT SMALL O LAT SMALL O -LAT SMALL O LAT CAPIT O -LAT CAPIT O LAT SMALL O +LAT CAPIT N LAT SMALL N +LAT SMALL N LAT CAPIT N +LAT SMALL N LAT SMALL N LAT CAPIT O LAT CAPIT O -LAT SMALL P LAT CAPIT P -LAT CAPIT P LAT SMALL P +LAT CAPIT O LAT SMALL O +LAT SMALL O LAT CAPIT O +LAT SMALL O LAT SMALL O LAT CAPIT P LAT CAPIT P +LAT CAPIT P LAT SMALL P +LAT SMALL P LAT CAPIT P LAT SMALL P LAT SMALL P -LAT CAPIT Q LAT SMALL Q LAT CAPIT Q LAT CAPIT Q -LAT SMALL Q LAT SMALL Q +LAT CAPIT Q LAT SMALL Q LAT SMALL Q LAT CAPIT Q +LAT SMALL Q LAT SMALL Q LAT CAPIT R LAT CAPIT R -LAT SMALL R LAT SMALL R -LAT SMALL R LAT CAPIT R LAT CAPIT R LAT SMALL R -LAT SMALL S LAT SMALL S -LAT SMALL S LAT CAPIT S -LAT CAPIT S LAT SMALL S +LAT SMALL R LAT CAPIT R +LAT SMALL R LAT SMALL R LAT CAPIT S LAT CAPIT S -LAT SMALL T LAT CAPIT T -LAT CAPIT T LAT SMALL T +LAT CAPIT S LAT SMALL S +LAT SMALL S LAT CAPIT S +LAT SMALL S LAT SMALL S LAT CAPIT T LAT CAPIT T +LAT CAPIT T LAT SMALL T +LAT SMALL T LAT CAPIT T LAT SMALL T LAT SMALL T -LAT SMALL U LAT CAPIT U -LAT CAPIT U LAT SMALL U LAT CAPIT U LAT CAPIT U +LAT CAPIT U LAT SMALL U +LAT SMALL U LAT CAPIT U LAT SMALL U LAT SMALL U LAT CAPIT V LAT CAPIT V -LAT SMALL V LAT SMALL V -LAT SMALL V LAT CAPIT V LAT CAPIT V LAT SMALL V +LAT SMALL V LAT CAPIT V +LAT SMALL V LAT SMALL V LAT CAPIT W LAT CAPIT W -LAT SMALL W LAT SMALL W -LAT SMALL W LAT CAPIT W LAT CAPIT W LAT SMALL W -LAT SMALL X LAT SMALL X -LAT SMALL X LAT CAPIT X -LAT CAPIT X LAT SMALL X +LAT SMALL W LAT CAPIT W +LAT SMALL W LAT SMALL W LAT CAPIT X LAT CAPIT X -LAT SMALL Y LAT CAPIT Y -LAT CAPIT Y LAT SMALL Y +LAT CAPIT X LAT SMALL X +LAT SMALL X LAT CAPIT X +LAT SMALL X LAT SMALL X LAT CAPIT Y LAT CAPIT Y +LAT CAPIT Y LAT SMALL Y +LAT SMALL Y LAT CAPIT Y LAT SMALL Y LAT SMALL Y -LAT CAPIT Z LAT SMALL Z LAT CAPIT Z LAT CAPIT Z -LAT SMALL Z LAT SMALL Z +LAT CAPIT Z LAT SMALL Z LAT SMALL Z LAT CAPIT Z +LAT SMALL Z LAT SMALL Z +CYR CAPIT A CYR CAPIT A CYR CAPIT A CYR SMALL A CYR SMALL A CYR CAPIT A -CYR CAPIT A CYR CAPIT A CYR SMALL A CYR SMALL A -CYR SMALL BE CYR CAPIT BE CYR CAPIT BE CYR CAPIT BE -CYR SMALL BE CYR SMALL BE CYR CAPIT BE CYR SMALL BE +CYR SMALL BE CYR CAPIT BE +CYR SMALL BE CYR SMALL BE CYR CAPIT VE CYR CAPIT VE -CYR SMALL VE CYR SMALL VE CYR CAPIT VE CYR SMALL VE CYR SMALL VE CYR CAPIT VE +CYR SMALL VE CYR SMALL VE CYR CAPIT GE CYR CAPIT GE -CYR SMALL GE CYR SMALL GE CYR CAPIT GE CYR SMALL GE CYR SMALL GE CYR CAPIT GE +CYR SMALL GE CYR SMALL GE +CYR CAPIT DE CYR CAPIT DE CYR CAPIT DE CYR SMALL DE CYR SMALL DE CYR CAPIT DE -CYR CAPIT DE CYR CAPIT DE CYR SMALL DE CYR SMALL DE -CYR SMALL IE CYR SMALL IO -CYR SMALL IE CYR CAPIT IE -CYR CAPIT IE CYR SMALL IE +CYR CAPIT IE CYR CAPIT IE CYR CAPIT IE CYR CAPIT IO -CYR SMALL IE CYR SMALL IE -CYR SMALL IE CYR CAPIT IO +CYR CAPIT IE CYR SMALL IE CYR CAPIT IE CYR SMALL IO -CYR CAPIT IE CYR CAPIT IE -CYR SMALL IO CYR SMALL IE -CYR SMALL IO CYR CAPIT IO -CYR CAPIT IO CYR SMALL IO +CYR SMALL IE CYR CAPIT IE +CYR SMALL IE CYR CAPIT IO +CYR SMALL IE CYR SMALL IE +CYR SMALL IE CYR SMALL IO CYR CAPIT IO CYR CAPIT IE -CYR SMALL IO CYR SMALL IO -CYR SMALL IO CYR CAPIT IE -CYR CAPIT IO CYR SMALL IE CYR CAPIT IO CYR CAPIT IO +CYR CAPIT IO CYR SMALL IE +CYR CAPIT IO CYR SMALL IO +CYR SMALL IO CYR CAPIT IE +CYR SMALL IO CYR CAPIT IO +CYR SMALL IO CYR SMALL IE +CYR SMALL IO CYR SMALL IO +CYR CAPIT ZHE CYR CAPIT ZHE CYR CAPIT ZHE CYR SMALL ZHE CYR SMALL ZHE CYR CAPIT ZHE -CYR CAPIT ZHE CYR CAPIT ZHE CYR SMALL ZHE CYR SMALL ZHE -CYR SMALL ZE CYR CAPIT ZE CYR CAPIT ZE CYR CAPIT ZE -CYR SMALL ZE CYR SMALL ZE CYR CAPIT ZE CYR SMALL ZE +CYR SMALL ZE CYR CAPIT ZE +CYR SMALL ZE CYR SMALL ZE CYR CAPIT I CYR CAPIT I -CYR SMALL I CYR SMALL I CYR CAPIT I CYR SMALL I CYR SMALL I CYR CAPIT I +CYR SMALL I CYR SMALL I CYR CAPIT KA CYR CAPIT KA -CYR SMALL KA CYR SMALL KA CYR CAPIT KA CYR SMALL KA CYR SMALL KA CYR CAPIT KA +CYR SMALL KA CYR SMALL KA +CYR CAPIT EL CYR CAPIT EL CYR CAPIT EL CYR SMALL EL CYR SMALL EL CYR CAPIT EL -CYR CAPIT EL CYR CAPIT EL CYR SMALL EL CYR SMALL EL +CYR CAPIT EM CYR CAPIT EM CYR CAPIT EM CYR SMALL EM CYR SMALL EM CYR CAPIT EM -CYR CAPIT EM CYR CAPIT EM CYR SMALL EM CYR SMALL EM -CYR SMALL EN CYR CAPIT EN CYR CAPIT EN CYR CAPIT EN -CYR SMALL EN CYR SMALL EN CYR CAPIT EN CYR SMALL EN +CYR SMALL EN CYR CAPIT EN +CYR SMALL EN CYR SMALL EN CYR CAPIT O CYR CAPIT O -CYR SMALL O CYR SMALL O CYR CAPIT O CYR SMALL O CYR SMALL O CYR CAPIT O -CYR SMALL PE CYR SMALL PE +CYR SMALL O CYR SMALL O +CYR CAPIT PE CYR CAPIT PE CYR CAPIT PE CYR SMALL PE CYR SMALL PE CYR CAPIT PE -CYR CAPIT PE CYR CAPIT PE +CYR SMALL PE CYR SMALL PE +CYR CAPIT ER CYR CAPIT ER CYR CAPIT ER CYR SMALL ER CYR SMALL ER CYR CAPIT ER -CYR CAPIT ER CYR CAPIT ER CYR SMALL ER CYR SMALL ER -CYR SMALL ES CYR CAPIT ES CYR CAPIT ES CYR CAPIT ES -CYR SMALL ES CYR SMALL ES CYR CAPIT ES CYR SMALL ES +CYR SMALL ES CYR CAPIT ES +CYR SMALL ES CYR SMALL ES CYR CAPIT TE CYR CAPIT TE -CYR SMALL TE CYR SMALL TE CYR CAPIT TE CYR SMALL TE CYR SMALL TE CYR CAPIT TE +CYR SMALL TE CYR SMALL TE CYR CAPIT U CYR CAPIT U -CYR SMALL U CYR SMALL U CYR CAPIT U CYR SMALL U CYR SMALL U CYR CAPIT U +CYR SMALL U CYR SMALL U +CYR CAPIT EF CYR CAPIT EF CYR CAPIT EF CYR SMALL EF CYR SMALL EF CYR CAPIT EF -CYR CAPIT EF CYR CAPIT EF CYR SMALL EF CYR SMALL EF +CYR CAPIT HA CYR CAPIT HA CYR CAPIT HA CYR SMALL HA CYR SMALL HA CYR CAPIT HA -CYR CAPIT HA CYR CAPIT HA CYR SMALL HA CYR SMALL HA -CYR SMALL TSE CYR CAPIT TSE CYR CAPIT TSE CYR CAPIT TSE -CYR SMALL TSE CYR SMALL TSE CYR CAPIT TSE CYR SMALL TSE +CYR SMALL TSE CYR CAPIT TSE +CYR SMALL TSE CYR SMALL TSE CYR CAPIT CHE CYR CAPIT CHE -CYR SMALL CHE CYR SMALL CHE CYR CAPIT CHE CYR SMALL CHE CYR SMALL CHE CYR CAPIT CHE +CYR SMALL CHE CYR SMALL CHE CYR CAPIT SHA CYR CAPIT SHA -CYR SMALL SHA CYR SMALL SHA CYR CAPIT SHA CYR SMALL SHA CYR SMALL SHA CYR CAPIT SHA +CYR SMALL SHA CYR SMALL SHA +CYR CAPIT SCHA CYR CAPIT SCHA CYR CAPIT SCHA CYR SMALL SCHA CYR SMALL SCHA CYR CAPIT SCHA -CYR CAPIT SCHA CYR CAPIT SCHA CYR SMALL SCHA CYR SMALL SCHA +CYR CAPIT HARD SIGN CYR CAPIT HARD SIGN CYR CAPIT HARD SIGN CYR SMALL HARD SIGN CYR SMALL HARD SIGN CYR CAPIT HARD SIGN -CYR CAPIT HARD SIGN CYR CAPIT HARD SIGN CYR SMALL HARD SIGN CYR SMALL HARD SIGN CYR CAPIT YERU CYR CAPIT YERU -CYR SMALL YERU CYR SMALL YERU CYR CAPIT YERU CYR SMALL YERU CYR SMALL YERU CYR CAPIT YERU +CYR SMALL YERU CYR SMALL YERU CYR CAPIT SOFT SIGN CYR CAPIT SOFT SIGN -CYR SMALL SOFT SIGN CYR SMALL SOFT SIGN CYR CAPIT SOFT SIGN CYR SMALL SOFT SIGN CYR SMALL SOFT SIGN CYR CAPIT SOFT SIGN +CYR SMALL SOFT SIGN CYR SMALL SOFT SIGN +CYR CAPIT E CYR CAPIT E CYR CAPIT E CYR SMALL E CYR SMALL E CYR CAPIT E -CYR CAPIT E CYR CAPIT E CYR SMALL E CYR SMALL E +CYR CAPIT YU CYR CAPIT YU CYR CAPIT YU CYR SMALL YU CYR SMALL YU CYR CAPIT YU -CYR CAPIT YU CYR CAPIT YU CYR SMALL YU CYR SMALL YU -CYR SMALL YA CYR CAPIT YA CYR CAPIT YA CYR CAPIT YA -CYR SMALL YA CYR SMALL YA CYR CAPIT YA CYR SMALL YA +CYR SMALL YA CYR CAPIT YA +CYR SMALL YA CYR SMALL YA SELECT t11.comment,t12.comment FROM t1 t11,t1 t12 WHERE t11.koi8_ru_f=CONVERT(t12.utf8_f USING koi8_ru) -ORDER BY t12.utf8_f; +ORDER BY t12.utf8_f,t11.comment,t12.comment; comment comment -LAT SMALL A LAT SMALL A -LAT SMALL A LAT CAPIT A -LAT CAPIT A LAT SMALL A LAT CAPIT A LAT CAPIT A -LAT SMALL B LAT CAPIT B -LAT CAPIT B LAT SMALL B +LAT CAPIT A LAT SMALL A +LAT SMALL A LAT CAPIT A +LAT SMALL A LAT SMALL A LAT CAPIT B LAT CAPIT B +LAT CAPIT B LAT SMALL B +LAT SMALL B LAT CAPIT B LAT SMALL B LAT SMALL B -LAT CAPIT C LAT SMALL C LAT CAPIT C LAT CAPIT C -LAT SMALL C LAT SMALL C +LAT CAPIT C LAT SMALL C LAT SMALL C LAT CAPIT C +LAT SMALL C LAT SMALL C LAT CAPIT D LAT CAPIT D -LAT SMALL D LAT SMALL D -LAT SMALL D LAT CAPIT D LAT CAPIT D LAT SMALL D -LAT SMALL E LAT SMALL E -LAT SMALL E LAT CAPIT E -LAT CAPIT E LAT SMALL E +LAT SMALL D LAT CAPIT D +LAT SMALL D LAT SMALL D LAT CAPIT E LAT CAPIT E -LAT SMALL F LAT SMALL F -LAT SMALL F LAT CAPIT F -LAT CAPIT F LAT SMALL F +LAT CAPIT E LAT SMALL E +LAT SMALL E LAT CAPIT E +LAT SMALL E LAT SMALL E LAT CAPIT F LAT CAPIT F -LAT SMALL G LAT CAPIT G -LAT CAPIT G LAT SMALL G +LAT CAPIT F LAT SMALL F +LAT SMALL F LAT CAPIT F +LAT SMALL F LAT SMALL F LAT CAPIT G LAT CAPIT G +LAT CAPIT G LAT SMALL G +LAT SMALL G LAT CAPIT G LAT SMALL G LAT SMALL G LAT CAPIT H LAT CAPIT H -LAT SMALL H LAT SMALL H -LAT SMALL H LAT CAPIT H LAT CAPIT H LAT SMALL H +LAT SMALL H LAT CAPIT H +LAT SMALL H LAT SMALL H LAT CAPIT I LAT CAPIT I -LAT SMALL I LAT SMALL I -LAT SMALL I LAT CAPIT I LAT CAPIT I LAT SMALL I -LAT SMALL J LAT SMALL J -LAT SMALL J LAT CAPIT J -LAT CAPIT J LAT SMALL J +LAT SMALL I LAT CAPIT I +LAT SMALL I LAT SMALL I LAT CAPIT J LAT CAPIT J -LAT SMALL K LAT CAPIT K -LAT CAPIT K LAT SMALL K +LAT CAPIT J LAT SMALL J +LAT SMALL J LAT CAPIT J +LAT SMALL J LAT SMALL J LAT CAPIT K LAT CAPIT K +LAT CAPIT K LAT SMALL K +LAT SMALL K LAT CAPIT K LAT SMALL K LAT SMALL K -LAT SMALL L LAT CAPIT L -LAT CAPIT L LAT SMALL L LAT CAPIT L LAT CAPIT L +LAT CAPIT L LAT SMALL L +LAT SMALL L LAT CAPIT L LAT SMALL L LAT SMALL L LAT CAPIT M LAT CAPIT M -LAT SMALL M LAT SMALL M -LAT SMALL M LAT CAPIT M LAT CAPIT M LAT SMALL M -LAT SMALL N LAT SMALL N -LAT SMALL N LAT CAPIT N -LAT CAPIT N LAT SMALL N +LAT SMALL M LAT CAPIT M +LAT SMALL M LAT SMALL M LAT CAPIT N LAT CAPIT N -LAT SMALL O LAT SMALL O -LAT SMALL O LAT CAPIT O -LAT CAPIT O LAT SMALL O +LAT CAPIT N LAT SMALL N +LAT SMALL N LAT CAPIT N +LAT SMALL N LAT SMALL N LAT CAPIT O LAT CAPIT O -LAT SMALL P LAT CAPIT P -LAT CAPIT P LAT SMALL P +LAT CAPIT O LAT SMALL O +LAT SMALL O LAT CAPIT O +LAT SMALL O LAT SMALL O LAT CAPIT P LAT CAPIT P +LAT CAPIT P LAT SMALL P +LAT SMALL P LAT CAPIT P LAT SMALL P LAT SMALL P -LAT CAPIT Q LAT SMALL Q LAT CAPIT Q LAT CAPIT Q -LAT SMALL Q LAT SMALL Q +LAT CAPIT Q LAT SMALL Q LAT SMALL Q LAT CAPIT Q +LAT SMALL Q LAT SMALL Q LAT CAPIT R LAT CAPIT R -LAT SMALL R LAT SMALL R -LAT SMALL R LAT CAPIT R LAT CAPIT R LAT SMALL R -LAT SMALL S LAT SMALL S -LAT SMALL S LAT CAPIT S -LAT CAPIT S LAT SMALL S +LAT SMALL R LAT CAPIT R +LAT SMALL R LAT SMALL R LAT CAPIT S LAT CAPIT S -LAT SMALL T LAT CAPIT T -LAT CAPIT T LAT SMALL T +LAT CAPIT S LAT SMALL S +LAT SMALL S LAT CAPIT S +LAT SMALL S LAT SMALL S LAT CAPIT T LAT CAPIT T +LAT CAPIT T LAT SMALL T +LAT SMALL T LAT CAPIT T LAT SMALL T LAT SMALL T -LAT SMALL U LAT CAPIT U -LAT CAPIT U LAT SMALL U LAT CAPIT U LAT CAPIT U +LAT CAPIT U LAT SMALL U +LAT SMALL U LAT CAPIT U LAT SMALL U LAT SMALL U LAT CAPIT V LAT CAPIT V -LAT SMALL V LAT SMALL V -LAT SMALL V LAT CAPIT V LAT CAPIT V LAT SMALL V +LAT SMALL V LAT CAPIT V +LAT SMALL V LAT SMALL V LAT CAPIT W LAT CAPIT W -LAT SMALL W LAT SMALL W -LAT SMALL W LAT CAPIT W LAT CAPIT W LAT SMALL W -LAT SMALL X LAT SMALL X -LAT SMALL X LAT CAPIT X -LAT CAPIT X LAT SMALL X +LAT SMALL W LAT CAPIT W +LAT SMALL W LAT SMALL W LAT CAPIT X LAT CAPIT X -LAT SMALL Y LAT CAPIT Y -LAT CAPIT Y LAT SMALL Y +LAT CAPIT X LAT SMALL X +LAT SMALL X LAT CAPIT X +LAT SMALL X LAT SMALL X LAT CAPIT Y LAT CAPIT Y +LAT CAPIT Y LAT SMALL Y +LAT SMALL Y LAT CAPIT Y LAT SMALL Y LAT SMALL Y -LAT CAPIT Z LAT SMALL Z LAT CAPIT Z LAT CAPIT Z -LAT SMALL Z LAT SMALL Z +LAT CAPIT Z LAT SMALL Z LAT SMALL Z LAT CAPIT Z -CYR CAPIT A CYR SMALL A +LAT SMALL Z LAT SMALL Z CYR CAPIT A CYR CAPIT A -CYR SMALL A CYR SMALL A +CYR CAPIT A CYR SMALL A CYR SMALL A CYR CAPIT A -CYR SMALL BE CYR SMALL BE -CYR SMALL BE CYR CAPIT BE -CYR CAPIT BE CYR SMALL BE +CYR SMALL A CYR SMALL A CYR CAPIT BE CYR CAPIT BE -CYR SMALL VE CYR SMALL VE -CYR SMALL VE CYR CAPIT VE -CYR CAPIT VE CYR SMALL VE +CYR CAPIT BE CYR SMALL BE +CYR SMALL BE CYR CAPIT BE +CYR SMALL BE CYR SMALL BE CYR CAPIT VE CYR CAPIT VE -CYR SMALL GE CYR SMALL GE -CYR SMALL GE CYR CAPIT GE -CYR CAPIT GE CYR SMALL GE +CYR CAPIT VE CYR SMALL VE +CYR SMALL VE CYR CAPIT VE +CYR SMALL VE CYR SMALL VE CYR CAPIT GE CYR CAPIT GE -CYR CAPIT DE CYR SMALL DE +CYR CAPIT GE CYR SMALL GE +CYR SMALL GE CYR CAPIT GE +CYR SMALL GE CYR SMALL GE CYR CAPIT DE CYR CAPIT DE -CYR SMALL DE CYR SMALL DE +CYR CAPIT DE CYR SMALL DE CYR SMALL DE CYR CAPIT DE -CYR CAPIT IE CYR SMALL IE +CYR SMALL DE CYR SMALL DE CYR CAPIT IE CYR CAPIT IE -CYR SMALL IO CYR SMALL IO -CYR SMALL IO CYR CAPIT IO -CYR SMALL IE CYR SMALL IE -CYR SMALL IE CYR CAPIT IE -CYR CAPIT IO CYR SMALL IO +CYR CAPIT IE CYR SMALL IE CYR CAPIT IO CYR CAPIT IO -CYR SMALL ZHE CYR SMALL ZHE -CYR SMALL ZHE CYR CAPIT ZHE -CYR CAPIT ZHE CYR SMALL ZHE +CYR CAPIT IO CYR SMALL IO +CYR SMALL IE CYR CAPIT IE +CYR SMALL IE CYR SMALL IE +CYR SMALL IO CYR CAPIT IO +CYR SMALL IO CYR SMALL IO CYR CAPIT ZHE CYR CAPIT ZHE -CYR CAPIT ZE CYR SMALL ZE +CYR CAPIT ZHE CYR SMALL ZHE +CYR SMALL ZHE CYR CAPIT ZHE +CYR SMALL ZHE CYR SMALL ZHE CYR CAPIT ZE CYR CAPIT ZE -CYR SMALL ZE CYR SMALL ZE +CYR CAPIT ZE CYR SMALL ZE CYR SMALL ZE CYR CAPIT ZE -CYR CAPIT I CYR SMALL I +CYR SMALL ZE CYR SMALL ZE CYR CAPIT I CYR CAPIT I -CYR SMALL I CYR SMALL I +CYR CAPIT I CYR SMALL I CYR SMALL I CYR CAPIT I -CYR SMALL KA CYR SMALL KA -CYR SMALL KA CYR CAPIT KA -CYR CAPIT KA CYR SMALL KA +CYR SMALL I CYR SMALL I CYR CAPIT KA CYR CAPIT KA -CYR SMALL EL CYR SMALL EL -CYR SMALL EL CYR CAPIT EL -CYR CAPIT EL CYR SMALL EL +CYR CAPIT KA CYR SMALL KA +CYR SMALL KA CYR CAPIT KA +CYR SMALL KA CYR SMALL KA CYR CAPIT EL CYR CAPIT EL -CYR SMALL EM CYR SMALL EM -CYR SMALL EM CYR CAPIT EM -CYR CAPIT EM CYR SMALL EM +CYR CAPIT EL CYR SMALL EL +CYR SMALL EL CYR CAPIT EL +CYR SMALL EL CYR SMALL EL CYR CAPIT EM CYR CAPIT EM -CYR CAPIT EN CYR SMALL EN +CYR CAPIT EM CYR SMALL EM +CYR SMALL EM CYR CAPIT EM +CYR SMALL EM CYR SMALL EM CYR CAPIT EN CYR CAPIT EN -CYR SMALL EN CYR SMALL EN +CYR CAPIT EN CYR SMALL EN CYR SMALL EN CYR CAPIT EN -CYR CAPIT O CYR SMALL O +CYR SMALL EN CYR SMALL EN CYR CAPIT O CYR CAPIT O -CYR SMALL O CYR SMALL O +CYR CAPIT O CYR SMALL O CYR SMALL O CYR CAPIT O -CYR SMALL PE CYR SMALL PE -CYR SMALL PE CYR CAPIT PE -CYR CAPIT PE CYR SMALL PE +CYR SMALL O CYR SMALL O CYR CAPIT PE CYR CAPIT PE -CYR SMALL ER CYR SMALL ER -CYR SMALL ER CYR CAPIT ER -CYR CAPIT ER CYR SMALL ER +CYR CAPIT PE CYR SMALL PE +CYR SMALL PE CYR CAPIT PE +CYR SMALL PE CYR SMALL PE CYR CAPIT ER CYR CAPIT ER -CYR SMALL ES CYR SMALL ES -CYR SMALL ES CYR CAPIT ES -CYR CAPIT ES CYR SMALL ES +CYR CAPIT ER CYR SMALL ER +CYR SMALL ER CYR CAPIT ER +CYR SMALL ER CYR SMALL ER CYR CAPIT ES CYR CAPIT ES -CYR CAPIT TE CYR SMALL TE +CYR CAPIT ES CYR SMALL ES +CYR SMALL ES CYR CAPIT ES +CYR SMALL ES CYR SMALL ES CYR CAPIT TE CYR CAPIT TE -CYR SMALL TE CYR SMALL TE +CYR CAPIT TE CYR SMALL TE CYR SMALL TE CYR CAPIT TE -CYR SMALL U CYR SMALL U -CYR SMALL U CYR CAPIT U -CYR CAPIT U CYR SMALL U +CYR SMALL TE CYR SMALL TE CYR CAPIT U CYR CAPIT U -CYR SMALL EF CYR SMALL EF -CYR SMALL EF CYR CAPIT EF -CYR CAPIT EF CYR SMALL EF +CYR CAPIT U CYR SMALL U +CYR SMALL U CYR CAPIT U +CYR SMALL U CYR SMALL U CYR CAPIT EF CYR CAPIT EF -CYR SMALL HA CYR SMALL HA -CYR SMALL HA CYR CAPIT HA -CYR CAPIT HA CYR SMALL HA +CYR CAPIT EF CYR SMALL EF +CYR SMALL EF CYR CAPIT EF +CYR SMALL EF CYR SMALL EF CYR CAPIT HA CYR CAPIT HA -CYR CAPIT TSE CYR SMALL TSE +CYR CAPIT HA CYR SMALL HA +CYR SMALL HA CYR CAPIT HA +CYR SMALL HA CYR SMALL HA CYR CAPIT TSE CYR CAPIT TSE -CYR SMALL TSE CYR SMALL TSE +CYR CAPIT TSE CYR SMALL TSE CYR SMALL TSE CYR CAPIT TSE -CYR CAPIT CHE CYR SMALL CHE +CYR SMALL TSE CYR SMALL TSE CYR CAPIT CHE CYR CAPIT CHE -CYR SMALL CHE CYR SMALL CHE +CYR CAPIT CHE CYR SMALL CHE CYR SMALL CHE CYR CAPIT CHE -CYR SMALL SHA CYR SMALL SHA -CYR SMALL SHA CYR CAPIT SHA -CYR CAPIT SHA CYR SMALL SHA +CYR SMALL CHE CYR SMALL CHE CYR CAPIT SHA CYR CAPIT SHA -CYR SMALL SCHA CYR SMALL SCHA -CYR SMALL SCHA CYR CAPIT SCHA -CYR CAPIT SCHA CYR SMALL SCHA +CYR CAPIT SHA CYR SMALL SHA +CYR SMALL SHA CYR CAPIT SHA +CYR SMALL SHA CYR SMALL SHA CYR CAPIT SCHA CYR CAPIT SCHA -CYR SMALL HARD SIGN CYR SMALL HARD SIGN -CYR SMALL HARD SIGN CYR CAPIT HARD SIGN -CYR CAPIT HARD SIGN CYR SMALL HARD SIGN +CYR CAPIT SCHA CYR SMALL SCHA +CYR SMALL SCHA CYR CAPIT SCHA +CYR SMALL SCHA CYR SMALL SCHA CYR CAPIT HARD SIGN CYR CAPIT HARD SIGN -CYR CAPIT YERU CYR SMALL YERU +CYR CAPIT HARD SIGN CYR SMALL HARD SIGN +CYR SMALL HARD SIGN CYR CAPIT HARD SIGN +CYR SMALL HARD SIGN CYR SMALL HARD SIGN CYR CAPIT YERU CYR CAPIT YERU -CYR SMALL YERU CYR SMALL YERU +CYR CAPIT YERU CYR SMALL YERU CYR SMALL YERU CYR CAPIT YERU -CYR CAPIT SOFT SIGN CYR SMALL SOFT SIGN +CYR SMALL YERU CYR SMALL YERU CYR CAPIT SOFT SIGN CYR CAPIT SOFT SIGN -CYR SMALL SOFT SIGN CYR SMALL SOFT SIGN +CYR CAPIT SOFT SIGN CYR SMALL SOFT SIGN CYR SMALL SOFT SIGN CYR CAPIT SOFT SIGN -CYR SMALL E CYR SMALL E -CYR SMALL E CYR CAPIT E -CYR CAPIT E CYR SMALL E +CYR SMALL SOFT SIGN CYR SMALL SOFT SIGN CYR CAPIT E CYR CAPIT E -CYR SMALL YU CYR SMALL YU -CYR SMALL YU CYR CAPIT YU -CYR CAPIT YU CYR SMALL YU +CYR CAPIT E CYR SMALL E +CYR SMALL E CYR CAPIT E +CYR SMALL E CYR SMALL E CYR CAPIT YU CYR CAPIT YU -CYR CAPIT YA CYR SMALL YA +CYR CAPIT YU CYR SMALL YU +CYR SMALL YU CYR CAPIT YU +CYR SMALL YU CYR SMALL YU CYR CAPIT YA CYR CAPIT YA -CYR SMALL YA CYR SMALL YA +CYR CAPIT YA CYR SMALL YA CYR SMALL YA CYR CAPIT YA +CYR SMALL YA CYR SMALL YA ALTER TABLE t1 ADD ucs2_f CHAR(32) CHARACTER SET ucs2 NOT NULL; INSERT INTO t1 (ucs2_f,comment) VALUES (0x0391,'GREEK CAPIT ALPHA'); INSERT INTO t1 (ucs2_f,comment) VALUES (0x0392,'GREEK CAPIT BETA'); diff --git a/mysql-test/t/ctype_many.test b/mysql-test/t/ctype_many.test index 7db8f49919b..572784b8d34 100644 --- a/mysql-test/t/ctype_many.test +++ b/mysql-test/t/ctype_many.test @@ -147,12 +147,12 @@ SELECT lower(utf8_f) FROM t1 ORDER BY 1 DESC; SELECT t11.comment,t12.comment FROM t1 t11,t1 t12 WHERE CONVERT(t11.koi8_ru_f USING utf8)=t12.utf8_f -ORDER BY t11.koi8_ru_f; +ORDER BY t11.koi8_ru_f,t11.comment,t12.comment; SELECT t11.comment,t12.comment FROM t1 t11,t1 t12 WHERE t11.koi8_ru_f=CONVERT(t12.utf8_f USING koi8_ru) -ORDER BY t12.utf8_f; +ORDER BY t12.utf8_f,t11.comment,t12.comment; ALTER TABLE t1 ADD ucs2_f CHAR(32) CHARACTER SET ucs2 NOT NULL; -- cgit v1.2.1 From ebdc990b69455548fa412a22286b302f0c1a1322 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 30 Jul 2002 11:03:08 +0500 Subject: move _print_charset to proper place --- mysys/charset.c | 38 -------------------------------------- mysys/test_charset.c | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 39 deletions(-) diff --git a/mysys/charset.c b/mysys/charset.c index 94cd1d9f9f8..0178f346dbe 100644 --- a/mysys/charset.c +++ b/mysys/charset.c @@ -634,41 +634,3 @@ char * list_charsets(myf want_flags) return p; } - -/**************************************************************************** -* Code for debugging. -****************************************************************************/ - - -static void _print_array(uint8 *data, uint size) -{ - uint i; - for (i = 0; i < size; ++i) - { - if (i == 0 || i % 16 == size % 16) printf(" "); - printf(" %02x", data[i]); - if ((i+1) % 16 == size % 16) printf("\n"); - } -} - -/* _print_csinfo is called from test_charset.c */ -void _print_csinfo(CHARSET_INFO *cs) -{ - printf("%s #%d\n", cs->name, cs->number); - printf("ctype:\n"); _print_array(cs->ctype, 257); - printf("to_lower:\n"); _print_array(cs->to_lower, 256); - printf("to_upper:\n"); _print_array(cs->to_upper, 256); - printf("sort_order:\n"); _print_array(cs->sort_order, 256); - printf("collate: %3s (%d, %p, %p, %p)\n", - cs->strxfrm_multiply ? "yes" : "no", - cs->strxfrm_multiply, - cs->strnncoll, - cs->strnxfrm, - cs->like_range); - printf("multi-byte: %3s (%d, %p, %p, %p)\n", - cs->mbmaxlen ? "yes" : "no", - cs->mbmaxlen, - cs->ismbchar, - cs->ismbhead, - cs->mbcharlen); -} diff --git a/mysys/test_charset.c b/mysys/test_charset.c index 224a4120614..5e623584355 100644 --- a/mysys/test_charset.c +++ b/mysys/test_charset.c @@ -21,7 +21,38 @@ #include -extern void _print_csinfo(CHARSET_INFO *cs); +static void _print_array(uint8 *data, uint size) +{ + uint i; + for (i = 0; i < size; ++i) + { + if (i == 0 || i % 16 == size % 16) printf(" "); + printf(" %02x", data[i]); + if ((i+1) % 16 == size % 16) printf("\n"); + } +} + +static void _print_csinfo(CHARSET_INFO *cs) +{ + printf("%s #%d\n", cs->name, cs->number); + printf("ctype:\n"); _print_array(cs->ctype, 257); + printf("to_lower:\n"); _print_array(cs->to_lower, 256); + printf("to_upper:\n"); _print_array(cs->to_upper, 256); + printf("sort_order:\n"); _print_array(cs->sort_order, 256); + printf("collate: %3s (%d, %p, %p, %p)\n", + cs->strxfrm_multiply ? "yes" : "no", + cs->strxfrm_multiply, + cs->strnncoll, + cs->strnxfrm, + cs->like_range); + printf("multi-byte: %3s (%d, %p, %p, %p)\n", + cs->mbmaxlen ? "yes" : "no", + cs->mbmaxlen, + cs->ismbchar, + cs->ismbhead, + cs->mbcharlen); +} + int main(int argc, char **argv) { const char *the_set = MYSQL_CHARSET; -- cgit v1.2.1 From fcaf867bb93d188397cb4788b6204283a8af39d3 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 30 Jul 2002 14:02:29 +0500 Subject: Renamed some charset related constant New fields in CHARSET_INFO for more nice SHOW CHARACTER SET Dynamic charsets are now handled in faster way SHOW CHARACTER SET now displays not only compiled charsets but dynamic charsets too include/m_ctype.h: Renamed constant New fields in CHARSET_INFO include/my_sys.h: Constant have been moved to m_ctype.h libmysqld/lib_sql.cc: Renamed constant mysys/charset.c: Dynamic charsets are now handled in new way to speedup things mysys/test_charset.c: Renamed constant sql/mysqld.cc: Renamed constant sql/sql_show.cc: SHOW CHARACTER SET now displays not only compiled charsets but dynamic charsets too strings/ctype.c: New fields in CHARSET_INFO --- include/m_ctype.h | 13 ++- include/my_sys.h | 7 -- libmysqld/lib_sql.cc | 2 +- mysys/charset.c | 232 +++++++++++++++++++++------------------------------ mysys/test_charset.c | 4 +- sql/mysqld.cc | 2 +- sql/sql_show.cc | 4 +- strings/ctype.c | 78 ++++++++++++++++- 8 files changed, 187 insertions(+), 155 deletions(-) diff --git a/include/m_ctype.h b/include/m_ctype.h index 3715402b4f4..70acfcb3dec 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -42,6 +42,14 @@ typedef struct unicase_info_st { #define MY_CS_TOOSMALL -1 #define MY_CS_TOOFEW(n) (-1-(n)) + /* My charsets_list flags */ +#define MY_NO_SETS 0 +#define MY_CS_COMPILED 1 /* compiled-in sets */ +#define MY_CS_CONFIG 2 /* sets that have a *.conf file */ +#define MY_CS_INDEX 4 /* sets listed in the Index file */ +#define MY_CS_LOADED 8 /* sets that are currently loaded */ + + typedef struct my_uni_idx_st { uint16 from; uint16 to; @@ -52,14 +60,16 @@ typedef struct my_uni_idx_st { typedef struct charset_info_st { uint number; + uint state; const char *name; + const char *comment; uchar *ctype; uchar *to_lower; uchar *to_upper; uchar *sort_order; uint16 *tab_to_uni; MY_UNI_IDX *tab_from_uni; - + /* Collation routines */ uint strxfrm_multiply; int (*strnncoll)(struct charset_info_st *, @@ -107,6 +117,7 @@ extern CHARSET_INFO *system_charset_info; extern CHARSET_INFO *find_compiled_charset(uint cs_number); extern CHARSET_INFO *find_compiled_charset_by_name(const char *name); extern CHARSET_INFO compiled_charsets[]; +extern CHARSET_INFO all_charsets[256]; extern uint compiled_charset_number(const char *name); extern const char *compiled_charset_name(uint charset_number); diff --git a/include/my_sys.h b/include/my_sys.h index 54ed9110e95..ab7159a334b 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -105,13 +105,6 @@ extern int NEAR my_errno; /* Last error in mysys */ #define MY_SEEK_CUR 1 #define MY_SEEK_END 2 - /* My charsets_list flags */ -#define MY_NO_SETS 0 -#define MY_COMPILED_SETS 1 /* show compiled-in sets */ -#define MY_CONFIG_SETS 2 /* sets that have a *.conf file */ -#define MY_INDEX_SETS 4 /* all sets listed in the Index file */ -#define MY_LOADED_SETS 8 /* the sets that are currently loaded */ - /* Some constants */ #define MY_WAIT_FOR_USER_TO_FIX_PANIC 60 /* in seconds */ #define MY_WAIT_GIVE_USER_A_MESSAGE 10 /* Every 10 times of prev */ diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc index 1ef84607155..3616f1a44ca 100644 --- a/libmysqld/lib_sql.cc +++ b/libmysqld/lib_sql.cc @@ -413,7 +413,7 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups) mysql_server_end(); return 1; } - charsets_list = list_charsets(MYF(MY_COMPILED_SETS|MY_CONFIG_SETS)); + charsets_list = list_charsets(MYF(MY_CS_COMPILED|MY_CS_CONFIG)); /* Parameter for threads created for connections */ (void) pthread_attr_init(&connection_attrib); diff --git a/mysys/charset.c b/mysys/charset.c index 0178f346dbe..8c05863c44b 100644 --- a/mysys/charset.c +++ b/mysys/charset.c @@ -26,9 +26,8 @@ typedef struct cs_id_st { } CS_ID; const char *charsets_dir = NULL; -static DYNAMIC_ARRAY cs_info_table; -static CS_ID **available_charsets; static int charset_initialized=0; +CHARSET_INFO all_charsets[256]; #define MAX_LINE 1024 @@ -44,24 +43,6 @@ struct simpleconfig_buf_st { char *p; }; -static uint num_from_csname(CS_ID **cs, const char *name) -{ - CS_ID **c; - for (c = cs; *c; ++c) - if (!strcmp((*c)->name, name)) - return (*c)->number; - return 0; /* this mimics find_type() */ -} - -static char *name_from_csnum(CS_ID **cs, uint number) -{ - CS_ID **c; - if(cs) - for (c = cs; *c; ++c) - if ((*c)->number == number) - return (*c)->name; - return (char*) "?"; /* this mimics find_type() */ -} static my_bool get_word(struct simpleconfig_buf_st *fb, char *buf) { @@ -109,13 +90,11 @@ char *get_charsets_dir(char *buf) } -static my_bool read_charset_index(CS_ID ***charsets, myf myflags) +static my_bool read_charset_index(myf myflags) { struct simpleconfig_buf_st fb; char buf[MAX_LINE], num_buf[MAX_LINE]; - DYNAMIC_ARRAY cs; - CS_ID *csid; - + strmov(get_charsets_dir(buf), "Index"); if ((fb.f = my_fopen(buf, O_RDONLY, myflags)) == NULL) @@ -123,13 +102,12 @@ static my_bool read_charset_index(CS_ID ***charsets, myf myflags) fb.buf[0] = '\0'; fb.p = fb.buf; - if (my_init_dynamic_array(&cs, sizeof(CS_ID *), 32, 32)) - return TRUE; - + while (!get_word(&fb, buf) && !get_word(&fb, num_buf)) { uint csnum; uint length; + CHARSET_INFO *cs; if (!(csnum = atoi(num_buf))) { @@ -138,64 +116,56 @@ static my_bool read_charset_index(CS_ID ***charsets, myf myflags) return TRUE; } - if (!(csid = (CS_ID*) my_once_alloc(sizeof(CS_ID), myflags)) || - !(csid->name= + cs=&all_charsets[csnum]; + + if (!(cs->name= (char*) my_once_alloc(length= (uint) strlen(buf)+1, myflags))) { my_fclose(fb.f,myflags); return TRUE; } - memcpy(csid->name,buf,length); - csid->number = csnum; - - insert_dynamic(&cs, (gptr) &csid); + memcpy((char*)cs->name,buf,length); + cs->number=csnum; } my_fclose(fb.f,myflags); - - if (!(*charsets = - (CS_ID **) my_once_alloc((cs.elements + 1) * sizeof(CS_ID *), myflags))) - return TRUE; - /* unwarranted chumminess with dynamic_array implementation? */ - memcpy((byte *) *charsets, cs.buffer, cs.elements * sizeof(CS_ID *)); - (*charsets)[cs.elements] = NULL; - delete_dynamic(&cs); - return FALSE; } static my_bool init_available_charsets(myf myflags) { - my_bool error=0; + my_bool error=FALSE; /* We have to use charset_initialized to not lock on THR_LOCK_charset inside get_internal_charset... */ if (!charset_initialized) { + CHARSET_INFO *cs; /* To make things thread safe we are not allowing other threads to interfere while we may changing the cs_info_table */ pthread_mutex_lock(&THR_LOCK_charset); - if (!cs_info_table.buffer) /* If not initialized */ - { - my_init_dynamic_array(&cs_info_table, sizeof(CHARSET_INFO*), 16, 8); - error = read_charset_index(&available_charsets, myflags); - } + + bzero(&all_charsets,sizeof(all_charsets)); + + /* Copy compiled charsets */ + + for (cs=compiled_charsets; cs->name; cs++) + all_charsets[cs->number]=cs[0]; + + error = read_charset_index(myflags); charset_initialized=1; pthread_mutex_unlock(&THR_LOCK_charset); } - if(!available_charsets || !available_charsets[0]) - error = TRUE; return error; } void free_charsets(void) { - delete_dynamic(&cs_info_table); charset_initialized=0; } @@ -231,10 +201,9 @@ static my_bool fill_uint16_array(uint16 *array, int sz, struct simpleconfig_buf_ } -static void get_charset_conf_name(uint cs_number, char *buf) +static void get_charset_conf_name(const char *cs_name, char *buf) { - strxmov(get_charsets_dir(buf), - name_from_csnum(available_charsets, cs_number), ".conf", NullS); + strxmov(get_charsets_dir(buf), cs_name, ".conf", NullS); } typedef struct { @@ -323,19 +292,16 @@ static my_bool create_fromuni(CHARSET_INFO *cs){ } -static my_bool read_charset_file(uint cs_number, CHARSET_INFO *set, +static my_bool read_charset_file(const char *cs_name, CHARSET_INFO *set, myf myflags) { struct simpleconfig_buf_st fb; char buf[FN_REFLEN]; my_bool result; DBUG_ENTER("read_charset_file"); - DBUG_PRINT("enter",("cs_number: %d", cs_number)); - - if (cs_number <= 0) - DBUG_RETURN(TRUE); + DBUG_PRINT("enter",("cs_name: %s", cs_name)); - get_charset_conf_name(cs_number, buf); + get_charset_conf_name(cs_name, buf); DBUG_PRINT("info",("file name: %s", buf)); if ((fb.f = my_fopen(buf, O_RDONLY, myflags)) == NULL) @@ -358,70 +324,26 @@ static my_bool read_charset_file(uint cs_number, CHARSET_INFO *set, } -uint get_charset_number(const char *charset_name) -{ - uint number=compiled_charset_number(charset_name); - if (number) - return number; - if (init_available_charsets(MYF(0))) /* If it isn't initialized */ - return 0; - return num_from_csname(available_charsets, charset_name); -} - -const char *get_charset_name(uint charset_number) -{ - const char *name=compiled_charset_name(charset_number); - if (*name != '?') - return name; - if (init_available_charsets(MYF(0))) /* If it isn't initialized */ - return "?"; - return name_from_csnum(available_charsets, charset_number); -} - - -static CHARSET_INFO *find_charset(CHARSET_INFO **table, uint cs_number, - size_t tablesz) -{ - uint i; - for (i = 0; i < tablesz; ++i) - if (table[i]->number == cs_number) - return table[i]; - return NULL; -} - -static CHARSET_INFO *find_charset_by_name(CHARSET_INFO **table, - const char *name, size_t tablesz) -{ - uint i; - for (i = 0; i < tablesz; ++i) - if (!strcmp(table[i]->name,name)) - return table[i]; - return NULL; -} - static CHARSET_INFO *add_charset(uint cs_number, const char *cs_name, myf flags) { - CHARSET_INFO tmp_cs,*cs; + CHARSET_INFO *cs; uchar tmp_ctype[CTYPE_TABLE_SIZE]; uchar tmp_to_lower[TO_LOWER_TABLE_SIZE]; uchar tmp_to_upper[TO_UPPER_TABLE_SIZE]; uchar tmp_sort_order[SORT_ORDER_TABLE_SIZE]; uint16 tmp_to_uni[TO_UNI_TABLE_SIZE]; - /* Don't allocate memory if we are not sure we can find the char set */ - cs= &tmp_cs; + cs=&all_charsets[cs_number]; bzero((char*) cs, sizeof(*cs)); cs->ctype=tmp_ctype; cs->to_lower=tmp_to_lower; cs->to_upper=tmp_to_upper; cs->sort_order=tmp_sort_order; cs->tab_to_uni=tmp_to_uni; - if (read_charset_file(cs_number, cs, flags)) + if (read_charset_file(cs_name, cs, flags)) return NULL; - cs = (CHARSET_INFO*) my_once_alloc(sizeof(CHARSET_INFO), - MYF(MY_WME)); - *cs=tmp_cs; + /* FIXME: double allocation */ cs->name = (char *) my_once_alloc((uint) strlen(cs_name)+1, MYF(MY_WME)); cs->ctype = (uchar*) my_once_alloc(CTYPE_TABLE_SIZE, MYF(MY_WME)); cs->to_lower = (uchar*) my_once_alloc(TO_LOWER_TABLE_SIZE, MYF(MY_WME)); @@ -446,10 +368,38 @@ static CHARSET_INFO *add_charset(uint cs_number, const char *cs_name, myf flags) cs->mb_wc = my_mb_wc_8bit; cs->wc_mb = my_wc_mb_8bit; - insert_dynamic(&cs_info_table, (gptr) &cs); return cs; } + +uint get_charset_number(const char *charset_name) +{ + CHARSET_INFO *cs; + if (init_available_charsets(MYF(0))) /* If it isn't initialized */ + return 0; + + for (cs = all_charsets; cs < all_charsets+255; ++cs) + if ( cs->name && !strcmp(cs->name, charset_name)) + return cs->number; + + return 0; /* this mimics find_type() */ +} + + +const char *get_charset_name(uint charset_number) +{ + CHARSET_INFO *cs; + if (init_available_charsets(MYF(0))) /* If it isn't initialized */ + return "?"; + + for (cs = all_charsets; cs < all_charsets+255; ++cs) + if (cs->number == charset_number) + return (char*) cs->name; + + return (char*) "?"; /* this mimics find_type() */ +} + + static CHARSET_INFO *get_internal_charset(uint cs_number, myf flags) { CHARSET_INFO *cs; @@ -458,10 +408,10 @@ static CHARSET_INFO *get_internal_charset(uint cs_number, myf flags) while we may changing the cs_info_table */ pthread_mutex_lock(&THR_LOCK_charset); - if (!(cs = find_charset((CHARSET_INFO**) cs_info_table.buffer, cs_number, - cs_info_table.elements))) - if (!(cs = find_compiled_charset(cs_number))) - cs=add_charset(cs_number, get_charset_name(cs_number), flags); + + if (!(cs = find_compiled_charset(cs_number))) + cs=add_charset(cs_number, get_charset_name(cs_number), flags); + pthread_mutex_unlock(&THR_LOCK_charset); return cs; } @@ -475,10 +425,10 @@ static CHARSET_INFO *get_internal_charset_by_name(const char *name, myf flags) while we may changing the cs_info_table */ pthread_mutex_lock(&THR_LOCK_charset); - if (!(cs = find_charset_by_name((CHARSET_INFO**) cs_info_table.buffer, name, - cs_info_table.elements))) - if (!(cs = find_compiled_charset_by_name(name))) - cs=add_charset(get_charset_number(name), name, flags); + + if (!(cs = find_compiled_charset_by_name(name))) + cs=add_charset(get_charset_number(name), name, flags); + pthread_mutex_unlock(&THR_LOCK_charset); return cs; } @@ -585,7 +535,7 @@ char * list_charsets(myf want_flags) (void)init_available_charsets(MYF(0)); init_dynamic_string(&s, NullS, 256, 1024); - if (want_flags & MY_COMPILED_SETS) + if (want_flags & MY_CS_COMPILED) { CHARSET_INFO *cs; for (cs = compiled_charsets; cs->number > 0; cs++) @@ -595,39 +545,43 @@ char * list_charsets(myf want_flags) } } - if (want_flags & MY_CONFIG_SETS) + if (want_flags & MY_CS_CONFIG) { - CS_ID **c; + CHARSET_INFO *cs; char buf[FN_REFLEN]; MY_STAT status; - if((c=available_charsets)) - for (; *c; ++c) - { - if (charset_in_string((*c)->name, &s)) - continue; - get_charset_conf_name((*c)->number, buf); - if (!my_stat(buf, &status, MYF(0))) - continue; /* conf file doesn't exist */ - dynstr_append(&s, (*c)->name); - dynstr_append(&s, " "); - } + for (cs=all_charsets; cs < all_charsets+255; cs++) + { + if (!cs->name || charset_in_string(cs->name, &s)) + continue; + get_charset_conf_name(cs->name, buf); + if (!my_stat(buf, &status, MYF(0))) + continue; /* conf file doesn't exist */ + dynstr_append(&s, cs->name); + dynstr_append(&s, " "); + } } - if (want_flags & MY_INDEX_SETS) + if (want_flags & MY_CS_INDEX) { - CS_ID **c; - for (c = available_charsets; *c; ++c) - charset_append(&s, (*c)->name); + CHARSET_INFO *cs; + for (cs = all_charsets; cs < all_charsets + 255; cs++) + if (cs->name) + charset_append(&s, cs->name); } +#if 0 if (want_flags & MY_LOADED_SETS) { - uint i; - for (i = 0; i < cs_info_table.elements; i++) - charset_append(&s, - dynamic_element(&cs_info_table, i, CHARSET_INFO *)->name); + CHARSET_INFO *cs; + /* FIXME */ + for (cs = all_charsets; cs < all_charsets + 255; cs++) + if (cs->name) + charset_append(&s, cs->name); } +#endif + s.str[s.length - 1] = '\0'; /* chop trailing space */ p = my_strdup(s.str, MYF(MY_WME)); dynstr_free(&s); diff --git a/mysys/test_charset.c b/mysys/test_charset.c index 5e623584355..47ed9062c05 100644 --- a/mysys/test_charset.c +++ b/mysys/test_charset.c @@ -77,11 +77,11 @@ int main(int argc, char **argv) { _print_csinfo(default_charset_info); fflush(stdout); - cs_list = list_charsets(MYF(MY_COMPILED_SETS | MY_CONFIG_SETS)); + cs_list = list_charsets(MYF(MY_CS_COMPILED | MY_CS_CONFIG)); printf("LIST OF CHARSETS (compiled + *.conf):\n%s\n", cs_list); my_free(cs_list,MYF(0)); - cs_list = list_charsets(MYF(MY_INDEX_SETS | MY_LOADED_SETS)); + cs_list = list_charsets(MYF(MY_CS_INDEX | MY_CS_LOADED)); printf("LIST OF CHARSETS (index + loaded):\n%s\n", cs_list); my_free(cs_list,MYF(0)); diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 98bfa162242..59630644e5a 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -1840,7 +1840,7 @@ int main(int argc, char **argv) if (set_default_charset_by_name(default_charset, MYF(MY_WME))) exit( 1 ); - charsets_list = list_charsets(MYF(MY_COMPILED_SETS|MY_CONFIG_SETS)); + charsets_list = list_charsets(MYF(MY_CS_COMPILED|MY_CS_CONFIG)); #ifdef HAVE_OPENSSL if (opt_use_ssl) diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 494607c7fff..e227a5bf5ca 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1381,8 +1381,10 @@ int mysqld_show_charsets(THD *thd, const char *wild) if (send_fields(thd,field_list,1)) DBUG_RETURN(1); - for (cs=compiled_charsets ; cs->name ; cs++ ) + for (cs=all_charsets ; cs < all_charsets+255 ; cs++ ) { + if (!cs->name) + continue; if (!(wild && wild[0] && wild_case_compare(system_charset_info,cs->name,wild))) { packet2.length(0); diff --git a/strings/ctype.c b/strings/ctype.c index 7c37eeff986..f91c8985aee 100644 --- a/strings/ctype.c +++ b/strings/ctype.c @@ -2805,8 +2805,10 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_latin1 { - 8, /* number */ - "latin1", /* name */ + 8, /* number */ + MY_CS_COMPILED, /* state */ + "latin1", /* name */ + "", /* comment */ ctype_latin1, to_lower_latin1, to_upper_latin1, @@ -2838,7 +2840,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_big5 { 1, /* number */ + MY_CS_COMPILED, /* state */ "big5", /* name */ + "", /* comment */ ctype_big5, to_lower_big5, to_upper_big5, @@ -2870,7 +2874,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_cp1251 { 14, /* number */ + MY_CS_COMPILED, /* state */ "cp1251", /* name */ + "", /* comment */ ctype_cp1251, to_lower_cp1251, to_upper_cp1251, @@ -2902,7 +2908,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_cp1257 { 29, /* number */ + MY_CS_COMPILED, /* state */ "cp1257", /* name */ + "", /* comment */ ctype_cp1257, to_lower_cp1257, to_upper_cp1257, @@ -2934,7 +2942,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_croat { 27, /* number */ + MY_CS_COMPILED, /* state */ "croat", /* name */ + "", /* comment */ ctype_croat, to_lower_croat, to_upper_croat, @@ -2966,7 +2976,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_czech { 2, /* number */ + MY_CS_COMPILED, /* state */ "czech", /* name */ + "", /* comment */ ctype_czech, to_lower_czech, to_upper_czech, @@ -2998,7 +3010,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_danish { 15, /* number */ + MY_CS_COMPILED, /* state */ "danish", /* name */ + "", /* comment */ ctype_danish, to_lower_danish, to_upper_danish, @@ -3030,7 +3044,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_dec8 { 3, /* number */ + MY_CS_COMPILED, /* state */ "dec8", /* name */ + "", /* comment */ ctype_dec8, to_lower_dec8, to_upper_dec8, @@ -3062,7 +3078,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_dos { 4, /* number */ + MY_CS_COMPILED, /* state */ "dos", /* name */ + "", /* comment */ ctype_dos, to_lower_dos, to_upper_dos, @@ -3094,7 +3112,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_estonia { 20, /* number */ + MY_CS_COMPILED, /* state */ "estonia", /* name */ + "", /* comment */ ctype_estonia, to_lower_estonia, to_upper_estonia, @@ -3126,7 +3146,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_euc_kr { 19, /* number */ + MY_CS_COMPILED, /* state */ "euc_kr", /* name */ + "", /* comment */ ctype_euc_kr, to_lower_euc_kr, to_upper_euc_kr, @@ -3158,7 +3180,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_gb2312 { 24, /* number */ + MY_CS_COMPILED, /* state */ "gb2312", /* name */ + "", /* comment */ ctype_gb2312, to_lower_gb2312, to_upper_gb2312, @@ -3190,7 +3214,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_gbk { 28, /* number */ + MY_CS_COMPILED, /* state */ "gbk", /* name */ + "", /* comment */ ctype_gbk, to_lower_gbk, to_upper_gbk, @@ -3222,7 +3248,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_german1 { 5, /* number */ + MY_CS_COMPILED, /* state */ "german1", /* name */ + "", /* comment */ ctype_german1, to_lower_german1, to_upper_german1, @@ -3254,7 +3282,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_greek { 25, /* number */ + MY_CS_COMPILED, /* state */ "greek", /* name */ + "", /* comment */ ctype_greek, to_lower_greek, to_upper_greek, @@ -3286,7 +3316,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_hebrew { 16, /* number */ + MY_CS_COMPILED, /* state */ "hebrew", /* name */ + "", /* comment */ ctype_hebrew, to_lower_hebrew, to_upper_hebrew, @@ -3318,7 +3350,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_hp8 { 6, /* number */ + MY_CS_COMPILED, /* state */ "hp8", /* name */ + "", /* comment */ ctype_hp8, to_lower_hp8, to_upper_hp8, @@ -3350,7 +3384,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_hungarian { 21, /* number */ + MY_CS_COMPILED, /* state */ "hungarian", /* name */ + "", /* comment */ ctype_hungarian, to_lower_hungarian, to_upper_hungarian, @@ -3382,7 +3418,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_koi8_ru { 7, /* number */ + MY_CS_COMPILED, /* state */ "koi8_ru", /* name */ + "", /* comment */ ctype_koi8_ru, to_lower_koi8_ru, to_upper_koi8_ru, @@ -3414,7 +3452,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_koi8_ukr { 22, /* number */ + MY_CS_COMPILED, /* state */ "koi8_ukr", /* name */ + "", /* comment */ ctype_koi8_ukr, to_lower_koi8_ukr, to_upper_koi8_ukr, @@ -3446,7 +3486,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_latin1_de { 31, /* number */ + MY_CS_COMPILED, /* state */ "latin1_de", /* name */ + "", /* comment */ ctype_latin1_de, to_lower_latin1_de, to_upper_latin1_de, @@ -3478,7 +3520,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_latin2 { 9, /* number */ + MY_CS_COMPILED, /* state */ "latin2", /* name */ + "", /* comment */ ctype_latin2, to_lower_latin2, to_upper_latin2, @@ -3510,7 +3554,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_latin5 { 30, /* number */ + MY_CS_COMPILED, /* state */ "latin5", /* name */ + "", /* comment */ ctype_latin5, to_lower_latin5, to_upper_latin5, @@ -3542,7 +3588,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_sjis { 13, /* number */ + MY_CS_COMPILED, /* state */ "sjis", /* name */ + "", /* comment */ ctype_sjis, to_lower_sjis, to_upper_sjis, @@ -3574,7 +3622,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_swe7 { 10, /* number */ + MY_CS_COMPILED, /* state */ "swe7", /* name */ + "", /* comment */ ctype_swe7, to_lower_swe7, to_upper_swe7, @@ -3606,7 +3656,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_tis620 { 18, /* number */ + MY_CS_COMPILED, /* state */ "tis620", /* name */ + "", /* comment */ ctype_tis620, to_lower_tis620, to_upper_tis620, @@ -3638,7 +3690,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_ucs2 { 35, /* number */ + MY_CS_COMPILED, /* state */ "ucs2", /* name */ + "", /* comment */ ctype_ucs2, /* ctype */ to_lower_ucs2, /* to_lower */ to_upper_ucs2, /* to_upper */ @@ -3671,7 +3725,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_ujis { 12, /* number */ + MY_CS_COMPILED, /* state */ "ujis", /* name */ + "", /* comment */ ctype_ujis, to_lower_ujis, to_upper_ujis, @@ -3703,7 +3759,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_utf8 { 33, /* number */ + MY_CS_COMPILED, /* state */ "utf8", /* name */ + "", /* comment */ ctype_utf8, /* ctype */ to_lower_utf8, /* to_lower */ to_upper_utf8, /* to_upper */ @@ -3735,7 +3793,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_usa7 { 11, /* number */ + MY_CS_COMPILED, /* state */ "usa7", /* name */ + "", /* comment */ ctype_usa7, to_lower_usa7, to_upper_usa7, @@ -3767,7 +3827,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_win1250 { 26, /* number */ + MY_CS_COMPILED, /* state */ "win1250", /* name */ + "", /* comment */ ctype_win1250, to_lower_win1250, to_upper_win1250, @@ -3799,7 +3861,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_win1251ukr { 23, /* number */ + MY_CS_COMPILED, /* state */ "win1251ukr", /* name */ + "", /* comment */ ctype_win1251ukr, to_lower_win1251ukr, to_upper_win1251ukr, @@ -3831,7 +3895,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_armscii8 { 32, /* number */ + MY_CS_COMPILED, /* state */ "armscii8", /* name */ + "", /* comment */ ctype_armscii8, to_lower_armscii8, to_upper_armscii8, @@ -3863,7 +3929,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_win1251 { 17, /* number */ + MY_CS_COMPILED, /* state */ "win1251", /* name */ + "", /* comment */ ctype_win1251, to_lower_win1251, to_upper_win1251, @@ -3895,7 +3963,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_win1250ch { 34, /* number */ + MY_CS_COMPILED, /* state */ "win1250ch", /* name */ + "", /* comment */ ctype_win1250ch, to_lower_win1250ch, to_upper_win1250ch, @@ -3926,7 +3996,9 @@ CHARSET_INFO compiled_charsets[] = { { 0, /* end-of-list marker */ - NullS, + 0, /* state */ + NullS, /* name */ + NullS, /* comment */ NULL, NULL, NULL, -- cgit v1.2.1 From 08047dcccdb5b6fab276a53f334b117464a29ddb Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 30 Jul 2002 17:12:51 +0500 Subject: Removed unused strucure Some fixes and improvements --- mysys/charset.c | 82 +++++++++++++++++++++++++++------------------------------ 1 file changed, 39 insertions(+), 43 deletions(-) diff --git a/mysys/charset.c b/mysys/charset.c index 8c05863c44b..cd84194dab1 100644 --- a/mysys/charset.c +++ b/mysys/charset.c @@ -20,10 +20,6 @@ #include #include -typedef struct cs_id_st { - char *name; - uint number; -} CS_ID; const char *charsets_dir = NULL; static int charset_initialized=0; @@ -324,7 +320,7 @@ static my_bool read_charset_file(const char *cs_name, CHARSET_INFO *set, } -static CHARSET_INFO *add_charset(uint cs_number, const char *cs_name, myf flags) +static CHARSET_INFO *add_charset(uint cs_number, myf flags) { CHARSET_INFO *cs; uchar tmp_ctype[CTYPE_TABLE_SIZE]; @@ -333,25 +329,24 @@ static CHARSET_INFO *add_charset(uint cs_number, const char *cs_name, myf flags) uchar tmp_sort_order[SORT_ORDER_TABLE_SIZE]; uint16 tmp_to_uni[TO_UNI_TABLE_SIZE]; + /* Note: cs->name is already initialized */ + cs=&all_charsets[cs_number]; - bzero((char*) cs, sizeof(*cs)); + cs->ctype=tmp_ctype; cs->to_lower=tmp_to_lower; cs->to_upper=tmp_to_upper; cs->sort_order=tmp_sort_order; cs->tab_to_uni=tmp_to_uni; - if (read_charset_file(cs_name, cs, flags)) + if (read_charset_file(cs->name, cs, flags)) return NULL; - /* FIXME: double allocation */ - cs->name = (char *) my_once_alloc((uint) strlen(cs_name)+1, MYF(MY_WME)); cs->ctype = (uchar*) my_once_alloc(CTYPE_TABLE_SIZE, MYF(MY_WME)); cs->to_lower = (uchar*) my_once_alloc(TO_LOWER_TABLE_SIZE, MYF(MY_WME)); cs->to_upper = (uchar*) my_once_alloc(TO_UPPER_TABLE_SIZE, MYF(MY_WME)); cs->sort_order=(uchar*) my_once_alloc(SORT_ORDER_TABLE_SIZE, MYF(MY_WME)); cs->tab_to_uni=(uint16*)my_once_alloc(TO_UNI_TABLE_SIZE*sizeof(uint16), MYF(MY_WME)); cs->number = cs_number; - memcpy((char*) cs->name, (char*) cs_name, strlen(cs_name) + 1); memcpy((char*) cs->ctype, (char*) tmp_ctype, sizeof(tmp_ctype)); memcpy((char*) cs->to_lower, (char*) tmp_to_lower, sizeof(tmp_to_lower)); memcpy((char*) cs->to_upper, (char*) tmp_to_upper, sizeof(tmp_to_upper)); @@ -392,10 +387,10 @@ const char *get_charset_name(uint charset_number) if (init_available_charsets(MYF(0))) /* If it isn't initialized */ return "?"; - for (cs = all_charsets; cs < all_charsets+255; ++cs) - if (cs->number == charset_number) - return (char*) cs->name; - + cs=&all_charsets[charset_number]; + if ( (cs->number==charset_number) && cs->name ) + return (char*) cs->name; + return (char*) "?"; /* this mimics find_type() */ } @@ -409,8 +404,18 @@ static CHARSET_INFO *get_internal_charset(uint cs_number, myf flags) */ pthread_mutex_lock(&THR_LOCK_charset); - if (!(cs = find_compiled_charset(cs_number))) - cs=add_charset(cs_number, get_charset_name(cs_number), flags); + +/* + FIXME: it's faster to use this code, but max_sort_char is + not initialized here, so LIKE doesn't work later + + cs = &all_charsets[cs_number]; + if (!(cs->state & (MY_CS_COMPILED | MY_CS_LOADED))) + cs=add_charset(cs_number, flags); +*/ + + if (!(cs=find_compiled_charset(cs_number))) + cs=add_charset(cs_number, flags); pthread_mutex_unlock(&THR_LOCK_charset); return cs; @@ -419,25 +424,20 @@ static CHARSET_INFO *get_internal_charset(uint cs_number, myf flags) static CHARSET_INFO *get_internal_charset_by_name(const char *name, myf flags) { - CHARSET_INFO *cs; - /* - To make things thread safe we are not allowing other threads to interfere - while we may changing the cs_info_table - */ - pthread_mutex_lock(&THR_LOCK_charset); - - if (!(cs = find_compiled_charset_by_name(name))) - cs=add_charset(get_charset_number(name), name, flags); - - pthread_mutex_unlock(&THR_LOCK_charset); - return cs; + uint cs_number=get_charset_number(name); + return cs_number ? get_internal_charset(cs_number,flags) : NULL; } + CHARSET_INFO *get_charset(uint cs_number, myf flags) { CHARSET_INFO *cs; (void) init_available_charsets(MYF(0)); /* If it isn't initialized */ + + if (!cs_number) + return NULL; + cs=get_internal_charset(cs_number, flags); if (!cs && (flags & MY_WME)) @@ -563,28 +563,24 @@ char * list_charsets(myf want_flags) } } - if (want_flags & MY_CS_INDEX) + if (want_flags & (MY_CS_INDEX|MY_CS_LOADED)) { CHARSET_INFO *cs; for (cs = all_charsets; cs < all_charsets + 255; cs++) - if (cs->name) + if (cs->name && (cs->state & want_flags) ) charset_append(&s, cs->name); } - -#if 0 - if (want_flags & MY_LOADED_SETS) + + if (s.length) { - CHARSET_INFO *cs; - /* FIXME */ - for (cs = all_charsets; cs < all_charsets + 255; cs++) - if (cs->name) - charset_append(&s, cs->name); + s.str[s.length - 1] = '\0'; /* chop trailing space */ + p = my_strdup(s.str, MYF(MY_WME)); + } + else + { + p = my_strdup("", MYF(MY_WME)); } -#endif - - s.str[s.length - 1] = '\0'; /* chop trailing space */ - p = my_strdup(s.str, MYF(MY_WME)); dynstr_free(&s); - + return p; } -- cgit v1.2.1 From f0f5a892039cb1155608c8c84854b20e93112dc4 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 31 Jul 2002 01:26:51 +0300 Subject: fixed bug reported by Walrus & Miguel in exists subselect mysql-test/r/subselect.result: added test suite of EXISTS clause mysql-test/t/subselect.test: added test suite of EXISTS clause sql/item_subselect.cc: added checking out of memory fixed bug in exists subselect --- mysql-test/r/subselect.result | 13 +++++++++++-- mysql-test/t/subselect.test | 11 +++++++++-- sql/item_subselect.cc | 8 +++++++- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index bd92c496f29..fb91bebd727 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -1,7 +1,7 @@ select (select 2); (select 2) 2 -drop table if exists t1,t2,t3,t4; +drop table if exists t1,t2,t3,t4,attend,clinic; create table t1 (a int); create table t2 (a int, b int); create table t3 (a int); @@ -82,4 +82,13 @@ select b,max(a) as ma from t4 group by b having b >= (select max(t2.a) from t2 where t2.b=t4.b); b ma 7 12 -drop table t1,t2,t3,t4; +create table attend (patient_uq int, clinic_uq int, index i1 (clinic_uq)); +create table clinic( uq int primary key, name char(25)); +insert into clinic values(1,"Oblastnaia bolnitsa"),(2,"Bolnitsa Krasnogo Kresta"); +insert into attend values (1,1),(1,2),(2,2),(1,3); +select * from attend where exists (select * from clinic where uq = clinic_uq); +patient_uq clinic_uq +1 1 +1 2 +2 2 +drop table t1,t2,t3,t4,attend,clinic; diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 7b1ebdcbc27..16ba6c9e602 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -1,6 +1,6 @@ select (select 2); -drop table if exists t1,t2,t3,t4; +drop table if exists t1,t2,t3,t4,attend,clinic; create table t1 (a int); create table t2 (a int, b int); create table t3 (a int); @@ -33,4 +33,11 @@ select b,max(a) as ma from t4 group by b having b < (select max(t2.a) from t2 where t2.b=t4.b); select b,max(a) as ma from t4 group by b having b >= (select max(t2.a) from t2 where t2.b=t4.b); -drop table t1,t2,t3,t4; + +create table attend (patient_uq int, clinic_uq int, index i1 (clinic_uq)); +create table clinic( uq int primary key, name char(25)); +insert into clinic values(1,"Oblastnaia bolnitsa"),(2,"Bolnitsa Krasnogo Kresta"); +insert into attend values (1,1),(1,2),(2,2),(1,3); +select * from attend where exists (select * from clinic where uq = clinic_uq); + +drop table t1,t2,t3,t4,attend,clinic; diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 2bff2af45e4..b0a94f0b8e6 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -51,6 +51,12 @@ Item_subselect::Item_subselect(THD *thd, st_select_lex *select_lex, if (unit->select_limit_cnt == HA_POS_ERROR) select_lex->options&= ~OPTION_FOUND_ROWS; join= new JOIN(thd, select_lex->item_list, select_lex->options, result); + if (!join || !result) + { + //out of memory + thd->fatal_error= 1; + my_printf_error(ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES), MYF(0)); + } this->select_lex= select_lex; assign_null(); /* @@ -172,7 +178,7 @@ String *Item_singleval_subselect::val_str (String *str) Item_exists_subselect::Item_exists_subselect(THD *thd, st_select_lex *select_lex): - Item_subselect(thd, select_lex, new select_singleval_subselect(this)) + Item_subselect(thd, select_lex, new select_exists_subselect(this)) { max_columns= UINT_MAX; null_value= 0; //can't be NULL -- cgit v1.2.1 From 5d61c21aa9716544df6fce044ec27d8ce771c9d9 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 31 Jul 2002 13:25:37 +0500 Subject: Some more speedup in charsets handling sql/init.cc: This code is moved to more proper place in mysys/charset.c --- mysys/charset.c | 35 ++++++++++++++++++++++++----------- sql/init.cc | 17 ----------------- 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/mysys/charset.c b/mysys/charset.c index cd84194dab1..c1a61ad693f 100644 --- a/mysys/charset.c +++ b/mysys/charset.c @@ -128,6 +128,24 @@ static my_bool read_charset_index(myf myflags) return FALSE; } +static void set_max_sort_char(CHARSET_INFO *cs) +{ + uchar max_char; + uint i; + + if (!cs->sort_order) + return; + + max_char=cs->sort_order[(uchar) cs->max_sort_char]; + for (i = 0; i < 256; i++) + { + if ((uchar) cs->sort_order[i] > max_char) + { + max_char=(uchar) cs->sort_order[i]; + cs->max_sort_char= (char) i; + } + } +} static my_bool init_available_charsets(myf myflags) { @@ -150,8 +168,10 @@ static my_bool init_available_charsets(myf myflags) /* Copy compiled charsets */ for (cs=compiled_charsets; cs->name; cs++) + { all_charsets[cs->number]=cs[0]; - + set_max_sort_char(&all_charsets[cs->number]); + } error = read_charset_index(myflags); charset_initialized=1; pthread_mutex_unlock(&THR_LOCK_charset); @@ -363,6 +383,8 @@ static CHARSET_INFO *add_charset(uint cs_number, myf flags) cs->mb_wc = my_mb_wc_8bit; cs->wc_mb = my_wc_mb_8bit; + set_max_sort_char(cs); + return cs; } @@ -404,19 +426,10 @@ static CHARSET_INFO *get_internal_charset(uint cs_number, myf flags) */ pthread_mutex_lock(&THR_LOCK_charset); - -/* - FIXME: it's faster to use this code, but max_sort_char is - not initialized here, so LIKE doesn't work later - cs = &all_charsets[cs_number]; if (!(cs->state & (MY_CS_COMPILED | MY_CS_LOADED))) cs=add_charset(cs_number, flags); -*/ - - if (!(cs=find_compiled_charset(cs_number))) - cs=add_charset(cs_number, flags); - + pthread_mutex_unlock(&THR_LOCK_charset); return cs; } diff --git a/sql/init.cc b/sql/init.cc index ac0ff701649..052ee16925e 100644 --- a/sql/init.cc +++ b/sql/init.cc @@ -53,23 +53,6 @@ void unireg_init(ulong options) } specialflag|=options; /* Set options from argv */ - // The following is needed because of like optimization in select.cc - - for (cs=compiled_charsets; cs->number; cs++) - { - uchar max_char; - if (!cs->sort_order) - continue; - max_char=cs->sort_order[(uchar) cs->max_sort_char]; - for (i = 0; i < 256; i++) - { - if ((uchar) cs->sort_order[i] > max_char) - { - max_char=(uchar) cs->sort_order[i]; - cs->max_sort_char= (char) i; - } - } - } thread_stack_min=thread_stack - STACK_MIN_SIZE; DBUG_VOID_RETURN; } -- cgit v1.2.1 From b4a63d5137d8580676d9c76d367a173d94d6a0fd Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 31 Jul 2002 17:34:27 +0500 Subject: Move operation to logically better place --- mysys/charset.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mysys/charset.c b/mysys/charset.c index c1a61ad693f..691a4233269 100644 --- a/mysys/charset.c +++ b/mysys/charset.c @@ -335,7 +335,6 @@ static my_bool read_charset_file(const char *cs_name, CHARSET_INFO *set, result=TRUE; my_fclose(fb.f, MYF(0)); - create_fromuni(set); DBUG_RETURN(result); } @@ -384,6 +383,7 @@ static CHARSET_INFO *add_charset(uint cs_number, myf flags) cs->wc_mb = my_wc_mb_8bit; set_max_sort_char(cs); + create_fromuni(cs); return cs; } -- cgit v1.2.1 From d313a26bb22404dbcd9aebb3c79e97deb4939b56 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 3 Aug 2002 00:54:19 -0600 Subject: Some updates to the logging section. Docs/manual.texi: Worked on the logging section. Reworded some sentences Fixed a broken table Removed extraneous '!'s Removed extraneous ','s 'file name' and 'filename' are used interchangeably but they should be consistent-- so I changed some 'file name' occurances to 'filename'. BitKeeper/etc/logging_ok: Logging to logging@openlogging.org accepted --- BitKeeper/etc/logging_ok | 1 + Docs/manual.texi | 66 +++++++++++++++++++++--------------------------- 2 files changed, 30 insertions(+), 37 deletions(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index f318a1dc6ab..1da3ecc3841 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -72,3 +72,4 @@ walrus@mysql.com ram@ram.(none) WAX@sergbook.mysql.com bar@bar.udmsearch.izhnet.ru +nick@mysql.com diff --git a/Docs/manual.texi b/Docs/manual.texi index c7d2095f601..b11cbc8faba 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -23136,7 +23136,7 @@ you start using MySQL in a production environment, you can remove the @code{-l} option from @code{mysql.server} or change it to @code{--log-bin}. -The entries in this log are written as @code{mysqld} receives the questions. +The entries in this log are written as @code{mysqld} receives the queries. This may be different from the order in which the statements are executed. This is in contrast to the update log and the binary log which are written after the query is executed, but before any locks are released. @@ -23149,7 +23149,7 @@ after the query is executed, but before any locks are released. @cindex files, update log @strong{Note}: the update log is replaced by the binary -log. @xref{Binary log}. With this you can do anything that you can do +log. @xref{Binary log}. You can do anything with the binary log that you can do with the update log. When started with the @code{--log-update[=file_name]} option, @@ -23164,7 +23164,7 @@ flush-logs}, execute the @code{FLUSH LOGS} statement, or restart the server. @strong{Note}: for the above scheme to work, you must not create your own files with the same filename as the update log + some extensions -that may be regarded as a number, in the directory used by the update log! +that may be regarded as a number in the directory used by the update log! If you use the @code{--log} or @code{-l} options, @code{mysqld} writes a general log with a filename of @file{hostname.log}, and restarts and @@ -23208,8 +23208,8 @@ and the crash. @cindex binary log @cindex files, binary log -The intention is that the binary log should replace the update log, so -we recommend you to switch to this log format as soon as possible! +The binary log will replace the now deprecated update log, so +we recommend you to switch to this log format as soon as possible. The binary log contains all information that is available in the update log in a more efficient format. It also contains information about how long @@ -23218,10 +23218,10 @@ every query that updated the database took. The binary log is also used when you are replicating a slave from a master. @xref{Replication}. -When started with the @code{--log-bin[=file_name]} option, @code{mysqld} +When started with the @code{--log-bin[=file_name]} option @code{mysqld} writes a log file containing all SQL commands that update data. If no -file name is given, it defaults to the name of the host machine followed -by @code{-bin}. If file name is given, but it doesn't contain a path, the +file name is given it defaults to the name of the host machine followed +by @code{-bin}. If a file name is given, but doesn't contain a path, the file is written in the data directory. If you supply an extension to @code{--log-bin=filename.extension}, the @@ -23241,14 +23241,9 @@ to the binary log: @multitable @columnfractions .38 .62 @item @strong{Option} @tab @strong{Description} -@item @code{binlog-do-db=database_name} @tab -Tells the master it should log updates for the specified database, and -exclude all others not explicitly mentioned. -(Example: @code{binlog-do-db=some_database}) +@item @code{binlog-do-db=database_name} @tab Tells the master it should log updates for the specified database, and exclude all others not explicitly mentioned. (Example: @code{binlog-do-db=some_database}) -@item @code{binlog-ignore-db=database_name} @tab -Tells the master that updates to the given database should not be logged -to the binary log (Example: @code{binlog-ignore-db=some_database}) +@item @code{binlog-ignore-db=database_name} @tab Tells the master that updates to the given database should not be logged to the binary log (Example: @code{binlog-ignore-db=some_database}) @end multitable To be able to know which different binary log files have been used, @@ -23272,10 +23267,10 @@ mysqlbinlog log-file | mysql -h server_name @end example You can also use the @code{mysqlbinlog} program to read the binary log -directly from a remote MySQL server! +directly from a remote MySQL server. @code{mysqlbinlog --help} will give you more information of how to use -this program! +this program. If you are using @code{BEGIN [WORK]} or @code{SET AUTOCOMMIT=0}, you must use the MySQL binary log for backups instead of the old update log. @@ -23284,10 +23279,10 @@ The binary logging is done immediately after a query completes but before any locks are released or any commit is done. This ensures that the log will be logged in the execution order. -All updates (@code{UPDATE}, @code{DELETE} or @code{INSERT}) that change -a transactional table (like BDB tables) are cached until a @code{COMMIT}. Any updates to a non-transactional table are stored in the binary log at -once. Every thread will, on start, allocate a buffer of +once. All updates (@code{UPDATE}, @code{DELETE} or @code{INSERT}) that change +a transactional table (like BDB tables) are cached until a @code{COMMIT}. +Every thread will, on start, allocate a buffer of @code{binlog_cache_size} to buffer queries. If a query is bigger than this, the thread will open a temporary file to handle the bigger cache. The temporary file will be deleted when the thread ends. @@ -23313,10 +23308,10 @@ more than @code{long_query_time} to execute. The time to get the initial table locks are not counted as execution time. The slow query log is logged after the query is executed and after all -locks has been released. This may be different from the order in which +locks have been released. This may be different from the order in which the statements are executed. -If no file name is given, it defaults to the name of the host machine +If no filename is given, it defaults to the name of the host machine suffixed with @code{-slow.log}. If a filename is given, but doesn't contain a path, the file is written in the data directory. @@ -23326,8 +23321,8 @@ can become a difficult task. You can pipe the slow query log through the @code{mysqldumpslow} command to get a summary of the queries which appear in the log. -You are using @code{--log-long-format} then also queries that are not -using indexes are printed. @xref{Command-line options}. +If you use @code{--log-long-format} also, then queries that do not +use indexes are logged as well. @xref{Command-line options}. @node Log file maintenance, , Slow query log, Log Files @@ -23337,22 +23332,19 @@ using indexes are printed. @xref{Command-line options}. @cindex maintaining, log files @cindex log files, maintaining -MySQL has a lot of log files which make it easy to see what is -going. @xref{Log Files}. One must however from time to time clean up -after @code{MysQL} to ensure that the logs don't take up too much disk -space. - -When using MySQL with log files, you will, from time to time, -want to remove/backup old log files and tell MySQL to start -logging on new files. @xref{Backup}. +MySQL has many log files which makes it easy to see what is going on. +@xref{Log Files}. One must, however, occasionally clean up +after @code{MySQL} to ensure that the logs don't take up too much disk +space by either removing or backing up old log files and then telling MySQL +to start logging to new files. @xref{Backup}. -On a Linux (@code{Redhat}) installation, you can use the +On a Linux (@code{Redhat}) installation you can use the @code{mysql-log-rotate} script for this. If you installed MySQL -from an RPM distribution, the script should have been installed -automatically. Note that you should be careful with this if you are using -the log for replication! +from an RPM distribution the script should have been installed +automatically. @strong{Note}: you should be careful with this if you are +using the logs for replication. -On other systems you must install a short script yourself that you +On other systems you must install a short script yourself that you can start from @code{cron} to handle log files. You can force MySQL to start using new log files by using -- cgit v1.2.1 From 1e5e67272cbafa576fe556ef6c20f5f9f9d5acdf Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 5 Aug 2002 09:41:48 +0200 Subject: make SEARCH_PREFIX to work with complex (use_strcoll) charsets --- mysys/my_handler.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mysys/my_handler.c b/mysys/my_handler.c index 1e7d8a702d2..5b68b427f3a 100644 --- a/mysys/my_handler.c +++ b/mysys/my_handler.c @@ -25,7 +25,8 @@ int mi_compare_text(CHARSET_INFO *charset_info, uchar *a, uint a_length, #ifdef USE_STRCOLL if (use_strcoll(charset_info)) { - /* QQ: This needs to work with part keys at some point */ + if (part_key && b_length < a_length) + a_length=b_length; return my_strnncoll(charset_info, a, a_length, b, b_length); } else -- cgit v1.2.1 From 29c723c8cfd3bb45a93f73081e7d542e5e76394a Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 6 Aug 2002 15:47:52 +0500 Subject: New file to generate a html page to review a charset BitKeeper/etc/ignore: Added mysys/charset2html to the ignore list --- .bzrignore | 1 + mysys/Makefile.am | 6 +++- mysys/charset2html.c | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 mysys/charset2html.c diff --git a/.bzrignore b/.bzrignore index 3b9576a47f0..6a02b58dca9 100644 --- a/.bzrignore +++ b/.bzrignore @@ -479,3 +479,4 @@ vio/test-sslclient vio/test-sslserver vio/viotest-ssl tests/client_test +mysys/charset2html diff --git a/mysys/Makefile.am b/mysys/Makefile.am index ec8a6b33224..4386a0cac76 100644 --- a/mysys/Makefile.am +++ b/mysys/Makefile.am @@ -53,10 +53,11 @@ EXTRA_DIST = thr_alarm.c thr_lock.c my_pthread.c my_thr_init.c \ thr_mutex.c thr_rwlock.c libmysys_a_LIBADD = @THREAD_LOBJECTS@ # test_fn removed 980815 since it not upp to date test_dir -noinst_PROGRAMS = test_charset @THREAD_LPROGRAMS@ +noinst_PROGRAMS = test_charset charset2html @THREAD_LPROGRAMS@ # test_dir_DEPENDENCIES= $(LIBRARIES) # testhash_DEPENDENCIES= $(LIBRARIES) test_charset_DEPENDENCIES= $(LIBRARIES) +charset2html_DEPENDENCIES= $(LIBRARIES) EXTRA_PROGRAMS = DEFS = -DDEFAULT_BASEDIR=\"$(prefix)\" \ -DDATADIR="\"$(MYSQLDATAdir)\"" \ @@ -109,6 +110,9 @@ test_dir: test_dir.c $(LIBRARIES) test_charset: test_charset.c $(LIBRARIES) $(LINK) $(FLAGS) -DMAIN $(srcdir)/test_charset.c $(LDADD) $(LIBS) +charset2html: charset2html.c $(LIBRARIES) + $(LINK) $(FLAGS) -DMAIN $(srcdir)/charset2html.c $(LDADD) $(LIBS) + testhash: testhash.c $(LIBRARIES) $(LINK) $(FLAGS) -DMAIN $(srcdir)/testhash.c $(LDADD) $(LIBS) diff --git a/mysys/charset2html.c b/mysys/charset2html.c new file mode 100644 index 00000000000..9a8fbe2b68f --- /dev/null +++ b/mysys/charset2html.c @@ -0,0 +1,100 @@ +/* Copyright (C) 2000 MySQL AB + + 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; either version 2 of the License, or + (at your option) any later version. + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + Written by Alexander Barkov to check what + a charset is in your favorite web browser +*/ + +#include +#include +#include +#include + +#include + +typedef struct char_info_st +{ + int srt; + int uni; + int low; + int upp; + int ctp; +} MY_CH; + +static int chcmp(const void *vf, const void *vs) +{ + const MY_CH *f=vf; + const MY_CH *s=vs; + + return f->srt-s->srt ? f->srt-s->srt : f->uni-s->uni; +} + +static void print_cs(CHARSET_INFO *cs) +{ + uint i; + MY_CH ch[256]; + + printf("\n"); + printf("\n"); + printf("\n"); + printf("
\n");
+  printf("Charset %s\n",cs->name);
+  
+  for (i=0; i<256; i++)
+  {
+    ch[i].srt=cs->sort_order[i];
+    ch[i].uni=cs->tab_to_uni[i];
+    ch[i].low=cs->tab_to_uni[cs->to_lower[i]];
+    ch[i].upp=cs->tab_to_uni[cs->to_upper[i]];
+    ch[i].ctp=cs->ctype[i+1];
+  }
+  
+  qsort(ch,256,sizeof(MY_CH),&chcmp);
+   
+  for (i=1; i<256; i++)
+  {
+    printf("%d %d &#%d; &#%d; &#%d;\n",ch[i].srt,ch[i].ctp,ch[i].uni,
+    				       ch[i].low,ch[i].upp);
+  }
+  printf("
\n"); + printf("\n"); +} + + +int main(int argc, char **argv) { + const char *the_set = MYSQL_CHARSET; + int argcnt = 1; + + my_init(); + + if (argc > argcnt && argv[argcnt][0] == '-' && argv[argcnt][1] == '#') + DBUG_PUSH(argv[argcnt++]+2); + + if (argc > argcnt) + the_set = argv[argcnt++]; + + if (argc > argcnt) + charsets_dir = argv[argcnt++]; + + if (set_default_charset_by_name(the_set, MYF(MY_WME))) + return 1; + + print_cs(default_charset_info); + + return 0; +} -- cgit v1.2.1 From 700cefd28bb970afb004745af71098034fa37038 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 6 Aug 2002 13:59:07 +0200 Subject: - Added missing files to distribution - removoved getopt.h (has been replaced by my_getopt.h) BitKeeper/deleted/.del-getopt.h~a9ae679fa84f395: Delete: include/getopt.h include/Makefile.am: - Added missing file my_getopt.h to distribution sql/Makefile.am: - Added missing files spatial.h adn gstream.h to distribution --- include/Makefile.am | 2 +- include/getopt.h | 151 ---------------------------------------------------- sql/Makefile.am | 2 +- 3 files changed, 2 insertions(+), 153 deletions(-) delete mode 100644 include/getopt.h diff --git a/include/Makefile.am b/include/Makefile.am index 85cd640a0a3..52a6d4fd758 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -29,7 +29,7 @@ noinst_HEADERS = config-win.h \ my_nosys.h my_alarm.h queues.h \ my_tree.h hash.h thr_alarm.h thr_lock.h \ t_ctype.h violite.h md5.h mysql_version.h.in \ - my_handler.h + my_handler.h my_getopt.h # mysql_version.h are generated SUPERCLEANFILES = mysql_version.h my_config.h diff --git a/include/getopt.h b/include/getopt.h deleted file mode 100644 index 94e73c03ff3..00000000000 --- a/include/getopt.h +++ /dev/null @@ -1,151 +0,0 @@ -/* Copyright (C) 2000 MySQL AB - - 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; either version 2 of the License, or - (at your option) any later version. - - 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -/* Declarations for getopt. - Copyright (C) 1989, 90, 91, 92, 93, 94 Free Software Foundation, Inc. - -This file is part of the GNU C Library. Its master source is NOT part of -the C library, however. The master source lives in /gd/gnu/lib. - -The GNU C 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; either version 2 of the -License, or (at your option) any later version. - -The GNU C 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 the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ - -#ifndef _GETOPT_H -#define _GETOPT_H 1 - -#ifdef __cplusplus -extern "C" { -#endif - -/* For communication from `getopt' to the caller. - When `getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when `ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - -extern char *optarg; - -/* Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to `getopt'. - - On entry to `getopt', zero means this is the first call; initialize. - - When `getopt' returns EOF, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, `optind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - -extern int optind; - -/* Callers store zero here to inhibit the error message `getopt' prints - for unrecognized options. */ - -extern int opterr; - -/* Set to an option character which was unrecognized. */ - -extern int optopt; - -/* Describe the long-named options requested by the application. - The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector - of `struct option' terminated by an element containing a name which is - zero. - - The field `has_arg' is: - no_argument (or 0) if the option does not take an argument, - required_argument (or 1) if the option requires an argument, - optional_argument (or 2) if the option takes an optional argument. - - If the field `flag' is not NULL, it points to a variable that is set - to the value given in the field `val' when the option is found, but - left unchanged if the option is not found. - - To have a long-named option do something other than set an `int' to - a compiled-in constant, such as set a value from `optarg', set the - option's `flag' field to zero and its `val' field to a nonzero - value (the equivalent single-letter option character, if there is - one). For long options that have a zero `flag' field, `getopt' - returns the contents of the `val' field. */ - -struct option -{ -#if defined (__STDC__) && __STDC__ || defined(__cplusplus) - const char *name; -#else - char *name; -#endif - /* has_arg can't be an enum because some compilers complain about - type mismatches in all the code that assumes it is an int. */ - int has_arg; - int *flag; - int val; -}; - -/* Names for the values of the `has_arg' field of `struct option'. */ - -#define no_argument 0 -#define required_argument 1 -#define optional_argument 2 - -#if ( defined (__STDC__) && __STDC__ ) || defined(__cplusplus) || defined(MSDOS) -#ifdef __EMX__ -int getopt (int, char **, __const__ char *); -#elif defined( __GNU_LIBRARY__) -/* Many other libraries have conflicting prototypes for getopt, with - differences in the consts, in stdlib.h. To avoid compilation - errors, only prototype getopt for the GNU C library. */ -extern int getopt (int argc, char *const *argv, const char *shortopts); -#else /* not __GNU_LIBRARY__ */ -extern int getopt (int argc, char *const *argv, const char *optstring); -#endif /* __GNU_LIBRARY__ */ -extern int getopt_long (int argc, char *const *argv, const char *shortopts, - const struct option *longopts, int *longind); -extern int getopt_long_only (int argc, char *const *argv, - const char *shortopts, - const struct option *longopts, int *longind); - -/* Internal only. Users should not call this directly. */ -extern int _getopt_internal (int argc, char *const *argv, - const char *shortopts, - const struct option *longopts, int *longind, - int long_only); -#else /* not __STDC__ */ -extern int getopt (); -extern int getopt_long (); -extern int getopt_long_only (); - -extern int _getopt_internal (); -#endif /* __STDC__ */ - -#ifdef __cplusplus -} -#endif - -#endif /* _GETOPT_H */ diff --git a/sql/Makefile.am b/sql/Makefile.am index 81fe927ce5a..9cfdf4c4d9b 100644 --- a/sql/Makefile.am +++ b/sql/Makefile.am @@ -56,7 +56,7 @@ noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \ sql_select.h structs.h table.h sql_udf.h hash_filo.h\ lex.h lex_symbol.h sql_acl.h sql_crypt.h \ log_event.h mini_client.h sql_repl.h slave.h \ - stacktrace.h sql_sort.h sql_cache.h + stacktrace.h sql_sort.h sql_cache.h spatial.h gstream.h mysqld_SOURCES = sql_lex.cc sql_handler.cc \ item.cc item_sum.cc item_buff.cc item_func.cc \ item_cmpfunc.cc item_strfunc.cc item_timefunc.cc \ -- cgit v1.2.1 From 01a8a45f1eb70cbada195ab3c838137294b636fb Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 6 Aug 2002 19:29:33 +0500 Subject: New CRC32() SQL function --- sql/item_create.cc | 5 +++++ sql/item_create.h | 1 + sql/item_func.cc | 13 +++++++++++++ sql/item_func.h | 10 ++++++++++ sql/lex.h | 1 + 5 files changed, 30 insertions(+) diff --git a/sql/item_create.cc b/sql/item_create.cc index 9204d23b8c2..a41ba1cc526 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -86,6 +86,11 @@ Item *create_func_cot(Item* a) new Item_func_tan(a)); } +Item *create_func_crc32(Item* a) +{ + return new Item_func_crc32(a); +} + Item *create_func_date_format(Item* a,Item *b) { return new Item_func_date_format(a,b,0); diff --git a/sql/item_create.h b/sql/item_create.h index 6f7e8ebf89a..fd9a856f283 100644 --- a/sql/item_create.h +++ b/sql/item_create.h @@ -29,6 +29,7 @@ Item *create_func_connection_id(void); Item *create_func_conv(Item* a, Item *b, Item *c); Item *create_func_cos(Item* a); Item *create_func_cot(Item* a); +Item *create_func_crc32(Item* a); Item *create_func_date_format(Item* a,Item *b); Item *create_func_dayname(Item* a); Item *create_func_dayofmonth(Item* a); diff --git a/sql/item_func.cc b/sql/item_func.cc index ae3fc7cb8f0..8728187718c 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -26,6 +26,7 @@ #include #include #include +#include #include "slave.h" // for wait_for_master_pos #include "gstream.h" @@ -801,6 +802,18 @@ longlong Item_func_min_max::val_int() return value; } +longlong Item_func_crc32::val_int() +{ + String *res=args[0]->val_str(&value); + if (!res) + { + null_value=1; + return 0; /* purecov: inspected */ + } + null_value=0; + return (longlong) crc32(0L, (Bytef*)res->ptr(), res->length()); +} + longlong Item_func_length::val_int() { diff --git a/sql/item_func.h b/sql/item_func.h index 86b2a17931d..2e61ed87c3c 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -518,6 +518,16 @@ public: const char *func_name() const { return "greatest"; } }; +class Item_func_crc32 :public Item_int_func +{ + String value; +public: + Item_func_crc32(Item *a) :Item_int_func(a) {} + longlong val_int(); + const char *func_name() const { return "crc32"; } + void fix_length_and_dec() { max_length=10; } +}; + class Item_func_length :public Item_int_func { diff --git a/sql/lex.h b/sql/lex.h index 4af36df58af..c41ad8c1d44 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -430,6 +430,7 @@ static SYMBOL sql_functions[] = { { "COUNT", SYM(COUNT_SYM),0,0}, { "COS", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_cos)}, { "COT", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_cot)}, + { "CRC32", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_crc32)}, { "CROSSES", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_crosses)}, { "CURDATE", SYM(CURDATE),0,0}, { "CURTIME", SYM(CURTIME),0,0}, -- cgit v1.2.1 From 7b2ac5736a4949853e883277f921a5a610f6bf77 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 8 Aug 2002 21:43:44 +0200 Subject: server-key.pem regenerated server-cert.pem regenerated client-key.pem regenerated client-cert.pem regenerated cacert.pem regenerated sslopt-case.h changed optarg to argument, decomment --ssl-key include/sslopt-case.h: changed optarg to argument, decomment --ssl-key SSL/cacert.pem: regenerated SSL/client-cert.pem: regenerated SSL/client-key.pem: regenerated SSL/server-cert.pem: regenerated SSL/server-key.pem: regenerated --- SSL/cacert.pem | 37 +++++++++++---------- SSL/client-cert.pem | 89 +++++++++++++++++++++++++-------------------------- SSL/client-key.pem | 26 +++++++-------- SSL/server-cert.pem | 88 +++++++++++++++++++++++++------------------------- SSL/server-key.pem | 26 +++++++-------- include/sslopt-case.h | 10 +++--- 6 files changed, 137 insertions(+), 139 deletions(-) diff --git a/SSL/cacert.pem b/SSL/cacert.pem index 862e07114c5..698784b49f9 100644 --- a/SSL/cacert.pem +++ b/SSL/cacert.pem @@ -1,21 +1,20 @@ -----BEGIN CERTIFICATE----- -MIIDaDCCAtGgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBhTELMAkGA1UEBhMCRkkx -EzARBgNVBAgTClNvbWUtU3RhdGUxETAPBgNVBAcTCEhlbHNpbmtpMRkwFwYDVQQK -ExBNeVNRTCBGaW5sYW5kIEFCMRQwEgYDVQQDEwtUb251IFNhbXVlbDEdMBsGCSqG -SIb3DQEJARYOdG9udUBteXNxbC5jb20wHhcNMDEwNjI0MTU0MzE4WhcNMDIwNjI0 -MTU0MzE4WjCBhTELMAkGA1UEBhMCRkkxEzARBgNVBAgTClNvbWUtU3RhdGUxETAP -BgNVBAcTCEhlbHNpbmtpMRkwFwYDVQQKExBNeVNRTCBGaW5sYW5kIEFCMRQwEgYD -VQQDEwtUb251IFNhbXVlbDEdMBsGCSqGSIb3DQEJARYOdG9udUBteXNxbC5jb20w -gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJz9FCvWX8c+Xr6mxzfZvPainIPT -ODNsQ0f2kAs0epP+peUn4LHxLybp2dkUHTtJLXyUyk7cXfnUd+0fRazK2/Vz48bZ -swGwg9Rhg3P02Ku+CMWYulHzN6uVRzfrDUSkDoky2DGL3A6B8P4JRc2qcr+kjhh5 -6r1VJlXs9N3DqeEdAgMBAAGjgeUwgeIwHQYDVR0OBBYEFKUK1nK13+TCK3sHXtNN -Ugfhg2t/MIGyBgNVHSMEgaowgaeAFKUK1nK13+TCK3sHXtNNUgfhg2t/oYGLpIGI -MIGFMQswCQYDVQQGEwJGSTETMBEGA1UECBMKU29tZS1TdGF0ZTERMA8GA1UEBxMI -SGVsc2lua2kxGTAXBgNVBAoTEE15U1FMIEZpbmxhbmQgQUIxFDASBgNVBAMTC1Rv -bnUgU2FtdWVsMR0wGwYJKoZIhvcNAQkBFg50b251QG15c3FsLmNvbYIBADAMBgNV -HRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4GBAI+YJKoa+IP3WYr8iLcVk5j7lZ9D -GS8reuALafnE7VX1xMlXP5EnJjT7YYYmtiB2tYj7+eQ+ajRXWWyY5NtO5ob+dm8z -OBX43v08C5vNSAFpwZWTutzb0nSd8kOABGJ04MBDJZk8QNkTfU6C7c3ZJ/gW8Guv -I+cxfz6oCYEfKLBN +MIIDQjCCAqugAwIBAgIBADANBgkqhkiG9w0BAQQFADB6MQswCQYDVQQGEwJSVTET +MBEGA1UECBMKU29tZS1TdGF0ZTERMA8GA1UEBxMIT3JlbmJ1cmcxETAPBgNVBAoT +CE15U1FMIEFCMQ8wDQYDVQQDEwZXYWxydXMxHzAdBgkqhkiG9w0BCQEWEHdhbHJ1 +c0BteXNxbC5jb20wHhcNMDIwODAyMjE1NTUzWhcNMDMwODAyMjE1NTUzWjB6MQsw +CQYDVQQGEwJSVTETMBEGA1UECBMKU29tZS1TdGF0ZTERMA8GA1UEBxMIT3JlbmJ1 +cmcxETAPBgNVBAoTCE15U1FMIEFCMQ8wDQYDVQQDEwZXYWxydXMxHzAdBgkqhkiG +9w0BCQEWEHdhbHJ1c0BteXNxbC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ +AoGBALFLPDNDeq213XvhBP3TxhC0NcGKJ/sWzaHkNmunQ8sTbV8AfdFafvP7cSHk +O3jh7smpVWnxmcIbq1dpsbb7X5vQVc8ru07Z8VhCJWx6H8kgI95Am6wbm2ho2Lok +9ODG8f/lA4kLv8Vo0hqtfV5T1mnZpSzkh6G4b0yPzHu8gtObAgMBAAGjgdcwgdQw +HQYDVR0OBBYEFNnYan2rzhBiGhb86Wr03PFmrNC5MIGkBgNVHSMEgZwwgZmAFNnY +an2rzhBiGhb86Wr03PFmrNC5oX6kfDB6MQswCQYDVQQGEwJSVTETMBEGA1UECBMK +U29tZS1TdGF0ZTERMA8GA1UEBxMIT3JlbmJ1cmcxETAPBgNVBAoTCE15U1FMIEFC +MQ8wDQYDVQQDEwZXYWxydXMxHzAdBgkqhkiG9w0BCQEWEHdhbHJ1c0BteXNxbC5j +b22CAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQADeMZEA5Rh4PDq +DmS9cYyogjb9gkuLHeo/pqfU8iSZVsSaf6Uqh6TWKQOuK3I4R1K8iMo4cW6LhxxH +HLFrVIQn6xhLvfC0T6Zl7G0w6rAY2+QlbEhjnsgHtLGrB5xjSYLq6Uz3gAMbEsA4 +rCpQJECDe2PzoUXZj9mE2sdljiGcvQ== -----END CERTIFICATE----- diff --git a/SSL/client-cert.pem b/SSL/client-cert.pem index cab2a635d9f..729379babdc 100644 --- a/SSL/client-cert.pem +++ b/SSL/client-cert.pem @@ -1,26 +1,26 @@ Certificate: Data: Version: 3 (0x2) - Serial Number: 3 (0x3) + Serial Number: 2 (0x2) Signature Algorithm: md5WithRSAEncryption - Issuer: C=FI, ST=Some-State, L=Helsinki, O=MySQL Finland AB, CN=Tonu Samuel/Email=tonu@mysql.com + Issuer: C=RU, ST=Some-State, L=Orenburg, O=MySQL AB, CN=Walrus/Email=walrus@mysql.com Validity - Not Before: Jun 24 16:03:20 2001 GMT - Not After : Jun 24 16:03:20 2002 GMT - Subject: C=EE, ST=Some-State, L=Tallinn, O=MySQL demo client certificate, CN=Tonu Samuel/Email=tonu@mysql.com + Not Before: Aug 2 22:08:07 2002 GMT + Not After : Aug 2 22:08:07 2003 GMT + Subject: C=RU, L=orenburg, O=MySQL AB, OU=client, CN=walrus/Email=walrus@mysql.com Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): - 00:e8:d4:52:cd:4e:bb:96:16:3a:f0:89:6b:90:4c: - db:e0:30:75:5a:02:72:62:bf:ed:da:be:09:e8:80: - db:80:54:30:d6:75:ed:e3:10:a5:15:44:5b:29:91: - 12:fe:0c:b7:76:4d:e9:5f:56:5c:45:3c:ad:b2:71: - 2d:6a:7a:cb:bc:04:80:08:74:d6:7d:f6:7c:5c:76: - db:35:c4:f6:f5:d8:d4:89:9f:9d:cc:3f:4e:3f:73: - c1:3e:41:7e:4e:09:bf:ea:1a:d9:a2:13:0d:d1:0c: - da:d8:f4:9b:b8:54:21:17:ae:d7:b3:02:61:87:a9: - 01:ff:f4:fe:9c:7a:fc:67:43 + 00:ab:27:e4:1e:f0:34:8b:a9:50:df:0a:b0:55:20: + b3:1f:0f:cf:f1:51:1e:66:48:a6:f8:4e:0d:d4:49: + f4:ea:d3:41:6b:7e:06:78:3c:29:9d:8e:d3:33:4d: + 0b:fc:34:4d:18:88:48:61:af:11:da:db:84:c0:92: + 91:81:6a:b6:21:d5:8e:9b:f2:6f:d8:06:ad:d6:77: + f6:8b:bd:07:d5:b7:fb:c6:f0:64:e6:3f:58:f0:6a: + 1e:81:73:97:6d:9d:c6:ec:b0:5e:1e:c6:57:82:b0: + 98:9c:ae:26:84:43:0d:98:6c:b4:d8:52:13:70:15: + 79:61:40:84:19:ea:f6:63:3f Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: @@ -28,40 +28,39 @@ Certificate: Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: - BC:FB:BB:8F:C4:85:BA:5F:A8:F2:C3:3D:C9:0F:DB:16:E7:13:BC:B2 + A6:D9:70:92:AC:2B:F6:48:A5:FB:29:CF:78:4A:57:B5:3B:43:97:EE X509v3 Authority Key Identifier: - keyid:A5:0A:D6:72:B5:DF:E4:C2:2B:7B:07:5E:D3:4D:52:07:E1:83:6B:7F - DirName:/C=FI/ST=Some-State/L=Helsinki/O=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@mysql.com + keyid:D9:D8:6A:7D:AB:CE:10:62:1A:16:FC:E9:6A:F4:DC:F1:66:AC:D0:B9 + DirName:/C=RU/ST=Some-State/L=Orenburg/O=MySQL AB/CN=Walrus/Email=walrus@mysql.com serial:00 Signature Algorithm: md5WithRSAEncryption - 1c:e0:87:2c:2f:b3:a4:39:44:7f:96:7b:2f:c9:1f:91:84:0b: - 9f:d0:0a:f8:40:70:d0:dd:bd:91:0a:c6:d5:ac:8f:51:77:9c: - 35:28:e8:b6:5f:57:9e:5c:b5:9b:ae:5d:3d:7c:05:45:2e:89: - 3a:03:e1:f2:00:cb:c1:ed:3e:48:3b:5f:4e:50:d2:b4:a5:36: - 0f:1a:dc:79:49:1e:03:2f:27:c1:e4:62:d6:ef:3f:ab:2e:ab: - dd:e5:bc:cb:20:a3:dd:ab:81:69:26:9c:03:42:1b:4c:b7:aa: - 57:6d:2a:de:c0:5e:6e:74:d0:83:90:ec:ad:bb:ba:f0:cc:cf: - 41:3d + 15:96:43:10:89:e0:a6:82:a4:91:0f:7e:2e:d8:80:54:ba:63: + e2:8f:b0:aa:ea:be:35:2c:8f:0d:03:a9:86:2e:32:51:33:8a: + cc:b2:5e:b3:12:cb:b7:42:06:40:89:ce:92:87:40:f1:6a:79: + 0c:3e:00:1d:06:bf:3c:c1:da:f6:3b:e1:42:e6:55:4c:31:e1: + b9:79:f3:99:14:f6:68:9e:67:2b:e3:71:88:6b:2b:e2:08:bd: + 67:79:ea:0e:7d:34:0d:41:22:3a:f4:8f:4d:51:07:6f:5a:44: + 34:05:d1:b3:ca:cf:09:2b:43:25:a1:7f:ac:f4:54:f1:e3:93: + 47:44 -----BEGIN CERTIFICATE----- -MIIDoTCCAwqgAwIBAgIBAzANBgkqhkiG9w0BAQQFADCBhTELMAkGA1UEBhMCRkkx -EzARBgNVBAgTClNvbWUtU3RhdGUxETAPBgNVBAcTCEhlbHNpbmtpMRkwFwYDVQQK -ExBNeVNRTCBGaW5sYW5kIEFCMRQwEgYDVQQDEwtUb251IFNhbXVlbDEdMBsGCSqG -SIb3DQEJARYOdG9udUBteXNxbC5jb20wHhcNMDEwNjI0MTYwMzIwWhcNMDIwNjI0 -MTYwMzIwWjCBkTELMAkGA1UEBhMCRUUxEzARBgNVBAgTClNvbWUtU3RhdGUxEDAO -BgNVBAcTB1RhbGxpbm4xJjAkBgNVBAoTHU15U1FMIGRlbW8gY2xpZW50IGNlcnRp -ZmljYXRlMRQwEgYDVQQDEwtUb251IFNhbXVlbDEdMBsGCSqGSIb3DQEJARYOdG9u -dUBteXNxbC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOjUUs1Ou5YW -OvCJa5BM2+AwdVoCcmK/7dq+CeiA24BUMNZ17eMQpRVEWymREv4Mt3ZN6V9WXEU8 -rbJxLWp6y7wEgAh01n32fFx22zXE9vXY1Imfncw/Tj9zwT5Bfk4Jv+oa2aITDdEM -2tj0m7hUIReu17MCYYepAf/0/px6/GdDAgMBAAGjggERMIIBDTAJBgNVHRMEAjAA -MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd -BgNVHQ4EFgQUvPu7j8SFul+o8sM9yQ/bFucTvLIwgbIGA1UdIwSBqjCBp4AUpQrW -crXf5MIrewde001SB+GDa3+hgYukgYgwgYUxCzAJBgNVBAYTAkZJMRMwEQYDVQQI -EwpTb21lLVN0YXRlMREwDwYDVQQHEwhIZWxzaW5raTEZMBcGA1UEChMQTXlTUUwg -RmlubGFuZCBBQjEUMBIGA1UEAxMLVG9udSBTYW11ZWwxHTAbBgkqhkiG9w0BCQEW -DnRvbnVAbXlzcWwuY29tggEAMA0GCSqGSIb3DQEBBAUAA4GBABzghywvs6Q5RH+W -ey/JH5GEC5/QCvhAcNDdvZEKxtWsj1F3nDUo6LZfV55ctZuuXT18BUUuiToD4fIA -y8HtPkg7X05Q0rSlNg8a3HlJHgMvJ8HkYtbvP6suq93lvMsgo92rgWkmnANCG0y3 -qldtKt7AXm500IOQ7K27uvDMz0E9 +MIIDajCCAtOgAwIBAgIBAjANBgkqhkiG9w0BAQQFADB6MQswCQYDVQQGEwJSVTET +MBEGA1UECBMKU29tZS1TdGF0ZTERMA8GA1UEBxMIT3JlbmJ1cmcxETAPBgNVBAoT +CE15U1FMIEFCMQ8wDQYDVQQDEwZXYWxydXMxHzAdBgkqhkiG9w0BCQEWEHdhbHJ1 +c0BteXNxbC5jb20wHhcNMDIwODAyMjIwODA3WhcNMDMwODAyMjIwODA3WjB2MQsw +CQYDVQQGEwJSVTERMA8GA1UEBxMIb3JlbmJ1cmcxETAPBgNVBAoTCE15U1FMIEFC +MQ8wDQYDVQQLEwZjbGllbnQxDzANBgNVBAMTBndhbHJ1czEfMB0GCSqGSIb3DQEJ +ARYQd2FscnVzQG15c3FsLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA +qyfkHvA0i6lQ3wqwVSCzHw/P8VEeZkim+E4N1En06tNBa34GeDwpnY7TM00L/DRN +GIhIYa8R2tuEwJKRgWq2IdWOm/Jv2Aat1nf2i70H1bf7xvBk5j9Y8GoegXOXbZ3G +7LBeHsZXgrCYnK4mhEMNmGy02FITcBV5YUCEGer2Yz8CAwEAAaOCAQIwgf8wCQYD +VR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlm +aWNhdGUwHQYDVR0OBBYEFKbZcJKsK/ZIpfspz3hKV7U7Q5fuMIGkBgNVHSMEgZww +gZmAFNnYan2rzhBiGhb86Wr03PFmrNC5oX6kfDB6MQswCQYDVQQGEwJSVTETMBEG +A1UECBMKU29tZS1TdGF0ZTERMA8GA1UEBxMIT3JlbmJ1cmcxETAPBgNVBAoTCE15 +U1FMIEFCMQ8wDQYDVQQDEwZXYWxydXMxHzAdBgkqhkiG9w0BCQEWEHdhbHJ1c0Bt +eXNxbC5jb22CAQAwDQYJKoZIhvcNAQEEBQADgYEAFZZDEIngpoKkkQ9+LtiAVLpj +4o+wquq+NSyPDQOphi4yUTOKzLJesxLLt0IGQInOkodA8Wp5DD4AHQa/PMHa9jvh +QuZVTDHhuXnzmRT2aJ5nK+NxiGsr4gi9Z3nqDn00DUEiOvSPTVEHb1pENAXRs8rP +CStDJaF/rPRU8eOTR0Q= -----END CERTIFICATE----- diff --git a/SSL/client-key.pem b/SSL/client-key.pem index 7672939b60a..feff11bfdb7 100644 --- a/SSL/client-key.pem +++ b/SSL/client-key.pem @@ -1,15 +1,15 @@ -----BEGIN RSA PRIVATE KEY----- -MIICXgIBAAKBgQDo1FLNTruWFjrwiWuQTNvgMHVaAnJiv+3avgnogNuAVDDWde3j -EKUVRFspkRL+DLd2TelfVlxFPK2ycS1qesu8BIAIdNZ99nxcdts1xPb12NSJn53M -P04/c8E+QX5OCb/qGtmiEw3RDNrY9Ju4VCEXrtezAmGHqQH/9P6cevxnQwIDAQAB -AoGBANxd4cUaaOfkQILbvigE5vMpSlkYCcW3XNv1lJEwLREoHlVNpwuL/IPFf/c2 -rWAxDw/1LBYlOg36IXjMMC0g7mRHHoJhdJaFLGdlfclYQvqQ+8JAsAv6UNC63+pn -B5sZOxOuoj7lYN+D9mFVD4qTo3eTUYEOvvmS1j3hCsD2nNNBAkEA+lJUs7Y3KjCF -COZ7XQCkC47rVzkdZ5ey1Z+vVw5SrnUvj6n9i0NEax1jX6JPIhPU7+x90KFkt0ki -pKHd7UQ04wJBAO4caWNnYvmIorCRDy9Q/iAAow5WC6fQlkSlBIe3lRme6Ne8Yxaq -BzlSGYu1ndPkTGEa9PFNNCJm7RtvCBFx8iECQQCkdUzi2Rc7J69vnoV0H8SnN1mU -75hLBBZhVU1MY8OcjK8XsvY59ZLQ0PkFzswwtljS3Ev4suBJrsoM4a+9f29DAkEA -5NTrN3vZc6SrbXLLHBcDUrAqBBIPe4SLlYbdVqzInunILeS/eb2H2b+cC1dMSaHj -AYONmQUwMEuoXTAUmede4QJARK6jEslg/ev8BtMvITP2b6pRCb1w8lOtT5u5Bwnc -NpI3suqSQSQPtRSWQYcdyxrKr2TQEZU7h8R9bVB4b0qAmQ== +MIICXQIBAAKBgQCrJ+Qe8DSLqVDfCrBVILMfD8/xUR5mSKb4Tg3USfTq00FrfgZ4 +PCmdjtMzTQv8NE0YiEhhrxHa24TAkpGBarYh1Y6b8m/YBq3Wd/aLvQfVt/vG8GTm +P1jwah6Bc5dtncbssF4exleCsJicriaEQw2YbLTYUhNwFXlhQIQZ6vZjPwIDAQAB +AoGAChyxPaKzeAzo2kSnZmAoNQ2aG4fPY/um4cS6zHASKE2S7+biOvhS/RwTHlTP +AHeWlnx2yk6tn2CY10fRkPPdDsnyj7FpuZmjhmFtprOn+1Mwft7gNTMdKN2EV46/ +hMQxm8/Wu9ejm6IhOeg3Q7lBFwE9tY0kgMzU4zDI3A0HDQECQQDUcxFgxIrOi4Gw +EGxmJgopL+NjG7/4PdT2FM5z1bbwOtfsD1fHKWSiODbfpK8eMwBReI4wfDQ7ViND +xmuDykFDAkEAzj3QH9s8Ej3Vgt88326OhY1W5jTH6M0XkuZ0YatELz3MvLwFhIF4 +puouLJQVo3pQBLV+Tmnh2LQqkii7xA7oVQJBALZxzvW0M6QmyAvEPuMGPema94KQ +PS7ZIr7lpVpyqTTqw600i+Q8VvC8p9stmTmtANP2XN2kfFKMqaI1jvVRxvMCQDJE +8sOxBjVUCQS7MPUs12RKDRJTbx6ZTtOphFiCDD6Pi6W9FoMzo5rbnaGT/qo4F+Tt +7/lg6YGOeInjj9C76XkCQQC2m6j8NeX9E4Pimp1GDE93N2JJ+biJxLI8yFqruv7N +B2M/28JKLGLjam6YVJy4eSA9clXVqwWNxii3fb8qQ7u6 -----END RSA PRIVATE KEY----- diff --git a/SSL/server-cert.pem b/SSL/server-cert.pem index 069063a9de9..b15bd04a25c 100644 --- a/SSL/server-cert.pem +++ b/SSL/server-cert.pem @@ -1,26 +1,26 @@ Certificate: Data: Version: 3 (0x2) - Serial Number: 2 (0x2) + Serial Number: 1 (0x1) Signature Algorithm: md5WithRSAEncryption - Issuer: C=FI, ST=Some-State, L=Helsinki, O=MySQL Finland AB, CN=Tonu Samuel/Email=tonu@mysql.com + Issuer: C=RU, ST=Some-State, L=Orenburg, O=MySQL AB, CN=Walrus/Email=walrus@mysql.com Validity - Not Before: Jun 24 16:02:28 2001 GMT - Not After : Jun 24 16:02:28 2002 GMT - Subject: C=EE, ST=Some-State, L=Tallinn, O=MySQL server demo certificate, CN=Tonu Samuel/Email=tonu@mysql.com + Not Before: Aug 2 21:59:26 2002 GMT + Not After : Aug 2 21:59:26 2003 GMT + Subject: C=RU, L=Orenburg, O=MySQL AB, CN=server/Email=walrus@mysql.com Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): - 00:9e:ac:8d:d8:1d:9c:b2:fd:88:96:2c:ba:42:53: - fa:5d:bd:85:8a:e5:ca:d3:0f:c0:01:3c:f2:92:46: - 4f:d9:80:ae:2a:89:cf:ef:e8:d4:65:fc:f6:f5:3a: - 26:4c:29:db:06:fa:34:a1:87:f3:97:b5:3c:94:f1: - 84:05:ac:ad:57:25:d9:02:db:00:71:e0:a9:aa:b4: - 1d:29:36:5e:a9:a4:0d:f2:45:b9:83:74:2b:45:f3: - e2:23:bc:e7:5c:e6:11:b6:f6:dd:c4:ac:ed:65:42: - 2c:39:47:2a:c9:eb:5f:45:03:10:ab:23:bc:ca:5c: - 82:9a:b7:b3:6d:67:18:d2:c7 + 00:bd:7d:f1:91:51:38:fe:4b:79:b5:ff:e0:41:ae: + 0e:a8:bb:7b:60:42:95:01:75:e7:22:74:55:7d:74: + 4d:50:51:0c:5e:09:4b:2b:0c:8e:3f:9f:14:3f:5e: + d9:25:36:9b:cc:77:35:30:e9:8c:bf:3b:bd:da:62: + 85:4c:90:c8:de:71:2c:0a:7b:dc:e6:85:fd:b4:24: + 88:a7:8f:03:3d:15:7c:59:3d:f8:73:f0:36:2a:b8: + 80:7c:d8:c7:d6:1f:6d:b2:b7:b7:48:9f:24:56:81: + 2c:2e:9c:b9:95:48:50:56:9f:1a:60:96:c4:c0:eb: + 8d:2d:55:38:3f:6b:82:bc:b3 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: @@ -28,40 +28,38 @@ Certificate: Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: - 94:68:BF:DA:F6:E2:09:EF:3A:C8:27:AE:D7:B7:02:F0:DC:4B:C1:3B + C9:D0:D2:F7:17:79:27:1C:4B:C9:E7:92:D5:5E:8C:7E:F2:FE:A7:B7 X509v3 Authority Key Identifier: - keyid:A5:0A:D6:72:B5:DF:E4:C2:2B:7B:07:5E:D3:4D:52:07:E1:83:6B:7F - DirName:/C=FI/ST=Some-State/L=Helsinki/O=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@mysql.com + keyid:D9:D8:6A:7D:AB:CE:10:62:1A:16:FC:E9:6A:F4:DC:F1:66:AC:D0:B9 + DirName:/C=RU/ST=Some-State/L=Orenburg/O=MySQL AB/CN=Walrus/Email=walrus@mysql.com serial:00 Signature Algorithm: md5WithRSAEncryption - 8c:1a:90:70:f6:1a:70:0e:c9:28:93:74:e2:2b:b8:2a:d0:ce: - 40:15:e8:af:44:f8:89:16:20:f5:c2:b9:ed:aa:4e:3c:40:e2: - 9c:62:aa:48:98:ac:17:84:ef:35:72:59:43:09:35:17:c5:9a: - 3e:3d:ef:97:bf:57:f2:2a:f6:56:5d:a4:7c:68:58:b9:d6:9b: - 0f:57:0e:55:22:17:b0:b7:77:27:4f:da:b3:88:c1:6d:d6:8f: - 31:ec:0d:a2:25:60:66:2f:0f:86:8a:d6:08:b8:71:b1:b5:70: - 60:04:56:96:ff:bd:5e:ed:94:bc:44:bd:24:e0:2f:90:e5:23: - 51:4e + 62:77:bc:16:dc:4c:70:63:4d:03:ce:19:5e:c4:6c:31:0e:57: + 26:d8:6e:25:08:f2:01:ae:98:59:0a:ba:b7:32:c0:39:69:b8: + 4b:aa:59:7c:97:72:4e:50:02:ee:ef:d6:d6:62:b8:25:36:91: + b6:3b:8f:6f:2f:3c:d8:9d:b7:cf:8f:f6:29:50:e9:31:54:77: + 2b:7b:21:72:0f:60:4c:d4:1c:bb:c4:46:e5:fd:a7:5f:ea:46: + e4:df:e9:95:77:2d:91:f8:3b:33:78:83:5d:10:de:98:7c:38: + 91:27:f6:52:8a:b6:54:f1:0f:7a:f0:1d:da:a5:22:d2:75:cc: + 4c:c3 -----BEGIN CERTIFICATE----- -MIIDoTCCAwqgAwIBAgIBAjANBgkqhkiG9w0BAQQFADCBhTELMAkGA1UEBhMCRkkx -EzARBgNVBAgTClNvbWUtU3RhdGUxETAPBgNVBAcTCEhlbHNpbmtpMRkwFwYDVQQK -ExBNeVNRTCBGaW5sYW5kIEFCMRQwEgYDVQQDEwtUb251IFNhbXVlbDEdMBsGCSqG -SIb3DQEJARYOdG9udUBteXNxbC5jb20wHhcNMDEwNjI0MTYwMjI4WhcNMDIwNjI0 -MTYwMjI4WjCBkTELMAkGA1UEBhMCRUUxEzARBgNVBAgTClNvbWUtU3RhdGUxEDAO -BgNVBAcTB1RhbGxpbm4xJjAkBgNVBAoTHU15U1FMIHNlcnZlciBkZW1vIGNlcnRp -ZmljYXRlMRQwEgYDVQQDEwtUb251IFNhbXVlbDEdMBsGCSqGSIb3DQEJARYOdG9u -dUBteXNxbC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJ6sjdgdnLL9 -iJYsukJT+l29hYrlytMPwAE88pJGT9mAriqJz+/o1GX89vU6Jkwp2wb6NKGH85e1 -PJTxhAWsrVcl2QLbAHHgqaq0HSk2XqmkDfJFuYN0K0Xz4iO851zmEbb23cSs7WVC -LDlHKsnrX0UDEKsjvMpcgpq3s21nGNLHAgMBAAGjggERMIIBDTAJBgNVHRMEAjAA -MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd -BgNVHQ4EFgQUlGi/2vbiCe86yCeu17cC8NxLwTswgbIGA1UdIwSBqjCBp4AUpQrW -crXf5MIrewde001SB+GDa3+hgYukgYgwgYUxCzAJBgNVBAYTAkZJMRMwEQYDVQQI -EwpTb21lLVN0YXRlMREwDwYDVQQHEwhIZWxzaW5raTEZMBcGA1UEChMQTXlTUUwg -RmlubGFuZCBBQjEUMBIGA1UEAxMLVG9udSBTYW11ZWwxHTAbBgkqhkiG9w0BCQEW -DnRvbnVAbXlzcWwuY29tggEAMA0GCSqGSIb3DQEBBAUAA4GBAIwakHD2GnAOySiT -dOIruCrQzkAV6K9E+IkWIPXCue2qTjxA4pxiqkiYrBeE7zVyWUMJNRfFmj4975e/ -V/Iq9lZdpHxoWLnWmw9XDlUiF7C3dydP2rOIwW3WjzHsDaIlYGYvD4aK1gi4cbG1 -cGAEVpb/vV7tlLxEvSTgL5DlI1FO +MIIDWTCCAsKgAwIBAgIBATANBgkqhkiG9w0BAQQFADB6MQswCQYDVQQGEwJSVTET +MBEGA1UECBMKU29tZS1TdGF0ZTERMA8GA1UEBxMIT3JlbmJ1cmcxETAPBgNVBAoT +CE15U1FMIEFCMQ8wDQYDVQQDEwZXYWxydXMxHzAdBgkqhkiG9w0BCQEWEHdhbHJ1 +c0BteXNxbC5jb20wHhcNMDIwODAyMjE1OTI2WhcNMDMwODAyMjE1OTI2WjBlMQsw +CQYDVQQGEwJSVTERMA8GA1UEBxMIT3JlbmJ1cmcxETAPBgNVBAoTCE15U1FMIEFC +MQ8wDQYDVQQDEwZzZXJ2ZXIxHzAdBgkqhkiG9w0BCQEWEHdhbHJ1c0BteXNxbC5j +b20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAL198ZFROP5LebX/4EGuDqi7 +e2BClQF15yJ0VX10TVBRDF4JSysMjj+fFD9e2SU2m8x3NTDpjL87vdpihUyQyN5x +LAp73OaF/bQkiKePAz0VfFk9+HPwNiq4gHzYx9YfbbK3t0ifJFaBLC6cuZVIUFaf +GmCWxMDrjS1VOD9rgryzAgMBAAGjggECMIH/MAkGA1UdEwQCMAAwLAYJYIZIAYb4 +QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBTJ +0NL3F3knHEvJ55LVXox+8v6ntzCBpAYDVR0jBIGcMIGZgBTZ2Gp9q84QYhoW/Olq +9NzxZqzQuaF+pHwwejELMAkGA1UEBhMCUlUxEzARBgNVBAgTClNvbWUtU3RhdGUx +ETAPBgNVBAcTCE9yZW5idXJnMREwDwYDVQQKEwhNeVNRTCBBQjEPMA0GA1UEAxMG +V2FscnVzMR8wHQYJKoZIhvcNAQkBFhB3YWxydXNAbXlzcWwuY29tggEAMA0GCSqG +SIb3DQEBBAUAA4GBAGJ3vBbcTHBjTQPOGV7EbDEOVybYbiUI8gGumFkKurcywDlp +uEuqWXyXck5QAu7v1tZiuCU2kbY7j28vPNidt8+P9ilQ6TFUdyt7IXIPYEzUHLvE +RuX9p1/qRuTf6ZV3LZH4OzN4g10Q3ph8OJEn9lKKtlTxD3rwHdqlItJ1zEzD -----END CERTIFICATE----- diff --git a/SSL/server-key.pem b/SSL/server-key.pem index 44137ca1c94..5afd717e07c 100644 --- a/SSL/server-key.pem +++ b/SSL/server-key.pem @@ -1,15 +1,15 @@ -----BEGIN RSA PRIVATE KEY----- -MIICXAIBAAKBgQCerI3YHZyy/YiWLLpCU/pdvYWK5crTD8ABPPKSRk/ZgK4qic/v -6NRl/Pb1OiZMKdsG+jShh/OXtTyU8YQFrK1XJdkC2wBx4KmqtB0pNl6ppA3yRbmD -dCtF8+IjvOdc5hG29t3ErO1lQiw5RyrJ619FAxCrI7zKXIKat7NtZxjSxwIDAQAB -AoGAA51gudyq1jUKaIlqUNqC6KHJqglkHnzMXfrad9ScOxNAZH2xPADs3cnuglWp -y7BkaftHOarUNM+PKsF5xXtSk5F9UUV+7h2FtPZYUshUgn5hkGZP12otxJMP0cpg -Yt6brQxuOIe/r/Kt5r3nKpp4pyFLX2fGWQq7pSjdkgSZSOECQQDJ9MgbCXd81yde -eo3+YmUPBEQ9d7mivQsyPHMOHLPJKR42N4npdR1zLDBYK5lFzJeQH1y0Uce3O8eL -hM8hkA1XAkEAySKvNTaosbLhShkRazQyQQJYJg0F/93lkQ33ou4crru7Mvi2OZK9 -B3BGAmNpSv6ZOZYjM0aE8lGlTaoYJ9GQEQJAGJDyFnfcVQ9G9rMpupv1dxIpyuBZ -cHZWelHoHPtY00txJV80I3Xfkzb42oDTMC5m8V0fRb/870kSSOJq38ZKGQJBAIgq -wxLzfiFPSNYxQmmhXKRGQgcAqh8eylv5aL0VFrX0wjcvya4QeYifqcXUJ2RuGK2z -xwDfrQGf5Jk/njrW1QECQAUofd1l9DLDifRP1j9sjUdwz0fvqQ0o6sbt39PBl1ot -IHdc3nf9z0ft+KOG1CT/M9jYo9SzE9Z6IfwmHxxpY0s= +MIICXAIBAAKBgQC9ffGRUTj+S3m1/+BBrg6ou3tgQpUBdecidFV9dE1QUQxeCUsr +DI4/nxQ/XtklNpvMdzUw6Yy/O73aYoVMkMjecSwKe9zmhf20JIinjwM9FXxZPfhz +8DYquIB82MfWH22yt7dInyRWgSwunLmVSFBWnxpglsTA640tVTg/a4K8swIDAQAB +AoGARciG2NRHn+aduPe1V5rJDTyWD/oVM8d+ykJ7ZUsaWdSvMEZN51mlXSqxYzED +2N+GesL/1LZ9vcM7hJw5qNu9DQOc7CtMT4k/bmhPJsT226roKKVbw/ocOEY5dK8+ +T9/x8qgo7zC3Qk/bKgjj61m8cQ7Mz/J7ZCEMmDNNrORCzRECQQDrcvJlsBTALilr +MaAqNyaa0tykEabzg2mUFx5uvmzlwNx9ApSidoU5Xop9c6u00zgCDpsDlcwjhOs1 +jcqRkBTrAkEAzggY7BeN3FnW8tsV0Wq4LL6vK30pe0JIylxrKsFjY4LTo9t/8TKK +6ZOEETVtM7sepIkxECw5RCBi9sxi3NClWQJAbrA5WKjw+HA7NJO98lq/IWYkKFXM +IQsUpXRA8FtBormKbpK6Aa6qbxANF3E7teTencj0Azl3IPOqCCFCrDAKRQJAc6bv +9ncyVqLHmgOJN8ikIdnYEp1rj5khqxY9wf5UgCOMEcrBAu/QMlVwKQjIh+VdyhaI +x/9LFgboBomsZS9p4QJBAIXaX/WoqL/wgBGS2UroianFFXL6/Bt//CUoGpYgKQYQ ++x+8heMRppmM0to2J7j9nGE83ikMWfPUwMi4TbyWH3Q= -----END RSA PRIVATE KEY----- diff --git a/include/sslopt-case.h b/include/sslopt-case.h index e6e3a416bb0..d2799118973 100644 --- a/include/sslopt-case.h +++ b/include/sslopt-case.h @@ -22,25 +22,27 @@ opt_use_ssl = 1; /* true */ //QQ to be removed??? my_free(opt_ssl_key, MYF(MY_ALLOW_ZERO_PTR)); //QQ to be removed??? opt_ssl_key = my_strdup(optarg, MYF(0)); + my_free(opt_ssl_key, MYF(MY_ALLOW_ZERO_PTR)); + opt_ssl_key = my_strdup(argument, MYF(0)); break; case OPT_SSL_CERT: opt_use_ssl = 1; /* true */ my_free(opt_ssl_cert, MYF(MY_ALLOW_ZERO_PTR)); - opt_ssl_cert = my_strdup(optarg, MYF(0)); + opt_ssl_cert = my_strdup(argument, MYF(0)); break; case OPT_SSL_CA: opt_use_ssl = 1; /* true */ my_free(opt_ssl_ca, MYF(MY_ALLOW_ZERO_PTR)); - opt_ssl_ca = my_strdup(optarg, MYF(0)); + opt_ssl_ca = my_strdup(argument, MYF(0)); break; case OPT_SSL_CAPATH: opt_use_ssl = 1; /* true */ my_free(opt_ssl_capath, MYF(MY_ALLOW_ZERO_PTR)); - opt_ssl_capath = my_strdup(optarg, MYF(0)); + opt_ssl_capath = my_strdup(argument, MYF(0)); break; case OPT_SSL_CIPHER: opt_use_ssl = 1; /* true */ my_free(opt_ssl_cipher, MYF(MY_ALLOW_ZERO_PTR)); - opt_ssl_cipher = my_strdup(optarg, MYF(0)); + opt_ssl_cipher = my_strdup(argument, MYF(0)); break; #endif -- cgit v1.2.1 From 8223915c7490ac3579773f0f62773f6822a1e426 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 14 Aug 2002 13:08:09 +0500 Subject: Fix BitKeeper/etc/logging_ok: Logging to logging@openlogging.org accepted --- BitKeeper/etc/logging_ok | 1 + scripts/mysql_config.sh | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index 1da3ecc3841..31c8d0a3253 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -73,3 +73,4 @@ ram@ram.(none) WAX@sergbook.mysql.com bar@bar.udmsearch.izhnet.ru nick@mysql.com +bar@bar.mysql.r18.ru diff --git a/scripts/mysql_config.sh b/scripts/mysql_config.sh index 6a31db9a2b3..3cc5b3a5016 100644 --- a/scripts/mysql_config.sh +++ b/scripts/mysql_config.sh @@ -112,7 +112,7 @@ while test $# -gt 0; do --socket) echo "$socket" ;; --port) echo "$port" ;; --version) echo "$version" ;; - --embedded-libs | --embedded | libmysqld-libs) echo "$embedded_libs" ;; + --embedded-libs | --embedded | --libmysqld-libs) echo "$embedded_libs" ;; *) usage ;; esac -- cgit v1.2.1 From 91ff2ebebe051ff3effb67d988beb4a721ac84a6 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 14 Aug 2002 20:48:39 +0500 Subject: More readable output --- mysys/charset2html.c | 43 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/mysys/charset2html.c b/mysys/charset2html.c index 9a8fbe2b68f..0d6450a8116 100644 --- a/mysys/charset2html.c +++ b/mysys/charset2html.c @@ -29,6 +29,7 @@ typedef struct char_info_st { + int cod; int srt; int uni; int low; @@ -43,20 +44,26 @@ static int chcmp(const void *vf, const void *vs) return f->srt-s->srt ? f->srt-s->srt : f->uni-s->uni; } - + static void print_cs(CHARSET_INFO *cs) { - uint i; + uint i; + int srt; + int clr=0; MY_CH ch[256]; - + printf("\n"); printf("\n"); printf("\n"); printf("
\n");
   printf("Charset %s\n",cs->name);
+
+  printf("
\n"); + printf(""); for (i=0; i<256; i++) { + ch[i].cod=i; ch[i].srt=cs->sort_order[i]; ch[i].uni=cs->tab_to_uni[i]; ch[i].low=cs->tab_to_uni[cs->to_lower[i]]; @@ -65,12 +72,34 @@ static void print_cs(CHARSET_INFO *cs) } qsort(ch,256,sizeof(MY_CH),&chcmp); - - for (i=1; i<256; i++) + srt=ch[0].srt; + + for (i=0; i<256; i++) { - printf("%d %d &#%d; &#%d; &#%d;\n",ch[i].srt,ch[i].ctp,ch[i].uni, - ch[i].low,ch[i].upp); + clr = (srt!=ch[i].srt) ? !clr : clr; + + printf("",clr ? "DDDDDD" : "EEEE99"); + printf("\n"); + srt=ch[i].srt; } + printf("
CodeUniSortCtypeChLoUp
%02X",ch[i].cod); + printf("%04X",ch[i].uni); + printf("%d",ch[i].srt); + + printf("%s%s%s%s%s%s%s%s", + ch[i].ctp & _U ? "U" : "", + ch[i].ctp & _L ? "L" : "", + ch[i].ctp & _NMR ? "N" : "", + ch[i].ctp & _SPC ? "S" : "", + ch[i].ctp & _PNT ? "P" : "", + ch[i].ctp & _CTR ? "C" : "", + ch[i].ctp & _B ? "B" : "", + ch[i].ctp & _X ? "X" : ""); + + printf("&#%d;",ch[i].uni); + printf("&#%d;",ch[i].low); + printf("&#%d;",ch[i].upp); + printf("
\n"); printf("\n"); printf("\n"); } -- cgit v1.2.1 From 6cc0d7d7e8d8321ecd2d918cb0e3160eb0322ecd Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 15 Aug 2002 14:43:05 +0500 Subject: New character sets sql/share/charsets/Index: New charsets --- sql/share/charsets/Index | 7 +++ sql/share/charsets/cp866.conf | 91 ++++++++++++++++++++++++++++++++++++++ sql/share/charsets/keybcs2.conf | 91 ++++++++++++++++++++++++++++++++++++++ sql/share/charsets/latvian.conf | 95 ++++++++++++++++++++++++++++++++++++++++ sql/share/charsets/latvian1.conf | 94 +++++++++++++++++++++++++++++++++++++++ sql/share/charsets/macce.conf | 91 ++++++++++++++++++++++++++++++++++++++ sql/share/charsets/macroman.conf | 91 ++++++++++++++++++++++++++++++++++++++ sql/share/charsets/pclatin2.conf | 91 ++++++++++++++++++++++++++++++++++++++ 8 files changed, 651 insertions(+) create mode 100644 sql/share/charsets/cp866.conf create mode 100644 sql/share/charsets/keybcs2.conf create mode 100644 sql/share/charsets/latvian.conf create mode 100644 sql/share/charsets/latvian1.conf create mode 100644 sql/share/charsets/macce.conf create mode 100644 sql/share/charsets/macroman.conf create mode 100644 sql/share/charsets/pclatin2.conf diff --git a/sql/share/charsets/Index b/sql/share/charsets/Index index 52cb6b99705..c8ae877887e 100644 --- a/sql/share/charsets/Index +++ b/sql/share/charsets/Index @@ -40,3 +40,10 @@ armscii8 32 utf8 33 win1250ch 34 ucs2 35 +cp866 36 +keybcs2 37 +macce 38 +macroman 39 +pclatin2 40 +latvian 41 +latvian1 42 diff --git a/sql/share/charsets/cp866.conf b/sql/share/charsets/cp866.conf new file mode 100644 index 00000000000..e6b5c064fd7 --- /dev/null +++ b/sql/share/charsets/cp866.conf @@ -0,0 +1,91 @@ +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 00 + 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + 01 02 01 02 01 02 01 02 00 00 00 00 00 00 00 48 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + A0 A1 A2 A3 A4 A5 86 87 88 89 AA AB AC AD AE AF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + A0 A1 A2 A3 A4 A5 86 87 88 89 AA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F1 F1 F3 F3 F5 F5 F7 F7 F8 F9 FA FB FC FD FE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + F0 F0 F2 F2 F4 F4 F6 F6 F8 F9 FA FB FC FD FE FF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 56 57 58 59 5A 5B 5C 5E 5F 62 + 67 68 69 6C 71 74 75 76 77 78 7B B0 B1 B2 B3 B4 + B5 41 42 43 44 45 56 57 58 59 5A 5B 5C 5E 5F 62 + 67 68 69 6C 71 74 75 76 77 78 7B B6 B7 B8 B9 BA + 80 81 82 83 84 85 88 89 8A 8C 8D 8E 8F 90 91 92 + 93 94 95 96 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 + 80 81 82 83 84 85 88 89 8A 8C 8D 8E 8F 90 91 92 + BB BD BE C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC + CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD + DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 F3 F4 F5 F6 F7 + 93 94 95 96 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 + 86 86 87 87 8B 8B 97 97 F8 F9 FA FB FC FD FE FF + +# Unicode mappping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 0410 0411 0412 0413 0414 0415 0416 0417 0418 0419 041A 041B 041C 041D 041E 041F + 0420 0421 0422 0423 0424 0425 0426 0427 0428 0429 042A 042B 042C 042D 042E 042F + 0430 0431 0432 0433 0434 0435 0436 0437 0438 0439 043A 043B 043C 043D 043E 043F + 2591 2592 2593 2502 2524 2561 2562 2556 2555 2563 2551 2557 255D 255C 255B 2510 + 2514 2534 252C 251C 2500 253C 255E 255F 255A 2554 2569 2566 2560 2550 256C 2567 + 2568 2564 2565 2559 2558 2552 2553 256B 256A 2518 250C 2588 2584 258C 2590 2580 + 0440 0441 0442 0443 0444 0445 0446 0447 0448 0449 044A 044B 044C 044D 044E 044F + 0401 0451 0404 0454 0407 0457 040E 045E 00B0 2219 00B7 221A 207F 00B2 25A0 00A0 + diff --git a/sql/share/charsets/keybcs2.conf b/sql/share/charsets/keybcs2.conf new file mode 100644 index 00000000000..f272960b683 --- /dev/null +++ b/sql/share/charsets/keybcs2.conf @@ -0,0 +1,91 @@ +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 00 + 01 02 82 02 02 01 01 02 82 81 01 01 02 02 01 01 + 81 02 01 02 02 01 02 01 02 01 01 01 01 01 01 02 + 02 02 02 02 02 01 01 01 02 02 02 01 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 02 02 01 02 01 02 00 02 01 01 01 02 00 02 02 00 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 48 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 87 81 82 83 84 83 86 87 88 88 8D A1 8C 8D 84 A0 + 82 91 91 93 94 A2 96 A3 98 94 81 9B 8C 98 A9 9F + A0 A1 A2 A3 A4 A4 96 93 9B A9 AA AA AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + E0 E1 E2 E3 E4 E5 E6 E7 ED E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 68 59 5A 7B 7C 7D 7E 7F + 87 9A 90 85 8E 85 86 80 89 89 8A 8B 9C 8A 8E 8F + 90 92 92 A7 99 95 A6 97 9D 99 9A A8 9C 9D 9E 9F + 8F 8B 95 97 A5 A5 A6 A7 A8 9E AB AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC E8 EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 44 45 47 49 50 51 52 53 54 55 56 57 58 5A + 5E 5F 60 63 66 68 6C 6D 6E 6F 72 90 91 92 93 94 + 95 41 44 45 47 49 50 51 52 53 54 55 56 57 58 5A + 5E 5F 60 63 66 68 6C 6D 6E 6F 72 96 97 98 99 9A + 45 68 49 47 41 47 66 45 49 49 56 53 56 56 41 41 + 49 72 72 5A 5A 5A 68 68 6F 5A 68 63 56 6F 60 66 + 41 53 5A 68 58 58 68 5A 63 60 60 60 A0 A1 A2 A3 + A4 A5 A6 B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC + BD BE BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC + CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC + 80 65 83 87 88 89 DD 8A 85 8B 84 81 DE 85 82 DF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# Unicode mappping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 010C 00FC 00E9 010F 00E4 010E 0164 010D 011B 011A 0139 00CD 013E 013A 00C4 00C1 + 00C9 017E 017D 00F4 00F6 00D3 016F 00DA 00FD 00D6 00DC 0160 013D 00DD 0158 0165 + 00E1 00ED 00F3 00FA 0148 0147 016E 00D4 0161 0159 0155 0154 00BC 00A1 00AB 00BB + 2591 2592 2593 2502 2524 2561 2562 2556 2555 2563 2551 2557 255D 255C 255B 2510 + 2514 2534 252C 251C 2500 253C 255E 255F 255A 2554 2569 2566 2560 2550 256C 2567 + 2568 2564 2565 2559 2558 2552 2553 256B 256A 2518 250C 2588 2584 258C 2590 2580 + 03B1 00DF 0393 03C0 03A3 03C3 00B5 03C4 03A6 0398 03A9 03B4 221E 03C6 03B5 2229 + 2261 00B1 2265 2264 2320 2321 00F7 2248 00B0 2219 00B7 221A 207F 00B2 25A0 00A0 + diff --git a/sql/share/charsets/latvian.conf b/sql/share/charsets/latvian.conf new file mode 100644 index 00000000000..c3dee95d55c --- /dev/null +++ b/sql/share/charsets/latvian.conf @@ -0,0 +1,95 @@ +# Configuration file for the latvian character set. +# Created for case-sensitive record search +# Created accord with windows-1257 (iso-8859-4) codepage +# Created by Andis Grasis & Rihards Grasis e-mail:andis@cata.lv + +# The ctype array must have 257 elements. + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 20 + 01 20 10 20 10 10 00 00 20 10 20 10 20 10 10 10 + 20 10 10 10 10 10 10 10 20 00 20 10 20 10 10 20 + 48 20 10 10 10 20 10 10 10 10 01 10 10 10 10 01 + 10 10 10 10 10 10 10 10 10 10 02 10 10 10 10 02 + 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 10 01 01 01 01 01 01 01 02 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 10 02 02 02 02 02 02 02 10 + +# The to_lower array must have 256 elements. + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 B8 A9 BA AB AC AD AE BF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 D7 F8 F9 FA FB FC FD FE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# The to_upper array must have 256 elements. + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 A8 B9 AA BB BC BD BE AF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 F7 D8 D9 DA DB DC DD DE FF + +# The sort_order array must have 256 elements. + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 30 32 33 34 35 36 37 2B 38 39 3A 5C 3B 2C 3C 3D + 76 7A 7C 7E 80 81 82 83 84 85 3E 3F 5D 5E 5F 40 + 41 86 92 94 9A 9C A6 A8 AC AE B4 B6 BA C0 C2 C8 + D4 D6 D8 DC E3 E6 EE F0 F2 F4 F6 42 43 44 45 46 + 47 87 93 95 9B 9D A7 A9 AD AF B5 B7 BB C1 C3 C9 + D5 D7 D9 DD E4 E7 EF F1 F3 F5 F7 48 49 4A 4B 20 + 75 21 56 22 59 73 70 71 23 74 24 5A 25 4D 51 50 + 26 54 55 57 58 72 2E 2F 27 E5 28 5B 29 4E 53 2A + 31 FE 65 66 67 FF 4C 68 D3 69 DA 61 6A 2D 6B 90 + 6C 60 7D 7F 4F 6D 6E 6F D2 7B DB 62 77 78 79 91 + 8E B2 8A 96 88 8C A4 A2 98 9E F8 A0 AA B8 B0 BE + E1 C4 C6 CA CE D0 CC 63 EC BC DE EA E8 FA FC E0 + 8F B3 8B 97 89 8D A5 A3 99 9F F9 A1 AB B9 B1 BF + E2 C5 C7 CB CF D1 CD 64 ED BD DF EB E9 FB FD 52 + +# Unicode mapping (256 elements) +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F +0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F +0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F +0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008A 008B 008C 008D 008E 008F +0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009A 009B 009C 009D 009E 009F +00A0 201D 00A2 00A3 00A4 201E 00A6 00A7 00D8 00A9 0156 00AB 00AC 00AD 00AE 00C6 +00B0 00B1 00B2 00B3 201C 00B5 00B6 00B7 00F8 00B9 0157 00BB 00BC 00BD 00BE 00E6 +0104 012E 0100 0106 00C4 00C5 0118 0112 010C 00C9 0179 0116 0122 0136 012A 013B +0160 0143 0145 00D3 014C 00D5 00D6 00D7 0172 0141 015A 016A 00DC 017B 017D 00DF +0105 012F 0101 0107 00E4 00E5 0119 0113 010D 00E9 017A 0117 0123 0137 012B 013C +0161 0144 0146 00F3 014D 00F5 00F6 00F7 0173 0142 015B 016B 00FC 017C 017E 2019 diff --git a/sql/share/charsets/latvian1.conf b/sql/share/charsets/latvian1.conf new file mode 100644 index 00000000000..3094525052d --- /dev/null +++ b/sql/share/charsets/latvian1.conf @@ -0,0 +1,94 @@ +# Configuration file for the latvian character set. +# Created for case-insensitive record search +# Created by Andis & Rihards + +# The ctype array must have 257 elements. + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 20 + 00 00 10 00 10 10 00 00 00 00 00 10 00 10 10 10 + 00 10 10 10 10 10 10 10 00 00 00 10 00 10 10 00 + 48 00 10 10 10 00 10 10 10 10 01 10 10 10 10 10 + 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 10 01 01 01 01 01 01 01 02 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 10 02 02 02 02 02 02 02 10 + +# The to_lower array must have 256 elements. + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 B8 A9 BA AB AC AD AE BF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 D7 F8 F9 FA FB FC FD FE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# The to_upper array must have 256 elements. + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 A8 B9 AA BB BC BD BE AF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 F7 D8 D9 DA DB DC DD DE FF + +# The sort_order array must have 256 elements. + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 30 32 33 34 35 36 37 2B 38 39 3A 5C 3B 2C 3C 3D + 76 7A 7C 7E 80 81 82 83 84 85 3E 3F 5D 5E 5F 40 + 41 86 92 94 9A 9C A6 A8 AC AE B4 B6 BA C0 C2 C8 + D4 D6 D8 DC E3 E6 EE F0 F2 F4 F6 42 43 44 45 46 + 47 86 92 94 9A 9C A6 A8 AC AE B4 B6 BA C0 C2 C8 + D4 D6 D8 DC E2 E6 EE F0 F2 F4 F6 48 49 4A 4B 20 + 75 21 56 22 59 73 70 71 23 74 24 5A 25 4D 51 50 + 26 54 55 57 58 72 2E 2F 27 E5 28 5B 29 4E 53 2A + 31 FE 65 66 67 FF 4C 68 2D 69 DA 61 6A 2D 6B 90 + 6C 60 7D 7F 4F 6D 6E 6F D3 7B DB 62 77 78 79 90 + 8E B2 8A 96 88 8C A4 A2 98 9E F8 A0 AA B8 B0 BE + E1 C4 C6 CA CE D0 CC 63 EC BC DE EA E8 FA FC E0 + 8E B2 8A 96 88 8C A4 A2 98 9E F8 A0 AA B8 B0 BE + E1 C4 C6 CA CE D0 CC 64 EC BC DE EA E8 FA FC 52 + +# Unicode mapping (256 elements) +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F +0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F +0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F +0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008A 008B 008C 008D 008E 008F +0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009A 009B 009C 009D 009E 009F +00A0 201D 00A2 00A3 00A4 201E 00A6 00A7 00D8 00A9 0156 00AB 00AC 00AD 00AE 00C6 +00B0 00B1 00B2 00B3 201C 00B5 00B6 00B7 00F8 00B9 0157 00BB 00BC 00BD 00BE 00E6 +0104 012E 0100 0106 00C4 00C5 0118 0112 010C 00C9 0179 0116 0122 0136 012A 013B +0160 0143 0145 00D3 014C 00D5 00D6 00D7 0172 0141 015A 016A 00DC 017B 017D 00DF +0105 012F 0101 0107 00E4 00E5 0119 0113 010D 00E9 017A 0117 0123 0137 012B 013C +0161 0144 0146 00F3 014D 00F5 00F6 00F7 0173 0142 015B 016B 00FC 017C 017E 2019 diff --git a/sql/share/charsets/macce.conf b/sql/share/charsets/macce.conf new file mode 100644 index 00000000000..f3ac08df087 --- /dev/null +++ b/sql/share/charsets/macce.conf @@ -0,0 +1,91 @@ +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 00 + 01 01 02 01 01 01 01 02 02 01 02 02 01 02 02 01 + 02 01 02 02 01 02 01 02 02 02 02 02 02 01 02 02 + 00 00 01 00 00 00 00 02 00 00 00 02 00 00 02 01 + 02 01 00 00 02 01 00 00 02 01 02 01 02 01 02 01 + 02 01 00 00 02 01 00 00 00 00 00 02 01 01 02 01 + 00 00 00 00 00 00 00 00 02 01 02 01 00 00 02 01 + 02 01 00 00 02 01 02 01 01 02 01 01 02 01 01 01 + 02 01 01 02 01 02 01 02 01 02 02 01 01 02 01 00 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 54 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 54 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 8A 82 82 8E 88 9A 9F 87 88 8B 8A 8B 8D 8D 8E 90 + 90 93 92 93 95 95 98 97 98 99 9A 9B 9C 9E 9E 9F + A0 A1 AB A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE B0 + B0 B4 B2 B3 B4 FA B6 B7 B8 BA BA BC BC BE BE C0 + C0 C4 C2 C3 C4 CB C6 C7 C8 C9 CA CB CE 9B CE D8 + D0 D1 D2 D3 D4 D5 D6 D7 D8 DA DA DE DC DD DE E0 + E0 E4 E2 E3 E4 E6 E6 87 E9 E9 92 EC EC F0 97 99 + F0 F3 9C F3 F5 F5 F7 F7 F9 F9 FA FD B8 FD AE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 74 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 74 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 81 83 84 85 86 E7 84 89 80 89 8C 8C 83 8F + 8F 91 EA 91 94 94 96 EE 96 EF 85 CD F2 9D 9D 86 + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA A2 AC AD FE AF + AF B1 B2 B3 B1 B5 B6 B7 FC B9 B9 BB BB BD BD BF + BF C1 C2 C3 C1 C5 C6 C7 C8 C9 CA C5 CC CD CC CF + D0 D1 D2 D3 D4 D5 D6 D7 CF D9 D9 DB DC DD DB DF + DF E1 E2 E3 E1 E5 E5 E7 E8 E8 EA EB EB ED EE EF + ED F1 F2 F1 F4 F4 F6 F6 F8 F8 B5 FB FC FB FE FF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 46 47 4A 4C 52 53 55 56 5A 5B 5D 62 62 67 + 6F 70 71 75 79 81 88 89 8A 8B 8D 90 91 92 93 94 + 95 41 46 47 4A 4C 52 53 55 56 5A 5B 5D 62 62 67 + 6F 70 71 75 79 81 88 89 8A 8B 8D 96 97 98 99 9A + 41 41 41 4C 41 67 81 41 41 47 41 47 47 47 4C 8D + 8D 4A 56 4A 4C 4C 4C 67 4C 67 67 67 81 4C 4C 81 + A0 A1 4C A3 A4 A5 A6 75 A8 A9 AA 4C AC AD 53 56 + 56 56 B2 B3 56 5B B6 B7 5D 5D 5D 5D 5D 5D 5D 62 + 62 62 C2 C3 62 62 C6 C7 C8 C9 CA 62 67 67 67 67 + D0 D1 D2 D3 D4 D5 D6 D7 67 71 71 71 DC DD 71 71 + 71 75 E2 E3 75 75 75 41 79 79 56 8D 8D 81 67 67 + 81 81 81 81 81 81 81 81 8B 8B 5B 8D 5D 8D 53 FF + +# Unicode mappping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 00C4 0100 0101 00C9 0104 00D6 00DC 00E1 0105 010C 00E4 010D 0106 0107 00E9 0179 + 017A 010E 00ED 010F 0112 0113 0116 00F3 0117 00F4 00F6 00F5 00FA 011A 011B 00FC + 2020 00B0 0118 00A3 00A7 2022 00B6 00DF 00AE 00A9 2122 0119 00A8 2260 0123 012E + 012F 012A 2264 2265 012B 0136 2202 2211 0142 013B 013C 013D 013E 0139 013A 0145 + 0146 0143 00AC 221A 0144 0147 2206 00AB 00BB 2026 00A0 0148 0150 00D5 0151 014C + 2013 2014 201C 201D 2018 2019 00F7 25CA 014D 0154 0155 0158 2039 203A 0159 0156 + 0157 0160 201A 201E 0161 015A 015B 00C1 0164 0165 00CD 017D 017E 016A 00D3 00D4 + 016B 016E 00DA 016F 0170 0171 0172 0173 00DD 00FD 0137 017B 0141 017C 0122 02C7 + diff --git a/sql/share/charsets/macroman.conf b/sql/share/charsets/macroman.conf new file mode 100644 index 00000000000..11cbee40e94 --- /dev/null +++ b/sql/share/charsets/macroman.conf @@ -0,0 +1,91 @@ +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 10 + 20 01 01 01 01 01 01 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + 00 00 00 00 00 00 00 02 00 00 00 00 00 00 01 01 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 02 + 00 00 00 00 02 00 00 00 00 00 00 20 01 01 00 00 + 00 00 00 00 00 00 00 00 02 01 00 00 00 00 00 00 + 00 00 00 00 00 20 01 01 01 01 01 01 01 01 01 01 + 00 01 01 01 01 02 00 00 00 00 00 00 00 00 00 00 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 8A 8C 8D 8E 96 9A 9F 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD BE BF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA 88 8B 9B CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D8 DA DB DC DD DE DF + E0 E1 E2 E3 E4 89 90 87 91 8F 92 94 95 93 97 99 + F0 98 9C 9E 9D F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 E7 CB E5 80 CC 81 82 83 E9 + E6 E8 EA ED EB EC 84 EE F1 EF 85 CD F2 F4 F3 86 + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD AE AF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D9 D9 DA DB DC DD DE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 49 50 52 53 57 59 60 61 67 68 69 70 71 72 + 79 80 81 82 84 85 90 91 92 93 95 A0 A1 A2 A3 A4 + A5 41 49 50 52 53 57 59 60 61 67 68 69 70 71 72 + 79 80 81 82 84 85 90 91 92 93 95 A6 A7 A8 A9 AA + 41 41 50 53 71 72 85 41 41 41 41 41 41 50 53 53 + 53 53 61 61 61 61 71 72 72 72 72 72 85 85 85 85 + AB AC AD AE AF B0 B1 82 B2 B3 B4 B5 B6 B7 48 72 + B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 C4 C5 48 72 + C6 C7 C8 C9 57 CA CB CC CD CE CF 41 41 72 D0 D1 + D2 D3 D4 D5 D6 D7 D8 D9 93 93 DA DB DC DD DE DF + E0 E1 E2 E3 E4 41 53 41 53 53 61 61 61 61 72 72 + F0 72 85 85 85 61 F6 F7 F8 F9 FA FB FC FD FE FF + +# Unicode mappping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 00C4 00C5 00C7 00C9 00D1 00D6 00DC 00E1 00E0 00E2 00E4 00E3 00E5 00E7 00E9 00E8 + 00EA 00EB 00ED 00EC 00EE 00EF 00F1 00F3 00F2 00F4 00F6 00F5 00FA 00F9 00FB 00FC + 2020 00B0 00A2 00A3 00A7 2022 00B6 00DF 00AE 00A9 2122 00B4 00A8 2260 00C6 00D8 + 221E 00B1 2264 2265 00A5 00B5 2202 2211 220F 03C0 222B 00AA 00BA 03A9 00E6 00F8 + 00BF 00A1 00AC 221A 0192 2248 2206 00AB 00BB 2026 00A0 00C0 00C3 00D5 0152 0153 + 2013 2014 201C 201D 2018 2019 00F7 25CA 00FF 0178 2044 20AC 2039 203A FB01 FB02 + 2021 00B7 201A 201E 2030 00C2 00CA 00C1 00CB 00C8 00CD 00CE 00CF 00CC 00D3 00D4 + F8FF 00D2 00DA 00DB 00D9 0131 02C6 02DC 00AF 02D8 02D9 02DA 00B8 02DD 02DB 02C7 + diff --git a/sql/share/charsets/pclatin2.conf b/sql/share/charsets/pclatin2.conf new file mode 100644 index 00000000000..dea8d085595 --- /dev/null +++ b/sql/share/charsets/pclatin2.conf @@ -0,0 +1,91 @@ +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 00 + 01 02 02 02 02 02 02 02 02 02 01 02 02 01 01 01 + 01 01 02 02 02 01 02 01 02 01 01 01 02 01 00 02 + 02 02 02 02 01 02 01 02 01 02 00 02 01 01 00 00 + 00 00 00 00 00 01 01 01 02 00 00 00 00 01 02 00 + 00 00 00 00 00 00 01 02 00 00 00 00 00 00 00 00 + 02 01 01 01 02 01 01 01 02 00 00 00 00 01 01 00 + 01 02 01 01 02 02 01 02 01 01 02 01 02 01 02 00 + 00 00 00 00 00 00 00 00 00 00 00 02 01 02 00 48 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 87 81 82 83 84 85 86 87 88 89 8B 8B 8C AB 84 86 + 82 92 92 93 94 96 96 98 98 94 81 9C 9C 88 9E 9F + A0 A1 A2 A3 A5 A5 A7 A7 A9 A9 AA AB 9F B8 AE AF + B0 B1 B2 B3 B4 A0 83 D8 B8 B9 BA BB BC BE BE BF + C0 C1 C2 C3 C4 C5 C7 C7 C8 C9 CA CB CC CD CE CF + D0 D0 D4 89 D4 E5 A1 8C D8 D9 DA DB DC EE 85 DF + A2 E1 93 E4 E4 E5 E7 E7 EA A3 E8 FB EC EC EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 9A 90 B6 8E DE 8F 80 9D D3 8A 8A D7 8D 8E 8F + 90 91 91 E2 99 95 95 97 97 99 9A 9B 9B 9D 9E AC + B5 D6 E0 E9 A4 A4 A6 A6 A8 A8 AA 8D AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 AD B9 BA BB BC BE BD BF + C0 C1 C2 C3 C4 C5 C6 C6 C8 C9 CA CB CC CD CE CF + D1 D1 D2 D3 D2 D5 D6 D7 B7 D9 DA DB DC DD DE DF + E0 E1 E2 E3 E3 D5 E6 E6 E8 E9 E8 EB ED ED DD EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA EB FC FC FE FF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 47 48 4C 4F 54 55 56 57 5A 5B 5C 5E 5F 62 + 67 68 69 6C 71 74 75 76 77 78 7B 90 91 92 93 94 + 95 41 47 48 4C 4F 54 55 56 57 5A 5B 5C 5E 5F 62 + 67 68 69 6C 71 74 75 76 77 78 7B 96 97 98 99 9A + 48 74 4F 41 41 74 48 48 5C 4F 62 62 57 7B 41 48 + 4F 5C 5C 62 62 5C 5C 6C 6C 62 74 71 71 5C 9E 48 + 41 57 62 74 41 41 7B 7B 4F 4F AA 7B 48 6C AE AF + B0 B1 B2 B3 B4 41 41 4F 6C B5 BA BB BC 7B 7B BF + C0 C1 C2 C3 C4 C5 41 41 C8 C9 CA CB CC CD CE CF + 4C 4C 4C 4F 4C 60 57 57 4F D9 DA DB DC 71 74 DF + 62 70 62 60 60 60 6C 6C 69 74 69 74 78 78 71 EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA 74 69 69 FE FF + +# Unicode mappping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 00C7 00FC 00E9 00E2 00E4 016F 0107 00E7 0142 00EB 0150 0151 00EE 0179 00C4 0106 + 00C9 0139 013A 00F4 00F6 013D 013E 015A 015B 00D6 00DC 0164 0165 0141 00D7 010D + 00E1 00ED 00F3 00FA 0104 0105 017D 017E 0118 0119 00AC 017A 010C 015F 00AB 00BB + 2591 2592 2593 2502 2524 00C1 00C2 011A 015E 2563 2551 2557 255D 017B 017C 2510 + 2514 2534 252C 251C 2500 253C 0102 0103 255A 2554 2569 2566 2560 2550 256C 00A4 + 0111 0110 010E 00CB 010F 0147 00CD 00CE 011B 2518 250C 2588 2584 0162 016E 2580 + 00D3 00DF 00D4 0143 0144 0148 0160 0161 0154 00DA 0155 0170 00FD 00DD 0163 00B4 + 00AD 02DD 02DB 02C7 02D8 00A7 00F7 00B8 00B0 00A8 02D9 0171 0158 0159 25A0 00A0 + -- cgit v1.2.1 From bf5b046e841121c4250bd668449df99302de31ea Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 15 Aug 2002 16:42:54 +0500 Subject: Some speed improvements --- heap/hp_hash.c | 23 +++++++++++++++-------- mysys/hash.c | 4 +++- mysys/mf_casecnv.c | 17 ++++++++++------- mysys/mf_soundex.c | 3 ++- strings/ctype-mb.c | 24 ++++++++++++++++++------ strings/ctype-simple.c | 20 +++++++++++++------- 6 files changed, 61 insertions(+), 30 deletions(-) diff --git a/heap/hp_hash.c b/heap/hp_hash.c index 424322fd5e7..4f7dc956cba 100644 --- a/heap/hp_hash.c +++ b/heap/hp_hash.c @@ -217,11 +217,14 @@ ulong hp_hashnr(register HP_KEYDEF *keydef, register const byte *key) if (seg->charset->hash_sort) seg->charset->hash_sort(seg->charset,pos,((uchar*)key)-pos,&nr,&nr2); else - for (; pos < (uchar*) key ; pos++) { - nr^=(ulong) ((((uint) nr & 63)+nr2) * - ((uint) seg->charset->sort_order[(uint) *pos])) + (nr << 8); - nr2+=3; + register uchar *sort_order=seg->charset->sort_order; + for (; pos < (uchar*) key ; pos++) + { + nr^=(ulong) ((((uint) nr & 63)+nr2) * + ((uint) sort_order[(uint) *pos])) + (nr << 8); + nr2+=3; + } } } else @@ -260,11 +263,15 @@ ulong hp_rec_hashnr(register HP_KEYDEF *keydef, register const byte *rec) if (seg->charset->hash_sort) seg->charset->hash_sort(seg->charset,pos,end-pos,&nr,&nr2); else - for (; pos < end ; pos++) { - nr^=(ulong) ((((uint) nr & 63)+nr2)* - ((uint) seg->charset->sort_order[(uint) *pos]))+ (nr << 8); - nr2+=3; + register uchar *sort_order=seg->charset->sort_order; + + for (; pos < end ; pos++) + { + nr^=(ulong) ((((uint) nr & 63)+nr2)* + ((uint) sort_order[(uint) *pos]))+ (nr << 8); + nr2+=3; + } } } else diff --git a/mysys/hash.c b/mysys/hash.c index 0cbd14607f6..7fb634a05b9 100644 --- a/mysys/hash.c +++ b/mysys/hash.c @@ -136,10 +136,12 @@ static uint calc_hashnr(CHARSET_INFO *cs __attribute__((unused)), static uint calc_hashnr_caseup(CHARSET_INFO *cs, const byte *key,uint length) { register uint nr=1, nr2=4; + register uchar *map=cs->to_upper; + while (length--) { nr^= (((nr & 63)+nr2)* - ((uint) (uchar) my_toupper(cs, *key++)))+ (nr << 8); + ((uint) (uchar) map[(uchar)*key++])) + (nr << 8); nr2+=3; } return((uint) nr); diff --git a/mysys/mf_casecnv.c b/mysys/mf_casecnv.c index 510a9b08f76..631db18b1ed 100644 --- a/mysys/mf_casecnv.c +++ b/mysys/mf_casecnv.c @@ -33,8 +33,10 @@ void case_sort(CHARSET_INFO *cs, my_string str, uint length) { + register uchar *map=cs->sort_order; + for ( ; length>0 ; length--, str++) - *str= (char) cs->sort_order[(uchar) *str]; + *str= (char) map[(uchar) *str]; } /* case_sort */ @@ -46,11 +48,11 @@ int my_sortcmp(CHARSET_INFO *cs, const char *s, const char *t, uint len) else #endif { + register uchar *map=cs->sort_order; while (len--) { - if (cs->sort_order[(uchar) *s++] != cs->sort_order[(uchar) *t++]) - return ((int) cs->sort_order[(uchar) s[-1]] - - (int) cs->sort_order[(uchar) t[-1]]); + if (map[(uchar) *s++] != map[(uchar) *t++]) + return ((int) map[(uchar) s[-1]] - (int) map[(uchar) t[-1]]); } return 0; } @@ -67,11 +69,12 @@ int my_sortncmp(CHARSET_INFO *cs, #endif { uint len= min(s_len,t_len); + register uchar *map=cs->sort_order; + while (len--) { - if (cs->sort_order[(uchar) *s++] != cs->sort_order[(uchar) *t++]) - return ((int) cs->sort_order[(uchar) s[-1]] - - (int) cs->sort_order[(uchar) t[-1]]); + if (map[(uchar) *s++] != map[(uchar) *t++]) + return ((int) map[(uchar) s[-1]] - (int) map[(uchar) t[-1]]); } return (int) (s_len - t_len); } diff --git a/mysys/mf_soundex.c b/mysys/mf_soundex.c index 8ecd95137b0..459e304dfd7 100644 --- a/mysys/mf_soundex.c +++ b/mysys/mf_soundex.c @@ -44,13 +44,14 @@ void soundex(CHARSET_INFO * cs,register my_string out_pntr, my_string in_pntr, { char ch,last_ch; reg3 my_string end; + register uchar *map=cs->to_upper; if (remove_garbage) { while (*in_pntr && my_isspace(cs,*in_pntr)) /* Skipp pre-space */ in_pntr++; } - *out_pntr++ = my_toupper(cs,*in_pntr);/* Copy first letter */ + *out_pntr++ = map[(uchar)*in_pntr]; /* Copy first letter */ last_ch = get_scode(cs,&in_pntr,0); /* code of the first letter */ /* for the first 'double-letter */ /* check. */ diff --git a/strings/ctype-mb.c b/strings/ctype-mb.c index d328ebb7a36..aa475e281d0 100644 --- a/strings/ctype-mb.c +++ b/strings/ctype-mb.c @@ -24,13 +24,15 @@ void my_caseup_str_mb(CHARSET_INFO * cs, char *str) { register uint32 l; register char *end=str+strlen(str); /* BAR TODO: remove strlen() call */ + register uchar *map=cs->to_upper; + while (*str) { if ((l=my_ismbchar(cs, str,end))) str+=l; else { - *str=(char)my_toupper(cs,(uchar)*str); + *str=(char) map[(uchar)*str]; str++; } } @@ -40,13 +42,15 @@ void my_casedn_str_mb(CHARSET_INFO * cs, char *str) { register uint32 l; register char *end=str+strlen(str); + register uchar *map=cs->to_lower; + while (*str) { if ((l=my_ismbchar(cs, str,end))) str+=l; else { - *str=(char)my_tolower(cs,(uchar)*str); + *str=(char) map[(uchar)*str]; str++; } } @@ -56,13 +60,15 @@ void my_caseup_mb(CHARSET_INFO * cs, char *str, uint length) { register uint32 l; register char *end=str+length; + register uchar *map=cs->to_upper; + while (strto_lower; + while (strto_upper; + while (sto_upper; + while (sto_upper; + while ((*str = (char) map[(uchar) *str]) != 0) str++; } void my_casedn_str_8bit(CHARSET_INFO * cs,char *str) { - while ((*str = (char) my_tolower(cs,(uchar)*str)) != 0) + register uchar *map=cs->to_lower; + while ((*str = (char) map[(uchar)*str]) != 0) str++; } void my_caseup_8bit(CHARSET_INFO * cs, char *str, uint length) { + register uchar *map=cs->to_upper; for ( ; length>0 ; length--, str++) - *str= (char) my_toupper(cs,(uchar)*str); + *str= (char) map[(uchar)*str]; } void my_casedn_8bit(CHARSET_INFO * cs, char *str, uint length) { + register uchar *map=cs->to_lower; for ( ; length>0 ; length--, str++) - *str= (char)my_tolower(cs,(uchar) *str); + *str= (char) map[(uchar) *str]; } int my_strcasecmp_8bit(CHARSET_INFO * cs,const char *s, const char *t) { - while (my_toupper(cs,(uchar) *s) == my_toupper(cs,(uchar) *t++)) + register uchar *map=cs->to_upper; + while (map[(uchar) *s] == map[(uchar) *t++]) if (!*s++) return 0; - return ((int) my_toupper(cs,(uchar) s[0]) - (int) my_toupper(cs,(uchar) t[-1])); + return ((int) map[(uchar) s[0]] - (int) map[(uchar) t[-1]]); } int my_strncasecmp_8bit(CHARSET_INFO * cs, const char *s, const char *t, uint len) { - while (len-- != 0 && my_toupper(cs,(uchar)*s++) == my_toupper(cs,(uchar)*t++)) ; + register uchar *map=cs->to_upper; + while (len-- != 0 && map[(uchar)*s++] == map[(uchar)*t++]) ; return (int) len+1; } -- cgit v1.2.1 From 08a32ab1b12ec34bdf8f0e5da3bdffb6423884a2 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 21 Aug 2002 17:24:56 +0500 Subject: A comment about actual charset has been added --- sql/share/charsets/dos.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/share/charsets/dos.conf b/sql/share/charsets/dos.conf index fc4d4cee5c4..205202711b8 100644 --- a/sql/share/charsets/dos.conf +++ b/sql/share/charsets/dos.conf @@ -1,4 +1,4 @@ -# Configuration file for the dos character set +# Configuration file for the dos (aka cp437 DOSLatinUS) character set # ctype array (must have 257 elements) 00 -- cgit v1.2.1 From d1a7eea83e474cc83f1754ca19602dc8b483ae5b Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 22 Aug 2002 12:21:58 +0500 Subject: Spatial code cleanup --- sql/spatial.cc | 11 +++++------ sql/spatial.h | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/sql/spatial.cc b/sql/spatial.cc index bb6e03c3c03..b21d30e4b53 100644 --- a/sql/spatial.cc +++ b/sql/spatial.cc @@ -285,7 +285,7 @@ int GLineString::get_mbr(MBR *mbr) const return 1; for (; n_points>0; --n_points) { - mbr->add_xy((double *)data, (double *)(data + 8)); + mbr->add_xy(data, data + 8); data += 8+8; } @@ -551,7 +551,7 @@ int GPolygon::get_mbr(MBR *mbr) const return 1; for (; n_points>0; --n_points) { - mbr->add_xy((double *)data, (double *)(data + 8)); + mbr->add_xy(data, data + 8); data += 8+8; } } @@ -838,8 +838,7 @@ int GMultiPoint::get_mbr(MBR *mbr) const return 1; for (; n_points>0; --n_points) { - mbr->add_xy((double *)(data + WKB_HEADER_SIZE), - (double *)(data + 8 + WKB_HEADER_SIZE)); + mbr->add_xy(data + WKB_HEADER_SIZE, data + 8 + WKB_HEADER_SIZE); data += (8+8+WKB_HEADER_SIZE); } return 0; @@ -963,7 +962,7 @@ int GMultiLineString::get_mbr(MBR *mbr) const for (; n_points>0; --n_points) { - mbr->add_xy((double *)data, (double *)(data + 8)); + mbr->add_xy(data, data + 8); data += 8+8; } } @@ -1156,7 +1155,7 @@ int GMultiPolygon::get_mbr(MBR *mbr) const for (; n_points>0; --n_points) { - mbr->add_xy((double *)data, (double *)(data + 8)); + mbr->add_xy(data, data + 8); data += 8+8; } } diff --git a/sql/spatial.h b/sql/spatial.h index 2daa8e856c9..c6e30a44fbf 100644 --- a/sql/spatial.h +++ b/sql/spatial.h @@ -71,7 +71,7 @@ struct MBR } } - void add_xy(double *px, double *py) + void add_xy(const char *px, const char *py) { /* Not using "else" for proper one point MBR calculation */ double x, y; float8get(x, px); -- cgit v1.2.1 From 56e866ae05fda040fb04edf172c5651f577a3d46 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 22 Aug 2002 18:12:45 +0500 Subject: Stupid bug fixes in sql_yacc.cc New class Item_func_set_collation() Fixed that "SELECT CONVERT(expr USING charset) GROUP BY 1" was not working New COLLATION syntax: COLLATE latin1 mysql-test/r/ctype_many.result: New test slot has been added mysql-test/t/ctype_many.test: New test slot has been added sql/item_strfunc.cc: "SELECT CONVERT(expr USING another_charset) GROUP BY 1" was not working as expected New Item_func_set_collation class sql/item_strfunc.h: "SELECT CONVERT(expr USING another_charset) GROUP BY 1" was not working as expected New Item_func_set_collation class sql/lex.h: New keyword sql/sql_yacc.yy: Stupid bug fixes COLLATION syntax --- mysql-test/r/ctype_many.result | 59 ++++++++++++++++++++++++++++++++++++++++++ mysql-test/t/ctype_many.test | 2 ++ sql/item_strfunc.cc | 29 +++++++++++++++++++++ sql/item_strfunc.h | 22 +++++++++++++--- sql/lex.h | 1 + sql/sql_yacc.yy | 18 ++++++++++--- 6 files changed, 123 insertions(+), 8 deletions(-) diff --git a/mysql-test/r/ctype_many.result b/mysql-test/r/ctype_many.result index 7a09c008309..ddc3989282b 100644 --- a/mysql-test/r/ctype_many.result +++ b/mysql-test/r/ctype_many.result @@ -157,6 +157,65 @@ INSERT INTO t1 (koi8_ru_f,comment) VALUES (' INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ü','CYR CAPIT E'); INSERT INTO t1 (koi8_ru_f,comment) VALUES ('à','CYR CAPIT YU'); INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ñ','CYR CAPIT YA'); +SELECT CONVERT(koi8_ru_f USING utf8),MIN(comment),COUNT(*) FROM t1 GROUP BY 1; +CONVERT(koi8_ru_f USING utf8) MIN(comment) COUNT(*) +a LAT CAPIT A 2 +b LAT CAPIT B 2 +c LAT CAPIT C 2 +d LAT CAPIT D 2 +e LAT CAPIT E 2 +f LAT CAPIT F 2 +g LAT CAPIT G 2 +h LAT CAPIT H 2 +i LAT CAPIT I 2 +j LAT CAPIT J 2 +k LAT CAPIT K 2 +l LAT CAPIT L 2 +m LAT CAPIT M 2 +n LAT CAPIT N 2 +o LAT CAPIT O 2 +p LAT CAPIT P 2 +q LAT CAPIT Q 2 +r LAT CAPIT R 2 +s LAT CAPIT S 2 +t LAT CAPIT T 2 +u LAT CAPIT U 2 +v LAT CAPIT V 2 +w LAT CAPIT W 2 +x LAT CAPIT X 2 +y LAT CAPIT Y 2 +z LAT CAPIT Z 2 +а CYR CAPIT A 2 +б CYR CAPIT BE 2 +в CYR CAPIT VE 2 +г CYR CAPIT GE 2 +д CYR CAPIT DE 2 +е CYR CAPIT IE 4 +ж CYR CAPIT ZHE 2 +з CYR CAPIT ZE 2 +и CYR CAPIT I 2 +к CYR CAPIT KA 2 +л CYR CAPIT EL 2 +м CYR CAPIT EM 2 +н CYR CAPIT EN 2 +о CYR CAPIT O 2 +п CYR CAPIT PE 2 +Ñ€ CYR CAPIT ER 2 +Ñ CYR CAPIT ES 2 +Ñ‚ CYR CAPIT TE 2 +у CYR CAPIT U 2 +Ñ„ CYR CAPIT EF 2 +Ñ… CYR CAPIT HA 2 +ц CYR CAPIT TSE 2 +ч CYR CAPIT CHE 2 +ш CYR CAPIT SHA 2 +щ CYR CAPIT SCHA 2 +ÑŠ CYR CAPIT HARD SIGN 2 +Ñ‹ CYR CAPIT YERU 2 +ÑŒ CYR CAPIT SOFT SIGN 2 +Ñ CYR CAPIT E 2 +ÑŽ CYR CAPIT YU 2 +Ñ CYR CAPIT YA 2 ALTER TABLE t1 ADD utf8_f CHAR(32) CHARACTER SET utf8 NOT NULL; UPDATE t1 SET utf8_f=CONVERT(koi8_ru_f USING utf8); SELECT * FROM t1; diff --git a/mysql-test/t/ctype_many.test b/mysql-test/t/ctype_many.test index 572784b8d34..1e89b1419d2 100644 --- a/mysql-test/t/ctype_many.test +++ b/mysql-test/t/ctype_many.test @@ -133,6 +133,8 @@ INSERT INTO t1 (koi8_ru_f,comment) VALUES (' INSERT INTO t1 (koi8_ru_f,comment) VALUES ('à','CYR CAPIT YU'); INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ñ','CYR CAPIT YA'); +SELECT CONVERT(koi8_ru_f USING utf8),MIN(comment),COUNT(*) FROM t1 GROUP BY 1; + ALTER TABLE t1 ADD utf8_f CHAR(32) CHARACTER SET utf8 NOT NULL; UPDATE t1 SET utf8_f=CONVERT(koi8_ru_f USING utf8); diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 1aee4e7d553..b5b9ed2931e 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1843,9 +1843,11 @@ outp: void Item_func_conv_charset::fix_length_and_dec() { max_length = args[0]->max_length*(conv_charset->mbmaxlen?conv_charset->mbmaxlen:1); + str_value.set_charset(conv_charset); } + String *Item_func_conv_charset3::val_str(String *str) { my_wc_t wc; @@ -1938,6 +1940,33 @@ void Item_func_conv_charset3::fix_length_and_dec() max_length = args[0]->max_length; } +String *Item_func_set_collation::val_str(String *str) +{ + str=args[0]->val_str(str); + null_value=args[0]->null_value; + str->set_charset(set_collation); + return str; +} + +bool Item_func_set_collation::fix_fields(THD *thd,struct st_table_list *tables) +{ + char buff[STACK_BUFF_ALLOC]; // Max argument in function + binary=0; + used_tables_cache=0; + const_item_cache=1; + + if (thd && check_stack_overrun(thd,buff)) + return 0; // Fatal error if flag is set! + if (args[0]->fix_fields(thd, tables, args)) + return 1; + maybe_null=args[0]->maybe_null; + binary=args[0]->binary; + const_item_cache=args[0]->const_item(); + str_value.set_charset(set_collation); + fix_length_and_dec(); + return 0; +} + String *Item_func_charset::val_str(String *str) { diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index 7b5bd7ae90b..7f82cd3b5de 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -472,7 +472,7 @@ class Item_func_export_set: public Item_str_func const char *func_name() const { return "export_set"; } }; - class Item_func_inet_ntoa : public Item_str_func +class Item_func_inet_ntoa : public Item_str_func { public: Item_func_inet_ntoa(Item *a) :Item_str_func(a) @@ -488,15 +488,29 @@ class Item_func_conv_charset :public Item_str_func CHARSET_INFO *conv_charset; public: Item_func_conv_charset(Item *a, CHARSET_INFO *cs) :Item_str_func(a) - { - conv_charset=cs; - } + { conv_charset=cs; } bool fix_fields(THD *thd,struct st_table_list *tables); String *val_str(String *); void fix_length_and_dec(); const char *func_name() const { return "conv_charset"; } }; +class Item_func_set_collation :public Item_str_func +{ + CHARSET_INFO *set_collation; +public: + Item_func_set_collation(Item *a, CHARSET_INFO *cs) :Item_str_func(a) + { set_collation=cs; } + bool fix_fields(THD *thd,struct st_table_list *tables); + String *val_str(String *); + void fix_length_and_dec() + { + max_length = args[0]->max_length; + str_value.set_charset(set_collation); + } + const char *func_name() const { return "set_collation"; } +}; + class Item_func_conv_charset3 :public Item_str_func { public: diff --git a/sql/lex.h b/sql/lex.h index c41ad8c1d44..cd25c3883fe 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -89,6 +89,7 @@ static SYMBOL symbols[] = { { "CHECKSUM", SYM(CHECKSUM_SYM),0,0}, { "CIPHER", SYM(CIPHER_SYM),0,0}, { "CLOSE", SYM(CLOSE_SYM),0,0}, + { "COLLATE", SYM(COLLATE_SYM),0,0}, { "COLUMN", SYM(COLUMN_SYM),0,0}, { "COLUMNS", SYM(COLUMNS),0,0}, { "COMMENT", SYM(COMMENT_SYM),0,0}, diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 160bc253dc9..01894bfb7ad 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -167,6 +167,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token CHECK_SYM %token CIPHER %token COMMITTED_SYM +%token COLLATE_SYM %token COLUMNS %token COLUMN_SYM %token CONCURRENT @@ -522,7 +523,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %left '*' '/' '%' %left NEG '~' %right NOT -%right BINARY +%right BINARY COLLATE_SYM %type IDENT TEXT_STRING REAL_NUM FLOAT_NUM NUM LONG_NUM HEX_NUM LEX_HOSTNAME @@ -1129,7 +1130,7 @@ charset: { if (!(Lex->charset=get_charset_by_name($1.str,MYF(0)))) { - net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$1); + net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$1.str); YYABORT; } }; @@ -1658,7 +1659,16 @@ expr_expr: | expr '+' INTERVAL_SYM expr interval { $$= new Item_date_add_interval($1,$4,$5,0); } | expr '-' INTERVAL_SYM expr interval - { $$= new Item_date_add_interval($1,$4,$5,1); }; + { $$= new Item_date_add_interval($1,$4,$5,1); } + | expr COLLATE_SYM ident + { + if (!(Lex->charset=get_charset_by_name($3.str,MYF(0)))) + { + net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$3.str); + YYABORT; + } + $$= new Item_func_set_collation($1,Lex->charset); + }; /* expressions that begin with 'expr' that do NOT follow IN_SYM */ no_in_expr: @@ -3446,7 +3456,7 @@ option_value: CONVERT *tmp; if (!(tmp=get_convert_set($3.str))) { - net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$3); + net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$3.str); YYABORT; } current_thd->convert_set=tmp; -- cgit v1.2.1 From 2077c98682badf881e4bd227bb09aa2e714c1268 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 22 Aug 2002 18:40:21 +0300 Subject: removed accidentally pushed file BitKeeper/deleted/.del-sql_select.h.rej~9724e7a9d86d9f54: Delete: sql/sql_select.h.rej --- sql/sql_select.h.rej | 96 ---------------------------------------------------- 1 file changed, 96 deletions(-) delete mode 100644 sql/sql_select.h.rej diff --git a/sql/sql_select.h.rej b/sql/sql_select.h.rej deleted file mode 100644 index 07b1c4403f9..00000000000 --- a/sql/sql_select.h.rej +++ /dev/null @@ -1,96 +0,0 @@ -*************** -*** 173,178 **** - select_result *result; - TMP_TABLE_PARAM tmp_table_param; - MYSQL_LOCK *lock; - }; - - ---- 172,240 ---- - select_result *result; - TMP_TABLE_PARAM tmp_table_param; - MYSQL_LOCK *lock; -+ -+ bool select_distinct, //Is select distinct? -+ no_order, simple_order, simple_group, -+ skip_sort_order, need_tmp, -+ hidden_group_fields, -+ buffer_result; -+ DYNAMIC_ARRAY keyuse; -+ Item::cond_result cond_value; -+ List all_fields; -+ List & fields_list; // hold field list passed to mysql_select -+ int error; -+ -+ ORDER *order, *group_list, *proc_param; //hold parameters of mysql_select -+ COND *conds; // ---"--- -+ TABLE_LIST *tables_list; //hold 'tables' parameter of mysql_select -+ SQL_SELECT *select; //created in optimisation phase -+ TABLE *exec_tmp_table; //used in 'exec' to hold temporary table -+ SELECT_LEX *select_lex; //corresponding select_lex -+ -+ my_bool test_function_query; // need to return select items 1 row -+ const char *zero_result_cause; // not 0 if exec must return zero result -+ -+ JOIN(THD *thd, List &fields, -+ ulong select_options, select_result *result): -+ join_tab(0), -+ table(0), -+ tables(0), const_tables(0), -+ sort_and_group(0), first_record(0), -+ do_send_rows(1), -+ send_records(0), found_records(0), examined_rows(0), -+ thd(thd), -+ sum_funcs(0), -+ having(0), -+ select_options(select_options), -+ result(result), -+ lock(thd->lock), -+ select_distinct(test(select_options & SELECT_DISTINCT)), -+ no_order(0), simple_order(0), simple_group(0), skip_sort_order(0), -+ need_tmp(0), -+ hidden_group_fields (0), /*safety*/ -+ buffer_result(test(select_options & OPTION_BUFFER_RESULT) && -+ !test(select_options & OPTION_FOUND_ROWS)), -+ all_fields(fields), -+ fields_list(fields), -+ select(0), -+ exec_tmp_table(0), -+ select_lex(0), //for safety -+ test_function_query(0), -+ zero_result_cause(0) -+ { -+ fields_list = fields; -+ bzero((char*) &keyuse,sizeof(keyuse)); -+ tmp_table_param.copy_field=0; -+ tmp_table_param.end_write_records= HA_POS_ERROR; -+ } -+ -+ int prepare(TABLE_LIST *tables, -+ COND *conds, ORDER *order, ORDER *group, Item *having, -+ ORDER *proc_param, SELECT_LEX *select); -+ int optimize(); -+ int global_optimize(); -+ void exec(); -+ int cleanup(THD *thd); - }; - - -*************** -*** 187,193 **** - bool store_val_in_field(Field *field,Item *val); - TABLE *create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List &fields, - ORDER *group, bool distinct, bool save_sum_fields, -- bool allow_distinct_limit, ulong select_options); - void free_tmp_table(THD *thd, TABLE *entry); - void count_field_types(TMP_TABLE_PARAM *param, List &fields, - bool reset_with_sum_func); ---- 249,256 ---- - bool store_val_in_field(Field *field,Item *val); - TABLE *create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List &fields, - ORDER *group, bool distinct, bool save_sum_fields, -+ bool allow_distinct_limit, ulong select_options, -+ SELECT_LEX *first_select); - void free_tmp_table(THD *thd, TABLE *entry); - void count_field_types(TMP_TABLE_PARAM *param, List &fields, - bool reset_with_sum_func); -- cgit v1.2.1 From 7f13b1bdd59e798af7477f4eda46ce249c4b5c4e Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 24 Aug 2002 14:49:04 +0300 Subject: Adding a necessary functionality to ::store and ::save_in_field that will take place properly after pull from 4.0, in order to handle conversions from quoted constants to bigint's. --- sql/field.cc | 365 ++++++++++++++++++++++++++++++++++++++++----------- sql/field.h | 126 +++++++++--------- sql/item.cc | 50 ++++--- sql/item.h | 20 +-- sql/item_cmpfunc.cc | 3 +- sql/item_strfunc.cc | 4 +- sql/item_strfunc.h | 4 +- sql/item_timefunc.cc | 4 +- sql/item_timefunc.h | 4 +- sql/opt_range.cc | 2 +- sql/sql_base.cc | 4 +- sql/sql_handler.cc | 2 +- sql/sql_select.cc | 2 +- sql/sql_select.h | 4 +- sql/unireg.cc | 2 +- 15 files changed, 401 insertions(+), 195 deletions(-) diff --git a/sql/field.cc b/sql/field.cc index a475612fbb0..462088d26a6 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -424,7 +424,7 @@ void Field_decimal::overflow(bool negative) } -void Field_decimal::store(const char *from,uint len,CHARSET_INFO *cs) +int Field_decimal::store(const char *from,uint len,CHARSET_INFO *cs) { reg3 int i; uint tmp_dec; @@ -459,7 +459,7 @@ void Field_decimal::store(const char *from,uint len,CHARSET_INFO *cs) if (!error) current_thd->cuted_fields++; Field_decimal::overflow(1); - return; + return 1; } } } @@ -485,7 +485,7 @@ void Field_decimal::store(const char *from,uint len,CHARSET_INFO *cs) current_thd->cuted_fields++; // too big number, change to max or min number Field_decimal::overflow(decstr.sign && decstr.sign_char == '-'); - return; + return 1; } char *to=ptr; for (i=(int) (field_length-tmp_dec-decstr.nr_length-decstr.extra - decstr.sign) ; @@ -520,16 +520,17 @@ void Field_decimal::store(const char *from,uint len,CHARSET_INFO *cs) } } } + return (error) ? 1 : 0; } -void Field_decimal::store(double nr) +int Field_decimal::store(double nr) { if (unsigned_flag && nr < 0) { overflow(1); current_thd->cuted_fields++; - return; + return 1; } reg4 uint i,length; char fyllchar,*to; @@ -548,6 +549,7 @@ void Field_decimal::store(double nr) { overflow(nr < 0.0); current_thd->cuted_fields++; + return 1; } else { @@ -555,17 +557,18 @@ void Field_decimal::store(double nr) for (i=field_length-length ; i-- > 0 ;) *to++ = fyllchar; memcpy(to,buff,length); + return 0; } } -void Field_decimal::store(longlong nr) +int Field_decimal::store(longlong nr) { if (unsigned_flag && nr < 0) { overflow(1); current_thd->cuted_fields++; - return; + return 1; } char buff[22]; uint length=(uint) (longlong10_to_str(nr,buff,-10)-buff); @@ -575,6 +578,7 @@ void Field_decimal::store(longlong nr) { overflow(test(nr < 0L)); /* purecov: inspected */ current_thd->cuted_fields++; /* purecov: inspected */ + return 1; } else { @@ -588,6 +592,7 @@ void Field_decimal::store(longlong nr) to[length]='.'; bfill(to+length+1,dec,'0'); } + return 0; } } @@ -704,10 +709,11 @@ void Field_decimal::sql_type(String &res) const ** tiny int ****************************************************************************/ -void Field_tiny::store(const char *from,uint len,CHARSET_INFO *cs) +int Field_tiny::store(const char *from,uint len,CHARSET_INFO *cs) { String tmp_str(from,len,default_charset_info); long tmp= strtol(tmp_str.c_ptr(),NULL,10); + int error=0; if (unsigned_flag) { @@ -715,14 +721,19 @@ void Field_tiny::store(const char *from,uint len,CHARSET_INFO *cs) { tmp=0; /* purecov: inspected */ current_thd->cuted_fields++; /* purecov: inspected */ + error = 1; } else if (tmp > 255) { tmp= 255; current_thd->cuted_fields++; + error = 1; } else if (current_thd->count_cuted_fields && !test_if_int(from,len)) + { current_thd->cuted_fields++; + error = 1; + } } else { @@ -730,21 +741,28 @@ void Field_tiny::store(const char *from,uint len,CHARSET_INFO *cs) { tmp= -128; current_thd->cuted_fields++; + error = 1; } else if (tmp >= 128) { tmp= 127; current_thd->cuted_fields++; + error = 1; } else if (current_thd->count_cuted_fields && !test_if_int(from,len)) + { current_thd->cuted_fields++; + error = 1; + } } ptr[0]= (char) tmp; + return error; } -void Field_tiny::store(double nr) +int Field_tiny::store(double nr) { + int error=0; nr=rint(nr); if (unsigned_flag) { @@ -752,11 +770,13 @@ void Field_tiny::store(double nr) { *ptr=0; current_thd->cuted_fields++; + error = 1; } else if (nr > 255.0) { *ptr=(char) 255; current_thd->cuted_fields++; + error = 1; } else *ptr=(char) nr; @@ -767,30 +787,36 @@ void Field_tiny::store(double nr) { *ptr= (char) -128; current_thd->cuted_fields++; + error = 1; } else if (nr > 127.0) { *ptr=127; current_thd->cuted_fields++; + error = 1; } else *ptr=(char) nr; } + return error; } -void Field_tiny::store(longlong nr) +int Field_tiny::store(longlong nr) { + int error=0; if (unsigned_flag) { if (nr < 0L) { *ptr=0; current_thd->cuted_fields++; + error = 1; } else if (nr > 255L) { *ptr= (char) 255; current_thd->cuted_fields++; + error = 1; } else *ptr=(char) nr; @@ -801,15 +827,18 @@ void Field_tiny::store(longlong nr) { *ptr= (char) -128; current_thd->cuted_fields++; + error = 1; } else if (nr > 127L) { *ptr=127; current_thd->cuted_fields++; + error = 1; } else *ptr=(char) nr; } + return error; } @@ -875,24 +904,30 @@ void Field_tiny::sql_type(String &res) const // Note: Sometimes this should be fixed to use one strtol() to use // len and check for garbage after number. -void Field_short::store(const char *from,uint len,CHARSET_INFO *cs) +int Field_short::store(const char *from,uint len,CHARSET_INFO *cs) { String tmp_str(from,len,default_charset_info); long tmp= strtol(tmp_str.c_ptr(),NULL,10); + int error=0; if (unsigned_flag) { if (tmp < 0) { tmp=0; current_thd->cuted_fields++; + error = 1; } else if (tmp > (uint16) ~0) { tmp=(uint16) ~0; current_thd->cuted_fields++; + error = 1; } else if (current_thd->count_cuted_fields && !test_if_int(from,len)) + { current_thd->cuted_fields++; + error = 1; + } } else { @@ -900,14 +935,19 @@ void Field_short::store(const char *from,uint len,CHARSET_INFO *cs) { tmp= INT_MIN16; current_thd->cuted_fields++; + error = 1; } else if (tmp > INT_MAX16) { tmp=INT_MAX16; current_thd->cuted_fields++; + error = 1; } else if (current_thd->count_cuted_fields && !test_if_int(from,len)) + { current_thd->cuted_fields++; + error = 1; + } } #ifdef WORDS_BIGENDIAN if (table->db_low_byte_first) @@ -917,11 +957,13 @@ void Field_short::store(const char *from,uint len,CHARSET_INFO *cs) else #endif shortstore(ptr,(short) tmp); + return error; } -void Field_short::store(double nr) +int Field_short::store(double nr) { + int error=0; int16 res; nr=rint(nr); if (unsigned_flag) @@ -930,11 +972,13 @@ void Field_short::store(double nr) { res=0; current_thd->cuted_fields++; + error = 1; } else if (nr > (double) (uint16) ~0) { res=(int16) (uint16) ~0; current_thd->cuted_fields++; + error = 1; } else res=(int16) (uint16) nr; @@ -945,11 +989,13 @@ void Field_short::store(double nr) { res=INT_MIN16; current_thd->cuted_fields++; + error = 1; } else if (nr > (double) INT_MAX16) { res=INT_MAX16; current_thd->cuted_fields++; + error = 1; } else res=(int16) nr; @@ -962,10 +1008,12 @@ void Field_short::store(double nr) else #endif shortstore(ptr,res); + return error; } -void Field_short::store(longlong nr) +int Field_short::store(longlong nr) { + int error=0; int16 res; if (unsigned_flag) { @@ -973,11 +1021,13 @@ void Field_short::store(longlong nr) { res=0; current_thd->cuted_fields++; + error = 1; } else if (nr > (longlong) (uint16) ~0) { res=(int16) (uint16) ~0; current_thd->cuted_fields++; + error = 1; } else res=(int16) (uint16) nr; @@ -988,11 +1038,13 @@ void Field_short::store(longlong nr) { res=INT_MIN16; current_thd->cuted_fields++; + error = 1; } else if (nr > INT_MAX16) { res=INT_MAX16; current_thd->cuted_fields++; + error = 1; } else res=(int16) nr; @@ -1005,6 +1057,7 @@ void Field_short::store(longlong nr) else #endif shortstore(ptr,res); + return error; } @@ -1115,10 +1168,11 @@ void Field_short::sql_type(String &res) const // Note: Sometimes this should be fixed to use one strtol() to use // len and check for garbage after number. -void Field_medium::store(const char *from,uint len,CHARSET_INFO *cs) +int Field_medium::store(const char *from,uint len,CHARSET_INFO *cs) { String tmp_str(from,len,default_charset_info); long tmp= strtol(tmp_str.c_ptr(),NULL,10); + int error=0; if (unsigned_flag) { @@ -1126,14 +1180,19 @@ void Field_medium::store(const char *from,uint len,CHARSET_INFO *cs) { tmp=0; current_thd->cuted_fields++; + error = 1; } else if (tmp >= (long) (1L << 24)) { tmp=(long) (1L << 24)-1L; current_thd->cuted_fields++; + error = 1; } else if (current_thd->count_cuted_fields && !test_if_int(from,len)) + { current_thd->cuted_fields++; + error = 1; + } } else { @@ -1141,22 +1200,29 @@ void Field_medium::store(const char *from,uint len,CHARSET_INFO *cs) { tmp= INT_MIN24; current_thd->cuted_fields++; + error = 1; } else if (tmp > INT_MAX24) { tmp=INT_MAX24; current_thd->cuted_fields++; + error = 1; } else if (current_thd->count_cuted_fields && !test_if_int(from,len)) + { current_thd->cuted_fields++; + error = 1; + } } int3store(ptr,tmp); + return error; } -void Field_medium::store(double nr) +int Field_medium::store(double nr) { + int error=0; nr=rint(nr); if (unsigned_flag) { @@ -1164,12 +1230,14 @@ void Field_medium::store(double nr) { int3store(ptr,0); current_thd->cuted_fields++; + error = 1; } else if (nr >= (double) (long) (1L << 24)) { uint32 tmp=(uint32) (1L << 24)-1L; int3store(ptr,tmp); current_thd->cuted_fields++; + error = 1; } else int3store(ptr,(uint32) nr); @@ -1181,32 +1249,38 @@ void Field_medium::store(double nr) long tmp=(long) INT_MIN24; int3store(ptr,tmp); current_thd->cuted_fields++; + error = 1; } else if (nr > (double) INT_MAX24) { long tmp=(long) INT_MAX24; int3store(ptr,tmp); current_thd->cuted_fields++; + error = 1; } else int3store(ptr,(long) nr); } + return error; } -void Field_medium::store(longlong nr) +int Field_medium::store(longlong nr) { + int error=0; if (unsigned_flag) { if (nr < 0L) { int3store(ptr,0); current_thd->cuted_fields++; + error = 1; } else if (nr >= (longlong) (long) (1L << 24)) { long tmp=(long) (1L << 24)-1L;; int3store(ptr,tmp); current_thd->cuted_fields++; + error = 1; } else int3store(ptr,(uint32) nr); @@ -1218,16 +1292,19 @@ void Field_medium::store(longlong nr) long tmp=(long) INT_MIN24; int3store(ptr,tmp); current_thd->cuted_fields++; + error = 1; } else if (nr > (longlong) INT_MAX24) { long tmp=(long) INT_MAX24; int3store(ptr,tmp); current_thd->cuted_fields++; + error = 1; } else int3store(ptr,(long) nr); } + return error; } @@ -1300,13 +1377,14 @@ void Field_medium::sql_type(String &res) const // Note: Sometimes this should be fixed to use one strtol() to use // len and check for garbage after number. -void Field_long::store(const char *from,uint len,CHARSET_INFO *cs) +int Field_long::store(const char *from,uint len,CHARSET_INFO *cs) { while (len && my_isspace(system_charset_info,*from)) { len--; from++; } long tmp; + int error=0; String tmp_str(from,len,default_charset_info); errno=0; if (unsigned_flag) @@ -1315,6 +1393,7 @@ void Field_long::store(const char *from,uint len,CHARSET_INFO *cs) { tmp=0; // Set negative to 0 errno=ERANGE; + error = 1; } else tmp=(long) strtoul(tmp_str.c_ptr(),NULL,10); @@ -1322,7 +1401,10 @@ void Field_long::store(const char *from,uint len,CHARSET_INFO *cs) else tmp=strtol(tmp_str.c_ptr(),NULL,10); if (errno || current_thd->count_cuted_fields && !test_if_int(from,len)) + { current_thd->cuted_fields++; + error = 1; + } #ifdef WORDS_BIGENDIAN if (table->db_low_byte_first) { @@ -1331,11 +1413,13 @@ void Field_long::store(const char *from,uint len,CHARSET_INFO *cs) else #endif longstore(ptr,tmp); + return error; } -void Field_long::store(double nr) +int Field_long::store(double nr) { + int error=0; int32 res; nr=rint(nr); if (unsigned_flag) @@ -1344,11 +1428,13 @@ void Field_long::store(double nr) { res=0; current_thd->cuted_fields++; + error = 1; } else if (nr > (double) (ulong) ~0L) { res=(int32) (uint32) ~0L; current_thd->cuted_fields++; + error = 1; } else res=(int32) (ulong) nr; @@ -1359,11 +1445,13 @@ void Field_long::store(double nr) { res=(int32) INT_MIN32; current_thd->cuted_fields++; + error = 1; } else if (nr > (double) INT_MAX32) { res=(int32) INT_MAX32; current_thd->cuted_fields++; + error = 1; } else res=(int32) nr; @@ -1376,11 +1464,13 @@ void Field_long::store(double nr) else #endif longstore(ptr,res); + return error; } -void Field_long::store(longlong nr) +int Field_long::store(longlong nr) { + int error=0; int32 res; if (unsigned_flag) { @@ -1388,11 +1478,13 @@ void Field_long::store(longlong nr) { res=0; current_thd->cuted_fields++; + error = 1; } else if (nr >= (LL(1) << 32)) { res=(int32) (uint32) ~0L; current_thd->cuted_fields++; + error = 1; } else res=(int32) (uint32) nr; @@ -1403,11 +1495,13 @@ void Field_long::store(longlong nr) { res=(int32) INT_MIN32; current_thd->cuted_fields++; + error = 1; } else if (nr > (longlong) INT_MAX32) { res=(int32) INT_MAX32; current_thd->cuted_fields++; + error = 1; } else res=(int32) nr; @@ -1420,6 +1514,7 @@ void Field_long::store(longlong nr) else #endif longstore(ptr,res); + return error; } @@ -1528,7 +1623,7 @@ void Field_long::sql_type(String &res) const ** longlong int ****************************************************************************/ -void Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs) +int Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs) { while (len && my_isspace(system_charset_info,*from)) { // For easy error check @@ -1536,6 +1631,7 @@ void Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs) } longlong tmp; String tmp_str(from,len,default_charset_info); + int error=0; errno=0; if (unsigned_flag) { @@ -1543,6 +1639,7 @@ void Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs) { tmp=0; // Set negative to 0 errno=ERANGE; + error = 1; } else tmp=(longlong) strtoull(tmp_str.c_ptr(),NULL,10); @@ -1550,7 +1647,10 @@ void Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs) else tmp=strtoll(tmp_str.c_ptr(),NULL,10); if (errno || current_thd->count_cuted_fields && !test_if_int(from,len)) + { current_thd->cuted_fields++; + error = 1; + } #ifdef WORDS_BIGENDIAN if (table->db_low_byte_first) { @@ -1559,11 +1659,13 @@ void Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs) else #endif longlongstore(ptr,tmp); + return error; } -void Field_longlong::store(double nr) +int Field_longlong::store(double nr) { + int error=0; longlong res; nr=rint(nr); if (unsigned_flag) @@ -1572,11 +1674,13 @@ void Field_longlong::store(double nr) { res=0; current_thd->cuted_fields++; + error = 1; } else if (nr >= (double) ~ (ulonglong) 0) { res= ~(longlong) 0; current_thd->cuted_fields++; + error = 1; } else res=(longlong) (ulonglong) nr; @@ -1587,11 +1691,13 @@ void Field_longlong::store(double nr) { res=(longlong) LONGLONG_MIN; current_thd->cuted_fields++; + error = 1; } else if (nr >= (double) LONGLONG_MAX) { res=(longlong) LONGLONG_MAX; current_thd->cuted_fields++; + error = 1; } else res=(longlong) nr; @@ -1604,10 +1710,11 @@ void Field_longlong::store(double nr) else #endif longlongstore(ptr,res); + return error; } -void Field_longlong::store(longlong nr) +int Field_longlong::store(longlong nr) { #ifdef WORDS_BIGENDIAN if (table->db_low_byte_first) @@ -1617,6 +1724,7 @@ void Field_longlong::store(longlong nr) else #endif longlongstore(ptr,nr); + return 0; } @@ -1735,35 +1843,43 @@ void Field_longlong::sql_type(String &res) const ** single precision float ****************************************************************************/ -void Field_float::store(const char *from,uint len,CHARSET_INFO *cs) +int Field_float::store(const char *from,uint len,CHARSET_INFO *cs) { String tmp_str(from,len,default_charset_info); errno=0; Field_float::store(atof(tmp_str.c_ptr())); if (errno || current_thd->count_cuted_fields && !test_if_real(from,len)) + { current_thd->cuted_fields++; + return 1; + } + return (errno) ? 1 : 0; } -void Field_float::store(double nr) +int Field_float::store(double nr) { float j; + int error=0; if (dec < NOT_FIXED_DEC) nr=floor(nr*log_10[dec]+0.5)/log_10[dec]; // To fixed point if (unsigned_flag && nr < 0) { current_thd->cuted_fields++; nr=0; + error = 1; } if (nr < -FLT_MAX) { j= -FLT_MAX; current_thd->cuted_fields++; + error = 1; } else if (nr > FLT_MAX) { j=FLT_MAX; current_thd->cuted_fields++; + error = 1; } else j= (float) nr; @@ -1775,16 +1891,19 @@ void Field_float::store(double nr) else #endif memcpy_fixed(ptr,(byte*) &j,sizeof(j)); + return error; } -void Field_float::store(longlong nr) +int Field_float::store(longlong nr) { + int error=0; float j= (float) nr; if (unsigned_flag && j < 0) { current_thd->cuted_fields++; j=0; + error = 1; } #ifdef WORDS_BIGENDIAN if (table->db_low_byte_first) @@ -1794,6 +1913,7 @@ void Field_float::store(longlong nr) else #endif memcpy_fixed(ptr,(byte*) &j,sizeof(j)); + return error; } @@ -1985,17 +2105,22 @@ void Field_float::sql_type(String &res) const ** double precision floating point numbers ****************************************************************************/ -void Field_double::store(const char *from,uint len,CHARSET_INFO *cs) +int Field_double::store(const char *from,uint len,CHARSET_INFO *cs) { String tmp_str(from,len,default_charset_info); errno=0; + int error=0; double j= atof(tmp_str.c_ptr()); if (errno || current_thd->count_cuted_fields && !test_if_real(from,len)) + { current_thd->cuted_fields++; + error = 1; + } if (unsigned_flag && j < 0) { current_thd->cuted_fields++; j=0; + error = 1; } #ifdef WORDS_BIGENDIAN if (table->db_low_byte_first) @@ -2005,17 +2130,20 @@ void Field_double::store(const char *from,uint len,CHARSET_INFO *cs) else #endif doublestore(ptr,j); + return error; } -void Field_double::store(double nr) +int Field_double::store(double nr) { + int error=0; if (dec < NOT_FIXED_DEC) nr=floor(nr*log_10[dec]+0.5)/log_10[dec]; // To fixed point if (unsigned_flag && nr < 0) { current_thd->cuted_fields++; nr=0; + error = 1; } #ifdef WORDS_BIGENDIAN if (table->db_low_byte_first) @@ -2025,15 +2153,18 @@ void Field_double::store(double nr) else #endif doublestore(ptr,nr); + return error; } -void Field_double::store(longlong nr) +int Field_double::store(longlong nr) { double j= (double) nr; + int error=0; if (unsigned_flag && j < 0) { current_thd->cuted_fields++; + error = 1; j=0; } #ifdef WORDS_BIGENDIAN @@ -2044,6 +2175,7 @@ void Field_double::store(longlong nr) else #endif doublestore(ptr,j); + return error; } @@ -2241,7 +2373,7 @@ Field_timestamp::Field_timestamp(char *ptr_arg, uint32 len_arg, } -void Field_timestamp::store(const char *from,uint len,CHARSET_INFO *cs) +int Field_timestamp::store(const char *from,uint len,CHARSET_INFO *cs) { long tmp=(long) str_to_timestamp(from,len); #ifdef WORDS_BIGENDIAN @@ -2252,9 +2384,10 @@ void Field_timestamp::store(const char *from,uint len,CHARSET_INFO *cs) else #endif longstore(ptr,tmp); + return 0; } -void Field_timestamp::fill_and_store(char *from,uint len) +void Field_timestamp::fill_and_store(char *from,uint len) { uint res_length; if (len <= field_length) @@ -2283,14 +2416,17 @@ void Field_timestamp::fill_and_store(char *from,uint len) } -void Field_timestamp::store(double nr) +int Field_timestamp::store(double nr) { + int error=0; if (nr < 0 || nr > 99991231235959.0) { nr=0; // Avoid overflow on buff current_thd->cuted_fields++; + error = 1; } - Field_timestamp::store((longlong) rint(nr)); + error |= Field_timestamp::store((longlong) rint(nr)); + return error; } @@ -2331,7 +2467,7 @@ static longlong fix_datetime(longlong nr) } -void Field_timestamp::store(longlong nr) +int Field_timestamp::store(longlong nr) { TIME l_time; time_t timestamp; @@ -2359,6 +2495,7 @@ void Field_timestamp::store(longlong nr) else #endif longstore(ptr,(uint32) timestamp); + return 0; } @@ -2580,12 +2717,16 @@ void Field_timestamp::set_time() ** Stored as a 3 byte unsigned int ****************************************************************************/ -void Field_time::store(const char *from,uint len,CHARSET_INFO *cs) +int Field_time::store(const char *from,uint len,CHARSET_INFO *cs) { TIME ltime; long tmp; + int error=0; if (str_to_time(from,len,<ime)) + { tmp=0L; + error = 1; + } else { if (ltime.month) @@ -2595,26 +2736,31 @@ void Field_time::store(const char *from,uint len,CHARSET_INFO *cs) { tmp=8385959; current_thd->cuted_fields++; + error = 1; } } if (ltime.neg) tmp= -tmp; - Field_time::store((longlong) tmp); + error |= Field_time::store((longlong) tmp); + return error; } -void Field_time::store(double nr) +int Field_time::store(double nr) { long tmp; + int error=0; if (nr > 8385959.0) { tmp=8385959L; current_thd->cuted_fields++; + error = 1; } else if (nr < -8385959.0) { tmp= -8385959L; current_thd->cuted_fields++; + error = 1; } else { @@ -2625,24 +2771,29 @@ void Field_time::store(double nr) { tmp=0; current_thd->cuted_fields++; + error = 1; } } int3store(ptr,tmp); + return error; } -void Field_time::store(longlong nr) +int Field_time::store(longlong nr) { long tmp; + int error=0; if (nr > (longlong) 8385959L) { tmp=8385959L; current_thd->cuted_fields++; + error = 1; } else if (nr < (longlong) -8385959L) { tmp= -8385959L; current_thd->cuted_fields++; + error = 1; } else { @@ -2651,9 +2802,11 @@ void Field_time::store(longlong nr) { tmp=0; current_thd->cuted_fields++; + error = 1; } } int3store(ptr,tmp); + return error; } @@ -2729,7 +2882,7 @@ void Field_time::sql_type(String &res) const ** Can handle 2 byte or 4 byte years! ****************************************************************************/ -void Field_year::store(const char *from, uint len,CHARSET_INFO *cs) +int Field_year::store(const char *from, uint len,CHARSET_INFO *cs) { String tmp_str(from,len,default_charset_info); long nr= strtol(tmp_str.c_ptr(),NULL,10); @@ -2738,7 +2891,7 @@ void Field_year::store(const char *from, uint len,CHARSET_INFO *cs) { *ptr=0; current_thd->cuted_fields++; - return; + return 1; } else if (current_thd->count_cuted_fields && !test_if_int(from,len)) current_thd->cuted_fields++; @@ -2750,23 +2903,27 @@ void Field_year::store(const char *from, uint len,CHARSET_INFO *cs) nr-= 1900; } *ptr= (char) (unsigned char) nr; + return 0; } -void Field_year::store(double nr) +int Field_year::store(double nr) { if (nr < 0.0 || nr >= 2155.0) - Field_year::store((longlong) -1); + { + (void) Field_year::store((longlong) -1); + return 1; + } else - Field_year::store((longlong) nr); + return Field_year::store((longlong) nr); } -void Field_year::store(longlong nr) +int Field_year::store(longlong nr) { if (nr < 0 || nr >= 100 && nr <= 1900 || nr > 2155) { *ptr=0; current_thd->cuted_fields++; - return; + return 1; } if (nr != 0 || field_length != 4) // 0000 -> 0; 00 -> 2000 { @@ -2776,6 +2933,7 @@ void Field_year::store(longlong nr) nr-= 1900; } *ptr= (char) (unsigned char) nr; + return 0; } @@ -2818,12 +2976,16 @@ void Field_year::sql_type(String &res) const ** Stored as a 4 byte unsigned int ****************************************************************************/ -void Field_date::store(const char *from, uint len,CHARSET_INFO *cs) +int Field_date::store(const char *from, uint len,CHARSET_INFO *cs) { TIME l_time; uint32 tmp; + int error=0; if (str_to_TIME(from,len,&l_time,1) == TIMESTAMP_NONE) + { tmp=0; + error = 1; + } else tmp=(uint32) l_time.year*10000L + (uint32) (l_time.month*100+l_time.day); #ifdef WORDS_BIGENDIAN @@ -2834,18 +2996,21 @@ void Field_date::store(const char *from, uint len,CHARSET_INFO *cs) else #endif longstore(ptr,tmp); + return error; } -void Field_date::store(double nr) +int Field_date::store(double nr) { long tmp; + int error=0; if (nr >= 19000000000000.0 && nr <= 99991231235959.0) nr=floor(nr/1000000.0); // Timestamp to date if (nr < 0.0 || nr > 99991231.0) { tmp=0L; current_thd->cuted_fields++; + error = 1; } else tmp=(long) rint(nr); @@ -2857,18 +3022,21 @@ void Field_date::store(double nr) else #endif longstore(ptr,tmp); + return error; } -void Field_date::store(longlong nr) +int Field_date::store(longlong nr) { long tmp; + int error=0; if (nr >= LL(19000000000000) && nr < LL(99991231235959)) nr=nr/LL(1000000); // Timestamp to date if (nr < 0 || nr > LL(99991231)) { tmp=0L; current_thd->cuted_fields++; + error = 1; } else tmp=(long) nr; @@ -2880,6 +3048,7 @@ void Field_date::store(longlong nr) else #endif longstore(ptr,tmp); + return error; } @@ -2975,35 +3144,45 @@ void Field_date::sql_type(String &res) const ** In number context: YYYYMMDD ****************************************************************************/ -void Field_newdate::store(const char *from,uint len,CHARSET_INFO *cs) +int Field_newdate::store(const char *from,uint len,CHARSET_INFO *cs) { TIME l_time; long tmp; + int error=0; if (str_to_TIME(from,len,&l_time,1) == TIMESTAMP_NONE) + { tmp=0L; + error = 1; + } else tmp= l_time.day + l_time.month*32 + l_time.year*16*32; int3store(ptr,tmp); + return error; } -void Field_newdate::store(double nr) +int Field_newdate::store(double nr) { if (nr < 0.0 || nr > 99991231235959.0) - Field_newdate::store((longlong) -1); + { + (void) Field_newdate::store((longlong) -1); + return 1; + } else - Field_newdate::store((longlong) rint(nr)); + return Field_newdate::store((longlong) rint(nr)); } -void Field_newdate::store(longlong nr) +int Field_newdate::store(longlong nr) { int32 tmp; + int error=0; if (nr >= LL(100000000) && nr <= LL(99991231235959)) nr=nr/LL(1000000); // Timestamp to date if (nr < 0L || nr > 99991231L) { tmp=0; current_thd->cuted_fields++; + error = 1; } else { @@ -3021,11 +3200,13 @@ void Field_newdate::store(longlong nr) { tmp=0L; // Don't allow date to change current_thd->cuted_fields++; + error = 1; } else tmp= day + month*32 + (tmp/10000)*16*32; } int3store(ptr,(int32) tmp); + return error; } void Field_newdate::store_time(TIME *ltime,timestamp_type type) @@ -3128,7 +3309,7 @@ void Field_newdate::sql_type(String &res) const ** Stored as a 8 byte unsigned int. Should sometimes be change to a 6 byte int. ****************************************************************************/ -void Field_datetime::store(const char *from,uint len,CHARSET_INFO *cs) +int Field_datetime::store(const char *from,uint len,CHARSET_INFO *cs) { longlong tmp=str_to_datetime(from,len,1); #ifdef WORDS_BIGENDIAN @@ -3139,26 +3320,32 @@ void Field_datetime::store(const char *from,uint len,CHARSET_INFO *cs) else #endif longlongstore(ptr,tmp); + return 0; } -void Field_datetime::store(double nr) +int Field_datetime::store(double nr) { + int error=0; if (nr < 0.0 || nr > 99991231235959.0) { nr=0.0; current_thd->cuted_fields++; + error = 1; } - Field_datetime::store((longlong) rint(nr)); + error |= Field_datetime::store((longlong) rint(nr)); + return error; } -void Field_datetime::store(longlong nr) +int Field_datetime::store(longlong nr) { + int error=0; if (nr < 0 || nr > LL(99991231235959)) { nr=0; current_thd->cuted_fields++; + error = 1; } else nr=fix_datetime(nr); @@ -3170,6 +3357,7 @@ void Field_datetime::store(longlong nr) else #endif longlongstore(ptr,nr); + return error; } void Field_datetime::store_time(TIME *ltime,timestamp_type type) @@ -3344,9 +3532,10 @@ void Field_datetime::sql_type(String &res) const /* Copy a string and fill with space */ -void Field_string::store(const char *from,uint length,CHARSET_INFO *cs) +int Field_string::store(const char *from,uint length,CHARSET_INFO *cs) { field_charset=cs; + int error=0; #ifdef USE_TIS620 if(!binary_flag) { ThNormalize((uchar *)ptr, field_length, (uchar *)from, length); @@ -3372,30 +3561,32 @@ void Field_string::store(const char *from,uint length,CHARSET_INFO *cs) if (!my_isspace(field_charset,*from)) { current_thd->cuted_fields++; + error=1; break; } } } } #endif /* USE_TIS620 */ + return error; } -void Field_string::store(double nr) +int Field_string::store(double nr) { char buff[MAX_FIELD_WIDTH],*end; int width=min(field_length,DBL_DIG+5); sprintf(buff,"%-*.*g",width,max(width-5,0),nr); end=strcend(buff,' '); - Field_string::store(buff,(uint) (end - buff), default_charset_info); + return Field_string::store(buff,(uint) (end - buff), default_charset_info); } -void Field_string::store(longlong nr) +int Field_string::store(longlong nr) { char buff[22]; char *end=longlong10_to_str(nr,buff,-10); - Field_string::store(buff,(uint) (end-buff), default_charset_info); + return Field_string::store(buff,(uint) (end-buff), default_charset_info); } @@ -3554,8 +3745,9 @@ uint Field_string::max_packed_col_length(uint max_length) ****************************************************************************/ -void Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs) +int Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs) { + int error=0; field_charset=cs; #ifdef USE_TIS620 if(!binary_flag) @@ -3572,27 +3764,29 @@ void Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs) length=field_length; memcpy(ptr+2,from,field_length); current_thd->cuted_fields++; + error = 1; } #endif /* USE_TIS620 */ int2store(ptr,length); + return error; } -void Field_varstring::store(double nr) +int Field_varstring::store(double nr) { char buff[MAX_FIELD_WIDTH],*end; int width=min(field_length,DBL_DIG+5); sprintf(buff,"%-*.*g",width,max(width-5,0),nr); end=strcend(buff,' '); - Field_varstring::store(buff,(uint) (end - buff), default_charset_info); + return Field_varstring::store(buff,(uint) (end - buff), default_charset_info); } -void Field_varstring::store(longlong nr) +int Field_varstring::store(longlong nr) { char buff[22]; char *end=longlong10_to_str(nr,buff,-10); - Field_varstring::store(buff,(uint) (end-buff), default_charset_info); + return Field_varstring::store(buff,(uint) (end-buff), default_charset_info); } @@ -3877,7 +4071,7 @@ uint32 Field_blob::get_length(const char *pos) } -void Field_blob::store(const char *from,uint len,CHARSET_INFO *cs) +int Field_blob::store(const char *from,uint len,CHARSET_INFO *cs) { field_charset=cs; if (!len) @@ -3911,20 +4105,21 @@ void Field_blob::store(const char *from,uint len,CHARSET_INFO *cs) } bmove(ptr+packlength,(char*) &from,sizeof(char*)); } + return 0; } -void Field_blob::store(double nr) +int Field_blob::store(double nr) { value.set(nr); - Field_blob::store(value.ptr(),(uint) value.length(), default_charset_info); + return Field_blob::store(value.ptr(),(uint) value.length(), default_charset_info); } -void Field_blob::store(longlong nr) +int Field_blob::store(longlong nr) { value.set(nr); - Field_blob::store(value.ptr(), (uint) value.length(), default_charset_info); + return Field_blob::store(value.ptr(), (uint) value.length(), default_charset_info); } @@ -4071,7 +4266,7 @@ void Field_blob::get_key_image(char *buff,uint length, imagetype type) void Field_blob::set_key_image(char *buff,uint length) { length=uint2korr(buff); - Field_blob::store(buff+2,length, default_charset_info); + (void) Field_blob::store(buff+2,length, default_charset_info); } void Field_geom::get_key_image(char *buff,uint length, imagetype type) @@ -4392,8 +4587,9 @@ uint find_enum(TYPELIB *lib,const char *x, uint length) ** (if there isn't a empty value in the enum) */ -void Field_enum::store(const char *from,uint length,CHARSET_INFO *cs) +int Field_enum::store(const char *from,uint length,CHARSET_INFO *cs) { + int error=0; uint tmp=find_enum(typelib,from,length); if (!tmp) { @@ -4413,29 +4609,34 @@ void Field_enum::store(const char *from,uint length,CHARSET_INFO *cs) { tmp=0; current_thd->cuted_fields++; + error=1; } } else current_thd->cuted_fields++; } store_type((ulonglong) tmp); + return error; } -void Field_enum::store(double nr) +int Field_enum::store(double nr) { - Field_enum::store((longlong) nr); + return Field_enum::store((longlong) nr); } -void Field_enum::store(longlong nr) +int Field_enum::store(longlong nr) { + int error=0; if ((uint) nr > typelib->count || nr == 0) { current_thd->cuted_fields++; nr=0; + error=1; } store_type((ulonglong) (uint) nr); + return error; } @@ -4583,8 +4784,9 @@ ulonglong find_set(TYPELIB *lib,const char *x,uint length) } -void Field_set::store(const char *from,uint length,CHARSET_INFO *cs) +int Field_set::store(const char *from,uint length,CHARSET_INFO *cs) { + int error=0; ulonglong tmp=find_set(typelib,from,length); if (!tmp && length && length < 22) { @@ -4600,23 +4802,30 @@ void Field_set::store(const char *from,uint length,CHARSET_INFO *cs) tmp=strtoull(conv,&end,10); if (my_errno || end != conv+length || tmp > (ulonglong) (((longlong) 1 << typelib->count) - (longlong) 1)) + { tmp=0; + error=1; + } else current_thd->cuted_fields--; // Remove warning from find_set } store_type(tmp); + return error; } -void Field_set::store(longlong nr) +int Field_set::store(longlong nr) { + int error=0; if ((ulonglong) nr > (ulonglong) (((longlong) 1 << typelib->count) - (longlong) 1)) { nr&= (longlong) (((longlong) 1 << typelib->count) - (longlong) 1); current_thd->cuted_fields++; + error=1; } store_type((ulonglong) nr); + return error; } diff --git a/sql/field.h b/sql/field.h index 5bc463af48d..88187b2b7aa 100644 --- a/sql/field.h +++ b/sql/field.h @@ -60,9 +60,9 @@ public: utype unireg_check_arg, const char *field_name_arg, struct st_table *table_arg); virtual ~Field() {} - virtual void store(const char *to,uint length,CHARSET_INFO *cs)=0; - virtual void store(double nr)=0; - virtual void store(longlong nr)=0; + virtual int store(const char *to,uint length,CHARSET_INFO *cs)=0; + virtual int store(double nr)=0; + virtual int store(longlong nr)=0; virtual void store_time(TIME *ltime,timestamp_type t_type); virtual double val_real(void)=0; virtual longlong val_int(void)=0; @@ -281,9 +281,9 @@ public: enum ha_base_keytype key_type() const { return zerofill ? HA_KEYTYPE_BINARY : HA_KEYTYPE_NUM; } void reset(void); - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); double val_real(void); longlong val_int(void); String *val_str(String*,String *); @@ -310,9 +310,9 @@ public: enum_field_types type() const { return FIELD_TYPE_TINY;} enum ha_base_keytype key_type() const { return unsigned_flag ? HA_KEYTYPE_BINARY : HA_KEYTYPE_INT8; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); void reset(void) { ptr[0]=0; } double val_real(void); longlong val_int(void); @@ -339,9 +339,9 @@ public: enum_field_types type() const { return FIELD_TYPE_SHORT;} enum ha_base_keytype key_type() const { return unsigned_flag ? HA_KEYTYPE_USHORT_INT : HA_KEYTYPE_SHORT_INT;} - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); void reset(void) { ptr[0]=ptr[1]=0; } double val_real(void); longlong val_int(void); @@ -368,9 +368,9 @@ public: enum_field_types type() const { return FIELD_TYPE_INT24;} enum ha_base_keytype key_type() const { return unsigned_flag ? HA_KEYTYPE_UINT24 : HA_KEYTYPE_INT24; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); void reset(void) { ptr[0]=ptr[1]=ptr[2]=0; } double val_real(void); longlong val_int(void); @@ -402,9 +402,9 @@ public: enum_field_types type() const { return FIELD_TYPE_LONG;} enum ha_base_keytype key_type() const { return unsigned_flag ? HA_KEYTYPE_ULONG_INT : HA_KEYTYPE_LONG_INT; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; } double val_real(void); longlong val_int(void); @@ -438,9 +438,9 @@ public: enum_field_types type() const { return FIELD_TYPE_LONGLONG;} enum ha_base_keytype key_type() const { return unsigned_flag ? HA_KEYTYPE_ULONGLONG : HA_KEYTYPE_LONGLONG; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=ptr[4]=ptr[5]=ptr[6]=ptr[7]=0; } double val_real(void); longlong val_int(void); @@ -465,9 +465,9 @@ public: {} enum_field_types type() const { return FIELD_TYPE_FLOAT;} enum ha_base_keytype key_type() const { return HA_KEYTYPE_FLOAT; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); void reset(void) { bzero(ptr,sizeof(float)); } double val_real(void); longlong val_int(void); @@ -497,9 +497,9 @@ public: {} enum_field_types type() const { return FIELD_TYPE_DOUBLE;} enum ha_base_keytype key_type() const { return HA_KEYTYPE_DOUBLE; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); void reset(void) { bzero(ptr,sizeof(double)); } double val_real(void); longlong val_int(void); @@ -523,9 +523,9 @@ public: unireg_check_arg, field_name_arg, table_arg, default_charset_info) {} enum_field_types type() const { return FIELD_TYPE_NULL;} - void store(const char *to, uint length, CHARSET_INFO *cs) { null[0]=1; } - void store(double nr) { null[0]=1; } - void store(longlong nr) { null[0]=1; } + int store(const char *to, uint length, CHARSET_INFO *cs) { null[0]=1; return 0; } + int store(double nr) { null[0]=1; return 0; } + int store(longlong nr) { null[0]=1; return 0; } void reset(void) {} double val_real(void) { return 0.0;} longlong val_int(void) { return 0;} @@ -547,9 +547,9 @@ public: enum Item_result result_type () const { return field_length == 8 || field_length == 14 ? INT_RESULT : STRING_RESULT; } enum_field_types type() const { return FIELD_TYPE_TIMESTAMP;} enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONG_INT; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; } double val_real(void); longlong val_int(void); @@ -587,9 +587,9 @@ public: unireg_check_arg, field_name_arg, table_arg, 1, 1) {} enum_field_types type() const { return FIELD_TYPE_YEAR;} - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); double val_real(void); longlong val_int(void); String *val_str(String*,String *); @@ -612,9 +612,9 @@ public: enum_field_types type() const { return FIELD_TYPE_DATE;} enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONG_INT; } enum Item_result cmp_type () const { return INT_RESULT; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; } double val_real(void); longlong val_int(void); @@ -639,9 +639,9 @@ public: enum_field_types real_type() const { return FIELD_TYPE_NEWDATE; } enum ha_base_keytype key_type() const { return HA_KEYTYPE_UINT24; } enum Item_result cmp_type () const { return INT_RESULT; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); void store_time(TIME *ltime,timestamp_type type); void reset(void) { ptr[0]=ptr[1]=ptr[2]=0; } double val_real(void); @@ -673,9 +673,9 @@ public: enum_field_types type() const { return FIELD_TYPE_TIME;} enum ha_base_keytype key_type() const { return HA_KEYTYPE_INT24; } enum Item_result cmp_type () const { return INT_RESULT; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); void reset(void) { ptr[0]=ptr[1]=ptr[2]=0; } double val_real(void); longlong val_int(void); @@ -707,9 +707,9 @@ public: enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONGLONG; } #endif enum Item_result cmp_type () const { return INT_RESULT; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); void store_time(TIME *ltime,timestamp_type type); void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=ptr[4]=ptr[5]=ptr[6]=ptr[7]=0; } double val_real(void); @@ -761,9 +761,9 @@ public: bool zero_pack() const { return 0; } bool binary() const { return binary_flag; } void reset(void) { bfill(ptr,field_length,' '); } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); double val_real(void); longlong val_int(void); String *val_str(String*,String *); @@ -813,9 +813,9 @@ public: void reset(void) { bzero(ptr,field_length+2); } uint32 pack_length() const { return (uint32) field_length+2; } uint32 key_length() const { return (uint32) field_length; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); double val_real(void); longlong val_int(void); String *val_str(String*,String *); @@ -856,9 +856,9 @@ public: enum_field_types type() const { return FIELD_TYPE_BLOB;} enum ha_base_keytype key_type() const { return binary_flag ? HA_KEYTYPE_VARBINARY : HA_KEYTYPE_VARTEXT; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); double val_real(void); longlong val_int(void); String *val_str(String*,String *); @@ -962,9 +962,9 @@ public: enum_field_types type() const { return FIELD_TYPE_STRING; } enum Item_result cmp_type () const { return INT_RESULT; } enum ha_base_keytype key_type() const; - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); void reset() { bzero(ptr,packlength); } double val_real(void); longlong val_int(void); @@ -997,9 +997,9 @@ public: { flags=(flags & ~ENUM_FLAG) | SET_FLAG; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr) { Field_set::store((longlong) nr); } - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr) { return Field_set::store((longlong) nr); } + int store(longlong nr); virtual bool zero_pack() const { return 1; } String *val_str(String*,String *); void sql_type(String &str) const; diff --git a/sql/item.cc b/sql/item.cc index 81c5168b72d..f717b78f4bf 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -340,7 +340,7 @@ void Item_param::set_long_end() item_result_type = STRING_RESULT; }; -bool Item_param::save_in_field(Field *field) +int Item_param::save_in_field(Field *field) { if (null_value) return set_field_to_null(field); @@ -349,20 +349,17 @@ bool Item_param::save_in_field(Field *field) if (item_result_type == INT_RESULT) { longlong nr=val_int(); - field->store(nr); - return 0; + return (field->store(nr)) ? -1 : 0; } if (item_result_type == REAL_RESULT) { double nr=val(); - field->store(nr); - return 0; + return (field->store(nr)) ? -1 : 0; } String *result; CHARSET_INFO *cs=default_charset_info;//fix this result=val_str(&str_value); - field->store(result->ptr(),result->length(),cs); - return 0; + return (field->store(result->ptr(),result->length(),cs)) ? -1 : 0; } void Item_param::make_field(Send_field *tmp_field) @@ -615,7 +612,7 @@ void Item_field::save_org_in_field(Field *to) } } -bool Item_field::save_in_field(Field *to) +int Item_field::save_in_field(Field *to) { if (result_field->is_null()) { @@ -632,14 +629,15 @@ bool Item_field::save_in_field(Field *to) } -bool Item_null::save_in_field(Field *field) +int Item_null::save_in_field(Field *field) { return set_field_to_null(field); } -bool Item::save_in_field(Field *field) +int Item::save_in_field(Field *field) { + int error; if (result_type() == STRING_RESULT || result_type() == REAL_RESULT && field->result_type() == STRING_RESULT) @@ -652,7 +650,7 @@ bool Item::save_in_field(Field *field) if (null_value) return set_field_to_null(field); field->set_notnull(); - field->store(result->ptr(),result->length(),cs); + error=field->store(result->ptr(),result->length(),cs); str_value.set_quick(0, 0, cs); } else if (result_type() == REAL_RESULT) @@ -661,7 +659,7 @@ bool Item::save_in_field(Field *field) if (null_value) return set_field_to_null(field); field->set_notnull(); - field->store(nr); + error=field->store(nr); } else { @@ -669,12 +667,12 @@ bool Item::save_in_field(Field *field) if (null_value) return set_field_to_null(field); field->set_notnull(); - field->store(nr); + error=field->store(nr); } - return 0; + return (error) ? -1 : 0; } -bool Item_string::save_in_field(Field *field) +int Item_string::save_in_field(Field *field) { String *result; CHARSET_INFO *cs=field->binary()?default_charset_info:((Field_str*)field)->charset(); @@ -682,28 +680,25 @@ bool Item_string::save_in_field(Field *field) if (null_value) return set_field_to_null(field); field->set_notnull(); - field->store(result->ptr(),result->length(),cs); - return 0; + return (field->store(result->ptr(),result->length(),cs)) ? -1 : 0; } -bool Item_int::save_in_field(Field *field) +int Item_int::save_in_field(Field *field) { longlong nr=val_int(); if (null_value) return set_field_to_null(field); field->set_notnull(); - field->store(nr); - return 0; + return (field->store(nr)) ? -1 : 0; } -bool Item_real::save_in_field(Field *field) +int Item_real::save_in_field(Field *field) { double nr=val(); if (null_value) return set_field_to_null(field); field->set_notnull(); - field->store(nr); - return 0; + return (field->store(nr)) ? -1 : 0; } /**************************************************************************** @@ -751,20 +746,21 @@ longlong Item_varbinary::val_int() } -bool Item_varbinary::save_in_field(Field *field) +int Item_varbinary::save_in_field(Field *field) { + int error; CHARSET_INFO *cs=field->binary()?default_charset_info:((Field_str*)field)->charset(); field->set_notnull(); if (field->result_type() == STRING_RESULT) { - field->store(str_value.ptr(),str_value.length(),cs); + error=field->store(str_value.ptr(),str_value.length(),cs); } else { longlong nr=val_int(); - field->store(nr); + error=field->store(nr); } - return 0; + return (error) ? -1 : 0; } diff --git a/sql/item.h b/sql/item.h index 187e3903b84..a0b637b6030 100644 --- a/sql/item.h +++ b/sql/item.h @@ -53,7 +53,7 @@ public: void set_name(char* str,uint length=0); void init_make_field(Send_field *tmp_field,enum enum_field_types type); virtual bool fix_fields(THD *, struct st_table_list *, Item **); - virtual bool save_in_field(Field *field); + virtual int save_in_field(Field *field); virtual void save_org_in_field(Field *field) { (void) save_in_field(field); } virtual bool send(THD *thd, String *str); @@ -124,7 +124,7 @@ public: bool send(THD *thd, String *str_arg) { return result_field->send(thd,str_arg); } void make_field(Send_field *field); bool fix_fields(THD *, struct st_table_list *, Item **); - bool save_in_field(Field *field); + int save_in_field(Field *field); void save_org_in_field(Field *field); table_map used_tables() const; enum Item_result result_type () const @@ -149,7 +149,7 @@ public: longlong val_int(); String *val_str(String *str); void make_field(Send_field *field); - bool save_in_field(Field *field); + int save_in_field(Field *field); enum Item_result result_type () const { return STRING_RESULT; } bool send(THD *thd, String *str); @@ -178,7 +178,7 @@ public: longlong val_int(); String *val_str(String*); void make_field(Send_field *field); - bool save_in_field(Field *field); + int save_in_field(Field *field); void set_null(); void set_int(longlong i); void set_double(float i); @@ -215,7 +215,7 @@ public: double val() { return (double) value; } String *val_str(String*); void make_field(Send_field *field); - bool save_in_field(Field *field); + int save_in_field(Field *field); bool basic_const_item() const { return 1; } Item *new_item() { return new Item_int(name,value,max_length); } void print(String *str); @@ -254,7 +254,7 @@ public: max_length=length; } Item_real(double value_par) :value(value_par) {} - bool save_in_field(Field *field); + int save_in_field(Field *field); enum Type type() const { return REAL_ITEM; } double val() { return value; } longlong val_int() { return (longlong) (value+(value > 0 ? 0.5 : -0.5));} @@ -297,7 +297,7 @@ public: double val() { return atof(str_value.ptr()); } longlong val_int() { return strtoll(str_value.ptr(),(char**) 0,10); } String *val_str(String*) { return (String*) &str_value; } - bool save_in_field(Field *field); + int save_in_field(Field *field); void make_field(Send_field *field); enum Item_result result_type () const { return STRING_RESULT; } bool basic_const_item() const { return 1; } @@ -334,7 +334,7 @@ public: double val() { return (double) Item_varbinary::val_int(); } longlong val_int(); String *val_str(String*) { return &str_value; } - bool save_in_field(Field *field); + int save_in_field(Field *field); void make_field(Send_field *field); enum Item_result result_type () const { return INT_RESULT; } }; @@ -394,7 +394,7 @@ public: bool send(THD *thd, String *tmp) { return (*ref)->send(thd, tmp); } void make_field(Send_field *field) { (*ref)->make_field(field); } bool fix_fields(THD *, struct st_table_list *, Item **); - bool save_in_field(Field *field) { return (*ref)->save_in_field(field); } + int save_in_field(Field *field) { return (*ref)->save_in_field(field); } void save_org_in_field(Field *field) { (*ref)->save_org_in_field(field); } enum Item_result result_type () const { return (*ref)->result_type(); } table_map used_tables() const { return (*ref)->used_tables(); } @@ -413,7 +413,7 @@ class Item_int_with_ref :public Item_int public: Item_int_with_ref(longlong i, Item *ref_arg) :Item_int(i), ref(ref_arg) {} - bool save_in_field(Field *field) + int save_in_field(Field *field) { return ref->save_in_field(field); } diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 0fc9a1f0e4c..084688f7d3d 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -43,7 +43,8 @@ static bool convert_constant_item(Field *field, Item **item) { if ((*item)->const_item()) { - (*item)->save_in_field(field); + if ((*item)->save_in_field(field)) + return 0; if (!((*item)->null_value)) { Item *tmp=new Item_int_with_ref(field->val_int(), *item); diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index b5b9ed2931e..594049b3870 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1915,7 +1915,7 @@ outp: } -bool Item_func_conv_charset::fix_fields(THD *thd,struct st_table_list *tables) +bool Item_func_conv_charset::fix_fields(THD *thd,struct st_table_list *tables, Item **ref) { char buff[STACK_BUFF_ALLOC]; // Max argument in function binary=0; @@ -1948,7 +1948,7 @@ String *Item_func_set_collation::val_str(String *str) return str; } -bool Item_func_set_collation::fix_fields(THD *thd,struct st_table_list *tables) +bool Item_func_set_collation::fix_fields(THD *thd,struct st_table_list *tables, Item **ref) { char buff[STACK_BUFF_ALLOC]; // Max argument in function binary=0; diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index 7f82cd3b5de..becb7981acd 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -489,7 +489,7 @@ class Item_func_conv_charset :public Item_str_func public: Item_func_conv_charset(Item *a, CHARSET_INFO *cs) :Item_str_func(a) { conv_charset=cs; } - bool fix_fields(THD *thd,struct st_table_list *tables); + bool fix_fields(THD *thd,struct st_table_list *tables,Item **ref); String *val_str(String *); void fix_length_and_dec(); const char *func_name() const { return "conv_charset"; } @@ -501,7 +501,7 @@ class Item_func_set_collation :public Item_str_func public: Item_func_set_collation(Item *a, CHARSET_INFO *cs) :Item_str_func(a) { set_collation=cs; } - bool fix_fields(THD *thd,struct st_table_list *tables); + bool fix_fields(THD *thd,struct st_table_list *tables, Item **ref); String *val_str(String *); void fix_length_and_dec() { diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index 9bbb9e4fe19..297ff30bd9c 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -410,7 +410,7 @@ String *Item_date::val_str(String *str) } -bool Item_date::save_in_field(Field *field) +int Item_date::save_in_field(Field *field) { TIME ltime; timestamp_type t_type=TIMESTAMP_FULL; @@ -525,7 +525,7 @@ bool Item_func_now::get_date(TIME *res, } -bool Item_func_now::save_in_field(Field *to) +int Item_func_now::save_in_field(Field *to) { to->set_notnull(); to->store_time(<ime,TIMESTAMP_FULL); diff --git a/sql/item_timefunc.h b/sql/item_timefunc.h index 53beb78e1d4..6d016df6eb7 100644 --- a/sql/item_timefunc.h +++ b/sql/item_timefunc.h @@ -228,7 +228,7 @@ public: double val() { return (double) val_int(); } const char *func_name() const { return "date"; } void fix_length_and_dec() { decimals=0; max_length=10; } - bool save_in_field(Field *to); + int save_in_field(Field *to); void make_field(Send_field *tmp_field) { init_make_field(tmp_field,FIELD_TYPE_DATE); @@ -311,7 +311,7 @@ public: enum Item_result result_type () const { return STRING_RESULT; } double val() { return (double) value; } longlong val_int() { return value; } - bool save_in_field(Field *to); + int save_in_field(Field *to); String *val_str(String *str) { str_value.set(buff,buff_length,default_charset_info); return &str_value; } const char *func_name() const { return "now"; } diff --git a/sql/opt_range.cc b/sql/opt_range.cc index ccee7192682..3764ff2d55c 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -1028,7 +1028,7 @@ get_mm_leaf(PARAM *param, Field *field, KEY_PART *key_part, field->cmp_type() != value->result_type()) DBUG_RETURN(0); - if (value->save_in_field(field)) + if (value->save_in_field(field) == 1) { if (type == Item_func::EQUAL_FUNC) { diff --git a/sql/sql_base.cc b/sql/sql_base.cc index b3ef043f582..6185b031c2e 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -2113,7 +2113,7 @@ fill_record(List &fields,List &values) while ((field=(Item_field*) f++)) { value=v++; - if (value->save_in_field(field->field)) + if (value->save_in_field(field->field) == 1) DBUG_RETURN(1); } DBUG_RETURN(0); @@ -2131,7 +2131,7 @@ fill_record(Field **ptr,List &values) while ((field = *ptr++)) { value=v++; - if (value->save_in_field(field)) + if (value->save_in_field(field) == 1) DBUG_RETURN(1); } DBUG_RETURN(0); diff --git a/sql/sql_handler.cc b/sql/sql_handler.cc index a98012653b3..3668a817165 100644 --- a/sql/sql_handler.cc +++ b/sql/sql_handler.cc @@ -179,7 +179,7 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, Item *item; for (key_len=0 ; (item=it_ke++) ; key_part++) { - item->save_in_field(key_part->field); + (void) item->save_in_field(key_part->field); key_len+=key_part->store_length; } if (!(key= (byte*) sql_calloc(ALIGN_SIZE(key_len)))) diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 76f78009e84..4e7dbd96127 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -2478,7 +2478,7 @@ store_val_in_field(Field *field,Item *item) THD *thd=current_thd; ulong cuted_fields=thd->cuted_fields; thd->count_cuted_fields=1; - item->save_in_field(field); + (void) item->save_in_field(field); thd->count_cuted_fields=0; return cuted_fields != thd->cuted_fields; } diff --git a/sql/sql_select.h b/sql/sql_select.h index 3062747a08f..f651f069c13 100644 --- a/sql/sql_select.h +++ b/sql/sql_select.h @@ -338,7 +338,7 @@ public: {} bool copy() { - item->save_in_field(to_field); + (void) item->save_in_field(to_field); return err != 0; } const char *name() const { return "func"; } @@ -362,7 +362,7 @@ public: if (!inited) { inited=1; - item->save_in_field(to_field); + (void)item->save_in_field(to_field); } return err != 0; } diff --git a/sql/unireg.cc b/sql/unireg.cc index f2d8d6532a9..57a1407ea06 100644 --- a/sql/unireg.cc +++ b/sql/unireg.cc @@ -590,7 +590,7 @@ static bool make_empty_rec(File file,enum db_type table_type, if (field->def && (regfield->real_type() != FIELD_TYPE_YEAR || field->def->val_int() != 0)) - field->def->save_in_field(regfield); + (void) field->def->save_in_field(regfield); else if (regfield->real_type() == FIELD_TYPE_ENUM && (field->flags & NOT_NULL_FLAG)) { -- cgit v1.2.1 From 1895448e66b39542d58a77e705449b92414ff3f7 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 26 Aug 2002 17:33:44 +0500 Subject: Fix that this didn't work as far as sorting for ORDER BY was removed by optimizer: SELECT k FROM t1 GROUP BY k COLLATE latin1 ORDER BY k COLLATE latin1_de --- sql/item_strfunc.cc | 20 ++++++++++++++++++++ sql/item_strfunc.h | 1 + 2 files changed, 21 insertions(+) diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 594049b3870..dc9d57b1d9d 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1967,6 +1967,26 @@ bool Item_func_set_collation::fix_fields(THD *thd,struct st_table_list *tables, return 0; } +bool Item_func_set_collation::eq(const Item *item, bool binary_cmp) const +{ + /* Assume we don't have rtti */ + if (this == item) + return 1; + if (item->type() != FUNC_ITEM) + return 0; + Item_func *item_func=(Item_func*) item; + if (arg_count != item_func->arg_count || + func_name() != item_func->func_name()) + return 0; + Item_func_set_collation *item_func_sc=(Item_func_set_collation*) item; + if (set_collation != item_func_sc->set_collation) + return 0; + for (uint i=0; i < arg_count ; i++) + if (!args[i]->eq(item_func_sc->args[i], binary_cmp)) + return 0; + return 1; +} + String *Item_func_charset::val_str(String *str) { diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index becb7981acd..997d9c8d834 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -508,6 +508,7 @@ public: max_length = args[0]->max_length; str_value.set_charset(set_collation); } + bool eq(const Item *item, bool binary_cmp) const; const char *func_name() const { return "set_collation"; } }; -- cgit v1.2.1 From c36c00632acf264e35e0b72fdf1756ae1f492d97 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 28 Aug 2002 21:11:23 +0300 Subject: some small speed improvements after my last changes. I know I should have waited for Monty's merge ... --- sql/opt_range.cc | 2 +- sql/sql_base.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/opt_range.cc b/sql/opt_range.cc index 3764ff2d55c..a99a701e4b4 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -1028,7 +1028,7 @@ get_mm_leaf(PARAM *param, Field *field, KEY_PART *key_part, field->cmp_type() != value->result_type()) DBUG_RETURN(0); - if (value->save_in_field(field) == 1) + if (value->save_in_field(field) > 0) { if (type == Item_func::EQUAL_FUNC) { diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 6185b031c2e..080a521cc91 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -2113,7 +2113,7 @@ fill_record(List &fields,List &values) while ((field=(Item_field*) f++)) { value=v++; - if (value->save_in_field(field->field) == 1) + if (value->save_in_field(field->field) > 0) DBUG_RETURN(1); } DBUG_RETURN(0); -- cgit v1.2.1 From 3fbcafea9c5e85dc6315f0b89872ac5e273195c8 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 3 Sep 2002 09:50:36 +0300 Subject: subselect with union new error handling Item_ref bug fixed include/mysql_com.h: new error handling query cache pointer description mysql-test/r/distinct.result: new result's after Monty's bug fixing mysql-test/r/subselect.result: subselect with union test mysql-test/t/subselect.test: subselect with union test sql/item.cc: subselect with union Item_ref bug fixed sql/item_cmpfunc.cc: Monty's bug fixing sql/item_subselect.cc: TODO changing subselect with union sql/item_subselect.h: subselect with union sql/mysql_priv.h: Item_ref bug fixed sql/mysqld.cc: new error handling sql/net_pkg.cc: new error handling sql/net_serv.cc: new error handling sql/sql_base.cc: Item_ref bug fixed sql/sql_class.cc: new error handling sql/sql_class.h: new error handling sql/sql_derived.cc: subselect with union sql/sql_insert.cc: new error handling (only with mysql_select now) sql/sql_lex.cc: subselect with union sql/sql_lex.h: subselect with union sql/sql_parse.cc: new error handling sql/sql_select.cc: new error handling subselect with union removed thd->where=0 hack sql/sql_select.h: subselect with union sql/sql_union.cc: subselect with union sql/sql_update.cc: new error handling (only with mysql_select now) sql/sql_yacc.yy: subselect with union --- include/mysql_com.h | 7 +- mysql-test/r/distinct.result | 3 +- mysql-test/r/subselect.result | 21 ++- mysql-test/t/subselect.test | 12 +- sql/item.cc | 25 +++- sql/item_cmpfunc.cc | 2 + sql/item_subselect.cc | 214 +++++++++++++++++++---------- sql/item_subselect.h | 125 ++++++++++++----- sql/mysql_priv.h | 7 +- sql/mysqld.cc | 3 +- sql/net_pkg.cc | 5 +- sql/net_serv.cc | 37 +++-- sql/sql_base.cc | 36 ++--- sql/sql_class.cc | 48 ++++--- sql/sql_class.h | 4 +- sql/sql_derived.cc | 2 +- sql/sql_insert.cc | 2 + sql/sql_lex.cc | 9 +- sql/sql_lex.h | 32 ++++- sql/sql_parse.cc | 20 +-- sql/sql_select.cc | 69 +++++----- sql/sql_select.h | 4 +- sql/sql_union.cc | 312 +++++++++++++++++++++++++----------------- sql/sql_update.cc | 3 + sql/sql_yacc.yy | 10 +- 25 files changed, 658 insertions(+), 354 deletions(-) diff --git a/include/mysql_com.h b/include/mysql_com.h index c259259c9e2..ca6a9527461 100644 --- a/include/mysql_com.h +++ b/include/mysql_com.h @@ -132,8 +132,13 @@ typedef struct st_net { unsigned int *return_status; unsigned char reading_or_writing; char save_char; + my_bool report_error; /* We should report error (we have unreported error) */ my_bool no_send_ok; - gptr query_cache_query; + /* + Pointer to query object in query cache, do not equal NULL (0) for + queries in cache that have not stored its results yet + */ + gptr query_cache_query; } NET; #define packet_error (~(unsigned long) 0) diff --git a/mysql-test/r/distinct.result b/mysql-test/r/distinct.result index e347a95b037..89f4a8ae7f2 100644 --- a/mysql-test/r/distinct.result +++ b/mysql-test/r/distinct.result @@ -92,7 +92,8 @@ NULL NULL NULL 0 0 select id >= 0 and id <= 5 as grp,count(*) from t1 group by grp; grp count(*) -0 7 +NULL 1 +0 6 1 6 SELECT DISTINCT FACILITY FROM t1; FACILITY diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index bd92c496f29..e7cfa50d7f7 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -1,7 +1,7 @@ select (select 2); (select 2) 2 -drop table if exists t1,t2,t3,t4; +drop table if exists t1,t2,t3,t4,t5; create table t1 (a int); create table t2 (a int, b int); create table t3 (a int); @@ -82,4 +82,21 @@ select b,max(a) as ma from t4 group by b having b >= (select max(t2.a) from t2 where t2.b=t4.b); b ma 7 12 -drop table t1,t2,t3,t4; +create table t5 (a int); +select (select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a), a from t2; +(select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a) a +NULL 1 +2 2 +insert into t5 values (5); +select (select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a), a from t2; +(select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a) a +NULL 1 +2 2 +insert into t5 values (2); +select (select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a), a from t2; +(select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a) a +NULL 1 +2 2 +select (select a from t1 where t1.a=t2.a union all select a from t5 where t5.a=t2.a), a from t2; +Subselect return more than 1 record +drop table t1,t2,t3,t4,t5; diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 7b1ebdcbc27..224149900d2 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -1,6 +1,6 @@ select (select 2); -drop table if exists t1,t2,t3,t4; +drop table if exists t1,t2,t3,t4,t5; create table t1 (a int); create table t2 (a int, b int); create table t3 (a int); @@ -33,4 +33,12 @@ select b,max(a) as ma from t4 group by b having b < (select max(t2.a) from t2 where t2.b=t4.b); select b,max(a) as ma from t4 group by b having b >= (select max(t2.a) from t2 where t2.b=t4.b); -drop table t1,t2,t3,t4; +create table t5 (a int); +select (select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a), a from t2; +insert into t5 values (5); +select (select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a), a from t2; +insert into t5 values (2); +select (select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a), a from t2; +-- error 1230 +select (select a from t1 where t1.a=t2.a union all select a from t5 where t5.a=t2.a), a from t2; +drop table t1,t2,t3,t4,t5; diff --git a/sql/item.cc b/sql/item.cc index 81c5168b72d..47171206e3d 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -457,7 +457,7 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) if (!field) // If field is not checked { Field *tmp; - if (!(tmp=find_field_in_tables(thd,this,tables))) + if (!(tmp=find_field_in_tables(thd, this, tables, 0))) { /* We can't find table field in table list of current select, @@ -473,9 +473,14 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) sl && !tmp; sl= sl->outer_select()) tmp=find_field_in_tables(thd, this, - (TABLE_LIST*)(last= sl)->table_list.first); + (TABLE_LIST*)(last= sl)->table_list.first, + 0); if (!tmp) - return 1; + { + // Call to produce appropriate error message + find_field_in_tables(thd, this, tables, 1); + return -1; + } else { depended_from= last; @@ -488,7 +493,8 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) s= s->outer_select()) if( !s->depended ) { - s->depended= 1; //Select is depended of outer select + // Select is depended of outer select + s->depended= s->master_unit()->depended= 1; //Tables will be reopened many times for (TABLE_LIST *tbl= (TABLE_LIST*)s->table_list.first; @@ -803,7 +809,7 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference) { if (!ref) { - if (!(ref= find_item_in_list(this,thd->lex.select->item_list))) + if (!(ref= find_item_in_list(this, thd->lex.select->item_list, 0))) { /* We can't find table field in table list of current select, @@ -818,9 +824,13 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference) for (SELECT_LEX *sl= thd->lex.select->outer_select(); sl && !ref; sl= sl->outer_select()) - ref= find_item_in_list(this, (last= sl)->item_list); + ref= find_item_in_list(this, (last= sl)->item_list, 0); if (!ref) + { + // Call to report error + find_item_in_list(this, thd->lex.select->item_list, 1); return 1; + } else { depended_from= last; @@ -833,7 +843,8 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference) s= s->outer_select()) if( !s->depended ) { - s->depended= 1; //Select is depended of outer select + // Select is depended of outer select + s->depended= s->master_unit()->depended= 1; //Tables will be reopened many times for (TABLE_LIST *tbl= (TABLE_LIST*)s->table_list.first; diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 0fc9a1f0e4c..d1a130aa12b 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -1101,6 +1101,8 @@ Item_cond::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) used_tables_cache|=item->used_tables(); with_sum_func= with_sum_func || item->with_sum_func; const_item_cache&=item->const_item(); + if (item->maybe_null) + maybe_null=1; } if (thd) thd->cond_count+=list.elements; diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 2bff2af45e4..18e9f51925a 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -23,9 +23,6 @@ SUBSELECT TODO: - remove double 'having' & 'having_list' from JOIN (sql_select.h/sql_select.cc) - - subselect in HAVING clause - - add subselect union select (sql_union.cc) - */ #ifdef __GNUC__ @@ -37,21 +34,17 @@ SUBSELECT TODO: Item_subselect::Item_subselect(THD *thd, st_select_lex *select_lex, select_subselect *result): - assigned(0), executed(0), optimized(0), error(0) + engine_owner(1), value_assigned(0) { DBUG_ENTER("Item_subselect::Item_subselect"); DBUG_PRINT("subs", ("select_lex 0x%xl", (long) select_lex)); - this->result= result; - SELECT_LEX_UNIT *unit= select_lex->master_unit(); - unit->offset_limit_cnt= unit->global_parameters->offset_limit; - unit->select_limit_cnt= unit->global_parameters->select_limit+ - unit->global_parameters ->offset_limit; - if (unit->select_limit_cnt < unit->global_parameters->select_limit) - unit->select_limit_cnt= HA_POS_ERROR; // no limit - if (unit->select_limit_cnt == HA_POS_ERROR) - select_lex->options&= ~OPTION_FOUND_ROWS; - join= new JOIN(thd, select_lex->item_list, select_lex->options, result); - this->select_lex= select_lex; + + if (select_lex->next_select()) + engine= new subselect_union_engine(thd, select_lex->master_unit(), result, + this); + else + engine= new subselect_single_select_engine(thd, select_lex, result, + this); assign_null(); /* item value is NULL if select_subselect not changed this value @@ -61,6 +54,12 @@ Item_subselect::Item_subselect(THD *thd, st_select_lex *select_lex, DBUG_VOID_RETURN; } +Item_subselect::~Item_subselect() +{ + if (engine_owner) + delete engine; +} + void Item_subselect::make_field (Send_field *tmp_field) { if (null_value) @@ -78,62 +77,17 @@ void Item_subselect::make_field (Send_field *tmp_field) bool Item_subselect::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) { // Is it one field subselect? - if (select_lex->item_list.elements > max_columns) + if (engine->cols() > max_columns) { - my_printf_error(ER_SUBSELECT_NO_1_COL, ER(ER_SUBSELECT_NO_1_COL), MYF(0)); + my_message(ER_SUBSELECT_NO_1_COL, ER(ER_SUBSELECT_NO_1_COL), MYF(0)); return 1; } - SELECT_LEX *save_select= thd->lex.select; - thd->lex.select= select_lex; - if(join->prepare((TABLE_LIST*) select_lex->table_list.first, - select_lex->where, - (ORDER*) select_lex->order_list.first, - (ORDER*) select_lex->group_list.first, - select_lex->having, - (ORDER*) 0, select_lex, - select_lex->master_unit())) - return 1; - thd->lex.select= save_select; - return 0; -} - -int Item_subselect::exec() -{ - DBUG_ENTER("Item_subselect::exec"); - if (!optimized) - { - optimized=1; - if (join->optimize()) - { - executed= 1; - DBUG_RETURN(join->error?join->error:1); - } - } - if (join->select_lex->depended && executed) - { - if (join->reinit()) - { - error= 1; - DBUG_RETURN(1); - } - assign_null(); - executed= assigned= 0; - } - if (!executed) - { - SELECT_LEX *save_select= join->thd->lex.select; - join->thd->lex.select= select_lex; - join->exec(); - join->thd->lex.select= save_select; - executed= 1; - DBUG_RETURN(join->error); - } - DBUG_RETURN(0); + return engine->prepare(); } inline table_map Item_subselect::used_tables() const { - return (table_map) select_lex->depended ? 1L : 0L; + return (table_map) engine->depended() ? 1L : 0L; } Item_singleval_subselect::Item_singleval_subselect(THD *thd, @@ -151,21 +105,21 @@ Item::Type Item_subselect::type() const double Item_singleval_subselect::val () { - if (exec()) + if (engine->exec()) return 0; return real_value; } longlong Item_singleval_subselect::val_int () { - if (exec()) + if (engine->exec()) return 0; return int_value; } String *Item_singleval_subselect::val_str (String *str) { - if (exec() || null_value) + if (engine->exec() || null_value) return 0; return &str_value; } @@ -183,23 +137,143 @@ Item_exists_subselect::Item_exists_subselect(THD *thd, double Item_exists_subselect::val () { - if (exec()) + if (engine->exec()) return 0; return (double) value; } longlong Item_exists_subselect::val_int () { - if (exec()) + if (engine->exec()) return 0; return value; } String *Item_exists_subselect::val_str(String *str) { - if (exec()) + if (engine->exec()) return 0; str->set(value); return str; } + +subselect_single_select_engine::subselect_single_select_engine(THD *thd, + st_select_lex *select, + select_subselect *result, + Item_subselect *item): + subselect_engine(thd, item, result), + executed(0), optimized(0) +{ + select_lex= select; + SELECT_LEX_UNIT *unit= select_lex->master_unit(); + unit->offset_limit_cnt= unit->global_parameters->offset_limit; + unit->select_limit_cnt= unit->global_parameters->select_limit+ + unit->global_parameters ->offset_limit; + if (unit->select_limit_cnt < unit->global_parameters->select_limit) + unit->select_limit_cnt= HA_POS_ERROR; // no limit + if (unit->select_limit_cnt == HA_POS_ERROR) + select_lex->options&= ~OPTION_FOUND_ROWS; + join= new JOIN(thd, select_lex->item_list, select_lex->options, result); + if (!join || !result) + { + //out of memory + thd->fatal_error= 1; + my_message(ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES), MYF(0)); + } + this->select_lex= select_lex; +} + +subselect_union_engine::subselect_union_engine(THD *thd, + st_select_lex_unit *u, + select_subselect *result, + Item_subselect *item): + subselect_engine(thd, item, result) +{ + unit= u; + if( !result) + { + //out of memory + thd->fatal_error= 1; + my_message(ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES), MYF(0)); + } + unit->item= item; +} + +int subselect_single_select_engine::prepare() +{ + SELECT_LEX *save_select= thd->lex.select; + thd->lex.select= select_lex; + if(join->prepare((TABLE_LIST*) select_lex->table_list.first, + select_lex->where, + (ORDER*) select_lex->order_list.first, + (ORDER*) select_lex->group_list.first, + select_lex->having, + (ORDER*) 0, select_lex, + select_lex->master_unit(), 0)) + return 1; + thd->lex.select= save_select; + return 0; +} + +int subselect_union_engine::prepare() +{ + return unit->prepare(thd, result); +} + + +int subselect_single_select_engine::exec() +{ + DBUG_ENTER("subselect_single_select_engine::exec"); + if (!optimized) + { + optimized=1; + if (join->optimize()) + { + executed= 1; + DBUG_RETURN(join->error?join->error:1); + } + } + if (select_lex->depended && executed) + { + if (join->reinit()) + DBUG_RETURN(1); + item->assign_null(); + item->assigned((executed= 0)); + } + if (!executed) + { + SELECT_LEX *save_select= join->thd->lex.select; + join->thd->lex.select= select_lex; + join->exec(); + join->thd->lex.select= save_select; + executed= 1; + DBUG_RETURN(join->error||thd->fatal_error); + } + DBUG_RETURN(0); +} + +int subselect_union_engine::exec() +{ + return unit->exec(); +} + +uint subselect_single_select_engine::cols() +{ + return select_lex->item_list.elements; +} + +uint subselect_union_engine::cols() +{ + return unit->first_select()->item_list.elements; +} + +bool subselect_single_select_engine::depended() +{ + return select_lex->depended; +} + +bool subselect_union_engine::depended() +{ + return unit->depended; +} diff --git a/sql/item_subselect.h b/sql/item_subselect.h index 3f363df33df..0d8495d3ae8 100644 --- a/sql/item_subselect.h +++ b/sql/item_subselect.h @@ -20,31 +20,25 @@ #pragma interface /* gcc class implementation */ #endif -struct st_select_lex; +class st_select_lex; +class st_select_lex_unit; class JOIN; class select_subselect; +class subselect_engine; /* base class for subselects */ class Item_subselect :public Item { + my_bool engine_owner; /* Is this item owner of engine */ + my_bool value_assigned; /* value already assigned to subselect */ protected: + /* engine that perform execution of subselect (single select or union) */ + subselect_engine *engine; + /* allowed number of columns (1 for single value subqueries) */ uint max_columns; - my_bool assigned; /* value already assigned to subselect */ - my_bool executed; /* simple subselect is executed */ - my_bool optimized; /* simple subselect is optimized */ - my_bool error; /* error in query */ - int exec(); - virtual void assign_null() - { - null_value= 1; - } public: - st_select_lex *select_lex; - JOIN *join; - select_subselect *result; - Item_subselect(THD *thd, st_select_lex *select_lex, select_subselect* result); Item_subselect(Item_subselect *item) @@ -52,14 +46,17 @@ public: null_value= item->null_value; decimals= item->decimals; max_columns= item->max_columns; - assigned= item->assigned; - executed= item->executed; - select_lex= item->select_lex; - join= item->join; - result= item->result; + engine= item->engine; + engine_owner= 0; name= item->name; - error= item->error; } + ~Item_subselect(); + virtual void assign_null() + { + null_value= 1; + } + bool assigned() { return value_assigned; } + void assigned(bool a) { value_assigned= a; } enum Type type() const; bool is_null() { return null_value; } void make_field (Send_field *); @@ -75,18 +72,10 @@ public: class Item_singleval_subselect :public Item_subselect { protected: - longlong int_value; - double real_value; - enum Item_result res_type; + longlong int_value; /* here stored integer value of this item */ + double real_value; /* here stored real value of this item */ + enum Item_result res_type; /* type of results */ - virtual void assign_null() - { - null_value= 1; - int_value= 0; - real_value= 0; - max_length= 4; - res_type= STRING_RESULT; - } public: Item_singleval_subselect(THD *thd, st_select_lex *select_lex); Item_singleval_subselect(Item_singleval_subselect *item): @@ -98,6 +87,14 @@ public: decimals= item->decimals; res_type= item->res_type; } + virtual void assign_null() + { + null_value= 1; + int_value= 0; + real_value= 0; + max_length= 4; + res_type= STRING_RESULT; + } double val (); longlong val_int (); String *val_str (String *); @@ -112,12 +109,8 @@ public: class Item_exists_subselect :public Item_subselect { protected: - longlong value; + longlong value; /* value of this item (boolean: exists/not-exists) */ - virtual void assign_null() - { - value= 0; - } public: Item_exists_subselect(THD *thd, st_select_lex *select_lex); Item_exists_subselect(Item_exists_subselect *item): @@ -125,6 +118,11 @@ public: { value= item->value; } + virtual void assign_null() + { + value= 0; + } + Item *new_item() { return new Item_exists_subselect(this); } enum Item_result result_type() const { return INT_RESULT;} longlong val_int(); @@ -133,3 +131,58 @@ public: friend class select_exists_subselect; }; + +class subselect_engine +{ +protected: + select_subselect *result; /* results storage class */ + THD *thd; /* pointer to current THD */ + Item_subselect *item; /* item, that use this engine */ +public: + static void *operator new(size_t size) + { + return (void*) sql_alloc((uint) size); + } + static void operator delete(void *ptr, size_t size) {} + + subselect_engine(THD *thd, Item_subselect *si, select_subselect *res) + { + result= res; + item= si; + this->thd= thd; + } + virtual int prepare()= 0; + virtual int exec()= 0; + virtual uint cols()= 0; /* return number of columnss in select */ + virtual bool depended()= 0; /* depended from outer select */ +}; + +class subselect_single_select_engine: public subselect_engine +{ + my_bool executed; /* simple subselect is executed */ + my_bool optimized; /* simple subselect is optimized */ + st_select_lex *select_lex; /* corresponding select_lex */ + JOIN * join; /* corresponding JOIN structure */ +public: + subselect_single_select_engine(THD *thd, st_select_lex *select, + select_subselect *result, + Item_subselect *item); + virtual int prepare(); + virtual int exec(); + virtual uint cols(); + virtual bool depended(); +}; + +class subselect_union_engine: public subselect_engine +{ + st_select_lex_unit *unit; /* corresponding unit structure */ +public: + subselect_union_engine(THD *thd, + st_select_lex_unit *u, + select_subselect *result, + Item_subselect *item); + virtual int prepare(); + virtual int exec(); + virtual uint cols(); + virtual bool depended(); +}; diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index c0371d1e90c..155d056db42 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -373,7 +373,7 @@ int handle_select(THD *thd, LEX *lex, select_result *result); int mysql_select(THD *thd,TABLE_LIST *tables,List &list,COND *conds, ORDER *order, ORDER *group,Item *having,ORDER *proc_param, ulong select_type,select_result *result, - SELECT_LEX_UNIT *unit); + SELECT_LEX_UNIT *unit, bool fake_select_lex); int mysql_union(THD *thd, LEX *lex,select_result *result); int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *s, TABLE_LIST *t); Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, @@ -438,7 +438,8 @@ bool wait_for_tables(THD *thd); bool table_is_used(TABLE *table, bool wait_for_name_lock); bool drop_locked_tables(THD *thd,const char *db, const char *table_name); void abort_locked_tables(THD *thd,const char *db, const char *table_name); -Field *find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables); +Field *find_field_in_tables(THD *thd, Item_field *item, TABLE_LIST *tables, + bool report_error); Field *find_field_in_table(THD *thd,TABLE *table,const char *name,uint length, bool check_grant,bool allow_rowid); #ifdef HAVE_OPENSSL @@ -526,7 +527,7 @@ TABLE *unlink_open_table(THD *thd,TABLE *list,TABLE *find); SQL_SELECT *make_select(TABLE *head, table_map const_tables, table_map read_tables, COND *conds, int *error); -Item ** find_item_in_list(Item *item,List &items); +Item ** find_item_in_list(Item *item, List &items, bool report_error); bool insert_fields(THD *thd,TABLE_LIST *tables, const char *db_name, const char *table_name, List_iterator *it); diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 98bfa162242..830c7324771 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -1608,8 +1608,9 @@ static int my_message_sql(uint error, const char *str, NET *net; DBUG_ENTER("my_message_sql"); DBUG_PRINT("error",("Message: '%s'",str)); - if ((net=my_pthread_getspecific_ptr(NET*,THR_NET))) + if ((net= my_pthread_getspecific_ptr(NET*,THR_NET))) { + net->report_error= 1; if (!net->last_error[0]) // Return only first message { strmake(net->last_error,str,sizeof(net->last_error)-1); diff --git a/sql/net_pkg.cc b/sql/net_pkg.cc index fa3abc68bfa..5551e2b19bc 100644 --- a/sql/net_pkg.cc +++ b/sql/net_pkg.cc @@ -72,7 +72,10 @@ void send_error(NET *net, uint sql_errno, const char *err) } VOID(net_write_command(net,(uchar) 255,(char*) err,length)); if (thd) - thd->fatal_error=0; // Error message is given + { + thd->fatal_error= 0; // Error message is given + thd->net.report_error= 0; + } DBUG_VOID_RETURN; } diff --git a/sql/net_serv.cc b/sql/net_serv.cc index 0d6e548a873..abda5a3c275 100644 --- a/sql/net_serv.cc +++ b/sql/net_serv.cc @@ -113,6 +113,7 @@ int my_net_init(NET *net, Vio* vio) net->where_b = net->remain_in_buf=0; net->last_errno=0; net->query_cache_query=0; + net->report_error= 0; if (vio != 0) /* If real connection */ { @@ -141,8 +142,9 @@ static my_bool net_realloc(NET *net, ulong length) if (length >= max_allowed_packet) { DBUG_PRINT("error",("Packet too large (%lu)", length)); - net->error=1; - net->last_errno=ER_NET_PACKET_TOO_LARGE; + net->error= 1; + net->report_error= 1; + net->last_errno= ER_NET_PACKET_TOO_LARGE; return 1; } pkt_length = (length+IO_SIZE-1) & ~(IO_SIZE-1); @@ -152,9 +154,10 @@ static my_bool net_realloc(NET *net, ulong length) NET_HEADER_SIZE + COMP_HEADER_SIZE, MYF(MY_WME)))) { - net->error=1; + net->error= 1; + net->report_error= 1; #ifdef MYSQL_SERVER - net->last_errno=ER_OUT_OF_RESOURCES; + net->last_errno= ER_OUT_OF_RESOURCES; #endif return 1; } @@ -348,10 +351,12 @@ net_real_write(NET *net,const char *packet,ulong len) COMP_HEADER_SIZE, MYF(MY_WME)))) { #ifdef MYSQL_SERVER - net->last_errno=ER_OUT_OF_RESOURCES; - net->error=2; + net->last_errno= ER_OUT_OF_RESOURCES; + net->error= 2; + //TODO is it needed to set this variable if we have no socket + net->report_error= 1; #endif - net->reading_or_writing=0; + net->reading_or_writing= 0; DBUG_RETURN(1); } memcpy(b+header_length,packet,len); @@ -401,7 +406,8 @@ net_real_write(NET *net,const char *packet,ulong len) "%s: my_net_write: fcntl returned error %d, aborting thread\n", my_progname,vio_errno(net->vio)); #endif /* EXTRA_DEBUG */ - net->error=2; /* Close socket */ + net->error= 2; /* Close socket */ + net->report_error= 1; goto end; } } @@ -428,7 +434,8 @@ net_real_write(NET *net,const char *packet,ulong len) continue; } #endif /* defined(THREAD_SAFE_CLIENT) && !defined(MYSQL_SERVER) */ - net->error=2; /* Close socket */ + net->error= 2; /* Close socket */ + net->report_error= 1; #ifdef MYSQL_SERVER net->last_errno= (interrupted ? ER_NET_WRITE_INTERRUPTED : ER_NET_ERROR_ON_WRITE); @@ -562,9 +569,10 @@ my_real_read(NET *net, ulong *complen) my_progname,vio_errno(net->vio)); #endif /* EXTRA_DEBUG */ len= packet_error; - net->error=2; /* Close socket */ + net->error= 2; /* Close socket */ + net->report_error= 1; #ifdef MYSQL_SERVER - net->last_errno=ER_NET_FCNTL_ERROR; + net->last_errno= ER_NET_FCNTL_ERROR; #endif goto end; } @@ -593,7 +601,8 @@ my_real_read(NET *net, ulong *complen) #endif DBUG_PRINT("error",("Couldn't read packet: remain: %lu errno: %d length: %ld alarmed: %d", remain,vio_errno(net->vio),length,alarmed)); len= packet_error; - net->error=2; /* Close socket */ + net->error= 2; /* Close socket */ + net->report_error= 1; #ifdef MYSQL_SERVER net->last_errno= (interrupted ? ER_NET_READ_INTERRUPTED : ER_NET_READ_ERROR); @@ -622,6 +631,7 @@ my_real_read(NET *net, ulong *complen) #endif } len= packet_error; + net->report_error= 1; #ifdef MYSQL_SERVER net->last_errno=ER_NET_PACKETS_OUT_OF_ORDER; #endif @@ -794,7 +804,8 @@ my_net_read(NET *net) if (my_uncompress((byte*) net->buff + net->where_b, &packet_len, &complen)) { - net->error=2; /* caller will close socket */ + net->error= 2; /* caller will close socket */ + net->report_error= 1; #ifdef MYSQL_SERVER net->last_errno=ER_NET_UNCOMPRESS_ERROR; #endif diff --git a/sql/sql_base.cc b/sql/sql_base.cc index b3ef043f582..95f9e15331f 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -1711,7 +1711,8 @@ Field *find_field_in_table(THD *thd,TABLE *table,const char *name,uint length, Field * -find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables) +find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables, + bool report_error) { Field *found=0; const char *db=item->db_name; @@ -1748,7 +1749,7 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables) } if (found) return found; - if (!found_table) + if (!found_table && report_error) { char buff[NAME_LEN*2+1]; if (db) @@ -1760,8 +1761,9 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables) thd->where); } else - my_printf_error(ER_BAD_FIELD_ERROR,ER(ER_BAD_FIELD_ERROR),MYF(0), - item->full_name(),thd->where); + if (report_error) + my_printf_error(ER_BAD_FIELD_ERROR,ER(ER_BAD_FIELD_ERROR),MYF(0), + item->full_name(),thd->where); return (Field*) 0; } bool allow_rowid= tables && !tables->next; // Only one table @@ -1778,8 +1780,9 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables) { if (!thd->where) // Returns first found break; - my_printf_error(ER_NON_UNIQ_ERROR,ER(ER_NON_UNIQ_ERROR),MYF(0), - name,thd->where); + if (report_error) + my_printf_error(ER_NON_UNIQ_ERROR,ER(ER_NON_UNIQ_ERROR),MYF(0), + name,thd->where); return (Field*) 0; } found=field; @@ -1787,13 +1790,14 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables) } if (found) return found; - my_printf_error(ER_BAD_FIELD_ERROR,ER(ER_BAD_FIELD_ERROR), - MYF(0),item->full_name(),thd->where); + if (report_error) + my_printf_error(ER_BAD_FIELD_ERROR, ER(ER_BAD_FIELD_ERROR), + MYF(0), item->full_name(), thd->where); return (Field*) 0; } Item ** -find_item_in_list(Item *find,List &items) +find_item_in_list(Item *find,List &items, bool report_error) { List_iterator li(items); Item **found=0,*item; @@ -1841,9 +1845,9 @@ find_item_in_list(Item *find,List &items) break; } } - if (!found && current_thd->where) - my_printf_error(ER_BAD_FIELD_ERROR,ER(ER_BAD_FIELD_ERROR),MYF(0), - find->full_name(),current_thd->where); + if (!found && report_error) + my_printf_error(ER_BAD_FIELD_ERROR, ER(ER_BAD_FIELD_ERROR), MYF(0), + find->full_name(), current_thd->where); return found; } @@ -2303,8 +2307,8 @@ bool remove_table_from_cache(THD *thd, const char *db, const char *table_name, int setup_ftfuncs(THD *thd) { - List_iterator li(thd->lex.select->ftfunc_list), - lj(thd->lex.select->ftfunc_list); + List_iterator li(*(thd->lex.select->ftfunc_list)), + lj(*(thd->lex.select->ftfunc_list)); Item_func_match *ftf, *ftf2; while ((ftf=li++)) @@ -2324,9 +2328,9 @@ int setup_ftfuncs(THD *thd) int init_ftfuncs(THD *thd, bool no_order) { - if (thd->lex.select->ftfunc_list.elements) + if (thd->lex.select->ftfunc_list->elements) { - List_iterator li(thd->lex.select->ftfunc_list); + List_iterator li(*(thd->lex.select->ftfunc_list)); Item_func_match *ifm; DBUG_PRINT("info",("Performing FULLTEXT search")); thd->proc_info="FULLTEXT initialization"; diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 9922eacdec1..b84bcf1df72 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -407,13 +407,19 @@ bool select_send::send_data(List &items) if (item->send(thd, packet)) { packet->free(); // Free used - my_error(ER_OUT_OF_RESOURCES,MYF(0)); + my_message(ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES), MYF(0)); DBUG_RETURN(1); } } thd->sent_row_count++; - bool error=my_net_write(&thd->net,(char*) packet->ptr(),packet->length()); - DBUG_RETURN(error); + if (!thd->net.report_error) + { + DBUG_RETURN(my_net_write(&thd->net, + (char*) packet->ptr(), + packet->length())); + } + else + DBUG_RETURN(1); } bool select_send::send_eof() @@ -423,8 +429,13 @@ bool select_send::send_eof() { mysql_unlock_tables(thd, thd->lock); thd->lock=0; } - ::send_eof(&thd->net); - return 0; + if (!thd->net.report_error) + { + ::send_eof(&thd->net); + return 0; + } + else + return 1; } @@ -460,7 +471,7 @@ select_export::prepare(List &list, SELECT_LEX_UNIT *u) option); if (!access(path,F_OK)) { - my_error(ER_FILE_EXISTS_ERROR,MYF(0),exchange->file_name); + my_error(ER_FILE_EXISTS_ERROR, MYF(0), exchange->file_name); return 1; } /* Create the file world readable */ @@ -646,9 +657,9 @@ err: } -void select_export::send_error(uint errcode,const char *err) +void select_export::send_error(uint errcode, const char *err) { - ::send_error(&thd->net,errcode,err); + my_message(errcode, err, MYF(0));; (void) end_io_cache(&cache); (void) my_close(file,MYF(0)); file= -1; @@ -660,9 +671,7 @@ bool select_export::send_eof() int error=test(end_io_cache(&cache)); if (my_close(file,MYF(MY_WME))) error=1; - if (error) - ::send_error(&thd->net); - else + if (!error) ::send_ok(&thd->net,row_count); file= -1; return error; @@ -735,7 +744,7 @@ bool select_dump::send_data(List &items) } if (row_count++ > 1) { - my_error(ER_TOO_MANY_ROWS,MYF(0)); + my_error(ER_TOO_MANY_ROWS, MYF(0)); goto err; } while ((item=li++)) @@ -760,7 +769,7 @@ err: void select_dump::send_error(uint errcode,const char *err) { - ::send_error(&thd->net,errcode,err); + my_message(errcode, err, MYF(0)); (void) end_io_cache(&cache); (void) my_close(file,MYF(0)); (void) my_delete(path,MYF(0)); // Delete file on error @@ -772,9 +781,7 @@ bool select_dump::send_eof() int error=test(end_io_cache(&cache)); if (my_close(file,MYF(MY_WME))) error=1; - if (error) - ::send_error(&thd->net); - else + if (!error) ::send_ok(&thd->net,row_count); file= -1; return error; @@ -789,8 +796,9 @@ bool select_singleval_subselect::send_data(List &items) { DBUG_ENTER("select_singleval_subselect::send_data"); Item_singleval_subselect *it= (Item_singleval_subselect *)item; - if (it->assigned){ - my_printf_error(ER_SUBSELECT_NO_1_ROW, ER(ER_SUBSELECT_NO_1_ROW), MYF(0)); + if (it->assigned()){ + thd->fatal_error= 1; + my_message(ER_SUBSELECT_NO_1_ROW, ER(ER_SUBSELECT_NO_1_ROW), MYF(0)); DBUG_RETURN(1); } if (unit->offset_limit_cnt) @@ -816,7 +824,7 @@ bool select_singleval_subselect::send_data(List &items) it->int_value= val_item->val_int(); it->res_type= val_item->result_type(); } - it->assigned= 1; + it->assigned(1); DBUG_RETURN(0); } @@ -830,7 +838,7 @@ bool select_exists_subselect::send_data(List &items) DBUG_RETURN(0); } it->value= 1; - it->assigned= 1; + it->assigned(1); DBUG_RETURN(0); } diff --git a/sql/sql_class.h b/sql/sql_class.h index a6b7e45ab03..82241f0ff1f 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -453,7 +453,7 @@ public: bool query_error, bootstrap, cleanup_done; bool safe_to_cache_query; bool volatile killed; - bool prepare_command; + bool prepare_command; ulong param_count,current_param_number; Error err_list; Error warn_list; @@ -621,7 +621,7 @@ public: virtual void initialize_tables (JOIN *join=0) {} virtual void send_error(uint errcode,const char *err) { - ::send_error(&thd->net,errcode,err); + my_message(errcode, err, MYF(0)); } virtual bool send_eof()=0; virtual void abort() {} diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index fb40a85fd91..cde120f3774 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -99,7 +99,7 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t) (ORDER*) sl->group_list.first, sl->having, (ORDER*) NULL, sl->options | thd->options | SELECT_NO_UNLOCK, - derived_result, unit); + derived_result, unit, 0); if (!res) { // Here we entirely fix both TABLE_LIST and list of SELECT's as there were no derived tables diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index c3aeca1fff8..ea949e9eb99 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -1331,6 +1331,7 @@ bool select_insert::send_data(List &values) void select_insert::send_error(uint errcode,const char *err) { + //TODO error should be sent at the query processing end ::send_error(&thd->net,errcode,err); table->file->extra(HA_EXTRA_NO_CACHE); table->file->activate_all_index(thd); @@ -1357,6 +1358,7 @@ bool select_insert::send_eof() if (error) { table->file->print_error(error,MYF(0)); + //TODO error should be sent at the query processing end ::send_error(&thd->net); return 1; } diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 9ae5cdeeb15..7e6e2524400 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -146,7 +146,8 @@ LEX *lex_start(THD *thd, uchar *buf,uint length) lex->length=0; lex->select->in_sum_expr=0; lex->select->expr_list.empty(); - lex->select->ftfunc_list.empty(); + lex->select->ftfunc_list_alloc.empty(); + lex->select->ftfunc_list= &lex->select->ftfunc_list_alloc; lex->convert_set=(lex->thd=thd)->convert_set; lex->yacc_yyss=lex->yacc_yyvs=0; lex->ignore_space=test(thd->sql_mode & MODE_IGNORE_SPACE); @@ -918,6 +919,8 @@ void st_select_lex_unit::init_query() global_parameters= this; select_limit_cnt= HA_POS_ERROR; offset_limit_cnt= 0; + optimized= 0; + item= 0; } void st_select_lex::init_query() @@ -941,9 +944,11 @@ void st_select_lex::init_select() expr_list.empty(); interval_list.empty(); use_index.empty(); - ftfunc_list.empty(); + ftfunc_list_alloc.empty(); + ftfunc_list= &ftfunc_list_alloc; linkage= UNSPECIFIED_TYPE; depended= having_fix_field= 0; + } /* diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 470230c0999..26b59207f5d 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -216,7 +216,22 @@ private: */ class st_lex; class st_select_lex; +class THD; +class select_result; +class JOIN; +class select_union; class st_select_lex_unit: public st_select_lex_node { +protected: + List item_list; + List joins; /* list of *JOINs, to delete it in cleanup() */ + TABLE_LIST result_table_list; + select_union *union_result; + TABLE *table; /* temporary table using for appending UNION results */ + THD *thd; + select_result *result; + int res; + bool describe, found_rows_for_union, + optimized; // optimize phase already performed for UNION (unit) public: /* Pointer to 'last' select or pointer to unit where stored @@ -225,12 +240,21 @@ public: st_select_lex_node *global_parameters; /* LIMIT clause runtime counters */ ha_rows select_limit_cnt, offset_limit_cnt; + bool depended; /* depended from outer select subselect */ + /* not NULL if union used in subselect, point to subselect item */ + Item_subselect *item; + void init_query(); bool create_total_list(THD *thd, st_lex *lex, TABLE_LIST **result); st_select_lex* outer_select() { return (st_select_lex*) master; } st_select_lex* first_select() { return (st_select_lex*) slave; } st_select_lex_unit* next_unit() { return (st_select_lex_unit*) next; } + /* UNION methods */ + int prepare(THD *thd, select_result *result); + int exec(); + int cleanup(); + friend void mysql_init_query(THD *thd); private: bool create_total_list_n_last_return(THD *thd, st_lex *lex, @@ -241,7 +265,6 @@ typedef struct st_select_lex_unit SELECT_LEX_UNIT; /* SELECT_LEX - store information of parsed SELECT_LEX statment */ -class JOIN; class st_select_lex: public st_select_lex_node { public: char *db, *db1, *table1, *db2, *table2; /* For outer join using .. */ @@ -252,7 +275,12 @@ public: List item_list; /* list of fields & expressions */ List interval_list, use_index, *use_index_ptr, ignore_index, *ignore_index_ptr; - List ftfunc_list; + /* + Usualy it is pointer to ftfunc_list_alloc, but in union used to create fake + select_lex for calling mysql_select under results of union + */ + List *ftfunc_list; + List ftfunc_list_alloc; JOIN *join; /* after JOIN::prepare it is pointer to corresponding JOIN */ uint in_sum_expr; bool create_refs, diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index e006855105c..49a961c1a78 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -665,7 +665,7 @@ pthread_handler_decl(handle_one_connection,arg) if (thd->user_connect) decrease_user_connections(thd->user_connect); free_root(&thd->mem_root,MYF(0)); - if (net->error && net->vio != 0) + if (net->error && net->vio != 0 && net->report_error) { if (!thd->killed && opt_warnings) sql_print_error(ER(ER_NEW_ABORTING_CONNECTION), @@ -1169,6 +1169,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, break; } case COM_PING: + DBUG_PRINT("info", ("query: PING")); thread_safe_increment(com_other,&LOCK_thread_count); send_ok(net); // Tell client we are alive break; @@ -1257,6 +1258,7 @@ mysql_execute_command(void) SELECT_LEX_UNIT *unit= &lex->unit; DBUG_ENTER("mysql_execute_command"); + thd->net.report_error= 0; if (thd->slave_thread) { /* @@ -1864,7 +1866,7 @@ mysql_execute_command(void) (ORDER *)NULL, select_lex->options | thd->options | SELECT_NO_JOIN_CACHE, - result, unit); + result, unit, 0); delete result; } else @@ -2029,13 +2031,13 @@ mysql_execute_command(void) lex->lock_option, table_count))) { - res=mysql_select(thd,tables,select_lex->item_list, - select_lex->where, - (ORDER *)NULL,(ORDER *)NULL,(Item *)NULL, - (ORDER *)NULL, - select_lex->options | thd->options | - SELECT_NO_JOIN_CACHE, - result, unit); + res= mysql_select(thd,tables,select_lex->item_list, + select_lex->where, + (ORDER *)NULL,(ORDER *)NULL,(Item *)NULL, + (ORDER *)NULL, + select_lex->options | thd->options | + SELECT_NO_JOIN_CACHE, + result, unit, 0); delete result; } else diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 76f78009e84..690270d6407 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -178,9 +178,14 @@ int handle_select(THD *thd, LEX *lex, select_result *result) select_lex->having, (ORDER*) lex->proc_list.first, select_lex->options | thd->options, - result, &(lex->unit)); + result, &(lex->unit), 0); if (res && result) result->abort(); + if (res || thd->net.report_error) + { + send_error(&thd->net, 0, MYF(0)); + res= 1; + } delete result; return res; } @@ -198,9 +203,10 @@ int handle_select(THD *thd, LEX *lex, select_result *result) */ int JOIN::prepare(TABLE_LIST *tables_init, - COND *conds_init, ORDER *order_init, ORDER *group_init, - Item *having_init, - ORDER *proc_param_init, SELECT_LEX *select, SELECT_LEX_UNIT *unit) + COND *conds_init, ORDER *order_init, ORDER *group_init, + Item *having_init, + ORDER *proc_param_init, SELECT_LEX *select, + SELECT_LEX_UNIT *unit, bool fake_select_lex) { DBUG_ENTER("JOIN::prepare"); @@ -211,7 +217,8 @@ JOIN::prepare(TABLE_LIST *tables_init, proc_param= proc_param_init; tables_list= tables_init; select_lex= select; - select->join= this; + if (!fake_select_lex) + select->join= this; union_part= (unit->first_select()->next_select() != 0); /* Check that all tables, fields, conds and order are ok */ @@ -231,7 +238,7 @@ JOIN::prepare(TABLE_LIST *tables_init, select_lex->having_fix_field= 1; bool having_fix_rc= having->fix_fields(thd, tables_list, &having); select_lex->having_fix_field= 0; - if (having_fix_rc || thd->fatal_error) + if (having_fix_rc || thd->net.report_error) DBUG_RETURN(-1); /* purecov: inspected */ if (having->with_sum_func) having->split_sum_func(all_fields); @@ -538,7 +545,7 @@ JOIN::optimize() make_join_readinfo(this, (select_options & (SELECT_DESCRIBE | SELECT_NO_JOIN_CACHE)) | - (thd->lex.select->ftfunc_list.elements ? + (thd->lex.select->ftfunc_list->elements ? SELECT_NO_JOIN_CACHE : 0)); /* Need to tell Innobase that to play it safe, it should fetch all @@ -650,16 +657,16 @@ JOIN::exec() result->send_fields(fields_list,1); if (!having || having->val_int()) { - if (do_send_rows && result->send_data(fields_list)) - { - result->send_error(0,NullS); /* purecov: inspected */ - error=1; - } + if (do_send_rows && result->send_data(fields_list)) + { + result->send_error(0,NullS); /* purecov: inspected */ + error= 1; + } else error=(int) result->send_eof(); } else - error=(int) result->send_eof(); + error=(int) result->send_eof(); } delete procedure; DBUG_VOID_RETURN; @@ -995,8 +1002,9 @@ JOIN::cleanup(THD *thd) int mysql_select(THD *thd, TABLE_LIST *tables, List &fields, COND *conds, - ORDER *order, ORDER *group,Item *having, ORDER *proc_param, - ulong select_options, select_result *result, SELECT_LEX_UNIT *unit) + ORDER *order, ORDER *group,Item *having, ORDER *proc_param, + ulong select_options, select_result *result, + SELECT_LEX_UNIT *unit, bool fake_select_lex) { JOIN *join = new JOIN(thd, fields, select_options, result); @@ -1005,7 +1013,7 @@ mysql_select(THD *thd, TABLE_LIST *tables, List &fields, COND *conds, thd->used_tables=0; // Updated by setup_fields if (join->prepare(tables, conds, order, group, having, proc_param, - &(thd->lex.select_lex), unit)) + &(thd->lex.select_lex), unit, fake_select_lex)) { DBUG_RETURN(-1); } @@ -1026,7 +1034,7 @@ err: thd->limit_found_rows = join->send_records; thd->examined_row_count = join->examined_rows; thd->proc_info="end"; - int error= join->cleanup(thd); + int error= (fake_select_lex?0:join->cleanup(thd)) || thd->net.report_error; delete join; DBUG_RETURN(error); } @@ -1760,7 +1768,7 @@ update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse,JOIN_TAB *join_tab, add_key_part(keyuse,field); } - if (thd->lex.select->ftfunc_list.elements) + if (thd->lex.select->ftfunc_list->elements) { add_ft_keys(keyuse,join_tab,cond,normal_tables); } @@ -4329,7 +4337,7 @@ do_select(JOIN *join,List *fields,TABLE *table,Procedure *procedure) VOID(table->file->extra(HA_EXTRA_WRITE_CACHE)); empty_record(table); } - join->tmp_table=table; /* Save for easy recursion */ + join->tmp_table= table; /* Save for easy recursion */ join->fields= fields; /* Set up select_end */ @@ -4379,20 +4387,14 @@ do_select(JOIN *join,List *fields,TABLE *table,Procedure *procedure) } else { - error=sub_select(join,join_tab,0); + error= sub_select(join,join_tab,0); if (error >= 0) - error=sub_select(join,join_tab,1); + error= sub_select(join,join_tab,1); if (error == -3) - error=0; /* select_limit used */ + error= 0; /* select_limit used */ } - /* Return 1 if error is sent; -1 if error should be sent */ - if (error < 0) - { - join->result->send_error(0,NullS); /* purecov: inspected */ - error=1; // Error sent - } - else + if (error >= 0) { error=0; if (!table) // If sending data to client @@ -6445,10 +6447,7 @@ find_order_in_list(THD *thd,TABLE_LIST *tables,ORDER *order,List &fields, order->in_field_list=1; return 0; } - const char *save_where=thd->where; - thd->where=0; // No error if not found - Item **item=find_item_in_list(*order->item,fields); - thd->where=save_where; + Item **item=find_item_in_list(*order->item, fields, 0); if (item) { order->item=item; // use it @@ -6546,17 +6545,15 @@ setup_new_fields(THD *thd,TABLE_LIST *tables,List &fields, DBUG_ENTER("setup_new_fields"); thd->set_query_id=1; // Not really needed, but... - thd->where=0; // Don't give error for ( ; new_field ; new_field=new_field->next) { - if ((item=find_item_in_list(*new_field->item,fields))) + if ((item=find_item_in_list(*new_field->item, fields, 0))) new_field->item=item; /* Change to shared Item */ else { thd->where="procedure list"; if ((*new_field->item)->fix_fields(thd, tables, new_field->item)) DBUG_RETURN(1); /* purecov: inspected */ - thd->where=0; all_fields.push_front(*new_field->item); new_field->item=all_fields.head_ref(); } diff --git a/sql/sql_select.h b/sql/sql_select.h index 3062747a08f..0f7e08d268e 100644 --- a/sql/sql_select.h +++ b/sql/sql_select.h @@ -209,6 +209,7 @@ class JOIN :public Sql_alloc{ send_records(0), found_records(0), examined_rows(0), thd(thd), sum_funcs(0), + procedure(0), having(0), select_options(select_options), result(result), @@ -235,7 +236,8 @@ class JOIN :public Sql_alloc{ int prepare(TABLE_LIST *tables, COND *conds, ORDER *order, ORDER *group, Item *having, - ORDER *proc_param, SELECT_LEX *select, SELECT_LEX_UNIT *unit); + ORDER *proc_param, SELECT_LEX *select, SELECT_LEX_UNIT *unit, + bool fake_select_lex); int optimize(); int global_optimize(); int reinit(); diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 0eea10e068a..e8ee3582135 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -24,31 +24,103 @@ #include "mysql_priv.h" #include "sql_select.h" +int mysql_union(THD *thd, LEX *lex, select_result *result) +{ + DBUG_ENTER("mysql_union"); + SELECT_LEX_UNIT *unit= &lex->unit; + int res= 0; + if (!(res= unit->prepare(thd, result))) + res= unit->exec(); + res|= unit->cleanup(); + DBUG_RETURN(res); +} + + +/*************************************************************************** +** store records in temporary table for UNION +***************************************************************************/ + +select_union::select_union(TABLE *table_par) + :table(table_par) +{ + bzero((char*) &info,sizeof(info)); + /* + We can always use DUP_IGNORE because the temporary table will only + contain a unique key if we are using not using UNION ALL + */ + info.handle_duplicates= DUP_IGNORE; +} + +select_union::~select_union() +{ +} + + +int select_union::prepare(List &list, SELECT_LEX_UNIT *u) +{ + unit= u; + if (save_time_stamp && list.elements != table->fields) + { + my_message(ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT, + ER(ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT),MYF(0)); + return -1; + } + return 0; +} + +bool select_union::send_data(List &values) +{ + if (unit->offset_limit_cnt) + { // using limit offset,count + unit->offset_limit_cnt--; + return 0; + } + fill_record(table->field,values); + if ((write_record(table,&info))) + { + if (create_myisam_from_heap(table, tmp_table_param, info.errorno, 0)) + return 1; + } + return 0; +} + +bool select_union::send_eof() +{ + return 0; +} -int mysql_union(THD *thd, LEX *lex,select_result *result) +bool select_union::flush() { - SELECT_LEX *sl; - SELECT_LEX_UNIT *unit= &(lex->unit); - List item_list; - TABLE *table; - int describe=(lex->select_lex.options & SELECT_DESCRIBE) ? 1 : 0; - int res; - bool found_rows_for_union=false; - TABLE_LIST result_table_list; + int error; + if ((error=table->file->extra(HA_EXTRA_NO_CACHE))) + { + table->file->print_error(error,MYF(0)); + ::send_error(&thd->net); + return 1; + } + return 0; +} + +typedef JOIN * JOIN_P; +int st_select_lex_unit::prepare(THD *thd, select_result *result) +{ + describe=(first_select()->options & SELECT_DESCRIBE) ? 1 : 0; + res= 0; + found_rows_for_union= false; TMP_TABLE_PARAM tmp_table_param; - select_union *union_result; - DBUG_ENTER("mysql_union"); - st_select_lex_node * global; + DBUG_ENTER("st_select_lex_unit::prepare"); + this->thd= thd; + this->result= result; /* Global option */ - if (((void*)(global= unit->global_parameters)) == ((void*)unit)) + if (((void*)(global_parameters)) == ((void*)this)) { - found_rows_for_union = lex->select_lex.options & OPTION_FOUND_ROWS && - !describe && global->select_limit; + found_rows_for_union = first_select()->options & OPTION_FOUND_ROWS && + !describe && global_parameters->select_limit; if (found_rows_for_union) - lex->select_lex.options ^= OPTION_FOUND_ROWS; + first_select()->options ^= OPTION_FOUND_ROWS; } - + item_list.empty(); if (describe) { Item *item; @@ -70,8 +142,8 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) else { Item *item; - List_iterator it(lex->select_lex.item_list); - TABLE_LIST *first_table= (TABLE_LIST*) lex->select_lex.table_list.first; + List_iterator it(first_select()->item_list); + TABLE_LIST *first_table= (TABLE_LIST*) first_select()->table_list.first; /* Create a list of items that will be in the result set */ while ((item= it++)) @@ -84,11 +156,12 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) bzero((char*) &tmp_table_param,sizeof(tmp_table_param)); tmp_table_param.field_count=item_list.elements; if (!(table= create_tmp_table(thd, &tmp_table_param, item_list, - (ORDER*) 0, !describe & !lex->union_option, + (ORDER*) 0, !describe & + !thd->lex.union_option, 1, 0, - (lex->select_lex.options | thd->options | + (first_select()->options | thd->options | TMP_TABLE_ALL_COLUMNS), - unit))) + this))) DBUG_RETURN(-1); table->file->extra(HA_EXTRA_WRITE_CACHE); table->file->extra(HA_EXTRA_IGNORE_DUP_KEY); @@ -98,46 +171,82 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) result_table_list.table=table; if (!(union_result=new select_union(table))) - { - res= -1; - goto exit; - } + DBUG_RETURN(-1); + union_result->save_time_stamp=!describe; union_result->tmp_table_param=&tmp_table_param; - for (sl= &lex->select_lex; sl; sl= sl->next_select()) + + // prepare selects + joins.empty(); + for (SELECT_LEX *sl= first_select(); sl; sl= sl->next_select()) { - lex->select=sl; - unit->offset_limit_cnt= sl->offset_limit; - unit->select_limit_cnt= sl->select_limit+sl->offset_limit; - if (unit->select_limit_cnt < sl->select_limit) - unit->select_limit_cnt= HA_POS_ERROR; // no limit - if (unit->select_limit_cnt == HA_POS_ERROR) + JOIN *join= new JOIN(thd, sl->item_list, + sl->options | thd->options | SELECT_NO_UNLOCK | + ((describe) ? SELECT_DESCRIBE : 0), + union_result); + joins.push_back(new JOIN_P(join)); + thd->lex.select=sl; + offset_limit_cnt= sl->offset_limit; + select_limit_cnt= sl->select_limit+sl->offset_limit; + if (select_limit_cnt < sl->select_limit) + select_limit_cnt= HA_POS_ERROR; // no limit + if (select_limit_cnt == HA_POS_ERROR) sl->options&= ~OPTION_FOUND_ROWS; - res= mysql_select(thd, - (TABLE_LIST*) sl->table_list.first, - sl->item_list, - sl->where, - (sl->braces) ? - (ORDER *)sl->order_list.first : (ORDER *) 0, - (ORDER*) sl->group_list.first, - sl->having, - (ORDER*) NULL, - sl->options | thd->options | - SELECT_NO_UNLOCK | ((describe) ? SELECT_DESCRIBE : 0), - union_result, unit); - if (res) - goto exit; + res= join->prepare((TABLE_LIST*) sl->table_list.first, + sl->where, + (sl->braces) ? + (ORDER *)sl->order_list.first : (ORDER *) 0, + (ORDER*) sl->group_list.first, + sl->having, + (ORDER*) NULL, + sl, this, 0); + if (res | thd->fatal_error) + DBUG_RETURN(res | thd->fatal_error); } + DBUG_RETURN(res | thd->fatal_error); +} + +int st_select_lex_unit::exec() +{ + DBUG_ENTER("st_select_lex_unit::exec"); + if(depended || !item || !item->assigned()) + { + if (optimized && item && item->assigned()) + item->assigned(0); // We will reinit & rexecute unit + + for (SELECT_LEX *sl= first_select(); sl; sl= sl->next_select()) + { + thd->lex.select=sl; + offset_limit_cnt= sl->offset_limit; + select_limit_cnt= sl->select_limit+sl->offset_limit; + if (select_limit_cnt < sl->select_limit) + select_limit_cnt= HA_POS_ERROR; // no limit + if (select_limit_cnt == HA_POS_ERROR) + sl->options&= ~OPTION_FOUND_ROWS; + + if (!optimized) + sl->join->optimize(); + else + sl->join->reinit(); + + sl->join->exec(); + res= sl->join->error; + + if (res) + DBUG_RETURN(res); + } + optimized= 1; + } + if (union_result->flush()) { res= 1; // Error is already sent - goto exit; + DBUG_RETURN(res); } - delete union_result; /* Send result to 'result' */ - lex->select = &lex->select_lex; + thd->lex.select = first_select(); res =-1; { /* Create a list of fields in the temporary table */ @@ -147,7 +256,9 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) List ftfunc_list; ftfunc_list.empty(); #else - thd->lex.select_lex.ftfunc_list.empty(); + List empty_list; + empty_list.empty(); + thd->lex.select_lex.ftfunc_list= &empty_list; #endif for (field=table->field ; *field ; field++) @@ -157,92 +268,45 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) } if (!thd->fatal_error) // Check if EOM { - st_select_lex_node * global= unit->global_parameters; - unit->offset_limit_cnt= global->offset_limit; - unit->select_limit_cnt= global->select_limit+global->offset_limit; - if (unit->select_limit_cnt < global->select_limit) - unit->select_limit_cnt= HA_POS_ERROR; // no limit - if (unit->select_limit_cnt == HA_POS_ERROR) + offset_limit_cnt= global_parameters->offset_limit; + select_limit_cnt= global_parameters->select_limit+ + global_parameters->offset_limit; + if (select_limit_cnt < global_parameters->select_limit) + select_limit_cnt= HA_POS_ERROR; // no limit + if (select_limit_cnt == HA_POS_ERROR) thd->options&= ~OPTION_FOUND_ROWS; if (describe) - unit->select_limit_cnt= HA_POS_ERROR; // no limit + select_limit_cnt= HA_POS_ERROR; // no limit res= mysql_select(thd,&result_table_list, item_list, NULL, - (describe) ? 0 : (ORDER*)global->order_list.first, + (describe) ? + 0: + (ORDER*)global_parameters->order_list.first, (ORDER*) NULL, NULL, (ORDER*) NULL, - thd->options, result, unit); + thd->options, result, this, 1); if (found_rows_for_union && !res) thd->limit_found_rows = (ulonglong)table->file->records; } } - -exit: - free_tmp_table(thd,table); + thd->lex.select_lex.ftfunc_list= &thd->lex.select_lex.ftfunc_list_alloc; DBUG_RETURN(res); } - -/*************************************************************************** -** store records in temporary table for UNION -***************************************************************************/ - -select_union::select_union(TABLE *table_par) - :table(table_par) +int st_select_lex_unit::cleanup() { - bzero((char*) &info,sizeof(info)); - /* - We can always use DUP_IGNORE because the temporary table will only - contain a unique key if we are using not using UNION ALL - */ - info.handle_duplicates= DUP_IGNORE; -} - -select_union::~select_union() -{ -} - - -int select_union::prepare(List &list, SELECT_LEX_UNIT *u) -{ - unit= u; - if (save_time_stamp && list.elements != table->fields) - { - my_message(ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT, - ER(ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT),MYF(0)); - return -1; - } - return 0; -} - -bool select_union::send_data(List &values) -{ - if (unit->offset_limit_cnt) - { // using limit offset,count - unit->offset_limit_cnt--; - return 0; - } - fill_record(table->field,values); - if ((write_record(table,&info))) - { - if (create_myisam_from_heap(table, tmp_table_param, info.errorno, 0)) - return 1; - } - return 0; -} - -bool select_union::send_eof() -{ - return 0; -} - -bool select_union::flush() -{ - int error; - if ((error=table->file->extra(HA_EXTRA_NO_CACHE))) + DBUG_ENTER("st_select_lex_unit::cleanup"); + delete union_result; + free_tmp_table(thd,table); + table= 0; // Safety + + List_iterator j(joins); + JOIN** join; + while ((join= j++)) { - table->file->print_error(error,MYF(0)); - ::send_error(&thd->net); - return 1; + (*join)->cleanup(thd); + delete *join; + delete join; } - return 0; + joins.empty(); + DBUG_RETURN(0); } diff --git a/sql/sql_update.cc b/sql/sql_update.cc index 51453f955e8..9ea8f725947 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -642,6 +642,8 @@ bool multi_update::send_data(List &values) void multi_update::send_error(uint errcode,const char *err) { + + //TODO error should be sent at the query processing end /* First send error what ever it is ... */ ::send_error(&thd->net,errcode,err); @@ -766,6 +768,7 @@ bool multi_update::send_eof() if (error == -1) error = 0; thd->proc_info="end"; + //TODO error should be sent at the query processing end if (error) send_error(error,"An error occured in multi-table update"); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 160bc253dc9..b762388d9be 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1763,10 +1763,10 @@ simple_expr: | singleval_subselect { $$= $1; } | '{' ident expr '}' { $$= $3; } | MATCH ident_list_arg AGAINST '(' expr ')' - { Select->ftfunc_list.push_back((Item_func_match *) + { Select->ftfunc_list->push_back((Item_func_match *) ($$=new Item_func_match_nl(*$2,$5))); } | MATCH ident_list_arg AGAINST '(' expr IN_SYM BOOLEAN_SYM MODE_SYM ')' - { Select->ftfunc_list.push_back((Item_func_match *) + { Select->ftfunc_list->push_back((Item_func_match *) ($$=new Item_func_match_bool(*$2,$5))); } | BINARY expr %prec NEG { $$= new Item_func_binary($2); } | CAST_SYM '(' expr AS cast_type ')' { $$= create_func_cast($3, $5); } @@ -3999,7 +3999,8 @@ singleval_subselect: singleval_subselect_init: select_init { - $$= new Item_singleval_subselect(current_thd, Lex->select); + $$= new Item_singleval_subselect(current_thd, + Lex->select->master_unit()->first_select()); }; exists_subselect: @@ -4012,7 +4013,8 @@ exists_subselect: exists_subselect_init: select_init { - $$= new Item_exists_subselect(current_thd, Lex->select); + $$= new Item_exists_subselect(current_thd, + Lex->select->master_unit()->first_select()); }; subselect_start: -- cgit v1.2.1 From 479da246b1c188614bb4d5e4b182c2e7aa6312a5 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 4 Sep 2002 09:40:01 +0300 Subject: query cache TODO --- sql/sql_cache.cc | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc index c739b43debb..38b30b683e2 100644 --- a/sql/sql_cache.cc +++ b/sql/sql_cache.cc @@ -278,6 +278,21 @@ TODO list: - Move MRG_MYISAM table type processing to handlers, something like: tables_used->table->file->register_used_filenames(callback, first_argument); + - Make derived tables cachable. + - QC improvement suggested by Monty: + - Add a counter in open_table() for how many MERGE (ISAM or MyISAM) + tables are cached in the table cache. + (This will be trivial when we have the new table cache in place I + have been working on) + - After this we can add the following test around the for loop in + is_cacheable:: + + if (thd->temp_tables || global_merge_table_count) + + - Another option would be to set thd->safe_to_cache_query to 0 + in 'get_lock_data' if any of the tables was a tmp table or a + MRG_ISAM table. + (This could be done with almost no speed penalty) */ #include "mysql_priv.h" -- cgit v1.2.1 From 51a41f1fba3bd5b9addcd63424a494263d541c34 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 5 Sep 2002 19:30:26 +0500 Subject: Fixed sort order for cp866 sql/share/charsets/cp866.conf: Fixed sort order --- sql/share/charsets/cp866.conf | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/sql/share/charsets/cp866.conf b/sql/share/charsets/cp866.conf index e6b5c064fd7..0e4dcb3b9bc 100644 --- a/sql/share/charsets/cp866.conf +++ b/sql/share/charsets/cp866.conf @@ -1,3 +1,8 @@ +# +# cp866_DOSCyrillicRussian +# Case insensitive, accent sensitive. +# +# # ctype array (must be 257 elements) 00 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 @@ -58,20 +63,20 @@ 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F - 40 41 42 43 44 45 56 57 58 59 5A 5B 5C 5E 5F 62 - 67 68 69 6C 71 74 75 76 77 78 7B B0 B1 B2 B3 B4 - B5 41 42 43 44 45 56 57 58 59 5A 5B 5C 5E 5F 62 - 67 68 69 6C 71 74 75 76 77 78 7B B6 B7 B8 B9 BA - 80 81 82 83 84 85 88 89 8A 8C 8D 8E 8F 90 91 92 - 93 94 95 96 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 - 80 81 82 83 84 85 88 89 8A 8C 8D 8E 8F 90 91 92 - BB BD BE C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC - CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD - DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 F3 F4 F5 F6 F7 - 93 94 95 96 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 - 86 86 87 87 8B 8B 97 97 F8 F9 FA FB FC FD FE FF + 40 41 43 45 47 49 4B 4D 4F 51 53 55 57 59 5B 5D + 5F 61 63 65 67 69 6B 6D 6F 71 73 BD BE BF C0 C1 + C2 41 43 45 47 49 4B 4D 4F 51 54 55 57 59 5B 5D + 5F 61 63 65 67 69 6B 6D 6F 71 73 C3 C4 C5 C6 C7 + 75 77 79 7B 7D 7F 85 87 89 8D 8F 91 93 95 97 99 + 9B 9D 9F A1 A5 A7 A9 AB AD AF B1 B3 B5 B7 B9 BB + 75 77 79 7B 7D 7F 85 87 89 8D 8F 91 93 95 97 99 + C8 C9 CA D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + 9B 9D 9F A1 A5 A7 A9 AB AD AF B1 B3 B5 B7 B9 BB + 81 81 83 83 8B 8B A3 A3 CB CC CD CE CF D0 D1 D2 -# Unicode mappping (must be 256 elements) +# Unicode mapping (must be 256 elements) 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F -- cgit v1.2.1 From 31f842663c99ee92d340088031ef295ce5a0d767 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 5 Sep 2002 19:55:53 +0500 Subject: Some new charsets. --- sql/share/charsets/Index | 23 +++++++- sql/share/charsets/cp1251.conf | 19 ------- sql/share/charsets/cp1251bin.conf | 95 ++++++++++++++++++++++++++++++++ sql/share/charsets/cp1251cias.conf | 99 ++++++++++++++++++++++++++++++++++ sql/share/charsets/cp1251csas.conf | 99 ++++++++++++++++++++++++++++++++++ sql/share/charsets/cp1257bin.conf | 96 +++++++++++++++++++++++++++++++++ sql/share/charsets/cp1257ltlvciai.conf | 97 +++++++++++++++++++++++++++++++++ sql/share/charsets/cp1257ltlvcias.conf | 97 +++++++++++++++++++++++++++++++++ sql/share/charsets/cp1257ltlvcsas.conf | 97 +++++++++++++++++++++++++++++++++ sql/share/charsets/latin1bin.conf | 96 +++++++++++++++++++++++++++++++++ sql/share/charsets/latin1cias.conf | 97 +++++++++++++++++++++++++++++++++ sql/share/charsets/latin1csas.conf | 97 +++++++++++++++++++++++++++++++++ sql/share/charsets/maccebin.conf | 96 +++++++++++++++++++++++++++++++++ sql/share/charsets/macceciai.conf | 96 +++++++++++++++++++++++++++++++++ sql/share/charsets/maccecias.conf | 96 +++++++++++++++++++++++++++++++++ sql/share/charsets/maccecsas.conf | 96 +++++++++++++++++++++++++++++++++ sql/share/charsets/macromanbin.conf | 96 +++++++++++++++++++++++++++++++++ sql/share/charsets/macromanciai.conf | 97 +++++++++++++++++++++++++++++++++ sql/share/charsets/macromancias.conf | 97 +++++++++++++++++++++++++++++++++ sql/share/charsets/macromancsas.conf | 97 +++++++++++++++++++++++++++++++++ 20 files changed, 1762 insertions(+), 21 deletions(-) create mode 100644 sql/share/charsets/cp1251bin.conf create mode 100644 sql/share/charsets/cp1251cias.conf create mode 100644 sql/share/charsets/cp1251csas.conf create mode 100644 sql/share/charsets/cp1257bin.conf create mode 100644 sql/share/charsets/cp1257ltlvciai.conf create mode 100644 sql/share/charsets/cp1257ltlvcias.conf create mode 100644 sql/share/charsets/cp1257ltlvcsas.conf create mode 100644 sql/share/charsets/latin1bin.conf create mode 100644 sql/share/charsets/latin1cias.conf create mode 100644 sql/share/charsets/latin1csas.conf create mode 100644 sql/share/charsets/maccebin.conf create mode 100644 sql/share/charsets/macceciai.conf create mode 100644 sql/share/charsets/maccecias.conf create mode 100644 sql/share/charsets/maccecsas.conf create mode 100644 sql/share/charsets/macromanbin.conf create mode 100644 sql/share/charsets/macromanciai.conf create mode 100644 sql/share/charsets/macromancias.conf create mode 100644 sql/share/charsets/macromancsas.conf diff --git a/sql/share/charsets/Index b/sql/share/charsets/Index index c8ae877887e..009eeaeac38 100644 --- a/sql/share/charsets/Index +++ b/sql/share/charsets/Index @@ -17,33 +17,52 @@ swe7 10 usa7 11 ujis 12 sjis 13 +# cp1251 is depreciated. Use cp1251cias, cp1251csas or cp1251bin instead. cp1251 14 danish 15 hebrew 16 -# The win1251 character set is deprecated. Please use cp1251 instead. -win1251 17 tis620 18 euc_kr 19 estonia 20 hungarian 21 koi8_ukr 22 +# win1251ukr is depreciated. Use cp1251cias, cp1251csas or cp1251bin instead. win1251ukr 23 gb2312 24 greek 25 win1250 26 croat 27 gbk 28 +# cp1257 is depreciated. +# Use cp1257ltlvciai, cp1257ltlvcsas, cp1257bin, cp1257ltlvcias instead cp1257 29 latin5 30 latin1_de 31 armscii8 32 utf8 33 win1250ch 34 + ucs2 35 cp866 36 keybcs2 37 + macce 38 macroman 39 + pclatin2 40 latvian 41 latvian1 42 +maccebin 43 +macceciai 44 +maccecias 45 +maccecsas 46 +latin1bin 47 +latin1cias 48 +latin1csas 49 +cp1251bin 50 +cp1251cias 51 +cp1251csas 52 +macromanbin 53 +macromancias 54 +macromanciai 55 +macromancsas 56 diff --git a/sql/share/charsets/cp1251.conf b/sql/share/charsets/cp1251.conf index 653f7d26879..6af97c891b8 100644 --- a/sql/share/charsets/cp1251.conf +++ b/sql/share/charsets/cp1251.conf @@ -72,22 +72,3 @@ 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 5B 5C 5D 5E 5F 60 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B - - -# Unicode mapping (256 elements) -0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F -0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F -0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F -0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F -0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F -0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F -0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F -0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F -0402 0403 201A 0453 201E 2026 2020 2021 0000 2030 0409 2039 040A 040C 040B 040F -0452 2018 2019 201C 201D 2022 2013 2014 0000 2122 0459 203A 045A 045C 045B 045F -00A0 040E 045E 0408 00A4 0490 00A6 00A7 0401 00A9 0404 00AB 00AC 00AD 00AE 0407 -00B0 00B1 0406 0456 0491 00B5 00B6 00B7 0451 2116 0454 00BB 0458 0405 0455 0457 -0410 0411 0412 0413 0414 0415 0416 0417 0418 0419 041A 041B 041C 041D 041E 041F -0420 0421 0422 0423 0424 0425 0426 0427 0428 0429 042A 042B 042C 042D 042E 042F -0430 0431 0432 0433 0434 0435 0436 0437 0438 0439 043A 043B 043C 043D 043E 043F -0440 0441 0442 0443 0444 0445 0446 0447 0448 0449 044A 044B 044C 044D 044E 044F diff --git a/sql/share/charsets/cp1251bin.conf b/sql/share/charsets/cp1251bin.conf new file mode 100644 index 00000000000..4c17fee5934 --- /dev/null +++ b/sql/share/charsets/cp1251bin.conf @@ -0,0 +1,95 @@ +# +# cp1251 +# Binary sort order +# +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 00 + 01 01 00 02 00 00 00 00 00 00 01 00 01 01 01 01 + 02 00 00 00 00 00 00 00 00 00 02 00 02 02 02 02 + 00 01 02 01 00 01 00 00 01 00 01 00 00 00 00 01 + 00 00 01 02 02 00 00 00 02 00 02 00 02 01 02 02 + 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 54 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 54 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 90 83 82 83 84 85 86 87 88 89 9A 8B 9C 9D 9E 9F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A2 A2 BC A4 B4 A6 A7 B8 A9 BA AB AC AD AE BF + B0 B1 B3 B3 B4 B5 B6 B7 B8 B9 BA BB BC BE BE BF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 74 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 74 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 82 81 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 80 91 92 93 94 95 96 97 98 99 8A 9B 8C 9D 8E 8F + A0 A1 A1 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF + B0 B1 B2 B2 A5 B5 B6 B7 A8 B9 AA BB A3 BD BD AF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# Unicode mapping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 0402 0403 201A 0453 201E 2026 2020 2021 0000 2030 0409 2039 040A 040C 040B 040F + 0452 2018 2019 201C 201D 2022 2013 2014 0000 2122 0459 203A 045A 045C 045B 045F + 00A0 040E 045E 0408 00A4 0490 00A6 00A7 0401 00A9 0404 00AB 00AC 00AD 00AE 0407 + 00B0 00B1 0406 0456 0491 00B5 00B6 00B7 0451 2116 0454 00BB 0458 0405 0455 0457 + 0410 0411 0412 0413 0414 0415 0416 0417 0418 0419 041A 041B 041C 041D 041E 041F + 0420 0421 0422 0423 0424 0425 0426 0427 0428 0429 042A 042B 042C 042D 042E 042F + 0430 0431 0432 0433 0434 0435 0436 0437 0438 0439 043A 043B 043C 043D 043E 043F + 0440 0441 0442 0443 0444 0445 0446 0447 0448 0449 044A 044B 044C 044D 044E 044F + diff --git a/sql/share/charsets/cp1251cias.conf b/sql/share/charsets/cp1251cias.conf new file mode 100644 index 00000000000..612be640b11 --- /dev/null +++ b/sql/share/charsets/cp1251cias.conf @@ -0,0 +1,99 @@ +# +# cp1251 +# Case insensitive, accent sensitive +# Sort order is correct for Belarusian, Bulgarian, Macedonian, +# Russian, Serbian, Mongolian languages. Almost good for Ukrainian, +# except that "CYRILLIC LETTER SOFT SIGN" is not in the end of alphabet, +# but between YERU and E. +# +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 00 + 01 01 00 02 00 00 00 00 00 00 01 00 01 01 01 01 + 02 00 00 00 00 00 00 00 00 00 02 00 02 02 02 02 + 00 01 02 01 00 01 00 00 01 00 01 00 00 00 00 01 + 00 00 01 02 02 00 00 00 02 00 02 00 02 01 02 02 + 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 54 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 54 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 90 83 82 83 84 85 86 87 88 89 9A 8B 9C 9D 9E 9F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A2 A2 BC A4 B4 A6 A7 B8 A9 BA AB AC AD AE BF + B0 B1 B3 B3 B4 B5 B6 B7 B8 B9 BA BB BC BE BE BF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 74 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 74 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 82 81 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 80 91 92 93 94 95 96 97 98 99 8A 9B 8C 9D 8E 8F + A0 A1 A1 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF + B0 B1 B2 B2 A5 B5 B6 B7 A8 B9 AA BB A3 BD BD AF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 43 45 47 49 4B 4D 4F 51 53 55 57 59 5B 5D + 5F 61 63 65 67 69 6B 6D 6F 71 73 D3 D4 D5 D6 D7 + D8 41 43 45 47 49 4B 4D 4F 51 53 55 57 59 5B 5D + 5F 61 63 65 67 69 6B 6D 6F 71 73 D9 DA DB DC DD + 81 83 DE 83 DF E0 E1 E2 E3 E4 A1 E5 A7 9D B3 C1 + 81 E6 E7 E8 E9 EA EB EC ED EE A1 EF A7 9D B3 C1 + F0 B7 B7 99 F1 7D F2 F3 87 F4 89 F5 F6 F7 F8 95 + F9 FA 93 93 7D FB FC FD 87 FE 89 FF 99 8F 8F 95 + 75 77 79 7B 7F 85 8B 8D 91 97 9B 9F A3 A5 A9 AB + AD AF B1 B5 B9 BB BD BF C3 C5 C7 C9 CB CD CF D1 + 75 77 79 7B 7F 85 8B 8D 91 97 9B 9F A3 A5 A9 AB + AD AF B1 B5 B9 BB BD BF C3 C5 C7 C9 CB CD CF D1 + +# Unicode mapping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 0402 0403 201A 0453 201E 2026 2020 2021 0000 2030 0409 2039 040A 040C 040B 040F + 0452 2018 2019 201C 201D 2022 2013 2014 0000 2122 0459 203A 045A 045C 045B 045F + 00A0 040E 045E 0408 00A4 0490 00A6 00A7 0401 00A9 0404 00AB 00AC 00AD 00AE 0407 + 00B0 00B1 0406 0456 0491 00B5 00B6 00B7 0451 2116 0454 00BB 0458 0405 0455 0457 + 0410 0411 0412 0413 0414 0415 0416 0417 0418 0419 041A 041B 041C 041D 041E 041F + 0420 0421 0422 0423 0424 0425 0426 0427 0428 0429 042A 042B 042C 042D 042E 042F + 0430 0431 0432 0433 0434 0435 0436 0437 0438 0439 043A 043B 043C 043D 043E 043F + 0440 0441 0442 0443 0444 0445 0446 0447 0448 0449 044A 044B 044C 044D 044E 044F + diff --git a/sql/share/charsets/cp1251csas.conf b/sql/share/charsets/cp1251csas.conf new file mode 100644 index 00000000000..b6b2f853ea9 --- /dev/null +++ b/sql/share/charsets/cp1251csas.conf @@ -0,0 +1,99 @@ +# +# cp1251 +# Case sensitive, accent sensitive +# Sort order is correct for Belarusian, Bulgarian, Macedonian, +# Russian, Serbian, Mongolian languages. Almost good for Ukrainian, +# except that "CYRILLIC LETTER SOFT SIGN" is not in the end of alphabet, +# but between YERU and E. +# +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 00 + 01 01 00 02 00 00 00 00 00 00 01 00 01 01 01 01 + 02 00 00 00 00 00 00 00 00 00 02 00 02 02 02 02 + 00 01 02 01 00 01 00 00 01 00 01 00 00 00 00 01 + 00 00 01 02 02 00 00 00 02 00 02 00 02 01 02 02 + 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 54 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 54 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 90 83 82 83 84 85 86 87 88 89 9A 8B 9C 9D 9E 9F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A2 A2 BC A4 B4 A6 A7 B8 A9 BA AB AC AD AE BF + B0 B1 B3 B3 B4 B5 B6 B7 B8 B9 BA BB BC BE BE BF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 74 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 74 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 82 81 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 80 91 92 93 94 95 96 97 98 99 8A 9B 8C 9D 8E 8F + A0 A1 A1 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF + B0 B1 B2 B2 A5 B5 B6 B7 A8 B9 AA BB A3 BD BD AF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 43 45 47 49 4B 4D 4F 51 53 55 57 59 5B 5D + 5F 61 63 65 67 69 6B 6D 6F 71 73 D3 D4 D5 D6 D7 + D8 42 44 46 48 4A 4C 4E 50 52 54 56 58 5A 5C 5E + 60 62 64 66 68 6A 6C 6E 70 72 74 D9 DA DB DC DD + 81 83 DE 84 DF E0 E1 E2 E3 E4 A1 E5 A7 9D B3 C1 + 82 E6 E7 E8 E9 EA EB EC ED EE A2 EF A8 9E B4 C2 + F0 B7 B8 99 F1 7D F2 F3 87 F4 89 F5 F6 F7 F8 95 + F9 FA 93 94 7E FB FC FD 88 FE 8A FF 9A 8F 90 96 + 75 77 79 7B 7F 85 8B 8D 91 97 9B 9F A3 A5 A9 AB + AD AF B1 B5 B9 BB BD BF C3 C5 C7 C9 CB CD CF D1 + 76 78 7A 7C 80 86 8C 8E 92 98 9C A0 A4 A6 AA AC + AE B0 B2 B6 BA BC BE C0 C4 C6 C8 CA CC CE D0 D2 + +# Unicode mapping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 0402 0403 201A 0453 201E 2026 2020 2021 0000 2030 0409 2039 040A 040C 040B 040F + 0452 2018 2019 201C 201D 2022 2013 2014 0000 2122 0459 203A 045A 045C 045B 045F + 00A0 040E 045E 0408 00A4 0490 00A6 00A7 0401 00A9 0404 00AB 00AC 00AD 00AE 0407 + 00B0 00B1 0406 0456 0491 00B5 00B6 00B7 0451 2116 0454 00BB 0458 0405 0455 0457 + 0410 0411 0412 0413 0414 0415 0416 0417 0418 0419 041A 041B 041C 041D 041E 041F + 0420 0421 0422 0423 0424 0425 0426 0427 0428 0429 042A 042B 042C 042D 042E 042F + 0430 0431 0432 0433 0434 0435 0436 0437 0438 0439 043A 043B 043C 043D 043E 043F + 0440 0441 0442 0443 0444 0445 0446 0447 0448 0449 044A 044B 044C 044D 044E 044F + diff --git a/sql/share/charsets/cp1257bin.conf b/sql/share/charsets/cp1257bin.conf new file mode 100644 index 00000000000..032f8a7e05d --- /dev/null +++ b/sql/share/charsets/cp1257bin.conf @@ -0,0 +1,96 @@ +# +# cp1257 character set +# +# Binary sorting order +# +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 00 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 01 00 01 00 00 00 00 01 + 00 00 00 00 00 00 00 00 02 00 02 00 00 00 00 02 + 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 00 01 01 01 01 01 01 01 02 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 00 02 02 02 02 02 02 02 00 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 B8 A9 BA AB AC AD AE BF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 D7 F8 F9 FA FB FC FD FE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 BA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 A8 B9 BA BB BC BD BE AF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 F7 D8 D9 DA DB DC DD DE FF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# Unicode mapping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 20AC 0000 201A 0000 201E 2026 2020 2021 0000 2030 0000 2039 0000 00A8 02C7 00B8 + 0000 2018 2019 201C 201D 2022 2013 2014 0000 2122 0000 203A 0000 00AF 02DB 0000 + 00A0 0000 00A2 00A3 00A4 0000 00A6 00A7 00D8 00A9 0156 00AB 00AC 00AD 00AE 00C6 + 00B0 00B1 00B2 00B3 00B4 00B5 00B6 00B7 00F8 00B9 0157 00BB 00BC 00BD 00BE 00E6 + 0104 012E 0100 0106 00C4 00C5 0118 0112 010C 00C9 0179 0116 0122 0136 012A 013B + 0160 0143 0145 00D3 014C 00D5 00D6 00D7 0172 0141 015A 016A 00DC 017B 017D 00DF + 0105 012F 0101 0107 00E4 00E5 0119 0113 010D 00E9 017A 0117 0123 0137 012B 013C + 0161 0144 0146 00F3 014D 00F5 00F6 00F7 0173 0142 015B 016B 00FC 017C 017E 02D9 + diff --git a/sql/share/charsets/cp1257ltlvciai.conf b/sql/share/charsets/cp1257ltlvciai.conf new file mode 100644 index 00000000000..246ae4d1fe8 --- /dev/null +++ b/sql/share/charsets/cp1257ltlvciai.conf @@ -0,0 +1,97 @@ +# +# cp1257 character set +# +# Case-insensitive, accent insensitive sorting order +# For Latvian and Lithuanian languages +# +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 00 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 01 00 01 00 00 00 00 01 + 00 00 00 00 00 00 00 00 02 00 02 00 00 00 00 02 + 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 00 01 01 01 01 01 01 01 02 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 00 02 02 02 02 02 02 02 00 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 B8 A9 BA AB AC AD AE BF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 D7 F8 F9 FA FB FC FD FE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 BA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 A8 B9 BA BB BC BD BE AF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 F7 D8 D9 DA DB DC DD DE FF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 4D 4F 55 57 61 63 67 69 6F 71 75 7B 7D 83 + 8F 91 93 97 9E A0 A8 AA AC AE B0 B8 B9 BA BB BC + BD 41 4D 4F 55 57 61 63 67 69 6F 71 75 7B 7D 83 + 8F 91 93 97 9E A0 A8 AA AC AE B0 BE BF C0 C1 C4 + C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 + D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 + E5 E6 E7 E8 E9 EA EB EC 83 ED 93 EE EF F0 F1 41 + F2 F3 F4 F5 F6 F7 F8 F9 83 FA 93 FB FC FD FE 41 + 41 69 41 4F 41 41 57 57 4F 57 B0 57 63 71 69 75 + 97 7D 7D 83 83 83 83 C2 A0 75 97 A0 A0 B0 B0 97 + 41 69 41 4F 41 41 57 57 4F 57 B0 57 63 71 69 75 + 97 7D 7D 83 83 83 83 C3 A0 75 97 A0 A0 B0 B0 FF + +# Unicode mapping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 20AC 0000 201A 0000 201E 2026 2020 2021 0000 2030 0000 2039 0000 00A8 02C7 00B8 + 0000 2018 2019 201C 201D 2022 2013 2014 0000 2122 0000 203A 0000 00AF 02DB 0000 + 00A0 0000 00A2 00A3 00A4 0000 00A6 00A7 00D8 00A9 0156 00AB 00AC 00AD 00AE 00C6 + 00B0 00B1 00B2 00B3 00B4 00B5 00B6 00B7 00F8 00B9 0157 00BB 00BC 00BD 00BE 00E6 + 0104 012E 0100 0106 00C4 00C5 0118 0112 010C 00C9 0179 0116 0122 0136 012A 013B + 0160 0143 0145 00D3 014C 00D5 00D6 00D7 0172 0141 015A 016A 00DC 017B 017D 00DF + 0105 012F 0101 0107 00E4 00E5 0119 0113 010D 00E9 017A 0117 0123 0137 012B 013C + 0161 0144 0146 00F3 014D 00F5 00F6 00F7 0173 0142 015B 016B 00FC 017C 017E 02D9 + diff --git a/sql/share/charsets/cp1257ltlvcias.conf b/sql/share/charsets/cp1257ltlvcias.conf new file mode 100644 index 00000000000..6e49f5a245d --- /dev/null +++ b/sql/share/charsets/cp1257ltlvcias.conf @@ -0,0 +1,97 @@ +# +# cp1257 character set +# +# Case-insensitive, accent sensitive sorting order +# For Latvian and Lithuanian languages +# +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 00 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 01 00 01 00 00 00 00 01 + 00 00 00 00 00 00 00 00 02 00 02 00 00 00 00 02 + 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 00 01 01 01 01 01 01 01 02 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 00 02 02 02 02 02 02 02 00 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 B8 A9 BA AB AC AD AE BF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 D7 F8 F9 FA FB FC FD FE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 BA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 A8 B9 BA BB BC BD BE AF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 F7 D8 D9 DA DB DC DD DE FF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 4D 4F 55 57 61 63 67 69 6F 71 75 7B 7D 83 + 8F 91 93 97 9E A0 A8 AA AC AE B0 B8 B9 BA BB BC + BD 41 4D 4F 55 57 61 63 67 69 6F 71 75 7B 7D 83 + 8F 91 93 97 9E A0 A8 AA AC AE B0 BE BF C0 C1 C4 + C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 + D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 + E5 E6 E7 E8 E9 EA EB EC 85 ED 95 EE EF F0 F1 4B + F2 F3 F4 F5 F6 F7 F8 F9 85 FA 95 FB FC FD FE 4B + 43 6B 45 51 47 49 59 5B 53 5D B2 5F 65 73 6D 77 + 99 7F 81 87 89 8B 8D C2 A2 79 9B A4 A6 B4 B6 9D + 43 6B 45 51 47 49 59 5B 53 5D B2 5F 65 73 6D 77 + 99 7F 81 87 89 8B 8D C3 A2 79 9B A4 A6 B4 B6 FF + +# Unicode mapping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 20AC 0000 201A 0000 201E 2026 2020 2021 0000 2030 0000 2039 0000 00A8 02C7 00B8 + 0000 2018 2019 201C 201D 2022 2013 2014 0000 2122 0000 203A 0000 00AF 02DB 0000 + 00A0 0000 00A2 00A3 00A4 0000 00A6 00A7 00D8 00A9 0156 00AB 00AC 00AD 00AE 00C6 + 00B0 00B1 00B2 00B3 00B4 00B5 00B6 00B7 00F8 00B9 0157 00BB 00BC 00BD 00BE 00E6 + 0104 012E 0100 0106 00C4 00C5 0118 0112 010C 00C9 0179 0116 0122 0136 012A 013B + 0160 0143 0145 00D3 014C 00D5 00D6 00D7 0172 0141 015A 016A 00DC 017B 017D 00DF + 0105 012F 0101 0107 00E4 00E5 0119 0113 010D 00E9 017A 0117 0123 0137 012B 013C + 0161 0144 0146 00F3 014D 00F5 00F6 00F7 0173 0142 015B 016B 00FC 017C 017E 02D9 + diff --git a/sql/share/charsets/cp1257ltlvcsas.conf b/sql/share/charsets/cp1257ltlvcsas.conf new file mode 100644 index 00000000000..32cd1390bd5 --- /dev/null +++ b/sql/share/charsets/cp1257ltlvcsas.conf @@ -0,0 +1,97 @@ +# +# cp1257 character set +# +# Case-sensitive, accent sensitive sorting order +# For Latvian and Lithuanian languages +# +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 00 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 01 00 01 00 00 00 00 01 + 00 00 00 00 00 00 00 00 02 00 02 00 00 00 00 02 + 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 00 01 01 01 01 01 01 01 02 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 00 02 02 02 02 02 02 02 00 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 B8 A9 BA AB AC AD AE BF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 D7 F8 F9 FA FB FC FD FE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 BA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 A8 B9 BA BB BC BD BE AF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 F7 D8 D9 DA DB DC DD DE FF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 4D 4F 55 57 61 63 67 69 6F 71 75 7B 7D 83 + 8F 91 93 97 9E A0 A8 AA AC AE B0 B8 B9 BA BB BC + BD 42 4E 50 56 58 62 64 68 6A 70 72 76 7C 7E 84 + 90 92 94 98 9F A1 A9 AB AD AF B1 BE BF C0 C1 C4 + C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 + D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 + E5 E6 E7 E8 E9 EA EB EC 85 ED 95 EE EF F0 F1 4B + F2 F3 F4 F5 F6 F7 F8 F9 86 FA 96 FB FC FD FE 4C + 43 6B 45 51 47 49 59 5B 53 5D B2 5F 65 73 6D 77 + 99 7F 81 87 89 8B 8D C2 A2 79 9B A4 A6 B4 B6 9D + 44 6C 46 52 48 4A 5A 5C 54 5E B3 60 66 74 6E 78 + 9A 80 82 88 8A 8C 8E C3 A3 7A 9C A5 A7 B5 B7 FF + +# Unicode mapping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 20AC 0000 201A 0000 201E 2026 2020 2021 0000 2030 0000 2039 0000 00A8 02C7 00B8 + 0000 2018 2019 201C 201D 2022 2013 2014 0000 2122 0000 203A 0000 00AF 02DB 0000 + 00A0 0000 00A2 00A3 00A4 0000 00A6 00A7 00D8 00A9 0156 00AB 00AC 00AD 00AE 00C6 + 00B0 00B1 00B2 00B3 00B4 00B5 00B6 00B7 00F8 00B9 0157 00BB 00BC 00BD 00BE 00E6 + 0104 012E 0100 0106 00C4 00C5 0118 0112 010C 00C9 0179 0116 0122 0136 012A 013B + 0160 0143 0145 00D3 014C 00D5 00D6 00D7 0172 0141 015A 016A 00DC 017B 017D 00DF + 0105 012F 0101 0107 00E4 00E5 0119 0113 010D 00E9 017A 0117 0123 0137 012B 013C + 0161 0144 0146 00F3 014D 00F5 00F6 00F7 0173 0142 015B 016B 00FC 017C 017E 02D9 + diff --git a/sql/share/charsets/latin1bin.conf b/sql/share/charsets/latin1bin.conf new file mode 100644 index 00000000000..37e6350bcb2 --- /dev/null +++ b/sql/share/charsets/latin1bin.conf @@ -0,0 +1,96 @@ +# +# Latin1, accent sensitive, case sensitive +# +# Binary sorting order +# +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 00 01 01 01 01 01 01 01 02 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 00 02 02 02 02 02 02 02 02 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 D7 F8 F9 FA FB FC FD FE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 F7 D8 D9 DA DB DC DD DE FF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# Unicode mapping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008A 008B 008C 008D 008E 008F + 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009A 009B 009C 009D 009E 009F + 00A0 00A1 00A2 00A3 00A4 00A5 00A6 00A7 00A8 00A9 00AA 00AB 00AC 00AD 00AE 00AF + 00B0 00B1 00B2 00B3 00B4 00B5 00B6 00B7 00B8 00B9 00BA 00BB 00BC 00BD 00BE 00BF + 00C0 00C1 00C2 00C3 00C4 00C5 00C6 00C7 00C8 00C9 00CA 00CB 00CC 00CD 00CE 00CF + 00D0 00D1 00D2 00D3 00D4 00D5 00D6 00D7 00D8 00D9 00DA 00DB 00DC 00DD 00DE 00DF + 00E0 00E1 00E2 00E3 00E4 00E5 00E6 00E7 00E8 00E9 00EA 00EB 00EC 00ED 00EE 00EF + 00F0 00F1 00F2 00F3 00F4 00F5 00F6 00F7 00F8 00F9 00FA 00FB 00FC 00FD 00FE 00FF + diff --git a/sql/share/charsets/latin1cias.conf b/sql/share/charsets/latin1cias.conf new file mode 100644 index 00000000000..3b0e104aafd --- /dev/null +++ b/sql/share/charsets/latin1cias.conf @@ -0,0 +1,97 @@ +# +# Latin1, accent sensitive, case insensitive +# +# Sorting for Dutch, English, French, German (Duden), +# Italian, Latin, Pogtuguese, Spanish +# +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 00 01 01 01 01 01 01 01 02 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 00 02 02 02 02 02 02 02 02 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 D7 F8 F9 FA FB FC FD FE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 F7 D8 D9 DA DB DC DD DE FF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 51 53 57 5B 65 67 69 6B 75 77 79 7B 7D 81 + 8F 91 93 95 98 9A A4 A6 A8 AA AF B3 B4 B5 B6 B7 + B8 41 51 53 57 5B 65 67 69 6B 75 77 79 7B 7D 81 + 8F 91 93 95 98 9A A4 A6 A8 AA AF B9 BA BB BC BF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + 43 45 47 49 4B 4D 4F 55 5D 5F 61 63 6D 6F 71 73 + 59 7F 83 85 87 89 8B BD 8D 9C 9E A0 A2 AC B1 97 + 43 45 47 49 4B 4D 4F 55 5D 5F 61 63 6D 6F 71 73 + 59 7F 83 85 87 89 8B BE 8D 9C 9E A0 A2 AC B1 AE + +# Unicode mapping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008A 008B 008C 008D 008E 008F + 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009A 009B 009C 009D 009E 009F + 00A0 00A1 00A2 00A3 00A4 00A5 00A6 00A7 00A8 00A9 00AA 00AB 00AC 00AD 00AE 00AF + 00B0 00B1 00B2 00B3 00B4 00B5 00B6 00B7 00B8 00B9 00BA 00BB 00BC 00BD 00BE 00BF + 00C0 00C1 00C2 00C3 00C4 00C5 00C6 00C7 00C8 00C9 00CA 00CB 00CC 00CD 00CE 00CF + 00D0 00D1 00D2 00D3 00D4 00D5 00D6 00D7 00D8 00D9 00DA 00DB 00DC 00DD 00DE 00DF + 00E0 00E1 00E2 00E3 00E4 00E5 00E6 00E7 00E8 00E9 00EA 00EB 00EC 00ED 00EE 00EF + 00F0 00F1 00F2 00F3 00F4 00F5 00F6 00F7 00F8 00F9 00FA 00FB 00FC 00FD 00FE 00FF + diff --git a/sql/share/charsets/latin1csas.conf b/sql/share/charsets/latin1csas.conf new file mode 100644 index 00000000000..cb3a1285de8 --- /dev/null +++ b/sql/share/charsets/latin1csas.conf @@ -0,0 +1,97 @@ +# +# Latin1, accent sensitive, case sensitive +# +# Sorting for Dutch, English, French, German (Duden), +# Italian, Latin, Pogtuguese, Spanish +# +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 00 01 01 01 01 01 01 01 02 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 00 02 02 02 02 02 02 02 02 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 D7 F8 F9 FA FB FC FD FE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 F7 D8 D9 DA DB DC DD DE FF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 51 53 57 5B 65 67 69 6B 75 77 79 7B 7D 81 + 8F 91 93 95 98 9A A4 A6 A8 AA AF B3 B4 B5 B6 B7 + B8 42 52 54 58 5C 66 68 6A 6C 76 78 7A 7C 7E 82 + 90 92 94 96 99 9B A5 A7 A9 AB B0 B9 BA BB BC BF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + 43 45 47 49 4B 4D 4F 55 5D 5F 61 63 6D 6F 71 73 + 59 7F 83 85 87 89 8B BD 8D 9C 9E A0 A2 AC B1 97 + 44 46 48 4A 4C 4E 50 56 5E 60 62 64 6E 70 72 74 + 5A 80 84 86 88 8A 8C BE 8E 9D 9F A1 A3 AD B2 AE + +# Unicode mapping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008A 008B 008C 008D 008E 008F + 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009A 009B 009C 009D 009E 009F + 00A0 00A1 00A2 00A3 00A4 00A5 00A6 00A7 00A8 00A9 00AA 00AB 00AC 00AD 00AE 00AF + 00B0 00B1 00B2 00B3 00B4 00B5 00B6 00B7 00B8 00B9 00BA 00BB 00BC 00BD 00BE 00BF + 00C0 00C1 00C2 00C3 00C4 00C5 00C6 00C7 00C8 00C9 00CA 00CB 00CC 00CD 00CE 00CF + 00D0 00D1 00D2 00D3 00D4 00D5 00D6 00D7 00D8 00D9 00DA 00DB 00DC 00DD 00DE 00DF + 00E0 00E1 00E2 00E3 00E4 00E5 00E6 00E7 00E8 00E9 00EA 00EB 00EC 00ED 00EE 00EF + 00F0 00F1 00F2 00F3 00F4 00F5 00F6 00F7 00F8 00F9 00FA 00FB 00FC 00FD 00FE 00FF + diff --git a/sql/share/charsets/maccebin.conf b/sql/share/charsets/maccebin.conf new file mode 100644 index 00000000000..f859e64354c --- /dev/null +++ b/sql/share/charsets/maccebin.conf @@ -0,0 +1,96 @@ +# Mac OS Central European, binary sort order +# +# Czech (cs), Hungarian (hu), Polish (pl), Romanian (ro), Croatian (hr), +# Slovak (sk), Slovenian (sl), Sorbian. +# +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 00 + 01 01 02 01 01 01 01 02 02 01 02 02 01 02 02 01 + 02 01 02 02 01 02 01 02 02 02 02 02 02 01 02 02 + 00 00 01 00 00 00 00 02 00 00 00 02 00 00 02 01 + 02 01 00 00 02 01 00 00 02 01 02 01 02 01 02 01 + 02 01 00 00 02 01 00 00 00 00 00 02 01 01 02 01 + 00 00 00 00 00 00 00 00 02 01 02 01 00 00 02 01 + 02 01 00 00 02 01 02 01 01 02 01 01 02 01 01 01 + 02 01 01 02 01 02 01 02 01 02 02 01 01 02 01 00 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 54 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 54 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 8A 82 82 8E 88 9A 9F 87 88 8B 8A 8B 8D 8D 8E 90 + 90 93 92 93 95 95 98 97 98 99 9A 9B 9C 9E 9E 9F + A0 A1 AB A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE B0 + B0 B4 B2 B3 B4 FA B6 B7 B8 BA BA BC BC BE BE C0 + C0 C4 C2 C3 C4 CB C6 C7 C8 C9 CA CB CE 9B CE D8 + D0 D1 D2 D3 D4 D5 D6 D7 D8 DA DA DE DC DD DE E0 + E0 E4 E2 E3 E4 E6 E6 87 E9 E9 92 EC EC F0 97 99 + F0 F3 9C F3 F5 F5 F7 F7 F9 F9 FA FD B8 FD AE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 74 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 74 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 81 83 84 85 86 E7 84 89 80 89 8C 8C 83 8F + 8F 91 EA 91 94 94 96 EE 96 EF 85 CD F2 9D 9D 86 + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA A2 AC AD FE AF + AF B1 B2 B3 B1 B5 B6 B7 FC B9 B9 BB BB BD BD BF + BF C1 C2 C3 C1 C5 C6 C7 C8 C9 CA C5 CC CD CC CF + D0 D1 D2 D3 D4 D5 D6 D7 CF D9 D9 DB DC DD DB DF + DF E1 E2 E3 E1 E5 E5 E7 E8 E8 EA EB EB ED EE EF + ED F1 F2 F1 F4 F4 F6 F6 F8 F8 B5 FB FC FB FE FF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# Unicode mapping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 00C4 0100 0101 00C9 0104 00D6 00DC 00E1 0105 010C 00E4 010D 0106 0107 00E9 0179 + 017A 010E 00ED 010F 0112 0113 0116 00F3 0117 00F4 00F6 00F5 00FA 011A 011B 00FC + 2020 00B0 0118 00A3 00A7 2022 00B6 00DF 00AE 00A9 2122 0119 00A8 2260 0123 012E + 012F 012A 2264 2265 012B 0136 2202 2211 0142 013B 013C 013D 013E 0139 013A 0145 + 0146 0143 00AC 221A 0144 0147 2206 00AB 00BB 2026 00A0 0148 0150 00D5 0151 014C + 2013 2014 201C 201D 2018 2019 00F7 25CA 014D 0154 0155 0158 2039 203A 0159 0156 + 0157 0160 201A 201E 0161 015A 015B 00C1 0164 0165 00CD 017D 017E 016A 00D3 00D4 + 016B 016E 00DA 016F 0170 0171 0172 0173 00DD 00FD 0137 017B 0141 017C 0122 02C7 + diff --git a/sql/share/charsets/macceciai.conf b/sql/share/charsets/macceciai.conf new file mode 100644 index 00000000000..d7cdaddc425 --- /dev/null +++ b/sql/share/charsets/macceciai.conf @@ -0,0 +1,96 @@ +# Mac OS Central European, case insensitive, accent sensitive +# +# Czech (cs), Hungarian (hu), Polish (pl), Romanian (ro), Croatian (hr), +# Slovak (sk), Slovenian (sl), Sorbian. +# +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 00 + 01 01 02 01 01 01 01 02 02 01 02 02 01 02 02 01 + 02 01 02 02 01 02 01 02 02 02 02 02 02 01 02 02 + 00 00 01 00 00 00 00 02 00 00 00 02 00 00 02 01 + 02 01 00 00 02 01 00 00 02 01 02 01 02 01 02 01 + 02 01 00 00 02 01 00 00 00 00 00 02 01 01 02 01 + 00 00 00 00 00 00 00 00 02 01 02 01 00 00 02 01 + 02 01 00 00 02 01 02 01 01 02 01 01 02 01 01 01 + 02 01 01 02 01 02 01 02 01 02 02 01 01 02 01 00 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 54 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 54 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 8A 82 82 8E 88 9A 9F 87 88 8B 8A 8B 8D 8D 8E 90 + 90 93 92 93 95 95 98 97 98 99 9A 9B 9C 9E 9E 9F + A0 A1 AB A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE B0 + B0 B4 B2 B3 B4 FA B6 B7 B8 BA BA BC BC BE BE C0 + C0 C4 C2 C3 C4 CB C6 C7 C8 C9 CA CB CE 9B CE D8 + D0 D1 D2 D3 D4 D5 D6 D7 D8 DA DA DE DC DD DE E0 + E0 E4 E2 E3 E4 E6 E6 87 E9 E9 92 EC EC F0 97 99 + F0 F3 9C F3 F5 F5 F7 F7 F9 F9 FA FD B8 FD AE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 74 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 74 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 81 83 84 85 86 E7 84 89 80 89 8C 8C 83 8F + 8F 91 EA 91 94 94 96 EE 96 EF 85 CD F2 9D 9D 86 + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA A2 AC AD FE AF + AF B1 B2 B3 B1 B5 B6 B7 FC B9 B9 BB BB BD BD BF + BF C1 C2 C3 C1 C5 C6 C7 C8 C9 CA C5 CC CD CC CF + D0 D1 D2 D3 D4 D5 D6 D7 CF D9 D9 DB DC DD DB DF + DF E1 E2 E3 E1 E5 E5 E7 E8 E8 EA EB EB ED EE EF + ED F1 F2 F1 F4 F4 F6 F6 F8 F8 B5 FB FC FB FE FF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 4B 4D 53 57 63 65 69 6B 73 75 79 83 85 8D + 9B 9D 9F A7 AE B2 C0 C2 C4 C6 CA D2 D3 D4 D5 D6 + D7 41 4B 4D 53 57 63 65 69 6B 73 75 79 83 85 8D + 9B 9D 9F A7 AE B2 C0 C2 C4 C6 CA D8 D9 DA DB DC + 41 41 41 57 41 8D B2 41 41 4D 41 4D 4D 4D 57 CA + CA 53 6B 53 57 57 57 8D 57 8D 8D 8D B2 57 57 B2 + DD DE 57 DF E0 E1 E2 A7 E3 E4 E5 57 E6 E7 65 6B + 6B 6B E8 E9 6B 75 EA EB 79 79 79 79 79 79 79 85 + 85 85 EC ED 85 85 EE EF F0 F1 F2 85 8D 8D 8D 8D + F3 F4 F5 F6 F7 F8 F9 FA 8D 9F 9F 9F FB FC 9F 9F + 9F A7 FD FE A7 A7 A7 41 BE BE 6B CA CA B2 8D 8D + B2 B2 B2 B2 B2 B2 B2 B2 C6 C6 75 CA 79 CA 65 FF + +# Unicode mapping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 00C4 0100 0101 00C9 0104 00D6 00DC 00E1 0105 010C 00E4 010D 0106 0107 00E9 0179 + 017A 010E 00ED 010F 0112 0113 0116 00F3 0117 00F4 00F6 00F5 00FA 011A 011B 00FC + 2020 00B0 0118 00A3 00A7 2022 00B6 00DF 00AE 00A9 2122 0119 00A8 2260 0123 012E + 012F 012A 2264 2265 012B 0136 2202 2211 0142 013B 013C 013D 013E 0139 013A 0145 + 0146 0143 00AC 221A 0144 0147 2206 00AB 00BB 2026 00A0 0148 0150 00D5 0151 014C + 2013 2014 201C 201D 2018 2019 00F7 25CA 014D 0154 0155 0158 2039 203A 0159 0156 + 0157 0160 201A 201E 0161 015A 015B 00C1 0164 0165 00CD 017D 017E 016A 00D3 00D4 + 016B 016E 00DA 016F 0170 0171 0172 0173 00DD 00FD 0137 017B 0141 017C 0122 02C7 + diff --git a/sql/share/charsets/maccecias.conf b/sql/share/charsets/maccecias.conf new file mode 100644 index 00000000000..8cefd4cf9ec --- /dev/null +++ b/sql/share/charsets/maccecias.conf @@ -0,0 +1,96 @@ +# Mac OS Central European, case insensitive, accent sensitive +# +# Czech (cs), Hungarian (hu), Polish (pl), Romanian (ro), Croatian (hr), +# Slovak (sk), Slovenian (sl), Sorbian. +# +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 00 + 01 01 02 01 01 01 01 02 02 01 02 02 01 02 02 01 + 02 01 02 02 01 02 01 02 02 02 02 02 02 01 02 02 + 00 00 01 00 00 00 00 02 00 00 00 02 00 00 02 01 + 02 01 00 00 02 01 00 00 02 01 02 01 02 01 02 01 + 02 01 00 00 02 01 00 00 00 00 00 02 01 01 02 01 + 00 00 00 00 00 00 00 00 02 01 02 01 00 00 02 01 + 02 01 00 00 02 01 02 01 01 02 01 01 02 01 01 01 + 02 01 01 02 01 02 01 02 01 02 02 01 01 02 01 00 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 54 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 54 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 8A 82 82 8E 88 9A 9F 87 88 8B 8A 8B 8D 8D 8E 90 + 90 93 92 93 95 95 98 97 98 99 9A 9B 9C 9E 9E 9F + A0 A1 AB A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE B0 + B0 B4 B2 B3 B4 FA B6 B7 B8 BA BA BC BC BE BE C0 + C0 C4 C2 C3 C4 CB C6 C7 C8 C9 CA CB CE 9B CE D8 + D0 D1 D2 D3 D4 D5 D6 D7 D8 DA DA DE DC DD DE E0 + E0 E4 E2 E3 E4 E6 E6 87 E9 E9 92 EC EC F0 97 99 + F0 F3 9C F3 F5 F5 F7 F7 F9 F9 FA FD B8 FD AE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 74 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 74 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 81 83 84 85 86 E7 84 89 80 89 8C 8C 83 8F + 8F 91 EA 91 94 94 96 EE 96 EF 85 CD F2 9D 9D 86 + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA A2 AC AD FE AF + AF B1 B2 B3 B1 B5 B6 B7 FC B9 B9 BB BB BD BD BF + BF C1 C2 C3 C1 C5 C6 C7 C8 C9 CA C5 CC CD CC CF + D0 D1 D2 D3 D4 D5 D6 D7 CF D9 D9 DB DC DD DB DF + DF E1 E2 E3 E1 E5 E5 E7 E8 E8 EA EB EB ED EE EF + ED F1 F2 F1 F4 F4 F6 F6 F8 F8 B5 FB FC FB FE FF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 4B 4D 53 57 63 65 69 6B 73 75 79 83 85 8D + 9B 9D 9F A7 AE B2 C0 C2 C4 C6 CA D2 D3 D4 D5 D6 + D7 41 4B 4D 53 57 63 65 69 6B 73 75 79 83 85 8D + 9B 9D 9F A7 AE B2 C0 C2 C4 C6 CA D8 D9 DA DB DC + 45 47 47 59 49 91 B6 43 49 4F 45 4F 51 51 59 CE + CE 55 71 55 5B 5B 5D 8F 5D 99 91 97 B8 5F 5F B6 + DD DE 61 DF E0 E1 E2 AD E3 E4 E5 61 E6 E7 67 6F + 6F 6D E8 E9 6D 77 EA EB 7B 81 82 7F 7F 7D 7D 8B + 8B 87 EC ED 87 89 EE EF F0 F1 F2 89 93 97 93 95 + F3 F4 F5 F6 F7 F8 F9 FA 95 A1 A1 A3 FB FC A3 A5 + A5 A9 FD FE A9 AB AB 43 B0 B0 71 CC CC BC 8F 99 + BC B4 B8 B4 BA BA BE BE C8 C8 77 D0 7B D0 67 FF + +# Unicode mapping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 00C4 0100 0101 00C9 0104 00D6 00DC 00E1 0105 010C 00E4 010D 0106 0107 00E9 0179 + 017A 010E 00ED 010F 0112 0113 0116 00F3 0117 00F4 00F6 00F5 00FA 011A 011B 00FC + 2020 00B0 0118 00A3 00A7 2022 00B6 00DF 00AE 00A9 2122 0119 00A8 2260 0123 012E + 012F 012A 2264 2265 012B 0136 2202 2211 0142 013B 013C 013D 013E 0139 013A 0145 + 0146 0143 00AC 221A 0144 0147 2206 00AB 00BB 2026 00A0 0148 0150 00D5 0151 014C + 2013 2014 201C 201D 2018 2019 00F7 25CA 014D 0154 0155 0158 2039 203A 0159 0156 + 0157 0160 201A 201E 0161 015A 015B 00C1 0164 0165 00CD 017D 017E 016A 00D3 00D4 + 016B 016E 00DA 016F 0170 0171 0172 0173 00DD 00FD 0137 017B 0141 017C 0122 02C7 + diff --git a/sql/share/charsets/maccecsas.conf b/sql/share/charsets/maccecsas.conf new file mode 100644 index 00000000000..8cc1de422f2 --- /dev/null +++ b/sql/share/charsets/maccecsas.conf @@ -0,0 +1,96 @@ +# Mac OS Central European, case sensitive, accent sensitive +# +# Czech (cs), Hungarian (hu), Polish (pl), Romanian (ro), Croatian (hr), +# Slovak (sk), Slovenian (sl), Sorbian. +# +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 00 + 01 01 02 01 01 01 01 02 02 01 02 02 01 02 02 01 + 02 01 02 02 01 02 01 02 02 02 02 02 02 01 02 02 + 00 00 01 00 00 00 00 02 00 00 00 02 00 00 02 01 + 02 01 00 00 02 01 00 00 02 01 02 01 02 01 02 01 + 02 01 00 00 02 01 00 00 00 00 00 02 01 01 02 01 + 00 00 00 00 00 00 00 00 02 01 02 01 00 00 02 01 + 02 01 00 00 02 01 02 01 01 02 01 01 02 01 01 01 + 02 01 01 02 01 02 01 02 01 02 02 01 01 02 01 00 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 54 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 54 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 8A 82 82 8E 88 9A 9F 87 88 8B 8A 8B 8D 8D 8E 90 + 90 93 92 93 95 95 98 97 98 99 9A 9B 9C 9E 9E 9F + A0 A1 AB A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE B0 + B0 B4 B2 B3 B4 FA B6 B7 B8 BA BA BC BC BE BE C0 + C0 C4 C2 C3 C4 CB C6 C7 C8 C9 CA CB CE 9B CE D8 + D0 D1 D2 D3 D4 D5 D6 D7 D8 DA DA DE DC DD DE E0 + E0 E4 E2 E3 E4 E6 E6 87 E9 E9 92 EC EC F0 97 99 + F0 F3 9C F3 F5 F5 F7 F7 F9 F9 FA FD B8 FD AE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 74 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 74 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 81 83 84 85 86 E7 84 89 80 89 8C 8C 83 8F + 8F 91 EA 91 94 94 96 EE 96 EF 85 CD F2 9D 9D 86 + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA A2 AC AD FE AF + AF B1 B2 B3 B1 B5 B6 B7 FC B9 B9 BB BB BD BD BF + BF C1 C2 C3 C1 C5 C6 C7 C8 C9 CA C5 CC CD CC CF + D0 D1 D2 D3 D4 D5 D6 D7 CF D9 D9 DB DC DD DB DF + DF E1 E2 E3 E1 E5 E5 E7 E8 E8 EA EB EB ED EE EF + ED F1 F2 F1 F4 F4 F6 F6 F8 F8 B5 FB FC FB FE FF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 4B 4D 53 57 63 65 69 6B 73 75 79 83 85 8D + 9B 9D 9F A7 AE B2 C0 C2 C4 C6 CA D2 D3 D4 D5 D6 + D7 42 4C 4E 54 58 64 66 6A 6C 74 76 7A 84 86 8E + 9C 9E A0 A8 AF B3 C1 C3 C5 C7 CB D8 D9 DA DB DC + 45 47 48 59 49 91 B6 44 4A 4F 46 50 51 52 5A CE + CF 55 72 56 5B 5C 5D 90 5E 9A 92 98 B8 5F 60 B7 + DD DE 61 DF E0 E1 E2 AD E3 E4 E5 62 E6 E7 68 6F + 70 6D E8 E9 6E 77 EA EB 7C 81 82 7F 80 7D 7E 8B + 8C 87 EC ED 88 89 EE EF F0 F1 F2 8A 93 97 94 95 + F3 F4 F5 F6 F7 F8 F9 FA 96 A1 A2 A3 FB FC A4 A5 + A6 A9 FD FE AA AB AC 43 B0 B1 71 CC CD BC 8F 99 + BD B4 B9 B5 BA BB BE BF C8 C9 78 D0 7B D1 67 FF + +# Unicode mapping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 00C4 0100 0101 00C9 0104 00D6 00DC 00E1 0105 010C 00E4 010D 0106 0107 00E9 0179 + 017A 010E 00ED 010F 0112 0113 0116 00F3 0117 00F4 00F6 00F5 00FA 011A 011B 00FC + 2020 00B0 0118 00A3 00A7 2022 00B6 00DF 00AE 00A9 2122 0119 00A8 2260 0123 012E + 012F 012A 2264 2265 012B 0136 2202 2211 0142 013B 013C 013D 013E 0139 013A 0145 + 0146 0143 00AC 221A 0144 0147 2206 00AB 00BB 2026 00A0 0148 0150 00D5 0151 014C + 2013 2014 201C 201D 2018 2019 00F7 25CA 014D 0154 0155 0158 2039 203A 0159 0156 + 0157 0160 201A 201E 0161 015A 015B 00C1 0164 0165 00CD 017D 017E 016A 00D3 00D4 + 016B 016E 00DA 016F 0170 0171 0172 0173 00DD 00FD 0137 017B 0141 017C 0122 02C7 + diff --git a/sql/share/charsets/macromanbin.conf b/sql/share/charsets/macromanbin.conf new file mode 100644 index 00000000000..d0845c07f2b --- /dev/null +++ b/sql/share/charsets/macromanbin.conf @@ -0,0 +1,96 @@ +# +# Mac OS Roman, accent insensitive, case insensitive +# +# Binary sort order +# +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 10 + 20 01 01 01 01 01 01 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + 00 00 00 00 00 00 00 02 00 00 00 00 00 00 01 01 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 02 + 00 00 00 00 02 00 00 00 00 00 00 20 01 01 01 02 + 00 00 00 00 00 00 00 00 02 01 00 00 00 00 00 00 + 00 00 00 00 00 20 01 01 01 01 01 01 01 01 01 01 + 00 01 01 01 01 02 00 00 00 00 00 00 00 00 00 00 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 8A 8C 8D 8E 96 9A 9F 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD BE BF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA 88 8B 9B CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D8 DA DB DC DD DE DF + E0 E1 E2 E3 E4 89 90 87 91 8F 92 94 95 93 97 99 + F0 98 9C 9E 9D F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 E7 CB E5 80 CC 81 82 83 E9 + E6 E8 EA ED EB EC 84 EE F1 EF 85 CD F2 F4 F3 86 + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD AE AF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D9 D9 DA DB DC DD DE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# Unicode mapping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 00C4 00C5 00C7 00C9 00D1 00D6 00DC 00E1 00E0 00E2 00E4 00E3 00E5 00E7 00E9 00E8 + 00EA 00EB 00ED 00EC 00EE 00EF 00F1 00F3 00F2 00F4 00F6 00F5 00FA 00F9 00FB 00FC + 2020 00B0 00A2 00A3 00A7 2022 00B6 00DF 00AE 00A9 2122 00B4 00A8 2260 00C6 00D8 + 221E 00B1 2264 2265 00A5 00B5 2202 2211 220F 03C0 222B 00AA 00BA 03A9 00E6 00F8 + 00BF 00A1 00AC 221A 0192 2248 2206 00AB 00BB 2026 00A0 00C0 00C3 00D5 0152 0153 + 2013 2014 201C 201D 2018 2019 00F7 25CA 00FF 0178 2044 20AC 2039 203A FB01 FB02 + 2021 00B7 201A 201E 2030 00C2 00CA 00C1 00CB 00C8 00CD 00CE 00CF 00CC 00D3 00D4 + F8FF 00D2 00DA 00DB 00D9 0131 02C6 02DC 00AF 02D8 02D9 02DA 00B8 02DD 02DB 02C7 + diff --git a/sql/share/charsets/macromanciai.conf b/sql/share/charsets/macromanciai.conf new file mode 100644 index 00000000000..457e6b4f8d9 --- /dev/null +++ b/sql/share/charsets/macromanciai.conf @@ -0,0 +1,97 @@ +# +# Mac OS Roman, accent insensitive, case insensitive +# +# Sort order: Dutch, English, French, German (Duden), +# Italian, Latin, Pogtuguese, Spanish +# +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 10 + 20 01 01 01 01 01 01 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + 00 00 00 00 00 00 00 02 00 00 00 00 00 00 01 01 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 02 + 00 00 00 00 02 00 00 00 00 00 00 20 01 01 01 02 + 00 00 00 00 00 00 00 00 02 01 00 00 00 00 00 00 + 00 00 00 00 00 20 01 01 01 01 01 01 01 01 01 01 + 00 01 01 01 01 02 00 00 00 00 00 00 00 00 00 00 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 8A 8C 8D 8E 96 9A 9F 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD BE BF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA 88 8B 9B CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D8 DA DB DC DD DE DF + E0 E1 E2 E3 E4 89 90 87 91 8F 92 94 95 93 97 99 + F0 98 9C 9E 9D F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 E7 CB E5 80 CC 81 82 83 E9 + E6 E8 EA ED EB EC 84 EE F1 EF 85 CD F2 F4 F3 86 + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD AE AF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D9 D9 DA DB DC DD DE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 51 53 57 59 63 66 68 6A 75 77 79 7B 7D 81 + 91 93 95 97 9A 9C A6 A8 AA AC B0 B2 B3 B4 B5 B6 + B7 41 51 53 57 59 63 66 68 6A 75 77 79 7B 7D 81 + 91 93 95 97 9A 9C A6 A8 AA AC B0 B8 B9 BA BB BC + 41 41 53 59 7D 81 9C 41 41 41 41 41 41 53 59 59 + 59 59 6A 6A 6A 6A 7D 81 81 81 81 81 9C 9C 9C 9C + BD BE BF C0 C1 C2 C3 97 C4 C5 C6 C7 C8 C9 41 81 + CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 41 81 + D8 D9 DA DB 63 DC DD DE DF E0 E1 41 41 81 81 81 + E2 E3 E4 E5 E6 E7 E8 E9 AC AC EA EB EC ED EE EF + F0 F1 F2 F3 F4 41 59 41 59 59 6A 6A 6A 6A 81 81 + F0 81 9C 9C 9C 6A F6 F7 F8 F9 FA FB FC FD FE FF + +# Unicode mapping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 00C4 00C5 00C7 00C9 00D1 00D6 00DC 00E1 00E0 00E2 00E4 00E3 00E5 00E7 00E9 00E8 + 00EA 00EB 00ED 00EC 00EE 00EF 00F1 00F3 00F2 00F4 00F6 00F5 00FA 00F9 00FB 00FC + 2020 00B0 00A2 00A3 00A7 2022 00B6 00DF 00AE 00A9 2122 00B4 00A8 2260 00C6 00D8 + 221E 00B1 2264 2265 00A5 00B5 2202 2211 220F 03C0 222B 00AA 00BA 03A9 00E6 00F8 + 00BF 00A1 00AC 221A 0192 2248 2206 00AB 00BB 2026 00A0 00C0 00C3 00D5 0152 0153 + 2013 2014 201C 201D 2018 2019 00F7 25CA 00FF 0178 2044 20AC 2039 203A FB01 FB02 + 2021 00B7 201A 201E 2030 00C2 00CA 00C1 00CB 00C8 00CD 00CE 00CF 00CC 00D3 00D4 + F8FF 00D2 00DA 00DB 00D9 0131 02C6 02DC 00AF 02D8 02D9 02DA 00B8 02DD 02DB 02C7 + diff --git a/sql/share/charsets/macromancias.conf b/sql/share/charsets/macromancias.conf new file mode 100644 index 00000000000..a00d7d412e6 --- /dev/null +++ b/sql/share/charsets/macromancias.conf @@ -0,0 +1,97 @@ +# +# Mac OS Roman, accent sensitive, case insensitive +# +# Sort order: Dutch, English, French, German (Duden), +# Italian, Latin, Pogtuguese, Spanish +# +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 10 + 20 01 01 01 01 01 01 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + 00 00 00 00 00 00 00 02 00 00 00 00 00 00 01 01 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 02 + 00 00 00 00 02 00 00 00 00 00 00 20 01 01 01 02 + 00 00 00 00 00 00 00 00 02 01 00 00 00 00 00 00 + 00 00 00 00 00 20 01 01 01 01 01 01 01 01 01 01 + 00 01 01 01 01 02 00 00 00 00 00 00 00 00 00 00 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 8A 8C 8D 8E 96 9A 9F 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD BE BF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA 88 8B 9B CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D8 DA DB DC DD DE DF + E0 E1 E2 E3 E4 89 90 87 91 8F 92 94 95 93 97 99 + F0 98 9C 9E 9D F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 E7 CB E5 80 CC 81 82 83 E9 + E6 E8 EA ED EB EC 84 EE F1 EF 85 CD F2 F4 F3 86 + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD AE AF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D9 D9 DA DB DC DD DE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 51 53 57 59 63 66 68 6A 75 77 79 7B 7D 81 + 91 93 95 97 9A 9C A6 A8 AA AC B0 B2 B3 B4 B5 B6 + B7 41 51 53 57 59 63 66 68 6A 75 77 79 7B 7D 81 + 91 93 95 97 9A 9C A6 A8 AA AC B0 B8 B9 BA BB BC + 4B 4D 55 5D 7F 8B A4 45 43 47 4B 49 4D 55 5D 5B + 5F 61 6E 6C 70 72 7F 85 83 87 8B 89 A0 9E A2 A4 + BD BE BF C0 C1 C2 C3 99 C4 C5 C6 C7 C8 C9 4F 8D + CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 4F 8D + D8 D9 DA DB 65 DC DD DE DF E0 E1 43 49 89 8F 8F + E2 E3 E4 E5 E6 E7 E8 E9 AE AE EA EB EC ED EE EF + F0 F1 F2 F3 F4 47 5F 45 61 5B 6E 70 70 6C 85 87 + F0 83 A0 A2 9E 72 F6 F7 F8 F9 FA FB FC FD FE FF + +# Unicode mapping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 00C4 00C5 00C7 00C9 00D1 00D6 00DC 00E1 00E0 00E2 00E4 00E3 00E5 00E7 00E9 00E8 + 00EA 00EB 00ED 00EC 00EE 00EF 00F1 00F3 00F2 00F4 00F6 00F5 00FA 00F9 00FB 00FC + 2020 00B0 00A2 00A3 00A7 2022 00B6 00DF 00AE 00A9 2122 00B4 00A8 2260 00C6 00D8 + 221E 00B1 2264 2265 00A5 00B5 2202 2211 220F 03C0 222B 00AA 00BA 03A9 00E6 00F8 + 00BF 00A1 00AC 221A 0192 2248 2206 00AB 00BB 2026 00A0 00C0 00C3 00D5 0152 0153 + 2013 2014 201C 201D 2018 2019 00F7 25CA 00FF 0178 2044 20AC 2039 203A FB01 FB02 + 2021 00B7 201A 201E 2030 00C2 00CA 00C1 00CB 00C8 00CD 00CE 00CF 00CC 00D3 00D4 + F8FF 00D2 00DA 00DB 00D9 0131 02C6 02DC 00AF 02D8 02D9 02DA 00B8 02DD 02DB 02C7 + diff --git a/sql/share/charsets/macromancsas.conf b/sql/share/charsets/macromancsas.conf new file mode 100644 index 00000000000..1f67148680d --- /dev/null +++ b/sql/share/charsets/macromancsas.conf @@ -0,0 +1,97 @@ +# +# Mac OS Roman, accent sensitive, case sensitive +# +# Sort order: Dutch, English, French, German (Duden), +# Italian, Latin, Pogtuguese, Spanish +# +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 10 + 20 01 01 01 01 01 01 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + 00 00 00 00 00 00 00 02 00 00 00 00 00 00 01 01 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 02 + 00 00 00 00 02 00 00 00 00 00 00 20 01 01 01 02 + 00 00 00 00 00 00 00 00 02 01 00 00 00 00 00 00 + 00 00 00 00 00 20 01 01 01 01 01 01 01 01 01 01 + 00 01 01 01 01 02 00 00 00 00 00 00 00 00 00 00 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 8A 8C 8D 8E 96 9A 9F 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD BE BF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA 88 8B 9B CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D8 DA DB DC DD DE DF + E0 E1 E2 E3 E4 89 90 87 91 8F 92 94 95 93 97 99 + F0 98 9C 9E 9D F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 E7 CB E5 80 CC 81 82 83 E9 + E6 E8 EA ED EB EC 84 EE F1 EF 85 CD F2 F4 F3 86 + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD AE AF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D9 D9 DA DB DC DD DE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 51 53 57 59 63 66 68 6A 75 77 79 7B 7D 81 + 91 93 95 97 9A 9C A6 A8 AA AC B0 B2 B3 B4 B5 B6 + B7 42 52 54 58 5A 64 67 69 6B 76 78 7A 7C 7E 82 + 92 94 96 98 9B 9D A7 A9 AB AD B1 B8 B9 BA BB BC + 4B 4D 55 5D 7F 8B A4 46 44 48 4C 4A 4E 56 5E 5C + 60 62 6F 6D 71 73 80 86 84 88 8C 8A A1 9F A3 A5 + BD BE BF C0 C1 C2 C3 99 C4 C5 C6 C7 C8 C9 4F 8D + CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 50 8E + D8 D9 DA DB 65 DC DD DE DF E0 E1 43 49 89 8F 90 + E2 E3 E4 E5 E6 E7 E8 E9 AF AE EA EB EC ED EE EF + F0 F1 F2 F3 F4 47 5F 45 61 5B 6E 70 72 6C 85 87 + F0 83 A0 A2 9E 74 F6 F7 F8 F9 FA FB FC FD FE FF + +# Unicode mapping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 00C4 00C5 00C7 00C9 00D1 00D6 00DC 00E1 00E0 00E2 00E4 00E3 00E5 00E7 00E9 00E8 + 00EA 00EB 00ED 00EC 00EE 00EF 00F1 00F3 00F2 00F4 00F6 00F5 00FA 00F9 00FB 00FC + 2020 00B0 00A2 00A3 00A7 2022 00B6 00DF 00AE 00A9 2122 00B4 00A8 2260 00C6 00D8 + 221E 00B1 2264 2265 00A5 00B5 2202 2211 220F 03C0 222B 00AA 00BA 03A9 00E6 00F8 + 00BF 00A1 00AC 221A 0192 2248 2206 00AB 00BB 2026 00A0 00C0 00C3 00D5 0152 0153 + 2013 2014 201C 201D 2018 2019 00F7 25CA 00FF 0178 2044 20AC 2039 203A FB01 FB02 + 2021 00B7 201A 201E 2030 00C2 00CA 00C1 00CB 00C8 00CD 00CE 00CF 00CC 00D3 00D4 + F8FF 00D2 00DA 00DB 00D9 0131 02C6 02DC 00AF 02D8 02D9 02DA 00B8 02DD 02DB 02C7 + -- cgit v1.2.1 From aa4a6df4a0fe9a128f5dd03df9e14ce8649e61c9 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 5 Sep 2002 21:55:26 +0500 Subject: "SHOW CHARACTER SET" now displays 1 for 8bit charsets in "mb_maxlen" column. 0 was dispayed before, this looked confusing. --- sql/sql_show.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/sql_show.cc b/sql/sql_show.cc index e227a5bf5ca..7ac0affbec5 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1391,7 +1391,7 @@ int mysqld_show_charsets(THD *thd, const char *wild) net_store_data(&packet2,convert,cs->name); net_store_data(&packet2,(uint32) cs->number); net_store_data(&packet2,(uint32) cs->strxfrm_multiply); - net_store_data(&packet2,(uint32) cs->mbmaxlen); + net_store_data(&packet2,(uint32) cs->mbmaxlen ? cs->mbmaxlen : 1); if (my_net_write(&thd->net, (char*) packet2.ptr(),packet2.length())) goto err; -- cgit v1.2.1 From 6d6d0d98575f5fde567c7a150820478f3619faf4 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 6 Sep 2002 18:15:40 +0500 Subject: Some warning fixes --- myisam/rt_test.c | 8 +++----- myisam/sp_key.c | 3 ++- myisam/sp_test.c | 8 +++++--- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/myisam/rt_test.c b/myisam/rt_test.c index 4cc60d63031..0adfdb7bbef 100644 --- a/myisam/rt_test.c +++ b/myisam/rt_test.c @@ -32,7 +32,7 @@ static void print_record(char * record,my_off_t offs,const char * tail); static int run_test(const char *filename); -int main(int argc,char *argv[]) +int main(int argc __attribute__((unused)),char *argv[] __attribute__((unused))) { MY_INIT(argv[0]); exit(run_test("rt_test")); @@ -199,7 +199,6 @@ int run_test(const char *filename) } } -/* if (!silent) printf("- Updating rows with position\n"); @@ -227,8 +226,6 @@ int run_test(const char *filename) } } -*/ - if((error=read_with_pos(file,silent))) goto err; @@ -343,7 +340,8 @@ static int read_with_pos (MI_INFO * file,int silent) } -static void bprint_record(char * record, my_off_t offs,const char * tail) +static void bprint_record(char * record, my_off_t offs __attribute__((unused)), + const char * tail) { int i; char * pos; diff --git a/myisam/sp_key.c b/myisam/sp_key.c index 2ab11f993c3..a2798c3cf20 100644 --- a/myisam/sp_key.c +++ b/myisam/sp_key.c @@ -94,7 +94,8 @@ static int sp_mbr_from_wkb(uchar *wkb, uint size, uint n_dims, double *mbr) Add one point stored in wkb to mbr */ static int sp_add_point_to_mbr(uchar *(*wkb), uchar *end, uint n_dims, - uchar byte_order, double *mbr) + uchar byte_order __attribute__((unused)), + double *mbr) { double ord; double *mbr_end = mbr + n_dims * 2; diff --git a/myisam/sp_test.c b/myisam/sp_test.c index 9d32b3e623d..4c267c08c14 100644 --- a/myisam/sp_test.c +++ b/myisam/sp_test.c @@ -41,7 +41,7 @@ static void rtree_PrintWKB(uchar *wkb, uint n_dims); static char blob_key[MAX_REC_LENGTH]; -int main(int argc,char *argv[]) +int main(int argc __attribute__((unused)),char *argv[] __attribute__((unused))) { MY_INIT(argv[0]); exit(run_test("sp_test")); @@ -320,14 +320,16 @@ static int read_with_pos (MI_INFO * file,int silent) } -static void bprint_record(char * record, my_off_t offs,const char * tail) +static void bprint_record(char * record, my_off_t offs __attribute__((unused)), + const char * tail) { int i; char * pos; i=(unsigned char)record[0]; printf("%02X ",i); - for( pos=record+1, i=0; i<32; i++,pos++){ + for( pos=record+1, i=0; i<32; i++,pos++) + { int b=(unsigned char)*pos; printf("%02X",b); } -- cgit v1.2.1 From d9c701eb3df84ba06eb4a57758d5df39a07cbc59 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 12 Sep 2002 19:36:22 +0500 Subject: Now table and database inhirited a character set from a level above at CREATE time Some optimization to reduce rules number in sql_yacc.yy mysql-test/r/create.result: Now table and database inhirited a character set from a level above at CREATE time mysql-test/r/fulltext.result: Now table and database inhirited a character set from a level above at CREATE time mysql-test/r/innodb.result: Now table and database inhirited a character set from a level above at CREATE time mysql-test/r/merge.result: Now table and database inhirited a character set from a level above at CREATE time mysql-test/r/show_check.result: Now table and database inhirited a character set from a level above at CREATE time mysql-test/r/symlink.result: Now table and database inhirited a character set from a level above at CREATE time mysql-test/r/type_enum.result: Now table and database inhirited a character set from a level above at CREATE time mysql-test/r/type_set.result: Now table and database inhirited a character set from a level above at CREATE time sql/sql_yacc.yy: Now table and database inhirited a character set from a level above at CREATE time Some optimization to reduce rules number --- mysql-test/r/create.result | 2 +- mysql-test/r/fulltext.result | 2 +- mysql-test/r/innodb.result | 2 +- mysql-test/r/merge.result | 18 +++++------ mysql-test/r/show_check.result | 16 +++++----- mysql-test/r/symlink.result | 4 +-- mysql-test/r/type_enum.result | 4 +-- mysql-test/r/type_set.result | 4 +-- sql/sql_yacc.yy | 69 +++++++++++++++++++++--------------------- 9 files changed, 60 insertions(+), 61 deletions(-) diff --git a/mysql-test/r/create.result b/mysql-test/r/create.result index f9a3ef487f0..da602551249 100644 --- a/mysql-test/r/create.result +++ b/mysql-test/r/create.result @@ -150,5 +150,5 @@ t1 CREATE TABLE `t1` ( KEY `b_29` (`b`), KEY `b_30` (`b`), KEY `b_31` (`b`) -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 drop table t1; diff --git a/mysql-test/r/fulltext.result b/mysql-test/r/fulltext.result index e6598ca9ca4..132367ee4f6 100644 --- a/mysql-test/r/fulltext.result +++ b/mysql-test/r/fulltext.result @@ -139,7 +139,7 @@ t2 CREATE TABLE `t2` ( `inhalt` text character set latin1, KEY `tig` (`ticket`), FULLTEXT KEY `tix` (`inhalt`) -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 select * from t2 where MATCH inhalt AGAINST (NULL); ticket inhalt select * from t2 where MATCH inhalt AGAINST ('foobar'); diff --git a/mysql-test/r/innodb.result b/mysql-test/r/innodb.result index b75248b5d5a..e98687eec36 100644 --- a/mysql-test/r/innodb.result +++ b/mysql-test/r/innodb.result @@ -807,7 +807,7 @@ Table Create Table t1 CREATE TABLE `t1` ( `a` char(20) character set latin1 default NULL, KEY `a` (`a`) -) TYPE=InnoDB +) TYPE=InnoDB CHARSET=latin1 drop table t1; create temporary table t1 (a int not null auto_increment, primary key(a)) type=innodb; insert into t1 values (NULL),(NULL),(NULL); diff --git a/mysql-test/r/merge.result b/mysql-test/r/merge.result index 6de77f7bdaa..9349a5cdf82 100644 --- a/mysql-test/r/merge.result +++ b/mysql-test/r/merge.result @@ -174,7 +174,7 @@ t3 CREATE TABLE `t3` ( `a` int(11) NOT NULL default '0', `b` char(20) character set latin1 default NULL, KEY `a` (`a`) -) TYPE=MRG_MyISAM UNION=(t1,t2) +) TYPE=MRG_MyISAM CHARSET=latin1 UNION=(t1,t2) create table t4 (a int not null, b char(10), key(a)) type=MERGE UNION=(t1,t2); select * from t4; Can't open file: 't4.MRG'. (errno: 143) @@ -249,14 +249,14 @@ t3 CREATE TABLE `t3` ( `incr` int(11) NOT NULL default '0', `othr` int(11) NOT NULL default '0', PRIMARY KEY (`incr`) -) TYPE=MRG_MyISAM UNION=(t1,t2) +) TYPE=MRG_MyISAM CHARSET=latin1 UNION=(t1,t2) alter table t3 drop primary key; show create table t3; Table Create Table t3 CREATE TABLE `t3` ( `incr` int(11) NOT NULL default '0', `othr` int(11) NOT NULL default '0' -) TYPE=MRG_MyISAM UNION=(t1,t2) +) TYPE=MRG_MyISAM CHARSET=latin1 UNION=(t1,t2) drop table t3,t2,t1; create table t1 (a int not null) type=merge; select * from t1; @@ -287,28 +287,28 @@ t3 CREATE TABLE `t3` ( `a` int(11) NOT NULL default '0', `b` int(11) NOT NULL default '0', KEY `a` (`a`,`b`) -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 show create table t4; Table Create Table t4 CREATE TABLE `t4` ( `a` int(11) NOT NULL default '0', `b` int(11) NOT NULL default '0', KEY `a` (`a`,`b`) -) TYPE=MRG_MyISAM UNION=(t1,t2) +) TYPE=MRG_MyISAM CHARSET=latin1 UNION=(t1,t2) show create table t5; Table Create Table t5 CREATE TABLE `t5` ( `a` int(11) NOT NULL default '0', `b` int(11) NOT NULL default '0', KEY `a` (`a`,`b`) -) TYPE=MRG_MyISAM INSERT_METHOD=FIRST UNION=(t1,t2) +) TYPE=MRG_MyISAM CHARSET=latin1 INSERT_METHOD=FIRST UNION=(t1,t2) show create table t6; Table Create Table t6 CREATE TABLE `t6` ( `a` int(11) NOT NULL default '0', `b` int(11) NOT NULL default '0', KEY `a` (`a`,`b`) -) TYPE=MRG_MyISAM INSERT_METHOD=LAST UNION=(t1,t2) +) TYPE=MRG_MyISAM CHARSET=latin1 INSERT_METHOD=LAST UNION=(t1,t2) insert into t1 values (1,1),(1,2),(1,3),(1,4); insert into t2 values (2,1),(2,2),(2,3),(2,4); select * from t3 order by b,a limit 3; @@ -373,7 +373,7 @@ t4 CREATE TABLE `t4` ( `a` int(11) NOT NULL default '0', `b` int(11) NOT NULL default '0', KEY `a` (`a`,`b`) -) TYPE=MRG_MyISAM UNION=(t1,t2,t3) +) TYPE=MRG_MyISAM CHARSET=latin1 UNION=(t1,t2,t3) select * from t4 order by a,b; a b 1 1 @@ -399,7 +399,7 @@ t4 CREATE TABLE `t4` ( `a` int(11) NOT NULL default '0', `b` int(11) NOT NULL default '0', KEY `a` (`a`,`b`) -) TYPE=MRG_MyISAM INSERT_METHOD=FIRST UNION=(t1,t2,t3) +) TYPE=MRG_MyISAM CHARSET=latin1 INSERT_METHOD=FIRST UNION=(t1,t2,t3) insert into t4 values (4,1),(4,2); select * from t1 order by a,b; a b diff --git a/mysql-test/r/show_check.result b/mysql-test/r/show_check.result index 1f83bc61cdc..40103847a93 100644 --- a/mysql-test/r/show_check.result +++ b/mysql-test/r/show_check.result @@ -77,13 +77,13 @@ show create table t1; Table Create Table t1 CREATE TEMPORARY TABLE `t1` ( `a` int(11) NOT NULL default '0' -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 alter table t1 rename t2; show create table t2; Table Create Table t2 CREATE TEMPORARY TABLE `t2` ( `a` int(11) NOT NULL default '0' -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 drop table t2; create table t1 ( test_set set( 'val1', 'val2', 'val3' ) not null default '', @@ -96,7 +96,7 @@ t1 CREATE TABLE `t1` ( `test_set` set('val1','val2','val3') NOT NULL default '', `name` char(20) character set latin1 default 'O''Brien' COMMENT 'O''Brien as default', `c` int(11) NOT NULL default '0' COMMENT 'int column' -) TYPE=MyISAM COMMENT='it''s a table' +) TYPE=MyISAM CHARSET=latin1 COMMENT='it''s a table' show full columns from t1; Field Type Null Key Default Extra Privileges Comment test_set set('val1','val2','val3') select,insert,update,references @@ -109,7 +109,7 @@ Table Create Table t1 CREATE TABLE `t1` ( `a` int(11) NOT NULL default '0', UNIQUE KEY `aa` (`a`) -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 drop table t1; create table t1 (a int not null, primary key (a)); show create table t1; @@ -117,7 +117,7 @@ Table Create Table t1 CREATE TABLE `t1` ( `a` int(11) NOT NULL default '0', PRIMARY KEY (`a`) -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 drop table t1; flush tables; show open tables; @@ -135,7 +135,7 @@ t1 CREATE TABLE `t1` ( `a` int(11) NOT NULL default '0', `b` char(10) character set latin1 default NULL, KEY `b` (`b`) -) TYPE=MyISAM MIN_ROWS=10 MAX_ROWS=100 AVG_ROW_LENGTH=10 PACK_KEYS=1 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=FIXED COMMENT='test' +) TYPE=MyISAM CHARSET=latin1 MIN_ROWS=10 MAX_ROWS=100 AVG_ROW_LENGTH=10 PACK_KEYS=1 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=FIXED COMMENT='test' alter table t1 MAX_ROWS=200 ROW_FORMAT=dynamic PACK_KEYS=0; show create table t1; Table Create Table @@ -143,7 +143,7 @@ t1 CREATE TABLE `t1` ( `a` int(11) NOT NULL default '0', `b` varchar(10) character set latin1 default NULL, KEY `b` (`b`) -) TYPE=MyISAM MIN_ROWS=10 MAX_ROWS=200 AVG_ROW_LENGTH=10 PACK_KEYS=0 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='test' +) TYPE=MyISAM CHARSET=latin1 MIN_ROWS=10 MAX_ROWS=200 AVG_ROW_LENGTH=10 PACK_KEYS=0 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='test' ALTER TABLE t1 AVG_ROW_LENGTH=0 CHECKSUM=0 COMMENT="" MIN_ROWS=0 MAX_ROWS=0 PACK_KEYS=DEFAULT DELAY_KEY_WRITE=0 ROW_FORMAT=default; show create table t1; Table Create Table @@ -151,7 +151,7 @@ t1 CREATE TABLE `t1` ( `a` int(11) NOT NULL default '0', `b` varchar(10) character set latin1 default NULL, KEY `b` (`b`) -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 drop table t1; create table t1 (a decimal(9,2), b decimal (9,0), e double(9,2), f double(5,0), h float(3,2), i float(3,0)); show columns from t1; diff --git a/mysql-test/r/symlink.result b/mysql-test/r/symlink.result index b5b5b774ee5..1eb595eb2a9 100644 --- a/mysql-test/r/symlink.result +++ b/mysql-test/r/symlink.result @@ -39,7 +39,7 @@ t9 CREATE TABLE `t9` ( `b` char(16) character set latin1 NOT NULL default '', `c` int(11) NOT NULL default '0', PRIMARY KEY (`a`) -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 alter table t9 rename t8, add column d int not null; alter table t8 rename t7; rename table t7 to t9; @@ -61,5 +61,5 @@ t9 CREATE TABLE `t9` ( `c` int(11) NOT NULL default '0', `d` int(11) NOT NULL default '0', PRIMARY KEY (`a`) -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 drop database test_mysqltest; diff --git a/mysql-test/r/type_enum.result b/mysql-test/r/type_enum.result index ee3bd077798..c0f0be246c9 100644 --- a/mysql-test/r/type_enum.result +++ b/mysql-test/r/type_enum.result @@ -1627,12 +1627,12 @@ show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `a` enum('','a','b') NOT NULL default '' -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 drop table t1; create table t1 (a enum (' ','a','b ') not null default 'b '); show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `a` enum('','a','b') NOT NULL default 'b' -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 drop table t1; diff --git a/mysql-test/r/type_set.result b/mysql-test/r/type_set.result index 858bf5f3ba2..38c7b66dcb8 100644 --- a/mysql-test/r/type_set.result +++ b/mysql-test/r/type_set.result @@ -3,12 +3,12 @@ show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `a` set('','a','b') NOT NULL default '' -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 drop table t1; create table t1 (a set (' ','a','b ') not null default 'b '); show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `a` set('','a','b') NOT NULL default 'b' -) TYPE=MyISAM +) TYPE=MyISAM CHARSET=latin1 drop table t1; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 01894bfb7ad..7d6163fafc3 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -67,6 +67,7 @@ inline Item *or_or_concat(Item* A, Item* B) interval_type interval; LEX_USER *lex_user; enum Item_udftype udf_type; + CHARSET_INFO *charset; } %{ @@ -600,6 +601,11 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %type user grant_user +%type + charset_name + charset_name_or_default + opt_db_default_character_set + %type query verb_clause create change select do drop insert replace insert2 insert_values update delete truncate rename @@ -758,6 +764,7 @@ master_def: create: CREATE opt_table_options TABLE_SYM opt_if_not_exists table_ident { + THD *thd=current_thd; LEX *lex=Lex; lex->sql_command= SQLCOM_CREATE_TABLE; if (!add_table_to_list($5, @@ -771,7 +778,7 @@ create: bzero((char*) &lex->create_info,sizeof(lex->create_info)); lex->create_info.options=$2 | $4; lex->create_info.db_type= default_table_type; - lex->create_info.table_charset=NULL; + lex->create_info.table_charset=thd->db_charset?thd->db_charset:default_charset_info; } create2 @@ -793,13 +800,13 @@ create: lex->key_list.push_back(new Key($2,$4.str, $5, lex->col_list)); lex->col_list.empty(); } - | CREATE DATABASE opt_if_not_exists ident default_charset + | CREATE DATABASE opt_if_not_exists ident opt_db_default_character_set { LEX *lex=Lex; lex->sql_command=SQLCOM_CREATE_DB; lex->name=$4.str; lex->create_info.options=$3; - lex->create_info.table_charset=lex->charset; + lex->create_info.table_charset=$5; } | CREATE udf_func_type UDF_SYM ident { @@ -886,9 +893,9 @@ create_table_option: table_list->next=0; lex->create_info.used_fields|= HA_CREATE_USED_UNION; } - | CHARSET EQ charset_or_nocharset + | CHARSET EQ charset_name_or_default { - Lex->create_info.table_charset=Lex->charset; + Lex->create_info.table_charset= $3; Lex->create_info.used_fields|= HA_CREATE_USED_CHARSET; } | INSERT_METHOD EQ merge_insert_types { Lex->create_info.merge_insert_method= $3; Lex->create_info.used_fields|= HA_CREATE_USED_INSERT_METHOD;} @@ -996,7 +1003,7 @@ type: $$=FIELD_TYPE_TINY; } | BOOL_SYM { Lex->length=(char*) "1"; $$=FIELD_TYPE_TINY; } - | char '(' NUM ')' opt_binary { Lex->length=$3.str; + | char '(' NUM ')' opt_binary { Lex->length=$3.str; $$=FIELD_TYPE_STRING; } | char opt_binary { Lex->length=(char*) "1"; $$=FIELD_TYPE_STRING; } @@ -1125,28 +1132,28 @@ attribute: | UNIQUE_SYM KEY_SYM { Lex->type|= UNIQUE_KEY_FLAG; } | COMMENT_SYM text_literal { Lex->comment= $2; }; -charset: +charset_name: ident { - if (!(Lex->charset=get_charset_by_name($1.str,MYF(0)))) + if (!($$=get_charset_by_name($1.str,MYF(0)))) { net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$1.str); YYABORT; } }; -charset_or_nocharset: - charset - | DEFAULT {Lex->charset=NULL; } +charset_name_or_default: + charset_name { $$=$1; } + | DEFAULT { $$=NULL; } ; -opt_binary: - /* empty */ { Lex->charset=NULL; } - | BINARY { Lex->type|=BINARY_FLAG; Lex->charset=NULL; } - | CHAR_SYM SET charset {/* charset is already in Lex->charset */} ; +opt_db_default_character_set: + /* empty */ { $$=default_charset_info; } + | DEFAULT CHAR_SYM SET charset_name_or_default { $$=$4; }; -default_charset: +opt_binary: /* empty */ { Lex->charset=NULL; } - | DEFAULT CHAR_SYM SET charset_or_nocharset ; + | BINARY { Lex->type|=BINARY_FLAG; Lex->charset=NULL; } + | CHAR_SYM SET charset_name { Lex->charset=$3; } ; references: REFERENCES table_ident @@ -1247,6 +1254,7 @@ string_list: alter: ALTER opt_ignore TABLE_SYM table_ident { + THD *thd=current_thd; LEX *lex=Lex; lex->sql_command = SQLCOM_ALTER_TABLE; lex->name=0; @@ -1264,20 +1272,20 @@ alter: lex->select->db=lex->name=0; bzero((char*) &lex->create_info,sizeof(lex->create_info)); lex->create_info.db_type= DB_TYPE_DEFAULT; + lex->create_info.table_charset=thd->db_charset?thd->db_charset:default_charset_info; lex->create_info.row_type= ROW_TYPE_NOT_USED; - lex->create_info.table_charset=NULL; lex->alter_keys_onoff=LEAVE_AS_IS; lex->simple_alter=1; } alter_list; - | ALTER DATABASE ident default_charset + | ALTER DATABASE ident opt_db_default_character_set { LEX *lex=Lex; lex->sql_command=SQLCOM_ALTER_DB; lex->name=$3.str; - lex->create_info.table_charset=lex->charset; - } + lex->create_info.table_charset=$4; + }; alter_list: @@ -1660,15 +1668,8 @@ expr_expr: { $$= new Item_date_add_interval($1,$4,$5,0); } | expr '-' INTERVAL_SYM expr interval { $$= new Item_date_add_interval($1,$4,$5,1); } - | expr COLLATE_SYM ident - { - if (!(Lex->charset=get_charset_by_name($3.str,MYF(0)))) - { - net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$3.str); - YYABORT; - } - $$= new Item_func_set_collation($1,Lex->charset); - }; + | expr COLLATE_SYM charset_name + { $$= new Item_func_set_collation($1,$3); }; /* expressions that begin with 'expr' that do NOT follow IN_SYM */ no_in_expr: @@ -1783,12 +1784,10 @@ simple_expr: | CASE_SYM opt_expr WHEN_SYM when_list opt_else END { $$= new Item_func_case(* $4, $2, $5 ); } | CONVERT_SYM '(' expr ',' cast_type ')' { $$= create_func_cast($3, $5); } - | CONVERT_SYM '(' expr USING charset ')' - { $$= new Item_func_conv_charset($3,Lex->charset); } + | CONVERT_SYM '(' expr USING charset_name ')' + { $$= new Item_func_conv_charset($3,$5); } | CONVERT_SYM '(' expr ',' expr ',' expr ')' - { - $$= new Item_func_conv_charset3($3,$7,$5); - } + { $$= new Item_func_conv_charset3($3,$7,$5); } | FUNC_ARG0 '(' ')' { $$= ((Item*(*)(void))($1.symbol->create_func))();} | FUNC_ARG1 '(' expr ')' -- cgit v1.2.1 From d6d2440f433fc03dd0732f3bdb5307cb58114a0d Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 13 Sep 2002 14:11:06 +0500 Subject: Fixed that: SELECT * FROM t WHERE (c COLLATE latin1) >'a' might fail in some cases --- sql/item_strfunc.cc | 8 +++++--- sql/item_strfunc.h | 5 +---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index dc9d57b1d9d..243f11db106 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1943,7 +1943,8 @@ void Item_func_conv_charset3::fix_length_and_dec() String *Item_func_set_collation::val_str(String *str) { str=args[0]->val_str(str); - null_value=args[0]->null_value; + if ((null_value=args[0]->null_value)) + return 0; str->set_charset(set_collation); return str; } @@ -1961,8 +1962,10 @@ bool Item_func_set_collation::fix_fields(THD *thd,struct st_table_list *tables, return 1; maybe_null=args[0]->maybe_null; binary=args[0]->binary; - const_item_cache=args[0]->const_item(); str_value.set_charset(set_collation); + with_sum_func= with_sum_func || args[0]->with_sum_func; + used_tables_cache=args[0]->used_tables(); + const_item_cache=args[0]->const_item(); fix_length_and_dec(); return 0; } @@ -1987,7 +1990,6 @@ bool Item_func_set_collation::eq(const Item *item, bool binary_cmp) const return 1; } - String *Item_func_charset::val_str(String *str) { String *res = args[0]->val_str(str); diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index 997d9c8d834..af94e387717 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -504,10 +504,7 @@ public: bool fix_fields(THD *thd,struct st_table_list *tables, Item **ref); String *val_str(String *); void fix_length_and_dec() - { - max_length = args[0]->max_length; - str_value.set_charset(set_collation); - } + { max_length = args[0]->max_length; } bool eq(const Item *item, bool binary_cmp) const; const char *func_name() const { return "set_collation"; } }; -- cgit v1.2.1 From 3444f0426b89f7ff86479e9a0e659bba04108924 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 13 Sep 2002 18:35:29 +0500 Subject: Fixed that CHARSET keyword could not be used as identifier --- sql/sql_yacc.yy | 1 + 1 file changed, 1 insertion(+) diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 7d6163fafc3..befd1c6b637 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -3238,6 +3238,7 @@ keyword: | BOOLEAN_SYM {} | CACHE_SYM {} | CHANGED {} + | CHARSET {} | CHECKSUM_SYM {} | CHECK_SYM {} | CIPHER_SYM {} -- cgit v1.2.1 From 9396cc5a4a063f2cccd83721932abb98ce238459 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 26 Sep 2002 23:08:22 +0300 Subject: new EXPLAIN fixed bug in mysql-test/create-test-result fixed bug in union-subselect engine mysql-test/create-test-result: fixed bug in reject file name assembling mysql-test/r/compare.result: new EXPLAIN mysql-test/r/create.result: new EXPLAIN mysql-test/r/distinct.result: new EXPLAIN mysql-test/r/explain.result: new EXPLAIN mysql-test/r/group_by.result: new EXPLAIN mysql-test/r/heap.result: new EXPLAIN mysql-test/r/heap_btree.result: new EXPLAIN mysql-test/r/heap_hash.result: new EXPLAIN mysql-test/r/innodb.result: new EXPLAIN mysql-test/r/join_outer.result: new EXPLAIN mysql-test/r/key_diff.result: new EXPLAIN mysql-test/r/key_primary.result: new EXPLAIN mysql-test/r/merge.result: new EXPLAIN mysql-test/r/myisam.result: new EXPLAIN mysql-test/r/null_key.result: new EXPLAIN mysql-test/r/odbc.result: new EXPLAIN mysql-test/r/order_by.result: new EXPLAIN mysql-test/r/range.result: new EXPLAIN mysql-test/r/select.result: new EXPLAIN mysql-test/r/subselect.result: new EXPLAIN mysql-test/r/type_datetime.result: new EXPLAIN mysql-test/r/union.result: new EXPLAIN mysql-test/r/user_var.result: new EXPLAIN mysql-test/r/varbinary.result: new EXPLAIN mysql-test/t/subselect.test: new EXPLAIN mysql-test/t/union.test: new EXPLAIN sql/mysql_priv.h: new EXPLAIN sql/sql_class.cc: new EXPLAIN sql/sql_class.h: new EXPLAIN sql/sql_derived.cc: new EXPLAIN sql/sql_lex.h: new EXPLAIN sql/sql_parse.cc: new EXPLAIN sql/sql_select.cc: new EXPLAIN sql/sql_union.cc: fixed bug in subselect-UNION engine sql/table.h: new EXPLAIN --- mysql-test/create-test-result | 3 +- mysql-test/r/compare.result | 4 +- mysql-test/r/create.result | 4 +- mysql-test/r/distinct.result | 30 ++++---- mysql-test/r/explain.result | 20 ++--- mysql-test/r/group_by.result | 20 ++--- mysql-test/r/heap.result | 30 ++++---- mysql-test/r/heap_btree.result | 42 +++++------ mysql-test/r/heap_hash.result | 30 ++++---- mysql-test/r/innodb.result | 52 ++++++------- mysql-test/r/join_outer.result | 46 ++++++------ mysql-test/r/key_diff.result | 6 +- mysql-test/r/key_primary.result | 8 +- mysql-test/r/merge.result | 12 +-- mysql-test/r/myisam.result | 32 ++++---- mysql-test/r/null_key.result | 104 +++++++++++++------------- mysql-test/r/odbc.result | 4 +- mysql-test/r/order_by.result | 98 ++++++++++++------------ mysql-test/r/range.result | 4 +- mysql-test/r/select.result | 74 +++++++++--------- mysql-test/r/subselect.result | 23 ++++++ mysql-test/r/type_datetime.result | 4 +- mysql-test/r/union.result | 38 +++++----- mysql-test/r/user_var.result | 16 ++-- mysql-test/r/varbinary.result | 4 +- mysql-test/t/subselect.test | 6 ++ mysql-test/t/union.test | 2 +- sql/mysql_priv.h | 9 ++- sql/sql_class.cc | 22 ++++++ sql/sql_class.h | 3 + sql/sql_derived.cc | 23 +++--- sql/sql_lex.h | 4 +- sql/sql_parse.cc | 108 ++++++++++++++++++++++++--- sql/sql_select.cc | 153 ++++++++++++++++++-------------------- sql/sql_union.cc | 23 ++++-- sql/table.h | 3 + 36 files changed, 607 insertions(+), 457 deletions(-) diff --git a/mysql-test/create-test-result b/mysql-test/create-test-result index a50b4c87641..b9be2300976 100755 --- a/mysql-test/create-test-result +++ b/mysql-test/create-test-result @@ -27,6 +27,7 @@ test_name=$1 [ -z $test_name ] && usage result_file=$RESULT_DIR/$test_name.result +reject_file=$RESULT_DIR/$test_name.reject [ -f $result_file ] && die "result file $result_file has already been created" @@ -34,8 +35,6 @@ touch $result_file echo "Running the test case against empty file, will fail, but don't worry" ./mysql-test-run --local $test_name -reject_file=$result_file.reject - if [ -f $reject_file ] ; then echo "Below are the contents of the reject file:" echo "-----start---------------------" diff --git a/mysql-test/r/compare.result b/mysql-test/r/compare.result index 07f9ce4e81a..be11de8ebb9 100644 --- a/mysql-test/r/compare.result +++ b/mysql-test/r/compare.result @@ -2,8 +2,8 @@ drop table if exists t1; CREATE TABLE t1 (id CHAR(12) not null, PRIMARY KEY (id)); insert into t1 values ('000000000001'),('000000000002'); explain select * from t1 where id=000000000001; -table type possible_keys key key_len ref rows Extra -t1 index PRIMARY PRIMARY 12 NULL 2 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 index PRIMARY PRIMARY 12 NULL 2 where used; Using index select * from t1 where id=000000000001; id 000000000001 diff --git a/mysql-test/r/create.result b/mysql-test/r/create.result index f9a3ef487f0..41a977695a6 100644 --- a/mysql-test/r/create.result +++ b/mysql-test/r/create.result @@ -62,8 +62,8 @@ create table t1 (a int auto_increment not null primary key, B CHAR(20)); insert into t1 (b) values ("hello"),("my"),("world"); create table t2 (key (b)) select * from t1; explain select * from t2 where b="world"; -table type possible_keys key key_len ref rows Extra -t2 ref B B 21 const 1 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t2 ref B B 21 const 1 where used select * from t2 where b="world"; a B 3 world diff --git a/mysql-test/r/distinct.result b/mysql-test/r/distinct.result index 89f4a8ae7f2..d8386ddcfc3 100644 --- a/mysql-test/r/distinct.result +++ b/mysql-test/r/distinct.result @@ -172,10 +172,10 @@ b INSERT INTO t2 values (1),(2),(3); INSERT INTO t3 VALUES (1,'1'),(2,'2'),(1,'1'),(2,'2'); explain SELECT distinct t3.a FROM t3,t2,t1 WHERE t3.a=t1.b AND t1.a=t2.a; -table type possible_keys key key_len ref rows Extra -t3 index a a 5 NULL 6 Using index; Using temporary -t2 index a a 4 NULL 5 Using index; Distinct -t1 eq_ref PRIMARY PRIMARY 4 t2.a 1 where used; Distinct +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t3 index a a 5 NULL 6 Using index; Using temporary +1 FIRST t2 index a a 4 NULL 5 Using index; Distinct +1 FIRST t1 eq_ref PRIMARY PRIMARY 4 t2.a 1 where used; Distinct SELECT distinct t3.a FROM t3,t2,t1 WHERE t3.a=t1.b AND t1.a=t2.a; a 1 @@ -188,9 +188,9 @@ insert into t3 select * from t4; insert into t4 select * from t3; insert into t3 select * from t4; explain select distinct t1.a from t1,t3 where t1.a=t3.a; -table type possible_keys key key_len ref rows Extra -t1 index PRIMARY PRIMARY 4 NULL 2 Using index; Using temporary -t3 ref a a 5 t1.a 10 Using index; Distinct +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 index PRIMARY PRIMARY 4 NULL 2 Using index; Using temporary +1 FIRST t3 ref a a 5 t1.a 10 Using index; Distinct select distinct t1.a from t1,t3 where t1.a=t3.a; a 1 @@ -274,14 +274,14 @@ on j_lj_t3.id=t3_lj.id WHERE ((t1.id=j_lj_t2.id AND t2_lj.id IS NULL) OR (t1.id=t2.id AND t2.idx=2)) AND ((t1.id=j_lj_t3.id AND t3_lj.id IS NULL) OR (t1.id=t3.id AND t3.idx=2)); -table type possible_keys key key_len ref rows Extra -t1 index id id 4 NULL 2 Using index; Using temporary -t2 index id id 8 NULL 1 Using index; Distinct -t3 index id id 8 NULL 1 Using index; Distinct -j_lj_t2 index id id 4 NULL 2 where used; Using index; Distinct -t2_lj index id id 8 NULL 1 where used; Using index; Distinct -j_lj_t3 index id id 4 NULL 2 where used; Using index; Distinct -t3_lj index id id 8 NULL 1 where used; Using index; Distinct +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 index id id 4 NULL 2 Using index; Using temporary +1 FIRST t2 index id id 8 NULL 1 Using index; Distinct +1 FIRST t3 index id id 8 NULL 1 Using index; Distinct +1 FIRST j_lj_t2 index id id 4 NULL 2 where used; Using index; Distinct +1 FIRST t2_lj index id id 8 NULL 1 where used; Using index; Distinct +1 FIRST j_lj_t3 index id id 4 NULL 2 where used; Using index; Distinct +1 FIRST t3_lj index id id 8 NULL 1 where used; Using index; Distinct SELECT DISTINCT t1.id from diff --git a/mysql-test/r/explain.result b/mysql-test/r/explain.result index 5b4da25d535..cd0ddeae120 100644 --- a/mysql-test/r/explain.result +++ b/mysql-test/r/explain.result @@ -9,22 +9,22 @@ select * from t1 where str="foo"; id str 3 foo explain select * from t1 where str is null; -table type possible_keys key key_len ref rows Extra -t1 ref str str 11 const 1 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref str str 11 const 1 where used explain select * from t1 where str="foo"; -table type possible_keys key key_len ref rows Extra -t1 const str str 11 const 1 +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 const str str 11 const 1 explain select * from t1 ignore key (str) where str="foo"; -table type possible_keys key key_len ref rows Extra -t1 ALL NULL NULL NULL NULL 4 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL NULL NULL NULL NULL 4 where used explain select * from t1 use key (str,str) where str="foo"; -table type possible_keys key key_len ref rows Extra -t1 const str str 11 const 1 +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 const str str 11 const 1 explain select * from t1 use key (str,str,foo) where str="foo"; Key column 'foo' doesn't exist in table explain select * from t1 ignore key (str,str,foo) where str="foo"; Key column 'foo' doesn't exist in table drop table t1; explain select 1; -Comment -No tables used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST No tables used diff --git a/mysql-test/r/group_by.result b/mysql-test/r/group_by.result index aaa03f2668a..0781468bc97 100644 --- a/mysql-test/r/group_by.result +++ b/mysql-test/r/group_by.result @@ -225,19 +225,19 @@ key (score) ); INSERT INTO t1 VALUES (1,1,1),(2,2,2),(2,1,1),(3,3,3),(4,3,3),(5,3,3); explain select userid,count(*) from t1 group by userid desc; -table type possible_keys key key_len ref rows Extra -t1 ALL NULL NULL NULL NULL 6 Using temporary; Using filesort +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL NULL NULL NULL NULL 6 Using temporary; Using filesort select userid,count(*) from t1 group by userid desc; userid count(*) 3 3 2 1 1 2 explain select spid,count(*) from t1 where spid between 1 and 2 group by spid desc; -table type possible_keys key key_len ref rows Extra -t1 range spID spID 5 NULL 2 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range spID spID 5 NULL 2 where used; Using index explain select spid,count(*) from t1 where spid between 1 and 2 group by spid; -table type possible_keys key key_len ref rows Extra -t1 range spID spID 5 NULL 2 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range spID spID 5 NULL 2 where used; Using index select spid,count(*) from t1 where spid between 1 and 2 group by spid; spid count(*) 1 1 @@ -247,8 +247,8 @@ spid count(*) 2 2 1 1 explain select sql_big_result spid,sum(userid) from t1 group by spid desc; -table type possible_keys key key_len ref rows Extra -t1 ALL NULL NULL NULL NULL 6 Using filesort +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL NULL NULL NULL NULL 6 Using filesort select sql_big_result spid,sum(userid) from t1 group by spid desc; spid sum(userid) 5 3 @@ -257,8 +257,8 @@ spid sum(userid) 2 3 1 1 explain select sql_big_result score,count(*) from t1 group by score desc; -table type possible_keys key key_len ref rows Extra -t1 index NULL score 3 NULL 6 Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 index NULL score 3 NULL 6 Using index select sql_big_result score,count(*) from t1 group by score desc; score count(*) 3 3 diff --git a/mysql-test/r/heap.result b/mysql-test/r/heap.result index eb3bae0fea2..94fac7757ac 100644 --- a/mysql-test/r/heap.result +++ b/mysql-test/r/heap.result @@ -65,8 +65,8 @@ a 869751 alter table t1 type=myisam; explain select * from t1 where a in (869751,736494,226312,802616); -table type possible_keys key key_len ref rows Extra -t1 range uniq_id uniq_id 4 NULL 4 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range uniq_id uniq_id 4 NULL 4 where used; Using index drop table t1; create table t1 (x int not null, y int not null, key x (x), unique y (y)) type=heap; @@ -84,9 +84,9 @@ x y x y 2 5 2 2 2 6 2 2 explain select * from t1,t1 as t2 where t1.x=t2.y; -table type possible_keys key key_len ref rows Extra -t1 ALL x NULL NULL NULL 6 -t2 eq_ref y y 4 t1.x 1 +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL x NULL NULL NULL 6 +1 FIRST t2 eq_ref y y 4 t1.x 1 drop table t1; create table t1 (a int) type=heap; insert into t1 values(1); @@ -158,18 +158,18 @@ drop table t1; create table t1 (btn char(10) not null, key(btn)) type=heap; insert into t1 values ("hello"),("hello"),("hello"),("hello"),("hello"),("a"),("b"),("c"),("d"),("e"),("f"),("g"),("h"),("i"); explain select * from t1 where btn like "q%"; -table type possible_keys key key_len ref rows Extra -t1 ALL btn NULL NULL NULL 14 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL btn NULL NULL NULL 14 where used select * from t1 where btn like "q%"; btn alter table t1 add column new_col char(1) not null, add key (btn,new_col), drop key btn; update t1 set new_col=btn; explain select * from t1 where btn="a"; -table type possible_keys key key_len ref rows Extra -t1 ALL btn NULL NULL NULL 14 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL btn NULL NULL NULL 14 where used explain select * from t1 where btn="a" and new_col="a"; -table type possible_keys key key_len ref rows Extra -t1 ref btn btn 11 const,const 10 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref btn btn 11 const,const 10 where used drop table t1; CREATE TABLE t1 ( a int default NULL, @@ -181,16 +181,16 @@ INSERT INTO t1 VALUES (NULL,99),(99,NULL),(1,1),(2,2),(1,3); SELECT * FROM t1 WHERE a=NULL; a b explain SELECT * FROM t1 WHERE a IS NULL; -table type possible_keys key key_len ref rows Extra -t1 ref a a 5 const 10 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref a a 5 const 10 where used SELECT * FROM t1 WHERE a<=>NULL; a b NULL 99 SELECT * FROM t1 WHERE b=NULL; a b explain SELECT * FROM t1 WHERE b IS NULL; -table type possible_keys key key_len ref rows Extra -t1 ref b b 5 const 1 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref b b 5 const 1 where used SELECT * FROM t1 WHERE b<=>NULL; a b 99 NULL diff --git a/mysql-test/r/heap_btree.result b/mysql-test/r/heap_btree.result index c3080389999..5a8289a16f7 100644 --- a/mysql-test/r/heap_btree.result +++ b/mysql-test/r/heap_btree.result @@ -65,8 +65,8 @@ a 869751 alter table t1 type=myisam; explain select * from t1 where a in (869751,736494,226312,802616); -table type possible_keys key key_len ref rows Extra -t1 range uniq_id uniq_id 4 NULL 4 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range uniq_id uniq_id 4 NULL 4 where used; Using index drop table t1; create table t1 (x int not null, y int not null, key x using BTREE (x), unique y using BTREE (y)) type=heap; @@ -84,9 +84,9 @@ x y x y 2 5 2 2 2 6 2 2 explain select * from t1,t1 as t2 where t1.x=t2.y; -table type possible_keys key key_len ref rows Extra -t1 ALL x NULL NULL NULL 6 -t2 eq_ref y y 4 t1.x 1 +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL x NULL NULL NULL 6 +1 FIRST t2 eq_ref y y 4 t1.x 1 drop table t1; create table t1 (a int) type=heap; insert into t1 values(1); @@ -120,18 +120,18 @@ a b 1 6 1 6 explain select * from tx where a=x order by a,b; -table type possible_keys key key_len ref rows Extra -tx ref a a x const x where used +id select_type table type possible_keys key key_len ref rows Extra +x FIRST tx ref a a x const x where used explain select * from tx where a=x order by b; -table type possible_keys key key_len ref rows Extra -tx ref a a x const x where used +id select_type table type possible_keys key key_len ref rows Extra +x FIRST tx ref a a x const x where used select * from t1 where b=1; a b 1 1 1 1 explain select * from tx where b=x; -table type possible_keys key key_len ref rows Extra -tx ref b b x const x where used +id select_type table type possible_keys key key_len ref rows Extra +x FIRST tx ref b b x const x where used drop table t1; create table t1 (id int unsigned not null, primary key using BTREE (id)) type=HEAP; insert into t1 values(1); @@ -171,18 +171,18 @@ drop table t1; create table t1 (btn char(10) not null, key using BTREE (btn)) type=heap; insert into t1 values ("hello"),("hello"),("hello"),("hello"),("hello"),("a"),("b"),("c"),("d"),("e"),("f"),("g"),("h"),("i"); explain select * from t1 where btn like "q%"; -table type possible_keys key key_len ref rows Extra -t1 ALL btn NULL NULL NULL 14 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL btn NULL NULL NULL 14 where used select * from t1 where btn like "q%"; btn alter table t1 add column new_col char(1) not null, add key using BTREE (btn,new_col), drop key btn; update t1 set new_col=btn; explain select * from t1 where btn="a"; -table type possible_keys key key_len ref rows Extra -t1 ref btn btn 10 const 1 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref btn btn 10 const 1 where used explain select * from t1 where btn="a" and new_col="a"; -table type possible_keys key key_len ref rows Extra -t1 ref btn btn 11 const,const 1 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref btn btn 11 const,const 1 where used drop table t1; CREATE TABLE t1 ( a int default NULL, @@ -194,16 +194,16 @@ INSERT INTO t1 VALUES (NULL,99),(99,NULL),(1,1),(2,2),(1,3); SELECT * FROM t1 WHERE a=NULL; a b explain SELECT * FROM t1 WHERE a IS NULL; -table type possible_keys key key_len ref rows Extra -t1 ref a a 5 const 1 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref a a 5 const 1 where used SELECT * FROM t1 WHERE a<=>NULL; a b NULL 99 SELECT * FROM t1 WHERE b=NULL; a b explain SELECT * FROM t1 WHERE b IS NULL; -table type possible_keys key key_len ref rows Extra -t1 ref b b 5 const 1 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref b b 5 const 1 where used SELECT * FROM t1 WHERE b<=>NULL; a b 99 NULL diff --git a/mysql-test/r/heap_hash.result b/mysql-test/r/heap_hash.result index 9b7f2cca6bc..4dd79e5c52b 100644 --- a/mysql-test/r/heap_hash.result +++ b/mysql-test/r/heap_hash.result @@ -65,8 +65,8 @@ a 869751 alter table t1 type=myisam; explain select * from t1 where a in (869751,736494,226312,802616); -table type possible_keys key key_len ref rows Extra -t1 range uniq_id uniq_id 4 NULL 4 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range uniq_id uniq_id 4 NULL 4 where used; Using index drop table t1; create table t1 (x int not null, y int not null, key x using HASH (x), unique y using HASH (y)) type=heap; @@ -84,9 +84,9 @@ x y x y 2 5 2 2 2 6 2 2 explain select * from t1,t1 as t2 where t1.x=t2.y; -table type possible_keys key key_len ref rows Extra -t1 ALL x NULL NULL NULL 6 -t2 eq_ref y y 4 t1.x 1 +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL x NULL NULL NULL 6 +1 FIRST t2 eq_ref y y 4 t1.x 1 drop table t1; create table t1 (a int) type=heap; insert into t1 values(1); @@ -158,18 +158,18 @@ drop table t1; create table t1 (btn char(10) not null, key using HASH (btn)) type=heap; insert into t1 values ("hello"),("hello"),("hello"),("hello"),("hello"),("a"),("b"),("c"),("d"),("e"),("f"),("g"),("h"),("i"); explain select * from t1 where btn like "q%"; -table type possible_keys key key_len ref rows Extra -t1 ALL btn NULL NULL NULL 14 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL btn NULL NULL NULL 14 where used select * from t1 where btn like "q%"; btn alter table t1 add column new_col char(1) not null, add key using HASH (btn,new_col), drop key btn; update t1 set new_col=btn; explain select * from t1 where btn="a"; -table type possible_keys key key_len ref rows Extra -t1 ALL btn NULL NULL NULL 14 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL btn NULL NULL NULL 14 where used explain select * from t1 where btn="a" and new_col="a"; -table type possible_keys key key_len ref rows Extra -t1 ref btn btn 11 const,const 10 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref btn btn 11 const,const 10 where used drop table t1; CREATE TABLE t1 ( a int default NULL, @@ -181,16 +181,16 @@ INSERT INTO t1 VALUES (NULL,99),(99,NULL),(1,1),(2,2),(1,3); SELECT * FROM t1 WHERE a=NULL; a b explain SELECT * FROM t1 WHERE a IS NULL; -table type possible_keys key key_len ref rows Extra -t1 ref a a 5 const 10 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref a a 5 const 10 where used SELECT * FROM t1 WHERE a<=>NULL; a b NULL 99 SELECT * FROM t1 WHERE b=NULL; a b explain SELECT * FROM t1 WHERE b IS NULL; -table type possible_keys key key_len ref rows Extra -t1 ref b b 5 const 1 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref b b 5 const 1 where used SELECT * FROM t1 WHERE b<=>NULL; a b 99 NULL diff --git a/mysql-test/r/innodb.result b/mysql-test/r/innodb.result index b75248b5d5a..7b709d6f471 100644 --- a/mysql-test/r/innodb.result +++ b/mysql-test/r/innodb.result @@ -139,14 +139,14 @@ id parent_id level 1010 102 2 1015 102 2 explain select level from t1 where level=1; -table type possible_keys key key_len ref rows Extra -t1 ref level level 1 const 12 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref level level 1 const 12 where used; Using index explain select level,id from t1 where level=1; -table type possible_keys key key_len ref rows Extra -t1 ref level level 1 const 12 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref level level 1 const 12 where used; Using index explain select level,id,parent_id from t1 where level=1; -table type possible_keys key key_len ref rows Extra -t1 ref level level 1 const 12 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref level level 1 const 12 where used select level,id from t1 where level=1; level id 1 1002 @@ -596,8 +596,8 @@ id parent_id level 1025 102 2 1016 102 2 explain select level from t1 where level=1; -table type possible_keys key key_len ref rows Extra -t1 ref level level 1 const 6 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref level level 1 const 6 where used; Using index select level,id from t1 where level=1; level id 1 1004 @@ -758,8 +758,8 @@ DROP TABLE t1; create table t1 (a int primary key,b int, c int, d int, e int, f int, g int, h int, i int, j int, k int, l int, m int, n int, o int, p int, q int, r int, s int, t int, u int, v int, w int, x int, y int, z int, a1 int, a2 int, a3 int, a4 int, a5 int, a6 int, a7 int, a8 int, a9 int, b1 int, b2 int, b3 int, b4 int, b5 int, b6 int) type = innodb; insert into t1 values (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); explain select * from t1 where a > 0 and a < 50; -table type possible_keys key key_len ref rows Extra -t1 range PRIMARY PRIMARY 4 NULL 1 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range PRIMARY PRIMARY 4 NULL 1 where used drop table t1; create table t1 (id int NOT NULL,id2 int NOT NULL,id3 int NOT NULL,dummy1 char(30),primary key (id,id2),index index_id3 (id3)) type=innodb; insert into t1 values (0,0,0,'ABCDEFGHIJ'),(2,2,2,'BCDEFGHIJK'),(1,1,1,'CDEFGHIJKL'); @@ -892,29 +892,29 @@ drop table t1; create table t1 (a int not null, b int not null, c int not null, primary key (a),key(b)) type=innodb; insert into t1 values (3,3,3),(1,1,1),(2,2,2),(4,4,4); explain select * from t1 order by a; -table type possible_keys key key_len ref rows Extra -t1 index NULL PRIMARY 4 NULL 4 +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 index NULL PRIMARY 4 NULL 4 explain select * from t1 order by b; -table type possible_keys key key_len ref rows Extra -t1 index NULL b 4 NULL 4 +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 index NULL b 4 NULL 4 explain select * from t1 order by c; -table type possible_keys key key_len ref rows Extra -t1 ALL NULL NULL NULL NULL 4 Using filesort +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL NULL NULL NULL NULL 4 Using filesort explain select a from t1 order by a; -table type possible_keys key key_len ref rows Extra -t1 index NULL PRIMARY 4 NULL 4 Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 index NULL PRIMARY 4 NULL 4 Using index explain select b from t1 order by b; -table type possible_keys key key_len ref rows Extra -t1 index NULL b 4 NULL 4 Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 index NULL b 4 NULL 4 Using index explain select a,b from t1 order by b; -table type possible_keys key key_len ref rows Extra -t1 index NULL b 4 NULL 4 Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 index NULL b 4 NULL 4 Using index explain select a,b from t1; -table type possible_keys key key_len ref rows Extra -t1 index NULL b 4 NULL 4 Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 index NULL b 4 NULL 4 Using index explain select a,b,c from t1; -table type possible_keys key key_len ref rows Extra -t1 ALL NULL NULL NULL NULL 4 +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL NULL NULL NULL NULL 4 drop table t1; create table t1 (t int not null default 1, key (t)) type=innodb; desc t1; diff --git a/mysql-test/r/join_outer.result b/mysql-test/r/join_outer.result index 9d3c152e516..3b9b13bdd3c 100644 --- a/mysql-test/r/join_outer.result +++ b/mysql-test/r/join_outer.result @@ -90,12 +90,12 @@ grp a c id a c d 2 3 c NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL explain select t1.*,t2.* from t1,t2 where t1.a=t2.a and isnull(t2.a)=1; -Comment -Impossible WHERE noticed after reading const tables +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST Impossible WHERE noticed after reading const tables explain select t1.*,t2.* from t1 left join t2 on t1.a=t2.a where isnull(t2.a)=1; -table type possible_keys key key_len ref rows Extra -t1 ALL NULL NULL NULL NULL 7 -t2 eq_ref PRIMARY PRIMARY 8 t1.a 1 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL NULL NULL NULL NULL 7 +1 FIRST t2 eq_ref PRIMARY PRIMARY 8 t1.a 1 where used select t1.*,t2.*,t3.a from t1 left join t2 on (t1.a=t2.a) left join t1 as t3 on (t2.a=t3.a); grp a c id a c d a 1 1 a 1 1 a 1 1 @@ -311,13 +311,13 @@ select t1.name, t2.name, t2.id from t1 left join t2 on (t1.id = t2.owner) where name name id Lilliana Angelovska NULL NULL explain select t1.name, t2.name, t2.id from t1 left join t2 on (t1.id = t2.owner) where t2.id is null; -table type possible_keys key key_len ref rows Extra -t1 ALL NULL NULL NULL NULL 3 -t2 ALL NULL NULL NULL NULL 3 where used; Not exists +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL NULL NULL NULL NULL 3 +1 FIRST t2 ALL NULL NULL NULL NULL 3 where used; Not exists explain select t1.name, t2.name, t2.id from t1 left join t2 on (t1.id = t2.owner) where t2.name is null; -table type possible_keys key key_len ref rows Extra -t1 ALL NULL NULL NULL NULL 3 -t2 ALL NULL NULL NULL NULL 3 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL NULL NULL NULL NULL 3 +1 FIRST t2 ALL NULL NULL NULL NULL 3 where used select count(*) from t1 left join t2 on (t1.id = t2.owner); count(*) 4 @@ -331,13 +331,13 @@ select t1.name, t2.name, t2.id from t2 right join t1 on (t1.id = t2.owner) where name name id Lilliana Angelovska NULL NULL explain select t1.name, t2.name, t2.id from t2 right join t1 on (t1.id = t2.owner) where t2.id is null; -table type possible_keys key key_len ref rows Extra -t1 ALL NULL NULL NULL NULL 3 -t2 ALL NULL NULL NULL NULL 3 where used; Not exists +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL NULL NULL NULL NULL 3 +1 FIRST t2 ALL NULL NULL NULL NULL 3 where used; Not exists explain select t1.name, t2.name, t2.id from t2 right join t1 on (t1.id = t2.owner) where t2.name is null; -table type possible_keys key key_len ref rows Extra -t1 ALL NULL NULL NULL NULL 3 -t2 ALL NULL NULL NULL NULL 3 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL NULL NULL NULL NULL 3 +1 FIRST t2 ALL NULL NULL NULL NULL 3 where used select count(*) from t2 right join t1 on (t1.id = t2.owner); count(*) 4 @@ -618,9 +618,9 @@ UNIQUE id (id,idx) ); INSERT INTO t2 VALUES (1,1); explain SELECT * from t1 left join t2 on t1.id=t2.id where t2.id IS NULL; -table type possible_keys key key_len ref rows Extra -t1 ALL NULL NULL NULL NULL 2 -t2 index id id 8 NULL 1 where used; Using index; Not exists +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL NULL NULL NULL NULL 2 +1 FIRST t2 index id id 8 NULL 1 where used; Using index; Not exists SELECT * from t1 left join t2 on t1.id=t2.id where t2.id IS NULL; id name id idx 2 no NULL NULL @@ -638,9 +638,9 @@ create table t2 (fooID smallint unsigned not null, barID smallint unsigned not n insert into t1 (fooID) values (10),(20),(30); insert into t2 values (10,1),(20,2),(30,3); explain select * from t2 left join t1 on t1.fooID = t2.fooID and t1.fooID = 30; -table type possible_keys key key_len ref rows Extra -t2 index NULL PRIMARY 4 NULL 3 Using index -t1 eq_ref PRIMARY PRIMARY 2 const 1 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t2 index NULL PRIMARY 4 NULL 3 Using index +1 FIRST t1 eq_ref PRIMARY PRIMARY 2 const 1 where used; Using index select * from t2 left join t1 on t1.fooID = t2.fooID and t1.fooID = 30; fooID barID fooID 10 1 NULL diff --git a/mysql-test/r/key_diff.result b/mysql-test/r/key_diff.result index 0886850f38a..85d1f455b3f 100644 --- a/mysql-test/r/key_diff.result +++ b/mysql-test/r/key_diff.result @@ -34,9 +34,9 @@ C c a a D E a a a a a a explain select t1.*,t2.* from t1,t1 as t2 where t1.A=t2.B; -table type possible_keys key key_len ref rows Extra -t1 ALL a NULL NULL NULL 5 -t2 ALL b NULL NULL NULL 5 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL a NULL NULL NULL 5 +1 FIRST t2 ALL b NULL NULL NULL 5 where used select t1.*,t2.* from t1,t1 as t2 where t1.A=t2.B order by binary t1.a,t2.a; a b a b A B a a diff --git a/mysql-test/r/key_primary.result b/mysql-test/r/key_primary.result index 10771a134fc..b3c9cef64f0 100644 --- a/mysql-test/r/key_primary.result +++ b/mysql-test/r/key_primary.result @@ -11,9 +11,9 @@ select * from t1 where t1 like "a_\%"; t1 AB% describe select * from t1 where t1="ABC"; -table type possible_keys key key_len ref rows Extra -t1 const PRIMARY PRIMARY 3 const 1 +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 const PRIMARY PRIMARY 3 const 1 describe select * from t1 where t1="ABCD"; -Comment -Impossible WHERE noticed after reading const tables +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST Impossible WHERE noticed after reading const tables drop table t1; diff --git a/mysql-test/r/merge.result b/mysql-test/r/merge.result index 6de77f7bdaa..f8711d5f0f6 100644 --- a/mysql-test/r/merge.result +++ b/mysql-test/r/merge.result @@ -34,11 +34,11 @@ insert into t2 select NULL,message from t1; insert into t1 select NULL,message from t2; create table t3 (a int not null, b char(20), key(a)) type=MERGE UNION=(test.t1,test.t2); explain select * from t3 where a < 10; -table type possible_keys key key_len ref rows Extra -t3 range a a 4 NULL 10 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t3 range a a 4 NULL 10 where used explain select * from t3 where a > 10 and a < 20; -table type possible_keys key key_len ref rows Extra -t3 range a a 4 NULL 10 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t3 range a a 4 NULL 10 where used select * from t3 where a = 10; a b 10 Testing @@ -84,8 +84,8 @@ a b 19 Testing 19 Testing explain select a from t3 order by a desc limit 10; -table type possible_keys key key_len ref rows Extra -t3 index NULL a 4 NULL 1131 Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t3 index NULL a 4 NULL 1131 Using index select a from t3 order by a desc limit 10; a 699 diff --git a/mysql-test/r/myisam.result b/mysql-test/r/myisam.result index fb18841ac3f..647fe70b694 100644 --- a/mysql-test/r/myisam.result +++ b/mysql-test/r/myisam.result @@ -51,27 +51,27 @@ drop table t1; create table t1 (a int not null, b int not null, c int not null, primary key (a),key(b)) type=myisam; insert into t1 values (3,3,3),(1,1,1),(2,2,2),(4,4,4); explain select * from t1 order by a; -table type possible_keys key key_len ref rows Extra -t1 ALL NULL NULL NULL NULL 4 Using filesort +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL NULL NULL NULL NULL 4 Using filesort explain select * from t1 order by b; -table type possible_keys key key_len ref rows Extra -t1 ALL NULL NULL NULL NULL 4 Using filesort +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL NULL NULL NULL NULL 4 Using filesort explain select * from t1 order by c; -table type possible_keys key key_len ref rows Extra -t1 ALL NULL NULL NULL NULL 4 Using filesort +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL NULL NULL NULL NULL 4 Using filesort explain select a from t1 order by a; -table type possible_keys key key_len ref rows Extra -t1 index NULL PRIMARY 4 NULL 4 Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 index NULL PRIMARY 4 NULL 4 Using index explain select b from t1 order by b; -table type possible_keys key key_len ref rows Extra -t1 index NULL b 4 NULL 4 Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 index NULL b 4 NULL 4 Using index explain select a,b from t1 order by b; -table type possible_keys key key_len ref rows Extra -t1 ALL NULL NULL NULL NULL 4 Using filesort +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL NULL NULL NULL NULL 4 Using filesort explain select a,b from t1; -table type possible_keys key key_len ref rows Extra -t1 ALL NULL NULL NULL NULL 4 +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL NULL NULL NULL NULL 4 explain select a,b,c from t1; -table type possible_keys key key_len ref rows Extra -t1 ALL NULL NULL NULL NULL 4 +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL NULL NULL NULL NULL 4 drop table t1; diff --git a/mysql-test/r/null_key.result b/mysql-test/r/null_key.result index a28830a696d..a11f8ce6090 100644 --- a/mysql-test/r/null_key.result +++ b/mysql-test/r/null_key.result @@ -2,38 +2,38 @@ drop table if exists t1; create table t1 (a int, b int not null,unique key (a,b),index(b)) type=myisam; insert ignore into t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(null,7),(9,9),(8,8),(7,7),(null,9),(null,9),(6,6); explain select * from t1 where a is null; -table type possible_keys key key_len ref rows Extra -t1 ref a a 5 const 3 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref a a 5 const 3 where used; Using index explain select * from t1 where a is null and b = 2; -table type possible_keys key key_len ref rows Extra -t1 ref a,b a 9 const,const 1 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref a,b a 9 const,const 1 where used; Using index explain select * from t1 where a is null and b = 7; -table type possible_keys key key_len ref rows Extra -t1 ref a,b a 9 const,const 1 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref a,b a 9 const,const 1 where used; Using index explain select * from t1 where a=2 and b = 2; -table type possible_keys key key_len ref rows Extra -t1 const a,b a 9 const,const 1 +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 const a,b a 9 const,const 1 explain select * from t1 where a<=>b limit 2; -table type possible_keys key key_len ref rows Extra -t1 index NULL a 9 NULL 12 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 index NULL a 9 NULL 12 where used; Using index explain select * from t1 where (a is null or a > 0 and a < 3) and b < 5 limit 3; -table type possible_keys key key_len ref rows Extra -t1 range a,b a 9 NULL 3 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range a,b a 9 NULL 3 where used; Using index explain select * from t1 where (a is null or a = 7) and b=7; -table type possible_keys key key_len ref rows Extra -t1 ref a,b b 4 const 2 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref a,b b 4 const 2 where used explain select * from t1 where (a is null and b>a) or a is null and b=7 limit 2; -table type possible_keys key key_len ref rows Extra -t1 ref a,b a 5 const 3 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref a,b a 5 const 3 where used; Using index explain select * from t1 where a is null and b=9 or a is null and b=7 limit 3; -table type possible_keys key key_len ref rows Extra -t1 range a,b a 9 NULL 2 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range a,b a 9 NULL 2 where used; Using index explain select * from t1 where a > 1 and a < 3 limit 1; -table type possible_keys key key_len ref rows Extra -t1 range a a 5 NULL 1 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range a a 5 NULL 1 where used; Using index explain select * from t1 where a > 8 and a < 9; -table type possible_keys key key_len ref rows Extra -t1 range a a 5 NULL 1 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range a a 5 NULL 1 where used; Using index select * from t1 where a is null; a b NULL 7 @@ -65,44 +65,44 @@ NULL 9 NULL 9 alter table t1 modify b blob not null, add c int not null, drop key a, add unique key (a,b(20),c), drop key b, add key (b(10)); explain select * from t1 where a is null and b = 2; -table type possible_keys key key_len ref rows Extra -t1 ref a,b a 5 const 3 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref a,b a 5 const 3 where used explain select * from t1 where a is null and b = 2 and c=0; -table type possible_keys key key_len ref rows Extra -t1 ref a,b a 5 const 3 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref a,b a 5 const 3 where used explain select * from t1 where a is null and b = 7 and c=0; -table type possible_keys key key_len ref rows Extra -t1 ref a,b a 5 const 3 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref a,b a 5 const 3 where used explain select * from t1 where a=2 and b = 2; -table type possible_keys key key_len ref rows Extra -t1 ref a,b a 5 const 1 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref a,b a 5 const 1 where used explain select * from t1 where a<=>b limit 2; -table type possible_keys key key_len ref rows Extra -t1 ALL NULL NULL NULL NULL 12 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL NULL NULL NULL NULL 12 where used explain select * from t1 where (a is null or a > 0 and a < 3) and b < 5 and c=0 limit 3; -table type possible_keys key key_len ref rows Extra -t1 range a,b a 5 NULL 5 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range a,b a 5 NULL 5 where used explain select * from t1 where (a is null or a = 7) and b=7 and c=0; -table type possible_keys key key_len ref rows Extra -t1 range a,b a 5 NULL 4 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range a,b a 5 NULL 4 where used explain select * from t1 where (a is null and b>a) or a is null and b=7 limit 2; -table type possible_keys key key_len ref rows Extra -t1 ref a,b a 5 const 3 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref a,b a 5 const 3 where used explain select * from t1 where a is null and b=9 or a is null and b=7 limit 3; -table type possible_keys key key_len ref rows Extra -t1 ref a,b a 5 const 3 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref a,b a 5 const 3 where used explain select * from t1 where a > 1 and a < 3 limit 1; -table type possible_keys key key_len ref rows Extra -t1 range a a 5 NULL 1 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range a a 5 NULL 1 where used explain select * from t1 where a is null and b=7 or a > 1 and a < 3 limit 1; -table type possible_keys key key_len ref rows Extra -t1 range a,b a 5 NULL 4 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range a,b a 5 NULL 4 where used explain select * from t1 where a > 8 and a < 9; -table type possible_keys key key_len ref rows Extra -t1 range a a 5 NULL 1 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range a a 5 NULL 1 where used explain select * from t1 where b like "6%"; -table type possible_keys key key_len ref rows Extra -t1 range b b 12 NULL 1 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range b b 12 NULL 1 where used select * from t1 where a is null; a b c NULL 7 0 @@ -151,11 +151,11 @@ PRIMARY KEY (id) INSERT INTO t1 VALUES (1,NULL),(2,NULL),(3,1),(4,2),(5,NULL),(6,NULL),(7,3),(8,4),(9,NULL),(10,NULL); INSERT INTO t2 VALUES (1,NULL),(2,NULL),(3,1),(4,2),(5,NULL),(6,NULL),(7,3),(8,4),(9,NULL),(10,NULL); explain select id from t1 where uniq_id is null; -table type possible_keys key key_len ref rows Extra -t1 ref idx1 idx1 5 const 1 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref idx1 idx1 5 const 1 where used explain select id from t1 where uniq_id =1; -table type possible_keys key key_len ref rows Extra -t1 const idx1 idx1 5 const 1 +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 const idx1 idx1 5 const 1 UPDATE t1 SET id=id+100 where uniq_id is null; UPDATE t2 SET id=id+100 where uniq_id is null; select id from t1 where uniq_id is null; diff --git a/mysql-test/r/odbc.result b/mysql-test/r/odbc.result index c696cf94e9d..eb6123075fe 100644 --- a/mysql-test/r/odbc.result +++ b/mysql-test/r/odbc.result @@ -10,6 +10,6 @@ a b select * from t1 where a is null; a b explain select * from t1 where b is null; -Comment -Impossible WHERE noticed after reading const tables +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST Impossible WHERE noticed after reading const tables drop table t1; diff --git a/mysql-test/r/order_by.result b/mysql-test/r/order_by.result index 9bc716ee8b9..08d52a782e1 100644 --- a/mysql-test/r/order_by.result +++ b/mysql-test/r/order_by.result @@ -263,14 +263,14 @@ drop table t1; create table t1 (a int not null, b int, c varchar(10), key (a, b, c)); insert into t1 values (1, NULL, NULL), (1, NULL, 'b'), (1, 1, NULL), (1, 1, 'b'), (1, 1, 'b'), (2, 1, 'a'), (2, 1, 'b'), (2, 2, 'a'), (2, 2, 'b'), (2, 3, 'c'),(1,3,'b'); explain select * from t1 where (a = 1 and b is null and c = 'b') or (a > 2) order by a desc; -table type possible_keys key key_len ref rows Extra -t1 range a a 20 NULL 2 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range a a 20 NULL 2 where used; Using index select * from t1 where (a = 1 and b is null and c = 'b') or (a > 2) order by a desc; a b c 1 NULL b explain select * from t1 where a >= 1 and a < 3 order by a desc; -table type possible_keys key key_len ref rows Extra -t1 range a a 4 NULL 10 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range a a 4 NULL 10 where used; Using index select * from t1 where a >= 1 and a < 3 order by a desc; a b c 2 3 c @@ -285,8 +285,8 @@ a b c 1 NULL b 1 NULL NULL explain select * from t1 where a = 1 order by a desc, b desc; -table type possible_keys key key_len ref rows Extra -t1 ref a a 4 const 5 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref a a 4 const 5 where used; Using index select * from t1 where a = 1 order by a desc, b desc; a b c 1 3 b @@ -296,35 +296,35 @@ a b c 1 NULL b 1 NULL NULL explain select * from t1 where a = 1 and b is null order by a desc, b desc; -table type possible_keys key key_len ref rows Extra -t1 ref a a 9 const,const 2 where used; Using index; Using filesort +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref a a 9 const,const 2 where used; Using index; Using filesort select * from t1 where a = 1 and b is null order by a desc, b desc; a b c 1 NULL NULL 1 NULL b explain select * from t1 where a >= 1 and a < 3 and b >0 order by a desc,b desc; -table type possible_keys key key_len ref rows Extra -t1 range a a 9 NULL 8 where used; Using index; Using filesort +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range a a 9 NULL 8 where used; Using index; Using filesort explain select * from t1 where a = 2 and b >0 order by a desc,b desc; -table type possible_keys key key_len ref rows Extra -t1 range a a 9 NULL 5 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range a a 9 NULL 5 where used; Using index explain select * from t1 where a = 2 and b is null order by a desc,b desc; -table type possible_keys key key_len ref rows Extra -t1 ref a a 9 const,const 1 where used; Using index; Using filesort +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref a a 9 const,const 1 where used; Using index; Using filesort explain select * from t1 where a = 2 and (b is null or b > 0) order by a desc,b desc; -table type possible_keys key key_len ref rows Extra -t1 range a a 9 NULL 6 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range a a 9 NULL 6 where used; Using index explain select * from t1 where a = 2 and b > 0 order by a desc,b desc; -table type possible_keys key key_len ref rows Extra -t1 range a a 9 NULL 5 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range a a 9 NULL 5 where used; Using index explain select * from t1 where a = 2 and b < 2 order by a desc,b desc; -table type possible_keys key key_len ref rows Extra -t1 range a a 9 NULL 2 where used; Using index; Using filesort +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range a a 9 NULL 2 where used; Using index; Using filesort alter table t1 modify b int not null, modify c varchar(10) not null; explain select * from t1 order by a, b, c; -table type possible_keys key key_len ref rows Extra -t1 index NULL a 18 NULL 11 Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 index NULL a 18 NULL 11 Using index select * from t1 order by a, b, c; a b c 1 0 @@ -339,8 +339,8 @@ a b c 2 2 b 2 3 c explain select * from t1 order by a desc, b desc, c desc; -table type possible_keys key key_len ref rows Extra -t1 index NULL a 18 NULL 11 Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 index NULL a 18 NULL 11 Using index select * from t1 order by a desc, b desc, c desc; a b c 2 3 c @@ -355,15 +355,15 @@ a b c 1 0 b 1 0 explain select * from t1 where (a = 1 and b = 1 and c = 'b') or (a > 2) order by a desc; -table type possible_keys key key_len ref rows Extra -t1 range a a 18 NULL 3 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range a a 18 NULL 3 where used; Using index select * from t1 where (a = 1 and b = 1 and c = 'b') or (a > 2) order by a desc; a b c 1 1 b 1 1 b explain select * from t1 where a < 2 and b <= 1 order by a desc, b desc; -table type possible_keys key key_len ref rows Extra -t1 range a a 4 NULL 6 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range a a 4 NULL 6 where used; Using index select * from t1 where a < 2 and b <= 1 order by a desc, b desc; a b c 1 1 b @@ -386,8 +386,8 @@ a b c 1 1 b 1 1 explain select * from t1 where a between 1 and 3 and b <= 1 order by a desc, b desc; -table type possible_keys key key_len ref rows Extra -t1 range a a 8 NULL 10 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range a a 8 NULL 10 where used; Using index select * from t1 where a between 1 and 3 and b <= 1 order by a desc, b desc; a b c 2 1 b @@ -398,8 +398,8 @@ a b c 1 0 b 1 0 explain select * from t1 where a between 0 and 1 order by a desc, b desc; -table type possible_keys key key_len ref rows Extra -t1 range a a 4 NULL 5 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 range a a 4 NULL 5 where used; Using index select * from t1 where a between 0 and 1 order by a desc, b desc; a b c 1 3 b @@ -449,25 +449,25 @@ gid sid uid 104505 5 117 103853 5 250 EXPLAIN select t1.gid, t2.sid, t3.uid from t3, t2, t1 where t2.gid = t1.gid and t2.uid = t3.uid order by t1.gid, t3.uid; -table type possible_keys key key_len ref rows Extra -t1 index PRIMARY PRIMARY 4 NULL 6 Using index -t2 eq_ref PRIMARY,uid PRIMARY 4 t1.gid 1 -t3 eq_ref PRIMARY PRIMARY 2 t2.uid 1 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 index PRIMARY PRIMARY 4 NULL 6 Using index +1 FIRST t2 eq_ref PRIMARY,uid PRIMARY 4 t1.gid 1 +1 FIRST t3 eq_ref PRIMARY PRIMARY 2 t2.uid 1 where used; Using index EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.gid = t3.uid order by t1.gid,t3.skr; -table type possible_keys key key_len ref rows Extra -t1 index PRIMARY PRIMARY 4 NULL 6 Using index -t3 eq_ref PRIMARY PRIMARY 2 t1.gid 1 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 index PRIMARY PRIMARY 4 NULL 6 Using index +1 FIRST t3 eq_ref PRIMARY PRIMARY 2 t1.gid 1 where used EXPLAIN SELECT t1.gid, t2.sid, t3.uid from t2, t1, t3 where t2.gid = t1.gid and t2.uid = t3.uid order by t3.uid, t1.gid; -table type possible_keys key key_len ref rows Extra -t1 index PRIMARY PRIMARY 4 NULL 6 Using index; Using temporary; Using filesort -t2 eq_ref PRIMARY,uid PRIMARY 4 t1.gid 1 -t3 eq_ref PRIMARY PRIMARY 2 t2.uid 1 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 index PRIMARY PRIMARY 4 NULL 6 Using index; Using temporary; Using filesort +1 FIRST t2 eq_ref PRIMARY,uid PRIMARY 4 t1.gid 1 +1 FIRST t3 eq_ref PRIMARY PRIMARY 2 t2.uid 1 where used; Using index EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.gid = t3.uid order by t3.skr,t1.gid; -table type possible_keys key key_len ref rows Extra -t1 index PRIMARY PRIMARY 4 NULL 6 Using index; Using temporary; Using filesort -t3 eq_ref PRIMARY PRIMARY 2 t1.gid 1 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 index PRIMARY PRIMARY 4 NULL 6 Using index; Using temporary; Using filesort +1 FIRST t3 eq_ref PRIMARY PRIMARY 2 t1.gid 1 where used EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.skr = t3.uid order by t1.gid,t3.skr; -table type possible_keys key key_len ref rows Extra -t1 ALL NULL NULL NULL NULL 6 Using temporary; Using filesort -t3 eq_ref PRIMARY PRIMARY 2 t1.skr 1 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL NULL NULL NULL NULL 6 Using temporary; Using filesort +1 FIRST t3 eq_ref PRIMARY PRIMARY 2 t1.skr 1 where used drop table t1,t2,t3; diff --git a/mysql-test/r/range.result b/mysql-test/r/range.result index a1d258455dc..722a1f5c62c 100644 --- a/mysql-test/r/range.result +++ b/mysql-test/r/range.result @@ -15,8 +15,8 @@ event_date type event_id 1999-07-13 100600 26 1999-07-14 100600 10 explain select event_date,type,event_id from t1 WHERE type = 100601 and event_date >= "1999-07-01" AND event_date < "1999-07-15" AND (type=100600 OR type=100100) ORDER BY event_date; -Comment -Impossible WHERE +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST Impossible WHERE select event_date,type,event_id from t1 WHERE event_date >= "1999-07-01" AND event_date <= "1999-07-15" AND (type=100600 OR type=100100) or event_date >= "1999-07-01" AND event_date <= "1999-07-15" AND type=100099; event_date type event_id 1999-07-10 100100 24 diff --git a/mysql-test/r/select.result b/mysql-test/r/select.result index 49ce0608fc5..8b3e2aa298e 100644 --- a/mysql-test/r/select.result +++ b/mysql-test/r/select.result @@ -1327,20 +1327,20 @@ fld3 select t2.fld3 from t2 where fld3 LIKE 'don_t_find_me_please%'; fld3 explain select t2.fld3 from t2 where fld3 = 'honeysuckle'; -table type possible_keys key key_len ref rows Extra -t2 ref fld3 fld3 30 const 1 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t2 ref fld3 fld3 30 const 1 where used; Using index explain select fld3 from t2 ignore index (fld3) where fld3 = 'honeysuckle'; -table type possible_keys key key_len ref rows Extra -t2 index NULL fld3 30 NULL 1199 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t2 index NULL fld3 30 NULL 1199 where used; Using index explain select fld3 from t2 use index (fld1) where fld3 = 'honeysuckle'; -table type possible_keys key key_len ref rows Extra -t2 index NULL fld3 30 NULL 1199 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t2 index NULL fld3 30 NULL 1199 where used; Using index explain select fld3 from t2 use index (fld3) where fld3 = 'honeysuckle'; -table type possible_keys key key_len ref rows Extra -t2 ref fld3 fld3 30 const 1 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t2 ref fld3 fld3 30 const 1 where used; Using index explain select fld3 from t2 use index (fld1,fld3) where fld3 = 'honeysuckle'; -table type possible_keys key key_len ref rows Extra -t2 ref fld3 fld3 30 const 1 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t2 ref fld3 fld3 30 const 1 where used; Using index explain select fld3 from t2 ignore index (fld3,not_used); Key column 'not_used' doesn't exist in table explain select fld3 from t2 use index (not_used); @@ -1350,8 +1350,8 @@ fld3 honeysuckle honoring explain select t2.fld3 from t2 where fld3 >= 'honeysuckle' and fld3 <= 'honoring' order by fld3; -table type possible_keys key key_len ref rows Extra -t2 range fld3 fld3 30 NULL 2 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t2 range fld3 fld3 30 NULL 2 where used; Using index select fld1,fld3 from t2 where fld3="Colombo" or fld3 = "nondecreasing" order by fld3; fld1 fld3 148504 Colombo @@ -1370,8 +1370,8 @@ fld1 250501 250502 explain select fld1 from t2 where fld1=250501 or fld1="250502"; -table type possible_keys key key_len ref rows Extra -t2 range fld1 fld1 4 NULL 2 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t2 range fld1 fld1 4 NULL 2 where used; Using index select fld1 from t2 where fld1=250501 or fld1=250502 or fld1 >= 250505 and fld1 <= 250601 or fld1 between 250501 and 250502; fld1 250501 @@ -1379,8 +1379,8 @@ fld1 250505 250601 explain select fld1 from t2 where fld1=250501 or fld1=250502 or fld1 >= 250505 and fld1 <= 250601 or fld1 between 250501 and 250502; -table type possible_keys key key_len ref rows Extra -t2 range fld1 fld1 4 NULL 4 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t2 range fld1 fld1 4 NULL 4 where used; Using index select fld1,fld3 from t2 where companynr = 37 and fld3 like 'f%'; fld1 fld3 218401 faithful @@ -1806,9 +1806,9 @@ companynr rtrim(space(512+companynr)) select distinct fld3 from t2,t3 where t2.companynr = 34 and t2.fld1=t3.t2nr order by fld3; fld3 explain select t3.t2nr,fld3 from t2,t3 where t2.companynr = 34 and t2.fld1=t3.t2nr order by t3.t2nr,fld3; -table type possible_keys key key_len ref rows Extra -t2 ALL fld1 NULL NULL NULL 1199 where used; Using temporary; Using filesort -t3 eq_ref PRIMARY PRIMARY 4 t2.fld1 1 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t2 ALL fld1 NULL NULL NULL 1199 where used; Using temporary; Using filesort +1 FIRST t3 eq_ref PRIMARY PRIMARY 4 t2.fld1 1 where used; Using index select period from t1; period 9410 @@ -1821,9 +1821,9 @@ select fld3,period from t2,t3 where t2.fld1 = 011401 and t2.fld1=t3.t2nr and t3. fld3 period breaking 1001 explain select fld3,period from t2,t3 where t2.fld1 = 011401 and t3.t2nr=t2.fld1 and 1001 = t3.period; -table type possible_keys key key_len ref rows Extra -t2 const fld1 fld1 4 const 1 -t3 const PRIMARY,period PRIMARY 4 const 1 +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t2 const fld1 fld1 4 const 1 +1 FIRST t3 const PRIMARY,period PRIMARY 4 const 1 select fld3,period from t2,t1 where companynr*10 = 37*10; fld3 period breaking 9410 @@ -2561,21 +2561,21 @@ fld1 fld1 select t2.companynr,companyname from t2 left join t4 using (companynr) where t4.companynr is null; companynr companyname explain select t2.companynr,companyname from t2 left join t4 using (companynr) where t4.companynr is null; -table type possible_keys key key_len ref rows Extra -t2 ALL NULL NULL NULL NULL 1199 -t4 eq_ref PRIMARY PRIMARY 1 test.t2.companynr 1 where used; Not exists +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t2 ALL NULL NULL NULL NULL 1199 +1 FIRST t4 eq_ref PRIMARY PRIMARY 1 test.t2.companynr 1 where used; Not exists explain select t2.companynr,companyname from t4 left join t2 using (companynr) where t2.companynr is null; -table type possible_keys key key_len ref rows Extra -t4 ALL NULL NULL NULL NULL 12 -t2 ALL NULL NULL NULL NULL 1199 where used; Not exists +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t4 ALL NULL NULL NULL NULL 12 +1 FIRST t2 ALL NULL NULL NULL NULL 1199 where used; Not exists select distinct t2.companynr,t4.companynr from t2,t4 where t2.companynr=t4.companynr+1; companynr companynr 37 36 41 40 explain select distinct t2.companynr,t4.companynr from t2,t4 where t2.companynr=t4.companynr+1; -table type possible_keys key key_len ref rows Extra -t2 ALL NULL NULL NULL NULL 1199 Using temporary -t4 index NULL PRIMARY 1 NULL 12 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t2 ALL NULL NULL NULL NULL 1199 Using temporary +1 FIRST t4 index NULL PRIMARY 1 NULL 12 where used; Using index select t2.fld1,t2.companynr,fld3,period from t3,t2 where t2.fld1 = 38208 and t2.fld1=t3.t2nr and period = 1008 or t2.fld1 = 38008 and t2.fld1 =t3.t2nr and period = 1008; fld1 companynr fld3 period 038008 37 reporters 1008 @@ -3084,11 +3084,11 @@ select t2.fld1,sum(price) from t3,t2 where t2.fld1 = t3.t2nr and t3.companynr = fld1 sum(price) 038008 234298 explain select fld3 from t2 where 1>2 or 2>3; -Comment -Impossible WHERE +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST Impossible WHERE explain select fld3 from t2 where fld1=fld1; -table type possible_keys key key_len ref rows Extra -t2 ALL NULL NULL NULL NULL 1199 +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t2 ALL NULL NULL NULL NULL 1199 select companynr,fld1 from t2 HAVING fld1=250501 or fld1=250502; companynr fld1 34 250501 @@ -3139,8 +3139,8 @@ select count(*) from t3 where companynr=512 and price2=76234234; count(*) 4181 explain select min(fld1),max(fld1),count(*) from t2; -Comment -Select tables optimized away +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST Select tables optimized away select min(fld1),max(fld1),count(*) from t2; min(fld1) max(fld1) count(*) 0 1232609 1199 diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index dada87803ad..54528f58697 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -46,6 +46,13 @@ a b 2 7 3 8 4 8 +explain select * from t2 where t2.b=(select a from t3 order by 1 desc limit 1) +union (select * from t4 where t4.b=(select max(t2.a)*4 from t2) order by a); +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t2 ALL NULL NULL NULL NULL 2 where used +3 UNION t4 ALL NULL NULL NULL NULL 3 where used; Using filesort +4 SUBSELECT t2 ALL NULL NULL NULL NULL 2 +2 SUBSELECT t3 ALL NULL NULL NULL NULL 3 Using filesort select (select a from t3 where a1) as tt; (select t3.a from t3 where a<8 order by 1 desc limit 1) a 7 2 +explain select (select t3.a from t3 where a<8 order by 1 desc limit 1), a from +(select * from t2 where a>1) as tt; +id select_type table type possible_keys key key_len ref rows Extra +3 DERIVED t2 ALL NULL NULL NULL NULL 2 where used +1 FIRST system NULL NULL NULL NULL 1 +2 SUBSELECT t3 ALL NULL NULL NULL NULL 3 where used; Using filesort select * from t1 where t1.a=(select t2.a from t2 where t2.b=(select max(a) from t3) order by 1 desc limit 1); a 2 @@ -67,6 +80,11 @@ b (select avg(t2.a+(select min(t3.a) from t3 where t3.a >= t4.a)) from t2) 8 7.5000 8 4.5000 9 7.5000 +explain select b,(select avg(t2.a+(select min(t3.a) from t3 where t3.a >= t4.a)) from t2) from t4; +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t4 ALL NULL NULL NULL NULL 3 +2 DEPENDENT SUBSELECT t2 ALL NULL NULL NULL NULL 2 +3 DEPENDENT SUBSELECT t3 ALL NULL NULL NULL NULL 3 where used select * from t3 where exists (select * from t2 where t2.b=t3.a); a 7 @@ -97,6 +115,11 @@ select (select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a) (select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a) a NULL 1 2 2 +explain select (select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a), a from t2; +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t2 ALL NULL NULL NULL NULL 2 +2 DEPENDENT SUBSELECT t1 system NULL NULL NULL NULL 1 where used +3 DEPENDENT UNION t5 ALL NULL NULL NULL NULL 2 where used select (select a from t1 where t1.a=t2.a union all select a from t5 where t5.a=t2.a), a from t2; Subselect return more than 1 record create table attend (patient_uq int, clinic_uq int, index i1 (clinic_uq)); diff --git a/mysql-test/r/type_datetime.result b/mysql-test/r/type_datetime.result index cae15d4f665..51148cd12e9 100644 --- a/mysql-test/r/type_datetime.result +++ b/mysql-test/r/type_datetime.result @@ -75,6 +75,6 @@ date numfacture expedition 0000-00-00 00:00:00 0 0001-00-00 00:00:00 0000-00-00 00:00:00 1212 0001-00-00 00:00:00 EXPLAIN SELECT * FROM t1 WHERE expedition='0001-00-00 00:00:00'; -table type possible_keys key key_len ref rows Extra -t1 ref expedition expedition 8 const 1 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref expedition expedition 8 const 1 where used drop table t1; diff --git a/mysql-test/r/union.result b/mysql-test/r/union.result index 29b925b6746..86f62d11bdb 100644 --- a/mysql-test/r/union.result +++ b/mysql-test/r/union.result @@ -85,35 +85,31 @@ a b 2 b 1 a explain (select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1) order by b desc; -table type possible_keys key key_len ref rows Extra -t1 ALL NULL NULL NULL NULL 4 -t2 ALL NULL NULL NULL NULL 4 Using filesort -(select sql_calc_found_rows a,b from t1 limit 2) union all (select a,b from t2 order by a) limit 2; -a b -1 a -2 b +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL NULL NULL NULL NULL 4 +2 UNION t2 ALL NULL NULL NULL NULL 4 Using filesort select found_rows(); FOUND_ROWS() -6 +0 explain select a,b from t1 union all select a,b from t2; -table type possible_keys key key_len ref rows Extra -t1 ALL NULL NULL NULL NULL 4 -t2 ALL NULL NULL NULL NULL 4 +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL NULL NULL NULL NULL 4 +2 UNION t2 ALL NULL NULL NULL NULL 4 explain select xx from t1 union select 1; Unknown column 'xx' in 'field list' explain select a,b from t1 union select 1; -table type possible_keys key key_len ref rows Extra -t1 ALL NULL NULL NULL NULL 4 - 0 0 No tables used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL NULL NULL NULL NULL 4 +2 UNION No tables used explain select 1 union select a,b from t1 union select 1; -table type possible_keys key key_len ref rows Extra - 0 0 No tables used -t1 ALL NULL NULL NULL NULL 4 - 0 0 No tables used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST No tables used +2 UNION t1 ALL NULL NULL NULL NULL 4 +3 UNION No tables used explain select a,b from t1 union select 1 limit 0; -table type possible_keys key key_len ref rows Extra -t1 ALL NULL NULL NULL NULL 4 - 0 0 Impossible WHERE +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST Impossible WHERE +2 UNION Impossible WHERE select a,b from t1 into outfile 'skr' union select a,b from t2; Wrong usage of UNION and INTO select a,b from t1 order by a union select a,b from t2; diff --git a/mysql-test/r/user_var.result b/mysql-test/r/user_var.result index 5c8b4581c5c..10cb4fe5c8e 100644 --- a/mysql-test/r/user_var.result +++ b/mysql-test/r/user_var.result @@ -18,15 +18,15 @@ i @vv1:=if(sv1.i,1,0) @vv2:=if(sv2.i,1,0) @vv3:=if(sv3.i,1,0) @vv1+@vv2+@vv3 1 1 0 1 2 2 1 0 0 1 explain select * from t1 where i=@vv1; -table type possible_keys key key_len ref rows Extra -t1 ref i i 4 const 1 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref i i 4 const 1 where used explain select * from t1 where @vv1:=@vv1+1 and i=@vv1; -table type possible_keys key key_len ref rows Extra -t1 ALL NULL NULL NULL NULL 3 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ALL NULL NULL NULL NULL 3 where used explain select @vv1:=i from t1 where i=@vv1; -table type possible_keys key key_len ref rows Extra -t1 index NULL i 4 NULL 3 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 index NULL i 4 NULL 3 where used; Using index explain select * from t1 where i=@vv1; -table type possible_keys key key_len ref rows Extra -t1 ref i i 4 const 1 where used +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 ref i i 4 const 1 where used drop table t1,t2; diff --git a/mysql-test/r/varbinary.result b/mysql-test/r/varbinary.result index a63db14b736..a7bd29afd78 100644 --- a/mysql-test/r/varbinary.result +++ b/mysql-test/r/varbinary.result @@ -11,8 +11,8 @@ create table t1 (ID int(8) unsigned zerofill not null auto_increment,UNIQ bigint insert into t1 set UNIQ=0x38afba1d73e6a18a; insert into t1 set UNIQ=123; explain select * from t1 where UNIQ=0x38afba1d73e6a18a; -table type possible_keys key key_len ref rows Extra -t1 const UNIQ UNIQ 8 const 1 +id select_type table type possible_keys key key_len ref rows Extra +1 FIRST t1 const UNIQ UNIQ 8 const 1 drop table t1; select x'hello'; You have an error in your SQL syntax near 'x'hello'' at line 1 diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 8b9ed3b89c9..68a89796ec3 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -19,13 +19,18 @@ select * from t2 where t2.b=(select a from t3 order by 1 desc limit 1) union (select * from t4 order by a limit 2) limit 3; select * from t2 where t2.b=(select a from t3 order by 1 desc limit 1) union (select * from t4 where t4.b=(select max(t2.a)*4 from t2) order by a); +explain select * from t2 where t2.b=(select a from t3 order by 1 desc limit 1) +union (select * from t4 where t4.b=(select max(t2.a)*4 from t2) order by a); select (select a from t3 where a1) as tt; +explain select (select t3.a from t3 where a<8 order by 1 desc limit 1), a from +(select * from t2 where a>1) as tt; select * from t1 where t1.a=(select t2.a from t2 where t2.b=(select max(a) from t3) order by 1 desc limit 1); select * from t1 where t1.a=(select t2.a from t2 where t2.b=(select max(a) from t3 where t3.a > t1.a) order by 1 desc limit 1); select * from t1 where t1.a=(select t2.a from t2 where t2.b=(select max(a) from t3 where t3.a < t1.a) order by 1 desc limit 1); select b,(select avg(t2.a+(select min(t3.a) from t3 where t3.a >= t4.a)) from t2) from t4; +explain select b,(select avg(t2.a+(select min(t3.a) from t3 where t3.a >= t4.a)) from t2) from t4; select * from t3 where exists (select * from t2 where t2.b=t3.a); select * from t3 where not exists (select * from t2 where t2.b=t3.a); insert into t4 values (12,7),(1,7),(10,9),(9,6),(7,6),(3,9); @@ -39,6 +44,7 @@ insert into t5 values (5); select (select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a), a from t2; insert into t5 values (2); select (select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a), a from t2; +explain select (select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a), a from t2; -- error 1230 select (select a from t1 where t1.a=t2.a union all select a from t5 where t5.a=t2.a), a from t2; create table attend (patient_uq int, clinic_uq int, index i1 (clinic_uq)); diff --git a/mysql-test/t/union.test b/mysql-test/t/union.test index f5a92b05e0d..8f8f666bf55 100644 --- a/mysql-test/t/union.test +++ b/mysql-test/t/union.test @@ -21,7 +21,7 @@ select 't1',b,count(*) from t1 group by b UNION select 't2',b,count(*) from t2 g (select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1); (select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1) order by b desc; explain (select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1) order by b desc; -(select sql_calc_found_rows a,b from t1 limit 2) union all (select a,b from t2 order by a) limit 2; +#(select sql_calc_found_rows a,b from t1 limit 2) union all (select a,b from t2 order by a) limit 2; select found_rows(); # Test some error conditions with UNION explain select a,b from t1 union all select a,b from t2; diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index d3901770230..dbf853431d6 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -373,9 +373,14 @@ int handle_select(THD *thd, LEX *lex, select_result *result); int mysql_select(THD *thd,TABLE_LIST *tables,List &list,COND *conds, ORDER *order, ORDER *group,Item *having,ORDER *proc_param, ulong select_type,select_result *result, - SELECT_LEX_UNIT *unit, bool fake_select_lex); + SELECT_LEX_UNIT *unit, SELECT_LEX *select_lex, + bool fake_select_lex); +void fix_tables_pointers(SELECT_LEX *select_lex); +int mysql_explain_select(THD *thd, SELECT_LEX *sl, char const *type, + select_result *result); int mysql_union(THD *thd, LEX *lex,select_result *result); -int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *s, TABLE_LIST *t); +int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *s, TABLE_LIST *t, + bool tables_is_opened); Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, Item_result_field ***copy_func, Field **from_field, bool group,bool modify_item); diff --git a/sql/sql_class.cc b/sql/sql_class.cc index b84bcf1df72..c090f2336c1 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -357,6 +357,28 @@ CHANGED_TABLE_LIST* THD::changed_table_dup(TABLE *table) return new_table; } +int THD::send_explain_fields(select_result *result) +{ + List field_list; + Item *item; + field_list.push_back(new Item_int("id",0,3)); + field_list.push_back(new Item_empty_string("select_type",19)); + field_list.push_back(new Item_empty_string("table",NAME_LEN)); + field_list.push_back(new Item_empty_string("type",10)); + field_list.push_back(item=new Item_empty_string("possible_keys", + NAME_LEN*MAX_KEY)); + item->maybe_null=1; + field_list.push_back(item=new Item_empty_string("key",NAME_LEN)); + item->maybe_null=1; + field_list.push_back(item=new Item_int("key_len",0,3)); + item->maybe_null=1; + field_list.push_back(item=new Item_empty_string("ref", + NAME_LEN*MAX_REF_PARTS)); + item->maybe_null=1; + field_list.push_back(new Item_real("rows",0.0,0,10)); + field_list.push_back(new Item_empty_string("Extra",255)); + return (result->send_fields(field_list,1)); +} /***************************************************************************** ** Functions to provide a interface to select results diff --git a/sql/sql_class.h b/sql/sql_class.h index 82241f0ff1f..7be9a5ad9fe 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -315,6 +315,7 @@ public: }; class delayed_insert; +class select_result; #define THD_SENTRY_MAGIC 0xfeedd1ff #define THD_SENTRY_GONE 0xdeadbeef @@ -442,6 +443,7 @@ public: uint server_status,open_options; uint32 query_length; uint32 db_length; + uint select_number; //number of select (used for EXPLAIN) enum_tx_isolation tx_isolation, session_tx_isolation; char scramble[9]; uint8 query_cache_type; // type of query cache processing @@ -576,6 +578,7 @@ public: } void add_changed_table(TABLE *table); CHANGED_TABLE_LIST * changed_table_dup(TABLE *table); + int send_explain_fields(select_result *result); }; /* diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index cde120f3774..539a9edb479 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -28,7 +28,8 @@ static const char *any_db="*any*"; // Special symbol for check_access -int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t) +int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t, + bool tables_is_opened) { /* TODO: make derived tables with union inside (now only 1 SELECT may be @@ -37,7 +38,7 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t) SELECT_LEX *sl= unit->first_select(); List item_list; TABLE *table; - int res; + int res= 0; select_union *derived_result; TABLE_LIST *tables= (TABLE_LIST *)sl->table_list.first; TMP_TABLE_PARAM tmp_table_param; @@ -56,7 +57,8 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t) { if (cursor->derived) { - res=mysql_derived(thd, lex, (SELECT_LEX_UNIT *)cursor->derived, cursor); + res=mysql_derived(thd, lex, (SELECT_LEX_UNIT *)cursor->derived, + cursor, 0); if (res) DBUG_RETURN(res); } } @@ -66,7 +68,7 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t) while ((item= it++)) item_list.push_back(item); - if (!(res=open_and_lock_tables(thd,tables))) + if (tables_is_opened || !(res=open_and_lock_tables(thd,tables))) { if (tables && setup_fields(thd,tables,item_list,0,0,1)) { @@ -94,12 +96,12 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t) if (unit->select_limit_cnt == HA_POS_ERROR) sl->options&= ~OPTION_FOUND_ROWS; - res=mysql_select(thd, tables, sl->item_list, - sl->where, (ORDER *) sl->order_list.first, - (ORDER*) sl->group_list.first, - sl->having, (ORDER*) NULL, - sl->options | thd->options | SELECT_NO_UNLOCK, - derived_result, unit, 0); + res= mysql_select(thd, tables, sl->item_list, + sl->where, (ORDER *) sl->order_list.first, + (ORDER*) sl->group_list.first, + sl->having, (ORDER*) NULL, + sl->options | thd->options | SELECT_NO_UNLOCK, + derived_result, unit, sl, 0); if (!res) { // Here we entirely fix both TABLE_LIST and list of SELECT's as there were no derived tables @@ -109,6 +111,7 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t) { t->real_name=table->real_name; t->table=table; + table->derived_select_number= sl->select_number; sl->exclude(); t->derived=(SELECT_LEX *)0; // just in case ... } diff --git a/sql/sql_lex.h b/sql/sql_lex.h index b75826663ca..e6054f5604b 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -282,8 +282,10 @@ public: List *ftfunc_list; List ftfunc_list_alloc; JOIN *join; /* after JOIN::prepare it is pointer to corresponding JOIN */ + const char *type; /* type of select for EXPLAIN */ uint in_sum_expr; - bool create_refs, + uint select_number; /* number of select (used for EXPLAIN) */ + bool create_refs, braces, /* SELECT ... UNION (SELECT ... ) <- this braces */ depended, /* depended from outer select subselect */ /* TRUE when having fix field called in processing of this SELECT */ diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 9977eaad0ff..8166a156b8c 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1254,7 +1254,7 @@ mysql_execute_command(void) THD *thd= current_thd; LEX *lex= &thd->lex; TABLE_LIST *tables= (TABLE_LIST*) lex->select_lex.table_list.first; - SELECT_LEX *select_lex= lex->select; + SELECT_LEX *select_lex= &lex->select_lex; SELECT_LEX_UNIT *unit= &lex->unit; DBUG_ENTER("mysql_execute_command"); @@ -1281,18 +1281,69 @@ mysql_execute_command(void) #endif } + select_result *explain_result= 0; /* - Skip if we are in the slave thread, some table rules have been given - and the table list says the query should not be replicated + TODO: make derived tables processing 'inside' SELECT processing. + TODO: solve problem with depended derived tables in subselects */ - if (lex->derived_tables) + if (lex->sql_command == SQLCOM_SELECT && + (select_lex->options & SELECT_DESCRIBE) && + lex->derived_tables) + { + if (!(explain_result= new select_send())) + { + send_error(&thd->net, ER_OUT_OF_RESOURCES); + DBUG_VOID_RETURN; + } + //check rights + for (TABLE_LIST *cursor= tables; + cursor; + cursor= cursor->next) + if (cursor->derived) + { + TABLE_LIST *tables= + (TABLE_LIST *)((SELECT_LEX_UNIT *) + cursor->derived)->first_select()->table_list.first; + int res; + if (tables) + res= check_table_access(thd,SELECT_ACL, tables); + else + res= check_access(thd, SELECT_ACL, any_db); + if (res) + DBUG_VOID_RETURN; + } + thd->send_explain_fields(explain_result); + // EXPLAIN derived tables + for (TABLE_LIST *cursor= tables; + cursor; + cursor= cursor->next) + if (cursor->derived) + { + SELECT_LEX *select_lex= ((SELECT_LEX_UNIT *) + cursor->derived)->first_select(); + if (!open_and_lock_tables(thd, + (TABLE_LIST*) select_lex->table_list.first)) + { + mysql_explain_select(thd, select_lex, + "DERIVED", explain_result); + // execute derived table SELECT to provide table for other SELECTs + if (mysql_derived(thd, lex, (SELECT_LEX_UNIT *)cursor->derived, + cursor, 1)) + DBUG_VOID_RETURN; + } + else + DBUG_VOID_RETURN; + } + + } + else if (lex->derived_tables) { for (TABLE_LIST *cursor= tables; cursor; cursor= cursor->next) if (cursor->derived && mysql_derived(thd, lex, (SELECT_LEX_UNIT *)cursor->derived, - cursor)) + cursor, 0)) DBUG_VOID_RETURN; } if ((lex->select_lex.next_select_in_list() && @@ -1374,8 +1425,44 @@ mysql_execute_command(void) if (!(res=open_and_lock_tables(thd,tables))) { - query_cache_store_query(thd, tables); - res=handle_select(thd, lex, result); + if (select_lex->options & SELECT_DESCRIBE) + { + delete result; // we do not need it for explain + if (!explain_result) + if (!(explain_result= new select_send())) + { + send_error(&thd->net, ER_OUT_OF_RESOURCES); + DBUG_VOID_RETURN; + } + else + thd->send_explain_fields(explain_result); + fix_tables_pointers(select_lex); + for ( SELECT_LEX *sl= select_lex; + sl && res == 0; + sl= sl->next_select_in_list()) + { + SELECT_LEX *first= sl->master_unit()->first_select(); + res= mysql_explain_select(thd, sl, + ((select_lex==sl)?"FIRST": + ((sl == first)? + ((sl->depended)?"DEPENDENT SUBSELECT": + "SUBSELECT"): + ((sl->depended)?"DEPENDENT UNION": + "UNION"))), + explain_result); + } + if (res > 0) + res= -res; // mysql_explain_select do not report error + MYSQL_LOCK *save_lock= thd->lock; + thd->lock= (MYSQL_LOCK *)0; + explain_result->send_eof(); + thd->lock= save_lock; + } + else + { + query_cache_store_query(thd, tables); + res=handle_select(thd, lex, result); + } } else delete result; @@ -1866,7 +1953,7 @@ mysql_execute_command(void) (ORDER *)NULL, select_lex->options | thd->options | SELECT_NO_JOIN_CACHE, - result, unit, 0); + result, unit, select_lex, 0); delete result; } else @@ -2037,7 +2124,7 @@ mysql_execute_command(void) (ORDER *)NULL, select_lex->options | thd->options | SELECT_NO_JOIN_CACHE, - result, unit, 0); + result, unit, select_lex, 0); delete result; } else @@ -2803,6 +2890,7 @@ mysql_init_query(THD *thd) thd->lex.unit.global_parameters= &thd->lex.select_lex; //Global limit & order thd->lex.select_lex.master= &thd->lex.unit; thd->lex.select_lex.prev= &thd->lex.unit.slave; + thd->select_number= thd->lex.select_lex.select_number= 1; thd->lex.value_list.empty(); thd->free_list= 0; thd->lex.union_option= 0; @@ -2832,6 +2920,7 @@ bool mysql_new_select(LEX *lex, bool move_down) { SELECT_LEX *select_lex = (SELECT_LEX *) lex->thd->calloc(sizeof(SELECT_LEX)); + select_lex->select_number= ++lex->thd->select_number; if (!select_lex) return 1; select_lex->init_query(); @@ -2874,6 +2963,7 @@ mysql_parse(THD *thd, char *inBuf, uint length) mysql_init_query(thd); thd->query_length = length; + thd->lex.derived_tables= false; if (query_cache_send_result_to_client(thd, inBuf, length) <= 0) { LEX *lex=lex_start(thd, (uchar*) inBuf, length); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index d071743aec4..b87a79cc2c6 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -144,7 +144,6 @@ static void init_sum_functions(Item_sum **func); static bool update_sum_func(Item_sum **func); static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, bool distinct, const char *message=NullS); -static void describe_info(THD *thd, const char *info); /* This handles SELECT with and without UNION @@ -154,19 +153,7 @@ int handle_select(THD *thd, LEX *lex, select_result *result) { int res; register SELECT_LEX *select_lex = &lex->select_lex; - if (select_lex->next_select_in_list()) - { - /* Fix tables 'to-be-unioned-from' list to point at opened tables */ - for (SELECT_LEX *sl= select_lex; - sl; - sl= sl->next_select_in_list()) - { - for (TABLE_LIST *cursor= (TABLE_LIST *)sl->table_list.first; - cursor; - cursor=cursor->next) - cursor->table= cursor->table_list->table; - } - } + fix_tables_pointers(select_lex); if (select_lex->next_select()) res=mysql_union(thd,lex,result); else @@ -178,7 +165,7 @@ int handle_select(THD *thd, LEX *lex, select_result *result) select_lex->having, (ORDER*) lex->proc_list.first, select_lex->options | thd->options, - result, &(lex->unit), 0); + result, &(lex->unit), &(lex->select_lex), 0); if (res && result) result->abort(); if (res || thd->net.report_error) @@ -190,6 +177,22 @@ int handle_select(THD *thd, LEX *lex, select_result *result) return res; } +void fix_tables_pointers(SELECT_LEX *select_lex) +{ + if (select_lex->next_select_in_list()) + { + /* Fix tables 'to-be-unioned-from' list to point at opened tables */ + for (SELECT_LEX *sl= select_lex; + sl; + sl= sl->next_select_in_list()) + { + for (TABLE_LIST *cursor= (TABLE_LIST *)sl->table_list.first; + cursor; + cursor=cursor->next) + cursor->table= cursor->table_list->table; + } + } +} /***************************************************************************** ** check fields, find best join, do the select and output fields. @@ -209,7 +212,7 @@ JOIN::prepare(TABLE_LIST *tables_init, SELECT_LEX_UNIT *unit, bool fake_select_lex) { DBUG_ENTER("JOIN::prepare"); - + conds= conds_init; order= order_init; group_list= group_init; @@ -344,7 +347,7 @@ int JOIN::optimize() { DBUG_ENTER("JOIN::optimize"); - + #ifdef HAVE_REF_TO_FIELDS // Not done yet /* Add HAVING to WHERE if possible */ if (having && !group_list && ! sum_func_count) @@ -389,11 +392,8 @@ JOIN::optimize() } if (select_options & SELECT_DESCRIBE) { - if (union_part) - select_describe(this, false, false, false, - "Select tables optimized away"); - else - describe_info(thd, "Select tables optimized away"); + select_describe(this, false, false, false, + "Select tables optimized away"); delete procedure; DBUG_RETURN(1); } @@ -647,10 +647,7 @@ JOIN::exec() error=0; if (select_options & SELECT_DESCRIBE) { - if (union_part) - select_describe(this, false, false, false, "No tables used"); - else - describe_info(thd, "No tables used"); + select_describe(this, false, false, false, "No tables used"); } else { @@ -674,16 +671,16 @@ JOIN::exec() if (zero_result_cause) { - if (select_options & SELECT_DESCRIBE && union_part) + if (select_options & SELECT_DESCRIBE) select_describe(this, false, false, false, zero_result_cause); else - error=return_zero_rows(result, tables_list, fields_list, - tmp_table_param.sum_func_count != 0 && - !group_list, - select_options, - zero_result_cause, - having,procedure, - unit); + error= return_zero_rows(result, tables_list, fields_list, + tmp_table_param.sum_func_count != 0 && + !group_list, + select_options, + zero_result_cause, + having,procedure, + unit); DBUG_VOID_RETURN; } @@ -1004,7 +1001,8 @@ int mysql_select(THD *thd, TABLE_LIST *tables, List &fields, COND *conds, ORDER *order, ORDER *group,Item *having, ORDER *proc_param, ulong select_options, select_result *result, - SELECT_LEX_UNIT *unit, bool fake_select_lex) + SELECT_LEX_UNIT *unit, SELECT_LEX *select_lex, + bool fake_select_lex) { JOIN *join = new JOIN(thd, fields, select_options, result); @@ -1013,7 +1011,7 @@ mysql_select(THD *thd, TABLE_LIST *tables, List &fields, COND *conds, thd->used_tables=0; // Updated by setup_fields if (join->prepare(tables, conds, order, group, having, proc_param, - &(thd->lex.select_lex), unit, fake_select_lex)) + select_lex, unit, fake_select_lex)) { DBUG_RETURN(-1); } @@ -3087,11 +3085,6 @@ return_zero_rows(select_result *result,TABLE_LIST *tables,List &fields, { DBUG_ENTER("return_zero_rows"); - if (select_options & SELECT_DESCRIBE) - { - describe_info(current_thd, info); - DBUG_RETURN(0); - } if (procedure) { if (result->prepare(fields, unit)) // This hasn't been done yet @@ -3725,6 +3718,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List &fields, table->blob_ptr_size=mi_portable_sizeof_char_ptr; table->map=1; table->tmp_table= TMP_TABLE; + table->derived_select_number= 0; table->db_low_byte_first=1; // True for HEAP and MyISAM table->temp_pool_slot = temp_pool_slot; @@ -7139,7 +7133,6 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, Item *item; List item_list; THD *thd=join->thd; - MYSQL_LOCK *save_lock; SELECT_LEX *select_lex = &(join->thd->lex.select_lex); select_result *result=join->result; DBUG_ENTER("select_describe"); @@ -7147,28 +7140,13 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, /* Don't log this into the slow query log */ select_lex->options&= ~(QUERY_NO_INDEX_USED | QUERY_NO_GOOD_INDEX_USED); join->unit->offset_limit_cnt= 0; - if (thd->lex.select == select_lex) - { - field_list.push_back(new Item_empty_string("table",NAME_LEN)); - field_list.push_back(new Item_empty_string("type",10)); - field_list.push_back(item=new Item_empty_string("possible_keys", - NAME_LEN*MAX_KEY)); - item->maybe_null=1; - field_list.push_back(item=new Item_empty_string("key",NAME_LEN)); - item->maybe_null=1; - field_list.push_back(item=new Item_int("key_len",0,3)); - item->maybe_null=1; - field_list.push_back(item=new Item_empty_string("ref", - NAME_LEN*MAX_REF_PARTS)); - item->maybe_null=1; - field_list.push_back(new Item_real("rows",0.0,0,10)); - field_list.push_back(new Item_empty_string("Extra",255)); - if (result->send_fields(field_list,1)) - return; - } if (message) { + item_list.push_back(new Item_int((int)thd->lex.select->select_number)); + item_list.push_back(new Item_string(thd->lex.select->type, + strlen(thd->lex.select->type), + default_charset_info)); item_list.push_back(new Item_empty_string("",0)); item_list.push_back(new Item_empty_string("",0)); item_list.push_back(new Item_empty_string("",0)); @@ -7192,9 +7170,24 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, String tmp1(buff1,sizeof(buff1),default_charset_info); String tmp2(buff2,sizeof(buff2),default_charset_info); item_list.empty(); + item_list.push_back(new Item_int((int)thd->lex.select->select_number)); + item_list.push_back(new Item_string(thd->lex.select->type, + strlen(thd->lex.select->type), + default_charset_info)); if (tab->type == JT_ALL && tab->select && tab->select->quick) tab->type= JT_RANGE; - item_list.push_back(new Item_string(table->table_name,strlen(table->table_name),default_charset_info)); + if (table->tmp_table == TMP_TABLE && table->derived_select_number != 0) + { + // Derived table name generation + buff[512]; + int len= my_snprintf(buff, 512, "", + table->derived_select_number); + item_list.push_back(new Item_string(buff, len, default_charset_info)); + } + else + item_list.push_back(new Item_string(table->table_name, + strlen(table->table_name), + default_charset_info)); item_list.push_back(new Item_string(join_type_str[tab->type],strlen(join_type_str[tab->type]),default_charset_info)); tmp1.length(0); tmp2.length(0); key_map bits; @@ -7311,29 +7304,25 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, result->send_error(0,NullS); } } - if (!join->thd->lex.select->next_select()) - { - save_lock=thd->lock; - thd->lock=(MYSQL_LOCK *)0; - result->send_eof(); - thd->lock=save_lock; - } DBUG_VOID_RETURN; } - -static void describe_info(THD *thd, const char *info) +int mysql_explain_select(THD *thd, SELECT_LEX *select_lex, char const *type, + select_result *result) { - List field_list; - String *packet= &thd->packet; + select_lex->type= type; + thd->lex.select= select_lex; + SELECT_LEX_UNIT *unit= select_lex->master_unit(); + int res= mysql_select(thd,(TABLE_LIST*) select_lex->table_list.first, + select_lex->item_list, + select_lex->where, + (ORDER*) select_lex->order_list.first, + (ORDER*) select_lex->group_list.first, + select_lex->having, + (ORDER*) thd->lex.proc_list.first, + select_lex->options | thd->options | SELECT_DESCRIBE, + result, unit, select_lex, 0); - /* Don't log this into the slow query log */ - thd->lex.select_lex.options&= ~(QUERY_NO_INDEX_USED | QUERY_NO_GOOD_INDEX_USED); - field_list.push_back(new Item_empty_string("Comment",80)); - if (send_fields(thd,field_list,1)) - return; /* purecov: inspected */ - packet->length(0); - net_store_data(packet,info); - if (!my_net_write(&thd->net,(char*) packet->ptr(),packet->length())) - send_eof(&thd->net); + return res; } + diff --git a/sql/sql_union.cc b/sql/sql_union.cc index e8ee3582135..f6ac17e5fe3 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -111,6 +111,7 @@ int st_select_lex_unit::prepare(THD *thd, select_result *result) DBUG_ENTER("st_select_lex_unit::prepare"); this->thd= thd; this->result= result; + SELECT_LEX *lex_select_save= thd->lex.select; /* Global option */ if (((void*)(global_parameters)) == ((void*)this)) @@ -148,9 +149,9 @@ int st_select_lex_unit::prepare(THD *thd, select_result *result) /* Create a list of items that will be in the result set */ while ((item= it++)) if (item_list.push_back(item)) - DBUG_RETURN(-1); + goto err; if (setup_fields(thd,first_table,item_list,0,0,1)) - DBUG_RETURN(-1); + goto err; } bzero((char*) &tmp_table_param,sizeof(tmp_table_param)); @@ -162,7 +163,7 @@ int st_select_lex_unit::prepare(THD *thd, select_result *result) (first_select()->options | thd->options | TMP_TABLE_ALL_COLUMNS), this))) - DBUG_RETURN(-1); + goto err; table->file->extra(HA_EXTRA_WRITE_CACHE); table->file->extra(HA_EXTRA_IGNORE_DUP_KEY); bzero((char*) &result_table_list,sizeof(result_table_list)); @@ -171,7 +172,7 @@ int st_select_lex_unit::prepare(THD *thd, select_result *result) result_table_list.table=table; if (!(union_result=new select_union(table))) - DBUG_RETURN(-1); + goto err; union_result->save_time_stamp=!describe; union_result->tmp_table_param=&tmp_table_param; @@ -202,9 +203,13 @@ int st_select_lex_unit::prepare(THD *thd, select_result *result) (ORDER*) NULL, sl, this, 0); if (res | thd->fatal_error) - DBUG_RETURN(res | thd->fatal_error); + goto err; } + thd->lex.select= lex_select_save; DBUG_RETURN(res | thd->fatal_error); +err: + thd->lex.select= lex_select_save; + DBUG_RETURN(-1); } int st_select_lex_unit::exec() @@ -214,7 +219,7 @@ int st_select_lex_unit::exec() { if (optimized && item && item->assigned()) item->assigned(0); // We will reinit & rexecute unit - + SELECT_LEX *lex_select_save= thd->lex.select; for (SELECT_LEX *sl= first_select(); sl; sl= sl->next_select()) { thd->lex.select=sl; @@ -234,8 +239,12 @@ int st_select_lex_unit::exec() res= sl->join->error; if (res) + { + thd->lex.select= lex_select_save; DBUG_RETURN(res); + } } + thd->lex.select= lex_select_save; optimized= 1; } @@ -283,7 +292,7 @@ int st_select_lex_unit::exec() 0: (ORDER*)global_parameters->order_list.first, (ORDER*) NULL, NULL, (ORDER*) NULL, - thd->options, result, this, 1); + thd->options, result, this, first_select(), 1); if (found_rows_for_union && !res) thd->limit_found_rows = (ulonglong)table->file->records; } diff --git a/sql/table.h b/sql/table.h index b89701bfc8e..3b8a62a09b5 100644 --- a/sql/table.h +++ b/sql/table.h @@ -128,6 +128,9 @@ struct st_table { uint temp_pool_slot; + /* number of select if it is derived table */ + uint derived_select_number; + THD *in_use; /* Which thread uses this */ struct st_table *next,*prev; }; -- cgit v1.2.1 From b14dc0ee2f1f83651fb397685f7b5f908d53ac7f Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 27 Sep 2002 09:11:40 +0300 Subject: fixed grammar error --- sql/share/czech/errmsg.txt | 4 ++-- sql/share/danish/errmsg.txt | 4 ++-- sql/share/dutch/errmsg.txt | 4 ++-- sql/share/english/errmsg.txt | 4 ++-- sql/share/estonian/errmsg.txt | 4 ++-- sql/share/french/errmsg.txt | 4 ++-- sql/share/greek/errmsg.txt | 4 ++-- sql/share/hungarian/errmsg.txt | 4 ++-- sql/share/italian/errmsg.txt | 4 ++-- sql/share/japanese/errmsg.txt | 4 ++-- sql/share/korean/errmsg.txt | 4 ++-- sql/share/norwegian-ny/errmsg.txt | 4 ++-- sql/share/norwegian/errmsg.txt | 4 ++-- sql/share/polish/errmsg.txt | 4 ++-- sql/share/portuguese/errmsg.txt | 4 ++-- sql/share/romanian/errmsg.txt | 4 ++-- sql/share/serbian/errmsg.txt | 4 ++-- sql/share/slovak/errmsg.txt | 4 ++-- sql/share/spanish/errmsg.txt | 4 ++-- sql/share/swedish/errmsg.txt | 4 ++-- 20 files changed, 40 insertions(+), 40 deletions(-) diff --git a/sql/share/czech/errmsg.txt b/sql/share/czech/errmsg.txt index 9ce8875ceeb..09975da622c 100644 --- a/sql/share/czech/errmsg.txt +++ b/sql/share/czech/errmsg.txt @@ -239,5 +239,5 @@ "User '%-.64s' has exceeded the '%s' resource (current value: %ld)", "Wrong foreign key definition for '%-.64s': %s", "Key reference and table reference doesn't match", -"Subselect return more than 1 field", -"Subselect return more than 1 record", +"Subselect returns more than 1 field", +"Subselect returns more than 1 record", diff --git a/sql/share/danish/errmsg.txt b/sql/share/danish/errmsg.txt index 0babb8981a8..f9b8057acfb 100644 --- a/sql/share/danish/errmsg.txt +++ b/sql/share/danish/errmsg.txt @@ -233,5 +233,5 @@ "User '%-.64s' has exceeded the '%s' resource (current value: %ld)", "Wrong foreign key definition for '%-.64s': %s", "Key reference and table reference doesn't match", -"Subselect return more than 1 field", -"Subselect return more than 1 record", +"Subselect returns more than 1 field", +"Subselect returns more than 1 record", diff --git a/sql/share/dutch/errmsg.txt b/sql/share/dutch/errmsg.txt index b2fab274db1..f35ee9cc836 100644 --- a/sql/share/dutch/errmsg.txt +++ b/sql/share/dutch/errmsg.txt @@ -238,5 +238,5 @@ "Gebruiker '%-.64s' heeft het maximale gebruik van de '%s' faciliteit overschreden (huidige waarde: %ld)", "Wrong foreign key definition for '%-.64s': %s", "Key reference and table reference doesn't match", -"Subselect return more than 1 field", -"Subselect return more than 1 record", +"Subselect returns more than 1 field", +"Subselect returns more than 1 record", diff --git a/sql/share/english/errmsg.txt b/sql/share/english/errmsg.txt index 1a68a9dcb85..c5c5488fdc8 100644 --- a/sql/share/english/errmsg.txt +++ b/sql/share/english/errmsg.txt @@ -230,5 +230,5 @@ "User '%-.64s' has exceeded the '%s' resource (current value: %ld)", "Wrong foreign key definition for '%-.64s': %s", "Key reference and table reference doesn't match", -"Subselect return more than 1 field", -"Subselect return more than 1 record", +"Subselect returns more than 1 field", +"Subselect returns more than 1 record", diff --git a/sql/share/estonian/errmsg.txt b/sql/share/estonian/errmsg.txt index e52dfd72c5a..86de766d177 100644 --- a/sql/share/estonian/errmsg.txt +++ b/sql/share/estonian/errmsg.txt @@ -235,5 +235,5 @@ "User '%-.64s' has exceeded the '%s' resource (current value: %ld)", "Wrong foreign key definition for '%-.64s': %s", "Key reference and table reference doesn't match", -"Subselect return more than 1 field", -"Subselect return more than 1 record", +"Subselect returns more than 1 field", +"Subselect returns more than 1 record", diff --git a/sql/share/french/errmsg.txt b/sql/share/french/errmsg.txt index 8d0e2505eb0..6f024a83eb9 100644 --- a/sql/share/french/errmsg.txt +++ b/sql/share/french/errmsg.txt @@ -230,5 +230,5 @@ "User '%-.64s' has exceeded the '%s' resource (current value: %ld)", "Wrong foreign key definition for '%-.64s': %s", "Key reference and table reference doesn't match", -"Subselect return more than 1 field", -"Subselect return more than 1 record", +"Subselect returns more than 1 field", +"Subselect returns more than 1 record", diff --git a/sql/share/greek/errmsg.txt b/sql/share/greek/errmsg.txt index 171493458c9..cbe53444c78 100644 --- a/sql/share/greek/errmsg.txt +++ b/sql/share/greek/errmsg.txt @@ -230,5 +230,5 @@ "User '%-.64s' has exceeded the '%s' resource (current value: %ld)", "Wrong foreign key definition for '%-.64s': %s", "Key reference and table reference doesn't match", -"Subselect return more than 1 field", -"Subselect return more than 1 record", +"Subselect returns more than 1 field", +"Subselect returns more than 1 record", diff --git a/sql/share/hungarian/errmsg.txt b/sql/share/hungarian/errmsg.txt index f891f8a7e91..4338f259310 100644 --- a/sql/share/hungarian/errmsg.txt +++ b/sql/share/hungarian/errmsg.txt @@ -232,5 +232,5 @@ "User '%-.64s' has exceeded the '%s' resource (current value: %ld)", "Wrong foreign key definition for '%-.64s': %s", "Key reference and table reference doesn't match", -"Subselect return more than 1 field", -"Subselect return more than 1 record", +"Subselect returns more than 1 field", +"Subselect returns more than 1 record", diff --git a/sql/share/italian/errmsg.txt b/sql/share/italian/errmsg.txt index 9b8eb214215..209e949d67b 100644 --- a/sql/share/italian/errmsg.txt +++ b/sql/share/italian/errmsg.txt @@ -230,5 +230,5 @@ "User '%-.64s' has exceeded the '%s' resource (current value: %ld)", "Wrong foreign key definition for '%-.64s': %s", "Key reference and table reference doesn't match", -"Subselect return more than 1 field", -"Subselect return more than 1 record", +"Subselect returns more than 1 field", +"Subselect returns more than 1 record", diff --git a/sql/share/japanese/errmsg.txt b/sql/share/japanese/errmsg.txt index 4016dd50189..b5573b5e780 100644 --- a/sql/share/japanese/errmsg.txt +++ b/sql/share/japanese/errmsg.txt @@ -232,5 +232,5 @@ "User '%-.64s' has exceeded the '%s' resource (current value: %ld)", "Wrong foreign key definition for '%-.64s': %s", "Key reference and table reference doesn't match", -"Subselect return more than 1 field", -"Subselect return more than 1 record", +"Subselect returns more than 1 field", +"Subselect returns more than 1 record", diff --git a/sql/share/korean/errmsg.txt b/sql/share/korean/errmsg.txt index 93e9948d4fd..df4f8cdbe0f 100644 --- a/sql/share/korean/errmsg.txt +++ b/sql/share/korean/errmsg.txt @@ -230,5 +230,5 @@ "User '%-.64s' has exceeded the '%s' resource (current value: %ld)", "Wrong foreign key definition for '%-.64s': %s", "Key reference and table reference doesn't match", -"Subselect return more than 1 field", -"Subselect return more than 1 record", +"Subselect returns more than 1 field", +"Subselect returns more than 1 record", diff --git a/sql/share/norwegian-ny/errmsg.txt b/sql/share/norwegian-ny/errmsg.txt index 612757726c7..4bcc2178b11 100644 --- a/sql/share/norwegian-ny/errmsg.txt +++ b/sql/share/norwegian-ny/errmsg.txt @@ -232,5 +232,5 @@ "User '%-.64s' has exceeded the '%s' resource (current value: %ld)", "Wrong foreign key definition for '%-.64s': %s", "Key reference and table reference doesn't match", -"Subselect return more than 1 field", -"Subselect return more than 1 record", +"Subselect returns more than 1 field", +"Subselect returns more than 1 record", diff --git a/sql/share/norwegian/errmsg.txt b/sql/share/norwegian/errmsg.txt index f0d884c330f..0dee930d4aa 100644 --- a/sql/share/norwegian/errmsg.txt +++ b/sql/share/norwegian/errmsg.txt @@ -232,5 +232,5 @@ "User '%-.64s' has exceeded the '%s' resource (current value: %ld)", "Wrong foreign key definition for '%-.64s': %s", "Key reference and table reference doesn't match", -"Subselect return more than 1 field", -"Subselect return more than 1 record", +"Subselect returns more than 1 field", +"Subselect returns more than 1 record", diff --git a/sql/share/polish/errmsg.txt b/sql/share/polish/errmsg.txt index 22f7c331a98..8b93c30ec5a 100644 --- a/sql/share/polish/errmsg.txt +++ b/sql/share/polish/errmsg.txt @@ -234,5 +234,5 @@ "User '%-.64s' has exceeded the '%s' resource (current value: %ld)", "Wrong foreign key definition for '%-.64s': %s", "Key reference and table reference doesn't match", -"Subselect return more than 1 field", -"Subselect return more than 1 record", +"Subselect returns more than 1 field", +"Subselect returns more than 1 record", diff --git a/sql/share/portuguese/errmsg.txt b/sql/share/portuguese/errmsg.txt index a00dabc391b..e38ca9da548 100644 --- a/sql/share/portuguese/errmsg.txt +++ b/sql/share/portuguese/errmsg.txt @@ -230,5 +230,5 @@ "User '%-.64s' has exceeded the '%s' resource (current value: %ld)", "Wrong foreign key definition for '%-.64s': %s", "Key reference and table reference doesn't match", -"Subselect return more than 1 field", -"Subselect return more than 1 record", +"Subselect returns more than 1 field", +"Subselect returns more than 1 record", diff --git a/sql/share/romanian/errmsg.txt b/sql/share/romanian/errmsg.txt index 61ca19a598e..cbcefca6d04 100644 --- a/sql/share/romanian/errmsg.txt +++ b/sql/share/romanian/errmsg.txt @@ -234,5 +234,5 @@ "User '%-.64s' has exceeded the '%s' resource (current value: %ld)", "Wrong foreign key definition for '%-.64s': %s", "Key reference and table reference doesn't match", -"Subselect return more than 1 field", -"Subselect return more than 1 record", +"Subselect returns more than 1 field", +"Subselect returns more than 1 record", diff --git a/sql/share/serbian/errmsg.txt b/sql/share/serbian/errmsg.txt index 78febb65c3c..3922e0a145a 100644 --- a/sql/share/serbian/errmsg.txt +++ b/sql/share/serbian/errmsg.txt @@ -236,5 +236,5 @@ "User '%-.64s' has exceeded the '%s' resource (current value: %ld)", "Wrong foreign key definition for '%-.64s': %s", "Key reference and table reference doesn't match", -"Subselect return more than 1 field", -"Subselect return more than 1 record", +"Subselect returns more than 1 field", +"Subselect returns more than 1 record", diff --git a/sql/share/slovak/errmsg.txt b/sql/share/slovak/errmsg.txt index 9c0ecc8ca14..39189c7c46e 100644 --- a/sql/share/slovak/errmsg.txt +++ b/sql/share/slovak/errmsg.txt @@ -238,5 +238,5 @@ "User '%-.64s' has exceeded the '%s' resource (current value: %ld)", "Wrong foreign key definition for '%-.64s': %s", "Key reference and table reference doesn't match", -"Subselect return more than 1 field", -"Subselect return more than 1 record", +"Subselect returns more than 1 field", +"Subselect returns more than 1 record", diff --git a/sql/share/spanish/errmsg.txt b/sql/share/spanish/errmsg.txt index 2eca37146e4..56669e1f6d3 100644 --- a/sql/share/spanish/errmsg.txt +++ b/sql/share/spanish/errmsg.txt @@ -231,5 +231,5 @@ "User '%-.64s' has exceeded the '%s' resource (current value: %ld)", "Wrong foreign key definition for '%-.64s': %s", "Key reference and table reference doesn't match", -"Subselect return more than 1 field", -"Subselect return more than 1 record", +"Subselect returns more than 1 field", +"Subselect returns more than 1 record", diff --git a/sql/share/swedish/errmsg.txt b/sql/share/swedish/errmsg.txt index 557c6e55394..95e07d73da5 100644 --- a/sql/share/swedish/errmsg.txt +++ b/sql/share/swedish/errmsg.txt @@ -230,5 +230,5 @@ "Användare '%-.64s' har överskridit '%s' (nuvarande värde: %ld)", "Wrong foreign key definition for '%-.64s': %s", "Key reference and table reference doesn't match", -"Subselect return more than 1 field", -"Subselect return more than 1 record", +"Subselect returns more than 1 field", +"Subselect returns more than 1 record", -- cgit v1.2.1 From ce5696e25db0086f3ea73a88036395c0eeea18d3 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 27 Sep 2002 14:59:03 +0500 Subject: UTF8 now works with up to 3 byte sequences only --- strings/ctype.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/strings/ctype.c b/strings/ctype.c index f91c8985aee..d3ae693f97d 100644 --- a/strings/ctype.c +++ b/strings/ctype.c @@ -3772,7 +3772,7 @@ CHARSET_INFO compiled_charsets[] = { my_strnncoll_utf8, /* strnncoll */ my_strnxfrm_utf8, /* strnxfrm */ NULL, /* like_range */ - 6, /* mbmaxlen */ + 3, /* mbmaxlen */ my_ismbchar_utf8, /* ismbchar */ my_ismbhead_utf8, /* ismbhead */ my_mbcharlen_utf8, /* mbcharlen */ -- cgit v1.2.1 From da891a571e49804e3743bf2776bcf2648a4832da Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 27 Sep 2002 23:11:51 +0300 Subject: fixed Item_subselect constructor --- sql/item_subselect.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 29034549367..a8909430155 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -34,7 +34,7 @@ SUBSELECT TODO: Item_subselect::Item_subselect(THD *thd, st_select_lex *select_lex, select_subselect *result): - engine_owner(1), value_assigned(0) + Item(), engine_owner(1), value_assigned(0) { DBUG_ENTER("Item_subselect::Item_subselect"); DBUG_PRINT("subs", ("select_lex 0x%xl", (long) select_lex)); -- cgit v1.2.1 From c9a2b58986635015b3f3867999ef3fafa2bd2728 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 28 Sep 2002 18:34:56 +0300 Subject: fixed bug in string & date types with group function in subselect mysql-test/r/subselect.result: test suite of string & date types with group function in subselects mysql-test/t/subselect.test: test suite of string & date types with group function in subselects sql/item_subselect.cc: fixed bug in string type with group function sql/item_subselect.h: fixed bug in string type with group function sql/sql_class.cc: fixed bug in date type with group function --- mysql-test/r/subselect.result | 16 +++++++++++++++ mysql-test/t/subselect.test | 13 ++++++++++++ sql/item_subselect.cc | 47 ++++++++++++++++++++++++++++++++++++++++++- sql/item_subselect.h | 12 +++++++++-- sql/sql_class.cc | 8 ++++++-- 5 files changed, 91 insertions(+), 5 deletions(-) diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index 54528f58697..5a96cc08cbf 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -131,4 +131,20 @@ patient_uq clinic_uq 1 1 1 2 2 2 +drop table if exists t1,t2,t3; +CREATE TABLE t3 (a varchar(20),b char(1) NOT NULL default '0'); +INSERT INTO t3 VALUES ('W','a'),('A','c'),('J','b'); +CREATE TABLE t2 (a varchar(20),b int NOT NULL default '0'); +INSERT INTO t2 VALUES ('W','1'),('A','3'),('J','2'); +CREATE TABLE t1 (a varchar(20),b date NOT NULL default '0000-00-00'); +INSERT INTO t1 VALUES ('W','1732-02-22'),('A','1735-10-30'),('J','1743-04-13'); +SELECT * FROM t1 WHERE b = (SELECT MIN(b) FROM t1); +a b +W 1732-02-22 +SELECT * FROM t2 WHERE b = (SELECT MIN(b) FROM t2); +a b +W 1 +SELECT * FROM t3 WHERE b = (SELECT MIN(b) FROM t3); +a b +W a drop table t1,t2,t3,t4,t5,attend,clinic; diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 68a89796ec3..3ae695c8967 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -53,4 +53,17 @@ insert into clinic values(1,"Oblastnaia bolnitsa"),(2,"Bolnitsa Krasnogo Kresta" insert into attend values (1,1),(1,2),(2,2),(1,3); select * from attend where exists (select * from clinic where uq = clinic_uq); +# different tipes & group functions +drop table if exists t1,t2,t3; + +CREATE TABLE t3 (a varchar(20),b char(1) NOT NULL default '0'); +INSERT INTO t3 VALUES ('W','a'),('A','c'),('J','b'); +CREATE TABLE t2 (a varchar(20),b int NOT NULL default '0'); +INSERT INTO t2 VALUES ('W','1'),('A','3'),('J','2'); +CREATE TABLE t1 (a varchar(20),b date NOT NULL default '0000-00-00'); +INSERT INTO t1 VALUES ('W','1732-02-22'),('A','1735-10-30'),('J','1743-04-13'); +SELECT * FROM t1 WHERE b = (SELECT MIN(b) FROM t1); +SELECT * FROM t2 WHERE b = (SELECT MIN(b) FROM t2); +SELECT * FROM t3 WHERE b = (SELECT MIN(b) FROM t3); + drop table t1,t2,t3,t4,t5,attend,clinic; diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index a8909430155..99fc0bcdb67 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -82,7 +82,14 @@ bool Item_subselect::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) my_message(ER_SUBSELECT_NO_1_COL, ER(ER_SUBSELECT_NO_1_COL), MYF(0)); return 1; } - return engine->prepare(); + int res= engine->prepare(); + fix_length_and_dec(); + return res; +} + +void Item_subselect::fix_length_and_dec() +{ + engine->fix_length_and_dec(); } inline table_map Item_subselect::used_tables() const @@ -98,6 +105,12 @@ Item_singleval_subselect::Item_singleval_subselect(THD *thd, maybe_null= 1; } +void Item_singleval_subselect::fix_length_and_dec() +{ + engine->fix_length_and_dec(); + res_type= engine->type(); +} + Item::Type Item_subselect::type() const { return SUBSELECT_ITEM; @@ -135,6 +148,12 @@ Item_exists_subselect::Item_exists_subselect(THD *thd, select_lex->select_limit= 1; // we need only 1 row to determinate existence } +void Item_exists_subselect::fix_length_and_dec() +{ + max_length= 1; + +} + double Item_exists_subselect::val () { if (engine->exec()) @@ -221,6 +240,32 @@ int subselect_union_engine::prepare() return unit->prepare(thd, result); } +void subselect_single_select_engine::fix_length_and_dec() +{ + List_iterator_fast li(select_lex->item_list); + Item *sel_item= li++; + item->max_length= sel_item->max_length; + res_type= sel_item->result_type(); + item->decimals= sel_item->decimals; +} + +void subselect_union_engine::fix_length_and_dec() +{ + uint32 mlen= 0, len; + Item *sel_item= 0; + for(SELECT_LEX *sl= unit->first_select(); sl; sl= sl->next_select()) + { + List_iterator_fast li(sl->item_list); + Item *s_item= li++; + if ((len= s_item->max_length)) + mlen= len; + if (!sel_item) + sel_item= s_item; + } + item->max_length= mlen; + res_type= sel_item->result_type(); + item->decimals= sel_item->decimals; +} int subselect_single_select_engine::exec() { diff --git a/sql/item_subselect.h b/sql/item_subselect.h index 0d8495d3ae8..92839eb0e5f 100644 --- a/sql/item_subselect.h +++ b/sql/item_subselect.h @@ -61,6 +61,7 @@ public: bool is_null() { return null_value; } void make_field (Send_field *); bool fix_fields(THD *thd, TABLE_LIST *tables, Item **ref); + virtual void fix_length_and_dec(); table_map used_tables() const; friend class select_subselect; @@ -100,7 +101,7 @@ public: String *val_str (String *); Item *new_item() { return new Item_singleval_subselect(this); } enum Item_result result_type() const { return res_type; } - + void fix_length_and_dec(); friend class select_singleval_subselect; }; @@ -128,7 +129,7 @@ public: longlong val_int(); double val(); String *val_str(String*); - + void fix_length_and_dec(); friend class select_exists_subselect; }; @@ -138,6 +139,7 @@ protected: select_subselect *result; /* results storage class */ THD *thd; /* pointer to current THD */ Item_subselect *item; /* item, that use this engine */ + enum Item_result res_type; /* type of results */ public: static void *operator new(size_t size) { @@ -150,11 +152,15 @@ public: result= res; item= si; this->thd= thd; + res_type= STRING_RESULT; } + virtual int prepare()= 0; + virtual void fix_length_and_dec()= 0; virtual int exec()= 0; virtual uint cols()= 0; /* return number of columnss in select */ virtual bool depended()= 0; /* depended from outer select */ + enum Item_result type() { return res_type; } }; class subselect_single_select_engine: public subselect_engine @@ -168,6 +174,7 @@ public: select_subselect *result, Item_subselect *item); virtual int prepare(); + virtual void fix_length_and_dec(); virtual int exec(); virtual uint cols(); virtual bool depended(); @@ -182,6 +189,7 @@ public: select_subselect *result, Item_subselect *item); virtual int prepare(); + virtual void fix_length_and_dec(); virtual int exec(); virtual uint cols(); virtual bool depended(); diff --git a/sql/sql_class.cc b/sql/sql_class.cc index c090f2336c1..98551fa35ba 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -838,12 +838,16 @@ bool select_singleval_subselect::send_data(List &items) if ((it->null_value= val_item->is_null())) { it->assign_null(); - } else { + } + else + { it->max_length= val_item->max_length; it->decimals= val_item->decimals; it->binary= val_item->binary; - val_item->val_str(&it->str_value); it->int_value= val_item->val_int(); + String *s= val_item->val_str(&it->str_value); + if (s != &it->str_value) + it->str_value.set(*s, 0, s->length()); it->res_type= val_item->result_type(); } it->assigned(1); -- cgit v1.2.1 From 9564cd43d2d20de54fcdd0ff88f2a23724ffde26 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 1 Oct 2002 13:54:59 +0500 Subject: SHOW TABLE STATUS now displays table charset as well --- mysql-test/r/show_check.result | 2 +- sql/sql_show.cc | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/show_check.result b/mysql-test/r/show_check.result index 40103847a93..462abb29979 100644 --- a/mysql-test/r/show_check.result +++ b/mysql-test/r/show_check.result @@ -43,7 +43,7 @@ wait_timeout 28800 show variables like "this_doesn't_exists%"; Variable_name Value show table status from test like "this_doesn't_exists%"; -Name Type Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Create_options Comment +Name Type Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Charset Create_options Comment show databases; Database mysql diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 7ac0affbec5..7ac032719be 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -484,6 +484,8 @@ int mysqld_extend_show_tables(THD *thd,const char *db,const char *wild) item->maybe_null=1; field_list.push_back(item=new Item_datetime("Check_time")); item->maybe_null=1; + field_list.push_back(item=new Item_empty_string("Charset",32)); + item->maybe_null=1; field_list.push_back(item=new Item_empty_string("Create_options",255)); item->maybe_null=1; field_list.push_back(item=new Item_empty_string("Comment",80)); @@ -559,6 +561,8 @@ int mysqld_extend_show_tables(THD *thd,const char *db,const char *wild) localtime_r(&file->check_time,&tm_tmp); net_store_data(packet, &tm_tmp); } + net_store_data(packet, convert, table->table_charset ? + table->table_charset->name : "default"); { char option_buff[350],*ptr; ptr=option_buff; -- cgit v1.2.1 From 0d2b6552b14292648afafe7dcd73df4b7975ba65 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 1 Oct 2002 17:23:28 +0500 Subject: User variables didn't store charset, so this didn't work as expected and returned default charset instead: SET @x = _koi8_ru'test'; SELECT CHARSET(@x); --- sql/item_func.cc | 14 +++++++++----- sql/item_func.h | 2 +- sql/sql_class.h | 1 + 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/sql/item_func.cc b/sql/item_func.cc index 8728187718c..ded5e045af4 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -1801,7 +1801,8 @@ Item_func_set_user_var::fix_length_and_dec() } void Item_func_set_user_var::update_hash(void *ptr, uint length, - Item_result type) + Item_result type, + CHARSET_INFO *cs) { if ((null_value=args[0]->null_value)) { @@ -1810,6 +1811,7 @@ void Item_func_set_user_var::update_hash(void *ptr, uint length, my_free(entry->value,MYF(0)); entry->value=0; entry->length=0; + entry->var_charset=cs; } else { @@ -1840,6 +1842,7 @@ void Item_func_set_user_var::update_hash(void *ptr, uint length, memcpy(entry->value,ptr,length); entry->length= length; entry->type=type; + entry->var_charset=cs; } return; @@ -1874,7 +1877,7 @@ double Item_func_set_user_var::val() { double value=args[0]->val(); - update_hash((void*) &value,sizeof(value), REAL_RESULT); + update_hash((void*) &value,sizeof(value), REAL_RESULT, default_charset_info); return value; } @@ -1882,7 +1885,7 @@ longlong Item_func_set_user_var::val_int() { longlong value=args[0]->val_int(); - update_hash((void*) &value,sizeof(longlong),INT_RESULT); + update_hash((void*) &value,sizeof(longlong),INT_RESULT, default_charset_info); return value; } @@ -1891,9 +1894,9 @@ Item_func_set_user_var::val_str(String *str) { String *res=args[0]->val_str(str); if (!res) // Null value - update_hash((void*) 0,0,STRING_RESULT); + update_hash((void*) 0,0,STRING_RESULT, default_charset_info); else - update_hash(res->c_ptr(),res->length()+1,STRING_RESULT); + update_hash(res->c_ptr(),res->length()+1,STRING_RESULT,res->charset()); return res; } @@ -1939,6 +1942,7 @@ Item_func_get_user_var::val_str(String *str) null_value=1; return NULL; } + str->set_charset(entry->var_charset); break; } return str; diff --git a/sql/item_func.h b/sql/item_func.h index 2e61ed87c3c..d8f6963479d 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -875,7 +875,7 @@ public: double val(); longlong val_int(); String *val_str(String *str); - void update_hash(void *ptr, uint length, enum Item_result type); + void update_hash(void *ptr, uint length, enum Item_result type, CHARSET_INFO *cs); bool update(); enum Item_result result_type () const { return cached_result_type; } bool fix_fields(THD *thd, struct st_table_list *tables, Item **ref); diff --git a/sql/sql_class.h b/sql/sql_class.h index a6b7e45ab03..84dde229b2f 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -830,6 +830,7 @@ class user_var_entry char *value; ulong length, update_query_id; Item_result type; + CHARSET_INFO *var_charset; }; /* Class for unique (removing of duplicates) */ -- cgit v1.2.1 From 5a28c2caca888be932140d12f87c496398ad4220 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 2 Oct 2002 13:33:08 +0300 Subject: Fixes and code cleanups after merge with 4.0.3 Warning handling and initial prepared statement handling (last not complete yet) Changed a lot of functions that returned 0/1 to my_bool type. GRANT handling now uses read/write locks instead of mutex Change basic net functions to use THD instead of NET (needed for 4.1 protocol) Use my_sprintf instead of sprintf() + strlen() Added alloc_query() to be able to chare query initialization code with prepared statements. Cleanup handling of SHOW COUNT(*) WARNINGS and SELECT LAST_INSERT_ID() Note that the following test fails (will be fixed ASAP): sub_select, union, rpl_rotate_logs and rpl_mystery22 BitKeeper/deleted/.del-README~3449730baf983117: Delete: mysql-test/t/README BitKeeper/deleted/.del-sql_error.cc~2f1caca8d2485dbe: Delete: libmysqld/sql_error.cc BitKeeper/deleted/.del-sql_prepare.cc~f703729793935ed6: Delete: libmysqld/sql_prepare.cc Docs/manual.texi: Updated variable list client/mysql.cc: Show warning count to user. client/mysqltest.c: Add warnings to test results configure.in: New shared library version number include/errmsg.h: Indentation cleanup include/mysql.h: Removed MYSQL_ERROR Indentaion cleanups include/mysql_com.h: Changed functions to returns true/false to my_bool. include/mysqld_error.h: New error messages isam/pack_isam.c: Indentation change libmysql/Makefile.am: Fix of wrong merge libmysql/Makefile.shared: Indentation cleanup libmysql/errmsg.c: Removed not used errors libmysql/libmysql.c: Change functions to return 1 on error (not -1) Change type of functions that returns 0/1 to my_bool Lot of code optimizations. Lot of changes for prepared statements. This now handles sending of binary data to server. Receving of binary data is not yet done (will have to wait until server code for this is ready) mysql_warning_count and mysql_warnings() implemented. libmysql/libmysql.def: Added mysql_warnings and mysql_warning_count libmysql/manager.c: Fixed wrong testing of result from my_connect() libmysqld/lib_sql.cc: Removed global variable THR_NET Change basic net functions to use THD instead of NET GRANT handling now uses read/write locks instead of mutex libmysqld/libmysqld.c: Changed functions to be my_bool myisam/ft_boolean_search.c: Trivial code cleanup myisam/ft_stopwords.c: Trivial code cleanup myisam/mi_check.c: Update to 4.1 structures myisam/myisampack.c: Trivial code cleanup myisam/rt_key.c: Code cleanup myisam/rt_test.c: Code cleanup Removed compiler warnings myisam/sp_key.c: Indentation changes myisam/sp_test.c: Removed compiler warnings mysql-test/README: Updated to reflect the new --external flag. mysql-test/mysql-test-run.sh: --local (start new server) is now default. Use --external to test against external server. mysql-test/r/rollback.result: Updated for 4.1 warnings mysql-test/r/rpl_log.result: Update for 4.1 mysql-test/t/rollback.test: Updated for 4.1 warnings mysql-test/t/rpl_log_pos.test: Portability fix mysys/hash.c: Indentation change mysys/my_error.c: Indentation change mysys/tree.c: Updated file description sql/field.cc: Fixed bugs introduced by merge Use my_sprintf instead of sprintf() + strlen() sql/field.h: Add CHARSET_INFO to field structure sql/gstream.h: Indentation changes. Added GPL copyright header sql/ha_innodb.cc: Updated parameters for net functions. sql/item.cc: Updates of Item_param Indentation changes sql/item.h: Removed size_of() function from item. sql/item_func.cc: Update function usage for 4.1 Added get_system_var() sql/item_func.h: Indentation change sql/item_strfunc.cc: Removed not needed inclusion of gstream.h Update to use system variables (from 4.0) sql/item_sum.h: Removed size_of() functions from item. sql/item_timefunc.cc: Change sprintf() + strlen() -> my_sprintf() Added length parameter to ->append() sql/item_timefunc.h: Removed size_of() functions from item. sql/item_uniq.h: Removed size_of() functions from item. sql/lex.h: Removed SQL_ERROR_COUNT variable sql/log.cc: Change sprintf() + strlen() -> my_sprintf() sql/log_event.cc: Change sprintf() + strlen() -> my_sprintf() sql/mini_client.cc: Added check that one always specifies a length to mc_mysql_query() sql/mysql_priv.h: New prototypes Change of NET -> THD parameter for net functions. sql/mysqld.cc: New startup options: 'max_prepared_statements', 'max_error_count' Updated usage of net functions. sql/net_pkg.cc: Change basic net functions to use THD instead of NET (needed to be able to handle 4.0 and 4.1 protocols) Lots of function comments sql/net_serv.cc: Change int return values -> my_bool Updated net_write_command() to take an extra header block to be added to the packet. (This made the prepared statement code much nicer and more efficient) sql/repl_failsafe.cc: Update net functions to use THD instead of NET sql/set_var.cc: Added @@error_count and @@warning_count variables. Updated to 4.1 function usage sql/set_var.h: Added @@error_count and @@warning_count variables. sql/share/czech/errmsg.txt: Removed Warning: from warning error messages. sql/share/english/errmsg.txt: Removed Warning: from warning error messages. sql/share/greek/errmsg.txt: Removed Warning: from warning error messages. sql/share/hungarian/errmsg.txt: Removed Warning: from warning error messages. sql/share/japanese/errmsg.txt: Removed Warning: from warning error messages. sql/share/korean/errmsg.txt: Removed Warning: from warning error messages. sql/share/norwegian-ny/errmsg.txt: Removed Warning: from warning error messages. sql/share/norwegian/errmsg.txt: Removed Warning: from warning error messages. sql/share/polish/errmsg.txt: Removed Warning: from warning error messages. sql/share/romanian/errmsg.txt: Removed Warning: from warning error messages. sql/share/slovak/errmsg.txt: Removed Warning: from warning error messages. sql/share/swedish/errmsg.txt: Removed Warning: from warning error messages. sql/slave.cc: Change basic net functions to use THD instead of NET skip_load_data_file recoded to fit new client/server protocol sql/spatial.h: Added copyright header Indentation cleanups sql/sql_acl.cc: Change basic net functions to use THD instead of NET GRANT handling now uses read/write locks instead of mutex sql/sql_analyse.cc: Change basic net functions to use THD instead of NET sprintf() + strlen() -> my_sprintf() sql/sql_base.cc: More DBUG statements sql/sql_class.cc: Change basic net functions to use THD instead of NET warning and prepared statement handling sql/sql_class.h: Change basic net functions to use THD instead of NET warning and prepared statement handling sql/sql_db.cc: Code cleanup & optimization. sql/sql_delete.cc: Change basic net functions to use THD instead of NET sql/sql_derived.cc: Change basic net functions to use THD instead of NET sql/sql_do.cc: Change basic net functions to use THD instead of NET sql/sql_error.cc: Big rewrite of error handling. sql/sql_handler.cc: Change basic net functions to use THD instead of NET sql/sql_insert.cc: Change basic net functions to use THD instead of NET sql/sql_lex.cc: Change basic net functions to use THD instead of NET sql/sql_lex.h: Added param_count to st_select_lex_node sql/sql_list.h: Removed not needed error list. sql/sql_load.cc: Change basic net functions to use THD instead of NET sql/sql_parse.cc: Change basic net functions to use THD instead of NET Added alloc_query() to be able to chare query initialization code with prepared statements. Update of warning handling. Added create_select_for_variable() (for SHOW COUNT(*) WARNINGS) sql/sql_prepare.cc: Initial prepared statement handling sql/sql_rename.cc: Change basic net functions to use THD instead of NET sql/sql_repl.cc: Change basic net functions to use THD instead of NET sql/sql_select.cc: Small code cleanups Added missing initialization of error that caused some queries that returned an empty result set to fail sql/sql_select.h: Ensure that JOIN.error is properly initialized sql/sql_show.cc: Change basic net functions to use THD instead of NET A lot of optimization sql/sql_table.cc: Change basic net functions to use THD instead of NET Indentaion cleanup sql/sql_udf.cc: Change basic net functions to use THD instead of NET sql/sql_union.cc: Change basic net functions to use THD instead of NET sql/sql_update.cc: Change basic net functions to use THD instead of NET sql/sql_yacc.yy: Change basic net functions to use THD instead of NET Cleanup handling of SHOW COUNT(*) WARNINGS and SELECT LAST_INSERT_ID() sql/structs.h: Moved structures to files where they was used sql/table.cc: Don't accept empty database names sql/uniques.cc: Indentation cleanup sql/unireg.cc: Change basic net functions to use THD instead of NET sql/unireg.h: Added defaults for warnings and prepared statements strings/ctype-simple.c: optimization tests/client_test.c: Fixed wrong paramaters to printf() --- Docs/manual.texi | 3 + client/mysql.cc | 32 +- client/mysqltest.c | 87 ++- configure.in | 2 +- include/errmsg.h | 21 +- include/mysql.h | 133 ++-- include/mysql_com.h | 46 +- include/mysqld_error.h | 3 +- isam/pack_isam.c | 3 +- libmysql/Makefile.am | 4 - libmysql/Makefile.shared | 5 +- libmysql/errmsg.c | 18 +- libmysql/libmysql.c | 1475 ++++++++++++++++--------------------- libmysql/libmysql.def | 4 +- libmysql/manager.c | 2 +- libmysqld/lib_sql.cc | 23 +- libmysqld/libmysqld.c | 34 +- myisam/ft_boolean_search.c | 4 +- myisam/ft_stopwords.c | 4 +- myisam/mi_check.c | 6 +- myisam/myisampack.c | 3 +- myisam/rt_key.c | 63 +- myisam/rt_test.c | 14 +- myisam/sp_key.c | 15 +- myisam/sp_test.c | 11 +- mysql-test/README | 7 +- mysql-test/mysql-test-run.sh | 3 +- mysql-test/r/rollback.result | 19 +- mysql-test/r/rpl_log.result | 38 +- mysql-test/t/README | 0 mysql-test/t/rollback.test | 9 +- mysql-test/t/rpl_log_pos.test | 1 + mysys/hash.c | 7 +- mysys/my_error.c | 2 +- mysys/tree.c | 25 +- sql/field.cc | 58 +- sql/field.h | 1 + sql/gstream.h | 40 +- sql/ha_innodb.cc | 2 +- sql/item.cc | 73 +- sql/item.h | 35 +- sql/item_func.cc | 39 +- sql/item_func.h | 2 +- sql/item_strfunc.cc | 4 +- sql/item_sum.h | 17 - sql/item_timefunc.cc | 78 +- sql/item_timefunc.h | 10 - sql/item_uniq.h | 2 +- sql/lex.h | 1 - sql/log.cc | 37 +- sql/log_event.cc | 21 +- sql/mini_client.cc | 21 +- sql/mysql_priv.h | 47 +- sql/mysqld.cc | 45 +- sql/net_pkg.cc | 174 +++-- sql/net_serv.cc | 76 +- sql/repl_failsafe.cc | 42 +- sql/set_var.cc | 70 +- sql/set_var.h | 29 +- sql/share/czech/errmsg.txt | 2 +- sql/share/english/errmsg.txt | 3 +- sql/share/greek/errmsg.txt | 2 +- sql/share/hungarian/errmsg.txt | 2 +- sql/share/japanese/errmsg.txt | 2 +- sql/share/korean/errmsg.txt | 2 +- sql/share/norwegian-ny/errmsg.txt | 2 +- sql/share/norwegian/errmsg.txt | 2 +- sql/share/polish/errmsg.txt | 2 +- sql/share/romanian/errmsg.txt | 2 +- sql/share/slovak/errmsg.txt | 2 +- sql/share/swedish/errmsg.txt | 2 +- sql/slave.cc | 47 +- sql/spatial.h | 145 ++-- sql/sql_acl.cc | 68 +- sql/sql_analyse.cc | 15 +- sql/sql_base.cc | 17 +- sql/sql_class.cc | 37 +- sql/sql_class.h | 80 +- sql/sql_db.cc | 373 +++++----- sql/sql_delete.cc | 18 +- sql/sql_derived.cc | 2 +- sql/sql_do.cc | 2 +- sql/sql_error.cc | 250 +++---- sql/sql_handler.cc | 10 +- sql/sql_insert.cc | 12 +- sql/sql_lex.cc | 4 +- sql/sql_lex.h | 4 +- sql/sql_list.h | 117 --- sql/sql_load.cc | 2 +- sql/sql_parse.cc | 362 +++++---- sql/sql_prepare.cc | 548 ++++++++------ sql/sql_rename.cc | 2 +- sql/sql_repl.cc | 55 +- sql/sql_select.cc | 45 +- sql/sql_select.h | 4 +- sql/sql_show.cc | 316 ++++---- sql/sql_table.cc | 45 +- sql/sql_udf.cc | 20 +- sql/sql_union.cc | 2 +- sql/sql_update.cc | 16 +- sql/sql_yacc.yy | 67 +- sql/structs.h | 26 +- sql/table.cc | 4 +- sql/uniques.cc | 3 +- sql/unireg.cc | 7 +- sql/unireg.h | 2 + strings/ctype-simple.c | 16 +- tests/client_test.c | 124 ++-- 108 files changed, 3026 insertions(+), 2916 deletions(-) delete mode 100644 mysql-test/t/README diff --git a/Docs/manual.texi b/Docs/manual.texi index 5d4394a7d66..e8bd1ac53e3 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -28684,6 +28684,7 @@ and if you can use @code{GLOBAL} or @code{SESSION} with them. @item delayed_insert_limit @tab num @tab GLOBAL @item delayed_insert_timeout @tab num @tab GLOBAL @item delayed_queue_size @tab num @tab GLOBAL +@item error_count @tab num @tab LOCAL @item flush @tab bool @tab GLOBAL @item flush_time @tab num @tab GLOBAL @item foreign_key_checks @tab bool @tab SESSION @@ -28702,6 +28703,7 @@ and if you can use @code{GLOBAL} or @code{SESSION} with them. @item max_binlog_size @tab num @tab GLOBAL @item max_connect_errors @tab num @tab GLOBAL @item max_connections @tab num @tab GLOBAL +@item max_error_count @tab num @tab GLOBAL | SESSION @item max_delayed_threads @tab num @tab GLOBAL @item max_heap_table_size @tab num @tab GLOBAL | SESSION @item max_join_size @tab num @tab GLOBAL | SESSION @@ -28750,6 +28752,7 @@ and if you can use @code{GLOBAL} or @code{SESSION} with them. @item tx_isolation @tab enum @tab GLOBAL | SESSION @item version @tab string @tab GLOBAL @item wait_timeout @tab num @tab GLOBAL | SESSION +@item warning_count @tab num @tab LOCAL @item unique_checks @tab bool @tab SESSION @end multitable diff --git a/client/mysql.cc b/client/mysql.cc index 7fd221f479c..223d4b794d2 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -40,7 +40,7 @@ #include #include -const char *VER= "12.12"; +const char *VER= "12.13"; /* Don't try to make a nice table if the data is too big */ #define MAX_COLUMN_LENGTH 1024 @@ -1362,9 +1362,9 @@ com_clear(String *buffer,char *line __attribute__((unused))) static int com_go(String *buffer,char *line __attribute__((unused))) { - char buff[160],time_buff[32]; + char buff[200], time_buff[32], *pos; MYSQL_RES *result; - ulong timer; + ulong timer, warnings; uint error=0; if (!status.batch) @@ -1447,7 +1447,7 @@ com_go(String *buffer,char *line __attribute__((unused))) { if (!mysql_num_rows(result) && ! quick) { - sprintf(buff,"Empty set%s",time_buff); + strmov(buff, "Empty set"); } else { @@ -1462,20 +1462,30 @@ com_go(String *buffer,char *line __attribute__((unused))) print_tab_data(result); else print_table_data(result); - sprintf(buff,"%ld %s in set%s", + sprintf(buff,"%ld %s in set", (long) mysql_num_rows(result), - (long) mysql_num_rows(result) == 1 ? "row" : "rows", - time_buff); + (long) mysql_num_rows(result) == 1 ? "row" : "rows"); end_pager(); } } else if (mysql_affected_rows(&mysql) == ~(ulonglong) 0) - sprintf(buff,"Query OK%s",time_buff); + strmov(buff,"Query OK"); else - sprintf(buff,"Query OK, %ld %s affected%s", + sprintf(buff,"Query OK, %ld %s affected", (long) mysql_affected_rows(&mysql), - (long) mysql_affected_rows(&mysql) == 1 ? "row" : "rows", - time_buff); + (long) mysql_affected_rows(&mysql) == 1 ? "row" : "rows"); + + pos=strend(buff); + if ((warnings= mysql_warning_count(&mysql))) + { + *pos++= ','; + *pos++= ' '; + pos=int2str(warnings, pos, 10); + pos=strmov(pos, " warning"); + if (warnings != 1) + *pos++= 's'; + } + strmov(pos, time_buff); put_info(buff,INFO_RESULT); if (mysql_info(&mysql)) put_info(mysql_info(&mysql),INFO_RESULT); diff --git a/client/mysqltest.c b/client/mysqltest.c index f469a33f063..181a7fb2b8f 100644 --- a/client/mysqltest.c +++ b/client/mysqltest.c @@ -311,7 +311,7 @@ static int eval_result = 0; void mysql_enable_rpl_parse(MYSQL* mysql __attribute__((unused))) {} void mysql_disable_rpl_parse(MYSQL* mysql __attribute__((unused))) {} int mysql_rpl_parse_enabled(MYSQL* mysql __attribute__((unused))) { return 1; } -int mysql_rpl_probe(MYSQL *mysql __attribute__((unused))) { return 1; } +my_bool mysql_rpl_probe(MYSQL *mysql __attribute__((unused))) { return 1; } #endif #define MAX_SERVER_ARGS 20 @@ -1073,7 +1073,7 @@ int do_disable_rpl_parse(struct st_query* q __attribute__((unused))) } -int do_sleep(struct st_query* q) +int do_sleep(struct st_query* q, my_bool real_sleep) { char *p=q->first_argument; struct timeval t; @@ -2055,6 +2055,36 @@ static void replace_dynstr_append_mem(DYNAMIC_STRING *ds, const char *val, dynstr_append_mem(ds, val, len); } +/* + Append all results to the dynamic string separated with '\t' +*/ + +static void append_result(DYNAMIC_STRING *ds, MYSQL_RES *res) +{ + MYSQL_ROW row; + int num_fields= mysql_num_fields(res); + unsigned long *lengths; + while ((row = mysql_fetch_row(res))) + { + int i; + lengths = mysql_fetch_lengths(res); + for (i = 0; i < num_fields; i++) + { + const char *val= row[i]; + ulonglong len= lengths[i]; + if (!val) + { + val = "NULL"; + len = 4; + } + if (i) + dynstr_append_mem(ds, "\t", 1); + replace_dynstr_append_mem(ds, val, len); + } + dynstr_append_mem(ds, "\n", 1); + } +} + /* * flags control the phased/stages of query execution to be performed @@ -2065,12 +2095,7 @@ static void replace_dynstr_append_mem(DYNAMIC_STRING *ds, const char *val, int run_query(MYSQL* mysql, struct st_query* q, int flags) { MYSQL_RES* res = 0; - MYSQL_FIELD* fields; - MYSQL_ROW row; - int num_fields,i, error = 0; - unsigned long* lengths; - char* val; - int len; + int i, error = 0; DYNAMIC_STRING *ds; DYNAMIC_STRING ds_tmp; DYNAMIC_STRING eval_query; @@ -2178,45 +2203,37 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags) goto end; } - if (!res) - goto end; - - if (!disable_result_log) + if (!disable_result_log && res) { - fields = mysql_fetch_fields(res); - num_fields = mysql_num_fields(res); + int num_fields= mysql_num_fields(res); + MYSQL_FIELD *fields= mysql_fetch_fields(res); for (i = 0; i < num_fields; i++) { if (i) dynstr_append_mem(ds, "\t", 1); dynstr_append(ds, fields[i].name); } - dynstr_append_mem(ds, "\n", 1); + append_result(ds, res); + } - while ((row = mysql_fetch_row(res))) + /* Add all warnings to the result */ + if (!disable_result_log && mysql_warning_count(mysql)) + { + MYSQL_RES *warn_res= mysql_warnings(mysql); + if (!warn_res) + verbose_msg("Warning count is %d but didn't get any warnings\n", + mysql_warning_count(mysql)); + else { - lengths = mysql_fetch_lengths(res); - for (i = 0; i < num_fields; i++) - { - val = (char*)row[i]; - len = lengths[i]; - - if (!val) - { - val = (char*)"NULL"; - len = 4; - } - - if (i) - dynstr_append_mem(ds, "\t", 1); - replace_dynstr_append_mem(ds, val, len); - } - dynstr_append_mem(ds, "\n", 1); + dynstr_append_mem(ds, "Warnings:\n", 10); + append_result(ds, warn_res); + mysql_free_result(warn_res); } - if (glob_replace) - free_replace(); } + if (glob_replace) + free_replace(); + if (record) { if (!q->record_file[0] && !result_file) diff --git a/configure.in b/configure.in index 5cd299a8ba0..8ca1a0befed 100644 --- a/configure.in +++ b/configure.in @@ -10,7 +10,7 @@ AM_CONFIG_HEADER(config.h) PROTOCOL_VERSION=10 DOT_FRM_VERSION=6 # See the libtool docs for information on how to do shared lib versions. -SHARED_LIB_VERSION=11:0:0 +SHARED_LIB_VERSION=12:0:0 # Set all version vars based on $VERSION. How do we do this more elegant ? # Remember that regexps needs to quote [ and ] since this is run through m4 diff --git a/include/errmsg.h b/include/errmsg.h index 175089ba371..d97522f0972 100644 --- a/include/errmsg.h +++ b/include/errmsg.h @@ -63,15 +63,12 @@ extern const char *client_errors[]; /* Error messages */ #define CR_PROBE_MASTER_CONNECT 2025 /* new 4.1 error codes */ -#define CR_INVALID_CONN_HANDLE 2026 -#define CR_NULL_POINTER 2027 -#define CR_MEMORY_ERROR 2028 -#define CR_NO_PREPARE_STMT 2029 -#define CR_NOT_ALL_PARAMS_BOUND 2030 -#define CR_DATA_TRUNCATED 2031 -#define CR_NOT_ALL_BUFFERS_BOUND 2032 -#define CR_FAILED_TO_SET_PARAM_DATA 2033 -#define CR_NO_PARAMETERS_EXISTS 2033 -#define CR_INVALID_PARAMETER_NO 2035 -#define CR_INVALID_BUFFER_USE 2036 - +#define CR_INVALID_CONN_HANDLE 2026 +#define CR_NULL_POINTER 2027 +#define CR_NO_PREPARE_STMT 2028 +#define CR_NOT_ALL_PARAMS_BOUND 2029 +#define CR_DATA_TRUNCATED 2030 +#define CR_NO_PARAMETERS_EXISTS 2031 +#define CR_INVALID_PARAMETER_NO 2032 +#define CR_INVALID_BUFFER_USE 2033 +#define CR_UNSUPPORTED_PARAM_TYPE 2034 diff --git a/include/mysql.h b/include/mysql.h index 50543c51f6b..376de1a0e08 100644 --- a/include/mysql.h +++ b/include/mysql.h @@ -157,7 +157,8 @@ enum mysql_rpl_type { MYSQL_RPL_MASTER, MYSQL_RPL_SLAVE, MYSQL_RPL_ADMIN }; -typedef struct st_mysql { +typedef struct st_mysql +{ NET net; /* Communication parameters */ gptr connector_fd; /* ConnectorFd for SSL */ char *host,*user,*passwd,*unix_socket,*server_version,*host_info, @@ -175,6 +176,7 @@ typedef struct st_mysql { unsigned int field_count; unsigned int server_status; unsigned int server_language; + unsigned int warning_count; struct st_mysql_options options; enum mysql_status status; my_bool free_me; /* If free in mysql_close */ @@ -273,12 +275,13 @@ my_ulonglong STDCALL mysql_affected_rows(MYSQL *mysql); my_ulonglong STDCALL mysql_insert_id(MYSQL *mysql); unsigned int STDCALL mysql_errno(MYSQL *mysql); const char * STDCALL mysql_error(MYSQL *mysql); +uint STDCALL mysql_warning_count(MYSQL *mysql); const char * STDCALL mysql_info(MYSQL *mysql); unsigned long STDCALL mysql_thread_id(MYSQL *mysql); const char * STDCALL mysql_character_set_name(MYSQL *mysql); MYSQL * STDCALL mysql_init(MYSQL *mysql); -int STDCALL mysql_ssl_set(MYSQL *mysql, const char *key, +my_bool STDCALL mysql_ssl_set(MYSQL *mysql, const char *key, const char *cert, const char *ca, const char *capath, const char *cipher); my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user, @@ -295,19 +298,19 @@ int STDCALL mysql_select_db(MYSQL *mysql, const char *db); int STDCALL mysql_query(MYSQL *mysql, const char *q); int STDCALL mysql_send_query(MYSQL *mysql, const char *q, unsigned long length); -int STDCALL mysql_read_query_result(MYSQL *mysql); +my_bool STDCALL mysql_read_query_result(MYSQL *mysql); int STDCALL mysql_real_query(MYSQL *mysql, const char *q, unsigned long length); /* perform query on master */ -int STDCALL mysql_master_query(MYSQL *mysql, const char *q, - unsigned long length); -int STDCALL mysql_master_send_query(MYSQL *mysql, const char *q, - unsigned long length); +my_bool STDCALL mysql_master_query(MYSQL *mysql, const char *q, + unsigned long length); +my_bool STDCALL mysql_master_send_query(MYSQL *mysql, const char *q, + unsigned long length); /* perform query on slave */ -int STDCALL mysql_slave_query(MYSQL *mysql, const char *q, - unsigned long length); -int STDCALL mysql_slave_send_query(MYSQL *mysql, const char *q, - unsigned long length); +my_bool STDCALL mysql_slave_query(MYSQL *mysql, const char *q, + unsigned long length); +my_bool STDCALL mysql_slave_send_query(MYSQL *mysql, const char *q, + unsigned long length); /* enable/disable parsing of all queries to decide if they go on master or @@ -322,12 +325,12 @@ int STDCALL mysql_rpl_parse_enabled(MYSQL* mysql); void STDCALL mysql_enable_reads_from_master(MYSQL* mysql); void STDCALL mysql_disable_reads_from_master(MYSQL* mysql); /* get the value of the master read flag */ -int STDCALL mysql_reads_from_master_enabled(MYSQL* mysql); +my_bool STDCALL mysql_reads_from_master_enabled(MYSQL* mysql); enum mysql_rpl_type STDCALL mysql_rpl_query_type(const char* q, int len); /* discover the master and its slaves */ -int STDCALL mysql_rpl_probe(MYSQL* mysql); +my_bool STDCALL mysql_rpl_probe(MYSQL* mysql); /* set the master, close/free the old one, if it is not a pivot */ int STDCALL mysql_set_master(MYSQL* mysql, const char* host, @@ -357,6 +360,7 @@ MYSQL_RES * STDCALL mysql_list_fields(MYSQL *mysql, const char *table, MYSQL_RES * STDCALL mysql_list_processes(MYSQL *mysql); MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql); MYSQL_RES * STDCALL mysql_use_result(MYSQL *mysql); +MYSQL_RES * STDCALL mysql_warnings(MYSQL *mysql); int STDCALL mysql_options(MYSQL *mysql,enum mysql_option option, const char *arg); void STDCALL mysql_free_result(MYSQL_RES *result); @@ -401,7 +405,6 @@ int STDCALL mysql_manager_fetch_line(MYSQL_MANAGER* con, int res_buf_size); - /* The following definitions are added for the enhanced client-server protocol @@ -411,67 +414,76 @@ int STDCALL mysql_manager_fetch_line(MYSQL_MANAGER* con, enum MY_STMT_STATE { MY_ST_UNKNOWN, MY_ST_PREPARE, MY_ST_EXECUTE }; /* bind structure */ -typedef struct st_mysql_bind { - - enum enum_field_types buffer_type; /* buffer type */ - enum enum_field_types field_type; /* field type */ - gptr buffer; /* buffer */ - long *length; /* output length pointer */ - unsigned long buffer_length; /* buffer length */ - unsigned long bind_length; /* internal use */ - my_bool is_null; /* NULL indicator */ - my_bool is_long_data; /* long data indicator */ - my_bool long_ended; /* internal use */ - +typedef struct st_mysql_bind +{ + long *length; /* output length pointer */ + gptr buffer; /* buffer */ + unsigned long buffer_length; /* buffer length */ + enum enum_field_types buffer_type; /* buffer type */ + enum enum_field_types field_type; /* field type */ + my_bool is_null; /* NULL indicator */ + my_bool is_long_data; /* long data indicator */ + + /* The following are for internal use. Set by mysql_bind_param */ + long bind_length; /* Default length of data */ + my_bool long_ended; /* All data supplied for long */ + uint param_number; /* For null count and error messages */ + void (*store_param_func)(NET *net, struct st_mysql_bind *param); + char *(*fetch_result)(struct st_mysql_bind *, const char *row); } MYSQL_BIND; -/* statement handler */ -typedef struct st_mysql_stmt { - - MYSQL *mysql; /* connection handle */ - MYSQL_BIND *params; /* input parameters */ - MYSQL_RES *result; /* resultset */ - MYSQL_BIND *bind; /* row binding */ - MYSQL_FIELD *fields; /* prepare meta info */ - MEM_ROOT mem_root; /* root allocations */ - unsigned long param_count; /* parameters count */ - unsigned long field_count; /* fields count */ - unsigned long long_length; /* long buffer alloced length */ - uint err_no; /* error code */ - char error[MYSQL_ERRMSG_SIZE]; /* error message */ - char *query; /* query buffer */ - char *long_data; /* long buffer */ - enum MY_STMT_STATE state; /* statement state */ - my_bool long_alloced; /* flag to indicate long alloced */ - my_bool types_supplied; /* to indicate types supply */ +/* statement handler */ +typedef struct st_mysql_stmt +{ + MYSQL *mysql; /* connection handle */ + MYSQL_BIND *params; /* input parameters */ + MYSQL_RES *result; /* resultset */ + MYSQL_BIND *bind; /* row binding */ + MYSQL_FIELD *fields; /* prepare meta info */ + char *query; /* query buffer */ + MEM_ROOT mem_root; /* root allocations */ + MYSQL_RES tmp_result; /* Used by mysql_prepare_result */ + unsigned long param_count; /* parameters count */ + unsigned long field_count; /* fields count */ + unsigned long long_length; /* long buffer alloced length */ + ulong stmt_id; /* Id for prepared statement */ + uint last_errno; /* error code */ + enum MY_STMT_STATE state; /* statement state */ + char last_error[MYSQL_ERRMSG_SIZE]; /* error message */ + my_bool long_alloced; /* flag to indicate long alloced */ + my_bool types_supplied; /* to indicate types supply */ } MYSQL_STMT; -MYSQL_STMT * STDCALL mysql_prepare(MYSQL * mysql, const char *query); +MYSQL_STMT * STDCALL mysql_prepare(MYSQL * mysql, const char *query, + unsigned long length); int STDCALL mysql_execute(MYSQL_STMT * stmt); unsigned long STDCALL mysql_param_count(MYSQL_STMT * stmt); -int STDCALL mysql_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bind); -int STDCALL mysql_bind_result(MYSQL_STMT * stmt, MYSQL_BIND * bind); -int STDCALL mysql_stmt_close(MYSQL_STMT * stmt); +my_bool STDCALL mysql_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bind); +my_bool STDCALL mysql_bind_result(MYSQL_STMT * stmt, MYSQL_BIND * bind); +my_bool STDCALL mysql_stmt_close(MYSQL_STMT * stmt); uint STDCALL mysql_stmt_errno(MYSQL_STMT * stmt); const char *STDCALL mysql_stmt_error(MYSQL_STMT * stmt); -int STDCALL mysql_commit(MYSQL * mysql); -int STDCALL mysql_rollback(MYSQL * mysql); -int STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode); -int STDCALL mysql_fetch(MYSQL_STMT *stmt); +my_bool STDCALL mysql_commit(MYSQL * mysql); +my_bool STDCALL mysql_rollback(MYSQL * mysql); +my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode); +int STDCALL mysql_fetch(MYSQL_STMT *stmt); my_bool STDCALL mysql_send_long_data(MYSQL_STMT *stmt, - uint param_number,gptr data, - unsigned long length); -int STDCALL mysql_multi_query(MYSQL *mysql,const char *query,unsigned long len); + uint param_number, + const char *data, + unsigned long length, + my_bool last_data); +int STDCALL mysql_multi_query(MYSQL *mysql,const char *query, + unsigned long len); MYSQL_RES *STDCALL mysql_next_result(MYSQL *mysql); -MYSQL_RES * STDCALL mysql_prepare_result(MYSQL_STMT *stmt); +MYSQL_RES *STDCALL mysql_prepare_result(MYSQL_STMT *stmt); /* new status messages */ #define MYSQL_SUCCESS 0 #define MYSQL_WARNING 1 -#define MYSQL_ERROR -1 +#define MYSQL_STATUS_ERROR 2 #define MYSQL_NO_DATA 100 #define MYSQL_NEED_DATA 99 #define MYSQL_LONG_DATA_END 0xFF @@ -492,8 +504,9 @@ int STDCALL mysql_drop_db(MYSQL *mysql, const char *DB); They are not for general usage */ -int simple_command(MYSQL *mysql,enum enum_server_command command, - const char *arg, unsigned long length, my_bool skipp_check); +my_bool +simple_command(MYSQL *mysql,enum enum_server_command command, const char *arg, + ulong length, my_bool skip_check); unsigned long net_safe_read(MYSQL* mysql); #ifdef __cplusplus diff --git a/include/mysql_com.h b/include/mysql_com.h index 9743fc4c3f5..1edaa99db28 100644 --- a/include/mysql_com.h +++ b/include/mysql_com.h @@ -34,15 +34,15 @@ #define MYSQL_SERVICENAME "MySql" #endif /* __WIN__ */ -enum enum_server_command {COM_SLEEP,COM_QUIT,COM_INIT_DB,COM_QUERY, - COM_FIELD_LIST,COM_CREATE_DB,COM_DROP_DB,COM_REFRESH, - COM_SHUTDOWN,COM_STATISTICS, - COM_PROCESS_INFO,COM_CONNECT,COM_PROCESS_KILL, - COM_DEBUG,COM_PING,COM_TIME,COM_DELAYED_INSERT, - COM_CHANGE_USER, COM_BINLOG_DUMP, - COM_TABLE_DUMP, COM_CONNECT_OUT, - COM_REGISTER_SLAVE, - COM_PREPARE,COM_EXECUTE,COM_LONG_DATA }; +enum enum_server_command +{ + COM_SLEEP, COM_QUIT, COM_INIT_DB, COM_QUERY, COM_FIELD_LIST, + COM_CREATE_DB, COM_DROP_DB, COM_REFRESH, COM_SHUTDOWN, COM_STATISTICS, + COM_PROCESS_INFO, COM_CONNECT, COM_PROCESS_KILL, COM_DEBUG, COM_PING, + COM_TIME, COM_DELAYED_INSERT, COM_CHANGE_USER, COM_BINLOG_DUMP, + COM_TABLE_DUMP, COM_CONNECT_OUT, COM_REGISTER_SLAVE, + COM_PREPARE, COM_EXECUTE, COM_LONG_DATA, COM_CLOSE_STMT +}; #define NOT_NULL_FLAG 1 /* Field can't be NULL */ #define PRI_KEY_FLAG 2 /* Field is part of a primary key */ @@ -98,8 +98,9 @@ enum enum_server_command {COM_SLEEP,COM_QUIT,COM_INIT_DB,COM_QUERY, #define CLIENT_TRANSACTIONS 8192 /* Client knows about transactions */ #define CLIENT_PROTOCOL_41 16384 /* New 4.1 protocol */ -#define SERVER_STATUS_IN_TRANS 1 /* Transaction has started */ -#define SERVER_STATUS_AUTOCOMMIT 2 /* Server in auto_commit mode */ +#define SERVER_STATUS_IN_TRANS 1 /* Transaction has started */ +#define SERVER_STATUS_AUTOCOMMIT 2 /* Server in auto_commit mode */ +#define SERVER_STATUS_MORE_RESULTS 4 /* More results on server */ #define MYSQL_ERRMSG_SIZE 200 #define NET_READ_TIMEOUT 30 /* Timeout on read */ @@ -203,21 +204,26 @@ enum enum_field_types { MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY, extern "C" { #endif -int my_net_init(NET *net, Vio* vio); +my_bool my_net_init(NET *net, Vio* vio); void my_net_local_init(NET *net); void net_end(NET *net); void net_clear(NET *net); -int net_flush(NET *net); -int my_net_write(NET *net,const char *packet,unsigned long len); -int net_write_command(NET *net,unsigned char command,const char *packet, - unsigned long len); +my_bool net_realloc(NET *net, unsigned long length); +my_bool net_flush(NET *net); +my_bool my_net_write(NET *net,const char *packet,unsigned long len); +my_bool net_write_command(NET *net,unsigned char command, + const char *header, unsigned long head_len, + const char *packet, unsigned long len); int net_real_write(NET *net,const char *packet,unsigned long len); unsigned long my_net_read(NET *net); -/* The following function is not meant for normal usage */ +/* + The following function is not meant for normal usage + Currently it's used internally by manager.c +*/ struct sockaddr; -int my_connect(my_socket s, const struct sockaddr *name, unsigned int namelen, - unsigned int timeout); +my_bool my_connect(my_socket s, const struct sockaddr *name, + unsigned int namelen, unsigned int timeout); struct rand_struct { unsigned long seed1,seed2,max_value; @@ -291,6 +297,6 @@ void my_thread_end(void); #endif #define NULL_LENGTH ((unsigned long) ~0) /* For net_store_length */ -#define MYSQL_LONG_DATA_END 0xFF /* For indication of long data ending */ +#define MYSQL_LONG_DATA_HEADER 8 #endif diff --git a/include/mysqld_error.h b/include/mysqld_error.h index 635d8390c2c..fc5df43f309 100644 --- a/include/mysqld_error.h +++ b/include/mysqld_error.h @@ -257,4 +257,5 @@ #define ER_KEY_REF_DO_NOT_MATCH_TABLE_REF 1238 #define ER_SUBSELECT_NO_1_COL 1239 #define ER_SUBSELECT_NO_1_ROW 1240 -#define ER_ERROR_MESSAGES 241 +#define ER_UNKNOWN_STMT_HANDLER 1241 +#define ER_ERROR_MESSAGES 242 diff --git a/isam/pack_isam.c b/isam/pack_isam.c index 8a00b4c962a..ebe616714f5 100644 --- a/isam/pack_isam.c +++ b/isam/pack_isam.c @@ -687,7 +687,8 @@ static HUFF_COUNTS *init_huff_count(N_INFO *info,my_off_t records) (type == FIELD_NORMAL || type == FIELD_SKIP_ZERO)) count[i].max_zero_fill= count[i].field_length; - init_tree(&count[i].int_tree,0,0,-1,(qsort_cmp2) compare_tree,0,NULL,NULL); + init_tree(&count[i].int_tree,0,0,-1,(qsort_cmp2) compare_tree,0, + NULL, NULL); if (records) count[i].tree_pos=count[i].tree_buff = my_malloc(count[i].field_length > 1 ? tree_buff_length : 2, diff --git a/libmysql/Makefile.am b/libmysql/Makefile.am index fac544ba44d..3d380c14076 100644 --- a/libmysql/Makefile.am +++ b/libmysql/Makefile.am @@ -49,10 +49,6 @@ link_sources: rm -f $(srcdir)/$$f; \ @LN_CP_F@ $(srcdir)/../strings/$$f $(srcdir)/$$f; \ done; \ - for f in $(mystringsgen); do \ - rm -f $(srcdir)/$$f; \ - @LN_CP_F@ ../strings/$$f $(srcdir)/$$f; \ - done; \ for f in $$qs; do \ rm -f $(srcdir)/$$f; \ @LN_CP_F@ $(srcdir)/../sql/$$f $(srcdir)/$$f; \ diff --git a/libmysql/Makefile.shared b/libmysql/Makefile.shared index a1020709d22..0f7cb713d54 100644 --- a/libmysql/Makefile.shared +++ b/libmysql/Makefile.shared @@ -39,9 +39,10 @@ mystringsobjects = strmov.lo strxmov.lo strxnmov.lo strnmov.lo \ bchange.lo bmove.lo bmove_upp.lo longlong2str.lo \ strtoull.lo strtoll.lo llstr.lo \ ctype.lo ctype-simple.lo ctype-mb.lo \ - ctype-big5.lo ctype-czech.lo ctype-euc_kr.lo ctype-win1250ch.lo\ + ctype-big5.lo ctype-czech.lo ctype-euc_kr.lo \ + ctype-win1250ch.lo ctype-utf8.lo \ ctype-gb2312.lo ctype-gbk.lo ctype-latin1_de.lo \ - ctype-sjis.lo ctype-tis620.lo ctype-ujis.lo ctype-utf8.lo + ctype-sjis.lo ctype-tis620.lo ctype-ujis.lo mystringsextra= strto.c dbugobjects = dbug.lo # IT IS IN SAFEMALLOC.C sanity.lo diff --git a/libmysql/errmsg.c b/libmysql/errmsg.c index f1cf667f774..581bb184ff3 100644 --- a/libmysql/errmsg.c +++ b/libmysql/errmsg.c @@ -52,15 +52,13 @@ const char *client_errors[]= "Error connecting to master:", "Invalid connection handle", "Invalid use of null pointer", - "Memory allocation error", "Statement not prepared", "Not all parameters data supplied", "Data truncated", - "Not all parameters bound for the row fetch", - "Failed to send the parameter data", "No parameters exists in the statement", "Invalid parameter number", - "Can't send long data for non string or binary data types" + "Can't send long data for non string or binary data types (parameter: %d)", + "Using not supported parameter type: %d (parameter: %d)" }; /* Start of code added by Roberto M. Serqueira - martinsc@uol.com.br - 05.24.2001 */ @@ -96,15 +94,13 @@ const char *client_errors[]= "Error connecting to master:", "Invalid connection handle", "Invalid use of null pointer", - "Memory allocation error", "Statement not prepared", "Not all parameters data supplied", "Data truncated", - "Not all parameters bound for the row fetch", - "Failed to send the parameter data", "No parameters exists in the statement", "Invalid parameter number", - "Can't send long data for non string or binary data types" + "Can't send long data for non string or binary data types (parameter: %d)", + "Using not supported parameter type: %d (parameter: %d)" }; #else /* ENGLISH */ @@ -138,15 +134,13 @@ const char *client_errors[]= "Error connecting to master:", "Invalid connection handle", "Invalid use of null pointer", - "Memory allocation error", "Statement not prepared", "Not all parameters data supplied", "Data truncated", - "Not all parameters bound for the row fetch", - "Failed to send the parameter data", "No parameters exists in the statement", "Invalid parameter number", - "Can't send long data for non string or binary data types" + "Can't send long data for non string or binary data types (parameter: %d)", + "Using not supported parameter type: %d (parameter: %d)" }; #endif diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index 052907d8c28..16fecc8038f 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -31,6 +31,7 @@ #include #include #include +#include /* for DBUG_ASSERT() */ #ifdef HAVE_PWD_H #include #endif @@ -56,8 +57,6 @@ #define INADDR_NONE -1 #endif -#include /* for DBUG_ASSERT() */ - static my_bool mysql_client_init=0; uint mysql_port=0; my_string mysql_unix_port=0; @@ -66,9 +65,9 @@ ulong max_allowed_packet=16*1024*1024L; ulong net_read_timeout= NET_READ_TIMEOUT; ulong net_write_timeout= NET_WRITE_TIMEOUT; -#define CLIENT_CAPABILITIES (CLIENT_LONG_PASSWORD | CLIENT_LONG_FLAG\ - | CLIENT_LOCAL_FILES | CLIENT_TRANSACTIONS\ - | CLIENT_PROTOCOL_41) +#define CLIENT_CAPABILITIES (CLIENT_LONG_PASSWORD | CLIENT_LONG_FLAG \ + | CLIENT_LOCAL_FILES | CLIENT_TRANSACTIONS \ + | CLIENT_PROTOCOL_41) #ifdef __WIN__ @@ -85,10 +84,11 @@ ulong net_write_timeout= NET_WRITE_TIMEOUT; #define SOCKET_ERROR -1 #endif /* __WIN__ */ -#define MAX_LONG_DATA_LENGTH 8192 /* if allowed through some - configuration, then this needs to - be changed - */ +/* + If allowed through some configuration, then this needs to + be changed +*/ +#define MAX_LONG_DATA_LENGTH 8192 #define protocol_41(A) ((A)->server_capabilities & CLIENT_PROTOCOL_41) #define unsigned_field(A) ((A)->flags & UNSIGNED_FLAG) @@ -101,7 +101,7 @@ static void end_server(MYSQL *mysql); static void read_user_name(char *name); static void append_wild(char *to,char *end,const char *wild); static my_bool mysql_reconnect(MYSQL *mysql); -static int send_file_to_server(MYSQL *mysql,const char *filename); +static my_bool send_file_to_server(MYSQL *mysql,const char *filename); static sig_handler pipe_sig_handler(int sig); static ulong mysql_sub_escape_string(CHARSET_INFO *charset_info, char *to, const char *from, ulong length); @@ -160,7 +160,7 @@ static MYSQL* spawn_init(MYSQL* parent, const char* host, /**************************************************************************** - A modified version of connect(). connect2() allows you to specify + A modified version of connect(). my_connect() allows you to specify a timeout value, in seconds, that we should wait until we derermine we can't connect to a particular host. If timeout is 0, my_connect() will behave exactly like connect(). @@ -168,11 +168,11 @@ static MYSQL* spawn_init(MYSQL* parent, const char* host, Base version coded by Steve Bernacki, Jr. *****************************************************************************/ -int my_connect(my_socket s, const struct sockaddr *name, uint namelen, - uint timeout) +my_bool my_connect(my_socket s, const struct sockaddr *name, + uint namelen, uint timeout) { #if defined(__WIN__) || defined(OS2) - return connect(s, (struct sockaddr*) name, namelen); + return connect(s, (struct sockaddr*) name, namelen) != 0; #else int flags, res, s_err; SOCKOPT_OPTLEN_TYPE s_err_size = sizeof(uint); @@ -185,7 +185,7 @@ int my_connect(my_socket s, const struct sockaddr *name, uint namelen, */ if (timeout == 0) - return connect(s, (struct sockaddr*) name, namelen); + return connect(s, (struct sockaddr*) name, namelen) != 0; flags = fcntl(s, F_GETFL, 0); /* Set socket to not block */ #ifdef O_NONBLOCK @@ -198,7 +198,7 @@ int my_connect(my_socket s, const struct sockaddr *name, uint namelen, if ((res != 0) && (s_err != EINPROGRESS)) { errno = s_err; /* Restore it */ - return(-1); + return(1); } if (res == 0) /* Connected quickly! */ return(0); @@ -243,7 +243,7 @@ int my_connect(my_socket s, const struct sockaddr *name, uint namelen, now_time=time(NULL); timeout-= (uint) (now_time - start_time); if (errno != EINTR || (int) timeout <= 0) - return -1; + return 1; } /* select() returned something more interesting than zero, let's @@ -253,12 +253,12 @@ int my_connect(my_socket s, const struct sockaddr *name, uint namelen, s_err=0; if (getsockopt(s, SOL_SOCKET, SO_ERROR, (char*) &s_err, &s_err_size) != 0) - return(-1); + return(1); if (s_err) { /* getsockopt could succeed */ errno = s_err; - return(-1); /* but return an error... */ + return(1); /* but return an error... */ } return(0); /* It's all good! */ #endif @@ -464,44 +464,45 @@ static void free_rows(MYSQL_DATA *cur) } -int -simple_command(MYSQL *mysql,enum enum_server_command command, const char *arg, - ulong length, my_bool skipp_check) +static my_bool +advanced_command(MYSQL *mysql, enum enum_server_command command, + const char *header, ulong header_length, + const char *arg, ulong arg_length, my_bool skip_check) { NET *net= &mysql->net; - int result= -1; + my_bool result= 1; init_sigpipe_variables /* Don't give sigpipe errors if the client doesn't want them */ set_sigpipe(mysql); + if (mysql->net.vio == 0) { /* Do reconnect if possible */ if (mysql_reconnect(mysql)) - goto end; + return 1; } if (mysql->status != MYSQL_STATUS_READY) { strmov(net->last_error,ER(mysql->net.last_errno=CR_COMMANDS_OUT_OF_SYNC)); - goto end; + return 1; } mysql->net.last_error[0]=0; mysql->net.last_errno=0; mysql->info=0; mysql->affected_rows= ~(my_ulonglong) 0; - net_clear(net); /* Clear receive buffer */ - if (!arg) - arg=""; + net_clear(&mysql->net); /* Clear receive buffer */ - if (net_write_command(net,(uchar) command,arg, - length ? length : (ulong) strlen(arg))) + if (net_write_command(net,(uchar) command, header, header_length, + arg, arg_length)) { - DBUG_PRINT("error",("Can't send command to server. Error: %d",socket_errno)); + DBUG_PRINT("error",("Can't send command to server. Error: %d", + socket_errno)); end_server(mysql); if (mysql_reconnect(mysql)) goto end; - if (net_write_command(net,(uchar) command,arg, - length ? length : (ulong) strlen(arg))) + if (net_write_command(net,(uchar) command, header, header_length, + arg, arg_length)) { net->last_errno=CR_SERVER_GONE_ERROR; strmov(net->last_error,ER(net->last_errno)); @@ -509,15 +510,23 @@ simple_command(MYSQL *mysql,enum enum_server_command command, const char *arg, } } result=0; - if (!skipp_check) + if (!skip_check) result= ((mysql->packet_length=net_safe_read(mysql)) == packet_error ? - -1 : 0); + 1 : 0); end: reset_sigpipe(mysql); return result; } +my_bool +simple_command(MYSQL *mysql,enum enum_server_command command, const char *arg, + ulong length, my_bool skip_check) +{ + return advanced_command(mysql, command, NullS, 0, arg, length, skip_check); +} + + static void free_old_query(MYSQL *mysql) { DBUG_ENTER("free_old_query"); @@ -529,6 +538,7 @@ static void free_old_query(MYSQL *mysql) DBUG_VOID_RETURN; } + #if defined(HAVE_GETPWUID) && defined(NO_GETPWUID_DECL) struct passwd *getpwuid(uid_t); char* getlogin(void); @@ -606,7 +616,6 @@ append_wild(char *to, char *end, const char *wild) } - /************************************************************************** Init debugging if MYSQL_DEBUG environment variable is found **************************************************************************/ @@ -691,13 +700,13 @@ mysql_free_result(MYSQL_RES *result) { if (result->handle && result->handle->status == MYSQL_STATUS_USE_RESULT) { - DBUG_PRINT("warning",("Not all rows in set were read; Ignoring rows")); + DBUG_PRINT("warning",("Not all rows in set where read; Ignoring rows")); for (;;) { ulong pkt_len; if ((pkt_len=net_safe_read(result->handle)) == packet_error) break; - if (pkt_len == 1 && result->handle->net.read_pos[0] == 254) + if (pkt_len <= 8 && result->handle->net.read_pos[0] == 254) break; /* End of data */ } result->handle->status=MYSQL_STATUS_READY; @@ -906,9 +915,11 @@ unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields, field=result=(MYSQL_FIELD*) alloc_root(alloc, (uint) sizeof(MYSQL_FIELD)*fields); if (!result) + { + free_rows(data); /* Free old data */ DBUG_RETURN(0); - - if(server_capabilities & CLIENT_PROTOCOL_41) + } + if (server_capabilities & CLIENT_PROTOCOL_41) { /* server is 4.1, and returns the new field result format */ for (row=data->data; row ; row = row->next,field++) @@ -933,8 +944,10 @@ unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields, field->max_length= 0; } } - else /* old ones, for backward compatibility */ +#ifndef DELETE_SUPPORT_OF_4_0_PROTOCOL + else { + /* old protocol, for backward compatibility */ for (row=data->data; row ; row = row->next,field++) { field->org_table= field->table= strdup_root(alloc,(char*) row->data[0]); @@ -961,6 +974,7 @@ unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields, field->max_length= 0; } } +#endif /* DELETE_SUPPORT_OF_4_0_PROTOCOL */ free_rows(data); /* Free old data */ DBUG_RETURN(result); } @@ -996,14 +1010,22 @@ static MYSQL_DATA *read_rows(MYSQL *mysql,MYSQL_FIELD *mysql_fields, result->rows=0; result->fields=fields; - while (*(cp=net->read_pos) != 254 || pkt_len != 1) + /* + The last EOF packet is either a single 254 character or (in MySQL 4.1) + 254 followed by 1-7 status bytes. + + This doesn't conflict with normal usage of 254 which stands for a + string where the length of the string is 8 bytes. (see net_field_length()) + */ + + while (*(cp=net->read_pos) != 254 || pkt_len >= 8) { result->rows++; if (!(cur= (MYSQL_ROWS*) alloc_root(&result->alloc, - sizeof(MYSQL_ROWS))) || + sizeof(MYSQL_ROWS))) || !(cur->data= ((MYSQL_ROW) alloc_root(&result->alloc, - (fields+1)*sizeof(char *)+pkt_len)))) + (fields+1)*sizeof(char *)+pkt_len)))) { free_rows(result); net->last_errno=CR_OUT_OF_MEMORY; @@ -1040,6 +1062,11 @@ static MYSQL_DATA *read_rows(MYSQL *mysql,MYSQL_FIELD *mysql_fields, } } *prev_ptr=0; /* last pointer is null */ + if (pkt_len > 1) /* MySQL 4.1 protocol */ + { + mysql->warning_count= uint2korr(cp+1); + DBUG_PRINT("info",("warning_count: %ld", mysql->warning_count)); + } DBUG_PRINT("exit",("Got %d rows",result->rows)); DBUG_RETURN(result); } @@ -1060,8 +1087,12 @@ read_one_row(MYSQL *mysql,uint fields,MYSQL_ROW row, ulong *lengths) if ((pkt_len=net_safe_read(mysql)) == packet_error) return -1; - if (pkt_len == 1 && mysql->net.read_pos[0] == 254) + if (pkt_len <= 8 && mysql->net.read_pos[0] == 254) + { + if (pkt_len > 1) /* MySQL 4.1 protocol */ + mysql->warning_count= uint2korr(mysql->net.read_pos+1); return 1; /* End of data */ + } prev_pos= 0; /* allowed to write at packet[-1] */ pos=mysql->net.read_pos; for (field=0 ; field < fields ; field++) @@ -1087,7 +1118,7 @@ read_one_row(MYSQL *mysql,uint fields,MYSQL_ROW row, ulong *lengths) } /* perform query on master */ -int STDCALL mysql_master_query(MYSQL *mysql, const char *q, +my_bool STDCALL mysql_master_query(MYSQL *mysql, const char *q, unsigned long length) { if (mysql_master_send_query(mysql, q, length)) @@ -1095,8 +1126,8 @@ int STDCALL mysql_master_query(MYSQL *mysql, const char *q, return mysql_read_query_result(mysql); } -int STDCALL mysql_master_send_query(MYSQL *mysql, const char *q, - unsigned long length) +my_bool STDCALL mysql_master_send_query(MYSQL *mysql, const char *q, + unsigned long length) { MYSQL*master = mysql->master; if (!length) @@ -1109,15 +1140,16 @@ int STDCALL mysql_master_send_query(MYSQL *mysql, const char *q, /* perform query on slave */ -int STDCALL mysql_slave_query(MYSQL *mysql, const char *q, - unsigned long length) +my_bool STDCALL mysql_slave_query(MYSQL *mysql, const char *q, + unsigned long length) { if (mysql_slave_send_query(mysql, q, length)) return 1; return mysql_read_query_result(mysql); } -int STDCALL mysql_slave_send_query(MYSQL *mysql, const char *q, + +my_bool STDCALL mysql_slave_send_query(MYSQL *mysql, const char *q, unsigned long length) { MYSQL* last_used_slave, *slave_to_use = 0; @@ -1169,7 +1201,7 @@ void STDCALL mysql_disable_reads_from_master(MYSQL* mysql) } /* get the value of the master read flag */ -int STDCALL mysql_reads_from_master_enabled(MYSQL* mysql) +my_bool STDCALL mysql_reads_from_master_enabled(MYSQL* mysql) { return !(mysql->options.no_master_reads); } @@ -1198,7 +1230,7 @@ static void expand_error(MYSQL* mysql, int error) read the given result and row */ -static int get_master(MYSQL* mysql, MYSQL_RES* res, MYSQL_ROW row) +static my_bool get_master(MYSQL* mysql, MYSQL_RES* res, MYSQL_ROW row) { MYSQL* master; DBUG_ENTER("get_master"); @@ -1218,11 +1250,11 @@ static int get_master(MYSQL* mysql, MYSQL_RES* res, MYSQL_ROW row) retrieve all the slaves */ -static int get_slaves_from_master(MYSQL* mysql) +static my_bool get_slaves_from_master(MYSQL* mysql) { MYSQL_RES* res = 0; MYSQL_ROW row; - int error = 1; + my_bool error = 1; int has_auth_info; int port_ind; DBUG_ENTER("get_slaves_from_master"); @@ -1285,11 +1317,11 @@ err: } -int STDCALL mysql_rpl_probe(MYSQL* mysql) +my_bool STDCALL mysql_rpl_probe(MYSQL* mysql) { MYSQL_RES *res= 0; MYSQL_ROW row; - int error = 1; + my_bool error= 1; DBUG_ENTER("mysql_rpl_probe"); /* @@ -1473,7 +1505,7 @@ static void mysql_once_init() #define strdup_if_not_null(A) (A) == 0 ? 0 : my_strdup((A),MYF(MY_WME)) -int STDCALL +my_bool STDCALL mysql_ssl_set(MYSQL *mysql __attribute__((unused)) , const char *key __attribute__((unused)), const char *cert __attribute__((unused)), @@ -1497,7 +1529,7 @@ mysql_ssl_set(MYSQL *mysql __attribute__((unused)) , NB! Errors are not reported until you do mysql_real_connect. **************************************************************************/ -static int +static void mysql_ssl_free(MYSQL *mysql __attribute__((unused))) { #ifdef HAVE_OPENSSL @@ -1515,7 +1547,6 @@ mysql_ssl_free(MYSQL *mysql __attribute__((unused))) mysql->options.use_ssl = FALSE; mysql->connector_fd = 0; #endif /* HAVE_OPENSSL */ - return 0; } /************************************************************************** @@ -1635,7 +1666,7 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user, UNIXaddr.sun_family = AF_UNIX; strmov(UNIXaddr.sun_path, unix_socket); if (my_connect(sock,(struct sockaddr *) &UNIXaddr, sizeof(UNIXaddr), - mysql->options.connect_timeout) <0) + mysql->options.connect_timeout)) { DBUG_PRINT("error",("Got error %d on connect to local server",socket_errno)); net->last_errno=CR_CONNECTION_ERROR; @@ -2264,7 +2295,7 @@ mysql_send_query(MYSQL* mysql, const char* query, ulong length) } -int STDCALL mysql_read_query_result(MYSQL *mysql) +my_bool STDCALL mysql_read_query_result(MYSQL *mysql) { uchar *pos; ulong field_count; @@ -2272,13 +2303,14 @@ int STDCALL mysql_read_query_result(MYSQL *mysql) ulong length; DBUG_ENTER("mysql_read_query_result"); - /* read from the connection which we actually used, which - could differ from the original connection if we have slaves - */ + /* + Read from the connection which we actually used, which + could differ from the original connection if we have slaves + */ mysql = mysql->last_used_con; if ((length = net_safe_read(mysql)) == packet_error) - DBUG_RETURN(-1); + DBUG_RETURN(1); free_old_query(mysql); /* Free old result */ get_info: pos=(uchar*) mysql->net.read_pos; @@ -2286,10 +2318,18 @@ get_info: { mysql->affected_rows= net_field_length_ll(&pos); mysql->insert_id= net_field_length_ll(&pos); - if (mysql->server_capabilities & CLIENT_TRANSACTIONS) + if (mysql->server_capabilities & CLIENT_PROTOCOL_41) { mysql->server_status=uint2korr(pos); pos+=2; + mysql->warning_count=uint2korr(pos); pos+=2; } + else if (mysql->server_capabilities & CLIENT_TRANSACTIONS) + { + mysql->server_status=uint2korr(pos); pos+=2; + mysql->warning_count= 0; + } + DBUG_PRINT("info",("status: %ld warning_count: %ld", + mysql->server_status, mysql->warning_count)); if (pos < mysql->net.read_pos+length && net_field_length(&pos)) mysql->info=(char*) pos; DBUG_RETURN(0); @@ -2298,7 +2338,7 @@ get_info: { int error=send_file_to_server(mysql,(char*) pos); if ((length=net_safe_read(mysql)) == packet_error || error) - DBUG_RETURN(-1); + DBUG_RETURN(1); goto get_info; /* Get info packet */ } if (!(mysql->server_status & SERVER_STATUS_AUTOCOMMIT)) @@ -2306,14 +2346,15 @@ get_info: mysql->extra_info= net_field_length_ll(&pos); /* Maybe number of rec */ - if (!(fields=read_rows(mysql,(MYSQL_FIELD*)0,protocol_41(mysql) ? 8:5))) - DBUG_RETURN(-1); + if (!(fields=read_rows(mysql,(MYSQL_FIELD*)0, (protocol_41(mysql) ? 8 : 5)))) + DBUG_RETURN(1); if (!(mysql->fields=unpack_fields(fields,&mysql->field_alloc, (uint) field_count,0, mysql->server_capabilities))) - DBUG_RETURN(-1); - mysql->status=MYSQL_STATUS_GET_RESULT; + DBUG_RETURN(1); + mysql->status= MYSQL_STATUS_GET_RESULT; mysql->field_count= (uint) field_count; + mysql->warning_count= 0; DBUG_RETURN(0); } @@ -2326,15 +2367,16 @@ mysql_real_query(MYSQL *mysql, const char *query, ulong length) DBUG_PRINT("query",("Query = \"%s\"",query)); if (mysql_send_query(mysql,query,length)) - DBUG_RETURN(-1); - DBUG_RETURN(mysql_read_query_result(mysql)); + DBUG_RETURN(1); + DBUG_RETURN((int) mysql_read_query_result(mysql)); } -static int +static my_bool send_file_to_server(MYSQL *mysql, const char *filename) { - int fd, readcount, result= -1; + int fd, readcount; + my_bool result= 1; uint packet_length=MY_ALIGN(mysql->net.max_packet-16,IO_SIZE); char *buf, tmp_name[FN_REFLEN]; DBUG_ENTER("send_file_to_server"); @@ -2342,7 +2384,7 @@ send_file_to_server(MYSQL *mysql, const char *filename) if (!(buf=my_malloc(packet_length,MYF(0)))) { strmov(mysql->net.last_error, ER(mysql->net.last_errno=CR_OUT_OF_MEMORY)); - DBUG_RETURN(-1); + DBUG_RETURN(1); } fn_format(tmp_name,filename,"","",4); /* Convert to client format */ @@ -2675,7 +2717,8 @@ mysql_list_fields(MYSQL *mysql, const char *table, const char *wild) end=strmake(strmake(buff, table,128)+1,wild ? wild : "",128); if (simple_command(mysql,COM_FIELD_LIST,buff,(ulong) (end-buff),1) || - !(query = read_rows(mysql,(MYSQL_FIELD*)0,protocol_41(mysql) ? 9:6))) + !(query = read_rows(mysql,(MYSQL_FIELD*) 0, + (protocol_41(mysql) ? 9 : 6)))) DBUG_RETURN(NULL); free_old_query(mysql); @@ -2689,11 +2732,13 @@ mysql_list_fields(MYSQL *mysql, const char *table, const char *wild) mysql->fields=0; result->field_count = (uint) query->rows; result->fields= unpack_fields(query,&result->field_alloc, - result->field_count,1,mysql->server_capabilities); + result->field_count, 1, + mysql->server_capabilities); result->eof=1; DBUG_RETURN(result); } + /* List all running processes (threads) in server */ MYSQL_RES * STDCALL @@ -2869,7 +2914,7 @@ mysql_options(MYSQL *mysql,enum mysql_option option, const char *arg) mysql->options.charset_name=my_strdup(arg,MYF(MY_WME)); break; default: - DBUG_RETURN(-1); + DBUG_RETURN(1); } DBUG_RETURN(0); } @@ -2942,6 +2987,11 @@ const char * STDCALL mysql_error(MYSQL *mysql) return mysql->net.last_error; } +uint STDCALL mysql_warning_count(MYSQL *mysql) +{ + return mysql->warning_count; +} + const char *STDCALL mysql_info(MYSQL *mysql) { return mysql->info; @@ -2967,6 +3017,18 @@ uint STDCALL mysql_thread_safe(void) #endif } +MYSQL_RES *STDCALL mysql_warnings(MYSQL *mysql) +{ + uint warning_count; + DBUG_ENTER("mysql_warnings"); + /* Save warning count as mysql_real_query may change this */ + warning_count= mysql->warning_count; + if (mysql_real_query(mysql, "SHOW WARNINGS", 13)) + DBUG_RETURN(0); + mysql->warning_count= warning_count; + DBUG_RETURN(mysql_store_result(mysql)); +} + /**************************************************************************** Some support functions ****************************************************************************/ @@ -3170,7 +3232,6 @@ myodbc_remove_escape(MYSQL *mysql,char *name) Implementation of new client-server prototypes for 4.1 version starts from here .. - my_* and genaral function names are internal implementations mysql_* are real prototypes used by applications *********************************************************************/ @@ -3180,212 +3241,169 @@ myodbc_remove_escape(MYSQL *mysql,char *name) ********************************************************************/ /* - Set the internal stmt error messages + Set the internal stmt error messages */ static void set_stmt_error(MYSQL_STMT * stmt, int errcode) { DBUG_ENTER("set_stmt_error"); - DBUG_PRINT("enter", ("error :[%d][%s]", errcode, ER(errcode))); + DBUG_PRINT("enter", ("error: %d '%s'", errcode, ER(errcode))); DBUG_ASSERT(stmt != 0); - stmt->err_no = errcode; - strmov(stmt->error, ER(errcode)); + stmt->last_errno= errcode; + strmov(stmt->last_error, ER(errcode)); DBUG_VOID_RETURN; } + /* - Copy error message to statement handler + Copy error message to statement handler */ static void set_stmt_errmsg(MYSQL_STMT * stmt, char *err, int errcode) { DBUG_ENTER("set_stmt_error_msg"); - DBUG_PRINT("enter", ("error :[%d][%s]", errcode, err)); + DBUG_PRINT("enter", ("error: %d '%s'", errcode, err)); DBUG_ASSERT(stmt != 0); - stmt->err_no = errcode; - + stmt->last_errno= errcode; if (err && err[0]) - strmov(stmt->error, err); + strmov(stmt->last_error, err); DBUG_VOID_RETURN; } + /* - Set the internal error message to mysql handler + Set the internal error message to mysql handler */ static void set_mysql_error(MYSQL * mysql, int errcode) { DBUG_ENTER("set_mysql_error"); - DBUG_PRINT("enter", ("error :[%d][%s]", errcode, ER(errcode))); + DBUG_PRINT("enter", ("error :%d '%s'", errcode, ER(errcode))); DBUG_ASSERT(mysql != 0); - mysql->net.last_errno = errcode; + mysql->net.last_errno= errcode; strmov(mysql->net.last_error, ER(errcode)); } -/* - Return the duplicate string by allocating the memory -*/ - -static char *my_dupp_str(const char *from, int length) -{ - char *str; - - if ((str = my_malloc(length + 1, MYF(MY_WME)))) - { - memcpy(str, from, length); - str[length] = 0; - } - return str; -} - /* - Return the reallocted string -*/ + Reallocate the NET package to be at least of 'length' bytes -static char *my_realloc_str(NET *net, int length) -{ - char *from = net->buff; - ulong nead = net->buf_length + length; - DBUG_ENTER("my_realloc_str"); + SYNPOSIS + my_realloc_str() + net The NET structure to modify + int length Ensure that net->buff is at least this big - if ( nead > net->max_packet ) - { - char *new_buff; - ulong pkt_length = nead + 8192; - - if (pkt_length > max_allowed_packet) - { - DBUG_PRINT("error",("Needed %ld but max_allowed_packet is %ld", - pkt_length,max_allowed_packet)); - DBUG_RETURN(0); - } - if (!(new_buff = (char *)my_realloc(from, pkt_length, MYF(MY_WME)))) - DBUG_RETURN(0); + RETURN VALUES + 0 ok + 1 Error - net->max_packet = pkt_length; - DBUG_RETURN(new_buff); - } - DBUG_RETURN(from); -} - -/* - Return the type length */ -static ulong return_result_length(uint field_type, ulong length) +static my_bool my_realloc_str(NET *net, ulong length) { - switch (field_type) { - case MYSQL_TYPE_TINY: - return 1; - case MYSQL_TYPE_SHORT: - return 2; - case MYSQL_TYPE_INT24: - return 3; - case MYSQL_TYPE_LONG: - return 4; - case MYSQL_TYPE_LONGLONG: - return 8; - case MYSQL_TYPE_FLOAT: - return 4; - case MYSQL_TYPE_DOUBLE: - return 8; - default: - return length; - } -} - -/* - Get the parameter count value -*/ - -static ulong my_get_param_count(MYSQL *mysql) -{ - uchar *pos; - - mysql = mysql->last_used_con; - - if (net_safe_read(mysql) == packet_error) - return 0; - - pos=(uchar*) mysql->net.read_pos; - if (!net_field_length(&pos)) + ulong buf_length= (ulong) (net->write_pos - net->buff); + my_bool res=0; + DBUG_ENTER("my_realloc_str"); + if (buf_length + length > net->max_packet) { - return (ulong)net_field_length(&pos); + res= net_realloc(net, buf_length + length); + net->write_pos= net->buff+ buf_length; } - return 0; + DBUG_RETURN(res); } /******************************************************************** - Prepare related implementations + Prepare related implementations ********************************************************************/ /* Read the prepare statement results .. + + NOTE + This is only called for connection to servers that supports + prepared statements (and thus the 4.1 protocol) + + RETURN VALUES + 0 ok + 1 error */ -int my_read_prepare_result(MYSQL *mysql,MYSQL_STMT *stmt) +static my_bool read_prepare_result(MYSQL *mysql, MYSQL_STMT *stmt) { uchar *pos; - ulong field_count; + uint field_count; MYSQL_DATA *fields_data; ulong length; + DBUG_ENTER("read_prepare_result"); - DBUG_ENTER("my_read_prepare_result"); + mysql= mysql->last_used_con; + if ((length= net_safe_read(mysql)) == packet_error) + DBUG_RETURN(1); - mysql = mysql->last_used_con; + pos=(uchar*) mysql->net.read_pos; + stmt->stmt_id= uint4korr(pos); pos+=4; + field_count= uint2korr(pos); pos+=2; + stmt->param_count=uint2korr(pos); pos+=2; - if ((length = net_safe_read(mysql)) == packet_error) - DBUG_RETURN(-1); - - if (stmt->fields) - free_root(&stmt->mem_root,MYF(0)); - init_alloc_root(&stmt->mem_root,8192,0); - stmt->fields=0; - stmt->field_count=0; + if (field_count != 0) + { + if (!(mysql->server_status & SERVER_STATUS_AUTOCOMMIT)) + mysql->server_status|= SERVER_STATUS_IN_TRANS; - pos=(uchar*) mysql->net.read_pos; - if ((field_count= net_field_length(&pos)) == 0) + mysql->extra_info= net_field_length_ll(&pos); + if (!(fields_data= read_rows(mysql, (MYSQL_FIELD*) 0, 8))) + DBUG_RETURN(1); + if (!(stmt->fields= unpack_fields(fields_data,&stmt->mem_root, + field_count,0, + mysql->server_capabilities))) + DBUG_RETURN(1); + } + if (!(stmt->params= (MYSQL_BIND *) alloc_root(&stmt->mem_root, + sizeof(MYSQL_BIND)* + (stmt->param_count + + field_count)))) { - stmt->param_count= (ulong)net_field_length_ll(&pos); + set_stmt_error(stmt, CR_OUT_OF_MEMORY); DBUG_RETURN(0); } - if (!(mysql->server_status & SERVER_STATUS_AUTOCOMMIT)) - mysql->server_status|= SERVER_STATUS_IN_TRANS; - - mysql->extra_info= net_field_length_ll(&pos); - - if (!(fields_data=read_rows(mysql,(MYSQL_FIELD*)0,protocol_41(mysql) ? 8:5))) - DBUG_RETURN(-1); - - if (!(stmt->fields=unpack_fields(fields_data,&stmt->mem_root, - (uint) field_count,0, - mysql->server_capabilities))) - DBUG_RETURN(-1); - mysql->status = MYSQL_STATUS_READY; - stmt->field_count= (uint) field_count; + stmt->bind= (stmt->params + stmt->param_count); + stmt->field_count= (uint) field_count; + mysql->status= MYSQL_STATUS_READY; DBUG_RETURN(0); } /* - Prepare the query and return the new statement handle to - caller. - - Also update the total parameter count along with resultset - metadata information by reading from server + Prepare the query and return the new statement handle to + caller. + + Also update the total parameter count along with resultset + metadata information by reading from server */ -MYSQL_STMT *STDCALL -mysql_real_prepare(MYSQL *mysql, const char *query, ulong length) +/* QQ The follwing function will be removed after next merge */ + +static char *my_strdup_with_length(const byte *from, uint length, myf MyFlags) +{ + gptr ptr; + if ((ptr=my_malloc(length+1,MyFlags)) != 0) + { + memcpy((byte*) ptr, (byte*) from,(size_t) length); + ((char*) ptr)[length]=0; + } + return((char*) ptr); +} + + +MYSQL_STMT *STDCALL +mysql_prepare(MYSQL *mysql, const char *query, ulong length) { MYSQL_STMT *stmt; - DBUG_ENTER("mysql_real_prepare"); DBUG_ASSERT(mysql != 0); @@ -3397,59 +3415,39 @@ mysql_real_prepare(MYSQL *mysql, const char *query, ulong length) } #endif - if (simple_command(mysql, COM_PREPARE, query, length, 1)) + if (!(stmt= (MYSQL_STMT *) my_malloc(sizeof(MYSQL_STMT), + MYF(MY_WME | MY_ZEROFILL))) || + !(stmt->query= my_strdup_with_length((byte *) query, length, MYF(0)))) + { + my_free((gptr) stmt, MYF(MY_ALLOW_ZERO_PTR)); + set_mysql_error(mysql, CR_OUT_OF_MEMORY); DBUG_RETURN(0); - - if (!(stmt = (MYSQL_STMT *) my_malloc(sizeof(MYSQL_STMT), - MYF(MY_WME | MY_ZEROFILL))) || - !(stmt->query = my_dupp_str((char *)query, length))) - { - my_free((gptr)stmt, MY_ALLOW_ZERO_PTR); - set_mysql_error(mysql, CR_MEMORY_ERROR); + } + if (simple_command(mysql, COM_PREPARE, query, length, 1)) + { + mysql_stmt_close(stmt); DBUG_RETURN(0); } + stmt->state= MY_ST_PREPARE; - DBUG_ASSERT(stmt != 0); - - if (my_read_prepare_result(mysql,stmt)) + init_alloc_root(&stmt->mem_root,8192,0); + if (read_prepare_result(mysql, stmt)) { - my_free((gptr)stmt, MYF(MY_WME)); + mysql_stmt_close(stmt); DBUG_RETURN(0); } - - if (stmt->fields) - stmt->param_count = my_get_param_count(mysql); - - stmt->mysql = mysql; - stmt->state = MY_ST_PREPARE; - stmt->err_no = 0; - stmt->types_supplied = 0; - + + stmt->mysql= mysql; DBUG_PRINT("info", ("Parameter count: %ld", stmt->param_count)); DBUG_RETURN(stmt); } -/* - Prepare the query and return the new statement handle to - caller. - - Also update the total parameter count along with resultset - metadata information by reading from server -*/ - -MYSQL_STMT *STDCALL mysql_prepare(MYSQL *mysql, const char *query) -{ - DBUG_ENTER("mysql_prepare"); - DBUG_ASSERT(query != 0); - DBUG_RETURN(mysql_real_prepare(mysql,query,strlen(query))); -} /* Returns prepared meta information in the form of resultset - to client.. + to client. */ - MYSQL_RES * STDCALL mysql_prepare_result(MYSQL_STMT *stmt) { @@ -3458,349 +3456,279 @@ mysql_prepare_result(MYSQL_STMT *stmt) if (!stmt->fields) DBUG_RETURN(0); - - /* Will be freed during mysql_stmt_close as the prepare - meta info should live till the stmt life - */ - if (!(result=(MYSQL_RES*) alloc_root(&stmt->mem_root, - (uint) (sizeof(MYSQL_RES)+ sizeof(ulong) * - stmt->field_count)))) - { - set_stmt_error(stmt, CR_MEMORY_ERROR); - DBUG_RETURN(0); - } + result= &stmt->tmp_result; bzero((char*) result, sizeof(MYSQL_RES)); - result->eof=1; /* Marker for buffered */ - result->lengths=(ulong*) (result+1); - result->row_count= 0; - result->fields= stmt->fields; - result->field_count= stmt->field_count; - DBUG_RETURN(result); + result->eof=1; /* Marker for buffered */ + result->fields= stmt->fields; + result->field_count= stmt->field_count; + DBUG_RETURN(result); } + /******************************************************************** Prepare-execute, and param handling *********************************************************************/ - -/* - Store the buffer type +/* + Store the buffer type */ -static void my_store_param_type(NET *net, uint type) +static void store_param_type(NET *net, uint type) { - int2store(net->buff+net->buf_length, type); - net->buf_length+=2; + int2store(net->write_pos, type); + net->write_pos+=2; } -/* +/* Store the length of parameter data + (Same function as in sql/net_pkg.cc) */ -static char * my_store_param_length(char *pkg, ulong length) + +char * +net_store_length(char *pkg, ulong length) { uchar *packet=(uchar*) pkg; - if (length < 251) { *packet=(uchar) length; return (char*) packet+1; } - *packet++ = 252; - int2store(packet,(uint) length); - return (char*) packet+2; + /* 251 is reserved for NULL */ + if (length < 65536L) + { + *packet++=252; + int2store(packet,(uint) length); + return (char*) packet+2; + } + if (length < 16777216L) + { + *packet++=253; + int3store(packet,(ulong) length); + return (char*) packet+3; + } + *packet++=254; + int8store(packet, (ulonglong) length); + return (char*) packet+9; } -/* - Store the integer data -*/ -static bool my_store_param_long(NET *net, longlong *data, uint length) -{ - char *packet; +/**************************************************************************** + Functions to store parameter data from a prepared statement. - if (!(net->buff = my_realloc_str(net, net->buf_length + length + 1))) - return 1; + All functions has the following characteristics: - packet = (char *)net->buff+net->buf_length; - - switch(length) { - case 1: - { - char value = (char)*data; - *packet = value; - } - break; - case 2: - { - short value = (short)*data; - int2store(packet,value); - } - break; - case 3: - { - int value = (int)*data; - int3store(packet,value); - } - break; - case 4: - { - long value = (long)*data; - int4store(packet, value); - } - break; - default: - { - longlong value = (longlong)*data; - int8store(packet, value); - } - } - net->buf_length += length; - return 0; + SYNOPSIS + store_param_xxx() + net MySQL NET connection + param MySQL bind param + + RETURN VALUES + 0 ok + 1 Error (Can't alloc net->buffer) +****************************************************************************/ + + +static void store_param_tinyint(NET *net, MYSQL_BIND *param) +{ + *(net->write_pos++)= (uchar) *param->buffer; } -/* - Store the float data -*/ +static void store_param_short(NET *net, MYSQL_BIND *param) +{ + short value= *(short*) param->buffer; + int2store(net->write_pos,value); + net->write_pos+=2; +} -static bool my_store_param_double(NET *net, double *data, uint length) +static void store_param_int32(NET *net, MYSQL_BIND *param) { - char *packet; + int32 value= *(int32*) param->buffer; + int4store(net->write_pos,value); + net->write_pos+=4; +} - if (!(net->buff = my_realloc_str(net, net->buf_length + length + 1))) - return 1; +static void store_param_int64(NET *net, MYSQL_BIND *param) +{ + longlong value= *(longlong*) param->buffer; + int8store(net->write_pos,value); + net->write_pos+= 8; +} - packet = (char *)net->buff+net->buf_length; - if (length == 4) - { - float value = (float)*data; - float4store(packet, value); - } - else - { - double value = (double)*data; - float8store(packet, value); - } - net->buf_length += length; - return 0; +static void store_param_float(NET *net, MYSQL_BIND *param) +{ + float value= *(float*) param->buffer; + float4store(net->write_pos, value); + net->write_pos+= 4; } -/* - Store NULL data -*/ +static void store_param_double(NET *net, MYSQL_BIND *param) +{ + double value= *(double*) param->buffer; + float8store(net->write_pos, value); + net->write_pos+= 8; +} -static my_bool my_store_param_null(NET * net) +static void store_param_str(NET *net, MYSQL_BIND *param) { - if (!(net->buff = my_realloc_str(net, net->buf_length + 1))) - return 1; /* Signal error */ - - net->buff[net->buf_length++] = (char)251; - return 0; + ulong length= *param->length; + char *to= (char *) net_store_length((char *) net->write_pos, length); + memcpy(to, param->buffer, length); + net->write_pos+= length; } + /* - Store string and binary data + Mark if the parameter is NULL. + + SYNOPSIS + store_param_null() + net MySQL NET connection + param MySQL bind param + + DESCRIPTION + A data package starts with a string of bits where we set a bit + if a parameter is NULL */ -static my_bool my_store_param_str(NET * net, const char *from, uint length) +static void store_param_null(NET *net, MYSQL_BIND *param) { - char *to; + uint pos= param->param_number; + (uchar) net->buff[pos/8]|= (1 << pos & 7); +} - if (!(net->buff = my_realloc_str(net, net->buf_length + 5 + length))) - return 1; - to = (char *)my_store_param_length((char *)net->buff + net->buf_length, - (ulong) length); - memcpy(to, from, length); - net->buf_length = (ulong) ((char *)(to + length) - (char *)(net->buff)); - return 0; -} - - /* Set parameter data by reading from input buffers from the - client application + client application */ -static my_bool my_store_param(MYSQL_STMT * stmt, MYSQL_BIND * param) +static my_bool store_param(MYSQL_STMT *stmt, MYSQL_BIND *param) { - MYSQL *mysql = stmt->mysql; - NET *net = &mysql->net; - - DBUG_ENTER("my_store_param"); + MYSQL *mysql= stmt->mysql; + NET *net = &mysql->net; + DBUG_ENTER("store_param"); DBUG_PRINT("enter",("type : %d, buffer :%lx", param->buffer_type, param->buffer)); - if (!stmt->types_supplied) - my_store_param_type(net, (uint)param->buffer_type); - - if (!param->buffer) - { - if (my_store_param_null(net)) - goto err; - - DBUG_RETURN(0); - } - switch (param->buffer_type) - { - case MYSQL_TYPE_TINY: - case MYSQL_TYPE_SHORT: - case MYSQL_TYPE_INT24: - case MYSQL_TYPE_LONG: - case MYSQL_TYPE_LONGLONG: - if (my_store_param_long(net,(longlong *)param->buffer,param->bind_length)) - goto err; - break; - - case MYSQL_TYPE_FLOAT: - case MYSQL_TYPE_DOUBLE: - if (my_store_param_double(net,(double *)param->buffer,param->bind_length)) - goto err; - break; - - case MYSQL_TYPE_TINY_BLOB: - case MYSQL_TYPE_MEDIUM_BLOB: - case MYSQL_TYPE_LONG_BLOB: - case MYSQL_TYPE_BLOB: - { - /* - Binary handling, application should supply valid length else - will lead into problems - */ - ulong length = param->buffer_length; - if(param->length) /* ovverite, if length pointer exists */ - length = *param->length; - if (my_store_param_str(net, (char *)param->buffer, length)) - goto err; - } - break; - - default: - { - /* All other conversions should fall through to string type .. */ - char *data = param->buffer; - ulong length; - - if (!param->length) - { - /* - This case is not supose to happen, application should - supply the length for strings and binary data - */ - if (data) - length = param->buffer_length ? strnlen(data,param->buffer_length) : - strlen(data); - else - { - DBUG_PRINT("warning",("data is a null pointer")); - length=0; - } - } - else - length= *param->length; - - if (my_store_param_str(net,data,length)) - goto err; - } - } - DBUG_RETURN(0); - -err: - set_stmt_error(stmt, CR_MEMORY_ERROR); + /* Allocate for worst case (long string) */ + if ((my_realloc_str(net, 9 + *param->length))) + return 1; + if (!param->buffer) + store_param_null(net, param); + else + (*param->store_param_func)(net, param); DBUG_RETURN(1); } + /* Send the prepare query to server for execution */ -static int my_execute(MYSQL_STMT * stmt, char *packet, ulong length) +static my_bool execute(MYSQL_STMT * stmt, char *packet, ulong length) { - MYSQL *mysql = stmt->mysql; - NET *net = &mysql->net; - - DBUG_ENTER("my_execute"); + MYSQL *mysql= stmt->mysql; + NET *net= &mysql->net; + char buff[4]; + DBUG_ENTER("execute"); DBUG_PRINT("enter",("packet: %s, length :%d",packet ? packet :" ", length)); - - mysql->last_used_con = mysql; - if (simple_command(mysql, COM_EXECUTE, packet, length, 1) || + mysql->last_used_con= mysql; + int4store(buff, stmt->stmt_id); /* Send stmt id to server */ + if (advanced_command(mysql, COM_EXECUTE, buff, sizeof(buff), packet, + length, 1) || mysql_read_query_result(mysql)) { set_stmt_errmsg(stmt, net->last_error, net->last_errno); - DBUG_RETURN(-1); + DBUG_RETURN(1); } - stmt->state = MY_ST_EXECUTE; + stmt->state= MY_ST_EXECUTE; if (stmt->bind) { mysql_free_result(stmt->result); - stmt->result = mysql_store_result(mysql); + stmt->result= mysql_store_result(mysql); } DBUG_RETURN(0); } -/* - Execute the prepare query + +/* + Execute the prepare query */ -int STDCALL mysql_execute(MYSQL_STMT * stmt) +int STDCALL mysql_execute(MYSQL_STMT *stmt) { + ulong length; + uint null_count; DBUG_ENTER("mysql_execute"); - DBUG_ASSERT(stmt != 0); if (stmt->state == MY_ST_UNKNOWN) { set_stmt_error(stmt, CR_NO_PREPARE_STMT); - DBUG_RETURN(-1); + DBUG_RETURN(1); } - stmt->mysql->fields = stmt->fields; + stmt->mysql->fields= stmt->fields; if (stmt->param_count) { - NET *net = &stmt->mysql->net; - MYSQL_BIND *param; - ulong param_count; + NET *net= &stmt->mysql->net; + MYSQL_BIND *param, *param_end; char *param_data; + my_bool result; if (!stmt->params) { /* Parameters exists, but no bound buffers */ set_stmt_error(stmt, CR_NOT_ALL_PARAMS_BOUND); - DBUG_RETURN(-1); + DBUG_RETURN(1); } - net_clear(net); - net->buf_length = 0; /* clear net */ - - /* In case if buffers (type) alterned, indicate to server */ - net->buff[net->buf_length++] = (char)stmt->types_supplied; - - for (param=stmt->params, param_count = 0; - param_count < stmt->param_count; param_count++, param++) + net_clear(net); /* Sets net->write_pos */ + /* Reserve place for null-marker bytes */ + null_count= (stmt->param_count+7) /8; + bzero((char*) net->write_pos, null_count); + net->write_pos+= null_count; + param_end= stmt->params + stmt->param_count; + + /* In case if buffers (type) altered, indicate to server */ + *(net->write_pos)++= (uchar) stmt->types_supplied; + if (!stmt->types_supplied) { - /* Check if any long data, run-time supply exists */ - if (param->is_long_data && !param->long_ended) - DBUG_RETURN(MYSQL_NEED_DATA); - - if (my_store_param(stmt, param)) - DBUG_RETURN(-1); - } - if (!(param_data = my_memdup((byte *) net->buff, - net->buf_length, MYF(MY_WME)))) + stmt->types_supplied=1; + /* + Store types of parameters in first in first package + that is sent to the server. + */ + for (param= stmt->params; param < param_end ; param++) + store_param_type(net, (uint) param->buffer_type); + } + + for (param= stmt->params; param < param_end; param++) { - set_stmt_error(stmt, CR_MEMORY_ERROR); - DBUG_RETURN(-1); + /* Check for long data which has not been propery given/terminated */ + if (param->is_long_data) + { + if (!param->long_ended) + DBUG_RETURN(MYSQL_NEED_DATA); + } + else if (store_param(stmt, param)) + DBUG_RETURN(1); } - if (my_execute(stmt,param_data,net->buf_length)) - { - my_free(param_data, MYF(MY_WME)); - DBUG_RETURN(-1); + length= (ulong) (net->write_pos - net->buff); + /* TODO: Look into avoding the following memdup */ + if (!(param_data= my_memdup((byte *) net->buff, length, MYF(0)))) + { + set_stmt_error(stmt, CR_OUT_OF_MEMORY); + DBUG_RETURN(1); } + net->write_pos= net->buff; /* Reset for net_write() */ + result= execute(stmt, param_data, length); my_free(param_data, MYF(MY_WME)); - stmt->types_supplied = 1; - DBUG_RETURN(0); - } - DBUG_RETURN(my_execute(stmt,0,0)); + DBUG_RETURN(result); + } + DBUG_RETURN((int) execute(stmt,0,0)); } + /* Return total parameters count in the statement */ @@ -3808,452 +3736,308 @@ int STDCALL mysql_execute(MYSQL_STMT * stmt) ulong STDCALL mysql_param_count(MYSQL_STMT * stmt) { DBUG_ENTER("mysql_param_count"); - DBUG_ASSERT(stmt != 0); - DBUG_RETURN(stmt->param_count); } /* - Setup the parameter data buffers from application + Setup the parameter data buffers from application */ -int STDCALL mysql_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bind) +my_bool STDCALL mysql_bind_param(MYSQL_STMT *stmt, MYSQL_BIND * bind) { - MYSQL_BIND *param; - ulong count; - + uint count=0; + MYSQL_BIND *param, *end; DBUG_ENTER("mysql_bind_param"); - DBUG_ASSERT(stmt != 0); #ifdef CHECK_EXTRA_ARGUMENTS - if (!bind) - { - set_stmt_error(stmt, CR_NULL_POINTER); - DBUG_RETURN(-1); - } if (stmt->state == MY_ST_UNKNOWN) { set_stmt_error(stmt, CR_NO_PREPARE_STMT); - DBUG_RETURN(-1); + DBUG_RETURN(1); } if (!stmt->param_count) { set_stmt_error(stmt, CR_NO_PARAMETERS_EXISTS); - DBUG_RETURN(-1); + DBUG_RETURN(1); } #endif - - /* In case if buffers bounded previously, free it */ - my_free((gptr) stmt->params, MY_ALLOW_ZERO_PTR); - if (!(stmt->params=(MYSQL_BIND *)my_memdup((byte *) bind, - sizeof(MYSQL_BIND) * stmt->param_count, MYF(MY_WME)))) - { - set_stmt_error(stmt, CR_MEMORY_ERROR); - DBUG_RETURN(0); - } - for (param=stmt->params, count=0; - count < stmt->param_count; count++, param++) + /* Allocated on prepare */ + memcpy((char*) stmt->params, (char*) bind, + sizeof(MYSQL_BIND) * stmt->param_count); + + for (param= stmt->params, end= param+stmt->param_count; + param < end ; + param++) { - if (!param) + param->param_number= count++; + if (param->is_long_data && + (param->buffer_type < MYSQL_TYPE_TINY_BLOB || + param->buffer_type > MYSQL_TYPE_STRING)) { - /* Not all parameters bound by the application */ - my_free((gptr) stmt->params, MY_ALLOW_ZERO_PTR); - set_stmt_error(stmt, CR_NOT_ALL_PARAMS_BOUND); - DBUG_RETURN(-1); - } - if (param->is_long_data && - (param->buffer_type < MYSQL_TYPE_TINY_BLOB || - param->buffer_type > MYSQL_TYPE_STRING)) - { - /* - Long data handling should be used only for string/binary - types only + /* + Long data handling should be used only for string/binary + types only */ - my_free((gptr) stmt->params, MY_ALLOW_ZERO_PTR); - set_stmt_error(stmt, CR_INVALID_BUFFER_USE); - DBUG_RETURN(-1); + sprintf(stmt->last_error, ER(stmt->last_errno= CR_INVALID_BUFFER_USE), + param->param_number); + DBUG_RETURN(1); + } + /* + If param->length is not given, change it to point to bind_length. + This way we can always use *param->length to get the length of data + */ + if (!param->length) + param->length= ¶m->bind_length; + + /* Setup data copy functions for the different supported types */ + switch (param->buffer_type) { + case MYSQL_TYPE_TINY: + param->bind_length= 1; + param->store_param_func= store_param_tinyint; + break; + case MYSQL_TYPE_SHORT: + param->bind_length= 2; + param->store_param_func= store_param_short; + break; + case MYSQL_TYPE_LONG: + param->bind_length= 4; + param->store_param_func= store_param_int32; + break; + case MYSQL_TYPE_LONGLONG: + param->bind_length= 8; + param->store_param_func= store_param_int64; + break; + case MYSQL_TYPE_FLOAT: + param->bind_length= 4; + param->store_param_func= store_param_float; + break; + case MYSQL_TYPE_DOUBLE: + param->bind_length= 4; + param->store_param_func= store_param_double; + break; + case MYSQL_TYPE_TINY_BLOB: + case MYSQL_TYPE_MEDIUM_BLOB: + case MYSQL_TYPE_LONG_BLOB: + case MYSQL_TYPE_VAR_STRING: + case MYSQL_TYPE_STRING: + param->bind_length= param->buffer_length; + param->store_param_func= store_param_str; + break; + default: + sprintf(stmt->last_error, ER(stmt->last_errno= CR_UNSUPPORTED_PARAM_TYPE), + param->buffer_type, param->param_number); + DBUG_RETURN(1); } - /* setup default buffer_length for int and double types */ - param->bind_length = return_result_length(param->buffer_type, - param->buffer_length); } - stmt->types_supplied = 0; + /* We have to send/resendtype information to MySQL */ + stmt->types_supplied= 0; DBUG_RETURN(0); } + /******************************************************************** Long data implementation *********************************************************************/ /* - Store long data buffer type, to distinguish string and binary + Send long data in pieces to the server + + SYNOPSIS + mysql_send_long_data() + stmt Statement handler + param_number Parameter number (0 - N-1) + data Data to send to server + length Length of data to send (may be 0) + last_data If != 0 then this is the last data to the + server. + RETURN VALUES + 0 ok + 1 error */ -static char* my_store_long_type(MYSQL_STMT *stmt, char *packet, uint type) -{ - *packet++ = (char)stmt->types_supplied; - if (!stmt->types_supplied) - { - int2store(packet, type); - packet += 2; - } - return(packet); -} - -/* - Long data in pieces, if buffured successfully send '0' as - status else send '1' - - if length == MYSQL_END_OF_DATA, then thats the last data - piece for the parameter -*/ -my_bool STDCALL -mysql_send_long_data(MYSQL_STMT *stmt, uint param_number, - gptr data, ulong length) +my_bool STDCALL +mysql_send_long_data(MYSQL_STMT *stmt, uint param_number, + const char *data, ulong length, + my_bool last_data) { MYSQL_BIND *param; - MYSQL *mysql; - char *packet; - ulong packet_length, long_length; - DBUG_ENTER("mysql_send_long_data"); - DBUG_ASSERT( stmt != 0 ); - + DBUG_ASSERT(stmt != 0); DBUG_PRINT("enter",("param no : %d, data : %lx, length : %ld", - param_number, data, length)); + param_number, data, length)); - if (!(param = (stmt->params+param_number))) + if (param_number >= stmt->param_count) { set_stmt_error(stmt, CR_INVALID_PARAMETER_NO); DBUG_RETURN(1); } - - mysql = stmt->mysql; - if (length == MYSQL_LONG_DATA_END || param->long_ended) - { - if (!stmt->long_alloced) - { - stmt->long_length = MAX_LONG_DATA_LENGTH; - my_free(stmt->long_data, MY_ALLOW_ZERO_PTR); - - if (!(stmt->long_data = (char*) my_malloc(stmt->long_length,MYF(0)))) - { - set_stmt_error(stmt, CR_MEMORY_ERROR); - DBUG_RETURN(1); - } - stmt->long_alloced = 1; - } - packet = stmt->long_data; - packet = my_store_param_length(packet, param_number);/* number */ - packet = my_store_long_type(stmt, packet, param->buffer_type);/* type */ - packet_length = (ulong) ((char *)packet - (char *)(stmt->long_data)); - *packet = (char )MYSQL_LONG_DATA_END; /* data end indicator */ - packet_length++; - - if (simple_command(mysql,COM_LONG_DATA,stmt->long_data,packet_length,0)) - goto err; - - stmt->types_supplied = 1; - param->long_ended = 1; - DBUG_RETURN(0); - } - if (!stmt->long_alloced || stmt->long_length < length+7) + param= stmt->params+param_number; + if (length) { - stmt->long_length = ( MAX_LONG_DATA_LENGTH > (length + 7)) ? - MAX_LONG_DATA_LENGTH : length + 7; + MYSQL *mysql= stmt->mysql; + char *packet, extra_data[MYSQL_LONG_DATA_HEADER]; + + packet= extra_data; + int4store(packet, stmt->stmt_id); packet+=4; + int2store(packet, param_number); packet+=2; + int2store(packet, param->buffer_type); packet+=2; - my_free(stmt->long_data, MY_ALLOW_ZERO_PTR); - if (!(stmt->long_data = (char*) my_malloc(stmt->long_length ,MYF(0)))) + /* + Note that we don't get any ok packet from the server in this case + This is intentional to save bandwidth. + */ + if (advanced_command(mysql, COM_LONG_DATA, extra_data, + MYSQL_LONG_DATA_HEADER, data, length, 1)) { - set_stmt_error(stmt, CR_MEMORY_ERROR); + set_stmt_errmsg(stmt,(char *) mysql->net.last_error, + mysql->net.last_errno); DBUG_RETURN(1); } - stmt->long_alloced = 1; - } - packet = stmt->long_data; - long_length = stmt->long_length; - packet = my_store_param_length(packet, param_number);/* number */ - packet = my_store_long_type(stmt, packet, param->buffer_type);/* type */ - { - char *to = my_store_param_length(packet, length); /* data length */ - memcpy(to, data, length); /* data */ - packet_length = (ulong)((char *)(to + length) - (char *)(stmt->long_data)); } - /* - Send the data to server directly for buffering .. - - TO_BE_DELETED : cross check this with Monty, becuase over the phone - Monty said not to have check for max_packet_length for long data to - have a local storage, instead send it to server directlty, but in - one of his e-mail says to store upto max_packet_size locally.. - */ - if (simple_command(mysql, COM_LONG_DATA, stmt->long_data, packet_length, 0)) - goto err; - - stmt->types_supplied = 1; + param->long_ended= last_data; DBUG_RETURN(0); - -err: - set_stmt_errmsg(stmt,(char *)mysql->net.last_error, mysql->net.last_errno); - DBUG_RETURN(-1); } + /******************************************************************** - Fetch-bind related implementations + Fetch-bind related implementations *********************************************************************/ /* - Setup the bind buffers for resultset processing + Setup the bind buffers for resultset processing */ -int STDCALL mysql_bind_result(MYSQL_STMT * stmt, MYSQL_BIND * bind) +my_bool STDCALL mysql_bind_result(MYSQL_STMT *stmt, MYSQL_BIND *bind) { - MYSQL_BIND *param; - ulong count,bind_count, *length; - + MYSQL_BIND *param, *end; + ulong bind_count; DBUG_ENTER("mysql_bind_result"); DBUG_ASSERT(stmt != 0); +#ifdef EXTRA_CHECK_ARGUMENTS if (!bind) { set_stmt_error(stmt, CR_NULL_POINTER); - DBUG_RETURN(-1); + DBUG_RETURN(1); } - count = sizeof(*bind) / sizeof(MYSQL_BIND) + 1; - bind_count = stmt->result ? stmt->result->field_count : count; +#endif + bind_count= stmt->result->field_count; + memcpy((char*) stmt->bind, (char*) bind, + sizeof(MYSQL_BIND)*bind_count); - /* bind_count now will have total fields, if no resultset - exists, then this points to sizeof(bind) - */ - if (bind_count < count) + for (param= stmt->bind, end= param+bind_count; param < end ; param++) { - set_stmt_error(stmt, CR_NOT_ALL_BUFFERS_BOUND); - DBUG_RETURN(-1); - } - /* In case previously bound, free it */ - my_free((gptr)stmt->bind, MY_ALLOW_ZERO_PTR); - if (!(stmt->bind=(MYSQL_BIND *)my_memdup((byte *) bind, - sizeof(MYSQL_BIND) * bind_count, MYF(MY_WME)))) - { - set_stmt_error(stmt, CR_MEMORY_ERROR); - DBUG_RETURN(0); - } - /* set the lengths */ - for (param=stmt->bind,count=0; countlength)) - *length = return_result_length(bind->buffer_type, bind->buffer_length); + /* TODO: Set up convert functions like in mysql_bind_param */ } DBUG_RETURN(0); } + /* - Copy a row of data to bound buffers, used in myql_fetch + Fetch row data to bind buffers */ -static int -my_fetch_record(MYSQL_BIND *bind, MYSQL_FIELD *field, - char *value) +static my_bool +my_fetch_row(MYSQL_STMT *stmt, MYSQL_RES *result, const byte *row) { - gptr buff = bind->buffer; - ulong buff_length = bind->buffer_length; - long *length = bind->length , tmp_length; - enum enum_field_types buff_type = bind->buffer_type; - - DBUG_ENTER("my_fetch_record"); - - if (!value) - { - buff = NullS; - DBUG_RETURN(0); - } - if (!length) - length= &tmp_length; - - /* Copy the data which is in string format to application buffers - based on its type .. no cross conversion needed as everything - is in string buffers in result->row. + MYSQL_BIND *bind, *end; + uchar *null_ptr= (uchar*) row, bit; - When the server supports the sending of data in its own format, - then this needs to be cleaned to have all cross combinations - */ - switch (buff_type) + result->row_count++; + row+= (result->field_count+7)/8; + /* Copy complete row to application buffers */ + bit=1; + for (bind= stmt->bind, end= (MYSQL_BIND *) bind + result->field_count; + bind < end; + bind++) { - case MYSQL_TYPE_TINY: - if (unsigned_field(field)) - *((uchar *) buff) = ((uchar) (uint) atoi(value)); + if (*null_ptr & bit) + bind->is_null= 1; else - *((char *) buff) = ((char)atoi(value)); - break; - - case MYSQL_TYPE_SHORT: - if (unsigned_field(field)) - *((ushort *) buff) = (ushort) (uint) atol(value); - else - *((short *) buff) = (short)atoi(value); - break; - - case MYSQL_TYPE_LONG: - if (unsigned_field(field)) { - char *end_ptr; - *((ulong *) buff) = strtoul(value, &end_ptr, 10); + bind->is_null= 0; + row= (byte*) (*bind->fetch_result)(bind, (char*) row); } - else + if (! (bit<<=1) & 255) { - uint actual_length = strlen(value); - if (actual_length >= 10 && value[4] == '-' && value[7] == '-' && - (!value[10] || value[10] == ' ')) - { - *((long *) buff) = ((long)atol(value) * 10000L + - (long)atol(value + 5) * 100L + - (long)atol(value + 8)); - } - else - *((long *) buff) = (long)atol(value); + bit=1; /* To next byte */ + null_ptr++; } - break; - - case MYSQL_TYPE_LONGLONG: - if (unsigned_field(field)) - *((ulonglong *) buff) = (ulonglong) strtoull(value, NULL, 10); - else - *((longlong *) buff) = (longlong) strtoll(value, NULL, 10); - break; - - case MYSQL_TYPE_FLOAT: - *((float *) buff) = (float)atof(value); - break; - - case MYSQL_TYPE_DOUBLE: - *((double *) buff) = (double)atof(value); - break; - - /* TODO : for strings and blobs, Monty comments - - For strings: We should also support letting the user specify - a pointer to a char * which we would update to where the - date is in the memory. In this case we would only update the - pointer to where we have the string in memory. This would make - things twice as fast for us as we would not have to move things - around and would also require much less memoryfrom the application. - - so, just return the address with the length pointer updated ? - - confirm with Monty and enble the following lines of code by - disbling the existing code which follows next to this. - - If this is enabled, then there is no need of buffer_length in - MYSQL_BIND structure, and clean the code related to that - */ -#if TO_BE_IMPLEMENTED - case MYSQL_TYPE_BLOB: - case MYSQL_TYPE_TINY_BLOB: - case MYSQL_TYPE_MEDIUM_BLOB: - case MYSQL_TYPE_LONG_BLOB: - *length = sizeof(value);/* will contain size */ - (char *)bind->buffer = value; /* send the data address to application */ - break; - - default: - *length = strlen(value);/* will contain string length */ - (char *)bind->buffer = value; /* send the data address to application */ - break; -#endif - case MYSQL_TYPE_BLOB: - case MYSQL_TYPE_TINY_BLOB: - case MYSQL_TYPE_MEDIUM_BLOB: - case MYSQL_TYPE_LONG_BLOB: - *length = sizeof(value); - memcpy((char *)buff, value, buff_length); - break; - - default: - buff_length--; - *length = strlen(value); - strmake((char *)buff, value, buff_length); } - DBUG_RETURN(0); + return 0; } -/* - Fetch row data to bind buffers -*/ -static int my_fetch_row(MYSQL_STMT *stmt, MYSQL_RES *result, MYSQL_ROW values) +static int +read_binary_data(MYSQL *mysql) { - MYSQL_BIND *bind, *end; - MYSQL_FIELD *field; - ulong record=0; - - result->current_row = values; - result->row_count++; - - /* Copy complete row to application buffers */ - for (bind = stmt->bind, end = (MYSQL_BIND *) bind + result->field_count; - bind < end; - bind++, values++) - { - field = &result->fields[record++]; - - if (my_fetch_record(bind, field, *values)) - return -1; - } + ulong pkt_len; + if ((pkt_len= net_safe_read(mysql)) == packet_error) + return -1; + if (mysql->net.read_pos[0]) + return 1; /* End of data */ return 0; } + /* - Fetch and return row data to bound buffers, if any + Fetch and return row data to bound buffers, if any */ -int STDCALL mysql_fetch(MYSQL_STMT * stmt) +int STDCALL mysql_fetch(MYSQL_STMT *stmt) { MYSQL_RES *result; - DBUG_ENTER("mysql_fetch"); - DBUG_ASSERT(stmt != 0); - - result = stmt->result; + result= stmt->result; if (!result) DBUG_RETURN(MYSQL_NO_DATA); if (!result->data) { + MYSQL *mysql= stmt->mysql; if (!result->eof) { - if (!(read_one_row(result->handle, result->field_count, - result->row, result->lengths))) - { - DBUG_RETURN(my_fetch_row(stmt, result, result->row)); - } - else + int res; + if (!(res= read_binary_data(result->handle))) + DBUG_RETURN((int) my_fetch_row(stmt, result, + (byte*) mysql->net.read_pos+1)); + DBUG_PRINT("info", ("end of data")); + result->eof= 1; + result->handle->status= MYSQL_STATUS_READY; + + /* Don't clear handle in mysql_free_results */ + result->handle= 0; + if (res < 0) /* Network error */ { - DBUG_PRINT("info", ("end of data")); - result->eof = 1; - result->handle->status = MYSQL_STATUS_READY; - /* Don't clear handle in mysql_free_results */ - result->handle = 0; + set_stmt_errmsg(stmt,(char *)mysql->net.last_error, + mysql->net.last_errno); + DBUG_RETURN(MYSQL_STATUS_ERROR); } } DBUG_RETURN(MYSQL_NO_DATA); /* no more data */ } { + /* + For prepared statements, the row data is a string of binary bytes, + not a set of string pointers as for normal statements + It's however convenient to use the data pointer also for prepared + statements. + */ MYSQL_ROW values; - if (!result->data_cursor) { DBUG_PRINT("info", ("end of data")); - result->current_row = (MYSQL_ROW) NULL; + result->current_row= (MYSQL_ROW) NULL; DBUG_RETURN(MYSQL_NO_DATA); } - values = result->data_cursor->data; - result->data_cursor = result->data_cursor->next; + values= result->data_cursor->data; + result->data_cursor= result->data_cursor->next; - DBUG_RETURN(my_fetch_row(stmt,result,values)); + DBUG_RETURN((int) my_fetch_row(stmt,result, (byte*) values)); } DBUG_RETURN(0); } @@ -4262,22 +4046,29 @@ int STDCALL mysql_fetch(MYSQL_STMT * stmt) /******************************************************************** Misc function implementations *********************************************************************/ + /* - Close the statement handle by freeing all resources + Close the statement handle by freeing all resources */ -int STDCALL mysql_stmt_close(MYSQL_STMT * stmt) +my_bool STDCALL mysql_stmt_close(MYSQL_STMT *stmt) { + my_bool error=0; DBUG_ENTER("mysql_stmt_close"); - DBUG_ASSERT(stmt != 0); - free_root(&stmt->mem_root,MY_ALLOW_ZERO_PTR); - my_free((gptr) stmt->query, MYF(MY_WME)); + if (stmt->state) + { + char buff[4]; + int4store(buff, stmt->stmt_id); + error= simple_command(stmt->mysql, COM_CLOSE_STMT, buff, 4, 0); + } + + free_root(&stmt->mem_root, MYF(0)); + my_free((gptr) stmt->query, MYF(MY_WME | MY_ALLOW_ZERO_PTR)); my_free((gptr) stmt->bind, MY_ALLOW_ZERO_PTR); - my_free((gptr) stmt->params, MY_ALLOW_ZERO_PTR); - my_free((gptr) stmt->long_data, MY_ALLOW_ZERO_PTR); + my_free((gptr) stmt->params, MY_ALLOW_ZERO_PTR); my_free((gptr) stmt, MYF(MY_WME)); - DBUG_RETURN(0); + DBUG_RETURN(error); } /* @@ -4287,9 +4078,7 @@ int STDCALL mysql_stmt_close(MYSQL_STMT * stmt) uint STDCALL mysql_stmt_errno(MYSQL_STMT * stmt) { DBUG_ENTER("mysql_stmt_errno"); - DBUG_ASSERT(stmt != 0); - - DBUG_RETURN(stmt->err_no); + DBUG_RETURN(stmt->last_errno); } /* @@ -4299,33 +4088,27 @@ uint STDCALL mysql_stmt_errno(MYSQL_STMT * stmt) const char *STDCALL mysql_stmt_error(MYSQL_STMT * stmt) { DBUG_ENTER("mysql_stmt_error"); - DBUG_ASSERT(stmt != 0); - - DBUG_RETURN(stmt->error); + DBUG_RETURN(stmt->last_error); } /* Commit the current transaction */ -int STDCALL mysql_commit(MYSQL * mysql) +my_bool STDCALL mysql_commit(MYSQL * mysql) { DBUG_ENTER("mysql_commit"); - DBUG_ASSERT(mysql != 0); - - DBUG_RETURN(mysql_real_query(mysql, "commit", 6)); + DBUG_RETURN((my_bool) mysql_real_query(mysql, "commit", 6)); } /* - Rollback the current transaction + Rollback the current transaction */ -int STDCALL mysql_rollback(MYSQL * mysql) +my_bool STDCALL mysql_rollback(MYSQL * mysql) { DBUG_ENTER("mysql_rollback"); - DBUG_ASSERT(mysql != 0); - - DBUG_RETURN(mysql_real_query(mysql, "rollback", 8)); + DBUG_RETURN((my_bool) mysql_real_query(mysql, "rollback", 8)); } @@ -4333,14 +4116,12 @@ int STDCALL mysql_rollback(MYSQL * mysql) Set autocommit to either true or false */ -int STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode) +my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode) { DBUG_ENTER("mysql_autocommit"); - DBUG_ASSERT(mysql != 0); - DBUG_PRINT("enter", ("mode : %d", auto_mode)); if (auto_mode) /* set to true */ - DBUG_RETURN(mysql_real_query(mysql, "set autocommit=1", 16)); - DBUG_RETURN(mysql_real_query(mysql, "set autocommit=0", 16)); + DBUG_RETURN((my_bool) mysql_real_query(mysql, "set autocommit=1", 16)); + DBUG_RETURN((my_bool) mysql_real_query(mysql, "set autocommit=0", 16)); } diff --git a/libmysql/libmysql.def b/libmysql/libmysql.def index 46ca5acafcc..f72f045c96c 100644 --- a/libmysql/libmysql.def +++ b/libmysql/libmysql.def @@ -104,8 +104,8 @@ EXPORTS mysql_rpl_probe mysql_set_master mysql_add_slave - - + mysql_warning_count + mysql_warnings diff --git a/libmysql/manager.c b/libmysql/manager.c index 22b109caea8..6d977e7eef2 100644 --- a/libmysql/manager.c +++ b/libmysql/manager.c @@ -138,7 +138,7 @@ MYSQL_MANAGER* STDCALL mysql_manager_connect(MYSQL_MANAGER* con, } sock_addr.sin_port = (ushort) htons((ushort) port); if (my_connect(sock,(struct sockaddr *) &sock_addr, sizeof(sock_addr), - 0) <0) + 0)) { con->last_errno=errno; sprintf(con->last_error ,"Could not connect to %-.64s", host); diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc index f5934fc93fa..a3e5bfb4fff 100644 --- a/libmysqld/lib_sql.cc +++ b/libmysqld/lib_sql.cc @@ -154,14 +154,12 @@ check_connections1(THD *thd) end+=SCRAMBLE_LENGTH +1; int2store(end,client_flags); end[2]=MY_CHARSET_CURRENT; - -#define MIN_HANDSHAKE_SIZE 6 - int2store(end+3,thd->server_status); bzero(end+5,13); end+=18; - if (net_write_command(net,protocol_version, buff, - (uint) (end-buff))) + if (net_write_command(net,protocol_version, + NullS, 0, + buff, (uint) (end-buff))) { inc_host_errors(&thd->remote.sin_addr); return(ER_HANDSHAKE_ERROR); @@ -169,6 +167,8 @@ check_connections1(THD *thd) return 0; } +#define MIN_HANDSHAKE_SIZE 6 + static int check_connections2(THD * thd) { @@ -214,13 +214,12 @@ check_connections2(THD * thd) static bool check_user(THD *thd,enum_server_command command, const char *user, const char *passwd, const char *db, bool check_count) { - NET *net= &thd->net; USER_RESOURCES ur; thd->db=0; if (!(thd->user = my_strdup(user, MYF(0)))) { - send_error(net,ER_OUT_OF_RESOURCES); + send_error(thd,ER_OUT_OF_RESOURCES); return 1; } thd->master_access=acl_getroot(thd, thd->host, thd->ip, thd->user, @@ -236,7 +235,7 @@ static bool check_user(THD *thd,enum_server_command command, const char *user, thd->master_access, thd->db ? thd->db : "*none*")); if (thd->master_access & NO_ACCESS) { - net_printf(net, ER_ACCESS_DENIED_ERROR, + net_printf(thd, ER_ACCESS_DENIED_ERROR, thd->user, thd->host_or_ip, passwd[0] ? ER(ER_YES) : ER(ER_NO)); @@ -254,7 +253,7 @@ static bool check_user(THD *thd,enum_server_command command, const char *user, VOID(pthread_mutex_unlock(&LOCK_thread_count)); if (tmp) { // Too many connections - send_error(net, ER_CON_COUNT_ERROR); + send_error(thd, ER_CON_COUNT_ERROR); return(1); } } @@ -269,7 +268,7 @@ static bool check_user(THD *thd,enum_server_command command, const char *user, if (db && db[0]) return test(mysql_change_db(thd,db)); else - send_ok(net); // Ready to handle questions + send_ok(thd); // Ready to handle questions return 0; // ok } @@ -370,7 +369,6 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups) (void) pthread_mutex_init(&LOCK_mysql_create_db,MY_MUTEX_INIT_SLOW); (void) pthread_mutex_init(&LOCK_Acl,MY_MUTEX_INIT_SLOW); - (void) pthread_mutex_init(&LOCK_grant,MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_open,MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_thread_count,MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_mapped_file,MY_MUTEX_INIT_SLOW); @@ -388,6 +386,7 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups) (void) pthread_mutex_init(&LOCK_rpl_status, MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_active_mi, MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_global_system_variables, MY_MUTEX_INIT_FAST); + (void) my_rwlock_init(&LOCK_grant, NULL); (void) pthread_cond_init(&COND_thread_count,NULL); (void) pthread_cond_init(&COND_refresh,NULL); (void) pthread_cond_init(&COND_thread_cache,NULL); @@ -499,7 +498,7 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups) After this we can't quit by a simple unireg_abort */ error_handler_hook = my_message_sql; - if (pthread_key_create(&THR_THD,NULL) || pthread_key_create(&THR_NET,NULL) || + if (pthread_key_create(&THR_THD,NULL) || pthread_key_create(&THR_MALLOC,NULL)) { sql_print_error("Can't create thread-keys"); diff --git a/libmysqld/libmysqld.c b/libmysqld/libmysqld.c index 3fba238a8bf..453376092d7 100644 --- a/libmysqld/libmysqld.c +++ b/libmysqld/libmysqld.c @@ -212,12 +212,12 @@ static void free_rows(MYSQL_DATA *cur) } -int +my_bool simple_command(MYSQL *mysql,enum enum_server_command command, const char *arg, ulong length, my_bool skipp_check) { NET *net= &mysql->net; - int result= -1; + my_bool result= 1; /* Check that we are calling the client functions in right order */ if (mysql->status != MYSQL_STATUS_READY) @@ -239,7 +239,7 @@ simple_command(MYSQL *mysql,enum enum_server_command command, const char *arg, result = lib_dispatch_command(command, net, arg,length); if (!skipp_check) result= ((mysql->packet_length=net_safe_read(mysql)) == packet_error ? - -1 : 0); + 1 : 0); end: return result; } @@ -1124,7 +1124,7 @@ mysql_send_query(MYSQL* mysql, const char* query, ulong length) } -int STDCALL +my_bool STDCALL mysql_read_query_result(MYSQL *mysql) { uchar *pos; @@ -1134,7 +1134,7 @@ mysql_read_query_result(MYSQL *mysql) DBUG_ENTER("mysql_read_query_result"); if ((length=net_safe_read(mysql)) == packet_error) - DBUG_RETURN(-1); + DBUG_RETURN(1); free_old_query(mysql); /* Free old result */ get_info: pos=(uchar*) mysql->net.read_pos; @@ -1154,7 +1154,7 @@ get_info: { int error=send_file_to_server(mysql,(char*) pos); if ((length=net_safe_read(mysql)) == packet_error || error) - DBUG_RETURN(-1); + DBUG_RETURN(1); goto get_info; /* Get info packet */ } if (!(mysql->server_status & SERVER_STATUS_AUTOCOMMIT)) @@ -1162,19 +1162,19 @@ get_info: mysql->extra_info= net_field_length_ll(&pos); /* Maybe number of rec */ if (!(fields=read_rows(mysql,(MYSQL_FIELD*) 0,5))) - DBUG_RETURN(-1); + DBUG_RETURN(1); if (!(mysql->fields=unpack_fields(fields,&mysql->field_alloc, (uint) field_count,0, (my_bool) test(mysql->server_capabilities & CLIENT_LONG_FLAG)))) - DBUG_RETURN(-1); + DBUG_RETURN(1); mysql->status=MYSQL_STATUS_GET_RESULT; mysql->field_count=field_count; DBUG_RETURN(0); } /**************************************************************************** -* A modified version of connect(). connect2() allows you to specify +* A modified version of connect(). my_connect() allows you to specify * a timeout value, in seconds, that we should wait until we * derermine we can't connect to a particular host. If timeout is 0, * my_connect() will behave exactly like connect(). @@ -1182,11 +1182,11 @@ get_info: * Base version coded by Steve Bernacki, Jr. *****************************************************************************/ -int my_connect(my_socket s, const struct sockaddr *name, uint namelen, - uint timeout) +my_bool my_connect(my_socket s, const struct sockaddr *name, uint namelen, + uint timeout) { #if defined(__WIN__) || defined(OS2) - return connect(s, (struct sockaddr*) name, namelen); + return connect(s, (struct sockaddr*) name, namelen) != 0; #else int flags, res, s_err; SOCKOPT_OPTLEN_TYPE s_err_size = sizeof(uint); @@ -1199,7 +1199,7 @@ int my_connect(my_socket s, const struct sockaddr *name, uint namelen, */ if (timeout == 0) - return connect(s, (struct sockaddr*) name, namelen); + return connect(s, (struct sockaddr*) name, namelen) != 0; flags = fcntl(s, F_GETFL, 0); /* Set socket to not block */ #ifdef O_NONBLOCK @@ -1212,7 +1212,7 @@ int my_connect(my_socket s, const struct sockaddr *name, uint namelen, if ((res != 0) && (s_err != EINPROGRESS)) { errno = s_err; /* Restore it */ - return(-1); + return(1); } if (res == 0) /* Connected quickly! */ return(0); @@ -1252,7 +1252,7 @@ int my_connect(my_socket s, const struct sockaddr *name, uint namelen, now_time=time(NULL); timeout-= (uint) (now_time - start_time); if (errno != EINTR || (int) timeout <= 0) - return -1; + return 1; } /* select() returned something more interesting than zero, let's @@ -1262,12 +1262,12 @@ int my_connect(my_socket s, const struct sockaddr *name, uint namelen, s_err=0; if (getsockopt(s, SOL_SOCKET, SO_ERROR, (char*) &s_err, &s_err_size) != 0) - return(-1); + return(1); if (s_err) { /* getsockopt could succeed */ errno = s_err; - return(-1); /* but return an error... */ + return(1); /* but return an error... */ } return(0); /* It's all good! */ #endif diff --git a/myisam/ft_boolean_search.c b/myisam/ft_boolean_search.c index 1a70113f0ad..9a2a29f9a08 100644 --- a/myisam/ft_boolean_search.c +++ b/myisam/ft_boolean_search.c @@ -241,8 +241,8 @@ static void _ftb_init_index_search(FT_INFO *ftb) { if (!is_tree_inited(& ftb->no_dupes)) { - init_tree(& ftb->no_dupes,0,0,sizeof(my_off_t), - _ftb_no_dupes_cmp,0,0,0); + init_tree(&ftb->no_dupes,0,0,sizeof(my_off_t), + _ftb_no_dupes_cmp, 0, NULL, NULL); } } } diff --git a/myisam/ft_stopwords.c b/myisam/ft_stopwords.c index 170442c71de..5415a08e5e3 100644 --- a/myisam/ft_stopwords.c +++ b/myisam/ft_stopwords.c @@ -41,8 +41,8 @@ int ft_init_stopwords(const char **sws) if(!stopwords3) { if(!(stopwords3=(TREE *)my_malloc(sizeof(TREE),MYF(0)))) return -1; - init_tree(stopwords3,0,0,sizeof(FT_STOPWORD),(qsort_cmp2)&FT_STOPWORD_cmp,0, - NULL, NULL); + init_tree(stopwords3,0,0,sizeof(FT_STOPWORD),(qsort_cmp2)&FT_STOPWORD_cmp, + 0, NULL, NULL); } if(!sws) return 0; diff --git a/myisam/mi_check.c b/myisam/mi_check.c index 49f6f31f96e..10d7052fb0f 100644 --- a/myisam/mi_check.c +++ b/myisam/mi_check.c @@ -1771,7 +1771,7 @@ int mi_repair_by_sort(MI_CHECK *param, register MI_INFO *info, File new_file; MI_SORT_PARAM sort_param; MYISAM_SHARE *share=info->s; - MI_KEYSEG *keyseg; + HA_KEYSEG *keyseg; ulong *rec_per_key_part; char llbuff[22]; SORT_INFO sort_info; @@ -2136,7 +2136,7 @@ int mi_repair_parallel(MI_CHECK *param, register MI_INFO *info, MI_SORT_PARAM *sort_param=0; MYISAM_SHARE *share=info->s; ulong *rec_per_key_part; - MI_KEYSEG *keyseg; + HA_KEYSEG *keyseg; char llbuff[22]; IO_CACHE_SHARE io_share; SORT_INFO sort_info; @@ -3080,7 +3080,7 @@ static int sort_key_write(MI_SORT_PARAM *sort_param, const void *a) { sort_info->dupp++; sort_info->info->lastpos=get_record_for_key(sort_info->info, - sort_parm->keyinfo, + sort_param->keyinfo, (uchar*) a); mi_check_print_warning(param, "Duplicate key for record at %10s against record at %10s", diff --git a/myisam/myisampack.c b/myisam/myisampack.c index a299e4eb00d..3fbc371be3f 100644 --- a/myisam/myisampack.c +++ b/myisam/myisampack.c @@ -665,7 +665,8 @@ static HUFF_COUNTS *init_huff_count(MI_INFO *info,my_off_t records) (type == FIELD_NORMAL || type == FIELD_SKIP_ZERO)) count[i].max_zero_fill= count[i].field_length; - init_tree(&count[i].int_tree,0,0,-1,(qsort_cmp2) compare_tree,0,NULL,NULL); + init_tree(&count[i].int_tree,0,0,-1,(qsort_cmp2) compare_tree,0, NULL, + NULL); if (records && type != FIELD_BLOB && type != FIELD_VARCHAR) count[i].tree_pos=count[i].tree_buff = my_malloc(count[i].field_length > 1 ? tree_buff_length : 2, diff --git a/myisam/rt_key.c b/myisam/rt_key.c index c08e918c6db..a48aec53c97 100644 --- a/myisam/rt_key.c +++ b/myisam/rt_key.c @@ -1,5 +1,4 @@ -/* Copyright (C) 2000 MySQL AB & Ramil Kalimullin & MySQL Finland AB - & TCX DataKonsult AB +/* Copyright (C) 2000 MySQL AB & Ramil Kalimullin 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 @@ -22,14 +21,16 @@ #include "rt_mbr.h" /* -Add key to the page -Result values: --1 - error - 0 - not split - 1 - split + Add key to the page + + RESULT VALUES + -1 Error + 0 Not split + 1 Split */ + int rtree_add_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, - uint key_length, uchar *page_buf, my_off_t *new_page) + uint key_length, uchar *page_buf, my_off_t *new_page) { uint page_size = mi_getint(page_buf); uint nod_flag = mi_test_if_nod(page_buf); @@ -53,47 +54,39 @@ int rtree_add_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, mi_putint(page_buf, page_size, nod_flag); return 0; } - else - { - if (rtree_split_page(info, keyinfo, page_buf, key, key_length, new_page)) - return -1; - else - return 1; - } + + return (rtree_split_page(info, keyinfo, page_buf, key, key_length, + new_page) ? -1 : 0); } /* -Delete key from the page + Delete key from the page */ int rtree_delete_key(MI_INFO *info, uchar *page_buf, uchar *key, - uint key_length, uint nod_flag) + uint key_length, uint nod_flag) { uint16 page_size = mi_getint(page_buf); uchar *key_start; + key_start= key - nod_flag; if (nod_flag) - { - key_start = key - nod_flag; - } - else - { - key_start = key; key_length += info->s->base.rec_reflength; - } - memmove(key_start, key + key_length, page_size - key_length - - (key - page_buf)); - page_size -= key_length + nod_flag; - mi_putint(page_buf, page_size, nod_flag); + memmove(key_start, key + key_length, page_size - key_length - + (key - page_buf)); + page_size-= key_length + nod_flag; + mi_putint(page_buf, page_size, nod_flag); return 0; } + /* -Calculate and store key MBR + Calculate and store key MBR */ + int rtree_set_key_mbr(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, - uint key_length, my_off_t child_page) + uint key_length, my_off_t child_page) { uchar *k; uchar *last; @@ -114,21 +107,25 @@ err1: return -1; } + /* -Choose non-leaf better key for insertion + Choose non-leaf better key for insertion */ + uchar *rtree_choose_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, - uint key_length, uchar *page_buf, uint nod_flag) + uint key_length, uchar *page_buf, uint nod_flag) { double increase; double best_incr = DBL_MAX; double area; double best_area; uchar *best_key; - uchar *k = rt_PAGE_FIRST_KEY(page_buf, nod_flag); uchar *last = rt_PAGE_END(page_buf); + LINT_INIT(best_area); + LINT_INIT(best_key); + for (; k < last; k = rt_PAGE_NEXT_KEY(k, key_length, nod_flag)) { if ((increase = rtree_area_increase(keyinfo->seg, key, k, key_length, diff --git a/myisam/rt_test.c b/myisam/rt_test.c index 4cc60d63031..5cf4262e804 100644 --- a/myisam/rt_test.c +++ b/myisam/rt_test.c @@ -32,7 +32,7 @@ static void print_record(char * record,my_off_t offs,const char * tail); static int run_test(const char *filename); -int main(int argc,char *argv[]) +int main(int argc __attribute__((unused)),char *argv[]) { MY_INIT(argv[0]); exit(run_test("rt_test")); @@ -63,7 +63,6 @@ int run_test(const char *filename) int row_count=0; char record[MAX_REC_LENGTH]; char read_record[MAX_REC_LENGTH]; - int upd=10; ha_rows hrows; @@ -343,7 +342,10 @@ static int read_with_pos (MI_INFO * file,int silent) } -static void bprint_record(char * record, my_off_t offs,const char * tail) +#ifdef NOT_USED +static void bprint_record(char * record, + my_off_t offs __attribute__((unused)), + const char * tail) { int i; char * pos; @@ -356,8 +358,12 @@ static void bprint_record(char * record, my_off_t offs,const char * tail) } printf("%s",tail); } +#endif -static void print_record(char * record, my_off_t offs,const char * tail) + +static void print_record(char * record, + my_off_t offs __attribute__((unused)), + const char * tail) { int i; char * pos; diff --git a/myisam/sp_key.c b/myisam/sp_key.c index 2ab11f993c3..82c2b1f8510 100644 --- a/myisam/sp_key.c +++ b/myisam/sp_key.c @@ -1,5 +1,4 @@ -/* Copyright (C) 2000 MySQL AB & Ramil Kalimullin & MySQL Finland AB - & TCX DataKonsult AB +/* Copyright (C) 2000 MySQL AB & Ramil Kalimullin 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 @@ -30,8 +29,9 @@ static int sp_get_geometry_mbr(uchar *(*wkb), uchar *end, uint n_dims, double *mbr, int top); static int sp_mbr_from_wkb(uchar (*wkb), uint size, uint n_dims, double *mbr); + uint sp_make_key(register MI_INFO *info, uint keynr, uchar *key, - const byte *record, my_off_t filepos) + const byte *record, my_off_t filepos) { HA_KEYSEG *keyseg; MI_KEYDEF *keyinfo = &info->s->keyinfo[keynr]; @@ -91,10 +91,12 @@ static int sp_mbr_from_wkb(uchar *wkb, uint size, uint n_dims, double *mbr) } /* -Add one point stored in wkb to mbr + Add one point stored in wkb to mbr */ + static int sp_add_point_to_mbr(uchar *(*wkb), uchar *end, uint n_dims, - uchar byte_order, double *mbr) + uchar byte_order __attribute__((unused)), + double *mbr) { double ord; double *mbr_end = mbr + n_dims * 2; @@ -115,12 +117,14 @@ static int sp_add_point_to_mbr(uchar *(*wkb), uchar *end, uint n_dims, return 0; } + static int sp_get_point_mbr(uchar *(*wkb), uchar *end, uint n_dims, uchar byte_order, double *mbr) { return sp_add_point_to_mbr(wkb, end, n_dims, byte_order, mbr); } + static int sp_get_linestring_mbr(uchar *(*wkb), uchar *end, uint n_dims, uchar byte_order, double *mbr) { @@ -137,6 +141,7 @@ static int sp_get_linestring_mbr(uchar *(*wkb), uchar *end, uint n_dims, return 0; } + static int sp_get_polygon_mbr(uchar *(*wkb), uchar *end, uint n_dims, uchar byte_order, double *mbr) { diff --git a/myisam/sp_test.c b/myisam/sp_test.c index 9d32b3e623d..b8b5880cf67 100644 --- a/myisam/sp_test.c +++ b/myisam/sp_test.c @@ -41,7 +41,7 @@ static void rtree_PrintWKB(uchar *wkb, uint n_dims); static char blob_key[MAX_REC_LENGTH]; -int main(int argc,char *argv[]) +int main(int argc __attribute__((unused)),char *argv[]) { MY_INIT(argv[0]); exit(run_test("sp_test")); @@ -320,7 +320,10 @@ static int read_with_pos (MI_INFO * file,int silent) } -static void bprint_record(char * record, my_off_t offs,const char * tail) +#ifdef NOT_USED +static void bprint_record(char * record, + my_off_t offs __attribute__((unused)), + const char * tail) { int i; char * pos; @@ -333,6 +336,8 @@ static void bprint_record(char * record, my_off_t offs,const char * tail) } printf("%s",tail); } +#endif + static void print_record(char * record, my_off_t offs,const char * tail) { @@ -356,6 +361,7 @@ static void print_record(char * record, my_off_t offs,const char * tail) +#ifndef NOT_USED static void create_point(char *record,uint rownr) { uint tmp; @@ -380,6 +386,7 @@ static void create_point(char *record,uint rownr) ptr=blob_key; memcpy_fixed(pos,&ptr,sizeof(char*)); } +#endif static void create_linestring(char *record,uint rownr) diff --git a/mysql-test/README b/mysql-test/README index c5dc3e219de..7c6efe7940e 100644 --- a/mysql-test/README +++ b/mysql-test/README @@ -1,6 +1,10 @@ This directory contains a test suite for mysql daemon. To run the currently existing test cases, simply execute ./mysql-test-run in this directory. It will fire up the newly built mysqld and test it. + +If you want to run the test with a running MySQL server use the --external +option to mysql-test-run. + Note that you do not have to have to do make install, and you could actually have a co-existing MySQL installation - the tests will not conflict with it. @@ -13,8 +17,7 @@ http://www.mysql.com/doc/M/y/MySQL_test_suite.html You can create your own test cases. To create a test case: - cd t - vi test_case_name.test + xeamacs t/test_case_name.test in the file, put a set of SQL commands that will create some tables, load test data, run some queries to manipulate it. diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index a26b597f8db..57b6ef056f2 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -171,7 +171,7 @@ USER_TEST= EXTRA_MASTER_OPT="" EXTRA_MYSQL_TEST_OPT="" -USE_RUNNING_SERVER=1 +USE_RUNNING_SERVER="" DO_GCOV="" DO_GDB="" MANUAL_GDB="" @@ -199,6 +199,7 @@ while test $# -gt 0; do --slave-binary=*) SLAVE_MYSQLD=`$ECHO "$1" | $SED -e "s;--slave-binary=;;"` ;; --local) USE_RUNNING_SERVER="" ;; + --extern) USE_RUNNING_SERVER="1" ;; --tmpdir=*) MYSQL_TMP_DIR=`$ECHO "$1" | $SED -e "s;--tmpdir=;;"` ;; --local-master) MASTER_MYPORT=3306; diff --git a/mysql-test/r/rollback.result b/mysql-test/r/rollback.result index a5eb6f8729f..d87aa68dce4 100644 --- a/mysql-test/r/rollback.result +++ b/mysql-test/r/rollback.result @@ -4,9 +4,26 @@ begin work; insert into t1 values (4); insert into t1 values (5); rollback; -Warning: Some non-transactional changed tables couldn't be rolled back +Warnings: +Warning 1196 Some non-transactional changed tables couldn't be rolled back +select @@warning_count; +@@warning_count +1 +select @@error_count; +@@error_count +0 +show warnings; +Level Code Message +Warning 1196 Some non-transactional changed tables couldn't be rolled back +show errors; +Level Code Message select * from t1; n 4 5 +select @@warning_count; +@@warning_count +0 +show warnings; +Level Code Message drop table t1; diff --git a/mysql-test/r/rpl_log.result b/mysql-test/r/rpl_log.result index 8948460e1bd..b5719c920e6 100644 --- a/mysql-test/r/rpl_log.result +++ b/mysql-test/r/rpl_log.result @@ -18,24 +18,24 @@ drop table t1; show binlog events; Log_name Pos Event_type Server_id Orig_log_pos Info master-bin.001 4 Start 1 4 Server ver: VERSION, Binlog ver: 3 -master-bin.001 79 Query 1 79 use test; create table t1(n int not null auto_increment primary key) +master-bin.001 79 Query 1 79 use `test`; create table t1(n int not null auto_increment primary key) master-bin.001 172 Intvar 1 172 INSERT_ID=1 -master-bin.001 200 Query 1 200 use test; insert into t1 values (NULL) -master-bin.001 263 Query 1 263 use test; drop table t1 -master-bin.001 311 Query 1 311 use test; create table t1 (word char(20) not null) +master-bin.001 200 Query 1 200 use `test`; insert into t1 values (NULL) +master-bin.001 263 Query 1 263 use `test`; drop table t1 +master-bin.001 311 Query 1 311 use `test`; create table t1 (word char(20) not null) master-bin.001 386 Create_file 1 386 db=test;table=t1;file_id=1;block_len=81 master-bin.001 556 Exec_load 1 556 ;file_id=1 -master-bin.001 579 Query 1 579 use test; drop table t1 +master-bin.001 579 Query 1 579 use `test`; drop table t1 show binlog events from 79 limit 1; Log_name Pos Event_type Server_id Orig_log_pos Info -master-bin.001 79 Query 1 79 use test; create table t1(n int not null auto_increment primary key) +master-bin.001 79 Query 1 79 use `test`; create table t1(n int not null auto_increment primary key) show binlog events from 79 limit 2; Log_name Pos Event_type Server_id Orig_log_pos Info -master-bin.001 79 Query 1 79 use test; create table t1(n int not null auto_increment primary key) +master-bin.001 79 Query 1 79 use `test`; create table t1(n int not null auto_increment primary key) master-bin.001 172 Intvar 1 172 INSERT_ID=1 show binlog events from 79 limit 2,1; Log_name Pos Event_type Server_id Orig_log_pos Info -master-bin.001 200 Query 1 200 use test; insert into t1 values (NULL) +master-bin.001 200 Query 1 200 use `test`; insert into t1 values (NULL) flush logs; create table t1 (n int); insert into t1 values (1); @@ -43,21 +43,21 @@ drop table t1; show binlog events; Log_name Pos Event_type Server_id Orig_log_pos Info master-bin.001 4 Start 1 4 Server ver: VERSION, Binlog ver: 3 -master-bin.001 79 Query 1 79 use test; create table t1(n int not null auto_increment primary key) +master-bin.001 79 Query 1 79 use `test`; create table t1(n int not null auto_increment primary key) master-bin.001 172 Intvar 1 172 INSERT_ID=1 -master-bin.001 200 Query 1 200 use test; insert into t1 values (NULL) -master-bin.001 263 Query 1 263 use test; drop table t1 -master-bin.001 311 Query 1 311 use test; create table t1 (word char(20) not null) +master-bin.001 200 Query 1 200 use `test`; insert into t1 values (NULL) +master-bin.001 263 Query 1 263 use `test`; drop table t1 +master-bin.001 311 Query 1 311 use `test`; create table t1 (word char(20) not null) master-bin.001 386 Create_file 1 386 db=test;table=t1;file_id=1;block_len=81 master-bin.001 556 Exec_load 1 556 ;file_id=1 -master-bin.001 579 Query 1 579 use test; drop table t1 +master-bin.001 579 Query 1 579 use `test`; drop table t1 master-bin.001 627 Rotate 1 627 master-bin.002;pos=4 master-bin.001 668 Stop 1 668 show binlog events in 'master-bin.002'; Log_name Pos Event_type Server_id Orig_log_pos Info -master-bin.002 4 Query 1 4 use test; create table t1 (n int) -master-bin.002 62 Query 1 62 use test; insert into t1 values (1) -master-bin.002 122 Query 1 122 use test; drop table t1 +master-bin.002 4 Query 1 4 use `test`; create table t1 (n int) +master-bin.002 62 Query 1 62 use `test`; insert into t1 values (1) +master-bin.002 122 Query 1 122 use `test`; drop table t1 show master logs; Log_name master-bin.001 @@ -71,9 +71,9 @@ show binlog events in 'slave-bin.001' from 4; show binlog events in 'slave-bin.002' from 4; Log_name Pos Event_type Server_id Orig_log_pos Info slave-bin.002 4 Slave 2 627 host=127.0.0.1,port=MASTER_PORT,log=master-bin.002,pos=4 -slave-bin.002 57 Query 1 4 use test; create table t1 (n int) -slave-bin.002 115 Query 1 62 use test; insert into t1 values (1) -slave-bin.002 175 Query 1 122 use test; drop table t1 +slave-bin.002 57 Query 1 4 use `test`; create table t1 (n int) +slave-bin.002 115 Query 1 62 use `test`; insert into t1 values (1) +slave-bin.002 175 Query 1 122 use `test`; drop table t1 show slave status; Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space 127.0.0.1 root MASTER_PORT 1 master-bin.002 170 slave-relay-bin.002 916 master-bin.002 Yes Yes 0 0 170 920 diff --git a/mysql-test/t/README b/mysql-test/t/README deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/mysql-test/t/rollback.test b/mysql-test/t/rollback.test index 6ea2cca887f..bd37e69ae23 100644 --- a/mysql-test/t/rollback.test +++ b/mysql-test/t/rollback.test @@ -8,7 +8,12 @@ create table t1 (n int not null primary key) type=myisam; begin work; insert into t1 values (4); insert into t1 values (5); -# Should give an error -!$1196 rollback; +rollback; +select @@warning_count; +select @@error_count; +show warnings; +show errors; select * from t1; +select @@warning_count; +show warnings; drop table t1; diff --git a/mysql-test/t/rpl_log_pos.test b/mysql-test/t/rpl_log_pos.test index f585fa233c5..b96d32c7fca 100644 --- a/mysql-test/t/rpl_log_pos.test +++ b/mysql-test/t/rpl_log_pos.test @@ -23,6 +23,7 @@ change master to master_log_pos=173; --replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT slave start; sleep 2; +--replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT show slave status; connection master; show master status; diff --git a/mysys/hash.c b/mysys/hash.c index 7fb634a05b9..43e6981f79d 100644 --- a/mysys/hash.c +++ b/mysys/hash.c @@ -35,11 +35,12 @@ static uint calc_hashnr(CHARSET_INFO *cs,const byte *key,uint length); static uint calc_hashnr_caseup(CHARSET_INFO *cs, const byte *key,uint length); static int hashcmp(HASH *hash,HASH_LINK *pos,const byte *key,uint length); + my_bool _hash_init(HASH *hash,CHARSET_INFO *charset, - uint size,uint key_offset,uint key_length, - hash_get_key get_key, - void (*free_element)(void*),uint flags CALLER_INFO_PROTO) + uint size,uint key_offset,uint key_length, + hash_get_key get_key, + void (*free_element)(void*),uint flags CALLER_INFO_PROTO) { DBUG_ENTER("hash_init"); DBUG_PRINT("enter",("hash: %lx size: %d",hash,size)); diff --git a/mysys/my_error.c b/mysys/my_error.c index eaa126a31c1..cd41589f366 100644 --- a/mysys/my_error.c +++ b/mysys/my_error.c @@ -120,7 +120,7 @@ int my_error(int nr,myf MyFlags, ...) ... variable list */ -int my_printf_error (uint error, const char *format, myf MyFlags, ...) +int my_printf_error(uint error, const char *format, myf MyFlags, ...) { va_list args; char ebuff[ERRMSGSIZE+20]; diff --git a/mysys/tree.c b/mysys/tree.c index 489262fcdc7..f72a4961312 100644 --- a/mysys/tree.c +++ b/mysys/tree.c @@ -17,26 +17,33 @@ /* Code for handling red-black (balanced) binary trees. key in tree is allocated accrding to following: - 1) If free_element function is given to init_tree or size < 0 then tree - will not allocate keys and only a pointer to each key is saved in tree. - key_sizes must be 0 to init and search. + + 1) If size < 0 then tree will not allocate keys and only a pointer to + each key is saved in tree. + compare and search functions uses and returns key-pointer + + 2) If size == 0 then there are two options: + - key_size != 0 to tree_insert: The key will be stored in the tree. + - key_size == 0 to tree_insert: A pointer to the key is stored. compare and search functions uses and returns key-pointer. - 2) if key_size is given to init_tree then each node will continue the + + 3) if key_size is given to init_tree then each node will continue the key and calls to insert_key may increase length of key. if key_size > sizeof(pointer) and key_size is a multiple of 8 (double allign) then key will be put on a 8 alligned adress. Else the key will be on adress (element+1). This is transparent for user compare and search functions uses a pointer to given key-argument. - 3) If init_tree - keysize is 0 then key_size must be given to tree_insert - and tree_insert will alloc space for key. - compare and search functions uses a pointer to given key-argument. + + - If you use a free function for tree-elements and you are freeing + the element itself, you should use key_size = 0 to init_tree and + tree_search The actual key in TREE_ELEMENT is saved as a pointer or after the TREE_ELEMENT struct. If one uses only pointers in tree one can use tree_set_pointer() to change address of data. - Copyright Monty Program KB. - By monty. + + Implemented by monty. */ #include "mysys_priv.h" diff --git a/sql/field.cc b/sql/field.cc index c9669c93c04..336bc9d7cc2 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -314,6 +314,7 @@ void Field::store_time(TIME *ltime,timestamp_type type) store(buff,(uint) length, default_charset_info); break; } + } } @@ -476,7 +477,7 @@ int Field_decimal::store(const char *from, uint len, CHARSET_INFO *cs) from++; frac_digits_from= from; /* Read digits at the right of '.' */ - for (;from!=end && my_isdigit(system_charset_info, (*from); from++) ; + for (;from!=end && my_isdigit(system_charset_info, *from); from++) ; frac_digits_end=from; // Some exponentiation symbol ? if (from != end && (*from == 'e' || *from == 'E')) @@ -505,7 +506,8 @@ int Field_decimal::store(const char *from, uint len, CHARSET_INFO *cs) if (current_thd->count_cuted_fields) { - for (;from != end && isspace(*from); from++) ; // Read end spaces + // Skip end spaces + for (;from != end && my_isspace(system_charset_info, *from); from++) ; if (from != end) // If still something left, warn { current_thd->cuted_fields++; @@ -736,10 +738,10 @@ int Field_decimal::store(double nr) #ifdef HAVE_SNPRINTF_ buff[sizeof(buff)-1]=0; // Safety snprintf(buff,sizeof(buff)-1, "%.*f",(int) dec,nr); + length=(uint) strlen(buff); #else - sprintf(buff,"%.*f",dec,nr); + length=(uint) my_sprintf(buff,(buff,"%.*f",dec,nr)); #endif - length=(uint) strlen(buff); if (length > field_length) { @@ -2207,10 +2209,10 @@ String *Field_float::val_str(String *val_buffer, #ifdef HAVE_SNPRINTF to[to_length-1]=0; // Safety snprintf(to,to_length-1,"%.*f",dec,nr); + to=strend(to); #else - sprintf(to,"%.*f",dec,nr); + to+= my_sprintf(to,(to,"%.*f",dec,nr)); #endif - to=strend(to); #endif } #ifdef HAVE_FCONVERT @@ -2468,10 +2470,10 @@ String *Field_double::val_str(String *val_buffer, #ifdef HAVE_SNPRINTF to[to_length-1]=0; // Safety snprintf(to,to_length-1,"%.*f",dec,nr); + to=strend(to); #else - sprintf(to,"%.*f",dec,nr); + to+= my_sprintf(to,(to,"%.*f",dec,nr)); #endif - to=strend(to); #endif } #ifdef HAVE_FCONVERT @@ -2886,8 +2888,10 @@ void Field_timestamp::sort_string(char *to,uint length __attribute__((unused))) void Field_timestamp::sql_type(String &res) const { - sprintf((char*) res.ptr(),"timestamp(%d)",(int) field_length); - res.length((uint) strlen(res.ptr())); + ulong length= my_sprintf((char*) res.ptr(), + ((char*) res.ptr(),"timestamp(%d)", + (int) field_length)); + res.length(length); } @@ -3026,10 +3030,11 @@ String *Field_time::val_str(String *val_buffer, tmp= -tmp; sign= "-"; } - sprintf((char*) val_buffer->ptr(),"%s%02d:%02d:%02d", - sign,(int) (tmp/10000), (int) (tmp/100 % 100), - (int) (tmp % 100)); - val_buffer->length((uint) strlen(val_buffer->ptr())); + long length= my_sprintf((char*) val_buffer->ptr(), + ((char*) val_buffer->ptr(),"%s%02d:%02d:%02d", + sign,(int) (tmp/10000), (int) (tmp/100 % 100), + (int) (tmp % 100))); + val_buffer->length(length); return val_buffer; } @@ -3158,8 +3163,9 @@ String *Field_year::val_str(String *val_buffer, void Field_year::sql_type(String &res) const { - sprintf((char*) res.ptr(),"year(%d)",(int) field_length); - res.length((uint) strlen(res.ptr())); + ulong length=my_sprintf((char*) res.ptr(), + ((char*) res.ptr(),"year(%d)",(int) field_length)); + res.length(length); } @@ -3852,12 +3858,14 @@ void Field_string::sort_string(char *to,uint length) void Field_string::sql_type(String &res) const { - sprintf((char*) res.ptr(),"%s(%d)", - field_length > 3 && - (table->db_options_in_use & HA_OPTION_PACK_RECORD) ? - "varchar" : "char", - (int) field_length); - res.length((uint) strlen(res.ptr())); + ulong length= my_sprintf((char*) res.ptr(), + ((char*) res.ptr(), "%s(%d)", + (field_length > 3 && + (table->db_options_in_use & + HA_OPTION_PACK_RECORD) ? + "varchar" : "char"), + (int) field_length)); + res.length((uint) length); if (binary_flag) res.append(" binary"); else @@ -4060,8 +4068,10 @@ void Field_varstring::sort_string(char *to,uint length) void Field_varstring::sql_type(String &res) const { - sprintf((char*) res.ptr(),"varchar(%d)",(int) field_length); - res.length((uint) strlen(res.ptr())); + ulong length= my_sprintf((char*) res.ptr(), + ((char*) res.ptr(),"varchar(%u)", + field_length)); + res.length((uint) length); if (binary_flag) res.append(" binary"); else diff --git a/sql/field.h b/sql/field.h index 551619abc6f..d8cfba14e02 100644 --- a/sql/field.h +++ b/sql/field.h @@ -1036,6 +1036,7 @@ public: uint decimals,flags,pack_length; Field::utype unireg_check; TYPELIB *interval; // Which interval to use + CHARSET_INFO *charset; Field *field; // For alter table uint8 row,col,sc_length,interval_id; // For rea_create_table diff --git a/sql/gstream.h b/sql/gstream.h index f8df6e337b0..f26ef8899f8 100644 --- a/sql/gstream.h +++ b/sql/gstream.h @@ -1,11 +1,19 @@ -#ifndef GSTREAM_H -#define GSTREAM_H +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + 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; either version 2 of the License, or + (at your option) any later version. + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#ifdef WITHOUT_MYSQL - #include ".\rtree\myisamdef.h" -#else - #include "mysql_priv.h" -#endif class GTextReadStream { @@ -20,9 +28,13 @@ public: r_bra, comma, }; - GTextReadStream(const char *buffer, int size) : - m_cur(buffer), m_limit(buffer + size), m_last_text_position(buffer), m_err_msg(NULL) {} - GTextReadStream() : m_cur(NULL), m_limit(NULL), m_err_msg(NULL) {} + + GTextReadStream(const char *buffer, int size) + :m_cur(buffer), m_limit(buffer + size), m_last_text_position(buffer), + m_err_msg(NULL) + {} + GTextReadStream(): m_cur(NULL), m_limit(NULL), m_err_msg(NULL) + {} ~GTextReadStream() { @@ -41,21 +53,17 @@ public: void set_error_msg(const char *msg); -// caller should free this pointer + // caller should free this pointer char *get_error_msg() { char *err_msg = m_err_msg; m_err_msg = NULL; return err_msg; } + protected: const char *m_cur; const char *m_limit; const char *m_last_text_position; char *m_err_msg; }; - -#endif - - - diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index d42311b43b6..65aaa63f7db 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -3557,7 +3557,7 @@ innodb_show_status( ut_free(buf); - send_eof(&thd->net); + send_eof(thd); DBUG_RETURN(0); } diff --git a/sql/item.cc b/sql/item.cc index 7693ef428c6..946c0f24fe1 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -44,10 +44,10 @@ Item::Item() current_thd->free_list=this; } -void Item::set_name(char *str,uint length) +void Item::set_name(const char *str,uint length) { if (!length) - name=str; // Used by AS + name= (char*) str; // Used by AS else { while (length && !my_isgraph(system_charset_info,*str)) @@ -303,21 +303,13 @@ void Item_param::set_int(longlong i) item_type = INT_ITEM; } -void Item_param::set_double(double i) +void Item_param::set_double(double value) { - double value = (double)i; real_value=value; item_result_type = REAL_RESULT; item_type = REAL_ITEM; } -void Item_param::set_double(float i) -{ - float value = (float)i; - real_value=(double)value; - item_result_type = REAL_RESULT; - item_type = REAL_ITEM; -} void Item_param::set_value(const char *str, uint length) { @@ -326,6 +318,7 @@ void Item_param::set_value(const char *str, uint length) item_type = STRING_ITEM; } + void Item_param::set_longdata(const char *str, ulong length) { /* TODO: Fix this for binary handling by making use of @@ -334,16 +327,11 @@ void Item_param::set_longdata(const char *str, ulong length) str_value.append(str,length); } -void Item_param::set_long_end() -{ - long_data_supplied = true; - item_result_type = STRING_RESULT; -}; -int Item_param::save_in_field(Field *field) +int Item_param::save_in_field(Field *field) { if (null_value) - return set_field_to_null(field); + return (int) set_field_to_null(field); field->set_notnull(); if (item_result_type == INT_RESULT) @@ -357,24 +345,21 @@ int Item_param::save_in_field(Field *field) return (field->store(nr)) ? -1 : 0; } String *result; - CHARSET_INFO *cs=default_charset_info;//fix this + CHARSET_INFO *cs=default_charset_info; //fix this result=val_str(&str_value); return (field->store(result->ptr(),result->length(),cs)) ? -1 : 0; } + void Item_param::make_field(Send_field *tmp_field) { init_make_field(tmp_field,FIELD_TYPE_STRING); } + double Item_param::val() { - /* Cross check whether we need need this conversions ? or direct - return(real_value) is enough ? - */ - - switch(item_result_type) { - + switch (item_result_type) { case STRING_RESULT: return (double)atof(str_value.ptr()); case INT_RESULT: @@ -384,16 +369,12 @@ double Item_param::val() } } + longlong Item_param::val_int() { - /* Cross check whether we need need this conversions ? or direct - return(int_value) is enough ? - */ - - switch(item_result_type) { - + switch (item_result_type) { case STRING_RESULT: - return (longlong)strtoll(str_value.ptr(),(char**) 0,10); + return strtoll(str_value.ptr(),(char**) 0,10); case REAL_RESULT: return (longlong) (real_value+(real_value > 0 ? 0.5 : -0.5)); default: @@ -401,14 +382,10 @@ longlong Item_param::val_int() } } + String *Item_param::val_str(String* str) { - /* Cross check whether we need need this conversions ? or direct - return(&str_value) is enough ? - */ - - switch(item_result_type) { - + switch (item_result_type) { case INT_RESULT: str->set(int_value); return str; @@ -421,6 +398,7 @@ String *Item_param::val_str(String* str) } /* End of Item_param related */ + void Item_copy_string::copy() { String *res=item->val_str(&str_value); @@ -438,7 +416,7 @@ String *Item_copy_string::val_str(String *str) } /* -** Functions to convert item to field (for send_fields) + Functions to convert item to field (for send_fields) */ /* ARGSUSED */ @@ -614,7 +592,7 @@ void Item_field::save_org_in_field(Field *to) } } -int Item_field::save_in_field(Field *to) +int Item_field::save_in_field(Field *to) { if (result_field->is_null()) { @@ -631,13 +609,13 @@ int Item_field::save_in_field(Field *to) } -int Item_null::save_in_field(Field *field) +int Item_null::save_in_field(Field *field) { return set_field_to_null(field); } -int Item::save_in_field(Field *field) +int Item::save_in_field(Field *field) { int error; if (result_type() == STRING_RESULT || @@ -674,7 +652,7 @@ int Item::save_in_field(Field *field) return (error) ? -1 : 0; } -int Item_string::save_in_field(Field *field) +int Item_string::save_in_field(Field *field) { String *result; CHARSET_INFO *cs=field->binary()?default_charset_info:((Field_str*)field)->charset(); @@ -685,7 +663,7 @@ int Item_string::save_in_field(Field *field) return (field->store(result->ptr(),result->length(),cs)) ? -1 : 0; } -int Item_int::save_in_field(Field *field) +int Item_int::save_in_field(Field *field) { longlong nr=val_int(); if (null_value) @@ -694,7 +672,7 @@ int Item_int::save_in_field(Field *field) return (field->store(nr)) ? -1 : 0; } -int Item_real::save_in_field(Field *field) +int Item_real::save_in_field(Field *field) { double nr=val(); if (null_value) @@ -716,7 +694,8 @@ inline uint char_val(char X) X-'a'+10); } -Item_varbinary::Item_varbinary(const char *str, uint str_length, CHARSET_INFO *cs) +Item_varbinary::Item_varbinary(const char *str, uint str_length, + CHARSET_INFO *cs) { name=(char*) str-2; // Lex makes this start with 0x max_length=(str_length+1)/2; @@ -748,7 +727,7 @@ longlong Item_varbinary::val_int() } -int Item_varbinary::save_in_field(Field *field) +int Item_varbinary::save_in_field(Field *field) { int error; CHARSET_INFO *cs=field->binary()?default_charset_info:((Field_str*)field)->charset(); diff --git a/sql/item.h b/sql/item.h index 206d7b5bd78..84182203d4c 100644 --- a/sql/item.h +++ b/sql/item.h @@ -50,7 +50,7 @@ public: // alloc & destruct is done as start of select using sql_alloc Item(); virtual ~Item() { name=0; } /*lint -e1509 */ - void set_name(char* str,uint length=0); + void set_name(const char *str,uint length=0); void init_make_field(Send_field *tmp_field,enum enum_field_types type); virtual bool fix_fields(THD *, struct st_table_list *, Item **); virtual int save_in_field(Field *field); @@ -82,7 +82,6 @@ public: virtual bool get_date(TIME *ltime,bool fuzzydate); virtual bool get_time(TIME *ltime); virtual bool is_null() { return 0; } - virtual unsigned int size_of()= 0; }; @@ -100,7 +99,6 @@ public: field_name(field_name_par), depended_from(0) { name = (char*) field_name_par; } const char *full_name() const; - unsigned int size_of() { return sizeof(*this);} }; @@ -141,7 +139,6 @@ public: bool get_date(TIME *ltime,bool fuzzydate); bool get_time(TIME *ltime); bool is_null() { return field->is_null(); } - unsigned int size_of() { return sizeof(*this);} }; @@ -163,7 +160,6 @@ public: bool basic_const_item() const { return 1; } Item *new_item() { return new Item_null(name); } bool is_null() { return 1; } - unsigned int size_of() { return sizeof(*this);} }; class Item_param :public Item @@ -176,10 +172,12 @@ public: enum enum_field_types buffer_type; my_bool long_data_supplied; - Item_param(char *name_par=0){ + Item_param(char *name_par=0) + { name= name_par ? name_par : (char*) "?"; long_data_supplied = false; - item_type = STRING_ITEM; item_result_type = STRING_RESULT; + item_type = STRING_ITEM; + item_result_type = STRING_RESULT; } enum Type type() const { return item_type; } double val(); @@ -189,13 +187,13 @@ public: int save_in_field(Field *field); void set_null(); void set_int(longlong i); - void set_double(float i); void set_double(double i); void set_value(const char *str, uint length); void set_long_str(const char *str, ulong length); void set_long_binary(const char *str, ulong length); void set_longdata(const char *str, ulong length); void set_long_end(); + void reset() {} enum Item_result result_type () const { return item_result_type; } Item *new_item() { return new Item_param(name); } @@ -227,7 +225,6 @@ public: bool basic_const_item() const { return 1; } Item *new_item() { return new Item_int(name,value,max_length); } void print(String *str); - unsigned int size_of() { return sizeof(*this);} }; @@ -242,7 +239,6 @@ public: void make_field(Send_field *field); Item *new_item() { return new Item_uint(name,max_length); } void print(String *str); - unsigned int size_of() { return sizeof(*this);} }; @@ -273,7 +269,6 @@ public: void make_field(Send_field *field); bool basic_const_item() const { return 1; } Item *new_item() { return new Item_real(name,value,decimals,max_length); } - unsigned int size_of() { return sizeof(*this);} }; @@ -285,7 +280,6 @@ public: decimals=NOT_FIXED_DEC; max_length=DBL_DIG+8; } - unsigned int size_of() { return sizeof(*this);} }; class Item_string :public Item @@ -319,7 +313,6 @@ public: String *const_string() { return &str_value; } inline void append(char *str,uint length) { str_value.append(str,length); } void print(String *str); - unsigned int size_of() { return sizeof(*this);} }; @@ -331,7 +324,7 @@ public: Item_default() { name= (char*) "DEFAULT"; } enum Type type() const { return DEFAULT_ITEM; } void make_field(Send_field *field) {} - bool save_in_field(Field *field) + int save_in_field(Field *field) { field->set_default(); return 0; @@ -340,7 +333,6 @@ public: virtual longlong val_int() { return 0; } virtual String *val_str(String *str) { return 0; } bool basic_const_item() const { return 1; } - unsigned int size_of() { return sizeof(*this);} }; @@ -352,7 +344,6 @@ public: Item_datetime(const char *item_name): Item_string(item_name,"",0,default_charset_info) { max_length=19;} void make_field(Send_field *field); - unsigned int size_of() { return sizeof(*this);} }; class Item_empty_string :public Item_string @@ -360,7 +351,6 @@ class Item_empty_string :public Item_string public: Item_empty_string(const char *header,uint length) :Item_string("",0,default_charset_info) { name=(char*) header; max_length=length;} - unsigned int size_of() { return sizeof(*this);} }; class Item_varbinary :public Item @@ -375,7 +365,6 @@ public: int save_in_field(Field *field); void make_field(Send_field *field); enum Item_result result_type () const { return INT_RESULT; } - unsigned int size_of() { return sizeof(*this);} }; @@ -388,7 +377,6 @@ public: Field *tmp_table_field(TABLE *t_arg=(TABLE *)0) { return result_field; } table_map used_tables() const { return 1; } virtual void fix_length_and_dec()=0; - unsigned int size_of() { return sizeof(*this);} }; @@ -438,7 +426,6 @@ public: void save_org_in_field(Field *field) { (*ref)->save_org_in_field(field); } enum Item_result result_type () const { return (*ref)->result_type(); } table_map used_tables() const { return (*ref)->used_tables(); } - unsigned int size_of() { return sizeof(*this);} }; @@ -458,10 +445,10 @@ public: { return ref->save_in_field(field); } - unsigned int size_of() { return sizeof(*this);} }; +#include "gstream.h" #include "spatial.h" #include "item_sum.h" #include "item_func.h" @@ -495,7 +482,6 @@ public: table_map used_tables() const { return (table_map) 1L; } bool const_item() const { return 0; } bool is_null() { return null_value; } - unsigned int size_of() { return sizeof(*this);} }; @@ -506,7 +492,6 @@ public: Item_buff() :null_value(0) {} virtual bool cmp(void)=0; virtual ~Item_buff(); /*line -e1509 */ - unsigned int size_of() { return sizeof(*this);} }; class Item_str_buff :public Item_buff @@ -517,7 +502,6 @@ public: Item_str_buff(Item *arg) :item(arg),value(arg->max_length) {} bool cmp(void); ~Item_str_buff(); // Deallocate String:s - unsigned int size_of() { return sizeof(*this);} }; @@ -528,7 +512,6 @@ class Item_real_buff :public Item_buff public: Item_real_buff(Item *item_par) :item(item_par),value(0.0) {} bool cmp(void); - unsigned int size_of() { return sizeof(*this);} }; class Item_int_buff :public Item_buff @@ -538,7 +521,6 @@ class Item_int_buff :public Item_buff public: Item_int_buff(Item *item_par) :item(item_par),value(0) {} bool cmp(void); - unsigned int size_of() { return sizeof(*this);} }; @@ -555,7 +537,6 @@ public: buff= (char*) sql_calloc(length=field->pack_length()); } bool cmp(void); - unsigned int size_of() { return sizeof(*this);} }; extern Item_buff *new_Item_buff(Item *item); diff --git a/sql/item_func.cc b/sql/item_func.cc index bd811726b47..ed7398b4f94 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -22,14 +22,13 @@ #endif #include "mysql_priv.h" +#include "slave.h" // for wait_for_master_pos #include #include #include #include #include -#include "slave.h" // for wait_for_master_pos -#include "gstream.h" - +#include /* return TRUE if item is a constant */ @@ -231,9 +230,11 @@ Field *Item_func::tmp_table_field(TABLE *t_arg) break; case STRING_RESULT: if (max_length > 255) - res= new Field_blob(max_length, maybe_null, name, t_arg, binary); + res= new Field_blob(max_length, maybe_null, name, t_arg, binary, + str_value.charset()); else - res= new Field_string(max_length, maybe_null, name, t_arg, binary); + res= new Field_string(max_length, maybe_null, name, t_arg, binary, + str_value.charset()); break; } return res; @@ -2390,18 +2391,19 @@ longlong Item_func_bit_xor::val_int() Item *get_system_var(enum_var_type var_type, LEX_STRING name) { - if (!my_strcasecmp(name.str,"VERSION")) - return new Item_string("@@VERSION",server_version, - (uint) strlen(server_version)); + if (!my_strcasecmp(system_charset_info, name.str, "VERSION")) + return new Item_string("@@VERSION", server_version, + (uint) strlen(server_version), + system_charset_info); THD *thd=current_thd; Item *item; sys_var *var; char buff[MAX_SYS_VAR_LENGTH+3]; - if (!(var= find_sys_var(name.str))) + if (!(var= find_sys_var(name.str, name.length))) { - net_printf(&thd->net, ER_UNKNOWN_SYSTEM_VARIABLE, name.str); + net_printf(thd, ER_UNKNOWN_SYSTEM_VARIABLE, name.str); return 0; } if (!(item=var->item(thd, var_type))) @@ -2415,6 +2417,23 @@ Item *get_system_var(enum_var_type var_type, LEX_STRING name) } +Item *get_system_var(enum_var_type var_type, const char *var_name, uint length, + const char *item_name) +{ + THD *thd=current_thd; + Item *item; + sys_var *var; + + var= find_sys_var(var_name, length); + DBUG_ASSERT(var != 0); + if (!(item=var->item(thd, var_type))) + return 0; // Impossible + thd->safe_to_cache_query=0; + item->set_name(item_name); // Will use original name + return item; +} + + /* Check a user level lock. diff --git a/sql/item_func.h b/sql/item_func.h index 45427bec017..3ef25a1fae2 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -39,7 +39,7 @@ public: enum Functype { UNKNOWN_FUNC,EQ_FUNC,EQUAL_FUNC,NE_FUNC,LT_FUNC,LE_FUNC, GE_FUNC,GT_FUNC,FT_FUNC, LIKE_FUNC,NOTLIKE_FUNC,ISNULL_FUNC,ISNOTNULL_FUNC, - COND_AND_FUNC, COND_OR_FUNC, CONX_XOR_FUNC, BETWEEN, IN_FUNC, + COND_AND_FUNC, COND_OR_FUNC, COND_XOR_FUNC, BETWEEN, IN_FUNC, INTERVAL_FUNC, SP_EQUALS_FUNC, SP_DISJOINT_FUNC,SP_INTERSECTS_FUNC, SP_TOUCHES_FUNC,SP_CROSSES_FUNC,SP_WITHIN_FUNC, diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 2bc9b170fc1..1b091f29a6b 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -2394,8 +2394,6 @@ null: General functions for spatial objects ********************************************************/ -#include "gstream.h" - String *Item_func_geometry_from_text::val_str(String *str) { Geometry geom; @@ -2715,7 +2713,7 @@ String *Item_func_spatial_collection::val_str(String *str) } } - if (str->length() > max_allowed_packet) + if (str->length() > current_thd->variables.max_allowed_packet) goto ret; null_value = 0; diff --git a/sql/item_sum.h b/sql/item_sum.h index 3c86370c189..3e67f1e3624 100644 --- a/sql/item_sum.h +++ b/sql/item_sum.h @@ -70,7 +70,6 @@ public: void print(String *str); void fix_num_length_and_dec(); virtual bool setup(THD *thd) {return 0;} - unsigned int size_of() { return sizeof(*this);} }; @@ -85,7 +84,6 @@ public: longlong val_int() { return (longlong) val(); } /* Real as default */ String *val_str(String*str); void reset_field(); - unsigned int size_of() { return sizeof(*this);} }; @@ -100,7 +98,6 @@ public: double val() { return (double) val_int(); } String *val_str(String*str); enum Item_result result_type () const { return INT_RESULT; } - unsigned int size_of() { return sizeof(*this);} }; @@ -118,7 +115,6 @@ class Item_sum_sum :public Item_sum_num void reset_field(); void update_field(int offset); const char *func_name() const { return "sum"; } - unsigned int size_of() { return sizeof(*this);} }; @@ -141,7 +137,6 @@ class Item_sum_count :public Item_sum_int void reset_field(); void update_field(int offset); const char *func_name() const { return "count"; } - unsigned int size_of() { return sizeof(*this);} }; @@ -193,7 +188,6 @@ class Item_sum_count_distinct :public Item_sum_int void update_field(int offset) { return ; } // Never called const char *func_name() const { return "count_distinct"; } bool setup(THD *thd); - unsigned int size_of() { return sizeof(*this);} }; @@ -213,7 +207,6 @@ public: String *val_str(String*); void make_field(Send_field *field); void fix_length_and_dec() {} - unsigned int size_of() { return sizeof(*this);} }; @@ -235,7 +228,6 @@ class Item_sum_avg :public Item_sum_num Item *result_item(Field *field) { return new Item_avg_field(this); } const char *func_name() const { return "avg"; } - unsigned int size_of() { return sizeof(*this);} }; class Item_sum_std; @@ -252,7 +244,6 @@ public: bool is_null() { (void) val_int(); return null_value; } void make_field(Send_field *field); void fix_length_and_dec() {} - unsigned int size_of() { return sizeof(*this);} }; class Item_sum_std :public Item_sum_num @@ -273,7 +264,6 @@ class Item_sum_std :public Item_sum_num Item *result_item(Field *field) { return new Item_std_field(this); } const char *func_name() const { return "std"; } - unsigned int size_of() { return sizeof(*this);} }; @@ -316,7 +306,6 @@ class Item_sum_hybrid :public Item_sum void min_max_update_str_field(int offset); void min_max_update_real_field(int offset); void min_max_update_int_field(int offset); - unsigned int size_of() { return sizeof(*this);} }; @@ -328,7 +317,6 @@ public: bool add(); const char *func_name() const { return "min"; } - unsigned int size_of() { return sizeof(*this);} }; @@ -340,7 +328,6 @@ public: bool add(); const char *func_name() const { return "max"; } - unsigned int size_of() { return sizeof(*this);} }; @@ -356,7 +343,6 @@ class Item_sum_bit :public Item_sum_int void reset(); longlong val_int(); void reset_field(); - unsigned int size_of() { return sizeof(*this);} }; @@ -367,7 +353,6 @@ class Item_sum_or :public Item_sum_bit bool add(); void update_field(int offset); const char *func_name() const { return "bit_or"; } - unsigned int size_of() { return sizeof(*this);} }; @@ -378,7 +363,6 @@ class Item_sum_and :public Item_sum_bit bool add(); void update_field(int offset); const char *func_name() const { return "bit_and"; } - unsigned int size_of() { return sizeof(*this);} }; /* @@ -409,7 +393,6 @@ public: bool add(); void reset_field() {}; void update_field(int offset_arg) {}; - unsigned int size_of() { return sizeof(*this);} }; diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index 566097893a8..b42b78c9c91 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -477,11 +477,10 @@ void Item_func_curtime::fix_length_and_dec() value=(longlong) ((ulong) ((uint) start->tm_hour)*10000L+ (ulong) (((uint) start->tm_min)*100L+ (uint) start->tm_sec)); - sprintf(buff,"%02d:%02d:%02d", - (int) start->tm_hour, - (int) start->tm_min, - (int) start->tm_sec); - buff_length=(uint) strlen(buff); + buff_length= my_sprintf(buff, (buff,"%02d:%02d:%02d", + (int) start->tm_hour, + (int) start->tm_min, + (int) start->tm_sec)); } void Item_func_now::fix_length_and_dec() @@ -497,14 +496,13 @@ void Item_func_now::fix_length_and_dec() (longlong) ((ulong) ((uint) start->tm_hour)*10000L+ (ulong) (((uint) start->tm_min)*100L+ (uint) start->tm_sec))); - sprintf(buff,"%04d-%02d-%02d %02d:%02d:%02d", - ((int) (start->tm_year+1900)) % 10000, - (int) start->tm_mon+1, - (int) start->tm_mday, - (int) start->tm_hour, - (int) start->tm_min, - (int) start->tm_sec); - buff_length=(uint) strlen(buff); + buff_length= (uint) my_sprintf(buff, (buff,"%04d-%02d-%02d %02d:%02d:%02d", + ((int) (start->tm_year+1900)) % 10000, + (int) start->tm_mon+1, + (int) start->tm_mday, + (int) start->tm_hour, + (int) start->tm_min, + (int) start->tm_sec)); /* For getdate */ ltime.year= start->tm_year+1900; ltime.month= start->tm_mon+1; @@ -538,6 +536,7 @@ String *Item_func_sec_to_time::val_str(String *str) char buff[23]; const char *sign=""; longlong seconds=(longlong) args[0]->val_int(); + ulong length; if ((null_value=args[0]->null_value)) return (String*) 0; if (seconds < 0) @@ -546,9 +545,9 @@ String *Item_func_sec_to_time::val_str(String *str) sign= "-"; } uint sec= (uint) ((ulonglong) seconds % 3600); - sprintf(buff,"%s%02lu:%02u:%02u",sign,(long) (seconds/3600), - sec/60, sec % 60); - str->copy(buff,(uint) strlen(buff)); + length= my_sprintf(buff,(buff,"%s%02lu:%02u:%02u",sign,(long) (seconds/3600), + sec/60, sec % 60)); + str->copy(buff, length); return str; } @@ -658,6 +657,7 @@ String *Item_func_date_format::val_str(String *str) TIME l_time; char intbuff[15]; uint size,weekday; + ulong length; if (!date_or_time) { @@ -750,40 +750,39 @@ String *Item_func_date_format::val_str(String *str) null_value=1; return 0; } - sprintf(intbuff,"%d",l_time.day); - str->append(intbuff); + length= my_sprintf(intbuff, (intbuff,"%d",l_time.day)); + str->append(intbuff, length); if (l_time.day >= 10 && l_time.day <= 19) str->append("th"); else { - switch (l_time.day %10) - { + switch (l_time.day %10) { case 1: - str->append("st"); + str->append("st",2); break; case 2: - str->append("nd"); + str->append("nd",2); break; case 3: - str->append("rd"); + str->append("rd",2); break; default: - str->append("th"); + str->append("th",2); break; } } break; case 'Y': sprintf(intbuff,"%04d",l_time.year); - str->append(intbuff); + str->append(intbuff,4); break; case 'y': sprintf(intbuff,"%02d",l_time.year%100); - str->append(intbuff); + str->append(intbuff,2); break; case 'm': sprintf(intbuff,"%02d",l_time.month); - str->append(intbuff); + str->append(intbuff,2); break; case 'c': sprintf(intbuff,"%d",l_time.month); @@ -791,7 +790,7 @@ String *Item_func_date_format::val_str(String *str) break; case 'd': sprintf(intbuff,"%02d",l_time.day); - str->append(intbuff); + str->append(intbuff,2); break; case 'e': sprintf(intbuff,"%d",l_time.day); @@ -799,16 +798,16 @@ String *Item_func_date_format::val_str(String *str) break; case 'H': sprintf(intbuff,"%02d",l_time.hour); - str->append(intbuff); + str->append(intbuff,2); break; case 'h': case 'I': sprintf(intbuff,"%02d", (l_time.hour+11)%12+1); - str->append(intbuff); + str->append(intbuff,2); break; case 'i': /* minutes */ sprintf(intbuff,"%02d",l_time.minute); - str->append(intbuff); + str->append(intbuff,2); break; case 'j': if (date_or_time) @@ -819,7 +818,7 @@ String *Item_func_date_format::val_str(String *str) sprintf(intbuff,"%03d", (int) (calc_daynr(l_time.year,l_time.month,l_time.day) - calc_daynr(l_time.year,1,1)) + 1); - str->append(intbuff); + str->append(intbuff,3); break; case 'k': sprintf(intbuff,"%d",l_time.hour); @@ -830,7 +829,7 @@ String *Item_func_date_format::val_str(String *str) str->append(intbuff); break; case 'p': - str->append(l_time.hour < 12 ? "AM" : "PM"); + str->append(l_time.hour < 12 ? "AM" : "PM",2); break; case 'r': sprintf(intbuff,(l_time.hour < 12) ? "%02d:%02d:%02d AM" : @@ -844,7 +843,8 @@ String *Item_func_date_format::val_str(String *str) str->append(intbuff); break; case 'T': - sprintf(intbuff,"%02d:%02d:%02d",l_time.hour,l_time.minute,l_time.second); + sprintf(intbuff,"%02d:%02d:%02d", l_time.hour, l_time.minute, + l_time.second); str->append(intbuff); break; case 'U': @@ -852,7 +852,7 @@ String *Item_func_date_format::val_str(String *str) { uint year; sprintf(intbuff,"%02d",calc_week(&l_time, 0, (*ptr) == 'U', &year)); - str->append(intbuff); + str->append(intbuff,2); } break; case 'v': @@ -860,7 +860,7 @@ String *Item_func_date_format::val_str(String *str) { uint year; sprintf(intbuff,"%02d",calc_week(&l_time, 1, (*ptr) == 'V', &year)); - str->append(intbuff); + str->append(intbuff,2); } break; case 'x': @@ -869,13 +869,13 @@ String *Item_func_date_format::val_str(String *str) uint year; (void) calc_week(&l_time, 1, (*ptr) == 'X', &year); sprintf(intbuff,"%04d",year); - str->append(intbuff); + str->append(intbuff,4); } break; case 'w': weekday=calc_weekday(calc_daynr(l_time.year,l_time.month,l_time.day),1); - sprintf(intbuff,"%01d",weekday); - str->append(intbuff); + sprintf(intbuff,"%d",weekday); + str->append(intbuff,1); break; default: str->append(*ptr); diff --git a/sql/item_timefunc.h b/sql/item_timefunc.h index a45ea159014..94e8e6eba43 100644 --- a/sql/item_timefunc.h +++ b/sql/item_timefunc.h @@ -176,7 +176,6 @@ public: const char *func_name() const { return "weekday"; } enum Item_result result_type () const { return INT_RESULT; } void fix_length_and_dec() { decimals=0; max_length=1; maybe_null=1; } - unsigned int size_of() { return sizeof(*this);} }; class Item_func_dayname :public Item_func_weekday @@ -202,7 +201,6 @@ public: { decimals=0; max_length=10; } - unsigned int size_of() { return sizeof(*this);} }; @@ -240,7 +238,6 @@ public: { return (!t_arg) ? result_field : new Field_date(maybe_null, name, t_arg); } - unsigned int size_of() { return sizeof(*this);} }; @@ -259,7 +256,6 @@ public: return (!t_arg) ? result_field : new Field_datetime(maybe_null, name, t_arg); } - unsigned int size_of() { return sizeof(*this);} }; @@ -286,7 +282,6 @@ public: { return (!t_arg) ? result_field : new Field_time(maybe_null, name, t_arg); } - unsigned int size_of() { return sizeof(*this);} }; @@ -300,7 +295,6 @@ public: const char *func_name() const { return "curdate"; } void fix_length_and_dec(); /* Retrieves curtime */ bool get_date(TIME *res,bool fuzzy_date); - unsigned int size_of() { return sizeof(*this);} }; @@ -322,7 +316,6 @@ public: const char *func_name() const { return "now"; } void fix_length_and_dec(); bool get_date(TIME *res,bool fuzzy_date); - unsigned int size_of() { return sizeof(*this);} }; @@ -347,7 +340,6 @@ public: const char *func_name() const { return "date_format"; } void fix_length_and_dec(); uint format_length(const String *format); - unsigned int size_of() { return sizeof(*this);} }; @@ -407,7 +399,6 @@ public: double val() { return (double) val_int(); } longlong val_int(); bool get_date(TIME *res,bool fuzzy_date); - unsigned int size_of() { return sizeof(*this);} }; class Item_extract :public Item_int_func @@ -421,7 +412,6 @@ class Item_extract :public Item_int_func longlong val_int(); const char *func_name() const { return "extract"; } void fix_length_and_dec(); - unsigned int size_of() { return sizeof(*this);} }; class Item_typecast :public Item_str_func diff --git a/sql/item_uniq.h b/sql/item_uniq.h index 6ab01d55e2f..f0d1d353cfb 100644 --- a/sql/item_uniq.h +++ b/sql/item_uniq.h @@ -29,9 +29,9 @@ public: :Item_real_func(list) {} double val() { return 0.0; } void fix_length_and_dec() { decimals=0; max_length=6; } - unsigned int size_of() { return sizeof(*this);} }; + class Item_sum_unique_users :public Item_sum_num { public: diff --git a/sql/lex.h b/sql/lex.h index 83890e75c20..b9e993c54c7 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -327,7 +327,6 @@ static SYMBOL symbols[] = { { "SQL_BUFFER_RESULT", SYM(SQL_BUFFER_RESULT),0,0}, { "SQL_CACHE", SYM(SQL_CACHE_SYM), 0, 0}, { "SQL_CALC_FOUND_ROWS", SYM(SQL_CALC_FOUND_ROWS),0,0}, - { "SQL_ERROR_COUNT", SYM(SQL_ERROR_COUNT),0,0}, { "SQL_NO_CACHE", SYM(SQL_NO_CACHE_SYM), 0, 0}, { "SQL_SMALL_RESULT", SYM(SQL_SMALL_RESULT),0,0}, { "SQL_THREAD", SYM(SQL_THREAD),0,0}, diff --git a/sql/log.cc b/sql/log.cc index b3ce1226210..213f5102507 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -215,15 +215,18 @@ bool MYSQL_LOG::open(const char *log_name, enum_log_type log_type_arg, time_t skr=time(NULL); struct tm tm_tmp; localtime_r(&skr,&tm_tmp); - sprintf(buff,"# %s, Version: %s at %02d%02d%02d %2d:%02d:%02d\n", - my_progname,server_version, - tm_tmp.tm_year % 100, - tm_tmp.tm_mon+1, - tm_tmp.tm_mday, - tm_tmp.tm_hour, - tm_tmp.tm_min, - tm_tmp.tm_sec); - if (my_b_write(&log_file, (byte*) buff,(uint) strlen(buff)) || + ulong length; + length= my_sprintf(buff, + (buff, + "# %s, Version: %s at %02d%02d%02d %2d:%02d:%02d\n", + my_progname,server_version, + tm_tmp.tm_year % 100, + tm_tmp.tm_mon+1, + tm_tmp.tm_mday, + tm_tmp.tm_hour, + tm_tmp.tm_min, + tm_tmp.tm_sec)); + if (my_b_write(&log_file, (byte*) buff, length) || flush_io_cache(&log_file)) goto err; break; @@ -931,7 +934,8 @@ bool MYSQL_LOG::write(THD *thd,enum enum_server_command command, { if (is_open() && (what_to_log & (1L << (uint) command))) { - int error=0; + uint length; + int error= 0; VOID(pthread_mutex_lock(&LOCK_log)); /* Test if someone closed after the is_open test */ @@ -965,6 +969,7 @@ bool MYSQL_LOG::write(THD *thd,enum enum_server_command command, last_time=skr; struct tm tm_tmp; struct tm *start; + ulong length; localtime_r(&skr,&tm_tmp); start=&tm_tmp; /* Note that my_b_write() assumes it knows the length for this */ @@ -980,8 +985,10 @@ bool MYSQL_LOG::write(THD *thd,enum enum_server_command command, } else if (my_b_write(&log_file, (byte*) "\t\t",2) < 0) error=errno; - sprintf(buff,"%7ld %-11.11s", id,command_name[(uint) command]); - if (my_b_write(&log_file, (byte*) buff,strlen(buff))) + length=my_sprintf(buff, + (buff, "%7ld %-11.11s", id, + command_name[(uint) command])); + if (my_b_write(&log_file, (byte*) buff,length)) error=errno; if (format) { @@ -1218,11 +1225,7 @@ err: /* Write update log in a format suitable for incremental backup - - NOTE - - This code should be deleted in MySQL 5,0 as the binary log - is a full replacement for the update log. - + This is also used by the slow query log. */ bool MYSQL_LOG::write(THD *thd,const char *query, uint query_length, diff --git a/sql/log_event.cc b/sql/log_event.cc index 23622bc0141..df5ef4eb7fe 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -1516,9 +1516,12 @@ void Append_block_log_event::print(FILE* file, bool short_form, #ifndef MYSQL_CLIENT void Append_block_log_event::pack_info(String* packet) { - char buf1[256]; - sprintf(buf1, ";file_id=%u;block_len=%u", file_id, block_len); - net_store_data(packet, buf1); + char buf[256]; + uint length; + length= (uint) my_sprintf(buf, + (buf, ";file_id=%u;block_len=%u", file_id, + block_len)); + net_store_data(packet, buf, length); } @@ -1560,9 +1563,10 @@ void Delete_file_log_event::print(FILE* file, bool short_form, #ifndef MYSQL_CLIENT void Delete_file_log_event::pack_info(String* packet) { - char buf1[64]; - sprintf(buf1, ";file_id=%u", (uint) file_id); - net_store_data(packet, buf1); + char buf[64]; + uint length; + length= (uint) my_sprintf(buf, (buf, ";file_id=%u", (uint) file_id)); + net_store_data(packet, buf, length); } #endif @@ -1607,8 +1611,9 @@ void Execute_load_log_event::print(FILE* file, bool short_form, void Execute_load_log_event::pack_info(String* packet) { char buf[64]; - sprintf(buf, ";file_id=%u", (uint) file_id); - net_store_data(packet, buf); + uint length; + length= (uint) my_sprintf(buf, (buf, ";file_id=%u", (uint) file_id)); + net_store_data(packet, buf, length); } #endif diff --git a/sql/mini_client.cc b/sql/mini_client.cc index 5bd88e9b09a..d678e76c5ed 100644 --- a/sql/mini_client.cc +++ b/sql/mini_client.cc @@ -40,6 +40,7 @@ #include "mysql_version.h" #include "mysqld_error.h" #include "errmsg.h" +#include #if defined( OS2) && defined(MYSQL_SERVER) #undef ER @@ -124,7 +125,7 @@ HANDLE create_named_pipe(NET *net, uint connect_timeout, char **arg_host, if (!host || !strcmp(host,LOCAL_HOST)) host=LOCAL_HOST_NAMEDPIPE; - sprintf( szPipeName, "\\\\%s\\pipe\\%s", host, unix_socket); + sprintf(szPipeName, "\\\\%s\\pipe\\%s", host, unix_socket); DBUG_PRINT("info",("Server name: '%s'. Named Pipe: %s", host, unix_socket)); @@ -456,15 +457,14 @@ mc_simple_command(MYSQL *mysql,enum enum_server_command command, if (!arg) arg=""; - if (net_write_command(net,(uchar) command,arg, - length ? length :(uint) strlen(arg))) + if (net_write_command(net, (uchar) command, NullS, 0, arg, length)) { - DBUG_PRINT("error",("Can't send command to server. Error: %d",socket_errno)); + DBUG_PRINT("error",("Can't send command to server. Error: %d", + socket_errno)); mc_end_server(mysql); if (mc_mysql_reconnect(mysql)) goto end; - if (net_write_command(net,(uchar) command,arg, - length ? length :(uint) strlen(arg))) + if (net_write_command(net,(uchar) command, NullS, 0, arg, length)) { net->last_errno=CR_SERVER_GONE_ERROR; strmov(net->last_error,ER(net->last_errno)); @@ -1027,18 +1027,19 @@ get_info: DBUG_RETURN(0); } -int mc_mysql_query(MYSQL *mysql, const char *query, uint length) + +int mc_mysql_query(MYSQL *mysql, const char *query, uint length) { - DBUG_ENTER("mysql_real_query"); + DBUG_ENTER("mc_mysql_query"); DBUG_PRINT("enter",("handle: %lx",mysql)); DBUG_PRINT("query",("Query = \"%s\"",query)); - if (!length) - length = strlen(query); + DBUG_ASSERT(length == strlen(query)); if (mc_simple_command(mysql,COM_QUERY,query,length,1)) DBUG_RETURN(-1); DBUG_RETURN(mc_mysql_read_query_result(mysql)); } + static int mc_send_file_to_server(MYSQL *mysql, const char *filename) { int fd, readcount, result= -1; diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 61973c5af91..4532646b1c2 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -294,7 +294,7 @@ inline THD *_current_thd(void) #define prepare_execute(A) ((A)->command == COM_EXECUTE) int mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create, bool silent); -int mysql_alter_db(THD *thd, char *db, HA_CREATE_INFO *create, bool silent); +int mysql_alter_db(THD *thd, const char *db, HA_CREATE_INFO *create); int mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent); void mysql_binlog_send(THD* thd, char* log_ident, my_off_t pos, ushort flags); int mysql_rm_table(THD *thd,TABLE_LIST *tables, my_bool if_exists); @@ -308,8 +308,13 @@ int quick_rm_table(enum db_type base,const char *db, bool mysql_rename_tables(THD *thd, TABLE_LIST *table_list); bool mysql_change_db(THD *thd,const char *name); void mysql_parse(THD *thd,char *inBuf,uint length); +void free_items(Item *item); +bool alloc_query(THD *thd, char *packet, ulong packet_length); void mysql_init_select(LEX *lex); +void mysql_init_query(THD *thd); +void mysql_reset_errors(THD *thd); bool mysql_new_select(LEX *lex, bool move_down); +void create_select_for_variable(const char *var_name); void mysql_init_multi_delete(LEX *lex); void init_max_user_conn(void); void free_max_user_conn(void); @@ -318,7 +323,7 @@ pthread_handler_decl(handle_bootstrap,arg); sig_handler end_thread_signal(int sig); void end_thread(THD *thd,bool put_in_cache); void flush_thread_cache(); -void mysql_execute_command(void); +void mysql_execute_command(THD *thd); bool do_command(THD *thd); bool dispatch_command(enum enum_server_command command, THD *thd, char* packet, uint packet_length); @@ -349,11 +354,12 @@ int mysql_optimize_table(THD* thd, TABLE_LIST* table_list, bool check_simple_select(); /* net_pkg.c */ -void send_warning(NET *net, uint sql_errno, const char *err=0); -void net_printf(NET *net,uint sql_errno, ...); -void send_ok(NET *net,ha_rows affected_rows=0L,ulonglong id=0L, +void send_warning(THD *thd, uint sql_errno, const char *err=0); +void net_printf(THD *thd,uint sql_errno, ...); +void send_ok(THD *thd, ha_rows affected_rows=0L, ulonglong id=0L, const char *info=0); -void send_eof(NET *net,bool no_flush=0); +void send_eof(THD *thd, bool no_flush=0); +void net_send_error(NET *net, uint sql_errno, const char *err); char *net_store_length(char *packet,ulonglong length); char *net_store_length(char *packet,uint length); char *net_store_data(char *to,const char *from); @@ -391,7 +397,7 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, int mysql_create_table(THD *thd,const char *db, const char *table_name, HA_CREATE_INFO *create_info, List &fields, List &keys, - bool tmp_table, bool no_log); + bool tmp_table, bool no_log, uint select_field_count); TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info, const char *db, const char *name, List *extra_fields, @@ -491,20 +497,19 @@ int mysqld_show_privileges(THD *thd); int mysqld_show_column_types(THD *thd); /* sql_prepare.cc */ -void mysql_com_prepare(THD *thd,char*packet,uint packet_length); -void mysql_init_query(THD *thd);/* sql_parse. cc */ -void mysql_com_execute(THD *thd); -void mysql_com_longdata(THD *thd); +int compare_prep_stmt(PREP_STMT *a, PREP_STMT *b, void *not_used); +void free_prep_stmt(PREP_STMT *stmt, TREE_FREE mode, void *not_used); +bool mysql_stmt_prepare(THD *thd, char *packet, uint packet_length); +void mysql_stmt_execute(THD *thd, char *packet); +void mysql_stm_close(THD *thd, char *packet); +void mysql_stmt_get_longdata(THD *thd, char *pos, ulong packet_length); int check_insert_fields(THD *thd,TABLE *table,List &fields, List &values, ulong counter); /* sql_error.cc */ -void push_error(uint code, const char *msg); -void push_warning(uint code, const char *msg); -int mysqld_show_warnings(THD *thd); -int mysqld_show_errors(THD *thd); -int mysqld_show_warnings_count(THD *thd); -int mysqld_show_errors_count(THD *); +void push_warning(THD *thd, MYSQL_ERROR::enum_warning_level level, uint code, + const char *msg); +my_bool mysqld_show_warnings(THD *thd, ulong levels_to_show); /* sql_handler.cc */ int mysql_ha_open(THD *thd, TABLE_LIST *tables); @@ -682,13 +687,13 @@ extern char f_fyllchar; extern MYSQL_LOG mysql_log,mysql_update_log,mysql_slow_log,mysql_bin_log; extern FILE *bootstrap_file; extern pthread_key(MEM_ROOT*,THR_MALLOC); -extern pthread_key(NET*, THR_NET); extern pthread_mutex_t LOCK_mysql_create_db,LOCK_Acl,LOCK_open, LOCK_thread_count,LOCK_mapped_file,LOCK_user_locks, LOCK_status, - LOCK_grant, LOCK_error_log, LOCK_delayed_insert, + LOCK_error_log, LOCK_delayed_insert, LOCK_delayed_status, LOCK_delayed_create, LOCK_crypt, LOCK_timezone, LOCK_slave_list, LOCK_active_mi, LOCK_manager, LOCK_global_system_variables; +extern rw_lock_t LOCK_grant; extern pthread_cond_t COND_refresh, COND_thread_count, COND_manager; extern pthread_attr_t connection_attrib; extern I_List threads; @@ -737,7 +742,7 @@ bool wait_for_locked_table_names(THD *thd, TABLE_LIST *table_list); void unireg_init(ulong options); void unireg_end(int signal); -int rea_create_table(my_string file_name,HA_CREATE_INFO *create_info, +int rea_create_table(THD *thd, my_string file_name,HA_CREATE_INFO *create_info, List &create_field, uint key_count,KEY *key_info); int format_number(uint inputflag,uint max_length,my_string pos,uint length, @@ -818,6 +823,8 @@ extern int sql_cache_hit(THD *thd, char *inBuf, uint length); /* item.cc */ Item *get_system_var(enum_var_type var_type, LEX_STRING name); +Item *get_system_var(enum_var_type var_type, const char *var_name, uint length, + const char *item_name); /* Some inline functions for more speed */ diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 89f1c07b2fe..8c3db86e44f 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -240,6 +240,8 @@ SHOW_COMP_OPTION have_query_cache=SHOW_OPTION_YES; SHOW_COMP_OPTION have_query_cache=SHOW_OPTION_NO; #endif +const char *show_comp_option_name[]= {"YES", "NO", "DISABLED"}; + bool opt_large_files= sizeof(my_off_t) > 4; /* @@ -413,15 +415,14 @@ my_bool use_temp_pool=0; pthread_key(MEM_ROOT*,THR_MALLOC); pthread_key(THD*, THR_THD); -pthread_key(NET*, THR_NET); pthread_mutex_t LOCK_mysql_create_db, LOCK_Acl, LOCK_open, LOCK_thread_count, - LOCK_mapped_file, LOCK_status, LOCK_grant, + LOCK_mapped_file, LOCK_status, LOCK_error_log, LOCK_delayed_insert, LOCK_delayed_status, LOCK_delayed_create, LOCK_crypt, LOCK_bytes_sent, LOCK_bytes_received, LOCK_global_system_variables, LOCK_user_conn, LOCK_slave_list, LOCK_active_mi; - +rw_lock_t LOCK_grant; pthread_cond_t COND_refresh,COND_thread_count, COND_slave_stopped, COND_slave_start; pthread_cond_t COND_thread_cache,COND_flush_thread_cache; @@ -1042,7 +1043,7 @@ static void server_init(void) if (Service.IsNT() && mysql_unix_port[0] && !opt_bootstrap && opt_enable_named_pipe) { - sprintf( szPipeName, "\\\\.\\pipe\\%s", mysql_unix_port ); + sprintf(szPipeName, "\\\\.\\pipe\\%s", mysql_unix_port ); ZeroMemory( &saPipeSecurity, sizeof(saPipeSecurity) ); ZeroMemory( &sdPipeDescriptor, sizeof(sdPipeDescriptor) ); if ( !InitializeSecurityDescriptor(&sdPipeDescriptor, @@ -1127,12 +1128,12 @@ static void server_init(void) void yyerror(const char *s) { - NET *net=my_pthread_getspecific_ptr(NET*,THR_NET); - char *yytext=(char*) current_lex->tok_start; + THD *thd=current_thd; + char *yytext=(char*) thd->lex.tok_start; if (!strcmp(s,"parse error")) s=ER(ER_SYNTAX_ERROR); - net_printf(net,ER_PARSE_ERROR, s, yytext ? (char*) yytext : "", - current_lex->yylineno); + net_printf(thd,ER_PARSE_ERROR, s, yytext ? (char*) yytext : "", + thd->lex.yylineno); } @@ -1148,7 +1149,7 @@ void close_connection(NET *net,uint errcode,bool lock) if ((vio=net->vio) != 0) { if (errcode) - send_error(net,errcode,ER(errcode)); /* purecov: inspected */ + net_send_error(net,errcode,ER(errcode)); /* purecov: inspected */ vio_close(vio); /* vio is freed in delete thd */ } if (lock) @@ -1541,8 +1542,8 @@ static void *signal_hand(void *arg __attribute__((unused))) if ((pidFile = my_create(pidfile_name,0664, O_WRONLY, MYF(MY_WME))) >= 0) { char buff[21]; - sprintf(buff,"%lu",(ulong) getpid()); - (void) my_write(pidFile, buff,strlen(buff),MYF(MY_WME)); + ulong length= my_sprintf(buff, (buff,"%lu",(ulong) getpid())); + (void) my_write(pidFile, buff, length, MYF(MY_WME)); (void) my_close(pidFile,MYF(0)); } } @@ -1640,11 +1641,12 @@ static void *signal_hand(void *arg __attribute__((unused))) static int my_message_sql(uint error, const char *str, myf MyFlags __attribute__((unused))) { - NET *net; + THD *thd; DBUG_ENTER("my_message_sql"); DBUG_PRINT("error",("Message: '%s'",str)); - if ((net=my_pthread_getspecific_ptr(NET*,THR_NET))) + if ((thd=current_thd)) { + NET *net= &thd->net; if (!net->last_error[0]) // Return only first message { strmake(net->last_error,str,sizeof(net->last_error)-1); @@ -1853,7 +1855,6 @@ int main(int argc, char **argv) (void) pthread_mutex_init(&LOCK_mysql_create_db,MY_MUTEX_INIT_SLOW); (void) pthread_mutex_init(&LOCK_Acl,MY_MUTEX_INIT_SLOW); - (void) pthread_mutex_init(&LOCK_grant,MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_open,MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_thread_count,MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_mapped_file,MY_MUTEX_INIT_SLOW); @@ -1871,6 +1872,7 @@ int main(int argc, char **argv) (void) pthread_mutex_init(&LOCK_rpl_status, MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_active_mi, MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_global_system_variables, MY_MUTEX_INIT_FAST); + (void) my_rwlock_init(&LOCK_grant, NULL); (void) pthread_cond_init(&COND_thread_count,NULL); (void) pthread_cond_init(&COND_refresh,NULL); (void) pthread_cond_init(&COND_thread_cache,NULL); @@ -2027,7 +2029,7 @@ int main(int argc, char **argv) After this we can't quit by a simple unireg_abort */ error_handler_hook = my_message_sql; - if (pthread_key_create(&THR_THD,NULL) || pthread_key_create(&THR_NET,NULL) || + if (pthread_key_create(&THR_THD,NULL) || pthread_key_create(&THR_MALLOC,NULL)) { sql_print_error("Can't create thread-keys"); @@ -2481,7 +2483,7 @@ static void create_new_thread(THD *thd) thread_count--; thd->killed=1; // Safety (void) pthread_mutex_unlock(&LOCK_thread_count); - net_printf(net,ER_CANT_CREATE_THREAD,error); + net_printf(thd,ER_CANT_CREATE_THREAD,error); (void) pthread_mutex_lock(&LOCK_thread_count); close_connection(net,0,0); delete thd; @@ -2886,6 +2888,7 @@ enum options { OPT_MAX_JOIN_SIZE, OPT_MAX_SORT_LENGTH, OPT_MAX_TMP_TABLES, OPT_MAX_USER_CONNECTIONS, OPT_MAX_WRITE_LOCK_COUNT, OPT_BULK_INSERT_BUFFER_SIZE, + OPT_MAX_ERROR_COUNT, OPT_MAX_PREP_STMT, OPT_MYISAM_BLOCK_SIZE, OPT_MYISAM_MAX_EXTRA_SORT_FILE_SIZE, OPT_MYISAM_MAX_SORT_FILE_SIZE, OPT_MYISAM_SORT_BUFFER_SIZE, OPT_NET_BUFFER_LENGTH, OPT_NET_RETRY_COUNT, @@ -3506,6 +3509,11 @@ struct my_option my_long_options[] = "Don't start more than this number of threads to handle INSERT DELAYED statements.", (gptr*) &max_insert_delayed_threads, (gptr*) &max_insert_delayed_threads, 0, GET_ULONG, REQUIRED_ARG, 20, 1, 16384, 0, 1, 0}, + {"max_error_count", OPT_MAX_ERROR_COUNT, + "Max number of errors/warnings to store for a statement", + (gptr*) &global_system_variables.max_error_count, + (gptr*) &max_system_variables.max_error_count, + 0, GET_ULONG, REQUIRED_ARG, DEFAULT_ERROR_COUNT, 1, 65535, 0, 1, 0}, {"max_heap_table_size", OPT_MAX_HEP_TABLE_SIZE, "Don't allow creation of heap tables bigger than this.", (gptr*) &global_system_variables.max_heap_table_size, @@ -3516,6 +3524,11 @@ struct my_option my_long_options[] = (gptr*) &global_system_variables.max_join_size, (gptr*) &max_system_variables.max_join_size, 0, GET_ULONG, REQUIRED_ARG, ~0L, 1, ~0L, 0, 1, 0}, + {"max_prepared_statements", OPT_MAX_PREP_STMT, + "Max number of prepared_statements for a thread", + (gptr*) &global_system_variables.max_prep_stmt_count, + (gptr*) &max_system_variables.max_prep_stmt_count, 0, GET_ULONG, + REQUIRED_ARG, DEFAULT_PREP_STMT_COUNT, 0, ~0L, 0, 1, 0}, {"max_sort_length", OPT_MAX_SORT_LENGTH, "The number of bytes to use when sorting BLOB or TEXT values (only the first max_sort_length bytes of each value are used; the rest are ignored).", (gptr*) &global_system_variables.max_sort_length, diff --git a/sql/net_pkg.cc b/sql/net_pkg.cc index 1e7536e3007..19234181839 100644 --- a/sql/net_pkg.cc +++ b/sql/net_pkg.cc @@ -20,19 +20,17 @@ /* Send a error string to client */ -void send_error(NET *net, uint sql_errno, const char *err) +void send_error(THD *thd, uint sql_errno, const char *err) { uint length; char buff[MYSQL_ERRMSG_SIZE+2]; - THD *thd=current_thd; + NET *net= &thd->net; DBUG_ENTER("send_error"); DBUG_PRINT("enter",("sql_errno: %d err: %s", sql_errno, err ? err : net->last_error[0] ? - net->last_error : "NULL")); + net->last_error : "NULL")); query_cache_abort(net); - if (thd) - thd->query_error = 1; // needed to catch query errors during replication if (!err) { if (sql_errno) @@ -48,10 +46,9 @@ void send_error(NET *net, uint sql_errno, const char *err) } } } - push_error(sql_errno, err); if (net->vio == 0) { - if (thd && thd->bootstrap) + if (thd->bootstrap) { /* In bootstrap it's ok to print on stderr */ fprintf(stderr,"ERROR: %d %s\n",sql_errno,err); @@ -68,53 +65,73 @@ void send_error(NET *net, uint sql_errno, const char *err) else { length=(uint) strlen(err); - set_if_smaller(length,MYSQL_ERRMSG_SIZE); + set_if_smaller(length,MYSQL_ERRMSG_SIZE-1); } - VOID(net_write_command(net,(uchar) 255,(char*) err,length)); - if (thd) - thd->fatal_error=0; // Error message is given + VOID(net_write_command(net,(uchar) 255, "", 0, (char*) err,length)); + thd->fatal_error=0; // Error message is given DBUG_VOID_RETURN; } /* - At some point we need to be able to distinguish between warnings and - errors; The following function will help make this easier. + Send an error to the client when a connection is forced close + This is used by mysqld.cc, which doesn't have a THD */ -void send_warning(NET *net, uint sql_errno, const char *err) +void net_send_error(NET *net, uint sql_errno, const char *err) { - DBUG_ENTER("send_warning"); - push_warning(sql_errno, err ? err : ER(sql_errno)); + char buff[2]; + uint length; + DBUG_ENTER("send_net_error"); - /* - TODO : - Try to return ok with warning status to client, instead - of returning error .. - */ - send_error(net,sql_errno,err); + int2store(buff,sql_errno); + length=(uint) strlen(err); + set_if_smaller(length,MYSQL_ERRMSG_SIZE-1); + net_write_command(net,(uchar) 255, buff, 2, err, length); + DBUG_VOID_RETURN; +} + + +/* + Send a warning to the end user + + SYNOPSIS + send_warning() + thd Thread handler + sql_errno Warning number (error message) + err Error string. If not set, use ER(sql_errno) + + DESCRIPTION + Register the warning so that the user can get it with mysql_warnings() + Send an ok (+ warning count) to the end user. +*/ + +void send_warning(THD *thd, uint sql_errno, const char *err) +{ + DBUG_ENTER("send_warning"); + push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, sql_errno, + err ? err : ER(sql_errno)); + send_ok(thd); DBUG_VOID_RETURN; } /* Write error package and flush to client - It's a little too low level, but I don't want to allow another buffer + It's a little too low level, but I don't want to use another buffer for + this */ -/* VARARGS3 */ void -net_printf(NET *net, uint errcode, ...) +net_printf(THD *thd, uint errcode, ...) { va_list args; uint length,offset; const char *format,*text_pos; int head_length= NET_HEADER_SIZE; - THD *thd=current_thd; + NET *net= &thd->net; DBUG_ENTER("net_printf"); DBUG_PRINT("enter",("message: %u",errcode)); - if (thd) - thd->query_error = 1; // if we are here, something is wrong :-) query_cache_abort(net); // Safety va_start(args,errcode); /* @@ -132,10 +149,9 @@ net_printf(NET *net, uint errcode, ...) length=sizeof(net->last_error)-1; /* purecov: inspected */ va_end(args); - push_error(errcode, text_pos); if (net->vio == 0) { - if (thd && thd->bootstrap) + if (thd->bootstrap) { /* In bootstrap it's ok to print on stderr */ fprintf(stderr,"ERROR: %d %s\n",errcode,text_pos); @@ -150,16 +166,42 @@ net_printf(NET *net, uint errcode, ...) if (offset) int2store(text_pos-2, errcode); VOID(net_real_write(net,(char*) net->buff,length+head_length+1+offset)); - if (thd) - thd->fatal_error=0; // Error message is given + thd->fatal_error=0; // Error message is given DBUG_VOID_RETURN; } +/* + Return ok to the client. + + SYNOPSIS + send_ok() + thd Thread handler + affected_rows Number of rows changed by statement + id Auto_increment id for first row (if used) + message Message to send to the client (Used by mysql_status) + + DESCRIPTION + The ok packet has the following structure + + 0 Marker (1 byte) + affected_rows Stored in 1-9 bytes + id Stored in 1-9 bytes + server_status Copy of thd->server_status; Can be used by client + to check if we are inside an transaction + New in 4.0 protocol + warning_count Stored in 2 bytes; New in 4.1 protocol + message Stored as packed length (1-9 bytes) + message + Is not stored if no message + + If net->no_send_ok return without sending packet +*/ + void -send_ok(NET *net,ha_rows affected_rows,ulonglong id,const char *message) +send_ok(THD *thd, ha_rows affected_rows, ulonglong id, const char *message) { - if (net->no_send_ok) // hack for re-parsing queries + NET *net= &thd->net; + if (net->no_send_ok || !net->vio) // hack for re-parsing queries return; char buff[MYSQL_ERRMSG_SIZE+10],*pos; @@ -167,31 +209,75 @@ send_ok(NET *net,ha_rows affected_rows,ulonglong id,const char *message) buff[0]=0; // No fields pos=net_store_length(buff+1,(ulonglong) affected_rows); pos=net_store_length(pos, (ulonglong) id); - if (net->return_status) + if (thd->client_capabilities & CLIENT_PROTOCOL_41) + { + int2store(pos,thd->server_status); + pos+=2; + + /* We can only return up to 65535 warnings in two bytes */ + uint tmp= min(thd->total_warn_count, 65535); + int2store(pos, tmp); + pos+= 2; + } + else if (net->return_status) // For 4.0 protocol { - int2store(pos,*net->return_status); + int2store(pos,thd->server_status); pos+=2; } if (message) pos=net_store_data((char*) pos,message); - if (net->vio != 0) - { - VOID(my_net_write(net,buff,(uint) (pos-buff))); - VOID(net_flush(net)); - } + VOID(my_net_write(net,buff,(uint) (pos-buff))); + VOID(net_flush(net)); DBUG_VOID_RETURN; } + +/* + Send eof (= end of result set) to the client + + SYNOPSIS + send_eof() + thd Thread handler + no_flush Set to 1 if there will be more data to the client, + like in send_fields(). + + DESCRIPTION + The eof packet has the following structure + + 254 Marker (1 byte) + warning_count Stored in 2 bytes; New in 4.1 protocol + status_flag Stored in 2 bytes; + For flags like SERVER_STATUS_MORE_RESULTS + + Note that the warning count will not be sent if 'no_flush' is set as + we don't want to report the warning count until all data is sent to the + client. +*/ + void -send_eof(NET *net,bool no_flush) +send_eof(THD *thd, bool no_flush) { static char eof_buff[1]= { (char) 254 }; /* Marker for end of fields */ + NET *net= &thd->net; DBUG_ENTER("send_eof"); if (net->vio != 0) { - VOID(my_net_write(net,eof_buff,1)); - if (!no_flush) + if (!no_flush && (thd->client_capabilities & CLIENT_PROTOCOL_41)) + { + char buff[5]; + uint tmp= min(thd->total_warn_count, 65535); + buff[0]=254; + int2store(buff+1, tmp); + int2store(buff+3, 0); // No flags yet + VOID(my_net_write(net,buff,5)); VOID(net_flush(net)); + } + else + { + VOID(my_net_write(net,eof_buff,1)); + if (!no_flush) + VOID(net_flush(net)); + } } DBUG_VOID_RETURN; } diff --git a/sql/net_serv.cc b/sql/net_serv.cc index bb7100f31be..538ff5babe6 100644 --- a/sql/net_serv.cc +++ b/sql/net_serv.cc @@ -75,12 +75,12 @@ extern pthread_mutex_t LOCK_bytes_sent , LOCK_bytes_received; #define TEST_BLOCKING 8 #define MAX_THREE_BYTES 255L*255L*255L -static int net_write_buff(NET *net,const char *packet,ulong len); +static my_bool net_write_buff(NET *net,const char *packet,ulong len); /* Init with packet info */ -int my_net_init(NET *net, Vio* vio) +my_bool my_net_init(NET *net, Vio* vio) { DBUG_ENTER("my_net_init"); my_net_local_init(net); /* Set some limits */ @@ -127,7 +127,7 @@ void net_end(NET *net) /* Realloc the packet buffer */ -static my_bool net_realloc(NET *net, ulong length) +my_bool net_realloc(NET *net, ulong length) { uchar *buff; ulong pkt_length; @@ -184,14 +184,14 @@ void net_clear(NET *net) /* Flush write_buffer if not empty. */ -int net_flush(NET *net) +my_bool net_flush(NET *net) { - int error=0; + my_bool error= 0; DBUG_ENTER("net_flush"); if (net->buff != net->write_pos) { - error=net_real_write(net,(char*) net->buff, - (ulong) (net->write_pos - net->buff)); + error=test(net_real_write(net,(char*) net->buff, + (ulong) (net->write_pos - net->buff))); net->write_pos=net->buff; } /* Sync packet number if using compression */ @@ -212,7 +212,7 @@ int net_flush(NET *net) ** NOTE: If compression is used the original package is modified! */ -int +my_bool my_net_write(NET *net,const char *packet,ulong len) { uchar buff[NET_HEADER_SIZE]; @@ -242,17 +242,38 @@ my_net_write(NET *net,const char *packet,ulong len) /* Send a command to the server. - As the command is part of the first data packet, we have to do some data - juggling to put the command in there, without having to create a new - packet. - This function will split big packets into sub-packets if needed. - (Each sub packet can only be 2^24 bytes) + + SYNOPSIS + net_write_command() + net NET handler + command Command in MySQL server (enum enum_server_command) + header Header to write after command + head_len Length of header + packet Query or parameter to query + len Length of packet + + DESCRIPTION + The reason for having both header and packet is so that libmysql + can easy add a header to a special command (like prepared statements) + without having to re-alloc the string. + + As the command is part of the first data packet, we have to do some data + juggling to put the command in there, without having to create a new + packet. + This function will split big packets into sub-packets if needed. + (Each sub packet can only be 2^24 bytes) + + RETURN VALUES + 0 ok + 1 error */ -int -net_write_command(NET *net,uchar command,const char *packet,ulong len) +my_bool +net_write_command(NET *net,uchar command, + const char *header, ulong head_len, + const char *packet, ulong len) { - ulong length=len+1; /* 1 extra byte for command */ + ulong length=len+1+head_len; /* 1 extra byte for command */ uchar buff[NET_HEADER_SIZE+1]; uint header_size=NET_HEADER_SIZE+1; buff[4]=command; /* For first packet */ @@ -260,25 +281,28 @@ net_write_command(NET *net,uchar command,const char *packet,ulong len) if (length >= MAX_THREE_BYTES) { /* Take into account that we have the command in the first header */ - len= MAX_THREE_BYTES -1; + len= MAX_THREE_BYTES - 1 - head_len; do { int3store(buff, MAX_THREE_BYTES); buff[3]= (uchar) net->pkt_nr++; if (net_write_buff(net,(char*) buff, header_size) || - net_write_buff(net,packet,len)) + net_write_buff(net, header, head_len) || + net_write_buff(net, packet, len)) return 1; packet+= len; length-= MAX_THREE_BYTES; len=MAX_THREE_BYTES; + head_len=0; header_size=NET_HEADER_SIZE; } while (length >= MAX_THREE_BYTES); len=length; /* Data left to be written */ } int3store(buff,length); buff[3]= (uchar) net->pkt_nr++; - return test(net_write_buff(net,(char*) buff,header_size) || - net_write_buff(net,packet,len) || net_flush(net)); + return test(net_write_buff(net, (char*) buff, header_size) || + (head_len && net_write_buff(net, (char*) header, head_len)) || + net_write_buff(net, packet, len) || net_flush(net)); } /* @@ -286,7 +310,7 @@ net_write_command(NET *net,uchar command,const char *packet,ulong len) One can force the buffer to be flushed with 'net_flush'. */ -static int +static my_bool net_write_buff(NET *net,const char *packet,ulong len) { ulong left_length=(ulong) (net->buff_end - net->write_pos); @@ -815,13 +839,3 @@ my_net_read(NET *net) #endif /* HAVE_COMPRESS */ return len; } - -bool net_request_file(NET* net, const char* fname) -{ - char tmp [FN_REFLEN+1],*end; - DBUG_ENTER("net_request_file"); - tmp[0] = (char) 251; /* NULL_LENGTH */ - end=strnmov(tmp+1,fname,sizeof(tmp)-2); - DBUG_RETURN(my_net_write(net,tmp,(uint) (end-tmp)) || - net_flush(net)); -} diff --git a/sql/repl_failsafe.cc b/sql/repl_failsafe.cc index 04f1ffce00e..3d4a7893790 100644 --- a/sql/repl_failsafe.cc +++ b/sql/repl_failsafe.cc @@ -186,7 +186,7 @@ err: my_message(ER_UNKNOWN_ERROR, "Wrong parameters to function register_slave", MYF(0)); err2: - send_error(&thd->net); + send_error(thd); return 1; } @@ -425,10 +425,10 @@ int show_new_master(THD* thd) if (translate_master(thd, lex_mi, errmsg)) { if (errmsg[0]) - net_printf(&thd->net, ER_ERROR_WHEN_EXECUTING_COMMAND, + net_printf(thd, ER_ERROR_WHEN_EXECUTING_COMMAND, "SHOW NEW MASTER", errmsg); else - send_error(&thd->net, 0); + send_error(thd, 0); DBUG_RETURN(1); } @@ -444,7 +444,7 @@ int show_new_master(THD* thd) net_store_data(packet, (longlong)lex_mi->pos); if (my_net_write(&thd->net, packet->ptr(), packet->length())) DBUG_RETURN(-1); - send_eof(&thd->net); + send_eof(thd); DBUG_RETURN(0); } } @@ -459,7 +459,7 @@ int update_slave_list(MYSQL* mysql) int port_ind; DBUG_ENTER("update_slave_list"); - if (mc_mysql_query(mysql,"SHOW SLAVE HOSTS",0) || + if (mc_mysql_query(mysql,"SHOW SLAVE HOSTS",16) || !(res = mc_mysql_store_result(mysql))) { error = "Query error"; @@ -623,7 +623,7 @@ int show_slave_hosts(THD* thd) } } pthread_mutex_unlock(&LOCK_slave_list); - send_eof(net); + send_eof(thd); DBUG_RETURN(0); } @@ -709,7 +709,7 @@ int load_master_data(THD* thd) (error=terminate_slave_threads(active_mi,restart_thread_mask, 1 /*skip lock*/))) { - send_error(&thd->net,error); + send_error(thd,error); unlock_slave_threads(active_mi); UNLOCK_ACTIVE_MI; return 1; @@ -717,7 +717,7 @@ int load_master_data(THD* thd) if (connect_to_master(thd, &mysql, active_mi)) { - net_printf(&thd->net, error= ER_CONNECT_TO_MASTER, + net_printf(thd, error= ER_CONNECT_TO_MASTER, mc_mysql_error(&mysql)); goto err; } @@ -727,10 +727,10 @@ int load_master_data(THD* thd) MYSQL_RES *db_res, **table_res, **table_res_end, **cur_table_res; uint num_dbs; - if (mc_mysql_query(&mysql, "show databases", 0) || + if (mc_mysql_query(&mysql, "SHOW DATABASES", 14) || !(db_res = mc_mysql_store_result(&mysql))) { - net_printf(&thd->net, error = ER_QUERY_ON_MASTER, + net_printf(thd, error = ER_QUERY_ON_MASTER, mc_mysql_error(&mysql)); goto err; } @@ -744,7 +744,7 @@ int load_master_data(THD* thd) if (!(table_res = (MYSQL_RES**)thd->alloc(num_dbs * sizeof(MYSQL_RES*)))) { - net_printf(&thd->net, error = ER_OUTOFMEMORY); + net_printf(thd, error = ER_OUTOFMEMORY); goto err; } @@ -754,11 +754,11 @@ int load_master_data(THD* thd) we wait to issue FLUSH TABLES WITH READ LOCK for as long as we can to minimize the lock time. */ - if (mc_mysql_query(&mysql, "FLUSH TABLES WITH READ LOCK", 0) || - mc_mysql_query(&mysql, "SHOW MASTER STATUS",0) || + if (mc_mysql_query(&mysql, "FLUSH TABLES WITH READ LOCK", 27) || + mc_mysql_query(&mysql, "SHOW MASTER STATUS",18) || !(master_status_res = mc_mysql_store_result(&mysql))) { - net_printf(&thd->net, error = ER_QUERY_ON_MASTER, + net_printf(thd, error = ER_QUERY_ON_MASTER, mc_mysql_error(&mysql)); goto err; } @@ -798,16 +798,16 @@ int load_master_data(THD* thd) if (mysql_rm_db(thd, db, 1,1) || mysql_create_db(thd, db, 0, 1)) { - send_error(&thd->net, 0, 0); + send_error(thd, 0, 0); cleanup_mysql_results(db_res, cur_table_res - 1, table_res); goto err; } if (mc_mysql_select_db(&mysql, db) || - mc_mysql_query(&mysql, "show tables", 0) || + mc_mysql_query(&mysql, "SHOW TABLES", 11) || !(*cur_table_res = mc_mysql_store_result(&mysql))) { - net_printf(&thd->net, error = ER_QUERY_ON_MASTER, + net_printf(thd, error = ER_QUERY_ON_MASTER, mc_mysql_error(&mysql)); cleanup_mysql_results(db_res, cur_table_res - 1, table_res); goto err; @@ -848,9 +848,9 @@ int load_master_data(THD* thd) mc_mysql_free_result(master_status_res); } - if (mc_mysql_query(&mysql, "UNLOCK TABLES", 0)) + if (mc_mysql_query(&mysql, "UNLOCK TABLES", 13)) { - net_printf(&thd->net, error = ER_QUERY_ON_MASTER, + net_printf(thd, error = ER_QUERY_ON_MASTER, mc_mysql_error(&mysql)); goto err; } @@ -860,7 +860,7 @@ int load_master_data(THD* thd) 0 /* not only reset, but also reinit */, &errmsg)) { - send_error(&thd->net, 0, "Failed purging old relay logs"); + send_error(thd, 0, "Failed purging old relay logs"); unlock_slave_threads(active_mi); UNLOCK_ACTIVE_MI; return 1; @@ -888,7 +888,7 @@ err: mc_mysql_close(&mysql); // safe to call since we always do mc_mysql_init() if (!error) - send_ok(&thd->net); + send_ok(thd); return error; } diff --git a/sql/set_var.cc b/sql/set_var.cc index 3c71d1d32e3..29c9ac09131 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -24,8 +24,9 @@ - Use one of the 'sys_var... classes from set_var.h or write a specific one for the variable type. - Define it in the 'variable definition list' in this file. - - If the variable should be changeable, it should be added to the - 'list of all variables' list in this file. + - If the variable should be changeable or one should be able to access it + with @@variable_name, it should be added to the 'list of all variables' + list in this file. - If the variable should be changed from the command line, add a definition of it in the my_option structure list in mysqld.dcc - If the variable should show up in 'show variables' add it to the @@ -82,6 +83,8 @@ static void fix_net_retry_count(THD *thd, enum_var_type type); static void fix_max_join_size(THD *thd, enum_var_type type); static void fix_query_cache_size(THD *thd, enum_var_type type); static void fix_key_buffer_size(THD *thd, enum_var_type type); +static byte *get_error_count(THD *thd); +static byte *get_warning_count(THD *thd); /* Variable definition list @@ -147,6 +150,8 @@ sys_var_long_ptr sys_max_connect_errors("max_connect_errors", &max_connect_errors); sys_var_long_ptr sys_max_delayed_threads("max_delayed_threads", &max_insert_delayed_threads); +sys_var_thd_ulong sys_max_error_count("max_error_count", + &SV::max_error_count); sys_var_thd_ulong sys_max_heap_table_size("max_heap_table_size", &SV::max_heap_table_size); sys_var_thd_ulong sys_max_join_size("max_join_size", @@ -157,6 +162,8 @@ sys_var_thd_ulong sys_sql_max_join_size("sql_max_join_size", &SV::max_join_size, fix_max_join_size); #endif +sys_var_thd_ulong sys_max_prep_stmt_count("max_prepared_statements", + &SV::max_prep_stmt_count); sys_var_thd_ulong sys_max_sort_length("max_sort_length", &SV::max_sort_length); sys_var_long_ptr sys_max_user_connections("max_user_connections", @@ -220,8 +227,6 @@ sys_var_thd_ulong sys_tmp_table_size("tmp_table_size", &SV::tmp_table_size); sys_var_thd_ulong sys_net_wait_timeout("wait_timeout", &SV::net_wait_timeout); - - /* Variables that are bits in THD */ @@ -283,6 +288,15 @@ static sys_var_timestamp sys_timestamp("timestamp"); static sys_var_last_insert_id sys_last_insert_id("last_insert_id"); static sys_var_last_insert_id sys_identity("identity"); static sys_var_insert_id sys_insert_id("insert_id"); +static sys_var_readonly sys_error_count("error_count", + OPT_SESSION, + SHOW_LONG, + get_error_count); +static sys_var_readonly sys_warning_count("warning_count", + OPT_SESSION, + SHOW_LONG, + get_warning_count); + /* alias for last_insert_id() to be compatible with Sybase */ static sys_var_slave_skip_counter sys_slave_skip_counter("sql_slave_skip_counter"); @@ -311,6 +325,7 @@ sys_var *sys_variables[]= &sys_delayed_insert_limit, &sys_delayed_insert_timeout, &sys_delayed_queue_size, + &sys_error_count, &sys_flush, &sys_flush_time, &sys_foreign_key_checks, @@ -333,8 +348,10 @@ sys_var *sys_variables[]= &sys_max_connect_errors, &sys_max_connections, &sys_max_delayed_threads, + &sys_max_error_count, &sys_max_heap_table_size, &sys_max_join_size, + &sys_max_prep_stmt_count, &sys_max_sort_length, &sys_max_tmp_tables, &sys_max_user_connections, @@ -375,7 +392,8 @@ sys_var *sys_variables[]= &sys_timestamp, &sys_tmp_table_size, &sys_tx_isolation, - &sys_unique_checks + &sys_unique_checks, + &sys_warning_count }; @@ -465,9 +483,11 @@ struct show_var_st init_vars[]= { {sys_max_binlog_size.name, (char*) &sys_max_binlog_size, SHOW_SYS}, {sys_max_connections.name, (char*) &sys_max_connections, SHOW_SYS}, {sys_max_connect_errors.name, (char*) &sys_max_connect_errors, SHOW_SYS}, + {sys_max_error_count.name, (char*) &sys_max_error_count, SHOW_SYS}, {sys_max_delayed_threads.name,(char*) &sys_max_delayed_threads, SHOW_SYS}, {sys_max_heap_table_size.name,(char*) &sys_max_heap_table_size, SHOW_SYS}, {sys_max_join_size.name, (char*) &sys_max_join_size, SHOW_SYS}, + {sys_max_prep_stmt_count.name,(char*) &sys_max_prep_stmt_count, SHOW_SYS}, {sys_max_sort_length.name, (char*) &sys_max_sort_length, SHOW_SYS}, {sys_max_user_connections.name,(char*) &sys_max_user_connections, SHOW_SYS}, {sys_max_tmp_tables.name, (char*) &sys_max_tmp_tables, SHOW_SYS}, @@ -793,7 +813,7 @@ byte *sys_var_thd_bool::value_ptr(THD *thd, enum_var_type type) bool sys_var::check_enum(THD *thd, set_var *var, TYPELIB *enum_names) { char buff[80], *value; - String str(buff,sizeof(buff)), *res; + String str(buff, sizeof(buff), system_charset_info), *res; if (var->value->result_type() == STRING_RESULT) { @@ -831,6 +851,10 @@ err: We have to use netprintf() instead of my_error() here as this is called on the parsing stage. + + TODO: + With prepared statements/stored procedures this has to be fixed + to create an item that gets the current value at fix_fields() stage. */ Item *sys_var::item(THD *thd, enum_var_type var_type) @@ -839,7 +863,7 @@ Item *sys_var::item(THD *thd, enum_var_type var_type) { if (var_type != OPT_DEFAULT) { - net_printf(&thd->net, + net_printf(thd, var_type == OPT_GLOBAL ? ER_LOCAL_VARIABLE : ER_GLOBAL_VARIABLE, name); return 0; @@ -857,10 +881,10 @@ Item *sys_var::item(THD *thd, enum_var_type var_type) case SHOW_CHAR: { char *str= (char*) value_ptr(thd, var_type); - return new Item_string(str,strlen(str)); + return new Item_string(str, strlen(str), system_charset_info); } default: - net_printf(&thd->net, ER_VAR_CANT_BE_READ, name); + net_printf(thd, ER_VAR_CANT_BE_READ, name); } return 0; } @@ -918,7 +942,7 @@ bool sys_var_thd_conv_charset::check(THD *thd, set_var *var) { CONVERT *tmp; char buff[80]; - String str(buff,sizeof(buff)), *res; + String str(buff,sizeof(buff), system_charset_info), *res; if (!var->value) // Default value { @@ -1100,6 +1124,21 @@ static bool set_log_update(THD *thd, set_var *var) return 0; } +static byte *get_warning_count(THD *thd) +{ + thd->sys_var_tmp.long_value= + (thd->warn_count[(uint) MYSQL_ERROR::WARN_LEVEL_NOTE] + + thd->warn_count[(uint) MYSQL_ERROR::WARN_LEVEL_WARN]); + return (byte*) &thd->sys_var_tmp.long_value; +} + +static byte *get_error_count(THD *thd) +{ + thd->sys_var_tmp.long_value= + thd->warn_count[(uint) MYSQL_ERROR::WARN_LEVEL_ERROR]; + return (byte*) &thd->sys_var_tmp.long_value; +} + /**************************************************************************** Main handling of variables: @@ -1161,7 +1200,8 @@ void set_var_init() { extern struct my_option my_long_options[]; // From mysqld - hash_init(&system_variable_hash,array_elements(sys_variables),0,0, + hash_init(&system_variable_hash, system_charset_info, + array_elements(sys_variables),0,0, (hash_get_key) get_sys_var_length,0, HASH_CASE_INSENSITIVE); sys_var **var, **end; for (var= sys_variables, end= sys_variables+array_elements(sys_variables) ; @@ -1212,7 +1252,7 @@ sys_var *find_sys_var(const char *str, uint length) length ? length : strlen(str)); if (!var) - net_printf(¤t_thd->net, ER_UNKNOWN_SYSTEM_VARIABLE, (char*) str); + net_printf(current_thd, ER_UNKNOWN_SYSTEM_VARIABLE, (char*) str); return var; } @@ -1286,7 +1326,7 @@ bool set_var::check(THD *thd) return 0; } - if (value->fix_fields(thd,0)) + if (value->fix_fields(thd, 0, &value)) return 1; if (var->check_update_type(value->result_type())) { @@ -1315,7 +1355,7 @@ bool set_var::update(THD *thd) bool set_var_user::check(THD *thd) { - return user_var_item->fix_fields(thd,0); + return user_var_item->fix_fields(thd,0, (Item**) 0); } @@ -1324,7 +1364,7 @@ bool set_var_user::update(THD *thd) if (user_var_item->update()) { /* Give an error if it's not given already */ - send_error(&thd->net, ER_SET_CONSTANTS_ONLY); + send_error(thd, ER_SET_CONSTANTS_ONLY); return 1; } return 0; diff --git a/sql/set_var.h b/sql/set_var.h index cbe479b7902..2c40414f591 100644 --- a/sql/set_var.h +++ b/sql/set_var.h @@ -39,6 +39,7 @@ typedef bool (*sys_check_func)(THD *, set_var *); typedef bool (*sys_update_func)(THD *, set_var *); typedef void (*sys_after_update_func)(THD *,enum_var_type); typedef void (*sys_set_default_func)(THD *, enum_var_type); +typedef byte *(*sys_value_ptr_func)(THD *thd); class sys_var { @@ -350,6 +351,31 @@ public: }; +/* Variable that you can only read from */ + +class sys_var_readonly: public sys_var +{ +public: + enum_var_type var_type; + SHOW_TYPE show_type; + sys_value_ptr_func value_ptr_func; + sys_var_readonly(const char *name_arg, enum_var_type type, + SHOW_TYPE show_type_arg, + sys_value_ptr_func value_ptr_func_arg) + :sys_var(name_arg), var_type(type), + show_type(show_type_arg), value_ptr_func(value_ptr_func_arg) + {} + bool update(THD *thd, set_var *var) { return 1; } + bool check_default(enum_var_type type) { return 1; } + bool check_type(enum_var_type type) { return type != var_type; } + bool check_update_type(Item_result type) { return 1; } + byte *value_ptr(THD *thd, enum_var_type type) + { + return (*value_ptr_func)(thd); + } + SHOW_TYPE type() { return show_type; } +}; + /**************************************************************************** Classes for parsing of the SET command ****************************************************************************/ @@ -388,7 +414,8 @@ public: if (value_arg && value_arg->type() == Item::FIELD_ITEM) { Item_field *item= (Item_field*) value_arg; - if (!(value=new Item_string(item->field_name, strlen(item->field_name)))) + if (!(value=new Item_string(item->field_name, strlen(item->field_name), + system_charset_info))) value=value_arg; /* Give error message later */ } else diff --git a/sql/share/czech/errmsg.txt b/sql/share/czech/errmsg.txt index e9f3b997a96..17651303714 100644 --- a/sql/share/czech/errmsg.txt +++ b/sql/share/czech/errmsg.txt @@ -206,7 +206,7 @@ "Nezn-Bámá systémová promìnná '%-.64s'", "Tabulka '%-.64s' je ozna-Bèena jako poru¹ená a mìla by být opravena", "Tabulka '%-.64s' je ozna-Bèena jako poru¹ená a poslední (automatická?) oprava se nezdaøila", -"Warning: Some non-transactional changed tables couldn't be rolled back", +"Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', "This operation cannot be performed with a running slave, run SLAVE STOP first", "This operation requires a running slave, configure slave and do SLAVE START", diff --git a/sql/share/english/errmsg.txt b/sql/share/english/errmsg.txt index 88ab604fbcf..ccb452f0cca 100644 --- a/sql/share/english/errmsg.txt +++ b/sql/share/english/errmsg.txt @@ -197,7 +197,7 @@ "Unknown system variable '%-.64s'", "Table '%-.64s' is marked as crashed and should be repaired", "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", -"Warning: Some non-transactional changed tables couldn't be rolled back", +"Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', "This operation cannot be performed with a running slave, run SLAVE STOP first", "This operation requires a running slave, configure slave and do SLAVE START", @@ -242,3 +242,4 @@ "Key reference and table reference doesn't match", "Subselect return more than 1 field", "Subselect return more than 1 record", +"Unknown prepared statement handler (%ld) given to %s", diff --git a/sql/share/greek/errmsg.txt b/sql/share/greek/errmsg.txt index a344ed2df9e..f9117bdd44e 100644 --- a/sql/share/greek/errmsg.txt +++ b/sql/share/greek/errmsg.txt @@ -197,7 +197,7 @@ "Unknown system variable '%-.64s'", "Table '%-.64s' is marked as crashed and should be repaired", "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", -"Warning: Some non-transactional changed tables couldn't be rolled back", +"Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', "This operation cannot be performed with a running slave, run SLAVE STOP first", "This operation requires a running slave, configure slave and do SLAVE START", diff --git a/sql/share/hungarian/errmsg.txt b/sql/share/hungarian/errmsg.txt index 9e88f2c3e2c..9bf7121d309 100644 --- a/sql/share/hungarian/errmsg.txt +++ b/sql/share/hungarian/errmsg.txt @@ -199,7 +199,7 @@ "Unknown system variable '%-.64s'", "Table '%-.64s' is marked as crashed and should be repaired", "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", -"Warning: Some non-transactional changed tables couldn't be rolled back", +"Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', "This operation cannot be performed with a running slave, run SLAVE STOP first", "This operation requires a running slave, configure slave and do SLAVE START", diff --git a/sql/share/japanese/errmsg.txt b/sql/share/japanese/errmsg.txt index 07bdcd6bee5..215a30c5062 100644 --- a/sql/share/japanese/errmsg.txt +++ b/sql/share/japanese/errmsg.txt @@ -199,7 +199,7 @@ "Unknown system variable '%-.64s'", "Table '%-.64s' is marked as crashed and should be repaired", "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", -"Warning: Some non-transactional changed tables couldn't be rolled back", +"Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', "This operation cannot be performed with a running slave, run SLAVE STOP first", "This operation requires a running slave, configure slave and do SLAVE START", diff --git a/sql/share/korean/errmsg.txt b/sql/share/korean/errmsg.txt index 57f990fdc04..0560442ddb8 100644 --- a/sql/share/korean/errmsg.txt +++ b/sql/share/korean/errmsg.txt @@ -197,7 +197,7 @@ "Unknown system variable '%-.64s'", "Table '%-.64s' is marked as crashed and should be repaired", "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", -"Warning: Some non-transactional changed tables couldn't be rolled back", +"Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', "This operation cannot be performed with a running slave, run SLAVE STOP first", "This operation requires a running slave, configure slave and do SLAVE START", diff --git a/sql/share/norwegian-ny/errmsg.txt b/sql/share/norwegian-ny/errmsg.txt index 37f7f2fac01..bc9f9829945 100644 --- a/sql/share/norwegian-ny/errmsg.txt +++ b/sql/share/norwegian-ny/errmsg.txt @@ -199,7 +199,7 @@ "Unknown system variable '%-.64s'", "Table '%-.64s' is marked as crashed and should be repaired", "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", -"Warning: Some non-transactional changed tables couldn't be rolled back", +"Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', "This operation cannot be performed with a running slave, run SLAVE STOP first", "This operation requires a running slave, configure slave and do SLAVE START", diff --git a/sql/share/norwegian/errmsg.txt b/sql/share/norwegian/errmsg.txt index 93f4090d697..2af2e7809b0 100644 --- a/sql/share/norwegian/errmsg.txt +++ b/sql/share/norwegian/errmsg.txt @@ -199,7 +199,7 @@ "Unknown system variable '%-.64s'", "Table '%-.64s' is marked as crashed and should be repaired", "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", -"Warning: Some non-transactional changed tables couldn't be rolled back", +"Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', "This operation cannot be performed with a running slave, run SLAVE STOP first", "This operation requires a running slave, configure slave and do SLAVE START", diff --git a/sql/share/polish/errmsg.txt b/sql/share/polish/errmsg.txt index 3b43ce539c7..93578e6119d 100644 --- a/sql/share/polish/errmsg.txt +++ b/sql/share/polish/errmsg.txt @@ -201,7 +201,7 @@ "Unknown system variable '%-.64s'", "Table '%-.64s' is marked as crashed and should be repaired", "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", -"Warning: Some non-transactional changed tables couldn't be rolled back", +"Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', "This operation cannot be performed with a running slave, run SLAVE STOP first", "This operation requires a running slave, configure slave and do SLAVE START", diff --git a/sql/share/romanian/errmsg.txt b/sql/share/romanian/errmsg.txt index ce237d755d4..cde6ab9a4f4 100644 --- a/sql/share/romanian/errmsg.txt +++ b/sql/share/romanian/errmsg.txt @@ -201,7 +201,7 @@ "Unknown system variable '%-.64s'", "Table '%-.64s' is marked as crashed and should be repaired", "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", -"Warning: Some non-transactional changed tables couldn't be rolled back", +"Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', "This operation cannot be performed with a running slave, run SLAVE STOP first", "This operation requires a running slave, configure slave and do SLAVE START", diff --git a/sql/share/slovak/errmsg.txt b/sql/share/slovak/errmsg.txt index 9912e4c9191..4c5cf834262 100644 --- a/sql/share/slovak/errmsg.txt +++ b/sql/share/slovak/errmsg.txt @@ -205,7 +205,7 @@ "Unknown system variable '%-.64s'", "Table '%-.64s' is marked as crashed and should be repaired", "Table '%-.64s' is marked as crashed and last (automatic?) repair failed", -"Warning: Some non-transactional changed tables couldn't be rolled back", +"Some non-transactional changed tables couldn't be rolled back", "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', "This operation cannot be performed with a running slave, run SLAVE STOP first", "This operation requires a running slave, configure slave and do SLAVE START", diff --git a/sql/share/swedish/errmsg.txt b/sql/share/swedish/errmsg.txt index f6553f247b6..587c9cab406 100644 --- a/sql/share/swedish/errmsg.txt +++ b/sql/share/swedish/errmsg.txt @@ -197,7 +197,7 @@ "Okänd system variabel '%-.64s'", "Tabell '%-.64s' är crashad och bör repareras med REPAIR TABLE", "Tabell '%-.64s' är crashad och senast (automatiska?) reparation misslyckades", -"Warning: Några icke transaktionella tabeller kunde inte återställas vid ROLLBACK", +"Några icke transaktionella tabeller kunde inte återställas vid ROLLBACK", "Transaktionen krävde mera än 'max_binlog_cache_size' minne. Utöka denna mysqld variabel och försök på nytt", "Denna operation kan inte göras under replikering; Gör SLAVE STOP först", "Denna operation kan endast göras under replikering; Konfigurera slaven och gör SLAVE START", diff --git a/sql/slave.cc b/sql/slave.cc index 01f6233a2e0..71dbb1fc1a2 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -56,7 +56,6 @@ static int events_till_disconnect = -1; typedef enum { SLAVE_THD_IO, SLAVE_THD_SQL} SLAVE_THD_TYPE; -void skip_load_data_infile(NET* net); static int process_io_rotate(MASTER_INFO* mi, Rotate_log_event* rev); static int process_io_create_file(MASTER_INFO* mi, Create_file_log_event* cev); static bool wait_for_relay_log_space(RELAY_LOG_INFO* rli); @@ -723,13 +722,22 @@ void slave_print_error(RELAY_LOG_INFO* rli, int err_code, const char* msg, ...) rli->last_slave_errno = err_code; } +/* + This is used to tell a 3.23 master to break send_file() +*/ + +void skip_load_data_infile(NET *net) +{ + (void)net_request_file(net, "/dev/null"); + (void)my_net_read(net); // discard response + (void)net_write_command(net, 0, "", 0, "", 0); // Send ok +} + -void skip_load_data_infile(NET* net) +bool net_request_file(NET* net, const char* fname) { - (void)my_net_write(net, "\xfb/dev/null", 10); - (void)net_flush(net); - (void)my_net_read(net); // discard response - send_ok(net); // the master expects it + DBUG_ENTER("net_request_file"); + DBUG_RETURN(net_write_command(net, 251, fname, strlen(fname), "", 0)); } @@ -875,13 +883,13 @@ static int create_table_from_dump(THD* thd, NET* net, const char* db, if (packet_len == packet_error) { - send_error(&thd->net, ER_MASTER_NET_READ); + send_error(thd, ER_MASTER_NET_READ); return 1; } if (net->read_pos[0] == 255) // error from master { net->read_pos[packet_len] = 0; - net_printf(&thd->net, ER_MASTER, net->read_pos + 3); + net_printf(thd, ER_MASTER, net->read_pos + 3); return 1; } thd->command = COM_TABLE_DUMP; @@ -889,7 +897,7 @@ static int create_table_from_dump(THD* thd, NET* net, const char* db, if (!thd->query) { sql_print_error("create_table_from_dump: out of memory"); - net_printf(&thd->net, ER_GET_ERRNO, "Out of memory"); + net_printf(thd, ER_GET_ERRNO, "Out of memory"); return 1; } memcpy(thd->query, net->read_pos, packet_len); @@ -919,7 +927,7 @@ static int create_table_from_dump(THD* thd, NET* net, const char* db, thd->proc_info = "Opening master dump table"; if (!open_ltable(thd, &tables, TL_WRITE)) { - send_error(&thd->net,0,0); // Send error from open_ltable + send_error(thd,0,0); // Send error from open_ltable sql_print_error("create_table_from_dump: could not open created table"); goto err; } @@ -928,7 +936,7 @@ static int create_table_from_dump(THD* thd, NET* net, const char* db, thd->proc_info = "Reading master dump table data"; if (file->net_read_dump(net)) { - net_printf(&thd->net, ER_MASTER_NET_READ); + net_printf(thd, ER_MASTER_NET_READ); sql_print_error("create_table_from_dump::failed in\ handler::net_read_dump()"); goto err; @@ -947,7 +955,7 @@ static int create_table_from_dump(THD* thd, NET* net, const char* db, error=file->repair(thd,&check_opt) != 0; thd->net.vio = save_vio; if (error) - net_printf(&thd->net, ER_INDEX_REBUILD,tables.table->real_name); + net_printf(thd, ER_INDEX_REBUILD,tables.table->real_name); err: close_thread_tables(thd); @@ -969,12 +977,12 @@ int fetch_master_table(THD *thd, const char *db_name, const char *table_name, { if (!(mysql = mc_mysql_init(NULL))) { - send_error(&thd->net); // EOM + send_error(thd); // EOM DBUG_RETURN(1); } if (connect_to_master(thd, mysql, mi)) { - net_printf(&thd->net, ER_CONNECT_TO_MASTER, mc_mysql_error(mysql)); + net_printf(thd, ER_CONNECT_TO_MASTER, mc_mysql_error(mysql)); mc_mysql_close(mysql); DBUG_RETURN(1); } @@ -998,7 +1006,7 @@ int fetch_master_table(THD *thd, const char *db_name, const char *table_name, if (!called_connected) mc_mysql_close(mysql); if (errmsg && thd->net.vio) - send_error(&thd->net, error, errmsg); + send_error(thd, error, errmsg); DBUG_RETURN(test(error)); // Return 1 on error } @@ -1440,7 +1448,7 @@ int show_master_info(THD* thd, MASTER_INFO* mi) if (my_net_write(&thd->net, (char*)thd->packet.ptr(), packet->length())) DBUG_RETURN(-1); } - send_eof(&thd->net); + send_eof(thd); DBUG_RETURN(0); } @@ -2222,8 +2230,8 @@ static int process_io_create_file(MASTER_INFO* mi, Create_file_log_event* cev) int error = 1; ulong num_bytes; bool cev_not_written; - THD* thd; - NET* net = &mi->mysql->net; + THD *thd = mi->io_thd; + NET *net = &mi->mysql->net; DBUG_ENTER("process_io_create_file"); if (unlikely(!cev->is_valid())) @@ -2237,7 +2245,6 @@ static int process_io_create_file(MASTER_INFO* mi, Create_file_log_event* cev) DBUG_RETURN(0); } DBUG_ASSERT(cev->inited_from_old); - thd = mi->io_thd; thd->file_id = cev->file_id = mi->file_id++; thd->server_id = cev->server_id; cev_not_written = 1; @@ -2266,7 +2273,7 @@ static int process_io_create_file(MASTER_INFO* mi, Create_file_log_event* cev) } if (unlikely(!num_bytes)) /* eof */ { - send_ok(net); /* 3.23 master wants it */ + net_write_command(net, 0, "", 0, "", 0);/* 3.23 master wants it */ Execute_load_log_event xev(thd); xev.log_pos = mi->master_log_pos; if (unlikely(mi->rli.relay_log.append(&xev))) diff --git a/sql/spatial.h b/sql/spatial.h index c6e30a44fbf..3f09e86e823 100644 --- a/sql/spatial.h +++ b/sql/spatial.h @@ -1,8 +1,22 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + 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; either version 2 of the License, or + (at your option) any later version. + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + #ifndef _spatial_h #define _spatial_h -#include "gstream.h" - const uint POINT_DATA_SIZE = 8+8; const uint WKB_HEADER_SIZE = 1+4; @@ -30,7 +44,8 @@ struct MBR ymax=-DBL_MAX; } - MBR(const double &_xmin, const double &_ymin, const double &_xmax, const double &_ymax) + MBR(const double &_xmin, const double &_ymin, + const double &_xmax, const double &_ymax) { xmin=_xmin; ymin=_ymin; @@ -52,7 +67,8 @@ struct MBR double ymax; void add_xy(double x, double y) - { /* Not using "else" for proper one point MBR calculation */ + { + /* Not using "else" for proper one point MBR calculation */ if (xxmin==xmin)&&(mbr->ymin==ymin)&&(mbr->xmax==xmax)&&(mbr->ymax==ymax); + return ((mbr->xmin == xmin) && (mbr->ymin == ymin) && + (mbr->xmax == xmax) && (mbr->ymax == ymax)); } int disjoint(const MBR *mbr) { - return (mbr->xmin>xmax)||(mbr->ymin>ymax)||(mbr->xmaxymaxxmin > xmax) || (mbr->ymin > ymax) || + (mbr->xmax < xmin) || (mbr->ymax < ymin)); } int intersects(const MBR *mbr) @@ -131,24 +150,24 @@ struct MBR int touches(const MBR *mbr) { - return (((mbr->xmin==xmax) || (mbr->xmax==xmin)) && - ((mbr->ymin>=ymin) && (mbr->ymin<=ymax) || - (mbr->ymax>=ymin) && (mbr->ymax<=ymax))) || - (((mbr->ymin==ymax) || (mbr->ymax==ymin)) && - ((mbr->xmin>=xmin) && (mbr->xmin<=xmax) || - (mbr->xmax>=xmin)&&(mbr->xmax<=xmax))); + return ((((mbr->xmin == xmax) || (mbr->xmax == xmin)) && + ((mbr->ymin >= ymin) && (mbr->ymin <= ymax) || + (mbr->ymax >= ymin) && (mbr->ymax <= ymax))) || + (((mbr->ymin == ymax) || (mbr->ymax == ymin)) && + ((mbr->xmin >= xmin) && (mbr->xmin <= xmax) || + (mbr->xmax >= xmin) && (mbr->xmax <= xmax)))); } int within(const MBR *mbr) { - return (mbr->xmin<=xmin) && (mbr->ymin<=ymin) && - (mbr->xmax>=xmax) && (mbr->ymax>=ymax); + return ((mbr->xmin <= xmin) && (mbr->ymin <= ymin) && + (mbr->xmax >= xmax) && (mbr->ymax >= ymax)); } int contains(const MBR *mbr) { - return (mbr->xmin>=xmin) && (mbr->ymin>=ymin) && - (mbr->xmax<=xmax) && (mbr->ymax<=ymax); + return ((mbr->xmin >= xmin) && (mbr->ymin >= ymin) && + (mbr->xmax <= xmax) && (mbr->ymax <= ymax)); } bool inner_point(double x, double y) const @@ -245,45 +264,46 @@ public: size_t get_data_size() const { return (this->*m_vmt->get_data_size)(); } int init_from_text(GTextReadStream *trs, String *wkb) - { return (this->*m_vmt->init_from_text)(trs, wkb); } + { return (this->*m_vmt->init_from_text)(trs, wkb); } int get_data_as_text(String *txt) const - { return (this->*m_vmt->get_data_as_text)(txt); } + { return (this->*m_vmt->get_data_as_text)(txt); } int get_mbr(MBR *mbr) const { return (this->*m_vmt->get_mbr)(mbr); } int dimension(uint32 *dim) const - { return (this->*m_vmt->dimension)(dim); } + { return (this->*m_vmt->dimension)(dim); } int get_x(double *x) const { return (this->*m_vmt->get_x)(x); } int get_y(double *y) const { return (this->*m_vmt->get_y)(y); } int length(double *len) const { return (this->*m_vmt->length)(len); } int area(double *ar) const { return (this->*m_vmt->area)(ar); } - int is_closed(int *closed) const { return (this->*m_vmt->is_closed)(closed); } + int is_closed(int *closed) const + { return (this->*m_vmt->is_closed)(closed); } int num_interior_ring(uint32 *n_int_rings) const - { return (this->*m_vmt->num_interior_ring)(n_int_rings); } + { return (this->*m_vmt->num_interior_ring)(n_int_rings); } int num_points(uint32 *n_points) const - { return (this->*m_vmt->num_points)(n_points); } + { return (this->*m_vmt->num_points)(n_points); } int num_geometries(uint32 *num) const - { return (this->*m_vmt->num_geometries)(num); } + { return (this->*m_vmt->num_geometries)(num); } int start_point(String *point) const - { return (this->*m_vmt->start_point)(point); } + { return (this->*m_vmt->start_point)(point); } int end_point(String *point) const - { return (this->*m_vmt->end_point)(point); } + { return (this->*m_vmt->end_point)(point); } int exterior_ring(String *ring) const - { return (this->*m_vmt->exterior_ring)(ring); } + { return (this->*m_vmt->exterior_ring)(ring); } int centroid(String *point) const - { return (this->*m_vmt->centroid)(point); } + { return (this->*m_vmt->centroid)(point); } int point_n(uint32 num, String *result) const - { return (this->*m_vmt->point_n)(num, result); } + { return (this->*m_vmt->point_n)(num, result); } int interior_ring_n(uint32 num, String *result) const - { return (this->*m_vmt->interior_ring_n)(num, result); } + { return (this->*m_vmt->interior_ring_n)(num, result); } int geometry_n(uint32 num, String *result) const - { return (this->*m_vmt->geometry_n)(num, result); } + { return (this->*m_vmt->geometry_n)(num, result); } public: int create_from_wkb(const char *data, uint32 data_len); @@ -301,11 +321,11 @@ public: int as_wkt(String *wkt) const { - if(wkt->reserve(strlen(get_class_info()->m_name) + 2, 512)) + if (wkt->reserve(strlen(get_class_info()->m_name) + 2, 512)) return 1; wkt->qs_append(get_class_info()->m_name); wkt->qs_append('('); - if(get_data_as_text(wkt)) + if (get_data_as_text(wkt)) return 1; wkt->qs_append(')'); return 0; @@ -330,35 +350,37 @@ protected: bool no_data(const char *cur_data, uint32 data_amount) const { - return cur_data + data_amount > m_data_end; + return (cur_data + data_amount > m_data_end); } const char *m_data; const char *m_data_end; }; +#define SIZEOF_STORED_DOUBLE 8 + /***************************** Point *******************************/ class GPoint: public Geometry { public: - size_t get_data_size() const; - int init_from_text(GTextReadStream *trs, String *wkb); - int get_data_as_text(String *txt) const; - int get_mbr(MBR *mbr) const; + size_t get_data_size() const; + int init_from_text(GTextReadStream *trs, String *wkb); + int get_data_as_text(String *txt) const; + int get_mbr(MBR *mbr) const; int get_xy(double *x, double *y) const { const char *data = m_data; - if(no_data(data, sizeof(double)) * 2) return 1; + if (no_data(data, SIZEOF_STORED_DOUBLE * 2)) return 1; float8get(*x, data); - float8get(*y, data + sizeof(double)); + float8get(*y, data + SIZEOF_STORED_DOUBLE); return 0; } int get_x(double *x) const { - if(no_data(m_data, sizeof(double))) return 1; + if (no_data(m_data, SIZEOF_STORED_DOUBLE)) return 1; float8get(*x, m_data); return 0; } @@ -366,8 +388,8 @@ public: int get_y(double *y) const { const char *data = m_data; - if(no_data(data, sizeof(double)) * 2) return 1; - float8get(*y, data + sizeof(double)); + if (no_data(data, SIZEOF_STORED_DOUBLE * 2)) return 1; + float8get(*y, data + SIZEOF_STORED_DOUBLE); return 0; } @@ -399,11 +421,11 @@ public: class GPolygon: public Geometry { public: - size_t get_data_size() const; - int init_from_text(GTextReadStream *trs, String *wkb); - int get_data_as_text(String *txt) const; - int get_mbr(MBR *mbr) const; - + size_t get_data_size() const; + int init_from_text(GTextReadStream *trs, String *wkb); + int get_data_as_text(String *txt) const; + int get_mbr(MBR *mbr) const; + int area(double *ar) const; int exterior_ring(String *result) const; int num_interior_ring(uint32 *n_int_rings) const; @@ -431,11 +453,11 @@ public: class GMultiLineString: public Geometry { public: - size_t get_data_size() const; - int init_from_text(GTextReadStream *trs, String *wkb); - int get_data_as_text(String *txt) const; - int get_mbr(MBR *mbr) const; - + size_t get_data_size() const; + int init_from_text(GTextReadStream *trs, String *wkb); + int get_data_as_text(String *txt) const; + int get_mbr(MBR *mbr) const; + int length(double *len) const; int is_closed(int *closed) const; int dimension(uint32 *dim) const { *dim = 1; return 0; } @@ -446,10 +468,10 @@ public: class GMultiPolygon: public Geometry { public: - size_t get_data_size() const; - int init_from_text(GTextReadStream *trs, String *wkb); - int get_data_as_text(String *txt) const; - int get_mbr(MBR *mbr) const; + size_t get_data_size() const; + int init_from_text(GTextReadStream *trs, String *wkb); + int get_data_as_text(String *txt) const; + int get_mbr(MBR *mbr) const; int area(double *ar) const; int centroid(String *result) const; @@ -462,14 +484,13 @@ public: class GGeometryCollection: public Geometry { public: - size_t get_data_size() const; - int init_from_text(GTextReadStream *trs, String *wkb); - int get_data_as_text(String *txt) const; - int get_mbr(MBR *mbr) const; + size_t get_data_size() const; + int init_from_text(GTextReadStream *trs, String *wkb); + int get_data_as_text(String *txt) const; + int get_mbr(MBR *mbr) const; int num_geometries(uint32 *num) const; int geometry_n(uint32 num, String *result) const; - int dimension(uint32 *dim) const; }; diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index 1069e779e86..e6b9a1f532b 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -997,7 +997,7 @@ bool check_change_password(THD *thd, const char *host, const char *user) { if (!initialized) { - send_error(&thd->net, ER_PASSWORD_NOT_ALLOWED); /* purecov: inspected */ + send_error(thd, ER_PASSWORD_NOT_ALLOWED); /* purecov: inspected */ return(1); /* purecov: inspected */ } if (!thd->slave_thread && @@ -1009,7 +1009,7 @@ bool check_change_password(THD *thd, const char *host, const char *user) } if (!thd->slave_thread && !thd->user[0]) { - send_error(&thd->net, ER_PASSWORD_ANONYMOUS_USER); + send_error(thd, ER_PASSWORD_ANONYMOUS_USER); return(1); } return(0); @@ -1036,7 +1036,7 @@ bool change_password(THD *thd, const char *host, const char *user, ACL_USER *acl_user; if (!(acl_user= find_acl_user(host,user))) { - send_error(&thd->net, ER_PASSWORD_NO_MATCH); + send_error(thd, ER_PASSWORD_NO_MATCH); VOID(pthread_mutex_unlock(&acl_cache->lock)); DBUG_RETURN(1); } @@ -1046,7 +1046,7 @@ bool change_password(THD *thd, const char *host, const char *user, new_password)) { VOID(pthread_mutex_unlock(&acl_cache->lock)); /* purecov: deadcode */ - send_error(&thd->net,0); /* purecov: deadcode */ + send_error(thd,0); /* purecov: deadcode */ DBUG_RETURN(1); /* purecov: deadcode */ } get_salt_from_password(acl_user->salt,new_password); @@ -1960,7 +1960,7 @@ int mysql_table_grant (THD *thd, TABLE_LIST *table_list, if (!initialized) { - send_error(&(thd->net), ER_UNKNOWN_COM_ERROR); /* purecov: inspected */ + send_error(thd, ER_UNKNOWN_COM_ERROR); /* purecov: inspected */ return 1; /* purecov: inspected */ } if (rights & ~TABLE_ACLS) @@ -2026,7 +2026,7 @@ int mysql_table_grant (THD *thd, TABLE_LIST *table_list, if (!revoke_grant) create_new_users= test_if_create_new_users(thd); int result=0; - pthread_mutex_lock(&LOCK_grant); + rw_wrlock(&LOCK_grant); MEM_ROOT *old_root=my_pthread_getspecific_ptr(MEM_ROOT*,THR_MALLOC); my_pthread_setspecific_ptr(THR_MALLOC,&memex); @@ -2135,9 +2135,9 @@ int mysql_table_grant (THD *thd, TABLE_LIST *table_list, } grant_option=TRUE; my_pthread_setspecific_ptr(THR_MALLOC,old_root); - pthread_mutex_unlock(&LOCK_grant); + rw_unlock(&LOCK_grant); if (!result) - send_ok(&thd->net); + send_ok(thd); /* Tables are automatically closed */ DBUG_RETURN(result); } @@ -2155,8 +2155,8 @@ int mysql_grant (THD *thd, const char *db, List &list, if (!initialized) { - send_error(&(thd->net), ER_UNKNOWN_COM_ERROR); /* purecov: tested */ - return 1; /* purecov: tested */ + send_error(thd, ER_UNKNOWN_COM_ERROR); /* purecov: tested */ + return 1; /* purecov: tested */ } if (lower_case_table_names && db) @@ -2185,7 +2185,7 @@ int mysql_grant (THD *thd, const char *db, List &list, create_new_users= test_if_create_new_users(thd); // go through users in user_list - pthread_mutex_lock(&LOCK_grant); + rw_wrlock(&LOCK_grant); VOID(pthread_mutex_lock(&acl_cache->lock)); grant_version++; @@ -2218,11 +2218,11 @@ int mysql_grant (THD *thd, const char *db, List &list, } } VOID(pthread_mutex_unlock(&acl_cache->lock)); - pthread_mutex_unlock(&LOCK_grant); + rw_unlock(&LOCK_grant); close_thread_tables(thd); if (!result) - send_ok(&thd->net); + send_ok(thd); DBUG_RETURN(result); } @@ -2341,7 +2341,7 @@ void grant_reload(void) // Locked tables are checked by acl_init and doesn't have to be checked here - pthread_mutex_lock(&LOCK_grant); + rw_wrlock(&LOCK_grant); grant_version++; old_hash_tables=hash_tables; old_grant_option = grant_option; @@ -2359,7 +2359,7 @@ void grant_reload(void) hash_free(&old_hash_tables); free_root(&old_mem,MYF(0)); } - pthread_mutex_unlock(&LOCK_grant); + rw_unlock(&LOCK_grant); DBUG_VOID_RETURN; } @@ -2379,7 +2379,7 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables, if (!want_access) return 0; // ok - pthread_mutex_lock(&LOCK_grant); + rw_rdlock(&LOCK_grant); for (table=tables; table ;table=table->next) { if (!(~table->grant.privilege & want_access)) @@ -2413,11 +2413,11 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables, goto err; // impossible } } - pthread_mutex_unlock(&LOCK_grant); + rw_unlock(&LOCK_grant); return 0; err: - pthread_mutex_unlock(&LOCK_grant); + rw_unlock(&LOCK_grant); if (!no_errors) // Not a silent skip of table { const char *command=""; @@ -2439,7 +2439,7 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables, command = "index"; else if (want_access & GRANT_ACL) command = "grant"; - net_printf(&thd->net,ER_TABLEACCESS_DENIED_ERROR, + net_printf(thd,ER_TABLEACCESS_DENIED_ERROR, command, thd->priv_user, thd->host_or_ip, @@ -2459,7 +2459,7 @@ bool check_grant_column (THD *thd,TABLE *table, const char *name, if (!want_access) return 0; // Already checked - pthread_mutex_lock(&LOCK_grant); + rw_rdlock(&LOCK_grant); // reload table if someone has modified any grants @@ -2477,20 +2477,20 @@ bool check_grant_column (THD *thd,TABLE *table, const char *name, grant_column=column_hash_search(grant_table, name, length); if (grant_column && !(~grant_column->rights & want_access)) { - pthread_mutex_unlock(&LOCK_grant); + rw_unlock(&LOCK_grant); return 0; } #ifdef NOT_USED if (show_tables && (grant_column || table->grant.privilege & COL_ACLS)) { - pthread_mutex_unlock(&LOCK_grant); /* purecov: deadcode */ + rw_unlock(&LOCK_grant); /* purecov: deadcode */ return 0; /* purecov: deadcode */ } #endif /* We must use my_printf_error() here! */ err: - pthread_mutex_unlock(&LOCK_grant); + rw_unlock(&LOCK_grant); if (!show_tables) { char command[128]; @@ -2518,7 +2518,7 @@ bool check_grant_all_columns(THD *thd, ulong want_access, TABLE *table) if (!want_access) return 0; // Already checked - pthread_mutex_lock(&LOCK_grant); + rw_rdlock(&LOCK_grant); // reload table if someone has modified any grants @@ -2541,12 +2541,12 @@ bool check_grant_all_columns(THD *thd, ulong want_access, TABLE *table) if (!grant_column || (~grant_column->rights & want_access)) goto err; } - pthread_mutex_unlock(&LOCK_grant); + rw_unlock(&LOCK_grant); return 0; /* We must use my_printf_error() here! */ err: - pthread_mutex_unlock(&LOCK_grant); + rw_unlock(&LOCK_grant); const char *command=""; if (want_access & SELECT_ACL) @@ -2578,7 +2578,7 @@ bool check_grant_db(THD *thd,const char *db) bool error=1; len = (uint) (strmov(strmov(helping,thd->priv_user)+1,db)-helping)+ 1; - pthread_mutex_lock(&LOCK_grant); + rw_rdlock(&LOCK_grant); for (uint idx=0 ; idx < hash_tables.records ; idx++) { @@ -2594,7 +2594,7 @@ bool check_grant_db(THD *thd,const char *db) break; } } - pthread_mutex_unlock(&LOCK_grant); + rw_unlock(&LOCK_grant); return error; } @@ -2608,14 +2608,14 @@ ulong get_table_grant(THD *thd, TABLE_LIST *table) const char *db = table->db ? table->db : thd->db; GRANT_TABLE *grant_table; - pthread_mutex_lock(&LOCK_grant); + rw_rdlock(&LOCK_grant); grant_table = table_hash_search(thd->host,thd->ip,db,user, table->real_name,0); table->grant.grant_table=grant_table; // Remember for column test table->grant.version=grant_version; if (grant_table) table->grant.privilege|= grant_table->privs; - pthread_mutex_unlock(&LOCK_grant); + rw_unlock(&LOCK_grant); return table->grant.privilege; } @@ -2626,7 +2626,7 @@ ulong get_column_grant(THD *thd, TABLE_LIST *table, Field *field) GRANT_COLUMN *grant_column; ulong priv; - pthread_mutex_lock(&LOCK_grant); + rw_rdlock(&LOCK_grant); // reload table if someone has modified any grants if (table->grant.version != grant_version) { @@ -2648,7 +2648,7 @@ ulong get_column_grant(THD *thd, TABLE_LIST *table, Field *field) else priv=table->grant.privilege | grant_column->rights; } - pthread_mutex_unlock(&LOCK_grant); + rw_unlock(&LOCK_grant); return priv; } @@ -2683,7 +2683,7 @@ int mysql_show_grants(THD *thd,LEX_USER *lex_user) LINT_INIT(acl_user); if (!initialized) { - send_error(&(thd->net), ER_UNKNOWN_COM_ERROR); + send_error(thd, ER_UNKNOWN_COM_ERROR); DBUG_RETURN(-1); } if (!lex_user->host.str) @@ -2990,7 +2990,7 @@ int mysql_show_grants(THD *thd,LEX_USER *lex_user) } end: VOID(pthread_mutex_unlock(&acl_cache->lock)); - send_eof(&thd->net); + send_eof(thd); DBUG_RETURN(error); } diff --git a/sql/sql_analyse.cc b/sql/sql_analyse.cc index 91d6b967929..363a194276b 100644 --- a/sql/sql_analyse.cc +++ b/sql/sql_analyse.cc @@ -89,21 +89,21 @@ proc_analyse_init(THD *thd, ORDER *param, select_result *result, if ((*param->item)->type() != Item::INT_ITEM || (*param->item)->val() < 0) { - net_printf(&thd->net, ER_WRONG_PARAMETERS_TO_PROCEDURE, proc_name); + net_printf(thd, ER_WRONG_PARAMETERS_TO_PROCEDURE, proc_name); DBUG_RETURN(0); } pc->max_tree_elements = (uint) (*param->item)->val_int(); param = param->next; if (param->next) // no third parameter possible { - net_printf(&thd->net, ER_WRONG_PARAMCOUNT_TO_PROCEDURE, proc_name); + net_printf(thd, ER_WRONG_PARAMCOUNT_TO_PROCEDURE, proc_name); DBUG_RETURN(0); } // second parameter if ((*param->item)->type() != Item::INT_ITEM || (*param->item)->val() < 0) { - net_printf(&thd->net, ER_WRONG_PARAMETERS_TO_PROCEDURE, proc_name); + net_printf(thd, ER_WRONG_PARAMETERS_TO_PROCEDURE, proc_name); DBUG_RETURN(0); } pc->max_treemem = (uint) (*param->item)->val_int(); @@ -111,7 +111,7 @@ proc_analyse_init(THD *thd, ORDER *param, select_result *result, else if ((*param->item)->type() != Item::INT_ITEM || (*param->item)->val() < 0) { - net_printf(&thd->net, ER_WRONG_PARAMETERS_TO_PROCEDURE, proc_name); + net_printf(thd, ER_WRONG_PARAMETERS_TO_PROCEDURE, proc_name); DBUG_RETURN(0); } // if only one parameter was given, it will be the value of max_tree_elements @@ -387,8 +387,7 @@ void field_real::add() if ((decs = decimals()) == NOT_FIXED_DEC) { - sprintf(buff, "%g", num); - length = (uint) strlen(buff); + length= my_sprintf(buff, (buff, "%g", num)); if (rint(num) != num) max_notzero_dec_len = 1; } @@ -397,11 +396,11 @@ void field_real::add() #ifdef HAVE_SNPRINTF buff[sizeof(buff)-1]=0; // Safety snprintf(buff, sizeof(buff)-1, "%-.*f", (int) decs, num); + length = (uint) strlen(buff); #else - sprintf(buff, "%-.*f", (int) decs, num); + length= my_sprintf(buff, (buff, "%-.*f", (int) decs, num)); #endif - length = (uint) strlen(buff); // We never need to check further than this end = buff + length - 1 - decs + max_notzero_dec_len; diff --git a/sql/sql_base.cc b/sql/sql_base.cc index a8115c15412..3175193e8ce 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -224,7 +224,7 @@ send_convert_fields(THD *thd,List &list,CONVERT *convert,uint flag) char buff[80]; String tmp((char*) buff,sizeof(buff),default_charset_info); String *res,*packet= &thd->packet; - DBUG_ENTER("send_fields"); + DBUG_ENTER("send_convert_fields"); while ((item=it++)) { @@ -286,10 +286,10 @@ send_convert_fields(THD *thd,List &list,CONVERT *convert,uint flag) if (my_net_write(&thd->net, (char*) packet->ptr(),packet->length())) break; /* purecov: inspected */ } - return 0; + DBUG_RETURN(0); err: - return 1; + DBUG_RETURN(1); } @@ -406,7 +406,8 @@ send_non_convert_fields(THD *thd,List &list,uint flag) bool send_fields(THD *thd, List &list, uint flag) { - CONVERT *convert= (flag & 4) ? (CONVERT*) 0 : thd->convert_set; + char buff[9]; // Big enough for store_length + CONVERT *convert= (flag & 4) ? (CONVERT*) 0 : thd->variables.convert_set; DBUG_ENTER("send_fields"); if (thd->fatal_error) // We have got an error @@ -414,7 +415,7 @@ send_fields(THD *thd, List &list, uint flag) if (flag & 1) { // Packet with number of elements - char *pos=net_store_length(buff,(uint) list.elements); + char *pos=net_store_length(buff, (uint) list.elements); (void) my_net_write(&thd->net, buff,(uint) (pos-buff)); } @@ -430,11 +431,11 @@ send_fields(THD *thd, List &list, uint flag) else if (send_non_convert_fields(thd, list, flag)) goto err; - send_eof(&thd->net); - return 0; + send_eof(thd); + DBUG_RETURN(0); err: - send_error(&thd->net,ER_OUT_OF_RESOURCES); /* purecov: inspected */ + send_error(thd,ER_OUT_OF_RESOURCES); /* purecov: inspected */ DBUG_RETURN(1); /* purecov: inspected */ } diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 41def4aa1b5..277492bcea6 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -77,14 +77,15 @@ static void free_var(user_var_entry *entry) ** Thread specific functions ****************************************************************************/ -THD::THD():user_time(0),fatal_error(0),last_insert_id_used(0), +THD::THD():user_time(0), fatal_error(0), + last_insert_id_used(0), insert_id_used(0), in_lock_tables(0), global_read_lock(0), bootstrap(0) { host=user=priv_user=db=query=ip=0; host_or_ip="unknown ip"; locked=killed=count_cuted_fields=some_tables_deleted=no_errors=password= - query_start_used=safe_to_cache_query=0; + query_start_used=safe_to_cache_query=prepare_command=0; pthread_mutex_lock(&LOCK_global_system_variables); variables= global_system_variables; pthread_mutex_unlock(&LOCK_global_system_variables); @@ -96,7 +97,7 @@ THD::THD():user_time(0),fatal_error(0),last_insert_id_used(0), tmp_table=0; lock=locked_tables=0; used_tables=0; - cuted_fields=sent_row_count=0L; + cuted_fields= sent_row_count= current_stmt_id= 0L; start_time=(time_t) 0; current_linfo = 0; slave_thread = 0; @@ -142,10 +143,21 @@ THD::THD():user_time(0),fatal_error(0),last_insert_id_used(0), bzero((char*) &mem_root,sizeof(mem_root)); bzero((char*) &transaction.mem_root,sizeof(transaction.mem_root)); bzero((char*) &con_root,sizeof(con_root)); + bzero((char*) &warn_root,sizeof(warn_root)); + init_alloc_root(&warn_root, 1024, 0); + bzero((char*) warn_count, sizeof(warn_count)); + warn_list.empty(); user_connect=(USER_CONN *)0; hash_init(&user_vars, system_charset_info, USER_VARS_HASH_SIZE, 0, 0, (hash_get_key) get_var_key, (void (*)(void*)) free_var,0); + + /* Prepared statements */ + last_prepared_stmt= 0; + init_tree(&prepared_statements, 0, 0, sizeof(PREP_STMT), + (qsort_cmp2) compare_prep_stmt, 1, + (tree_element_free) free_prep_stmt, 0); + #ifdef USING_TRANSACTIONS bzero((char*) &transaction,sizeof(transaction)); if (opt_using_transactions) @@ -222,7 +234,9 @@ THD::~THD() safeFree(ip); free_root(&mem_root,MYF(0)); free_root(&con_root,MYF(0)); + free_root(&warn_root,MYF(0)); free_root(&transaction.mem_root,MYF(0)); + delete_tree(&prepared_statements); mysys_var=0; // Safety (shouldn't be needed) pthread_mutex_destroy(&LOCK_delete); #ifndef DBUG_OFF @@ -272,8 +286,7 @@ void THD::awake(bool prepare_to_die) bool THD::store_globals() { return (my_pthread_setspecific_ptr(THR_THD, this) || - my_pthread_setspecific_ptr(THR_MALLOC, &mem_root) || - my_pthread_setspecific_ptr(THR_NET, &net)); + my_pthread_setspecific_ptr(THR_MALLOC, &mem_root)); } @@ -424,7 +437,7 @@ bool select_send::send_eof() { mysql_unlock_tables(thd, thd->lock); thd->lock=0; } - ::send_eof(&thd->net); + ::send_eof(thd); return 0; } @@ -649,7 +662,7 @@ err: void select_export::send_error(uint errcode,const char *err) { - ::send_error(&thd->net,errcode,err); + ::send_error(thd,errcode,err); (void) end_io_cache(&cache); (void) my_close(file,MYF(0)); file= -1; @@ -662,9 +675,9 @@ bool select_export::send_eof() if (my_close(file,MYF(MY_WME))) error=1; if (error) - ::send_error(&thd->net); + ::send_error(thd); else - ::send_ok(&thd->net,row_count); + ::send_ok(thd,row_count); file= -1; return error; } @@ -761,7 +774,7 @@ err: void select_dump::send_error(uint errcode,const char *err) { - ::send_error(&thd->net,errcode,err); + ::send_error(thd,errcode,err); (void) end_io_cache(&cache); (void) my_close(file,MYF(0)); (void) my_delete(path,MYF(0)); // Delete file on error @@ -774,9 +787,9 @@ bool select_dump::send_eof() if (my_close(file,MYF(MY_WME))) error=1; if (error) - ::send_error(&thd->net); + ::send_error(thd); else - ::send_ok(&thd->net,row_count); + ::send_ok(thd,row_count); file= -1; return error; } diff --git a/sql/sql_class.h b/sql/sql_class.h index 8b2e9400613..f1eb4febf0f 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -292,31 +292,43 @@ public: i_string_pair():key(0),val(0) { } i_string_pair(char* key_arg, char* val_arg) : key(key_arg),val(val_arg) {} }; -#define MYSQL_DEFAULT_ERROR_COUNT 500 -class mysql_st_error + +class MYSQL_ERROR: public Sql_alloc { public: + enum enum_warning_level + { WARN_LEVEL_NOTE, WARN_LEVEL_WARN, WARN_LEVEL_ERROR, WARN_LEVEL_END}; + uint code; - char msg[MYSQL_ERRMSG_SIZE+1]; - char query[NAME_LEN+1]; + enum_warning_level level; + char *msg; - static void *operator new(size_t size) - { - return (void*)my_malloc((uint)size, MYF(MY_WME | MY_FAE)); - } - static void operator delete(void* ptr_arg, size_t size) - { - my_free((gptr)ptr_arg, MYF(MY_WME|MY_ALLOW_ZERO_PTR)); - } - mysql_st_error(uint ecode, const char *emsg, const char *equery) + MYSQL_ERROR(uint code_arg, enum_warning_level level_arg, + const char *msg_arg) + :code(code_arg), level(level_arg) { - code = ecode; - strmov(msg, emsg); - strnmov(query, equery ? equery : "", NAME_LEN); + msg=sql_strdup(msg_arg); } }; + +/* This is a struct as it's allocated in tree_insert */ + +typedef struct st_prep_stmt +{ + THD *thd; + Item_param *param; + Item *free_list; + MEM_ROOT mem_root; + ulong stmt_id; + uint param_count; + uint last_errno; + char last_error[MYSQL_ERRMSG_SIZE]; + bool error_in_prepare, long_data_used; +} PREP_STMT; + + class delayed_insert; #define THD_SENTRY_MAGIC 0xfeedd1ff @@ -332,27 +344,27 @@ struct system_variables ulong join_buff_size; ulong long_query_time; ulong max_allowed_packet; + ulong max_error_count; ulong max_heap_table_size; - ulong max_sort_length; ulong max_join_size; + ulong max_prep_stmt_count; + ulong max_sort_length; ulong max_tmp_tables; - ulong max_error_count; - ulong max_warning_count; ulong myisam_sort_buff_size; ulong net_buffer_length; ulong net_interactive_timeout; ulong net_read_timeout; + ulong net_retry_count; ulong net_wait_timeout; ulong net_write_timeout; - ulong net_retry_count; ulong query_cache_type; ulong read_buff_size; ulong read_rnd_buff_size; ulong select_limit; ulong sortbuff_size; + ulong table_type; ulong tmp_table_size; ulong tx_isolation; - ulong table_type; my_bool log_warnings; my_bool low_priority_updates; @@ -372,7 +384,9 @@ public: LEX lex; // parse tree descriptor MEM_ROOT mem_root; // 1 command-life memory pool MEM_ROOT con_root; // connection-life memory + MEM_ROOT warn_root; // For warnings and errors HASH user_vars; // hash for user variables + TREE prepared_statements; String packet; // dynamic buffer for network I/O struct sockaddr_in remote; // client socket address struct rand_struct rand; // used for authentication @@ -408,7 +422,6 @@ public: ulong master_access; /* Global privileges from mysql.user */ ulong db_access; /* Privileges for current db */ - /* open_tables - list of regular tables in use by this thread temporary_tables - list of temp tables in use by this thread @@ -417,9 +430,10 @@ public: */ TABLE *open_tables,*temporary_tables, *handler_tables; // TODO: document the variables below - MYSQL_LOCK *lock; /* Current locks */ - MYSQL_LOCK *locked_tables; /* Tables locked with LOCK */ - ULL *ull; + MYSQL_LOCK *lock; /* Current locks */ + MYSQL_LOCK *locked_tables; /* Tables locked with LOCK */ + ULL *ull; + PREP_STMT *last_prepared_stmt; #ifndef DBUG_OFF uint dbug_sentry; // watch out for memory corruption #endif @@ -466,8 +480,11 @@ public: table_map used_tables; USER_CONN *user_connect; CHARSET_INFO *db_charset; + List warn_list; + uint warn_count[(uint) MYSQL_ERROR::WARN_LEVEL_END]; + uint total_warn_count, old_total_warn_count; ulong query_id, version, options, thread_id, col_access; - ulong param_count,current_param_number; + ulong current_stmt_id; long dbug_thread_id; pthread_t real_id; uint current_tablenr,tmp_table,cond_count; @@ -480,16 +497,15 @@ public: uint8 query_cache_type; // type of query cache processing bool slave_thread; bool set_query_id,locked,count_cuted_fields,some_tables_deleted; - bool no_errors, allow_sum_func, password, fatal_error; + bool no_errors, allow_sum_func, password; + bool fatal_error; bool query_start_used,last_insert_id_used,insert_id_used; bool system_thread,in_lock_tables,global_read_lock; bool query_error, bootstrap, cleanup_done; bool safe_to_cache_query; bool volatile killed; bool prepare_command; - Error err_list; - Error warn_list; - Item_param *current_param; + Item_param *params; // Pointer to array of params /* If we do a purge of binary logs, log index info of the threads @@ -638,7 +654,7 @@ public: class JOIN; -void send_error(NET *net,uint sql_errno=0, const char *err=0); +void send_error(THD *thd, uint sql_errno=0, const char *err=0); class select_result :public Sql_alloc { protected: @@ -657,7 +673,7 @@ public: virtual void initialize_tables (JOIN *join=0) {} virtual void send_error(uint errcode,const char *err) { - ::send_error(&thd->net,errcode,err); + ::send_error(thd,errcode,err); } virtual bool send_eof()=0; virtual void abort() {} diff --git a/sql/sql_db.cc b/sql/sql_db.cc index dee26aae4be..708a016f727 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -25,112 +25,138 @@ #include #endif -#define MY_DB_OPT_FILE ".db.opt" +#define MY_DB_OPT_FILE "db.opt" + +const char *del_exts[]= {".frm", ".BAK", ".TMD",".opt", NullS}; +static TYPELIB deletable_extentions= +{array_elements(del_exts)-1,"del_exts", del_exts}; + +const char *known_exts[]= +{".ISM",".ISD",".ISM",".MRG",".MYI",".MYD",".db",NullS}; +static TYPELIB known_extentions= +{array_elements(known_exts)-1,"known_exts", known_exts}; static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db, const char *path, uint level); /* - Create database options file: - Currently databse default charset is only stored there. + Create database options file: + + DESCRIPTION + Currently database default charset is only stored there. + + RETURN VALUES + 0 ok + 1 Could not create file or write to it. Error sent through my_error() */ -static int write_db_opt(THD *thd,const char *db,HA_CREATE_INFO *create,char *fn) +static bool write_db_opt(const char *path, HA_CREATE_INFO *create) { register File file; - char buf[256]; // Should be enough - int error=0; + char buf[256]; // Should be enough for one option + bool error=1; - if ((file=my_create(fn,CREATE_MODE,O_RDWR | O_TRUNC,MYF(MY_WME))) >= 0) + if ((file=my_create(path, CREATE_MODE,O_RDWR | O_TRUNC,MYF(MY_WME))) >= 0) { - sprintf(buf,"default-character-set=%s\n", - (create && create->table_charset) ? - create->table_charset->name : "DEFAULT"); - - if (my_write(file,(byte*)buf,strlen(buf),MYF(MY_NABP+MY_WME))) - { - // QQ : should we send more suitable error message? - my_error(ER_CANT_CREATE_DB,MYF(0),db,my_errno); - error = -1; - goto exit; - } + ulong length; + length= my_sprintf(buf,(buf, "default-character-set=%s\n", + (create && create->table_charset) ? + create->table_charset->name : "DEFAULT")); + + /* Error is written by my_write */ + if (!my_write(file,(byte*) buf, length, MYF(MY_NABP+MY_WME))) + error=0; my_close(file,MYF(0)); } - else - { - // QQ : should we send more suitable error message? - my_error(ER_CANT_CREATE_DB,MYF(0),db,my_errno); - error = -1; - goto exit; - } exit: return error; } - /* - Load database options file: - */ -static int load_db_opt(THD *thd,const char *db,HA_CREATE_INFO *create,char *fn) -{ - register File file; - char buf[256]=""; +/* + Load database options file - if ((file=my_open(fn,O_RDWR|O_BINARY,MYF(MY_WME))) >= 0) - { - int nbytes=my_read(file,(byte*)buf,sizeof(buf)-1,MYF(0)); - if ( nbytes >= 0 ) - { - char *ln=buf; - char *pe=buf+nbytes; + load_db_opt() + path Path for option file + create Where to store the read options + + DESCRIPTION + For now, only default-character-set is read. - buf[nbytes]='\0'; + RETURN VALUES + 0 File found + 1 No database file or could not open it - for ( ln=buf; ln= 0) + { + IO_CACHE cache; + init_io_cache(&cache, file, IO_SIZE, READ_CACHE, 0, 0, MYF(0)); + + while ((int) (nbytes= my_b_gets(&cache, (byte*) buf, sizeof(buf))) > 0) + { + char *pos= buf+nbytes-1; + /* Remove end space and control characters */ + while (pos > buf && !my_isgraph(system_charset_info, pos[-1])) + pos--; + *pos=0; + if ((pos= strchr(buf, '='))) { - char *le,*val; - for ( le=ln, val=0 ; letable_charset=get_charset_by_name(pos+1, MYF(0)))) { - case '=': - le[0]='\0'; - val=le+1; - le++; - break; - case '\r': - case '\n': - le[0]='\0'; - le++; - for( ; (le[0]=='\r' || le[0]=='\n') ; le++); - if (!strcmp(ln,"default-character-set") && val && val[0]) - { - create->table_charset=get_charset_by_name(val, MYF(0)); - } - goto cnt; - break; + sql_print_error(ER(ER_UNKNOWN_CHARACTER_SET), + pos+1); } } -cnt: - ln=le; } } + error=0; + end_io_cache(&cache); my_close(file,MYF(0)); } - return 0; + DBUG_RETURN(error); } -/* db-name is already validated when we come here */ -int mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create_info, bool silent) +/* + Create a database + + SYNOPSIS + mysql_create_db() + thd Thread handler + db Name of database to create + Function assumes that this is already validated. + create_info Database create options (like character set) + silent Used by replication when internally creating a database. + In this case the entry should not be logged. + + RETURN VALUES + 0 ok + -1 Error + +*/ + +int mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create_info, + bool silent) { char path[FN_REFLEN+16]; MY_DIR *dirp; long result=1; int error = 0; uint create_options = create_info ? create_info->options : 0; - DBUG_ENTER("mysql_create_db"); VOID(pthread_mutex_lock(&LOCK_mysql_create_db)); @@ -167,34 +193,49 @@ int mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create_info, bool silent } } - strcat(path,"/"); - unpack_dirname(path,path); + unpack_dirname(path, path); strcat(path,MY_DB_OPT_FILE); - if ((error=write_db_opt(thd,db,create_info,path))) - goto exit; + if (write_db_opt(path, create_info)) + { + /* + Could not create options file. + Restore things to beginning. + */ + if (rmdir(path) >= 0) + { + error= -1; + goto exit; + } + /* + We come here when we managed to create the database, but not the option + file. In this case it's best to just continue as if nothing has + happened. (This is a very unlikely senario) + */ + } if (!silent) { - if (!thd->query) + char *query; + uint query_length; + + if (!thd->query) // Only in replication { - thd->query = path; - thd->query_length = (uint) (strxmov(path,"create database ", db, NullS)- - path); + query= path; + query_length= (uint) (strxmov(path,"create database ", db, NullS) - + path); } + else { - mysql_update_log.write(thd,thd->query, thd->query_length); - if (mysql_bin_log.is_open()) - { - Query_log_event qinfo(thd, thd->query); - mysql_bin_log.write(&qinfo); - } + query= thd->query; + query_length= thd->query_length; } - if (thd->query == path) + mysql_update_log.write(thd, query, query_length); + if (mysql_bin_log.is_open()) { - thd->query = 0; // just in case - thd->query_length = 0; + Query_log_event qinfo(thd, query, query_length); + mysql_bin_log.write(&qinfo); } - send_ok(&thd->net, result); + send_ok(thd, result); } exit: @@ -207,15 +248,15 @@ exit2: /* db-name is already validated when we come here */ -int mysql_alter_db(THD *thd, char *db, HA_CREATE_INFO *create_info, bool silent) +int mysql_alter_db(THD *thd, const char *db, HA_CREATE_INFO *create_info) { - char path[FN_REFLEN+16]; + char path[FN_REFLEN+16]; MY_DIR *dirp; long result=1; int error = 0; - DBUG_ENTER("mysql_create_db"); register File file; uint create_options = create_info ? create_info->options : 0; + DBUG_ENTER("mysql_alter_db"); VOID(pthread_mutex_lock(&LOCK_mysql_create_db)); @@ -227,45 +268,27 @@ int mysql_alter_db(THD *thd, char *db, HA_CREATE_INFO *create_info, bool silent) } /* Check directory */ - (void)sprintf(path,"%s/%s", mysql_data_home, db); - strcat(path,"/"); - unpack_dirname(path,path); // Convert if not unix - strcat(path,MY_DB_OPT_FILE); - if ((error=write_db_opt(thd,db,create_info,path))) + (void)sprintf(path,"%s/%s/%s", mysql_data_home, db, MY_DB_OPT_FILE); + fn_format(path, path, "", "", MYF(MY_UNPACK_FILENAME)); + if ((error=write_db_opt(path, create_info))) goto exit; /* - Change options if current - database is being altered + Change options if current database is being altered + TODO: Delete this code */ if (thd->db && !strcmp(thd->db,db)) { thd->db_charset= create_info ? create_info->table_charset : NULL; } - if (!silent) + mysql_update_log.write(thd,thd->query, thd->query_length); + if (mysql_bin_log.is_open()) { - if (!thd->query) - { - thd->query = path; - thd->query_length = (uint) (strxmov(path,"alter database ", db, NullS)- - path); - } - { - mysql_update_log.write(thd,thd->query, thd->query_length); - if (mysql_bin_log.is_open()) - { - Query_log_event qinfo(thd, thd->query, thd->query_length); - mysql_bin_log.write(&qinfo); - } - } - if (thd->query == path) - { - thd->query = 0; // just in case - thd->query_length = 0; - } - send_ok(&thd->net, result); + Query_log_event qinfo(thd, thd->query, thd->query_length); + mysql_bin_log.write(&qinfo); } + send_ok(thd, result); exit: start_waiting_global_read_lock(thd); @@ -275,18 +298,6 @@ exit2: } - - - -const char *del_exts[]= {".frm", ".BAK", ".TMD",".opt", NullS}; -static TYPELIB deletable_extentions= -{array_elements(del_exts)-1,"del_exts", del_exts}; - -const char *known_exts[]= -{".ISM",".ISD",".ISM",".MRG",".MYI",".MYD",".db",NullS}; -static TYPELIB known_extentions= -{array_elements(known_exts)-1,"known_exts", known_exts}; - /* Drop all tables in a database. @@ -324,7 +335,7 @@ int mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent) my_error(ER_DB_DROP_EXISTS,MYF(0),db); } else if (!silent) - send_ok(&thd->net,0); + send_ok(thd,0); goto exit; } pthread_mutex_lock(&LOCK_open); @@ -355,7 +366,7 @@ int mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent) thd->query = 0; // just in case thd->query_length = 0; } - send_ok(&thd->net,(ulong) deleted); + send_ok(thd,(ulong) deleted); } error = 0; } @@ -503,30 +514,47 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db, } -bool mysql_change_db(THD *thd,const char *name) +/* + Change default database. + + SYNOPSIS + mysql_change_db() + thd Thread handler + name Databasename + + DESCRIPTION + Becasue the database name may have been given directly from the + communication packet (in case of 'connect' or 'COM_INIT_DB') + we have to do end space removal in this function. + + RETURN VALUES + 0 ok + 1 error +*/ + +bool mysql_change_db(THD *thd, const char *name) { int length, db_length; char *dbname=my_strdup((char*) name,MYF(MY_WME)); char path[FN_REFLEN]; uint db_access; HA_CREATE_INFO create; - DBUG_ENTER("mysql_change_db"); if (!dbname || !(db_length=strip_sp(dbname))) { x_free(dbname); /* purecov: inspected */ - send_error(&thd->net,ER_NO_DB_ERROR); /* purecov: inspected */ + send_error(thd,ER_NO_DB_ERROR); /* purecov: inspected */ DBUG_RETURN(1); /* purecov: inspected */ } if ((db_length > NAME_LEN) || check_db_name(dbname)) { - net_printf(&thd->net,ER_WRONG_DB_NAME, dbname); + net_printf(thd,ER_WRONG_DB_NAME, dbname); x_free(dbname); DBUG_RETURN(1); } if (lower_case_table_names) - casedn_str(dbname); + my_casedn_str(system_charset_info, dbname); DBUG_PRINT("info",("Use database: %s", dbname)); if (test_all_bits(thd->master_access,DB_ACLS)) db_access=DB_ACLS; @@ -536,7 +564,7 @@ bool mysql_change_db(THD *thd,const char *name) thd->master_access); if (!(db_access & DB_ACLS) && (!grant_option || check_grant_db(thd,dbname))) { - net_printf(&thd->net,ER_DBACCESS_DENIED_ERROR, + net_printf(thd,ER_DBACCESS_DENIED_ERROR, thd->priv_user, thd->host_or_ip, dbname); @@ -554,49 +582,37 @@ bool mysql_change_db(THD *thd,const char *name) path[length-1]=0; // remove ending '\' if (access(path,F_OK)) { - net_printf(&thd->net,ER_BAD_DB_ERROR,dbname); + net_printf(thd,ER_BAD_DB_ERROR,dbname); my_free(dbname,MYF(0)); DBUG_RETURN(1); } - send_ok(&thd->net); + send_ok(thd); x_free(thd->db); - thd->db=dbname; + thd->db=dbname; // THD::~THD will free this thd->db_length=db_length; thd->db_access=db_access; - strcat(path,"/"); - unpack_dirname(path,path); - strcat(path,MY_DB_OPT_FILE); - bzero(&create,sizeof(create)); - load_db_opt(thd,name,&create,path); + strmov(path+unpack_dirname(path,path), MY_DB_OPT_FILE); + load_db_opt(path, &create); thd->db_charset=create.table_charset; DBUG_RETURN(0); } -int mysqld_show_create_db(THD *thd,const char *name) +int mysqld_show_create_db(THD *thd, const char *dbname) { int length, db_length; - char *dbname=my_strdup((char*) name,MYF(MY_WME)); - char path[FN_REFLEN]; + char path[FN_REFLEN], *to; uint db_access; + bool found_libchar; HA_CREATE_INFO create; - CONVERT *convert=thd->convert_set; - + CONVERT *convert=thd->variables.convert_set; DBUG_ENTER("mysql_show_create_db"); - if (!dbname || !(db_length=strip_sp(dbname))) + if (check_db_name(dbname)) { - x_free(dbname); /* purecov: inspected */ - send_error(&thd->net,ER_NO_DB_ERROR); /* purecov: inspected */ - DBUG_RETURN(1); /* purecov: inspected */ - } - - if ((db_length > NAME_LEN) || check_db_name(dbname)) - { - net_printf(&thd->net,ER_WRONG_DB_NAME, dbname); - x_free(dbname); + net_printf(thd,ER_WRONG_DB_NAME, dbname); DBUG_RETURN(1); } @@ -608,7 +624,7 @@ int mysqld_show_create_db(THD *thd,const char *name) thd->master_access); if (!(db_access & DB_ACLS) && (!grant_option || check_grant_db(thd,dbname))) { - net_printf(&thd->net,ER_DBACCESS_DENIED_ERROR, + net_printf(thd,ER_DBACCESS_DENIED_ERROR, thd->priv_user, thd->host_or_ip, dbname); @@ -616,26 +632,26 @@ int mysqld_show_create_db(THD *thd,const char *name) thd->priv_user, thd->host_or_ip, dbname); - my_free(dbname,MYF(0)); DBUG_RETURN(1); } - (void) sprintf(path,"%s/%s",mysql_data_home,dbname); + (void) sprintf(path,"%s/%s",mysql_data_home, dbname); length=unpack_dirname(path,path); // Convert if not unix + found_libchar= 0; if (length && path[length-1] == FN_LIBCHAR) + { + found_libchar= 1; path[length-1]=0; // remove ending '\' + } if (access(path,F_OK)) { - net_printf(&thd->net,ER_BAD_DB_ERROR,dbname); - my_free(dbname,MYF(0)); + net_printf(thd,ER_BAD_DB_ERROR,dbname); DBUG_RETURN(1); } - - strcat(path,"/"); - unpack_dirname(path,path); - strcat(path,MY_DB_OPT_FILE); - bzero(&create,sizeof(create)); - load_db_opt(thd,name,&create,path); + if (found_libchar) + path[length-1]= FN_LIBCHAR; + strmov(path+length, MY_DB_OPT_FILE); + load_db_opt(path, &create); List field_list; field_list.push_back(new Item_empty_string("Database",NAME_LEN)); @@ -646,19 +662,16 @@ int mysqld_show_create_db(THD *thd,const char *name) String *packet = &thd->packet; packet->length(0); - net_store_data(packet, convert, name); - sprintf(path, "CREATE DATABASE %s", name); + net_store_data(packet, convert, dbname); + to= strxmov(path, "CREATE DATABASE `", dbname, "`", NullS); if (create.table_charset) - { - strcat(path," DEFAULT CHARACTER SET "); - strcat(path,create.table_charset->name); - } - net_store_data(packet, convert, path); - - if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length())) + to= strxmov(to," DEFAULT CHARACTER SET ", create.table_charset->name, + NullS); + net_store_data(packet, convert, path, (uint) (to-path)); + + if (my_net_write(&thd->net,(char*) packet->ptr(), packet->length())) DBUG_RETURN(1); - send_eof(&thd->net); - + send_eof(thd); DBUG_RETURN(0); } diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index fc98cfb90c5..0581e0b5a3b 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -43,7 +43,7 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order, table_list->db=thd->db; if ((thd->options & OPTION_SAFE_UPDATES) && !conds) { - send_error(&thd->net,ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE); + send_error(thd,ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE); DBUG_RETURN(1); } @@ -83,7 +83,7 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order, !limit) { delete select; - send_ok(&thd->net,0L); + send_ok(thd,0L); DBUG_RETURN(0); // Nothing to delete } @@ -94,7 +94,7 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order, if ((thd->options & OPTION_SAFE_UPDATES) && limit == HA_POS_ERROR) { delete select; - send_error(&thd->net,ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE); + send_error(thd,ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE); DBUG_RETURN(1); } } @@ -188,10 +188,10 @@ cleanup: } delete select; if (error >= 0) // Fatal error - send_error(&thd->net,thd->killed ? ER_SERVER_SHUTDOWN: 0); + send_error(thd,thd->killed ? ER_SERVER_SHUTDOWN: 0); else { - send_ok(&thd->net,deleted); + send_ok(thd,deleted); DBUG_PRINT("info",("%d records deleted",deleted)); } DBUG_RETURN(0); @@ -354,7 +354,7 @@ void multi_delete::send_error(uint errcode,const char *err) DBUG_ENTER("multi_delete::send_error"); /* First send error what ever it is ... */ - ::send_error(&thd->net,errcode,err); + ::send_error(thd,errcode,err); /* If nothing deleted return */ if (!deleted) @@ -456,7 +456,7 @@ bool multi_delete::send_eof() thd->proc_info="end"; if (error) { - ::send_error(&thd->net); + ::send_error(thd); return 1; } @@ -483,7 +483,7 @@ bool multi_delete::send_eof() { query_cache_invalidate3(thd, delete_tables, 1); } - ::send_ok(&thd->net,deleted); + ::send_ok(thd,deleted); return 0; } @@ -580,7 +580,7 @@ end: Query_log_event qinfo(thd, thd->query, thd->query_length); mysql_bin_log.write(&qinfo); } - send_ok(&thd->net); // This should return record count + send_ok(thd); // This should return record count } VOID(pthread_mutex_lock(&LOCK_open)); unlock_table_name(thd, table_list); diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index fb40a85fd91..6b144d36f53 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -120,7 +120,7 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t) exit: close_thread_tables(thd); if (res > 0) - send_error(&thd->net, ER_UNKNOWN_COM_ERROR); // temporary only ... + send_error(thd, ER_UNKNOWN_COM_ERROR); // temporary only ... } DBUG_RETURN(res); } diff --git a/sql/sql_do.cc b/sql/sql_do.cc index 70124c2d796..2eef088da5b 100644 --- a/sql/sql_do.cc +++ b/sql/sql_do.cc @@ -29,6 +29,6 @@ int mysql_do(THD *thd, List &values) DBUG_RETURN(-1); while ((value = li++)) value->val_int(); - send_ok(&thd->net); + send_ok(thd); DBUG_RETURN(0); } diff --git a/sql/sql_error.cc b/sql/sql_error.cc index 13466f454c5..3d6a0fa24aa 100644 --- a/sql/sql_error.cc +++ b/sql/sql_error.cc @@ -18,202 +18,136 @@ /********************************************************************** This file contains the implementation of error and warnings related - - Whenever an error or warning occured, it pushes the same to - the respective list along with sending it to client. + - Whenever an error or warning occurred, it pushes it to a warning list + that the user can retrieve with SHOW WARNINGS or SHOW ERRORS. + + - For each statement, we return the number of warnings generated from this + command. Note that this can be different from @@warning_count as + we reset the warning list only for questions that uses a table. + This is done to allow on to do: + INSERT ...; + SELECT @@warning_count; + SHOW WARNINGS; + (If we would reset after each command, we could not retrieve the number + of warnings) - When client requests the information using SHOW command, then server processes from this list and returns back in the form of resultset. - syntax : SHOW [COUNT(*)] ERRORS [LIMIT [offset,] rows] - SHOW [COUNT(*)] WARNINGS [LIMIT [offset,] rows] + Supported syntaxes: + + SHOW [COUNT(*)] ERRORS [LIMIT [offset,] rows] + SHOW [COUNT(*)] WARNINGS [LIMIT [offset,] rows] + SELECT @@warning_count, @@error_count; ***********************************************************************/ -/* Handles errors and warnings .. */ #include "mysql_priv.h" -/* - Push the error to error list -*/ +/* + Reset all warnings for the thread -void push_error(uint code, const char *msg) -{ - THD *thd=current_thd; + SYNOPSIS + mysql_reset_errors() + thd Thread handle +*/ - mysql_st_error *err = new mysql_st_error(code,msg,(const char*)thd->query); - - if (thd->err_list.elements >= thd->max_error_count) - { - /* Remove the old elements and always maintain the max size - equal to sql_error_count. - - If one max_error_count using sets sql_error_count less than - the current list size, then make sure it always grows upto - sql_error_count size only - - ** BUG ** : Doesn't work in removing the old one - from the list, and thus SET SQL_ERROR_COUNT=x doesn't work - */ - for (uint count=thd->err_list.elements-1; - count <= thd->max_error_count-1; count++) - { - thd->err_list.remove_last(); - } - } - thd->err_list.push_front(err); +void mysql_reset_errors(THD *thd) +{ + free_root(&thd->warn_root,MYF(0)); + bzero((char*) thd->warn_count, sizeof(thd->warn_count)); + thd->warn_list.empty(); } + /* - Push the warning to warning list + Push the warning/error to error list if there is still room in the list + + SYNOPSIS + push_warning() + thd Thread handle + level Severity of warning (note, warning, error ...) + code Error number + msg Clear error message */ -void push_warning(uint code, const char *msg) -{ - THD *thd=current_thd; - - mysql_st_error *warn = new mysql_st_error(code,msg,(const char *)thd->query); - - if (thd->warn_list.elements >= thd->max_warning_count) +void push_warning(THD *thd, MYSQL_ERROR::enum_warning_level level, uint code, + const char *msg) +{ + if (thd->warn_list.elements < thd->variables.max_error_count) { - /* Remove the old elements and always maintian the max size - equal to sql_error_count + /* + The following code is here to change the allocation to not + use the thd->mem_root, which is freed after each query */ - for (uint count=thd->warn_list.elements; - count <= thd->max_warning_count-1; count++) - { - thd->warn_list.remove_last(); - } - } - thd->warn_list.push_front(warn); -} - -/* - List all errors -*/ - -int mysqld_show_errors(THD *thd) -{ - List field_list; - DBUG_ENTER("mysqld_show_errors"); - - field_list.push_back(new Item_int("CODE",0,4)); - field_list.push_back(new Item_empty_string("MESSAGE",MYSQL_ERRMSG_SIZE)); - field_list.push_back(new Item_empty_string("QUERY",NAME_LEN)); - - if (send_fields(thd,field_list,1)) - DBUG_RETURN(1); - - mysql_st_error *err; - SELECT_LEX *sel=&thd->lex.select_lex; - ha_rows offset = sel->offset_limit,limit = sel->select_limit; - uint num_rows = 0; - - Error_iterator it(thd->err_list); - - while(offset-- && (err = it++));/* Should be fixed with overloaded - operator '+' or with new funtion - goto() in list ? - */ - - while((num_rows++ < limit) && (err = it++)) - { - thd->packet.length(0); - net_store_data(&thd->packet,(uint32)err->code); - net_store_data(&thd->packet,err->msg); - net_store_data(&thd->packet,err->query); - - if (my_net_write(&thd->net,(char*)thd->packet.ptr(),thd->packet.length())) - DBUG_RETURN(-1); + MEM_ROOT *old_root=my_pthread_getspecific_ptr(MEM_ROOT*,THR_MALLOC); + my_pthread_setspecific_ptr(THR_MALLOC, &thd->warn_root); + MYSQL_ERROR *err= new MYSQL_ERROR(code, level, msg); + if (err) + thd->warn_list.push_back(err); + my_pthread_setspecific_ptr(THR_MALLOC, old_root); } - send_eof(&thd->net); - DBUG_RETURN(0); + thd->warn_count[(uint) level]++; + thd->total_warn_count++; } -/* - Return errors count -*/ -int mysqld_show_errors_count(THD *thd) -{ - List field_list; - DBUG_ENTER("mysqld_show_errors_count"); +/* + Send all notes, errors or warnings to the client in a result set - field_list.push_back(new Item_int("COUNT(*)",0,4)); + SYNOPSIS + mysqld_show_warnings() + thd Thread handler + levels_to_show Bitmap for which levels to show - if (send_fields(thd,field_list,1)) - DBUG_RETURN(1); + DESCRIPTION + Takes into account the current LIMIT - thd->packet.length(0); - net_store_data(&thd->packet,(uint32)thd->err_list.elements); + RETURN VALUES + 0 ok + 1 Error sending data to client +*/ - if (my_net_write(&thd->net,(char*) thd->packet.ptr(),thd->packet.length())) - DBUG_RETURN(-1); +static const char *warning_level_names[]= {"Note", "Warning", "Error", "?"}; - send_eof(&thd->net); - DBUG_RETURN(0); -} -/* - List all warnings -*/ - -int mysqld_show_warnings(THD *thd) -{ +my_bool mysqld_show_warnings(THD *thd, ulong levels_to_show) +{ List field_list; - DBUG_ENTER("mysqld_show_warnings"); + DBUG_ENTER("mysqld_show_errors"); - field_list.push_back(new Item_int("CODE",0,21)); - field_list.push_back(new Item_empty_string("MESSAGE",MYSQL_ERRMSG_SIZE)); - field_list.push_back(new Item_empty_string("QUERY",NAME_LEN)); + field_list.push_back(new Item_empty_string("Level", 7)); + field_list.push_back(new Item_int("Code",0,4)); + field_list.push_back(new Item_empty_string("Message",MYSQL_ERRMSG_SIZE)); if (send_fields(thd,field_list,1)) DBUG_RETURN(1); - mysql_st_error *warn; - + MYSQL_ERROR *err; + SELECT_LEX *sel= &thd->lex.select_lex; + ha_rows offset= sel->offset_limit, limit= sel->select_limit; - SELECT_LEX *sel=&thd->lex.select_lex; - ha_rows offset = sel->offset_limit,limit = sel->select_limit; - uint num_rows = 0; - - Error_iterator it(thd->warn_list); - while(offset-- && (warn = it++)); - while((num_rows++ < limit) && (warn = it++)) + List_iterator_fast it(thd->warn_list); + while ((err= it++)) { + /* Skip levels that the user is not interested in */ + if (!(levels_to_show & ((ulong) 1 << err->level))) + continue; + if (offset) + { + offset--; + continue; + } thd->packet.length(0); - net_store_data(&thd->packet,(uint32)warn->code); - net_store_data(&thd->packet,warn->msg); - net_store_data(&thd->packet,warn->query); - - if (my_net_write(&thd->net,(char*) thd->packet.ptr(),thd->packet.length())) - DBUG_RETURN(-1); + net_store_data(&thd->packet,warning_level_names[err->level]); + net_store_data(&thd->packet,(uint32) err->code); + net_store_data(&thd->packet,err->msg); + if (my_net_write(&thd->net,(char*)thd->packet.ptr(),thd->packet.length())) + DBUG_RETURN(1); + if (!--limit) + break; } - send_eof(&thd->net); - DBUG_RETURN(0); -} - -/* - Return warnings count -*/ - -int mysqld_show_warnings_count(THD *thd) -{ - List field_list; - DBUG_ENTER("mysqld_show_warnings_count"); - - field_list.push_back(new Item_int("COUNT(*)",0,21)); - - if (send_fields(thd,field_list,1)) - DBUG_RETURN(1); - - thd->packet.length(0); - net_store_data(&thd->packet,(uint32)thd->warn_list.elements); - - if (my_net_write(&thd->net,(char*)thd->packet.ptr(),thd->packet.length())) - DBUG_RETURN(-1); - - send_eof(&thd->net); + send_eof(thd); DBUG_RETURN(0); } - diff --git a/sql/sql_handler.cc b/sql/sql_handler.cc index 7fa24faf6c4..4191973b325 100644 --- a/sql/sql_handler.cc +++ b/sql/sql_handler.cc @@ -62,7 +62,7 @@ int mysql_ha_open(THD *thd, TABLE_LIST *tables) return -1; } - send_ok(&thd->net); + send_ok(thd); return 0; } @@ -83,7 +83,7 @@ int mysql_ha_close(THD *thd, TABLE_LIST *tables, bool dont_send_ok) return -1; } if (!dont_send_ok) - send_ok(&thd->net); + send_ok(thd); return 0; } @@ -185,7 +185,7 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, } if (!(key= (byte*) sql_calloc(ALIGN_SIZE(key_len)))) { - send_error(&thd->net,ER_OUTOFMEMORY); + send_error(thd,ER_OUTOFMEMORY); goto err; } key_copy(key, table, keyno, key_len); @@ -195,7 +195,7 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, break; } default: - send_error(&thd->net,ER_ILLEGAL_HA); + send_error(thd,ER_ILLEGAL_HA); goto err; } @@ -240,7 +240,7 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, } ok: mysql_unlock_tables(thd,lock); - send_eof(&thd->net); + send_eof(thd); return 0; err: mysql_unlock_tables(thd,lock); diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index b02fd99e358..2852ac8b45d 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -333,7 +333,7 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, List &fields, if (values_list.elements == 1 && (!(thd->options & OPTION_WARNINGS) || !thd->cuted_fields)) - send_ok(&thd->net,info.copied+info.deleted,id); + send_ok(thd,info.copied+info.deleted,id); else { char buff[160]; @@ -345,7 +345,7 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, List &fields, else sprintf(buff,ER(ER_INSERT_INFO),info.records,info.deleted, thd->cuted_fields); - ::send_ok(&thd->net,info.copied+info.deleted,(ulonglong)id,buff); + ::send_ok(thd,info.copied+info.deleted,(ulonglong)id,buff); } DBUG_RETURN(0); @@ -667,7 +667,7 @@ static TABLE *delayed_get_table(THD *thd,TABLE_LIST *table_list) delete tmp; thd->fatal_error=1; pthread_mutex_unlock(&LOCK_delayed_create); - net_printf(&thd->net,ER_CANT_CREATE_THREAD,error); + net_printf(thd,ER_CANT_CREATE_THREAD,error); DBUG_RETURN(0); } @@ -1334,7 +1334,7 @@ bool select_insert::send_data(List &values) void select_insert::send_error(uint errcode,const char *err) { - ::send_error(&thd->net,errcode,err); + ::send_error(thd,errcode,err); table->file->extra(HA_EXTRA_NO_CACHE); table->file->activate_all_index(thd); ha_rollback_stmt(thd); @@ -1360,7 +1360,7 @@ bool select_insert::send_eof() if (error) { table->file->print_error(error,MYF(0)); - ::send_error(&thd->net); + ::send_error(thd); return 1; } else @@ -1374,7 +1374,7 @@ bool select_insert::send_eof() thd->cuted_fields); if (last_insert_id) thd->insert_id(last_insert_id); // For update log - ::send_ok(&thd->net,info.copied,last_insert_id,buff); + ::send_ok(thd,info.copied,last_insert_id,buff); mysql_update_log.write(thd,thd->query,thd->query_length); if (mysql_bin_log.is_open()) { diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index dc9019de2c8..1af8d363fda 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -1064,7 +1064,7 @@ bool st_select_lex_unit::create_total_list_n_last_return(THD *thd, st_lex *lex, // check usage of ORDER BY in union if (sl->order_list.first && sl->next_select() && !sl->braces) { - net_printf(&thd->net,ER_WRONG_USAGE,"UNION","ORDER BY"); + net_printf(thd,ER_WRONG_USAGE,"UNION","ORDER BY"); return 1; } for (SELECT_LEX_UNIT *inner= sl->first_inner_unit(); @@ -1092,7 +1092,7 @@ bool st_select_lex_unit::create_total_list_n_last_return(THD *thd, st_lex *lex, if (!(cursor= (TABLE_LIST *) thd->memdup((char*) aux, sizeof(*aux)))) { - send_error(&thd->net,0); + send_error(thd,0); return 1; } *new_table_list= cursor; diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 6aef99886e9..dba8216e94c 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -238,7 +238,8 @@ typedef class st_select_lex_unit SELECT_LEX_UNIT; SELECT_LEX - store information of parsed SELECT_LEX statment */ class JOIN; -class st_select_lex: public st_select_lex_node { +class st_select_lex: public st_select_lex_node +{ public: char *db, *db1, *table1, *db2, *table2; /* For outer join using .. */ Item *where, *having; /* WHERE & HAVING clauses */ @@ -342,6 +343,7 @@ typedef struct st_lex enum enum_var_type option_type; uint grant, grant_tot_col, which_columns, union_option; uint fk_delete_opt, fk_update_opt, fk_match_option; + uint param_count; bool drop_primary, drop_if_exists, local_file, olap; bool in_comment, ignore_space, verbose, simple_alter; bool derived_tables; diff --git a/sql/sql_list.h b/sql/sql_list.h index ef8a0c41a1b..56e6528f214 100644 --- a/sql/sql_list.h +++ b/sql/sql_list.h @@ -362,120 +362,3 @@ public: I_List_iterator(I_List &a) : base_ilist_iterator(a) {} inline T* operator++(int) { return (T*) base_ilist_iterator::next(); } }; - -/* - New error list without mem_root from THD, to have the life of the - allocation becomes connection level . by ovveriding new from Sql_alloc. -*/ -class Error_alloc -{ -public: - static void *operator new(size_t size) - { - return (void*)my_malloc((uint)size, MYF(MY_WME | MY_FAE)); - } -#if 0 - static void operator delete(void* ptr_arg, size_t size) - { - my_free((gptr)ptr_arg, MYF(MY_WME|MY_ALLOW_ZERO_PTR)); - } -#endif - friend class error_node; - friend class error_list; -}; - -class error_node :public Error_alloc, public list_node -{ -public: - static void *operator new(size_t size) - { - return (void*)my_malloc((uint)size, MYF(MY_WME | MY_FAE)); - } -#if 0 - static void operator delete(void* ptr_arg, size_t size) - { - my_free((gptr)ptr_arg, MYF(MY_WME|MY_ALLOW_ZERO_PTR)); - } -#endif - error_node(void *info_par,list_node *next_par):list_node(info_par,next_par){}; - error_node() : list_node() {}; - friend class error_list; - friend class error_list_iterator; -}; - -class error_list: public Error_alloc, public base_list -{ -public: - inline error_list() : base_list() { }; - inline error_list(const error_list &tmp) : base_list(tmp) - { - elements=tmp.elements; - first=tmp.first; - last=tmp.last; - } - inline bool push_front(void *info) - { - error_node *node=new error_node(info,first); - if (node) - { - if (last == &first) - last= &node->next; - first=node; - elements++; - return 0; - } - return 1; - } - inline void remove_last(void) - { - remove(last); - } -protected: - void after(void *info,list_node *node) - { - error_node *new_node=new error_node(info,node->next); - node->next=new_node; - elements++; - if (last == &(node->next)) - last= &new_node->next; - } -}; - -class error_list_iterator : public base_list_iterator -{ - inline error_list_iterator(base_list &base_ptr): base_list_iterator(base_ptr) {}; -}; - -template class Error :public error_list -{ -public: - inline Error() :error_list() {} - inline Error(const Error &tmp) :error_list(tmp) {} - inline bool push_back(T *a) { return error_list::push_back(a); } - inline bool push_front(T *a) { return error_list::push_front(a); } - inline T* head() {return (T*) error_list::head(); } - inline T** head_ref() {return (T**) error_list::head_ref(); } - inline T* pop() {return (T*) error_list::pop(); } - void delete_elements(void) - { - error_node *element,*next; - for (element=first; element != &error_end_of_list; element=next) - { - next=element->next; - delete (T*) element->info; - } - empty(); - } -}; - -template class Error_iterator :public base_list_iterator -{ -public: - Error_iterator(Error &a) : base_list_iterator(a) {} - inline T* operator++(int) { return (T*) base_list_iterator::next(); } - inline T *replace(T *a) { return (T*) base_list_iterator::replace(a); } - inline T *replace(Error &a) { return (T*) base_list_iterator::replace(a); } - inline void after(T *a) { base_list_iterator::after(a); } - inline T** ref(void) { return (T**) base_list_iterator::ref(); } -}; - diff --git a/sql/sql_load.cc b/sql/sql_load.cc index ad25ef85e75..fe556be98f5 100644 --- a/sql/sql_load.cc +++ b/sql/sql_load.cc @@ -293,7 +293,7 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list, } sprintf(name,ER(ER_LOAD_INFO),info.records,info.deleted, info.records-info.copied,thd->cuted_fields); - send_ok(&thd->net,info.copied+info.deleted,0L,name); + send_ok(thd,info.copied+info.deleted,0L,name); // on the slave thd->query is never initialized if (!thd->slave_thread) mysql_update_log.write(thd,thd->query,thd->query_length); diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index b889b9ee29f..461276900a5 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -57,7 +57,7 @@ extern "C" pthread_mutex_t THR_LOCK_keycache; extern "C" int gethostname(char *name, int namelen); #endif -static int check_for_max_user_connections(USER_CONN *uc); +static int check_for_max_user_connections(THD *thd, USER_CONN *uc); static void decrease_user_connections(USER_CONN *uc); static bool check_db_used(THD *thd,TABLE_LIST *tables); static bool check_merge_table_access(THD *thd, char *db, TABLE_LIST *tables); @@ -77,7 +77,7 @@ const char *command_name[]={ "Prepare", "Prepare Execute", "Long Data" }; -bool volatile abort_slave = 0; +static char empty_c_string[1]= {0}; // Used for not defined 'db' #ifdef HAVE_OPENSSL extern struct st_VioSSLAcceptorFd * ssl_acceptor_fd; @@ -144,7 +144,7 @@ static int get_or_create_user_conn(THD *thd, const char *user, my_malloc(sizeof(struct user_conn) + temp_len+1, MYF(MY_WME))))) { - send_error(¤t_thd->net, 0, NullS); // Out of memory + send_error(thd, 0, NullS); // Out of memory return_val=1; goto end; } @@ -162,7 +162,7 @@ static int get_or_create_user_conn(THD *thd, const char *user, if (hash_insert(&hash_user_connections, (byte*) uc)) { my_free((char*) uc,0); - send_error(¤t_thd->net, 0, NullS); // Out of memory + send_error(thd, 0, NullS); // Out of memory return_val=1; goto end; } @@ -184,14 +184,13 @@ end: static bool check_user(THD *thd,enum_server_command command, const char *user, const char *passwd, const char *db, bool check_count) { - NET *net= &thd->net; thd->db=0; thd->db_length=0; USER_RESOURCES ur; if (!(thd->user = my_strdup(user, MYF(0)))) { - send_error(net,ER_OUT_OF_RESOURCES); + send_error(thd,ER_OUT_OF_RESOURCES); return 1; } thd->master_access=acl_getroot(thd, thd->host, thd->ip, thd->user, @@ -207,7 +206,7 @@ static bool check_user(THD *thd,enum_server_command command, const char *user, thd->master_access, thd->db ? thd->db : "*none*")); if (thd->master_access & NO_ACCESS) { - net_printf(net, ER_ACCESS_DENIED_ERROR, + net_printf(thd, ER_ACCESS_DENIED_ERROR, thd->user, thd->host_or_ip, passwd[0] ? ER(ER_YES) : ER(ER_NO)); @@ -225,7 +224,7 @@ static bool check_user(THD *thd,enum_server_command command, const char *user, VOID(pthread_mutex_unlock(&LOCK_thread_count)); if (tmp) { // Too many connections - send_error(net, ER_CON_COUNT_ERROR); + send_error(thd, ER_CON_COUNT_ERROR); return(1); } } @@ -242,7 +241,7 @@ static bool check_user(THD *thd,enum_server_command command, const char *user, get_or_create_user_conn(thd,user,thd->host_or_ip,&ur)) return -1; if (thd->user_connect && thd->user_connect->user_resources.connections && - check_for_max_user_connections(thd->user_connect)) + check_for_max_user_connections(thd, thd->user_connect)) return -1; if (db && db[0]) { @@ -252,7 +251,7 @@ static bool check_user(THD *thd,enum_server_command command, const char *user, return error; } else - send_ok(net); // Ready to handle questions + send_ok(thd); // Ready to handle questions return 0; // ok } @@ -283,7 +282,7 @@ void init_max_user_conn(void) } -static int check_for_max_user_connections(USER_CONN *uc) +static int check_for_max_user_connections(THD *thd, USER_CONN *uc) { int error=0; DBUG_ENTER("check_for_max_user_connections"); @@ -291,7 +290,7 @@ static int check_for_max_user_connections(USER_CONN *uc) if (max_user_connections && (max_user_connections <= (uint) uc->connections)) { - net_printf(&(current_thd->net),ER_TOO_MANY_USER_CONNECTIONS, uc->user); + net_printf(thd,ER_TOO_MANY_USER_CONNECTIONS, uc->user); error=1; goto end; } @@ -299,11 +298,10 @@ static int check_for_max_user_connections(USER_CONN *uc) if (uc->user_resources.connections && uc->conn_per_hour++ >= uc->user_resources.connections) { - net_printf(¤t_thd->net, ER_USER_LIMIT_REACHED, uc->user, + net_printf(thd, ER_USER_LIMIT_REACHED, uc->user, "max_connections", (long) uc->user_resources.connections); error=1; - goto end; } end: DBUG_RETURN(error); @@ -363,7 +361,7 @@ static bool check_mqh(THD *thd, uint check_command) if (uc->user_resources.questions && uc->questions++ >= uc->user_resources.questions) { - net_printf(&thd->net, ER_USER_LIMIT_REACHED, uc->user, "max_questions", + net_printf(thd, ER_USER_LIMIT_REACHED, uc->user, "max_questions", (long) uc->user_resources.questions); error=1; goto end; @@ -374,7 +372,7 @@ static bool check_mqh(THD *thd, uint check_command) if (uc->user_resources.updates && uc_update_queries[check_command] && uc->updates++ >= uc->user_resources.updates) { - net_printf(&thd->net, ER_USER_LIMIT_REACHED, uc->user, "max_updates", + net_printf(thd, ER_USER_LIMIT_REACHED, uc->user, "max_updates", (long) uc->user_resources.updates); error=1; goto end; @@ -501,7 +499,7 @@ check_connections(THD *thd) int2store(end+3,thd->server_status); bzero(end+5,13); end+=18; - if (net_write_command(net,(uchar) protocol_version, buff, + if (net_write_command(net,(uchar) protocol_version, "", 0, buff, (uint) (end-buff)) || (pkt_len= my_net_read(net)) == packet_error || pkt_len < MIN_HANDSHAKE_SIZE) @@ -629,7 +627,7 @@ pthread_handler_decl(handle_one_connection,arg) if ((error=check_connections(thd))) { // Wrong permissions if (error > 0) - net_printf(net,error,thd->host_or_ip); + net_printf(thd,error,thd->host_or_ip); #ifdef __NT__ if (vio_type(net->vio) == VIO_TYPE_NAMEDPIPE) sleep(1); /* must wait after eof() */ @@ -667,7 +665,7 @@ pthread_handler_decl(handle_one_connection,arg) thd->host_or_ip, (net->last_errno ? ER(net->last_errno) : ER(ER_UNKNOWN_ERROR))); - send_error(net,net->last_errno,NullS); + send_error(thd,net->last_errno,NullS); thread_safe_increment(aborted_threads,&LOCK_status); } @@ -765,11 +763,11 @@ end: DBUG_RETURN(0); // Never reached } + /* This works because items are allocated with sql_alloc() */ -inline void free_items(THD *thd) +void free_items(Item *item) { - /* This works because items are allocated with sql_alloc() */ - for (Item *item=thd->free_list ; item ; item=item->next) + for (; item ; item=item->next) delete item; } @@ -793,7 +791,7 @@ int mysql_table_dump(THD* thd, char* db, char* tbl_name, int fd) if (!db || check_db_name(db)) { - net_printf(&thd->net,ER_WRONG_DB_NAME, db ? db : "NULL"); + net_printf(thd,ER_WRONG_DB_NAME, db ? db : "NULL"); goto err; } if (check_access(thd, SELECT_ACL, db, &table_list->grant.privilege)) @@ -891,7 +889,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, case COM_REGISTER_SLAVE: { if (!register_slave(thd, (uchar*)packet, packet_length)) - send_ok(&thd->net); + send_ok(thd); break; } case COM_TABLE_DUMP: @@ -907,7 +905,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, memcpy(tbl_name, packet + db_len + 2, tbl_len); tbl_name[tbl_len] = 0; if (mysql_table_dump(thd, db, tbl_name, -1)) - send_error(&thd->net); // dump to NET + send_error(thd); // dump to NET break; } @@ -929,7 +927,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, if ((uint) ((uchar*) db - net->read_pos) > packet_length) { // Check if protocol is ok - send_error(net, ER_UNKNOWN_COM_ERROR); + send_error(thd, ER_UNKNOWN_COM_ERROR); break; } if (check_user(thd, COM_CHANGE_USER, user, passwd, db, 0)) @@ -953,48 +951,26 @@ bool dispatch_command(enum enum_server_command command, THD *thd, } case COM_EXECUTE: { - mysql_com_execute(thd); + mysql_stmt_execute(thd, packet); break; } case COM_LONG_DATA: { - mysql_com_longdata(thd); + mysql_stmt_get_longdata(thd, packet, packet_length); break; } case COM_PREPARE: { - mysql_com_prepare(thd,packet,packet_length); + mysql_stmt_prepare(thd, packet, packet_length); break; } case COM_QUERY: { - packet_length--; // Remove end null - /* Remove garage at start and end of query */ - while (my_isspace(system_charset_info,packet[0]) && packet_length > 0) - { - packet++; - packet_length--; - } - char *pos=packet+packet_length; // Point at end null - while (packet_length > 0 && - (pos[-1] == ';' || my_isspace(system_charset_info,pos[-1]))) - { - pos--; - packet_length--; - } - /* We must allocate some extra memory for query cache */ - if (!(thd->query= (char*) thd->memdup_w_gap((gptr) (packet), - packet_length, - thd->db_length+2))) - break; - thd->query[packet_length]=0; - thd->packet.shrink(thd->variables.net_buffer_length);// Reclaim some memory - if (!(specialflag & SPECIAL_NO_PRIOR)) - my_pthread_setprio(pthread_self(),QUERY_PRIOR); + if (alloc_query(thd, packet, packet_length)) + break; // fatal error is set mysql_log.write(thd,command,"%s",thd->query); DBUG_PRINT("query",("%s",thd->query)); - /* thd->query_length is set by mysql_parse() */ - mysql_parse(thd,thd->query,packet_length); + mysql_parse(thd,thd->query, thd->query_length); if (!(specialflag & SPECIAL_NO_PRIOR)) my_pthread_setprio(pthread_self(),WAIT_PRIOR); DBUG_PRINT("info",("query ready")); @@ -1002,7 +978,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, } case COM_FIELD_LIST: // This isn't actually needed #ifdef DONT_ALLOW_SHOW_COMMANDS - send_error(&thd->net,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */ + send_error(thd,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */ break; #else { @@ -1012,7 +988,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, bzero((char*) &table_list,sizeof(table_list)); if (!(table_list.db=thd->db)) { - send_error(net,ER_NO_DB_ERROR); + send_error(thd,ER_NO_DB_ERROR); break; } thd->free_list=0; @@ -1030,7 +1006,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, if (grant_option && check_grant(thd,SELECT_ACL,&table_list,2)) break; mysqld_list_fields(thd,&table_list,fields); - free_items(thd); + free_items(thd->free_list); break; } #endif @@ -1048,11 +1024,11 @@ bool dispatch_command(enum enum_server_command command, THD *thd, // null test to handle EOM if (!db || !strip_sp(db) || check_db_name(db)) { - net_printf(&thd->net,ER_WRONG_DB_NAME, db ? db : "NULL"); + net_printf(thd,ER_WRONG_DB_NAME, db ? db : "NULL"); break; } if (lower_case_table_names) - casedn_str(db); + my_casedn_str(system_charset_info, db); if (check_access(thd,CREATE_ACL,db,0,1)) break; mysql_log.write(thd,command,packet); @@ -1066,14 +1042,14 @@ bool dispatch_command(enum enum_server_command command, THD *thd, // null test to handle EOM if (!db || !strip_sp(db) || check_db_name(db)) { - net_printf(&thd->net,ER_WRONG_DB_NAME, db ? db : "NULL"); + net_printf(thd,ER_WRONG_DB_NAME, db ? db : "NULL"); break; } if (lower_case_table_names) - casedn_str(db); + my_casedn_str(system_charset_info, db); if (thd->locked_tables || thd->active_transaction()) { - send_error(&thd->net,ER_LOCK_OR_ACTIVE_TRANSACTION); + send_error(thd,ER_LOCK_OR_ACTIVE_TRANSACTION); break; } mysql_log.write(thd,command,db); @@ -1112,9 +1088,9 @@ bool dispatch_command(enum enum_server_command command, THD *thd, break; mysql_log.write(thd,command,NullS); if (reload_acl_and_cache(thd, options, (TABLE_LIST*) 0)) - send_error(net,0); + send_error(thd,0); else - send_eof(net); + send_eof(thd); break; } case COM_SHUTDOWN: @@ -1123,12 +1099,12 @@ bool dispatch_command(enum enum_server_command command, THD *thd, break; /* purecov: inspected */ DBUG_PRINT("quit",("Got shutdown command")); mysql_log.write(thd,command,NullS); - send_eof(net); + send_eof(thd); #ifdef __WIN__ sleep(1); // must wait after eof() #endif #ifndef OS2 - send_eof(net); // This is for 'quit request' + send_eof(thd); // This is for 'quit request' #endif close_connection(net); close_thread_tables(thd); // Free before kill @@ -1161,7 +1137,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, } case COM_PING: thread_safe_increment(com_other,&LOCK_status); - send_ok(net); // Tell client we are alive + send_ok(thd); // Tell client we are alive break; case COM_PROCESS_INFO: thread_safe_increment(com_stat[SQLCOM_SHOW_PROCESSLIST],&LOCK_status); @@ -1184,14 +1160,14 @@ bool dispatch_command(enum enum_server_command command, THD *thd, break; /* purecov: inspected */ mysql_print_status(thd); mysql_log.write(thd,command,NullS); - send_eof(net); + send_eof(thd); break; case COM_SLEEP: case COM_CONNECT: // Impossible here case COM_TIME: // Impossible from client case COM_DELAYED_INSERT: default: - send_error(net, ER_UNKNOWN_COM_ERROR); + send_error(thd, ER_UNKNOWN_COM_ERROR); break; } if (thd->lock || thd->open_tables) @@ -1201,7 +1177,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, } if (thd->fatal_error) - send_error(net,0); // End of memory ? + send_error(thd,0); // End of memory ? time_t start_of_query=thd->start_time; thd->end_time(); // Set start time @@ -1233,22 +1209,80 @@ bool dispatch_command(enum enum_server_command command, THD *thd, DBUG_RETURN(error); } + +/* + Read query from packet and store in thd->query + Used in COM_QUERY and COM_PREPARE + + DESCRIPTION + Sets the following THD variables: + query + query_length + + RETURN VALUES + 0 ok + 1 error; In this case thd->fatal_error is set +*/ + +bool alloc_query(THD *thd, char *packet, ulong packet_length) +{ + packet_length--; // Remove end null + /* Remove garage at start and end of query */ + while (my_isspace(system_charset_info,packet[0]) && packet_length > 0) + { + packet++; + packet_length--; + } + char *pos=packet+packet_length; // Point at end null + while (packet_length > 0 && + (pos[-1] == ';' || my_isspace(system_charset_info,pos[-1]))) + { + pos--; + packet_length--; + } + /* We must allocate some extra memory for query cache */ + if (!(thd->query= (char*) thd->memdup_w_gap((gptr) (packet), + packet_length, + thd->db_length+2))) + return 1; + thd->query[packet_length]=0; + thd->query_length= packet_length; + thd->packet.shrink(thd->variables.net_buffer_length);// Reclaim some memory + + if (!(specialflag & SPECIAL_NO_PRIOR)) + my_pthread_setprio(pthread_self(),QUERY_PRIOR); + return 0; +} + /**************************************************************************** ** mysql_execute_command ** Execute command saved in thd and current_lex->sql_command ****************************************************************************/ void -mysql_execute_command(void) +mysql_execute_command(THD *thd) { int res= 0; - THD *thd= current_thd; LEX *lex= &thd->lex; TABLE_LIST *tables= (TABLE_LIST*) lex->select_lex.table_list.first; SELECT_LEX *select_lex= lex->select; SELECT_LEX_UNIT *unit= &lex->unit; DBUG_ENTER("mysql_execute_command"); + /* + Reset warning count for each query that uses tables + A better approach would be to reset this for any commands + that is not a SHOW command or a select that only access local + variables, but for now this is probably good enough. + */ + if (tables) + mysql_reset_errors(thd); + /* + Save old warning count to be able to send to client how many warnings we + got + */ + thd->old_total_warn_count= thd->total_warn_count; + if (thd->slave_thread) { /* @@ -1376,7 +1410,7 @@ mysql_execute_command(void) break; case SQLCOM_EMPTY_QUERY: - send_ok(&thd->net); + send_ok(thd); break; case SQLCOM_PURGE: @@ -1388,12 +1422,15 @@ mysql_execute_command(void) } case SQLCOM_SHOW_WARNS: { - res = mysqld_show_warnings(thd); + res= mysqld_show_warnings(thd, (ulong) + ((1L << (uint) MYSQL_ERROR::WARN_LEVEL_NOTE) | + (1L << (uint) MYSQL_ERROR::WARN_LEVEL_WARN))); break; } case SQLCOM_SHOW_ERRORS: { - res = mysqld_show_errors(thd); + res= mysqld_show_warnings(thd, (ulong) + (1L << (uint) MYSQL_ERROR::WARN_LEVEL_ERROR)); break; } case SQLCOM_SHOW_NEW_MASTER: @@ -1499,7 +1536,7 @@ mysql_execute_command(void) } if (strlen(tables->name) > NAME_LEN) { - net_printf(&thd->net,ER_WRONG_TABLE_NAME,tables->name); + net_printf(thd,ER_WRONG_TABLE_NAME,tables->name); break; } LOCK_ACTIVE_MI; @@ -1507,7 +1544,7 @@ mysql_execute_command(void) if (!fetch_master_table(thd, tables->db, tables->real_name, active_mi, 0)) { - send_ok(&thd->net); + send_ok(thd); } UNLOCK_ACTIVE_MI; break; @@ -1535,7 +1572,7 @@ mysql_execute_command(void) } if (strlen(tables->name) > NAME_LEN) { - net_printf(&thd->net,ER_WRONG_TABLE_NAME,tables->name); + net_printf(thd,ER_WRONG_TABLE_NAME,tables->name); res=0; break; } @@ -1559,7 +1596,7 @@ mysql_execute_command(void) if (!(lex->create_info.options & HA_LEX_CREATE_TMP_TABLE) && check_dup(tables->db, tables->real_name, tables->next)) { - net_printf(&thd->net,ER_INSERT_TABLE_USED,tables->real_name); + net_printf(thd,ER_INSERT_TABLE_USED,tables->real_name); DBUG_VOID_RETURN; } if (tables->next) @@ -1598,7 +1635,7 @@ mysql_execute_command(void) lex->create_list, lex->key_list,0,0,0); // do logging if (!res) - send_ok(&thd->net); + send_ok(thd); } break; } @@ -1631,14 +1668,14 @@ mysql_execute_command(void) } case SQLCOM_ALTER_TABLE: #if defined(DONT_ALLOW_SHOW_COMMANDS) - send_error(&thd->net,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */ + send_error(thd,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */ break; #else { ulong priv=0; if (lex->name && strlen(lex->name) > NAME_LEN) { - net_printf(&thd->net,ER_WRONG_TABLE_NAME,lex->name); + net_printf(thd,ER_WRONG_TABLE_NAME,lex->name); res=0; break; } @@ -1721,7 +1758,7 @@ mysql_execute_command(void) } case SQLCOM_SHOW_BINLOGS: #ifdef DONT_ALLOW_SHOW_COMMANDS - send_error(&thd->net,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */ + send_error(thd,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */ DBUG_VOID_RETURN; #else { @@ -1733,7 +1770,7 @@ mysql_execute_command(void) #endif case SQLCOM_SHOW_CREATE: #ifdef DONT_ALLOW_SHOW_COMMANDS - send_error(&thd->net,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */ + send_error(thd,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */ DBUG_VOID_RETURN; #else { @@ -1805,7 +1842,7 @@ mysql_execute_command(void) goto error; if (select_lex->item_list.elements != lex->value_list.elements) { - send_error(&thd->net,ER_WRONG_VALUE_COUNT); + send_error(thd,ER_WRONG_VALUE_COUNT); DBUG_VOID_RETURN; } if (select_lex->table_list.elements == 1) @@ -1844,7 +1881,7 @@ mysql_execute_command(void) msg="LIMIT"; if (msg) { - net_printf(&thd->net, ER_WRONG_USAGE, "UPDATE", msg); + net_printf(thd, ER_WRONG_USAGE, "UPDATE", msg); res= 1; break; } @@ -1934,7 +1971,7 @@ mysql_execute_command(void) if (check_dup(tables->db, tables->real_name, tables->next)) { - net_printf(&thd->net,ER_INSERT_TABLE_USED,tables->real_name); + net_printf(thd,ER_INSERT_TABLE_USED,tables->real_name); DBUG_VOID_RETURN; } tables->lock_type=TL_WRITE; // update first table @@ -1966,7 +2003,7 @@ mysql_execute_command(void) */ if (thd->locked_tables || thd->active_transaction()) { - send_error(&thd->net,ER_LOCK_OR_ACTIVE_TRANSACTION,NullS); + send_error(thd,ER_LOCK_OR_ACTIVE_TRANSACTION,NullS); goto error; } res=mysql_truncate(thd,tables); @@ -2003,7 +2040,7 @@ mysql_execute_command(void) goto error; if ((thd->options & OPTION_SAFE_UPDATES) && !select_lex->where) { - send_error(&thd->net,ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE); + send_error(thd,ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE); goto error; } for (auxi=(TABLE_LIST*) aux_tables ; auxi ; auxi=auxi->next) @@ -2019,7 +2056,7 @@ mysql_execute_command(void) } if (!walk) { - net_printf(&thd->net,ER_NONUNIQ_TABLE,auxi->real_name); + net_printf(thd,ER_NONUNIQ_TABLE,auxi->real_name); goto error; } auxi->lock_type=walk->lock_type=TL_WRITE; @@ -2078,7 +2115,7 @@ mysql_execute_command(void) break; case SQLCOM_SHOW_DATABASES: #if defined(DONT_ALLOW_SHOW_COMMANDS) - send_error(&thd->net,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */ + send_error(thd,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */ DBUG_VOID_RETURN; #else if ((specialflag & SPECIAL_SKIP_SHOW_DB) && @@ -2112,7 +2149,7 @@ mysql_execute_command(void) break; case SQLCOM_SHOW_LOGS: #ifdef DONT_ALLOW_SHOW_COMMANDS - send_error(&thd->net,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */ + send_error(thd,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */ DBUG_VOID_RETURN; #else { @@ -2125,20 +2162,20 @@ mysql_execute_command(void) case SQLCOM_SHOW_TABLES: /* FALL THROUGH */ #ifdef DONT_ALLOW_SHOW_COMMANDS - send_error(&thd->net,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */ + send_error(thd,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */ DBUG_VOID_RETURN; #else { char *db=select_lex->db ? select_lex->db : thd->db; if (!db) { - send_error(&thd->net,ER_NO_DB_ERROR); /* purecov: inspected */ + send_error(thd,ER_NO_DB_ERROR); /* purecov: inspected */ goto error; /* purecov: inspected */ } remove_escape(db); // Fix escaped '_' if (check_db_name(db)) { - net_printf(&thd->net,ER_WRONG_DB_NAME, db); + net_printf(thd,ER_WRONG_DB_NAME, db); goto error; } if (check_access(thd,SELECT_ACL,db,&thd->col_access)) @@ -2161,14 +2198,14 @@ mysql_execute_command(void) break; case SQLCOM_SHOW_FIELDS: #ifdef DONT_ALLOW_SHOW_COMMANDS - send_error(&thd->net,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */ + send_error(thd,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */ DBUG_VOID_RETURN; #else { char *db=tables->db; if (!*db) { - send_error(&thd->net,ER_NO_DB_ERROR); /* purecov: inspected */ + send_error(thd,ER_NO_DB_ERROR); /* purecov: inspected */ goto error; /* purecov: inspected */ } remove_escape(db); // Fix escaped '_' @@ -2186,14 +2223,14 @@ mysql_execute_command(void) #endif case SQLCOM_SHOW_KEYS: #ifdef DONT_ALLOW_SHOW_COMMANDS - send_error(&thd->net,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */ + send_error(thd,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */ DBUG_VOID_RETURN; #else { char *db=tables->db; if (!db) { - send_error(&thd->net,ER_NO_DB_ERROR); /* purecov: inspected */ + send_error(thd,ER_NO_DB_ERROR); /* purecov: inspected */ goto error; /* purecov: inspected */ } remove_escape(db); // Fix escaped '_' @@ -2227,7 +2264,7 @@ mysql_execute_command(void) if (!(thd->client_capabilities & CLIENT_LOCAL_FILES) || ! opt_local_infile) { - send_error(&thd->net,ER_NOT_ALLOWED_COMMAND); + send_error(thd,ER_NOT_ALLOWED_COMMAND); goto error; } if (check_access(thd,privilege,tables->db,&tables->grant.privilege) || @@ -2242,7 +2279,7 @@ mysql_execute_command(void) if (sql_set_variables(thd, &lex->var_list)) res= -1; else - send_ok(&thd->net); + send_ok(thd); break; case SQLCOM_UNLOCK_TABLES: if (thd->locked_tables) @@ -2257,7 +2294,7 @@ mysql_execute_command(void) } if (thd->global_read_lock) unlock_global_read_lock(thd); - send_ok(&thd->net); + send_ok(thd); break; case SQLCOM_LOCK_TABLES: if (thd->locked_tables) @@ -2276,7 +2313,7 @@ mysql_execute_command(void) { thd->locked_tables=thd->lock; thd->lock=0; - send_ok(&thd->net); + send_ok(thd); } else thd->options&= ~(ulong) (OPTION_TABLE_LOCK); @@ -2286,11 +2323,11 @@ mysql_execute_command(void) { if (!strip_sp(lex->name) || check_db_name(lex->name)) { - net_printf(&thd->net,ER_WRONG_DB_NAME, lex->name); + net_printf(thd,ER_WRONG_DB_NAME, lex->name); break; } if (lower_case_table_names) - casedn_str(lex->name); + my_casedn_str(system_charset_info, lex->name); if (check_access(thd,CREATE_ACL,lex->name,0,1)) break; res=mysql_create_db(thd,lex->name,&lex->create_info,0); @@ -2300,16 +2337,16 @@ mysql_execute_command(void) { if (!strip_sp(lex->name) || check_db_name(lex->name)) { - net_printf(&thd->net,ER_WRONG_DB_NAME, lex->name); + net_printf(thd,ER_WRONG_DB_NAME, lex->name); break; } if (lower_case_table_names) - casedn_str(lex->name); + my_casedn_str(system_charset_info, lex->name); if (check_access(thd,DROP_ACL,lex->name,0,1)) break; if (thd->locked_tables || thd->active_transaction()) { - send_error(&thd->net,ER_LOCK_OR_ACTIVE_TRANSACTION); + send_error(thd,ER_LOCK_OR_ACTIVE_TRANSACTION); goto error; } res=mysql_rm_db(thd,lex->name,lex->drop_if_exists,0); @@ -2319,31 +2356,31 @@ mysql_execute_command(void) { if (!strip_sp(lex->name) || check_db_name(lex->name)) { - net_printf(&thd->net,ER_WRONG_DB_NAME, lex->name); + net_printf(thd,ER_WRONG_DB_NAME, lex->name); break; } if (check_access(thd,ALTER_ACL,lex->name,0,1)) break; if (thd->locked_tables || thd->active_transaction()) { - send_error(&thd->net,ER_LOCK_OR_ACTIVE_TRANSACTION); + send_error(thd,ER_LOCK_OR_ACTIVE_TRANSACTION); goto error; } - res=mysql_alter_db(thd,lex->name,&lex->create_info,0); + res=mysql_alter_db(thd,lex->name,&lex->create_info); break; } case SQLCOM_SHOW_CREATE_DB: { if (!strip_sp(lex->name) || check_db_name(lex->name)) { - net_printf(&thd->net,ER_WRONG_DB_NAME, lex->name); + net_printf(thd,ER_WRONG_DB_NAME, lex->name); break; } if (check_access(thd,DROP_ACL,lex->name,0,1)) break; if (thd->locked_tables || thd->active_transaction()) { - send_error(&thd->net,ER_LOCK_OR_ACTIVE_TRANSACTION); + send_error(thd,ER_LOCK_OR_ACTIVE_TRANSACTION); goto error; } res=mysqld_show_create_db(thd,lex->name); @@ -2354,7 +2391,7 @@ mysql_execute_command(void) break; #ifdef HAVE_DLOPEN if (!(res = mysql_create_function(thd,&lex->udf))) - send_ok(&thd->net); + send_ok(thd); #else res= -1; #endif @@ -2364,7 +2401,7 @@ mysql_execute_command(void) break; #ifdef HAVE_DLOPEN if (!(res = mysql_drop_function(thd,lex->udf.name))) - send_ok(&thd->net); + send_ok(thd); #else res= -1; #endif @@ -2424,7 +2461,7 @@ mysql_execute_command(void) { if (lex->columns.elements) { - send_error(&thd->net,ER_ILLEGAL_GRANT_FOR_TABLE); + send_error(thd,ER_ILLEGAL_GRANT_FOR_TABLE); res=1; } else @@ -2454,9 +2491,9 @@ mysql_execute_command(void) if (check_global_access(thd,RELOAD_ACL) || check_db_used(thd, tables)) goto error; if (reload_acl_and_cache(thd, lex->type, tables)) - send_error(&thd->net,0); + send_error(thd,0); else - send_ok(&thd->net); + send_ok(thd); break; case SQLCOM_KILL: kill_one_thread(thd,lex->thread_id); @@ -2506,7 +2543,7 @@ mysql_execute_command(void) thd->options= ((thd->options & (ulong) ~(OPTION_STATUS_NO_TRANS_UPDATE)) | OPTION_BEGIN); thd->server_status|= SERVER_STATUS_IN_TRANS; - send_ok(&thd->net); + send_ok(thd); } break; case SQLCOM_COMMIT: @@ -2520,7 +2557,7 @@ mysql_execute_command(void) thd->server_status&= ~SERVER_STATUS_IN_TRANS; if (!ha_commit(thd)) { - send_ok(&thd->net); + send_ok(thd); } else res= -1; @@ -2531,21 +2568,21 @@ mysql_execute_command(void) if (!ha_rollback(thd)) { if (thd->options & OPTION_STATUS_NO_TRANS_UPDATE) - send_warning(&thd->net,ER_WARNING_NOT_COMPLETE_ROLLBACK,0); + send_warning(thd,ER_WARNING_NOT_COMPLETE_ROLLBACK,0); else - send_ok(&thd->net); + send_ok(thd); } else res= -1; thd->options&= ~(ulong) (OPTION_BEGIN | OPTION_STATUS_NO_TRANS_UPDATE); break; default: /* Impossible */ - send_ok(&thd->net); + send_ok(thd); break; } thd->proc_info="query end"; // QQ if (res < 0) - send_error(&thd->net,thd->killed ? ER_SERVER_SHUTDOWN : 0); + send_error(thd,thd->killed ? ER_SERVER_SHUTDOWN : 0); error: DBUG_VOID_RETURN; @@ -2578,7 +2615,7 @@ check_access(THD *thd, ulong want_access, const char *db, ulong *save_priv, if ((!db || !db[0]) && !thd->db && !dont_check_global_grants) { if (!no_errors) - send_error(&thd->net,ER_NO_DB_ERROR); /* purecov: tested */ + send_error(thd,ER_NO_DB_ERROR); /* purecov: tested */ DBUG_RETURN(TRUE); /* purecov: tested */ } @@ -2591,7 +2628,7 @@ check_access(THD *thd, ulong want_access, const char *db, ulong *save_priv, ! db && dont_check_global_grants) { // We can never grant this if (!no_errors) - net_printf(&thd->net,ER_ACCESS_DENIED_ERROR, + net_printf(thd,ER_ACCESS_DENIED_ERROR, thd->priv_user, thd->host_or_ip, thd->password ? ER(ER_YES) : ER(ER_NO));/* purecov: tested */ @@ -2616,7 +2653,7 @@ check_access(THD *thd, ulong want_access, const char *db, ulong *save_priv, !(want_access & ~TABLE_ACLS))) DBUG_RETURN(FALSE); /* Ok */ if (!no_errors) - net_printf(&thd->net,ER_DBACCESS_DENIED_ERROR, + net_printf(thd,ER_DBACCESS_DENIED_ERROR, thd->priv_user, thd->host_or_ip, db ? db : thd->db ? thd->db : "unknown"); /* purecov: tested */ @@ -2632,7 +2669,7 @@ bool check_global_access(THD *thd, ulong want_access) if ((thd->master_access & want_access) == want_access) return 0; get_privilege_desc(command, sizeof(command), want_access); - net_printf(&thd->net,ER_SPECIFIC_ACCESS_DENIED_ERROR, + net_printf(thd,ER_SPECIFIC_ACCESS_DENIED_ERROR, command); return 1; } @@ -2687,7 +2724,7 @@ static bool check_db_used(THD *thd,TABLE_LIST *tables) { if (!(tables->db=thd->db)) { - send_error(&thd->net,ER_NO_DB_ERROR); /* purecov: tested */ + send_error(thd,ER_NO_DB_ERROR); /* purecov: tested */ return TRUE; /* purecov: tested */ } } @@ -2710,7 +2747,7 @@ static bool check_merge_table_access(THD *thd, char *db, tmp->db=db; else if (strcmp(tmp->db,db)) { - send_error(&thd->net,ER_UNION_TABLES_IN_DIFFERENT_DIR); + send_error(thd,ER_UNION_TABLES_IN_DIFFERENT_DIR); return 1; } } @@ -2799,11 +2836,10 @@ mysql_init_query(THD *thd) thd->lex.olap=0; thd->lex.select->olap= UNSPECIFIED_OLAP_TYPE; thd->fatal_error= 0; // Safety + thd->total_warn_count=0; // Warnings for this query thd->last_insert_id_used= thd->query_start_used= thd->insert_id_used=0; thd->sent_row_count= thd->examined_row_count= 0; thd->safe_to_cache_query= 1; - thd->param_count=0; - thd->prepare_command=false; thd->lex.param_list.empty(); DBUG_VOID_RETURN; } @@ -2850,6 +2886,33 @@ mysql_new_select(LEX *lex, bool move_down) return 0; } +/* + Create a select to return the same output as 'SELECT @@var_name'. + + SYNOPSIS + create_select_for_variable() + var_name Variable name + + DESCRIPTION + Used for SHOW COUNT(*) [ WARNINGS | ERROR] + + This will crash with a core dump if the variable doesn't exists +*/ + +void create_select_for_variable(const char *var_name) +{ + LEX *lex; + LEX_STRING tmp; + DBUG_ENTER("create_select_for_variable"); + lex= current_lex; + mysql_init_select(lex); + lex->sql_command= SQLCOM_SELECT; + tmp.str= (char*) var_name; + tmp.length=strlen(var_name); + add_item_to_list(get_system_var(OPT_SESSION, tmp)); + DBUG_VOID_RETURN; +} + void mysql_init_multi_delete(LEX *lex) { @@ -2881,7 +2944,7 @@ mysql_parse(THD *thd, char *inBuf, uint length) } else { - mysql_execute_command(); + mysql_execute_command(thd); query_cache_end_of_result(&thd->net); } } @@ -2892,7 +2955,7 @@ mysql_parse(THD *thd, char *inBuf, uint length) query_cache_abort(&thd->net); } thd->proc_info="freeing items"; - free_items(thd); /* Free strings used by items */ + free_items(thd->free_list); /* Free strings used by items */ lex_end(lex); } DBUG_VOID_RETURN; @@ -2928,7 +2991,7 @@ bool add_field_to_list(char *field_name, enum_field_types type, if (strlen(field_name) > NAME_LEN) { - net_printf(&thd->net, ER_TOO_LONG_IDENT, field_name); /* purecov: inspected */ + net_printf(thd, ER_TOO_LONG_IDENT, field_name); /* purecov: inspected */ DBUG_RETURN(1); /* purecov: inspected */ } if (type_modifier & PRI_KEY_FLAG) @@ -2951,7 +3014,7 @@ bool add_field_to_list(char *field_name, enum_field_types type, if ((type_modifier & (NOT_NULL_FLAG | AUTO_INCREMENT_FLAG)) == NOT_NULL_FLAG) { - net_printf(&thd->net,ER_INVALID_DEFAULT,field_name); + net_printf(thd,ER_INVALID_DEFAULT,field_name); DBUG_RETURN(1); } default_value=0; @@ -3037,7 +3100,7 @@ bool add_field_to_list(char *field_name, enum_field_types type, res=default_value->val_str(&str); if (res->length()) { - net_printf(&thd->net,ER_BLOB_CANT_HAVE_DEFAULT,field_name); /* purecov: inspected */ + net_printf(thd,ER_BLOB_CANT_HAVE_DEFAULT,field_name); /* purecov: inspected */ DBUG_RETURN(1); /* purecov: inspected */ } new_field->def=0; @@ -3057,7 +3120,7 @@ bool add_field_to_list(char *field_name, enum_field_types type, uint tmp_length=new_field->length; if (tmp_length > PRECISION_FOR_DOUBLE) { - net_printf(&thd->net,ER_WRONG_FIELD_SPEC,field_name); + net_printf(thd,ER_WRONG_FIELD_SPEC,field_name); DBUG_RETURN(1); } else if (tmp_length > PRECISION_FOR_FLOAT) @@ -3111,7 +3174,7 @@ bool add_field_to_list(char *field_name, enum_field_types type, { if (interval->count > sizeof(longlong)*8) { - net_printf(&thd->net,ER_TOO_BIG_SET,field_name); /* purecov: inspected */ + net_printf(thd,ER_TOO_BIG_SET,field_name); /* purecov: inspected */ DBUG_RETURN(1); /* purecov: inspected */ } new_field->pack_length=(interval->count+7)/8; @@ -3133,7 +3196,7 @@ bool add_field_to_list(char *field_name, enum_field_types type, (void) find_set(interval,res->ptr(),res->length()); if (thd->cuted_fields) { - net_printf(&thd->net,ER_INVALID_DEFAULT,field_name); + net_printf(thd,ER_INVALID_DEFAULT,field_name); DBUG_RETURN(1); } } @@ -3156,7 +3219,7 @@ bool add_field_to_list(char *field_name, enum_field_types type, res=default_value->val_str(&str); if (!find_enum(interval,res->ptr(),res->length())) { - net_printf(&thd->net,ER_INVALID_DEFAULT,field_name); + net_printf(thd,ER_INVALID_DEFAULT,field_name); DBUG_RETURN(1); } } @@ -3168,14 +3231,14 @@ bool add_field_to_list(char *field_name, enum_field_types type, (!new_field->length && !(new_field->flags & BLOB_FLAG) && type != FIELD_TYPE_STRING && type != FIELD_TYPE_VAR_STRING)) { - net_printf(&thd->net,ER_TOO_BIG_FIELDLENGTH,field_name, + net_printf(thd,ER_TOO_BIG_FIELDLENGTH,field_name, MAX_FIELD_WIDTH-1); /* purecov: inspected */ DBUG_RETURN(1); /* purecov: inspected */ } type_modifier&= AUTO_INCREMENT_FLAG; if ((~allowed_type_modifier) & type_modifier) { - net_printf(&thd->net,ER_WRONG_FIELD_SPEC,field_name); + net_printf(thd,ER_WRONG_FIELD_SPEC,field_name); DBUG_RETURN(1); } if (!new_field->pack_length) @@ -3286,7 +3349,7 @@ TABLE_LIST *add_table_to_list(Table_ident *table, LEX_STRING *alias, (table->table.length && check_table_name(table->table.str,table->table.length)) || table->db.str && check_db_name(table->db.str)) { - net_printf(&thd->net,ER_WRONG_TABLE_NAME,table->table.str); + net_printf(thd,ER_WRONG_TABLE_NAME,table->table.str); DBUG_RETURN(0); } @@ -3308,7 +3371,8 @@ TABLE_LIST *add_table_to_list(Table_ident *table, LEX_STRING *alias, } else { - ptr->db= (char*) ""; + /* The following can't be "" as we may do 'casedn_str()' on it */ + ptr->db= empty_c_string; ptr->db_length= 0; } @@ -3339,7 +3403,7 @@ TABLE_LIST *add_table_to_list(Table_ident *table, LEX_STRING *alias, { if (!strcmp(alias_str,tables->name) && !strcmp(ptr->db, tables->db)) { - net_printf(&thd->net,ER_NONUNIQ_TABLE,alias_str); /* purecov: tested */ + net_printf(thd,ER_NONUNIQ_TABLE,alias_str); /* purecov: tested */ DBUG_RETURN(0); /* purecov: tested */ } } @@ -3487,9 +3551,9 @@ void kill_one_thread(THD *thd, ulong id) } if (!error) - send_ok(&thd->net); + send_ok(thd); else - net_printf(&thd->net,error,id); + net_printf(thd,error,id); } /* Clear most status variables */ @@ -3552,7 +3616,7 @@ bool check_simple_select() char command[80]; strmake(command, thd->lex.yylval->symbol.str, min(thd->lex.yylval->symbol.length, sizeof(command)-1)); - net_printf(&thd->net, ER_CANT_USE_OPTION_HERE, command); + net_printf(thd, ER_CANT_USE_OPTION_HERE, command); return 1; } return 0; diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index d41aca21fb8..05b3f360caa 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -25,7 +25,7 @@ Prepare: store its information list lex->param_list - Without executing the query, return back to client the total number of parameters along with result-set metadata information - (if any ) + (if any) Prepare-execute: @@ -38,46 +38,132 @@ Prepare-execute: to client Long data handling: - - Server gets the long data in pieces with command type 'COM_LONG_DATA'. - The packet recieved will have the format as: - [type_spec_exists][type][length][data] + [COM_LONG_DATA:1][parameter_number:2][type:2][data] - Checks if the type is specified by client, and if yes reads the type, and stores the data in that format. - - If length == MYSQL_END_OF_DATA, then server sets up the data read ended. + - It's up to the client to check for read data ended. The server doesn't + care. + ***********************************************************************/ #include "mysql_priv.h" #include "sql_acl.h" #include // for DEBUG_ASSERT() -#include // for isspace() +#include // for isspace() -/**************************************************************************/ extern int yyparse(void); static ulong get_param_length(uchar **packet); static uint get_buffer_type(uchar **packet); static bool param_is_null(uchar **packet); static bool setup_param_fields(THD *thd,List ¶ms); -static uchar* setup_param_field(Item_param *item_param, uchar *pos, uint buffer_type); +static uchar* setup_param_field(Item_param *item_param, uchar *pos, + uint buffer_type); static void setup_longdata_field(Item_param *item_param, uchar *pos); static bool setup_longdata(THD *thd,List ¶ms); -static void send_prepare_results(THD *thd); -static void mysql_parse_prepare_query(THD *thd,char *packet,uint length); -static bool mysql_send_insert_fields(THD *thd,TABLE_LIST *table_list, +static bool send_prepare_results(PREP_STMT *stmt); +static bool parse_prepare_query(PREP_STMT *stmt, char *packet, uint length); +static bool mysql_send_insert_fields(PREP_STMT *stmt, TABLE_LIST *table_list, List &fields, - List &values_list,thr_lock_type lock_type); -static bool mysql_test_insert_fields(THD *thd,TABLE_LIST *table_list, + List &values_list, + thr_lock_type lock_type); +static bool mysql_test_insert_fields(PREP_STMT *stmt, TABLE_LIST *table_list, List &fields, - List &values_list,thr_lock_type lock_type); -static bool mysql_test_upd_fields(THD *thd,TABLE_LIST *table_list, + List &values_list, + thr_lock_type lock_type); +static bool mysql_test_upd_fields(PREP_STMT *stmt, TABLE_LIST *table_list, List &fields, List &values, COND *conds,thr_lock_type lock_type); -static bool mysql_test_select_fields(THD *thd, TABLE_LIST *tables, - List &fields, List &values, - COND *conds, ORDER *order, ORDER *group, - Item *having,thr_lock_type lock_type); -extern const char *any_db; -/**************************************************************************/ +static bool mysql_test_select_fields(PREP_STMT *stmt, TABLE_LIST *tables, + List &fields, List &values, + COND *conds, ORDER *order, ORDER *group, + Item *having,thr_lock_type lock_type); + + +/* + Find prepared statement in thd + + SYNOPSIS + find_prepared_statement() + thd Thread handler + stmt_id Statement id server specified to the client on prepare + + RETURN VALUES + 0 error. In this case the error is sent with my_error() + ptr Pointer to statement +*/ + +static PREP_STMT *find_prepared_statement(THD *thd, ulong stmt_id, + const char *when) +{ + PREP_STMT *stmt; + DBUG_ENTER("find_prepared_statement"); + DBUG_PRINT("enter",("stmt_id: %d", stmt_id)); + + if (thd->last_prepared_stmt && thd->last_prepared_stmt->stmt_id == stmt_id) + DBUG_RETURN(thd->last_prepared_stmt); + if ((stmt= (PREP_STMT*) tree_search(&thd->prepared_statements, &stmt_id, + (void*) 0))) + DBUG_RETURN (thd->last_prepared_stmt= stmt); + my_error(ER_UNKNOWN_STMT_HANDLER, MYF(0), stmt_id, when); + DBUG_RETURN(0); +} + +/* + Compare two prepared statements; Used to find a prepared statement +*/ + +int compare_prep_stmt(PREP_STMT *a, PREP_STMT *b, void *not_used) +{ + return (a->stmt_id < b->stmt_id) ? -1 : (a->stmt_id == b->stmt_id) ? 0 : 1; +} + + +/* + Free prepared statement. + + SYNOPSIS + standard tree_element_free function. + + DESCRIPTION + We don't have to free the stmt itself as this was stored in the tree + and will be freed when the node is deleted +*/ + +void free_prep_stmt(PREP_STMT *stmt, TREE_FREE mode, void *not_used) +{ + free_root(&stmt->mem_root, MYF(0)); + free_items(stmt->free_list); +} + +/* + Send prepared stmt info to client after prepare +*/ + +bool send_prep_stmt(PREP_STMT *stmt, uint columns) +{ + char buff[8]; + int4store(buff, stmt->stmt_id); + int2store(buff+4, columns); + int2store(buff+6, stmt->param_count); + return my_net_write(&stmt->thd->net, buff, sizeof(buff)); +} + +/* + Send information about all item parameters + + TODO: Not yet ready +*/ + +bool send_item_params(PREP_STMT *stmt) +{ + char buff[1]; + buff[0]=0; + return my_net_write(&stmt->thd->net, buff, sizeof(buff)); +} + + /* Read the buffer type, this happens only first time @@ -90,8 +176,13 @@ static uint get_buffer_type(uchar **packet) return (uint) uint2korr(pos); } + /* Check for NULL param data + + RETURN VALUES + 0 Value was not NULL + 1 Value was NULL */ static bool param_is_null(uchar **packet) @@ -144,8 +235,7 @@ static uchar* setup_param_field(Item_param *item_param, item_param->set_null(); return(pos); } - switch (buffer_type) - { + switch (buffer_type) { case FIELD_TYPE_TINY: item_param->set_int((longlong)(*pos)); pos += 1; @@ -169,7 +259,7 @@ static uchar* setup_param_field(Item_param *item_param, case FIELD_TYPE_FLOAT: float data; float4get(data,pos); - item_param->set_double(data); + item_param->set_double((double) data); pos += 4; break; case FIELD_TYPE_DOUBLE: @@ -193,20 +283,19 @@ static uchar* setup_param_field(Item_param *item_param, from client .. */ -static bool setup_param_fields(THD *thd, List ¶ms) +static bool setup_param_fields(THD *thd, PREP_STMT *stmt) { - reg2 Item_param *item_param; - List_iterator it(params); - NET *net = &thd->net; DBUG_ENTER("setup_param_fields"); - +#ifdef READY_TO_BE_USED + Item_param *item_param; ulong param_count=0; - uchar *pos=(uchar*)net->read_pos+1;// skip command type - - if(*pos++) // No types supplied, read only param data + uchar *pos=(uchar*) thd->net.read_pos+1;// skip command type + + + if (*pos++) // No types supplied, read only param data { while ((item_param=(Item_param *)it++) && - (param_count++ < thd->param_count)) + (param_count++ < stmt->param_count)) { if (item_param->long_data_supplied) continue; @@ -224,68 +313,15 @@ static bool setup_param_fields(THD *thd, List ¶ms) continue; if (!(pos=setup_param_field(item_param,pos, - item_param->buffer_type=(enum_field_types)get_buffer_type(&pos)))) + item_param->buffer_type= + (enum_field_types) get_buffer_type(&pos)))) DBUG_RETURN(1); } } +#endif DBUG_RETURN(0); } -/* - Buffer the long data and update the flags -*/ - -static void setup_longdata_field(Item_param *item_param, uchar *pos) -{ - ulong len; - - if (!*pos++) - item_param->buffer_type=(enum_field_types)get_buffer_type(&pos); - - if (*pos == MYSQL_LONG_DATA_END) - item_param->set_long_end(); - - else - { - len = get_param_length(&pos); - item_param->set_longdata((const char *)pos, len); - } -} - -/* - Store the long data from client in pieces -*/ - -static bool setup_longdata(THD *thd, List ¶ms) -{ - NET *net=&thd->net; - List_iterator it(params); - DBUG_ENTER("setup_longdata"); - - uchar *pos=(uchar*)net->read_pos+1;// skip command type at first position - ulong param_number = get_param_length(&pos); - Item_param *item_param = thd->current_param; - - if (thd->current_param_number != param_number) - { - thd->current_param_number = param_number; - while (param_number--) /* TODO: - Change this loop by either having operator '+' - overloaded to point to desired 'item' or - add another memeber in list as 'goto' with - location count as parameter number, but what - is the best way to traverse ? - */ - { - it++; - } - thd->current_param = item_param = (Item_param *)it++; - } - setup_longdata_field(item_param,pos); - DBUG_RETURN(0); -} - - /* Validates insert fields @@ -337,16 +373,15 @@ static int check_prepare_fields(THD *thd,TABLE *table, List &fields, Validate the following information for INSERT statement: - field existance - fields count - - If there is no column list spec exists, then update the field_list - with all columns from the table, and send fields info back to client */ -static bool mysql_test_insert_fields(THD *thd, TABLE_LIST *table_list, +static bool mysql_test_insert_fields(PREP_STMT *stmt, + TABLE_LIST *table_list, List &fields, List &values_list, thr_lock_type lock_type) { + THD *thd= stmt->thd; TABLE *table; List_iterator_fast its(values_list); List_item *values; @@ -358,7 +393,7 @@ static bool mysql_test_insert_fields(THD *thd, TABLE_LIST *table_list, if ((values= its++)) { uint value_count; - ulong counter=0; + ulong counter= 0; if (check_insert_fields(thd,table,fields,*values,1)) DBUG_RETURN(1); @@ -366,35 +401,20 @@ static bool mysql_test_insert_fields(THD *thd, TABLE_LIST *table_list, value_count= values->elements; its.rewind(); - while ((values = its++)) + while ((values= its++)) { counter++; if (values->elements != value_count) { my_printf_error(ER_WRONG_VALUE_COUNT_ON_ROW, ER(ER_WRONG_VALUE_COUNT_ON_ROW), - MYF(0),counter); + MYF(0), counter); DBUG_RETURN(1); } } - if (fields.elements == 0) - { - /* No field listing, so setup all fields */ - List all_fields; - Field **ptr,*field; - for (ptr=table->field; (field= *ptr) ; ptr++) - { - all_fields.push_back(new Item_field(table->table_cache_key, - table->real_name, - field->field_name)); - } - if ((setup_fields(thd,table_list,all_fields,1,0,0) || - send_fields(thd,all_fields,1))) - DBUG_RETURN(1); - } - else if (send_fields(thd,fields,1)) - DBUG_RETURN(1); } + if (send_prep_stmt(stmt, 0) || send_item_params(stmt)) + DBUG_RETURN(1); DBUG_RETURN(0); } @@ -403,15 +423,16 @@ static bool mysql_test_insert_fields(THD *thd, TABLE_LIST *table_list, Validate the following information UPDATE - set and where clause DELETE - where clause - And send update-set cluase column list fields info - back to client. For DELETE, just validate where cluase + And send update-set clause column list fields info + back to client. For DELETE, just validate where clause and return no fields information back to client. */ -static bool mysql_test_upd_fields(THD *thd, TABLE_LIST *table_list, +static bool mysql_test_upd_fields(PREP_STMT *stmt, TABLE_LIST *table_list, List &fields, List &values, COND *conds, thr_lock_type lock_type) { + THD *thd= stmt->thd; TABLE *table; DBUG_ENTER("mysql_test_upd_fields"); @@ -426,9 +447,8 @@ static bool mysql_test_upd_fields(THD *thd, TABLE_LIST *table_list, Currently return only column list info only, and we are not sending any info on where clause. */ - if (fields.elements && send_fields(thd,fields,1)) + if (send_prep_stmt(stmt, 0) || send_item_params(stmt)) DBUG_RETURN(1); - DBUG_RETURN(0); } @@ -437,7 +457,7 @@ static bool mysql_test_upd_fields(THD *thd, TABLE_LIST *table_list, SELECT - column list - where clause - - orderr clause + - order clause - having clause - group by clause - if no column spec i.e. '*', then setup all fields @@ -445,13 +465,14 @@ static bool mysql_test_upd_fields(THD *thd, TABLE_LIST *table_list, And send column list fields info back to client. */ -static bool mysql_test_select_fields(THD *thd, TABLE_LIST *tables, +static bool mysql_test_select_fields(PREP_STMT *stmt, TABLE_LIST *tables, List &fields, List &values, COND *conds, ORDER *order, ORDER *group, Item *having, thr_lock_type lock_type) { TABLE *table; bool hidden_group_fields; + THD *thd= stmt->thd; List all_fields(fields); DBUG_ENTER("mysql_test_select_fields"); @@ -482,13 +503,15 @@ static bool mysql_test_select_fields(THD *thd, TABLE_LIST *tables, Currently return only column list info only, and we are not sending any info on where clause. */ - if (fields.elements && send_fields(thd,fields,1)) + if (send_prep_stmt(stmt, fields.elements) || + send_fields(thd,fields,0) || send_item_params(stmt)) DBUG_RETURN(1); DBUG_RETURN(0); } + /* - Check the access privileges + Check the access privileges */ static bool check_prepare_access(THD *thd, TABLE_LIST *tables, @@ -505,42 +528,47 @@ static bool check_prepare_access(THD *thd, TABLE_LIST *tables, Send the prepare query results back to client */ -static void send_prepare_results(THD *thd) +static bool send_prepare_results(PREP_STMT *stmt) { - DBUG_ENTER("send_prepare_results"); + THD *thd= stmt->thd; + LEX *lex= &thd->lex; enum enum_sql_command sql_command = thd->lex.sql_command; - - DBUG_PRINT("enter",("command :%d, param_count :%ld", - sql_command,thd->param_count)); + DBUG_ENTER("send_prepare_results"); + DBUG_PRINT("enter",("command: %d, param_count: %ld", + sql_command, lex->param_count)); - LEX *lex=&thd->lex; + /* Setup prepared stmt */ + stmt->param_count= lex->param_count; + stmt->free_list= thd->free_list; // Save items used in stmt + thd->free_list= 0; + SELECT_LEX *select_lex = lex->select; TABLE_LIST *tables=(TABLE_LIST*) select_lex->table_list.first; - switch(sql_command) { + switch (sql_command) { case SQLCOM_INSERT: - if (mysql_test_insert_fields(thd,tables, lex->field_list, + if (mysql_test_insert_fields(stmt, tables, lex->field_list, lex->many_values, lex->lock_option)) goto abort; break; case SQLCOM_UPDATE: - if (mysql_test_upd_fields(thd,tables, select_lex->item_list, + if (mysql_test_upd_fields(stmt, tables, select_lex->item_list, lex->value_list, select_lex->where, lex->lock_option)) goto abort; break; case SQLCOM_DELETE: - if (mysql_test_upd_fields(thd,tables, select_lex->item_list, + if (mysql_test_upd_fields(stmt, tables, select_lex->item_list, lex->value_list, select_lex->where, lex->lock_option)) goto abort; break; case SQLCOM_SELECT: - if (mysql_test_select_fields(thd,tables, select_lex->item_list, + if (mysql_test_select_fields(stmt, tables, select_lex->item_list, lex->value_list, select_lex->where, (ORDER*) select_lex->order_list.first, (ORDER*) select_lex->group_list.first, @@ -556,42 +584,37 @@ static void send_prepare_results(THD *thd) */ } } - send_ok(&thd->net,thd->param_count,0); - DBUG_VOID_RETURN; + DBUG_RETURN(0); abort: - send_error(&thd->net,thd->killed ? ER_SERVER_SHUTDOWN : 0); - DBUG_VOID_RETURN; + send_error(thd,thd->killed ? ER_SERVER_SHUTDOWN : 0); + DBUG_RETURN(1); } /* Parse the prepare query */ -static void mysql_parse_prepare_query(THD *thd, char *packet, uint length) +static bool parse_prepare_query(PREP_STMT *stmt, + char *packet, uint length) { - DBUG_ENTER("mysql_parse_prepare_query"); + bool error= 1; + THD *thd= stmt->thd; + DBUG_ENTER("parse_prepare_query"); mysql_log.write(thd,COM_PREPARE,"%s",packet); mysql_init_query(thd); thd->prepare_command=true; + thd->safe_to_cache_query= 0; - if (query_cache.send_result_to_client(thd, packet, length) <= 0) - { - LEX *lex=lex_start(thd, (uchar*)packet, length); - - if (!yyparse() && !thd->fatal_error) - { - send_prepare_results(thd); - query_cache_end_of_result(&thd->net); - } - else - query_cache_abort(&thd->net); - lex_end(lex); - } - DBUG_VOID_RETURN; + LEX *lex=lex_start(thd, (uchar*) packet, length); + if (!yyparse() && !thd->fatal_error) + error= send_prepare_results(stmt); + lex_end(lex); + DBUG_RETURN(error); } + /* Parse the query and send the total number of parameters and resultset metadata information back to client (if any), @@ -606,52 +629,36 @@ static void mysql_parse_prepare_query(THD *thd, char *packet, uint length) items. */ -void mysql_com_prepare(THD *thd, char *packet, uint packet_length) +bool mysql_stmt_prepare(THD *thd, char *packet, uint packet_length) { MEM_ROOT thd_root = thd->mem_root; - DBUG_ENTER("mysql_com_prepare"); - - packet_length--; - - while (isspace(packet[0]) && packet_length > 0) - { - packet++; - packet_length--; - } - char *pos=packet+packet_length; - while (packet_length > 0 && (pos[-1] == ';' || isspace(pos[-1]))) - { - pos--; - packet_length--; - } - /* - Have the prepare items to have a connection level scope or - till next prepare statement by doing all allocations using - connection level memory allocator 'con_root' from THD. - */ - free_root(&thd->con_root,MYF(0)); - init_sql_alloc(&thd->con_root,8192,8192); - thd->mem_root = thd->con_root; - - if (!(thd->query= (char*) thd->memdup_w_gap((gptr) (packet), - packet_length, - thd->db_length+2))) - DBUG_VOID_RETURN; - thd->query[packet_length]=0; - thd->packet.shrink(net_buffer_length); - thd->query_length = packet_length; + PREP_STMT stmt; + bool error; + DBUG_ENTER("mysql_stmt_prepare"); - if (!(specialflag & SPECIAL_NO_PRIOR)) - my_pthread_setprio(pthread_self(),QUERY_PRIOR); - - mysql_parse_prepare_query(thd,thd->query,packet_length); + bzero((char*) &stmt, sizeof(stmt)); + stmt.thd= thd; + stmt.stmt_id= ++thd->current_stmt_id; + init_sql_alloc(&stmt.mem_root, 8192, 8192); + + thd->mem_root= stmt.mem_root; + if (alloc_query(thd, packet, packet_length)) + goto err; + if (parse_prepare_query(&stmt, thd->query, thd->query_length)) + goto err; if (!(specialflag & SPECIAL_NO_PRIOR)) my_pthread_setprio(pthread_self(),WAIT_PRIOR); - thd->mem_root = thd_root; // restore main mem_root - DBUG_PRINT("exit",("prepare query ready")); - DBUG_VOID_RETURN; + stmt.mem_root= thd->mem_root; + thd->mem_root= thd_root; // restore main mem_root + DBUG_RETURN(0); + +err: + stmt.mem_root= thd->mem_root; + free_prep_stmt(&stmt, free_free, (void*) 0); + thd->mem_root = thd_root; // restore main mem_root + DBUG_RETURN(1); } @@ -663,47 +670,166 @@ void mysql_com_prepare(THD *thd, char *packet, uint packet_length) execute the query */ -void mysql_com_execute(THD *thd) +void mysql_stmt_execute(THD *thd, char *packet) { - MEM_ROOT thd_root=thd->mem_root; - DBUG_ENTER("mysql_com_execute"); - DBUG_PRINT("enter", ("parameters : %ld", thd->param_count)); + ulong stmt_id= uint4korr(packet); + PREP_STMT *stmt; + DBUG_ENTER("mysql_stmt_execute"); - thd->mem_root = thd->con_root; - if (thd->param_count && setup_param_fields(thd, thd->lex.param_list)) + if (!(stmt=find_prepared_statement(thd, stmt_id, "execute"))) + { + send_error(thd); + DBUG_VOID_RETURN; + } + + /* Check if we got an error when sending long data */ + if (stmt->error_in_prepare) + { + send_error(thd); + DBUG_VOID_RETURN; + } + + if (stmt->param_count && setup_param_fields(thd, stmt)) DBUG_VOID_RETURN; - + + MEM_ROOT thd_root= thd->mem_root; + thd->mem_root = thd->con_root; if (!(specialflag & SPECIAL_NO_PRIOR)) my_pthread_setprio(pthread_self(),QUERY_PRIOR); - /* TODO: + /* + TODO: Also, have checks on basic executions such as mysql_insert(), mysql_delete(), mysql_update() and mysql_select() to not to have re-check on setup_* and other things .. */ - mysql_execute_command(); + mysql_execute_command(thd); if (!(specialflag & SPECIAL_NO_PRIOR)) - my_pthread_setprio(pthread_self(),WAIT_PRIOR); + my_pthread_setprio(pthread_self(), WAIT_PRIOR); - thd->mem_root = (MEM_ROOT )thd_root; - DBUG_PRINT("exit",("prepare-execute done!")); + thd->mem_root= thd_root; DBUG_VOID_RETURN; } + /* - Long data in pieces from client + Reset a prepared statement + + SYNOPSIS + mysql_stmt_reset() + thd Thread handle + packet Packet with stmt handle + + DESCRIPTION + This function is useful when one gets an error after calling + mysql_stmt_getlongdata() and one wants to reset the handle + so that one can call execute again. */ -void mysql_com_longdata(THD *thd) +void mysql_stmt_reset(THD *thd, char *packet) { - DBUG_ENTER("mysql_com_execute"); + ulong stmt_id= uint4korr(packet); + PREP_STMT *stmt; + DBUG_ENTER("mysql_stmt_reset"); - if(thd->param_count && setup_longdata(thd,thd->lex.param_list)) - DBUG_VOID_RETURN; - - send_ok(&thd->net,0,0);// ok status to client - DBUG_PRINT("exit",("longdata-buffering done!")); + if (!(stmt=find_prepared_statement(thd, stmt_id, "close"))) + { + send_error(thd); + DBUG_VOID_RETURN; + } + + stmt->error_in_prepare=0; + Item_param *item= stmt->param, *end= item + stmt->param_count; + + /* Free long data if used */ + if (stmt->long_data_used) + { + stmt->long_data_used= 0; + for (; item < end ; item++) + item->reset(); + } + DBUG_VOID_RETURN; +} + + +/* + Delete a prepared statement from memory +*/ + +void mysql_stmt_close(THD *thd, char *packet) +{ + ulong stmt_id= uint4korr(packet); + PREP_STMT *stmt; + DBUG_ENTER("mysql_stmt_close"); + + if (!(stmt=find_prepared_statement(thd, stmt_id, "close"))) + { + send_error(thd); + DBUG_VOID_RETURN; + } + /* Will call free_prep_stmt() */ + tree_delete(&thd->prepared_statements, (void*) stmt, NULL); + thd->last_prepared_stmt=0; DBUG_VOID_RETURN; } + +/* + Long data in pieces from client + + SYNOPSIS + mysql_stmt_get_longdata() + thd Thread handle + pos String to append + packet_length Length of string + + DESCRIPTION + Get a part of a long data. + To make the protocol efficient, we are not sending any return packages + here. + If something goes wrong, then we will send the error on 'execute' + + We assume that the client takes care of checking that all parts are sent + to the server. (No checking that we get a 'end of column' in the server) +*/ + +void mysql_stmt_get_longdata(THD *thd, char *pos, ulong packet_length) +{ + PREP_STMT *stmt; + DBUG_ENTER("mysql_stmt_get_longdata"); + + /* The following should never happen */ + if (packet_length < 9) + { + my_error(ER_WRONG_ARGUMENTS, MYF(0), "get_longdata"); + DBUG_VOID_RETURN; + } + + pos++; // skip command type at first position + ulong stmt_id= uint4korr(pos); + uint param_number= uint2korr(pos+4); + uint param_type= uint2korr(pos+6); + pos+=8; // Point to data + + if (!(stmt=find_prepared_statement(thd, stmt_id, "get_longdata"))) + { + /* + There is a chance that the client will never see this as + it doesn't expect an answer from this call... + */ + send_error(thd); + DBUG_VOID_RETURN; + } + + if (param_number >= stmt->param_count) + { + stmt->error_in_prepare=1; + stmt->last_errno=ER_WRONG_ARGUMENTS; + sprintf(stmt->last_error, ER(ER_WRONG_ARGUMENTS), "get_longdata"); + DBUG_VOID_RETURN; + } + stmt->param[param_number].set_longdata(pos, packet_length-9); + stmt->long_data_used= 1; + DBUG_VOID_RETURN; +} diff --git a/sql/sql_rename.cc b/sql/sql_rename.cc index 049690eb318..a9ab1776e19 100644 --- a/sql/sql_rename.cc +++ b/sql/sql_rename.cc @@ -97,7 +97,7 @@ end: Query_log_event qinfo(thd, thd->query, thd->query_length); mysql_bin_log.write(&qinfo); } - send_ok(&thd->net); + send_ok(thd); } for (TABLE_LIST *table=table_list ; table != lock_table ; table=table->next) diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc index 628b1775778..03b840aebf9 100644 --- a/sql/sql_repl.cc +++ b/sql/sql_repl.cc @@ -283,11 +283,11 @@ binlog purge"; break; if (errmsg) { - send_error(&thd->net, 0, errmsg); + send_error(thd, 0, errmsg); return 1; } else - send_ok(&thd->net); + send_ok(thd); return 0; } @@ -372,7 +372,7 @@ impossible position"; We need to start a packet with something other than 255 to distiquish it from error */ - packet->set("\0", 1); + packet->set("\0", 1, system_charset_info); // if we are at the start of the log if (pos == BIN_LOG_HEADER_SIZE) @@ -383,7 +383,7 @@ impossible position"; my_errno= ER_MASTER_FATAL_ERROR_READING_BINLOG; goto err; } - packet->set("\0", 1); + packet->set("\0", 1, system_charset_info); } while (!net->error && net->vio != 0 && !thd->killed) @@ -418,7 +418,7 @@ impossible position"; goto err; } } - packet->set("\0", 1); + packet->set("\0", 1, system_charset_info); } /* TODO: now that we are logging the offset, check to make sure @@ -538,7 +538,7 @@ Increase max_allowed_packet on master"; goto err; } } - packet->set("\0", 1); + packet->set("\0", 1, system_charset_info); /* No need to net_flush because we will get to flush later when we hit EOF pretty quick @@ -593,7 +593,7 @@ Increase max_allowed_packet on master"; end_io_cache(&log); (void)my_close(file, MYF(MY_WME)); - send_eof(&thd->net); + send_eof(thd); thd->proc_info = "waiting to finalize termination"; pthread_mutex_lock(&LOCK_thread_count); thd->current_linfo = 0; @@ -615,15 +615,15 @@ Increase max_allowed_packet on master"; pthread_mutex_unlock(&LOCK_thread_count); if (file >= 0) (void) my_close(file, MYF(MY_WME)); - send_error(&thd->net, my_errno, errmsg); + send_error(thd, my_errno, errmsg); DBUG_VOID_RETURN; } int start_slave(THD* thd , MASTER_INFO* mi, bool net_report) { int slave_errno = 0; - if (!thd) thd = current_thd; - NET* net = &thd->net; + if (!thd) + thd = current_thd; int thread_mask; DBUG_ENTER("start_slave"); @@ -654,20 +654,21 @@ int start_slave(THD* thd , MASTER_INFO* mi, bool net_report) if (slave_errno) { if (net_report) - send_error(net, slave_errno); + send_error(thd, slave_errno); DBUG_RETURN(1); } else if (net_report) - send_ok(net); + send_ok(thd); DBUG_RETURN(0); } + int stop_slave(THD* thd, MASTER_INFO* mi, bool net_report ) { int slave_errno = 0; - if (!thd) thd = current_thd; - NET* net = &thd->net; + if (!thd) + thd = current_thd; if (check_access(thd, SUPER_ACL, any_db)) return 1; @@ -686,11 +687,11 @@ int stop_slave(THD* thd, MASTER_INFO* mi, bool net_report ) if (slave_errno) { if (net_report) - send_error(net, slave_errno); + send_error(thd, slave_errno); return 1; } else if (net_report) - send_ok(net); + send_ok(thd); return 0; } @@ -779,7 +780,7 @@ int change_master(THD* thd, MASTER_INFO* mi) restart_thread_mask, 1 /*skip lock*/))) { - send_error(&thd->net,error); + send_error(thd,error); unlock_slave_threads(mi); DBUG_RETURN(1); } @@ -788,7 +789,7 @@ int change_master(THD* thd, MASTER_INFO* mi) // TODO: see if needs re-write if (init_master_info(mi, master_info_file, relay_log_info_file, 0)) { - send_error(&thd->net, 0, "Could not initialize master info"); + send_error(thd, 0, "Could not initialize master info"); unlock_slave_threads(mi); DBUG_RETURN(1); } @@ -850,7 +851,7 @@ int change_master(THD* thd, MASTER_INFO* mi) 0 /* not only reset, but also reinit */, &errmsg)) { - net_printf(&thd->net, 0, "Failed purging old relay logs: %s",errmsg); + net_printf(thd, 0, "Failed purging old relay logs: %s",errmsg); DBUG_RETURN(1); } } @@ -864,7 +865,7 @@ int change_master(THD* thd, MASTER_INFO* mi) 0 /*no data lock*/, &msg)) { - net_printf(&thd->net,0,"Failed initializing relay log position: %s",msg); + net_printf(thd,0,"Failed initializing relay log position: %s",msg); unlock_slave_threads(mi); DBUG_RETURN(1); } @@ -890,9 +891,9 @@ int change_master(THD* thd, MASTER_INFO* mi) unlock_slave_threads(mi); thd->proc_info = 0; if (error) - send_error(&thd->net,error); + send_error(thd,error); else - send_ok(&thd->net); + send_ok(thd); DBUG_RETURN(0); } @@ -1010,12 +1011,12 @@ err: if (errmsg) { - net_printf(&thd->net, ER_ERROR_WHEN_EXECUTING_COMMAND, + net_printf(thd, ER_ERROR_WHEN_EXECUTING_COMMAND, "SHOW BINLOG EVENTS", errmsg); DBUG_RETURN(1); } - send_eof(&thd->net); + send_eof(thd); DBUG_RETURN(0); } @@ -1045,7 +1046,7 @@ int show_binlog_info(THD* thd) if (my_net_write(&thd->net, (char*)thd->packet.ptr(), packet->length())) DBUG_RETURN(-1); } - send_eof(&thd->net); + send_eof(thd); DBUG_RETURN(0); } @@ -1098,11 +1099,11 @@ int show_binlogs(THD* thd) goto err; } mysql_bin_log.unlock_index(); - send_eof(net); + send_eof(thd); return 0; err_with_msg: - send_error(net, 0, errmsg); + send_error(thd, ER_UNKNOWN_ERROR, errmsg); err: mysql_bin_log.unlock_index(); return 1; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 8a64fbf968c..2b737ab65d7 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -164,13 +164,7 @@ int handle_select(THD *thd, LEX *lex, select_result *result) for (TABLE_LIST *cursor= (TABLE_LIST *)sl->table_list.first; cursor; cursor=cursor->next) - { - if (cursor->do_redirect) // False if CUBE/ROLLUP - { - cursor->do_redirect=false; - cursor->table= ((TABLE_LIST*) cursor->table)->table; - } - } + cursor->table= ((TABLE_LIST*) cursor->table)->table; } } @@ -226,7 +220,7 @@ int JOIN::prepare(TABLE_LIST *tables_init, COND *conds_init, ORDER *order_init, ORDER *group_init, Item *having_init, - ORDER *proc_param_init, SELECT_LEX *select_lex, + ORDER *proc_param_init, SELECT_LEX *select, SELECT_LEX_UNIT *unit) { DBUG_ENTER("JOIN::prepare"); @@ -237,7 +231,8 @@ JOIN::prepare(TABLE_LIST *tables_init, having= having_init; proc_param= proc_param_init; tables_list= tables_init; - select->join= this; + select_lex= select; + select_lex->join= this; union_part= (unit->first_select()->next_select() != 0); /* Check that all tables, fields, conds and order are ok */ @@ -679,16 +674,16 @@ JOIN::exec() result->send_fields(fields_list,1); if (!having || having->val_int()) { - if (do_send_rows && result->send_data(fields_list)) - { - result->send_error(0,NullS); /* purecov: inspected */ - error=1; - } - else - error=(int) result->send_eof(); + if (do_send_rows && result->send_data(fields_list)) + { + result->send_error(0,NullS); /* purecov: inspected */ + error=1; + } + else + error=(int) result->send_eof(); } else - error=(int) result->send_eof(); + error=(int) result->send_eof(); } delete procedure; DBUG_VOID_RETURN; @@ -696,6 +691,7 @@ JOIN::exec() if (zero_result_cause) { + error=0; (void) return_zero_rows(this, result, tables_list, fields_list, tmp_table_param.sum_func_count != 0 && !group_list, @@ -739,7 +735,7 @@ JOIN::exec() thd->proc_info="Creating tmp table"; tmp_table_param.hidden_field_count= (all_fields.elements- - fields.elements); + fields_list.elements); if (!(exec_tmp_table = create_tmp_table(thd, &tmp_table_param, all_fields, ((!simple_group && !procedure && @@ -996,6 +992,8 @@ JOIN::exec() int JOIN::cleanup(THD *thd) { + DBUG_ENTER("JOIN::cleanup"); + lock=0; // It's faster to unlock later join_free(this); if (exec_tmp_table) @@ -1006,6 +1004,7 @@ JOIN::cleanup(THD *thd) for (SELECT_LEX_UNIT *unit= select_lex->first_inner_unit(); unit != 0; unit= unit->next_unit()) + { for (SELECT_LEX *sl= unit->first_select(); sl != 0; sl= sl->next_select()) @@ -1018,7 +1017,8 @@ JOIN::cleanup(THD *thd) sl->join= 0; } } - return error; + } + DBUG_RETURN(error); } int @@ -1044,7 +1044,7 @@ mysql_select(THD *thd, TABLE_LIST *tables, List &fields, COND *conds, goto err; } - if(join->global_optimize()) + if (join->global_optimize()) goto err; join->exec(); @@ -7276,7 +7276,8 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, { KEY *key_info=table->key_info+ tab->ref.key; item_list.push_back(new Item_string(key_info->name, - strlen(key_info->name))); + strlen(key_info->name), + system_charset_info)); item_list.push_back(new Item_int((int32) tab->ref.key_length)); for (store_key **ref=tab->ref.key_copy ; *ref ; ref++) { @@ -7416,5 +7417,5 @@ static void describe_info(JOIN *join, const char *info) packet->length(0); net_store_data(packet,info); if (!my_net_write(&thd->net,(char*) packet->ptr(),packet->length())) - send_eof(&thd->net); + send_eof(thd); } diff --git a/sql/sql_select.h b/sql/sql_select.h index f651f069c13..89dee2a4019 100644 --- a/sql/sql_select.h +++ b/sql/sql_select.h @@ -149,7 +149,8 @@ class TMP_TABLE_PARAM { } }; -class JOIN :public Sql_alloc{ +class JOIN :public Sql_alloc +{ public: JOIN_TAB *join_tab,**best_ref,**map2table; TABLE **table,**all_tables,*sort_by_table; @@ -222,6 +223,7 @@ class JOIN :public Sql_alloc{ !test(select_options & OPTION_FOUND_ROWS)), all_fields(fields), fields_list(fields), + error(0), select(0), exec_tmp_table(0), test_function_query(0), diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 5899fe86024..fb9db707c16 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1,4 +1,4 @@ -/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB +/* Copyright (C) 2000 MySQL AB 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 @@ -76,6 +76,8 @@ mysqld_show_dbs(THD *thd,const char *wild) if (mysql_find_files(thd,&files,NullS,mysql_data_home,wild,1)) DBUG_RETURN(1); List_iterator_fast it(files); + + String *packet= &thd->packet; while ((file_name=it++)) { if (thd->master_access & (DB_ACLS | SHOW_DB_ACL) || @@ -83,19 +85,20 @@ mysqld_show_dbs(THD *thd,const char *wild) thd->priv_user, file_name) || (grant_option && !check_grant_db(thd, file_name))) { - thd->packet.length(0); - net_store_data(&thd->packet, thd->variables.convert_set, file_name); - if (my_net_write(&thd->net, (char*) thd->packet.ptr(), - thd->packet.length())) + packet->length(0); + net_store_data(packet, thd->variables.convert_set, file_name); + if (my_net_write(&thd->net, (char*) packet->ptr(), + packet->length())) DBUG_RETURN(-1); } } - send_eof(&thd->net); + send_eof(thd); DBUG_RETURN(0); } + /*************************************************************************** -** List all open tables in a database + List all open tables in a database ***************************************************************************/ int mysqld_show_open_tables(THD *thd,const char *wild) @@ -116,19 +119,20 @@ int mysqld_show_open_tables(THD *thd,const char *wild) if (!(open_list=list_open_tables(thd,wild)) && thd->fatal_error) DBUG_RETURN(-1); + String *packet= &thd->packet; for (; open_list ; open_list=open_list->next) { - thd->packet.length(0); - net_store_data(&thd->packet,convert, open_list->db); - net_store_data(&thd->packet,convert, open_list->table); - net_store_data(&thd->packet,open_list->in_use); - net_store_data(&thd->packet,open_list->locked); - if (my_net_write(&thd->net,(char*) thd->packet.ptr(),thd->packet.length())) + packet->length(0); + net_store_data(packet,convert, open_list->db); + net_store_data(packet,convert, open_list->table); + net_store_data(packet,open_list->in_use); + net_store_data(packet,open_list->locked); + if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length())) { DBUG_RETURN(-1); } } - send_eof(&thd->net); + send_eof(thd); DBUG_RETURN(0); } @@ -160,14 +164,15 @@ int mysqld_show_tables(THD *thd,const char *db,const char *wild) if (mysql_find_files(thd,&files,db,path,wild,0)) DBUG_RETURN(-1); List_iterator_fast it(files); + String *packet= &thd->packet; while ((file_name=it++)) { - thd->packet.length(0); - net_store_data(&thd->packet, thd->variables.convert_set, file_name); - if (my_net_write(&thd->net,(char*) thd->packet.ptr(),thd->packet.length())) + packet->length(0); + net_store_data(packet, thd->variables.convert_set, file_name); + if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length())) DBUG_RETURN(-1); } - send_eof(&thd->net); + send_eof(thd); DBUG_RETURN(0); } @@ -175,15 +180,33 @@ int mysqld_show_tables(THD *thd,const char *db,const char *wild) ** List all table types supported ***************************************************************************/ -static struct show_table_type_st sys_table_types[]= { - {"MyISAM", (char *)"YES", "Default type from 3.23 with great performance"}, - {"HEAP" , (char *)"YES", "Hash based, stored in memory, useful for temporary tables"}, - {"MERGE", (char *)"YES", "Collection of identical MyISAM tables"}, - {"ISAM", (char*) &have_isam,"Obsolete table type"}, - {"InnoDB", (char*) &have_innodb,"Supports transactions, row-level locking and foreign keys"}, - {"BDB", (char*) &have_berkeley_db, "Supports transactions and page-level locking"}, +struct show_table_type_st { + const char *type; + SHOW_COMP_OPTION *value; + const char *comment; +}; + + +SHOW_COMP_OPTION have_yes= SHOW_OPTION_YES; + +static struct show_table_type_st sys_table_types[]= +{ + {"MyISAM", &have_yes, + "Default type from 3.23 with great performance"}, + {"HEAP" , &have_yes, + "Hash based, stored in memory, useful for temporary tables"}, + {"MERGE", &have_yes, + "Collection of identical MyISAM tables"}, + {"ISAM", &have_isam, + "Obsolete table type; Is replaced by MyISAM"}, + {"InnoDB", &have_innodb, + "Supports transactions, row-level locking and foreign keys"}, + {"BDB", &have_berkeley_db, + "Supports transactions and page-level locking"}, + {NullS, NULL, NullS} }; + int mysqld_show_table_types(THD *thd) { List field_list; @@ -191,76 +214,68 @@ int mysqld_show_table_types(THD *thd) field_list.push_back(new Item_empty_string("Type",10)); field_list.push_back(new Item_empty_string("Support",10)); - field_list.push_back(new Item_empty_string("Comment",NAME_LEN)); + field_list.push_back(new Item_empty_string("Comment",80)); if (send_fields(thd,field_list,1)) DBUG_RETURN(1); - const char *default_type_name=ha_table_typelib.type_names[default_table_type-1]; - show_table_type_st *types = sys_table_types; - - uint i; - for (i = 0; i < 3; i++) - { - thd->packet.length(0); - net_store_data(&thd->packet,types[i].type); - if (!strcasecmp(default_type_name,types[i].type)) - net_store_data(&thd->packet,"DEFAULT"); - else - net_store_data(&thd->packet,types[i].value); - net_store_data(&thd->packet,types[i].comment); - if (my_net_write(&thd->net,(char*) thd->packet.ptr(),thd->packet.length())) - DBUG_RETURN(-1); - } + const char *default_type_name= ha_table_typelib.type_names[thd->variables.table_type]; - for (; i < sizeof(sys_table_types)/sizeof(sys_table_types[0]); i++) + show_table_type_st *types; + String *packet= &thd->packet; + for (types= sys_table_types; types->type; types++) { - thd->packet.length(0); - net_store_data(&thd->packet,types[i].type); - SHOW_COMP_OPTION tmp= *(SHOW_COMP_OPTION*) types[i].value; - - if (tmp == SHOW_OPTION_NO) - net_store_data(&thd->packet,"NO"); - else - { - if (tmp == SHOW_OPTION_YES) - { - if (!strcasecmp(default_type_name,types[i].type)) - net_store_data(&thd->packet,"DEFAULT"); - else - net_store_data(&thd->packet,"YES"); - } - else net_store_data(&thd->packet,"DISABLED"); - } - net_store_data(&thd->packet,types[i].comment); - if (my_net_write(&thd->net,(char*) thd->packet.ptr(),thd->packet.length())) + packet->length(0); + net_store_data(packet, types->type); + const char *option_name= show_comp_option_name[(int) *types->value]; + + if (*types->value == SHOW_OPTION_YES && + !strcasecmp(default_type_name, types->type)) + option_name= "DEFAULT"; + net_store_data(packet, option_name); + net_store_data(packet, types->comment); + if (my_net_write(&thd->net, (char*) packet->ptr(), packet->length())) DBUG_RETURN(-1); } - send_eof(&thd->net); + send_eof(thd); DBUG_RETURN(0); } + /*************************************************************************** -** List all privileges supported + List all privileges supported ***************************************************************************/ -static struct show_table_type_st sys_privileges[]= { - {"Select", (char *)"Tables", "To retrieve rows from table"}, - {"Insert", (char *)"Tables", "To insert data into tables"}, - {"Update", (char *)"Tables", "To update existing rows "}, - {"Delete", (char *)"Tables", "To delete existing rows"}, - {"Index", (char *)"Tables", "To create or drop indexes"}, - {"Alter", (char *)"Tables", "To alter the table"}, - {"Create", (char *)"Databases,Tables,Indexes", "To create new databases and tables"}, - {"Drop", (char *)"Databases,Tables", "To drop databases and tables"}, - {"Grant", (char *)"Databases,Tables", "To give to other users those privileges you possesed"}, - {"References", (char *)"Databases,Tables", "To have references on tables"}, - {"Reload", (char *)"Server Admin", "To reload or refresh tables, logs and privileges"}, - {"Shutdown",(char *)"Server Admin", "To shutdown the server"}, - {"Process", (char *)"Server Admin", "To view the plain text of currently executing queries"}, - {"File", (char *)"File access on server", "To read and write files on the server"}, +struct show_privileges_st { + const char *privilege; + const char *context; + const char *comment; }; + +/* + TODO: Update with new privileges +*/ +static struct show_privileges_st sys_privileges[]= +{ + {"Select", "Tables", "To retrieve rows from table"}, + {"Insert", "Tables", "To insert data into tables"}, + {"Update", "Tables", "To update existing rows "}, + {"Delete", "Tables", "To delete existing rows"}, + {"Index", "Tables", "To create or drop indexes"}, + {"Alter", "Tables", "To alter the table"}, + {"Create", "Databases,Tables,Indexes", "To create new databases and tables"}, + {"Drop", "Databases,Tables", "To drop databases and tables"}, + {"Grant", "Databases,Tables", "To give to other users those privileges you possess"}, + {"References", "Databases,Tables", "To have references on tables"}, + {"Reload", "Server Admin", "To reload or refresh tables, logs and privileges"}, + {"Shutdown","Server Admin", "To shutdown the server"}, + {"Process", "Server Admin", "To view the plain text of currently executing queries"}, + {"File", "File access on server", "To read and write files on the server"}, + {NullS, NullS, NullS} +}; + + int mysqld_show_privileges(THD *thd) { List field_list; @@ -273,43 +288,48 @@ int mysqld_show_privileges(THD *thd) if (send_fields(thd,field_list,1)) DBUG_RETURN(1); - for (uint i=0; i < sizeof(sys_privileges)/sizeof(sys_privileges[0]); i++) + show_privileges_st *privilege= sys_privileges; + String *packet= &thd->packet; + for (privilege= sys_privileges; privilege->privilege ; privilege++) { - thd->packet.length(0); - net_store_data(&thd->packet,sys_privileges[i].type); - net_store_data(&thd->packet,sys_privileges[i].value); - net_store_data(&thd->packet,sys_privileges[i].comment); - if (my_net_write(&thd->net,(char*) thd->packet.ptr(),thd->packet.length())) + packet->length(0); + net_store_data(packet,privilege->privilege); + net_store_data(packet,privilege->context); + net_store_data(packet,privilege->comment); + if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length())) DBUG_RETURN(-1); } - send_eof(&thd->net); + send_eof(thd); DBUG_RETURN(0); } /*************************************************************************** -** List all column types + List all column types ***************************************************************************/ -#if 0 -struct show_column_type_st { +struct show_column_type_st +{ const char *type; uint size; - char *min_value; - char *max_value; - uint precision, - uint scale, - char *nullable; - char *auto_increment; - char *unsigned_attr; - char *zerofill; - char *searchable; - char *case_sensitivity; - char *default_value; - char *comment; + const char *min_value; + const char *max_value; + uint precision; + uint scale; + const char *nullable; + const char *auto_increment; + const char *unsigned_attr; + const char *zerofill; + const char *searchable; + const char *case_sensitivity; + const char *default_value; + const char *comment; }; -#endif -static struct show_column_type_st sys_column_types[]= { + +/* TODO: Add remaning types */ + +static struct show_column_type_st sys_column_types[]= +{ {"tinyint", 1, "-128", "127", 0, 0, "YES", "YES", "NO", "YES", "YES", "NO", "NULL,0", @@ -343,30 +363,33 @@ int mysqld_show_column_types(THD *thd) if (send_fields(thd,field_list,1)) DBUG_RETURN(1); + /* TODO: Change the loop to not use 'i' */ + String *packet= &thd->packet; for (uint i=0; i < sizeof(sys_column_types)/sizeof(sys_column_types[0]); i++) { - thd->packet.length(0); - net_store_data(&thd->packet,sys_column_types[i].type); - net_store_data(&thd->packet,(longlong)sys_column_types[i].size); - net_store_data(&thd->packet,sys_column_types[i].min_value); - net_store_data(&thd->packet,sys_column_types[i].max_value); - net_store_data(&thd->packet,(uint32)sys_column_types[i].precision); - net_store_data(&thd->packet,(uint32)sys_column_types[i].scale); - net_store_data(&thd->packet,sys_column_types[i].nullable); - net_store_data(&thd->packet,sys_column_types[i].auto_increment); - net_store_data(&thd->packet,sys_column_types[i].unsigned_attr); - net_store_data(&thd->packet,sys_column_types[i].zerofill); - net_store_data(&thd->packet,sys_column_types[i].searchable); - net_store_data(&thd->packet,sys_column_types[i].case_sensitivity); - net_store_data(&thd->packet,sys_column_types[i].default_value); - net_store_data(&thd->packet,sys_column_types[i].comment); - if (my_net_write(&thd->net,(char*) thd->packet.ptr(),thd->packet.length())) + packet->length(0); + net_store_data(packet,sys_column_types[i].type); + net_store_data(packet,(longlong)sys_column_types[i].size); + net_store_data(packet,sys_column_types[i].min_value); + net_store_data(packet,sys_column_types[i].max_value); + net_store_data(packet,(uint32)sys_column_types[i].precision); + net_store_data(packet,(uint32)sys_column_types[i].scale); + net_store_data(packet,sys_column_types[i].nullable); + net_store_data(packet,sys_column_types[i].auto_increment); + net_store_data(packet,sys_column_types[i].unsigned_attr); + net_store_data(packet,sys_column_types[i].zerofill); + net_store_data(packet,sys_column_types[i].searchable); + net_store_data(packet,sys_column_types[i].case_sensitivity); + net_store_data(packet,sys_column_types[i].default_value); + net_store_data(packet,sys_column_types[i].comment); + if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length())) DBUG_RETURN(-1); } - send_eof(&thd->net); + send_eof(thd); DBUG_RETURN(0); } + static int mysql_find_files(THD *thd,List *files, const char *db,const char *path, const char *wild, bool dir) @@ -441,8 +464,9 @@ mysql_find_files(THD *thd,List *files, const char *db,const char *path, DBUG_RETURN(0); } + /*************************************************************************** -** Extended version of mysqld_show_tables + Extended version of mysqld_show_tables ***************************************************************************/ int mysqld_extend_show_tables(THD *thd,const char *db,const char *wild) @@ -459,7 +483,6 @@ int mysqld_extend_show_tables(THD *thd,const char *db,const char *wild) (void) sprintf(path,"%s/%s",mysql_data_home,db); (void) unpack_dirname(path,path); -//,default_charset_info field_list.push_back(item=new Item_empty_string("Name",NAME_LEN)); item->maybe_null=1; field_list.push_back(item=new Item_empty_string("Type",10)); @@ -612,14 +635,13 @@ int mysqld_extend_show_tables(THD *thd,const char *db,const char *wild) packet->length())) DBUG_RETURN(-1); } - send_eof(&thd->net); + send_eof(thd); DBUG_RETURN(0); } - /*************************************************************************** -** List all columns in a table + List all columns in a table ***************************************************************************/ int @@ -637,7 +659,7 @@ mysqld_show_fields(THD *thd, TABLE_LIST *table_list,const char *wild, if (!(table = open_ltable(thd, table_list, TL_UNLOCK))) { - send_error(&thd->net); + send_error(thd); DBUG_RETURN(1); } file=table->file; @@ -742,10 +764,11 @@ mysqld_show_fields(THD *thd, TABLE_LIST *table_list,const char *wild, } } } - send_eof(&thd->net); + send_eof(thd); DBUG_RETURN(0); } + int mysqld_show_create(THD *thd, TABLE_LIST *table_list) { @@ -758,7 +781,7 @@ mysqld_show_create(THD *thd, TABLE_LIST *table_list) /* Only one table for now */ if (!(table = open_ltable(thd, table_list, TL_UNLOCK))) { - send_error(&thd->net); + send_error(thd); DBUG_RETURN(1); } @@ -809,7 +832,7 @@ mysqld_show_create(THD *thd, TABLE_LIST *table_list) if (my_net_write(&thd->net, (char*)packet->ptr(), packet->length())) DBUG_RETURN(1); } - send_eof(&thd->net); + send_eof(thd); DBUG_RETURN(0); } @@ -832,7 +855,7 @@ mysqld_show_logs(THD *thd) DBUG_RETURN(-1); #endif - send_eof(&thd->net); + send_eof(thd); DBUG_RETURN(0); } @@ -849,7 +872,7 @@ mysqld_show_keys(THD *thd, TABLE_LIST *table_list) if (!(table = open_ltable(thd, table_list, TL_UNLOCK))) { - send_error(&thd->net); + send_error(thd); DBUG_RETURN(1); } @@ -933,14 +956,14 @@ mysqld_show_keys(THD *thd, TABLE_LIST *table_list) DBUG_RETURN(1); /* purecov: inspected */ } } - send_eof(&thd->net); + send_eof(thd); DBUG_RETURN(0); } /**************************************************************************** -** Return only fields for API mysql_list_fields -** Use "show table wildcard" in mysql instead of this + Return only fields for API mysql_list_fields + Use "show table wildcard" in mysql instead of this ****************************************************************************/ void @@ -952,7 +975,7 @@ mysqld_list_fields(THD *thd, TABLE_LIST *table_list, const char *wild) if (!(table = open_ltable(thd, table_list, TL_UNLOCK))) { - send_error(&thd->net); + send_error(thd); DBUG_VOID_RETURN; } List field_list; @@ -971,6 +994,7 @@ mysqld_list_fields(THD *thd, TABLE_LIST *table_list, const char *wild) DBUG_VOID_RETURN; } + int mysqld_dump_create_info(THD *thd, TABLE *table, int fd) { @@ -978,7 +1002,7 @@ mysqld_dump_create_info(THD *thd, TABLE *table, int fd) DBUG_ENTER("mysqld_dump_create_info"); DBUG_PRINT("enter",("table: %s",table->real_name)); - String* packet = &thd->packet; + String *packet = &thd->packet; packet->length(0); if (store_create_info(thd,table,packet)) DBUG_RETURN(-1); @@ -1000,6 +1024,7 @@ mysqld_dump_create_info(THD *thd, TABLE *table, int fd) DBUG_RETURN(0); } + static void append_identifier(THD *thd, String *packet, const char *name) { @@ -1015,6 +1040,7 @@ append_identifier(THD *thd, String *packet, const char *name) } } + static int store_create_info(THD *thd, TABLE *table, String *packet) { @@ -1215,8 +1241,8 @@ store_create_info(THD *thd, TABLE *table, String *packet) /**************************************************************************** -** Return info about all processes -** returns for each thread: thread id, user, host, db, command, info + Return info about all processes + returns for each thread: thread id, user, host, db, command, info ****************************************************************************/ class thread_info :public ilink { @@ -1357,7 +1383,7 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose) if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length())) break; /* purecov: inspected */ } - send_eof(&thd->net); + send_eof(thd); DBUG_VOID_RETURN; } @@ -1372,7 +1398,7 @@ int mysqld_show_charsets(THD *thd, const char *wild) char buff[8192]; String packet2(buff,sizeof(buff),default_charset_info); List field_list; - CONVERT *convert=thd->convert_set; + CONVERT *convert=thd->variables.convert_set; CHARSET_INFO *cs; DBUG_ENTER("mysqld_show_charsets"); @@ -1401,7 +1427,7 @@ int mysqld_show_charsets(THD *thd, const char *wild) goto err; } } - send_eof(&thd->net); + send_eof(thd); DBUG_RETURN(0); err: DBUG_RETURN(1); @@ -1428,7 +1454,7 @@ int mysqld_show(THD *thd, const char *wild, show_var_st *variables, for (; variables->name; variables++) { if (!(wild && wild[0] && wild_case_compare(system_charset_info, - variables[i].name,wild))) + variables->name,wild))) { packet2.length(0); net_store_data(&packet2,convert,variables->name); @@ -1461,9 +1487,7 @@ int mysqld_show(THD *thd, const char *wild, show_var_st *variables, case SHOW_HAVE: { SHOW_COMP_OPTION tmp= *(SHOW_COMP_OPTION*) value; - net_store_data(&packet2, (tmp == SHOW_OPTION_NO ? "NO" : - tmp == SHOW_OPTION_YES ? "YES" : - "DISABLED")); + net_store_data(&packet2, show_comp_option_name[(int) tmp]); break; } case SHOW_CHAR: @@ -1663,7 +1687,7 @@ int mysqld_show(THD *thd, const char *wild, show_var_st *variables, } pthread_mutex_unlock(&LOCK_status); /* pthread_mutex_unlock(&THR_LOCK_keycache); */ - send_eof(&thd->net); + send_eof(thd); DBUG_RETURN(0); err: diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 6b24999763b..fb0815a1a26 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -82,7 +82,7 @@ int mysql_rm_table(THD *thd,TABLE_LIST *tables, my_bool if_exists) if (error) DBUG_RETURN(-1); - send_ok(&thd->net); + send_ok(thd); DBUG_RETURN(0); } @@ -305,8 +305,7 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, DBUG_RETURN(-1); } - - for(field_no=0; (sql_field=it++) ; field_no++) + for (field_no=0; (sql_field=it++) ; field_no++) { /* Don't pack keys in old tables if the user has requested this */ if ((sql_field->flags & BLOB_FLAG) || @@ -317,28 +316,35 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, } if (!(sql_field->flags & NOT_NULL_FLAG)) null_fields++; - for(dup_no=0; (dup_field=it2++) != sql_field; dup_no++) + + /* Check if we have used the same field name before */ + for (dup_no=0; (dup_field=it2++) != sql_field; dup_no++) { if (my_strcasecmp(system_charset_info, sql_field->field_name, dup_field->field_name) == 0) { - if (field_no=select_field_pos) + /* + If this was a CREATE ... SELECT statement, accept a field + redefinition if we are changing a field in the SELECT part + */ + if (field_no < select_field_pos || dup_no >= select_field_pos) { my_error(ER_DUP_FIELDNAME,MYF(0),sql_field->field_name); DBUG_RETURN(-1); } else { - sql_field->length=dup_field->length; - sql_field->decimals=dup_field->decimals; - sql_field->flags=dup_field->flags; - sql_field->pack_length=dup_field->pack_length; - sql_field->unireg_check=dup_field->unireg_check; - sql_field->sql_type=dup_field->sql_type; - it2.remove(); - select_field_pos--; - break; + /* Field redefined */ + sql_field->length= dup_field->length; + sql_field->decimals= dup_field->decimals; + sql_field->flags= dup_field->flags; + sql_field->pack_length= dup_field->pack_length; + sql_field->unireg_check= dup_field->unireg_check; + sql_field->sql_type= dup_field->sql_type; + it2.remove(); // Remove first (create) definition + select_field_pos--; + break; } } } @@ -749,7 +755,7 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, create_info->create_statement = thd->query; create_info->table_options=db_options; - if (rea_create_table(path, create_info, fields, key_count, + if (rea_create_table(thd, path, create_info, fields, key_count, key_info_buffer)) { /* my_error(ER_CANT_CREATE_TABLE,MYF(0),table_name,my_errno); */ @@ -825,7 +831,7 @@ TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info, TABLE tmp_table; // Used during 'create_field()' TABLE *table; tmp_table.table_name=0; - uint select_field_count=0; + uint select_field_count= items->elements; DBUG_ENTER("create_table_from_items"); /* Add selected items to field list */ @@ -859,7 +865,6 @@ TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info, (Field*) 0)))) DBUG_RETURN(0); extra_fields->push_back(cr_field); - select_field_count++; } /* create and lock table */ /* QQ: This should be done atomic ! */ @@ -1271,7 +1276,7 @@ static int mysql_admin_table(THD* thd, TABLE_LIST* tables, goto err; } - send_eof(&thd->net); + send_eof(thd); DBUG_RETURN(0); err: close_thread_tables(thd); // Shouldn't be needed @@ -1476,7 +1481,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, Query_log_event qinfo(thd, thd->query, thd->query_length); mysql_bin_log.write(&qinfo); } - send_ok(&thd->net); + send_ok(thd); } DBUG_RETURN(error); } @@ -1994,7 +1999,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, end_temporary: sprintf(tmp_name,ER(ER_INSERT_INFO),(ulong) (copied+deleted), (ulong) deleted, thd->cuted_fields); - send_ok(&thd->net,copied+deleted,0L,tmp_name); + send_ok(thd,copied+deleted,0L,tmp_name); thd->some_tables_deleted=0; DBUG_RETURN(0); diff --git a/sql/sql_udf.cc b/sql/sql_udf.cc index 225c0ea26a4..893f0838a7f 100644 --- a/sql/sql_udf.cc +++ b/sql/sql_udf.cc @@ -342,7 +342,7 @@ int mysql_create_function(THD *thd,udf_func *udf) if (!initialized) { - send_error(&thd->net, ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES)); + send_error(thd, ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES)); DBUG_RETURN(1); } @@ -353,19 +353,19 @@ int mysql_create_function(THD *thd,udf_func *udf) */ if (strchr(udf->dl, '/')) { - send_error(&thd->net, ER_UDF_NO_PATHS,ER(ER_UDF_NO_PATHS)); + send_error(thd, ER_UDF_NO_PATHS,ER(ER_UDF_NO_PATHS)); DBUG_RETURN(1); } if (udf->name_length > NAME_LEN) { - net_printf(&thd->net, ER_TOO_LONG_IDENT,udf->name); + net_printf(thd, ER_TOO_LONG_IDENT,udf->name); DBUG_RETURN(1); } pthread_mutex_lock(&THR_LOCK_udf); if (hash_search(&udf_hash,(byte*) udf->name, udf->name_length)) { - net_printf(&thd->net, ER_UDF_EXISTS, udf->name); + net_printf(thd, ER_UDF_EXISTS, udf->name); goto err; } if (!(dl = find_udf_dl(udf->dl))) @@ -374,7 +374,7 @@ int mysql_create_function(THD *thd,udf_func *udf) { DBUG_PRINT("error",("dlopen of %s failed, error: %d (%s)", udf->dl,errno,dlerror())); - net_printf(&thd->net, ER_CANT_OPEN_LIBRARY, udf->dl, errno, dlerror()); + net_printf(thd, ER_CANT_OPEN_LIBRARY, udf->dl, errno, dlerror()); goto err; } new_dl=1; @@ -384,7 +384,7 @@ int mysql_create_function(THD *thd,udf_func *udf) if (udf->func == NULL) { - net_printf(&thd->net, ER_CANT_FIND_DL_ENTRY, udf->name); + net_printf(thd, ER_CANT_FIND_DL_ENTRY, udf->name); goto err; } udf->name=strdup_root(&mem,udf->name); @@ -392,7 +392,7 @@ int mysql_create_function(THD *thd,udf_func *udf) if (!udf->name || !udf->dl || !(u_d=add_udf(udf->name,udf->returns,udf->dl,udf->type))) { - send_error(&thd->net,0); // End of memory + send_error(thd,0); // End of memory goto err; } u_d->dlhandle = dl; @@ -422,7 +422,7 @@ int mysql_create_function(THD *thd,udf_func *udf) close_thread_tables(thd); if (error) { - net_printf(&thd->net, ER_ERROR_ON_WRITE, "func@mysql",error); + net_printf(thd, ER_ERROR_ON_WRITE, "func@mysql",error); del_udf(u_d); goto err; } @@ -445,13 +445,13 @@ int mysql_drop_function(THD *thd,const char *udf_name) DBUG_ENTER("mysql_drop_function"); if (!initialized) { - send_error(&thd->net, ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES)); + send_error(thd, ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES)); DBUG_RETURN(1); } pthread_mutex_lock(&THR_LOCK_udf); if (!(udf=(udf_func*) hash_search(&udf_hash,(byte*) udf_name, (uint) strlen(udf_name)))) { - net_printf(&thd->net, ER_FUNCTION_NOT_DEFINED, udf_name); + net_printf(thd, ER_FUNCTION_NOT_DEFINED, udf_name); goto err; } del_udf(udf); diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 51f278536de..8244384cc94 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -242,7 +242,7 @@ bool select_union::flush() if ((error=table->file->extra(HA_EXTRA_NO_CACHE))) { table->file->print_error(error,MYF(0)); - ::send_error(&thd->net); + ::send_error(thd); return 1; } return 0; diff --git a/sql/sql_update.cc b/sql/sql_update.cc index f0ca5ad6c7b..ccd4439a9d2 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -127,7 +127,7 @@ int mysql_update(THD *thd, { DBUG_RETURN(-1); // Error in where } - send_ok(&thd->net); // No matching records + send_ok(thd); // No matching records DBUG_RETURN(0); } /* If running in safe sql mode, don't allow updates without keys */ @@ -138,7 +138,7 @@ int mysql_update(THD *thd, { delete select; table->time_stamp=save_time_stamp; - send_error(&thd->net,ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE); + send_error(thd,ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE); DBUG_RETURN(1); } } @@ -329,13 +329,13 @@ int mysql_update(THD *thd, delete select; if (error >= 0) - send_error(&thd->net,thd->killed ? ER_SERVER_SHUTDOWN : 0); /* purecov: inspected */ + send_error(thd,thd->killed ? ER_SERVER_SHUTDOWN : 0); /* purecov: inspected */ else { char buff[80]; sprintf(buff,ER(ER_UPDATE_INFO), (long) found, (long) updated, (long) thd->cuted_fields); - send_ok(&thd->net, + send_ok(thd, (thd->client_capabilities & CLIENT_FOUND_ROWS) ? found : updated, thd->insert_id_used ? thd->insert_id() : 0L,buff); DBUG_PRINT("info",("%d records updated",updated)); @@ -439,7 +439,7 @@ multi_update::prepare(List &values, SELECT_LEX_UNIT *u) } if (!table_ref) { - net_printf(&thd->net, ER_NOT_SUPPORTED_YET, "JOIN SYNTAX WITH MULTI-TABLE UPDATES"); + net_printf(thd, ER_NOT_SUPPORTED_YET, "JOIN SYNTAX WITH MULTI-TABLE UPDATES"); DBUG_RETURN(1); } else @@ -447,7 +447,7 @@ multi_update::prepare(List &values, SELECT_LEX_UNIT *u) } if (!num_updated) { - net_printf(&thd->net, ER_NOT_SUPPORTED_YET, "SET CLAUSE MUST CONTAIN TABLE.FIELD REFERENCE"); + net_printf(thd, ER_NOT_SUPPORTED_YET, "SET CLAUSE MUST CONTAIN TABLE.FIELD REFERENCE"); DBUG_RETURN(1); } @@ -662,7 +662,7 @@ bool multi_update::send_data(List &values) void multi_update::send_error(uint errcode,const char *err) { /* First send error what ever it is ... */ - ::send_error(&thd->net,errcode,err); + ::send_error(thd,errcode,err); /* reset used flags */ // update_tables->table->no_keyread=0; @@ -821,7 +821,7 @@ bool multi_update::send_eof() { query_cache_invalidate3(thd, update_tables, 1); } - ::send_ok(&thd->net, + ::send_ok(thd, (thd->client_capabilities & CLIENT_FOUND_ROWS) ? found : updated, thd->insert_id_used ? thd->insert_id() : 0L,buff); } diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 8571cb9af6d..d9662f25c1b 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -26,6 +26,7 @@ #include "slave.h" #include "sql_acl.h" #include "lex_symbol.h" +#include "item_create.h" #include #include @@ -356,9 +357,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token COMPRESSED_SYM %token ERRORS -%token SQL_ERROR_COUNT %token WARNINGS -%token SQL_WARNING_COUNT %token BIGINT %token BLOB_SYM @@ -642,7 +641,7 @@ query: if (!thd->bootstrap && (!(thd->lex.select_lex.options & OPTION_FOUND_COMMENT))) { - send_error(¤t_thd->net,ER_EMPTY_QUERY); + send_error(current_thd,ER_EMPTY_QUERY); YYABORT; } else @@ -1128,7 +1127,7 @@ charset: { if (!(Lex->charset=get_charset_by_name($1.str,MYF(0)))) { - net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$1.str); + net_printf(current_thd,ER_UNKNOWN_CHARACTER_SET,$1.str); YYABORT; } }; @@ -1690,7 +1689,7 @@ expr_expr: { if (!(Lex->charset=get_charset_by_name($3.str,MYF(0)))) { - net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$3.str); + net_printf(current_thd,ER_UNKNOWN_CHARACTER_SET,$3.str); YYABORT; } $$= new Item_func_set_collation($1,Lex->charset); @@ -1921,9 +1920,8 @@ simple_expr: { $$= new Item_func_interval($3,* $5); } | LAST_INSERT_ID '(' ')' { - $$= new Item_int((char*) "last_insert_id()", - current_thd->insert_id(),21); - current_thd->safe_to_cache_query=0; + $$= get_system_var(OPT_SESSION, "last_insert_id", 14, + "last_insert_id()"); } | LAST_INSERT_ID '(' expr ')' { @@ -2409,7 +2407,7 @@ olap_opt: LEX *lex=Lex; lex->olap = true; lex->select->olap= CUBE_TYPE; - net_printf(&lex->thd->net, ER_NOT_SUPPORTED_YET, "CUBE"); + net_printf(lex->thd, ER_NOT_SUPPORTED_YET, "CUBE"); YYABORT; /* To be deleted in 4.1 */ } | WITH ROLLUP_SYM @@ -2417,7 +2415,7 @@ olap_opt: LEX *lex=Lex; lex->olap = true; lex->select->olap= ROLLUP_TYPE; - net_printf(&lex->thd->net, ER_NOT_SUPPORTED_YET, "ROLLUP"); + net_printf(lex->thd, ER_NOT_SUPPORTED_YET, "ROLLUP"); YYABORT; /* To be deleted in 4.1 */ } ; @@ -2436,12 +2434,12 @@ order_clause: LEX *lex=Lex; if (lex->sql_command == SQLCOM_MULTI_UPDATE) { - net_printf(&lex->thd->net, ER_WRONG_USAGE, "UPDATE", "ORDER BY"); + net_printf(lex->thd, ER_WRONG_USAGE, "UPDATE", "ORDER BY"); YYABORT; } if (lex->select->olap != UNSPECIFIED_OLAP_TYPE) { - net_printf(&lex->thd->net, ER_WRONG_USAGE, + net_printf(lex->thd, ER_WRONG_USAGE, "CUBE/ROLLUP", "ORDER BY"); YYABORT; @@ -2467,7 +2465,7 @@ limit_clause: LEX *lex=Lex; if (lex->select->olap != UNSPECIFIED_OLAP_TYPE) { - net_printf(&lex->thd->net, ER_WRONG_USAGE, "CUBE/ROLLUP", + net_printf(lex->thd, ER_WRONG_USAGE, "CUBE/ROLLUP", "LIMIT"); YYABORT; } @@ -2480,7 +2478,7 @@ limit_clause: LEX *lex=Lex; if (lex->select->olap != UNSPECIFIED_OLAP_TYPE) { - net_printf(&lex->thd->net, ER_WRONG_USAGE, "CUBE/ROLLUP", + net_printf(lex->thd, ER_WRONG_USAGE, "CUBE/ROLLUP", "LIMIT"); YYABORT; } @@ -2495,7 +2493,7 @@ delete_limit_clause: LEX *lex=Lex; if (lex->sql_command == SQLCOM_MULTI_UPDATE) { - net_printf(&lex->thd->net, ER_WRONG_USAGE, "DELETE", "LIMIT"); + net_printf(lex->thd, ER_WRONG_USAGE, "DELETE", "LIMIT"); YYABORT; } lex->select->select_limit= HA_POS_ERROR; @@ -2935,9 +2933,9 @@ show_param: lex->sql_command= SQLCOM_SHOW_PRIVILEGES; } | COUNT_SYM '(' '*' ')' WARNINGS - { Lex->sql_command = SQLCOM_SHOW_WARNS_COUNT;} + { (void) create_select_for_variable("warning_count"); } | COUNT_SYM '(' '*' ')' ERRORS - { Lex->sql_command = SQLCOM_SHOW_ERRORS_COUNT;} + { (void) create_select_for_variable("error_count"); } | WARNINGS {Select->offset_limit=0L;} limit_clause { Lex->sql_command = SQLCOM_SHOW_WARNS;} | ERRORS {Select->offset_limit=0L;} limit_clause @@ -3103,7 +3101,7 @@ kill: LEX *lex=Lex; if ($2->fix_fields(lex->thd, 0, &$2)) { - send_error(&lex->thd->net, ER_SET_CONSTANTS_ONLY); + send_error(lex->thd, ER_SET_CONSTANTS_ONLY); YYABORT; } lex->sql_command=SQLCOM_KILL; @@ -3218,10 +3216,11 @@ text_string: param_marker: '?' { - if(current_thd->prepare_command) + LEX *lex=Lex; + if (current_thd->prepare_command) { - Lex->param_list.push_back($$=new Item_param()); - current_thd->param_count++; + lex->param_list.push_back($$=new Item_param()); + lex->param_count++; } else { @@ -3602,8 +3601,8 @@ text_or_password: set_expr_or_default: expr { $$=$1; } | DEFAULT { $$=0; } - | ON { $$=new Item_string("ON",2); } - | ALL { $$=new Item_string("ALL",3); } + | ON { $$=new Item_string("ON", 2, system_charset_info); } + | ALL { $$=new Item_string("ALL", 3, system_charset_info); } ; @@ -3769,7 +3768,7 @@ require_list_element: SUBJECT_SYM TEXT_STRING LEX *lex=Lex; if (lex->x509_subject) { - net_printf(&lex->thd->net,ER_DUP_ARGUMENT, "SUBJECT"); + net_printf(lex->thd,ER_DUP_ARGUMENT, "SUBJECT"); YYABORT; } lex->x509_subject=$2.str; @@ -3779,7 +3778,7 @@ require_list_element: SUBJECT_SYM TEXT_STRING LEX *lex=Lex; if (lex->x509_issuer) { - net_printf(&lex->thd->net,ER_DUP_ARGUMENT, "ISSUER"); + net_printf(lex->thd,ER_DUP_ARGUMENT, "ISSUER"); YYABORT; } lex->x509_issuer=$2.str; @@ -3789,7 +3788,7 @@ require_list_element: SUBJECT_SYM TEXT_STRING LEX *lex=Lex; if (lex->ssl_cipher) { - net_printf(&lex->thd->net,ER_DUP_ARGUMENT, "CIPHER"); + net_printf(lex->thd,ER_DUP_ARGUMENT, "CIPHER"); YYABORT; } lex->ssl_cipher=$2.str; @@ -3805,7 +3804,7 @@ opt_table: lex->grant = DB_ACLS & ~GRANT_ACL; else if (lex->columns.elements) { - send_error(&lex->thd->net,ER_ILLEGAL_GRANT_FOR_TABLE); + send_error(lex->thd,ER_ILLEGAL_GRANT_FOR_TABLE); YYABORT; } } @@ -3817,7 +3816,7 @@ opt_table: lex->grant = DB_ACLS & ~GRANT_ACL; else if (lex->columns.elements) { - send_error(&lex->thd->net,ER_ILLEGAL_GRANT_FOR_TABLE); + send_error(lex->thd,ER_ILLEGAL_GRANT_FOR_TABLE); YYABORT; } } @@ -3829,7 +3828,7 @@ opt_table: lex->grant= GLOBAL_ACLS & ~GRANT_ACL; else if (lex->columns.elements) { - send_error(&lex->thd->net,ER_ILLEGAL_GRANT_FOR_TABLE); + send_error(lex->thd,ER_ILLEGAL_GRANT_FOR_TABLE); YYABORT; } } @@ -3977,15 +3976,15 @@ union_list: if (lex->exchange) { /* Only the last SELECT can have INTO...... */ - net_printf(&lex->thd->net, ER_WRONG_USAGE, "UNION", "INTO"); + net_printf(lex->thd, ER_WRONG_USAGE, "UNION", "INTO"); YYABORT; } if (lex->select->linkage == GLOBAL_OPTIONS_TYPE) { - send_error(&lex->thd->net, ER_SYNTAX_ERROR); + send_error(lex->thd, ER_SYNTAX_ERROR); YYABORT; } - if (mysql_new_select(lex)) + if (mysql_new_select(lex, 0)) YYABORT; lex->select->linkage=UNION_TYPE; } @@ -4003,7 +4002,7 @@ optional_order_or_limit: LEX *lex=Lex; if (!lex->select->braces) { - send_error(&lex->thd->net, ER_SYNTAX_ERROR); + send_error(lex->thd, ER_SYNTAX_ERROR); YYABORT; } lex->select->master_unit()->global_parameters= @@ -4013,7 +4012,7 @@ optional_order_or_limit: SELECT_LEX fields always check linkage type. */ lex->select= (SELECT_LEX*)lex->select->master_unit(); - lex->select->select_limit=lex->thd->default_select_limit; + lex->select->select_limit=lex->thd->variables.select_limit; } opt_order_clause limit_clause ; diff --git a/sql/structs.h b/sql/structs.h index c2ad4ef527e..7873de4db63 100644 --- a/sql/structs.h +++ b/sql/structs.h @@ -148,36 +148,18 @@ enum SHOW_TYPE }; enum SHOW_COMP_OPTION { SHOW_OPTION_YES, SHOW_OPTION_NO, SHOW_OPTION_DISABLED}; + +extern const char *show_comp_option_name[]; + typedef int *(*update_var)(THD *, struct show_var_st *); + typedef struct show_var_st { const char *name; char *value; SHOW_TYPE type; } SHOW_VAR; -struct show_table_type_st { - const char *type; - char *value; - const char *comment; -}; - -struct show_column_type_st { - const char *type; - uint size; - const char *min_value; - const char *max_value; - uint precision; - uint scale; - const char *nullable; - const char *auto_increment; - const char *unsigned_attr; - const char *zerofill; - const char *searchable; - const char *case_sensitivity; - const char *default_value; - const char *comment; -}; typedef struct lex_string { char *str; diff --git a/sql/table.cc b/sql/table.cc index 3e41da73109..2cdd62001f1 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -493,7 +493,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, if (field->key_length() == key_part->length && field->type() != FIELD_TYPE_BLOB) { - if ((index_flags & HA_HAVE_KEY_READ_ONLY) && + if ((index_flags & HA_KEY_READ_ONLY) && (field->key_type() != HA_KEYTYPE_TEXT || (!(ha_option & HA_KEY_READ_WRONG_STR) && !(keyinfo->flags & HA_FULLTEXT)))) @@ -1141,7 +1141,7 @@ bool check_db_name(const char *name) return 1; name++; } - return (uint) (name - start) > NAME_LEN; + return (uint) (name - start) > NAME_LEN || name == start; } diff --git a/sql/uniques.cc b/sql/uniques.cc index 60905567ba0..ed256a4b791 100644 --- a/sql/uniques.cc +++ b/sql/uniques.cc @@ -53,7 +53,8 @@ Unique::Unique(qsort_cmp2 comp_func, void * comp_func_fixed_arg, :max_in_memory_size(max_in_memory_size_arg),elements(0) { my_b_clear(&file); - init_tree(&tree, max_in_memory_size / 16, 0, size, comp_func, 0, NULL, comp_func_fixed_arg); + init_tree(&tree, max_in_memory_size / 16, 0, size, comp_func, 0, NULL, + comp_func_fixed_arg); /* If the following fail's the next add will also fail */ my_init_dynamic_array(&file_ptrs, sizeof(BUFFPEK), 16, 16); max_elements= max_in_memory_size / ALIGN_SIZE(sizeof(TREE_ELEMENT)+size); diff --git a/sql/unireg.cc b/sql/unireg.cc index 8db9b871a39..344583b56f1 100644 --- a/sql/unireg.cc +++ b/sql/unireg.cc @@ -46,7 +46,7 @@ static bool make_empty_rec(int file, enum db_type table_type, uint reclength,uint null_fields); -int rea_create_table(my_string file_name, +int rea_create_table(THD *thd, my_string file_name, HA_CREATE_INFO *create_info, List &create_fields, uint keys, KEY *key_info) @@ -67,13 +67,12 @@ int rea_create_table(my_string file_name, if (pack_header(forminfo, create_info->db_type,create_fields,info_length, screens, create_info->table_options, db_file)) { - NET *net=my_pthread_getspecific_ptr(NET*,THR_NET); my_free((gptr) screen_buff,MYF(0)); - if (net->last_errno != ER_TOO_MANY_FIELDS) + if (thd->net.last_errno != ER_TOO_MANY_FIELDS) DBUG_RETURN(1); // Try again without UNIREG screens (to get more columns) - net->last_error[0]=0; + thd->net.last_error[0]=0; if (!(screen_buff=pack_screens(create_fields,&info_length,&screens,1))) DBUG_RETURN(1); if (pack_header(forminfo, create_info->db_type, create_fields,info_length, diff --git a/sql/unireg.h b/sql/unireg.h index 2cfa709bbdc..fd1117a4708 100644 --- a/sql/unireg.h +++ b/sql/unireg.h @@ -63,6 +63,8 @@ #define MAX_SORT_MEMORY (2048*1024-MALLOC_OVERHEAD) #define MIN_SORT_MEMORY (32*1024-MALLOC_OVERHEAD) +#define DEFAULT_ERROR_COUNT 64 +#define DEFAULT_PREP_STMT_COUNT 64 #define EXTRA_RECORDS 10 /* Extra records in sort */ #define SCROLL_EXTRA 5 /* Extra scroll-rows. */ #define FIELD_NAME_USED ((uint) 32768) /* Bit set if fieldname used */ diff --git a/strings/ctype-simple.c b/strings/ctype-simple.c index 19989afea60..f6c92edf1b8 100644 --- a/strings/ctype-simple.c +++ b/strings/ctype-simple.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000 MySQL AB +/* Copyright (C) 2002 MySQL AB 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 @@ -23,22 +23,24 @@ int my_strnxfrm_simple(CHARSET_INFO * cs, char *dest, uint len, const char *src, uint srclen) { + uchar *map= cs->sort_order; DBUG_ASSERT(len >= srclen); for ( ; len > 0 ; len-- ) - *dest++= (char) cs->sort_order[(uchar) *src++]; + *dest++= (char) map[(uchar) *src++]; return srclen; } -int my_strnncoll_simple(CHARSET_INFO * cs,const char *s, uint slen, - const char *t, uint tlen) +int my_strnncoll_simple(CHARSET_INFO * cs, const char *s, uint slen, + const char *t, uint tlen) { int len = ( slen > tlen ) ? tlen : slen; + uchar *map= cs->sort_order; while (len--) { - if (cs->sort_order[(uchar) *s++] != cs->sort_order[(uchar) *t++]) - return ((int) cs->sort_order[(uchar) s[-1]] - - (int) cs->sort_order[(uchar) t[-1]]); + if (map[(uchar) *s++] != map[(uchar) *t++]) + return ((int) map[(uchar) s[-1]] - + (int) map[(uchar) t[-1]]); } return (int) (slen-tlen); } diff --git a/tests/client_test.c b/tests/client_test.c index f988b7dec9a..a00c475129d 100644 --- a/tests/client_test.c +++ b/tests/client_test.c @@ -268,7 +268,7 @@ void my_print_result_metadata(MYSQL_RES *result) for(i=0; i< field_count; i++) { field = mysql_fetch_field(result); - fprintf(stdout, " %-*s |",field->max_length, field->name); + fprintf(stdout, " %-*s |",(int) field->max_length, field->name); } fputc('\n', stdout); my_print_dashes(result); @@ -296,11 +296,11 @@ int my_process_result_set(MYSQL *mysql, MYSQL_RES *result) { field = mysql_fetch_field(result); if(row[i] == NULL) - fprintf(stdout, " %-*s |", field->max_length, "NULL"); + fprintf(stdout, " %-*s |", (int) field->max_length, "NULL"); else if (IS_NUM(field->type)) - fprintf(stdout, " %*s |", field->max_length, row[i]); + fprintf(stdout, " %*s |", (int) field->max_length, row[i]); else - fprintf(stdout, " %-*s |", field->max_length, row[i]); + fprintf(stdout, " %-*s |", (int) field->max_length, row[i]); } fputc('\t',stdout); fputc('\n',stdout); @@ -548,13 +548,15 @@ void test_tran_innodb(MYSQL *mysql) mysql_autocommit(mysql,true); } + /******************************************************** -* to test simple prepares of all DML statements * + To test simple prepares of all DML statements *********************************************************/ + void test_prepare_simple(MYSQL *mysql) { MYSQL_STMT *stmt; - int rc,param_count,length; + int rc,param_count; const char *query; myheader("test_prepare_simple"); @@ -570,8 +572,7 @@ void test_prepare_simple(MYSQL *mysql) /* alter table */ query = "ALTER TABLE test_prepare_simple ADD new char(20)"; - length = strlen(query); - stmt = mysql_prepare(mysql, query); + stmt = mysql_prepare(mysql, query, strlen(query)); myxquery(mysql,stmt); param_count = mysql_param_count(stmt); @@ -581,8 +582,7 @@ void test_prepare_simple(MYSQL *mysql) /* insert */ query = "INSERT INTO test_prepare_simple VALUES(?,?)"; - length = strlen(query); - stmt = mysql_prepare(mysql, query); + stmt = mysql_prepare(mysql, query, strlen(query)); myxquery(mysql,stmt); param_count = mysql_param_count(stmt); @@ -592,8 +592,7 @@ void test_prepare_simple(MYSQL *mysql) /* update */ query = "UPDATE test_prepare_simple SET id=? WHERE id=? AND name= ?"; - length = strlen(query); - stmt = mysql_prepare(mysql, query); + stmt = mysql_prepare(mysql, query, strlen(query)); myxquery(mysql,stmt); param_count = mysql_param_count(stmt); @@ -603,8 +602,7 @@ void test_prepare_simple(MYSQL *mysql) /* delete */ query = "DELETE FROM test_prepare_simple WHERE id=10"; - length = strlen(query); - stmt = mysql_prepare(mysql, query); + stmt = mysql_prepare(mysql, query, strlen(query)); myxquery(mysql,stmt); param_count = mysql_param_count(stmt); @@ -617,8 +615,7 @@ void test_prepare_simple(MYSQL *mysql) /* delete */ query = "DELETE FROM test_prepare_simple WHERE id=?"; - length = strlen(query); - stmt = mysql_prepare(mysql, query); + stmt = mysql_prepare(mysql, query, strlen(query)); myxquery(mysql,stmt); param_count = mysql_param_count(stmt); @@ -631,8 +628,7 @@ void test_prepare_simple(MYSQL *mysql) /* select */ query = "SELECT * FROM test_prepare_simple WHERE id=? AND name= ?"; - length = strlen(query); - stmt = mysql_prepare(mysql, query); + stmt = mysql_prepare(mysql, query, strlen(query)); myxquery(mysql,stmt); param_count = mysql_param_count(stmt); @@ -653,7 +649,7 @@ void test_prepare_simple(MYSQL *mysql) void test_prepare_field_result(MYSQL *mysql) { MYSQL_STMT *stmt; - int rc,param_count,length; + int rc,param_count; const char *query; myheader("test_prepare_field_result"); @@ -670,8 +666,7 @@ void test_prepare_field_result(MYSQL *mysql) /* insert */ query = "SELECT id,name FROM test_prepare_field_result WHERE id=?"; - length = strlen(query); - stmt = mysql_prepare(mysql, query); + stmt = mysql_prepare(mysql, query, strlen(query)); myxquery(mysql,stmt); param_count = mysql_param_count(stmt); @@ -691,7 +686,7 @@ void test_prepare_field_result(MYSQL *mysql) void test_prepare_syntax(MYSQL *mysql) { MYSQL_STMT *stmt; - int rc,length; + int rc; const char *query; myheader("test_prepare_syntax"); @@ -706,13 +701,11 @@ void test_prepare_syntax(MYSQL *mysql) myquery(mysql,rc); query = "INSERT INTO test_prepare_syntax VALUES(?"; - length = strlen(query); - stmt = mysql_prepare(mysql, query); + stmt = mysql_prepare(mysql, query, strlen(query)); myxquery_r(mysql,stmt); query = "SELECT id,name FROM test_prepare_syntax WHERE id=? AND WHERE"; - length = strlen(query); - stmt = mysql_prepare(mysql, query); + stmt = mysql_prepare(mysql, query, strlen(query)); myxquery_r(mysql,stmt); /* now fetch the results ..*/ @@ -759,7 +752,7 @@ void test_prepare(MYSQL *mysql) /* insert by prepare */ strcpy(query,"INSERT INTO my_prepare VALUES(?,?,?,?,?,?,?)"); - stmt = mysql_prepare(mysql, query); + stmt = mysql_prepare(mysql, query, strlen(query)); myxquery(mysql,stmt); param_count = mysql_param_count(stmt); @@ -861,7 +854,7 @@ void test_double_compare(MYSQL *mysql) myquery(mysql,rc); strcpy(query, "UPDATE test_double_compare SET col1=100 WHERE col1 = ? AND col2 = ? AND COL3 = ?"); - stmt = mysql_prepare(mysql,query); + stmt = mysql_prepare(mysql,query, strlen(query)); myxquery(mysql,stmt); param_count = mysql_param_count(stmt); @@ -937,13 +930,11 @@ void test_null(MYSQL *mysql) /* insert by prepare, wrong column name */ query = "INSERT INTO test_null(col3,col2) VALUES(?,?)"; - nData = strlen(query); - stmt = mysql_prepare(mysql, query); + stmt = mysql_prepare(mysql, query, strlen(query)); myxquery_r(mysql,stmt); query = "INSERT INTO test_null(col1,col2) VALUES(?,?)"; - nData = strlen(query); - stmt = mysql_prepare(mysql, query); + stmt = mysql_prepare(mysql, query, strlen(query)); myxquery(mysql,stmt); param_count = mysql_param_count(stmt); @@ -998,8 +989,7 @@ void test_select_simple(MYSQL *mysql) /* insert by prepare */ strcpy((char *)query, "SHOW TABLES FROM mysql"); - length = strlen(query); - stmt = mysql_prepare(mysql, query); + stmt = mysql_prepare(mysql, query, strlen(query)); myxquery(mysql,stmt); length = mysql_param_count(stmt); @@ -1079,8 +1069,7 @@ void test_select(MYSQL *mysql) myquery(mysql,rc); query = "SELECT * FROM test_select WHERE id=? AND name=?"; - nData = strlen(query); - stmt = mysql_prepare(mysql, query); + stmt = mysql_prepare(mysql, query, strlen(query)); myxquery(mysql,stmt); param_count = mysql_param_count(stmt); @@ -1159,8 +1148,7 @@ void test_simple_update(MYSQL *mysql) /* insert by prepare */ query = "UPDATE test_update SET col2=? WHERE col1=?"; - nData = strlen(query); - stmt = mysql_prepare(mysql, query); + stmt = mysql_prepare(mysql, query, strlen(query)); myxquery(mysql,stmt); param_count = mysql_param_count(stmt); @@ -1208,7 +1196,6 @@ void test_long_data(MYSQL *mysql) int rc,param_count; const char *query; char *data=NullS; - int length; MYSQL_RES *result; MYSQL_BIND bind[2]; @@ -1233,8 +1220,7 @@ void test_long_data(MYSQL *mysql) myquery(mysql,rc); query = "INSERT INTO test_long_data(col2) VALUES(?)"; - length=strlen(query); - stmt = mysql_prepare(mysql, query); + stmt = mysql_prepare(mysql, query, strlen(query)); myxquery(mysql,stmt); param_count = mysql_param_count(stmt); @@ -1261,7 +1247,7 @@ void test_long_data(MYSQL *mysql) data = (char *)"Micheal"; /* supply data in pieces */ - rc = mysql_send_long_data(stmt,0,data,7); + rc = mysql_send_long_data(stmt,0,data,7,1); mystmt(stmt, rc); /* try to execute mysql_execute() now, it should return @@ -1275,11 +1261,11 @@ void test_long_data(MYSQL *mysql) /* supply data in pieces */ data = (char *)" 'monty' widenius"; - rc = mysql_send_long_data(stmt,0,data,17); + rc = mysql_send_long_data(stmt,0,data,17,0); mystmt(stmt, rc); /* Indiate end of data supply */ - rc = mysql_send_long_data(stmt,0,0,MYSQL_LONG_DATA_END); + rc = mysql_send_long_data(stmt,0,0,0,1); mystmt(stmt, rc); /* execute */ @@ -1311,7 +1297,7 @@ void test_long_data_str(MYSQL *mysql) int rc,param_count; const char *query; char data[255]; - int length; + long length; MYSQL_RES *result; MYSQL_BIND bind[2]; @@ -1335,8 +1321,7 @@ void test_long_data_str(MYSQL *mysql) myquery(mysql,rc); query = "INSERT INTO test_long_data_str VALUES(?,?)"; - length=strlen(query); - stmt = mysql_prepare(mysql, query); + stmt = mysql_prepare(mysql, query, strlen(query)); myxquery(mysql,stmt); param_count = mysql_param_count(stmt); @@ -1365,7 +1350,7 @@ void test_long_data_str(MYSQL *mysql) int i; for(i=0; i < 4; i++) { - rc = mysql_send_long_data(stmt,1,(char *)data,5); + rc = mysql_send_long_data(stmt,1,(char *)data,5,0); mystmt(stmt, rc); } @@ -1378,7 +1363,7 @@ void test_long_data_str(MYSQL *mysql) } /* Indiate end of data supply */ - rc = mysql_send_long_data(stmt,1,0,MYSQL_LONG_DATA_END); + rc = mysql_send_long_data(stmt,1,0,0,1); mystmt(stmt, rc); /* execute */ @@ -1437,8 +1422,7 @@ void test_long_data_str1(MYSQL *mysql) myquery(mysql,rc); query = "INSERT INTO test_long_data_str VALUES(?,?)"; - length=strlen(query); - stmt = mysql_prepare(mysql, query); + stmt = mysql_prepare(mysql, query, strlen(query)); myxquery(mysql,stmt); param_count = mysql_param_count(stmt); @@ -1467,10 +1451,10 @@ void test_long_data_str1(MYSQL *mysql) int i; for(i=0; i < 2; i++) { - rc = mysql_send_long_data(stmt,0,data,length); + rc = mysql_send_long_data(stmt,0,data,length,0); mystmt(stmt, rc); - rc = mysql_send_long_data(stmt,1,data,2); + rc = mysql_send_long_data(stmt,1,data,2,0); mystmt(stmt, rc); } /* try to execute mysql_execute() now, it should return @@ -1482,14 +1466,14 @@ void test_long_data_str1(MYSQL *mysql) } /* Indiate end of data supply */ - rc = mysql_send_long_data(stmt,1,0,MYSQL_LONG_DATA_END); + rc = mysql_send_long_data(stmt,1,0,0,1); mystmt(stmt, rc); rc = mysql_execute(stmt); fprintf(stdout,"mysql_execute() returned %d\n",rc); assert(rc == MYSQL_NEED_DATA); - rc = mysql_send_long_data(stmt,0,0,MYSQL_LONG_DATA_END); + rc = mysql_send_long_data(stmt,0,0,0,1); mystmt(stmt, rc); /* execute */ @@ -1548,8 +1532,7 @@ void test_long_data_bin(MYSQL *mysql) myquery(mysql,rc); query = "INSERT INTO test_long_data_bin VALUES(?,?)"; - length=strlen(query); - stmt = mysql_prepare(mysql, query); + stmt = mysql_prepare(mysql, query, strlen(query)); myxquery(mysql,stmt); param_count = mysql_param_count(stmt); @@ -1577,7 +1560,7 @@ void test_long_data_bin(MYSQL *mysql) int i; for(i=0; i < 100; i++) { - rc = mysql_send_long_data(stmt,1,(char *)data,4); + rc = mysql_send_long_data(stmt,1,(char *)data,4,0); mystmt(stmt, rc); } @@ -1590,7 +1573,7 @@ void test_long_data_bin(MYSQL *mysql) } /* Indiate end of data supply */ - rc = mysql_send_long_data(stmt,1,0,MYSQL_LONG_DATA_END); + rc = mysql_send_long_data(stmt,1,0,0,1); mystmt(stmt, rc); /* execute */ @@ -1659,8 +1642,7 @@ void test_simple_delete(MYSQL *mysql) /* insert by prepare */ query = "DELETE FROM test_simple_delete WHERE col1=? AND col2=? AND col3=100"; - nData = strlen(query); - stmt = mysql_prepare(mysql, query); + stmt = mysql_prepare(mysql, query, strlen(query)); myxquery(mysql,stmt); param_count = mysql_param_count(stmt); @@ -1737,8 +1719,7 @@ void test_update(MYSQL *mysql) myquery(mysql,rc); query = "INSERT INTO test_update(col2,col3) VALUES(?,?)"; - nData = strlen(query); - stmt = mysql_prepare(mysql, query); + stmt = mysql_prepare(mysql, query, strlen(query)); myxquery(mysql,stmt); param_count = mysql_param_count(stmt); @@ -1764,8 +1745,7 @@ void test_update(MYSQL *mysql) /* insert by prepare */ query = "UPDATE test_update SET col2=? WHERE col3=?"; - nData = strlen(query); - stmt = mysql_prepare(mysql, query); + stmt = mysql_prepare(mysql, query, strlen(query)); myxquery(mysql,stmt); param_count = mysql_param_count(stmt); @@ -1812,7 +1792,7 @@ void test_update(MYSQL *mysql) void test_init_prepare(MYSQL *mysql) { MYSQL_STMT *stmt; - int length, param_count, rc; + int param_count, rc; const char *query; MYSQL_RES *result; @@ -1830,8 +1810,7 @@ void test_init_prepare(MYSQL *mysql) /* insert by prepare */ query = "INSERT INTO my_prepare VALUES(10,'venu')"; - length = strlen(query); - stmt = mysql_prepare(mysql, query); + stmt = mysql_prepare(mysql, query, strlen(query)); myxquery(mysql,stmt); param_count = mysql_param_count(stmt); @@ -1904,8 +1883,7 @@ void test_bind_result(MYSQL *mysql) bind[1].buffer=szData; /* string data */ strcpy((char *)query , "SELECT * FROM test_bind_result"); - nData = strlen(query); - stmt = mysql_prepare(mysql, query); + stmt = mysql_prepare(mysql, query, strlen(query)); myxquery(mysql,stmt); rc = mysql_bind_result(stmt,bind); @@ -2000,7 +1978,7 @@ void test_prepare_ext(MYSQL *mysql) /* insert by prepare - all integers */ query = (char *)"INSERT INTO test_prepare_ext(c1,c2,c3,c4,c5,c6) VALUES(?,?,?,?,?,?)"; - stmt = mysql_prepare(mysql,query); + stmt = mysql_prepare(mysql,query, strlen(query)); myquery(mysql,rc); param_count = mysql_param_count(stmt); @@ -2189,7 +2167,7 @@ void test_insert(MYSQL *mysql) /* insert by prepare */ bzero(bind, sizeof(bind)); strcpy(query,"INSERT INTO test_prep_insert VALUES(?,?)"); - stmt = mysql_prepare(mysql, query); + stmt = mysql_prepare(mysql, query, strlen(query)); myxquery(mysql,stmt); param_count = mysql_param_count(stmt); @@ -2260,7 +2238,7 @@ void test_prepare_resultset(MYSQL *mysql) /* insert by prepare */ strcpy(query,"INSERT INTO test_prepare_resultset(id,name) VALUES(?,?)"); - stmt = mysql_prepare(mysql, query); + stmt = mysql_prepare(mysql, query, strlen(query)); myxquery(mysql,stmt); param_count = mysql_param_count(stmt); -- cgit v1.2.1 From 896bc7d08912a605d7c9ac9790a7bbf95d34ff08 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 2 Oct 2002 14:14:36 +0300 Subject: Update libmysqld to use 4.1 protocol. BitKeeper/etc/ignore: added sql_error.cc sql_prepare.cc BitKeeper/deleted/.del-sql_error.cc~2f1caca8d2485dbe: deleted BitKeeper/deleted/.del-sql_prepare.cc~f703729793935ed6: deleted libmysqld/libmysqld.c: Update to use 4.1 protocol. Added mysql_warning_count() and mysql_warnings() myisam/rt_test.c: Added missing variable --- .bzrignore | 2 ++ libmysqld/libmysqld.c | 37 +++++++++++++++++++++++++++++-------- myisam/rt_test.c | 1 + 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/.bzrignore b/.bzrignore index 72a0438577a..0a72b402ca9 100644 --- a/.bzrignore +++ b/.bzrignore @@ -503,3 +503,5 @@ vio/test-ssl vio/test-sslclient vio/test-sslserver vio/viotest-ssl +sql_error.cc +sql_prepare.cc diff --git a/libmysqld/libmysqld.c b/libmysqld/libmysqld.c index 453376092d7..6328a205a7b 100644 --- a/libmysqld/libmysqld.c +++ b/libmysqld/libmysqld.c @@ -50,7 +50,7 @@ static my_bool mysql_client_init=0; uint mysql_port=0; my_string mysql_unix_port=0; -#define CLIENT_CAPABILITIES (CLIENT_LONG_PASSWORD | CLIENT_LONG_FLAG | CLIENT_TRANSACTIONS) +#define CLIENT_CAPABILITIES (CLIENT_LONG_PASSWORD | CLIENT_LONG_FLAG | CLIENT_TRANSACTIONS | CLIENT_PROTOCOL_41) #if defined(MSDOS) || defined(__WIN__) #define ERRNO WSAGetLastError() @@ -412,7 +412,7 @@ mysql_free_result(MYSQL_RES *result) uint pkt_len; if ((pkt_len=(uint) net_safe_read(result->handle)) == packet_error) break; - if (pkt_len == 1 && result->handle->net.read_pos[0] == 254) + if (pkt_len <= 8 && result->handle->net.read_pos[0] == 254) break; /* End of data */ } result->handle->status=MYSQL_STATUS_READY; @@ -632,7 +632,7 @@ static MYSQL_DATA *read_rows(MYSQL *mysql,MYSQL_FIELD *mysql_fields, result->rows=0; result->fields=fields; - while (*(cp=net->read_pos) != 254 || pkt_len != 1) + while (*(cp=net->read_pos) != 254 || pkt_len >= 8) { result->rows++; if (!(cur= (MYSQL_ROWS*) alloc_root(&result->alloc, @@ -676,6 +676,8 @@ static MYSQL_DATA *read_rows(MYSQL *mysql,MYSQL_FIELD *mysql_fields, } } *prev_ptr=0; /* last pointer is null */ + mysql->warning_count= uint2korr(cp+1); + DBUG_PRINT("info",("warning_count: %ld", mysql->warning_count)); DBUG_PRINT("exit",("Got %d rows",result->rows)); DBUG_RETURN(result); } @@ -696,8 +698,11 @@ read_one_row(MYSQL *mysql,uint fields,MYSQL_ROW row, ulong *lengths) if ((pkt_len=net_safe_read(mysql)) == packet_error) return -1; - if (pkt_len == 1 && mysql->net.read_pos[0] == 254) + if (pkt_len <= 8 && mysql->net.read_pos[0] == 254) + { + mysql->warning_count= uint2korr(mysql->net.read_pos+1); return 1; /* End of data */ + } prev_pos= 0; /* allowed to write at packet[-1] */ pos=mysql->net.read_pos; for (field=0 ; field < fields ; field++) @@ -1142,10 +1147,8 @@ get_info: { mysql->affected_rows= net_field_length_ll(&pos); mysql->insert_id= net_field_length_ll(&pos); - if (mysql->server_capabilities & CLIENT_TRANSACTIONS) - { - mysql->server_status=uint2korr(pos); pos+=2; - } + mysql->server_status=uint2korr(pos); pos+=2; + mysql->warning_count=uint2korr(pos); pos+=2; if (pos < mysql->net.read_pos+length && net_field_length(&pos)) mysql->info=(char*) pos; DBUG_RETURN(0); @@ -1170,6 +1173,7 @@ get_info: DBUG_RETURN(1); mysql->status=MYSQL_STATUS_GET_RESULT; mysql->field_count=field_count; + mysql->warning_count= 0; DBUG_RETURN(0); } @@ -1881,6 +1885,11 @@ const char * STDCALL mysql_error(MYSQL *mysql) return (mysql)->net.last_error; } +uint STDCALL mysql_warning_count(MYSQL *mysql) +{ + return mysql->warning_count; +} + const char *STDCALL mysql_info(MYSQL *mysql) { return (mysql)->info; @@ -1906,6 +1915,18 @@ uint STDCALL mysql_thread_safe(void) #endif } +MYSQL_RES *STDCALL mysql_warnings(MYSQL *mysql) +{ + uint warning_count; + DBUG_ENTER("mysql_warnings"); + /* Save warning count as mysql_real_query may change this */ + warning_count= mysql->warning_count; + if (mysql_real_query(mysql, "SHOW WARNINGS", 13)) + DBUG_RETURN(0); + mysql->warning_count= warning_count; + DBUG_RETURN(mysql_store_result(mysql)); +} + /**************************************************************************** ** Some support functions ****************************************************************************/ diff --git a/myisam/rt_test.c b/myisam/rt_test.c index b959c18806f..65613bad47f 100644 --- a/myisam/rt_test.c +++ b/myisam/rt_test.c @@ -63,6 +63,7 @@ int run_test(const char *filename) int row_count=0; char record[MAX_REC_LENGTH]; char read_record[MAX_REC_LENGTH]; + int upd= 10; ha_rows hrows; -- cgit v1.2.1 From 0d82e49fe1a2603912e703d4516ba6b465390f84 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 3 Oct 2002 13:12:31 +0500 Subject: Failed to compile on FreeBSD: no ulong type, one should use unsigned long instead include/mysql.h: Failed to compile on FreeBSD --- include/mysql.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/mysql.h b/include/mysql.h index 376de1a0e08..64b118ca8b1 100644 --- a/include/mysql.h +++ b/include/mysql.h @@ -447,7 +447,7 @@ typedef struct st_mysql_stmt unsigned long param_count; /* parameters count */ unsigned long field_count; /* fields count */ unsigned long long_length; /* long buffer alloced length */ - ulong stmt_id; /* Id for prepared statement */ + unsigned long stmt_id; /* Id for prepared statement */ uint last_errno; /* error code */ enum MY_STMT_STATE state; /* statement state */ char last_error[MYSQL_ERRMSG_SIZE]; /* error message */ @@ -506,7 +506,7 @@ int STDCALL mysql_drop_db(MYSQL *mysql, const char *DB); my_bool simple_command(MYSQL *mysql,enum enum_server_command command, const char *arg, - ulong length, my_bool skip_check); + unsigned long length, my_bool skip_check); unsigned long net_safe_read(MYSQL* mysql); #ifdef __cplusplus -- cgit v1.2.1 From 1d418629753f58a5a12f8c202383d0195b128ae6 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 3 Oct 2002 14:55:02 +0500 Subject: Additional key segment (HA_KEYTYPE_END) creation has been moved from handler to hp_create.c BitKeeper/etc/logging_ok: Logging to logging@openlogging.org accepted --- BitKeeper/etc/logging_ok | 1 + heap/hp_create.c | 18 +++++++++++------- sql/ha_heap.cc | 13 ------------- 3 files changed, 12 insertions(+), 20 deletions(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index 31c8d0a3253..866b5cfd3c3 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -74,3 +74,4 @@ WAX@sergbook.mysql.com bar@bar.udmsearch.izhnet.ru nick@mysql.com bar@bar.mysql.r18.ru +ram@mysql.r18.ru diff --git a/heap/hp_create.c b/heap/hp_create.c index 4163f5b0217..7eee6eaa64d 100644 --- a/heap/hp_create.c +++ b/heap/hp_create.c @@ -85,15 +85,24 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef, memcpy(share->keydef, keydef, (size_t) (sizeof(keydef[0]) * keys)); for (i= 0, keyinfo= share->keydef; i < keys; i++, keyinfo++) { - uint nsegs= keydef[i].keysegs; + keyinfo->seg= keyseg; + memcpy(keyseg, keydef[i].seg, + (size_t) (sizeof(keyseg[0]) * keydef[i].keysegs)); + keyseg+= keydef[i].keysegs; if (keydef[i].algorithm == HA_KEY_ALG_BTREE) { + /* additional HA_KEYTYPE_END keyseg */ + keyseg->type= HA_KEYTYPE_END; + keyseg->length= sizeof(byte*); + keyseg->flag= 0; + keyseg->null_bit= 0; + keyseg++; + init_tree(&keyinfo->rb_tree, 0, 0, sizeof(byte*), (qsort_cmp2)keys_compare, 1, NULL, NULL); keyinfo->delete_key= hp_rb_delete_key; keyinfo->write_key= hp_rb_write_key; - nsegs++; } else { @@ -102,12 +111,7 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef, keyinfo->delete_key= hp_delete_key; keyinfo->write_key= hp_write_key; } - keyinfo->seg= keyseg; - memcpy(keyseg, keydef[i].seg, - (size_t) (sizeof(keyseg[0]) * nsegs)); - keyseg+= nsegs; } - share->min_records= min_records; share->max_records= max_records; share->data_length= share->index_length= 0; diff --git a/sql/ha_heap.cc b/sql/ha_heap.cc index f56bfe74265..b41ab648f0b 100644 --- a/sql/ha_heap.cc +++ b/sql/ha_heap.cc @@ -243,11 +243,7 @@ int ha_heap::create(const char *name, TABLE *table, HA_CREATE_INFO *create_info) int error; for (key= parts= 0; key < table->keys; key++) - { parts+= table->key_info[key].key_parts; - if (table->key_info[key].algorithm == HA_KEY_ALG_BTREE) - parts++; /* additional HA_KEYTYPE_END keyseg */ - } if (!(keydef= (HP_KEYDEF*) my_malloc(table->keys * sizeof(HP_KEYDEF) + parts * sizeof(HA_KEYSEG), MYF(MY_WME)))) @@ -299,15 +295,6 @@ int ha_heap::create(const char *name, TABLE *table, HA_CREATE_INFO *create_info) seg->null_pos= 0; } } - if (pos->algorithm == HA_KEY_ALG_BTREE) - { - /* additional HA_KEYTYPE_END keyseg */ - seg->type= HA_KEYTYPE_END; - seg->length= sizeof(byte*); - seg->flag= 0; - seg->null_bit= 0; - seg++; - } } mem_per_row+= MY_ALIGN(table->reclength + 1, sizeof(char*)); max_rows= (ulong) (max_heap_table_size / mem_per_row); -- cgit v1.2.1 From e57cd00a6fd8edddf373348d050723b2d41339f1 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 3 Oct 2002 16:35:08 +0300 Subject: after merging bugfix --- sql/item.cc | 21 +++++++++++++++------ sql/mysql_priv.h | 5 +++-- sql/sql_base.cc | 23 +++++++++++++---------- sql/sql_lex.cc | 10 +++++----- sql/sql_parse.cc | 2 +- sql/sql_select.cc | 11 ++++------- sql/sql_yacc.yy | 9 ++++++--- 7 files changed, 47 insertions(+), 34 deletions(-) diff --git a/sql/item.cc b/sql/item.cc index 946c0f24fe1..47c2926bef4 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -432,7 +432,7 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) if (!field) // If field is not checked { Field *tmp; - if (!(tmp=find_field_in_tables(thd,this,tables))) + if (!(tmp=find_field_in_tables(thd, this, tables, 0))) { /* We can't find table field in table list of current select, @@ -448,9 +448,14 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) sl && !tmp; sl= sl->outer_select()) tmp=find_field_in_tables(thd, this, - (TABLE_LIST*)(last= sl)->table_list.first); + (TABLE_LIST*)(last= sl)->table_list.first, + 0); if (!tmp) - return 1; + { + // Call to produce appropriate error message + find_field_in_tables(thd, this, tables, 1); + return -1; + } else { depended_from= last; @@ -463,7 +468,7 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) s= s->outer_select()) if( !s->depended ) { - s->depended= 1; //Select is depended of outer select + s->depended= 1; //Tables will be reopened many times for (TABLE_LIST *tbl= (TABLE_LIST*)s->table_list.first; @@ -780,7 +785,7 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference) { if (!ref) { - if (!(ref= find_item_in_list(this,thd->lex.select->item_list))) + if (!(ref= find_item_in_list(this, thd->lex.select->item_list, 0))) { /* We can't find table field in table list of current select, @@ -795,9 +800,13 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference) for (SELECT_LEX *sl= thd->lex.select->outer_select(); sl && !ref; sl= sl->outer_select()) - ref= find_item_in_list(this, (last= sl)->item_list); + ref= find_item_in_list(this, (last= sl)->item_list, 0); if (!ref) + { + // Call to report error + find_item_in_list(this, thd->lex.select->item_list, 1); return 1; + } else { depended_from= last; diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 4532646b1c2..60505ec0712 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -450,7 +450,8 @@ bool wait_for_tables(THD *thd); bool table_is_used(TABLE *table, bool wait_for_name_lock); bool drop_locked_tables(THD *thd,const char *db, const char *table_name); void abort_locked_tables(THD *thd,const char *db, const char *table_name); -Field *find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables); +Field *find_field_in_tables(THD *thd, Item_field *item, TABLE_LIST *tables, + bool report_error); Field *find_field_in_table(THD *thd,TABLE *table,const char *name,uint length, bool check_grant,bool allow_rowid); #ifdef HAVE_OPENSSL @@ -538,7 +539,7 @@ TABLE *unlink_open_table(THD *thd,TABLE *list,TABLE *find); SQL_SELECT *make_select(TABLE *head, table_map const_tables, table_map read_tables, COND *conds, int *error); -Item ** find_item_in_list(Item *item,List &items); +Item ** find_item_in_list(Item *item, List &items, bool report_error); bool insert_fields(THD *thd,TABLE_LIST *tables, const char *db_name, const char *table_name, List_iterator *it); diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 5d3421f5538..59c57006947 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -1783,7 +1783,8 @@ Field *find_field_in_table(THD *thd,TABLE *table,const char *name,uint length, Field * -find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables) +find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables, + bool report_error) { Field *found=0; const char *db=item->db_name; @@ -1820,7 +1821,7 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables) } if (found) return found; - if (!found_table) + if (!found_table && report_error) { char buff[NAME_LEN*2+1]; if (db) @@ -1832,8 +1833,9 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables) thd->where); } else - my_printf_error(ER_BAD_FIELD_ERROR,ER(ER_BAD_FIELD_ERROR),MYF(0), - item->full_name(),thd->where); + if (report_error) + my_printf_error(ER_BAD_FIELD_ERROR,ER(ER_BAD_FIELD_ERROR),MYF(0), + item->full_name(),thd->where); return (Field*) 0; } bool allow_rowid= tables && !tables->next; // Only one table @@ -1848,7 +1850,7 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables) return (Field*) 0; if (found) { - if (!thd->where) // Returns first found + if (!report_error) // Returns first found break; my_printf_error(ER_NON_UNIQ_ERROR,ER(ER_NON_UNIQ_ERROR),MYF(0), name,thd->where); @@ -1859,13 +1861,14 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables) } if (found) return found; - my_printf_error(ER_BAD_FIELD_ERROR,ER(ER_BAD_FIELD_ERROR), - MYF(0),item->full_name(),thd->where); + if (report_error) + my_printf_error(ER_BAD_FIELD_ERROR, ER(ER_BAD_FIELD_ERROR), + MYF(0), item->full_name(), thd->where); return (Field*) 0; } Item ** -find_item_in_list(Item *find,List &items) +find_item_in_list(Item *find, List &items, bool report_error) { List_iterator li(items); Item **found=0,*item; @@ -1890,7 +1893,7 @@ find_item_in_list(Item *find,List &items) { if ((*found)->eq(item,0)) continue; // Same field twice (Access?) - if (current_thd->where) + if (report_error) my_printf_error(ER_NON_UNIQ_ERROR,ER(ER_NON_UNIQ_ERROR),MYF(0), find->full_name(), current_thd->where); return (Item**) 0; @@ -1913,7 +1916,7 @@ find_item_in_list(Item *find,List &items) break; } } - if (!found && current_thd->where) + if (!found && report_error) my_printf_error(ER_BAD_FIELD_ERROR,ER(ER_BAD_FIELD_ERROR),MYF(0), find->full_name(),current_thd->where); return found; diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 1af8d363fda..60ab3344b3f 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -142,11 +142,11 @@ LEX *lex_start(THD *thd, uchar *buf,uint length) lex->next_state=STATE_START; lex->end_of_query=(lex->ptr=buf)+length; lex->yylineno = 1; - lex->select->create_refs=lex->in_comment=0; + lex->select_lex.create_refs=lex->in_comment=0; lex->length=0; - lex->select->in_sum_expr=0; - lex->select->expr_list.empty(); - lex->select->ftfunc_list.empty(); + lex->select_lex.in_sum_expr=0; + lex->select_lex.expr_list.empty(); + lex->select_lex.ftfunc_list.empty(); lex->convert_set=(lex->thd=thd)->variables.convert_set; lex->yacc_yyss=lex->yacc_yyvs=0; lex->ignore_space=test(thd->sql_mode & MODE_IGNORE_SPACE); @@ -158,7 +158,7 @@ LEX *lex_start(THD *thd, uchar *buf,uint length) void lex_end(LEX *lex) { - lex->select->expr_list.delete_elements(); // If error when parsing sql-varargs + lex->select_lex.expr_list.delete_elements(); // If error when parsing sql-varargs x_free(lex->yacc_yyss); x_free(lex->yacc_yyvs); } diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 461276900a5..580a6796911 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1265,7 +1265,7 @@ mysql_execute_command(THD *thd) int res= 0; LEX *lex= &thd->lex; TABLE_LIST *tables= (TABLE_LIST*) lex->select_lex.table_list.first; - SELECT_LEX *select_lex= lex->select; + SELECT_LEX *select_lex= &lex->select_lex; SELECT_LEX_UNIT *unit= &lex->unit; DBUG_ENTER("mysql_execute_command"); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 2b737ab65d7..68871d7ace1 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -6498,9 +6498,7 @@ find_order_in_list(THD *thd,TABLE_LIST *tables,ORDER *order,List &fields, return 0; } const char *save_where=thd->where; - thd->where=0; // No error if not found - Item **item=find_item_in_list(*order->item,fields); - thd->where=save_where; + Item **item=find_item_in_list(*order->item, fields, 0); if (item) { order->item=item; // use it @@ -6598,17 +6596,15 @@ setup_new_fields(THD *thd,TABLE_LIST *tables,List &fields, DBUG_ENTER("setup_new_fields"); thd->set_query_id=1; // Not really needed, but... - thd->where=0; // Don't give error for (; new_field ; new_field=new_field->next) { - if ((item=find_item_in_list(*new_field->item,fields))) + if ((item= find_item_in_list(*new_field->item, fields, 0))) new_field->item=item; /* Change to shared Item */ else { thd->where="procedure list"; if ((*new_field->item)->fix_fields(thd, tables, new_field->item)) DBUG_RETURN(1); /* purecov: inspected */ - thd->where=0; all_fields.push_front(*new_field->item); new_field->item=all_fields.head_ref(); } @@ -7400,7 +7396,8 @@ static void describe_info(JOIN *join, const char *info) { THD *thd= join->thd; - if (thd->lex.select->next_select()) /* If in UNION */ + /* If lex.select belong to UNION */ + if (thd->lex.select->master_unit()->first_select()->next_select()) { select_describe(join,FALSE,FALSE,FALSE,info); return; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index cc06344304f..f61f970f479 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2436,7 +2436,8 @@ order_clause: net_printf(lex->thd, ER_WRONG_USAGE, "UPDATE", "ORDER BY"); YYABORT; } - if (lex->select->olap != UNSPECIFIED_OLAP_TYPE) + if (lex->select->linkage != GLOBAL_OPTIONS_TYPE && + lex->select->olap != UNSPECIFIED_OLAP_TYPE) { net_printf(lex->thd, ER_WRONG_USAGE, "CUBE/ROLLUP", @@ -2462,7 +2463,8 @@ limit_clause: | LIMIT ULONG_NUM { LEX *lex=Lex; - if (lex->select->olap != UNSPECIFIED_OLAP_TYPE) + if (lex->select->linkage != GLOBAL_OPTIONS_TYPE && + lex->select->olap != UNSPECIFIED_OLAP_TYPE) { net_printf(lex->thd, ER_WRONG_USAGE, "CUBE/ROLLUP", "LIMIT"); @@ -2475,7 +2477,8 @@ limit_clause: | LIMIT ULONG_NUM ',' ULONG_NUM { LEX *lex=Lex; - if (lex->select->olap != UNSPECIFIED_OLAP_TYPE) + if (lex->select->linkage != GLOBAL_OPTIONS_TYPE && + lex->select->olap != UNSPECIFIED_OLAP_TYPE) { net_printf(lex->thd, ER_WRONG_USAGE, "CUBE/ROLLUP", "LIMIT"); -- cgit v1.2.1 From 8f7a2b2785cec83f3c00047b5d3fb76d85ecbe62 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 3 Oct 2002 16:54:26 +0300 Subject: Update after last merge. Fixes some wrong test results. libmysql/libmysql.c: Removed obsolete function (now in strings library) mysql-test/r/rpl_log.result: Updated results for 4.1 mysql-test/r/rpl_log_pos.result: Updated results for 4.1 sql/item_strfunc.cc: Added missing system_charset_info sql/log_event.cc: Portability fixes. More debugging. sql/net_pkg.cc: Added back setting of query_error as slave code is depeneding on this. sql/sql_acl.cc: Update after last merge sql/sql_lex.cc: Update after last merge sql/sql_parse.cc: Update after last merge sql/sql_prepare.cc: Update after last merge sql/time.cc: Update after last merge. More comments --- libmysql/libmysql.c | 13 ------------- mysql-test/r/rpl_log.result | 16 +++++++-------- mysql-test/r/rpl_log_pos.result | 2 +- sql/item_strfunc.cc | 5 +++-- sql/log_event.cc | 11 +++++++---- sql/net_pkg.cc | 2 ++ sql/sql_acl.cc | 18 ++++++++--------- sql/sql_lex.cc | 2 +- sql/sql_parse.cc | 2 +- sql/sql_prepare.cc | 7 ++++--- sql/time.cc | 43 ++++++++++++++++++++++++++++------------- 11 files changed, 66 insertions(+), 55 deletions(-) diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index 1b5d59807cd..f164582889e 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -3389,19 +3389,6 @@ static my_bool read_prepare_result(MYSQL *mysql, MYSQL_STMT *stmt) metadata information by reading from server */ -/* QQ The follwing function will be removed after next merge */ - -static char *my_strdup_with_length(const byte *from, uint length, myf MyFlags) -{ - gptr ptr; - if ((ptr=my_malloc(length+1,MyFlags)) != 0) - { - memcpy((byte*) ptr, (byte*) from,(size_t) length); - ((char*) ptr)[length]=0; - } - return((char*) ptr); -} - MYSQL_STMT *STDCALL mysql_prepare(MYSQL *mysql, const char *query, ulong length) diff --git a/mysql-test/r/rpl_log.result b/mysql-test/r/rpl_log.result index 01efce20e1d..b6e1419b466 100644 --- a/mysql-test/r/rpl_log.result +++ b/mysql-test/r/rpl_log.result @@ -71,20 +71,20 @@ slave-bin.002 show binlog events in 'slave-bin.001' from 4; Log_name Pos Event_type Server_id Orig_log_pos Info slave-bin.001 4 Start 2 4 Server ver: VERSION, Binlog ver: 3 -slave-bin.001 79 Query 1 79 use test; create table t1(n int not null auto_increment primary key) +slave-bin.001 79 Query 1 79 use `test`; create table t1(n int not null auto_increment primary key) slave-bin.001 172 Intvar 1 200 INSERT_ID=1 -slave-bin.001 200 Query 1 200 use test; insert into t1 values (NULL) -slave-bin.001 263 Query 1 263 use test; drop table t1 -slave-bin.001 311 Query 1 311 use test; create table t1 (word char(20) not null) +slave-bin.001 200 Query 1 200 use `test`; insert into t1 values (NULL) +slave-bin.001 263 Query 1 263 use `test`; drop table t1 +slave-bin.001 311 Query 1 311 use `test`; create table t1 (word char(20) not null) slave-bin.001 386 Create_file 1 386 db=test;table=t1;file_id=1;block_len=81 slave-bin.001 565 Exec_load 1 556 ;file_id=1 -slave-bin.001 588 Query 1 579 use test; drop table t1 +slave-bin.001 588 Query 1 579 use `test`; drop table t1 slave-bin.001 636 Rotate 2 636 slave-bin.002;pos=4 show binlog events in 'slave-bin.002' from 4; Log_name Pos Event_type Server_id Orig_log_pos Info -slave-bin.002 57 Query 1 4 use `test`; create table t1 (n int) -slave-bin.002 115 Query 1 62 use `test`; insert into t1 values (1) -slave-bin.002 175 Query 1 122 use `test`; drop table t1 +slave-bin.002 4 Query 1 4 use `test`; create table t1 (n int) +slave-bin.002 62 Query 1 62 use `test`; insert into t1 values (1) +slave-bin.002 122 Query 1 122 use `test`; drop table t1 show slave status; Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space 127.0.0.1 root MASTER_PORT 1 master-bin.002 170 slave-relay-bin.002 957 master-bin.002 Yes Yes 0 0 170 961 diff --git a/mysql-test/r/rpl_log_pos.result b/mysql-test/r/rpl_log_pos.result index 6883da76180..8e4f2abe69a 100644 --- a/mysql-test/r/rpl_log_pos.result +++ b/mysql-test/r/rpl_log_pos.result @@ -9,7 +9,7 @@ File Position Binlog_do_db Binlog_ignore_db master-bin.001 79 show slave status; Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space -127.0.0.1 root MASTER_PORT 1 master-bin.001 79 slave-relay-bin.002 120 master-bin.001 Yes Yes 0 0 79 124 +127.0.0.1 root MASTER_PORT 1 master-bin.001 79 slave-relay-bin.002 120 master-bin.001 Yes Yes 0 0 79 128 change master to master_log_pos=73; slave stop; change master to master_log_pos=73; diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 29eaf5a4ad9..2ef95bb8746 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -145,7 +145,7 @@ void Item_func_sha::fix_length_and_dec() String *Item_func_aes_encrypt::val_str(String *str) { char key_buff[80]; - String tmp_key_value(key_buff, sizeof(key_buff)); + String tmp_key_value(key_buff, sizeof(key_buff), system_charset_info); String *sptr= args[0]->val_str(str); // String to encrypt String *key= args[1]->val_str(&tmp_key_value); // key int aes_length; @@ -180,7 +180,8 @@ void Item_func_aes_encrypt::fix_length_and_dec() String *Item_func_aes_decrypt::val_str(String *str) { char key_buff[80]; - String tmp_key_value(key_buff, sizeof(key_buff)), *sptr, *key; + String tmp_key_value(key_buff, sizeof(key_buff), system_charset_info); + String *sptr, *key; DBUG_ENTER("Item_func_aes_decrypt::val_str"); sptr= args[0]->val_str(str); // String to decrypt diff --git a/sql/log_event.cc b/sql/log_event.cc index 70fc1a5ff23..1e6fe924682 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -1526,7 +1526,7 @@ void Append_block_log_event::pack_info(String* packet) length= (uint) my_sprintf(buf, (buf, ";file_id=%u;block_len=%u", file_id, block_len)); - net_store_data(packet, buf, length); + net_store_data(packet, buf, (int32) length); } @@ -1571,7 +1571,7 @@ void Delete_file_log_event::pack_info(String* packet) char buf[64]; uint length; length= (uint) my_sprintf(buf, (buf, ";file_id=%u", (uint) file_id)); - net_store_data(packet, buf, length); + net_store_data(packet, buf, (int32) length); } #endif @@ -1618,7 +1618,7 @@ void Execute_load_log_event::pack_info(String* packet) char buf[64]; uint length; length= (uint) my_sprintf(buf, (buf, ";file_id=%u", (uint) file_id)); - net_store_data(packet, buf, length); + net_store_data(packet, buf, (int32) length); } #endif @@ -1659,7 +1659,9 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli) mysql_log.write(thd,COM_QUERY,"%s",thd->query); DBUG_PRINT("query",("%s",thd->query)); mysql_parse(thd, thd->query, q_len); - if ((expected_error != (actual_error = thd->net.last_errno)) && + DBUG_PRINT("info",("expected_error: %d last_errno: %d", + expected_error, thd->net.last_errno)); + if ((expected_error != (actual_error= thd->net.last_errno)) && expected_error && !ignored_error_code(actual_error) && !ignored_error_code(expected_error)) @@ -1675,6 +1677,7 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli) else if (expected_error == actual_error || ignored_error_code(actual_error)) { + DBUG_PRINT("info",("error ignored")); thd->query_error = 0; *rli->last_slave_error = 0; rli->last_slave_errno = 0; diff --git a/sql/net_pkg.cc b/sql/net_pkg.cc index b804724564e..ef90c12586b 100644 --- a/sql/net_pkg.cc +++ b/sql/net_pkg.cc @@ -31,6 +31,7 @@ void send_error(THD *thd, uint sql_errno, const char *err) net->last_error : "NULL")); query_cache_abort(net); + thd->query_error= 1; // needed to catch query errors during replication if (!err) { if (sql_errno) @@ -132,6 +133,7 @@ net_printf(THD *thd, uint errcode, ...) DBUG_ENTER("net_printf"); DBUG_PRINT("enter",("message: %u",errcode)); + thd->query_error= 1; // needed to catch query errors during replication query_cache_abort(net); // Safety va_start(args,errcode); /* diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index aab3e8899ce..5f8cf42c2bf 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -644,7 +644,7 @@ static void acl_update_user(const char *user, const char *host, { if (!acl_user->host.hostname && !host[0] || acl_user->host.hostname && - !my_strcasecmp(host,acl_user->host.hostname)) + !my_strcasecmp(system_charset_info, host, acl_user->host.hostname)) { acl_user->access=privileges; if (mqh->bits & 1) @@ -733,7 +733,8 @@ static void acl_update_db(const char *user, const char *host, const char *db, !strcmp(user,acl_db->user)) { if (!acl_db->host.hostname && !host[0] || - acl_db->host.hostname && !my_strcasecmp(host,acl_db->host.hostname)) + acl_db->host.hostname && + !my_strcasecmp(system_charset_info, host, acl_db->host.hostname)) { if (!acl_db->db && !db[0] || acl_db->db && !strcmp(db,acl_db->db)) @@ -1010,7 +1011,7 @@ bool check_change_password(THD *thd, const char *host, const char *user) } if (!thd->slave_thread && (strcmp(thd->user,user) || - my_strcasecmp(system_charset_info, host,thd->host_or_ip))) + my_strcasecmp(system_charset_info, host, thd->host_or_ip))) { if (check_access(thd, UPDATE_ACL, "mysql",0,1)) return(1); @@ -1662,7 +1663,6 @@ static GRANT_TABLE *table_hash_search(const char *host,const char* ip, char helping [NAME_LEN*2+USERNAME_LENGTH+3]; uint len; GRANT_TABLE *grant_table,*found=0; - safe_mutex_assert_owner(&LOCK_grant); len = (uint) (strmov(strmov(strmov(helping,user)+1,db)+1,tname)-helping)+ 1; for (grant_table=(GRANT_TABLE*) hash_search(&hash_tables,(byte*) helping, @@ -1672,7 +1672,8 @@ static GRANT_TABLE *table_hash_search(const char *host,const char* ip, { if (exact) { - if ((host && !my_strcasecmp(host,grant_table->host)) || + if ((host && + !my_strcasecmp(system_charset_info, host, grant_table->host)) || (ip && !strcmp(ip,grant_table->host))) return grant_table; } @@ -1872,7 +1873,6 @@ static int replace_table_table(THD *thd, GRANT_TABLE *grant_table, int error=0; ulong store_table_rights, store_col_rights; DBUG_ENTER("replace_table_table"); - safe_mutex_assert_owner(&LOCK_grant); strxmov(grantor, thd->user, "@", thd->host_or_ip, NullS); @@ -2734,7 +2734,7 @@ int mysql_show_grants(THD *thd,LEX_USER *lex_user) if (!(host=acl_user->host.hostname)) host="%"; if (!strcmp(lex_user->user.str,user) && - !my_strcasecmp(lex_user->host.str,host)) + !my_strcasecmp(system_charset_info, lex_user->host.str, host)) break; } if (counter == acl_users.elements) @@ -2881,7 +2881,7 @@ int mysql_show_grants(THD *thd,LEX_USER *lex_user) host=""; if (!strcmp(lex_user->user.str,user) && - !my_strcasecmp(lex_user->host.str,host)) + !my_strcasecmp(system_charset_info, lex_user->host.str, host)) { want_access=acl_db->access; if (want_access) @@ -2940,7 +2940,7 @@ int mysql_show_grants(THD *thd,LEX_USER *lex_user) host=""; if (!strcmp(lex_user->user.str,user) && - !my_strcasecmp(lex_user->host.str,host)) + !my_strcasecmp(system_charset_info, lex_user->host.str, host)) { want_access=grant_table->privs; if ((want_access | grant_table->cols) != 0) diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index fc6265f05af..a8e9bfb1757 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -1082,7 +1082,7 @@ bool st_select_lex_unit::create_total_list_n_last_return(THD *thd, st_lex *lex, for (cursor= **result; cursor; cursor= cursor->next) if (!strcmp(cursor->db, aux->db) && !strcmp(cursor->real_name, aux->real_name) && - !strcmp(cursor->name, aux->name)) + !strcmp(cursor->alias, aux->alias)) break; if (!cursor) { diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index d00f340c8d6..4b1251c5357 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1460,7 +1460,7 @@ mysql_execute_command(THD *thd) if (check_global_access(thd, REPL_SLAVE_ACL)) goto error; #ifndef WORKING_NEW_MASTER - net_printf(&thd->net, ER_NOT_SUPPORTED_YET, "SHOW NEW MASTER"); + net_printf(thd, ER_NOT_SUPPORTED_YET, "SHOW NEW MASTER"); res= 1; #else res = show_new_master(thd); diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 05b3f360caa..a085795fa76 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -351,9 +351,10 @@ static int check_prepare_fields(THD *thd,TABLE *table, List &fields, } TABLE_LIST table_list; bzero((char*) &table_list,sizeof(table_list)); - table_list.name=table->table_name; - table_list.table=table; - table_list.grant=table->grant; + table_list.db= table->table_cache_key; + table_list.real_name= table_list.alias= table->table_name; + table_list.table= table; + table_list.grant= table->grant; thd->dupp_field=0; if (setup_tables(&table_list) || diff --git a/sql/time.cc b/sql/time.cc index e7c9ee82f93..0811b896bfc 100644 --- a/sql/time.cc +++ b/sql/time.cc @@ -418,13 +418,28 @@ ulong convert_month_to_period(ulong month) } -/***************************************************************************** -** convert a timestamp string to a TIME value. -** At least the following formats are recogniced (based on number of digits) -** YYMMDD, YYYYMMDD, YYMMDDHHMMSS, YYYYMMDDHHMMSS -** YY-MM-DD, YYYY-MM-DD, YY-MM-DD HH.MM.SS -** Returns the type of string -*****************************************************************************/ +/* + Convert a timestamp string to a TIME value. + + SYNOPSIS + str_to_TIME() + str String to parse + length Length of string + l_time Date is stored here + fuzzy_date 1 if we should allow dates where one part is zero + + DESCRIPTION + At least the following formats are recogniced (based on number of digits) + YYMMDD, YYYYMMDD, YYMMDDHHMMSS, YYYYMMDDHHMMSS + YY-MM-DD, YYYY-MM-DD, YY-MM-DD HH.MM.SS + YYYYMMDDTHHMMSS where T is a the character T (ISO8601) + Also dates where all parts are zero are allowed + + RETURN VALUES + TIMESTAMP_NONE String wasn't a timestamp + TIMESTAMP_DATE DATE string (YY MM and DD parts ok) + TIMESTAMP_FULL Full timestamp +*/ timestamp_type str_to_TIME(const char *str, uint length, TIME *l_time,bool fuzzy_date) @@ -441,9 +456,9 @@ str_to_TIME(const char *str, uint length, TIME *l_time,bool fuzzy_date) if (str == end) DBUG_RETURN(TIMESTAMP_NONE); /* - ** calculate first number of digits. - ** If length= 8 or >= 14 then year is of format YYYY. - (YYYY-MM-DD, YYYYMMDD, YYYYYMMDDHHMMSS) + calculate first number of digits. + If length= 8 or >= 14 then year is of format YYYY. + (YYYY-MM-DD, YYYYMMDD, YYYYYMMDDHHMMSS) */ for (pos=str; pos != end && my_isdigit(system_charset_info,*pos) ; pos++) ; digits= (uint) (pos-str); @@ -453,7 +468,8 @@ str_to_TIME(const char *str, uint length, TIME *l_time,bool fuzzy_date) for (i=0 ; i < 6 && str != end && my_isdigit(system_charset_info,*str) ; i++) { uint tmp_value=(uint) (uchar) (*str++ - '0'); - while (str != end && my_isdigit(system_charset_info,str[0]) && field_length--) + while (str != end && my_isdigit(system_charset_info,str[0]) && + field_length--) { tmp_value=tmp_value*10 + (uint) (uchar) (*str - '0'); str++; @@ -483,7 +499,8 @@ str_to_TIME(const char *str, uint length, TIME *l_time,bool fuzzy_date) str++; uint tmp_value=(uint) (uchar) (*str - '0'); field_length=3; - while (str++ != end && my_isdigit(system_charset_info,str[0]) && field_length--) + while (str++ != end && my_isdigit(system_charset_info,str[0]) && + field_length--) tmp_value=tmp_value*10 + (uint) (uchar) (*str - '0'); date[6]=tmp_value; not_zero_date|= tmp_value; @@ -505,7 +522,7 @@ str_to_TIME(const char *str, uint length, TIME *l_time,bool fuzzy_date) { for (; str != end ; str++) { - if (!isspace(*str)) + if (!my_isspace(system_charset_info, *str)) { not_zero_date= 1; // Give warning break; -- cgit v1.2.1 From f094b6af4c5c32bfda7f74461d47675ab61722a0 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 3 Oct 2002 18:47:04 +0300 Subject: fixing EXPLAIN select types --- mysql-test/r/compare.result | 2 +- mysql-test/r/create.result | 2 +- mysql-test/r/distinct.result | 24 ++++++++--------- mysql-test/r/explain.result | 10 +++---- mysql-test/r/group_by.result | 10 +++---- mysql-test/r/heap.result | 16 +++++------ mysql-test/r/heap_btree.result | 22 +++++++-------- mysql-test/r/heap_hash.result | 16 +++++------ mysql-test/r/innodb.result | 26 +++++++++--------- mysql-test/r/join_outer.result | 30 ++++++++++----------- mysql-test/r/key_diff.result | 4 +-- mysql-test/r/key_primary.result | 4 +-- mysql-test/r/merge.result | 6 ++--- mysql-test/r/myisam.result | 16 +++++------ mysql-test/r/null_key.result | 52 ++++++++++++++++++------------------ mysql-test/r/odbc.result | 2 +- mysql-test/r/order_by.result | 56 +++++++++++++++++++-------------------- mysql-test/r/range.result | 2 +- mysql-test/r/select.result | 42 ++++++++++++++--------------- mysql-test/r/subselect.result | 8 +++--- mysql-test/r/type_datetime.result | 2 +- mysql-test/r/union.result | 10 +++---- mysql-test/r/user_var.result | 8 +++--- mysql-test/r/varbinary.result | 2 +- sql/sql_parse.cc | 4 ++- 25 files changed, 189 insertions(+), 187 deletions(-) diff --git a/mysql-test/r/compare.result b/mysql-test/r/compare.result index be11de8ebb9..10f149e7a9b 100644 --- a/mysql-test/r/compare.result +++ b/mysql-test/r/compare.result @@ -3,7 +3,7 @@ CREATE TABLE t1 (id CHAR(12) not null, PRIMARY KEY (id)); insert into t1 values ('000000000001'),('000000000002'); explain select * from t1 where id=000000000001; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 index PRIMARY PRIMARY 12 NULL 2 where used; Using index +1 SIMPLE t1 index PRIMARY PRIMARY 12 NULL 2 where used; Using index select * from t1 where id=000000000001; id 000000000001 diff --git a/mysql-test/r/create.result b/mysql-test/r/create.result index 41a977695a6..625ef684698 100644 --- a/mysql-test/r/create.result +++ b/mysql-test/r/create.result @@ -63,7 +63,7 @@ insert into t1 (b) values ("hello"),("my"),("world"); create table t2 (key (b)) select * from t1; explain select * from t2 where b="world"; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t2 ref B B 21 const 1 where used +1 SIMPLE t2 ref B B 21 const 1 where used select * from t2 where b="world"; a B 3 world diff --git a/mysql-test/r/distinct.result b/mysql-test/r/distinct.result index d8386ddcfc3..5848e583d7e 100644 --- a/mysql-test/r/distinct.result +++ b/mysql-test/r/distinct.result @@ -173,9 +173,9 @@ INSERT INTO t2 values (1),(2),(3); INSERT INTO t3 VALUES (1,'1'),(2,'2'),(1,'1'),(2,'2'); explain SELECT distinct t3.a FROM t3,t2,t1 WHERE t3.a=t1.b AND t1.a=t2.a; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t3 index a a 5 NULL 6 Using index; Using temporary -1 FIRST t2 index a a 4 NULL 5 Using index; Distinct -1 FIRST t1 eq_ref PRIMARY PRIMARY 4 t2.a 1 where used; Distinct +1 SIMPLE t3 index a a 5 NULL 6 Using index; Using temporary +1 SIMPLE t2 index a a 4 NULL 5 Using index; Distinct +1 SIMPLE t1 eq_ref PRIMARY PRIMARY 4 t2.a 1 where used; Distinct SELECT distinct t3.a FROM t3,t2,t1 WHERE t3.a=t1.b AND t1.a=t2.a; a 1 @@ -189,8 +189,8 @@ insert into t4 select * from t3; insert into t3 select * from t4; explain select distinct t1.a from t1,t3 where t1.a=t3.a; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 index PRIMARY PRIMARY 4 NULL 2 Using index; Using temporary -1 FIRST t3 ref a a 5 t1.a 10 Using index; Distinct +1 SIMPLE t1 index PRIMARY PRIMARY 4 NULL 2 Using index; Using temporary +1 SIMPLE t3 ref a a 5 t1.a 10 Using index; Distinct select distinct t1.a from t1,t3 where t1.a=t3.a; a 1 @@ -275,13 +275,13 @@ WHERE ((t1.id=j_lj_t2.id AND t2_lj.id IS NULL) OR (t1.id=t2.id AND t2.idx=2)) AND ((t1.id=j_lj_t3.id AND t3_lj.id IS NULL) OR (t1.id=t3.id AND t3.idx=2)); id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 index id id 4 NULL 2 Using index; Using temporary -1 FIRST t2 index id id 8 NULL 1 Using index; Distinct -1 FIRST t3 index id id 8 NULL 1 Using index; Distinct -1 FIRST j_lj_t2 index id id 4 NULL 2 where used; Using index; Distinct -1 FIRST t2_lj index id id 8 NULL 1 where used; Using index; Distinct -1 FIRST j_lj_t3 index id id 4 NULL 2 where used; Using index; Distinct -1 FIRST t3_lj index id id 8 NULL 1 where used; Using index; Distinct +1 SIMPLE t1 index id id 4 NULL 2 Using index; Using temporary +1 SIMPLE t2 index id id 8 NULL 1 Using index; Distinct +1 SIMPLE t3 index id id 8 NULL 1 Using index; Distinct +1 SIMPLE j_lj_t2 index id id 4 NULL 2 where used; Using index; Distinct +1 SIMPLE t2_lj index id id 8 NULL 1 where used; Using index; Distinct +1 SIMPLE j_lj_t3 index id id 4 NULL 2 where used; Using index; Distinct +1 SIMPLE t3_lj index id id 8 NULL 1 where used; Using index; Distinct SELECT DISTINCT t1.id from diff --git a/mysql-test/r/explain.result b/mysql-test/r/explain.result index cd0ddeae120..0d97aeaf531 100644 --- a/mysql-test/r/explain.result +++ b/mysql-test/r/explain.result @@ -10,16 +10,16 @@ id str 3 foo explain select * from t1 where str is null; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref str str 11 const 1 where used +1 SIMPLE t1 ref str str 11 const 1 where used explain select * from t1 where str="foo"; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 const str str 11 const 1 +1 SIMPLE t1 const str str 11 const 1 explain select * from t1 ignore key (str) where str="foo"; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL NULL NULL NULL NULL 4 where used +1 SIMPLE t1 ALL NULL NULL NULL NULL 4 where used explain select * from t1 use key (str,str) where str="foo"; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 const str str 11 const 1 +1 SIMPLE t1 const str str 11 const 1 explain select * from t1 use key (str,str,foo) where str="foo"; Key column 'foo' doesn't exist in table explain select * from t1 ignore key (str,str,foo) where str="foo"; @@ -27,4 +27,4 @@ Key column 'foo' doesn't exist in table drop table t1; explain select 1; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST No tables used +1 SIMPLE No tables used diff --git a/mysql-test/r/group_by.result b/mysql-test/r/group_by.result index 0781468bc97..54b4e3fba6d 100644 --- a/mysql-test/r/group_by.result +++ b/mysql-test/r/group_by.result @@ -226,7 +226,7 @@ key (score) INSERT INTO t1 VALUES (1,1,1),(2,2,2),(2,1,1),(3,3,3),(4,3,3),(5,3,3); explain select userid,count(*) from t1 group by userid desc; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL NULL NULL NULL NULL 6 Using temporary; Using filesort +1 SIMPLE t1 ALL NULL NULL NULL NULL 6 Using temporary; Using filesort select userid,count(*) from t1 group by userid desc; userid count(*) 3 3 @@ -234,10 +234,10 @@ userid count(*) 1 2 explain select spid,count(*) from t1 where spid between 1 and 2 group by spid desc; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range spID spID 5 NULL 2 where used; Using index +1 SIMPLE t1 range spID spID 5 NULL 2 where used; Using index explain select spid,count(*) from t1 where spid between 1 and 2 group by spid; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range spID spID 5 NULL 2 where used; Using index +1 SIMPLE t1 range spID spID 5 NULL 2 where used; Using index select spid,count(*) from t1 where spid between 1 and 2 group by spid; spid count(*) 1 1 @@ -248,7 +248,7 @@ spid count(*) 1 1 explain select sql_big_result spid,sum(userid) from t1 group by spid desc; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL NULL NULL NULL NULL 6 Using filesort +1 SIMPLE t1 ALL NULL NULL NULL NULL 6 Using filesort select sql_big_result spid,sum(userid) from t1 group by spid desc; spid sum(userid) 5 3 @@ -258,7 +258,7 @@ spid sum(userid) 1 1 explain select sql_big_result score,count(*) from t1 group by score desc; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 index NULL score 3 NULL 6 Using index +1 SIMPLE t1 index NULL score 3 NULL 6 Using index select sql_big_result score,count(*) from t1 group by score desc; score count(*) 3 3 diff --git a/mysql-test/r/heap.result b/mysql-test/r/heap.result index 94fac7757ac..8fe87cdda8b 100644 --- a/mysql-test/r/heap.result +++ b/mysql-test/r/heap.result @@ -66,7 +66,7 @@ a alter table t1 type=myisam; explain select * from t1 where a in (869751,736494,226312,802616); id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range uniq_id uniq_id 4 NULL 4 where used; Using index +1 SIMPLE t1 range uniq_id uniq_id 4 NULL 4 where used; Using index drop table t1; create table t1 (x int not null, y int not null, key x (x), unique y (y)) type=heap; @@ -85,8 +85,8 @@ x y x y 2 6 2 2 explain select * from t1,t1 as t2 where t1.x=t2.y; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL x NULL NULL NULL 6 -1 FIRST t2 eq_ref y y 4 t1.x 1 +1 SIMPLE t1 ALL x NULL NULL NULL 6 +1 SIMPLE t2 eq_ref y y 4 t1.x 1 drop table t1; create table t1 (a int) type=heap; insert into t1 values(1); @@ -159,17 +159,17 @@ create table t1 (btn char(10) not null, key(btn)) type=heap; insert into t1 values ("hello"),("hello"),("hello"),("hello"),("hello"),("a"),("b"),("c"),("d"),("e"),("f"),("g"),("h"),("i"); explain select * from t1 where btn like "q%"; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL btn NULL NULL NULL 14 where used +1 SIMPLE t1 ALL btn NULL NULL NULL 14 where used select * from t1 where btn like "q%"; btn alter table t1 add column new_col char(1) not null, add key (btn,new_col), drop key btn; update t1 set new_col=btn; explain select * from t1 where btn="a"; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL btn NULL NULL NULL 14 where used +1 SIMPLE t1 ALL btn NULL NULL NULL 14 where used explain select * from t1 where btn="a" and new_col="a"; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref btn btn 11 const,const 10 where used +1 SIMPLE t1 ref btn btn 11 const,const 10 where used drop table t1; CREATE TABLE t1 ( a int default NULL, @@ -182,7 +182,7 @@ SELECT * FROM t1 WHERE a=NULL; a b explain SELECT * FROM t1 WHERE a IS NULL; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref a a 5 const 10 where used +1 SIMPLE t1 ref a a 5 const 10 where used SELECT * FROM t1 WHERE a<=>NULL; a b NULL 99 @@ -190,7 +190,7 @@ SELECT * FROM t1 WHERE b=NULL; a b explain SELECT * FROM t1 WHERE b IS NULL; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref b b 5 const 1 where used +1 SIMPLE t1 ref b b 5 const 1 where used SELECT * FROM t1 WHERE b<=>NULL; a b 99 NULL diff --git a/mysql-test/r/heap_btree.result b/mysql-test/r/heap_btree.result index 5a8289a16f7..0e8a32bd7b7 100644 --- a/mysql-test/r/heap_btree.result +++ b/mysql-test/r/heap_btree.result @@ -66,7 +66,7 @@ a alter table t1 type=myisam; explain select * from t1 where a in (869751,736494,226312,802616); id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range uniq_id uniq_id 4 NULL 4 where used; Using index +1 SIMPLE t1 range uniq_id uniq_id 4 NULL 4 where used; Using index drop table t1; create table t1 (x int not null, y int not null, key x using BTREE (x), unique y using BTREE (y)) type=heap; @@ -85,8 +85,8 @@ x y x y 2 6 2 2 explain select * from t1,t1 as t2 where t1.x=t2.y; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL x NULL NULL NULL 6 -1 FIRST t2 eq_ref y y 4 t1.x 1 +1 SIMPLE t1 ALL x NULL NULL NULL 6 +1 SIMPLE t2 eq_ref y y 4 t1.x 1 drop table t1; create table t1 (a int) type=heap; insert into t1 values(1); @@ -121,17 +121,17 @@ a b 1 6 explain select * from tx where a=x order by a,b; id select_type table type possible_keys key key_len ref rows Extra -x FIRST tx ref a a x const x where used +x SIMPLE tx ref a a x const x where used explain select * from tx where a=x order by b; id select_type table type possible_keys key key_len ref rows Extra -x FIRST tx ref a a x const x where used +x SIMPLE tx ref a a x const x where used select * from t1 where b=1; a b 1 1 1 1 explain select * from tx where b=x; id select_type table type possible_keys key key_len ref rows Extra -x FIRST tx ref b b x const x where used +x SIMPLE tx ref b b x const x where used drop table t1; create table t1 (id int unsigned not null, primary key using BTREE (id)) type=HEAP; insert into t1 values(1); @@ -172,17 +172,17 @@ create table t1 (btn char(10) not null, key using BTREE (btn)) type=heap; insert into t1 values ("hello"),("hello"),("hello"),("hello"),("hello"),("a"),("b"),("c"),("d"),("e"),("f"),("g"),("h"),("i"); explain select * from t1 where btn like "q%"; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL btn NULL NULL NULL 14 where used +1 SIMPLE t1 ALL btn NULL NULL NULL 14 where used select * from t1 where btn like "q%"; btn alter table t1 add column new_col char(1) not null, add key using BTREE (btn,new_col), drop key btn; update t1 set new_col=btn; explain select * from t1 where btn="a"; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref btn btn 10 const 1 where used +1 SIMPLE t1 ref btn btn 10 const 1 where used explain select * from t1 where btn="a" and new_col="a"; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref btn btn 11 const,const 1 where used +1 SIMPLE t1 ref btn btn 11 const,const 1 where used drop table t1; CREATE TABLE t1 ( a int default NULL, @@ -195,7 +195,7 @@ SELECT * FROM t1 WHERE a=NULL; a b explain SELECT * FROM t1 WHERE a IS NULL; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref a a 5 const 1 where used +1 SIMPLE t1 ref a a 5 const 1 where used SELECT * FROM t1 WHERE a<=>NULL; a b NULL 99 @@ -203,7 +203,7 @@ SELECT * FROM t1 WHERE b=NULL; a b explain SELECT * FROM t1 WHERE b IS NULL; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref b b 5 const 1 where used +1 SIMPLE t1 ref b b 5 const 1 where used SELECT * FROM t1 WHERE b<=>NULL; a b 99 NULL diff --git a/mysql-test/r/heap_hash.result b/mysql-test/r/heap_hash.result index 4dd79e5c52b..43a86069d3d 100644 --- a/mysql-test/r/heap_hash.result +++ b/mysql-test/r/heap_hash.result @@ -66,7 +66,7 @@ a alter table t1 type=myisam; explain select * from t1 where a in (869751,736494,226312,802616); id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range uniq_id uniq_id 4 NULL 4 where used; Using index +1 SIMPLE t1 range uniq_id uniq_id 4 NULL 4 where used; Using index drop table t1; create table t1 (x int not null, y int not null, key x using HASH (x), unique y using HASH (y)) type=heap; @@ -85,8 +85,8 @@ x y x y 2 6 2 2 explain select * from t1,t1 as t2 where t1.x=t2.y; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL x NULL NULL NULL 6 -1 FIRST t2 eq_ref y y 4 t1.x 1 +1 SIMPLE t1 ALL x NULL NULL NULL 6 +1 SIMPLE t2 eq_ref y y 4 t1.x 1 drop table t1; create table t1 (a int) type=heap; insert into t1 values(1); @@ -159,17 +159,17 @@ create table t1 (btn char(10) not null, key using HASH (btn)) type=heap; insert into t1 values ("hello"),("hello"),("hello"),("hello"),("hello"),("a"),("b"),("c"),("d"),("e"),("f"),("g"),("h"),("i"); explain select * from t1 where btn like "q%"; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL btn NULL NULL NULL 14 where used +1 SIMPLE t1 ALL btn NULL NULL NULL 14 where used select * from t1 where btn like "q%"; btn alter table t1 add column new_col char(1) not null, add key using HASH (btn,new_col), drop key btn; update t1 set new_col=btn; explain select * from t1 where btn="a"; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL btn NULL NULL NULL 14 where used +1 SIMPLE t1 ALL btn NULL NULL NULL 14 where used explain select * from t1 where btn="a" and new_col="a"; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref btn btn 11 const,const 10 where used +1 SIMPLE t1 ref btn btn 11 const,const 10 where used drop table t1; CREATE TABLE t1 ( a int default NULL, @@ -182,7 +182,7 @@ SELECT * FROM t1 WHERE a=NULL; a b explain SELECT * FROM t1 WHERE a IS NULL; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref a a 5 const 10 where used +1 SIMPLE t1 ref a a 5 const 10 where used SELECT * FROM t1 WHERE a<=>NULL; a b NULL 99 @@ -190,7 +190,7 @@ SELECT * FROM t1 WHERE b=NULL; a b explain SELECT * FROM t1 WHERE b IS NULL; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref b b 5 const 1 where used +1 SIMPLE t1 ref b b 5 const 1 where used SELECT * FROM t1 WHERE b<=>NULL; a b 99 NULL diff --git a/mysql-test/r/innodb.result b/mysql-test/r/innodb.result index 7b709d6f471..de08465a2a0 100644 --- a/mysql-test/r/innodb.result +++ b/mysql-test/r/innodb.result @@ -140,13 +140,13 @@ id parent_id level 1015 102 2 explain select level from t1 where level=1; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref level level 1 const 12 where used; Using index +1 SIMPLE t1 ref level level 1 const 12 where used; Using index explain select level,id from t1 where level=1; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref level level 1 const 12 where used; Using index +1 SIMPLE t1 ref level level 1 const 12 where used; Using index explain select level,id,parent_id from t1 where level=1; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref level level 1 const 12 where used +1 SIMPLE t1 ref level level 1 const 12 where used select level,id from t1 where level=1; level id 1 1002 @@ -597,7 +597,7 @@ id parent_id level 1016 102 2 explain select level from t1 where level=1; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref level level 1 const 6 where used; Using index +1 SIMPLE t1 ref level level 1 const 6 where used; Using index select level,id from t1 where level=1; level id 1 1004 @@ -759,7 +759,7 @@ create table t1 (a int primary key,b int, c int, d int, e int, f int, g int, h insert into t1 values (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); explain select * from t1 where a > 0 and a < 50; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range PRIMARY PRIMARY 4 NULL 1 where used +1 SIMPLE t1 range PRIMARY PRIMARY 4 NULL 1 where used drop table t1; create table t1 (id int NOT NULL,id2 int NOT NULL,id3 int NOT NULL,dummy1 char(30),primary key (id,id2),index index_id3 (id3)) type=innodb; insert into t1 values (0,0,0,'ABCDEFGHIJ'),(2,2,2,'BCDEFGHIJK'),(1,1,1,'CDEFGHIJKL'); @@ -893,28 +893,28 @@ create table t1 (a int not null, b int not null, c int not null, primary key (a) insert into t1 values (3,3,3),(1,1,1),(2,2,2),(4,4,4); explain select * from t1 order by a; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 index NULL PRIMARY 4 NULL 4 +1 SIMPLE t1 index NULL PRIMARY 4 NULL 4 explain select * from t1 order by b; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 index NULL b 4 NULL 4 +1 SIMPLE t1 index NULL b 4 NULL 4 explain select * from t1 order by c; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL NULL NULL NULL NULL 4 Using filesort +1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using filesort explain select a from t1 order by a; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 index NULL PRIMARY 4 NULL 4 Using index +1 SIMPLE t1 index NULL PRIMARY 4 NULL 4 Using index explain select b from t1 order by b; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 index NULL b 4 NULL 4 Using index +1 SIMPLE t1 index NULL b 4 NULL 4 Using index explain select a,b from t1 order by b; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 index NULL b 4 NULL 4 Using index +1 SIMPLE t1 index NULL b 4 NULL 4 Using index explain select a,b from t1; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 index NULL b 4 NULL 4 Using index +1 SIMPLE t1 index NULL b 4 NULL 4 Using index explain select a,b,c from t1; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL NULL NULL NULL NULL 4 +1 SIMPLE t1 ALL NULL NULL NULL NULL 4 drop table t1; create table t1 (t int not null default 1, key (t)) type=innodb; desc t1; diff --git a/mysql-test/r/join_outer.result b/mysql-test/r/join_outer.result index 3b9b13bdd3c..9c44792724b 100644 --- a/mysql-test/r/join_outer.result +++ b/mysql-test/r/join_outer.result @@ -91,11 +91,11 @@ grp a c id a c d NULL NULL NULL NULL NULL NULL explain select t1.*,t2.* from t1,t2 where t1.a=t2.a and isnull(t2.a)=1; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST Impossible WHERE noticed after reading const tables +1 SIMPLE Impossible WHERE noticed after reading const tables explain select t1.*,t2.* from t1 left join t2 on t1.a=t2.a where isnull(t2.a)=1; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL NULL NULL NULL NULL 7 -1 FIRST t2 eq_ref PRIMARY PRIMARY 8 t1.a 1 where used +1 SIMPLE t1 ALL NULL NULL NULL NULL 7 +1 SIMPLE t2 eq_ref PRIMARY PRIMARY 8 t1.a 1 where used select t1.*,t2.*,t3.a from t1 left join t2 on (t1.a=t2.a) left join t1 as t3 on (t2.a=t3.a); grp a c id a c d a 1 1 a 1 1 a 1 1 @@ -312,12 +312,12 @@ name name id Lilliana Angelovska NULL NULL explain select t1.name, t2.name, t2.id from t1 left join t2 on (t1.id = t2.owner) where t2.id is null; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL NULL NULL NULL NULL 3 -1 FIRST t2 ALL NULL NULL NULL NULL 3 where used; Not exists +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ALL NULL NULL NULL NULL 3 where used; Not exists explain select t1.name, t2.name, t2.id from t1 left join t2 on (t1.id = t2.owner) where t2.name is null; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL NULL NULL NULL NULL 3 -1 FIRST t2 ALL NULL NULL NULL NULL 3 where used +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ALL NULL NULL NULL NULL 3 where used select count(*) from t1 left join t2 on (t1.id = t2.owner); count(*) 4 @@ -332,12 +332,12 @@ name name id Lilliana Angelovska NULL NULL explain select t1.name, t2.name, t2.id from t2 right join t1 on (t1.id = t2.owner) where t2.id is null; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL NULL NULL NULL NULL 3 -1 FIRST t2 ALL NULL NULL NULL NULL 3 where used; Not exists +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ALL NULL NULL NULL NULL 3 where used; Not exists explain select t1.name, t2.name, t2.id from t2 right join t1 on (t1.id = t2.owner) where t2.name is null; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL NULL NULL NULL NULL 3 -1 FIRST t2 ALL NULL NULL NULL NULL 3 where used +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE t2 ALL NULL NULL NULL NULL 3 where used select count(*) from t2 right join t1 on (t1.id = t2.owner); count(*) 4 @@ -619,8 +619,8 @@ UNIQUE id (id,idx) INSERT INTO t2 VALUES (1,1); explain SELECT * from t1 left join t2 on t1.id=t2.id where t2.id IS NULL; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL NULL NULL NULL NULL 2 -1 FIRST t2 index id id 8 NULL 1 where used; Using index; Not exists +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 +1 SIMPLE t2 index id id 8 NULL 1 where used; Using index; Not exists SELECT * from t1 left join t2 on t1.id=t2.id where t2.id IS NULL; id name id idx 2 no NULL NULL @@ -639,8 +639,8 @@ insert into t1 (fooID) values (10),(20),(30); insert into t2 values (10,1),(20,2),(30,3); explain select * from t2 left join t1 on t1.fooID = t2.fooID and t1.fooID = 30; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t2 index NULL PRIMARY 4 NULL 3 Using index -1 FIRST t1 eq_ref PRIMARY PRIMARY 2 const 1 where used; Using index +1 SIMPLE t2 index NULL PRIMARY 4 NULL 3 Using index +1 SIMPLE t1 eq_ref PRIMARY PRIMARY 2 const 1 where used; Using index select * from t2 left join t1 on t1.fooID = t2.fooID and t1.fooID = 30; fooID barID fooID 10 1 NULL diff --git a/mysql-test/r/key_diff.result b/mysql-test/r/key_diff.result index 85d1f455b3f..bdeff4f60d8 100644 --- a/mysql-test/r/key_diff.result +++ b/mysql-test/r/key_diff.result @@ -35,8 +35,8 @@ D E a a a a a a explain select t1.*,t2.* from t1,t1 as t2 where t1.A=t2.B; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL a NULL NULL NULL 5 -1 FIRST t2 ALL b NULL NULL NULL 5 where used +1 SIMPLE t1 ALL a NULL NULL NULL 5 +1 SIMPLE t2 ALL b NULL NULL NULL 5 where used select t1.*,t2.* from t1,t1 as t2 where t1.A=t2.B order by binary t1.a,t2.a; a b a b A B a a diff --git a/mysql-test/r/key_primary.result b/mysql-test/r/key_primary.result index b3c9cef64f0..df9d962b3ac 100644 --- a/mysql-test/r/key_primary.result +++ b/mysql-test/r/key_primary.result @@ -12,8 +12,8 @@ t1 AB% describe select * from t1 where t1="ABC"; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 const PRIMARY PRIMARY 3 const 1 +1 SIMPLE t1 const PRIMARY PRIMARY 3 const 1 describe select * from t1 where t1="ABCD"; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST Impossible WHERE noticed after reading const tables +1 SIMPLE Impossible WHERE noticed after reading const tables drop table t1; diff --git a/mysql-test/r/merge.result b/mysql-test/r/merge.result index f8711d5f0f6..590169338a6 100644 --- a/mysql-test/r/merge.result +++ b/mysql-test/r/merge.result @@ -35,10 +35,10 @@ insert into t1 select NULL,message from t2; create table t3 (a int not null, b char(20), key(a)) type=MERGE UNION=(test.t1,test.t2); explain select * from t3 where a < 10; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t3 range a a 4 NULL 10 where used +1 SIMPLE t3 range a a 4 NULL 10 where used explain select * from t3 where a > 10 and a < 20; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t3 range a a 4 NULL 10 where used +1 SIMPLE t3 range a a 4 NULL 10 where used select * from t3 where a = 10; a b 10 Testing @@ -85,7 +85,7 @@ a b 19 Testing explain select a from t3 order by a desc limit 10; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t3 index NULL a 4 NULL 1131 Using index +1 SIMPLE t3 index NULL a 4 NULL 1131 Using index select a from t3 order by a desc limit 10; a 699 diff --git a/mysql-test/r/myisam.result b/mysql-test/r/myisam.result index 647fe70b694..4b4a88a54f7 100644 --- a/mysql-test/r/myisam.result +++ b/mysql-test/r/myisam.result @@ -52,26 +52,26 @@ create table t1 (a int not null, b int not null, c int not null, primary key (a) insert into t1 values (3,3,3),(1,1,1),(2,2,2),(4,4,4); explain select * from t1 order by a; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL NULL NULL NULL NULL 4 Using filesort +1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using filesort explain select * from t1 order by b; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL NULL NULL NULL NULL 4 Using filesort +1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using filesort explain select * from t1 order by c; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL NULL NULL NULL NULL 4 Using filesort +1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using filesort explain select a from t1 order by a; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 index NULL PRIMARY 4 NULL 4 Using index +1 SIMPLE t1 index NULL PRIMARY 4 NULL 4 Using index explain select b from t1 order by b; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 index NULL b 4 NULL 4 Using index +1 SIMPLE t1 index NULL b 4 NULL 4 Using index explain select a,b from t1 order by b; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL NULL NULL NULL NULL 4 Using filesort +1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using filesort explain select a,b from t1; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL NULL NULL NULL NULL 4 +1 SIMPLE t1 ALL NULL NULL NULL NULL 4 explain select a,b,c from t1; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL NULL NULL NULL NULL 4 +1 SIMPLE t1 ALL NULL NULL NULL NULL 4 drop table t1; diff --git a/mysql-test/r/null_key.result b/mysql-test/r/null_key.result index a11f8ce6090..0a708ff298c 100644 --- a/mysql-test/r/null_key.result +++ b/mysql-test/r/null_key.result @@ -3,37 +3,37 @@ create table t1 (a int, b int not null,unique key (a,b),index(b)) type=myisam; insert ignore into t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(null,7),(9,9),(8,8),(7,7),(null,9),(null,9),(6,6); explain select * from t1 where a is null; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref a a 5 const 3 where used; Using index +1 SIMPLE t1 ref a a 5 const 3 where used; Using index explain select * from t1 where a is null and b = 2; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref a,b a 9 const,const 1 where used; Using index +1 SIMPLE t1 ref a,b a 9 const,const 1 where used; Using index explain select * from t1 where a is null and b = 7; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref a,b a 9 const,const 1 where used; Using index +1 SIMPLE t1 ref a,b a 9 const,const 1 where used; Using index explain select * from t1 where a=2 and b = 2; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 const a,b a 9 const,const 1 +1 SIMPLE t1 const a,b a 9 const,const 1 explain select * from t1 where a<=>b limit 2; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 index NULL a 9 NULL 12 where used; Using index +1 SIMPLE t1 index NULL a 9 NULL 12 where used; Using index explain select * from t1 where (a is null or a > 0 and a < 3) and b < 5 limit 3; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range a,b a 9 NULL 3 where used; Using index +1 SIMPLE t1 range a,b a 9 NULL 3 where used; Using index explain select * from t1 where (a is null or a = 7) and b=7; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref a,b b 4 const 2 where used +1 SIMPLE t1 ref a,b b 4 const 2 where used explain select * from t1 where (a is null and b>a) or a is null and b=7 limit 2; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref a,b a 5 const 3 where used; Using index +1 SIMPLE t1 ref a,b a 5 const 3 where used; Using index explain select * from t1 where a is null and b=9 or a is null and b=7 limit 3; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range a,b a 9 NULL 2 where used; Using index +1 SIMPLE t1 range a,b a 9 NULL 2 where used; Using index explain select * from t1 where a > 1 and a < 3 limit 1; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range a a 5 NULL 1 where used; Using index +1 SIMPLE t1 range a a 5 NULL 1 where used; Using index explain select * from t1 where a > 8 and a < 9; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range a a 5 NULL 1 where used; Using index +1 SIMPLE t1 range a a 5 NULL 1 where used; Using index select * from t1 where a is null; a b NULL 7 @@ -66,43 +66,43 @@ NULL 9 alter table t1 modify b blob not null, add c int not null, drop key a, add unique key (a,b(20),c), drop key b, add key (b(10)); explain select * from t1 where a is null and b = 2; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref a,b a 5 const 3 where used +1 SIMPLE t1 ref a,b a 5 const 3 where used explain select * from t1 where a is null and b = 2 and c=0; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref a,b a 5 const 3 where used +1 SIMPLE t1 ref a,b a 5 const 3 where used explain select * from t1 where a is null and b = 7 and c=0; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref a,b a 5 const 3 where used +1 SIMPLE t1 ref a,b a 5 const 3 where used explain select * from t1 where a=2 and b = 2; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref a,b a 5 const 1 where used +1 SIMPLE t1 ref a,b a 5 const 1 where used explain select * from t1 where a<=>b limit 2; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL NULL NULL NULL NULL 12 where used +1 SIMPLE t1 ALL NULL NULL NULL NULL 12 where used explain select * from t1 where (a is null or a > 0 and a < 3) and b < 5 and c=0 limit 3; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range a,b a 5 NULL 5 where used +1 SIMPLE t1 range a,b a 5 NULL 5 where used explain select * from t1 where (a is null or a = 7) and b=7 and c=0; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range a,b a 5 NULL 4 where used +1 SIMPLE t1 range a,b a 5 NULL 4 where used explain select * from t1 where (a is null and b>a) or a is null and b=7 limit 2; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref a,b a 5 const 3 where used +1 SIMPLE t1 ref a,b a 5 const 3 where used explain select * from t1 where a is null and b=9 or a is null and b=7 limit 3; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref a,b a 5 const 3 where used +1 SIMPLE t1 ref a,b a 5 const 3 where used explain select * from t1 where a > 1 and a < 3 limit 1; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range a a 5 NULL 1 where used +1 SIMPLE t1 range a a 5 NULL 1 where used explain select * from t1 where a is null and b=7 or a > 1 and a < 3 limit 1; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range a,b a 5 NULL 4 where used +1 SIMPLE t1 range a,b a 5 NULL 4 where used explain select * from t1 where a > 8 and a < 9; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range a a 5 NULL 1 where used +1 SIMPLE t1 range a a 5 NULL 1 where used explain select * from t1 where b like "6%"; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range b b 12 NULL 1 where used +1 SIMPLE t1 range b b 12 NULL 1 where used select * from t1 where a is null; a b c NULL 7 0 @@ -152,10 +152,10 @@ INSERT INTO t1 VALUES (1,NULL),(2,NULL),(3,1),(4,2),(5,NULL),(6,NULL),(7,3),(8,4 INSERT INTO t2 VALUES (1,NULL),(2,NULL),(3,1),(4,2),(5,NULL),(6,NULL),(7,3),(8,4),(9,NULL),(10,NULL); explain select id from t1 where uniq_id is null; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref idx1 idx1 5 const 1 where used +1 SIMPLE t1 ref idx1 idx1 5 const 1 where used explain select id from t1 where uniq_id =1; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 const idx1 idx1 5 const 1 +1 SIMPLE t1 const idx1 idx1 5 const 1 UPDATE t1 SET id=id+100 where uniq_id is null; UPDATE t2 SET id=id+100 where uniq_id is null; select id from t1 where uniq_id is null; diff --git a/mysql-test/r/odbc.result b/mysql-test/r/odbc.result index eb6123075fe..f377d54e1a0 100644 --- a/mysql-test/r/odbc.result +++ b/mysql-test/r/odbc.result @@ -11,5 +11,5 @@ select * from t1 where a is null; a b explain select * from t1 where b is null; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST Impossible WHERE noticed after reading const tables +1 SIMPLE Impossible WHERE noticed after reading const tables drop table t1; diff --git a/mysql-test/r/order_by.result b/mysql-test/r/order_by.result index 08d52a782e1..563aa178c87 100644 --- a/mysql-test/r/order_by.result +++ b/mysql-test/r/order_by.result @@ -264,13 +264,13 @@ create table t1 (a int not null, b int, c varchar(10), key (a, b, c)); insert into t1 values (1, NULL, NULL), (1, NULL, 'b'), (1, 1, NULL), (1, 1, 'b'), (1, 1, 'b'), (2, 1, 'a'), (2, 1, 'b'), (2, 2, 'a'), (2, 2, 'b'), (2, 3, 'c'),(1,3,'b'); explain select * from t1 where (a = 1 and b is null and c = 'b') or (a > 2) order by a desc; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range a a 20 NULL 2 where used; Using index +1 SIMPLE t1 range a a 20 NULL 2 where used; Using index select * from t1 where (a = 1 and b is null and c = 'b') or (a > 2) order by a desc; a b c 1 NULL b explain select * from t1 where a >= 1 and a < 3 order by a desc; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range a a 4 NULL 10 where used; Using index +1 SIMPLE t1 range a a 4 NULL 10 where used; Using index select * from t1 where a >= 1 and a < 3 order by a desc; a b c 2 3 c @@ -286,7 +286,7 @@ a b c 1 NULL NULL explain select * from t1 where a = 1 order by a desc, b desc; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref a a 4 const 5 where used; Using index +1 SIMPLE t1 ref a a 4 const 5 where used; Using index select * from t1 where a = 1 order by a desc, b desc; a b c 1 3 b @@ -297,34 +297,34 @@ a b c 1 NULL NULL explain select * from t1 where a = 1 and b is null order by a desc, b desc; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref a a 9 const,const 2 where used; Using index; Using filesort +1 SIMPLE t1 ref a a 9 const,const 2 where used; Using index; Using filesort select * from t1 where a = 1 and b is null order by a desc, b desc; a b c 1 NULL NULL 1 NULL b explain select * from t1 where a >= 1 and a < 3 and b >0 order by a desc,b desc; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range a a 9 NULL 8 where used; Using index; Using filesort +1 SIMPLE t1 range a a 9 NULL 8 where used; Using index; Using filesort explain select * from t1 where a = 2 and b >0 order by a desc,b desc; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range a a 9 NULL 5 where used; Using index +1 SIMPLE t1 range a a 9 NULL 5 where used; Using index explain select * from t1 where a = 2 and b is null order by a desc,b desc; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref a a 9 const,const 1 where used; Using index; Using filesort +1 SIMPLE t1 ref a a 9 const,const 1 where used; Using index; Using filesort explain select * from t1 where a = 2 and (b is null or b > 0) order by a desc,b desc; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range a a 9 NULL 6 where used; Using index +1 SIMPLE t1 range a a 9 NULL 6 where used; Using index explain select * from t1 where a = 2 and b > 0 order by a desc,b desc; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range a a 9 NULL 5 where used; Using index +1 SIMPLE t1 range a a 9 NULL 5 where used; Using index explain select * from t1 where a = 2 and b < 2 order by a desc,b desc; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range a a 9 NULL 2 where used; Using index; Using filesort +1 SIMPLE t1 range a a 9 NULL 2 where used; Using index; Using filesort alter table t1 modify b int not null, modify c varchar(10) not null; explain select * from t1 order by a, b, c; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 index NULL a 18 NULL 11 Using index +1 SIMPLE t1 index NULL a 18 NULL 11 Using index select * from t1 order by a, b, c; a b c 1 0 @@ -340,7 +340,7 @@ a b c 2 3 c explain select * from t1 order by a desc, b desc, c desc; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 index NULL a 18 NULL 11 Using index +1 SIMPLE t1 index NULL a 18 NULL 11 Using index select * from t1 order by a desc, b desc, c desc; a b c 2 3 c @@ -356,14 +356,14 @@ a b c 1 0 explain select * from t1 where (a = 1 and b = 1 and c = 'b') or (a > 2) order by a desc; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range a a 18 NULL 3 where used; Using index +1 SIMPLE t1 range a a 18 NULL 3 where used; Using index select * from t1 where (a = 1 and b = 1 and c = 'b') or (a > 2) order by a desc; a b c 1 1 b 1 1 b explain select * from t1 where a < 2 and b <= 1 order by a desc, b desc; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range a a 4 NULL 6 where used; Using index +1 SIMPLE t1 range a a 4 NULL 6 where used; Using index select * from t1 where a < 2 and b <= 1 order by a desc, b desc; a b c 1 1 b @@ -387,7 +387,7 @@ a b c 1 1 explain select * from t1 where a between 1 and 3 and b <= 1 order by a desc, b desc; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range a a 8 NULL 10 where used; Using index +1 SIMPLE t1 range a a 8 NULL 10 where used; Using index select * from t1 where a between 1 and 3 and b <= 1 order by a desc, b desc; a b c 2 1 b @@ -399,7 +399,7 @@ a b c 1 0 explain select * from t1 where a between 0 and 1 order by a desc, b desc; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 range a a 4 NULL 5 where used; Using index +1 SIMPLE t1 range a a 4 NULL 5 where used; Using index select * from t1 where a between 0 and 1 order by a desc, b desc; a b c 1 3 b @@ -450,24 +450,24 @@ gid sid uid 103853 5 250 EXPLAIN select t1.gid, t2.sid, t3.uid from t3, t2, t1 where t2.gid = t1.gid and t2.uid = t3.uid order by t1.gid, t3.uid; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 index PRIMARY PRIMARY 4 NULL 6 Using index -1 FIRST t2 eq_ref PRIMARY,uid PRIMARY 4 t1.gid 1 -1 FIRST t3 eq_ref PRIMARY PRIMARY 2 t2.uid 1 where used; Using index +1 SIMPLE t1 index PRIMARY PRIMARY 4 NULL 6 Using index +1 SIMPLE t2 eq_ref PRIMARY,uid PRIMARY 4 t1.gid 1 +1 SIMPLE t3 eq_ref PRIMARY PRIMARY 2 t2.uid 1 where used; Using index EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.gid = t3.uid order by t1.gid,t3.skr; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 index PRIMARY PRIMARY 4 NULL 6 Using index -1 FIRST t3 eq_ref PRIMARY PRIMARY 2 t1.gid 1 where used +1 SIMPLE t1 index PRIMARY PRIMARY 4 NULL 6 Using index +1 SIMPLE t3 eq_ref PRIMARY PRIMARY 2 t1.gid 1 where used EXPLAIN SELECT t1.gid, t2.sid, t3.uid from t2, t1, t3 where t2.gid = t1.gid and t2.uid = t3.uid order by t3.uid, t1.gid; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 index PRIMARY PRIMARY 4 NULL 6 Using index; Using temporary; Using filesort -1 FIRST t2 eq_ref PRIMARY,uid PRIMARY 4 t1.gid 1 -1 FIRST t3 eq_ref PRIMARY PRIMARY 2 t2.uid 1 where used; Using index +1 SIMPLE t1 index PRIMARY PRIMARY 4 NULL 6 Using index; Using temporary; Using filesort +1 SIMPLE t2 eq_ref PRIMARY,uid PRIMARY 4 t1.gid 1 +1 SIMPLE t3 eq_ref PRIMARY PRIMARY 2 t2.uid 1 where used; Using index EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.gid = t3.uid order by t3.skr,t1.gid; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 index PRIMARY PRIMARY 4 NULL 6 Using index; Using temporary; Using filesort -1 FIRST t3 eq_ref PRIMARY PRIMARY 2 t1.gid 1 where used +1 SIMPLE t1 index PRIMARY PRIMARY 4 NULL 6 Using index; Using temporary; Using filesort +1 SIMPLE t3 eq_ref PRIMARY PRIMARY 2 t1.gid 1 where used EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.skr = t3.uid order by t1.gid,t3.skr; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL NULL NULL NULL NULL 6 Using temporary; Using filesort -1 FIRST t3 eq_ref PRIMARY PRIMARY 2 t1.skr 1 where used +1 SIMPLE t1 ALL NULL NULL NULL NULL 6 Using temporary; Using filesort +1 SIMPLE t3 eq_ref PRIMARY PRIMARY 2 t1.skr 1 where used drop table t1,t2,t3; diff --git a/mysql-test/r/range.result b/mysql-test/r/range.result index 722a1f5c62c..b10738a9505 100644 --- a/mysql-test/r/range.result +++ b/mysql-test/r/range.result @@ -16,7 +16,7 @@ event_date type event_id 1999-07-14 100600 10 explain select event_date,type,event_id from t1 WHERE type = 100601 and event_date >= "1999-07-01" AND event_date < "1999-07-15" AND (type=100600 OR type=100100) ORDER BY event_date; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST Impossible WHERE +1 SIMPLE Impossible WHERE select event_date,type,event_id from t1 WHERE event_date >= "1999-07-01" AND event_date <= "1999-07-15" AND (type=100600 OR type=100100) or event_date >= "1999-07-01" AND event_date <= "1999-07-15" AND type=100099; event_date type event_id 1999-07-10 100100 24 diff --git a/mysql-test/r/select.result b/mysql-test/r/select.result index 8b3e2aa298e..8c7f3326912 100644 --- a/mysql-test/r/select.result +++ b/mysql-test/r/select.result @@ -1328,19 +1328,19 @@ select t2.fld3 from t2 where fld3 LIKE 'don_t_find_me_please%'; fld3 explain select t2.fld3 from t2 where fld3 = 'honeysuckle'; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t2 ref fld3 fld3 30 const 1 where used; Using index +1 SIMPLE t2 ref fld3 fld3 30 const 1 where used; Using index explain select fld3 from t2 ignore index (fld3) where fld3 = 'honeysuckle'; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t2 index NULL fld3 30 NULL 1199 where used; Using index +1 SIMPLE t2 index NULL fld3 30 NULL 1199 where used; Using index explain select fld3 from t2 use index (fld1) where fld3 = 'honeysuckle'; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t2 index NULL fld3 30 NULL 1199 where used; Using index +1 SIMPLE t2 index NULL fld3 30 NULL 1199 where used; Using index explain select fld3 from t2 use index (fld3) where fld3 = 'honeysuckle'; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t2 ref fld3 fld3 30 const 1 where used; Using index +1 SIMPLE t2 ref fld3 fld3 30 const 1 where used; Using index explain select fld3 from t2 use index (fld1,fld3) where fld3 = 'honeysuckle'; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t2 ref fld3 fld3 30 const 1 where used; Using index +1 SIMPLE t2 ref fld3 fld3 30 const 1 where used; Using index explain select fld3 from t2 ignore index (fld3,not_used); Key column 'not_used' doesn't exist in table explain select fld3 from t2 use index (not_used); @@ -1351,7 +1351,7 @@ honeysuckle honoring explain select t2.fld3 from t2 where fld3 >= 'honeysuckle' and fld3 <= 'honoring' order by fld3; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t2 range fld3 fld3 30 NULL 2 where used; Using index +1 SIMPLE t2 range fld3 fld3 30 NULL 2 where used; Using index select fld1,fld3 from t2 where fld3="Colombo" or fld3 = "nondecreasing" order by fld3; fld1 fld3 148504 Colombo @@ -1371,7 +1371,7 @@ fld1 250502 explain select fld1 from t2 where fld1=250501 or fld1="250502"; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t2 range fld1 fld1 4 NULL 2 where used; Using index +1 SIMPLE t2 range fld1 fld1 4 NULL 2 where used; Using index select fld1 from t2 where fld1=250501 or fld1=250502 or fld1 >= 250505 and fld1 <= 250601 or fld1 between 250501 and 250502; fld1 250501 @@ -1380,7 +1380,7 @@ fld1 250601 explain select fld1 from t2 where fld1=250501 or fld1=250502 or fld1 >= 250505 and fld1 <= 250601 or fld1 between 250501 and 250502; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t2 range fld1 fld1 4 NULL 4 where used; Using index +1 SIMPLE t2 range fld1 fld1 4 NULL 4 where used; Using index select fld1,fld3 from t2 where companynr = 37 and fld3 like 'f%'; fld1 fld3 218401 faithful @@ -1807,8 +1807,8 @@ select distinct fld3 from t2,t3 where t2.companynr = 34 and t2.fld1=t3.t2nr orde fld3 explain select t3.t2nr,fld3 from t2,t3 where t2.companynr = 34 and t2.fld1=t3.t2nr order by t3.t2nr,fld3; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t2 ALL fld1 NULL NULL NULL 1199 where used; Using temporary; Using filesort -1 FIRST t3 eq_ref PRIMARY PRIMARY 4 t2.fld1 1 where used; Using index +1 SIMPLE t2 ALL fld1 NULL NULL NULL 1199 where used; Using temporary; Using filesort +1 SIMPLE t3 eq_ref PRIMARY PRIMARY 4 t2.fld1 1 where used; Using index select period from t1; period 9410 @@ -1822,8 +1822,8 @@ fld3 period breaking 1001 explain select fld3,period from t2,t3 where t2.fld1 = 011401 and t3.t2nr=t2.fld1 and 1001 = t3.period; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t2 const fld1 fld1 4 const 1 -1 FIRST t3 const PRIMARY,period PRIMARY 4 const 1 +1 SIMPLE t2 const fld1 fld1 4 const 1 +1 SIMPLE t3 const PRIMARY,period PRIMARY 4 const 1 select fld3,period from t2,t1 where companynr*10 = 37*10; fld3 period breaking 9410 @@ -2562,20 +2562,20 @@ select t2.companynr,companyname from t2 left join t4 using (companynr) where t4. companynr companyname explain select t2.companynr,companyname from t2 left join t4 using (companynr) where t4.companynr is null; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t2 ALL NULL NULL NULL NULL 1199 -1 FIRST t4 eq_ref PRIMARY PRIMARY 1 test.t2.companynr 1 where used; Not exists +1 SIMPLE t2 ALL NULL NULL NULL NULL 1199 +1 SIMPLE t4 eq_ref PRIMARY PRIMARY 1 test.t2.companynr 1 where used; Not exists explain select t2.companynr,companyname from t4 left join t2 using (companynr) where t2.companynr is null; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t4 ALL NULL NULL NULL NULL 12 -1 FIRST t2 ALL NULL NULL NULL NULL 1199 where used; Not exists +1 SIMPLE t4 ALL NULL NULL NULL NULL 12 +1 SIMPLE t2 ALL NULL NULL NULL NULL 1199 where used; Not exists select distinct t2.companynr,t4.companynr from t2,t4 where t2.companynr=t4.companynr+1; companynr companynr 37 36 41 40 explain select distinct t2.companynr,t4.companynr from t2,t4 where t2.companynr=t4.companynr+1; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t2 ALL NULL NULL NULL NULL 1199 Using temporary -1 FIRST t4 index NULL PRIMARY 1 NULL 12 where used; Using index +1 SIMPLE t2 ALL NULL NULL NULL NULL 1199 Using temporary +1 SIMPLE t4 index NULL PRIMARY 1 NULL 12 where used; Using index select t2.fld1,t2.companynr,fld3,period from t3,t2 where t2.fld1 = 38208 and t2.fld1=t3.t2nr and period = 1008 or t2.fld1 = 38008 and t2.fld1 =t3.t2nr and period = 1008; fld1 companynr fld3 period 038008 37 reporters 1008 @@ -3085,10 +3085,10 @@ fld1 sum(price) 038008 234298 explain select fld3 from t2 where 1>2 or 2>3; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST Impossible WHERE +1 SIMPLE Impossible WHERE explain select fld3 from t2 where fld1=fld1; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t2 ALL NULL NULL NULL NULL 1199 +1 SIMPLE t2 ALL NULL NULL NULL NULL 1199 select companynr,fld1 from t2 HAVING fld1=250501 or fld1=250502; companynr fld1 34 250501 @@ -3140,7 +3140,7 @@ count(*) 4181 explain select min(fld1),max(fld1),count(*) from t2; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST Select tables optimized away +1 SIMPLE Select tables optimized away select min(fld1),max(fld1),count(*) from t2; min(fld1) max(fld1) count(*) 0 1232609 1199 diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index 5a96cc08cbf..aa058a97109 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -49,7 +49,7 @@ a b explain select * from t2 where t2.b=(select a from t3 order by 1 desc limit 1) union (select * from t4 where t4.b=(select max(t2.a)*4 from t2) order by a); id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t2 ALL NULL NULL NULL NULL 2 where used +1 PRIMARY t2 ALL NULL NULL NULL NULL 2 where used 3 UNION t4 ALL NULL NULL NULL NULL 3 where used; Using filesort 4 SUBSELECT t2 ALL NULL NULL NULL NULL 2 2 SUBSELECT t3 ALL NULL NULL NULL NULL 3 Using filesort @@ -65,7 +65,7 @@ explain select (select t3.a from t3 where a<8 order by 1 desc limit 1), a from (select * from t2 where a>1) as tt; id select_type table type possible_keys key key_len ref rows Extra 3 DERIVED t2 ALL NULL NULL NULL NULL 2 where used -1 FIRST system NULL NULL NULL NULL 1 +1 PRIMARY system NULL NULL NULL NULL 1 2 SUBSELECT t3 ALL NULL NULL NULL NULL 3 where used; Using filesort select * from t1 where t1.a=(select t2.a from t2 where t2.b=(select max(a) from t3) order by 1 desc limit 1); a @@ -82,7 +82,7 @@ b (select avg(t2.a+(select min(t3.a) from t3 where t3.a >= t4.a)) from t2) 9 7.5000 explain select b,(select avg(t2.a+(select min(t3.a) from t3 where t3.a >= t4.a)) from t2) from t4; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t4 ALL NULL NULL NULL NULL 3 +1 PRIMARY t4 ALL NULL NULL NULL NULL 3 2 DEPENDENT SUBSELECT t2 ALL NULL NULL NULL NULL 2 3 DEPENDENT SUBSELECT t3 ALL NULL NULL NULL NULL 3 where used select * from t3 where exists (select * from t2 where t2.b=t3.a); @@ -117,7 +117,7 @@ NULL 1 2 2 explain select (select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a), a from t2; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t2 ALL NULL NULL NULL NULL 2 +1 PRIMARY t2 ALL NULL NULL NULL NULL 2 2 DEPENDENT SUBSELECT t1 system NULL NULL NULL NULL 1 where used 3 DEPENDENT UNION t5 ALL NULL NULL NULL NULL 2 where used select (select a from t1 where t1.a=t2.a union all select a from t5 where t5.a=t2.a), a from t2; diff --git a/mysql-test/r/type_datetime.result b/mysql-test/r/type_datetime.result index 51148cd12e9..22cfd2ceefa 100644 --- a/mysql-test/r/type_datetime.result +++ b/mysql-test/r/type_datetime.result @@ -76,5 +76,5 @@ date numfacture expedition 0000-00-00 00:00:00 1212 0001-00-00 00:00:00 EXPLAIN SELECT * FROM t1 WHERE expedition='0001-00-00 00:00:00'; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref expedition expedition 8 const 1 where used +1 SIMPLE t1 ref expedition expedition 8 const 1 where used drop table t1; diff --git a/mysql-test/r/union.result b/mysql-test/r/union.result index 86f62d11bdb..c64ee2ecd78 100644 --- a/mysql-test/r/union.result +++ b/mysql-test/r/union.result @@ -86,29 +86,29 @@ a b 1 a explain (select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1) order by b desc; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL NULL NULL NULL NULL 4 +1 PRIMARY t1 ALL NULL NULL NULL NULL 4 2 UNION t2 ALL NULL NULL NULL NULL 4 Using filesort select found_rows(); FOUND_ROWS() 0 explain select a,b from t1 union all select a,b from t2; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL NULL NULL NULL NULL 4 +1 PRIMARY t1 ALL NULL NULL NULL NULL 4 2 UNION t2 ALL NULL NULL NULL NULL 4 explain select xx from t1 union select 1; Unknown column 'xx' in 'field list' explain select a,b from t1 union select 1; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL NULL NULL NULL NULL 4 +1 PRIMARY t1 ALL NULL NULL NULL NULL 4 2 UNION No tables used explain select 1 union select a,b from t1 union select 1; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST No tables used +1 PRIMARY No tables used 2 UNION t1 ALL NULL NULL NULL NULL 4 3 UNION No tables used explain select a,b from t1 union select 1 limit 0; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST Impossible WHERE +1 PRIMARY Impossible WHERE 2 UNION Impossible WHERE select a,b from t1 into outfile 'skr' union select a,b from t2; Wrong usage of UNION and INTO diff --git a/mysql-test/r/user_var.result b/mysql-test/r/user_var.result index 10cb4fe5c8e..9b2c0316c18 100644 --- a/mysql-test/r/user_var.result +++ b/mysql-test/r/user_var.result @@ -19,14 +19,14 @@ i @vv1:=if(sv1.i,1,0) @vv2:=if(sv2.i,1,0) @vv3:=if(sv3.i,1,0) @vv1+@vv2+@vv3 2 1 0 0 1 explain select * from t1 where i=@vv1; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref i i 4 const 1 where used +1 SIMPLE t1 ref i i 4 const 1 where used explain select * from t1 where @vv1:=@vv1+1 and i=@vv1; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ALL NULL NULL NULL NULL 3 where used +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 where used explain select @vv1:=i from t1 where i=@vv1; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 index NULL i 4 NULL 3 where used; Using index +1 SIMPLE t1 index NULL i 4 NULL 3 where used; Using index explain select * from t1 where i=@vv1; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 ref i i 4 const 1 where used +1 SIMPLE t1 ref i i 4 const 1 where used drop table t1,t2; diff --git a/mysql-test/r/varbinary.result b/mysql-test/r/varbinary.result index a7bd29afd78..1b6cf5e708e 100644 --- a/mysql-test/r/varbinary.result +++ b/mysql-test/r/varbinary.result @@ -12,7 +12,7 @@ insert into t1 set UNIQ=0x38afba1d73e6a18a; insert into t1 set UNIQ=123; explain select * from t1 where UNIQ=0x38afba1d73e6a18a; id select_type table type possible_keys key key_len ref rows Extra -1 FIRST t1 const UNIQ UNIQ 8 const 1 +1 SIMPLE t1 const UNIQ UNIQ 8 const 1 drop table t1; select x'hello'; You have an error in your SQL syntax near 'x'hello'' at line 1 diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 8166a156b8c..a898df89383 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1443,7 +1443,9 @@ mysql_execute_command(void) { SELECT_LEX *first= sl->master_unit()->first_select(); res= mysql_explain_select(thd, sl, - ((select_lex==sl)?"FIRST": + ((select_lex==sl)? + ((sl->next_select_in_list())?"PRIMARY": + "SIMPLE"): ((sl == first)? ((sl->depended)?"DEPENDENT SUBSELECT": "SUBSELECT"): -- cgit v1.2.1 From e607221a3cd778131cc9250108473819c9b8c8a0 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 3 Oct 2002 19:44:46 +0300 Subject: Fixed bug that causes select test to fail Now MySQL 4.1 is up to date with all patches from 4.0.4 and passes the test suite. mysql-test/r/rpl_log_pos.result: Fix results sql/sql_select.cc: Fixed bug that causes select test to fail --- mysql-test/r/rpl_log_pos.result | 2 +- sql/sql_select.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/rpl_log_pos.result b/mysql-test/r/rpl_log_pos.result index 8e4f2abe69a..6883da76180 100644 --- a/mysql-test/r/rpl_log_pos.result +++ b/mysql-test/r/rpl_log_pos.result @@ -9,7 +9,7 @@ File Position Binlog_do_db Binlog_ignore_db master-bin.001 79 show slave status; Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space -127.0.0.1 root MASTER_PORT 1 master-bin.001 79 slave-relay-bin.002 120 master-bin.001 Yes Yes 0 0 79 128 +127.0.0.1 root MASTER_PORT 1 master-bin.001 79 slave-relay-bin.002 120 master-bin.001 Yes Yes 0 0 79 124 change master to master_log_pos=73; slave stop; change master to master_log_pos=73; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 7cc5fd4f9d8..55e07c8bb20 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -2173,7 +2173,7 @@ find_best(JOIN *join,table_map rest_tables,uint idx,double record_count, join->positions[idx].table= s; if (!best_key && idx == join->const_tables && s->table == join->sort_by_table && - join->thd->select_limit >= records) + join->unit->select_limit_cnt >= records) join->sort_by_table= (TABLE*) 1; // Must use temporary table /* -- cgit v1.2.1 From 9e5a4be4605cf71c5e3d6c07283c95fc4f29db70 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 4 Oct 2002 16:41:09 +0500 Subject: a bit speeding-up of key_cmp() function --- mysys/my_handler.c | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/mysys/my_handler.c b/mysys/my_handler.c index 5b68b427f3a..fe610b73fe9 100644 --- a/mysys/my_handler.c +++ b/mysys/my_handler.c @@ -78,10 +78,9 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, uint32 u_1,u_2; float f_1,f_2; double d_1,d_2; - uint next_key_length; *diff_pos=0; - for ( ; (int) key_length >0 ; key_length=next_key_length, keyseg++) + for ( ; (int) key_length >0 ; keyseg++) { uchar *end; uint piks=! (keyseg->flag & HA_NO_SORT); @@ -101,12 +100,10 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, { if (nextflag == (SEARCH_FIND | SEARCH_UPDATE)) nextflag=SEARCH_SAME; /* Allow duplicate keys */ - next_key_length=key_length; continue; /* To next key part */ } } end= a+ min(keyseg->length,key_length); - next_key_length=key_length-keyseg->length; switch ((enum ha_base_keytype) keyseg->type) { case HA_KEYTYPE_TEXT: /* Ascii; Key is converted */ @@ -115,12 +112,12 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, int a_length,b_length,pack_length; get_key_length(a_length,a); get_key_pack_length(b_length,pack_length,b); - next_key_length=key_length-b_length-pack_length; + key_length-= b_length + pack_length; if (piks && (flag= mi_compare_text(keyseg->charset,a,a_length,b,b_length, (my_bool) ((nextflag & SEARCH_PREFIX) && - next_key_length <= 0)))) + key_length <= 0)))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a+=a_length; b+=b_length; @@ -129,6 +126,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, else { uint length=(uint) (end-a), a_length=length, b_length=length; + key_length-= keyseg->length; if (!(nextflag & SEARCH_PREFIX)) { while (a_length && a[a_length-1] == ' ') @@ -139,7 +137,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, if (piks && (flag= mi_compare_text(keyseg->charset,a,a_length,b,b_length, (my_bool) ((nextflag & SEARCH_PREFIX) && - next_key_length <= 0)))) + key_length <= 0)))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a=end; b+=length; @@ -151,12 +149,12 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, int a_length,b_length,pack_length; get_key_length(a_length,a); get_key_pack_length(b_length,pack_length,b); - next_key_length=key_length-b_length-pack_length; + key_length-= b_length + pack_length; if (piks && (flag=compare_bin(a,a_length,b,b_length, (my_bool) ((nextflag & SEARCH_PREFIX) && - next_key_length <= 0)))) + key_length <= 0)))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a+=a_length; b+=b_length; @@ -165,10 +163,11 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, else { uint length=keyseg->length; + key_length-= keyseg->length; if (piks && (flag=compare_bin(a,length,b,length, (my_bool) ((nextflag & SEARCH_PREFIX) && - next_key_length <= 0)))) + key_length <= 0)))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a+=length; b+=length; @@ -179,12 +178,12 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, int a_length,b_length,pack_length; get_key_length(a_length,a); get_key_pack_length(b_length,pack_length,b); - next_key_length=key_length-b_length-pack_length; + key_length-= b_length + pack_length; if (piks && (flag= mi_compare_text(keyseg->charset,a,a_length,b,b_length, (my_bool) ((nextflag & SEARCH_PREFIX) && - next_key_length <= 0)))) + key_length <= 0)))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a+=a_length; b+=b_length; @@ -196,12 +195,12 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, int a_length,b_length,pack_length; get_key_length(a_length,a); get_key_pack_length(b_length,pack_length,b); - next_key_length=key_length-b_length-pack_length; + key_length-= b_length + pack_length; if (piks && (flag=compare_bin(a,a_length,b,b_length, (my_bool) ((nextflag & SEARCH_PREFIX) && - next_key_length <= 0)))) + key_length <= 0)))) return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a+=a_length; b+=b_length; @@ -216,6 +215,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b++; + key_length-= keyseg->length; break; } case HA_KEYTYPE_SHORT_INT: @@ -225,6 +225,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 2; /* sizeof(short int); */ + key_length-= keyseg->length; break; case HA_KEYTYPE_USHORT_INT: { @@ -235,6 +236,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+=2; /* sizeof(short int); */ + key_length-= keyseg->length; break; } case HA_KEYTYPE_LONG_INT: @@ -244,6 +246,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 4; /* sizeof(long int); */ + key_length-= keyseg->length; break; case HA_KEYTYPE_ULONG_INT: u_1= mi_sint4korr(a); @@ -252,6 +255,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 4; /* sizeof(long int); */ + key_length-= keyseg->length; break; case HA_KEYTYPE_INT24: l_1=mi_sint3korr(a); @@ -260,6 +264,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 3; + key_length-= keyseg->length; break; case HA_KEYTYPE_UINT24: l_1=mi_uint3korr(a); @@ -268,6 +273,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 3; + key_length-= keyseg->length; break; case HA_KEYTYPE_FLOAT: mi_float4get(f_1,a); @@ -276,6 +282,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 4; /* sizeof(float); */ + key_length-= keyseg->length; break; case HA_KEYTYPE_DOUBLE: mi_float8get(d_1,a); @@ -284,6 +291,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 8; /* sizeof(double); */ + key_length-= keyseg->length; break; case HA_KEYTYPE_NUM: /* Numeric key */ { @@ -300,7 +308,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, { alength= *a++; blength= *b++; end=a+alength; - next_key_length=key_length-blength-1; + key_length-= blength + 1; } else { @@ -309,6 +317,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, /* remove pre space from keys */ for ( ; alength && *a == ' ' ; a++, alength--) ; for ( ; blength && *b == ' ' ; b++, blength--) ; + key_length-= keyseg->length; } if (piks) @@ -360,6 +369,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 8; + key_length-= keyseg->length; break; } case HA_KEYTYPE_ULONGLONG: @@ -371,6 +381,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag); a= end; b+= 8; + key_length-= keyseg->length; break; } #endif -- cgit v1.2.1 From 72a3c80dbb131339406ec4a815f423a1bd8926cc Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 7 Oct 2002 00:56:21 +0300 Subject: after merging fix --- BUILD/compile-pentium-debug | 4 ++-- mysql-test/r/subselect.result | 2 +- mysql-test/t/subselect.test | 2 +- sql/net_pkg.cc | 2 ++ sql/sql_parse.cc | 4 ++-- sql/sql_select.cc | 10 ++++++---- 6 files changed, 14 insertions(+), 10 deletions(-) diff --git a/BUILD/compile-pentium-debug b/BUILD/compile-pentium-debug index 27a637d965f..4a9d0e74599 100755 --- a/BUILD/compile-pentium-debug +++ b/BUILD/compile-pentium-debug @@ -6,8 +6,8 @@ path=`dirname $0` extra_flags="$pentium_cflags $debug_cflags" c_warnings="$c_warnings $debug_extra_warnings" cxx_warnings="$cxx_warnings $debug_extra_warnings" -extra_configs="$pentium_configs $debug_configs $static_link" +extra_configs="$pentium_configs $debug_configs " -extra_configs="$extra_configs $static_link" +extra_configs="$extra_configs" . "$path/FINISH.sh" diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index aa058a97109..911065890e2 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -121,7 +121,7 @@ id select_type table type possible_keys key key_len ref rows Extra 2 DEPENDENT SUBSELECT t1 system NULL NULL NULL NULL 1 where used 3 DEPENDENT UNION t5 ALL NULL NULL NULL NULL 2 where used select (select a from t1 where t1.a=t2.a union all select a from t5 where t5.a=t2.a), a from t2; -Subselect return more than 1 record +Subselect returns more than 1 record create table attend (patient_uq int, clinic_uq int, index i1 (clinic_uq)); create table clinic( uq int primary key, name char(25)); insert into clinic values(1,"Oblastnaia bolnitsa"),(2,"Bolnitsa Krasnogo Kresta"); diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 3ae695c8967..bf98090eb43 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -45,7 +45,7 @@ select (select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a) insert into t5 values (2); select (select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a), a from t2; explain select (select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a), a from t2; --- error 1230 +-- error 1240 select (select a from t1 where t1.a=t2.a union all select a from t5 where t5.a=t2.a), a from t2; create table attend (patient_uq int, clinic_uq int, index i1 (clinic_uq)); create table clinic( uq int primary key, name char(25)); diff --git a/sql/net_pkg.cc b/sql/net_pkg.cc index fc8bc77e713..9f91db95052 100644 --- a/sql/net_pkg.cc +++ b/sql/net_pkg.cc @@ -66,6 +66,8 @@ void send_error(THD *thd, uint sql_errno, const char *err) else { length=(uint) strlen(err); + set_if_smaller(length,MYSQL_ERRMSG_SIZE-1); + } VOID(net_write_command(net,(uchar) 255, "", 0, (char*) err,length)); thd->fatal_error=0; // Error message is given thd->net.report_error= 0; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 62744edd763..7902e66043d 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1339,7 +1339,7 @@ mysql_execute_command(THD *thd) { if (!(explain_result= new select_send())) { - send_error(&thd->net, ER_OUT_OF_RESOURCES); + send_error(thd, ER_OUT_OF_RESOURCES); DBUG_VOID_RETURN; } //check rights @@ -1478,7 +1478,7 @@ mysql_execute_command(THD *thd) if (!explain_result) if (!(explain_result= new select_send())) { - send_error(&thd->net, ER_OUT_OF_RESOURCES); + send_error(thd, ER_OUT_OF_RESOURCES); DBUG_VOID_RETURN; } else diff --git a/sql/sql_select.cc b/sql/sql_select.cc index c4b100e453e..35703e57d82 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -154,8 +154,8 @@ int handle_select(THD *thd, LEX *lex, select_result *result) { int res; register SELECT_LEX *select_lex = &lex->select_lex; - - if (select_lex->next_select()) + fix_tables_pointers(select_lex); + if (select_lex->next_select()) res=mysql_union(thd,lex,result); else res=mysql_select(thd,(TABLE_LIST*) select_lex->table_list.first, @@ -171,7 +171,7 @@ int handle_select(THD *thd, LEX *lex, select_result *result) result->abort(); if (res || thd->net.report_error) { - send_error(&thd->net, 0, MYF(0)); + send_error(thd, 0, MYF(0)); res= 1; } delete result; @@ -7215,6 +7215,8 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, String tmp2(buff2,sizeof(buff2),default_charset_info); tmp1.length(0); tmp2.length(0); + + item_list.empty(); item_list.push_back(new Item_int((int)thd->lex.select->select_number)); item_list.push_back(new Item_string(thd->lex.select->type, strlen(thd->lex.select->type), @@ -7224,7 +7226,7 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, if (table->tmp_table == TMP_TABLE && table->derived_select_number != 0) { // Derived table name generation - buff[512]; + char buff[512]; int len= my_snprintf(buff, 512, "", table->derived_select_number); item_list.push_back(new Item_string(buff, len, default_charset_info)); -- cgit v1.2.1 From 9195963f56122b3ca7fa480607b8da9ae969a364 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 7 Oct 2002 17:49:03 +0500 Subject: auto_increment for heap tables test case heap/hp_create.c: auto_increment for heap tables heap/hp_hash.c: auto_increment for heap tables heap/hp_info.c: auto_increment for heap tables heap/hp_test1.c: auto_increment for heap tables heap/hp_test2.c: auto_increment for heap tables heap/hp_update.c: auto_increment for heap tables heap/hp_write.c: auto_increment for heap tables include/heap.h: auto_increment for heap tables mysql-test/r/create.result: auto_increment for heap tables mysql-test/t/create.test: auto_increment for heap tables sql/ha_heap.cc: auto_increment for heap tables sql/ha_heap.h: auto_increment for heap tables --- heap/hp_create.c | 6 +++++- heap/hp_hash.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++ heap/hp_info.c | 2 ++ heap/hp_test1.c | 6 +++++- heap/hp_test2.c | 7 +++++-- heap/hp_update.c | 12 ++++++++---- heap/hp_write.c | 2 ++ include/heap.h | 16 ++++++++++++++-- mysql-test/r/create.result | 3 +-- mysql-test/t/create.test | 4 ++-- sql/ha_heap.cc | 35 ++++++++++++++++++++++++++++++--- sql/ha_heap.h | 5 +++-- 12 files changed, 127 insertions(+), 19 deletions(-) diff --git a/heap/hp_create.c b/heap/hp_create.c index 7eee6eaa64d..6c38d54cb12 100644 --- a/heap/hp_create.c +++ b/heap/hp_create.c @@ -21,7 +21,8 @@ static void init_block(HP_BLOCK *block,uint reclength,ulong min_records, ulong max_records); int heap_create(const char *name, uint keys, HP_KEYDEF *keydef, - uint reclength, ulong max_records, ulong min_records) + uint reclength, ulong max_records, ulong min_records, + HP_CREATE_INFO *create_info) { uint i, j, key_segs, max_length, length; HP_SHARE *share; @@ -120,6 +121,9 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef, share->keys= keys; share->max_key_length= max_length; share->changed= 0; + share->auto_key= create_info->auto_key; + share->auto_key_type= create_info->auto_key_type; + share->auto_increment= create_info->auto_increment; if (!(share->name= my_strdup(name,MYF(0)))) { my_free((gptr) share,MYF(0)); diff --git a/heap/hp_hash.c b/heap/hp_hash.c index 4f7dc956cba..0145e0d503c 100644 --- a/heap/hp_hash.c +++ b/heap/hp_hash.c @@ -537,3 +537,51 @@ my_bool hp_if_null_in_key(HP_KEYDEF *keydef, const byte *record) } return 0; } + +void heap_update_auto_increment(HP_INFO *info, const byte *record) +{ + ulonglong value; + HA_KEYSEG *keyseg= info->s->keydef[info->s->auto_key - 1].seg; + const uchar *key= (uchar*) record + keyseg->start; + + switch (info->s->auto_key_type) { + case HA_KEYTYPE_INT8: + case HA_KEYTYPE_BINARY: + value= (ulonglong) *(uchar*) key; + break; + case HA_KEYTYPE_SHORT_INT: + case HA_KEYTYPE_USHORT_INT: + value= (ulonglong) uint2korr(key); + break; + case HA_KEYTYPE_LONG_INT: + case HA_KEYTYPE_ULONG_INT: + value= (ulonglong) uint4korr(key); + break; + case HA_KEYTYPE_INT24: + case HA_KEYTYPE_UINT24: + value= (ulonglong) uint3korr(key); + break; + case HA_KEYTYPE_FLOAT: /* This shouldn't be used */ + { + float f_1; + float4get(f_1, key); + value= (ulonglong) f_1; + break; + } + case HA_KEYTYPE_DOUBLE: /* This shouldn't be used */ + { + double f_1; + float8get(f_1, key); + value= (ulonglong) f_1; + break; + } + case HA_KEYTYPE_LONGLONG: + case HA_KEYTYPE_ULONGLONG: + value= uint8korr(key); + break; + default: + value= 0; /* Error */ + break; + } + set_if_bigger(info->s->auto_increment, value); +} diff --git a/heap/hp_info.c b/heap/hp_info.c index 3e9d6b6a90b..3122a665fac 100644 --- a/heap/hp_info.c +++ b/heap/hp_info.c @@ -55,5 +55,7 @@ int heap_info(reg1 HP_INFO *info,reg2 HEAPINFO *x, x->index_length= info->s->index_length; x->max_records = info->s->max_records; x->errkey = info->errkey; + if (flag & HA_STATUS_AUTO) + x->auto_increment= info->s->auto_increment + 1; DBUG_RETURN(0); } /* heap_info */ diff --git a/heap/hp_test1.c b/heap/hp_test1.c index 58a13efc12f..2e0a57a12d3 100644 --- a/heap/hp_test1.c +++ b/heap/hp_test1.c @@ -37,11 +37,14 @@ int main(int argc, char **argv) const char *filename; HP_KEYDEF keyinfo[10]; HA_KEYSEG keyseg[4]; + HP_CREATE_INFO hp_create_info; MY_INIT(argv[0]); filename= "test1"; get_options(argc,argv); + bzero(&hp_create_info, sizeof(hp_create_info)); + keyinfo[0].keysegs=1; keyinfo[0].seg=keyseg; keyinfo[0].algorithm= HA_KEY_ALG_HASH; @@ -55,7 +58,8 @@ int main(int argc, char **argv) bzero((gptr) flags,sizeof(flags)); printf("- Creating heap-file\n"); - if (heap_create(filename,1,keyinfo,30,(ulong) flag*100000l,10l) || + if (heap_create(filename,1,keyinfo,30,(ulong) flag*100000l,10l, + &hp_create_info) || !(file= heap_open(filename, 2))) goto err; printf("- Writing records:s\n"); diff --git a/heap/hp_test2.c b/heap/hp_test2.c index 3355c94727b..73e8039d125 100644 --- a/heap/hp_test2.c +++ b/heap/hp_test2.c @@ -63,6 +63,7 @@ int main(int argc, char *argv[]) HP_KEYDEF keyinfo[MAX_KEYS]; HA_KEYSEG keyseg[MAX_KEYS*5]; HEAP_PTR position; + HP_CREATE_INFO hp_create_info; MY_INIT(argv[0]); /* init my_sys library & pthreads */ LINT_INIT(position); @@ -70,6 +71,8 @@ int main(int argc, char *argv[]) filename2= "test2_2"; file=file2=0; get_options(argc,argv); + + bzero(&hp_create_info, sizeof(hp_create_info)); write_count=update=opt_delete=0; key_check=0; @@ -122,7 +125,7 @@ int main(int argc, char *argv[]) printf("- Creating heap-file\n"); if (heap_create(filename,keys,keyinfo,reclength,(ulong) flag*100000L, - (ulong) recant/2) || + (ulong) recant/2, &hp_create_info) || !(file= heap_open(filename, 2))) goto err; signal(SIGINT,endprog); @@ -557,7 +560,7 @@ int main(int argc, char *argv[]) heap_close(file2); printf("- Creating output heap-file 2\n"); - if (heap_create(filename2,1,keyinfo,reclength,0L,0L) || + if (heap_create(filename2,1,keyinfo,reclength,0L,0L,&hp_create_info) || !(file2= heap_open(filename2, 2))) goto err; diff --git a/heap/hp_update.c b/heap/hp_update.c index dd47e04ebc2..dd7374f506c 100644 --- a/heap/hp_update.c +++ b/heap/hp_update.c @@ -22,7 +22,8 @@ int heap_update(HP_INFO *info, const byte *old, const byte *heap_new) { HP_KEYDEF *keydef, *end, *p_lastinx; byte *pos; - HP_SHARE *share=info->s; + bool auto_key_changed= 0; + HP_SHARE *share= info->s; DBUG_ENTER("heap_update"); test_active(info); @@ -33,20 +34,23 @@ int heap_update(HP_INFO *info, const byte *old, const byte *heap_new) if (--(share->records) < share->blength >> 1) share->blength>>= 1; share->changed=1; - p_lastinx = share->keydef + info->lastinx; - for (keydef = share->keydef, end = keydef + share->keys; keydef < end; - keydef++) + p_lastinx= share->keydef + info->lastinx; + for (keydef= share->keydef, end= keydef + share->keys; keydef < end; keydef++) { if (hp_rec_key_cmp(keydef, old, heap_new)) { if ((*keydef->delete_key)(info, keydef, old, pos, keydef == p_lastinx) || (*keydef->write_key)(info, keydef, heap_new, pos)) goto err; + if (share->auto_key == (uint) (keydef - share->keydef + 1)) + auto_key_changed= 1; } } memcpy(pos,heap_new,(size_t) share->reclength); if (++(share->records) == share->blength) share->blength+= share->blength; + if (auto_key_changed) + heap_update_auto_increment(info, heap_new); DBUG_RETURN(0); err: diff --git a/heap/hp_write.c b/heap/hp_write.c index 33527855e60..9edd897eb34 100644 --- a/heap/hp_write.c +++ b/heap/hp_write.c @@ -61,6 +61,8 @@ int heap_write(HP_INFO *info, const byte *record) info->current_ptr=pos; info->current_hash_ptr=0; info->update|=HA_STATE_AKTIV; + if (share->auto_key) + heap_update_auto_increment(info, record); DBUG_RETURN(0); err: DBUG_PRINT("info",("Duplicate key: %d", keydef - share->keydef)); diff --git a/include/heap.h b/include/heap.h index 359c4346a5d..3702d88ac70 100644 --- a/include/heap.h +++ b/include/heap.h @@ -50,6 +50,7 @@ typedef struct st_heapinfo /* Struct from heap_info */ ulong index_length; uint reclength; /* Length of one record */ int errkey; + ulonglong auto_increment; } HEAPINFO; @@ -115,6 +116,9 @@ typedef struct st_heap_share #endif my_bool delete_on_close; LIST open_list; + uint auto_key; + uint auto_key_type; /* real type of the auto key segment */ + ulonglong auto_increment; } HP_SHARE; struct st_hp_hash_info; @@ -140,6 +144,13 @@ typedef struct st_heap_info LIST open_list; } HP_INFO; +typedef struct st_heap_create_info +{ + uint auto_key; + uint auto_key_type; + ulonglong auto_increment; +} HP_CREATE_INFO; + /* Prototypes for heap-functions */ extern HP_INFO *heap_open(const char *name, int mode); @@ -152,7 +163,8 @@ extern int heap_scan(register HP_INFO *info, byte *record); extern int heap_delete(HP_INFO *info,const byte *buff); extern int heap_info(HP_INFO *info,HEAPINFO *x,int flag); extern int heap_create(const char *name, uint keys, HP_KEYDEF *keydef, - uint reclength, ulong max_records, ulong min_records); + uint reclength, ulong max_records, ulong min_records, + HP_CREATE_INFO *create_info); extern int heap_delete_table(const char *name); extern int heap_extra(HP_INFO *info,enum ha_extra_function function); extern int heap_rename(const char *old_name,const char *new_name); @@ -163,7 +175,7 @@ extern int heap_rprev(HP_INFO *info,byte *record); extern int heap_rfirst(HP_INFO *info,byte *record,int inx); extern int heap_rlast(HP_INFO *info,byte *record,int inx); extern void heap_clear(HP_INFO *info); - +extern void heap_update_auto_increment(HP_INFO *info, const byte *record); ha_rows hp_rb_records_in_range(HP_INFO *info, int inx, const byte *start_key, uint start_key_len, enum ha_rkey_function start_search_flag, diff --git a/mysql-test/r/create.result b/mysql-test/r/create.result index 9b56b2b5160..6eaef1f5d24 100644 --- a/mysql-test/r/create.result +++ b/mysql-test/r/create.result @@ -22,14 +22,13 @@ drop table if exists t1,t2; create table t1 (b char(0) not null, index(b)); The used table handler can't index column 'b' create table t1 (a int not null auto_increment,primary key (a)) type=heap; -The used table type doesn't support AUTO_INCREMENT columns create table t1 (a int not null,b text) type=heap; The used table type doesn't support BLOB/TEXT columns create table t1 (a int ,primary key(a)) type=heap; All parts of a PRIMARY KEY must be NOT NULL; If you need NULL in a key, use UNIQUE instead drop table if exists t1; create table t1 (ordid int(8) not null auto_increment, ord varchar(50) not null, primary key (ord,ordid)) type=heap; -The used table type doesn't support AUTO_INCREMENT columns +Incorrect table definition; There can only be one auto column and it must be defined as a key create table t1 (ordid int(8), primary key (ordid)); All parts of a PRIMARY KEY must be NOT NULL; If you need NULL in a key, use UNIQUE instead create table not_existing_database.test (a int); diff --git a/mysql-test/t/create.test b/mysql-test/t/create.test index 47ee55620e4..65be9683061 100644 --- a/mysql-test/t/create.test +++ b/mysql-test/t/create.test @@ -22,12 +22,12 @@ drop table if exists t1; !$1146 create table t2 select auto+1 from t1; drop table if exists t1,t2; !$1167 create table t1 (b char(0) not null, index(b)); -!$1164 create table t1 (a int not null auto_increment,primary key (a)) type=heap; +create table t1 (a int not null auto_increment,primary key (a)) type=heap; !$1163 create table t1 (a int not null,b text) type=heap; !$1171 create table t1 (a int ,primary key(a)) type=heap; drop table if exists t1; -!$1164 create table t1 (ordid int(8) not null auto_increment, ord varchar(50) not null, primary key (ord,ordid)) type=heap; +!$1075 create table t1 (ordid int(8) not null auto_increment, ord varchar(50) not null, primary key (ord,ordid)) type=heap; !$1171 create table t1 (ordid int(8), primary key (ordid)); -- error 1044,1 diff --git a/sql/ha_heap.cc b/sql/ha_heap.cc index 5c314462666..6cfd3c881cc 100644 --- a/sql/ha_heap.cc +++ b/sql/ha_heap.cc @@ -35,7 +35,9 @@ int ha_heap::open(const char *name, int mode, uint test_if_locked) { if (!(file= heap_open(name, mode)) && my_errno == ENOENT) { - if (!create(name, table, NULL)) + HA_CREATE_INFO create_info; + bzero(&create_info, sizeof(create_info)); + if (!create(name, table, &create_info)) file= heap_open(name, mode); } return (file ? 0 : 1); @@ -51,6 +53,8 @@ int ha_heap::write_row(byte * buf) statistic_increment(ha_write_count,&LOCK_status); if (table->time_stamp) update_timestamp(buf+table->time_stamp-1); + if (table->next_number_field && buf == table->record[0]) + update_auto_increment(); return heap_write(file,buf); } @@ -161,6 +165,8 @@ void ha_heap::info(uint flag) index_file_length=info.index_length; max_data_file_length= info.max_records* info.reclength; delete_length= info.deleted * info.reclength; + if (flag & HA_STATUS_AUTO) + auto_increment_value= info.auto_increment; } int ha_heap::extra(enum ha_extra_function operation) @@ -234,11 +240,11 @@ ha_rows ha_heap::records_in_range(int inx, } } - int ha_heap::create(const char *name, TABLE *table, HA_CREATE_INFO *create_info) { uint key, parts, mem_per_row= 0; + uint auto_key= 0, auto_key_type= 0; ulong max_rows; HP_KEYDEF *keydef; HA_KEYSEG *seg; @@ -296,19 +302,42 @@ int ha_heap::create(const char *name, TABLE *table, seg->null_bit= 0; seg->null_pos= 0; } + if (field->flags & AUTO_INCREMENT_FLAG) + { + auto_key= key + 1; + auto_key_type= field->key_type(); + } } } mem_per_row+= MY_ALIGN(table->reclength + 1, sizeof(char*)); max_rows = (ulong) (current_thd->variables.max_heap_table_size / mem_per_row); + HP_CREATE_INFO hp_create_info; + hp_create_info.auto_key= auto_key; + hp_create_info.auto_key_type= auto_key_type; + hp_create_info.auto_increment= (create_info->auto_increment_value ? + create_info->auto_increment_value - 1 : 0); error= heap_create(fn_format(buff,name,"","",4+2), table->keys,keydef, table->reclength, ((table->max_rows < max_rows && table->max_rows) ? table->max_rows : max_rows), - table->min_rows); + table->min_rows, &hp_create_info); my_free((gptr) keydef, MYF(0)); if (file) info(HA_STATUS_NO_LOCK | HA_STATUS_CONST | HA_STATUS_VARIABLE); ref_length= sizeof(HEAP_PTR); return (error); } + +void ha_heap::update_create_info(HA_CREATE_INFO *create_info) +{ + table->file->info(HA_STATUS_AUTO); + if (!(create_info->used_fields & HA_CREATE_USED_AUTO)) + create_info->auto_increment_value= auto_increment_value; +} + +longlong ha_heap::get_auto_increment() +{ + ha_heap::info(HA_STATUS_AUTO); + return auto_increment_value; +} diff --git a/sql/ha_heap.h b/sql/ha_heap.h index 504f5262bf3..f82a1a460d8 100644 --- a/sql/ha_heap.h +++ b/sql/ha_heap.h @@ -40,8 +40,7 @@ class ha_heap: public handler ulong table_flags() const { return (HA_READ_RND_SAME | HA_NO_INDEX | HA_KEYPOS_TO_RNDPOS | - HA_NO_BLOBS | HA_NULL_KEY | HA_REC_NOT_IN_SEQ | - HA_NO_AUTO_INCREMENT); + HA_NO_BLOBS | HA_NULL_KEY | HA_REC_NOT_IN_SEQ); } ulong index_flags(uint inx) const { @@ -63,6 +62,7 @@ class ha_heap: public handler int write_row(byte * buf); int update_row(const byte * old_data, byte * new_data); int delete_row(const byte * buf); + longlong get_auto_increment(); int index_read(byte * buf, const byte * key, uint key_len, enum ha_rkey_function find_flag); int index_read_idx(byte * buf, uint idx, const byte * key, @@ -87,6 +87,7 @@ class ha_heap: public handler int delete_table(const char *from); int rename_table(const char * from, const char * to); int create(const char *name, TABLE *form, HA_CREATE_INFO *create_info); + void update_create_info(HA_CREATE_INFO *create_info); THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA **to, enum thr_lock_type lock_type); -- cgit v1.2.1 From 0f623dcdeaf17f76272181a193acac387249da03 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 7 Oct 2002 19:15:03 +0300 Subject: fixed dbd test results after EXPLAIN output changing --- mysql-test/r/bdb.result | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/mysql-test/r/bdb.result b/mysql-test/r/bdb.result index 7374e936c36..0abf48041d6 100644 --- a/mysql-test/r/bdb.result +++ b/mysql-test/r/bdb.result @@ -139,14 +139,14 @@ id parent_id level 1015 102 2 1010 102 2 explain select level from t1 where level=1; -table type possible_keys key key_len ref rows Extra -t1 ref level level 1 const 1 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref level level 1 const 1 where used; Using index explain select level,id from t1 where level=1; -table type possible_keys key key_len ref rows Extra -t1 ref level level 1 const 1 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref level level 1 const 1 where used; Using index explain select level,id,parent_id from t1 where level=1; -table type possible_keys key key_len ref rows Extra -t1 ref level level 1 const 1 where used +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref level level 1 const 1 where used select level,id from t1 where level=1; level id 1 1002 @@ -624,8 +624,8 @@ id parent_id level 1025 102 2 1016 102 2 explain select level from t1 where level=1; -table type possible_keys key key_len ref rows Extra -t1 ref level level 1 const 1 where used; Using index +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref level level 1 const 1 where used; Using index select level,id from t1 where level=1; level id 1 1004 -- cgit v1.2.1 From 31568581c557b8ed8d6b47874e50ddca808227e6 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 7 Oct 2002 22:21:17 +0300 Subject: fixed error handling bug mysql-test/r/subselect.result: test for error handling bug mysql-test/t/subselect.test: test for error handling bug --- mysql-test/r/subselect.result | 16 ++++++++++++++-- mysql-test/t/subselect.test | 19 +++++++++++++++++-- sql/item_subselect.cc | 18 ++++++++++++++++++ 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index 911065890e2..ec5a12cdfc8 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -1,7 +1,7 @@ select (select 2); (select 2) 2 -drop table if exists t1,t2,t3,t4,t5,attend,clinic; +drop table if exists t1,t2,t3,t4,t5,attend,clinic,inscrit; create table t1 (a int); create table t2 (a int, b int); create table t3 (a int); @@ -147,4 +147,16 @@ W 1 SELECT * FROM t3 WHERE b = (SELECT MIN(b) FROM t3); a b W a -drop table t1,t2,t3,t4,t5,attend,clinic; +drop table if exists inscrit; +CREATE TABLE `inscrit` ( +`pseudo` varchar(35) character set latin1 NOT NULL default '', +`email` varchar(60) character set latin1 NOT NULL default '', +PRIMARY KEY (`pseudo`), +UNIQUE KEY `email` (`email`) +) TYPE=MyISAM CHARSET=latin1 ROW_FORMAT=DYNAMIC; +INSERT INTO inscrit (pseudo,email) VALUES ('joce','test'); +INSERT INTO inscrit (pseudo,email) VALUES ('joce1','test1'); +INSERT INTO inscrit (pseudo,email) VALUES ('2joce1','2test1'); +SELECT pseudo FROM inscrit WHERE pseudo=(SELECT pseudo FROM inscrit WHERE pseudo LIKE '%joce%'); +Subselect returns more than 1 record +drop table if exists inscrit; diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index bf98090eb43..00d58c218aa 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -1,6 +1,6 @@ select (select 2); -drop table if exists t1,t2,t3,t4,t5,attend,clinic; +drop table if exists t1,t2,t3,t4,t5,attend,clinic,inscrit; create table t1 (a int); create table t2 (a int, b int); create table t3 (a int); @@ -66,4 +66,19 @@ SELECT * FROM t1 WHERE b = (SELECT MIN(b) FROM t1); SELECT * FROM t2 WHERE b = (SELECT MIN(b) FROM t2); SELECT * FROM t3 WHERE b = (SELECT MIN(b) FROM t3); -drop table t1,t2,t3,t4,t5,attend,clinic; +drop table if exists inscrit; + +CREATE TABLE `inscrit` ( + `pseudo` varchar(35) character set latin1 NOT NULL default '', + `email` varchar(60) character set latin1 NOT NULL default '', + PRIMARY KEY (`pseudo`), + UNIQUE KEY `email` (`email`) +) TYPE=MyISAM CHARSET=latin1 ROW_FORMAT=DYNAMIC; + +INSERT INTO inscrit (pseudo,email) VALUES ('joce','test'); +INSERT INTO inscrit (pseudo,email) VALUES ('joce1','test1'); +INSERT INTO inscrit (pseudo,email) VALUES ('2joce1','2test1'); +-- error 1240 +SELECT pseudo FROM inscrit WHERE pseudo=(SELECT pseudo FROM inscrit WHERE pseudo LIKE '%joce%'); + +drop table if exists inscrit; \ No newline at end of file diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 99fc0bcdb67..7e0b2e201ec 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -119,21 +119,30 @@ Item::Type Item_subselect::type() const double Item_singleval_subselect::val () { if (engine->exec()) + { + assign_null(); return 0; + } return real_value; } longlong Item_singleval_subselect::val_int () { if (engine->exec()) + { + assign_null(); return 0; + } return int_value; } String *Item_singleval_subselect::val_str (String *str) { if (engine->exec() || null_value) + { + assign_null(); return 0; + } return &str_value; } @@ -157,21 +166,30 @@ void Item_exists_subselect::fix_length_and_dec() double Item_exists_subselect::val () { if (engine->exec()) + { + assign_null(); return 0; + } return (double) value; } longlong Item_exists_subselect::val_int () { if (engine->exec()) + { + assign_null(); return 0; + } return value; } String *Item_exists_subselect::val_str(String *str) { if (engine->exec()) + { + assign_null(); return 0; + } str->set(value); return str; } -- cgit v1.2.1 From 12c336e7100c84a2b337dcf72bfe0c5947d81205 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 8 Oct 2002 12:47:24 +1000 Subject: Syncing with 4.0 docs. --- Docs/manual.texi | 177 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 101 insertions(+), 76 deletions(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index d9e6afc4cfc..57b91920b36 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -6957,21 +6957,30 @@ Follow the instructions to install it. @item After @code{BitKeeper} is installed, first go to the directory you -want to work from, and then use this command if you want to clone -the MySQL 3.23 branch: +want to work from, and then use one of the following commands to clone +the MySQL version branch of your choice: + +To clone the 3.23 branch, use this command: @example -shell> bk clone bk://work.mysql.com:7000 mysql +shell> bk clone bk://work.mysql.com:7000 mysql-3.23 @end example -To clone the 4.0 branch, use this command instead: +To clone the 4.0 branch, use this command: @example shell> bk clone bk://work.mysql.com:7001 mysql-4.0 @end example -In the preceding examples the source tree will be set up in the @file{mysql/} -or @file{mysql-4.0/} subdirectory of your current directory. +To clone the 4.1 branch, use this command: + +@example +shell> bk clone bk://work.mysql.com:7004 mysql-4.1 +@end example + +In the preceding examples the source tree will be set up in the +@file{mysql-3.23/}, @file{mysql-4.0/}, or @file{mysql-4.1/} +subdirectory of your current directory. The initial download of the source tree may take a while, depending on the speed of your connection; be patient. @@ -8400,7 +8409,7 @@ or @code{myisamchk} for @code{MyISAM} tables (@file{.MYI}) and @item If you want your @code{mysqldump} files to be compatible between MySQL Version 3.22 and Version 3.23, you should not use the -@code{--opt} or @code{--full} option to @code{mysqldump}. +@code{--opt} or @code{--all} option to @code{mysqldump}. @item Check all your calls to @code{DATE_FORMAT()} to make sure there is a @@ -16051,7 +16060,9 @@ Values in the scope fields may be specified as follows: @itemize @bullet @item The wildcard characters @samp{%} and @samp{_} can be used in the @code{Host} -and @code{Db} fields of either table. +and @code{Db} fields of either table. If you wish to use for instance a +@samp{_} character as part of a database name, specify it as @samp{\_} in +the @code{GRANT} command. @item A @code{'%'} @code{Host} value in the @code{db} table means ``any host.'' A @@ -16676,6 +16687,13 @@ database privileges by using @code{ON db_name.*} syntax. If you specify that database. (@strong{Warning}: if you specify @code{ON *} and you @strong{don't} have a current database, you will affect the global privileges!) +@strong{Please note}: the @samp{_} and @samp{%} wildcards are allowed when +specifying database names in @code{GRANT} commands. This means that if you +wish to use for instance a @samp{_} character as part of a database name, +you should specify it as @samp{\_} in the @code{GRANT} command, to prevent +the user from being able to access additional databases matching the +wildcard pattern, e.g., @code{GRANT ... ON `foo\_bar`.* TO ...}. + In order to accommodate granting rights to users from arbitrary hosts, MySQL supports specifying the @code{user_name} value in the form @code{user@@host}. If you want to specify a @code{user} string @@ -16684,8 +16702,8 @@ containing special characters or wildcard characters (such as @samp{%}), you can quote the user or host name (for example, @code{'test-user'@@'test-hostname'}). You can specify wildcards in the hostname. For example, -@code{user@@"%.loc.gov"} applies to @code{user} for any host in the -@code{loc.gov} domain, and @code{user@@"144.155.166.%"} applies to @code{user} +@code{user@@'%.loc.gov'} applies to @code{user} for any host in the +@code{loc.gov} domain, and @code{user@@'144.155.166.%'} applies to @code{user} for any host in the @code{144.155.166} class C subnet. The simple form @code{user} is a synonym for @code{user@@"%"}. @@ -17703,7 +17721,7 @@ the @code{mysqlhotcopy script}. @xref{mysqldump, , @code{mysqldump}}. Do a full backup of your databases: @example -shell> mysqldump --tab=/path/to/some/dir --opt --full +shell> mysqldump --tab=/path/to/some/dir --opt --all or @@ -19931,7 +19949,7 @@ cache. The value of the @code{--bdb-home} option. @item @code{bdb_max_lock} -The maximum number of locks (1000 by default) you can have active on a +The maximum number of locks (10,000 by default) you can have active on a BDB table. You should increase this if you get errors of type @code{bdb: Lock table is out of available locks} or @code{Got error 12 from ...} when you have do long transactions or when @code{mysqld} has to examine @@ -20030,15 +20048,15 @@ The maximum length of the word to be included in a @code{FULLTEXT} index. @strong{Note: @code{FULLTEXT} indexes must be rebuilt after changing this variable.} (This option is new for MySQL 4.0.) -@item @code{ft_max_word_len_sort} +@item @code{ft_max_word_len_for_sort} The maximum length of the word in a @code{FULLTEXT} index to be used in fast index recreation method in @code{REPAIR}, @code{CREATE INDEX}, or @code{ALTER TABLE}. Longer words are inserted the slow way. The rule of the thumb is as follows: with -@code{ft_max_word_len_sort} increasing, @strong{MySQL} will create bigger +@code{ft_max_word_len_for_sort} increasing, @strong{MySQL} will create bigger temporary files (thus slowing the process down, due to disk I/O), and will put fewer keys in one sort block (again, decreasing the efficiency). When -@code{ft_max_word_len_sort} is too small, instead, @strong{MySQL} will insert a +@code{ft_max_word_len_for_sort} is too small, instead, @strong{MySQL} will insert a lot of words into index the slow way, but short words will be inserted very quickly. @@ -23324,7 +23342,7 @@ If you need better performance when you start using MySQL in a production environment, you can remove the @code{--log} option from @code{mysql.server} or change it to @code{--log-bin}. @xref{Binary log}. -The entries in this log are written as @code{mysqld} receives the queries. +The entries in this log are written as @code{mysqld} receives the questions. This may be different from the order in which the statements are executed. This is in contrast to the update log and the binary log which are written after the query is executed, but before any locks are released. @@ -23337,7 +23355,7 @@ after the query is executed, but before any locks are released. @cindex files, update log @strong{Note}: the update log is replaced by the binary -log. @xref{Binary log}. You can do anything with the binary log that you can do +log. @xref{Binary log}. With this you can do anything that you can do with the update log. When started with the @code{--log-update[=file_name]} option, @@ -23352,7 +23370,7 @@ flush-logs}, execute the @code{FLUSH LOGS} statement, or restart the server. @strong{Note}: for the above scheme to work, you must not create your own files with the same filename as the update log + some extensions -that may be regarded as a number in the directory used by the update log! +that may be regarded as a number, in the directory used by the update log! If you use the @code{--log} or @code{-l} options, @code{mysqld} writes a general log with a filename of @file{hostname.log}, and restarts and @@ -23396,8 +23414,8 @@ and the crash. @cindex binary log @cindex files, binary log -The binary log will replace the now deprecated update log, so -we recommend you to switch to this log format as soon as possible. +The intention is that the binary log should replace the update log, so +we recommend you to switch to this log format as soon as possible! The binary log contains all information that is available in the update log in a more efficient format. It also contains information about how long @@ -23408,10 +23426,10 @@ find a problem query) you should use the general query log. @xref{Query log}. The binary log is also used when you are replicating a slave from a master. @xref{Replication}. -When started with the @code{--log-bin[=file_name]} option @code{mysqld} +When started with the @code{--log-bin[=file_name]} option, @code{mysqld} writes a log file containing all SQL commands that update data. If no -file name is given it defaults to the name of the host machine followed -by @code{-bin}. If a file name is given, but doesn't contain a path, the +file name is given, it defaults to the name of the host machine followed +by @code{-bin}. If file name is given, but it doesn't contain a path, the file is written in the data directory. If you supply an extension to @code{--log-bin=filename.extension}, the @@ -23431,9 +23449,14 @@ to the binary log: @multitable @columnfractions .38 .62 @item @strong{Option} @tab @strong{Description} -@item @code{binlog-do-db=database_name} @tab Tells the master it should log updates for the specified database, and exclude all others not explicitly mentioned. (Example: @code{binlog-do-db=some_database}) +@item @code{binlog-do-db=database_name} @tab +Tells the master it should log updates for the specified database, and +exclude all others not explicitly mentioned. +(Example: @code{binlog-do-db=some_database}) -@item @code{binlog-ignore-db=database_name} @tab Tells the master that updates to the given database should not be logged to the binary log (Example: @code{binlog-ignore-db=some_database}) +@item @code{binlog-ignore-db=database_name} @tab +Tells the master that updates to the given database should not be logged +to the binary log (Example: @code{binlog-ignore-db=some_database}) @end multitable To be able to know which different binary log files have been used, @@ -23458,10 +23481,10 @@ shell> mysqlbinlog log-file | mysql -h server_name @end example You can also use the @code{mysqlbinlog} program to read the binary log -directly from a remote MySQL server. +directly from a remote MySQL server! @code{mysqlbinlog --help} will give you more information of how to use -this program. +this program! If you are using @code{BEGIN [WORK]} or @code{SET AUTOCOMMIT=0}, you must use the MySQL binary log for backups instead of the old update log. @@ -23470,13 +23493,14 @@ The binary logging is done immediately after a query completes but before any locks are released or any commit is done. This ensures that the log will be logged in the execution order. -Updates to a non-transactional table are stored in the binary log at -once. For transactional tables such as @code{BDB} ! or @code{InnoDB} -tables, all updates are cached until a @code{COMMIT}. Every thread -will, on start, allocate a buffer of @code{binlog_cache_size} to buffer -queries. If a query is bigger than this, the thread will open a -temporary file to handle the bigger cache. The temporary file will be -deleted when the thread ends. +Updates to non-transactional tables are stored in the binary log +immediately after execution. For transactional tables such as @code{BDB} +or @code{InnoDB} tables, all updates (@code{UPDATE}, @code{DELETE} +or @code{INSERT}) that change tables are cached until a @code{COMMIT}. +Every thread will, on start, allocate a buffer of @code{binlog_cache_size} +to buffer queries. If a query is bigger than this, the thread will open +a temporary file to handle the bigger cache. The temporary file will +be deleted when the thread ends. The @code{max_binlog_cache_size} can be used to restrict the total size used to cache a multi-query transaction. @@ -23499,10 +23523,10 @@ more than @code{long_query_time} to execute. The time to get the initial table locks are not counted as execution time. The slow query log is logged after the query is executed and after all -locks have been released. This may be different from the order in which +locks has been released. This may be different from the order in which the statements are executed. -If no filename is given, it defaults to the name of the host machine +If no file name is given, it defaults to the name of the host machine suffixed with @code{-slow.log}. If a filename is given, but doesn't contain a path, the file is written in the data directory. @@ -23512,8 +23536,8 @@ can become a difficult task. You can pipe the slow query log through the @code{mysqldumpslow} command to get a summary of the queries which appear in the log. -If you use @code{--log-long-format} also, then queries that do not -use indexes are logged as well. @xref{Command-line options}. +You are using @code{--log-long-format} then also queries that are not +using indexes are printed. @xref{Command-line options}. @node Log file maintenance, , Slow query log, Log Files @@ -23523,19 +23547,22 @@ use indexes are logged as well. @xref{Command-line options}. @cindex maintaining, log files @cindex log files, maintaining -MySQL has many log files which makes it easy to see what is going on. -@xref{Log Files}. One must, however, occasionally clean up -after @code{MySQL} to ensure that the logs don't take up too much disk -space by either removing or backing up old log files and then telling MySQL -to start logging to new files. @xref{Backup}. +The MySQL Server can create a number of different log files, which make +it easy to see what is going on. @xref{Log Files}. One must however +regularly clean up these files, to ensure that the logs don't take up +too much disk space. + +When using MySQL with log files, you will, from time to time, +want to remove/backup old log files and tell MySQL to start +logging on new files. @xref{Backup}. -On a Linux (@code{Redhat}) installation you can use the +On a Linux (@code{Redhat}) installation, you can use the @code{mysql-log-rotate} script for this. If you installed MySQL -from an RPM distribution the script should have been installed -automatically. @strong{Note}: you should be careful with this if you are -using the logs for replication. +from an RPM distribution, the script should have been installed +automatically. Note that you should be careful with this if you are using +the log for replication! -On other systems you must install a short script yourself that you can +On other systems you must install a short script yourself that you start from @code{cron} to handle log files. You can force MySQL to start using new log files by using @@ -24203,7 +24230,7 @@ ignore, use the directive multiple times, once for each database. You should not use this directive if you are using cross table updates and you don't want these update to be replicated. -The main reason for this behavior is that it's hard from the command +The main reason for this behaviour is that it's hard from the command alone know if a query should be replicated or not; For example if you are using multi-table-delete or multi-table-update commands in MySQL 4.x that goes across multiple databases. It's also very fast to just check @@ -24294,10 +24321,16 @@ summary of commands: @item @strong{Command} @tab @strong{Description} @item @code{SLAVE START} - @tab Starts the slave thread. (Slave) + @tab Starts the slave thread. +As of MySQL 4.0.2, you can add @code{IO_THREAD} or @code{SQL_THREAD} +options to the statement to start the I/O thread or the SQL thread. +The I/O thread reads queries from the master server and stores them in the +relay log. The SQL thread reads the relay log and executes the queries. +(Slave) @item @code{SLAVE STOP} - @tab Stops the slave thread. (Slave) + @tab Stops the slave thread. Like @code{SLAVE START}, this statement +may be used with @code{IO_THREAD} and @code{SQL_THREAD} options. (Slave) @item @code{SET SQL_LOG_BIN=0} @tab Disables update logging if the user has the @code{SUPER} privilege. @@ -31225,7 +31258,7 @@ mysql> SELECT IF(STRCMP('test','test1'),'no','yes'); If @code{expr2} or @code{expr3} is explicitely @code{NULL} then the result type of the @code{IF()} function is the type of the not -@code{NULL} column. (This behavior is new in MySQL 4.0.3). +@code{NULL} column. (This behaviour is new in MySQL 4.0.3). @code{expr1} is evaluated as an integer value, which means that if you are testing floating-point or string values, you should do so using a comparison @@ -35001,6 +35034,7 @@ DELAYED} when you are really sure you need it! UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr1 [, col_name2=expr2, ...] [WHERE where_definition] + [ORDER BY ...] [LIMIT #] @end example @@ -36226,10 +36260,8 @@ mysql> CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT, This will create a @code{MyISAM} table with three columns, a, b, and c. Notice that the columns from the @code{SELECT} statement are appended to -the right side of the table, not overlapped onto it. -Still, the column from the @code{SELECT} will overlap the column from -the @code{CREATE} clause if they both have the same name. Take the following -examples: +the right side of the table, not overlapped onto it. Take the following +example: @example mysql> SELECT * FROM foo; @@ -36250,18 +36282,6 @@ mysql> SELECT * FROM bar; | NULL | 1 | +------+---+ 1 row in set (0.00 sec) - -mysql> CREATE TABLE foobar (n FLOAT(3,2), m INT) SELECT n FROM foo; -Query OK, 1 row affected (0.02 sec) -Records: 1 Duplicates: 0 Warnings: 0 - -mysql> SELECT * FROM foobar; -+------+------+ -| n | m | -+------+------+ -| 1.00 | NULL | -+------+------+ -1 row in set (0.00 sec) @end example For each row in table @code{foo}, a row is inserted in @code{bar} with @@ -36615,7 +36635,7 @@ deleted due to duplication of unique key values. The @code{FOREIGN KEY}, @code{CHECK}, and @code{REFERENCES} clauses don't actually do anything, except for InnoDB type tables which support @code{ADD CONSTRAINT FOREIGN KEY (...) REFERENCES ... (...)}. -Note that InnoDB does not allow a constraint @code{symbol} or @code{index_name} +Note that InnoDB does not allow an @code{index_name} to be specified. @xref{InnoDB}. The syntax for other table types is provided only for compatibility, to make it easier to port code from other SQL servers and to run applications @@ -39268,7 +39288,7 @@ constraints to guard the integrity of your data. The syntax of a foreign key constraint definition in InnoDB: @example -FOREIGN KEY (index_col_name, ...) +[CONSTRAINT symbol] FOREIGN KEY (index_col_name, ...) REFERENCES table_name (index_col_name, ...) [ON DELETE CASCADE | ON DELETE SET NULL] @end example @@ -39327,7 +39347,7 @@ Starting from version 3.23.50 InnoDB allows you to add a new foreign key constraint to a table through @example ALTER TABLE yourtablename - ADD CONSTRAINT FOREIGN KEY (...) REFERENCES anothertablename(...) +ADD [CONSTRAINT symbol] FOREIGN KEY (...) REFERENCES anothertablename(...) @end example Remember to create the required indexes first, though. @@ -50833,8 +50853,10 @@ each individual 4.0.x release. @appendixsubsec Changes in release 4.0.5 @itemize @item -Give error if one has more than 2 ^ 32 rows in a MyISAM MERGE file and one -has not compiled MySQL with @code{-DBIG_TABLES}. +Small fix in @code{mysqld_safe} for some shells. +@item +Give error if a @code{MyISAM} @code{MERGE} table has more than 2 ^ 32 rows and +MySQL was not compiled with with @code{-DBIG_TABLES}. @item Fixed some @code{ORDER BY ... DESC} problems with InnoDB. @item @@ -50854,7 +50876,7 @@ Fixed bug where @code{GRANT}/@code{REVOKE} failed if hostname was given in not matching case. @item Don't give warning in @code{LOAD DATA INFILE} when setting a -@code{timestamp} to a string of '0'. +@code{timestamp} to a string value of @code{'0'}. @item Fixed bug in @code{myisamchk -R} mode. @item @@ -50927,7 +50949,7 @@ output in @code{SHOW GRANTS}. Fixed that @code{mysqld --help} reports correct values for @code{--datadir} and @code{--bind-address}. @item -Fixed that one can drop UDFs that didn't exist when mysqld was started. +Fixed that one can drop UDFs that didn't exist when @code{mysqld} was started. @item Fixed core dump problem with @code{SHOW VARIABLES} on some 64 bit systems (like Solaris sparc). @@ -51009,7 +51031,7 @@ that can be used as data values in queries. Changed variable @code{DELAY_KEY_WRITE} to an enum to allow one set @code{DELAY_KEY_WRITE} for all tables without taking down the server. @item -Changed behavior of @code{IF(condition,column,NULL)} so that it returns +Changed behaviour of @code{IF(condition,column,NULL)} so that it returns the value of the column type. @item Made @code{safe_mysqld} a symlink to @code{mysqld_safe} in binary distribution. @@ -51281,6 +51303,9 @@ Fixed bug in truncation operator for boolean full-text search. Allow value of @code{--user=#} option for @code{mysqld} to be specified as a numeric user ID. @item +Fixed a bug where @code{SQL_CALC_ROWS} returned an incorrect value when used +with one table and @code{ORDER BY} and with @code{InnoDB} tables. +@item Fixed that @code{SELECT 0 LIMIT 0} doesn't hang thread. @item Fixed some problems with @code{USE/IGNORE INDEX} when using -- cgit v1.2.1 From 76ab191d750cca3702a50f97619a13b135d95705 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 8 Oct 2002 12:55:54 +1000 Subject: Sync wth 3.23 changelog. --- Docs/manual.texi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Docs/manual.texi b/Docs/manual.texi index 57b91920b36..dfdbddcaae7 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -51692,6 +51692,8 @@ not yet 100% confident in this code. @appendixsubsec Changes in release 3.23.53 @itemize @bullet @item +Small fix in @code{mysqld_safe} for some shells. +@item Fixed that @code{SHOW STATUS} doesn't reset @code{Delayed_insert_threads}. @item Fixed core dump bug when using the @code{BINARY} cast on a @code{NULL} value. -- cgit v1.2.1 From f42287866540903c6aa95d969a53bd6b20452594 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 8 Oct 2002 13:04:39 +1000 Subject: Update reserved words list (4.1) --- Docs/manual.texi | 185 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 97 insertions(+), 88 deletions(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index dfdbddcaae7..b846ae1871d 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -28984,7 +28984,7 @@ A few are reserved because MySQL needs them and is @c START_OF_RESERVED_WORDS -@c Reserved word list updated Tue Jul 23 20:41:20 2002 by monty. +@c Reserved word list updated Tue Oct 8 13:03:34 2002 by arjen. @c To regenerate, use Support/update-reserved-words.pl. @multitable @columnfractions .33 .33 .34 @@ -29006,38 +29006,41 @@ A few are reserved because MySQL needs them and is @item @code{BINARY} @tab @code{BLOB} @tab @code{BOTH} -@item @code{BY} +@item @code{BTREE} + @tab @code{BY} @tab @code{CASCADE} - @tab @code{CASE} -@item @code{CHANGE} +@item @code{CASE} + @tab @code{CHANGE} @tab @code{CHAR} - @tab @code{CHARACTER} -@item @code{COLUMN} - @tab @code{COLUMNS} +@item @code{CHARACTER} + @tab @code{COLLATE} + @tab @code{COLUMN} +@item @code{COLUMNS} @tab @code{CONSTRAINT} -@item @code{CREATE} - @tab @code{CROSS} + @tab @code{CREATE} +@item @code{CROSS} @tab @code{CURRENT_DATE} -@item @code{CURRENT_TIME} - @tab @code{CURRENT_TIMESTAMP} + @tab @code{CURRENT_TIME} +@item @code{CURRENT_TIMESTAMP} @tab @code{DATABASE} -@item @code{DATABASES} - @tab @code{DAY_HOUR} + @tab @code{DATABASES} +@item @code{DAY_HOUR} @tab @code{DAY_MINUTE} -@item @code{DAY_SECOND} - @tab @code{DEC} + @tab @code{DAY_SECOND} +@item @code{DEC} @tab @code{DECIMAL} -@item @code{DEFAULT} - @tab @code{DELAYED} + @tab @code{DEFAULT} +@item @code{DELAYED} @tab @code{DELETE} -@item @code{DESC} - @tab @code{DESCRIBE} + @tab @code{DESC} +@item @code{DESCRIBE} @tab @code{DISTINCT} -@item @code{DISTINCTROW} - @tab @code{DOUBLE} + @tab @code{DISTINCTROW} +@item @code{DOUBLE} @tab @code{DROP} -@item @code{ELSE} - @tab @code{ENCLOSED} + @tab @code{ELSE} +@item @code{ENCLOSED} + @tab @code{ERRORS} @tab @code{ESCAPED} @item @code{EXISTS} @tab @code{EXPLAIN} @@ -29048,83 +29051,86 @@ A few are reserved because MySQL needs them and is @item @code{FROM} @tab @code{FULLTEXT} @tab @code{FUNCTION} -@item @code{GRANT} +@item @code{GEOMETRY} + @tab @code{GRANT} @tab @code{GROUP} +@item @code{HASH} @tab @code{HAVING} -@item @code{HIGH_PRIORITY} - @tab @code{HOUR_MINUTE} + @tab @code{HIGH_PRIORITY} +@item @code{HOUR_MINUTE} @tab @code{HOUR_SECOND} -@item @code{IF} - @tab @code{IGNORE} + @tab @code{IF} +@item @code{IGNORE} @tab @code{IN} -@item @code{INDEX} - @tab @code{INFILE} + @tab @code{INDEX} +@item @code{INFILE} @tab @code{INNER} -@item @code{INNODB} - @tab @code{INSERT} + @tab @code{INNODB} +@item @code{INSERT} @tab @code{INT} -@item @code{INTEGER} - @tab @code{INTERVAL} + @tab @code{INTEGER} +@item @code{INTERVAL} @tab @code{INTO} -@item @code{IS} - @tab @code{JOIN} + @tab @code{IS} +@item @code{JOIN} @tab @code{KEY} -@item @code{KEYS} - @tab @code{KILL} + @tab @code{KEYS} +@item @code{KILL} @tab @code{LEADING} -@item @code{LEFT} - @tab @code{LIKE} + @tab @code{LEFT} +@item @code{LIKE} @tab @code{LIMIT} -@item @code{LINES} - @tab @code{LOAD} + @tab @code{LINES} +@item @code{LOAD} @tab @code{LOCK} -@item @code{LONG} - @tab @code{LONGBLOB} + @tab @code{LONG} +@item @code{LONGBLOB} @tab @code{LONGTEXT} -@item @code{LOW_PRIORITY} - @tab @code{MASTER_SERVER_ID} + @tab @code{LOW_PRIORITY} +@item @code{MASTER_SERVER_ID} @tab @code{MATCH} -@item @code{MEDIUMBLOB} - @tab @code{MEDIUMINT} + @tab @code{MEDIUMBLOB} +@item @code{MEDIUMINT} @tab @code{MEDIUMTEXT} -@item @code{MIDDLEINT} - @tab @code{MINUTE_SECOND} + @tab @code{MIDDLEINT} +@item @code{MINUTE_SECOND} @tab @code{MRG_MYISAM} -@item @code{NATURAL} - @tab @code{NOT} + @tab @code{NATURAL} +@item @code{NOT} @tab @code{NULL} -@item @code{NUMERIC} - @tab @code{ON} + @tab @code{NUMERIC} +@item @code{ON} @tab @code{OPTIMIZE} -@item @code{OPTION} - @tab @code{OPTIONALLY} + @tab @code{OPTION} +@item @code{OPTIONALLY} @tab @code{OR} -@item @code{ORDER} - @tab @code{OUTER} + @tab @code{ORDER} +@item @code{OUTER} @tab @code{OUTFILE} -@item @code{PARTIAL} @tab @code{PRECISION} - @tab @code{PRIMARY} -@item @code{PRIVILEGES} +@item @code{PRIMARY} + @tab @code{PRIVILEGES} @tab @code{PROCEDURE} - @tab @code{PURGE} -@item @code{READ} +@item @code{PURGE} + @tab @code{READ} @tab @code{REAL} - @tab @code{REFERENCES} -@item @code{REGEXP} +@item @code{REFERENCES} + @tab @code{REGEXP} @tab @code{RENAME} - @tab @code{REPLACE} -@item @code{REQUIRE} +@item @code{REPLACE} + @tab @code{REQUIRE} @tab @code{RESTRICT} - @tab @code{RETURNS} -@item @code{REVOKE} +@item @code{RETURNS} + @tab @code{REVOKE} @tab @code{RIGHT} - @tab @code{RLIKE} -@item @code{SELECT} - @tab @code{SET} +@item @code{RLIKE} + @tab @code{RTREE} + @tab @code{SELECT} +@item @code{SET} @tab @code{SHOW} -@item @code{SMALLINT} - @tab @code{SONAME} + @tab @code{SMALLINT} +@item @code{SONAME} + @tab @code{SPATIAL} @tab @code{SQL_BIG_RESULT} @item @code{SQL_CALC_FOUND_ROWS} @tab @code{SQL_SMALL_RESULT} @@ -29141,26 +29147,29 @@ A few are reserved because MySQL needs them and is @item @code{TINYTEXT} @tab @code{TO} @tab @code{TRAILING} -@item @code{UNION} +@item @code{TYPES} + @tab @code{UNION} @tab @code{UNIQUE} - @tab @code{UNLOCK} -@item @code{UNSIGNED} +@item @code{UNLOCK} + @tab @code{UNSIGNED} @tab @code{UPDATE} - @tab @code{USAGE} -@item @code{USE} +@item @code{USAGE} + @tab @code{USE} @tab @code{USER_RESOURCES} - @tab @code{USING} -@item @code{VALUES} +@item @code{USING} + @tab @code{VALUES} @tab @code{VARBINARY} - @tab @code{VARCHAR} -@item @code{VARYING} - @tab @code{WHEN} +@item @code{VARCHAR} + @tab @code{VARYING} + @tab @code{WARNINGS} +@item @code{WHEN} @tab @code{WHERE} -@item @code{WITH} - @tab @code{WRITE} + @tab @code{WITH} +@item @code{WRITE} @tab @code{XOR} -@item @code{YEAR_MONTH} - @tab @code{ZEROFILL} + @tab @code{YEAR_MONTH} +@item @code{ZEROFILL} + @tab @tab @end multitable -- cgit v1.2.1 From e1390e23311c454835e3d7999c0da1d71fd5da70 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 8 Oct 2002 15:13:36 +1000 Subject: Fixup. --- Docs/manual.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index b846ae1871d..d3495892d4d 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -51701,7 +51701,7 @@ not yet 100% confident in this code. @appendixsubsec Changes in release 3.23.53 @itemize @bullet @item -Small fix in @code{mysqld_safe} for some shells. +Small fix in @code{safe_mysqld} for some shells. @item Fixed that @code{SHOW STATUS} doesn't reset @code{Delayed_insert_threads}. @item -- cgit v1.2.1 From 956c993f64ca673bb8085d21164e22d110aea3c3 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 8 Oct 2002 15:54:51 +0500 Subject: test case for auto_increment for HEAP --- mysql-test/r/heap_auto_increment.result | 41 +++++++++++++++++++++++++++++++++ mysql-test/t/heap_auto_increment.test | 30 ++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 mysql-test/r/heap_auto_increment.result create mode 100644 mysql-test/t/heap_auto_increment.test diff --git a/mysql-test/r/heap_auto_increment.result b/mysql-test/r/heap_auto_increment.result new file mode 100644 index 00000000000..9a5ed57d741 --- /dev/null +++ b/mysql-test/r/heap_auto_increment.result @@ -0,0 +1,41 @@ +drop table if exists t1; +create table t1 (a int not null auto_increment,b int, primary key (a)) type=heap auto_increment=3; +insert into t1 values (1,1),(NULL,3),(NULL,4); +delete from t1 where a=4; +insert into t1 values (NULL,5),(NULL,6); +select * from t1; +a b +1 1 +3 3 +5 5 +6 6 +delete from t1 where a=6; +replace t1 values (3,1); +ALTER TABLE t1 add c int; +replace t1 values (3,3,3); +insert into t1 values (NULL,7,7); +update t1 set a=8,b=b+1,c=c+1 where a=7; +insert into t1 values (NULL,9,9); +select * from t1; +a b c +1 1 NULL +3 3 3 +5 5 NULL +8 8 8 +9 9 9 +drop table t1; +create table t1 ( +skey tinyint unsigned NOT NULL auto_increment PRIMARY KEY, +sval char(20) +) type=heap; +insert into t1 values (NULL, "hello"); +insert into t1 values (NULL, "hey"); +select * from t1; +skey sval +1 hello +2 hey +select _rowid,t1._rowid,skey,sval from t1; +_rowid _rowid skey sval +1 1 1 hello +2 2 2 hey +drop table t1; diff --git a/mysql-test/t/heap_auto_increment.test b/mysql-test/t/heap_auto_increment.test new file mode 100644 index 00000000000..8a0d19d9183 --- /dev/null +++ b/mysql-test/t/heap_auto_increment.test @@ -0,0 +1,30 @@ +# +# Test of auto_increment; The test for BDB tables is in bdb.test +# + +drop table if exists t1; +create table t1 (a int not null auto_increment,b int, primary key (a)) type=heap auto_increment=3; +insert into t1 values (1,1),(NULL,3),(NULL,4); +delete from t1 where a=4; +insert into t1 values (NULL,5),(NULL,6); +select * from t1; +delete from t1 where a=6; +#show table status like "t1"; +replace t1 values (3,1); +ALTER TABLE t1 add c int; +replace t1 values (3,3,3); +insert into t1 values (NULL,7,7); +update t1 set a=8,b=b+1,c=c+1 where a=7; +insert into t1 values (NULL,9,9); +select * from t1; +drop table t1; + +create table t1 ( + skey tinyint unsigned NOT NULL auto_increment PRIMARY KEY, + sval char(20) +) type=heap; +insert into t1 values (NULL, "hello"); +insert into t1 values (NULL, "hey"); +select * from t1; +select _rowid,t1._rowid,skey,sval from t1; +drop table t1; -- cgit v1.2.1 From e8e3f7728fbe66f75b328a56a48059552b0bea15 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 8 Oct 2002 14:50:12 +0300 Subject: fixed couple of bugs in field/reference name resolution fixed error handling in subselect fix_field mysql-test/r/subselect.result: test of name resolution mysql-test/t/subselect.test: test of name resolution sql/item.cc: fixed couple of bugs in field/reference name resolution. sql/item_subselect.cc: fixed error handling sql/mysql_priv.h: fixed couple of bugs in field/reference name resolution. sql/sql_base.cc: fixed couple of bugs in field/reference name resolution. sql/sql_select.cc: new find_item_in_list interface --- mysql-test/r/subselect.result | 4 +- mysql-test/t/subselect.test | 6 ++- sql/item.cc | 43 ++++++++++++++++------ sql/item_subselect.cc | 3 +- sql/mysql_priv.h | 7 +++- sql/sql_base.cc | 85 ++++++++++++++++++++++++++++++++++++------- sql/sql_select.cc | 4 +- 7 files changed, 121 insertions(+), 31 deletions(-) diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index ec5a12cdfc8..2618741a520 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -131,6 +131,8 @@ patient_uq clinic_uq 1 1 1 2 2 2 +select * from t1 where a= (select a from t2,t4 where t2.b=t4.b); +Column: 'a' in field list is ambiguous drop table if exists t1,t2,t3; CREATE TABLE t3 (a varchar(20),b char(1) NOT NULL default '0'); INSERT INTO t3 VALUES ('W','a'),('A','c'),('J','b'); @@ -159,4 +161,4 @@ INSERT INTO inscrit (pseudo,email) VALUES ('joce1','test1'); INSERT INTO inscrit (pseudo,email) VALUES ('2joce1','2test1'); SELECT pseudo FROM inscrit WHERE pseudo=(SELECT pseudo FROM inscrit WHERE pseudo LIKE '%joce%'); Subselect returns more than 1 record -drop table if exists inscrit; +drop table if exists t1,t2,t3,t4,t5,attend,clinic,inscrit; diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 00d58c218aa..c34332d6d90 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -53,6 +53,10 @@ insert into clinic values(1,"Oblastnaia bolnitsa"),(2,"Bolnitsa Krasnogo Kresta" insert into attend values (1,1),(1,2),(2,2),(1,3); select * from attend where exists (select * from clinic where uq = clinic_uq); +# not unique fields +-- error 1052 +select * from t1 where a= (select a from t2,t4 where t2.b=t4.b); + # different tipes & group functions drop table if exists t1,t2,t3; @@ -81,4 +85,4 @@ INSERT INTO inscrit (pseudo,email) VALUES ('2joce1','2test1'); -- error 1240 SELECT pseudo FROM inscrit WHERE pseudo=(SELECT pseudo FROM inscrit WHERE pseudo LIKE '%joce%'); -drop table if exists inscrit; \ No newline at end of file +drop table if exists t1,t2,t3,t4,t5,attend,clinic,inscrit; \ No newline at end of file diff --git a/sql/item.cc b/sql/item.cc index f1e25fb4d97..6da53b98657 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -432,7 +432,7 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) if (!field) // If field is not checked { Field *tmp; - if (!(tmp=find_field_in_tables(thd, this, tables, 0))) + if ((tmp= find_field_in_tables(thd, this, tables, 0)) == not_found_field) { /* We can't find table field in table list of current select, @@ -445,14 +445,18 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) */ SELECT_LEX *last= 0; for (SELECT_LEX *sl= thd->lex.select->outer_select(); - sl && !tmp; + sl; sl= sl->outer_select()) - tmp=find_field_in_tables(thd, this, - (TABLE_LIST*)(last= sl)->table_list.first, - 0); + if ((tmp= find_field_in_tables(thd, this, + (TABLE_LIST*) + (last= sl)->table_list.first, + 0)) != not_found_field) + break; if (!tmp) + return -1; + else if (tmp == not_found_field) { - // Call to produce appropriate error message + // call to return error code find_field_in_tables(thd, this, tables, 1); return -1; } @@ -478,7 +482,10 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) tbl->shared= 1; } } - } + } + else if (!tmp) + return -1; + set_field(tmp); } else if (thd && thd->set_query_id && field->query_id != thd->query_id) @@ -786,7 +793,9 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference) { if (!ref) { - if (!(ref= find_item_in_list(this, thd->lex.select->item_list, 0))) + if ((ref= find_item_in_list(this, thd->lex.select->item_list, + REPORT_EXCEPT_NOT_FOUND)) == + not_found_item) { /* We can't find table field in table list of current select, @@ -795,17 +804,25 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference) of view rules. For example if both tables (outer & current) have field 'field' it is not mistake to refer to this field without mention of table name, but if we join tables in one list it will - cause error ER_NON_UNIQ_ERROR in find_field_in_tables. + cause error ER_NON_UNIQ_ERROR in find_item_in_list. */ SELECT_LEX *last=0; for (SELECT_LEX *sl= thd->lex.select->outer_select(); - sl && !ref; + sl; sl= sl->outer_select()) - ref= find_item_in_list(this, (last= sl)->item_list, 0); + if((ref= find_item_in_list(this, (last= sl)->item_list, + REPORT_EXCEPT_NOT_FOUND)) != + not_found_item) + break; + if (!ref) + { + return 1; + } + else if (ref == not_found_item) { // Call to report error - find_item_in_list(this, thd->lex.select->item_list, 1); + find_item_in_list(this, thd->lex.select->item_list, REPORT_ALL_ERRORS); return 1; } else @@ -831,6 +848,8 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference) } } } + else if (!ref) + return 1; max_length= (*ref)->max_length; maybe_null= (*ref)->maybe_null; decimals= (*ref)->decimals; diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 7e0b2e201ec..e8ee6a780ea 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -83,7 +83,8 @@ bool Item_subselect::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) return 1; } int res= engine->prepare(); - fix_length_and_dec(); + if (!res) + fix_length_and_dec(); return res; } diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 8e691c8f96c..b74a2da5f6d 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -456,6 +456,7 @@ bool wait_for_tables(THD *thd); bool table_is_used(TABLE *table, bool wait_for_name_lock); bool drop_locked_tables(THD *thd,const char *db, const char *table_name); void abort_locked_tables(THD *thd,const char *db, const char *table_name); +extern const Field *not_found_field; Field *find_field_in_tables(THD *thd, Item_field *item, TABLE_LIST *tables, bool report_error); Field *find_field_in_table(THD *thd,TABLE *table,const char *name,uint length, @@ -545,7 +546,11 @@ TABLE *unlink_open_table(THD *thd,TABLE *list,TABLE *find); SQL_SELECT *make_select(TABLE *head, table_map const_tables, table_map read_tables, COND *conds, int *error); -Item ** find_item_in_list(Item *item, List &items, bool report_error); +enum find_item_error_report_type {REPORT_ALL_ERRORS, REPORT_EXCEPT_NOT_FOUND, + IGNORE_ERRORS}; +extern const Item **not_found_item; +Item ** find_item_in_list(Item *item, List &items, + find_item_error_report_type report_error); bool insert_fields(THD *thd,TABLE_LIST *tables, const char *db_name, const char *table_name, List_iterator *it); diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 8deae314484..78774b376b1 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -1781,9 +1781,29 @@ Field *find_field_in_table(THD *thd,TABLE *table,const char *name,uint length, return field; } +// Special Field pointer for find_field_in_tables returning +const Field *not_found_field= (Field*) 0x1; +/* + Find field in table list. + + SYNOPSIS + find_field_in_tables() + thd - pointer to current thread structure + item - field item that should be found + tables - tables for scaning + report_error - if FALSE then do not report error if item not found and + return not_found_field; + + RETURN VALUES + 0 - field is not found or field is not unique, error message is + reported + not_found_field - function was called with report_error == FALSE and + field if not found, no error message reported + found field +*/ Field * -find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables, +find_field_in_tables(THD *thd, Item_field *item, TABLE_LIST *tables, bool report_error) { Field *found=0; @@ -1829,13 +1849,18 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables, strxnmov(buff,sizeof(buff)-1,db,".",table_name,NullS); table_name=buff; } - my_printf_error(ER_UNKNOWN_TABLE,ER(ER_UNKNOWN_TABLE),MYF(0),table_name, - thd->where); + if (report_error) + my_printf_error(ER_UNKNOWN_TABLE, ER(ER_UNKNOWN_TABLE), MYF(0), + table_name, thd->where); + else + return (Field*) not_found_field; } else if (report_error) my_printf_error(ER_BAD_FIELD_ERROR,ER(ER_BAD_FIELD_ERROR),MYF(0), item->full_name(),thd->where); + else + return (Field*) not_found_field; return (Field*) 0; } bool allow_rowid= tables && !tables->next; // Only one table @@ -1850,11 +1875,10 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables, return (Field*) 0; if (found) { - if (!report_error) // Returns first found + if (!thd->where) // Returns first found break; - if (report_error) - my_printf_error(ER_NON_UNIQ_ERROR,ER(ER_NON_UNIQ_ERROR),MYF(0), - name,thd->where); + my_printf_error(ER_NON_UNIQ_ERROR,ER(ER_NON_UNIQ_ERROR),MYF(0), + name,thd->where); return (Field*) 0; } found=field; @@ -1865,11 +1889,39 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables, if (report_error) my_printf_error(ER_BAD_FIELD_ERROR, ER(ER_BAD_FIELD_ERROR), MYF(0), item->full_name(), thd->where); + else + return (Field*) not_found_field; return (Field*) 0; } +// Special Item pointer for find_item_in_list returning +const Item **not_found_item= (const Item**) 0x1; + +/* + Find Item in list of items (find_field_in_tables analog) + + SYNOPSIS + find_item_in_list() + find - item to find + items - list of items + report_error + REPORT_ALL_ERRORS - report errors, return 0 if error + REPORT_EXCEPT_NOT_FOUND - do not report 'not found' error and return not_ found_item, report other errors, return 0 + IGNORE_ERRORS - do not report errors, return 0 if error + + RETURN VALUES + 0 - item is not found or item is not unique, error message is + reported + not_found_item - function was called with report_error == + REPORT_EXCEPT_NOT_FOUND and item if not found, no error + message reported + found field + +*/ + Item ** -find_item_in_list(Item *find, List &items, bool report_error) +find_item_in_list(Item *find, List &items, + find_item_error_report_type report_error) { List_iterator li(items); Item **found=0,*item; @@ -1894,7 +1946,7 @@ find_item_in_list(Item *find, List &items, bool report_error) { if ((*found)->eq(item,0)) continue; // Same field twice (Access?) - if (report_error) + if (report_error != IGNORE_ERRORS) my_printf_error(ER_NON_UNIQ_ERROR,ER(ER_NON_UNIQ_ERROR),MYF(0), find->full_name(), current_thd->where); return (Item**) 0; @@ -1917,10 +1969,17 @@ find_item_in_list(Item *find, List &items, bool report_error) break; } } - if (!found && report_error) - my_printf_error(ER_BAD_FIELD_ERROR, ER(ER_BAD_FIELD_ERROR), MYF(0), - find->full_name(), current_thd->where); - return found; + if (found) + return found; + else if (report_error != REPORT_EXCEPT_NOT_FOUND) + { + if (report_error == REPORT_ALL_ERRORS) + my_printf_error(ER_BAD_FIELD_ERROR, ER(ER_BAD_FIELD_ERROR), MYF(0), + find->full_name(), current_thd->where); + return (Item **) 0; + } + else + return (Item **) not_found_item; } /**************************************************************************** diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 35703e57d82..09d41e2891b 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -6487,7 +6487,7 @@ find_order_in_list(THD *thd,TABLE_LIST *tables,ORDER *order,List &fields, order->in_field_list=1; return 0; } - Item **item=find_item_in_list(*order->item, fields, 0); + Item **item= find_item_in_list(*order->item, fields, IGNORE_ERRORS); if (item) { order->item=item; // use it @@ -6587,7 +6587,7 @@ setup_new_fields(THD *thd,TABLE_LIST *tables,List &fields, thd->set_query_id=1; // Not really needed, but... for (; new_field ; new_field= new_field->next) { - if ((item= find_item_in_list(*new_field->item, fields, 0))) + if ((item= find_item_in_list(*new_field->item, fields, IGNORE_ERRORS))) new_field->item=item; /* Change to shared Item */ else { -- cgit v1.2.1 From 58dc03066c8b8c38cdfa47e1f3c99ee002551b4f Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 8 Oct 2002 15:34:39 +0300 Subject: removed compiler warnings --- sql/item.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sql/item.cc b/sql/item.cc index 6da53b98657..a0cb6f46f06 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -795,7 +795,7 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference) { if ((ref= find_item_in_list(this, thd->lex.select->item_list, REPORT_EXCEPT_NOT_FOUND)) == - not_found_item) + (Item **)not_found_item) { /* We can't find table field in table list of current select, @@ -812,14 +812,14 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference) sl= sl->outer_select()) if((ref= find_item_in_list(this, (last= sl)->item_list, REPORT_EXCEPT_NOT_FOUND)) != - not_found_item) + (Item **)not_found_item) break; if (!ref) { return 1; } - else if (ref == not_found_item) + else if (ref == (Item **)not_found_item) { // Call to report error find_item_in_list(this, thd->lex.select->item_list, REPORT_ALL_ERRORS); -- cgit v1.2.1 From 81a82f0d6e68879ca68c4894c5832afdb4179487 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 8 Oct 2002 12:39:37 +0000 Subject: support for --tmpdir=dir1:dir2:... --- include/my_sys.h | 12 +++++++++ mysys/Makefile.am | 2 +- mysys/mf_tempdir.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ sql/mysql_priv.h | 5 ++-- sql/mysqld.cc | 27 ++++++------------- sql/set_var.cc | 2 +- sql/sql_base.cc | 20 +++++++------- 7 files changed, 114 insertions(+), 32 deletions(-) create mode 100644 mysys/mf_tempdir.c diff --git a/include/my_sys.h b/include/my_sys.h index 7ceb40e9e06..a5bf5f68f08 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -293,6 +293,14 @@ extern struct my_file_info #endif } my_file_info[MY_NFILE]; +typedef struct st_my_tmpdir +{ + char **list; + uint cur, max; +#ifdef THREAD + pthread_mutex_t mutex; +#endif +} MY_TMPDIR; typedef struct st_dynamic_array { @@ -582,6 +590,10 @@ extern void allow_break(void); #define allow_break() #endif +extern my_bool init_tmpdir(MY_TMPDIR *tmpdir, const char *pathlist); +extern char *my_tmpdir(MY_TMPDIR *tmpdir); +extern void free_tmpdir(MY_TMPDIR *tmpdir); + extern void my_remember_signal(int signal_number,sig_handler (*func)(int)); extern void case_sort(CHARSET_INFO *cs, my_string str,uint length); extern uint dirname_part(my_string to,const char *name); diff --git a/mysys/Makefile.am b/mysys/Makefile.am index 8da25ad101a..3ddd8afbb4a 100644 --- a/mysys/Makefile.am +++ b/mysys/Makefile.am @@ -31,7 +31,7 @@ libmysys_a_SOURCES = my_init.c my_getwd.c mf_getdate.c\ my_pread.c my_write.c \ mf_keycache.c \ mf_iocache.c mf_iocache2.c mf_cache.c mf_tempfile.c \ - my_lock.c mf_brkhant.c my_alarm.c \ + mf_tempdir.c my_lock.c mf_brkhant.c my_alarm.c \ my_malloc.c my_realloc.c my_once.c mulalloc.c \ my_alloc.c safemalloc.c my_new.cc \ my_fopen.c my_fstream.c \ diff --git a/mysys/mf_tempdir.c b/mysys/mf_tempdir.c new file mode 100644 index 00000000000..13b170ceee7 --- /dev/null +++ b/mysys/mf_tempdir.c @@ -0,0 +1,78 @@ +/* Copyright (C) 2000 MySQL AB + + 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; either version 2 of the License, or + (at your option) any later version. + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#include "mysys_priv.h" +#include + +#define DELIM ':' +my_bool init_tmpdir(MY_TMPDIR *tmpdir, const char *pathlist) +{ + char *end, *copy; + char buff[FN_REFLEN]; + DYNAMIC_ARRAY t_arr; + pthread_mutex_init(&tmpdir->mutex, MY_MUTEX_INIT_FAST); + if (my_init_dynamic_array(&t_arr, sizeof(char*), 1, 5)) + return TRUE; + if (!pathlist || !pathlist[0]) + { + /* Get default temporary directory */ + pathlist=getenv("TMPDIR"); /* Use this if possible */ +#if defined( __WIN__) || defined(OS2) + if (!pathlist) + pathlist=getenv("TEMP"); + if (!pathlist) + pathlist=getenv("TMP"); +#endif + if (!pathlist || !pathlist[0]) + pathlist=(char*) P_tmpdir; + } + do + { + end=strcend(pathlist, DELIM); + convert_dirname(buff, pathlist, end); + if (!(copy=my_strdup(buff, MYF(MY_WME)))) + return TRUE; + if (insert_dynamic(&t_arr, ©)) + return TRUE; + pathlist=end+1; + } + while (*end); + freeze_size(&t_arr); + tmpdir->list=t_arr.buffer; + tmpdir->max=t_arr.elements-1; + tmpdir->cur=0; + return FALSE; +} + +char *my_tmpdir(MY_TMPDIR *tmpdir) +{ + char *dir; + pthread_mutex_lock(&tmpdir->mutex); + dir=tmpdir->list[tmpdir->cur]; + tmpdir->cur= (tmpdir->cur == tmpdir->max) ? 0 : tmpdir->cur+1; + pthread_mutex_unlock(&tmpdir->mutex); + return dir; +} + +void free_tmpdir(MY_TMPDIR *tmpdir) +{ + uint i; + for (i=0; i<=tmpdir->max; i++) + my_free(tmpdir->list[i], MYF(0)); + my_free(tmpdir->list, MYF(0)); + pthread_mutex_destroy(&tmpdir->mutex); +} + diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 8e691c8f96c..3a22d7f8028 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -635,8 +635,9 @@ bool open_log(MYSQL_LOG *log, const char *hostname, extern time_t start_time; extern char *mysql_data_home,server_version[SERVER_VERSION_LENGTH], - mysql_real_data_home[], *charsets_list; -extern my_string mysql_tmpdir; + mysql_real_data_home[], *charsets_list, *opt_mysql_tmpdir; +#define mysql_tmpdir (my_tmpdir(&mysql_tmpdir_list)) +extern MY_TMPDIR mysql_tmpdir_list; extern const char *command_name[]; extern const char *first_keyword, *localhost, *delayed_user; extern const char **errmesg; /* Error messages */ diff --git a/sql/mysqld.cc b/sql/mysqld.cc index a3a82d96b2e..1b4713706fb 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -395,7 +395,8 @@ const char *myisam_recover_options_str="OFF"; const char *sql_mode_str="OFF"; ulong rpl_recovery_rank=0; -my_string mysql_unix_port=NULL, opt_mysql_tmpdir=NULL, mysql_tmpdir=NULL; +my_string mysql_unix_port=NULL, opt_mysql_tmpdir=NULL; +MY_TMPDIR mysql_tmpdir_list; ulong my_bind_addr; /* the address we bind to */ char *my_bind_addr_str; DATE_FORMAT dayord; @@ -852,7 +853,7 @@ void clean_up(bool print_message) if (defaults_argv) free_defaults(defaults_argv); my_free(charsets_list, MYF(MY_ALLOW_ZERO_PTR)); - my_free(mysql_tmpdir,MYF(MY_ALLOW_ZERO_PTR)); + free_tmpdir(&mysql_tmpdir_list); my_free(slave_load_tmpdir,MYF(MY_ALLOW_ZERO_PTR)); x_free(opt_bin_logname); x_free(opt_relay_logname); @@ -1834,17 +1835,6 @@ int main(int argc, char **argv) load_defaults(MYSQL_CONFIG_NAME,load_default_groups,&argc,&argv); defaults_argv=argv; - /* Get default temporary directory */ - opt_mysql_tmpdir=getenv("TMPDIR"); /* Use this if possible */ -#if defined( __WIN__) || defined(OS2) - if (!opt_mysql_tmpdir) - opt_mysql_tmpdir=getenv("TEMP"); - if (!opt_mysql_tmpdir) - opt_mysql_tmpdir=getenv("TMP"); -#endif - if (!opt_mysql_tmpdir || !opt_mysql_tmpdir[0]) - opt_mysql_tmpdir=(char*) P_tmpdir; /* purecov: inspected */ - set_options(); get_options(argc,argv); if (opt_log || opt_update_log || opt_slow_log || opt_bin_log) @@ -3320,12 +3310,13 @@ struct my_option my_long_options[] = "Using this option will cause most temporary files created to use a small set of names, rather than a unique name for each new file.", (gptr*) &use_temp_pool, (gptr*) &use_temp_pool, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, - {"tmpdir", 't', "Path for temporary files", (gptr*) &opt_mysql_tmpdir, + {"tmpdir", 't', + "Path for temporary files. Several paths may be specified, separated by a colon (:), in this case they are used in a round-robin fashion.", + (gptr*) &opt_mysql_tmpdir, (gptr*) &opt_mysql_tmpdir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"transaction-isolation", OPT_TX_ISOLATION, "Default transaction isolation level", 0, 0, 0, GET_NO_ARG, REQUIRED_ARG, 0, - 0, 0, 0, - 0, 0}, + 0, 0, 0, 0, 0}, {"external-locking", OPT_USE_LOCKING, "Use system (external) locking. With this option enabled you can run myisamchk to test (not repair) tables while the MySQL server is running", (gptr*) &opt_external_locking, (gptr*) &opt_external_locking, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, @@ -4498,9 +4489,7 @@ static void fix_paths(void) charsets_dir=mysql_charsets_dir; } - char *end=convert_dirname(buff, opt_mysql_tmpdir, NullS); - if (!(mysql_tmpdir= my_memdup((byte*) buff,(uint) (end-buff)+1, - MYF(MY_FAE)))) + if (init_tmpdir(&mysql_tmpdir_list, opt_mysql_tmpdir)) exit(1); if (!slave_load_tmpdir) { diff --git a/sql/set_var.cc b/sql/set_var.cc index b221a3f98ff..72579664a3e 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -541,7 +541,7 @@ struct show_var_st init_vars[]= { {"timezone", time_zone, SHOW_CHAR}, #endif {sys_tmp_table_size.name, (char*) &sys_tmp_table_size, SHOW_SYS}, - {"tmpdir", (char*) &mysql_tmpdir, SHOW_CHAR_PTR}, + {"tmpdir", (char*) &opt_mysql_tmpdir, SHOW_CHAR_PTR}, {"version", server_version, SHOW_CHAR}, {sys_net_wait_timeout.name, (char*) &sys_net_wait_timeout, SHOW_SYS}, {NullS, NullS, SHOW_LONG} diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 8deae314484..e81d950e2e4 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -2227,30 +2227,32 @@ fill_record(Field **ptr,List &values) static void mysql_rm_tmp_tables(void) { - uint idx; - char filePath[FN_REFLEN]; + uint i, idx; + char filePath[FN_REFLEN], *tmpdir; MY_DIR *dirp; FILEINFO *file; DBUG_ENTER("mysql_rm_tmp_tables"); + for (i=0; i<=mysql_tmpdir_list.max; i++) + { + tmpdir=mysql_tmpdir_list.list[i]; /* See if the directory exists */ - if (!(dirp = my_dir(mysql_tmpdir,MYF(MY_WME | MY_DONT_SORT)))) - DBUG_VOID_RETURN; /* purecov: inspected */ + if (!(dirp = my_dir(tmpdir,MYF(MY_WME | MY_DONT_SORT)))) + continue; - /* - ** Remove all SQLxxx tables from directory - */ + /* Remove all SQLxxx tables from directory */ for (idx=2 ; idx < (uint) dirp->number_off_files ; idx++) { file=dirp->dir_entry+idx; if (!bcmp(file->name,tmp_file_prefix,tmp_file_prefix_length)) { - sprintf(filePath,"%s%s",mysql_tmpdir,file->name); /* purecov: inspected */ - VOID(my_delete(filePath,MYF(MY_WME))); /* purecov: inspected */ + sprintf(filePath,"%s%s",tmpdir,file->name); + VOID(my_delete(filePath,MYF(MY_WME))); } } my_dirend(dirp); + } DBUG_VOID_RETURN; } -- cgit v1.2.1 From a7430f38b30436d00cafcb33ce62f2f2efa0bc19 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 8 Oct 2002 14:34:04 +0000 Subject: --tmpdir=dir1:dir2:... support in myisamchk --- include/myisam.h | 5 +++-- myisam/myisamchk.c | 14 +++++++++++--- myisam/sort.c | 12 ++++++------ sql/ha_myisam.cc | 4 ++-- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/include/myisam.h b/include/myisam.h index eac517eb28a..acaf8bb7618 100644 --- a/include/myisam.h +++ b/include/myisam.h @@ -329,7 +329,8 @@ typedef struct st_mi_check_param uint8 language; my_bool using_global_keycache, opt_lock_memory, opt_follow_links; my_bool retry_repair, force_sort, calc_checksum; - char temp_filename[FN_REFLEN],*isam_file_name,*tmpdir; + char temp_filename[FN_REFLEN],*isam_file_name; + MY_TMPDIR *tmpdir; int tmpfile_createflag; myf myf_rw; IO_CACHE read_cache; @@ -376,7 +377,7 @@ typedef struct st_mi_sort_param byte *rec_buff; void *wordlist, *wordptr; char *record; - char *tmpdir; + MY_TMPDIR *tmpdir; int (*key_cmp)(struct st_mi_sort_param *, const void *, const void *); int (*key_read)(struct st_mi_sort_param *,void *); int (*key_write)(struct st_mi_sort_param *, const void *); diff --git a/myisam/myisamchk.c b/myisam/myisamchk.c index 3e8377fc8c0..440c84dc64d 100644 --- a/myisam/myisamchk.c +++ b/myisam/myisamchk.c @@ -41,9 +41,10 @@ SET_STACK_SIZE(9000) /* Minimum stack size for program */ static uint decode_bits; static char **default_argv; static const char *load_default_groups[]= { "myisamchk", 0 }; -static const char *set_charset_name; +static const char *set_charset_name, *opt_tmpdir; static CHARSET_INFO *set_charset; static long opt_myisam_block_size; +static MY_TMPDIR myisamchk_tmpdir; static const char *type_names[]= { "?","char","binary", "short", "long", "float", @@ -257,7 +258,7 @@ static struct my_option my_long_options[] = 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"tmpdir", 't', "Path for temporary files.", - (gptr*) &check_param.tmpdir, + (gptr*) &opt_tmpdir, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"update-state", 'U', "Mark tables as crashed if any errors were found.", @@ -338,7 +339,9 @@ static void usage(void) Change the value of a variable. Please note that\n\ this option is deprecated; you can set variables\n\ directly with '--variable-name=value'.\n\ - -t, --tmpdir=path Path for temporary files\n\ + -t, --tmpdir=path Path for temporary files. Multiple paths can be\n\ + specified, separated by colon (:), they will be used\n\ + in a round-robin fashion.\n\ -s, --silent Only print errors. One can use two -s to make\n\ myisamchk very silent\n\ -v, --verbose Print more information. This can be used with\n\ @@ -693,6 +696,11 @@ static void get_options(register int *argc,register char ***argv) exit(1); } + if (init_tmpdir(&myisamchk_tmpdir, opt_tmpdir)) + exit(1); + + check_param.tmpdir=&myisamchk_tmpdir; + if (set_charset_name) if (!(set_charset=get_charset_by_name(set_charset_name, MYF(MY_WME)))) exit(1); diff --git a/myisam/sort.c b/myisam/sort.c index 79d31147bfc..5819fb7b493 100644 --- a/myisam/sort.c +++ b/myisam/sort.c @@ -553,8 +553,8 @@ static int NEAR_F write_keys(MI_SORT_PARAM *info, register uchar **sort_keys, qsort2((byte*) sort_keys,count,sizeof(byte*),(qsort2_cmp) info->key_cmp, info); if (!my_b_inited(tempfile) && - open_cached_file(tempfile, info->tmpdir, "ST", DISK_BUFFER_SIZE, - info->sort_info->param->myf_rw)) + open_cached_file(tempfile, my_tmpdir(info->tmpdir), "ST", + DISK_BUFFER_SIZE, info->sort_info->param->myf_rw)) DBUG_RETURN(1); /* purecov: inspected */ buffpek->file_pos=my_b_tell(tempfile); @@ -576,8 +576,8 @@ static int NEAR_F write_key(MI_SORT_PARAM *info, uchar *key, DBUG_ENTER("write_key"); if (!my_b_inited(tempfile) && - open_cached_file(tempfile, info->tmpdir, "ST", DISK_BUFFER_SIZE, - info->sort_info->param->myf_rw)) + open_cached_file(tempfile, my_tmpdir(info->tmpdir), "ST", + DISK_BUFFER_SIZE, info->sort_info->param->myf_rw)) DBUG_RETURN(1); if (my_b_write(tempfile,(byte*)&key_length,sizeof(key_length)) || @@ -619,8 +619,8 @@ static int NEAR_F merge_many_buff(MI_SORT_PARAM *info, uint keys, if (*maxbuffer < MERGEBUFF2) DBUG_RETURN(0); /* purecov: inspected */ if (flush_io_cache(t_file) || - open_cached_file(&t_file2,info->tmpdir,"ST",DISK_BUFFER_SIZE, - info->sort_info->param->myf_rw)) + open_cached_file(&t_file2,my_tmpdir(info->tmpdir),"ST", + DISK_BUFFER_SIZE, info->sort_info->param->myf_rw)) DBUG_RETURN(1); /* purecov: inspected */ from_file= t_file ; to_file= &t_file2; diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc index 4aae044148b..e02252e711f 100644 --- a/sql/ha_myisam.cc +++ b/sql/ha_myisam.cc @@ -559,7 +559,7 @@ int ha_myisam::repair(THD *thd, MI_CHECK ¶m, bool optimize) param.tmpfile_createflag = O_RDWR | O_TRUNC; param.using_global_keycache = 1; param.thd=thd; - param.tmpdir=mysql_tmpdir; + param.tmpdir=&mysql_tmpdir_list; param.out_flag=0; strmov(fixed_name,file->filename); @@ -718,7 +718,7 @@ bool ha_myisam::activate_all_index(THD *thd) T_CREATE_MISSING_KEYS); param.myf_rw&= ~MY_WAIT_IF_FULL; param.sort_buffer_length= thd->variables.myisam_sort_buff_size; - param.tmpdir=mysql_tmpdir; + param.tmpdir=&mysql_tmpdir_list; error=repair(thd,param,0) != HA_ADMIN_OK; thd->proc_info=save_proc_info; } -- cgit v1.2.1 From 40c2e7499b40a10ee2b8042e5d672b7c4d4c66fe Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 8 Oct 2002 22:28:24 +0300 Subject: Portability fixes to be able to compile MySQL with VC++ VC++Files/client/mysqlclient.dsp: Updated VC++ files for 4.1 VC++Files/libmysql/libmysql.dsp: Updated VC++ files for 4.1 VC++Files/libmysqld/libmysqld.dsp: Updated VC++ files for 4.1 VC++Files/myisam/myisam.dsp: Updated VC++ files for 4.1 VC++Files/mysys/mysys.dsp: Updated VC++ files for 4.1 VC++Files/sql/mysqld.dsp: Updated VC++ files for 4.1 VC++Files/strings/strings.dsp: Updated VC++ files for 4.1 client/mysql.cc: Update for windows heap/_check.c: Fixed wrong DBUG_PRINT() usage include/mysql.h: Portability fix (uint -> unsigned int) libmysql/libmysql.def: Removed old my_casecmp function sql/ha_innodb.cc: Update for windows sql/init.cc: Removed not used variable sql/log.cc: Removed not used variable sql/net_pkg.cc: Portability fix sql/sql_db.cc: Portability fixes. Removed not used variables sql/sql_lex.h: Portability fix sql/sql_parse.cc: Portability fix sql/sql_prepare.cc: Removed not used variables sql/sql_select.cc: Portability fix sql/sql_show.cc: Portability fix sql/sql_union.cc: Portability fix --- VC++Files/client/mysqlclient.dsp | 4 ++++ VC++Files/fix-project-files | 7 ++++++ VC++Files/libmysql/libmysql.dsp | 5 +++++ VC++Files/libmysqld/libmysqld.dsp | 39 ++++++++++++++++++++++----------- VC++Files/myisam/myisam.dsp | 24 ++++++++++++++++++++ VC++Files/mysys/mysys.dsp | 12 ++++++---- VC++Files/sql/mysqld.dsp | 46 +++++++++++++++++++++++++++++++++------ VC++Files/strings/strings.dsp | 4 ++++ client/mysql.cc | 4 ++-- heap/_check.c | 8 +++---- include/mysql.h | 10 ++++----- libmysql/libmysql.def | 5 ++--- sql/ha_innodb.cc | 4 ++-- sql/init.cc | 1 - sql/log.cc | 1 - sql/net_pkg.cc | 4 ++-- sql/sql_db.cc | 7 ++---- sql/sql_lex.h | 2 +- sql/sql_parse.cc | 5 +++-- sql/sql_prepare.cc | 1 - sql/sql_select.cc | 7 +++--- sql/sql_show.cc | 5 ++--- sql/sql_union.cc | 4 ++-- 23 files changed, 146 insertions(+), 63 deletions(-) create mode 100755 VC++Files/fix-project-files diff --git a/VC++Files/client/mysqlclient.dsp b/VC++Files/client/mysqlclient.dsp index 4d70971a363..4c806091b84 100644 --- a/VC++Files/client/mysqlclient.dsp +++ b/VC++Files/client/mysqlclient.dsp @@ -136,6 +136,10 @@ SOURCE="..\strings\ctype-latin1_de.c" # End Source File # Begin Source File +SOURCE="..\strings\ctype-simple.c" +# End Source File +# Begin Source File + SOURCE="..\strings\ctype-sjis.c" # End Source File # Begin Source File diff --git a/VC++Files/fix-project-files b/VC++Files/fix-project-files new file mode 100755 index 00000000000..b63ceab318a --- /dev/null +++ b/VC++Files/fix-project-files @@ -0,0 +1,7 @@ +#!/bin/sh + +# +# Change linefeed -> return+linefeed for all VC++ project files +# + +find . \( -name "*.dsp" -o -name "*.dsw" \) -print | grep -v "SCCS" | xargs replace '\r\$' ' ' '\$' ' ' -- diff --git a/VC++Files/libmysql/libmysql.dsp b/VC++Files/libmysql/libmysql.dsp index 4dc0f86a6e9..af61d6e7ebe 100644 --- a/VC++Files/libmysql/libmysql.dsp +++ b/VC++Files/libmysql/libmysql.dsp @@ -147,6 +147,10 @@ SOURCE="..\strings\ctype-latin1_de.c" # End Source File # Begin Source File +SOURCE="..\strings\ctype-simple.c" +# End Source File +# Begin Source File + SOURCE="..\strings\ctype-sjis.c" # End Source File # Begin Source File @@ -256,6 +260,7 @@ SOURCE=..\mysys\my_alloc.c # Begin Source File SOURCE=..\mysys\my_compress.c +# ADD CPP /I "../zlib" # End Source File # Begin Source File diff --git a/VC++Files/libmysqld/libmysqld.dsp b/VC++Files/libmysqld/libmysqld.dsp index bd20c75a24e..6eeb1fcd603 100644 --- a/VC++Files/libmysqld/libmysqld.dsp +++ b/VC++Files/libmysqld/libmysqld.dsp @@ -43,8 +43,7 @@ RSC=rc.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBMYSQLD_EXPORTS" /YX /FD /c -# ADD CPP /nologo /G6 /MT /W3 /O2 /I "../include" /I "../regex" /I "../sql" /I "../bdb/build_win32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "USE_SYMDIR" /D "SIGNAL_WITH_VIO_CLOSE" /D "HAVE_DLOPEN" /D "EMBEDDED_LIBRARY" /D "HAVE_INNOBASE_DB" /D "DBUG_OFF" /D "USE_TLS" /D "__WIN__" /FR /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD CPP /nologo /G6 /MT /W3 /O2 /I "../include" /I "../regex" /I "../sql" /I "../bdb/build_win32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "USE_SYMDIR" /D "SIGNAL_WITH_VIO_CLOSE" /D "HAVE_DLOPEN" /D "EMBEDDED_LIBRARY" /D "HAVE_INNOBASE_DB" /D "DBUG_OFF" /D "USE_TLS" /D "__WIN__" /FR /FD /mktyplib203 /win32 # ADD BASE MTL /c # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x416 /d "NDEBUG" # ADD RSC /l 0x416 /d "NDEBUG" @@ -53,8 +52,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_release\myisam.lib ..\lib_release\myisammrg.lib ..\lib_release\mysys.lib ..\lib_release\strings.lib ..\lib_release\regex.lib ..\lib_release\heap.lib ..\lib_release\innodb.lib ..\lib_release\bdb.lib ..\lib_release\zlib.lib /nologo /dll /machine:I386 /out:"../lib_release/libmysqld.dll" /implib:"../lib_release/libmysqld.lib" -# SUBTRACT LINK32 /pdb:none +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_release\myisam.lib ..\lib_release\myisammrg.lib ..\lib_release\mysys.lib ..\lib_release\strings.lib ..\lib_release\regex.lib ..\lib_release\heap.lib ..\lib_release\innodb.lib ..\lib_release\bdb.lib ..\lib_release\zlib.lib # SUBTRACT LINK32 /nologo /dll /pdb:none /machine:I386 /out:"../lib_release/libmysqld.dll" /implib:"../lib_release/libmysqld.lib" !ELSEIF "$(CFG)" == "libmysqld - Win32 Debug" @@ -70,8 +68,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBMYSQLD_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MT /W3 /Gm /Zi /Od /I "../include" /I "../sql" /I "../regex" /I "../bdb/build_win32" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "HAVE_BERKELEY_DB" /D "USE_SYMDIR" /D "SIGNAL_WITH_VIO_CLOSE" /D "HAVE_DLOPEN" /D "EMBEDDED_LIBRARY" /D "HAVE_INNOBASE_DB" /D "USE_TLS" /D "__WIN__" /FD /GZ /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD CPP /nologo /MT /W3 /Gm /Zi /Od /I "../include" /I "../sql" /I "../regex" /I "../bdb/build_win32" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "HAVE_BERKELEY_DB" /D "USE_SYMDIR" /D "SIGNAL_WITH_VIO_CLOSE" /D "HAVE_DLOPEN" /D "EMBEDDED_LIBRARY" /D "HAVE_INNOBASE_DB" /D "USE_TLS" /D "__WIN__" /FD /GZ /mktyplib203 /win32 # ADD BASE MTL /c # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x416 /d "_DEBUG" # ADD RSC /l 0x416 /d "_DEBUG" @@ -80,8 +77,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_debug\dbug.lib ..\lib_debug\mysys.lib ..\lib_debug\strings.lib ..\lib_debug\regex.lib ..\lib_debug\heap.lib ..\lib_debug\innodb.lib /nologo /dll /incremental:no /debug /machine:I386 /nodefaultlib:"LIBCMTD" /out:"../lib_debug/libmysqld.dll" /implib:"../lib_debug/libmysqld.lib" /pdbtype:sept -# SUBTRACT LINK32 /pdb:none +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_debug\dbug.lib ..\lib_debug\mysys.lib ..\lib_debug\strings.lib ..\lib_debug\regex.lib ..\lib_debug\heap.lib ..\lib_debug\innodb.lib # SUBTRACT LINK32 /nologo /dll /pdb:none /debug /machine:I386 /nodefaultlib:"LIBCMTD" /out:"../lib_debug/libmysqld.dll" /implib:"../lib_debug/libmysqld.lib" !ENDIF @@ -119,6 +115,10 @@ SOURCE=..\libmysql\get_password.c # End Source File # Begin Source File +SOURCE=..\sql\gstream.cpp +# End Source File +# Begin Source File + SOURCE=..\sql\ha_berkeley.cpp # End Source File # Begin Source File @@ -176,6 +176,7 @@ SOURCE=..\sql\item_create.cpp # Begin Source File SOURCE=..\sql\item_func.cpp +# ADD CPP /I "../zlib" # End Source File # Begin Source File @@ -183,6 +184,10 @@ SOURCE=..\sql\item_strfunc.cpp # End Source File # Begin Source File +SOURCE=..\sql\item_subselect.cpp +# End Source File +# Begin Source File + SOURCE=..\sql\item_sum.cpp # End Source File # Begin Source File @@ -271,7 +276,7 @@ SOURCE=..\sql\set_var.cpp # End Source File # Begin Source File -SOURCE=..\sql\slave.cpp +SOURCE=..\sql\spatial.cpp # End Source File # Begin Source File @@ -307,10 +312,18 @@ SOURCE=..\sql\sql_delete.cpp # End Source File # Begin Source File +SOURCE=..\sql\sql_derived.cpp +# End Source File +# Begin Source File + SOURCE=..\sql\sql_do.cpp # End Source File # Begin Source File +SOURCE=..\sql\sql_error.cpp +# End Source File +# Begin Source File + SOURCE=..\sql\sql_handler.cpp # End Source File # Begin Source File @@ -327,10 +340,6 @@ SOURCE=..\sql\sql_list.cpp # End Source File # Begin Source File -SOURCE=..\sql\sql_load.cpp -# End Source File -# Begin Source File - SOURCE=..\sql\sql_manager.cpp # End Source File # Begin Source File @@ -340,6 +349,10 @@ SOURCE=..\sql\sql_map.cpp # Begin Source File SOURCE=..\sql\sql_parse.cpp +# End Source File +# Begin Source File + +SOURCE=..\sql\sql_prepare.cpp # End Source File # Begin Source File diff --git a/VC++Files/myisam/myisam.dsp b/VC++Files/myisam/myisam.dsp index 8346cddbc54..96cb85f7139 100644 --- a/VC++Files/myisam/myisam.dsp +++ b/VC++Files/myisam/myisam.dsp @@ -265,8 +265,28 @@ SOURCE=.\mi_write.c # End Source File # Begin Source File +SOURCE=.\rt_index.c +# End Source File +# Begin Source File + +SOURCE=.\rt_key.c +# End Source File +# Begin Source File + +SOURCE=.\rt_mbr.c +# End Source File +# Begin Source File + +SOURCE=.\rt_split.c +# End Source File +# Begin Source File + SOURCE=.\sort.c # End Source File +# Begin Source File + +SOURCE=.\sp_key.c +# End Source File # End Group # Begin Group "Header Files" @@ -279,6 +299,10 @@ SOURCE=.\ft_eval.h SOURCE=.\myisamdef.h # End Source File +# Begin Source File + +SOURCE=.\rt_index.h +# End Source File # End Group # End Target # End Project diff --git a/VC++Files/mysys/mysys.dsp b/VC++Files/mysys/mysys.dsp index 42213b16cf5..0465c446647 100644 --- a/VC++Files/mysys/mysys.dsp +++ b/VC++Files/mysys/mysys.dsp @@ -26,7 +26,7 @@ CFG=mysys - Win32 Debug # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" -CPP=xicl6.exe +CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "mysys - Win32 Release" @@ -49,7 +49,7 @@ RSC=rc.exe BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo -LIB32=xilink6.exe -lib +LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo /out:"..\lib_release\mysys.lib" @@ -73,7 +73,7 @@ LIB32=xilink6.exe -lib BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo -LIB32=xilink6.exe -lib +LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo /out:"..\lib_debug\mysys.lib" @@ -98,7 +98,7 @@ LIB32=xilink6.exe -lib BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo -LIB32=xilink6.exe -lib +LIB32=link.exe -lib # ADD BASE LIB32 /nologo /out:"..\lib_release\mysys.lib" # ADD LIB32 /nologo /out:"..\lib_release\mysys-max.lib" @@ -339,6 +339,10 @@ SOURCE=.\my_getwd.c # End Source File # Begin Source File +SOURCE=.\my_handler.c +# End Source File +# Begin Source File + SOURCE=.\my_init.c # End Source File # Begin Source File diff --git a/VC++Files/sql/mysqld.dsp b/VC++Files/sql/mysqld.dsp index 093cfb0d925..0c7f2b6d928 100644 --- a/VC++Files/sql/mysqld.dsp +++ b/VC++Files/sql/mysqld.dsp @@ -28,7 +28,7 @@ CFG=mysqld - Win32 Release # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" -CPP=xicl6.exe +CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "mysqld - Win32 Release" @@ -52,7 +52,7 @@ RSC=rc.exe BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo -LINK32=xilink6.exe +LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_release\vio.lib ..\lib_release\isam.lib ..\lib_release\merge.lib ..\lib_release\mysys.lib ..\lib_release\strings.lib ..\lib_release\regex.lib ..\lib_release\heap.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../client_release/mysqld-opt.exe" # SUBTRACT LINK32 /debug @@ -78,7 +78,7 @@ LINK32=xilink6.exe BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo -LINK32=xilink6.exe +LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_debug\dbug.lib ..\lib_debug\vio.lib ..\lib_debug\isam.lib ..\lib_debug\merge.lib ..\lib_debug\mysys.lib ..\lib_debug\strings.lib ..\lib_debug\regex.lib ..\lib_debug\heap.lib ..\lib_debug\bdb.lib ..\lib_debug\innodb.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../client_debug/mysqld.exe" /pdbtype:sept @@ -105,7 +105,7 @@ LINK32=xilink6.exe BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo -LINK32=xilink6.exe +LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_release\dbug.lib ..\lib_release\isam.lib ..\lib_release\merge.lib ..\lib_release\mysys.lib ..\lib_release\strings.lib ..\lib_release\regex.lib ..\lib_release\heap.lib /nologo /subsystem:console /debug /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_release\vio.lib ..\lib_release\isam.lib ..\lib_release\merge.lib ..\lib_release\myisam.lib ..\lib_release\myisammrg.lib ..\lib_release\mysys.lib ..\lib_release\strings.lib ..\lib_release\regex.lib ..\lib_release\heap.lib ..\lib_release\innodb.lib ..\lib_release\zlib.lib /nologo /subsystem:console /map /machine:I386 /out:"../client_release/mysqld-nt.exe" # SUBTRACT LINK32 /pdb:none /debug @@ -133,7 +133,7 @@ LINK32=xilink6.exe BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo -LINK32=xilink6.exe +LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_release\isam.lib ..\lib_release\merge.lib ..\lib_release\myisam.lib ..\lib_release\myisammrg.lib ..\lib_release\mysys.lib ..\lib_release\strings.lib ..\lib_release\regex.lib ..\lib_release\heap.lib ..\lib_release\zlib.lib /nologo /subsystem:console /map /machine:I386 /out:"../client_release/mysqld-nt.exe" # SUBTRACT BASE LINK32 /pdb:none /debug # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_release\vio.lib ..\lib_release\isam.lib ..\lib_release\merge.lib ..\lib_release\myisam.lib ..\lib_release\myisammrg.lib ..\lib_release\mysys-max.lib ..\lib_release\strings.lib ..\lib_release\regex.lib ..\lib_release\heap.lib ..\lib_release\zlib.lib ..\lib_release\innodb.lib ..\lib_release\bdb.lib /nologo /subsystem:console /map /machine:I386 /out:"../client_release/mysqld-max-nt.exe" @@ -162,7 +162,7 @@ LINK32=xilink6.exe BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo -LINK32=xilink6.exe +LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_release\isam.lib ..\lib_release\merge.lib ..\lib_release\mysys.lib ..\lib_release\strings.lib ..\lib_release\regex.lib ..\lib_release\heap.lib /nologo /subsystem:console /pdb:none /debug /machine:I386 /out:"../client_release/mysqld-opt.exe" # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Wsock32.lib ..\lib_release\vio.lib ..\lib_release\isam.lib ..\lib_release\merge.lib ..\lib_release\myisam.lib ..\lib_release\myisammrg.lib ..\lib_release\mysys-max.lib ..\lib_release\strings.lib ..\lib_release\regex.lib ..\lib_release\heap.lib ..\lib_release\innodb.lib ..\lib_release\bdb.lib ..\lib_release\zlib.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../client_release/mysqld-max.exe" # SUBTRACT LINK32 /debug @@ -278,6 +278,10 @@ SOURCE=.\filesort.cpp # End Source File # Begin Source File +SOURCE=.\gstream.cpp +# End Source File +# Begin Source File + SOURCE=.\ha_berkeley.cpp # End Source File # Begin Source File @@ -456,17 +460,25 @@ SOURCE=.\item_func.cpp !IF "$(CFG)" == "mysqld - Win32 Release" +# ADD CPP /I "../zlib" + !ELSEIF "$(CFG)" == "mysqld - Win32 Debug" -# ADD CPP /G5 +# ADD CPP /G5 /I "../zlib" # SUBTRACT CPP /YX /Yc /Yu !ELSEIF "$(CFG)" == "mysqld - Win32 nt" +# ADD CPP /I "../zlib" + !ELSEIF "$(CFG)" == "mysqld - Win32 Max nt" +# ADD CPP /I "../zlib" + !ELSEIF "$(CFG)" == "mysqld - Win32 Max" +# ADD CPP /I "../zlib" + !ENDIF # End Source File @@ -492,6 +504,10 @@ SOURCE=.\item_strfunc.cpp # End Source File # Begin Source File +SOURCE=.\item_subselect.cpp +# End Source File +# Begin Source File + SOURCE=.\item_sum.cpp !IF "$(CFG)" == "mysqld - Win32 Release" @@ -811,6 +827,10 @@ SOURCE=.\slave.cpp # End Source File # Begin Source File +SOURCE=.\spatial.cpp +# End Source File +# Begin Source File + SOURCE=.\sql_acl.cpp !IF "$(CFG)" == "mysqld - Win32 Release" @@ -927,10 +947,18 @@ SOURCE=.\sql_delete.cpp # End Source File # Begin Source File +SOURCE=.\sql_derived.cpp +# End Source File +# Begin Source File + SOURCE=.\sql_do.cpp # End Source File # Begin Source File +SOURCE=.\sql_error.cpp +# End Source File +# Begin Source File + SOURCE=.\sql_handler.cpp # End Source File # Begin Source File @@ -1059,6 +1087,10 @@ SOURCE=.\sql_parse.cpp # End Source File # Begin Source File +SOURCE=.\sql_prepare.cpp +# End Source File +# Begin Source File + SOURCE=.\sql_rename.cpp # End Source File # Begin Source File diff --git a/VC++Files/strings/strings.dsp b/VC++Files/strings/strings.dsp index 52655947790..1433b8d05f6 100644 --- a/VC++Files/strings/strings.dsp +++ b/VC++Files/strings/strings.dsp @@ -128,6 +128,10 @@ SOURCE=".\ctype-latin1_de.c" # End Source File # Begin Source File +SOURCE=".\ctype-simple.c" +# End Source File +# Begin Source File + SOURCE=".\ctype-sjis.c" # End Source File # Begin Source File diff --git a/client/mysql.cc b/client/mysql.cc index 7341132b8e0..567b9e450e4 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -91,8 +91,8 @@ extern "C" { #define vidattr(A) {} // Can't get this to work #endif -#ifdef __WIN__ -#define cmp_database(A,B) my_strcasecmp((A),(B)) +#ifdef FN_NO_CASE_SENCE +#define cmp_database(A,B) my_strcasecmp(system_charset_info, (A), (B)) #else #define cmp_database(A,B) strcmp((A),(B)) #endif diff --git a/heap/_check.c b/heap/_check.c index 3b2fc9afad9..4a6482901d9 100644 --- a/heap/_check.c +++ b/heap/_check.c @@ -116,13 +116,11 @@ static int check_one_rb_key(HP_INFO *info, uint keynr, ulong records, SEARCH_FIND | SEARCH_SAME, ¬_used)) { error= 1; - DBUG_PRINT("error",("Record in wrong link: Link %d Record: %lx\n", - link, recpos)); + DBUG_PRINT("error",("Record in wrong link: key: %d Record: %lx\n", + keynr, recpos)); } else - { found++; - } key= tree_search_next(&keydef->rb_tree, &info->last_pos, offsetof(TREE_ELEMENT, left), offsetof(TREE_ELEMENT, right)); @@ -130,7 +128,7 @@ static int check_one_rb_key(HP_INFO *info, uint keynr, ulong records, } if (found != records) { - DBUG_PRINT("error",("Found %ld of %ld records")); + DBUG_PRINT("error",("Found %lu of %lu records", found, records)); error= 1; } if (print_status) diff --git a/include/mysql.h b/include/mysql.h index 64b118ca8b1..710f5006724 100644 --- a/include/mysql.h +++ b/include/mysql.h @@ -275,7 +275,7 @@ my_ulonglong STDCALL mysql_affected_rows(MYSQL *mysql); my_ulonglong STDCALL mysql_insert_id(MYSQL *mysql); unsigned int STDCALL mysql_errno(MYSQL *mysql); const char * STDCALL mysql_error(MYSQL *mysql); -uint STDCALL mysql_warning_count(MYSQL *mysql); +unsigned int STDCALL mysql_warning_count(MYSQL *mysql); const char * STDCALL mysql_info(MYSQL *mysql); unsigned long STDCALL mysql_thread_id(MYSQL *mysql); const char * STDCALL mysql_character_set_name(MYSQL *mysql); @@ -427,7 +427,7 @@ typedef struct st_mysql_bind /* The following are for internal use. Set by mysql_bind_param */ long bind_length; /* Default length of data */ my_bool long_ended; /* All data supplied for long */ - uint param_number; /* For null count and error messages */ + unsigned int param_number; /* For null count and error messages */ void (*store_param_func)(NET *net, struct st_mysql_bind *param); char *(*fetch_result)(struct st_mysql_bind *, const char *row); } MYSQL_BIND; @@ -448,7 +448,7 @@ typedef struct st_mysql_stmt unsigned long field_count; /* fields count */ unsigned long long_length; /* long buffer alloced length */ unsigned long stmt_id; /* Id for prepared statement */ - uint last_errno; /* error code */ + unsigned int last_errno; /* error code */ enum MY_STMT_STATE state; /* statement state */ char last_error[MYSQL_ERRMSG_SIZE]; /* error message */ my_bool long_alloced; /* flag to indicate long alloced */ @@ -463,14 +463,14 @@ unsigned long STDCALL mysql_param_count(MYSQL_STMT * stmt); my_bool STDCALL mysql_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bind); my_bool STDCALL mysql_bind_result(MYSQL_STMT * stmt, MYSQL_BIND * bind); my_bool STDCALL mysql_stmt_close(MYSQL_STMT * stmt); -uint STDCALL mysql_stmt_errno(MYSQL_STMT * stmt); +unsigned int STDCALL mysql_stmt_errno(MYSQL_STMT * stmt); const char *STDCALL mysql_stmt_error(MYSQL_STMT * stmt); my_bool STDCALL mysql_commit(MYSQL * mysql); my_bool STDCALL mysql_rollback(MYSQL * mysql); my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode); int STDCALL mysql_fetch(MYSQL_STMT *stmt); my_bool STDCALL mysql_send_long_data(MYSQL_STMT *stmt, - uint param_number, + unsigned int param_number, const char *data, unsigned long length, my_bool last_data); diff --git a/libmysql/libmysql.def b/libmysql/libmysql.def index c15d6be61f4..a7fb4d378e5 100644 --- a/libmysql/libmysql.def +++ b/libmysql/libmysql.def @@ -1,6 +1,6 @@ LIBRARY LIBMYSQL -DESCRIPTION 'MySQL 4.0 Client Library' -VERSION 5.0 +DESCRIPTION 'MySQL 4.1 Client Library' +VERSION 6.0 EXPORTS mysql_affected_rows mysql_close @@ -59,7 +59,6 @@ EXPORTS list_add list_delete max_allowed_packet - my_casecmp my_init my_end my_strdup diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index b684d9dd4dd..824169467af 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -3155,8 +3155,8 @@ innobase_drop_database( memcpy(namebuf, ptr, len); namebuf[len] = '/'; namebuf[len + 1] = '\0'; -#ifdef __WIN__ - casedn_str(namebuf); +#ifdef FN_NO_CASE_SENCE + my_casedn_str(system_charset_info, namebuf); #endif trx = trx_allocate_for_mysql(); diff --git a/sql/init.cc b/sql/init.cc index 052ee16925e..8834fd3a89c 100644 --- a/sql/init.cc +++ b/sql/init.cc @@ -24,7 +24,6 @@ void unireg_init(ulong options) { uint i; double nr; - CHARSET_INFO *cs; DBUG_ENTER("unireg_init"); MYSYS_PROGRAM_DONT_USE_CURSES(); diff --git a/sql/log.cc b/sql/log.cc index 59f99e3460e..8cb1577d745 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -973,7 +973,6 @@ bool MYSQL_LOG::write(THD *thd,enum enum_server_command command, last_time=skr; struct tm tm_tmp; struct tm *start; - ulong length; localtime_r(&skr,&tm_tmp); start=&tm_tmp; /* Note that my_b_write() assumes it knows the length for this */ diff --git a/sql/net_pkg.cc b/sql/net_pkg.cc index 9f91db95052..1da625e776f 100644 --- a/sql/net_pkg.cc +++ b/sql/net_pkg.cc @@ -273,12 +273,12 @@ send_eof(THD *thd, bool no_flush) { if (!no_flush && (thd->client_capabilities & CLIENT_PROTOCOL_41)) { - char buff[5]; + uchar buff[5]; uint tmp= min(thd->total_warn_count, 65535); buff[0]=254; int2store(buff+1, tmp); int2store(buff+3, 0); // No flags yet - VOID(my_net_write(net,buff,5)); + VOID(my_net_write(net,(char*) buff,5)); VOID(net_flush(net)); } else diff --git a/sql/sql_db.cc b/sql/sql_db.cc index 1d843b78d4e..58b12bca00d 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -69,7 +69,6 @@ static bool write_db_opt(const char *path, HA_CREATE_INFO *create) error=0; my_close(file,MYF(0)); } -exit: return error; } @@ -104,7 +103,7 @@ static bool load_db_opt(const char *path, HA_CREATE_INFO *create) IO_CACHE cache; init_io_cache(&cache, file, IO_SIZE, READ_CACHE, 0, 0, MYF(0)); - while ((int) (nbytes= my_b_gets(&cache, (byte*) buf, sizeof(buf))) > 0) + while ((int) (nbytes= my_b_gets(&cache, (char*) buf, sizeof(buf))) > 0) { char *pos= buf+nbytes-1; /* Remove end space and control characters */ @@ -251,10 +250,8 @@ exit2: int mysql_alter_db(THD *thd, const char *db, HA_CREATE_INFO *create_info) { char path[FN_REFLEN+16]; - MY_DIR *dirp; long result=1; int error = 0; - register File file; uint create_options = create_info ? create_info->options : 0; DBUG_ENTER("mysql_alter_db"); @@ -602,7 +599,7 @@ bool mysql_change_db(THD *thd, const char *name) int mysqld_show_create_db(THD *thd, const char *dbname) { - int length, db_length; + int length; char path[FN_REFLEN], *to; uint db_access; bool found_libchar; diff --git a/sql/sql_lex.h b/sql/sql_lex.h index acf73f34d5d..16c45c8300e 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -210,7 +210,7 @@ private: SELECT_LEX_UNIT - unit of selects (UNION, INTERSECT, ...) group SELECT_LEXs */ -class st_lex; +struct st_lex; class st_select_lex; class THD; class select_result; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 7902e66043d..e096ef7869e 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1287,6 +1287,7 @@ mysql_execute_command(THD *thd) int res= 0; LEX *lex= &thd->lex; TABLE_LIST *tables= (TABLE_LIST*) lex->select_lex.table_list.first; + TABLE_LIST *cursor; SELECT_LEX *select_lex= &lex->select_lex; SELECT_LEX_UNIT *unit= &lex->unit; DBUG_ENTER("mysql_execute_command"); @@ -1343,7 +1344,7 @@ mysql_execute_command(THD *thd) DBUG_VOID_RETURN; } //check rights - for (TABLE_LIST *cursor= tables; + for (cursor= tables; cursor; cursor= cursor->next) if (cursor->derived) @@ -1361,7 +1362,7 @@ mysql_execute_command(THD *thd) } thd->send_explain_fields(explain_result); // EXPLAIN derived tables - for (TABLE_LIST *cursor= tables; + for (cursor= tables; cursor; cursor= cursor->next) if (cursor->derived) diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index a085795fa76..bd115f0fc1e 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -634,7 +634,6 @@ bool mysql_stmt_prepare(THD *thd, char *packet, uint packet_length) { MEM_ROOT thd_root = thd->mem_root; PREP_STMT stmt; - bool error; DBUG_ENTER("mysql_stmt_prepare"); bzero((char*) &stmt, sizeof(stmt)); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 09d41e2891b..801a3e556d5 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -171,7 +171,7 @@ int handle_select(THD *thd, LEX *lex, select_result *result) result->abort(); if (res || thd->net.report_error) { - send_error(thd, 0, MYF(0)); + send_error(thd, 0, NullS); res= 1; } delete result; @@ -7176,7 +7176,6 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, bool distinct,const char *message) { List field_list; - Item *item; List item_list; THD *thd=join->thd; SELECT_LEX *select_lex = &(join->thd->lex.select_lex); @@ -7190,7 +7189,7 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, if (message) { - item_list.push_back(new Item_int((int)thd->lex.select->select_number)); + item_list.push_back(new Item_int((int32) thd->lex.select->select_number)); item_list.push_back(new Item_string(thd->lex.select->type, strlen(thd->lex.select->type), default_charset_info)); @@ -7217,7 +7216,7 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, tmp2.length(0); item_list.empty(); - item_list.push_back(new Item_int((int)thd->lex.select->select_number)); + item_list.push_back(new Item_int((int32) thd->lex.select->select_number)); item_list.push_back(new Item_string(thd->lex.select->type, strlen(thd->lex.select->type), default_charset_info)); diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 827067c27d7..8c4c104d180 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -230,7 +230,7 @@ int mysqld_show_table_types(THD *thd) const char *option_name= show_comp_option_name[(int) *types->value]; if (*types->value == SHOW_OPTION_YES && - !strcasecmp(default_type_name, types->type)) + !my_strcasecmp(system_charset_info, default_type_name, types->type)) option_name= "DEFAULT"; net_store_data(packet, option_name); net_store_data(packet, types->comment); @@ -1398,7 +1398,6 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose) int mysqld_show_charsets(THD *thd, const char *wild) { - uint i; char buff[8192]; String packet2(buff,sizeof(buff),default_charset_info); List field_list; @@ -1425,7 +1424,7 @@ int mysqld_show_charsets(THD *thd, const char *wild) net_store_data(&packet2,convert,cs->name); net_store_data(&packet2,(uint32) cs->number); net_store_data(&packet2,(uint32) cs->strxfrm_multiply); - net_store_data(&packet2,(uint32) cs->mbmaxlen ? cs->mbmaxlen : 1); + net_store_data(&packet2,(uint32) (cs->mbmaxlen ? cs->mbmaxlen : 1)); if (my_net_write(&thd->net, (char*) packet2.ptr(),packet2.length())) goto err; diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 1a18759eb5b..c2ef25ce6a1 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -111,7 +111,7 @@ int st_select_lex_unit::prepare(THD *thd, select_result *result) DBUG_ENTER("st_select_lex_unit::prepare"); this->thd= thd; this->result= result; - SELECT_LEX *lex_select_save= thd->lex.select; + SELECT_LEX *lex_select_save= thd->lex.select, *sl; /* Global option */ if (((void*)(global_parameters)) == ((void*)this)) @@ -179,7 +179,7 @@ int st_select_lex_unit::prepare(THD *thd, select_result *result) // prepare selects joins.empty(); - for (SELECT_LEX *sl= first_select(); sl; sl= sl->next_select()) + for (sl= first_select(); sl; sl= sl->next_select()) { JOIN *join= new JOIN(thd, sl->item_list, sl->options | thd->options | SELECT_NO_UNLOCK | -- cgit v1.2.1 From ac97cce4617a52d100cb2b5fa6c6c972c3510702 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 8 Oct 2002 23:49:59 +0300 Subject: removed 'this' pointer from initialization list of constructors --- sql/item_subselect.cc | 29 ++++++++++++++++++----------- sql/item_subselect.h | 11 +++++++++-- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index e8ee6a780ea..2d08b9cb6b5 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -32,11 +32,22 @@ SUBSELECT TODO: #include "mysql_priv.h" #include "sql_select.h" -Item_subselect::Item_subselect(THD *thd, st_select_lex *select_lex, - select_subselect *result): +Item_subselect::Item_subselect(): Item(), engine_owner(1), value_assigned(0) { - DBUG_ENTER("Item_subselect::Item_subselect"); + assign_null(); + /* + item value is NULL if select_subselect not changed this value + (i.e. some rows will be found returned) + */ + null_value= 1; +} + +void Item_subselect::init(THD *thd, st_select_lex *select_lex, + select_subselect *result) +{ + + DBUG_ENTER("Item_subselect::init"); DBUG_PRINT("subs", ("select_lex 0x%xl", (long) select_lex)); if (select_lex->next_select()) @@ -45,12 +56,6 @@ Item_subselect::Item_subselect(THD *thd, st_select_lex *select_lex, else engine= new subselect_single_select_engine(thd, select_lex, result, this); - assign_null(); - /* - item value is NULL if select_subselect not changed this value - (i.e. some rows will be found returned) - */ - null_value= 1; DBUG_VOID_RETURN; } @@ -100,8 +105,9 @@ inline table_map Item_subselect::used_tables() const Item_singleval_subselect::Item_singleval_subselect(THD *thd, st_select_lex *select_lex): - Item_subselect(thd, select_lex, new select_singleval_subselect(this)) + Item_subselect() { + init(thd, select_lex, new select_singleval_subselect(this)); max_columns= 1; maybe_null= 1; } @@ -149,8 +155,9 @@ String *Item_singleval_subselect::val_str (String *str) Item_exists_subselect::Item_exists_subselect(THD *thd, st_select_lex *select_lex): - Item_subselect(thd, select_lex, new select_exists_subselect(this)) + Item_subselect() { + init(thd, select_lex, new select_exists_subselect(this)); max_columns= UINT_MAX; null_value= 0; //can't be NULL maybe_null= 0; //can't be NULL diff --git a/sql/item_subselect.h b/sql/item_subselect.h index 92839eb0e5f..5d070871b49 100644 --- a/sql/item_subselect.h +++ b/sql/item_subselect.h @@ -39,8 +39,7 @@ protected: uint max_columns; public: - Item_subselect(THD *thd, st_select_lex *select_lex, - select_subselect* result); + Item_subselect(); Item_subselect(Item_subselect *item) { null_value= item->null_value; @@ -50,6 +49,14 @@ public: engine_owner= 0; name= item->name; } + + /* + We need this method, because some compilers do not allow 'this' + pointer in constructor initialization list, but we need pass pointer + to subselect Item class to select_subselect classes constructor. + */ + void init (THD *thd, st_select_lex *select_lex, select_subselect *result); + ~Item_subselect(); virtual void assign_null() { -- cgit v1.2.1 From edb8ae0f3876d88c2ea8479afdc546ec3a18ea3b Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 9 Oct 2002 15:40:57 +0500 Subject: Simple charsets now have strncoll() field too --- client/sql_string.cc | 2 +- include/m_ctype.h | 13 +++--- include/my_sys.h | 1 - isam/_key.c | 12 +++--- isam/_search.c | 4 +- myisam/mi_open.c | 2 +- myisam/mi_search.c | 2 +- mysys/charset.c | 1 + mysys/mf_casecnv.c | 20 ++-------- mysys/my_handler.c | 2 +- sql/field.cc | 6 +-- sql/filesort.cc | 10 ++--- sql/opt_range.cc | 2 +- sql/sql_string.cc | 2 +- strings/ctype-simple.c | 24 ++++++----- strings/ctype.c | 106 +++++++++++++++++++++++++++++++++---------------- 16 files changed, 118 insertions(+), 91 deletions(-) diff --git a/client/sql_string.cc b/client/sql_string.cc index cf9e9f62507..65854ece0ef 100644 --- a/client/sql_string.cc +++ b/client/sql_string.cc @@ -507,7 +507,7 @@ int sortcmp(const String *x,const String *y) uint32 x_len=x->length(),y_len=y->length(),len=min(x_len,y_len); #ifdef USE_STRCOLL - if (use_strcoll(x->str_charset)) + if (use_strnxfrm(x->str_charset)) { #ifndef CMP_ENDSPACE while (x_len && my_isspace(x->str_charset,s[x_len-1])) diff --git a/include/m_ctype.h b/include/m_ctype.h index 70acfcb3dec..69a2e025a11 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -92,12 +92,13 @@ typedef struct charset_info_st int (*wc_mb)(struct charset_info_st *cs,my_wc_t wc, unsigned char *s,unsigned char *e); - /* Functions for case convertion */ + /* Functions for case and sort convertion */ void (*caseup_str)(struct charset_info_st *, char *); void (*casedn_str)(struct charset_info_st *, char *); void (*caseup)(struct charset_info_st *, char *, uint); void (*casedn)(struct charset_info_st *, char *, uint); - + void (*tosort)(struct charset_info_st *, char *, uint); + /* Functions for case comparison */ int (*strcasecmp)(struct charset_info_st *, const char *, const char *); int (*strncasecmp)(struct charset_info_st *, const char *, const char *, @@ -125,14 +126,15 @@ extern const char *compiled_charset_name(uint charset_number); #define MY_CHARSET_CURRENT (default_charset_info->number) /* declarations for simple charsets */ -extern int my_strnxfrm_simple(CHARSET_INFO *, char *, uint, const char *, uint); -extern int my_strnncoll_simple(CHARSET_INFO *, const char *, uint, const char *, uint); +extern int my_strnxfrm_simple(CHARSET_INFO *, uchar *, uint, const uchar *, uint); +extern int my_strnncoll_simple(CHARSET_INFO *, const uchar *, uint, const uchar *, uint); /* Functions for 8bit */ extern void my_caseup_str_8bit(CHARSET_INFO *, char *); extern void my_casedn_str_8bit(CHARSET_INFO *, char *); extern void my_caseup_8bit(CHARSET_INFO *, char *, uint); extern void my_casedn_8bit(CHARSET_INFO *, char *, uint); +extern void my_tosort_8bit(CHARSET_INFO *, char *, uint); extern int my_strcasecmp_8bit(CHARSET_INFO * cs, const char *, const char *); extern int my_strncasecmp_8bit(CHARSET_INFO * cs, const char *, const char *, uint); @@ -364,7 +366,7 @@ void my_hash_sort_ucs2(struct charset_info_st *cs, const uchar *key, uint len, u #define my_isvar(s,c) (my_isalnum(s,c) || (c) == '_') #define my_isvar_start(s,c) (my_isalpha(s,c) || (c) == '_') -#define use_strcoll(s) ((s)->strnncoll != NULL) +#define use_strnxfrm(s) ((s)->strnxfrm != NULL) #define my_strnxfrm(s, a, b, c, d) ((s)->strnxfrm((s), (a), (b), (c), (d))) #define my_strnncoll(s, a, b, c, d) ((s)->strnncoll((s), (a), (b), (c), (d))) #define my_like_range(s, a, b, c, d, e, f, g, h) \ @@ -377,6 +379,7 @@ void my_hash_sort_ucs2(struct charset_info_st *cs, const uchar *key, uint len, u #define my_caseup(s, a, l) ((s)->caseup((s), (a), (l))) #define my_casedn(s, a, l) ((s)->casedn((s), (a), (l))) +#define my_tosort(s, a, l) ((s)->tosort((s), (a), (l))) #define my_caseup_str(s, a) ((s)->caseup_str((s), (a))) #define my_casedn_str(s, a) ((s)->casedn_str((s), (a))) #define my_strcasecmp(s, a, b) ((s)->strcasecmp((s), (a), (b))) diff --git a/include/my_sys.h b/include/my_sys.h index 7ceb40e9e06..e96543494b4 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -583,7 +583,6 @@ extern void allow_break(void); #endif extern void my_remember_signal(int signal_number,sig_handler (*func)(int)); -extern void case_sort(CHARSET_INFO *cs, my_string str,uint length); extern uint dirname_part(my_string to,const char *name); extern uint dirname_length(const char *name); #define base_name(A) (A+dirname_length(A)) diff --git a/isam/_key.c b/isam/_key.c index 0bedb428808..002ad480c56 100644 --- a/isam/_key.c +++ b/isam/_key.c @@ -54,11 +54,11 @@ uint _nisam_make_key(register N_INFO *info, uint keynr, uchar *key, const char * *key++= (uchar) (length=(uint) (end-pos)); memcpy((byte*) key,(byte*) pos,(size_t) length); #ifdef USE_STRCOLL - if (!use_strcoll(default_charset_info)) + if (!use_strnxfrm(default_charset_info)) #endif { if (type == HA_KEYTYPE_TEXT) - case_sort(default_charset_info,(byte*) key,length); + my_tosort(default_charset_info,(byte*) key,length); } key+=length; } @@ -67,11 +67,11 @@ uint _nisam_make_key(register N_INFO *info, uint keynr, uchar *key, const char * memcpy((byte*) key,(byte*) record+keyseg->base.start, (size_t) keyseg->base.length); #ifdef USE_STRCOLL - if (!use_strcoll(default_charset_info)) + if (!use_strnxfrm(default_charset_info)) #endif { if (type == HA_KEYTYPE_TEXT) - case_sort(default_charset_info,(byte*) key,(uint) keyseg->base.length); + my_tosort(default_charset_info,(byte*) key,(uint) keyseg->base.length); } #ifdef NAN_TEST else if (type == HA_KEYTYPE_FLOAT) @@ -150,11 +150,11 @@ uint _nisam_pack_key(register N_INFO *info, uint keynr, uchar *key, uchar *old, else memcpy((byte*) key,old,(size_t) length); #ifdef USE_STRCOLL - if (!use_strcoll(default_charset_info)) + if (!use_strnxfrm(default_charset_info)) #endif { if (type == HA_KEYTYPE_TEXT) - case_sort(default_charset_info,(byte*) key,length); + my_tosort(default_charset_info,(byte*) key,length); } key+= length; } diff --git a/isam/_search.c b/isam/_search.c index d76a8ce3097..445340a21d6 100644 --- a/isam/_search.c +++ b/isam/_search.c @@ -332,7 +332,7 @@ int _nisam_key_cmp(register N_KEYSEG *keyseg, register uchar *a, register uchar end= a+ min(key_length,(uint) length); #ifdef USE_STRCOLL - if (use_strcoll(default_charset_info)) { + if (use_strnxfrm(default_charset_info)) { if (((enum ha_base_keytype) keyseg->base.type) == HA_KEYTYPE_BINARY) { while (a < end) @@ -383,7 +383,7 @@ int _nisam_key_cmp(register N_KEYSEG *keyseg, register uchar *a, register uchar else { #ifdef USE_STRCOLL - if (use_strcoll(default_charset_info)) { + if (use_strnxfrm(default_charset_info)) { if (((enum ha_base_keytype) keyseg->base.type) == HA_KEYTYPE_BINARY) { while (a < end) diff --git a/myisam/mi_open.c b/myisam/mi_open.c index b05a8175a6e..cd11f190d24 100644 --- a/myisam/mi_open.c +++ b/myisam/mi_open.c @@ -685,7 +685,7 @@ static void setup_key_functions(register MI_KEYDEF *keyinfo) keyinfo->get_key= _mi_get_pack_key; if (keyinfo->seg[0].flag & HA_PACK_KEY) { /* Prefix compression */ - if (!keyinfo->seg->charset || use_strcoll(keyinfo->seg->charset) || + if (!keyinfo->seg->charset || use_strnxfrm(keyinfo->seg->charset) || (keyinfo->seg->flag & HA_NULL_PART)) keyinfo->bin_search=_mi_seq_search; else diff --git a/myisam/mi_search.c b/myisam/mi_search.c index 46d1cd19142..737bb2fd5d3 100644 --- a/myisam/mi_search.c +++ b/myisam/mi_search.c @@ -1287,7 +1287,7 @@ _mi_calc_var_pack_key_length(MI_KEYDEF *keyinfo,uint nod_flag,uchar *next_key, if ((keyinfo->flag & HA_FULLTEXT) && ((keyseg->type == HA_KEYTYPE_TEXT) || (keyseg->type == HA_KEYTYPE_VARTEXT)) && - !use_strcoll(keyseg->charset)) + !use_strnxfrm(keyseg->charset)) sort_order=keyseg->charset->sort_order; /* diff flag contains how many bytes is needed to pack key */ diff --git a/mysys/charset.c b/mysys/charset.c index 691a4233269..48dfad51da9 100644 --- a/mysys/charset.c +++ b/mysys/charset.c @@ -377,6 +377,7 @@ static CHARSET_INFO *add_charset(uint cs_number, myf flags) cs->casedn_str = my_casedn_str_8bit; cs->caseup = my_caseup_8bit; cs->casedn = my_casedn_8bit; + cs->tosort = my_tosort_8bit; cs->strcasecmp = my_strcasecmp_8bit; cs->strncasecmp = my_strncasecmp_8bit; cs->mb_wc = my_mb_wc_8bit; diff --git a/mysys/mf_casecnv.c b/mysys/mf_casecnv.c index 631db18b1ed..26d2e79ee9d 100644 --- a/mysys/mf_casecnv.c +++ b/mysys/mf_casecnv.c @@ -15,11 +15,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* - Functions to convert to lover_case and to upper_case in scandinavia. - - case_sort converts a character string to a representaion that can - be compared by strcmp to find with is alfabetical bigger. - (lower- and uppercase letters is compared as the same) + Functions to convert to lover_case and to upper_case. */ #include "mysys_priv.h" @@ -29,21 +25,11 @@ #endif - /* to sort-string that can be compared to get text in order */ - -void case_sort(CHARSET_INFO *cs, my_string str, uint length) -{ - register uchar *map=cs->sort_order; - - for ( ; length>0 ; length--, str++) - *str= (char) map[(uchar) *str]; -} /* case_sort */ - int my_sortcmp(CHARSET_INFO *cs, const char *s, const char *t, uint len) { #ifdef USE_STRCOLL - if (use_strcoll(cs)) + if (use_strnxfrm(cs)) return my_strnncoll(cs,(uchar *)s, len, (uchar *)t, len); else #endif @@ -63,7 +49,7 @@ int my_sortncmp(CHARSET_INFO *cs, const char *t, uint t_len) { #ifdef USE_STRCOLL - if (use_strcoll(cs)) + if (use_strnxfrm(cs)) return my_strnncoll(cs, (uchar *)s, s_len, (uchar *)t, t_len); else #endif diff --git a/mysys/my_handler.c b/mysys/my_handler.c index fe610b73fe9..af1bf7037f9 100644 --- a/mysys/my_handler.c +++ b/mysys/my_handler.c @@ -23,7 +23,7 @@ int mi_compare_text(CHARSET_INFO *charset_info, uchar *a, uint a_length, int flag; #ifdef USE_STRCOLL - if (use_strcoll(charset_info)) + if (use_strnxfrm(charset_info)) { if (part_key && b_length < a_length) a_length=b_length; diff --git a/sql/field.cc b/sql/field.cc index 336bc9d7cc2..a65e9c4f7a4 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -3841,7 +3841,7 @@ void Field_string::sort_string(char *to,uint length) else { #ifdef USE_STRCOLL - if (use_strcoll(field_charset)) { + if (use_strnxfrm(field_charset)) { uint tmp=my_strnxfrm(field_charset, (unsigned char *)to, length, (unsigned char *) ptr, field_length); @@ -4045,7 +4045,7 @@ void Field_varstring::sort_string(char *to,uint length) else { #ifdef USE_STRCOLL - if (use_strcoll(field_charset)) + if (use_strnxfrm(field_charset)) tot_length=my_strnxfrm(field_charset, (unsigned char *) to, length, (unsigned char *)ptr+2, tot_length); @@ -4536,7 +4536,7 @@ void Field_blob::sort_string(char *to,uint length) else { #ifdef USE_STRCOLL - if (use_strcoll(field_charset)) + if (use_strnxfrm(field_charset)) { blob_length=my_strnxfrm(field_charset, (unsigned char *)to, length, diff --git a/sql/filesort.cc b/sql/filesort.cc index 4d877c92dba..81629684a87 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -140,7 +140,7 @@ ha_rows filesort(TABLE *table, SORT_FIELD *sortorder, uint s_length, records=param.max_rows; /* purecov: inspected */ #ifdef USE_STRCOLL - if (use_strcoll(charset) && + if (use_strnxfrm(charset) && !(param.tmp_buffer=my_malloc(param.sort_length,MYF(MY_WME)))) goto err; #endif @@ -511,7 +511,7 @@ static void make_sortkey(register SORTPARAM *param, length=sort_field->length; } #ifdef USE_STRCOLL - if(use_strcoll(cs)) + if(use_strnxfrm(cs)) { if (item->binary) { @@ -541,7 +541,7 @@ static void make_sortkey(register SORTPARAM *param, memcpy(to,res->ptr(),length); bzero((char *)to+length,diff); if (!item->binary) - case_sort(cs, (char*) to,length); + my_tosort(cs, (char*) to,length); #ifdef USE_STRCOLL } #endif @@ -946,7 +946,7 @@ sortlength(SORT_FIELD *sortorder, uint s_length) if (!sortorder->field->binary()) { CHARSET_INFO *cs=((Field_str*)(sortorder->field))->charset(); - if (use_strcoll(cs)) + if (use_strnxfrm(cs)) sortorder->length= sortorder->length*cs->strxfrm_multiply; } #endif @@ -966,7 +966,7 @@ sortlength(SORT_FIELD *sortorder, uint s_length) if (!sortorder->item->binary) { CHARSET_INFO *cs=sortorder->item->str_value.charset(); - if (use_strcoll(cs)) + if (use_strnxfrm(cs)) sortorder->length= sortorder->length*cs->strxfrm_multiply; } #endif diff --git a/sql/opt_range.cc b/sql/opt_range.cc index ed5b2b0a230..2b0ac08fe95 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -978,7 +978,7 @@ get_mm_leaf(PARAM *param, Field *field, KEY_PART *key_part, { CHARSET_INFO *charset=((Field_str*)(field))->charset(); #ifdef USE_STRCOLL - if (use_strcoll(charset)) + if (use_strnxfrm(charset)) like_error= my_like_range(charset, res->ptr(),res->length(),wild_prefix, field_length, min_str+maybe_null, diff --git a/sql/sql_string.cc b/sql/sql_string.cc index 6a42078cbcd..d2d14d4e7a2 100644 --- a/sql/sql_string.cc +++ b/sql/sql_string.cc @@ -505,7 +505,7 @@ int sortcmp(const String *x,const String *y) uint32 x_len=x->length(),y_len=y->length(),len=min(x_len,y_len); #ifdef USE_STRCOLL - if (use_strcoll(x->str_charset)) + if (use_strnxfrm(x->str_charset)) { #ifndef CMP_ENDSPACE while (x_len && my_isspace(x->str_charset,s[x_len-1])) diff --git a/strings/ctype-simple.c b/strings/ctype-simple.c index f6c92edf1b8..8553f83f380 100644 --- a/strings/ctype-simple.c +++ b/strings/ctype-simple.c @@ -20,32 +20,30 @@ #include "assert.h" int my_strnxfrm_simple(CHARSET_INFO * cs, - char *dest, uint len, - const char *src, uint srclen) + uchar *dest, uint len, + const uchar *src, uint srclen) { uchar *map= cs->sort_order; DBUG_ASSERT(len >= srclen); for ( ; len > 0 ; len-- ) - *dest++= (char) map[(uchar) *src++]; + *dest++= map[*src++]; return srclen; } -int my_strnncoll_simple(CHARSET_INFO * cs, const char *s, uint slen, - const char *t, uint tlen) +int my_strnncoll_simple(CHARSET_INFO * cs, const uchar *s, uint slen, + const uchar *t, uint tlen) { int len = ( slen > tlen ) ? tlen : slen; uchar *map= cs->sort_order; while (len--) { - if (map[(uchar) *s++] != map[(uchar) *t++]) - return ((int) map[(uchar) s[-1]] - - (int) map[(uchar) t[-1]]); + if (map[*s++] != map[*t++]) + return ((int) map[s[-1]] - (int) map[t[-1]]); } return (int) (slen-tlen); } - void my_caseup_str_8bit(CHARSET_INFO * cs,char *str) { register uchar *map=cs->to_upper; @@ -53,7 +51,6 @@ void my_caseup_str_8bit(CHARSET_INFO * cs,char *str) str++; } - void my_casedn_str_8bit(CHARSET_INFO * cs,char *str) { register uchar *map=cs->to_lower; @@ -61,7 +58,6 @@ void my_casedn_str_8bit(CHARSET_INFO * cs,char *str) str++; } - void my_caseup_8bit(CHARSET_INFO * cs, char *str, uint length) { register uchar *map=cs->to_upper; @@ -76,6 +72,12 @@ void my_casedn_8bit(CHARSET_INFO * cs, char *str, uint length) *str= (char) map[(uchar) *str]; } +void my_tosort_8bit(CHARSET_INFO *cs, char *str, uint length) +{ + register uchar *map=cs->sort_order; + for ( ; length>0 ; length--, str++) + *str= (char) map[(uchar) *str]; +} int my_strcasecmp_8bit(CHARSET_INFO * cs,const char *s, const char *t) { diff --git a/strings/ctype.c b/strings/ctype.c index d3ae693f97d..1abb7a5d2c8 100644 --- a/strings/ctype.c +++ b/strings/ctype.c @@ -2816,7 +2816,7 @@ CHARSET_INFO compiled_charsets[] = { tab_8859_1_uni, /* tab_to_uni */ idx_uni_8859_1, /* tab_from_uni */ 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ + my_strnncoll_simple,/* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ 0, /* mbmaxlen */ @@ -2829,6 +2829,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ @@ -2863,6 +2864,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_mb, my_caseup_mb, my_casedn_mb, + NULL, /* tosort */ my_strcasecmp_mb, my_strncasecmp_mb, NULL, /* hash_caseup */ @@ -2884,7 +2886,7 @@ CHARSET_INFO compiled_charsets[] = { tab_cp1251_uni, /* tab_to_uni */ idx_uni_cp1251, /* tab_from_uni */ 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ + my_strnncoll_simple,/* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ 0, /* mbmaxlen */ @@ -2897,6 +2899,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ @@ -2918,7 +2921,7 @@ CHARSET_INFO compiled_charsets[] = { tab_cp1257_uni, /* tab_to_uni */ idx_uni_cp1257, /* tab_from_uni */ 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ + my_strnncoll_simple,/* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ 0, /* mbmaxlen */ @@ -2931,6 +2934,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ @@ -2952,7 +2956,7 @@ CHARSET_INFO compiled_charsets[] = { tab_8859_2_uni, /* tab_to_uni */ idx_uni_8859_2, /* tab_from_uni */ 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ + my_strnncoll_simple,/* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ 0, /* mbmaxlen */ @@ -2965,6 +2969,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ @@ -2999,6 +3004,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + NULL, /* tosort */ my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ @@ -3020,7 +3026,7 @@ CHARSET_INFO compiled_charsets[] = { tab_8859_1_uni, /* tab_to_uni */ idx_uni_8859_1, /* tab_from_uni */ 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ + my_strnncoll_simple,/* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ 0, /* mbmaxlen */ @@ -3033,6 +3039,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ @@ -3054,7 +3061,7 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ + my_strnncoll_simple,/* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ 0, /* mbmaxlen */ @@ -3067,6 +3074,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ @@ -3088,7 +3096,7 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ + my_strnncoll_simple,/* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ 0, /* mbmaxlen */ @@ -3101,6 +3109,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ @@ -3122,7 +3131,7 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ + my_strnncoll_simple,/* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ 0, /* mbmaxlen */ @@ -3135,6 +3144,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ @@ -3156,7 +3166,7 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ + my_strnncoll_simple,/* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ 2, /* mbmaxlen */ @@ -3169,6 +3179,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_mb, my_caseup_mb, my_casedn_mb, + my_tosort_8bit, my_strcasecmp_mb, my_strncasecmp_mb, NULL, /* hash_caseup */ @@ -3190,7 +3201,7 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ + my_strnncoll_simple,/* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ 2, /* mbmaxlen */ @@ -3203,6 +3214,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_mb, my_caseup_mb, my_casedn_mb, + my_tosort_8bit, my_strcasecmp_mb, my_strncasecmp_mb, NULL, /* hash_caseup */ @@ -3231,12 +3243,13 @@ CHARSET_INFO compiled_charsets[] = { ismbchar_gbk, ismbhead_gbk, mbcharlen_gbk, - my_mb_wc_gbk, /* mb_wc */ - my_wc_mb_gbk, /* wc_mb */ + my_mb_wc_gbk, /* mb_wc */ + my_wc_mb_gbk, /* wc_mb */ my_caseup_str_mb, my_casedn_str_mb, my_caseup_mb, my_casedn_mb, + NULL, /* tosort */ my_strcasecmp_mb, my_strncasecmp_mb, NULL, /* hash_caseup */ @@ -3258,7 +3271,7 @@ CHARSET_INFO compiled_charsets[] = { tab_8859_1_uni, /* tab_to_uni */ idx_uni_8859_1, /* tab_from_uni */ 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ + my_strnncoll_simple,/* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ 0, /* mbmaxlen */ @@ -3271,6 +3284,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ @@ -3292,7 +3306,7 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ + my_strnncoll_simple,/* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ 0, /* mbmaxlen */ @@ -3305,6 +3319,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ @@ -3326,7 +3341,7 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ + my_strnncoll_simple,/* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ 0, /* mbmaxlen */ @@ -3339,6 +3354,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ @@ -3360,7 +3376,7 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ + my_strnncoll_simple,/* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ 0, /* mbmaxlen */ @@ -3373,6 +3389,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ @@ -3394,7 +3411,7 @@ CHARSET_INFO compiled_charsets[] = { tab_8859_2_uni, /* tab_to_uni */ idx_uni_8859_2, /* tab_from_uni */ 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ + my_strnncoll_simple,/* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ 0, /* mbmaxlen */ @@ -3407,6 +3424,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ @@ -3428,7 +3446,7 @@ CHARSET_INFO compiled_charsets[] = { tab_koi8_r_uni, /* tab_to_uni */ idx_uni_koi8_r, /* tab_from_uni */ 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ + my_strnncoll_simple,/* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ 0, /* mbmaxlen */ @@ -3441,6 +3459,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ @@ -3462,7 +3481,7 @@ CHARSET_INFO compiled_charsets[] = { tab_koi8_u_uni, /* tab_to_uni */ idx_uni_koi8_u, /* tab_from_uni */ 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ + my_strnncoll_simple,/* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ 0, /* mbmaxlen */ @@ -3475,6 +3494,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ @@ -3509,6 +3529,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + NULL, /* tosort */ my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ @@ -3530,7 +3551,7 @@ CHARSET_INFO compiled_charsets[] = { tab_8859_2_uni, /* tab_to_uni */ idx_uni_8859_2, /* tab_from_uni */ 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ + my_strnncoll_simple,/* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ 0, /* mbmaxlen */ @@ -3543,6 +3564,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ @@ -3564,7 +3586,7 @@ CHARSET_INFO compiled_charsets[] = { tab_8859_9_uni, /* tab_to_uni */ idx_uni_8859_9, /* tab_from_uni */ 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ + my_strnncoll_simple,/* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ 0, /* mbmaxlen */ @@ -3577,6 +3599,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ @@ -3611,6 +3634,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + NULL, /* tosort */ my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ @@ -3632,7 +3656,7 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* tab_to_uni */ NULL, /* tab_from_uni */ 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ + my_strnncoll_simple,/* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ 0, /* mbmaxlen */ @@ -3645,6 +3669,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ @@ -3679,6 +3704,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + NULL, /* tosort */ my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ @@ -3713,6 +3739,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_ucs2, my_caseup_ucs2, my_casedn_ucs2, + NULL, /* tosort */ my_strcasecmp_ucs2, my_strncasecmp_ucs2, my_hash_caseup_ucs2,/* hash_caseup */ @@ -3748,6 +3775,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_mb, my_caseup_mb, my_casedn_mb, + my_tosort_8bit, my_strcasecmp_mb, my_strncasecmp_mb, NULL, /* hash_caseup */ @@ -3782,6 +3810,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_utf8, my_caseup_utf8, my_casedn_utf8, + NULL, /* tosort */ my_strcasecmp_utf8, my_strncasecmp_utf8, my_hash_caseup_utf8,/* hash_caseup */ @@ -3803,7 +3832,7 @@ CHARSET_INFO compiled_charsets[] = { tab_us_ascii_uni, /* tab_to_uni */ idx_uni_us_ascii, /* tab_from_uni */ 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ + my_strnncoll_simple,/* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ 0, /* mbmaxlen */ @@ -3816,6 +3845,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ @@ -3837,7 +3867,7 @@ CHARSET_INFO compiled_charsets[] = { tab_cp1250_uni, /* tab_to_uni */ idx_uni_cp1250, /* tab_from_uni */ 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ + my_strnncoll_simple,/* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ 0, /* mbmaxlen */ @@ -3850,6 +3880,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ @@ -3871,7 +3902,7 @@ CHARSET_INFO compiled_charsets[] = { tab_cp1251_uni, /* tab_to_uni */ idx_uni_cp1251, /* tab_from_uni */ 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ + my_strnncoll_simple,/* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ 0, /* mbmaxlen */ @@ -3885,6 +3916,7 @@ CHARSET_INFO compiled_charsets[] = { my_caseup_8bit, my_casedn_8bit, my_strcasecmp_8bit, + my_tosort_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ NULL, /* hash_sort */ @@ -3905,7 +3937,7 @@ CHARSET_INFO compiled_charsets[] = { tab_armscii_8_uni, /* tab_to_uni */ idx_uni_armscii_8, /* tab_from_uni */ 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ + my_strnncoll_simple,/* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ 0, /* mbmaxlen */ @@ -3918,6 +3950,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ @@ -3939,7 +3972,7 @@ CHARSET_INFO compiled_charsets[] = { tab_cp1251_uni, /* tab_to_uni */ idx_uni_cp1251, /* tab_from_uni */ 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ + my_strnncoll_simple,/* strnncoll */ NULL, /* strnxfrm */ NULL, /* like_range */ 0, /* mbmaxlen */ @@ -3952,6 +3985,7 @@ CHARSET_INFO compiled_charsets[] = { my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, NULL, /* hash_caseup */ @@ -3962,10 +3996,10 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_win1250ch { - 34, /* number */ - MY_CS_COMPILED, /* state */ - "win1250ch", /* name */ - "", /* comment */ + 34, /* number */ + MY_CS_COMPILED, /* state */ + "win1250ch", /* name */ + "", /* comment */ ctype_win1250ch, to_lower_win1250ch, to_upper_win1250ch, @@ -3980,16 +4014,17 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* ismbchar */ NULL, /* ismbhead */ NULL, /* mbcharlen */ - my_mb_wc_8bit, /* mb_wc */ - my_wc_mb_8bit, /* wc_mb */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, my_casedn_str_8bit, my_caseup_8bit, my_casedn_8bit, + NULL, /* tosort */ my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + NULL, /* hash_caseup */ + NULL, /* hash_sort */ 0 }, #endif @@ -4017,6 +4052,7 @@ CHARSET_INFO compiled_charsets[] = { NULL, /* mb_wc */ NULL, /* wc_mb */ + NULL, NULL, NULL, NULL, -- cgit v1.2.1 From 1b623a4032eeeb62e42a0f9c21cfe83c02c8ed4f Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 9 Oct 2002 16:33:35 +0500 Subject: my_sortcmp -> my_strnncoll BitKeeper/deleted/.del-mf_casecnv.c~c269ed3dcafea441: Delete: mysys/mf_casecnv.c --- client/mysql.cc | 5 ++-- heap/hp_hash.c | 4 +-- include/my_sys.h | 2 -- libmysql/Makefile.shared | 2 +- mysys/Makefile.am | 2 +- mysys/charset.c | 1 + mysys/mf_casecnv.c | 67 ------------------------------------------------ sql/field.cc | 36 +++++++++++++++++++------- sql/ha_innodb.cc | 6 ++--- sql/item_sum.cc | 4 ++- sql/key.cc | 5 ++-- 11 files changed, 44 insertions(+), 90 deletions(-) delete mode 100644 mysys/mf_casecnv.c diff --git a/client/mysql.cc b/client/mysql.cc index 7341132b8e0..f7da4a963f9 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -1396,8 +1396,9 @@ com_go(String *buffer,char *line __attribute__((unused))) (void) com_print(buffer,0); if (skip_updates && - (buffer->length() < 4 || my_sortcmp(system_charset_info,buffer->ptr(), - "SET ",4))) + (buffer->length() < 4 || my_strnncoll(system_charset_info, + (const uchar*)buffer->ptr(),4, + (const uchar*)"SET ",4))) { (void) put_info("Ignoring query to other database",INFO_INFO); return 0; diff --git a/heap/hp_hash.c b/heap/hp_hash.c index 0145e0d503c..b0533e9c7a4 100644 --- a/heap/hp_hash.c +++ b/heap/hp_hash.c @@ -401,7 +401,7 @@ int hp_rec_key_cmp(HP_KEYDEF *keydef, const byte *rec1, const byte *rec2) } if (seg->type == HA_KEYTYPE_TEXT) { - if (my_sortcmp(seg->charset,rec1+seg->start,rec2+seg->start,seg->length)) + if (my_strnncoll(seg->charset,rec1+seg->start,seg->length,rec2+seg->start,seg->length)) return 1; } else @@ -433,7 +433,7 @@ int hp_key_cmp(HP_KEYDEF *keydef, const byte *rec, const byte *key) } if (seg->type == HA_KEYTYPE_TEXT) { - if (my_sortcmp(seg->charset,rec+seg->start,key,seg->length)) + if (my_strnncoll(seg->charset,rec+seg->start,seg->length,key,seg->length)) return 1; } else diff --git a/include/my_sys.h b/include/my_sys.h index e96543494b4..6545077df72 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -607,8 +607,6 @@ extern my_string my_path(my_string to,const char *progname, extern my_string my_load_path(my_string to, const char *path, const char *own_path_prefix); extern int wild_compare(const char *str,const char *wildstr); -extern int my_sortcmp(CHARSET_INFO *cs, const char *s,const char *t,uint length); -extern int my_sortncmp(CHARSET_INFO *cs, const char *s,uint s_len, const char *t,uint t_len); extern WF_PACK *wf_comp(my_string str); extern int wf_test(struct wild_file_pack *wf_pack,const char *name); extern void wf_end(struct wild_file_pack *buffer); diff --git a/libmysql/Makefile.shared b/libmysql/Makefile.shared index 0f7cb713d54..26262d9e618 100644 --- a/libmysql/Makefile.shared +++ b/libmysql/Makefile.shared @@ -49,7 +49,7 @@ dbugobjects = dbug.lo # IT IS IN SAFEMALLOC.C sanity.lo mysysheaders = mysys_priv.h my_static.h mysysobjects1 = my_init.lo my_static.lo my_malloc.lo my_realloc.lo \ my_create.lo my_delete.lo mf_tempfile.lo my_open.lo \ - mf_casecnv.lo my_read.lo my_write.lo errors.lo \ + my_read.lo my_write.lo errors.lo \ my_error.lo my_getwd.lo my_div.lo \ mf_pack.lo my_messnc.lo mf_dirname.lo mf_fn_ext.lo\ mf_wcomp.lo typelib.lo safemalloc.lo my_alloc.lo \ diff --git a/mysys/Makefile.am b/mysys/Makefile.am index 8da25ad101a..192b5e7fe37 100644 --- a/mysys/Makefile.am +++ b/mysys/Makefile.am @@ -39,7 +39,7 @@ libmysys_a_SOURCES = my_init.c my_getwd.c mf_getdate.c\ mf_format.c mf_same.c mf_dirname.c mf_fn_ext.c \ my_symlink.c my_symlink2.c \ mf_pack.c mf_unixpath.c mf_strip.c \ - mf_casecnv.c mf_soundex.c mf_wcomp.c mf_wfile.c \ + mf_soundex.c mf_wcomp.c mf_wfile.c \ mf_qsort.c mf_qsort2.c mf_sort.c \ ptr_cmp.c mf_radix.c queues.c \ tree.c list.c hash.c array.c string.c typelib.c \ diff --git a/mysys/charset.c b/mysys/charset.c index 48dfad51da9..7d58f7588b4 100644 --- a/mysys/charset.c +++ b/mysys/charset.c @@ -373,6 +373,7 @@ static CHARSET_INFO *add_charset(uint cs_number, myf flags) sizeof(tmp_sort_order)); memcpy((char*) cs->tab_to_uni, (char*) tmp_to_uni, sizeof(tmp_to_uni)); + cs->strnncoll = my_strnncoll_simple; cs->caseup_str = my_caseup_str_8bit; cs->casedn_str = my_casedn_str_8bit; cs->caseup = my_caseup_8bit; diff --git a/mysys/mf_casecnv.c b/mysys/mf_casecnv.c deleted file mode 100644 index 26d2e79ee9d..00000000000 --- a/mysys/mf_casecnv.c +++ /dev/null @@ -1,67 +0,0 @@ -/* Copyright (C) 2000 MySQL AB - - 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; either version 2 of the License, or - (at your option) any later version. - - 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -/* - Functions to convert to lover_case and to upper_case. -*/ - -#include "mysys_priv.h" -#include -#ifndef SCO -#include -#endif - - - -int my_sortcmp(CHARSET_INFO *cs, const char *s, const char *t, uint len) -{ -#ifdef USE_STRCOLL - if (use_strnxfrm(cs)) - return my_strnncoll(cs,(uchar *)s, len, (uchar *)t, len); - else -#endif - { - register uchar *map=cs->sort_order; - while (len--) - { - if (map[(uchar) *s++] != map[(uchar) *t++]) - return ((int) map[(uchar) s[-1]] - (int) map[(uchar) t[-1]]); - } - return 0; - } -} - -int my_sortncmp(CHARSET_INFO *cs, - const char *s, uint s_len, - const char *t, uint t_len) -{ -#ifdef USE_STRCOLL - if (use_strnxfrm(cs)) - return my_strnncoll(cs, (uchar *)s, s_len, (uchar *)t, t_len); - else -#endif - { - uint len= min(s_len,t_len); - register uchar *map=cs->sort_order; - - while (len--) - { - if (map[(uchar) *s++] != map[(uchar) *t++]) - return ((int) map[(uchar) s[-1]] - (int) map[(uchar) t[-1]]); - } - return (int) (s_len - t_len); - } -} diff --git a/sql/field.cc b/sql/field.cc index a65e9c4f7a4..cdbe05669d0 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -3831,7 +3831,9 @@ int Field_string::cmp(const char *a_ptr, const char *b_ptr) if (binary_flag) return memcmp(a_ptr,b_ptr,field_length); else - return my_sortcmp(field_charset,a_ptr,b_ptr,field_length); + return my_strnncoll(field_charset, + (const uchar*)a_ptr,field_length, + (const uchar*)b_ptr,field_length); } void Field_string::sort_string(char *to,uint length) @@ -3907,7 +3909,9 @@ int Field_string::pack_cmp(const char *a, const char *b, uint length) int cmp= memcmp(a,b,min(a_length,b_length)); return cmp ? cmp : (int) (a_length - b_length); } - return my_sortncmp(field_charset, a,a_length, b,b_length); + return my_strnncoll(field_charset, + (const uchar*)a,a_length, + (const uchar*)b,b_length); } @@ -3924,7 +3928,9 @@ int Field_string::pack_cmp(const char *b, uint length) int cmp= memcmp(ptr,b,min(a_length,b_length)); return cmp ? cmp : (int) (a_length - b_length); } - return my_sortncmp(field_charset, ptr,a_length, b, b_length); + return my_strnncoll(field_charset, + (const uchar*)ptr,a_length, + (const uchar*)b, b_length); } @@ -4033,7 +4039,9 @@ int Field_varstring::cmp(const char *a_ptr, const char *b_ptr) if (binary_flag) diff=memcmp(a_ptr+2,b_ptr+2,min(a_length,b_length)); else - diff=my_sortcmp(field_charset, a_ptr+2,b_ptr+2,min(a_length,b_length)); + diff=my_strnncoll(field_charset, + (const uchar*)a_ptr+2,min(a_length,b_length), + (const uchar*)b_ptr+2,min(a_length,b_length)); return diff ? diff : (int) (a_length - b_length); } @@ -4134,7 +4142,9 @@ int Field_varstring::pack_cmp(const char *a, const char *b, uint key_length) int cmp= memcmp(a,b,min(a_length,b_length)); return cmp ? cmp : (int) (a_length - b_length); } - return my_sortncmp(field_charset, a,a_length, b,b_length); + return my_strnncoll(field_charset, + (const uchar *)a,a_length, + (const uchar *)b,b_length); } int Field_varstring::pack_cmp(const char *b, uint key_length) @@ -4155,7 +4165,9 @@ int Field_varstring::pack_cmp(const char *b, uint key_length) int cmp= memcmp(a,b,min(a_length,b_length)); return cmp ? cmp : (int) (a_length - b_length); } - return my_sortncmp(field_charset, a,a_length, b,b_length); + return my_strnncoll(field_charset, + (const uchar *)a,a_length, + (const uchar *)b,b_length); } uint Field_varstring::packed_col_length(const char *ptr, uint length) @@ -4382,7 +4394,9 @@ int Field_blob::cmp(const char *a,uint32 a_length, const char *b, if (binary_flag) diff=memcmp(a,b,min(a_length,b_length)); else - diff=my_sortcmp(field_charset, a,b,min(a_length,b_length)); + diff=my_strnncoll(field_charset, + (const uchar*)a,min(a_length,b_length), + (const uchar*)b,min(a_length,b_length)); return diff ? diff : (int) (a_length - b_length); } @@ -4631,7 +4645,9 @@ int Field_blob::pack_cmp(const char *a, const char *b, uint key_length) int cmp= memcmp(a,b,min(a_length,b_length)); return cmp ? cmp : (int) (a_length - b_length); } - return my_sortncmp(field_charset, a,a_length, b,b_length); + return my_strnncoll(field_charset, + (const uchar *)a,a_length, + (const uchar *)b,b_length); } @@ -4657,7 +4673,9 @@ int Field_blob::pack_cmp(const char *b, uint key_length) int cmp= memcmp(a,b,min(a_length,b_length)); return cmp ? cmp : (int) (a_length - b_length); } - return my_sortncmp(field_charset, a,a_length, b,b_length); + return my_strnncoll(field_charset, + (const uchar *)a,a_length, + (const uchar *)b,b_length); } /* Create a packed key that will be used for storage from a MySQL row */ diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc index b684d9dd4dd..02f1d33b1dc 100644 --- a/sql/ha_innodb.cc +++ b/sql/ha_innodb.cc @@ -1366,9 +1366,9 @@ innobase_mysql_cmp( case FIELD_TYPE_VAR_STRING: // BAR TODO: Discuss with heikki.tuuri@innodb.com // so that he sends CHARSET_INFO for the field to this function. - ret = my_sortncmp(default_charset_info, - (const char*) a, a_length, - (const char*) b, b_length); + ret = my_strnncoll(default_charset_info, + a, a_length, + b, b_length); if (ret < 0) { return(-1); } else if (ret > 0) { diff --git a/sql/item_sum.cc b/sql/item_sum.cc index 93ced79005f..4d25098bb88 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -866,7 +866,9 @@ static int simple_raw_key_cmp(void* arg, byte* key1, byte* key2) static int simple_str_key_cmp(void* arg, byte* key1, byte* key2) { /* BAR TODO: remove default_charset_info */ - return my_sortcmp(default_charset_info,(char*) key1, (char*) key2, *(uint*) arg); + return my_strnncoll(default_charset_info, + (const uchar*) key1, *(uint*) arg, + (const uchar*) key2, *(uint*) arg); } /* diff --git a/sql/key.cc b/sql/key.cc index fa09a0a6d44..84669808b92 100644 --- a/sql/key.cc +++ b/sql/key.cc @@ -193,8 +193,9 @@ int key_cmp(TABLE *table,const byte *key,uint idx,uint key_length) FIELDFLAG_PACK))) { /* BAR TODO: I'm not sure this should be system_charset_info */ - if (my_sortcmp(system_charset_info,(char*) key, - (char*) table->record[0]+key_part->offset,length)) + if (my_strnncoll(system_charset_info, + (const uchar*) key, length, + (const uchar*) table->record[0]+key_part->offset,length)) return 1; } else if (memcmp(key,table->record[0]+key_part->offset,length)) -- cgit v1.2.1 From b9bb3534f1ca2af09f636253650b68b0f2840f65 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 10 Oct 2002 15:52:32 +0500 Subject: Some reorganization to use less memory as well as to hide some implementation aspects into *.c files from *.h files. Some steps to get closer to generating *.c files from *.conf files again. --- include/m_ctype.h | 194 +---------------- mysys/charset.c | 76 +++---- sql/sql_show.cc | 14 +- strings/ctype-big5.c | 65 ++++-- strings/ctype-czech.c | 138 ++++++++++-- strings/ctype-euc_kr.c | 51 ++++- strings/ctype-gb2312.c | 51 ++++- strings/ctype-gbk.c | 47 ++++- strings/ctype-latin1_de.c | 107 +++++++++- strings/ctype-sjis.c | 57 +++-- strings/ctype-tis620.c | 36 ++++ strings/ctype-ujis.c | 52 ++++- strings/ctype-utf8.c | 146 +++++++++---- strings/ctype-win1250ch.c | 159 +++++++++++++- strings/ctype.c | 518 +++++++--------------------------------------- 15 files changed, 908 insertions(+), 803 deletions(-) diff --git a/include/m_ctype.h b/include/m_ctype.h index 69a2e025a11..70551f31c57 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -49,6 +49,9 @@ typedef struct unicase_info_st { #define MY_CS_INDEX 4 /* sets listed in the Index file */ #define MY_CS_LOADED 8 /* sets that are currently loaded */ +#define MY_CHARSET_UNDEFINED 0 +#define MY_CHARSET_CURRENT (default_charset_info->number) + typedef struct my_uni_idx_st { uint16 from; @@ -112,18 +115,12 @@ typedef struct charset_info_st char max_sort_char; /* For LIKE optimization */ } CHARSET_INFO; -/* strings/ctype.c */ + extern CHARSET_INFO *default_charset_info; extern CHARSET_INFO *system_charset_info; -extern CHARSET_INFO *find_compiled_charset(uint cs_number); -extern CHARSET_INFO *find_compiled_charset_by_name(const char *name); -extern CHARSET_INFO compiled_charsets[]; -extern CHARSET_INFO all_charsets[256]; -extern uint compiled_charset_number(const char *name); -extern const char *compiled_charset_name(uint charset_number); +extern CHARSET_INFO *all_charsets[256]; +extern my_bool init_compiled_charsets(myf flags); -#define MY_CHARSET_UNDEFINED 0 -#define MY_CHARSET_CURRENT (default_charset_info->number) /* declarations for simple charsets */ extern int my_strnxfrm_simple(CHARSET_INFO *, uchar *, uint, const uchar *, uint); @@ -153,185 +150,6 @@ extern int my_strcasecmp_mb(CHARSET_INFO * cs,const char *, const char *); extern int my_strncasecmp_mb(CHARSET_INFO * cs,const char *, const char *t, uint); #endif -#ifdef HAVE_CHARSET_big5 -/* declarations for the big5 character set */ -extern uchar ctype_big5[], to_lower_big5[], to_upper_big5[], sort_order_big5[]; -extern int my_strnncoll_big5(CHARSET_INFO *,const uchar *, uint, const uchar *, uint); -extern int my_strnxfrm_big5(CHARSET_INFO *,uchar *, uint, const uchar *, uint); -extern my_bool my_like_range_big5(CHARSET_INFO *,const char *, uint, pchar, uint, - char *, char *, uint *, uint *); -extern int ismbchar_big5(CHARSET_INFO *, const char *, const char *); -extern my_bool ismbhead_big5(CHARSET_INFO *, uint); -extern int mbcharlen_big5(CHARSET_INFO *, uint); -int my_mb_wc_big5(CHARSET_INFO *cs,my_wc_t *wc, const uchar *s,const uchar *e); -int my_wc_mb_big5(CHARSET_INFO *cs,my_wc_t wc, uchar *s, uchar *e); -#endif - -#ifdef HAVE_CHARSET_czech -/* declarations for the czech character set */ -extern uchar ctype_czech[], to_lower_czech[], to_upper_czech[], sort_order_czech[]; -extern int my_strnncoll_czech(CHARSET_INFO *, const uchar *, uint, const uchar *, uint); -extern int my_strnxfrm_czech(CHARSET_INFO *, uchar *, uint, const uchar *, uint); -extern my_bool my_like_range_czech(CHARSET_INFO *, - const char *, uint, pchar, uint, - char *, char *, uint *, uint *); -#endif - - -#ifdef HAVE_CHARSET_win1250ch -/* declarations for the win1250ch character set */ -extern uchar ctype_win1250ch[]; -extern uchar to_lower_win1250ch[]; -extern uchar to_upper_win1250ch[]; -extern uchar sort_order_win1250ch[]; -extern int my_strnncoll_win1250ch(CHARSET_INFO *, const uchar *, uint, const uchar *, uint); -extern int my_strnxfrm_win1250ch(CHARSET_INFO *, uchar *, uint, const uchar *, uint); -extern my_bool my_like_range_win1250ch(CHARSET_INFO *, - const char *, uint, pchar, uint, - char *, char *, uint *, uint *); -#endif - - -#ifdef HAVE_CHARSET_euc_kr -/* declarations for the euc_kr character set */ -extern uchar ctype_euc_kr[], to_lower_euc_kr[], to_upper_euc_kr[], sort_order_euc_kr[]; -extern int ismbchar_euc_kr(CHARSET_INFO *, const char *, const char *); -extern my_bool ismbhead_euc_kr(CHARSET_INFO *, uint); -extern int mbcharlen_euc_kr(CHARSET_INFO *, uint); -int my_mb_wc_euc_kr(CHARSET_INFO *cs,my_wc_t *wc, const uchar *s,const uchar *e); -int my_wc_mb_euc_kr(CHARSET_INFO *cs,my_wc_t wc, uchar *s, uchar *e); -#endif - -#ifdef HAVE_CHARSET_gb2312 -/* declarations for the gb2312 character set */ -extern uchar ctype_gb2312[], to_lower_gb2312[], to_upper_gb2312[], sort_order_gb2312[]; -extern int ismbchar_gb2312(CHARSET_INFO *, const char *, const char *); -extern my_bool ismbhead_gb2312(CHARSET_INFO *, uint); -extern int mbcharlen_gb2312(CHARSET_INFO *, uint); -int my_mb_wc_gb2312(CHARSET_INFO *cs,my_wc_t *wc, const uchar *s,const uchar *e); -int my_wc_mb_gb2312(CHARSET_INFO *cs,my_wc_t wc, uchar *s, uchar *e); -#endif - -#ifdef HAVE_CHARSET_gbk -/* declarations for the gbk character set */ -extern uchar ctype_gbk[], to_lower_gbk[], to_upper_gbk[], sort_order_gbk[]; -extern int my_strnncoll_gbk(CHARSET_INFO *, const uchar *, uint, const uchar *, uint); -extern int my_strnxfrm_gbk(CHARSET_INFO *, uchar *, uint, const uchar *, uint); -extern my_bool my_like_range_gbk(CHARSET_INFO *, const char *, uint, pchar, uint, - char *, char *, uint *, uint *); -extern int ismbchar_gbk(CHARSET_INFO *, const char *, const char *); -extern my_bool ismbhead_gbk(CHARSET_INFO *, uint); -extern int mbcharlen_gbk(CHARSET_INFO *, uint); -int my_mb_wc_gbk(CHARSET_INFO *cs,my_wc_t *wc, const uchar *s,const uchar *e); -int my_wc_mb_gbk(CHARSET_INFO *cs,my_wc_t wc, uchar *s, uchar *e); -#endif - -#ifdef HAVE_CHARSET_latin1_de -/* declarations for the latin1_de character set */ -extern uchar ctype_latin1_de[], to_lower_latin1_de[], to_upper_latin1_de[], sort_order_latin1_de[]; -extern int my_strnncoll_latin1_de(CHARSET_INFO *, const uchar *, uint, const uchar *, uint); -extern int my_strnxfrm_latin1_de(CHARSET_INFO *, uchar *, uint, const uchar *, uint); -extern my_bool my_like_range_latin1_de(CHARSET_INFO *, const char *, uint, pchar, uint, - char *, char *, uint *, uint *); -#endif - -#ifdef HAVE_CHARSET_sjis -/* declarations for the sjis character set */ -extern uchar ctype_sjis[], to_lower_sjis[], to_upper_sjis[], sort_order_sjis[]; -extern int my_strnncoll_sjis(CHARSET_INFO *, const uchar *, uint, const uchar *, uint); -extern int my_strnxfrm_sjis(CHARSET_INFO *, uchar *, uint, const uchar *, uint); -extern my_bool my_like_range_sjis(CHARSET_INFO *, const char *, uint, pchar, uint, - char *, char *, uint *, uint *); -extern int ismbchar_sjis(CHARSET_INFO *, const char *, const char *); -extern my_bool ismbhead_sjis(CHARSET_INFO *, uint); -extern int mbcharlen_sjis(CHARSET_INFO *, uint); -int my_mb_wc_sjis(CHARSET_INFO *cs,my_wc_t *wc, const uchar *s,const uchar *e); -int my_wc_mb_sjis(CHARSET_INFO *cs,my_wc_t wc, uchar *s, uchar *e); -#endif - -#ifdef HAVE_CHARSET_tis620 -/* declarations for the tis620 character set */ -extern uchar ctype_tis620[], to_lower_tis620[], to_upper_tis620[], sort_order_tis620[]; -extern int my_strnncoll_tis620(CHARSET_INFO *, const uchar *, uint, const uchar *, uint); -extern int my_strnxfrm_tis620(CHARSET_INFO *, uchar *, uint, const uchar *, uint); -extern my_bool my_like_range_tis620(CHARSET_INFO *, const char *, uint, pchar, uint, - char *, char *, uint *, uint *); -#endif - -#ifdef HAVE_CHARSET_ujis -/* declarations for the ujis character set */ -extern uchar ctype_ujis[], to_lower_ujis[], to_upper_ujis[], sort_order_ujis[]; -extern int ismbchar_ujis(CHARSET_INFO *, const char *, const char *); -extern my_bool ismbhead_ujis(CHARSET_INFO *, uint); -extern int mbcharlen_ujis(CHARSET_INFO *, uint); -int my_mb_wc_euc_jp(CHARSET_INFO *cs,my_wc_t *wc, const uchar *s,const uchar *e); -int my_wc_mb_euc_jp(CHARSET_INFO *cs,my_wc_t wc, uchar *s, uchar *e); -#endif - -#ifdef HAVE_CHARSET_utf8 - -extern uchar ctype_utf8[]; -extern uchar to_lower_utf8[]; -extern uchar to_upper_utf8[]; - -int my_strnncoll_utf8(CHARSET_INFO *cs, - const uchar *s, uint s_len, const uchar *t, uint t_len); - -int my_strnxfrm_utf8(CHARSET_INFO *cs, - uchar *dest, uint destlen, const uchar *src, uint srclen); - -int my_ismbchar_utf8(CHARSET_INFO *cs, const char *b, const char *e); -my_bool my_ismbhead_utf8(CHARSET_INFO * cs, uint ch); -int my_mbcharlen_utf8(CHARSET_INFO *cs, uint c); - -void my_caseup_str_utf8(CHARSET_INFO * cs, char * s); -void my_casedn_str_utf8(CHARSET_INFO *cs, char * s); -void my_caseup_utf8(CHARSET_INFO *cs, char *s, uint len); -void my_casedn_utf8(CHARSET_INFO *cs, char *s, uint len); - -int my_strcasecmp_utf8(CHARSET_INFO *cs, const char *s, const char *t); -int my_strncasecmp_utf8(CHARSET_INFO *cs, const char *s,const char *t,uint l); - -int my_utf8_uni (CHARSET_INFO *cs, my_wc_t *p, const uchar *s, const uchar *e); -int my_uni_utf8 (CHARSET_INFO *cs, my_wc_t wc, uchar *b, uchar *e); - -uint my_hash_caseup_utf8(struct charset_info_st *cs, const byte *key, uint len); -void my_hash_sort_utf8(struct charset_info_st *cs, const uchar *key, uint len, ulong *nr1, ulong *nr2); - -#endif - - -#ifdef HAVE_CHARSET_ucs2 - -extern uchar ctype_ucs2[]; -extern uchar to_lower_ucs2[]; -extern uchar to_upper_ucs2[]; - -int my_strnncoll_ucs2(CHARSET_INFO *cs, - const uchar *s, uint s_len, const uchar *t, uint t_len); - -int my_strnxfrm_ucs2(CHARSET_INFO *cs, - uchar *dest, uint destlen, const uchar *src, uint srclen); - -int my_ismbchar_ucs2(CHARSET_INFO *cs, const char *b, const char *e); -my_bool my_ismbhead_ucs2(CHARSET_INFO * cs, uint ch); -int my_mbcharlen_ucs2(CHARSET_INFO *cs, uint c); - -void my_caseup_str_ucs2(CHARSET_INFO * cs, char * s); -void my_casedn_str_ucs2(CHARSET_INFO *cs, char * s); -void my_caseup_ucs2(CHARSET_INFO *cs, char *s, uint len); -void my_casedn_ucs2(CHARSET_INFO *cs, char *s, uint len); - -int my_strcasecmp_ucs2(CHARSET_INFO *cs, const char *s, const char *t); -int my_strncasecmp_ucs2(CHARSET_INFO *cs, const char *s,const char *t,uint l); - -int my_ucs2_uni (CHARSET_INFO *cs, my_wc_t *p, const uchar *s, const uchar *e); -int my_uni_ucs2 (CHARSET_INFO *cs, my_wc_t wc, uchar *b, uchar *e); - -uint my_hash_caseup_ucs2(struct charset_info_st *cs, const byte *key, uint len); -void my_hash_sort_ucs2(struct charset_info_st *cs, const uchar *key, uint len, ulong *nr1, ulong *nr2); - -#endif #define _U 01 /* Upper case */ diff --git a/mysys/charset.c b/mysys/charset.c index 7d58f7588b4..742163e9220 100644 --- a/mysys/charset.c +++ b/mysys/charset.c @@ -23,7 +23,6 @@ const char *charsets_dir = NULL; static int charset_initialized=0; -CHARSET_INFO all_charsets[256]; #define MAX_LINE 1024 @@ -111,17 +110,25 @@ static my_bool read_charset_index(myf myflags) my_fclose(fb.f,myflags); return TRUE; } - - cs=&all_charsets[csnum]; - if (!(cs->name= - (char*) my_once_alloc(length= (uint) strlen(buf)+1, myflags))) + if (all_charsets[csnum]) + continue; + + if (!(cs=(CHARSET_INFO*) my_once_alloc(sizeof(cs[0]),myflags))) + { + my_fclose(fb.f,myflags); + return TRUE; + } + bzero(cs,sizeof(cs[0])); + + if (!(cs->name= (char*)my_once_alloc(length=(uint)strlen(buf)+1,myflags))) { my_fclose(fb.f,myflags); return TRUE; } memcpy((char*)cs->name,buf,length); cs->number=csnum; + all_charsets[csnum]=cs; } my_fclose(fb.f,myflags); @@ -156,7 +163,7 @@ static my_bool init_available_charsets(myf myflags) */ if (!charset_initialized) { - CHARSET_INFO *cs; + CHARSET_INFO **cs; /* To make things thread safe we are not allowing other threads to interfere while we may changing the cs_info_table @@ -164,13 +171,13 @@ static my_bool init_available_charsets(myf myflags) pthread_mutex_lock(&THR_LOCK_charset); bzero(&all_charsets,sizeof(all_charsets)); + init_compiled_charsets(myflags); /* Copy compiled charsets */ - - for (cs=compiled_charsets; cs->name; cs++) + for (cs=all_charsets; cs < all_charsets+255 ; cs++) { - all_charsets[cs->number]=cs[0]; - set_max_sort_char(&all_charsets[cs->number]); + if (*cs) + set_max_sort_char(*cs); } error = read_charset_index(myflags); charset_initialized=1; @@ -339,19 +346,16 @@ static my_bool read_charset_file(const char *cs_name, CHARSET_INFO *set, } -static CHARSET_INFO *add_charset(uint cs_number, myf flags) +static CHARSET_INFO *add_charset(CHARSET_INFO *cs, myf flags) { - CHARSET_INFO *cs; uchar tmp_ctype[CTYPE_TABLE_SIZE]; uchar tmp_to_lower[TO_LOWER_TABLE_SIZE]; uchar tmp_to_upper[TO_UPPER_TABLE_SIZE]; uchar tmp_sort_order[SORT_ORDER_TABLE_SIZE]; uint16 tmp_to_uni[TO_UNI_TABLE_SIZE]; - /* Note: cs->name is already initialized */ + /* Note: cs->name and cs->number are already initialized */ - cs=&all_charsets[cs_number]; - cs->ctype=tmp_ctype; cs->to_lower=tmp_to_lower; cs->to_upper=tmp_to_upper; @@ -365,7 +369,6 @@ static CHARSET_INFO *add_charset(uint cs_number, myf flags) cs->to_upper = (uchar*) my_once_alloc(TO_UPPER_TABLE_SIZE, MYF(MY_WME)); cs->sort_order=(uchar*) my_once_alloc(SORT_ORDER_TABLE_SIZE, MYF(MY_WME)); cs->tab_to_uni=(uint16*)my_once_alloc(TO_UNI_TABLE_SIZE*sizeof(uint16), MYF(MY_WME)); - cs->number = cs_number; memcpy((char*) cs->ctype, (char*) tmp_ctype, sizeof(tmp_ctype)); memcpy((char*) cs->to_lower, (char*) tmp_to_lower, sizeof(tmp_to_lower)); memcpy((char*) cs->to_upper, (char*) tmp_to_upper, sizeof(tmp_to_upper)); @@ -393,13 +396,13 @@ static CHARSET_INFO *add_charset(uint cs_number, myf flags) uint get_charset_number(const char *charset_name) { - CHARSET_INFO *cs; + CHARSET_INFO **cs; if (init_available_charsets(MYF(0))) /* If it isn't initialized */ return 0; for (cs = all_charsets; cs < all_charsets+255; ++cs) - if ( cs->name && !strcmp(cs->name, charset_name)) - return cs->number; + if ( cs[0] && cs[0]->name && !strcmp(cs[0]->name, charset_name)) + return cs[0]->number; return 0; /* this mimics find_type() */ } @@ -411,8 +414,8 @@ const char *get_charset_name(uint charset_number) if (init_available_charsets(MYF(0))) /* If it isn't initialized */ return "?"; - cs=&all_charsets[charset_number]; - if ( (cs->number==charset_number) && cs->name ) + cs=all_charsets[charset_number]; + if ( cs && (cs->number==charset_number) && cs->name ) return (char*) cs->name; return (char*) "?"; /* this mimics find_type() */ @@ -428,9 +431,9 @@ static CHARSET_INFO *get_internal_charset(uint cs_number, myf flags) */ pthread_mutex_lock(&THR_LOCK_charset); - cs = &all_charsets[cs_number]; - if (!(cs->state & (MY_CS_COMPILED | MY_CS_LOADED))) - cs=add_charset(cs_number, flags); + cs = all_charsets[cs_number]; + if (cs && !(cs->state & (MY_CS_COMPILED | MY_CS_LOADED))) + cs=add_charset(cs, flags); pthread_mutex_unlock(&THR_LOCK_charset); return cs; @@ -552,38 +555,41 @@ char * list_charsets(myf want_flags) if (want_flags & MY_CS_COMPILED) { - CHARSET_INFO *cs; - for (cs = compiled_charsets; cs->number > 0; cs++) + CHARSET_INFO **cs; + for (cs = all_charsets; cs < all_charsets+255; cs++) { - dynstr_append(&s, cs->name); - dynstr_append(&s, " "); + if (cs[0]) + { + dynstr_append(&s, cs[0]->name); + dynstr_append(&s, " "); + } } } if (want_flags & MY_CS_CONFIG) { - CHARSET_INFO *cs; + CHARSET_INFO **cs; char buf[FN_REFLEN]; MY_STAT status; for (cs=all_charsets; cs < all_charsets+255; cs++) { - if (!cs->name || charset_in_string(cs->name, &s)) + if (!cs[0] || !cs[0]->name || charset_in_string(cs[0]->name, &s)) continue; - get_charset_conf_name(cs->name, buf); + get_charset_conf_name(cs[0]->name, buf); if (!my_stat(buf, &status, MYF(0))) continue; /* conf file doesn't exist */ - dynstr_append(&s, cs->name); + dynstr_append(&s, cs[0]->name); dynstr_append(&s, " "); } } if (want_flags & (MY_CS_INDEX|MY_CS_LOADED)) { - CHARSET_INFO *cs; + CHARSET_INFO **cs; for (cs = all_charsets; cs < all_charsets + 255; cs++) - if (cs->name && (cs->state & want_flags) ) - charset_append(&s, cs->name); + if (cs[0] && cs[0]->name && (cs[0]->state & want_flags) ) + charset_append(&s, cs[0]->name); } if (s.length) diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 827067c27d7..214cd321562 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1403,7 +1403,7 @@ int mysqld_show_charsets(THD *thd, const char *wild) String packet2(buff,sizeof(buff),default_charset_info); List field_list; CONVERT *convert=thd->variables.convert_set; - CHARSET_INFO *cs; + CHARSET_INFO **cs; DBUG_ENTER("mysqld_show_charsets"); field_list.push_back(new Item_empty_string("Name",30)); @@ -1416,16 +1416,16 @@ int mysqld_show_charsets(THD *thd, const char *wild) for (cs=all_charsets ; cs < all_charsets+255 ; cs++ ) { - if (!cs->name) + if (!cs[0]) continue; if (!(wild && wild[0] && - wild_case_compare(system_charset_info,cs->name,wild))) + wild_case_compare(system_charset_info,cs[0]->name,wild))) { packet2.length(0); - net_store_data(&packet2,convert,cs->name); - net_store_data(&packet2,(uint32) cs->number); - net_store_data(&packet2,(uint32) cs->strxfrm_multiply); - net_store_data(&packet2,(uint32) cs->mbmaxlen ? cs->mbmaxlen : 1); + net_store_data(&packet2,convert,cs[0]->name); + net_store_data(&packet2,(uint32) cs[0]->number); + net_store_data(&packet2,(uint32) cs[0]->strxfrm_multiply); + net_store_data(&packet2,(uint32) cs[0]->mbmaxlen ? cs[0]->mbmaxlen : 1); if (my_net_write(&thd->net, (char*) packet2.ptr(),packet2.length())) goto err; diff --git a/strings/ctype-big5.c b/strings/ctype-big5.c index 36a2641d2ab..f83cf0cffeb 100644 --- a/strings/ctype-big5.c +++ b/strings/ctype-big5.c @@ -48,7 +48,7 @@ #define big5head(e) ((uchar)(e>>8)) #define big5tail(e) ((uchar)(e&0xff)) -uchar NEAR ctype_big5[257] = +static uchar NEAR ctype_big5[257] = { 0, /* For standard library */ 32,32,32,32,32,32,32,32,32,40,40,40,40,40,32,32, @@ -69,7 +69,7 @@ uchar NEAR ctype_big5[257] = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; -uchar NEAR to_lower_big5[]= +static uchar NEAR to_lower_big5[]= { '\000','\001','\002','\003','\004','\005','\006','\007', '\010','\011','\012','\013','\014','\015','\016','\017', @@ -105,7 +105,7 @@ uchar NEAR to_lower_big5[]= (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', }; -uchar NEAR to_upper_big5[]= +static uchar NEAR to_upper_big5[]= { '\000','\001','\002','\003','\004','\005','\006','\007', '\010','\011','\012','\013','\014','\015','\016','\017', @@ -141,7 +141,7 @@ uchar NEAR to_upper_big5[]= (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', }; -uchar NEAR sort_order_big5[]= +static uchar NEAR sort_order_big5[]= { '\000','\001','\002','\003','\004','\005','\006','\007', '\010','\011','\012','\013','\014','\015','\016','\017', @@ -218,7 +218,7 @@ static uint16 big5strokexfrm(uint16 i) return 0xA140; } -int my_strnncoll_big5(CHARSET_INFO *cs __attribute__((unused)), +static int my_strnncoll_big5(CHARSET_INFO *cs __attribute__((unused)), const uchar * s1, uint len1, const uchar * s2, uint len2) { @@ -242,7 +242,7 @@ int my_strnncoll_big5(CHARSET_INFO *cs __attribute__((unused)), return (int) (len1-len2); } -int my_strnxfrm_big5(CHARSET_INFO *cs __attribute__((unused)), +static int my_strnxfrm_big5(CHARSET_INFO *cs __attribute__((unused)), uchar * dest, uint len, const uchar * src, uint srclen) { @@ -264,7 +264,8 @@ int my_strnxfrm_big5(CHARSET_INFO *cs __attribute__((unused)), return srclen; } -int my_strcoll_big5(const uchar * s1, const uchar * s2) +#if 0 +static int my_strcoll_big5(const uchar * s1, const uchar * s2) { while (*s1 && *s2) @@ -283,7 +284,7 @@ int my_strcoll_big5(const uchar * s1, const uchar * s2) return 0; } -int my_strxfrm_big5(uchar * dest, const uchar * src, int len) +static int my_strxfrm_big5(uchar * dest, const uchar * src, int len) { uint16 e; uchar *d = dest; @@ -309,6 +310,8 @@ int my_strxfrm_big5(uchar * dest, const uchar * src, int len) *d = '\0'; return (int) (d-dest); } +#endif + /* ** Calculate min_str and max_str that ranges a LIKE string. @@ -331,7 +334,7 @@ int my_strxfrm_big5(uchar * dest, const uchar * src, int len) #define wild_one '_' #define wild_many '%' -my_bool my_like_range_big5(CHARSET_INFO *cs __attribute__((unused)), +static my_bool my_like_range_big5(CHARSET_INFO *cs __attribute__((unused)), const char *ptr,uint ptr_length,pchar escape, uint res_length, char *min_str,char *max_str, uint *min_length,uint *max_length) @@ -381,18 +384,18 @@ my_bool my_like_range_big5(CHARSET_INFO *cs __attribute__((unused)), return 0; } -int ismbchar_big5(CHARSET_INFO *cs __attribute__((unused)), +static int ismbchar_big5(CHARSET_INFO *cs __attribute__((unused)), const char* p, const char *e) { return (isbig5head(*(p)) && (e)-(p)>1 && isbig5tail(*((p)+1))? 2: 0); } -my_bool ismbhead_big5(CHARSET_INFO *cs __attribute__((unused)), uint c) +static my_bool ismbhead_big5(CHARSET_INFO *cs __attribute__((unused)), uint c) { return isbig5head(c); } -int mbcharlen_big5(CHARSET_INFO *cs __attribute__((unused)), uint c) +static int mbcharlen_big5(CHARSET_INFO *cs __attribute__((unused)), uint c) { return (isbig5head(c)? 2: 0); } @@ -6166,7 +6169,7 @@ static int func_uni_big5_onechar(int code){ } -int +static int my_wc_mb_big5(CHARSET_INFO *cs __attribute__((unused)), my_wc_t wc, unsigned char *s, unsigned char *e) { @@ -6191,7 +6194,7 @@ my_wc_mb_big5(CHARSET_INFO *cs __attribute__((unused)), return 2; } -int +static int my_mb_wc_big5(CHARSET_INFO *cs __attribute__((unused)), my_wc_t *pwc,const uchar *s,const uchar *e) { @@ -6213,5 +6216,39 @@ my_mb_wc_big5(CHARSET_INFO *cs __attribute__((unused)), return 2; } +CHARSET_INFO my_charset_big5 = +{ + 1, /* number */ + MY_CS_COMPILED, /* state */ + "big5", /* name */ + "", /* comment */ + ctype_big5, + to_lower_big5, + to_upper_big5, + sort_order_big5, + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + 1, /* strxfrm_multiply */ + my_strnncoll_big5, + my_strnxfrm_big5, + my_like_range_big5, + 2, /* mbmaxlen */ + ismbchar_big5, + ismbhead_big5, + mbcharlen_big5, + my_mb_wc_big5, /* mb_wc */ + my_wc_mb_big5, /* wc_mb */ + my_caseup_str_mb, + my_casedn_str_mb, + my_caseup_mb, + my_casedn_mb, + NULL, /* tosort */ + my_strcasecmp_mb, + my_strncasecmp_mb, + NULL, /* hash_caseup */ + NULL, /* hash_sort */ + 0 +}; + #endif diff --git a/strings/ctype-czech.c b/strings/ctype-czech.c index f3b7777a6d4..3060c29dbac 100644 --- a/strings/ctype-czech.c +++ b/strings/ctype-czech.c @@ -233,8 +233,9 @@ static struct wordvalue doubles[] = { #define IS_END(p, src, len) (!(*p)) +#if 0 /* Function strcoll, with Czech sorting, for zero terminated strings */ -int my_strcoll_czech(const uchar * s1, const uchar * s2) +static int my_strcoll_czech(const uchar * s1, const uchar * s2) { int v1, v2; const uchar * p1, * p2, * store1, * store2; @@ -254,9 +255,11 @@ int my_strcoll_czech(const uchar * s1, const uchar * s2) while (v1); return 0; } +#endif +#if 0 /* Function strxfrm, with Czech sorting, for zero terminated strings */ -int my_strxfrm_czech(uchar * dest, const uchar * src, int len) +static int my_strxfrm_czech(uchar * dest, const uchar * src, int len) { int value; const uchar * p, * store; @@ -272,17 +275,16 @@ int my_strxfrm_czech(uchar * dest, const uchar * src, int len) while (value); return totlen; } - -#undef IS_END - +#endif +#undef IS_END #define IS_END(p, src, len) (((char *)p - (char *)src) >= (len)) /* Function strnncoll, actually strcoll, with Czech sorting, which expect the length of the strings being specified */ -int my_strnncoll_czech(CHARSET_INFO *cs __attribute__((unused)), +static int my_strnncoll_czech(CHARSET_INFO *cs __attribute__((unused)), const uchar * s1, uint len1, const uchar * s2, uint len2) { @@ -308,7 +310,7 @@ int my_strnncoll_czech(CHARSET_INFO *cs __attribute__((unused)), /* Function strnxfrm, actually strxfrm, with Czech sorting, which expect the length of the strings being specified */ -int my_strnxfrm_czech(CHARSET_INFO *cs __attribute__((unused)), +static int my_strnxfrm_czech(CHARSET_INFO *cs __attribute__((unused)), uchar * dest, uint len, const uchar * src, uint srclen) { @@ -378,7 +380,7 @@ int my_strnxfrm_czech(CHARSET_INFO *cs __attribute__((unused)), #define EXAMPLE -my_bool my_like_range_czech(CHARSET_INFO *cs __attribute__((unused)), +static my_bool my_like_range_czech(CHARSET_INFO *cs __attribute__((unused)), const char *ptr,uint ptr_length,pchar escape, uint res_length, char *min_str,char *max_str, uint *min_length,uint *max_length) @@ -437,7 +439,7 @@ my_bool my_like_range_czech(CHARSET_INFO *cs __attribute__((unused)), #include #include "m_string.h" -uchar NEAR ctype_czech[257] = { +static uchar NEAR ctype_czech[257] = { 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, @@ -457,7 +459,7 @@ uchar NEAR ctype_czech[257] = { 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, 2, 2, 16, }; -uchar NEAR to_lower_czech[] = { +static uchar NEAR to_lower_czech[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, @@ -476,7 +478,7 @@ uchar NEAR to_lower_czech[] = { 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255, }; -uchar NEAR to_upper_czech[] = { +static uchar NEAR to_upper_czech[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, @@ -495,7 +497,7 @@ uchar NEAR to_upper_czech[] = { 240,209,210,211,212,213,214,247,216,217,218,219,220,221,222,255, }; -uchar NEAR sort_order_czech[] = { +static uchar NEAR sort_order_czech[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, @@ -514,6 +516,118 @@ uchar NEAR sort_order_czech[] = { 255, 98, 99,101,102,103,104,255,109,119,118,120,121,126,116,255, }; +static uint16 tab_8859_2_uni[256]={ + 0,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, +0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, +0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, +0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, +0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, +0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, +0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, +0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, +0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, +0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, +0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, +0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, +0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, +0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, +0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, +0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x00A0,0x0104,0x02D8,0x0141,0x00A4,0x013D,0x015A,0x00A7, +0x00A8,0x0160,0x015E,0x0164,0x0179,0x00AD,0x017D,0x017B, +0x00B0,0x0105,0x02DB,0x0142,0x00B4,0x013E,0x015B,0x02C7, +0x00B8,0x0161,0x015F,0x0165,0x017A,0x02DD,0x017E,0x017C, +0x0154,0x00C1,0x00C2,0x0102,0x00C4,0x0139,0x0106,0x00C7, +0x010C,0x00C9,0x0118,0x00CB,0x011A,0x00CD,0x00CE,0x010E, +0x0110,0x0143,0x0147,0x00D3,0x00D4,0x0150,0x00D6,0x00D7, +0x0158,0x016E,0x00DA,0x0170,0x00DC,0x00DD,0x0162,0x00DF, +0x0155,0x00E1,0x00E2,0x0103,0x00E4,0x013A,0x0107,0x00E7, +0x010D,0x00E9,0x0119,0x00EB,0x011B,0x00ED,0x00EE,0x010F, +0x0111,0x0144,0x0148,0x00F3,0x00F4,0x0151,0x00F6,0x00F7, +0x0159,0x016F,0x00FA,0x0171,0x00FC,0x00FD,0x0163,0x02D9 +}; + + +/* 0000-00FD , 254 chars */ +static uchar tab_uni_8859_2_plane00[]={ +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, +0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, +0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, +0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, +0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, +0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, +0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0xA0,0x00,0x00,0x00,0xA4,0x00,0x00,0xA7,0xA8,0x00,0x00,0x00,0x00,0xAD,0x00,0x00, +0xB0,0x00,0x00,0x00,0xB4,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0xC1,0xC2,0x00,0xC4,0x00,0x00,0xC7,0x00,0xC9,0x00,0xCB,0x00,0xCD,0xCE,0x00, +0x00,0x00,0x00,0xD3,0xD4,0x00,0xD6,0xD7,0x00,0x00,0xDA,0x00,0xDC,0xDD,0x00,0xDF, +0x00,0xE1,0xE2,0x00,0xE4,0x00,0x00,0xE7,0x00,0xE9,0x00,0xEB,0x00,0xED,0xEE,0x00, +0x00,0x00,0x00,0xF3,0xF4,0x00,0xF6,0xF7,0x00,0x00,0xFA,0x00,0xFC,0xFD}; + +/* 0102-017E , 125 chars */ +static uchar tab_uni_8859_2_plane01[]={ +0xC3,0xE3,0xA1,0xB1,0xC6,0xE6,0x00,0x00,0x00,0x00,0xC8,0xE8,0xCF,0xEF,0xD0,0xF0, +0x00,0x00,0x00,0x00,0x00,0x00,0xCA,0xEA,0xCC,0xEC,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC5,0xE5,0x00,0x00,0xA5,0xB5,0x00,0x00,0xA3, +0xB3,0xD1,0xF1,0x00,0x00,0xD2,0xF2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD5,0xF5, +0x00,0x00,0xC0,0xE0,0x00,0x00,0xD8,0xF8,0xA6,0xB6,0x00,0x00,0xAA,0xBA,0xA9,0xB9, +0xDE,0xFE,0xAB,0xBB,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD9,0xF9,0xDB,0xFB, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAC,0xBC,0xAF,0xBF,0xAE,0xBE}; + +/* 02C7-02DD , 23 chars */ +static uchar tab_uni_8859_2_plane02[]={ +0xB7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0xA2,0xFF,0x00,0xB2,0x00,0xBD}; + +static MY_UNI_IDX idx_uni_8859_2[]={ + {0x0000,0x00FD,tab_uni_8859_2_plane00}, + {0x0102,0x017E,tab_uni_8859_2_plane01}, + {0x02C7,0x02DD,tab_uni_8859_2_plane02}, + {0,0,NULL} +}; + +CHARSET_INFO my_charset_czech = +{ + 2, /* number */ + MY_CS_COMPILED, /* state */ + "czech", /* name */ + "", /* comment */ + ctype_czech, + to_lower_czech, + to_upper_czech, + sort_order_czech, + tab_8859_2_uni, /* tab_to_uni */ + idx_uni_8859_2, /* tab_from_uni */ + 4, /* strxfrm_multiply */ + my_strnncoll_czech, + my_strnxfrm_czech, + my_like_range_czech, + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + NULL, /* tosort */ + my_strcasecmp_8bit, + my_strncasecmp_8bit, + NULL, /* hash_caseup */ + NULL, /* hash_sort */ + 0 +}; + #endif #endif diff --git a/strings/ctype-euc_kr.c b/strings/ctype-euc_kr.c index 736a06f8139..5f5129921b9 100644 --- a/strings/ctype-euc_kr.c +++ b/strings/ctype-euc_kr.c @@ -33,7 +33,7 @@ #ifdef HAVE_CHARSET_euc_kr -uchar NEAR ctype_euc_kr[257] = +static uchar NEAR ctype_euc_kr[257] = { 0, /* For standard library */ 0040, 0040, 0040, 0040, 0040, 0040, 0040, 0040, /* NUL ^A - ^G */ @@ -70,7 +70,7 @@ uchar NEAR ctype_euc_kr[257] = 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0000, }; -uchar NEAR to_lower_euc_kr[]= +static uchar NEAR to_lower_euc_kr[]= { '\000','\001','\002','\003','\004','\005','\006','\007', '\010','\011','\012','\013','\014','\015','\016','\017', @@ -106,7 +106,7 @@ uchar NEAR to_lower_euc_kr[]= (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', }; -uchar NEAR to_upper_euc_kr[]= +static uchar NEAR to_upper_euc_kr[]= { '\000','\001','\002','\003','\004','\005','\006','\007', '\010','\011','\012','\013','\014','\015','\016','\017', @@ -142,7 +142,7 @@ uchar NEAR to_upper_euc_kr[]= (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', }; -uchar NEAR sort_order_euc_kr[]= +static uchar NEAR sort_order_euc_kr[]= { '\000','\001','\002','\003','\004','\005','\006','\007', '\010','\011','\012','\013','\014','\015','\016','\017', @@ -183,7 +183,7 @@ uchar NEAR sort_order_euc_kr[]= #define iseuc_kr(c) ((0xa1<=(uchar)(c) && (uchar)(c)<=0xfe)) -int ismbchar_euc_kr(CHARSET_INFO *cs __attribute__((unused)), +static int ismbchar_euc_kr(CHARSET_INFO *cs __attribute__((unused)), const char* p, const char *e) { return ((*(uchar*)(p)<0x80)? 0:\ @@ -191,12 +191,12 @@ int ismbchar_euc_kr(CHARSET_INFO *cs __attribute__((unused)), 0); } -my_bool ismbhead_euc_kr(CHARSET_INFO *cs __attribute__((unused)),uint c) +static my_bool ismbhead_euc_kr(CHARSET_INFO *cs __attribute__((unused)),uint c) { return (iseuc_kr(c)); } -int mbcharlen_euc_kr(CHARSET_INFO *cs __attribute__((unused)),uint c) +static int mbcharlen_euc_kr(CHARSET_INFO *cs __attribute__((unused)),uint c) { return (iseuc_kr(c) ? 2 : 0); } @@ -8587,7 +8587,7 @@ static int func_uni_ksc5601_onechar(int code){ } -int +static int my_wc_mb_euc_kr(CHARSET_INFO *cs __attribute__((unused)), my_wc_t wc, uchar *s, uchar *e) { @@ -8611,7 +8611,7 @@ my_wc_mb_euc_kr(CHARSET_INFO *cs __attribute__((unused)), return 2; } -int +static int my_mb_wc_euc_kr(CHARSET_INFO *cs __attribute__((unused)), my_wc_t *pwc, const uchar *s, const uchar *e) { @@ -8633,5 +8633,38 @@ my_mb_wc_euc_kr(CHARSET_INFO *cs __attribute__((unused)), return 2; } +CHARSET_INFO my_charset_euc_kr = +{ + 19, /* number */ + MY_CS_COMPILED, /* state */ + "euc_kr", /* name */ + "", /* comment */ + ctype_euc_kr, + to_lower_euc_kr, + to_upper_euc_kr, + sort_order_euc_kr, + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + my_strnncoll_simple,/* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 2, /* mbmaxlen */ + ismbchar_euc_kr, + ismbhead_euc_kr, + mbcharlen_euc_kr, + my_mb_wc_euc_kr, /* mb_wc */ + my_wc_mb_euc_kr, /* wc_mb */ + my_caseup_str_mb, + my_casedn_str_mb, + my_caseup_mb, + my_casedn_mb, + my_tosort_8bit, + my_strcasecmp_mb, + my_strncasecmp_mb, + NULL, /* hash_caseup */ + NULL, /* hash_sort */ + 0 +}; #endif diff --git a/strings/ctype-gb2312.c b/strings/ctype-gb2312.c index 7da86915fbd..9823eceee5b 100644 --- a/strings/ctype-gb2312.c +++ b/strings/ctype-gb2312.c @@ -30,7 +30,7 @@ #ifdef HAVE_CHARSET_gb2312 -uchar NEAR ctype_gb2312[257] = +static uchar NEAR ctype_gb2312[257] = { 0, /* For standard library */ 32,32,32,32,32,32,32,32,32,40,40,40,40,40,32,32, @@ -51,7 +51,7 @@ uchar NEAR ctype_gb2312[257] = 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0, }; -uchar NEAR to_lower_gb2312[]= +static uchar NEAR to_lower_gb2312[]= { '\000','\001','\002','\003','\004','\005','\006','\007', '\010','\011','\012','\013','\014','\015','\016','\017', @@ -87,7 +87,7 @@ uchar NEAR to_lower_gb2312[]= (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', }; -uchar NEAR to_upper_gb2312[]= +static uchar NEAR to_upper_gb2312[]= { '\000','\001','\002','\003','\004','\005','\006','\007', '\010','\011','\012','\013','\014','\015','\016','\017', @@ -123,7 +123,7 @@ uchar NEAR to_upper_gb2312[]= (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', }; -uchar NEAR sort_order_gb2312[]= +static uchar NEAR sort_order_gb2312[]= { '\000','\001','\002','\003','\004','\005','\006','\007', '\010','\011','\012','\013','\014','\015','\016','\017', @@ -166,18 +166,18 @@ uchar NEAR sort_order_gb2312[]= #define isgb2312tail(c) (0xa1<=(uchar)(c) && (uchar)(c)<=0xfe) -int ismbchar_gb2312(CHARSET_INFO *cs __attribute__((unused)), +static int ismbchar_gb2312(CHARSET_INFO *cs __attribute__((unused)), const char* p, const char *e) { return (isgb2312head(*(p)) && (e)-(p)>1 && isgb2312tail(*((p)+1))? 2: 0); } -my_bool ismbhead_gb2312(CHARSET_INFO *cs __attribute__((unused)),uint c) +static my_bool ismbhead_gb2312(CHARSET_INFO *cs __attribute__((unused)),uint c) { return isgb2312head(c); } -int mbcharlen_gb2312(CHARSET_INFO *cs __attribute__((unused)),uint c) +static int mbcharlen_gb2312(CHARSET_INFO *cs __attribute__((unused)),uint c) { return (isgb2312head(c)? 2:0); } @@ -5637,7 +5637,7 @@ static int func_uni_gb2312_onechar(int code){ } -int +static int my_wc_mb_gb2312(CHARSET_INFO *cs __attribute__((unused)), my_wc_t wc, uchar *s, uchar *e) { @@ -5661,7 +5661,7 @@ my_wc_mb_gb2312(CHARSET_INFO *cs __attribute__((unused)), return 2; } -int +static int my_mb_wc_gb2312(CHARSET_INFO *cs __attribute__((unused)), my_wc_t *pwc, const uchar *s, const uchar *e){ int hi; @@ -5683,5 +5683,38 @@ my_mb_wc_gb2312(CHARSET_INFO *cs __attribute__((unused)), return 2; } +CHARSET_INFO my_charset_gb2312 = +{ + 24, /* number */ + MY_CS_COMPILED, /* state */ + "gb2312", /* name */ + "", /* comment */ + ctype_gb2312, + to_lower_gb2312, + to_upper_gb2312, + sort_order_gb2312, + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + my_strnncoll_simple,/* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 2, /* mbmaxlen */ + ismbchar_gb2312, + ismbhead_gb2312, + mbcharlen_gb2312, + my_mb_wc_gb2312, /* mb_wc */ + my_wc_mb_gb2312, /* wc_mb */ + my_caseup_str_mb, + my_casedn_str_mb, + my_caseup_mb, + my_casedn_mb, + my_tosort_8bit, + my_strcasecmp_mb, + my_strncasecmp_mb, + NULL, /* hash_caseup */ + NULL, /* hash_sort */ + 0 +}; #endif diff --git a/strings/ctype-gbk.c b/strings/ctype-gbk.c index 79e74b5f434..fd70dac2123 100644 --- a/strings/ctype-gbk.c +++ b/strings/ctype-gbk.c @@ -45,7 +45,7 @@ #define gbkhead(e) ((uchar)(e>>8)) #define gbktail(e) ((uchar)(e&0xff)) -uchar NEAR ctype_gbk[257] = +static uchar NEAR ctype_gbk[257] = { 0, /* For standard library */ 32,32,32,32,32,32,32,32,32,40,40,40,40,40,32,32, @@ -66,7 +66,7 @@ uchar NEAR ctype_gbk[257] = 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0, }; -uchar NEAR to_lower_gbk[]= +static uchar NEAR to_lower_gbk[]= { '\000','\001','\002','\003','\004','\005','\006','\007', '\010','\011','\012','\013','\014','\015','\016','\017', @@ -102,7 +102,7 @@ uchar NEAR to_lower_gbk[]= (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', }; -uchar NEAR to_upper_gbk[]= +static uchar NEAR to_upper_gbk[]= { '\000','\001','\002','\003','\004','\005','\006','\007', '\010','\011','\012','\013','\014','\015','\016','\017', @@ -138,7 +138,7 @@ uchar NEAR to_upper_gbk[]= (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', }; -uchar NEAR sort_order_gbk[]= +static uchar NEAR sort_order_gbk[]= { '\000','\001','\002','\003','\004','\005','\006','\007', '\010','\011','\012','\013','\014','\015','\016','\017', @@ -9824,7 +9824,7 @@ static int func_uni_gbk_onechar(int code){ return(0); } -int +static int my_wc_mb_gbk(CHARSET_INFO *cs __attribute__((unused)), my_wc_t wc, uchar *s, uchar *e) { @@ -9847,7 +9847,7 @@ my_wc_mb_gbk(CHARSET_INFO *cs __attribute__((unused)), return 2; } -int +static int my_mb_wc_gbk(CHARSET_INFO *cs __attribute__((unused)), my_wc_t *pwc, const uchar *s, const uchar *e) { @@ -9871,4 +9871,39 @@ my_mb_wc_gbk(CHARSET_INFO *cs __attribute__((unused)), } +CHARSET_INFO my_charset_gbk = +{ + 28, /* number */ + MY_CS_COMPILED, /* state */ + "gbk", /* name */ + "", /* comment */ + ctype_gbk, + to_lower_gbk, + to_upper_gbk, + sort_order_gbk, + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + 1, /* strxfrm_multiply */ + my_strnncoll_gbk, + my_strnxfrm_gbk, + my_like_range_gbk, + 2, /* mbmaxlen */ + ismbchar_gbk, + ismbhead_gbk, + mbcharlen_gbk, + my_mb_wc_gbk, /* mb_wc */ + my_wc_mb_gbk, /* wc_mb */ + my_caseup_str_mb, + my_casedn_str_mb, + my_caseup_mb, + my_casedn_mb, + NULL, /* tosort */ + my_strcasecmp_mb, + my_strncasecmp_mb, + NULL, /* hash_caseup */ + NULL, /* hash_sort */ + 0 +}; + + #endif diff --git a/strings/ctype-latin1_de.c b/strings/ctype-latin1_de.c index 80fb259dfc8..b34b091d679 100644 --- a/strings/ctype-latin1_de.c +++ b/strings/ctype-latin1_de.c @@ -38,7 +38,65 @@ #ifdef HAVE_CHARSET_latin1_de -uchar ctype_latin1_de[] = { +static uint16 tab_8859_1_uni[256]={ + 0,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, +0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, +0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, +0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, +0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, +0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, +0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, +0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, +0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, +0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, +0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, +0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, +0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, +0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, +0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, +0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +0x00A0,0x00A1,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7, +0x00A8,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF, +0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7, +0x00B8,0x00B9,0x00BA,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF, +0x00C0,0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x00C7, +0x00C8,0x00C9,0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF, +0x00D0,0x00D1,0x00D2,0x00D3,0x00D4,0x00D5,0x00D6,0x00D7, +0x00D8,0x00D9,0x00DA,0x00DB,0x00DC,0x00DD,0x00DE,0x00DF, +0x00E0,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6,0x00E7, +0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF, +0x00F0,0x00F1,0x00F2,0x00F3,0x00F4,0x00F5,0x00F6,0x00F7, +0x00F8,0x00F9,0x00FA,0x00FB,0x00FC,0x00FD,0x00FE,0x00FF +}; + +static uchar tab_uni_8859_1_plane00[]={ +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, +0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, +0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, +0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, +0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, +0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, +0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, +0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, +0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, +0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, +0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, +0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}; + +static MY_UNI_IDX idx_uni_8859_1[]={ + {0x0000,0x00FF,tab_uni_8859_1_plane00}, + {0,0,NULL} +}; + +static uchar ctype_latin1_de[] = { 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, @@ -58,7 +116,7 @@ uchar ctype_latin1_de[] = { 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, 2, 2, 2 }; -uchar to_lower_latin1_de[] = { +static uchar to_lower_latin1_de[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, @@ -77,7 +135,7 @@ uchar to_lower_latin1_de[] = { 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 }; -uchar to_upper_latin1_de[] = { +static uchar to_upper_latin1_de[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, @@ -104,7 +162,7 @@ uchar to_upper_latin1_de[] = { * Ü, ü, Ö, ö, Ä, ä */ -uchar sort_order_latin1_de[] = { +static uchar sort_order_latin1_de[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, @@ -164,7 +222,7 @@ uchar sort_order_latin1_de[] = { } -int my_strnncoll_latin1_de(CHARSET_INFO *cs __attribute__((unused)), +static int my_strnncoll_latin1_de(CHARSET_INFO *cs __attribute__((unused)), const uchar * s1, uint len1, const uchar * s2, uint len2) { @@ -238,7 +296,7 @@ int my_strnncoll_latin1_de(CHARSET_INFO *cs __attribute__((unused)), } -int my_strnxfrm_latin1_de(CHARSET_INFO *cs __attribute__((unused)), +static int my_strnxfrm_latin1_de(CHARSET_INFO *cs __attribute__((unused)), uchar * dest, uint len, const uchar * src, uint srclen) { @@ -303,7 +361,7 @@ int my_strnxfrm_latin1_de(CHARSET_INFO *cs __attribute__((unused)), #define wild_one '_' #define wild_many '%' -my_bool my_like_range_latin1_de(CHARSET_INFO *cs __attribute__((unused)), +static my_bool my_like_range_latin1_de(CHARSET_INFO *cs __attribute__((unused)), const char *ptr, uint ptr_length, pchar escape, uint res_length, char *min_str, char *max_str, @@ -353,4 +411,39 @@ my_bool my_like_range_latin1_de(CHARSET_INFO *cs __attribute__((unused)), return 0; } + +CHARSET_INFO my_charset_latin1_de = +{ + 31, /* number */ + MY_CS_COMPILED, /* state */ + "latin1_de", /* name */ + "", /* comment */ + ctype_latin1_de, + to_lower_latin1_de, + to_upper_latin1_de, + sort_order_latin1_de, + tab_8859_1_uni, /* tab_to_uni */ + idx_uni_8859_1, /* tab_from_uni */ + 2, /* strxfrm_multiply */ + my_strnncoll_latin1_de, + my_strnxfrm_latin1_de, + my_like_range_latin1_de, + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + NULL, /* tosort */ + my_strcasecmp_8bit, + my_strncasecmp_8bit, + NULL, /* hash_caseup */ + NULL, /* hash_sort */ + 0 +}; + #endif diff --git a/strings/ctype-sjis.c b/strings/ctype-sjis.c index e8c3890abc9..f61d3753536 100644 --- a/strings/ctype-sjis.c +++ b/strings/ctype-sjis.c @@ -32,7 +32,7 @@ * .configure. mbmaxlen_sjis=2 */ -uchar NEAR ctype_sjis[257] = +static uchar NEAR ctype_sjis[257] = { 0, /* For standard library */ 0040, 0040, 0040, 0040, 0040, 0040, 0040, 0040, /* NUL ^A - ^G */ @@ -69,7 +69,7 @@ uchar NEAR ctype_sjis[257] = 0020, 0020, 0020, 0020, 0020, 0000, 0000, 0000 }; -uchar NEAR to_lower_sjis[]= +static uchar NEAR to_lower_sjis[]= { '\000','\001','\002','\003','\004','\005','\006','\007', '\010','\011','\012','\013','\014','\015','\016','\017', @@ -105,7 +105,7 @@ uchar NEAR to_lower_sjis[]= (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377' }; -uchar NEAR to_upper_sjis[]= +static uchar NEAR to_upper_sjis[]= { '\000','\001','\002','\003','\004','\005','\006','\007', '\010','\011','\012','\013','\014','\015','\016','\017', @@ -141,7 +141,7 @@ uchar NEAR to_upper_sjis[]= (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377' }; -uchar NEAR sort_order_sjis[]= +static uchar NEAR sort_order_sjis[]= { '\000','\001','\002','\003','\004','\005','\006','\007', '\010','\011','\012','\013','\014','\015','\016','\017', @@ -183,18 +183,18 @@ uchar NEAR sort_order_sjis[]= (0x80<=(c) && (c)<=0xfc)) -int ismbchar_sjis(CHARSET_INFO *cs __attribute__((unused)), +static int ismbchar_sjis(CHARSET_INFO *cs __attribute__((unused)), const char* p, const char *e) { return (issjishead((uchar) *p) && (e-p)>1 && issjistail((uchar)p[1]) ? 2: 0); } -my_bool ismbhead_sjis(CHARSET_INFO *cs __attribute__((unused)),uint c) +static my_bool ismbhead_sjis(CHARSET_INFO *cs __attribute__((unused)),uint c) { return issjishead((uchar) c); } -int mbcharlen_sjis(CHARSET_INFO *cs __attribute__((unused)),uint c) +static int mbcharlen_sjis(CHARSET_INFO *cs __attribute__((unused)),uint c) { return (issjishead((uchar) c) ? 2: 0); } @@ -202,7 +202,7 @@ int mbcharlen_sjis(CHARSET_INFO *cs __attribute__((unused)),uint c) #define sjiscode(c,d) ((((uint) (uchar)(c)) << 8) | (uint) (uchar) (d)) -int my_strnncoll_sjis(CHARSET_INFO *cs __attribute__((unused)), +static int my_strnncoll_sjis(CHARSET_INFO *cs __attribute__((unused)), const uchar *s1, uint len1, const uchar *s2, uint len2) { @@ -227,7 +227,7 @@ int my_strnncoll_sjis(CHARSET_INFO *cs __attribute__((unused)), return len1 - len2; } -int my_strnxfrm_sjis(CHARSET_INFO *cs __attribute__((unused)), +static int my_strnxfrm_sjis(CHARSET_INFO *cs __attribute__((unused)), uchar *dest, uint len, const uchar *src, uint srclen) { @@ -266,7 +266,7 @@ int my_strnxfrm_sjis(CHARSET_INFO *cs __attribute__((unused)), #define wild_one '_' #define wild_many '%' -my_bool my_like_range_sjis(CHARSET_INFO *cs __attribute__((unused)), +static my_bool my_like_range_sjis(CHARSET_INFO *cs __attribute__((unused)), const char *ptr,uint ptr_length,pchar escape, uint res_length, char *min_str,char *max_str, uint *min_length,uint *max_length) @@ -4415,7 +4415,7 @@ static int func_uni_sjis_onechar(int code){ } -int +static int my_wc_mb_sjis(CHARSET_INFO *cs __attribute__((unused)), my_wc_t wc, uchar *s, uchar *e) { @@ -4438,7 +4438,7 @@ my_wc_mb_sjis(CHARSET_INFO *cs __attribute__((unused)), return 2; } -int +static int my_mb_wc_sjis(CHARSET_INFO *cs __attribute__((unused)), my_wc_t *pwc, const uchar *s, const uchar *e){ int hi=s[0]; @@ -4458,5 +4458,38 @@ my_mb_wc_sjis(CHARSET_INFO *cs __attribute__((unused)), return 2; } +CHARSET_INFO my_charset_sjis = +{ + 13, /* number */ + MY_CS_COMPILED, /* state */ + "sjis", /* name */ + "", /* comment */ + ctype_sjis, + to_lower_sjis, + to_upper_sjis, + sort_order_sjis, + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + 1, /* strxfrm_multiply */ + my_strnncoll_sjis, + my_strnxfrm_sjis, + my_like_range_sjis, + 2, /* mbmaxlen */ + ismbchar_sjis, + ismbhead_sjis, + mbcharlen_sjis, + my_mb_wc_sjis, /* mb_wc */ + my_wc_mb_sjis, /* wc_mb */ + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + NULL, /* tosort */ + my_strcasecmp_8bit, + my_strncasecmp_8bit, + NULL, /* hash_caseup */ + NULL, /* hash_sort */ + 0 +}; #endif diff --git a/strings/ctype-tis620.c b/strings/ctype-tis620.c index b4358a967ac..1a4be5b3f9a 100644 --- a/strings/ctype-tis620.c +++ b/strings/ctype-tis620.c @@ -685,4 +685,40 @@ void ThNormalize(uchar* ptr, uint field_length, const uchar* from, uint length) } } + +CHARSET_INFO my_charset_tis620 = +{ + 18, /* number */ + MY_CS_COMPILED, /* state */ + "tis620", /* name */ + "", /* comment */ + ctype_tis620, + to_lower_tis620, + to_upper_tis620, + sort_order_tis620, + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + 4, /* strxfrm_multiply */ + my_strnncoll_tis620, + my_strnxfrm_tis620, + my_like_range_tis620, + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + NULL, /* tosort */ + my_strcasecmp_8bit, + my_strncasecmp_8bit, + NULL, /* hash_caseup */ + NULL, /* hash_sort */ + 0 +}; + + #endif diff --git a/strings/ctype-ujis.c b/strings/ctype-ujis.c index d8de08fb117..086e3362f8b 100644 --- a/strings/ctype-ujis.c +++ b/strings/ctype-ujis.c @@ -32,7 +32,7 @@ #ifdef HAVE_CHARSET_ujis -uchar NEAR ctype_ujis[257] = +static uchar NEAR ctype_ujis[257] = { 0, /* For standard library */ 0040, 0040, 0040, 0040, 0040, 0040, 0040, 0040, /* NUL ^A - ^G */ @@ -69,7 +69,7 @@ uchar NEAR ctype_ujis[257] = 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0000, }; -uchar NEAR to_lower_ujis[]= +static uchar NEAR to_lower_ujis[]= { '\000','\001','\002','\003','\004','\005','\006','\007', '\010','\011','\012','\013','\014','\015','\016','\017', @@ -105,7 +105,7 @@ uchar NEAR to_lower_ujis[]= (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377' }; -uchar NEAR to_upper_ujis[]= +static uchar NEAR to_upper_ujis[]= { '\000','\001','\002','\003','\004','\005','\006','\007', '\010','\011','\012','\013','\014','\015','\016','\017', @@ -141,7 +141,7 @@ uchar NEAR to_upper_ujis[]= (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377' }; -uchar NEAR sort_order_ujis[]= +static uchar NEAR sort_order_ujis[]= { '\000','\001','\002','\003','\004','\005','\006','\007', '\010','\011','\012','\013','\014','\015','\016','\017', @@ -184,7 +184,7 @@ uchar NEAR sort_order_ujis[]= #define isujis_ss3(c) (((c)&0xff) == 0x8f) -int ismbchar_ujis(CHARSET_INFO *cs __attribute__((unused)), +static int ismbchar_ujis(CHARSET_INFO *cs __attribute__((unused)), const char* p, const char *e) { return ((*(uchar*)(p)<0x80)? 0:\ @@ -194,12 +194,12 @@ int ismbchar_ujis(CHARSET_INFO *cs __attribute__((unused)), 0); } -my_bool ismbhead_ujis(CHARSET_INFO *cs __attribute__((unused)),uint c) +static my_bool ismbhead_ujis(CHARSET_INFO *cs __attribute__((unused)),uint c) { return (isujis(c) || isujis_ss2(c) || isujis_ss3(c)); } -int mbcharlen_ujis(CHARSET_INFO *cs __attribute__((unused)),uint c) +static int mbcharlen_ujis(CHARSET_INFO *cs __attribute__((unused)),uint c) { return (isujis(c)? 2: isujis_ss2(c)? 2: isujis_ss3(c)? 3: 0); } @@ -8257,7 +8257,7 @@ my_jisx0212_uni_onechar(int code){ [xA1-xFE][xA1-xFE] # JIS X 0208:1997 (two bytes/char) */ -int +static int my_mb_wc_euc_jp(CHARSET_INFO *cs,my_wc_t *pwc, const uchar *s, const uchar *e) { int c1,c2,c3; @@ -8344,7 +8344,7 @@ my_mb_wc_euc_jp(CHARSET_INFO *cs,my_wc_t *pwc, const uchar *s, const uchar *e) return MY_CS_ILSEQ; } -int +static int my_wc_mb_euc_jp(CHARSET_INFO *c,my_wc_t wc, unsigned char *s, unsigned char *e) { unsigned char buf[2]; @@ -8427,5 +8427,39 @@ my_wc_mb_euc_jp(CHARSET_INFO *c,my_wc_t wc, unsigned char *s, unsigned char *e) return MY_CS_ILUNI; } +CHARSET_INFO my_charset_ujis = +{ + 12, /* number */ + MY_CS_COMPILED, /* state */ + "ujis", /* name */ + "", /* comment */ + ctype_ujis, + to_lower_ujis, + to_upper_ujis, + sort_order_ujis, + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + 0, /* strxfrm_multiply */ + NULL, /* strnncoll */ + NULL, /* strnxfrm */ + NULL, /* like_range */ + 3, /* mbmaxlen */ + ismbchar_ujis, + ismbhead_ujis, + mbcharlen_ujis, + my_mb_wc_euc_jp, /* mb_wc */ + my_wc_mb_euc_jp, /* wc_mb */ + my_caseup_str_mb, + my_casedn_str_mb, + my_caseup_mb, + my_casedn_mb, + my_tosort_8bit, + my_strcasecmp_mb, + my_strncasecmp_mb, + NULL, /* hash_caseup */ + NULL, /* hash_sort */ + 0 +}; + #endif diff --git a/strings/ctype-utf8.c b/strings/ctype-utf8.c index 1cce8819619..81671e28c3f 100644 --- a/strings/ctype-utf8.c +++ b/strings/ctype-utf8.c @@ -1516,7 +1516,7 @@ static MY_UNICASE_INFO *uni_plane[256]={ /* These arrays are taken from usa7 implementation */ -uchar ctype_utf8[] = { +static uchar ctype_utf8[] = { 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, @@ -1536,7 +1536,7 @@ uchar ctype_utf8[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -uchar to_lower_utf8[] = { +static uchar to_lower_utf8[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, @@ -1555,7 +1555,7 @@ uchar to_lower_utf8[] = { 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 }; -uchar to_upper_utf8[] = { +static uchar to_upper_utf8[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, @@ -1575,7 +1575,7 @@ uchar to_upper_utf8[] = { }; -int my_utf8_uni (CHARSET_INFO *cs __attribute__((unused)) , +static int my_utf8_uni (CHARSET_INFO *cs __attribute__((unused)) , my_wc_t * pwc, const uchar *s, const uchar *e) { unsigned char c = s[0]; @@ -1677,7 +1677,7 @@ int my_utf8_uni (CHARSET_INFO *cs __attribute__((unused)) , return MY_CS_ILSEQ; } -int my_uni_utf8 (CHARSET_INFO *cs __attribute__((unused)) , +static int my_uni_utf8 (CHARSET_INFO *cs __attribute__((unused)) , my_wc_t wc, uchar *r, uchar *e) { int count; @@ -1720,7 +1720,7 @@ int my_uni_utf8 (CHARSET_INFO *cs __attribute__((unused)) , } -void my_caseup_utf8(CHARSET_INFO *cs, char *s, uint slen) +static void my_caseup_utf8(CHARSET_INFO *cs, char *s, uint slen) { my_wc_t wc; int res; @@ -1736,7 +1736,7 @@ void my_caseup_utf8(CHARSET_INFO *cs, char *s, uint slen) } } -uint my_hash_caseup_utf8(CHARSET_INFO *cs, const byte *s, uint slen) +static uint my_hash_caseup_utf8(CHARSET_INFO *cs, const byte *s, uint slen) { my_wc_t wc; register uint nr=1, nr2=4; @@ -1759,7 +1759,7 @@ uint my_hash_caseup_utf8(CHARSET_INFO *cs, const byte *s, uint slen) } -void my_hash_sort_utf8(CHARSET_INFO *cs, const uchar *s, uint slen, ulong *n1, ulong *n2) +static void my_hash_sort_utf8(CHARSET_INFO *cs, const uchar *s, uint slen, ulong *n1, ulong *n2) { my_wc_t wc; int res; @@ -1778,13 +1778,13 @@ void my_hash_sort_utf8(CHARSET_INFO *cs, const uchar *s, uint slen, ulong *n1, u } -void my_caseup_str_utf8(CHARSET_INFO * cs, char * s) +static void my_caseup_str_utf8(CHARSET_INFO * cs, char * s) { my_caseup_utf8(cs, s, strlen(s)); } -void my_casedn_utf8(CHARSET_INFO *cs, char *s, uint slen) +static void my_casedn_utf8(CHARSET_INFO *cs, char *s, uint slen) { my_wc_t wc; int res; @@ -1802,13 +1802,13 @@ void my_casedn_utf8(CHARSET_INFO *cs, char *s, uint slen) } } -void my_casedn_str_utf8(CHARSET_INFO *cs, char * s) +static void my_casedn_str_utf8(CHARSET_INFO *cs, char * s) { my_casedn_utf8(cs, s, strlen(s)); } -int my_strnncoll_utf8(CHARSET_INFO *cs, +static int my_strnncoll_utf8(CHARSET_INFO *cs, const uchar *s, uint slen, const uchar *t, uint tlen) { int s_res,t_res; @@ -1843,7 +1843,7 @@ int my_strnncoll_utf8(CHARSET_INFO *cs, return ( (se-s) - (te-t) ); } -int my_strncasecmp_utf8(CHARSET_INFO *cs, +static int my_strncasecmp_utf8(CHARSET_INFO *cs, const char *s, const char *t, uint len) { int s_res,t_res; @@ -1879,7 +1879,7 @@ int my_strncasecmp_utf8(CHARSET_INFO *cs, return ( (se-s) - (te-t) ); } -int my_strcasecmp_utf8(CHARSET_INFO *cs, const char *s, const char *t) +static int my_strcasecmp_utf8(CHARSET_INFO *cs, const char *s, const char *t) { uint s_len=strlen(s); uint t_len=strlen(t); @@ -1887,8 +1887,9 @@ int my_strcasecmp_utf8(CHARSET_INFO *cs, const char *s, const char *t) return my_strncasecmp_utf8(cs, s, t, len); } -int my_strnxfrm_utf8(CHARSET_INFO *cs, - uchar *dst, uint dstlen, const uchar *src, uint srclen) +static int my_strnxfrm_utf8(CHARSET_INFO *cs, + uchar *dst, uint dstlen, + const uchar *src, uint srclen) { my_wc_t wc; int res; @@ -1918,19 +1919,19 @@ int my_strnxfrm_utf8(CHARSET_INFO *cs, return dst - dst_orig; } -int my_ismbchar_utf8(CHARSET_INFO *cs,const char *b, const char *e) +static int my_ismbchar_utf8(CHARSET_INFO *cs,const char *b, const char *e) { my_wc_t wc; int res=my_utf8_uni(cs,&wc, (const uchar*)b, (const uchar*)e); return (res>1) ? res : 0; } -my_bool my_ismbhead_utf8(CHARSET_INFO *cs __attribute__((unused)) , uint ch) +static my_bool my_ismbhead_utf8(CHARSET_INFO *cs __attribute__((unused)) , uint ch) { return ( ch >= 0xc2 ); } -int my_mbcharlen_utf8(CHARSET_INFO *cs __attribute__((unused)) , uint c) +static int my_mbcharlen_utf8(CHARSET_INFO *cs __attribute__((unused)) , uint c) { if (c < 0x80) return 1; @@ -1951,6 +1952,41 @@ int my_mbcharlen_utf8(CHARSET_INFO *cs __attribute__((unused)) , uint c) return 0; /* Illegal mb head */; } +CHARSET_INFO my_charset_utf8 = +{ + 33, /* number */ + MY_CS_COMPILED, /* state */ + "utf8", /* name */ + "", /* comment */ + ctype_utf8, /* ctype */ + to_lower_utf8, /* to_lower */ + to_upper_utf8, /* to_upper */ + to_upper_utf8, /* sort_order */ + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + 1, /* strxfrm_multiply */ + my_strnncoll_utf8, /* strnncoll */ + my_strnxfrm_utf8, /* strnxfrm */ + NULL, /* like_range */ + 3, /* mbmaxlen */ + my_ismbchar_utf8, /* ismbchar */ + my_ismbhead_utf8, /* ismbhead */ + my_mbcharlen_utf8, /* mbcharlen */ + my_utf8_uni, /* mb_wc */ + my_uni_utf8, /* wc_mb */ + my_caseup_str_utf8, + my_casedn_str_utf8, + my_caseup_utf8, + my_casedn_utf8, + NULL, /* tosort */ + my_strcasecmp_utf8, + my_strncasecmp_utf8, + my_hash_caseup_utf8,/* hash_caseup */ + my_hash_sort_utf8, /* hash_sort */ + 0 +}; + + #ifdef MY_TEST_UTF8 #include @@ -2009,7 +2045,7 @@ int main() #ifdef HAVE_CHARSET_ucs2 -uchar ctype_ucs2[] = { +static uchar ctype_ucs2[] = { 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, @@ -2029,7 +2065,7 @@ uchar ctype_ucs2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -uchar to_lower_ucs2[] = { +static uchar to_lower_ucs2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, @@ -2048,7 +2084,7 @@ uchar to_lower_ucs2[] = { 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 }; -uchar to_upper_ucs2[] = { +static uchar to_upper_ucs2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, @@ -2068,7 +2104,7 @@ uchar to_upper_ucs2[] = { }; -int my_ucs2_uni (CHARSET_INFO *cs __attribute__((unused)) , +static int my_ucs2_uni (CHARSET_INFO *cs __attribute__((unused)) , my_wc_t * pwc, const uchar *s, const uchar *e) { if (s+2 > e) /* Need 2 characters */ @@ -2078,7 +2114,7 @@ int my_ucs2_uni (CHARSET_INFO *cs __attribute__((unused)) , return 2; } -int my_uni_ucs2 (CHARSET_INFO *cs __attribute__((unused)) , +static int my_uni_ucs2 (CHARSET_INFO *cs __attribute__((unused)) , my_wc_t wc, uchar *r, uchar *e) { if ( r+2 > e ) @@ -2090,7 +2126,7 @@ int my_uni_ucs2 (CHARSET_INFO *cs __attribute__((unused)) , } -void my_caseup_ucs2(CHARSET_INFO *cs, char *s, uint slen) +static void my_caseup_ucs2(CHARSET_INFO *cs, char *s, uint slen) { my_wc_t wc; int res; @@ -2106,7 +2142,7 @@ void my_caseup_ucs2(CHARSET_INFO *cs, char *s, uint slen) } } -uint my_hash_caseup_ucs2(CHARSET_INFO *cs, const byte *s, uint slen) +static uint my_hash_caseup_ucs2(CHARSET_INFO *cs, const byte *s, uint slen) { my_wc_t wc; register uint nr=1, nr2=4; @@ -2129,7 +2165,7 @@ uint my_hash_caseup_ucs2(CHARSET_INFO *cs, const byte *s, uint slen) } -void my_hash_sort_ucs2(CHARSET_INFO *cs, const uchar *s, uint slen, ulong *n1, ulong *n2) +static void my_hash_sort_ucs2(CHARSET_INFO *cs, const uchar *s, uint slen, ulong *n1, ulong *n2) { my_wc_t wc; int res; @@ -2148,14 +2184,14 @@ void my_hash_sort_ucs2(CHARSET_INFO *cs, const uchar *s, uint slen, ulong *n1, u } -void my_caseup_str_ucs2(CHARSET_INFO * cs __attribute__((unused)), +static void my_caseup_str_ucs2(CHARSET_INFO * cs __attribute__((unused)), char * s __attribute__((unused))) { } -void my_casedn_ucs2(CHARSET_INFO *cs, char *s, uint slen) +static void my_casedn_ucs2(CHARSET_INFO *cs, char *s, uint slen) { my_wc_t wc; int res; @@ -2173,13 +2209,13 @@ void my_casedn_ucs2(CHARSET_INFO *cs, char *s, uint slen) } } -void my_casedn_str_ucs2(CHARSET_INFO *cs __attribute__((unused)), +static void my_casedn_str_ucs2(CHARSET_INFO *cs __attribute__((unused)), char * s __attribute__((unused))) { } -int my_strnncoll_ucs2(CHARSET_INFO *cs, +static int my_strnncoll_ucs2(CHARSET_INFO *cs, const uchar *s, uint slen, const uchar *t, uint tlen) { int s_res,t_res; @@ -2214,7 +2250,7 @@ int my_strnncoll_ucs2(CHARSET_INFO *cs, return ( (se-s) - (te-t) ); } -int my_strncasecmp_ucs2(CHARSET_INFO *cs, +static int my_strncasecmp_ucs2(CHARSET_INFO *cs, const char *s, const char *t, uint len) { int s_res,t_res; @@ -2250,7 +2286,7 @@ int my_strncasecmp_ucs2(CHARSET_INFO *cs, return ( (se-s) - (te-t) ); } -int my_strcasecmp_ucs2(CHARSET_INFO *cs, const char *s, const char *t) +static int my_strcasecmp_ucs2(CHARSET_INFO *cs, const char *s, const char *t) { uint s_len=strlen(s); uint t_len=strlen(t); @@ -2258,7 +2294,7 @@ int my_strcasecmp_ucs2(CHARSET_INFO *cs, const char *s, const char *t) return my_strncasecmp_ucs2(cs, s, t, len); } -int my_strnxfrm_ucs2(CHARSET_INFO *cs, +static int my_strnxfrm_ucs2(CHARSET_INFO *cs, uchar *dst, uint dstlen, const uchar *src, uint srclen) { my_wc_t wc; @@ -2289,23 +2325,59 @@ int my_strnxfrm_ucs2(CHARSET_INFO *cs, return dst - dst_orig; } -int my_ismbchar_ucs2(CHARSET_INFO *cs __attribute__((unused)), +static int my_ismbchar_ucs2(CHARSET_INFO *cs __attribute__((unused)), const char *b __attribute__((unused)), const char *e __attribute__((unused))) { return 2; } -my_bool my_ismbhead_ucs2(CHARSET_INFO *cs __attribute__((unused)) , +static my_bool my_ismbhead_ucs2(CHARSET_INFO *cs __attribute__((unused)) , uint ch __attribute__((unused))) { return 1; } -int my_mbcharlen_ucs2(CHARSET_INFO *cs __attribute__((unused)) , +static int my_mbcharlen_ucs2(CHARSET_INFO *cs __attribute__((unused)) , uint c __attribute__((unused))) { return 2; } + +CHARSET_INFO my_charset_ucs2 = +{ + 35, /* number */ + MY_CS_COMPILED, /* state */ + "ucs2", /* name */ + "", /* comment */ + ctype_ucs2, /* ctype */ + to_lower_ucs2, /* to_lower */ + to_upper_ucs2, /* to_upper */ + to_upper_ucs2, /* sort_order */ + NULL, /* tab_to_uni */ + NULL, /* tab_from_uni */ + 1, /* strxfrm_multiply */ + my_strnncoll_ucs2, /* strnncoll */ + my_strnxfrm_ucs2, /* strnxfrm */ + NULL, /* like_range */ + 2, /* mbmaxlen */ + my_ismbchar_ucs2, /* ismbchar */ + my_ismbhead_ucs2, /* ismbhead */ + my_mbcharlen_ucs2, /* mbcharlen */ + my_ucs2_uni, /* mb_wc */ + my_uni_ucs2, /* wc_mb */ + my_caseup_str_ucs2, + my_casedn_str_ucs2, + my_caseup_ucs2, + my_casedn_ucs2, + NULL, /* tosort */ + my_strcasecmp_ucs2, + my_strncasecmp_ucs2, + my_hash_caseup_ucs2,/* hash_caseup */ + my_hash_sort_ucs2, /* hash_sort */ + 0 +}; + + #endif diff --git a/strings/ctype-win1250ch.c b/strings/ctype-win1250ch.c index c8ea1bf1f9f..e738d7727bc 100644 --- a/strings/ctype-win1250ch.c +++ b/strings/ctype-win1250ch.c @@ -35,7 +35,106 @@ #include "m_string.h" #include "m_ctype.h" -uchar NEAR ctype_win1250ch[] = { +static uint16 tab_cp1250_uni[256]={ + 0,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, +0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, +0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, +0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, +0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, +0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, +0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, +0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, +0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, +0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, +0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, +0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, +0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, +0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, +0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, +0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, +0x20AC, 0,0x201A, 0,0x201E,0x2026,0x2020,0x2021, + 0,0x2030,0x0160,0x2039,0x015A,0x0164,0x017D,0x0179, + 0,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014, + 0,0x2122,0x0161,0x203A,0x015B,0x0165,0x017E,0x017A, +0x00A0,0x02C7,0x02D8,0x0141,0x00A4,0x0104,0x00A6,0x00A7, +0x00A8,0x00A9,0x015E,0x00AB,0x00AC,0x00AD,0x00AE,0x017B, +0x00B0,0x00B1,0x02DB,0x0142,0x00B4,0x00B5,0x00B6,0x00B7, +0x00B8,0x0105,0x015F,0x00BB,0x013D,0x02DD,0x013E,0x017C, +0x0154,0x00C1,0x00C2,0x0102,0x00C4,0x0139,0x0106,0x00C7, +0x010C,0x00C9,0x0118,0x00CB,0x011A,0x00CD,0x00CE,0x010E, +0x0110,0x0143,0x0147,0x00D3,0x00D4,0x0150,0x00D6,0x00D7, +0x0158,0x016E,0x00DA,0x0170,0x00DC,0x00DD,0x0162,0x00DF, +0x0155,0x00E1,0x00E2,0x0103,0x00E4,0x013A,0x0107,0x00E7, +0x010D,0x00E9,0x0119,0x00EB,0x011B,0x00ED,0x00EE,0x010F, +0x0111,0x0144,0x0148,0x00F3,0x00F4,0x0151,0x00F6,0x00F7, +0x0159,0x016F,0x00FA,0x0171,0x00FC,0x00FD,0x0163,0x02D9 +}; + + +/* 0000-00FD , 254 chars */ +static uchar tab_uni_cp1250_plane00[]={ +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, +0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, +0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, +0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, +0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, +0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, +0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0xA0,0x00,0x00,0x00,0xA4,0x00,0xA6,0xA7,0xA8,0xA9,0x00,0xAB,0xAC,0xAD,0xAE,0x00, +0xB0,0xB1,0x00,0x00,0xB4,0xB5,0xB6,0xB7,0xB8,0x00,0x00,0xBB,0x00,0x00,0x00,0x00, +0x00,0xC1,0xC2,0x00,0xC4,0x00,0x00,0xC7,0x00,0xC9,0x00,0xCB,0x00,0xCD,0xCE,0x00, +0x00,0x00,0x00,0xD3,0xD4,0x00,0xD6,0xD7,0x00,0x00,0xDA,0x00,0xDC,0xDD,0x00,0xDF, +0x00,0xE1,0xE2,0x00,0xE4,0x00,0x00,0xE7,0x00,0xE9,0x00,0xEB,0x00,0xED,0xEE,0x00, +0x00,0x00,0x00,0xF3,0xF4,0x00,0xF6,0xF7,0x00,0x00,0xFA,0x00,0xFC,0xFD}; + +/* 0102-017E , 125 chars */ +static uchar tab_uni_cp1250_plane01[]={ +0xC3,0xE3,0xA5,0xB9,0xC6,0xE6,0x00,0x00,0x00,0x00,0xC8,0xE8,0xCF,0xEF,0xD0,0xF0, +0x00,0x00,0x00,0x00,0x00,0x00,0xCA,0xEA,0xCC,0xEC,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC5,0xE5,0x00,0x00,0xBC,0xBE,0x00,0x00,0xA3, +0xB3,0xD1,0xF1,0x00,0x00,0xD2,0xF2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD5,0xF5, +0x00,0x00,0xC0,0xE0,0x00,0x00,0xD8,0xF8,0x8C,0x9C,0x00,0x00,0xAA,0xBA,0x8A,0x9A, +0xDE,0xFE,0x8D,0x9D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD9,0xF9,0xDB,0xFB, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8F,0x9F,0xAF,0xBF,0x8E,0x9E}; + +/* 2013-20AC , 154 chars */ +static uchar tab_uni_cp1250_plane20[]={ +0x96,0x97,0x00,0x00,0x00,0x91,0x92,0x82,0x00,0x93,0x94,0x84,0x00,0x86,0x87,0x95, +0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x9B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80}; + +/* 02C7-02DD , 23 chars */ +static uchar tab_uni_cp1250_plane02[]={ +0xA1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0xA2,0xFF,0x00,0xB2,0x00,0xBD}; + +/* 2122-2122 , 1 chars */ +static uchar tab_uni_cp1250_plane21[]={ +0x99}; + + +static MY_UNI_IDX idx_uni_cp1250[]={ + {0x0000,0x00FD,tab_uni_cp1250_plane00}, + {0x0102,0x017E,tab_uni_cp1250_plane01}, + {0x2013,0x20AC,tab_uni_cp1250_plane20}, + {0x02C7,0x02DD,tab_uni_cp1250_plane02}, + {0x2122,0x2122,tab_uni_cp1250_plane21}, + {0,0,NULL} +}; + + +static uchar NEAR ctype_win1250ch[] = { 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x28, 0x28, 0x28, 0x28, 0x20, 0x20, @@ -71,7 +170,7 @@ uchar NEAR ctype_win1250ch[] = { 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x10 }; -uchar NEAR to_lower_win1250ch[] = { +static uchar NEAR to_lower_win1250ch[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, @@ -106,7 +205,7 @@ uchar NEAR to_lower_win1250ch[] = { 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }; -uchar NEAR to_upper_win1250ch[] = { +static uchar NEAR to_upper_win1250ch[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, @@ -149,7 +248,7 @@ uchar NEAR to_upper_win1250ch[] = { #endif -uchar NEAR sort_order_win1250ch[] = { +static uchar NEAR sort_order_win1250ch[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, @@ -168,7 +267,7 @@ uchar NEAR sort_order_win1250ch[] = { 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 }; -uchar NEAR _sort_order_win1250ch1[] = { +static uchar NEAR _sort_order_win1250ch1[] = { 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, @@ -228,7 +327,7 @@ uchar NEAR _sort_order_win1250ch1[] = { 0xb8, 0xbd, 0xbd, 0xbd, 0xbd, 0xc1, 0xbc, 0xf5 }; -uchar NEAR _sort_order_win1250ch2[] = { +static uchar NEAR _sort_order_win1250ch2[] = { 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, @@ -334,7 +433,8 @@ static struct wordvalue doubles[] = { #define IS_END(p, src, len) (!(*p)) -int my_strcoll_win1250ch(const uchar * s1, const uchar * s2) { +#if UNUSED +static int my_strcoll_win1250ch(const uchar * s1, const uchar * s2) { int v1, v2; const uchar * p1, * p2; int pass1 = 0, pass2 = 0; @@ -350,9 +450,10 @@ int my_strcoll_win1250ch(const uchar * s1, const uchar * s2) { } while (v1); return 0; } +#endif #ifdef UNUSED -int my_strxfrm_win1250ch(uchar * dest, const uchar * src, int len) { +static int my_strxfrm_win1250ch(uchar * dest, const uchar * src, int len) { int value; const uchar * p; int pass = 0; @@ -373,7 +474,7 @@ int my_strxfrm_win1250ch(uchar * dest, const uchar * src, int len) { #define IS_END(p, src, len) (((char *)p - (char *)src) >= (len)) -int my_strnncoll_win1250ch(CHARSET_INFO *cs __attribute__((unused)), +static int my_strnncoll_win1250ch(CHARSET_INFO *cs __attribute__((unused)), const uchar * s1, uint len1, const uchar * s2, uint len2) { int v1, v2; @@ -392,7 +493,7 @@ int my_strnncoll_win1250ch(CHARSET_INFO *cs __attribute__((unused)), return 0; } -int my_strnxfrm_win1250ch(CHARSET_INFO * cs __attribute__((unused)), +static int my_strnxfrm_win1250ch(CHARSET_INFO * cs __attribute__((unused)), uchar * dest, uint len, const uchar * src, uint srclen) { int value; @@ -474,7 +575,7 @@ static uchar NEAR like_range_prefix_max_win1250ch[] = { ** optimized ! */ -my_bool my_like_range_win1250ch(CHARSET_INFO *cs __attribute__((unused)), +static my_bool my_like_range_win1250ch(CHARSET_INFO *cs __attribute__((unused)), const char *ptr, uint ptr_length, pchar escape, uint res_length, char *min_str, char *max_str, @@ -518,4 +619,40 @@ my_bool my_like_range_win1250ch(CHARSET_INFO *cs __attribute__((unused)), return 0; } + +CHARSET_INFO my_charset_win1250ch = +{ + 34, /* number */ + MY_CS_COMPILED, /* state */ + "win1250ch", /* name */ + "", /* comment */ + ctype_win1250ch, + to_lower_win1250ch, + to_upper_win1250ch, + sort_order_win1250ch, + tab_cp1250_uni, /* tab_to_uni */ + idx_uni_cp1250, /* tab_from_uni */ + 2, /* strxfrm_multiply */ + my_strnncoll_win1250ch, + my_strnxfrm_win1250ch, + my_like_range_win1250ch, + 0, /* mbmaxlen */ + NULL, /* ismbchar */ + NULL, /* ismbhead */ + NULL, /* mbcharlen */ + my_mb_wc_8bit, /* mb_wc */ + my_wc_mb_8bit, /* wc_mb */ + my_caseup_str_8bit, + my_casedn_str_8bit, + my_caseup_8bit, + my_casedn_8bit, + NULL, /* tosort */ + my_strcasecmp_8bit, + my_strncasecmp_8bit, + NULL, /* hash_caseup */ + NULL, /* hash_sort */ + 0 +}; + + #endif diff --git a/strings/ctype.c b/strings/ctype.c index 1abb7a5d2c8..91e20508558 100644 --- a/strings/ctype.c +++ b/strings/ctype.c @@ -83,7 +83,7 @@ static MY_UNI_IDX idx_uni_8859_1[]={ #endif #if defined(HAVE_CHARSET_latin2)||defined(HAVE_CHARSET_croat)||\ -defined(HAVE_CHARSET_hungarian)||defined(HAVE_CHARSET_czech) +defined(HAVE_CHARSET_hungarian) static uint16 tab_8859_2_uni[256]={ 0,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, @@ -2529,7 +2529,7 @@ static uchar sort_order_win1250[] = { }; #endif -#if defined(HAVE_CHARSET_win1250)||defined(HAVE_CHARSET_win1250ch) +#if defined(HAVE_CHARSET_win1250) static uint16 tab_cp1250_uni[256]={ 0,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, @@ -2801,7 +2801,7 @@ static uchar sort_order_win1251ukr[] = { -CHARSET_INFO compiled_charsets[] = { +static CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_latin1 { @@ -2838,40 +2838,6 @@ CHARSET_INFO compiled_charsets[] = { }, #endif -#ifdef HAVE_CHARSET_big5 - { - 1, /* number */ - MY_CS_COMPILED, /* state */ - "big5", /* name */ - "", /* comment */ - ctype_big5, - to_lower_big5, - to_upper_big5, - sort_order_big5, - NULL, /* tab_to_uni */ - NULL, /* tab_from_uni */ - 1, /* strxfrm_multiply */ - my_strnncoll_big5, - my_strnxfrm_big5, - my_like_range_big5, - 2, /* mbmaxlen */ - ismbchar_big5, - ismbhead_big5, - mbcharlen_big5, - my_mb_wc_big5, /* mb_wc */ - my_wc_mb_big5, /* wc_mb */ - my_caseup_str_mb, - my_casedn_str_mb, - my_caseup_mb, - my_casedn_mb, - NULL, /* tosort */ - my_strcasecmp_mb, - my_strncasecmp_mb, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ - 0 - }, -#endif #ifdef HAVE_CHARSET_cp1251 { @@ -2978,40 +2944,6 @@ CHARSET_INFO compiled_charsets[] = { }, #endif -#ifdef HAVE_CHARSET_czech - { - 2, /* number */ - MY_CS_COMPILED, /* state */ - "czech", /* name */ - "", /* comment */ - ctype_czech, - to_lower_czech, - to_upper_czech, - sort_order_czech, - tab_8859_2_uni, /* tab_to_uni */ - idx_uni_8859_2, /* tab_from_uni */ - 4, /* strxfrm_multiply */ - my_strnncoll_czech, - my_strnxfrm_czech, - my_like_range_czech, - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ - my_mb_wc_8bit, /* mb_wc */ - my_wc_mb_8bit, /* wc_mb */ - my_caseup_str_8bit, - my_casedn_str_8bit, - my_caseup_8bit, - my_casedn_8bit, - NULL, /* tosort */ - my_strcasecmp_8bit, - my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ - 0 - }, -#endif #ifdef HAVE_CHARSET_danish { @@ -3153,110 +3085,6 @@ CHARSET_INFO compiled_charsets[] = { }, #endif -#ifdef HAVE_CHARSET_euc_kr - { - 19, /* number */ - MY_CS_COMPILED, /* state */ - "euc_kr", /* name */ - "", /* comment */ - ctype_euc_kr, - to_lower_euc_kr, - to_upper_euc_kr, - sort_order_euc_kr, - NULL, /* tab_to_uni */ - NULL, /* tab_from_uni */ - 0, /* strxfrm_multiply */ - my_strnncoll_simple,/* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 2, /* mbmaxlen */ - ismbchar_euc_kr, - ismbhead_euc_kr, - mbcharlen_euc_kr, - my_mb_wc_euc_kr, /* mb_wc */ - my_wc_mb_euc_kr, /* wc_mb */ - my_caseup_str_mb, - my_casedn_str_mb, - my_caseup_mb, - my_casedn_mb, - my_tosort_8bit, - my_strcasecmp_mb, - my_strncasecmp_mb, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ - 0 - }, -#endif - -#ifdef HAVE_CHARSET_gb2312 - { - 24, /* number */ - MY_CS_COMPILED, /* state */ - "gb2312", /* name */ - "", /* comment */ - ctype_gb2312, - to_lower_gb2312, - to_upper_gb2312, - sort_order_gb2312, - NULL, /* tab_to_uni */ - NULL, /* tab_from_uni */ - 0, /* strxfrm_multiply */ - my_strnncoll_simple,/* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 2, /* mbmaxlen */ - ismbchar_gb2312, - ismbhead_gb2312, - mbcharlen_gb2312, - my_mb_wc_gb2312, /* mb_wc */ - my_wc_mb_gb2312, /* wc_mb */ - my_caseup_str_mb, - my_casedn_str_mb, - my_caseup_mb, - my_casedn_mb, - my_tosort_8bit, - my_strcasecmp_mb, - my_strncasecmp_mb, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ - 0 - }, -#endif - -#ifdef HAVE_CHARSET_gbk - { - 28, /* number */ - MY_CS_COMPILED, /* state */ - "gbk", /* name */ - "", /* comment */ - ctype_gbk, - to_lower_gbk, - to_upper_gbk, - sort_order_gbk, - NULL, /* tab_to_uni */ - NULL, /* tab_from_uni */ - 1, /* strxfrm_multiply */ - my_strnncoll_gbk, - my_strnxfrm_gbk, - my_like_range_gbk, - 2, /* mbmaxlen */ - ismbchar_gbk, - ismbhead_gbk, - mbcharlen_gbk, - my_mb_wc_gbk, /* mb_wc */ - my_wc_mb_gbk, /* wc_mb */ - my_caseup_str_mb, - my_casedn_str_mb, - my_caseup_mb, - my_casedn_mb, - NULL, /* tosort */ - my_strcasecmp_mb, - my_strncasecmp_mb, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ - 0 - }, -#endif #ifdef HAVE_CHARSET_german1 { @@ -3503,40 +3331,6 @@ CHARSET_INFO compiled_charsets[] = { }, #endif -#ifdef HAVE_CHARSET_latin1_de - { - 31, /* number */ - MY_CS_COMPILED, /* state */ - "latin1_de", /* name */ - "", /* comment */ - ctype_latin1_de, - to_lower_latin1_de, - to_upper_latin1_de, - sort_order_latin1_de, - tab_8859_1_uni, /* tab_to_uni */ - idx_uni_8859_1, /* tab_from_uni */ - 2, /* strxfrm_multiply */ - my_strnncoll_latin1_de, - my_strnxfrm_latin1_de, - my_like_range_latin1_de, - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ - my_mb_wc_8bit, /* mb_wc */ - my_wc_mb_8bit, /* wc_mb */ - my_caseup_str_8bit, - my_casedn_str_8bit, - my_caseup_8bit, - my_casedn_8bit, - NULL, /* tosort */ - my_strcasecmp_8bit, - my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ - 0 - }, -#endif #ifdef HAVE_CHARSET_latin2 { @@ -3608,40 +3402,6 @@ CHARSET_INFO compiled_charsets[] = { }, #endif -#ifdef HAVE_CHARSET_sjis - { - 13, /* number */ - MY_CS_COMPILED, /* state */ - "sjis", /* name */ - "", /* comment */ - ctype_sjis, - to_lower_sjis, - to_upper_sjis, - sort_order_sjis, - NULL, /* tab_to_uni */ - NULL, /* tab_from_uni */ - 1, /* strxfrm_multiply */ - my_strnncoll_sjis, - my_strnxfrm_sjis, - my_like_range_sjis, - 2, /* mbmaxlen */ - ismbchar_sjis, - ismbhead_sjis, - mbcharlen_sjis, - my_mb_wc_sjis, /* mb_wc */ - my_wc_mb_sjis, /* wc_mb */ - my_caseup_str_8bit, - my_casedn_str_8bit, - my_caseup_8bit, - my_casedn_8bit, - NULL, /* tosort */ - my_strcasecmp_8bit, - my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ - 0 - }, -#endif #ifdef HAVE_CHARSET_swe7 { @@ -3678,146 +3438,6 @@ CHARSET_INFO compiled_charsets[] = { }, #endif -#ifdef HAVE_CHARSET_tis620 - { - 18, /* number */ - MY_CS_COMPILED, /* state */ - "tis620", /* name */ - "", /* comment */ - ctype_tis620, - to_lower_tis620, - to_upper_tis620, - sort_order_tis620, - NULL, /* tab_to_uni */ - NULL, /* tab_from_uni */ - 4, /* strxfrm_multiply */ - my_strnncoll_tis620, - my_strnxfrm_tis620, - my_like_range_tis620, - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ - my_mb_wc_8bit, /* mb_wc */ - my_wc_mb_8bit, /* wc_mb */ - my_caseup_str_8bit, - my_casedn_str_8bit, - my_caseup_8bit, - my_casedn_8bit, - NULL, /* tosort */ - my_strcasecmp_8bit, - my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ - 0 - }, -#endif - -#ifdef HAVE_CHARSET_ucs2 - { - 35, /* number */ - MY_CS_COMPILED, /* state */ - "ucs2", /* name */ - "", /* comment */ - ctype_ucs2, /* ctype */ - to_lower_ucs2, /* to_lower */ - to_upper_ucs2, /* to_upper */ - to_upper_ucs2, /* sort_order */ - NULL, /* tab_to_uni */ - NULL, /* tab_from_uni */ - 1, /* strxfrm_multiply */ - my_strnncoll_ucs2, /* strnncoll */ - my_strnxfrm_ucs2, /* strnxfrm */ - NULL, /* like_range */ - 2, /* mbmaxlen */ - my_ismbchar_ucs2, /* ismbchar */ - my_ismbhead_ucs2, /* ismbhead */ - my_mbcharlen_ucs2, /* mbcharlen */ - my_ucs2_uni, /* mb_wc */ - my_uni_ucs2, /* wc_mb */ - my_caseup_str_ucs2, - my_casedn_str_ucs2, - my_caseup_ucs2, - my_casedn_ucs2, - NULL, /* tosort */ - my_strcasecmp_ucs2, - my_strncasecmp_ucs2, - my_hash_caseup_ucs2,/* hash_caseup */ - my_hash_sort_ucs2, /* hash_sort */ - 0 - }, -#endif - - -#ifdef HAVE_CHARSET_ujis - { - 12, /* number */ - MY_CS_COMPILED, /* state */ - "ujis", /* name */ - "", /* comment */ - ctype_ujis, - to_lower_ujis, - to_upper_ujis, - sort_order_ujis, - NULL, /* tab_to_uni */ - NULL, /* tab_from_uni */ - 0, /* strxfrm_multiply */ - NULL, /* strnncoll */ - NULL, /* strnxfrm */ - NULL, /* like_range */ - 3, /* mbmaxlen */ - ismbchar_ujis, - ismbhead_ujis, - mbcharlen_ujis, - my_mb_wc_euc_jp, /* mb_wc */ - my_wc_mb_euc_jp, /* wc_mb */ - my_caseup_str_mb, - my_casedn_str_mb, - my_caseup_mb, - my_casedn_mb, - my_tosort_8bit, - my_strcasecmp_mb, - my_strncasecmp_mb, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ - 0 - }, -#endif - -#ifdef HAVE_CHARSET_utf8 - { - 33, /* number */ - MY_CS_COMPILED, /* state */ - "utf8", /* name */ - "", /* comment */ - ctype_utf8, /* ctype */ - to_lower_utf8, /* to_lower */ - to_upper_utf8, /* to_upper */ - to_upper_utf8, /* sort_order */ - NULL, /* tab_to_uni */ - NULL, /* tab_from_uni */ - 1, /* strxfrm_multiply */ - my_strnncoll_utf8, /* strnncoll */ - my_strnxfrm_utf8, /* strnxfrm */ - NULL, /* like_range */ - 3, /* mbmaxlen */ - my_ismbchar_utf8, /* ismbchar */ - my_ismbhead_utf8, /* ismbhead */ - my_mbcharlen_utf8, /* mbcharlen */ - my_utf8_uni, /* mb_wc */ - my_uni_utf8, /* wc_mb */ - my_caseup_str_utf8, - my_casedn_str_utf8, - my_caseup_utf8, - my_casedn_utf8, - NULL, /* tosort */ - my_strcasecmp_utf8, - my_strncasecmp_utf8, - my_hash_caseup_utf8,/* hash_caseup */ - my_hash_sort_utf8, /* hash_sort */ - 0 - }, -#endif #ifdef HAVE_CHARSET_usa7 { @@ -3994,41 +3614,6 @@ CHARSET_INFO compiled_charsets[] = { }, #endif -#ifdef HAVE_CHARSET_win1250ch - { - 34, /* number */ - MY_CS_COMPILED, /* state */ - "win1250ch", /* name */ - "", /* comment */ - ctype_win1250ch, - to_lower_win1250ch, - to_upper_win1250ch, - sort_order_win1250ch, - tab_cp1250_uni, /* tab_to_uni */ - idx_uni_cp1250, /* tab_from_uni */ - 2, /* strxfrm_multiply */ - my_strnncoll_win1250ch, - my_strnxfrm_win1250ch, - my_like_range_win1250ch, - 0, /* mbmaxlen */ - NULL, /* ismbchar */ - NULL, /* ismbhead */ - NULL, /* mbcharlen */ - my_mb_wc_8bit, /* mb_wc */ - my_wc_mb_8bit, /* wc_mb */ - my_caseup_str_8bit, - my_casedn_str_8bit, - my_caseup_8bit, - my_casedn_8bit, - NULL, /* tosort */ - my_strcasecmp_8bit, - my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ - 0 - }, -#endif - { 0, /* end-of-list marker */ 0, /* state */ @@ -4066,45 +3651,84 @@ CHARSET_INFO compiled_charsets[] = { }; +CHARSET_INFO *all_charsets[256]; CHARSET_INFO *default_charset_info = &compiled_charsets[0]; CHARSET_INFO *system_charset_info = &compiled_charsets[0]; -CHARSET_INFO *find_compiled_charset(uint cs_number) -{ - CHARSET_INFO *cs; - for (cs = compiled_charsets; cs->number > 0; cs++) - if (cs->number == cs_number) - return cs; +#define MY_ADD_CHARSET(x) all_charsets[(x)->number]=(x) - return NULL; -} -CHARSET_INFO *find_compiled_charset_by_name(const char *name) -{ - CHARSET_INFO *cs; - for (cs = compiled_charsets; cs->number > 0; cs++) - if (!strcmp(cs->name, name)) - return cs; +extern CHARSET_INFO my_charset_big5; +extern CHARSET_INFO my_charset_czech; +extern CHARSET_INFO my_charset_euc_kr; +extern CHARSET_INFO my_charset_gb2312; +extern CHARSET_INFO my_charset_gbk; +extern CHARSET_INFO my_charset_latin1_de; +extern CHARSET_INFO my_charset_sjis; +extern CHARSET_INFO my_charset_tis620; +extern CHARSET_INFO my_charset_ucs2; +extern CHARSET_INFO my_charset_ujis; +extern CHARSET_INFO my_charset_utf8; +extern CHARSET_INFO my_charset_win1250ch; - return NULL; -} -uint compiled_charset_number(const char *name) +my_bool init_compiled_charsets(myf flags __attribute__((unused))) { CHARSET_INFO *cs; - for (cs = compiled_charsets; cs->number > 0; cs++) - if (!strcmp(cs->name, name)) - return cs->number; - return 0; /* this mimics find_type() */ -} +#ifdef HAVE_CHARSET_big5 + MY_ADD_CHARSET(&my_charset_big5); +#endif -const char *compiled_charset_name(uint charset_number) -{ - CHARSET_INFO *cs; - for (cs = compiled_charsets; cs->number > 0; cs++) - if (cs->number == charset_number) - return cs->name; +#ifdef HAVE_CHARSET_czech + MY_ADD_CHARSET(&my_charset_czech); +#endif + +#ifdef HAVE_CHARSET_euc_kr + MY_ADD_CHARSET(&my_charset_euc_kr); +#endif + +#ifdef HAVE_CHARSET_gb2312 + MY_ADD_CHARSET(&my_charset_gb2312); +#endif - return "?"; /* this mimics get_type() */ +#ifdef HAVE_CHARSET_gbk + MY_ADD_CHARSET(&my_charset_gbk); +#endif + +#ifdef HAVE_CHARSET_latin1_de + MY_ADD_CHARSET(&my_charset_latin1_de); +#endif + +#ifdef HAVE_CHARSET_sjis + MY_ADD_CHARSET(&my_charset_sjis); +#endif + +#ifdef HAVE_CHARSET_tis620 + MY_ADD_CHARSET(&my_charset_tis620); +#endif + +#ifdef HAVE_CHARSET_ucs2 + MY_ADD_CHARSET(&my_charset_ucs2); +#endif + +#ifdef HAVE_CHARSET_ujis + MY_ADD_CHARSET(&my_charset_ujis); +#endif + +#ifdef HAVE_CHARSET_utf8 + MY_ADD_CHARSET(&my_charset_utf8); +#endif + +#ifdef HAVE_CHARSET_win1250ch + MY_ADD_CHARSET(&my_charset_win1250ch); +#endif + + /* Copy compiled charsets */ + for (cs=compiled_charsets; cs->name; cs++) + { + all_charsets[cs->number]=cs; + } + + return FALSE; } -- cgit v1.2.1 From 72174d5b8207363aaf22dbc7b0b85d9bfa9505ab Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 10 Oct 2002 16:52:22 +0500 Subject: Move hash_sort and hash_caseup into CHARSET_INFO for all charsets --- heap/hp_hash.c | 27 ++------------ include/m_ctype.h | 8 +++++ mysys/charset.c | 2 ++ mysys/hash.c | 36 +------------------ strings/ctype-big5.c | 4 +-- strings/ctype-czech.c | 4 +-- strings/ctype-euc_kr.c | 4 +-- strings/ctype-gb2312.c | 4 +-- strings/ctype-gbk.c | 4 +-- strings/ctype-latin1_de.c | 4 +-- strings/ctype-simple.c | 53 +++++++++++++++++++++++++++ strings/ctype-sjis.c | 4 +-- strings/ctype-tis620.c | 4 +-- strings/ctype-ujis.c | 4 +-- strings/ctype-win1250ch.c | 4 +-- strings/ctype.c | 92 +++++++++++++++++++++++------------------------ 16 files changed, 132 insertions(+), 126 deletions(-) diff --git a/heap/hp_hash.c b/heap/hp_hash.c index b0533e9c7a4..ea48bd0c947 100644 --- a/heap/hp_hash.c +++ b/heap/hp_hash.c @@ -214,18 +214,7 @@ ulong hp_hashnr(register HP_KEYDEF *keydef, register const byte *key) } if (seg->type == HA_KEYTYPE_TEXT) { - if (seg->charset->hash_sort) - seg->charset->hash_sort(seg->charset,pos,((uchar*)key)-pos,&nr,&nr2); - else - { - register uchar *sort_order=seg->charset->sort_order; - for (; pos < (uchar*) key ; pos++) - { - nr^=(ulong) ((((uint) nr & 63)+nr2) * - ((uint) sort_order[(uint) *pos])) + (nr << 8); - nr2+=3; - } - } + seg->charset->hash_sort(seg->charset,pos,((uchar*)key)-pos,&nr,&nr2); } else { @@ -260,19 +249,7 @@ ulong hp_rec_hashnr(register HP_KEYDEF *keydef, register const byte *rec) } if (seg->type == HA_KEYTYPE_TEXT) { - if (seg->charset->hash_sort) - seg->charset->hash_sort(seg->charset,pos,end-pos,&nr,&nr2); - else - { - register uchar *sort_order=seg->charset->sort_order; - - for (; pos < end ; pos++) - { - nr^=(ulong) ((((uint) nr & 63)+nr2)* - ((uint) sort_order[(uint) *pos]))+ (nr << 8); - nr2+=3; - } - } + seg->charset->hash_sort(seg->charset,pos,end-pos,&nr,&nr2); } else { diff --git a/include/m_ctype.h b/include/m_ctype.h index 70551f31c57..e4bc9be3378 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -126,6 +126,14 @@ extern my_bool init_compiled_charsets(myf flags); extern int my_strnxfrm_simple(CHARSET_INFO *, uchar *, uint, const uchar *, uint); extern int my_strnncoll_simple(CHARSET_INFO *, const uchar *, uint, const uchar *, uint); +extern uint my_hash_caseup_simple(CHARSET_INFO *cs, + const byte *key, uint len); + +extern void my_hash_sort_simple(CHARSET_INFO *cs, + const uchar *key, uint len, + ulong *nr1, ulong *nr2); + + /* Functions for 8bit */ extern void my_caseup_str_8bit(CHARSET_INFO *, char *); extern void my_casedn_str_8bit(CHARSET_INFO *, char *); diff --git a/mysys/charset.c b/mysys/charset.c index 742163e9220..9c977c7d145 100644 --- a/mysys/charset.c +++ b/mysys/charset.c @@ -386,6 +386,8 @@ static CHARSET_INFO *add_charset(CHARSET_INFO *cs, myf flags) cs->strncasecmp = my_strncasecmp_8bit; cs->mb_wc = my_mb_wc_8bit; cs->wc_mb = my_wc_mb_8bit; + cs->hash_caseup = my_hash_caseup_simple; + cs->hash_sort = my_hash_sort_simple; set_max_sort_char(cs); create_fromuni(cs); diff --git a/mysys/hash.c b/mysys/hash.c index 43e6981f79d..2ef17be5341 100644 --- a/mysys/hash.c +++ b/mysys/hash.c @@ -32,7 +32,6 @@ static uint hash_mask(uint hashnr,uint buffmax,uint maxlength); static void movelink(HASH_LINK *array,uint pos,uint next_link,uint newlink); static uint calc_hashnr(CHARSET_INFO *cs,const byte *key,uint length); -static uint calc_hashnr_caseup(CHARSET_INFO *cs, const byte *key,uint length); static int hashcmp(HASH *hash,HASH_LINK *pos,const byte *key,uint length); @@ -60,12 +59,7 @@ _hash_init(HASH *hash,CHARSET_INFO *charset, hash->flags=flags; hash->charset=charset; if (flags & HASH_CASE_INSENSITIVE) - { - if (charset->hash_caseup) - hash->calc_hashnr=charset->hash_caseup; - else - hash->calc_hashnr=calc_hashnr_caseup; - } + hash->calc_hashnr=charset->hash_caseup; else hash->calc_hashnr=calc_hashnr; DBUG_RETURN(0); @@ -132,22 +126,6 @@ static uint calc_hashnr(CHARSET_INFO *cs __attribute__((unused)), return((uint) nr); } - /* Calc hashvalue for a key, case indepenently */ - -static uint calc_hashnr_caseup(CHARSET_INFO *cs, const byte *key,uint length) -{ - register uint nr=1, nr2=4; - register uchar *map=cs->to_upper; - - while (length--) - { - nr^= (((nr & 63)+nr2)* - ((uint) (uchar) map[(uchar)*key++])) + (nr << 8); - nr2+=3; - } - return((uint) nr); -} - #else /* @@ -175,18 +153,6 @@ uint calc_hashnr(CHARSET_INFO *cs, const byte *key, uint len) return (hash); } -uint calc_hashnr_caseup(CHARSET_INFO *cs, const byte *key, uint len) -{ - const byte *end=key+len; - uint hash; - for (hash = 0; key < end; key++) - { - hash *= 16777619; - hash ^= (uint) (uchar) my_toupper(cs,*key); - } - return (hash); -} - #endif diff --git a/strings/ctype-big5.c b/strings/ctype-big5.c index f83cf0cffeb..b9011ac12aa 100644 --- a/strings/ctype-big5.c +++ b/strings/ctype-big5.c @@ -6245,8 +6245,8 @@ CHARSET_INFO my_charset_big5 = NULL, /* tosort */ my_strcasecmp_mb, my_strncasecmp_mb, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }; diff --git a/strings/ctype-czech.c b/strings/ctype-czech.c index 3060c29dbac..e6cab722a8e 100644 --- a/strings/ctype-czech.c +++ b/strings/ctype-czech.c @@ -623,8 +623,8 @@ CHARSET_INFO my_charset_czech = NULL, /* tosort */ my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }; diff --git a/strings/ctype-euc_kr.c b/strings/ctype-euc_kr.c index 5f5129921b9..a7d6044b378 100644 --- a/strings/ctype-euc_kr.c +++ b/strings/ctype-euc_kr.c @@ -8662,8 +8662,8 @@ CHARSET_INFO my_charset_euc_kr = my_tosort_8bit, my_strcasecmp_mb, my_strncasecmp_mb, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }; diff --git a/strings/ctype-gb2312.c b/strings/ctype-gb2312.c index 9823eceee5b..e931c7c1f31 100644 --- a/strings/ctype-gb2312.c +++ b/strings/ctype-gb2312.c @@ -5712,8 +5712,8 @@ CHARSET_INFO my_charset_gb2312 = my_tosort_8bit, my_strcasecmp_mb, my_strncasecmp_mb, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }; diff --git a/strings/ctype-gbk.c b/strings/ctype-gbk.c index fd70dac2123..0f2de81ccb6 100644 --- a/strings/ctype-gbk.c +++ b/strings/ctype-gbk.c @@ -9900,8 +9900,8 @@ CHARSET_INFO my_charset_gbk = NULL, /* tosort */ my_strcasecmp_mb, my_strncasecmp_mb, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }; diff --git a/strings/ctype-latin1_de.c b/strings/ctype-latin1_de.c index b34b091d679..040bd11b5e9 100644 --- a/strings/ctype-latin1_de.c +++ b/strings/ctype-latin1_de.c @@ -441,8 +441,8 @@ CHARSET_INFO my_charset_latin1_de = NULL, /* tosort */ my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }; diff --git a/strings/ctype-simple.c b/strings/ctype-simple.c index 8553f83f380..f27b113376b 100644 --- a/strings/ctype-simple.c +++ b/strings/ctype-simple.c @@ -118,3 +118,56 @@ int my_wc_mb_8bit(CHARSET_INFO *cs,my_wc_t wc, } return MY_CS_ILUNI; } + + + +#ifndef NEW_HASH_FUNCTION + + /* Calc hashvalue for a key, case indepenently */ + +uint my_hash_caseup_simple(CHARSET_INFO *cs, const byte *key, uint length) +{ + register uint nr=1, nr2=4; + register uchar *map=cs->to_upper; + + while (length--) + { + nr^= (((nr & 63)+nr2)* + ((uint) (uchar) map[(uchar)*key++])) + (nr << 8); + nr2+=3; + } + return((uint) nr); +} + +#else + +uint my_hash_caseup_simple(CHARSET_INFO *cs, const byte *key, uint len) +{ + const byte *end=key+len; + uint hash; + for (hash = 0; key < end; key++) + { + hash *= 16777619; + hash ^= (uint) (uchar) my_toupper(cs,*key); + } + return (hash); +} + +#endif + +void my_hash_sort_simple(CHARSET_INFO *cs, + const uchar *key, uint len, + ulong *nr1, ulong *nr2) +{ + register uchar *sort_order=cs->sort_order; + const uchar *pos = key; + + key+= len; + + for (; pos < (uchar*) key ; pos++) + { + nr1[0]^=(ulong) ((((uint) nr1[0] & 63)+nr2[0]) * + ((uint) sort_order[(uint) *pos])) + (nr1[0] << 8); + nr2[0]+=3; + } +} diff --git a/strings/ctype-sjis.c b/strings/ctype-sjis.c index f61d3753536..9c8ac8d0c16 100644 --- a/strings/ctype-sjis.c +++ b/strings/ctype-sjis.c @@ -4487,8 +4487,8 @@ CHARSET_INFO my_charset_sjis = NULL, /* tosort */ my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }; diff --git a/strings/ctype-tis620.c b/strings/ctype-tis620.c index 1a4be5b3f9a..88549e7ee69 100644 --- a/strings/ctype-tis620.c +++ b/strings/ctype-tis620.c @@ -715,8 +715,8 @@ CHARSET_INFO my_charset_tis620 = NULL, /* tosort */ my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }; diff --git a/strings/ctype-ujis.c b/strings/ctype-ujis.c index 086e3362f8b..cb1da080951 100644 --- a/strings/ctype-ujis.c +++ b/strings/ctype-ujis.c @@ -8456,8 +8456,8 @@ CHARSET_INFO my_charset_ujis = my_tosort_8bit, my_strcasecmp_mb, my_strncasecmp_mb, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }; diff --git a/strings/ctype-win1250ch.c b/strings/ctype-win1250ch.c index e738d7727bc..f64eddd2c2b 100644 --- a/strings/ctype-win1250ch.c +++ b/strings/ctype-win1250ch.c @@ -649,8 +649,8 @@ CHARSET_INFO my_charset_win1250ch = NULL, /* tosort */ my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }; diff --git a/strings/ctype.c b/strings/ctype.c index 91e20508558..379669adb5f 100644 --- a/strings/ctype.c +++ b/strings/ctype.c @@ -2832,8 +2832,8 @@ static CHARSET_INFO compiled_charsets[] = { my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }, #endif @@ -2868,8 +2868,8 @@ static CHARSET_INFO compiled_charsets[] = { my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }, #endif @@ -2903,8 +2903,8 @@ static CHARSET_INFO compiled_charsets[] = { my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }, #endif @@ -2938,8 +2938,8 @@ static CHARSET_INFO compiled_charsets[] = { my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }, #endif @@ -2974,8 +2974,8 @@ static CHARSET_INFO compiled_charsets[] = { my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }, #endif @@ -3009,8 +3009,8 @@ static CHARSET_INFO compiled_charsets[] = { my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }, #endif @@ -3044,8 +3044,8 @@ static CHARSET_INFO compiled_charsets[] = { my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }, #endif @@ -3079,8 +3079,8 @@ static CHARSET_INFO compiled_charsets[] = { my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }, #endif @@ -3115,8 +3115,8 @@ static CHARSET_INFO compiled_charsets[] = { my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }, #endif @@ -3150,8 +3150,8 @@ static CHARSET_INFO compiled_charsets[] = { my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }, #endif @@ -3185,8 +3185,8 @@ static CHARSET_INFO compiled_charsets[] = { my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }, #endif @@ -3220,8 +3220,8 @@ static CHARSET_INFO compiled_charsets[] = { my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }, #endif @@ -3255,8 +3255,8 @@ static CHARSET_INFO compiled_charsets[] = { my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }, #endif @@ -3290,8 +3290,8 @@ static CHARSET_INFO compiled_charsets[] = { my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }, #endif @@ -3325,8 +3325,8 @@ static CHARSET_INFO compiled_charsets[] = { my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }, #endif @@ -3361,8 +3361,8 @@ static CHARSET_INFO compiled_charsets[] = { my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }, #endif @@ -3396,8 +3396,8 @@ static CHARSET_INFO compiled_charsets[] = { my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }, #endif @@ -3432,8 +3432,8 @@ static CHARSET_INFO compiled_charsets[] = { my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }, #endif @@ -3468,8 +3468,8 @@ static CHARSET_INFO compiled_charsets[] = { my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }, #endif @@ -3503,8 +3503,8 @@ static CHARSET_INFO compiled_charsets[] = { my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }, #endif @@ -3538,8 +3538,8 @@ static CHARSET_INFO compiled_charsets[] = { my_strcasecmp_8bit, my_tosort_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }, #endif @@ -3573,8 +3573,8 @@ static CHARSET_INFO compiled_charsets[] = { my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }, #endif @@ -3608,8 +3608,8 @@ static CHARSET_INFO compiled_charsets[] = { my_tosort_8bit, my_strcasecmp_8bit, my_strncasecmp_8bit, - NULL, /* hash_caseup */ - NULL, /* hash_sort */ + my_hash_caseup_simple, + my_hash_sort_simple, 0 }, #endif -- cgit v1.2.1 From 08f44a43658eea5034a35b706ae65c678be0160b Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 10 Oct 2002 17:14:56 +0500 Subject: Don't use sort_order directly --- heap/hp_hash.c | 12 ++---------- myisam/mi_unique.c | 17 +++-------------- 2 files changed, 5 insertions(+), 24 deletions(-) diff --git a/heap/hp_hash.c b/heap/hp_hash.c index ea48bd0c947..e28f4725caf 100644 --- a/heap/hp_hash.c +++ b/heap/hp_hash.c @@ -301,11 +301,7 @@ ulong hp_hashnr(register HP_KEYDEF *keydef, register const byte *key) } if (seg->type == HA_KEYTYPE_TEXT) { - for (; pos < (uchar*) key ; pos++) - { - nr *=16777619; - nr ^=((uint) my_sort_order[(uint) *pos]); - } + seg->charset->hash_sort(seg->charset,pos,((uchar*)key)-pos,&nr,NULL); } else { @@ -339,11 +335,7 @@ ulong hp_rec_hashnr(register HP_KEYDEF *keydef, register const byte *rec) } if (seg->type == HA_KEYTYPE_TEXT) { - for ( ; pos < end ; pos++) - { - nr *=16777619; - nr ^=(uint) my_sort_order[(uint) *pos]; - } + seg->charset->hash_sort(seg->charset,pos,((uchar*)key)-pos,&nr,NULL); } else { diff --git a/myisam/mi_unique.c b/myisam/mi_unique.c index 2101c656324..682f946eba7 100644 --- a/myisam/mi_unique.c +++ b/myisam/mi_unique.c @@ -99,20 +99,9 @@ ha_checksum mi_unique_hash(MI_UNIQUEDEF *def, const byte *record) end= pos+length; if (type == HA_KEYTYPE_TEXT || type == HA_KEYTYPE_VARTEXT) { - if (keyseg->charset->hash_sort) - { - ulong nr=1, nr2=4; - keyseg->charset->hash_sort(keyseg->charset,(const uchar*)pos,length,&nr, &nr2); - crc=nr; - } - else - { - uchar *sort_order=keyseg->charset->sort_order; - while (pos != end) - crc=((crc << 8) + - (((uchar) sort_order[*(uchar*) pos++]))) + - (crc >> (8*sizeof(ha_checksum)-8)); - } + ulong nr=1, nr2=4; + keyseg->charset->hash_sort(keyseg->charset,(const uchar*)pos,length,&nr, &nr2); + crc=nr; } else while (pos != end) -- cgit v1.2.1 From 16f5d9530833ecc6f0e83dc2eaf1ff287ff6fa46 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 10 Oct 2002 17:32:24 +0500 Subject: Don't use sort_order directly --- myisam/ft_static.c | 2 +- mysys/my_handler.c | 23 ++--------------------- 2 files changed, 3 insertions(+), 22 deletions(-) diff --git a/myisam/ft_static.c b/myisam/ft_static.c index 0b22d296206..5c2629e9e9e 100644 --- a/myisam/ft_static.c +++ b/myisam/ft_static.c @@ -36,7 +36,7 @@ const HA_KEYSEG ft_keysegs[FT_SEGS]={ HA_FT_WLEN, /* start */ #endif /* EVAL_RUN */ 0, /* null_pos */ - NULL /* sort_order */ + NULL /* charset */ }, #ifdef EVAL_RUN { diff --git a/mysys/my_handler.c b/mysys/my_handler.c index af1bf7037f9..2d51ab13f69 100644 --- a/mysys/my_handler.c +++ b/mysys/my_handler.c @@ -20,28 +20,9 @@ int mi_compare_text(CHARSET_INFO *charset_info, uchar *a, uint a_length, uchar *b, uint b_length, my_bool part_key) { - int flag; - -#ifdef USE_STRCOLL - if (use_strnxfrm(charset_info)) - { - if (part_key && b_length < a_length) - a_length=b_length; - return my_strnncoll(charset_info, a, a_length, b, b_length); - } - else -#endif - { - uint length= min(a_length,b_length); - uchar *end= a+ length; - uchar *sort_order=charset_info->sort_order; - while (a < end) - if ((flag= (int) sort_order[*a++] - (int) sort_order[*b++])) - return flag; - } if (part_key && b_length < a_length) - return 0; - return (int) (a_length-b_length); + a_length=b_length; + return my_strnncoll(charset_info, a, a_length, b, b_length); } static int compare_bin(uchar *a, uint a_length, uchar *b, uint b_length, -- cgit v1.2.1 From 261c22a87a7214264b67eed7fb12608baafdfbc4 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 11 Oct 2002 17:00:11 +0300 Subject: fixed bug in subselect value storing mysql-test/r/subselect.result: test for bug in subselect value storing mysql-test/t/subselect.test: test for bug in subselect value storing --- mysql-test/r/subselect.result | 3 +++ mysql-test/t/subselect.test | 1 + sql/item_subselect.cc | 2 ++ sql/item_subselect.h | 13 ++++++++++--- sql/sql_class.cc | 11 ++++++++--- 5 files changed, 24 insertions(+), 6 deletions(-) diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index 2618741a520..1ea59677c6e 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -159,6 +159,9 @@ UNIQUE KEY `email` (`email`) INSERT INTO inscrit (pseudo,email) VALUES ('joce','test'); INSERT INTO inscrit (pseudo,email) VALUES ('joce1','test1'); INSERT INTO inscrit (pseudo,email) VALUES ('2joce1','2test1'); +SELECT pseudo FROM inscrit WHERE pseudo=(SELECT pseudo FROM inscrit WHERE pseudo='joce'); +pseudo +joce SELECT pseudo FROM inscrit WHERE pseudo=(SELECT pseudo FROM inscrit WHERE pseudo LIKE '%joce%'); Subselect returns more than 1 record drop table if exists t1,t2,t3,t4,t5,attend,clinic,inscrit; diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index c34332d6d90..6b3401383c8 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -82,6 +82,7 @@ CREATE TABLE `inscrit` ( INSERT INTO inscrit (pseudo,email) VALUES ('joce','test'); INSERT INTO inscrit (pseudo,email) VALUES ('joce1','test1'); INSERT INTO inscrit (pseudo,email) VALUES ('2joce1','2test1'); +SELECT pseudo FROM inscrit WHERE pseudo=(SELECT pseudo FROM inscrit WHERE pseudo='joce'); -- error 1240 SELECT pseudo FROM inscrit WHERE pseudo=(SELECT pseudo FROM inscrit WHERE pseudo LIKE '%joce%'); diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 2d08b9cb6b5..26cc376739a 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -150,6 +150,8 @@ String *Item_singleval_subselect::val_str (String *str) assign_null(); return 0; } + // Assign temporary buffer with stored value + str_value.set(string_value, 0, string_value.length()); return &str_value; } diff --git a/sql/item_subselect.h b/sql/item_subselect.h index 5d070871b49..79b6b3a4292 100644 --- a/sql/item_subselect.h +++ b/sql/item_subselect.h @@ -80,10 +80,16 @@ public: class Item_singleval_subselect :public Item_subselect { protected: - longlong int_value; /* here stored integer value of this item */ - double real_value; /* here stored real value of this item */ + longlong int_value; /* Here stored integer value of this item */ + double real_value; /* Here stored real value of this item */ + /* + Here stored string value of this item. + (str_value used only as temporary buffer, because it can be changed + by Item::save_field) + */ + String string_value; enum Item_result res_type; /* type of results */ - + public: Item_singleval_subselect(THD *thd, st_select_lex *select_lex); Item_singleval_subselect(Item_singleval_subselect *item): @@ -91,6 +97,7 @@ public: { int_value= item->int_value; real_value= item->real_value; + string_value.set(item->string_value, 0, item->string_value.length()); max_length= item->max_length; decimals= item->decimals; res_type= item->res_type; diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 648e05c1610..f778a721f54 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -884,9 +884,14 @@ bool select_singleval_subselect::send_data(List &items) it->decimals= val_item->decimals; it->binary= val_item->binary; it->int_value= val_item->val_int(); - String *s= val_item->val_str(&it->str_value); - if (s != &it->str_value) - it->str_value.set(*s, 0, s->length()); + String *s= val_item->val_str(&it->string_value); + if (s != &it->string_value) + { + it->string_value.set(*s, 0, s->length()); + } + // TODO: remove when correct charset handling appeared for Item + it->str_value.set(*s, 0, s->length()); // store charset + it->res_type= val_item->result_type(); } it->assigned(1); -- cgit v1.2.1 From 102cec14653cf1bacbcff81eee9b726a85c145b1 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 12 Oct 2002 01:09:47 +0300 Subject: fixed subselect * bug mysql-test/r/subselect.result: test of subselect * bug mysql-test/t/subselect.test: test of subselect * bug --- mysql-test/r/subselect.result | 6 ++++++ mysql-test/t/subselect.test | 6 ++++++ sql/item_subselect.cc | 14 ++++++++------ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index 1ea59677c6e..6ea2a7ab3cf 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -159,6 +159,12 @@ UNIQUE KEY `email` (`email`) INSERT INTO inscrit (pseudo,email) VALUES ('joce','test'); INSERT INTO inscrit (pseudo,email) VALUES ('joce1','test1'); INSERT INTO inscrit (pseudo,email) VALUES ('2joce1','2test1'); +SELECT pseudo FROM inscrit WHERE pseudo=(SELECT pseudo,email FROM +inscrit WHERE pseudo='joce'); +Subselect returns more than 1 field +SELECT pseudo FROM inscrit WHERE pseudo=(SELECT * FROM inscrit WHERE +pseudo='joce'); +Subselect returns more than 1 field SELECT pseudo FROM inscrit WHERE pseudo=(SELECT pseudo FROM inscrit WHERE pseudo='joce'); pseudo joce diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 6b3401383c8..37f68a3c4cb 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -82,6 +82,12 @@ CREATE TABLE `inscrit` ( INSERT INTO inscrit (pseudo,email) VALUES ('joce','test'); INSERT INTO inscrit (pseudo,email) VALUES ('joce1','test1'); INSERT INTO inscrit (pseudo,email) VALUES ('2joce1','2test1'); +-- error 1239 +SELECT pseudo FROM inscrit WHERE pseudo=(SELECT pseudo,email FROM +inscrit WHERE pseudo='joce'); +-- error 1239 +SELECT pseudo FROM inscrit WHERE pseudo=(SELECT * FROM inscrit WHERE +pseudo='joce'); SELECT pseudo FROM inscrit WHERE pseudo=(SELECT pseudo FROM inscrit WHERE pseudo='joce'); -- error 1240 SELECT pseudo FROM inscrit WHERE pseudo=(SELECT pseudo FROM inscrit WHERE pseudo LIKE '%joce%'); diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 26cc376739a..cd4403ad0b8 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -81,15 +81,17 @@ void Item_subselect::make_field (Send_field *tmp_field) bool Item_subselect::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) { - // Is it one field subselect? - if (engine->cols() > max_columns) - { - my_message(ER_SUBSELECT_NO_1_COL, ER(ER_SUBSELECT_NO_1_COL), MYF(0)); - return 1; - } int res= engine->prepare(); if (!res) + { + // Is it one field subselect? + if (engine->cols() > max_columns) + { + my_message(ER_SUBSELECT_NO_1_COL, ER(ER_SUBSELECT_NO_1_COL), MYF(0)); + return 1; + } fix_length_and_dec(); + } return res; } -- cgit v1.2.1 From 2b70d7e56763e4b79feaf7f948ca2844a084861e Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 12 Oct 2002 17:43:40 +0000 Subject: --tmpdir=dir1:dir2... uses (is_windows ? ";" : ":") as a delimiter --- myisam/myisamchk.c | 8 +++++++- mysys/mf_tempdir.c | 11 ++++++++--- sql/mysqld.cc | 14 ++++++++++---- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/myisam/myisamchk.c b/myisam/myisamchk.c index 440c84dc64d..656d536f159 100644 --- a/myisam/myisamchk.c +++ b/myisam/myisamchk.c @@ -340,7 +340,13 @@ static void usage(void) this option is deprecated; you can set variables\n\ directly with '--variable-name=value'.\n\ -t, --tmpdir=path Path for temporary files. Multiple paths can be\n\ - specified, separated by colon (:), they will be used\n\ + specified, separated by " +#if defined( __WIN__) || defined(OS2) + "semicolon (;)" +#else + "colon (:)" +#endif + ", they will be used\n\ in a round-robin fashion.\n\ -s, --silent Only print errors. One can use two -s to make\n\ myisamchk very silent\n\ diff --git a/mysys/mf_tempdir.c b/mysys/mf_tempdir.c index 13b170ceee7..1ae034af67d 100644 --- a/mysys/mf_tempdir.c +++ b/mysys/mf_tempdir.c @@ -17,7 +17,12 @@ #include "mysys_priv.h" #include +#if defined( __WIN__) || defined(OS2) +#define DELIM ';' +#else #define DELIM ':' +#endif + my_bool init_tmpdir(MY_TMPDIR *tmpdir, const char *pathlist) { char *end, *copy; @@ -45,13 +50,13 @@ my_bool init_tmpdir(MY_TMPDIR *tmpdir, const char *pathlist) convert_dirname(buff, pathlist, end); if (!(copy=my_strdup(buff, MYF(MY_WME)))) return TRUE; - if (insert_dynamic(&t_arr, ©)) + if (insert_dynamic(&t_arr, (gptr)©)) return TRUE; pathlist=end+1; } while (*end); freeze_size(&t_arr); - tmpdir->list=t_arr.buffer; + tmpdir->list=(char **)t_arr.buffer; tmpdir->max=t_arr.elements-1; tmpdir->cur=0; return FALSE; @@ -72,7 +77,7 @@ void free_tmpdir(MY_TMPDIR *tmpdir) uint i; for (i=0; i<=tmpdir->max; i++) my_free(tmpdir->list[i], MYF(0)); - my_free(tmpdir->list, MYF(0)); + my_free((gptr)tmpdir->list, MYF(0)); pthread_mutex_destroy(&tmpdir->mutex); } diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 1b4713706fb..8497fe90758 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -2931,13 +2931,13 @@ struct my_option my_long_options[] = #endif /* HAVE_BERKELEY_DB */ {"skip-bdb", OPT_BDB_SKIP, "Don't use berkeley db (will save memory)", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"big-tables", OPT_BIG_TABLES, + {"big-tables", OPT_BIG_TABLES, "Allow big result sets by saving all temporary sets on file (Solves most 'table full' errors)", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, {"binlog-do-db", OPT_BINLOG_DO_DB, "Tells the master it should log updates for the specified database, and exclude all others not explicitly mentioned.", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"binlog-ignore-db", OPT_BINLOG_IGNORE_DB, + {"binlog-ignore-db", OPT_BINLOG_IGNORE_DB, "Tells the master that updates to the given database should not be logged tothe binary log", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"bind-address", OPT_BIND_ADDRESS, "IP address to bind to", @@ -3306,12 +3306,18 @@ struct my_option my_long_options[] = #ifdef HAVE_OPENSSL #include "sslopt-longopts.h" #endif - {"temp-pool", OPT_TEMP_POOL, + {"temp-pool", OPT_TEMP_POOL, "Using this option will cause most temporary files created to use a small set of names, rather than a unique name for each new file.", (gptr*) &use_temp_pool, (gptr*) &use_temp_pool, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, {"tmpdir", 't', - "Path for temporary files. Several paths may be specified, separated by a colon (:), in this case they are used in a round-robin fashion.", + "Path for temporary files. Several paths may be specified, separated by a " +#if defined( __WIN__) || defined(OS2) + "semicolon (;)" +#else + "colon (:)" +#endif + ", in this case they are used in a round-robin fashion.", (gptr*) &opt_mysql_tmpdir, (gptr*) &opt_mysql_tmpdir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"transaction-isolation", OPT_TX_ISOLATION, -- cgit v1.2.1 From a299a27021a7bdd65f93f99f9eb0003f082b305d Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 13 Oct 2002 14:25:16 +0300 Subject: fixed bug of multi-level EXPLAIN mysql-test/r/subselect.result: test of multi-level EXPLAIN mysql-test/t/subselect.test: test of multi-level EXPLAIN --- mysql-test/r/subselect.result | 8 ++++++++ mysql-test/t/subselect.test | 3 +++ sql/item_subselect.cc | 5 ++++- sql/item_subselect.h | 3 ++- sql/sql_lex.cc | 2 +- sql/sql_lex.h | 1 + sql/sql_union.cc | 7 ++++++- 7 files changed, 25 insertions(+), 4 deletions(-) diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index 6ea2a7ab3cf..b5b944583da 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -159,6 +159,14 @@ UNIQUE KEY `email` (`email`) INSERT INTO inscrit (pseudo,email) VALUES ('joce','test'); INSERT INTO inscrit (pseudo,email) VALUES ('joce1','test1'); INSERT INTO inscrit (pseudo,email) VALUES ('2joce1','2test1'); +EXPLAIN SELECT pseudo,(SELECT email FROM inscrit WHERE pseudo=(SELECT +pseudo FROM inscrit WHERE pseudo='joce')) FROM inscrit WHERE pseudo=(SELECT +pseudo FROM inscrit WHERE pseudo='joce'); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY inscrit const PRIMARY PRIMARY 35 const 1 +4 SUBSELECT inscrit const PRIMARY PRIMARY 35 const 1 +2 SUBSELECT inscrit const PRIMARY PRIMARY 35 const 1 +3 SUBSELECT inscrit const PRIMARY PRIMARY 35 const 1 SELECT pseudo FROM inscrit WHERE pseudo=(SELECT pseudo,email FROM inscrit WHERE pseudo='joce'); Subselect returns more than 1 field diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 37f68a3c4cb..120cbcbc05f 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -82,6 +82,9 @@ CREATE TABLE `inscrit` ( INSERT INTO inscrit (pseudo,email) VALUES ('joce','test'); INSERT INTO inscrit (pseudo,email) VALUES ('joce1','test1'); INSERT INTO inscrit (pseudo,email) VALUES ('2joce1','2test1'); +EXPLAIN SELECT pseudo,(SELECT email FROM inscrit WHERE pseudo=(SELECT +pseudo FROM inscrit WHERE pseudo='joce')) FROM inscrit WHERE pseudo=(SELECT +pseudo FROM inscrit WHERE pseudo='joce'); -- error 1239 SELECT pseudo FROM inscrit WHERE pseudo=(SELECT pseudo,email FROM inscrit WHERE pseudo='joce'); diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index cd4403ad0b8..de9c7e11313 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -212,7 +212,7 @@ subselect_single_select_engine::subselect_single_select_engine(THD *thd, select_subselect *result, Item_subselect *item): subselect_engine(thd, item, result), - executed(0), optimized(0) + prepared(0), optimized(0), executed(0) { select_lex= select; SELECT_LEX_UNIT *unit= select_lex->master_unit(); @@ -251,6 +251,9 @@ subselect_union_engine::subselect_union_engine(THD *thd, int subselect_single_select_engine::prepare() { + if (prepared) + return 0; + prepared= 1; SELECT_LEX *save_select= thd->lex.select; thd->lex.select= select_lex; if(join->prepare((TABLE_LIST*) select_lex->table_list.first, diff --git a/sql/item_subselect.h b/sql/item_subselect.h index 79b6b3a4292..33f82982708 100644 --- a/sql/item_subselect.h +++ b/sql/item_subselect.h @@ -179,8 +179,9 @@ public: class subselect_single_select_engine: public subselect_engine { - my_bool executed; /* simple subselect is executed */ + my_bool prepared; /* simple subselect is prepared */ my_bool optimized; /* simple subselect is optimized */ + my_bool executed; /* simple subselect is executed */ st_select_lex *select_lex; /* corresponding select_lex */ JOIN * join; /* corresponding JOIN structure */ public: diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 122ceeedc54..46206079084 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -944,7 +944,7 @@ void st_select_lex_unit::init_query() global_parameters= this; select_limit_cnt= HA_POS_ERROR; offset_limit_cnt= 0; - optimized= 0; + prepared= optimized= 0; item= 0; } diff --git a/sql/sql_lex.h b/sql/sql_lex.h index acf73f34d5d..fe708d3b782 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -227,6 +227,7 @@ protected: select_result *result; int res; bool describe, found_rows_for_union, + prepared, //prepare phase already performed for UNION (unit) optimized; // optimize phase already performed for UNION (unit) public: /* diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 1a18759eb5b..74cb8f6ffea 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -104,11 +104,16 @@ bool select_union::flush() typedef JOIN * JOIN_P; int st_select_lex_unit::prepare(THD *thd, select_result *result) { + DBUG_ENTER("st_select_lex_unit::prepare"); + + if (prepared) + DBUG_RETURN(0); + prepared= 1; + describe=(first_select()->options & SELECT_DESCRIBE) ? 1 : 0; res= 0; found_rows_for_union= false; TMP_TABLE_PARAM tmp_table_param; - DBUG_ENTER("st_select_lex_unit::prepare"); this->thd= thd; this->result= result; SELECT_LEX *lex_select_save= thd->lex.select; -- cgit v1.2.1 From 8290f609a7a407a86c4442c3c4a0322b736b871e Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 14 Oct 2002 14:33:42 +0300 Subject: fixed cteate temporary field of subselect bug mysql-test/r/subselect.result: test of cteate temporary field of subselect bug mysql-test/t/subselect.test: test of cteate temporary field of subselect bug --- mysql-test/r/subselect.result | 4 ++++ mysql-test/t/subselect.test | 1 + sql/sql_select.cc | 1 + 3 files changed, 6 insertions(+) diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index b5b944583da..c365c2ed434 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -1,6 +1,10 @@ select (select 2); (select 2) 2 +SELECT (SELECT 1) UNION SELECT (SELECT 2); +(SELECT 1) +1 +2 drop table if exists t1,t2,t3,t4,t5,attend,clinic,inscrit; create table t1 (a int); create table t2 (a int, b int); diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 120cbcbc05f..dbf45262a1e 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -1,5 +1,6 @@ select (select 2); +SELECT (SELECT 1) UNION SELECT (SELECT 2); drop table if exists t1,t2,t3,t4,t5,attend,clinic,inscrit; create table t1 (a int); create table t2 (a int, b int); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 09d41e2891b..f7d585e85f8 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -3605,6 +3605,7 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, case Item::COND_ITEM: case Item::FIELD_AVG_ITEM: case Item::FIELD_STD_ITEM: + case Item::SUBSELECT_ITEM: /* The following can only happen with 'CREATE TABLE ... SELECT' */ case Item::INT_ITEM: case Item::REAL_ITEM: -- cgit v1.2.1 From 57ec26c1e41d0d73dabb9a467cdf361811626bc6 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 14 Oct 2002 11:55:28 +0000 Subject: bad merge fixed --- sql/sql_cache.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc index 9fa534da799..5bdefbaaa30 100644 --- a/sql/sql_cache.cc +++ b/sql/sql_cache.cc @@ -1401,13 +1401,13 @@ ulong Query_cache::init_cache() VOID(hash_init(&queries,system_charset_info,def_query_hash_size, 0, 0, query_cache_query_get_key, 0, 0)); #ifndef FN_NO_CASE_SENCE - VOID(hash_init(&tables,def_table_hash_size, 0, 0, + VOID(hash_init(&tables,system_charset_info,def_table_hash_size, 0, 0, query_cache_table_get_key, 0, 0)); #else // windows, OS/2 or other case insensitive file names work around - VOID(hash_init(&tables,def_table_hash_size, 0, 0, + VOID(hash_init(&tables,system_charset_info,def_table_hash_size, 0, 0, query_cache_table_get_key, 0, - (lower_case_table_names?0:HASH_CASE_INSENSITIVE))); + (lower_case_table_names?0:HASH_CASE_INSENSITIVE))); #endif queries_in_cache = 0; -- cgit v1.2.1 From afea355bc6e1cd4e826d707d7d03c3422c1ce479 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 14 Oct 2002 19:50:42 +0500 Subject: DEBUG_PRINT() has been fixed --- heap/_check.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/heap/_check.c b/heap/_check.c index 3b2fc9afad9..fcc40a5413d 100644 --- a/heap/_check.c +++ b/heap/_check.c @@ -117,7 +117,7 @@ static int check_one_rb_key(HP_INFO *info, uint keynr, ulong records, { error= 1; DBUG_PRINT("error",("Record in wrong link: Link %d Record: %lx\n", - link, recpos)); + key, recpos)); } else { @@ -130,7 +130,7 @@ static int check_one_rb_key(HP_INFO *info, uint keynr, ulong records, } if (found != records) { - DBUG_PRINT("error",("Found %ld of %ld records")); + DBUG_PRINT("error",("Found %ld of %ld records", found, records)); error= 1; } if (print_status) -- cgit v1.2.1 From 060626bee9ee86bb195a0ddb7eb80c3837f36956 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 14 Oct 2002 17:55:21 +0300 Subject: fix 4.1 build --- BUILD/FINISH.sh | 3 ++- configure.in | 2 +- mysys/Makefile.am | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/BUILD/FINISH.sh b/BUILD/FINISH.sh index 82f31a14dc4..4e30024985b 100644 --- a/BUILD/FINISH.sh +++ b/BUILD/FINISH.sh @@ -14,7 +14,8 @@ $make -k clean || true /bin/rm -f */.deps/*.P config.cache innobase/config.cache bdb/build_unix/config.cache aclocal && autoheader && aclocal && automake && autoconf -(cd bdb/dist && sh s_all) +# TODO: remove when DBD will be OK +#(cd bdb/dist && sh s_all) (cd innobase && aclocal && autoheader && aclocal && automake && autoconf) if [ -d gemini ] then diff --git a/configure.in b/configure.in index d961e3d5df6..e2788a39eb9 100644 --- a/configure.in +++ b/configure.in @@ -2368,7 +2368,7 @@ AC_OUTPUT(Makefile extra/Makefile mysys/Makefile isam/Makefile \ os2/Makefile os2/include/Makefile os2/include/sys/Makefile \ man/Makefile BUILD/Makefile readline/Makefile vio/Makefile \ libmysql_r/Makefile libmysqld/Makefile libmysqld/examples/Makefile \ - libmysql/Makefile client/Makefile os2/Makefile \ + libmysql/Makefile client/Makefile \ pstack/Makefile pstack/aout/Makefile sql/Makefile sql/share/Makefile \ merge/Makefile dbug/Makefile scripts/Makefile \ include/Makefile sql-bench/Makefile tools/Makefile \ diff --git a/mysys/Makefile.am b/mysys/Makefile.am index 8690e9527a1..5c0a531c37c 100644 --- a/mysys/Makefile.am +++ b/mysys/Makefile.am @@ -105,7 +105,7 @@ test_dir: test_dir.c $(LIBRARIES) test_charset$(EXEEXT): test_charset.c $(LIBRARIES) $(LINK) $(FLAGS) -DMAIN $(srcdir)/test_charset.c $(LDADD) $(LIBS) -charset2html: charset2html.c $(LIBRARIES) +charset2html$(EXEEXT): charset2html.c $(LIBRARIES) $(LINK) $(FLAGS) -DMAIN $(srcdir)/charset2html.c $(LDADD) $(LIBS) testhash: testhash.c $(LIBRARIES) -- cgit v1.2.1 From 5dcaaf4e04f19f9dc6a4ae4e1ef9746a3ff3cf6b Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 14 Oct 2002 22:41:42 +0300 Subject: removed annecessary assignment found by Monty --- sql/item_subselect.cc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index de9c7e11313..456ce5f22ba 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -152,9 +152,7 @@ String *Item_singleval_subselect::val_str (String *str) assign_null(); return 0; } - // Assign temporary buffer with stored value - str_value.set(string_value, 0, string_value.length()); - return &str_value; + return &string_value; } Item_exists_subselect::Item_exists_subselect(THD *thd, -- cgit v1.2.1 From aee5ef8516ce0599402ca8e8a6b72f3eca36739b Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 16 Oct 2002 17:21:47 +0300 Subject: Added THD as parameter to filesort. Removed not used 'special' argument. sql/mysql_priv.h: Fix for changed parameters to filesort sql/sql_delete.cc: Fix for changed parameters to filesort sql/sql_select.cc: Fix for changed parameters to filesort sql/sql_table.cc: Fix for changed parameters to filesort sql/sql_test.cc: Removed not used special parameter sql/sql_update.cc: Fix for changed parameters to filesort --- sql/filesort.cc | 29 +++++++---------------------- sql/mysql_priv.h | 8 ++++---- sql/sql_delete.cc | 4 ++-- sql/sql_select.cc | 19 ++++++++++--------- sql/sql_table.cc | 4 ++-- sql/sql_test.cc | 4 +--- sql/sql_update.cc | 4 ++-- 7 files changed, 28 insertions(+), 44 deletions(-) diff --git a/sql/filesort.cc b/sql/filesort.cc index 81629684a87..e1c673aca0b 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -63,24 +63,21 @@ static uint sortlength(SORT_FIELD *sortorder,uint length); table->record_pointers */ -ha_rows filesort(TABLE *table, SORT_FIELD *sortorder, uint s_length, - SQL_SELECT *select, ha_rows special, ha_rows max_rows, - ha_rows *examined_rows) +ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length, + SQL_SELECT *select, ha_rows max_rows, ha_rows *examined_rows) { int error; ulong memavl; uint maxbuffer; + uint i; BUFFPEK *buffpek; ha_rows records; uchar **sort_keys; IO_CACHE tempfile, buffpek_pointers, *selected_records_file, *outfile; SORTPARAM param; - THD *thd= current_thd; - - DBUG_ENTER("filesort"); - DBUG_EXECUTE("info",TEST_filesort(sortorder,s_length,special);); CHARSET_INFO *charset=table->table_charset; - uint i; + DBUG_ENTER("filesort"); + DBUG_EXECUTE("info",TEST_filesort(sortorder,s_length);); #ifdef SKIP_DBUG_IN_FILESORT DBUG_PUSH(""); /* No DBUG here */ #endif @@ -111,27 +108,15 @@ ha_rows filesort(TABLE *table, SORT_FIELD *sortorder, uint s_length, { statistic_increment(filesort_scan_count, &LOCK_status); } - if (select && my_b_inited(&select->file)) - { - records=special=select->records; /* purecov: deadcode */ - selected_records_file= &select->file; /* purecov: deadcode */ - reinit_io_cache(selected_records_file,READ_CACHE,0L,0,0); /* purecov: deadcode */ - } - else if (special) - { - records=special; /* purecov: deadcode */ - selected_records_file= outfile; /* purecov: deadcode */ - reinit_io_cache(selected_records_file,READ_CACHE,0L,0,0); /* purecov: deadcode */ - } #ifdef CAN_TRUST_RANGE - else if (select && select->quick && select->quick->records > 0L) + if (select && select->quick && select->quick->records > 0L) { records=min((ha_rows) (select->quick->records*2+EXTRA_RECORDS*2), table->file->records)+EXTRA_RECORDS; selected_records_file=0; } -#endif else +#endif { records=table->file->estimate_number_of_rows(); selected_records_file= 0; diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index d8281af6bd1..6b8c4fd1f14 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -611,7 +611,7 @@ pthread_handler_decl(handle_manager, arg); #ifndef DBUG_OFF void print_where(COND *cond,const char *info); void print_cached_tables(void); -void TEST_filesort(SORT_FIELD *sortorder,uint s_length, ha_rows special); +void TEST_filesort(SORT_FIELD *sortorder,uint s_length); #endif void mysql_print_status(THD *thd); /* key.cc */ @@ -792,9 +792,9 @@ void init_read_record(READ_RECORD *info, THD *thd, TABLE *reg_form, SQL_SELECT *select, int use_record_cache, bool print_errors); void end_read_record(READ_RECORD *info); -ha_rows filesort(TABLE *form,struct st_sort_field *sortorder, uint s_length, - SQL_SELECT *select, ha_rows special,ha_rows max_rows, - ha_rows *examined_rows); +ha_rows filesort(THD *thd, TABLE *form,struct st_sort_field *sortorder, + uint s_length, SQL_SELECT *select, + ha_rows max_rows, ha_rows *examined_rows); void change_double_for_sort(double nr,byte *to); int get_quick_record(SQL_SELECT *select); int calc_weekday(long daynr,bool sunday_first_day_of_week); diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index 686fee0abe6..cb1a9db70cd 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -117,8 +117,8 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order, MYF(MY_FAE | MY_ZEROFILL)); if (setup_order(thd, &tables, fields, all_fields, order) || !(sortorder=make_unireg_sortorder(order, &length)) || - (table->found_records = filesort(table, sortorder, length, - (SQL_SELECT *) 0, 0L, HA_POS_ERROR, + (table->found_records = filesort(thd, table, sortorder, length, + (SQL_SELECT *) 0, HA_POS_ERROR, &examined_rows)) == HA_POS_ERROR) { diff --git a/sql/sql_select.cc b/sql/sql_select.cc index c120dc9d16f..399bbbb5e66 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -112,7 +112,8 @@ static Item* part_of_refkey(TABLE *form,Field *field); static uint find_shortest_key(TABLE *table, key_map usable_keys); static bool test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order, ha_rows select_limit, bool no_changes); -static int create_sort_index(JOIN_TAB *tab,ORDER *order,ha_rows select_limit); +static int create_sort_index(THD *thd, JOIN_TAB *tab,ORDER *order, + ha_rows select_limit); static int remove_duplicates(JOIN *join,TABLE *entry,List &fields, Item *having); static int remove_dup_with_compare(THD *thd, TABLE *entry, Field **field, @@ -748,7 +749,7 @@ JOIN::exec() { DBUG_PRINT("info",("Sorting for group")); thd->proc_info="Sorting for group"; - if (create_sort_index(&join_tab[const_tables], group_list, + if (create_sort_index(thd, &join_tab[const_tables], group_list, HA_POS_ERROR) || make_sum_func_list(this, all_fields) || alloc_group_fields(this, group_list)) @@ -763,7 +764,7 @@ JOIN::exec() { DBUG_PRINT("info",("Sorting for order")); thd->proc_info="Sorting for order"; - if (create_sort_index(&join_tab[const_tables], order, + if (create_sort_index(thd, &join_tab[const_tables], order, HA_POS_ERROR)) DBUG_VOID_RETURN; order=0; @@ -866,7 +867,7 @@ JOIN::exec() if (group_list) { thd->proc_info="Creating sort index"; - if (create_sort_index(join_tab, group_list, HA_POS_ERROR) || + if (create_sort_index(thd, join_tab, group_list, HA_POS_ERROR) || alloc_group_fields(this, group_list)) { free_tmp_table(thd,tmp_table2); /* purecov: inspected */ @@ -962,7 +963,7 @@ JOIN::exec() DBUG_EXECUTE("where",print_where(conds,"having after sort");); } } - if (create_sort_index(&join_tab[const_tables], + if (create_sort_index(thd, &join_tab[const_tables], group_list ? group_list : order, (having_list || group_list || (select_options & OPTION_FOUND_ROWS)) ? @@ -5795,7 +5796,7 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit, *****************************************************************************/ static int -create_sort_index(JOIN_TAB *tab,ORDER *order,ha_rows select_limit) +create_sort_index(THD *thd, JOIN_TAB *tab,ORDER *order,ha_rows select_limit) { SORT_FIELD *sortorder; uint length; @@ -5839,8 +5840,8 @@ create_sort_index(JOIN_TAB *tab,ORDER *order,ha_rows select_limit) } if (table->tmp_table) table->file->info(HA_STATUS_VARIABLE); // Get record count - table->found_records=filesort(table,sortorder,length, - select, 0L, select_limit, &examined_rows); + table->found_records=filesort(thd, table,sortorder, length, + select, select_limit, &examined_rows); tab->records=table->found_records; // For SQL_CALC_ROWS delete select; // filesort did select tab->select=0; @@ -5938,7 +5939,7 @@ remove_duplicates(JOIN *join, TABLE *entry,List &fields, Item *having) int error; ulong reclength,offset; uint field_count; - THD *thd= current_thd; + THD *thd= join->thd; DBUG_ENTER("remove_duplicates"); entry->reginfo.lock_type=TL_WRITE; diff --git a/sql/sql_table.cc b/sql/sql_table.cc index a71f555cdd7..bff07809861 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -2099,8 +2099,8 @@ copy_data_between_tables(TABLE *from,TABLE *to, if (setup_order(thd, &tables, fields, all_fields, order) || !(sortorder=make_unireg_sortorder(order, &length)) || - (from->found_records = filesort(from, sortorder, length, - (SQL_SELECT *) 0, 0L, HA_POS_ERROR, + (from->found_records = filesort(thd, from, sortorder, length, + (SQL_SELECT *) 0, HA_POS_ERROR, &examined_rows)) == HA_POS_ERROR) goto err; diff --git a/sql/sql_test.cc b/sql/sql_test.cc index ef26a1f45fe..538417f43ea 100644 --- a/sql/sql_test.cc +++ b/sql/sql_test.cc @@ -97,7 +97,7 @@ void print_cached_tables(void) } -void TEST_filesort(SORT_FIELD *sortorder,uint s_length, ha_rows special) +void TEST_filesort(SORT_FIELD *sortorder,uint s_length) { char buff[256],buff2[256]; String str(buff,sizeof(buff),default_charset_info); @@ -131,8 +131,6 @@ void TEST_filesort(SORT_FIELD *sortorder,uint s_length, ha_rows special) out.append('\0'); // Purify doesn't like c_ptr() DBUG_LOCK_FILE; VOID(fputs("\nInfo about FILESORT\n",DBUG_FILE)); - if (special) - fprintf(DBUG_FILE,"Records to sort: %ld\n",special); fprintf(DBUG_FILE,"Sortorder: %s\n",out.ptr()); DBUG_UNLOCK_FILE; DBUG_VOID_RETURN; diff --git a/sql/sql_update.cc b/sql/sql_update.cc index f530c87dd61..c146b07284f 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -190,8 +190,8 @@ int mysql_update(THD *thd, MYF(MY_FAE | MY_ZEROFILL)); if (setup_order(thd, &tables, fields, all_fields, order) || !(sortorder=make_unireg_sortorder(order, &length)) || - (table->found_records = filesort(table, sortorder, length, - (SQL_SELECT *) 0, 0L, + (table->found_records = filesort(thd, table, sortorder, length, + (SQL_SELECT *) 0, HA_POS_ERROR, &examined_rows)) == HA_POS_ERROR) { -- cgit v1.2.1