Commit 32734072 authored by kent@mysql.com's avatar kent@mysql.com

Merge kboortz@bk-internal.mysql.com:/home/bk/mysql-4.1

into mysql.com:/Users/kent/mysql/bk/mysql-4.1
parents e99a2e8a 3812e15c
...@@ -153,10 +153,6 @@ static char TMPDIR[FN_REFLEN]; ...@@ -153,10 +153,6 @@ static char TMPDIR[FN_REFLEN];
static char delimiter[MAX_DELIMITER]= DEFAULT_DELIMITER; static char delimiter[MAX_DELIMITER]= DEFAULT_DELIMITER;
static uint delimiter_length= 1; static uint delimiter_length= 1;
static int *cur_block, *block_stack_end;
static int block_stack[BLOCK_STACK_DEPTH];
static int block_ok_stack[BLOCK_STACK_DEPTH];
static CHARSET_INFO *charset_info= &my_charset_latin1; /* Default charset */ static CHARSET_INFO *charset_info= &my_charset_latin1; /* Default charset */
static const char *charset_name= "latin1"; /* Default character set name */ static const char *charset_name= "latin1"; /* Default character set name */
...@@ -210,8 +206,6 @@ MYSQL_RES *last_result=0; ...@@ -210,8 +206,6 @@ MYSQL_RES *last_result=0;
PARSER parser; PARSER parser;
MASTER_POS master_pos; MASTER_POS master_pos;
int *block_ok; /* set to 0 if the current block should not be executed */
int false_block_depth = 0;
/* if set, all results are concated and compared against this file */ /* if set, all results are concated and compared against this file */
const char *result_file = 0; const char *result_file = 0;
...@@ -281,6 +275,7 @@ Q_QUERY_VERTICAL, Q_QUERY_HORIZONTAL, ...@@ -281,6 +275,7 @@ Q_QUERY_VERTICAL, Q_QUERY_HORIZONTAL,
Q_START_TIMER, Q_END_TIMER, Q_START_TIMER, Q_END_TIMER,
Q_CHARACTER_SET, Q_DISABLE_PS_PROTOCOL, Q_ENABLE_PS_PROTOCOL, Q_CHARACTER_SET, Q_DISABLE_PS_PROTOCOL, Q_ENABLE_PS_PROTOCOL,
Q_DISABLE_RECONNECT, Q_ENABLE_RECONNECT, Q_DISABLE_RECONNECT, Q_ENABLE_RECONNECT,
Q_IF,
Q_UNKNOWN, /* Unknown command. */ Q_UNKNOWN, /* Unknown command. */
Q_COMMENT, /* Comments, ignored. */ Q_COMMENT, /* Comments, ignored. */
...@@ -368,9 +363,20 @@ const char *command_names[]= ...@@ -368,9 +363,20 @@ const char *command_names[]=
"enable_ps_protocol", "enable_ps_protocol",
"disable_reconnect", "disable_reconnect",
"enable_reconnect", "enable_reconnect",
"if",
0 0
}; };
/* Block stack */
typedef struct
{
int line; /* Start line of block */
my_bool ok; /* Should block be executed */
enum enum_commands cmd; /* Command owning the block */
} BLOCK;
static BLOCK block_stack[BLOCK_STACK_DEPTH];
static BLOCK *cur_block, *block_stack_end;
TYPELIB command_typelib= {array_elements(command_names),"", TYPELIB command_typelib= {array_elements(command_names),"",
command_names, 0}; command_names, 0};
...@@ -1723,36 +1729,54 @@ int do_connect(struct st_query* q) ...@@ -1723,36 +1729,54 @@ int do_connect(struct st_query* q)
int do_done(struct st_query* q) int do_done(struct st_query* q)
{ {
/* Dummy statement to eliminate compiler warning */
q->type = Q_END_BLOCK; q->type = Q_END_BLOCK;
/* Check if empty block stack */
if (cur_block == block_stack) if (cur_block == block_stack)
die("Stray '}' - end of block before beginning"); die("Stray '}' - end of block before beginning");
if (*block_ok--)
/* Test if inner block has been executed */
if (cur_block->ok && cur_block->cmd == Q_WHILE)
{ {
parser.current_line = *--cur_block; /* Pop block from stack, re-execute outer block */
cur_block--;
parser.current_line = cur_block->line;
} }
else else
{ {
++parser.current_line; /* Pop block from stack, goto next line */
--cur_block; cur_block--;
parser.current_line++;
} }
return 0; return 0;
} }
int do_while(struct st_query* q)
int do_block(enum enum_commands cmd, struct st_query* q)
{ {
char* p=q->first_argument; char* p=q->first_argument;
const char* expr_start, *expr_end; const char* expr_start, *expr_end;
VAR v; VAR v;
/* Check stack overflow */
if (cur_block == block_stack_end) if (cur_block == block_stack_end)
die("Nesting too deeply"); die("Nesting too deeply");
if (!*block_ok)
/* Set way to find outer block again, increase line counter */
cur_block->line= parser.current_line++;
/* If this block is ignored */
if (!cur_block->ok)
{ {
++false_block_depth; /* Inner block should be ignored too */
*++block_ok = 0; cur_block++;
*cur_block++ = parser.current_line++; cur_block->cmd= cmd;
cur_block->ok= FALSE;
return 0; return 0;
} }
/* Parse and evaluate test expression */
expr_start = strchr(p, '('); expr_start = strchr(p, '(');
if (!expr_start) if (!expr_start)
die("missing '(' in while"); die("missing '(' in while");
...@@ -1761,14 +1785,12 @@ int do_while(struct st_query* q) ...@@ -1761,14 +1785,12 @@ int do_while(struct st_query* q)
die("missing ')' in while"); die("missing ')' in while");
var_init(&v,0,0,0,0); var_init(&v,0,0,0,0);
eval_expr(&v, ++expr_start, &expr_end); eval_expr(&v, ++expr_start, &expr_end);
*cur_block++ = parser.current_line++;
if (!v.int_val) /* Define inner block */
{ cur_block++;
*++block_ok = 0; cur_block->cmd= cmd;
false_block_depth++; cur_block->ok= (v.int_val ? TRUE : FALSE);
}
else
*++block_ok = 1;
var_free(&v); var_free(&v);
return 0; return 0;
} }
...@@ -3404,12 +3426,13 @@ int main(int argc, char **argv) ...@@ -3404,12 +3426,13 @@ int main(int argc, char **argv)
lineno = lineno_stack; lineno = lineno_stack;
my_init_dynamic_array(&q_lines, sizeof(struct st_query*), INIT_Q_LINES, my_init_dynamic_array(&q_lines, sizeof(struct st_query*), INIT_Q_LINES,
INIT_Q_LINES); INIT_Q_LINES);
memset(block_stack, 0, sizeof(block_stack)); memset(block_stack, 0, sizeof(block_stack));
block_stack_end = block_stack + BLOCK_STACK_DEPTH; block_stack_end= block_stack + BLOCK_STACK_DEPTH;
memset(block_ok_stack, 0, sizeof(block_stack)); cur_block= block_stack;
cur_block = block_stack; cur_block->ok= TRUE; /* Outer block should always be executed */
block_ok = block_ok_stack; cur_block->cmd= Q_UNKNOWN;
*block_ok = 1;
init_dynamic_string(&ds_res, "", 0, 65536); init_dynamic_string(&ds_res, "", 0, 65536);
parse_args(argc, argv); parse_args(argc, argv);
if (mysql_server_init(embedded_server_arg_count, if (mysql_server_init(embedded_server_arg_count,
...@@ -3461,7 +3484,7 @@ int main(int argc, char **argv) ...@@ -3461,7 +3484,7 @@ int main(int argc, char **argv)
int current_line_inc = 1, processed = 0; int current_line_inc = 1, processed = 0;
if (q->type == Q_UNKNOWN || q->type == Q_COMMENT_WITH_COMMAND) if (q->type == Q_UNKNOWN || q->type == Q_COMMENT_WITH_COMMAND)
get_query_type(q); get_query_type(q);
if (*block_ok) if (cur_block->ok)
{ {
processed = 1; processed = 1;
switch (q->type) { switch (q->type) {
...@@ -3657,7 +3680,8 @@ int main(int argc, char **argv) ...@@ -3657,7 +3680,8 @@ int main(int argc, char **argv)
{ {
current_line_inc = 0; current_line_inc = 0;
switch (q->type) { switch (q->type) {
case Q_WHILE: do_while(q); break; case Q_WHILE: do_block(Q_WHILE, q); break;
case Q_IF: do_block(Q_IF, q); break;
case Q_END_BLOCK: do_done(q); break; case Q_END_BLOCK: do_done(q); break;
default: current_line_inc = 1; break; default: current_line_inc = 1; break;
} }
......
...@@ -82,9 +82,16 @@ install-data-local: ...@@ -82,9 +82,16 @@ install-data-local:
$(INSTALL_DATA) $(srcdir)/lib/init_db.sql $(DESTDIR)$(testdir)/lib $(INSTALL_DATA) $(srcdir)/lib/init_db.sql $(DESTDIR)$(testdir)/lib
$(INSTALL_DATA) $(srcdir)/lib/*.pl $(DESTDIR)$(testdir)/lib $(INSTALL_DATA) $(srcdir)/lib/*.pl $(DESTDIR)$(testdir)/lib
std_data/%.pem: std_data/client-key.pem:
@CP@ $(top_srcdir)/SSL/$(@F) $(srcdir)/std_data
std_data/client-cert.pem:
@CP@ $(top_srcdir)/SSL/$(@F) $(srcdir)/std_data
std_data/cacert.pem:
@CP@ $(top_srcdir)/SSL/$(@F) $(srcdir)/std_data
std_data/server-cert.pem:
@CP@ $(top_srcdir)/SSL/$(@F) $(srcdir)/std_data
std_data/server-key.pem:
@CP@ $(top_srcdir)/SSL/$(@F) $(srcdir)/std_data @CP@ $(top_srcdir)/SSL/$(@F) $(srcdir)/std_data
SUFFIXES = .sh SUFFIXES = .sh
......
...@@ -4,6 +4,12 @@ ...@@ -4,6 +4,12 @@
# the $variables is extreme sensitive. # the $variables is extreme sensitive.
# #
###############################################################
# Debug options : To debug this test script
###############################################################
let $showbinlog= 0;
let $manipulate= 1;
######## The typical test sequence ######## The typical test sequence
# 1. INSERT without commit # 1. INSERT without commit
# check table content of master and slave # check table content of master and slave
...@@ -52,9 +58,12 @@ let $MAX= `SELECT MAX(f1) FROM t1` ; ...@@ -52,9 +58,12 @@ let $MAX= `SELECT MAX(f1) FROM t1` ;
eval INSERT INTO t1 SET f1= $MAX + 1; eval INSERT INTO t1 SET f1= $MAX + 1;
# results before DDL(to be tested) # results before DDL(to be tested)
SELECT MAX(f1) FROM t1; SELECT MAX(f1) FROM t1;
if ($show_binlog)
{
--replace_result $VERSION VERSION --replace_result $VERSION VERSION
--replace_column 2 # 5 # --replace_column 2 # 5 #
eval SHOW BINLOG EVENTS IN 'master-bin.$_log_num_s'; eval SHOW BINLOG EVENTS IN 'master-bin.$_log_num_s';
}
sync_slave_with_master; sync_slave_with_master;
connection slave; connection slave;
...@@ -63,9 +72,12 @@ SELECT '-------- switch to slave --------' as ""; ...@@ -63,9 +72,12 @@ SELECT '-------- switch to slave --------' as "";
--enable_query_log --enable_query_log
# results before DDL(to be tested) # results before DDL(to be tested)
SELECT MAX(f1) FROM t1; SELECT MAX(f1) FROM t1;
if ($show_binlog)
{
--replace_result $VERSION VERSION --replace_result $VERSION VERSION
--replace_column 2 # 5 # --replace_column 2 # 5 #
eval SHOW BINLOG EVENTS IN 'slave-bin.$_log_num_s'; eval SHOW BINLOG EVENTS IN 'slave-bin.$_log_num_s';
}
############################################################### ###############################################################
# command to be tested # command to be tested
...@@ -79,9 +91,12 @@ eval $my_stmt; ...@@ -79,9 +91,12 @@ eval $my_stmt;
let $my_stmt= ERROR: YOU FORGOT TO FILL IN THE STATEMENT; let $my_stmt= ERROR: YOU FORGOT TO FILL IN THE STATEMENT;
# results after DDL(to be tested) # results after DDL(to be tested)
SELECT MAX(f1) FROM t1; SELECT MAX(f1) FROM t1;
if ($show_binlog)
{
--replace_result $VERSION VERSION --replace_result $VERSION VERSION
--replace_column 2 # 5 # --replace_column 2 # 5 #
eval SHOW BINLOG EVENTS IN 'master-bin.$_log_num_s'; eval SHOW BINLOG EVENTS IN 'master-bin.$_log_num_s';
}
sync_slave_with_master; sync_slave_with_master;
connection slave; connection slave;
...@@ -90,9 +105,12 @@ SELECT '-------- switch to slave --------' as ""; ...@@ -90,9 +105,12 @@ SELECT '-------- switch to slave --------' as "";
--enable_query_log --enable_query_log
# results after DDL(to be tested) # results after DDL(to be tested)
SELECT MAX(f1) FROM t1; SELECT MAX(f1) FROM t1;
if ($show_binlog)
{
--replace_result $VERSION VERSION --replace_result $VERSION VERSION
--replace_column 2 # 5 # --replace_column 2 # 5 #
eval SHOW BINLOG EVENTS IN 'slave-bin.$_log_num_s'; eval SHOW BINLOG EVENTS IN 'slave-bin.$_log_num_s';
}
############################################################### ###############################################################
# ROLLBACK # ROLLBACK
...@@ -114,9 +132,12 @@ eval SELECT CONCAT(CONCAT('TEST-INFO: MASTER: The INSERT is ', ...@@ -114,9 +132,12 @@ eval SELECT CONCAT(CONCAT('TEST-INFO: MASTER: The INSERT is ',
' (Failed)')) AS "" ' (Failed)')) AS ""
FROM mysqltest1.t1; FROM mysqltest1.t1;
--enable_query_log --enable_query_log
if ($show_binlog)
{
--replace_result $VERSION VERSION --replace_result $VERSION VERSION
--replace_column 2 # 5 # --replace_column 2 # 5 #
eval SHOW BINLOG EVENTS IN 'master-bin.$_log_num_s'; eval SHOW BINLOG EVENTS IN 'master-bin.$_log_num_s';
}
sync_slave_with_master; sync_slave_with_master;
connection slave; connection slave;
...@@ -133,16 +154,17 @@ eval SELECT CONCAT(CONCAT('TEST-INFO: SLAVE: The INSERT is ', ...@@ -133,16 +154,17 @@ eval SELECT CONCAT(CONCAT('TEST-INFO: SLAVE: The INSERT is ',
' (Failed)')) AS "" ' (Failed)')) AS ""
FROM mysqltest1.t1; FROM mysqltest1.t1;
--enable_query_log --enable_query_log
if ($show_binlog)
{
--replace_result $VERSION VERSION --replace_result $VERSION VERSION
--replace_column 2 # 5 # --replace_column 2 # 5 #
eval SHOW BINLOG EVENTS IN 'slave-bin.$_log_num_s'; eval SHOW BINLOG EVENTS IN 'slave-bin.$_log_num_s';
}
############################################################### ###############################################################
# Manipulate binlog # Manipulate binlog
############################################################### ###############################################################
#let $manipulate= 0; if ($manipulate)
let $manipulate= 1;
while ($manipulate)
{ {
#### Manipulate the binary logs, #### Manipulate the binary logs,
# so that the output of SHOW BINLOG EVENTS IN <current log> # so that the output of SHOW BINLOG EVENTS IN <current log>
...@@ -171,7 +193,6 @@ flush logs; ...@@ -171,7 +193,6 @@ flush logs;
# sleep 1; # sleep 1;
# eval SHOW BINLOG EVENTS IN 'slave-bin.$_log_num_s'; # eval SHOW BINLOG EVENTS IN 'slave-bin.$_log_num_s';
inc $_log_num_n; inc $_log_num_n;
let $manipulate= 0;
} }
connection master; connection master;
......
...@@ -12,10 +12,9 @@ show status like "Qcache_queries_in_cache"; ...@@ -12,10 +12,9 @@ show status like "Qcache_queries_in_cache";
Variable_name Value Variable_name Value
Qcache_queries_in_cache 0 Qcache_queries_in_cache 0
drop table t1; drop table t1;
commit;
set autocommit=1; set autocommit=1;
begin;
create table t1 (a int not null) engine=bdb; create table t1 (a int not null) engine=bdb;
begin;
insert into t1 values (1),(2),(3); insert into t1 values (1),(2),(3);
select * from t1; select * from t1;
a a
...@@ -26,7 +25,6 @@ show status like "Qcache_queries_in_cache"; ...@@ -26,7 +25,6 @@ show status like "Qcache_queries_in_cache";
Variable_name Value Variable_name Value
Qcache_queries_in_cache 0 Qcache_queries_in_cache 0
drop table t1; drop table t1;
commit;
create table t1 (a int not null) engine=bdb; create table t1 (a int not null) engine=bdb;
create table t2 (a int not null) engine=bdb; create table t2 (a int not null) engine=bdb;
create table t3 (a int not null) engine=bdb; create table t3 (a int not null) engine=bdb;
......
...@@ -78,4 +78,4 @@ drop database mysqltest; ...@@ -78,4 +78,4 @@ drop database mysqltest;
prepare stmt4 from ' show full processlist '; prepare stmt4 from ' show full processlist ';
execute stmt4; execute stmt4;
Id User Host db Command Time State Info Id User Host db Command Time State Info
number root localhost test Query time NULL show full processlist number root localhost test Execute time NULL show full processlist
This diff is collapsed.
...@@ -14,15 +14,13 @@ insert into t1 values (1),(2),(3); ...@@ -14,15 +14,13 @@ insert into t1 values (1),(2),(3);
select * from t1; select * from t1;
show status like "Qcache_queries_in_cache"; show status like "Qcache_queries_in_cache";
drop table t1; drop table t1;
commit;
set autocommit=1; set autocommit=1;
begin;
create table t1 (a int not null) engine=bdb; create table t1 (a int not null) engine=bdb;
begin;
insert into t1 values (1),(2),(3); insert into t1 values (1),(2),(3);
select * from t1; select * from t1;
show status like "Qcache_queries_in_cache"; show status like "Qcache_queries_in_cache";
drop table t1; drop table t1;
commit;
create table t1 (a int not null) engine=bdb; create table t1 (a int not null) engine=bdb;
create table t2 (a int not null) engine=bdb; create table t2 (a int not null) engine=bdb;
create table t3 (a int not null) engine=bdb; create table t3 (a int not null) engine=bdb;
......
...@@ -253,6 +253,8 @@ let $my_slave_commit= false; ...@@ -253,6 +253,8 @@ let $my_slave_commit= false;
--source include/rpl_stmt_seq.inc --source include/rpl_stmt_seq.inc
# With prior read locking # With prior read locking
# Note that this test generate an error since the rpl_stmt_seq.inc
# tries to insert into t1.
LOCK TABLES mysqltest1.t1 READ; LOCK TABLES mysqltest1.t1 READ;
let $my_stmt= UNLOCK TABLES; let $my_stmt= UNLOCK TABLES;
let $my_master_commit= false; let $my_master_commit= false;
......
...@@ -139,6 +139,8 @@ ConfigRetriever::getConfig(NdbMgmHandle m_handle){ ...@@ -139,6 +139,8 @@ ConfigRetriever::getConfig(NdbMgmHandle m_handle){
return 0; return 0;
} }
ndb_mgm_disconnect(m_handle);
return conf; return conf;
} }
......
...@@ -424,8 +424,6 @@ struct Query_cache_query_flags ...@@ -424,8 +424,6 @@ struct Query_cache_query_flags
#define query_cache_invalidate_by_MyISAM_filename_ref NULL #define query_cache_invalidate_by_MyISAM_filename_ref NULL
#endif /*HAVE_QUERY_CACHE*/ #endif /*HAVE_QUERY_CACHE*/
#define prepare_execute(A) ((A)->command == COM_EXECUTE)
int mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create, bool silent); int mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create, bool silent);
int mysql_alter_db(THD *thd, const char *db, HA_CREATE_INFO *create); int mysql_alter_db(THD *thd, const char *db, HA_CREATE_INFO *create);
int mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent); int mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent);
...@@ -462,6 +460,7 @@ void mysql_execute_command(THD *thd); ...@@ -462,6 +460,7 @@ void mysql_execute_command(THD *thd);
bool do_command(THD *thd); bool do_command(THD *thd);
bool dispatch_command(enum enum_server_command command, THD *thd, bool dispatch_command(enum enum_server_command command, THD *thd,
char* packet, uint packet_length); char* packet, uint packet_length);
void log_slow_statement(THD *thd);
bool check_dup(const char *db, const char *name, TABLE_LIST *tables); bool check_dup(const char *db, const char *name, TABLE_LIST *tables);
bool table_cache_init(void); bool table_cache_init(void);
...@@ -899,6 +898,8 @@ extern ulong binlog_cache_size, max_binlog_cache_size, open_files_limit; ...@@ -899,6 +898,8 @@ extern ulong binlog_cache_size, max_binlog_cache_size, open_files_limit;
extern ulong max_binlog_size, max_relay_log_size; extern ulong max_binlog_size, max_relay_log_size;
extern ulong rpl_recovery_rank, thread_cache_size; extern ulong rpl_recovery_rank, thread_cache_size;
extern ulong com_stat[(uint) SQLCOM_END], com_other, back_log; extern ulong com_stat[(uint) SQLCOM_END], com_other, back_log;
extern ulong com_stmt_prepare, com_stmt_execute, com_stmt_send_long_data;
extern ulong com_stmt_reset, com_stmt_close;
extern ulong specialflag, current_pid; extern ulong specialflag, current_pid;
extern ulong expire_logs_days, sync_binlog_period, sync_binlog_counter; extern ulong expire_logs_days, sync_binlog_period, sync_binlog_counter;
extern my_bool relay_log_purge, opt_innodb_safe_binlog; extern my_bool relay_log_purge, opt_innodb_safe_binlog;
...@@ -918,6 +919,7 @@ extern my_bool opt_slave_compressed_protocol, use_temp_pool; ...@@ -918,6 +919,7 @@ extern my_bool opt_slave_compressed_protocol, use_temp_pool;
extern my_bool opt_readonly, lower_case_file_system; extern my_bool opt_readonly, lower_case_file_system;
extern my_bool opt_enable_named_pipe, opt_sync_frm, opt_allow_suspicious_udfs; extern my_bool opt_enable_named_pipe, opt_sync_frm, opt_allow_suspicious_udfs;
extern my_bool opt_secure_auth; extern my_bool opt_secure_auth;
extern my_bool opt_log_slow_admin_statements;
extern uint opt_crash_binlog_innodb; extern uint opt_crash_binlog_innodb;
extern char *shared_memory_base_name, *mysqld_unix_port; extern char *shared_memory_base_name, *mysqld_unix_port;
extern bool opt_enable_shared_memory; extern bool opt_enable_shared_memory;
......
...@@ -294,6 +294,7 @@ my_bool opt_sync_bdb_logs, opt_sync_frm, opt_allow_suspicious_udfs; ...@@ -294,6 +294,7 @@ my_bool opt_sync_bdb_logs, opt_sync_frm, opt_allow_suspicious_udfs;
my_bool opt_secure_auth= 0; my_bool opt_secure_auth= 0;
my_bool opt_short_log_format= 0; my_bool opt_short_log_format= 0;
my_bool opt_log_queries_not_using_indexes= 0; my_bool opt_log_queries_not_using_indexes= 0;
my_bool opt_log_slow_admin_statements= 0;
my_bool lower_case_file_system= 0; my_bool lower_case_file_system= 0;
my_bool opt_innodb_safe_binlog= 0; my_bool opt_innodb_safe_binlog= 0;
volatile bool mqh_used = 0; volatile bool mqh_used = 0;
...@@ -315,6 +316,8 @@ ulong slave_net_timeout, slave_trans_retries; ...@@ -315,6 +316,8 @@ ulong slave_net_timeout, slave_trans_retries;
ulong thread_cache_size=0, binlog_cache_size=0, max_binlog_cache_size=0; ulong thread_cache_size=0, binlog_cache_size=0, max_binlog_cache_size=0;
ulong query_cache_size=0; ulong query_cache_size=0;
ulong com_stat[(uint) SQLCOM_END], com_other; ulong com_stat[(uint) SQLCOM_END], com_other;
ulong com_stmt_prepare, com_stmt_execute, com_stmt_send_long_data;
ulong com_stmt_close, com_stmt_reset;
ulong bytes_sent, bytes_received, net_big_packet_count; ulong bytes_sent, bytes_received, net_big_packet_count;
ulong refresh_version, flush_version; /* Increments on each reload */ ulong refresh_version, flush_version; /* Increments on each reload */
ulong query_id, long_query_count; ulong query_id, long_query_count;
...@@ -4196,7 +4199,8 @@ enum options_mysqld ...@@ -4196,7 +4199,8 @@ enum options_mysqld
OPT_TIME_FORMAT, OPT_TIME_FORMAT,
OPT_DATETIME_FORMAT, OPT_DATETIME_FORMAT,
OPT_LOG_QUERIES_NOT_USING_INDEXES, OPT_LOG_QUERIES_NOT_USING_INDEXES,
OPT_DEFAULT_TIME_ZONE OPT_DEFAULT_TIME_ZONE,
OPT_LOG_SLOW_ADMIN_STATEMENTS
}; };
...@@ -4456,7 +4460,7 @@ Disable with --skip-isam.", ...@@ -4456,7 +4460,7 @@ Disable with --skip-isam.",
"Log some extra information to update log. Please note that this option is deprecated; see --log-short-format option.", "Log some extra information to update log. Please note that this option is deprecated; see --log-short-format option.",
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
{"log-queries-not-using-indexes", OPT_LOG_QUERIES_NOT_USING_INDEXES, {"log-queries-not-using-indexes", OPT_LOG_QUERIES_NOT_USING_INDEXES,
"Log queries that are executed without benefit of any index.", "Log queries that are executed without benefit of any index to the slow log if it is open.",
(gptr*) &opt_log_queries_not_using_indexes, (gptr*) &opt_log_queries_not_using_indexes, (gptr*) &opt_log_queries_not_using_indexes, (gptr*) &opt_log_queries_not_using_indexes,
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
{"log-short-format", OPT_SHORT_LOG_FORMAT, {"log-short-format", OPT_SHORT_LOG_FORMAT,
...@@ -4467,8 +4471,13 @@ Disable with --skip-isam.", ...@@ -4467,8 +4471,13 @@ Disable with --skip-isam.",
"Tells the slave to log the updates from the slave thread to the binary log. You will need to turn it on if you plan to daisy-chain the slaves.", "Tells the slave to log the updates from the slave thread to the binary log. You will need to turn it on if you plan to daisy-chain the slaves.",
(gptr*) &opt_log_slave_updates, (gptr*) &opt_log_slave_updates, 0, GET_BOOL, (gptr*) &opt_log_slave_updates, (gptr*) &opt_log_slave_updates, 0, GET_BOOL,
NO_ARG, 0, 0, 0, 0, 0, 0}, NO_ARG, 0, 0, 0, 0, 0, 0},
{"log-slow-admin-statements", OPT_LOG_SLOW_ADMIN_STATEMENTS,
"Log slow OPTIMIZE, ANALYZE, ALTER and other administrative statements to the slow log if it is open.",
(gptr*) &opt_log_slow_admin_statements,
(gptr*) &opt_log_slow_admin_statements,
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
{"log-slow-queries", OPT_SLOW_QUERY_LOG, {"log-slow-queries", OPT_SLOW_QUERY_LOG,
"Log slow queries to this log file. Defaults logging to hostname-slow.log file.", "Log slow queries to this log file. Defaults logging to hostname-slow.log file. Must be enabled to activate other slow log options.",
(gptr*) &opt_slow_logname, (gptr*) &opt_slow_logname, 0, GET_STR, OPT_ARG, (gptr*) &opt_slow_logname, (gptr*) &opt_slow_logname, 0, GET_STR, OPT_ARG,
0, 0, 0, 0, 0, 0}, 0, 0, 0, 0, 0, 0},
{"log-update", OPT_UPDATE_LOG, {"log-update", OPT_UPDATE_LOG,
...@@ -5467,6 +5476,11 @@ struct show_var_st status_vars[]= { ...@@ -5467,6 +5476,11 @@ struct show_var_st status_vars[]= {
{"Com_show_warnings", (char*) (com_stat+(uint) SQLCOM_SHOW_WARNS),SHOW_LONG}, {"Com_show_warnings", (char*) (com_stat+(uint) SQLCOM_SHOW_WARNS),SHOW_LONG},
{"Com_slave_start", (char*) (com_stat+(uint) SQLCOM_SLAVE_START),SHOW_LONG}, {"Com_slave_start", (char*) (com_stat+(uint) SQLCOM_SLAVE_START),SHOW_LONG},
{"Com_slave_stop", (char*) (com_stat+(uint) SQLCOM_SLAVE_STOP),SHOW_LONG}, {"Com_slave_stop", (char*) (com_stat+(uint) SQLCOM_SLAVE_STOP),SHOW_LONG},
{"Com_stmt_prepare", (char*) &com_stmt_prepare, SHOW_LONG},
{"Com_stmt_execute", (char*) &com_stmt_execute, SHOW_LONG},
{"Com_stmt_send_long_data", (char*) &com_stmt_send_long_data, SHOW_LONG},
{"Com_stmt_reset", (char*) &com_stmt_reset, SHOW_LONG},
{"Com_stmt_close", (char*) &com_stmt_close, SHOW_LONG},
{"Com_truncate", (char*) (com_stat+(uint) SQLCOM_TRUNCATE),SHOW_LONG}, {"Com_truncate", (char*) (com_stat+(uint) SQLCOM_TRUNCATE),SHOW_LONG},
{"Com_unlock_tables", (char*) (com_stat+(uint) SQLCOM_UNLOCK_TABLES),SHOW_LONG}, {"Com_unlock_tables", (char*) (com_stat+(uint) SQLCOM_UNLOCK_TABLES),SHOW_LONG},
{"Com_update", (char*) (com_stat+(uint) SQLCOM_UPDATE),SHOW_LONG}, {"Com_update", (char*) (com_stat+(uint) SQLCOM_UPDATE),SHOW_LONG},
...@@ -6084,6 +6098,9 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), ...@@ -6084,6 +6098,9 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
case (int) OPT_SLOW_QUERY_LOG: case (int) OPT_SLOW_QUERY_LOG:
opt_slow_log=1; opt_slow_log=1;
break; break;
case (int) OPT_LOG_SLOW_ADMIN_STATEMENTS:
opt_log_slow_admin_statements= 1;
break;
case (int) OPT_SKIP_NEW: case (int) OPT_SKIP_NEW:
opt_specialflag|= SPECIAL_NO_NEW_FUNC; opt_specialflag|= SPECIAL_NO_NEW_FUNC;
delay_key_write_options= (uint) DELAY_KEY_WRITE_NONE; delay_key_write_options= (uint) DELAY_KEY_WRITE_NONE;
...@@ -6443,6 +6460,9 @@ static void get_options(int argc,char **argv) ...@@ -6443,6 +6460,9 @@ static void get_options(int argc,char **argv)
if (opt_bdb) if (opt_bdb)
sql_print_warning("this binary does not contain BDB storage engine"); sql_print_warning("this binary does not contain BDB storage engine");
#endif #endif
if ((opt_log_slow_admin_statements || opt_log_queries_not_using_indexes) &&
!opt_slow_log)
sql_print_warning("options --log-slow-admin-statements and --log-queries-not-using-indexes have no effect if --log-slow-queries is not set");
/* /*
Check that the default storage engine is actually available. Check that the default storage engine is actually available.
......
...@@ -916,7 +916,7 @@ public: ...@@ -916,7 +916,7 @@ public:
bool query_error, bootstrap, cleanup_done; bool query_error, bootstrap, cleanup_done;
bool tmp_table_used; bool tmp_table_used;
bool charset_is_system_charset, charset_is_collation_connection; bool charset_is_system_charset, charset_is_collation_connection;
bool slow_command; bool enable_slow_log; /* enable slow log for current statement */
my_bool volatile killed; my_bool volatile killed;
/* /*
......
...@@ -59,7 +59,6 @@ static void remove_escape(char *name); ...@@ -59,7 +59,6 @@ static void remove_escape(char *name);
static void refresh_status(void); static void refresh_status(void);
static bool append_file_to_dir(THD *thd, const char **filename_ptr, static bool append_file_to_dir(THD *thd, const char **filename_ptr,
const char *table_name); const char *table_name);
static void log_slow_query(THD *thd);
const char *any_db="*any*"; // Special symbol for check_access const char *any_db="*any*"; // Special symbol for check_access
...@@ -1342,10 +1341,10 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1342,10 +1341,10 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
thd->command=command; thd->command=command;
/* /*
Commands which will always take a long time should be marked with Commands which always take a long time are logged into
this so that they will not get logged to the slow query log the slow log only if opt_log_slow_admin_statements is set.
*/ */
thd->slow_command=FALSE; thd->enable_slow_log= TRUE;
thd->set_time(); thd->set_time();
VOID(pthread_mutex_lock(&LOCK_thread_count)); VOID(pthread_mutex_lock(&LOCK_thread_count));
thd->query_id=query_id; thd->query_id=query_id;
...@@ -1383,7 +1382,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1383,7 +1382,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
uint tbl_len= *(uchar*) (packet + db_len + 1); uint tbl_len= *(uchar*) (packet + db_len + 1);
statistic_increment(com_other, &LOCK_status); statistic_increment(com_other, &LOCK_status);
thd->slow_command= TRUE; thd->enable_slow_log= opt_log_slow_admin_statements;
db= thd->alloc(db_len + tbl_len + 2); db= thd->alloc(db_len + tbl_len + 2);
tbl_name= strmake(db, packet + 1, db_len)+1; tbl_name= strmake(db, packet + 1, db_len)+1;
strmake(tbl_name, packet + db_len + 2, tbl_len); strmake(tbl_name, packet + db_len + 2, tbl_len);
...@@ -1515,7 +1514,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1515,7 +1514,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
#endif #endif
ulong length= (ulong)(packet_end-packet); ulong length= (ulong)(packet_end-packet);
log_slow_query(thd); log_slow_statement(thd);
/* Remove garbage at start of query */ /* Remove garbage at start of query */
while (my_isspace(thd->charset(), *packet) && length > 0) while (my_isspace(thd->charset(), *packet) && length > 0)
...@@ -1658,7 +1657,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1658,7 +1657,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
uint32 slave_server_id; uint32 slave_server_id;
statistic_increment(com_other,&LOCK_status); statistic_increment(com_other,&LOCK_status);
thd->slow_command = TRUE; thd->enable_slow_log= opt_log_slow_admin_statements;
if (check_global_access(thd, REPL_SLAVE_ACL)) if (check_global_access(thd, REPL_SLAVE_ACL))
break; break;
...@@ -1827,7 +1826,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1827,7 +1826,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
if (thd->is_fatal_error) if (thd->is_fatal_error)
send_error(thd,0); // End of memory ? send_error(thd,0); // End of memory ?
log_slow_query(thd); log_slow_statement(thd);
thd->proc_info="cleaning up"; thd->proc_info="cleaning up";
VOID(pthread_mutex_lock(&LOCK_thread_count)); // For process list VOID(pthread_mutex_lock(&LOCK_thread_count)); // For process list
...@@ -1843,13 +1842,16 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1843,13 +1842,16 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
} }
static void log_slow_query(THD *thd) void log_slow_statement(THD *thd)
{ {
time_t start_of_query=thd->start_time; time_t start_of_query=thd->start_time;
thd->end_time(); // Set start time thd->end_time(); // Set start time
/* If not reading from backup and if the query took too long */ /*
if (!thd->slow_command && !thd->user_time) // do not log 'slow_command' queries Do not log administrative statements unless the appropriate option is
set; do not log into slow log if reading from backup.
*/
if (thd->enable_slow_log && !thd->user_time)
{ {
thd->proc_info="logging slow query"; thd->proc_info="logging slow query";
...@@ -2190,6 +2192,8 @@ mysql_execute_command(THD *thd) ...@@ -2190,6 +2192,8 @@ mysql_execute_command(THD *thd)
DBUG_PRINT("info", ("DEALLOCATE PREPARE: %.*s\n", DBUG_PRINT("info", ("DEALLOCATE PREPARE: %.*s\n",
lex->prepared_stmt_name.length, lex->prepared_stmt_name.length,
lex->prepared_stmt_name.str)); lex->prepared_stmt_name.str));
/* We account deallocate in the same manner as mysql_stmt_close */
statistic_increment(com_stmt_close, &LOCK_status);
if ((stmt= thd->stmt_map.find_by_name(&lex->prepared_stmt_name))) if ((stmt= thd->stmt_map.find_by_name(&lex->prepared_stmt_name)))
{ {
thd->stmt_map.erase(stmt); thd->stmt_map.erase(stmt);
...@@ -2292,7 +2296,7 @@ mysql_execute_command(THD *thd) ...@@ -2292,7 +2296,7 @@ mysql_execute_command(THD *thd)
check_table_access(thd,SELECT_ACL, tables,0) || check_table_access(thd,SELECT_ACL, tables,0) ||
check_global_access(thd, FILE_ACL)) check_global_access(thd, FILE_ACL))
goto error; /* purecov: inspected */ goto error; /* purecov: inspected */
thd->slow_command=TRUE; thd->enable_slow_log= opt_log_slow_admin_statements;
res = mysql_backup_table(thd, tables); res = mysql_backup_table(thd, tables);
break; break;
...@@ -2303,7 +2307,7 @@ mysql_execute_command(THD *thd) ...@@ -2303,7 +2307,7 @@ mysql_execute_command(THD *thd)
check_table_access(thd, INSERT_ACL, tables,0) || check_table_access(thd, INSERT_ACL, tables,0) ||
check_global_access(thd, FILE_ACL)) check_global_access(thd, FILE_ACL))
goto error; /* purecov: inspected */ goto error; /* purecov: inspected */
thd->slow_command=TRUE; thd->enable_slow_log= opt_log_slow_admin_statements;
res = mysql_restore_table(thd, tables); res = mysql_restore_table(thd, tables);
break; break;
} }
...@@ -2538,7 +2542,7 @@ unsent_create_error: ...@@ -2538,7 +2542,7 @@ unsent_create_error:
case SQLCOM_CREATE_INDEX: case SQLCOM_CREATE_INDEX:
if (check_one_table_access(thd, INDEX_ACL, tables)) if (check_one_table_access(thd, INDEX_ACL, tables))
goto error; /* purecov: inspected */ goto error; /* purecov: inspected */
thd->slow_command=TRUE; thd->enable_slow_log= opt_log_slow_admin_statements;
if (end_active_trans(thd)) if (end_active_trans(thd))
res= -1; res= -1;
else else
...@@ -2624,7 +2628,7 @@ unsent_create_error: ...@@ -2624,7 +2628,7 @@ unsent_create_error:
res= -1; res= -1;
else else
{ {
thd->slow_command=TRUE; thd->enable_slow_log= opt_log_slow_admin_statements;
res= mysql_alter_table(thd, select_lex->db, lex->name, res= mysql_alter_table(thd, select_lex->db, lex->name,
&lex->create_info, &lex->create_info,
tables, lex->create_list, tables, lex->create_list,
...@@ -2716,7 +2720,7 @@ unsent_create_error: ...@@ -2716,7 +2720,7 @@ unsent_create_error:
if (check_db_used(thd,tables) || if (check_db_used(thd,tables) ||
check_table_access(thd,SELECT_ACL | INSERT_ACL, tables,0)) check_table_access(thd,SELECT_ACL | INSERT_ACL, tables,0))
goto error; /* purecov: inspected */ goto error; /* purecov: inspected */
thd->slow_command=TRUE; thd->enable_slow_log= opt_log_slow_admin_statements;
res = mysql_repair_table(thd, tables, &lex->check_opt); res = mysql_repair_table(thd, tables, &lex->check_opt);
/* ! we write after unlocking the table */ /* ! we write after unlocking the table */
if (!res && !lex->no_write_to_binlog) if (!res && !lex->no_write_to_binlog)
...@@ -2736,7 +2740,7 @@ unsent_create_error: ...@@ -2736,7 +2740,7 @@ unsent_create_error:
if (check_db_used(thd,tables) || if (check_db_used(thd,tables) ||
check_table_access(thd, SELECT_ACL | EXTRA_ACL , tables,0)) check_table_access(thd, SELECT_ACL | EXTRA_ACL , tables,0))
goto error; /* purecov: inspected */ goto error; /* purecov: inspected */
thd->slow_command=TRUE; thd->enable_slow_log= opt_log_slow_admin_statements;
res = mysql_check_table(thd, tables, &lex->check_opt); res = mysql_check_table(thd, tables, &lex->check_opt);
break; break;
} }
...@@ -2745,7 +2749,7 @@ unsent_create_error: ...@@ -2745,7 +2749,7 @@ unsent_create_error:
if (check_db_used(thd,tables) || if (check_db_used(thd,tables) ||
check_table_access(thd,SELECT_ACL | INSERT_ACL, tables,0)) check_table_access(thd,SELECT_ACL | INSERT_ACL, tables,0))
goto error; /* purecov: inspected */ goto error; /* purecov: inspected */
thd->slow_command=TRUE; thd->enable_slow_log= opt_log_slow_admin_statements;
res = mysql_analyze_table(thd, tables, &lex->check_opt); res = mysql_analyze_table(thd, tables, &lex->check_opt);
/* ! we write after unlocking the table */ /* ! we write after unlocking the table */
if (!res && !lex->no_write_to_binlog) if (!res && !lex->no_write_to_binlog)
...@@ -2766,7 +2770,7 @@ unsent_create_error: ...@@ -2766,7 +2770,7 @@ unsent_create_error:
if (check_db_used(thd,tables) || if (check_db_used(thd,tables) ||
check_table_access(thd,SELECT_ACL | INSERT_ACL, tables,0)) check_table_access(thd,SELECT_ACL | INSERT_ACL, tables,0))
goto error; /* purecov: inspected */ goto error; /* purecov: inspected */
thd->slow_command=TRUE; thd->enable_slow_log= opt_log_slow_admin_statements;
res= (specialflag & (SPECIAL_SAFE_MODE | SPECIAL_NO_NEW_FUNC)) ? res= (specialflag & (SPECIAL_SAFE_MODE | SPECIAL_NO_NEW_FUNC)) ?
mysql_recreate_table(thd, tables, 1) : mysql_recreate_table(thd, tables, 1) :
mysql_optimize_table(thd, tables, &lex->check_opt); mysql_optimize_table(thd, tables, &lex->check_opt);
......
...@@ -820,7 +820,8 @@ static bool insert_params_from_vars_with_log(Prepared_statement *stmt, ...@@ -820,7 +820,8 @@ static bool insert_params_from_vars_with_log(Prepared_statement *stmt,
DBUG_ENTER("insert_params_from_vars"); DBUG_ENTER("insert_params_from_vars");
List_iterator<LEX_STRING> var_it(varnames); List_iterator<LEX_STRING> var_it(varnames);
String str; String buf;
const String *val;
uint32 length= 0; uint32 length= 0;
if (query->copy(stmt->query, stmt->query_length, default_charset_info)) if (query->copy(stmt->query, stmt->query_length, default_charset_info))
DBUG_RETURN(1); DBUG_RETURN(1);
...@@ -831,32 +832,35 @@ static bool insert_params_from_vars_with_log(Prepared_statement *stmt, ...@@ -831,32 +832,35 @@ static bool insert_params_from_vars_with_log(Prepared_statement *stmt,
varname= var_it++; varname= var_it++;
if (get_var_with_binlog(stmt->thd, *varname, &entry)) if (get_var_with_binlog(stmt->thd, *varname, &entry))
DBUG_RETURN(1); DBUG_RETURN(1);
DBUG_ASSERT(entry);
if (param->set_from_user_var(stmt->thd, entry)) if (param->set_from_user_var(stmt->thd, entry))
DBUG_RETURN(1); DBUG_RETURN(1);
/* Insert @'escaped-varname' instead of parameter in the query */ /* Insert @'escaped-varname' instead of parameter in the query */
char *buf, *ptr; if (entry)
str.length(0); {
if (str.reserve(entry->name.length*2+3)) char *begin, *ptr;
buf.length(0);
if (buf.reserve(entry->name.length*2+3))
DBUG_RETURN(1); DBUG_RETURN(1);
buf= str.c_ptr_quick(); begin= ptr= buf.c_ptr_quick();
ptr= buf;
*ptr++= '@'; *ptr++= '@';
*ptr++= '\''; *ptr++= '\'';
ptr+= ptr+= escape_string_for_mysql(&my_charset_utf8_general_ci,
escape_string_for_mysql(&my_charset_utf8_general_ci,
ptr, entry->name.str, entry->name.length); ptr, entry->name.str, entry->name.length);
*ptr++= '\''; *ptr++= '\'';
str.length(ptr - buf); buf.length(ptr - begin);
val= &buf;
}
else
val= &my_null_string;
if (param->convert_str_value(stmt->thd)) if (param->convert_str_value(stmt->thd))
DBUG_RETURN(1); /* out of memory */ DBUG_RETURN(1); /* out of memory */
if (query->replace(param->pos_in_query+length, 1, str)) if (query->replace(param->pos_in_query+length, 1, *val))
DBUG_RETURN(1); DBUG_RETURN(1);
length+= str.length()-1; length+= val->length()-1;
} }
DBUG_RETURN(0); DBUG_RETURN(0);
} }
...@@ -1558,6 +1562,13 @@ int mysql_stmt_prepare(THD *thd, char *packet, uint packet_length, ...@@ -1558,6 +1562,13 @@ int mysql_stmt_prepare(THD *thd, char *packet, uint packet_length,
DBUG_PRINT("prep_query", ("%s", packet)); DBUG_PRINT("prep_query", ("%s", packet));
/*
If this is an SQLCOM_PREPARE, we also increase Com_prepare_sql.
However, it seems handy if com_stmt_prepare is increased always,
no matter what kind of prepare is processed.
*/
statistic_increment(com_stmt_prepare, &LOCK_status);
if (stmt == 0) if (stmt == 0)
{ {
send_error(thd, ER_OUT_OF_RESOURCES); send_error(thd, ER_OUT_OF_RESOURCES);
...@@ -1596,7 +1607,7 @@ int mysql_stmt_prepare(THD *thd, char *packet, uint packet_length, ...@@ -1596,7 +1607,7 @@ int mysql_stmt_prepare(THD *thd, char *packet, uint packet_length,
DBUG_RETURN(1); DBUG_RETURN(1);
} }
mysql_log.write(thd, COM_PREPARE, "[%lu] %s", stmt->id, packet); mysql_log.write(thd, thd->command, "[%lu] %s", stmt->id, packet);
thd->current_arena= stmt; thd->current_arena= stmt;
mysql_init_query(thd, (uchar *) thd->query, thd->query_length); mysql_init_query(thd, (uchar *) thd->query, thd->query_length);
...@@ -1763,6 +1774,7 @@ void mysql_stmt_execute(THD *thd, char *packet, uint packet_length) ...@@ -1763,6 +1774,7 @@ void mysql_stmt_execute(THD *thd, char *packet, uint packet_length)
packet+= 9; /* stmt_id + 5 bytes of flags */ packet+= 9; /* stmt_id + 5 bytes of flags */
statistic_increment(com_stmt_execute, &LOCK_status);
if (!(stmt= find_prepared_statement(thd, stmt_id, "mysql_stmt_execute", if (!(stmt= find_prepared_statement(thd, stmt_id, "mysql_stmt_execute",
SEND_ERROR))) SEND_ERROR)))
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
...@@ -1796,9 +1808,6 @@ void mysql_stmt_execute(THD *thd, char *packet, uint packet_length) ...@@ -1796,9 +1808,6 @@ void mysql_stmt_execute(THD *thd, char *packet, uint packet_length)
if (stmt->param_count && stmt->set_params_data(stmt, &expanded_query)) if (stmt->param_count && stmt->set_params_data(stmt, &expanded_query))
goto set_params_data_err; goto set_params_data_err;
#endif #endif
mysql_log.write(thd, COM_EXECUTE, "[%lu] %s", stmt->id,
expanded_query.length() ? expanded_query.c_ptr() :
stmt->query);
thd->protocol= &thd->protocol_prep; // Switch to binary protocol thd->protocol= &thd->protocol_prep; // Switch to binary protocol
execute_stmt(thd, stmt, &expanded_query, TRUE); execute_stmt(thd, stmt, &expanded_query, TRUE);
thd->protocol= &thd->protocol_simple; // Use normal protocol thd->protocol= &thd->protocol_simple; // Use normal protocol
...@@ -1827,6 +1836,8 @@ void mysql_sql_stmt_execute(THD *thd, LEX_STRING *stmt_name) ...@@ -1827,6 +1836,8 @@ void mysql_sql_stmt_execute(THD *thd, LEX_STRING *stmt_name)
String expanded_query; String expanded_query;
DBUG_ENTER("mysql_sql_stmt_execute"); DBUG_ENTER("mysql_sql_stmt_execute");
/* See comment for statistics_increment in mysql_stmt_prepare */
statistic_increment(com_stmt_execute, &LOCK_status);
if (!(stmt= (Prepared_statement*)thd->stmt_map.find_by_name(stmt_name))) if (!(stmt= (Prepared_statement*)thd->stmt_map.find_by_name(stmt_name)))
{ {
my_error(ER_UNKNOWN_STMT_HANDLER, MYF(0), stmt_name->length, my_error(ER_UNKNOWN_STMT_HANDLER, MYF(0), stmt_name->length,
...@@ -1853,6 +1864,7 @@ void mysql_sql_stmt_execute(THD *thd, LEX_STRING *stmt_name) ...@@ -1853,6 +1864,7 @@ void mysql_sql_stmt_execute(THD *thd, LEX_STRING *stmt_name)
my_error(ER_WRONG_ARGUMENTS, MYF(0), "EXECUTE"); my_error(ER_WRONG_ARGUMENTS, MYF(0), "EXECUTE");
send_error(thd); send_error(thd);
} }
thd->command= COM_EXECUTE; /* For nice messages in general log */
execute_stmt(thd, stmt, &expanded_query, FALSE); execute_stmt(thd, stmt, &expanded_query, FALSE);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
...@@ -1887,6 +1899,7 @@ static void execute_stmt(THD *thd, Prepared_statement *stmt, ...@@ -1887,6 +1899,7 @@ static void execute_stmt(THD *thd, Prepared_statement *stmt,
my_error(ER_OUTOFMEMORY, 0, expanded_query->length()); my_error(ER_OUTOFMEMORY, 0, expanded_query->length());
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
mysql_log.write(thd, thd->command, "[%lu] %s", stmt->id, thd->query);
/* /*
At first execution of prepared statement we will perform logical At first execution of prepared statement we will perform logical
transformations of the query tree (i.e. negations elimination). transformations of the query tree (i.e. negations elimination).
...@@ -1900,6 +1913,14 @@ static void execute_stmt(THD *thd, Prepared_statement *stmt, ...@@ -1900,6 +1913,14 @@ static void execute_stmt(THD *thd, Prepared_statement *stmt,
thd->lex->unit.cleanup(); thd->lex->unit.cleanup();
if (!(specialflag & SPECIAL_NO_PRIOR)) if (!(specialflag & SPECIAL_NO_PRIOR))
my_pthread_setprio(pthread_self(), WAIT_PRIOR); my_pthread_setprio(pthread_self(), WAIT_PRIOR);
/*
'start_time' is set in dispatch_command, but THD::query will
be freed when we return from this function. So let's log the slow
query here.
*/
log_slow_statement(thd);
/* Prevent from second logging in the end of dispatch_command */
thd->enable_slow_log= FALSE;
/* Free Items that were created during this execution of the PS. */ /* Free Items that were created during this execution of the PS. */
free_items(thd->free_list); free_items(thd->free_list);
...@@ -1941,6 +1962,7 @@ void mysql_stmt_reset(THD *thd, char *packet) ...@@ -1941,6 +1962,7 @@ void mysql_stmt_reset(THD *thd, char *packet)
DBUG_ENTER("mysql_stmt_reset"); DBUG_ENTER("mysql_stmt_reset");
statistic_increment(com_stmt_reset, &LOCK_status);
if (!(stmt= find_prepared_statement(thd, stmt_id, "mysql_stmt_reset", if (!(stmt= find_prepared_statement(thd, stmt_id, "mysql_stmt_reset",
SEND_ERROR))) SEND_ERROR)))
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
...@@ -1973,6 +1995,7 @@ void mysql_stmt_free(THD *thd, char *packet) ...@@ -1973,6 +1995,7 @@ void mysql_stmt_free(THD *thd, char *packet)
DBUG_ENTER("mysql_stmt_free"); DBUG_ENTER("mysql_stmt_free");
statistic_increment(com_stmt_close, &LOCK_status);
if (!(stmt= find_prepared_statement(thd, stmt_id, "mysql_stmt_close", if (!(stmt= find_prepared_statement(thd, stmt_id, "mysql_stmt_close",
DONT_SEND_ERROR))) DONT_SEND_ERROR)))
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
...@@ -2012,6 +2035,7 @@ void mysql_stmt_get_longdata(THD *thd, char *packet, ulong packet_length) ...@@ -2012,6 +2035,7 @@ void mysql_stmt_get_longdata(THD *thd, char *packet, ulong packet_length)
DBUG_ENTER("mysql_stmt_get_longdata"); DBUG_ENTER("mysql_stmt_get_longdata");
statistic_increment(com_stmt_send_long_data, &LOCK_status);
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
/* Minimal size of long data packet is 6 bytes */ /* Minimal size of long data packet is 6 bytes */
if ((ulong) (packet_end - packet) < MYSQL_LONG_DATA_HEADER) if ((ulong) (packet_end - packet) < MYSQL_LONG_DATA_HEADER)
...@@ -2068,10 +2092,12 @@ Prepared_statement::Prepared_statement(THD *thd_arg) ...@@ -2068,10 +2092,12 @@ Prepared_statement::Prepared_statement(THD *thd_arg)
*last_error= '\0'; *last_error= '\0';
} }
void Prepared_statement::setup_set_params() void Prepared_statement::setup_set_params()
{ {
/* Setup binary logging */ /* Setup binary logging */
if (mysql_bin_log.is_open() && is_update_query(lex->sql_command)) if (mysql_bin_log.is_open() && is_update_query(lex->sql_command) ||
mysql_log.is_open() || mysql_slow_log.is_open())
{ {
set_params_from_vars= insert_params_from_vars_with_log; set_params_from_vars= insert_params_from_vars_with_log;
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
...@@ -2091,6 +2117,7 @@ void Prepared_statement::setup_set_params() ...@@ -2091,6 +2117,7 @@ void Prepared_statement::setup_set_params()
} }
} }
Prepared_statement::~Prepared_statement() Prepared_statement::~Prepared_statement()
{ {
free_items(free_list); free_items(free_list);
......
...@@ -28,6 +28,8 @@ ...@@ -28,6 +28,8 @@
#include <hash.h> #include <hash.h>
#include <ft_global.h> #include <ft_global.h>
typedef uint32 cache_rec_length_type;
const char *join_type_str[]={ "UNKNOWN","system","const","eq_ref","ref", const char *join_type_str[]={ "UNKNOWN","system","const","eq_ref","ref",
"MAYBE_REF","ALL","range","index","fulltext", "MAYBE_REF","ALL","range","index","fulltext",
"ref_or_null","unique_subquery","index_subquery" "ref_or_null","unique_subquery","index_subquery"
...@@ -8067,7 +8069,7 @@ used_blob_length(CACHE_FIELD **ptr) ...@@ -8067,7 +8069,7 @@ used_blob_length(CACHE_FIELD **ptr)
static bool static bool
store_record_in_cache(JOIN_CACHE *cache) store_record_in_cache(JOIN_CACHE *cache)
{ {
ulong length; cache_rec_length_type length;
uchar *pos; uchar *pos;
CACHE_FIELD *copy,*end_field; CACHE_FIELD *copy,*end_field;
bool last_record; bool last_record;
...@@ -8112,9 +8114,9 @@ store_record_in_cache(JOIN_CACHE *cache) ...@@ -8112,9 +8114,9 @@ store_record_in_cache(JOIN_CACHE *cache)
end > str && end[-1] == ' ' ; end > str && end[-1] == ' ' ;
end--) ; end--) ;
length=(uint) (end-str); length=(uint) (end-str);
memcpy(pos+sizeof(uint), str, length); memcpy(pos+sizeof(length), str, length);
*((uint *) pos)= length; memcpy_fixed(pos, &length, sizeof(length));
pos+= length+sizeof(uint); pos+= length+sizeof(length);
} }
else else
{ {
...@@ -8148,7 +8150,7 @@ static void ...@@ -8148,7 +8150,7 @@ static void
read_cached_record(JOIN_TAB *tab) read_cached_record(JOIN_TAB *tab)
{ {
uchar *pos; uchar *pos;
uint length; cache_rec_length_type length;
bool last_record; bool last_record;
CACHE_FIELD *copy,*end_field; CACHE_FIELD *copy,*end_field;
...@@ -8177,9 +8179,10 @@ read_cached_record(JOIN_TAB *tab) ...@@ -8177,9 +8179,10 @@ read_cached_record(JOIN_TAB *tab)
{ {
if (copy->strip) if (copy->strip)
{ {
memcpy(copy->str, pos+sizeof(uint), length= *((uint *) pos)); memcpy_fixed(&length, pos, sizeof(length));
memcpy(copy->str, pos+sizeof(length), length);
memset(copy->str+length, ' ', copy->length-length); memset(copy->str+length, ' ', copy->length-length);
pos+= sizeof(uint)+length; pos+= sizeof(length)+length;
} }
else else
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment