Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
fce88226
Commit
fce88226
authored
Jun 27, 2002
by
unknown
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ALTER DATABASE DEFAULT CHARACTER SET latin1;
parent
0d354e47
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
195 additions
and
79 deletions
+195
-79
sql/mysql_priv.h
sql/mysql_priv.h
+2
-1
sql/sql_db.cc
sql/sql_db.cc
+158
-69
sql/sql_lex.h
sql/sql_lex.h
+2
-1
sql/sql_parse.cc
sql/sql_parse.cc
+17
-0
sql/sql_yacc.yy
sql/sql_yacc.yy
+16
-8
No files found.
sql/mysql_priv.h
View file @
fce88226
...
...
@@ -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
);
...
...
sql/sql_db.cc
View file @
fce88226
...
...
@@ -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
;
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 @@ 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 @@ int mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create_info, bool silent
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
;
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
);
}
sql/sql_lex.h
View file @
fce88226
...
...
@@ -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
,
...
...
sql/sql_parse.cc
View file @
fce88226
...
...
@@ -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
;
...
...
sql/sql_yacc.yy
View file @
fce88226
...
...
@@ -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;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment