diff --git a/.bzrignore b/.bzrignore index 4683dcd2fb74c069c41a37901d10f21cfac91edb..3b9576a47f0feb500bdc68ce6d12091828f4acc6 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 7a1ac4728daeceee442dffa86105d0da6c7b3ef1..c8914702ae79e44c9c03dd1bfe96fd38072a6c7d 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 37eb366e21fdd53deef12fd5e674c221d270a8a9..9b708e35a1e2aeba1e89a091ea61f11873a8f5bc 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 5275403db40bf53c006d8b2506b204973df66b09..91f7474bb3308aafb60b03130602b53701d3018e 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -25,6 +25,8 @@ #include <direct.h> #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; ln<pe; ) + { + char *le,*val; + for ( le=ln, val=0 ; le<pe ; le++ ) + { + switch(le[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]) + { + thd->db_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 3a6ff3d6b16c8f6d5d5e394c784f2242a32da8b1..d8012c0c1021269fff774ebb4f1bff7c2ac66993 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)