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
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
a58c0e7d
Commit
a58c0e7d
authored
Aug 21, 2005
by
jonas@eel.(none)
Browse files
Options
Browse Files
Download
Plain Diff
Merge joreland@bk-internal.mysql.com:/home/bk/mysql-4.1
into eel.(none):/home/jonas/src/mysql-4.1-push
parents
3aede000
d9e3ad09
Changes
22
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
1316 additions
and
43 deletions
+1316
-43
.bzrignore
.bzrignore
+2
-0
heap/hp_delete.c
heap/hp_delete.c
+1
-1
include/my_sys.h
include/my_sys.h
+0
-1
mysql-test/r/ctype_cp932.result
mysql-test/r/ctype_cp932.result
+17
-0
mysql-test/r/distinct.result
mysql-test/r/distinct.result
+40
-0
mysql-test/r/rpl_drop_db.result
mysql-test/r/rpl_drop_db.result
+1035
-0
mysql-test/r/rpl_insert_select.result
mysql-test/r/rpl_insert_select.result
+17
-0
mysql-test/t/ctype_cp932.test
mysql-test/t/ctype_cp932.test
+22
-0
mysql-test/t/distinct.test
mysql-test/t/distinct.test
+17
-0
mysql-test/t/rpl_drop_db.test
mysql-test/t/rpl_drop_db.test
+52
-0
mysql-test/t/rpl_insert_select.test
mysql-test/t/rpl_insert_select.test
+19
-0
mysys/charset.c
mysys/charset.c
+0
-18
sql/item.cc
sql/item.cc
+7
-8
sql/item.h
sql/item.h
+2
-1
sql/log_event.cc
sql/log_event.cc
+1
-1
sql/log_event.h
sql/log_event.h
+1
-1
sql/mysqld.cc
sql/mysqld.cc
+1
-1
sql/sql_db.cc
sql/sql_db.cc
+69
-5
sql/sql_prepare.cc
sql/sql_prepare.cc
+6
-3
sql/sql_select.cc
sql/sql_select.cc
+1
-3
sql/sql_table.cc
sql/sql_table.cc
+3
-0
sql/table.h
sql/table.h
+3
-0
No files found.
.bzrignore
View file @
a58c0e7d
...
@@ -1054,3 +1054,5 @@ vio/test-sslclient
...
@@ -1054,3 +1054,5 @@ vio/test-sslclient
vio/test-sslserver
vio/test-sslserver
vio/viotest-ssl
vio/viotest-ssl
ndb/tools/ndb_config
ndb/tools/ndb_config
support-files/MacOSX/postflight
support-files/MacOSX/preflight
heap/hp_delete.c
View file @
a58c0e7d
...
@@ -80,7 +80,7 @@ int hp_rb_delete_key(HP_INFO *info, register HP_KEYDEF *keyinfo,
...
@@ -80,7 +80,7 @@ int hp_rb_delete_key(HP_INFO *info, register HP_KEYDEF *keyinfo,
custom_arg
.
search_flag
=
SEARCH_SAME
;
custom_arg
.
search_flag
=
SEARCH_SAME
;
old_allocated
=
keyinfo
->
rb_tree
.
allocated
;
old_allocated
=
keyinfo
->
rb_tree
.
allocated
;
res
=
tree_delete
(
&
keyinfo
->
rb_tree
,
info
->
recbuf
,
&
custom_arg
);
res
=
tree_delete
(
&
keyinfo
->
rb_tree
,
info
->
recbuf
,
&
custom_arg
);
info
->
s
->
index_length
+=
(
keyinfo
->
rb_tree
.
allocated
-
old_
allocated
);
info
->
s
->
index_length
-=
(
old_allocated
-
keyinfo
->
rb_tree
.
allocated
);
return
res
;
return
res
;
}
}
...
...
include/my_sys.h
View file @
a58c0e7d
...
@@ -788,7 +788,6 @@ extern my_bool init_compiled_charsets(myf flags);
...
@@ -788,7 +788,6 @@ extern my_bool init_compiled_charsets(myf flags);
extern
void
add_compiled_collation
(
CHARSET_INFO
*
cs
);
extern
void
add_compiled_collation
(
CHARSET_INFO
*
cs
);
extern
ulong
escape_string_for_mysql
(
CHARSET_INFO
*
charset_info
,
char
*
to
,
extern
ulong
escape_string_for_mysql
(
CHARSET_INFO
*
charset_info
,
char
*
to
,
const
char
*
from
,
ulong
length
);
const
char
*
from
,
ulong
length
);
extern
char
*
bare_str_to_hex
(
char
*
to
,
const
char
*
from
,
uint
len
);
#ifdef __WIN__
#ifdef __WIN__
#define BACKSLASH_MBTAIL
#define BACKSLASH_MBTAIL
/* File system character set */
/* File system character set */
...
...
mysql-test/r/ctype_cp932.result
View file @
a58c0e7d
...
@@ -8576,6 +8576,23 @@ FC4B
...
@@ -8576,6 +8576,23 @@ FC4B
DROP TABLE t1;
DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t2;
DROP TABLE t3;
DROP TABLE t3;
RESET MASTER;
CREATE TABLE t1(f1 blob);
PREPARE stmt1 FROM 'INSERT INTO t1 VALUES(?)';
SET @var1= x'8300';
EXECUTE stmt1 USING @var1;
SHOW BINLOG EVENTS;
Log_name Pos Event_type Server_id Orig_log_pos Info
master-bin.000001 # Start 1 # Server ver: 4.1.15-debug-log, Binlog ver: 3
master-bin.000001 # Query 1 # use `test`; SET ONE_SHOT CHARACTER_SET_CLIENT=95,COLLATION_CONNECTION=95,COLLATION_DATABASE=95,COLLATION_SERVER=8
master-bin.000001 # Query 1 # use `test`; CREATE TABLE t1(f1 blob)
master-bin.000001 # Query 1 # use `test`; SET ONE_SHOT CHARACTER_SET_CLIENT=95,COLLATION_CONNECTION=95,COLLATION_DATABASE=95,COLLATION_SERVER=8
master-bin.000001 # User var 1 # @`var1`=_binary 0x8300 COLLATE binary
master-bin.000001 # Query 1 # use `test`; INSERT INTO t1 VALUES(@'var1')
SELECT HEX(f1) FROM t1;
HEX(f1)
8300
DROP table t1;
SET collation_connection='cp932_japanese_ci';
SET collation_connection='cp932_japanese_ci';
create table t1 select repeat('a',4000) a;
create table t1 select repeat('a',4000) a;
delete from t1;
delete from t1;
...
...
mysql-test/r/distinct.result
View file @
a58c0e7d
...
@@ -464,3 +464,43 @@ SELECT DISTINCT html,SUM(out)/(SUM(rin)+1) as 'prod' FROM t1 GROUP BY rin;
...
@@ -464,3 +464,43 @@ SELECT DISTINCT html,SUM(out)/(SUM(rin)+1) as 'prod' FROM t1 GROUP BY rin;
html prod
html prod
1 0.00
1 0.00
drop table t1;
drop table t1;
CREATE TABLE t1 (a int);
INSERT INTO t1 VALUES (1),(2),(3),(4),(5);
SELECT DISTINCT a, 1 FROM t1;
a 1
1 1
2 1
3 1
4 1
5 1
SELECT DISTINCT 1, a FROM t1;
1 a
1 1
1 2
1 3
1 4
1 5
CREATE TABLE t2 (a int, b int);
INSERT INTO t2 VALUES (1,1),(2,2),(2,3),(2,4),(3,5);
SELECT DISTINCT a, b, 2 FROM t2;
a b 2
1 1 2
2 2 2
2 3 2
2 4 2
3 5 2
SELECT DISTINCT 2, a, b FROM t2;
2 a b
2 1 1
2 2 2
2 2 3
2 2 4
2 3 5
SELECT DISTINCT a, 2, b FROM t2;
a 2 b
1 2 1
2 2 2
2 2 3
2 2 4
3 2 5
DROP TABLE t1,t2;
mysql-test/r/rpl_drop_db.result
0 → 100644
View file @
a58c0e7d
This diff is collapsed.
Click to expand it.
mysql-test/r/rpl_insert_select.result
0 → 100644
View file @
a58c0e7d
stop slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
create table t1 (n int not null primary key);
insert into t1 values (1);
create table t2 (n int);
insert into t2 values (1);
insert ignore into t1 select * from t2;
insert into t1 values (2);
select * from t1;
n
1
2
drop table t1,t2;
mysql-test/t/ctype_cp932.test
View file @
a58c0e7d
...
@@ -401,6 +401,28 @@ DROP TABLE t2;
...
@@ -401,6 +401,28 @@ DROP TABLE t2;
DROP
TABLE
t3
;
DROP
TABLE
t3
;
#DROP TABLE t4;
#DROP TABLE t4;
# Test prepared statement with 0x8300 sequence in parameter while
# running with cp932 client character set.
RESET
MASTER
;
CREATE
TABLE
t1
(
f1
blob
);
PREPARE
stmt1
FROM
'INSERT INTO t1 VALUES(?)'
;
SET
@
var1
=
x
'8300'
;
# TODO: Note that this doesn't actually test the code which was added for
# bug#11338 because this syntax for prepared statements causes the PS to
# be replicated differently than if we executed the PS from C or Java.
# Using this syntax, variable names are inserted into the binlog instead
# of values. The real goal of this test is to check the code that was
# added to Item_param::query_val_str() in order to do hex encoding of
# PS parameters when the client character set is cp932;
# Bug#11338 has an example java program which can be used to verify this
# code (and I have used it to test the fix) until there is some way to
# exercise this code from mysql-test-run.
EXECUTE
stmt1
USING
@
var1
;
--
replace_column
2
# 5 #
SHOW
BINLOG
EVENTS
;
SELECT
HEX
(
f1
)
FROM
t1
;
DROP
table
t1
;
# end test for bug#11338
SET
collation_connection
=
'cp932_japanese_ci'
;
SET
collation_connection
=
'cp932_japanese_ci'
;
--
source
include
/
ctype_filesort
.
inc
--
source
include
/
ctype_filesort
.
inc
...
...
mysql-test/t/distinct.test
View file @
a58c0e7d
...
@@ -333,4 +333,21 @@ INSERT INTO t1 VALUES ('1',1,0);
...
@@ -333,4 +333,21 @@ INSERT INTO t1 VALUES ('1',1,0);
SELECT
DISTINCT
html
,
SUM
(
out
)
/
(
SUM
(
rin
)
+
1
)
as
'prod'
FROM
t1
GROUP
BY
rin
;
SELECT
DISTINCT
html
,
SUM
(
out
)
/
(
SUM
(
rin
)
+
1
)
as
'prod'
FROM
t1
GROUP
BY
rin
;
drop
table
t1
;
drop
table
t1
;
#
# Test cases for #12625: DISTINCT for a list with constants
#
CREATE
TABLE
t1
(
a
int
);
INSERT
INTO
t1
VALUES
(
1
),(
2
),(
3
),(
4
),(
5
);
SELECT
DISTINCT
a
,
1
FROM
t1
;
SELECT
DISTINCT
1
,
a
FROM
t1
;
CREATE
TABLE
t2
(
a
int
,
b
int
);
INSERT
INTO
t2
VALUES
(
1
,
1
),(
2
,
2
),(
2
,
3
),(
2
,
4
),(
3
,
5
);
SELECT
DISTINCT
a
,
b
,
2
FROM
t2
;
SELECT
DISTINCT
2
,
a
,
b
FROM
t2
;
SELECT
DISTINCT
a
,
2
,
b
FROM
t2
;
DROP
TABLE
t1
,
t2
;
# End of 4.1 tests
# End of 4.1 tests
mysql-test/t/rpl_drop_db.test
0 → 100644
View file @
a58c0e7d
# test case for BUG#4680 -- if there are extra files in the db directory
# dropping the db on the master causes replication problems
--
source
include
/
master
-
slave
.
inc
connection
master
;
--
disable_warnings
drop
database
if
exists
d1
;
--
enable_warnings
create
database
d1
;
create
table
d1
.
t1
(
n
int
);
insert
into
d1
.
t1
values
(
1
);
select
*
from
d1
.
t1
into
outfile
'd1/f1.txt'
;
create
table
d1
.
t2
(
n
int
);
create
table
d1
.
t3
(
n
int
);
--
error
1010
drop
database
d1
;
use
d1
;
show
tables
;
# test the branch of the code that deals with the query buffer overflow
let
$
1
=
1000
;
while
(
$
1
)
{
eval
create
table
d1
.
t
$
1
(
n
int
);
dec
$
1
;
}
--
error
1010
drop
database
d1
;
use
d1
;
show
tables
;
use
test
;
create
table
t1
(
n
int
);
insert
into
t1
values
(
1234
);
sync_slave_with_master
;
connection
slave
;
use
d1
;
show
tables
;
use
test
;
select
*
from
t1
;
connection
master
;
drop
table
t1
;
sync_slave_with_master
;
#cleanup
connection
slave
;
stop
slave
;
system
rm
-
rf
var
/
master
-
data
/
d1
;
mysql-test/t/rpl_insert_select.test
0 → 100644
View file @
a58c0e7d
# Testcase for BUG#10456 - INSERT INTO ... SELECT violating a primary key
# breaks replication
--
source
include
/
master
-
slave
.
inc
connection
master
;
create
table
t1
(
n
int
not
null
primary
key
);
insert
into
t1
values
(
1
);
create
table
t2
(
n
int
);
insert
into
t2
values
(
1
);
insert
ignore
into
t1
select
*
from
t2
;
insert
into
t1
values
(
2
);
sync_slave_with_master
;
connection
slave
;
select
*
from
t1
;
connection
master
;
drop
table
t1
,
t2
;
sync_slave_with_master
;
mysys/charset.c
View file @
a58c0e7d
...
@@ -663,21 +663,3 @@ CHARSET_INFO *fs_character_set()
...
@@ -663,21 +663,3 @@ CHARSET_INFO *fs_character_set()
return
fs_cset_cache
;
return
fs_cset_cache
;
}
}
#endif
#endif
/*
Transforms a string into hex form.
*/
char
*
bare_str_to_hex
(
char
*
to
,
const
char
*
from
,
uint
len
)
{
char
*
p
=
to
;
uint
i
;
for
(
i
=
0
;
i
<
len
;
i
++
,
p
+=
2
)
{
/* val[i] is char. Casting to uchar helps greatly if val[i] < 0 */
uint
tmp
=
(
uint
)
(
uchar
)
from
[
i
];
p
[
0
]
=
_dig_vec_upper
[
tmp
>>
4
];
p
[
1
]
=
_dig_vec_upper
[
tmp
&
15
];
}
*
p
=
0
;
return
p
;
// pointer to end 0 of 'to'
}
sql/item.cc
View file @
a58c0e7d
...
@@ -1230,7 +1230,7 @@ bool Item_param::set_from_user_var(THD *thd, const user_var_entry *entry)
...
@@ -1230,7 +1230,7 @@ bool Item_param::set_from_user_var(THD *thd, const user_var_entry *entry)
CHARSET_INFO
*
tocs
=
thd
->
variables
.
collation_connection
;
CHARSET_INFO
*
tocs
=
thd
->
variables
.
collation_connection
;
uint32
dummy_offset
;
uint32
dummy_offset
;
value
.
cs_info
.
character_set_
client
=
fromcs
;
value
.
cs_info
.
character_set_
of_placeholder
=
fromcs
;
/*
/*
Setup source and destination character sets so that they
Setup source and destination character sets so that they
are different only if conversion is necessary: this will
are different only if conversion is necessary: this will
...
@@ -1443,7 +1443,7 @@ String *Item_param::val_str(String* str)
...
@@ -1443,7 +1443,7 @@ String *Item_param::val_str(String* str)
and avoid one more memcpy/alloc between str and log string.
and avoid one more memcpy/alloc between str and log string.
*/
*/
const
String
*
Item_param
::
query_val_str
(
String
*
str
,
THD
*
thd
)
const
const
String
*
Item_param
::
query_val_str
(
String
*
str
)
const
{
{
switch
(
state
)
{
switch
(
state
)
{
case
INT_VALUE
:
case
INT_VALUE
:
...
@@ -1482,18 +1482,17 @@ const String *Item_param::query_val_str(String* str, THD *thd) const
...
@@ -1482,18 +1482,17 @@ const String *Item_param::query_val_str(String* str, THD *thd) const
buf
=
str
->
c_ptr_quick
();
buf
=
str
->
c_ptr_quick
();
ptr
=
buf
;
ptr
=
buf
;
if
(
thd
->
charset
()
->
escape_with_backslash_is_dangerous
)
if
(
value
.
cs_info
.
character_set_client
->
escape_with_backslash_is_dangerous
)
{
{
ptr
=
strmov
(
ptr
,
"x
\'
"
);
ptr
=
str_to_hex
(
ptr
,
str_value
.
ptr
(),
str_value
.
length
());
ptr
=
bare_str_to_hex
(
ptr
,
str_value
.
ptr
(),
str_value
.
length
());
}
}
else
else
{
{
*
ptr
++=
'\''
;
*
ptr
++=
'\''
;
ptr
+=
escape_string_for_mysql
(
str_value
.
charset
(),
ptr
,
ptr
+=
escape_string_for_mysql
(
str_value
.
charset
(),
ptr
,
str_value
.
ptr
(),
str_value
.
length
());
str_value
.
ptr
(),
str_value
.
length
());
}
*
ptr
++=
'\''
;
*
ptr
++=
'\''
;
}
str
->
length
(
ptr
-
buf
);
str
->
length
(
ptr
-
buf
);
break
;
break
;
}
}
...
@@ -1523,10 +1522,10 @@ bool Item_param::convert_str_value(THD *thd)
...
@@ -1523,10 +1522,10 @@ bool Item_param::convert_str_value(THD *thd)
here only if conversion is really necessary.
here only if conversion is really necessary.
*/
*/
if
(
value
.
cs_info
.
final_character_set_of_str_value
!=
if
(
value
.
cs_info
.
final_character_set_of_str_value
!=
value
.
cs_info
.
character_set_
client
)
value
.
cs_info
.
character_set_
of_placeholder
)
{
{
rc
=
thd
->
convert_string
(
&
str_value
,
rc
=
thd
->
convert_string
(
&
str_value
,
value
.
cs_info
.
character_set_
client
,
value
.
cs_info
.
character_set_
of_placeholder
,
value
.
cs_info
.
final_character_set_of_str_value
);
value
.
cs_info
.
final_character_set_of_str_value
);
}
}
else
else
...
...
sql/item.h
View file @
a58c0e7d
...
@@ -532,6 +532,7 @@ public:
...
@@ -532,6 +532,7 @@ public:
struct
CONVERSION_INFO
struct
CONVERSION_INFO
{
{
CHARSET_INFO
*
character_set_client
;
CHARSET_INFO
*
character_set_client
;
CHARSET_INFO
*
character_set_of_placeholder
;
/*
/*
This points at character set of connection if conversion
This points at character set of connection if conversion
to it is required (i. e. if placeholder typecode is not BLOB).
to it is required (i. e. if placeholder typecode is not BLOB).
...
@@ -591,7 +592,7 @@ public:
...
@@ -591,7 +592,7 @@ public:
*/
*/
void
(
*
set_param_func
)(
Item_param
*
param
,
uchar
**
pos
,
ulong
len
);
void
(
*
set_param_func
)(
Item_param
*
param
,
uchar
**
pos
,
ulong
len
);
const
String
*
query_val_str
(
String
*
str
,
THD
*
thd
)
const
;
const
String
*
query_val_str
(
String
*
str
)
const
;
bool
convert_str_value
(
THD
*
thd
);
bool
convert_str_value
(
THD
*
thd
);
...
...
sql/log_event.cc
View file @
a58c0e7d
...
@@ -207,7 +207,7 @@ static inline int read_str(char * &buf, char *buf_end, char * &str,
...
@@ -207,7 +207,7 @@ static inline int read_str(char * &buf, char *buf_end, char * &str,
/*
/*
Transforms a string into "" or its expression in 0x... form.
Transforms a string into "" or its expression in 0x... form.
*/
*/
static
char
*
str_to_hex
(
char
*
to
,
char
*
from
,
uint
len
)
char
*
str_to_hex
(
char
*
to
,
const
char
*
from
,
uint
len
)
{
{
char
*
p
=
to
;
char
*
p
=
to
;
if
(
len
)
if
(
len
)
...
...
sql/log_event.h
View file @
a58c0e7d
...
@@ -1069,5 +1069,5 @@ public:
...
@@ -1069,5 +1069,5 @@ public:
bool
is_valid
()
{
return
1
;
}
bool
is_valid
()
{
return
1
;
}
};
};
#endif
#endif
char
*
str_to_hex
(
char
*
to
,
const
char
*
from
,
uint
len
);
#endif
/* _log_event_h */
#endif
/* _log_event_h */
sql/mysqld.cc
View file @
a58c0e7d
...
@@ -4328,7 +4328,7 @@ Disable with --skip-bdb (will save memory).",
...
@@ -4328,7 +4328,7 @@ Disable with --skip-bdb (will save memory).",
(
gptr
*
)
&
default_collation_name
,
(
gptr
*
)
&
default_collation_name
,
(
gptr
*
)
&
default_collation_name
,
(
gptr
*
)
&
default_collation_name
,
0
,
GET_STR
,
REQUIRED_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
0
,
GET_STR
,
REQUIRED_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
{
"default-storage-engine"
,
OPT_STORAGE_ENGINE
,
{
"default-storage-engine"
,
OPT_STORAGE_ENGINE
,
"Set the default storage engine (table ty
o
e) for tables."
,
0
,
0
,
"Set the default storage engine (table ty
p
e) for tables."
,
0
,
0
,
0
,
GET_STR
,
REQUIRED_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
0
,
GET_STR
,
REQUIRED_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
{
"default-table-type"
,
OPT_STORAGE_ENGINE
,
{
"default-table-type"
,
OPT_STORAGE_ENGINE
,
"(deprecated) Use --default-storage-engine."
,
0
,
0
,
"(deprecated) Use --default-storage-engine."
,
0
,
0
,
...
...
sql/sql_db.cc
View file @
a58c0e7d
...
@@ -25,13 +25,19 @@
...
@@ -25,13 +25,19 @@
#include <direct.h>
#include <direct.h>
#endif
#endif
#define MAX_DROP_TABLE_Q_LEN 1024
const
char
*
del_exts
[]
=
{
".frm"
,
".BAK"
,
".TMD"
,
".opt"
,
NullS
};
const
char
*
del_exts
[]
=
{
".frm"
,
".BAK"
,
".TMD"
,
".opt"
,
NullS
};
static
TYPELIB
deletable_extentions
=
static
TYPELIB
deletable_extentions
=
{
array_elements
(
del_exts
)
-
1
,
"del_exts"
,
del_exts
,
NULL
};
{
array_elements
(
del_exts
)
-
1
,
"del_exts"
,
del_exts
,
NULL
};
static
long
mysql_rm_known_files
(
THD
*
thd
,
MY_DIR
*
dirp
,
static
long
mysql_rm_known_files
(
THD
*
thd
,
MY_DIR
*
dirp
,
const
char
*
db
,
const
char
*
path
,
const
char
*
db
,
const
char
*
path
,
uint
level
,
uint
level
);
TABLE_LIST
**
dropped_tables
);
static
inline
void
write_to_binlog
(
THD
*
thd
,
char
*
query
,
uint
q_len
,
char
*
db
,
uint
db_len
);
/* Database options hash */
/* Database options hash */
static
HASH
dboptions
;
static
HASH
dboptions
;
...
@@ -57,6 +63,19 @@ static byte* dboptions_get_key(my_dbopt_t *opt, uint *length,
...
@@ -57,6 +63,19 @@ static byte* dboptions_get_key(my_dbopt_t *opt, uint *length,
return
(
byte
*
)
opt
->
name
;
return
(
byte
*
)
opt
->
name
;
}
}
/*
Helper function to write a query to binlog used by mysql_rm_db()
*/
static
inline
void
write_to_binlog
(
THD
*
thd
,
char
*
query
,
uint
q_len
,
char
*
db
,
uint
db_len
)
{
Query_log_event
qinfo
(
thd
,
query
,
q_len
,
0
,
0
);
qinfo
.
error_code
=
0
;
qinfo
.
db
=
db
;
qinfo
.
db_len
=
db_len
;
mysql_bin_log
.
write
(
&
qinfo
);
}
/*
/*
Function to free dboptions hash element
Function to free dboptions hash element
...
@@ -585,6 +604,7 @@ int mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
...
@@ -585,6 +604,7 @@ int mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
char
path
[
FN_REFLEN
+
16
],
tmp_db
[
NAME_LEN
+
1
];
char
path
[
FN_REFLEN
+
16
],
tmp_db
[
NAME_LEN
+
1
];
MY_DIR
*
dirp
;
MY_DIR
*
dirp
;
uint
length
;
uint
length
;
TABLE_LIST
*
dropped_tables
=
0
;
DBUG_ENTER
(
"mysql_rm_db"
);
DBUG_ENTER
(
"mysql_rm_db"
);
VOID
(
pthread_mutex_lock
(
&
LOCK_mysql_create_db
));
VOID
(
pthread_mutex_lock
(
&
LOCK_mysql_create_db
));
...
@@ -621,8 +641,10 @@ int mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
...
@@ -621,8 +641,10 @@ int mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
remove_db_from_cache
(
db
);
remove_db_from_cache
(
db
);
pthread_mutex_unlock
(
&
LOCK_open
);
pthread_mutex_unlock
(
&
LOCK_open
);
error
=
-
1
;
error
=
-
1
;
if
((
deleted
=
mysql_rm_known_files
(
thd
,
dirp
,
db
,
path
,
0
))
>=
0
)
if
((
deleted
=
mysql_rm_known_files
(
thd
,
dirp
,
db
,
path
,
0
,
&
dropped_tables
))
>=
0
)
{
{
ha_drop_database
(
path
);
ha_drop_database
(
path
);
query_cache_invalidate1
(
db
);
query_cache_invalidate1
(
db
);
...
@@ -672,6 +694,45 @@ int mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
...
@@ -672,6 +694,45 @@ int mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
send_ok
(
thd
,
(
ulong
)
deleted
);
send_ok
(
thd
,
(
ulong
)
deleted
);
thd
->
server_status
&=
~
SERVER_STATUS_DB_DROPPED
;
thd
->
server_status
&=
~
SERVER_STATUS_DB_DROPPED
;
}
}
else
if
(
mysql_bin_log
.
is_open
())
{
char
*
query
=
thd
->
alloc
(
MAX_DROP_TABLE_Q_LEN
);
if
(
!
query
)
goto
exit
;
/* not much else we can do */
char
*
p
=
strmov
(
query
,
"drop table "
);
char
*
p_end
=
query
+
MAX_DROP_TABLE_Q_LEN
;
TABLE_LIST
*
tbl
;
bool
last_query_needs_write
=
0
;
uint
db_len
=
strlen
(
db
);
for
(
tbl
=
dropped_tables
;
tbl
;
tbl
=
tbl
->
next
)
{
if
(
!
tbl
->
was_dropped
)
continue
;
/* 3 for the quotes and the comma*/
uint
tbl_name_len
=
strlen
(
tbl
->
real_name
)
+
3
;
if
(
p
+
tbl_name_len
+
1
>=
p_end
)
{
*--
p
=
0
;
/* kill , */
write_to_binlog
(
thd
,
query
,
p
-
query
,
db
,
db_len
);
p
=
query
+
11
;
/* reuse the initial "drop table" */
}
*
p
++
=
'`'
;
p
=
strmov
(
p
,
tbl
->
real_name
);
*
p
++
=
'`'
;
*
p
++
=
','
;
last_query_needs_write
=
1
;
}
if
(
last_query_needs_write
)
{
*--
p
=
0
;
write_to_binlog
(
thd
,
query
,
p
-
query
,
db
,
db_len
);
}
}
exit:
exit:
start_waiting_global_read_lock
(
thd
);
start_waiting_global_read_lock
(
thd
);
...
@@ -716,7 +777,7 @@ exit2:
...
@@ -716,7 +777,7 @@ exit2:
*/
*/
static
long
mysql_rm_known_files
(
THD
*
thd
,
MY_DIR
*
dirp
,
const
char
*
db
,
static
long
mysql_rm_known_files
(
THD
*
thd
,
MY_DIR
*
dirp
,
const
char
*
db
,
const
char
*
org_path
,
uint
level
)
const
char
*
org_path
,
uint
level
,
TABLE_LIST
**
dropped_tables
)
{
{
long
deleted
=
0
;
long
deleted
=
0
;
ulong
found_other_files
=
0
;
ulong
found_other_files
=
0
;
...
@@ -758,7 +819,7 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db,
...
@@ -758,7 +819,7 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db,
if
((
new_dirp
=
my_dir
(
newpath
,
MYF
(
MY_DONT_SORT
))))
if
((
new_dirp
=
my_dir
(
newpath
,
MYF
(
MY_DONT_SORT
))))
{
{
DBUG_PRINT
(
"my"
,(
"New subdir found: %s"
,
newpath
));
DBUG_PRINT
(
"my"
,(
"New subdir found: %s"
,
newpath
));
if
((
mysql_rm_known_files
(
thd
,
new_dirp
,
NullS
,
newpath
,
1
))
<
0
)
if
((
mysql_rm_known_files
(
thd
,
new_dirp
,
NullS
,
newpath
,
1
,
0
))
<
0
)
goto
err
;
goto
err
;
if
(
!
(
copy_of_path
=
thd
->
memdup
(
newpath
,
length
+
1
))
||
if
(
!
(
copy_of_path
=
thd
->
memdup
(
newpath
,
length
+
1
))
||
!
(
dir
=
new
(
thd
->
mem_root
)
String
(
copy_of_path
,
length
,
!
(
dir
=
new
(
thd
->
mem_root
)
String
(
copy_of_path
,
length
,
...
@@ -818,6 +879,9 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db,
...
@@ -818,6 +879,9 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db,
}
}
my_dirend
(
dirp
);
my_dirend
(
dirp
);
if
(
dropped_tables
)
*
dropped_tables
=
tot_list
;
/*
/*
If the directory is a symbolic link, remove the link first, then
If the directory is a symbolic link, remove the link first, then
remove the directory the symbolic link pointed at
remove the directory the symbolic link pointed at
...
...
sql/sql_prepare.cc
View file @
a58c0e7d
...
@@ -528,7 +528,9 @@ static void setup_one_conversion_function(THD *thd, Item_param *param,
...
@@ -528,7 +528,9 @@ static void setup_one_conversion_function(THD *thd, Item_param *param,
case
MYSQL_TYPE_LONG_BLOB
:
case
MYSQL_TYPE_LONG_BLOB
:
case
MYSQL_TYPE_BLOB
:
case
MYSQL_TYPE_BLOB
:
param
->
set_param_func
=
set_param_str
;
param
->
set_param_func
=
set_param_str
;
param
->
value
.
cs_info
.
character_set_client
=
&
my_charset_bin
;
param
->
value
.
cs_info
.
character_set_of_placeholder
=
&
my_charset_bin
;
param
->
value
.
cs_info
.
character_set_client
=
thd
->
variables
.
character_set_client
;
param
->
value
.
cs_info
.
final_character_set_of_str_value
=
&
my_charset_bin
;
param
->
value
.
cs_info
.
final_character_set_of_str_value
=
&
my_charset_bin
;
param
->
item_type
=
Item
::
STRING_ITEM
;
param
->
item_type
=
Item
::
STRING_ITEM
;
param
->
item_result_type
=
STRING_RESULT
;
param
->
item_result_type
=
STRING_RESULT
;
...
@@ -544,6 +546,7 @@ static void setup_one_conversion_function(THD *thd, Item_param *param,
...
@@ -544,6 +546,7 @@ static void setup_one_conversion_function(THD *thd, Item_param *param,
CHARSET_INFO
*
tocs
=
thd
->
variables
.
collation_connection
;
CHARSET_INFO
*
tocs
=
thd
->
variables
.
collation_connection
;
uint32
dummy_offset
;
uint32
dummy_offset
;
param
->
value
.
cs_info
.
character_set_of_placeholder
=
fromcs
;
param
->
value
.
cs_info
.
character_set_client
=
fromcs
;
param
->
value
.
cs_info
.
character_set_client
=
fromcs
;
/*
/*
...
@@ -601,7 +604,7 @@ static bool insert_params_withlog(Prepared_statement *stmt, uchar *null_array,
...
@@ -601,7 +604,7 @@ static bool insert_params_withlog(Prepared_statement *stmt, uchar *null_array,
param
->
set_param_func
(
param
,
&
read_pos
,
data_end
-
read_pos
);
param
->
set_param_func
(
param
,
&
read_pos
,
data_end
-
read_pos
);
}
}
}
}
res
=
param
->
query_val_str
(
&
str
,
thd
);
res
=
param
->
query_val_str
(
&
str
);
if
(
param
->
convert_str_value
(
thd
))
if
(
param
->
convert_str_value
(
thd
))
DBUG_RETURN
(
1
);
/* out of memory */
DBUG_RETURN
(
1
);
/* out of memory */
...
@@ -749,7 +752,7 @@ static bool emb_insert_params_withlog(Prepared_statement *stmt, String *query)
...
@@ -749,7 +752,7 @@ static bool emb_insert_params_withlog(Prepared_statement *stmt, String *query)
client_param
->
buffer_length
);
client_param
->
buffer_length
);
}
}
}
}
res
=
param
->
query_val_str
(
&
str
,
thd
);
res
=
param
->
query_val_str
(
&
str
);
if
(
param
->
convert_str_value
(
thd
))
if
(
param
->
convert_str_value
(
thd
))
DBUG_RETURN
(
1
);
/* out of memory */
DBUG_RETURN
(
1
);
/* out of memory */
...
...
sql/sql_select.cc
View file @
a58c0e7d
...
@@ -8517,9 +8517,7 @@ create_distinct_group(THD *thd, Item **ref_pointer_array,
...
@@ -8517,9 +8517,7 @@ create_distinct_group(THD *thd, Item **ref_pointer_array,
li
.
rewind
();
li
.
rewind
();
while
((
item
=
li
++
))
while
((
item
=
li
++
))
{
{
if
(
item
->
const_item
()
||
item
->
with_sum_func
)
if
(
!
item
->
const_item
()
&&
!
item
->
with_sum_func
&&
!
item
->
marker
)
continue
;
if
(
!
item
->
marker
)
{
{
ORDER
*
ord
=
(
ORDER
*
)
thd
->
calloc
(
sizeof
(
ORDER
));
ORDER
*
ord
=
(
ORDER
*
)
thd
->
calloc
(
sizeof
(
ORDER
));
if
(
!
ord
)
if
(
!
ord
)
...
...
sql/sql_table.cc
View file @
a58c0e7d
...
@@ -220,6 +220,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
...
@@ -220,6 +220,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
for
(
table
=
tables
;
table
;
table
=
table
->
next
)
for
(
table
=
tables
;
table
;
table
=
table
->
next
)
{
{
char
*
db
=
table
->
db
;
char
*
db
=
table
->
db
;
table
->
was_dropped
=
0
;
mysql_ha_flush
(
thd
,
table
,
MYSQL_HA_CLOSE_FINAL
);
mysql_ha_flush
(
thd
,
table
,
MYSQL_HA_CLOSE_FINAL
);
if
(
!
close_temporary_table
(
thd
,
db
,
table
->
real_name
))
if
(
!
close_temporary_table
(
thd
,
db
,
table
->
real_name
))
{
{
...
@@ -280,6 +281,8 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
...
@@ -280,6 +281,8 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
wrong_tables
.
append
(
','
);
wrong_tables
.
append
(
','
);
wrong_tables
.
append
(
String
(
table
->
real_name
,
system_charset_info
));
wrong_tables
.
append
(
String
(
table
->
real_name
,
system_charset_info
));
}
}
else
table
->
was_dropped
=
1
;
}
}
thd
->
tmp_table_used
=
tmp_table_deleted
;
thd
->
tmp_table_used
=
tmp_table_deleted
;
error
=
0
;
error
=
0
;
...
...
sql/table.h
View file @
a58c0e7d
...
@@ -235,6 +235,9 @@ typedef struct st_table_list
...
@@ -235,6 +235,9 @@ typedef struct st_table_list
bool
cacheable_table
;
/* stop PS caching */
bool
cacheable_table
;
/* stop PS caching */
/* used in multi-upd privelege check */
/* used in multi-upd privelege check */
bool
table_in_update_from_clause
;
bool
table_in_update_from_clause
;
/* used for proper partially successful DROP DATABASE binlogging */
bool
was_dropped
;
}
TABLE_LIST
;
}
TABLE_LIST
;
typedef
struct
st_changed_table_list
typedef
struct
st_changed_table_list
...
...
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