Below is the list of changes that have just been committed into a
4.1 repository of bar. When bar 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
ChangeSet
1.1291 02/06/27 14:41:02 bar@xxxxxxxxxxxxxxxxxxxxxx +5 -0
ALTER DATABASE DEFAULT CHARACTER SET latin1;
sql/sql_yacc.yy
1.175 02/06/27 14:40:59 bar@xxxxxxxxxxxxxxxxxxxxxx +16 -8
ALTER DATABASE DEFAULT CHARACTER SET latin1;
sql/sql_parse.cc
1.237 02/06/27 14:40:59 bar@xxxxxxxxxxxxxxxxxxxxxx +17 -0
ALTER DATABASE DEFAULT CHARACTER SET latin1;
sql/sql_lex.h
1.77 02/06/27 14:40:58 bar@xxxxxxxxxxxxxxxxxxxxxx +2 -1
ALTER DATABASE DEFAULT CHARACTER SET latin1;
sql/sql_db.cc
1.45 02/06/27 14:40:58 bar@xxxxxxxxxxxxxxxxxxxxxx +158 -69
ALTER DATABASE DEFAULT CHARACTER SET latin1;
sql/mysql_priv.h
1.162 02/06/27 14:40:58 bar@xxxxxxxxxxxxxxxxxxxxxx +2 -1
ALTER DATABASE DEFAULT CHARACTER SET latin1;
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: bar
# Host: gw.udmsearch.izhnet.ru
# Root: /usr/home/bar/mysql-4.1
--- 1.161/sql/mysql_priv.h Fri Jun 21 16:55:51 2002
+++ 1.162/sql/mysql_priv.h Thu Jun 27 14:40:58 2002
@@ -289,7 +289,8 @@
#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);
--- 1.44/sql/sql_db.cc Mon Jun 24 21:50:04 2002
+++ 1.45/sql/sql_db.cc Thu Jun 27 14:40:58 2002
@@ -31,6 +31,96 @@
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; 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));
+ }
+ 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 @@
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 @@
}
}
- /*
- 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 @@
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 @@
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 @@
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; 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));
- }
DBUG_RETURN(0);
}
--- 1.76/sql/sql_lex.h Thu Jun 13 02:07:44 2002
+++ 1.77/sql/sql_lex.h Thu Jun 27 14:40:58 2002
@@ -44,7 +44,8 @@
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,
--- 1.236/sql/sql_parse.cc Fri Jun 21 16:55:51 2002
+++ 1.237/sql/sql_parse.cc Thu Jun 27 14:40:59 2002
@@ -2328,6 +2328,23 @@
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;
--- 1.174/sql/sql_yacc.yy Fri Jun 21 16:55:51 2002
+++ 1.175/sql/sql_yacc.yy Thu Jun 27 14:40:59 2002
@@ -885,12 +885,7 @@
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_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 @@
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 @@
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;
---------------------------------------------------------------------
Before posting, please check:
http://www.mysql.com/manual.php (the manual)
http://lists.mysql.com/ (the list archive)
To request this thread, e-mail internals-thread3969@xxxxxxxxxxxxxxx
To unsubscribe, e-mail <internals-unsubscribe@xxxxxxxxxxxxxxx>
|