summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.bzrignore1
-rw-r--r--sql/sql_class.cc1
-rw-r--r--sql/sql_class.h3
-rw-r--r--sql/sql_db.cc45
-rw-r--r--sql/sql_table.cc4
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 <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 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)