diff options
author | Alexander Barkov <bar@mysql.com> | 2009-10-15 15:17:32 +0500 |
---|---|---|
committer | Alexander Barkov <bar@mysql.com> | 2009-10-15 15:17:32 +0500 |
commit | 3929dddcd76130529cabfbd68cfff024e6b5c80d (patch) | |
tree | 7f2c2690a6c4b4439750de17315dbc10dec56617 /sql | |
parent | 4def52165d3724080793a752f244e56aea3aecc0 (diff) | |
download | mariadb-git-3929dddcd76130529cabfbd68cfff024e6b5c80d.tar.gz |
Backporting WL#4164 Two-byte collation IDs
Diffstat (limited to 'sql')
-rw-r--r-- | sql/sql_show.cc | 23 | ||||
-rw-r--r-- | sql/table.cc | 20 | ||||
-rw-r--r-- | sql/unireg.cc | 11 |
3 files changed, 37 insertions, 17 deletions
diff --git a/sql/sql_show.cc b/sql/sql_show.cc index b16f050dea6..074106dcc44 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -3899,7 +3899,9 @@ int fill_schema_charsets(THD *thd, TABLE_LIST *tables, COND *cond) TABLE *table= tables->table; CHARSET_INFO *scs= system_charset_info; - for (cs= all_charsets ; cs < all_charsets+255 ; cs++) + for (cs= all_charsets ; + cs < all_charsets + array_elements(all_charsets) ; + cs++) { CHARSET_INFO *tmp_cs= cs[0]; if (tmp_cs && (tmp_cs->state & MY_CS_PRIMARY) && @@ -4004,7 +4006,9 @@ int fill_schema_collation(THD *thd, TABLE_LIST *tables, COND *cond) const char *wild= thd->lex->wild ? thd->lex->wild->ptr() : NullS; TABLE *table= tables->table; CHARSET_INFO *scs= system_charset_info; - for (cs= all_charsets ; cs < all_charsets+255 ; cs++ ) + for (cs= all_charsets ; + cs < all_charsets + array_elements(all_charsets) ; + cs++ ) { CHARSET_INFO **cl; CHARSET_INFO *tmp_cs= cs[0]; @@ -4012,7 +4016,9 @@ int fill_schema_collation(THD *thd, TABLE_LIST *tables, COND *cond) (tmp_cs->state & MY_CS_HIDDEN) || !(tmp_cs->state & MY_CS_PRIMARY)) continue; - for (cl= all_charsets; cl < all_charsets+255 ;cl ++) + for (cl= all_charsets; + cl < all_charsets + array_elements(all_charsets) ; + cl ++) { CHARSET_INFO *tmp_cl= cl[0]; if (!tmp_cl || !(tmp_cl->state & MY_CS_AVAILABLE) || @@ -4045,17 +4051,22 @@ int fill_schema_coll_charset_app(THD *thd, TABLE_LIST *tables, COND *cond) CHARSET_INFO **cs; TABLE *table= tables->table; CHARSET_INFO *scs= system_charset_info; - for (cs= all_charsets ; cs < all_charsets+255 ; cs++ ) + for (cs= all_charsets ; + cs < all_charsets + array_elements(all_charsets) ; + cs++ ) { CHARSET_INFO **cl; CHARSET_INFO *tmp_cs= cs[0]; if (!tmp_cs || !(tmp_cs->state & MY_CS_AVAILABLE) || !(tmp_cs->state & MY_CS_PRIMARY)) continue; - for (cl= all_charsets; cl < all_charsets+255 ;cl ++) + for (cl= all_charsets; + cl < all_charsets + array_elements(all_charsets) ; + cl ++) { CHARSET_INFO *tmp_cl= cl[0]; - if (!tmp_cl || !(tmp_cl->state & MY_CS_AVAILABLE) || + if (!tmp_cl || !(tmp_cl->state & MY_CS_AVAILABLE) || + (tmp_cl->state & MY_CS_HIDDEN) || !my_charset_same(tmp_cs,tmp_cl)) continue; restore_record(table, s->default_values); diff --git a/sql/table.cc b/sql/table.cc index d71a3ecd9bb..65d46eade8c 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -725,7 +725,8 @@ static int open_binary_frm(THD *thd, TABLE_SHARE *share, uchar *head, { share->avg_row_length= uint4korr(head+34); share->row_type= (row_type) head[40]; - share->table_charset= get_charset((uint) head[38],MYF(0)); + share->table_charset= get_charset((((uint) head[41]) << 8) + + (uint) head[38],MYF(0)); share->null_field_first= 1; } if (!share->table_charset) @@ -1184,12 +1185,13 @@ static int open_binary_frm(THD *thd, TABLE_SHARE *share, uchar *head, } else { - if (!strpos[14]) + uint csid= strpos[14] + (((uint) strpos[11]) << 8); + if (!csid) charset= &my_charset_bin; - else if (!(charset=get_charset((uint) strpos[14], MYF(0)))) + else if (!(charset= get_charset(csid, MYF(0)))) { error= 5; // Unknown or unavailable charset - errarg= (int) strpos[14]; + errarg= (int) csid; goto err; } } @@ -2457,8 +2459,7 @@ File create_frm(THD *thd, const char *name, const char *db, if ((file= my_create(name, CREATE_MODE, create_flags, MYF(0))) >= 0) { - uint key_length, tmp_key_length; - uint tmp; + uint key_length, tmp_key_length, tmp, csid; bzero((char*) fileinfo,64); /* header */ fileinfo[0]=(uchar) 254; @@ -2498,8 +2499,9 @@ File create_frm(THD *thd, const char *name, const char *db, fileinfo[32]=0; // No filename anymore fileinfo[33]=5; // Mark for 5.0 frm file int4store(fileinfo+34,create_info->avg_row_length); - fileinfo[38]= (create_info->default_table_charset ? - create_info->default_table_charset->number : 0); + csid= (create_info->default_table_charset ? + create_info->default_table_charset->number : 0); + fileinfo[38]= (uchar) csid; /* In future versions, we will store in fileinfo[39] the values of the TRANSACTIONAL and PAGE_CHECKSUM clauses of CREATE TABLE. @@ -2507,7 +2509,7 @@ File create_frm(THD *thd, const char *name, const char *db, fileinfo[39]= 0; fileinfo[40]= (uchar) create_info->row_type; /* Next few bytes where for RAID support */ - fileinfo[41]= 0; + fileinfo[41]= (uchar) (csid >> 8); fileinfo[42]= 0; fileinfo[43]= 0; fileinfo[44]= 0; diff --git a/sql/unireg.cc b/sql/unireg.cc index 18b0786190a..f08c64a3182 100644 --- a/sql/unireg.cc +++ b/sql/unireg.cc @@ -801,20 +801,27 @@ static bool pack_fields(File file, List<Create_field> &create_fields, recpos= field->offset+1 + (uint) data_offset; int3store(buff+5,recpos); int2store(buff+8,field->pack_flag); - int2store(buff+10,field->unireg_check); + DBUG_ASSERT(field->unireg_check < 256); + buff[10]= (uchar) field->unireg_check; buff[12]= (uchar) field->interval_id; buff[13]= (uchar) field->sql_type; if (field->sql_type == MYSQL_TYPE_GEOMETRY) { + buff[11]= 0; buff[14]= (uchar) field->geom_type; #ifndef HAVE_SPATIAL DBUG_ASSERT(0); // Should newer happen #endif } else if (field->charset) + { + buff[11]= (uchar) (field->charset->number >> 8); buff[14]= (uchar) field->charset->number; + } else - buff[14]= 0; // Numerical + { + buff[11]= buff[14]= 0; // Numerical + } int2store(buff+15, field->comment.length); comment_length+= field->comment.length; set_if_bigger(int_count,field->interval_id); |