Commit 62dacf08 authored by konstantin@mysql.com's avatar konstantin@mysql.com

Manual merge (4.1->5.0)

parents ad223c9c dcb0e65d
...@@ -90,5 +90,5 @@ drop user drop_user@localhost; ...@@ -90,5 +90,5 @@ drop user drop_user@localhost;
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
deallocate prepare stmt4; deallocate prepare stmt4;
...@@ -326,6 +326,7 @@ ulong opt_ndb_nodeid; ...@@ -326,6 +326,7 @@ ulong opt_ndb_nodeid;
my_bool opt_readonly, use_temp_pool, relay_log_purge; my_bool opt_readonly, use_temp_pool, relay_log_purge;
my_bool opt_sync_frm, opt_allow_suspicious_udfs; my_bool opt_sync_frm, opt_allow_suspicious_udfs;
my_bool opt_secure_auth= 0; my_bool opt_secure_auth= 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_large_pages= 0; my_bool opt_large_pages= 0;
uint opt_large_page_size= 0; uint opt_large_page_size= 0;
...@@ -4333,7 +4334,8 @@ enum options_mysqld ...@@ -4333,7 +4334,8 @@ enum options_mysqld
OPT_AUTO_INCREMENT, OPT_AUTO_INCREMENT_OFFSET, OPT_AUTO_INCREMENT, OPT_AUTO_INCREMENT_OFFSET,
OPT_ENABLE_LARGE_PAGES, OPT_ENABLE_LARGE_PAGES,
OPT_TIMED_MUTEXES, OPT_TIMED_MUTEXES,
OPT_OLD_STYLE_USER_LIMITS OPT_OLD_STYLE_USER_LIMITS,
OPT_LOG_SLOW_ADMIN_STATEMENTS
}; };
...@@ -4658,7 +4660,7 @@ Disable with --skip-innodb-doublewrite.", (gptr*) &innobase_use_doublewrite, ...@@ -4658,7 +4660,7 @@ Disable with --skip-innodb-doublewrite.", (gptr*) &innobase_use_doublewrite,
"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,
...@@ -4669,8 +4671,13 @@ Disable with --skip-innodb-doublewrite.", (gptr*) &innobase_use_doublewrite, ...@@ -4669,8 +4671,13 @@ Disable with --skip-innodb-doublewrite.", (gptr*) &innobase_use_doublewrite,
"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-tc", OPT_LOG_TC, {"log-tc", OPT_LOG_TC,
...@@ -5718,6 +5725,12 @@ struct show_var_st status_vars[]= { ...@@ -5718,6 +5725,12 @@ struct show_var_st status_vars[]= {
{"Com_show_warnings", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_WARNS]), SHOW_LONG_STATUS}, {"Com_show_warnings", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_WARNS]), SHOW_LONG_STATUS},
{"Com_slave_start", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SLAVE_START]), SHOW_LONG_STATUS}, {"Com_slave_start", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SLAVE_START]), SHOW_LONG_STATUS},
{"Com_slave_stop", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SLAVE_STOP]), SHOW_LONG_STATUS}, {"Com_slave_stop", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SLAVE_STOP]), SHOW_LONG_STATUS},
{"Com_stmt_prepare", (char*) offsetof(STATUS_VAR, com_stmt_prepare), SHOW_LONG},
{"Com_stmt_execute", (char*) offsetof(STATUS_VAR, com_stmt_execute), SHOW_LONG},
{"Com_stmt_fetch", (char*) offsetof(STATUS_VAR, com_stmt_fetch), SHOW_LONG},
{"Com_stmt_send_long_data", (char*) offsetof(STATUS_VAR, com_stmt_send_long_data), SHOW_LONG},
{"Com_stmt_reset", (char*) offsetof(STATUS_VAR, com_stmt_reset), SHOW_LONG},
{"Com_stmt_close", (char*) offsetof(STATUS_VAR, com_stmt_close), SHOW_LONG},
{"Com_truncate", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_TRUNCATE]), SHOW_LONG_STATUS}, {"Com_truncate", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_TRUNCATE]), SHOW_LONG_STATUS},
{"Com_unlock_tables", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_UNLOCK_TABLES]), SHOW_LONG_STATUS}, {"Com_unlock_tables", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_UNLOCK_TABLES]), SHOW_LONG_STATUS},
{"Com_update", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_UPDATE]), SHOW_LONG_STATUS}, {"Com_update", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_UPDATE]), SHOW_LONG_STATUS},
...@@ -6345,6 +6358,9 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), ...@@ -6345,6 +6358,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;
...@@ -6733,6 +6749,9 @@ static void get_options(int argc,char **argv) ...@@ -6733,6 +6749,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.
......
...@@ -631,6 +631,13 @@ typedef struct system_status_var ...@@ -631,6 +631,13 @@ typedef struct system_status_var
ulong filesort_range_count; ulong filesort_range_count;
ulong filesort_rows; ulong filesort_rows;
ulong filesort_scan_count; ulong filesort_scan_count;
/* Ppepared statements and binary protocol */
ulong com_stmt_prepare;
ulong com_stmt_execute;
ulong com_stmt_send_long_data;
ulong com_stmt_fetch;
ulong com_stmt_reset;
ulong com_stmt_close;
double last_query_cost; double last_query_cost;
} STATUS_VAR; } STATUS_VAR;
...@@ -1186,7 +1193,7 @@ class THD :public ilink, ...@@ -1186,7 +1193,7 @@ class THD :public ilink,
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 */
bool no_trans_update, abort_on_warning; bool no_trans_update, abort_on_warning;
bool got_warning; /* Set on call to push_warning() */ bool got_warning; /* Set on call to push_warning() */
bool no_warnings_for_error; /* no warnings on call to my_error() */ bool no_warnings_for_error; /* no warnings on call to my_error() */
......
...@@ -71,7 +71,6 @@ static void remove_escape(char *name); ...@@ -71,7 +71,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
...@@ -1508,10 +1507,10 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1508,10 +1507,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->lex->sql_command= SQLCOM_END; /* to avoid confusing VIEW detectors */ thd->lex->sql_command= SQLCOM_END; /* to avoid confusing VIEW detectors */
thd->set_time(); thd->set_time();
VOID(pthread_mutex_lock(&LOCK_thread_count)); VOID(pthread_mutex_lock(&LOCK_thread_count));
...@@ -1551,7 +1550,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1551,7 +1550,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(thd->status_var.com_other, &LOCK_status); statistic_increment(thd->status_var.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);
...@@ -1689,7 +1688,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1689,7 +1688,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)
...@@ -1858,7 +1857,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1858,7 +1857,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
uint32 slave_server_id; uint32 slave_server_id;
statistic_increment(thd->status_var.com_other,&LOCK_status); statistic_increment(thd->status_var.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;
...@@ -2043,7 +2042,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -2043,7 +2042,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
if (thd->net.report_error) if (thd->net.report_error)
net_send_error(thd); net_send_error(thd);
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
...@@ -2059,13 +2058,16 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -2059,13 +2058,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";
...@@ -2520,6 +2522,8 @@ mysql_execute_command(THD *thd) ...@@ -2520,6 +2522,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);
...@@ -2637,7 +2641,7 @@ mysql_execute_command(THD *thd) ...@@ -2637,7 +2641,7 @@ mysql_execute_command(THD *thd)
check_table_access(thd, SELECT_ACL, all_tables, 0) || check_table_access(thd, SELECT_ACL, all_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, first_table); res = mysql_backup_table(thd, first_table);
break; break;
...@@ -2649,7 +2653,7 @@ mysql_execute_command(THD *thd) ...@@ -2649,7 +2653,7 @@ mysql_execute_command(THD *thd)
check_table_access(thd, INSERT_ACL, all_tables, 0) || check_table_access(thd, INSERT_ACL, all_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, first_table); res = mysql_restore_table(thd, first_table);
break; break;
} }
...@@ -2920,7 +2924,7 @@ mysql_execute_command(THD *thd) ...@@ -2920,7 +2924,7 @@ mysql_execute_command(THD *thd)
DBUG_ASSERT(first_table == all_tables && first_table != 0); DBUG_ASSERT(first_table == all_tables && first_table != 0);
if (check_one_table_access(thd, INDEX_ACL, all_tables)) if (check_one_table_access(thd, INDEX_ACL, all_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))
goto error; goto error;
else else
...@@ -3009,7 +3013,7 @@ mysql_execute_command(THD *thd) ...@@ -3009,7 +3013,7 @@ mysql_execute_command(THD *thd)
goto error; goto error;
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,
first_table, lex->create_list, first_table, lex->create_list,
...@@ -3108,7 +3112,7 @@ mysql_execute_command(THD *thd) ...@@ -3108,7 +3112,7 @@ mysql_execute_command(THD *thd)
if (check_db_used(thd, all_tables) || if (check_db_used(thd, all_tables) ||
check_table_access(thd, SELECT_ACL | INSERT_ACL, all_tables, 0)) check_table_access(thd, SELECT_ACL | INSERT_ACL, all_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, first_table, &lex->check_opt); res= mysql_repair_table(thd, first_table, &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)
...@@ -3128,7 +3132,7 @@ mysql_execute_command(THD *thd) ...@@ -3128,7 +3132,7 @@ mysql_execute_command(THD *thd)
if (check_db_used(thd, all_tables) || if (check_db_used(thd, all_tables) ||
check_table_access(thd, SELECT_ACL | EXTRA_ACL , all_tables, 0)) check_table_access(thd, SELECT_ACL | EXTRA_ACL , all_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, first_table, &lex->check_opt); res = mysql_check_table(thd, first_table, &lex->check_opt);
break; break;
} }
...@@ -3138,7 +3142,7 @@ mysql_execute_command(THD *thd) ...@@ -3138,7 +3142,7 @@ mysql_execute_command(THD *thd)
if (check_db_used(thd, all_tables) || if (check_db_used(thd, all_tables) ||
check_table_access(thd, SELECT_ACL | INSERT_ACL, all_tables, 0)) check_table_access(thd, SELECT_ACL | INSERT_ACL, all_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, first_table, &lex->check_opt); res = mysql_analyze_table(thd, first_table, &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)
...@@ -3159,7 +3163,7 @@ mysql_execute_command(THD *thd) ...@@ -3159,7 +3163,7 @@ mysql_execute_command(THD *thd)
if (check_db_used(thd, all_tables) || if (check_db_used(thd, all_tables) ||
check_table_access(thd, SELECT_ACL | INSERT_ACL, all_tables, 0)) check_table_access(thd, SELECT_ACL | INSERT_ACL, all_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, first_table, 1) : mysql_recreate_table(thd, first_table, 1) :
mysql_optimize_table(thd, first_table, &lex->check_opt); mysql_optimize_table(thd, first_table, &lex->check_opt);
......
...@@ -839,7 +839,8 @@ static bool insert_params_from_vars_with_log(Prepared_statement *stmt, ...@@ -839,7 +839,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);
...@@ -850,32 +851,36 @@ static bool insert_params_from_vars_with_log(Prepared_statement *stmt, ...@@ -850,32 +851,36 @@ 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 != 0);
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, 0, entry->name.str,
ptr, 0, entry->name.str, entry->name.length); 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);
} }
...@@ -1706,6 +1711,13 @@ bool mysql_stmt_prepare(THD *thd, char *packet, uint packet_length, ...@@ -1706,6 +1711,13 @@ bool 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)
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
...@@ -1738,7 +1750,7 @@ bool mysql_stmt_prepare(THD *thd, char *packet, uint packet_length, ...@@ -1738,7 +1750,7 @@ bool mysql_stmt_prepare(THD *thd, char *packet, uint packet_length,
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
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);
...@@ -1950,6 +1962,7 @@ void mysql_stmt_execute(THD *thd, char *packet, uint packet_length) ...@@ -1950,6 +1962,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")))
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
...@@ -2024,10 +2037,7 @@ void mysql_stmt_execute(THD *thd, char *packet, uint packet_length) ...@@ -2024,10 +2037,7 @@ void mysql_stmt_execute(THD *thd, char *packet, uint packet_length)
my_error(ER_OUTOFMEMORY, 0, expanded_query.length()); my_error(ER_OUTOFMEMORY, 0, expanded_query.length());
goto err; goto err;
} }
mysql_log.write(thd, thd->command, "[%lu] %s", stmt->id, thd->query);
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
if (!(specialflag & SPECIAL_NO_PRIOR)) if (!(specialflag & SPECIAL_NO_PRIOR))
...@@ -2081,6 +2091,8 @@ void mysql_sql_stmt_execute(THD *thd, LEX_STRING *stmt_name) ...@@ -2081,6 +2091,8 @@ void mysql_sql_stmt_execute(THD *thd, LEX_STRING *stmt_name)
DBUG_ENTER("mysql_sql_stmt_execute"); DBUG_ENTER("mysql_sql_stmt_execute");
DBUG_ASSERT(thd->free_list == NULL); DBUG_ASSERT(thd->free_list == NULL);
/* See comment for statistic_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)))
{ {
...@@ -2105,6 +2117,7 @@ void mysql_sql_stmt_execute(THD *thd, LEX_STRING *stmt_name) ...@@ -2105,6 +2117,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");
} }
thd->command= COM_EXECUTE; /* For nice messages in general log */
execute_stmt(thd, stmt, &expanded_query); execute_stmt(thd, stmt, &expanded_query);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
...@@ -2137,6 +2150,7 @@ static void execute_stmt(THD *thd, Prepared_statement *stmt, ...@@ -2137,6 +2150,7 @@ static void execute_stmt(THD *thd, Prepared_statement *stmt,
my_error(ER_OUTOFMEMORY, MYF(0), expanded_query->length()); my_error(ER_OUTOFMEMORY, MYF(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).
...@@ -2149,6 +2163,14 @@ static void execute_stmt(THD *thd, Prepared_statement *stmt, ...@@ -2149,6 +2163,14 @@ static void execute_stmt(THD *thd, Prepared_statement *stmt,
mysql_execute_command(thd); mysql_execute_command(thd);
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;
close_thread_tables(thd); // to close derived tables close_thread_tables(thd); // to close derived tables
cleanup_stmt_and_thd_after_use(stmt, thd); cleanup_stmt_and_thd_after_use(stmt, thd);
...@@ -2180,6 +2202,7 @@ void mysql_stmt_fetch(THD *thd, char *packet, uint packet_length) ...@@ -2180,6 +2202,7 @@ void mysql_stmt_fetch(THD *thd, char *packet, uint packet_length)
Prepared_statement *stmt; Prepared_statement *stmt;
DBUG_ENTER("mysql_stmt_fetch"); DBUG_ENTER("mysql_stmt_fetch");
statistic_increment(com_stmt_fetch, &LOCK_status);
if (!(stmt= find_prepared_statement(thd, stmt_id, "mysql_stmt_fetch"))) if (!(stmt= find_prepared_statement(thd, stmt_id, "mysql_stmt_fetch")))
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
...@@ -2240,6 +2263,7 @@ void mysql_stmt_reset(THD *thd, char *packet) ...@@ -2240,6 +2263,7 @@ void mysql_stmt_reset(THD *thd, char *packet)
Prepared_statement *stmt; Prepared_statement *stmt;
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")))
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
...@@ -2274,6 +2298,7 @@ void mysql_stmt_free(THD *thd, char *packet) ...@@ -2274,6 +2298,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")))
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
...@@ -2312,6 +2337,7 @@ void mysql_stmt_get_longdata(THD *thd, char *packet, ulong packet_length) ...@@ -2312,6 +2337,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)
...@@ -2368,10 +2394,12 @@ Prepared_statement::Prepared_statement(THD *thd_arg) ...@@ -2368,10 +2394,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
...@@ -2392,6 +2420,7 @@ void Prepared_statement::setup_set_params() ...@@ -2392,6 +2420,7 @@ void Prepared_statement::setup_set_params()
} }
Prepared_statement::~Prepared_statement() Prepared_statement::~Prepared_statement()
{ {
if (cursor) if (cursor)
......
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