Merge quad.opbmk:/mnt/raid/alik/MySQL/devel/5.1
into quad.opbmk:/mnt/raid/alik/MySQL/devel/5.1-rt-merged
This commit is contained in:
commit
fa6ed3cf36
@ -4221,11 +4221,13 @@ int connect_n_handle_errors(struct st_command *command,
|
|||||||
if (!mysql_real_connect(con, host, user, pass, db, port, sock ? sock: 0,
|
if (!mysql_real_connect(con, host, user, pass, db, port, sock ? sock: 0,
|
||||||
CLIENT_MULTI_STATEMENTS))
|
CLIENT_MULTI_STATEMENTS))
|
||||||
{
|
{
|
||||||
|
var_set_errno(mysql_errno(con));
|
||||||
handle_error(command, mysql_errno(con), mysql_error(con),
|
handle_error(command, mysql_errno(con), mysql_error(con),
|
||||||
mysql_sqlstate(con), ds);
|
mysql_sqlstate(con), ds);
|
||||||
return 0; /* Not connected */
|
return 0; /* Not connected */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var_set_errno(0);
|
||||||
handle_no_error(command);
|
handle_no_error(command);
|
||||||
return 1; /* Connected */
|
return 1; /* Connected */
|
||||||
}
|
}
|
||||||
|
@ -2467,7 +2467,7 @@ static my_bool execute(MYSQL_STMT *stmt, char *packet, ulong length)
|
|||||||
int4store(buff+5, 1); /* iteration count */
|
int4store(buff+5, 1); /* iteration count */
|
||||||
|
|
||||||
res= test(cli_advanced_command(mysql, COM_STMT_EXECUTE, buff, sizeof(buff),
|
res= test(cli_advanced_command(mysql, COM_STMT_EXECUTE, buff, sizeof(buff),
|
||||||
(uchar*) packet, length, 1, NULL) ||
|
(uchar*) packet, length, 1, stmt) ||
|
||||||
(*mysql->methods->read_query_result)(mysql));
|
(*mysql->methods->read_query_result)(mysql));
|
||||||
stmt->affected_rows= mysql->affected_rows;
|
stmt->affected_rows= mysql->affected_rows;
|
||||||
stmt->server_status= mysql->server_status;
|
stmt->server_status= mysql->server_status;
|
||||||
@ -2683,7 +2683,7 @@ stmt_read_row_from_cursor(MYSQL_STMT *stmt, unsigned char **row)
|
|||||||
int4store(buff + 4, stmt->prefetch_rows); /* number of rows to fetch */
|
int4store(buff + 4, stmt->prefetch_rows); /* number of rows to fetch */
|
||||||
if ((*mysql->methods->advanced_command)(mysql, COM_STMT_FETCH,
|
if ((*mysql->methods->advanced_command)(mysql, COM_STMT_FETCH,
|
||||||
buff, sizeof(buff), (uchar*) 0, 0,
|
buff, sizeof(buff), (uchar*) 0, 0,
|
||||||
1, NULL))
|
1, stmt))
|
||||||
{
|
{
|
||||||
set_stmt_errmsg(stmt, net);
|
set_stmt_errmsg(stmt, net);
|
||||||
return 1;
|
return 1;
|
||||||
@ -3350,7 +3350,7 @@ mysql_stmt_send_long_data(MYSQL_STMT *stmt, uint param_number,
|
|||||||
*/
|
*/
|
||||||
if ((*mysql->methods->advanced_command)(mysql, COM_STMT_SEND_LONG_DATA,
|
if ((*mysql->methods->advanced_command)(mysql, COM_STMT_SEND_LONG_DATA,
|
||||||
buff, sizeof(buff), (uchar*) data,
|
buff, sizeof(buff), (uchar*) data,
|
||||||
length, 1, NULL))
|
length, 1, stmt))
|
||||||
{
|
{
|
||||||
set_stmt_errmsg(stmt, &mysql->net);
|
set_stmt_errmsg(stmt, &mysql->net);
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
@ -4748,6 +4748,13 @@ int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt)
|
|||||||
MYSQL_DATA *result= &stmt->result;
|
MYSQL_DATA *result= &stmt->result;
|
||||||
DBUG_ENTER("mysql_stmt_store_result");
|
DBUG_ENTER("mysql_stmt_store_result");
|
||||||
|
|
||||||
|
if (!mysql)
|
||||||
|
{
|
||||||
|
/* mysql can be reset in mysql_close called from mysql_reconnect */
|
||||||
|
set_stmt_error(stmt, CR_SERVER_LOST, unknown_sqlstate, NULL);
|
||||||
|
DBUG_RETURN(1);
|
||||||
|
}
|
||||||
|
|
||||||
mysql= mysql->last_used_con;
|
mysql= mysql->last_used_con;
|
||||||
|
|
||||||
if (!stmt->field_count)
|
if (!stmt->field_count)
|
||||||
@ -4773,7 +4780,7 @@ int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt)
|
|||||||
int4store(buff, stmt->stmt_id);
|
int4store(buff, stmt->stmt_id);
|
||||||
int4store(buff + 4, (int)~0); /* number of rows to fetch */
|
int4store(buff + 4, (int)~0); /* number of rows to fetch */
|
||||||
if (cli_advanced_command(mysql, COM_STMT_FETCH, buff, sizeof(buff),
|
if (cli_advanced_command(mysql, COM_STMT_FETCH, buff, sizeof(buff),
|
||||||
(uchar*) 0, 0, 1, NULL))
|
(uchar*) 0, 0, 1, stmt))
|
||||||
{
|
{
|
||||||
set_stmt_errmsg(stmt, net);
|
set_stmt_errmsg(stmt, net);
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
@ -4960,7 +4967,7 @@ static my_bool reset_stmt_handle(MYSQL_STMT *stmt, uint flags)
|
|||||||
uchar buff[MYSQL_STMT_HEADER]; /* packet header: 4 bytes for stmt id */
|
uchar buff[MYSQL_STMT_HEADER]; /* packet header: 4 bytes for stmt id */
|
||||||
int4store(buff, stmt->stmt_id);
|
int4store(buff, stmt->stmt_id);
|
||||||
if ((*mysql->methods->advanced_command)(mysql, COM_STMT_RESET, buff,
|
if ((*mysql->methods->advanced_command)(mysql, COM_STMT_RESET, buff,
|
||||||
sizeof(buff), 0, 0, 0, NULL))
|
sizeof(buff), 0, 0, 0, stmt))
|
||||||
{
|
{
|
||||||
set_stmt_errmsg(stmt, &mysql->net);
|
set_stmt_errmsg(stmt, &mysql->net);
|
||||||
stmt->state= MYSQL_STMT_INIT_DONE;
|
stmt->state= MYSQL_STMT_INIT_DONE;
|
||||||
|
56
mysql-test/include/connect2.inc
Normal file
56
mysql-test/include/connect2.inc
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
# include/connect2.inc
|
||||||
|
#
|
||||||
|
# SUMMARY
|
||||||
|
#
|
||||||
|
# Make several attempts to connect.
|
||||||
|
#
|
||||||
|
# USAGE
|
||||||
|
#
|
||||||
|
# EXAMPLE
|
||||||
|
#
|
||||||
|
# connect.test
|
||||||
|
#
|
||||||
|
|
||||||
|
--disable_query_log
|
||||||
|
|
||||||
|
let $wait_counter= 300;
|
||||||
|
if ($wait_timeout)
|
||||||
|
{
|
||||||
|
let $wait_counter= `SELECT $wait_timeout * 10`;
|
||||||
|
}
|
||||||
|
# Reset $wait_timeout so that its value won't be used on subsequent
|
||||||
|
# calls, and default will be used instead.
|
||||||
|
let $wait_timeout= 0;
|
||||||
|
|
||||||
|
--echo # -- Establishing connection '$con_name' (user: $con_user_name)...
|
||||||
|
|
||||||
|
while ($wait_counter)
|
||||||
|
{
|
||||||
|
--disable_abort_on_error
|
||||||
|
--disable_result_log
|
||||||
|
--connect ($con_name,localhost,$con_user_name)
|
||||||
|
--enable_result_log
|
||||||
|
--enable_abort_on_error
|
||||||
|
|
||||||
|
let $error = $mysql_errno;
|
||||||
|
|
||||||
|
if (!$error)
|
||||||
|
{
|
||||||
|
let $wait_counter= 0;
|
||||||
|
}
|
||||||
|
if ($error)
|
||||||
|
{
|
||||||
|
real_sleep 0.1;
|
||||||
|
dec $wait_counter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($error)
|
||||||
|
{
|
||||||
|
--echo # -- Error: can not establish connection '$con_name'.
|
||||||
|
}
|
||||||
|
if (!$error)
|
||||||
|
{
|
||||||
|
--echo # -- Connection '$con_name' has been established.
|
||||||
|
}
|
||||||
|
|
||||||
|
--enable_query_log
|
@ -115,3 +115,106 @@ create temporary table t2(id integer not null auto_increment primary key);
|
|||||||
set @id := 1;
|
set @id := 1;
|
||||||
delete from t1 where id like @id;
|
delete from t1 where id like @id;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
# ------------------------------------------------------------------
|
||||||
|
# -- End of 4.1 tests
|
||||||
|
# ------------------------------------------------------------------
|
||||||
|
|
||||||
|
# -- Bug#33507: Event scheduler creates more threads than max_connections
|
||||||
|
# -- which results in user lockout.
|
||||||
|
|
||||||
|
GRANT USAGE ON *.* TO mysqltest_u1@localhost;
|
||||||
|
|
||||||
|
SET GLOBAL max_connections = 3;
|
||||||
|
SET GLOBAL event_scheduler = ON;
|
||||||
|
|
||||||
|
# -- Waiting for Event Scheduler to start...
|
||||||
|
|
||||||
|
# -- Disconnecting default connection...
|
||||||
|
|
||||||
|
# -- Check that we allow exactly three user connections, no matter how
|
||||||
|
# -- many threads are running.
|
||||||
|
|
||||||
|
# -- Connecting (1)...
|
||||||
|
# -- Establishing connection 'con_1' (user: mysqltest_u1)...
|
||||||
|
# -- Connection 'con_1' has been established.
|
||||||
|
|
||||||
|
# -- Connecting (2)...
|
||||||
|
# -- Establishing connection 'con_2' (user: mysqltest_u1)...
|
||||||
|
# -- Connection 'con_2' has been established.
|
||||||
|
|
||||||
|
# -- Connecting (3)...
|
||||||
|
# -- Establishing connection 'con_3' (user: mysqltest_u1)...
|
||||||
|
# -- Connection 'con_3' has been established.
|
||||||
|
|
||||||
|
# -- Connecting (4) [should fail]...
|
||||||
|
# -- Establishing connection 'con_4' (user: mysqltest_u1)...
|
||||||
|
# -- Error: can not establish connection 'con_4'.
|
||||||
|
|
||||||
|
# -- Check that we allow one extra SUPER-user connection.
|
||||||
|
|
||||||
|
# -- Connecting super (1)...
|
||||||
|
# -- Establishing connection 'con_super_1' (user: root)...
|
||||||
|
# -- Connection 'con_super_1' has been established.
|
||||||
|
|
||||||
|
# -- Connecting super (2) [should fail]...
|
||||||
|
# -- Establishing connection 'con_super_2' (user: root)...
|
||||||
|
# -- Error: can not establish connection 'con_super_2'.
|
||||||
|
|
||||||
|
# -- Ensure that we have Event Scheduler thread, 3 ordinary user
|
||||||
|
# -- connections and one extra super-user connection.
|
||||||
|
SELECT user FROM information_schema.processlist ORDER BY id;
|
||||||
|
user
|
||||||
|
event_scheduler
|
||||||
|
mysqltest_u1
|
||||||
|
mysqltest_u1
|
||||||
|
mysqltest_u1
|
||||||
|
root
|
||||||
|
|
||||||
|
# -- Resetting variables...
|
||||||
|
SET GLOBAL max_connections = 151;
|
||||||
|
|
||||||
|
# -- Stopping Event Scheduler...
|
||||||
|
SET GLOBAL event_scheduler = OFF;
|
||||||
|
|
||||||
|
# -- Waiting for Event Scheduler to stop...
|
||||||
|
|
||||||
|
# -- That's it. Closing connections...
|
||||||
|
|
||||||
|
# -- Restoring default connection...
|
||||||
|
|
||||||
|
# -- Waiting for connections to close...
|
||||||
|
|
||||||
|
DROP USER mysqltest_u1@localhost;
|
||||||
|
|
||||||
|
# -- End of Bug#33507.
|
||||||
|
|
||||||
|
# -- Bug#35074: max_used_connections is not correct.
|
||||||
|
|
||||||
|
FLUSH STATUS;
|
||||||
|
|
||||||
|
SHOW STATUS LIKE 'max_used_connections';
|
||||||
|
Variable_name Value
|
||||||
|
Max_used_connections 1
|
||||||
|
|
||||||
|
# -- Starting Event Scheduler...
|
||||||
|
SET GLOBAL event_scheduler = ON;
|
||||||
|
# -- Waiting for Event Scheduler to start...
|
||||||
|
|
||||||
|
# -- Opening a new connection to check max_used_connections...
|
||||||
|
|
||||||
|
# -- Check that max_used_connections hasn't changed.
|
||||||
|
SHOW STATUS LIKE 'max_used_connections';
|
||||||
|
Variable_name Value
|
||||||
|
Max_used_connections 2
|
||||||
|
|
||||||
|
# -- Closing new connection...
|
||||||
|
|
||||||
|
# -- Stopping Event Scheduler...
|
||||||
|
SET GLOBAL event_scheduler = OFF;
|
||||||
|
# -- Waiting for Event Scheduler to stop...
|
||||||
|
|
||||||
|
# -- End of Bug#35074.
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------
|
||||||
|
# -- End of 5.1 tests
|
||||||
|
# ------------------------------------------------------------------
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
set @old_concurrent_insert= @@global.concurrent_insert;
|
||||||
set @@global.concurrent_insert= 0;
|
set @@global.concurrent_insert= 0;
|
||||||
drop table if exists t1;
|
drop table if exists t1;
|
||||||
create table t1 (kill_id int);
|
create table t1 (kill_id int);
|
||||||
@ -8,3 +9,4 @@ select ((@id := kill_id) - kill_id) from t1;
|
|||||||
0
|
0
|
||||||
kill connection @id;
|
kill connection @id;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
set @@global.concurrent_insert= @old_concurrent_insert;
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
set @old_concurrent_insert= @@global.concurrent_insert;
|
||||||
set @@global.concurrent_insert= 0;
|
set @@global.concurrent_insert= 0;
|
||||||
drop table if exists t1, t2, t3;
|
drop table if exists t1, t2, t3;
|
||||||
create table t1 (kill_id int);
|
create table t1 (kill_id int);
|
||||||
@ -137,3 +138,4 @@ KILL CONNECTION_ID();
|
|||||||
# of close of the connection socket
|
# of close of the connection socket
|
||||||
SELECT 1;
|
SELECT 1;
|
||||||
Got one of the listed errors
|
Got one of the listed errors
|
||||||
|
set @@global.concurrent_insert= @old_concurrent_insert;
|
||||||
|
@ -1650,6 +1650,16 @@ a (select count(*) from t2)
|
|||||||
3 0
|
3 0
|
||||||
4 0
|
4 0
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
|
#
|
||||||
|
# Bug#25132 disabled query cache: Qcache_free_blocks = 1
|
||||||
|
#
|
||||||
|
set global query_cache_size=100000;
|
||||||
|
set global query_cache_size=0;
|
||||||
|
set global query_cache_type=0;
|
||||||
|
show status like 'Qcache_free_blocks';
|
||||||
|
Variable_name Value
|
||||||
|
Qcache_free_blocks 0
|
||||||
|
Restore default values.
|
||||||
set GLOBAL query_cache_type=default;
|
set GLOBAL query_cache_type=default;
|
||||||
set GLOBAL query_cache_limit=default;
|
set GLOBAL query_cache_limit=default;
|
||||||
set GLOBAL query_cache_min_res_unit=default;
|
set GLOBAL query_cache_min_res_unit=default;
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
set @old_concurrent_insert= @@global.concurrent_insert;
|
||||||
|
set @@global.concurrent_insert= 0;
|
||||||
drop table if exists t1,t3;
|
drop table if exists t1,t3;
|
||||||
drop procedure if exists bug4902|
|
drop procedure if exists bug4902|
|
||||||
create procedure bug4902()
|
create procedure bug4902()
|
||||||
@ -17,11 +19,11 @@ begin
|
|||||||
show processlist;
|
show processlist;
|
||||||
end|
|
end|
|
||||||
call bug4902_2()|
|
call bug4902_2()|
|
||||||
Id User Host db Command Time State Info
|
show warnings|
|
||||||
# root localhost test Query # NULL show processlist
|
Level Code Message
|
||||||
call bug4902_2()|
|
call bug4902_2()|
|
||||||
Id User Host db Command Time State Info
|
show warnings|
|
||||||
# root localhost test Query # NULL show processlist
|
Level Code Message
|
||||||
drop procedure bug4902_2|
|
drop procedure bug4902_2|
|
||||||
drop table if exists t1|
|
drop table if exists t1|
|
||||||
create table t1 (
|
create table t1 (
|
||||||
@ -68,7 +70,7 @@ c
|
|||||||
2
|
2
|
||||||
show status like 'Qcache_hits'|
|
show status like 'Qcache_hits'|
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Qcache_hits 2
|
Qcache_hits 0
|
||||||
set global query_cache_size = @x|
|
set global query_cache_size = @x|
|
||||||
flush status|
|
flush status|
|
||||||
flush query cache|
|
flush query cache|
|
||||||
@ -208,3 +210,27 @@ GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION
|
|||||||
drop user mysqltest_1@localhost;
|
drop user mysqltest_1@localhost;
|
||||||
drop procedure 15298_1;
|
drop procedure 15298_1;
|
||||||
drop procedure 15298_2;
|
drop procedure 15298_2;
|
||||||
|
drop table if exists t1;
|
||||||
|
drop procedure if exists p1;
|
||||||
|
create table t1 (value varchar(15));
|
||||||
|
create procedure p1() update t1 set value='updated' where value='old';
|
||||||
|
call p1();
|
||||||
|
insert into t1 (value) values ("old");
|
||||||
|
select get_lock('b26162',120);
|
||||||
|
get_lock('b26162',120)
|
||||||
|
1
|
||||||
|
select 'rl_acquirer', value from t1 where get_lock('b26162',120);;
|
||||||
|
set session low_priority_updates=on;
|
||||||
|
call p1();;
|
||||||
|
select 'rl_contender', value from t1;
|
||||||
|
rl_contender value
|
||||||
|
rl_contender old
|
||||||
|
select release_lock('b26162');
|
||||||
|
release_lock('b26162')
|
||||||
|
1
|
||||||
|
rl_acquirer value
|
||||||
|
rl_acquirer old
|
||||||
|
drop procedure p1;
|
||||||
|
drop table t1;
|
||||||
|
set session low_priority_updates=default;
|
||||||
|
set @@global.concurrent_insert= @old_concurrent_insert;
|
||||||
|
@ -140,4 +140,23 @@ select * from t3;
|
|||||||
c
|
c
|
||||||
1
|
1
|
||||||
drop table t1, t2, t3;
|
drop table t1, t2, t3;
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
DROP TABLE IF EXISTS t2;
|
||||||
|
CREATE TABLE t1(a INT PRIMARY KEY) ENGINE=innodb;
|
||||||
|
CREATE TABLE t2(b INT, FOREIGN KEY(b) REFERENCES t1(a)) ENGINE=innodb;
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
CREATE TRIGGER t1_bd BEFORE DELETE ON t1 FOR EACH ROW SET @a = 1;
|
||||||
|
CREATE TRIGGER t1_ad AFTER DELETE ON t1 FOR EACH ROW SET @b = 1;
|
||||||
|
SET @a = 0;
|
||||||
|
SET @b = 0;
|
||||||
|
TRUNCATE t1;
|
||||||
|
SELECT @a, @b;
|
||||||
|
@a @b
|
||||||
|
0 0
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
DELETE FROM t1;
|
||||||
|
SELECT @a, @b;
|
||||||
|
@a @b
|
||||||
|
1 1
|
||||||
|
DROP TABLE t2, t1;
|
||||||
End of 5.0 tests
|
End of 5.0 tests
|
||||||
|
@ -102,4 +102,192 @@ disconnect con7;
|
|||||||
connection default;
|
connection default;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
# End of 4.1 tests
|
--disconnect con1
|
||||||
|
--disconnect con2
|
||||||
|
--disconnect con3
|
||||||
|
--disconnect con4
|
||||||
|
--disconnect con5
|
||||||
|
--disconnect con6
|
||||||
|
--disconnect con10
|
||||||
|
|
||||||
|
--echo # ------------------------------------------------------------------
|
||||||
|
--echo # -- End of 4.1 tests
|
||||||
|
--echo # ------------------------------------------------------------------
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # -- Bug#33507: Event scheduler creates more threads than max_connections
|
||||||
|
--echo # -- which results in user lockout.
|
||||||
|
|
||||||
|
--echo
|
||||||
|
GRANT USAGE ON *.* TO mysqltest_u1@localhost;
|
||||||
|
|
||||||
|
# NOTE: if the test case fails sporadically due to spurious connections,
|
||||||
|
# consider disabling all users.
|
||||||
|
|
||||||
|
--echo
|
||||||
|
let $saved_max_connections = `SELECT @@global.max_connections`;
|
||||||
|
SET GLOBAL max_connections = 3;
|
||||||
|
SET GLOBAL event_scheduler = ON;
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # -- Waiting for Event Scheduler to start...
|
||||||
|
let $wait_condition =
|
||||||
|
SELECT COUNT(*) = 1
|
||||||
|
FROM information_schema.processlist
|
||||||
|
WHERE user = 'event_scheduler';
|
||||||
|
--source include/wait_condition.inc
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # -- Disconnecting default connection...
|
||||||
|
--disconnect default
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # -- Check that we allow exactly three user connections, no matter how
|
||||||
|
--echo # -- many threads are running.
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # -- Connecting (1)...
|
||||||
|
let $con_name = con_1;
|
||||||
|
let $con_user_name = mysqltest_u1;
|
||||||
|
--source include/connect2.inc
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # -- Connecting (2)...
|
||||||
|
let $con_name = con_2;
|
||||||
|
let $con_user_name = mysqltest_u1;
|
||||||
|
--source include/connect2.inc
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # -- Connecting (3)...
|
||||||
|
let $con_name = con_3;
|
||||||
|
let $con_user_name = mysqltest_u1;
|
||||||
|
--source include/connect2.inc
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # -- Connecting (4) [should fail]...
|
||||||
|
let $con_name = con_4;
|
||||||
|
let $con_user_name = mysqltest_u1;
|
||||||
|
let $wait_timeout = 5;
|
||||||
|
--source include/connect2.inc
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # -- Check that we allow one extra SUPER-user connection.
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # -- Connecting super (1)...
|
||||||
|
let $con_name = con_super_1;
|
||||||
|
let $con_user_name = root;
|
||||||
|
--source include/connect2.inc
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # -- Connecting super (2) [should fail]...
|
||||||
|
let $con_name = con_super_2;
|
||||||
|
let $con_user_name = root;
|
||||||
|
let $wait_timeout = 5;
|
||||||
|
--source include/connect2.inc
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # -- Ensure that we have Event Scheduler thread, 3 ordinary user
|
||||||
|
--echo # -- connections and one extra super-user connection.
|
||||||
|
SELECT user FROM information_schema.processlist ORDER BY id;
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # -- Resetting variables...
|
||||||
|
--eval SET GLOBAL max_connections = $saved_max_connections
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # -- Stopping Event Scheduler...
|
||||||
|
SET GLOBAL event_scheduler = OFF;
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # -- Waiting for Event Scheduler to stop...
|
||||||
|
let $wait_condition =
|
||||||
|
SELECT COUNT(*) = 0
|
||||||
|
FROM information_schema.processlist
|
||||||
|
WHERE user = 'event_scheduler';
|
||||||
|
--source include/wait_condition.inc
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # -- That's it. Closing connections...
|
||||||
|
--disconnect con_1
|
||||||
|
--disconnect con_2
|
||||||
|
--disconnect con_3
|
||||||
|
--disconnect con_super_1
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # -- Restoring default connection...
|
||||||
|
--connect (default,localhost,root,,test)
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # -- Waiting for connections to close...
|
||||||
|
let $wait_condition =
|
||||||
|
SELECT COUNT(*) = 1
|
||||||
|
FROM information_schema.processlist
|
||||||
|
WHERE db = 'test';
|
||||||
|
--source include/wait_condition.inc
|
||||||
|
|
||||||
|
--echo
|
||||||
|
DROP USER mysqltest_u1@localhost;
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # -- End of Bug#33507.
|
||||||
|
--echo
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
--echo # -- Bug#35074: max_used_connections is not correct.
|
||||||
|
--echo
|
||||||
|
|
||||||
|
FLUSH STATUS;
|
||||||
|
|
||||||
|
--echo
|
||||||
|
SHOW STATUS LIKE 'max_used_connections';
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # -- Starting Event Scheduler...
|
||||||
|
SET GLOBAL event_scheduler = ON;
|
||||||
|
|
||||||
|
--echo # -- Waiting for Event Scheduler to start...
|
||||||
|
let $wait_condition =
|
||||||
|
SELECT COUNT(*) = 1
|
||||||
|
FROM information_schema.processlist
|
||||||
|
WHERE user = 'event_scheduler';
|
||||||
|
--source include/wait_condition.inc
|
||||||
|
|
||||||
|
# NOTE: We should use a new connection here instead of reconnect in order to
|
||||||
|
# avoid races (we can not for sure when the connection being disconnected is
|
||||||
|
# actually disconnected on the server).
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # -- Opening a new connection to check max_used_connections...
|
||||||
|
--connect (con_1,localhost,root)
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # -- Check that max_used_connections hasn't changed.
|
||||||
|
SHOW STATUS LIKE 'max_used_connections';
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # -- Closing new connection...
|
||||||
|
--disconnect con_1
|
||||||
|
--connection default
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # -- Stopping Event Scheduler...
|
||||||
|
SET GLOBAL event_scheduler = OFF;
|
||||||
|
|
||||||
|
--echo # -- Waiting for Event Scheduler to stop...
|
||||||
|
let $wait_condition =
|
||||||
|
SELECT COUNT(*) = 0
|
||||||
|
FROM information_schema.processlist
|
||||||
|
WHERE user = 'event_scheduler';
|
||||||
|
--source include/wait_condition.inc
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # -- End of Bug#35074.
|
||||||
|
--echo
|
||||||
|
|
||||||
|
--echo # ------------------------------------------------------------------
|
||||||
|
--echo # -- End of 5.1 tests
|
||||||
|
--echo # ------------------------------------------------------------------
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
# Disable concurrent inserts to avoid test failures when reading the
|
# Disable concurrent inserts to avoid test failures when reading the
|
||||||
# connection id which was inserted into a table by another thread.
|
# connection id which was inserted into a table by another thread.
|
||||||
|
set @old_concurrent_insert= @@global.concurrent_insert;
|
||||||
set @@global.concurrent_insert= 0;
|
set @@global.concurrent_insert= 0;
|
||||||
|
|
||||||
connect (con1,localhost,root,,);
|
connect (con1,localhost,root,,);
|
||||||
@ -58,3 +59,7 @@ reap;
|
|||||||
|
|
||||||
connection con2;
|
connection con2;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
connection default;
|
||||||
|
|
||||||
|
# Restore global concurrent_insert value
|
||||||
|
set @@global.concurrent_insert= @old_concurrent_insert;
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
# Disable concurrent inserts to avoid test failures when reading the
|
# Disable concurrent inserts to avoid test failures when reading the
|
||||||
# connection id which was inserted into a table by another thread.
|
# connection id which was inserted into a table by another thread.
|
||||||
|
set @old_concurrent_insert= @@global.concurrent_insert;
|
||||||
set @@global.concurrent_insert= 0;
|
set @@global.concurrent_insert= 0;
|
||||||
|
|
||||||
connect (con1, localhost, root,,);
|
connect (con1, localhost, root,,);
|
||||||
@ -326,3 +327,9 @@ KILL CONNECTION_ID();
|
|||||||
--echo # of close of the connection socket
|
--echo # of close of the connection socket
|
||||||
--error 2013, 2006
|
--error 2013, 2006
|
||||||
SELECT 1;
|
SELECT 1;
|
||||||
|
--connection default
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
# Restore global concurrent_insert value. Keep in the end of the test file.
|
||||||
|
set @@global.concurrent_insert= @old_concurrent_insert;
|
||||||
|
@ -1251,6 +1251,15 @@ disconnect user2;
|
|||||||
disconnect user3;
|
disconnect user3;
|
||||||
|
|
||||||
#
|
#
|
||||||
|
--echo #
|
||||||
|
--echo # Bug#25132 disabled query cache: Qcache_free_blocks = 1
|
||||||
|
--echo #
|
||||||
|
set global query_cache_size=100000;
|
||||||
|
set global query_cache_size=0;
|
||||||
|
set global query_cache_type=0;
|
||||||
|
show status like 'Qcache_free_blocks';
|
||||||
|
|
||||||
|
--echo Restore default values.
|
||||||
# Bug #28211 RENAME DATABASE and query cache don't play nicely together
|
# Bug #28211 RENAME DATABASE and query cache don't play nicely together
|
||||||
#
|
#
|
||||||
# TODO: enable these tests when RENAME DATABASE is implemented.
|
# TODO: enable these tests when RENAME DATABASE is implemented.
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
# Can't test with embedded server
|
# Can't test with embedded server
|
||||||
-- source include/not_embedded.inc
|
-- source include/not_embedded.inc
|
||||||
|
# Disable concurrent inserts to avoid test failures
|
||||||
|
set @old_concurrent_insert= @@global.concurrent_insert;
|
||||||
|
set @@global.concurrent_insert= 0;
|
||||||
|
|
||||||
--sleep 2
|
|
||||||
--disable_warnings
|
--disable_warnings
|
||||||
drop table if exists t1,t3;
|
drop table if exists t1,t3;
|
||||||
--enable_warnings
|
--enable_warnings
|
||||||
@ -39,10 +41,14 @@ create procedure bug4902_2()
|
|||||||
begin
|
begin
|
||||||
show processlist;
|
show processlist;
|
||||||
end|
|
end|
|
||||||
--replace_column 1 # 6 # 3 localhost
|
--disable_result_log
|
||||||
call bug4902_2()|
|
call bug4902_2()|
|
||||||
--replace_column 1 # 6 # 3 localhost
|
--enable_result_log
|
||||||
|
show warnings|
|
||||||
|
--disable_result_log
|
||||||
call bug4902_2()|
|
call bug4902_2()|
|
||||||
|
--enable_result_log
|
||||||
|
show warnings|
|
||||||
drop procedure bug4902_2|
|
drop procedure bug4902_2|
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -268,69 +274,72 @@ drop procedure 15298_1;
|
|||||||
drop procedure 15298_2;
|
drop procedure 15298_2;
|
||||||
|
|
||||||
#
|
#
|
||||||
# Test case disabled due to Bug#34891: sp_notembedded.test fails sporadically.
|
# Bug#29936 Stored Procedure DML ignores low_priority_updates setting
|
||||||
#
|
#
|
||||||
# #
|
|
||||||
# # Bug#29936 Stored Procedure DML ignores low_priority_updates setting
|
--disable_warnings
|
||||||
# #
|
drop table if exists t1;
|
||||||
|
drop procedure if exists p1;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
create table t1 (value varchar(15));
|
||||||
|
create procedure p1() update t1 set value='updated' where value='old';
|
||||||
|
|
||||||
|
# load the procedure into sp cache and execute once
|
||||||
|
call p1();
|
||||||
|
|
||||||
|
insert into t1 (value) values ("old");
|
||||||
|
|
||||||
|
connect (rl_holder, localhost, root,,);
|
||||||
|
connect (rl_acquirer, localhost, root,,);
|
||||||
|
connect (rl_contender, localhost, root,,);
|
||||||
|
connect (rl_wait, localhost, root,,);
|
||||||
|
|
||||||
|
connection rl_holder;
|
||||||
|
select get_lock('b26162',120);
|
||||||
|
|
||||||
|
connection rl_acquirer;
|
||||||
|
--send select 'rl_acquirer', value from t1 where get_lock('b26162',120);
|
||||||
|
|
||||||
|
# we must wait till this select opens and locks the tables
|
||||||
|
connection rl_wait;
|
||||||
|
let $wait_condition=
|
||||||
|
select count(*) = 1 from information_schema.processlist
|
||||||
|
where state = "User lock" and
|
||||||
|
info = "select 'rl_acquirer', value from t1 where get_lock('b26162',120)";
|
||||||
|
--source include/wait_condition.inc
|
||||||
|
|
||||||
|
connection default;
|
||||||
|
set session low_priority_updates=on;
|
||||||
|
--send call p1();
|
||||||
|
|
||||||
|
connection rl_wait;
|
||||||
|
let $wait_condition=
|
||||||
|
select count(*) = 1 from information_schema.processlist
|
||||||
|
where state = "Locked" and
|
||||||
|
info = "update t1 set value='updated' where value='old'";
|
||||||
|
--source include/wait_condition.inc
|
||||||
|
|
||||||
|
connection rl_contender;
|
||||||
|
select 'rl_contender', value from t1;
|
||||||
|
|
||||||
|
connection rl_holder;
|
||||||
|
select release_lock('b26162');
|
||||||
|
|
||||||
|
connection rl_acquirer;
|
||||||
|
--reap
|
||||||
|
connection default;
|
||||||
|
--reap
|
||||||
|
|
||||||
|
disconnect rl_holder;
|
||||||
|
disconnect rl_acquirer;
|
||||||
|
disconnect rl_wait;
|
||||||
|
drop procedure p1;
|
||||||
|
drop table t1;
|
||||||
|
set session low_priority_updates=default;
|
||||||
|
|
||||||
#
|
#
|
||||||
# --disable_warnings
|
# Restore global concurrent_insert value. Keep in the end of the test file.
|
||||||
# drop table if exists t1;
|
|
||||||
# drop procedure if exists p1;
|
|
||||||
# --enable_warnings
|
|
||||||
#
|
#
|
||||||
# create table t1 (value varchar(15));
|
|
||||||
# create procedure p1() update t1 set value='updated' where value='old';
|
set @@global.concurrent_insert= @old_concurrent_insert;
|
||||||
#
|
|
||||||
# # load the procedure into sp cache and execute once
|
|
||||||
# call p1();
|
|
||||||
#
|
|
||||||
# insert into t1 (value) values ("old");
|
|
||||||
#
|
|
||||||
# connect (rl_holder, localhost, root,,);
|
|
||||||
# connect (rl_acquirer, localhost, root,,);
|
|
||||||
# connect (rl_contender, localhost, root,,);
|
|
||||||
# connect (rl_wait, localhost, root,,);
|
|
||||||
#
|
|
||||||
# connection rl_holder;
|
|
||||||
# select get_lock('b26162',120);
|
|
||||||
#
|
|
||||||
# connection rl_acquirer;
|
|
||||||
# --send select 'rl_acquirer', value from t1 where get_lock('b26162',120);
|
|
||||||
#
|
|
||||||
# # we must wait till this select opens and locks the tables
|
|
||||||
# connection rl_wait;
|
|
||||||
# let $wait_condition=
|
|
||||||
# select count(*) = 1 from information_schema.processlist
|
|
||||||
# where state = "User lock" and
|
|
||||||
# info = "select 'rl_acquirer', value from t1 where get_lock('b26162',120)";
|
|
||||||
# --source include/wait_condition.inc
|
|
||||||
#
|
|
||||||
# connection default;
|
|
||||||
# set session low_priority_updates=on;
|
|
||||||
# --send call p1();
|
|
||||||
#
|
|
||||||
# connection rl_wait;
|
|
||||||
# let $wait_condition=
|
|
||||||
# select count(*) = 1 from information_schema.processlist
|
|
||||||
# where state = "Locked" and
|
|
||||||
# info = "update t1 set value='updated' where value='old'";
|
|
||||||
# --source include/wait_condition.inc
|
|
||||||
#
|
|
||||||
# connection rl_contender;
|
|
||||||
# select 'rl_contender', value from t1;
|
|
||||||
#
|
|
||||||
# connection rl_holder;
|
|
||||||
# select release_lock('b26162');
|
|
||||||
#
|
|
||||||
# connection rl_acquirer;
|
|
||||||
# --reap
|
|
||||||
# connection default;
|
|
||||||
# --reap
|
|
||||||
#
|
|
||||||
# disconnect rl_holder;
|
|
||||||
# disconnect rl_acquirer;
|
|
||||||
# disconnect rl_wait;
|
|
||||||
# drop procedure p1;
|
|
||||||
# drop table t1;
|
|
||||||
# set session low_priority_updates=default;
|
|
||||||
|
@ -128,5 +128,37 @@ drop table t1, t2, t3;
|
|||||||
disconnect connection_update;
|
disconnect connection_update;
|
||||||
disconnect connection_aux;
|
disconnect connection_aux;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#34643: TRUNCATE crash if trigger and foreign key.
|
||||||
|
#
|
||||||
|
|
||||||
|
--disable_warnings
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
DROP TABLE IF EXISTS t2;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
CREATE TABLE t1(a INT PRIMARY KEY) ENGINE=innodb;
|
||||||
|
CREATE TABLE t2(b INT, FOREIGN KEY(b) REFERENCES t1(a)) ENGINE=innodb;
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
|
||||||
|
CREATE TRIGGER t1_bd BEFORE DELETE ON t1 FOR EACH ROW SET @a = 1;
|
||||||
|
CREATE TRIGGER t1_ad AFTER DELETE ON t1 FOR EACH ROW SET @b = 1;
|
||||||
|
|
||||||
|
SET @a = 0;
|
||||||
|
SET @b = 0;
|
||||||
|
|
||||||
|
TRUNCATE t1;
|
||||||
|
|
||||||
|
SELECT @a, @b;
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
|
||||||
|
DELETE FROM t1;
|
||||||
|
|
||||||
|
SELECT @a, @b;
|
||||||
|
|
||||||
|
DROP TABLE t2, t1;
|
||||||
|
|
||||||
|
|
||||||
--echo End of 5.0 tests
|
--echo End of 5.0 tests
|
||||||
|
@ -695,6 +695,16 @@ cli_safe_read(MYSQL *mysql)
|
|||||||
strmake(net->sqlstate, pos+1, SQLSTATE_LENGTH);
|
strmake(net->sqlstate, pos+1, SQLSTATE_LENGTH);
|
||||||
pos+= SQLSTATE_LENGTH+1;
|
pos+= SQLSTATE_LENGTH+1;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
The SQL state hasn't been received -- it should be reset to HY000
|
||||||
|
(unknown error sql state).
|
||||||
|
*/
|
||||||
|
|
||||||
|
strmov(net->sqlstate, unknown_sqlstate);
|
||||||
|
}
|
||||||
|
|
||||||
(void) strmake(net->last_error,(char*) pos,
|
(void) strmake(net->last_error,(char*) pos,
|
||||||
min((uint) len,(uint) sizeof(net->last_error)-1));
|
min((uint) len,(uint) sizeof(net->last_error)-1));
|
||||||
}
|
}
|
||||||
@ -733,11 +743,12 @@ my_bool
|
|||||||
cli_advanced_command(MYSQL *mysql, enum enum_server_command command,
|
cli_advanced_command(MYSQL *mysql, enum enum_server_command command,
|
||||||
const uchar *header, ulong header_length,
|
const uchar *header, ulong header_length,
|
||||||
const uchar *arg, ulong arg_length, my_bool skip_check,
|
const uchar *arg, ulong arg_length, my_bool skip_check,
|
||||||
MYSQL_STMT *stmt __attribute__((unused)))
|
MYSQL_STMT *stmt)
|
||||||
{
|
{
|
||||||
NET *net= &mysql->net;
|
NET *net= &mysql->net;
|
||||||
my_bool result= 1;
|
my_bool result= 1;
|
||||||
init_sigpipe_variables
|
init_sigpipe_variables
|
||||||
|
my_bool stmt_skip= stmt ? stmt->state != MYSQL_STMT_INIT_DONE : FALSE;
|
||||||
DBUG_ENTER("cli_advanced_command");
|
DBUG_ENTER("cli_advanced_command");
|
||||||
|
|
||||||
/* Don't give sigpipe errors if the client doesn't want them */
|
/* Don't give sigpipe errors if the client doesn't want them */
|
||||||
@ -745,7 +756,7 @@ cli_advanced_command(MYSQL *mysql, enum enum_server_command command,
|
|||||||
|
|
||||||
if (mysql->net.vio == 0)
|
if (mysql->net.vio == 0)
|
||||||
{ /* Do reconnect if possible */
|
{ /* Do reconnect if possible */
|
||||||
if (mysql_reconnect(mysql))
|
if (mysql_reconnect(mysql) || stmt_skip)
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
if (mysql->status != MYSQL_STATUS_READY ||
|
if (mysql->status != MYSQL_STATUS_READY ||
|
||||||
@ -777,7 +788,7 @@ cli_advanced_command(MYSQL *mysql, enum enum_server_command command,
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
end_server(mysql);
|
end_server(mysql);
|
||||||
if (mysql_reconnect(mysql))
|
if (mysql_reconnect(mysql) || stmt_skip)
|
||||||
goto end;
|
goto end;
|
||||||
if (net_write_command(net,(uchar) command, header, header_length,
|
if (net_write_command(net,(uchar) command, header, header_length,
|
||||||
arg, arg_length))
|
arg, arg_length))
|
||||||
@ -1911,7 +1922,13 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
|
|||||||
(int) have_tcpip));
|
(int) have_tcpip));
|
||||||
if (mysql->options.protocol == MYSQL_PROTOCOL_MEMORY)
|
if (mysql->options.protocol == MYSQL_PROTOCOL_MEMORY)
|
||||||
goto error;
|
goto error;
|
||||||
/* Try also with PIPE or TCP/IP */
|
|
||||||
|
/*
|
||||||
|
Try also with PIPE or TCP/IP. Clear the error from
|
||||||
|
create_shared_memory().
|
||||||
|
*/
|
||||||
|
|
||||||
|
net_clear_error(net);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -2521,6 +2538,9 @@ my_bool mysql_reconnect(MYSQL *mysql)
|
|||||||
if (stmt->state != MYSQL_STMT_INIT_DONE)
|
if (stmt->state != MYSQL_STMT_INIT_DONE)
|
||||||
{
|
{
|
||||||
stmt->mysql= 0;
|
stmt->mysql= 0;
|
||||||
|
stmt->last_errno= CR_SERVER_LOST;
|
||||||
|
strmov(stmt->last_error, ER(CR_SERVER_LOST));
|
||||||
|
strmov(stmt->sqlstate, unknown_sqlstate);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -975,8 +975,6 @@ void time_out_user_resource_limits(THD *thd, USER_CONN *uc);
|
|||||||
void decrease_user_connections(USER_CONN *uc);
|
void decrease_user_connections(USER_CONN *uc);
|
||||||
void thd_init_client_charset(THD *thd, uint cs_number);
|
void thd_init_client_charset(THD *thd, uint cs_number);
|
||||||
bool setup_connection_thread_globals(THD *thd);
|
bool setup_connection_thread_globals(THD *thd);
|
||||||
bool login_connection(THD *thd);
|
|
||||||
void end_connection(THD *thd);
|
|
||||||
|
|
||||||
bool mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create, bool silent);
|
bool mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create, bool silent);
|
||||||
bool mysql_alter_db(THD *thd, const char *db, HA_CREATE_INFO *create);
|
bool mysql_alter_db(THD *thd, const char *db, HA_CREATE_INFO *create);
|
||||||
@ -1897,6 +1895,7 @@ extern bool opt_disable_networking, opt_skip_show_db;
|
|||||||
extern my_bool opt_character_set_client_handshake;
|
extern my_bool opt_character_set_client_handshake;
|
||||||
extern bool volatile abort_loop, shutdown_in_progress;
|
extern bool volatile abort_loop, shutdown_in_progress;
|
||||||
extern uint volatile thread_count, thread_running, global_read_lock;
|
extern uint volatile thread_count, thread_running, global_read_lock;
|
||||||
|
extern uint connection_count;
|
||||||
extern my_bool opt_sql_bin_update, opt_safe_user_create, opt_no_mix_types;
|
extern my_bool opt_sql_bin_update, opt_safe_user_create, opt_no_mix_types;
|
||||||
extern my_bool opt_safe_show_db, opt_local_infile, opt_myisam_use_mmap;
|
extern my_bool opt_safe_show_db, opt_local_infile, opt_myisam_use_mmap;
|
||||||
extern my_bool opt_slave_compressed_protocol, use_temp_pool;
|
extern my_bool opt_slave_compressed_protocol, use_temp_pool;
|
||||||
@ -1935,7 +1934,7 @@ extern pthread_mutex_t LOCK_mysql_create_db,LOCK_Acl,LOCK_open, LOCK_lock_db,
|
|||||||
LOCK_slave_list, LOCK_active_mi, LOCK_manager, LOCK_global_read_lock,
|
LOCK_slave_list, LOCK_active_mi, LOCK_manager, LOCK_global_read_lock,
|
||||||
LOCK_global_system_variables, LOCK_user_conn,
|
LOCK_global_system_variables, LOCK_user_conn,
|
||||||
LOCK_prepared_stmt_count,
|
LOCK_prepared_stmt_count,
|
||||||
LOCK_bytes_sent, LOCK_bytes_received;
|
LOCK_bytes_sent, LOCK_bytes_received, LOCK_connection_count;
|
||||||
#ifdef HAVE_OPENSSL
|
#ifdef HAVE_OPENSSL
|
||||||
extern pthread_mutex_t LOCK_des_key_file;
|
extern pthread_mutex_t LOCK_des_key_file;
|
||||||
#endif
|
#endif
|
||||||
|
@ -585,7 +585,8 @@ pthread_mutex_t LOCK_mysql_create_db, LOCK_Acl, LOCK_open, LOCK_thread_count,
|
|||||||
LOCK_delayed_insert, LOCK_delayed_status, LOCK_delayed_create,
|
LOCK_delayed_insert, LOCK_delayed_status, LOCK_delayed_create,
|
||||||
LOCK_crypt, LOCK_bytes_sent, LOCK_bytes_received,
|
LOCK_crypt, LOCK_bytes_sent, LOCK_bytes_received,
|
||||||
LOCK_global_system_variables,
|
LOCK_global_system_variables,
|
||||||
LOCK_user_conn, LOCK_slave_list, LOCK_active_mi;
|
LOCK_user_conn, LOCK_slave_list, LOCK_active_mi,
|
||||||
|
LOCK_connection_count;
|
||||||
/**
|
/**
|
||||||
The below lock protects access to two global server variables:
|
The below lock protects access to two global server variables:
|
||||||
max_prepared_stmt_count and prepared_stmt_count. These variables
|
max_prepared_stmt_count and prepared_stmt_count. These variables
|
||||||
@ -721,6 +722,11 @@ char *des_key_file;
|
|||||||
struct st_VioSSLFd *ssl_acceptor_fd;
|
struct st_VioSSLFd *ssl_acceptor_fd;
|
||||||
#endif /* HAVE_OPENSSL */
|
#endif /* HAVE_OPENSSL */
|
||||||
|
|
||||||
|
/**
|
||||||
|
Number of currently active user connections. The variable is protected by
|
||||||
|
LOCK_connection_count.
|
||||||
|
*/
|
||||||
|
uint connection_count= 0;
|
||||||
|
|
||||||
/* Function declarations */
|
/* Function declarations */
|
||||||
|
|
||||||
@ -1342,6 +1348,7 @@ static void clean_up_mutexes()
|
|||||||
(void) pthread_mutex_destroy(&LOCK_bytes_sent);
|
(void) pthread_mutex_destroy(&LOCK_bytes_sent);
|
||||||
(void) pthread_mutex_destroy(&LOCK_bytes_received);
|
(void) pthread_mutex_destroy(&LOCK_bytes_received);
|
||||||
(void) pthread_mutex_destroy(&LOCK_user_conn);
|
(void) pthread_mutex_destroy(&LOCK_user_conn);
|
||||||
|
(void) pthread_mutex_destroy(&LOCK_connection_count);
|
||||||
Events::destroy_mutexes();
|
Events::destroy_mutexes();
|
||||||
#ifdef HAVE_OPENSSL
|
#ifdef HAVE_OPENSSL
|
||||||
(void) pthread_mutex_destroy(&LOCK_des_key_file);
|
(void) pthread_mutex_destroy(&LOCK_des_key_file);
|
||||||
@ -1784,6 +1791,11 @@ void unlink_thd(THD *thd)
|
|||||||
DBUG_ENTER("unlink_thd");
|
DBUG_ENTER("unlink_thd");
|
||||||
DBUG_PRINT("enter", ("thd: 0x%lx", (long) thd));
|
DBUG_PRINT("enter", ("thd: 0x%lx", (long) thd));
|
||||||
thd->cleanup();
|
thd->cleanup();
|
||||||
|
|
||||||
|
pthread_mutex_lock(&LOCK_connection_count);
|
||||||
|
--connection_count;
|
||||||
|
pthread_mutex_unlock(&LOCK_connection_count);
|
||||||
|
|
||||||
(void) pthread_mutex_lock(&LOCK_thread_count);
|
(void) pthread_mutex_lock(&LOCK_thread_count);
|
||||||
thread_count--;
|
thread_count--;
|
||||||
delete thd;
|
delete thd;
|
||||||
@ -3452,6 +3464,7 @@ static int init_thread_environment()
|
|||||||
(void) pthread_mutex_init(&LOCK_global_read_lock, MY_MUTEX_INIT_FAST);
|
(void) pthread_mutex_init(&LOCK_global_read_lock, MY_MUTEX_INIT_FAST);
|
||||||
(void) pthread_mutex_init(&LOCK_prepared_stmt_count, MY_MUTEX_INIT_FAST);
|
(void) pthread_mutex_init(&LOCK_prepared_stmt_count, MY_MUTEX_INIT_FAST);
|
||||||
(void) pthread_mutex_init(&LOCK_uuid_generator, MY_MUTEX_INIT_FAST);
|
(void) pthread_mutex_init(&LOCK_uuid_generator, MY_MUTEX_INIT_FAST);
|
||||||
|
(void) pthread_mutex_init(&LOCK_connection_count, MY_MUTEX_INIT_FAST);
|
||||||
#ifdef HAVE_OPENSSL
|
#ifdef HAVE_OPENSSL
|
||||||
(void) pthread_mutex_init(&LOCK_des_key_file,MY_MUTEX_INIT_FAST);
|
(void) pthread_mutex_init(&LOCK_des_key_file,MY_MUTEX_INIT_FAST);
|
||||||
#ifndef HAVE_YASSL
|
#ifndef HAVE_YASSL
|
||||||
@ -4699,6 +4712,11 @@ void create_thread_to_handle_connection(THD *thd)
|
|||||||
thread_count--;
|
thread_count--;
|
||||||
thd->killed= THD::KILL_CONNECTION; // Safety
|
thd->killed= THD::KILL_CONNECTION; // Safety
|
||||||
(void) pthread_mutex_unlock(&LOCK_thread_count);
|
(void) pthread_mutex_unlock(&LOCK_thread_count);
|
||||||
|
|
||||||
|
pthread_mutex_lock(&LOCK_connection_count);
|
||||||
|
--connection_count;
|
||||||
|
pthread_mutex_unlock(&LOCK_connection_count);
|
||||||
|
|
||||||
statistic_increment(aborted_connects,&LOCK_status);
|
statistic_increment(aborted_connects,&LOCK_status);
|
||||||
/* Can't use my_error() since store_globals has not been called. */
|
/* Can't use my_error() since store_globals has not been called. */
|
||||||
my_snprintf(error_message_buff, sizeof(error_message_buff),
|
my_snprintf(error_message_buff, sizeof(error_message_buff),
|
||||||
@ -4738,15 +4756,34 @@ static void create_new_thread(THD *thd)
|
|||||||
if (protocol_version > 9)
|
if (protocol_version > 9)
|
||||||
net->return_errno=1;
|
net->return_errno=1;
|
||||||
|
|
||||||
/* don't allow too many connections */
|
/*
|
||||||
if (thread_count - delayed_insert_threads >= max_connections+1 || abort_loop)
|
Don't allow too many connections. We roughly check here that we allow
|
||||||
|
only (max_connections + 1) connections.
|
||||||
|
*/
|
||||||
|
|
||||||
|
pthread_mutex_lock(&LOCK_connection_count);
|
||||||
|
|
||||||
|
if (connection_count >= max_connections + 1 || abort_loop)
|
||||||
{
|
{
|
||||||
|
pthread_mutex_unlock(&LOCK_connection_count);
|
||||||
|
|
||||||
DBUG_PRINT("error",("Too many connections"));
|
DBUG_PRINT("error",("Too many connections"));
|
||||||
close_connection(thd, ER_CON_COUNT_ERROR, 1);
|
close_connection(thd, ER_CON_COUNT_ERROR, 1);
|
||||||
delete thd;
|
delete thd;
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
++connection_count;
|
||||||
|
|
||||||
|
if (connection_count > max_used_connections)
|
||||||
|
max_used_connections= connection_count;
|
||||||
|
|
||||||
|
pthread_mutex_unlock(&LOCK_connection_count);
|
||||||
|
|
||||||
|
/* Start a new thread to handle connection. */
|
||||||
|
|
||||||
pthread_mutex_lock(&LOCK_thread_count);
|
pthread_mutex_lock(&LOCK_thread_count);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The initialization of thread_id is done in create_embedded_thd() for
|
The initialization of thread_id is done in create_embedded_thd() for
|
||||||
the embedded library.
|
the embedded library.
|
||||||
@ -4754,13 +4791,10 @@ static void create_new_thread(THD *thd)
|
|||||||
*/
|
*/
|
||||||
thd->thread_id= thd->variables.pseudo_thread_id= thread_id++;
|
thd->thread_id= thd->variables.pseudo_thread_id= thread_id++;
|
||||||
|
|
||||||
/* Start a new thread to handle connection */
|
|
||||||
thread_count++;
|
thread_count++;
|
||||||
|
|
||||||
if (thread_count - delayed_insert_threads > max_used_connections)
|
|
||||||
max_used_connections= thread_count - delayed_insert_threads;
|
|
||||||
|
|
||||||
thread_scheduler.add_connection(thd);
|
thread_scheduler.add_connection(thd);
|
||||||
|
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
#endif /* EMBEDDED_LIBRARY */
|
#endif /* EMBEDDED_LIBRARY */
|
||||||
|
@ -1998,6 +1998,7 @@ void Query_cache::make_disabled()
|
|||||||
query_cache_size= 0;
|
query_cache_size= 0;
|
||||||
queries_blocks= 0;
|
queries_blocks= 0;
|
||||||
free_memory= 0;
|
free_memory= 0;
|
||||||
|
free_memory_blocks= 0;
|
||||||
bins= 0;
|
bins= 0;
|
||||||
steps= 0;
|
steps= 0;
|
||||||
cache= 0;
|
cache= 0;
|
||||||
|
@ -395,8 +395,11 @@ Diagnostics_area::set_ok_status(THD *thd, ha_rows affected_rows_arg,
|
|||||||
{
|
{
|
||||||
DBUG_ASSERT(! is_set());
|
DBUG_ASSERT(! is_set());
|
||||||
#ifdef DBUG_OFF
|
#ifdef DBUG_OFF
|
||||||
/* In production, refuse to overwrite an error with an OK packet. */
|
/*
|
||||||
if (is_error())
|
In production, refuse to overwrite an error or a custom response
|
||||||
|
with an OK packet.
|
||||||
|
*/
|
||||||
|
if (is_error() || is_disabled())
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
/** Only allowed to report success if has not yet reported an error */
|
/** Only allowed to report success if has not yet reported an error */
|
||||||
@ -424,8 +427,11 @@ Diagnostics_area::set_eof_status(THD *thd)
|
|||||||
|
|
||||||
DBUG_ASSERT(! is_set());
|
DBUG_ASSERT(! is_set());
|
||||||
#ifdef DBUG_OFF
|
#ifdef DBUG_OFF
|
||||||
/* In production, refuse to overwrite an error with an EOF packet. */
|
/*
|
||||||
if (is_error())
|
In production, refuse to overwrite an error or a custom response
|
||||||
|
with an EOF packet.
|
||||||
|
*/
|
||||||
|
if (is_error() || is_disabled())
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -454,6 +460,14 @@ Diagnostics_area::set_error_status(THD *thd, uint sql_errno_arg,
|
|||||||
an error can happen during the flush.
|
an error can happen during the flush.
|
||||||
*/
|
*/
|
||||||
DBUG_ASSERT(! is_set() || can_overwrite_status);
|
DBUG_ASSERT(! is_set() || can_overwrite_status);
|
||||||
|
#ifdef DBUG_OFF
|
||||||
|
/*
|
||||||
|
In production, refuse to overwrite a custom response with an
|
||||||
|
ERROR packet.
|
||||||
|
*/
|
||||||
|
if (is_disabled())
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
m_sql_errno= sql_errno_arg;
|
m_sql_errno= sql_errno_arg;
|
||||||
strmake(m_message, message_arg, sizeof(m_message) - 1);
|
strmake(m_message, message_arg, sizeof(m_message) - 1);
|
||||||
|
@ -402,10 +402,11 @@ check_user(THD *thd, enum enum_server_command command,
|
|||||||
|
|
||||||
if (check_count)
|
if (check_count)
|
||||||
{
|
{
|
||||||
VOID(pthread_mutex_lock(&LOCK_thread_count));
|
pthread_mutex_lock(&LOCK_connection_count);
|
||||||
bool count_ok= thread_count <= max_connections + delayed_insert_threads
|
bool count_ok= connection_count <= max_connections ||
|
||||||
|| (thd->main_security_ctx.master_access & SUPER_ACL);
|
(thd->main_security_ctx.master_access & SUPER_ACL);
|
||||||
VOID(pthread_mutex_unlock(&LOCK_thread_count));
|
VOID(pthread_mutex_unlock(&LOCK_connection_count));
|
||||||
|
|
||||||
if (!count_ok)
|
if (!count_ok)
|
||||||
{ // too many connections
|
{ // too many connections
|
||||||
my_error(ER_CON_COUNT_ERROR, MYF(0));
|
my_error(ER_CON_COUNT_ERROR, MYF(0));
|
||||||
@ -930,7 +931,7 @@ bool setup_connection_thread_globals(THD *thd)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
bool login_connection(THD *thd)
|
static bool login_connection(THD *thd)
|
||||||
{
|
{
|
||||||
NET *net= &thd->net;
|
NET *net= &thd->net;
|
||||||
int error;
|
int error;
|
||||||
@ -968,7 +969,7 @@ bool login_connection(THD *thd)
|
|||||||
This mainly updates status variables
|
This mainly updates status variables
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void end_connection(THD *thd)
|
static void end_connection(THD *thd)
|
||||||
{
|
{
|
||||||
NET *net= &thd->net;
|
NET *net= &thd->net;
|
||||||
plugin_thdvar_cleanup(thd);
|
plugin_thdvar_cleanup(thd);
|
||||||
|
@ -45,6 +45,7 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
|
|||||||
bool transactional_table, safe_update, const_cond;
|
bool transactional_table, safe_update, const_cond;
|
||||||
bool const_cond_result;
|
bool const_cond_result;
|
||||||
ha_rows deleted= 0;
|
ha_rows deleted= 0;
|
||||||
|
bool triggers_applicable;
|
||||||
uint usable_index= MAX_KEY;
|
uint usable_index= MAX_KEY;
|
||||||
SELECT_LEX *select_lex= &thd->lex->select_lex;
|
SELECT_LEX *select_lex= &thd->lex->select_lex;
|
||||||
THD::killed_state killed_status= THD::NOT_KILLED;
|
THD::killed_state killed_status= THD::NOT_KILLED;
|
||||||
@ -102,6 +103,7 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
|
|||||||
/* Error evaluating val_int(). */
|
/* Error evaluating val_int(). */
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Test if the user wants to delete all rows and deletion doesn't have
|
Test if the user wants to delete all rows and deletion doesn't have
|
||||||
any side-effects (because of triggers), so we can use optimized
|
any side-effects (because of triggers), so we can use optimized
|
||||||
@ -249,7 +251,13 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
|
|||||||
|
|
||||||
init_ftfuncs(thd, select_lex, 1);
|
init_ftfuncs(thd, select_lex, 1);
|
||||||
thd_proc_info(thd, "updating");
|
thd_proc_info(thd, "updating");
|
||||||
if (table->triggers &&
|
|
||||||
|
/* NOTE: TRUNCATE must not invoke triggers. */
|
||||||
|
|
||||||
|
triggers_applicable= table->triggers &&
|
||||||
|
thd->lex->sql_command != SQLCOM_TRUNCATE;
|
||||||
|
|
||||||
|
if (triggers_applicable &&
|
||||||
table->triggers->has_triggers(TRG_EVENT_DELETE,
|
table->triggers->has_triggers(TRG_EVENT_DELETE,
|
||||||
TRG_ACTION_AFTER))
|
TRG_ACTION_AFTER))
|
||||||
{
|
{
|
||||||
@ -274,7 +282,7 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
|
|||||||
if (!(select && select->skip_record())&& ! thd->is_error() )
|
if (!(select && select->skip_record())&& ! thd->is_error() )
|
||||||
{
|
{
|
||||||
|
|
||||||
if (table->triggers &&
|
if (triggers_applicable &&
|
||||||
table->triggers->process_triggers(thd, TRG_EVENT_DELETE,
|
table->triggers->process_triggers(thd, TRG_EVENT_DELETE,
|
||||||
TRG_ACTION_BEFORE, FALSE))
|
TRG_ACTION_BEFORE, FALSE))
|
||||||
{
|
{
|
||||||
@ -285,7 +293,7 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
|
|||||||
if (!(error= table->file->ha_delete_row(table->record[0])))
|
if (!(error= table->file->ha_delete_row(table->record[0])))
|
||||||
{
|
{
|
||||||
deleted++;
|
deleted++;
|
||||||
if (table->triggers &&
|
if (triggers_applicable &&
|
||||||
table->triggers->process_triggers(thd, TRG_EVENT_DELETE,
|
table->triggers->process_triggers(thd, TRG_EVENT_DELETE,
|
||||||
TRG_ACTION_AFTER, FALSE))
|
TRG_ACTION_AFTER, FALSE))
|
||||||
{
|
{
|
||||||
|
@ -2555,6 +2555,8 @@ void mysql_stmt_close(THD *thd, char *packet)
|
|||||||
Prepared_statement *stmt;
|
Prepared_statement *stmt;
|
||||||
DBUG_ENTER("mysql_stmt_close");
|
DBUG_ENTER("mysql_stmt_close");
|
||||||
|
|
||||||
|
thd->main_da.disable_status();
|
||||||
|
|
||||||
if (!(stmt= find_prepared_statement(thd, stmt_id, "mysql_stmt_close")))
|
if (!(stmt= find_prepared_statement(thd, stmt_id, "mysql_stmt_close")))
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
|
|
||||||
@ -2566,8 +2568,6 @@ void mysql_stmt_close(THD *thd, char *packet)
|
|||||||
(void) stmt->deallocate();
|
(void) stmt->deallocate();
|
||||||
general_log_print(thd, thd->command, NullS);
|
general_log_print(thd, thd->command, NullS);
|
||||||
|
|
||||||
thd->main_da.disable_status();
|
|
||||||
|
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -181,7 +181,6 @@ struct TsmanChunk
|
|||||||
Vector<Uint32> bitmask;
|
Vector<Uint32> bitmask;
|
||||||
};
|
};
|
||||||
template class Vector<TsmanChunk>;
|
template class Vector<TsmanChunk>;
|
||||||
template class Vector<Uint32>;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -12016,6 +12016,7 @@ static void test_bug5194()
|
|||||||
|
|
||||||
rc= mysql_stmt_execute(stmt);
|
rc= mysql_stmt_execute(stmt);
|
||||||
check_execute(stmt, rc);
|
check_execute(stmt, rc);
|
||||||
|
mysql_stmt_reset(stmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
mysql_stmt_close(stmt);
|
mysql_stmt_close(stmt);
|
||||||
@ -16610,6 +16611,11 @@ static void test_bug27592()
|
|||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Bug#29948 autoreconnect + prepared statements + kill seems unstable
|
||||||
|
*/
|
||||||
|
|
||||||
static void test_bug29948()
|
static void test_bug29948()
|
||||||
{
|
{
|
||||||
MYSQL *dbc=NULL;
|
MYSQL *dbc=NULL;
|
||||||
@ -16623,6 +16629,9 @@ static void test_bug29948()
|
|||||||
int buf;
|
int buf;
|
||||||
unsigned long length, cursor_type;
|
unsigned long length, cursor_type;
|
||||||
|
|
||||||
|
DBUG_ENTER("test_bug29948");
|
||||||
|
myheader("test_bug29948");
|
||||||
|
|
||||||
dbc = mysql_init(NULL);
|
dbc = mysql_init(NULL);
|
||||||
DIE_UNLESS(dbc);
|
DIE_UNLESS(dbc);
|
||||||
|
|
||||||
@ -16658,7 +16667,7 @@ static void test_bug29948()
|
|||||||
res= mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, (void *)&cursor_type);
|
res= mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, (void *)&cursor_type);
|
||||||
myquery(res);
|
myquery(res);
|
||||||
|
|
||||||
query= "SELECT * from t1 where a=?";
|
query= "SELECT * FROM t1 WHERE a=?";
|
||||||
res= mysql_stmt_prepare(stmt, query, strlen(query));
|
res= mysql_stmt_prepare(stmt, query, strlen(query));
|
||||||
myquery(res);
|
myquery(res);
|
||||||
|
|
||||||
@ -16671,15 +16680,19 @@ static void test_bug29948()
|
|||||||
res= mysql_stmt_bind_result(stmt,&bind);
|
res= mysql_stmt_bind_result(stmt,&bind);
|
||||||
check_execute(stmt, res);
|
check_execute(stmt, res);
|
||||||
|
|
||||||
sprintf(kill_buf, "kill %ld", dbc->thread_id);
|
my_snprintf(kill_buf, sizeof(kill_buf), "KILL %ld", dbc->thread_id);
|
||||||
mysql_query(dbc, kill_buf);
|
res= mysql_query(dbc, kill_buf);
|
||||||
|
myquery(res);
|
||||||
|
|
||||||
res= mysql_stmt_store_result(stmt);
|
res= mysql_stmt_store_result(stmt);
|
||||||
DIE_UNLESS(res);
|
DIE_UNLESS(res);
|
||||||
|
|
||||||
mysql_stmt_free_result(stmt);
|
mysql_stmt_free_result(stmt);
|
||||||
mysql_stmt_close(stmt);
|
mysql_stmt_close(stmt);
|
||||||
mysql_query(dbc, "DROP TABLE t1");
|
|
||||||
|
res= mysql_query(dbc, "DROP TABLE t1");
|
||||||
|
myquery(res);
|
||||||
|
|
||||||
mysql_close(dbc);
|
mysql_close(dbc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user