Commit d6c25884 authored by unknown's avatar unknown

Manually merged

parent fa5feec0
...@@ -17,22 +17,16 @@ ...@@ -17,22 +17,16 @@
#define MYSQL_LEX 1 #define MYSQL_LEX 1
#include "mysql_priv.h" #include "mysql_priv.h"
#include "sql_repl.h" #include "sql_repl.h"
#include "rpl_filter.h"
#include "repl_failsafe.h" #include "repl_failsafe.h"
#include <m_ctype.h> #include <m_ctype.h>
#include <myisam.h> #include <myisam.h>
#include <my_dir.h> #include <my_dir.h>
#ifdef HAVE_INNOBASE_DB
#include "ha_innodb.h"
#endif
#ifdef HAVE_NDBCLUSTER_DB
#include "ha_ndbcluster.h"
#endif
#include "sp_head.h" #include "sp_head.h"
#include "sp.h" #include "sp.h"
#include "sp_cache.h" #include "sp_cache.h"
#include "event.h"
#ifdef HAVE_OPENSSL #ifdef HAVE_OPENSSL
/* /*
...@@ -74,19 +68,41 @@ static void decrease_user_connections(USER_CONN *uc); ...@@ -74,19 +68,41 @@ static void decrease_user_connections(USER_CONN *uc);
static bool check_db_used(THD *thd,TABLE_LIST *tables); static bool check_db_used(THD *thd,TABLE_LIST *tables);
static bool check_multi_update_lock(THD *thd); static bool check_multi_update_lock(THD *thd);
static void remove_escape(char *name); static void remove_escape(char *name);
static bool append_file_to_dir(THD *thd, const char **filename_ptr,
const char *table_name);
const char *any_db="*any*"; // Special symbol for check_access const char *any_db="*any*"; // Special symbol for check_access
const char *command_name[]={ LEX_STRING command_name[]={
"Sleep", "Quit", "Init DB", "Query", "Field List", "Create DB", (char *)STRING_WITH_LEN("Sleep"),
"Drop DB", "Refresh", "Shutdown", "Statistics", "Processlist", (char *)STRING_WITH_LEN("Quit"),
"Connect","Kill","Debug","Ping","Time","Delayed insert","Change user", (char *)STRING_WITH_LEN("Init DB"),
"Binlog Dump","Table Dump", "Connect Out", "Register Slave", (char *)STRING_WITH_LEN("Query"),
"Prepare", "Execute", "Long Data", "Close stmt", (char *)STRING_WITH_LEN("Field List"),
"Reset stmt", "Set option", "Fetch", (char *)STRING_WITH_LEN("Create DB"),
"Error" // Last command number (char *)STRING_WITH_LEN("Drop DB"),
(char *)STRING_WITH_LEN("Refresh"),
(char *)STRING_WITH_LEN("Shutdown"),
(char *)STRING_WITH_LEN("Statistics"),
(char *)STRING_WITH_LEN("Processlist"),
(char *)STRING_WITH_LEN("Connect"),
(char *)STRING_WITH_LEN("Kill"),
(char *)STRING_WITH_LEN("Debug"),
(char *)STRING_WITH_LEN("Ping"),
(char *)STRING_WITH_LEN("Time"),
(char *)STRING_WITH_LEN("Delayed insert"),
(char *)STRING_WITH_LEN("Change user"),
(char *)STRING_WITH_LEN("Binlog Dump"),
(char *)STRING_WITH_LEN("Table Dump"),
(char *)STRING_WITH_LEN("Connect Out"),
(char *)STRING_WITH_LEN("Register Slave"),
(char *)STRING_WITH_LEN("Prepare"),
(char *)STRING_WITH_LEN("Execute"),
(char *)STRING_WITH_LEN("Long Data"),
(char *)STRING_WITH_LEN("Close stmt"),
(char *)STRING_WITH_LEN("Reset stmt"),
(char *)STRING_WITH_LEN("Set option"),
(char *)STRING_WITH_LEN("Fetch"),
(char *)STRING_WITH_LEN("Daemon"),
(char *)STRING_WITH_LEN("Error") // Last command number
}; };
const char *xa_state_names[]={ const char *xa_state_names[]={
...@@ -101,10 +117,6 @@ static void test_signal(int sig_ptr) ...@@ -101,10 +117,6 @@ static void test_signal(int sig_ptr)
#if !defined( DBUG_OFF) #if !defined( DBUG_OFF)
MessageBox(NULL,"Test signal","DBUG",MB_OK); MessageBox(NULL,"Test signal","DBUG",MB_OK);
#endif #endif
#if defined(OS2)
fprintf(stderr, "Test signal %d\n", sig_ptr);
fflush(stderr);
#endif
} }
static void init_signals(void) static void init_signals(void)
{ {
...@@ -155,7 +167,7 @@ static bool end_active_trans(THD *thd) ...@@ -155,7 +167,7 @@ static bool end_active_trans(THD *thd)
DBUG_RETURN(error); DBUG_RETURN(error);
} }
static bool begin_trans(THD *thd) bool begin_trans(THD *thd)
{ {
int error=0; int error=0;
if (unlikely(thd->in_sub_stmt)) if (unlikely(thd->in_sub_stmt))
...@@ -189,7 +201,8 @@ static bool begin_trans(THD *thd) ...@@ -189,7 +201,8 @@ static bool begin_trans(THD *thd)
*/ */
inline bool all_tables_not_ok(THD *thd, TABLE_LIST *tables) inline bool all_tables_not_ok(THD *thd, TABLE_LIST *tables)
{ {
return table_rules_on && tables && !tables_ok(thd,tables); return rpl_filter->is_on() && tables && !thd->spcont &&
!rpl_filter->tables_ok(thd->db, tables);
} }
#endif #endif
...@@ -327,7 +340,7 @@ int check_user(THD *thd, enum enum_server_command command, ...@@ -327,7 +340,7 @@ int check_user(THD *thd, enum enum_server_command command,
if (opt_secure_auth_local && passwd_len == SCRAMBLE_LENGTH_323) if (opt_secure_auth_local && passwd_len == SCRAMBLE_LENGTH_323)
{ {
net_printf_error(thd, ER_NOT_SUPPORTED_AUTH_MODE); net_printf_error(thd, ER_NOT_SUPPORTED_AUTH_MODE);
mysql_log.write(thd, COM_CONNECT, ER(ER_NOT_SUPPORTED_AUTH_MODE)); general_log_print(thd, COM_CONNECT, ER(ER_NOT_SUPPORTED_AUTH_MODE));
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
if (passwd_len != 0 && if (passwd_len != 0 &&
...@@ -361,9 +374,9 @@ int check_user(THD *thd, enum enum_server_command command, ...@@ -361,9 +374,9 @@ int check_user(THD *thd, enum enum_server_command command,
net_printf_error(thd, ER_SERVER_IS_IN_SECURE_AUTH_MODE, net_printf_error(thd, ER_SERVER_IS_IN_SECURE_AUTH_MODE,
thd->main_security_ctx.user, thd->main_security_ctx.user,
thd->main_security_ctx.host_or_ip); thd->main_security_ctx.host_or_ip);
mysql_log.write(thd, COM_CONNECT, ER(ER_SERVER_IS_IN_SECURE_AUTH_MODE), general_log_print(thd, COM_CONNECT, ER(ER_SERVER_IS_IN_SECURE_AUTH_MODE),
thd->main_security_ctx.user, thd->main_security_ctx.user,
thd->main_security_ctx.host_or_ip); thd->main_security_ctx.host_or_ip);
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
/* We have to read very specific packet size */ /* We have to read very specific packet size */
...@@ -411,14 +424,14 @@ int check_user(THD *thd, enum enum_server_command command, ...@@ -411,14 +424,14 @@ int check_user(THD *thd, enum enum_server_command command,
} }
/* Why logging is performed before all checks've passed? */ /* Why logging is performed before all checks've passed? */
mysql_log.write(thd, command, general_log_print(thd, command,
(thd->main_security_ctx.priv_user == (thd->main_security_ctx.priv_user ==
thd->main_security_ctx.user ? thd->main_security_ctx.user ?
(char*) "%s@%s on %s" : (char*) "%s@%s on %s" :
(char*) "%s@%s as anonymous on %s"), (char*) "%s@%s as anonymous on %s"),
thd->main_security_ctx.user, thd->main_security_ctx.user,
thd->main_security_ctx.host_or_ip, thd->main_security_ctx.host_or_ip,
db ? db : (char*) ""); db ? db : (char*) "");
/* /*
This is the default access rights for the current database. It's This is the default access rights for the current database. It's
...@@ -465,17 +478,17 @@ int check_user(THD *thd, enum enum_server_command command, ...@@ -465,17 +478,17 @@ int check_user(THD *thd, enum enum_server_command command,
else if (res == 2) // client gave short hash, server has long hash else if (res == 2) // client gave short hash, server has long hash
{ {
net_printf_error(thd, ER_NOT_SUPPORTED_AUTH_MODE); net_printf_error(thd, ER_NOT_SUPPORTED_AUTH_MODE);
mysql_log.write(thd,COM_CONNECT,ER(ER_NOT_SUPPORTED_AUTH_MODE)); general_log_print(thd, COM_CONNECT, ER(ER_NOT_SUPPORTED_AUTH_MODE));
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
net_printf_error(thd, ER_ACCESS_DENIED_ERROR, net_printf_error(thd, ER_ACCESS_DENIED_ERROR,
thd->main_security_ctx.user, thd->main_security_ctx.user,
thd->main_security_ctx.host_or_ip, thd->main_security_ctx.host_or_ip,
passwd_len ? ER(ER_YES) : ER(ER_NO)); passwd_len ? ER(ER_YES) : ER(ER_NO));
mysql_log.write(thd, COM_CONNECT, ER(ER_ACCESS_DENIED_ERROR), general_log_print(thd, COM_CONNECT, ER(ER_ACCESS_DENIED_ERROR),
thd->main_security_ctx.user, thd->main_security_ctx.user,
thd->main_security_ctx.host_or_ip, thd->main_security_ctx.host_or_ip,
passwd_len ? ER(ER_YES) : ER(ER_NO)); passwd_len ? ER(ER_YES) : ER(ER_NO));
DBUG_RETURN(-1); DBUG_RETURN(-1);
#endif /* NO_EMBEDDED_ACCESS_CHECKS */ #endif /* NO_EMBEDDED_ACCESS_CHECKS */
} }
...@@ -648,6 +661,9 @@ void init_update_queries(void) ...@@ -648,6 +661,9 @@ void init_update_queries(void)
uc_update_queries[SQLCOM_DROP_INDEX]=1; uc_update_queries[SQLCOM_DROP_INDEX]=1;
uc_update_queries[SQLCOM_CREATE_VIEW]=1; uc_update_queries[SQLCOM_CREATE_VIEW]=1;
uc_update_queries[SQLCOM_DROP_VIEW]=1; uc_update_queries[SQLCOM_DROP_VIEW]=1;
uc_update_queries[SQLCOM_CREATE_EVENT]=1;
uc_update_queries[SQLCOM_ALTER_EVENT]=1;
uc_update_queries[SQLCOM_DROP_EVENT]=1;
} }
bool is_update_query(enum enum_sql_command command) bool is_update_query(enum enum_sql_command command)
...@@ -1087,7 +1103,7 @@ pthread_handler_t handle_one_connection(void *arg) ...@@ -1087,7 +1103,7 @@ pthread_handler_t handle_one_connection(void *arg)
pthread_detach_this_thread(); pthread_detach_this_thread();
#if !defined( __WIN__) && !defined(OS2) // Win32 calls this in pthread_create #if !defined( __WIN__) // Win32 calls this in pthread_create
/* The following calls needs to be done before we call DBUG_ macros */ /* The following calls needs to be done before we call DBUG_ macros */
if (!(test_flags & TEST_NO_THREADS) & my_thread_init()) if (!(test_flags & TEST_NO_THREADS) & my_thread_init())
{ {
...@@ -1111,7 +1127,7 @@ pthread_handler_t handle_one_connection(void *arg) ...@@ -1111,7 +1127,7 @@ pthread_handler_t handle_one_connection(void *arg)
#if defined(__WIN__) #if defined(__WIN__)
init_signals(); init_signals();
#elif !defined(OS2) && !defined(__NETWARE__) #elif !defined(__NETWARE__)
sigset_t set; sigset_t set;
VOID(sigemptyset(&set)); // Get mask in use VOID(sigemptyset(&set)); // Get mask in use
VOID(pthread_sigmask(SIG_UNBLOCK,&set,&thd->block_signals)); VOID(pthread_sigmask(SIG_UNBLOCK,&set,&thd->block_signals));
...@@ -1235,7 +1251,7 @@ pthread_handler_t handle_bootstrap(void *arg) ...@@ -1235,7 +1251,7 @@ pthread_handler_t handle_bootstrap(void *arg)
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
pthread_detach_this_thread(); pthread_detach_this_thread();
thd->thread_stack= (char*) &thd; thd->thread_stack= (char*) &thd;
#if !defined(__WIN__) && !defined(OS2) && !defined(__NETWARE__) #if !defined(__WIN__) && !defined(__NETWARE__)
sigset_t set; sigset_t set;
VOID(sigemptyset(&set)); // Get mask in use VOID(sigemptyset(&set)); // Get mask in use
VOID(pthread_sigmask(SIG_UNBLOCK,&set,&thd->block_signals)); VOID(pthread_sigmask(SIG_UNBLOCK,&set,&thd->block_signals));
...@@ -1249,6 +1265,7 @@ pthread_handler_t handle_bootstrap(void *arg) ...@@ -1249,6 +1265,7 @@ pthread_handler_t handle_bootstrap(void *arg)
thd->version=refresh_version; thd->version=refresh_version;
thd->security_ctx->priv_user= thd->security_ctx->priv_user=
thd->security_ctx->user= (char*) my_strdup("boot", MYF(MY_WME)); thd->security_ctx->user= (char*) my_strdup("boot", MYF(MY_WME));
thd->security_ctx->priv_host[0]=0;
buff= (char*) thd->net.buff; buff= (char*) thd->net.buff;
thd->init_for_queries(); thd->init_for_queries();
...@@ -1588,7 +1605,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1588,7 +1605,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
packet, strlen(packet), thd->charset()); packet, strlen(packet), thd->charset());
if (!mysql_change_db(thd, tmp.str, FALSE)) if (!mysql_change_db(thd, tmp.str, FALSE))
{ {
mysql_log.write(thd,command,"%s",thd->db); general_log_print(thd, command, "%s",thd->db);
send_ok(thd); send_ok(thd);
} }
break; break;
...@@ -1736,7 +1753,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1736,7 +1753,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
if (alloc_query(thd, packet, packet_length)) if (alloc_query(thd, packet, packet_length))
break; // fatal error is set break; // fatal error is set
char *packet_end= thd->query + thd->query_length; char *packet_end= thd->query + thd->query_length;
mysql_log.write(thd,command, "%.*b", thd->query_length, thd->query); general_log_print(thd, command, "%.*b", thd->query_length, thd->query);
DBUG_PRINT("query",("%-.4096s",thd->query)); DBUG_PRINT("query",("%-.4096s",thd->query));
if (!(specialflag & SPECIAL_NO_PRIOR)) if (!(specialflag & SPECIAL_NO_PRIOR))
...@@ -1792,8 +1809,9 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1792,8 +1809,9 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
TABLE_LIST table_list; TABLE_LIST table_list;
LEX_STRING conv_name; LEX_STRING conv_name;
/* Saved variable value */ /* Saved variable value */
my_bool old_innodb_table_locks= my_bool old_innodb_table_locks= thd->variables.innodb_table_locks;
IF_INNOBASE_DB(thd->variables.innodb_table_locks, FALSE);
/* used as fields initializator */ /* used as fields initializator */
lex_start(thd, 0, 0); lex_start(thd, 0, 0);
...@@ -1823,7 +1841,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1823,7 +1841,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
thd->query_length= strlen(packet); // for simplicity: don't optimize thd->query_length= strlen(packet); // for simplicity: don't optimize
if (!(thd->query=fields=thd->memdup(packet,thd->query_length+1))) if (!(thd->query=fields=thd->memdup(packet,thd->query_length+1)))
break; break;
mysql_log.write(thd,command,"%s %s",table_list.table_name, fields); general_log_print(thd, command, "%s %s", table_list.table_name, fields);
if (lower_case_table_names) if (lower_case_table_names)
my_casedn_str(files_charset_info, table_list.table_name); my_casedn_str(files_charset_info, table_list.table_name);
remove_escape(table_list.table_name); // This can't have wildcards remove_escape(table_list.table_name); // This can't have wildcards
...@@ -1852,7 +1870,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1852,7 +1870,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
#endif #endif
case COM_QUIT: case COM_QUIT:
/* We don't calculate statistics for this command */ /* We don't calculate statistics for this command */
mysql_log.write(thd,command,NullS); general_log_print(thd, command, NullS);
net->error=0; // Don't give 'abort' message net->error=0; // Don't give 'abort' message
error=TRUE; // End server error=TRUE; // End server
break; break;
...@@ -1872,7 +1890,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1872,7 +1890,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
} }
if (check_access(thd,CREATE_ACL,db,0,1,0,is_schema_db(db))) if (check_access(thd,CREATE_ACL,db,0,1,0,is_schema_db(db)))
break; break;
mysql_log.write(thd,command,packet); general_log_print(thd, command, packet);
bzero(&create_info, sizeof(create_info)); bzero(&create_info, sizeof(create_info));
mysql_create_db(thd, (lower_case_table_names == 2 ? alias : db), mysql_create_db(thd, (lower_case_table_names == 2 ? alias : db),
&create_info, 0); &create_info, 0);
...@@ -1897,7 +1915,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1897,7 +1915,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
ER(ER_LOCK_OR_ACTIVE_TRANSACTION), MYF(0)); ER(ER_LOCK_OR_ACTIVE_TRANSACTION), MYF(0));
break; break;
} }
mysql_log.write(thd,command,db); general_log_print(thd, command, db);
mysql_rm_db(thd, db, 0, 0); mysql_rm_db(thd, db, 0, 0);
break; break;
} }
...@@ -1921,7 +1939,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1921,7 +1939,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
kill_zombie_dump_threads(slave_server_id); kill_zombie_dump_threads(slave_server_id);
thd->server_id = slave_server_id; thd->server_id = slave_server_id;
mysql_log.write(thd, command, "Log: '%s' Pos: %ld", packet+10, general_log_print(thd, command, "Log: '%s' Pos: %ld", packet+10,
(long) pos); (long) pos);
mysql_binlog_send(thd, thd->strdup(packet + 10), (my_off_t) pos, flags); mysql_binlog_send(thd, thd->strdup(packet + 10), (my_off_t) pos, flags);
unregister_slave(thd,1,1); unregister_slave(thd,1,1);
...@@ -1939,7 +1957,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1939,7 +1957,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
ulong options= (ulong) (uchar) packet[0]; ulong options= (ulong) (uchar) packet[0];
if (check_global_access(thd,RELOAD_ACL)) if (check_global_access(thd,RELOAD_ACL))
break; break;
mysql_log.write(thd,command,NullS); general_log_print(thd, command, NullS);
if (!reload_acl_and_cache(thd, options, (TABLE_LIST*) 0, &not_used)) if (!reload_acl_and_cache(thd, options, (TABLE_LIST*) 0, &not_used))
send_ok(thd); send_ok(thd);
break; break;
...@@ -1967,14 +1985,12 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1967,14 +1985,12 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
break; break;
} }
DBUG_PRINT("quit",("Got shutdown command for level %u", level)); DBUG_PRINT("quit",("Got shutdown command for level %u", level));
mysql_log.write(thd,command,NullS); general_log_print(thd, command, NullS);
send_eof(thd); send_eof(thd);
#ifdef __WIN__ #ifdef __WIN__
sleep(1); // must wait after eof() sleep(1); // must wait after eof()
#endif #endif
#ifndef OS2
send_eof(thd); // This is for 'quit request' send_eof(thd); // This is for 'quit request'
#endif
close_connection(thd, 0, 1); close_connection(thd, 0, 1);
close_thread_tables(thd); // Free before kill close_thread_tables(thd); // Free before kill
kill_mysql(); kill_mysql();
...@@ -1984,7 +2000,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1984,7 +2000,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
#endif #endif
case COM_STATISTICS: case COM_STATISTICS:
{ {
mysql_log.write(thd,command,NullS); general_log_print(thd, command, NullS);
statistic_increment(thd->status_var.com_stat[SQLCOM_SHOW_STATUS], statistic_increment(thd->status_var.com_stat[SQLCOM_SHOW_STATUS],
&LOCK_status); &LOCK_status);
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
...@@ -1998,7 +2014,8 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1998,7 +2014,8 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
uptime, uptime,
(int) thread_count, (ulong) thd->query_id, (int) thread_count, (ulong) thd->query_id,
(ulong) thd->status_var.long_query_count, (ulong) thd->status_var.long_query_count,
thd->status_var.opened_tables, refresh_version, cached_tables(), thd->status_var.opened_tables, refresh_version,
cached_open_tables(),
(uptime ? (ulonglong2double(thd->query_id) / (double) uptime) : (uptime ? (ulonglong2double(thd->query_id) / (double) uptime) :
(double) 0)); (double) 0));
#ifdef SAFEMALLOC #ifdef SAFEMALLOC
...@@ -2023,7 +2040,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -2023,7 +2040,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
if (!thd->security_ctx->priv_user[0] && if (!thd->security_ctx->priv_user[0] &&
check_global_access(thd, PROCESS_ACL)) check_global_access(thd, PROCESS_ACL))
break; break;
mysql_log.write(thd,command,NullS); general_log_print(thd, command, NullS);
mysqld_list_processes(thd, mysqld_list_processes(thd,
thd->security_ctx->master_access & PROCESS_ACL ? thd->security_ctx->master_access & PROCESS_ACL ?
NullS : thd->security_ctx->priv_user, 0); NullS : thd->security_ctx->priv_user, 0);
...@@ -2060,7 +2077,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -2060,7 +2077,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
if (check_global_access(thd, SUPER_ACL)) if (check_global_access(thd, SUPER_ACL))
break; /* purecov: inspected */ break; /* purecov: inspected */
mysql_print_status(); mysql_print_status();
mysql_log.write(thd,command,NullS); general_log_print(thd, command, NullS);
send_eof(thd); send_eof(thd);
break; break;
case COM_SLEEP: case COM_SLEEP:
...@@ -2115,6 +2132,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -2115,6 +2132,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
void log_slow_statement(THD *thd) void log_slow_statement(THD *thd)
{ {
time_t start_of_query; time_t start_of_query;
DBUG_ENTER("log_slow_statement");
/* /*
The following should never be true with our current code base, The following should never be true with our current code base,
...@@ -2122,7 +2140,7 @@ void log_slow_statement(THD *thd) ...@@ -2122,7 +2140,7 @@ void log_slow_statement(THD *thd)
statement in a trigger or stored function statement in a trigger or stored function
*/ */
if (unlikely(thd->in_sub_stmt)) if (unlikely(thd->in_sub_stmt))
return; // Don't set time for sub stmt DBUG_VOID_RETURN; // Don't set time for sub stmt
start_of_query= thd->start_time; start_of_query= thd->start_time;
thd->end_time(); // Set start time thd->end_time(); // Set start time
...@@ -2142,9 +2160,10 @@ void log_slow_statement(THD *thd) ...@@ -2142,9 +2160,10 @@ void log_slow_statement(THD *thd)
(specialflag & SPECIAL_LOG_QUERIES_NOT_USING_INDEXES))) (specialflag & SPECIAL_LOG_QUERIES_NOT_USING_INDEXES)))
{ {
thd->status_var.long_query_count++; thd->status_var.long_query_count++;
mysql_slow_log.write(thd, thd->query, thd->query_length, start_of_query); slow_log_print(thd, thd->query, thd->query_length, start_of_query);
} }
} }
DBUG_VOID_RETURN;
} }
...@@ -2169,6 +2188,7 @@ int prepare_schema_table(THD *thd, LEX *lex, Table_ident *table_ident, ...@@ -2169,6 +2188,7 @@ int prepare_schema_table(THD *thd, LEX *lex, Table_ident *table_ident,
case SCH_TABLES: case SCH_TABLES:
case SCH_VIEWS: case SCH_VIEWS:
case SCH_TRIGGERS: case SCH_TRIGGERS:
case SCH_EVENTS:
#ifdef DONT_ALLOW_SHOW_COMMANDS #ifdef DONT_ALLOW_SHOW_COMMANDS
my_message(ER_NOT_ALLOWED_COMMAND, my_message(ER_NOT_ALLOWED_COMMAND,
ER(ER_NOT_ALLOWED_COMMAND), MYF(0)); /* purecov: inspected */ ER(ER_NOT_ALLOWED_COMMAND), MYF(0)); /* purecov: inspected */
...@@ -2243,6 +2263,7 @@ int prepare_schema_table(THD *thd, LEX *lex, Table_ident *table_ident, ...@@ -2243,6 +2263,7 @@ int prepare_schema_table(THD *thd, LEX *lex, Table_ident *table_ident,
case SCH_STATUS: case SCH_STATUS:
case SCH_PROCEDURES: case SCH_PROCEDURES:
case SCH_CHARSETS: case SCH_CHARSETS:
case SCH_ENGINES:
case SCH_COLLATIONS: case SCH_COLLATIONS:
case SCH_COLLATION_CHARACTER_SET_APPLICABILITY: case SCH_COLLATION_CHARACTER_SET_APPLICABILITY:
case SCH_USER_PRIVILEGES: case SCH_USER_PRIVILEGES:
...@@ -2355,6 +2376,9 @@ mysql_execute_command(THD *thd) ...@@ -2355,6 +2376,9 @@ mysql_execute_command(THD *thd)
/* Saved variable value */ /* Saved variable value */
DBUG_ENTER("mysql_execute_command"); DBUG_ENTER("mysql_execute_command");
thd->net.no_send_error= 0; thd->net.no_send_error= 0;
#ifdef WITH_PARTITION_STORAGE_ENGINE
thd->work_part_info= 0;
#endif
/* /*
In many cases first table of main SELECT_LEX have special meaning => In many cases first table of main SELECT_LEX have special meaning =>
...@@ -2444,6 +2468,9 @@ mysql_execute_command(THD *thd) ...@@ -2444,6 +2468,9 @@ mysql_execute_command(THD *thd)
statistic_increment(thd->status_var.com_stat[lex->sql_command], statistic_increment(thd->status_var.com_stat[lex->sql_command],
&LOCK_status); &LOCK_status);
if (lex->binlog_row_based_if_mixed)
thd->set_current_stmt_binlog_row_based_if_mixed();
switch (lex->sql_command) { switch (lex->sql_command) {
case SQLCOM_SELECT: case SQLCOM_SELECT:
{ {
...@@ -2459,11 +2486,15 @@ mysql_execute_command(THD *thd) ...@@ -2459,11 +2486,15 @@ mysql_execute_command(THD *thd)
if (all_tables) if (all_tables)
{ {
if (lex->orig_sql_command != SQLCOM_SHOW_STATUS_PROC && if (lex->orig_sql_command != SQLCOM_SHOW_STATUS_PROC &&
lex->orig_sql_command != SQLCOM_SHOW_STATUS_FUNC) lex->orig_sql_command != SQLCOM_SHOW_STATUS_FUNC &&
lex->orig_sql_command != SQLCOM_SHOW_EVENTS)
res= check_table_access(thd, res= check_table_access(thd,
lex->exchange ? SELECT_ACL | FILE_ACL : lex->exchange ? SELECT_ACL | FILE_ACL :
SELECT_ACL, SELECT_ACL,
all_tables, 0); all_tables, 0);
else if (lex->orig_sql_command == SQLCOM_SHOW_EVENTS)
res= check_access(thd, EVENT_ACL, thd->lex->select_lex.db, 0, 0, 0,
is_schema_db(thd->lex->select_lex.db));
} }
else else
res= check_access(thd, res= check_access(thd,
...@@ -2708,29 +2739,20 @@ mysql_execute_command(THD *thd) ...@@ -2708,29 +2739,20 @@ mysql_execute_command(THD *thd)
res = load_master_data(thd); res = load_master_data(thd);
break; break;
#endif /* HAVE_REPLICATION */ #endif /* HAVE_REPLICATION */
#ifdef HAVE_NDBCLUSTER_DB case SQLCOM_SHOW_ENGINE_STATUS:
case SQLCOM_SHOW_NDBCLUSTER_STATUS:
{
res = ndbcluster_show_status(thd);
break;
}
#endif
#ifdef HAVE_INNOBASE_DB
case SQLCOM_SHOW_INNODB_STATUS:
{ {
if (check_global_access(thd, SUPER_ACL)) if (check_global_access(thd, SUPER_ACL))
goto error; goto error;
res = innodb_show_status(thd); res = ha_show_status(thd, lex->create_info.db_type, HA_ENGINE_STATUS);
break; break;
} }
case SQLCOM_SHOW_MUTEX_STATUS: case SQLCOM_SHOW_ENGINE_MUTEX:
{ {
if (check_global_access(thd, SUPER_ACL)) if (check_global_access(thd, SUPER_ACL))
goto error; goto error;
res = innodb_mutex_show_status(thd); res = ha_show_status(thd, lex->create_info.db_type, HA_ENGINE_MUTEX);
break; break;
} }
#endif
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
case SQLCOM_LOAD_MASTER_TABLE: case SQLCOM_LOAD_MASTER_TABLE:
{ {
...@@ -2897,11 +2919,20 @@ mysql_execute_command(THD *thd) ...@@ -2897,11 +2919,20 @@ mysql_execute_command(THD *thd)
else else
{ {
/* regular create */ /* regular create */
if (lex->name) if (lex->like_name)
res= mysql_create_like_table(thd, create_table, &lex->create_info, res= mysql_create_like_table(thd, create_table, &lex->create_info,
(Table_ident *)lex->name); lex->like_name);
else else
{ {
#ifdef WITH_PARTITION_STORAGE_ENGINE
partition_info *part_info= thd->lex->part_info;
if (part_info && !(part_info= thd->lex->part_info->get_clone()))
{
res= -1;
goto end_with_restore_list;
}
thd->work_part_info= part_info;
#endif
res= mysql_create_table(thd, create_table->db, res= mysql_create_table(thd, create_table->db,
create_table->table_name, &lex->create_info, create_table->table_name, &lex->create_info,
lex->create_list, lex->create_list,
...@@ -2979,6 +3010,11 @@ end_with_restore_list: ...@@ -2979,6 +3010,11 @@ end_with_restore_list:
#else #else
{ {
ulong priv=0; ulong priv=0;
ulong priv_needed= ALTER_ACL;
/* We also require DROP priv for ALTER TABLE ... DROP PARTITION */
if (lex->alter_info.flags & ALTER_DROP_PARTITION)
priv_needed|= DROP_ACL;
if (lex->name && (!lex->name[0] || strlen(lex->name) > NAME_LEN)) if (lex->name && (!lex->name[0] || strlen(lex->name) > NAME_LEN))
{ {
my_error(ER_WRONG_TABLE_NAME, MYF(0), lex->name); my_error(ER_WRONG_TABLE_NAME, MYF(0), lex->name);
...@@ -3003,7 +3039,7 @@ end_with_restore_list: ...@@ -3003,7 +3039,7 @@ end_with_restore_list:
else else
select_lex->db= first_table->db; select_lex->db= first_table->db;
} }
if (check_access(thd, ALTER_ACL, first_table->db, if (check_access(thd, priv_needed, first_table->db,
&first_table->grant.privilege, 0, 0, &first_table->grant.privilege, 0, 0,
test(first_table->schema_table)) || test(first_table->schema_table)) ||
check_access(thd,INSERT_ACL | CREATE_ACL,select_lex->db,&priv,0,0, check_access(thd,INSERT_ACL | CREATE_ACL,select_lex->db,&priv,0,0,
...@@ -3014,7 +3050,7 @@ end_with_restore_list: ...@@ -3014,7 +3050,7 @@ end_with_restore_list:
goto error; /* purecov: inspected */ goto error; /* purecov: inspected */
if (grant_option) if (grant_option)
{ {
if (check_grant(thd, ALTER_ACL, all_tables, 0, UINT_MAX, 0)) if (check_grant(thd, priv_needed, all_tables, 0, UINT_MAX, 0))
goto error; goto error;
if (lex->name && !test_all_bits(priv,INSERT_ACL | CREATE_ACL)) if (lex->name && !test_all_bits(priv,INSERT_ACL | CREATE_ACL))
{ // Rename of table { // Rename of table
...@@ -3079,7 +3115,7 @@ end_with_restore_list: ...@@ -3079,7 +3115,7 @@ end_with_restore_list:
} }
} }
query_cache_invalidate3(thd, first_table, 0); query_cache_invalidate3(thd, first_table, 0);
if (end_active_trans(thd) || mysql_rename_tables(thd, first_table)) if (end_active_trans(thd) || mysql_rename_tables(thd, first_table, 0))
goto error; goto error;
break; break;
} }
...@@ -3144,8 +3180,8 @@ end_with_restore_list: ...@@ -3144,8 +3180,8 @@ end_with_restore_list:
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
{ {
thd->clear_error(); // No binlog error generated thd->clear_error(); // No binlog error generated
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE); thd->binlog_query(THD::STMT_QUERY_TYPE,
mysql_bin_log.write(&qinfo); thd->query, thd->query_length, 0, FALSE);
} }
} }
select_lex->table_list.first= (byte*) first_table; select_lex->table_list.first= (byte*) first_table;
...@@ -3178,8 +3214,8 @@ end_with_restore_list: ...@@ -3178,8 +3214,8 @@ end_with_restore_list:
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
{ {
thd->clear_error(); // No binlog error generated thd->clear_error(); // No binlog error generated
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE); thd->binlog_query(THD::STMT_QUERY_TYPE,
mysql_bin_log.write(&qinfo); thd->query, thd->query_length, 0, FALSE);
} }
} }
select_lex->table_list.first= (byte*) first_table; select_lex->table_list.first= (byte*) first_table;
...@@ -3203,8 +3239,8 @@ end_with_restore_list: ...@@ -3203,8 +3239,8 @@ end_with_restore_list:
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
{ {
thd->clear_error(); // No binlog error generated thd->clear_error(); // No binlog error generated
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE); thd->binlog_query(THD::STMT_QUERY_TYPE,
mysql_bin_log.write(&qinfo); thd->query, thd->query_length, 0, FALSE);
} }
} }
select_lex->table_list.first= (byte*) first_table; select_lex->table_list.first= (byte*) first_table;
...@@ -3492,13 +3528,16 @@ end_with_restore_list: ...@@ -3492,13 +3528,16 @@ end_with_restore_list:
case SQLCOM_SHOW_STORAGE_ENGINES: case SQLCOM_SHOW_STORAGE_ENGINES:
res= mysqld_show_storage_engines(thd); res= mysqld_show_storage_engines(thd);
break; break;
case SQLCOM_SHOW_AUTHORS:
res= mysqld_show_authors(thd);
break;
case SQLCOM_SHOW_PRIVILEGES: case SQLCOM_SHOW_PRIVILEGES:
res= mysqld_show_privileges(thd); res= mysqld_show_privileges(thd);
break; break;
case SQLCOM_SHOW_COLUMN_TYPES: case SQLCOM_SHOW_COLUMN_TYPES:
res= mysqld_show_column_types(thd); res= mysqld_show_column_types(thd);
break; break;
case SQLCOM_SHOW_LOGS: case SQLCOM_SHOW_ENGINE_LOGS:
#ifdef DONT_ALLOW_SHOW_COMMANDS #ifdef DONT_ALLOW_SHOW_COMMANDS
my_message(ER_NOT_ALLOWED_COMMAND, ER(ER_NOT_ALLOWED_COMMAND), my_message(ER_NOT_ALLOWED_COMMAND, ER(ER_NOT_ALLOWED_COMMAND),
MYF(0)); /* purecov: inspected */ MYF(0)); /* purecov: inspected */
...@@ -3507,7 +3546,7 @@ end_with_restore_list: ...@@ -3507,7 +3546,7 @@ end_with_restore_list:
{ {
if (grant_option && check_access(thd, FILE_ACL, any_db,0,0,0,0)) if (grant_option && check_access(thd, FILE_ACL, any_db,0,0,0,0))
goto error; goto error;
res= mysqld_show_logs(thd); res= ha_show_status(thd, lex->create_info.db_type, HA_ENGINE_LOGS);
break; break;
} }
#endif #endif
...@@ -3626,9 +3665,9 @@ end_with_restore_list: ...@@ -3626,9 +3665,9 @@ end_with_restore_list:
above was not called. So we have to check rules again here. above was not called. So we have to check rules again here.
*/ */
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
if (thd->slave_thread && if (thd->slave_thread &&
(!db_ok(lex->name, replicate_do_db, replicate_ignore_db) || (!rpl_filter->db_ok(lex->name) ||
!db_ok_with_wild_table(lex->name))) !rpl_filter->db_ok_with_wild_table(lex->name)))
{ {
my_message(ER_SLAVE_IGNORED_TABLE, ER(ER_SLAVE_IGNORED_TABLE), MYF(0)); my_message(ER_SLAVE_IGNORED_TABLE, ER(ER_SLAVE_IGNORED_TABLE), MYF(0));
break; break;
...@@ -3661,8 +3700,8 @@ end_with_restore_list: ...@@ -3661,8 +3700,8 @@ end_with_restore_list:
*/ */
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
if (thd->slave_thread && if (thd->slave_thread &&
(!db_ok(lex->name, replicate_do_db, replicate_ignore_db) || (!rpl_filter->db_ok(lex->name) ||
!db_ok_with_wild_table(lex->name))) !rpl_filter->db_ok_with_wild_table(lex->name)))
{ {
my_message(ER_SLAVE_IGNORED_TABLE, ER(ER_SLAVE_IGNORED_TABLE), MYF(0)); my_message(ER_SLAVE_IGNORED_TABLE, ER(ER_SLAVE_IGNORED_TABLE), MYF(0));
break; break;
...@@ -3679,6 +3718,48 @@ end_with_restore_list: ...@@ -3679,6 +3718,48 @@ end_with_restore_list:
res= mysql_rm_db(thd, lex->name, lex->drop_if_exists, 0); res= mysql_rm_db(thd, lex->name, lex->drop_if_exists, 0);
break; break;
} }
case SQLCOM_RENAME_DB:
{
LEX_STRING *olddb, *newdb;
List_iterator <LEX_STRING> db_list(lex->db_list);
olddb= db_list++;
newdb= db_list++;
if (end_active_trans(thd))
{
res= 1;
break;
}
#ifdef HAVE_REPLICATION
if (thd->slave_thread &&
(!rpl_filter->db_ok(olddb->str) ||
!rpl_filter->db_ok(newdb->str) ||
!rpl_filter->db_ok_with_wild_table(olddb->str) ||
!rpl_filter->db_ok_with_wild_table(newdb->str)))
{
res= 1;
my_message(ER_SLAVE_IGNORED_TABLE, ER(ER_SLAVE_IGNORED_TABLE), MYF(0));
break;
}
#endif
if (check_access(thd,ALTER_ACL,olddb->str,0,1,0,is_schema_db(olddb->str)) ||
check_access(thd,DROP_ACL,olddb->str,0,1,0,is_schema_db(olddb->str)) ||
check_access(thd,CREATE_ACL,newdb->str,0,1,0,is_schema_db(newdb->str)))
{
res= 1;
break;
}
if (thd->locked_tables || thd->active_transaction())
{
res= 1;
my_message(ER_LOCK_OR_ACTIVE_TRANSACTION,
ER(ER_LOCK_OR_ACTIVE_TRANSACTION), MYF(0));
goto error;
}
res= mysql_rename_db(thd, olddb, newdb);
if (!res)
send_ok(thd);
break;
}
case SQLCOM_ALTER_DB: case SQLCOM_ALTER_DB:
{ {
char *db= lex->name ? lex->name : thd->db; char *db= lex->name ? lex->name : thd->db;
...@@ -3689,7 +3770,7 @@ end_with_restore_list: ...@@ -3689,7 +3770,7 @@ end_with_restore_list:
} }
if (!strip_sp(db) || check_db_name(db)) if (!strip_sp(db) || check_db_name(db))
{ {
my_error(ER_WRONG_DB_NAME, MYF(0), lex->name); my_error(ER_WRONG_DB_NAME, MYF(0), db);
break; break;
} }
/* /*
...@@ -3701,8 +3782,8 @@ end_with_restore_list: ...@@ -3701,8 +3782,8 @@ end_with_restore_list:
*/ */
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
if (thd->slave_thread && if (thd->slave_thread &&
(!db_ok(db, replicate_do_db, replicate_ignore_db) || (!rpl_filter->db_ok(db) ||
!db_ok_with_wild_table(db))) !rpl_filter->db_ok_with_wild_table(db)))
{ {
my_message(ER_SLAVE_IGNORED_TABLE, ER(ER_SLAVE_IGNORED_TABLE), MYF(0)); my_message(ER_SLAVE_IGNORED_TABLE, ER(ER_SLAVE_IGNORED_TABLE), MYF(0));
break; break;
...@@ -3726,11 +3807,83 @@ end_with_restore_list: ...@@ -3726,11 +3807,83 @@ end_with_restore_list:
my_error(ER_WRONG_DB_NAME, MYF(0), lex->name); my_error(ER_WRONG_DB_NAME, MYF(0), lex->name);
break; break;
} }
if (check_access(thd,SELECT_ACL,lex->name,0,1,0,is_schema_db(lex->name)))
break;
res=mysqld_show_create_db(thd,lex->name,&lex->create_info); res=mysqld_show_create_db(thd,lex->name,&lex->create_info);
break; break;
} }
case SQLCOM_CREATE_EVENT:
case SQLCOM_ALTER_EVENT:
case SQLCOM_DROP_EVENT:
{
uint rows_affected= 1;
DBUG_ASSERT(lex->et);
do {
if (! lex->et->dbname.str)
{
my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
res= true;
break;
}
if (check_access(thd, EVENT_ACL, lex->et->dbname.str, 0, 0, 0,
is_schema_db(lex->et->dbname.str)))
break;
if (end_active_trans(thd))
{
res= -1;
break;
}
switch (lex->sql_command) {
case SQLCOM_CREATE_EVENT:
res= evex_create_event(thd, lex->et, (uint) lex->create_info.options,
&rows_affected);
break;
case SQLCOM_ALTER_EVENT:
res= evex_update_event(thd, lex->et, lex->spname, &rows_affected);
break;
case SQLCOM_DROP_EVENT:
res= evex_drop_event(thd, lex->et, lex->drop_if_exists, &rows_affected);
default:;
}
DBUG_PRINT("info", ("CREATE/ALTER/DROP returned error code=%d af_rows=%d",
res, rows_affected));
if (!res)
send_ok(thd, rows_affected);
/* lex->unit.cleanup() is called outside, no need to call it here */
} while (0);
if (!thd->spcont)
{
lex->et->free_sphead_on_delete= true;
lex->et->free_sp();
lex->et->deinit_mutexes();
}
break;
}
case SQLCOM_SHOW_CREATE_EVENT:
{
DBUG_ASSERT(lex->spname);
DBUG_ASSERT(lex->et);
if (! lex->spname->m_db.str)
{
my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
res= true;
break;
}
if (check_access(thd, EVENT_ACL, lex->spname->m_db.str, 0, 0, 0,
is_schema_db(lex->spname->m_db.str)))
break;
if (lex->spname->m_name.length > NAME_LEN)
{
my_error(ER_TOO_LONG_IDENT, MYF(0), lex->spname->m_name.str);
goto error;
}
res= evex_show_create_event(thd, lex->spname, lex->et->definer);
break;
}
case SQLCOM_CREATE_FUNCTION: // UDF function case SQLCOM_CREATE_FUNCTION: // UDF function
{ {
if (check_access(thd,INSERT_ACL,"mysql",0,1,0,0)) if (check_access(thd,INSERT_ACL,"mysql",0,1,0,0))
...@@ -3761,10 +3914,8 @@ end_with_restore_list: ...@@ -3761,10 +3914,8 @@ end_with_restore_list:
if (!(res= mysql_create_user(thd, lex->users_list))) if (!(res= mysql_create_user(thd, lex->users_list)))
{ {
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
{ thd->binlog_query(THD::MYSQL_QUERY_TYPE,
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE); thd->query, thd->query_length, FALSE, FALSE);
mysql_bin_log.write(&qinfo);
}
send_ok(thd); send_ok(thd);
} }
break; break;
...@@ -3780,8 +3931,8 @@ end_with_restore_list: ...@@ -3780,8 +3931,8 @@ end_with_restore_list:
{ {
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
{ {
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE); thd->binlog_query(THD::MYSQL_QUERY_TYPE,
mysql_bin_log.write(&qinfo); thd->query, thd->query_length, FALSE, FALSE);
} }
send_ok(thd); send_ok(thd);
} }
...@@ -3798,8 +3949,8 @@ end_with_restore_list: ...@@ -3798,8 +3949,8 @@ end_with_restore_list:
{ {
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
{ {
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE); thd->binlog_query(THD::MYSQL_QUERY_TYPE,
mysql_bin_log.write(&qinfo); thd->query, thd->query_length, FALSE, FALSE);
} }
send_ok(thd); send_ok(thd);
} }
...@@ -3814,8 +3965,8 @@ end_with_restore_list: ...@@ -3814,8 +3965,8 @@ end_with_restore_list:
{ {
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
{ {
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE); thd->binlog_query(THD::MYSQL_QUERY_TYPE,
mysql_bin_log.write(&qinfo); thd->query, thd->query_length, FALSE, FALSE);
} }
send_ok(thd); send_ok(thd);
} }
...@@ -3894,8 +4045,8 @@ end_with_restore_list: ...@@ -3894,8 +4045,8 @@ end_with_restore_list:
if (!res && mysql_bin_log.is_open()) if (!res && mysql_bin_log.is_open())
{ {
thd->clear_error(); thd->clear_error();
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE); thd->binlog_query(THD::MYSQL_QUERY_TYPE,
mysql_bin_log.write(&qinfo); thd->query, thd->query_length, FALSE, FALSE);
} }
} }
else else
...@@ -3914,8 +4065,8 @@ end_with_restore_list: ...@@ -3914,8 +4065,8 @@ end_with_restore_list:
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
{ {
thd->clear_error(); thd->clear_error();
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE); thd->binlog_query(THD::MYSQL_QUERY_TYPE,
mysql_bin_log.write(&qinfo); thd->query, thd->query_length, FALSE, FALSE);
} }
if (lex->sql_command == SQLCOM_GRANT) if (lex->sql_command == SQLCOM_GRANT)
{ {
...@@ -3954,8 +4105,8 @@ end_with_restore_list: ...@@ -3954,8 +4105,8 @@ end_with_restore_list:
{ {
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
{ {
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE); thd->binlog_query(THD::STMT_QUERY_TYPE,
mysql_bin_log.write(&qinfo); thd->query, thd->query_length, 0, FALSE);
} }
} }
send_ok(thd); send_ok(thd);
...@@ -4295,12 +4446,12 @@ end_with_restore_list: ...@@ -4295,12 +4446,12 @@ end_with_restore_list:
db, name, db, name,
lex->sql_command == SQLCOM_CREATE_PROCEDURE, 1)) lex->sql_command == SQLCOM_CREATE_PROCEDURE, 1))
{ {
close_thread_tables(thd);
if (sp_grant_privileges(thd, db, name, if (sp_grant_privileges(thd, db, name,
lex->sql_command == SQLCOM_CREATE_PROCEDURE)) lex->sql_command == SQLCOM_CREATE_PROCEDURE))
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
ER_PROC_AUTO_GRANT_FAIL, ER_PROC_AUTO_GRANT_FAIL,
ER(ER_PROC_AUTO_GRANT_FAIL)); ER(ER_PROC_AUTO_GRANT_FAIL));
close_thread_tables(thd);
} }
#endif #endif
send_ok(thd); send_ok(thd);
...@@ -4518,8 +4669,8 @@ end_with_restore_list: ...@@ -4518,8 +4669,8 @@ end_with_restore_list:
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
{ {
thd->clear_error(); thd->clear_error();
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE); thd->binlog_query(THD::MYSQL_QUERY_TYPE,
mysql_bin_log.write(&qinfo); thd->query, thd->query_length, FALSE, FALSE);
} }
send_ok(thd); send_ok(thd);
break; break;
...@@ -4603,8 +4754,8 @@ end_with_restore_list: ...@@ -4603,8 +4754,8 @@ end_with_restore_list:
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
{ {
thd->clear_error(); thd->clear_error();
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE); thd->binlog_query(THD::MYSQL_QUERY_TYPE,
mysql_bin_log.write(&qinfo); thd->query, thd->query_length, FALSE, FALSE);
} }
send_ok(thd); send_ok(thd);
break; break;
...@@ -4728,8 +4879,8 @@ end_with_restore_list: ...@@ -4728,8 +4879,8 @@ end_with_restore_list:
buff.append(STRING_WITH_LEN(" AS ")); buff.append(STRING_WITH_LEN(" AS "));
buff.append(first_table->source.str, first_table->source.length); buff.append(first_table->source.str, first_table->source.length);
Query_log_event qinfo(thd, buff.ptr(), buff.length(), 0, FALSE); thd->binlog_query(THD::STMT_QUERY_TYPE,
mysql_bin_log.write(&qinfo); buff.ptr(), buff.length(), FALSE, FALSE);
} }
break; break;
} }
...@@ -4742,8 +4893,8 @@ end_with_restore_list: ...@@ -4742,8 +4893,8 @@ end_with_restore_list:
mysql_bin_log.is_open()) mysql_bin_log.is_open())
{ {
thd->clear_error(); thd->clear_error();
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE); thd->binlog_query(THD::STMT_QUERY_TYPE,
mysql_bin_log.write(&qinfo); thd->query, thd->query_length, FALSE, FALSE);
} }
break; break;
} }
...@@ -4937,6 +5088,30 @@ end_with_restore_list: ...@@ -4937,6 +5088,30 @@ end_with_restore_list:
case SQLCOM_XA_RECOVER: case SQLCOM_XA_RECOVER:
res= mysql_xa_recover(thd); res= mysql_xa_recover(thd);
break; break;
case SQLCOM_ALTER_TABLESPACE:
if (check_access(thd, ALTER_ACL, thd->db, 0, 1, 0, thd->db ? is_schema_db(thd->db) : 0))
break;
if (!(res= mysql_alter_tablespace(thd, lex->alter_tablespace_info)))
send_ok(thd);
break;
case SQLCOM_INSTALL_PLUGIN:
if (! (res= mysql_install_plugin(thd, &thd->lex->comment,
&thd->lex->ident)))
send_ok(thd);
break;
case SQLCOM_UNINSTALL_PLUGIN:
if (! (res= mysql_uninstall_plugin(thd, &thd->lex->comment)))
send_ok(thd);
break;
case SQLCOM_BINLOG_BASE64_EVENT:
{
#ifndef EMBEDDED_LIBRARY
mysql_client_binlog_statement(thd);
#else /* EMBEDDED_LIBRARY */
my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "embedded");
#endif /* EMBEDDED_LIBRARY */
break;
}
default: default:
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
DBUG_ASSERT(0); /* Impossible */ DBUG_ASSERT(0); /* Impossible */
...@@ -4944,10 +5119,12 @@ end_with_restore_list: ...@@ -4944,10 +5119,12 @@ end_with_restore_list:
send_ok(thd); send_ok(thd);
break; break;
} }
end:
thd->proc_info="query end"; thd->proc_info="query end";
/* Two binlog-related cleanups: */
/* /*
Binlog-related cleanup:
Reset system variables temporarily modified by SET ONE SHOT. Reset system variables temporarily modified by SET ONE SHOT.
Exception: If this is a SET, do nothing. This is to allow Exception: If this is a SET, do nothing. This is to allow
...@@ -4958,6 +5135,7 @@ end_with_restore_list: ...@@ -4958,6 +5135,7 @@ end_with_restore_list:
*/ */
if (thd->one_shot_set && lex->sql_command != SQLCOM_SET_OPTION) if (thd->one_shot_set && lex->sql_command != SQLCOM_SET_OPTION)
reset_one_shot_variables(thd); reset_one_shot_variables(thd);
thd->reset_current_stmt_binlog_row_based();
/* /*
The return value for ROW_COUNT() is "implementation dependent" if the The return value for ROW_COUNT() is "implementation dependent" if the
...@@ -4973,7 +5151,8 @@ end_with_restore_list: ...@@ -4973,7 +5151,8 @@ end_with_restore_list:
DBUG_RETURN(res || thd->net.report_error); DBUG_RETURN(res || thd->net.report_error);
error: error:
DBUG_RETURN(1); res= 1; // would be better to set res=1 before "goto error"
goto end;
} }
...@@ -5649,7 +5828,6 @@ void mysql_init_multi_delete(LEX *lex) ...@@ -5649,7 +5828,6 @@ void mysql_init_multi_delete(LEX *lex)
lex->query_tables_last= &lex->query_tables; lex->query_tables_last= &lex->query_tables;
} }
/* /*
When you modify mysql_parse(), you may need to mofify When you modify mysql_parse(), you may need to mofify
mysql_test_parse_for_slave() in this same file. mysql_test_parse_for_slave() in this same file.
...@@ -5679,11 +5857,16 @@ void mysql_parse(THD *thd, char *inBuf, uint length) ...@@ -5679,11 +5857,16 @@ void mysql_parse(THD *thd, char *inBuf, uint length)
{ {
if (thd->net.report_error) if (thd->net.report_error)
{ {
if (thd->lex->sphead) delete lex->sphead;
{ lex->sphead= NULL;
delete thd->lex->sphead; if (lex->et)
thd->lex->sphead= NULL; {
} lex->et->free_sphead_on_delete= true;
/* alloced on thd->mem_root so no real memory free but dtor call */
lex->et->free_sp();
lex->et->deinit_mutexes();
lex->et= NULL;
}
} }
else else
{ {
...@@ -5713,11 +5896,18 @@ void mysql_parse(THD *thd, char *inBuf, uint length) ...@@ -5713,11 +5896,18 @@ void mysql_parse(THD *thd, char *inBuf, uint length)
thd->is_fatal_error)); thd->is_fatal_error));
query_cache_abort(&thd->net); query_cache_abort(&thd->net);
lex->unit.cleanup(); lex->unit.cleanup();
if (thd->lex->sphead) if (lex->sphead)
{ {
/* Clean up after failed stored procedure/function */ /* Clean up after failed stored procedure/function */
delete thd->lex->sphead; delete lex->sphead;
thd->lex->sphead= NULL; lex->sphead= NULL;
}
if (lex->et)
{
lex->et->free_sphead_on_delete= true;
lex->et->free_sp();
lex->et->deinit_mutexes();
lex->et= NULL;
} }
} }
thd->proc_info="freeing items"; thd->proc_info="freeing items";
...@@ -5842,10 +6032,7 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type, ...@@ -5842,10 +6032,7 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type,
*/ */
char buf[32]; char buf[32];
my_snprintf(buf, sizeof(buf), "TIMESTAMP(%s)", length); my_snprintf(buf, sizeof(buf), "TIMESTAMP(%s)", length);
push_warning_printf(thd,MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DEPRECATED(thd, "5.2", buf, "'TIMESTAMP'");
ER_WARN_DEPRECATED_SYNTAX,
ER(ER_WARN_DEPRECATED_SYNTAX),
buf, "TIMESTAMP");
} }
if (!(new_field= new create_field()) || if (!(new_field= new create_field()) ||
...@@ -5974,12 +6161,16 @@ TABLE_LIST *st_select_lex::add_table_to_list(THD *thd, ...@@ -5974,12 +6161,16 @@ TABLE_LIST *st_select_lex::add_table_to_list(THD *thd,
if (!table) if (!table)
DBUG_RETURN(0); // End of memory DBUG_RETURN(0); // End of memory
alias_str= alias ? alias->str : table->table.str; alias_str= alias ? alias->str : table->table.str;
if (check_table_name(table->table.str,table->table.length) || if (check_table_name(table->table.str,table->table.length))
table->db.str && check_db_name(table->db.str))
{ {
my_error(ER_WRONG_TABLE_NAME, MYF(0), table->table.str); my_error(ER_WRONG_TABLE_NAME, MYF(0), table->table.str);
DBUG_RETURN(0); DBUG_RETURN(0);
} }
if (table->db.str && check_db_name(table->db.str))
{
my_error(ER_WRONG_DB_NAME, MYF(0), table->db.str);
DBUG_RETURN(0);
}
if (!alias) /* Alias is case sensitive */ if (!alias) /* Alias is case sensitive */
{ {
...@@ -6596,7 +6787,8 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables, ...@@ -6596,7 +6787,8 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables,
{ {
/* /*
Flush the normal query log, the update log, the binary log, Flush the normal query log, the update log, the binary log,
the slow query log, and the relay log (if it exists). the slow query log, the relay log (if it exists) and the log
tables.
*/ */
/* /*
...@@ -6606,15 +6798,17 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables, ...@@ -6606,15 +6798,17 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables,
than it would help them) than it would help them)
*/ */
tmp_write_to_binlog= 0; tmp_write_to_binlog= 0;
mysql_log.new_file(1);
mysql_slow_log.new_file(1);
mysql_bin_log.rotate_and_purge(RP_FORCE_ROTATE); mysql_bin_log.rotate_and_purge(RP_FORCE_ROTATE);
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
pthread_mutex_lock(&LOCK_active_mi); pthread_mutex_lock(&LOCK_active_mi);
rotate_relay_log(active_mi); rotate_relay_log(active_mi);
pthread_mutex_unlock(&LOCK_active_mi); pthread_mutex_unlock(&LOCK_active_mi);
#endif #endif
if (ha_flush_logs())
/* flush slow and general logs */
logger.flush_logs(thd);
if (ha_flush_logs(NULL))
result=1; result=1;
if (flush_error_log()) if (flush_error_log())
result=1; result=1;
...@@ -6738,6 +6932,8 @@ void kill_one_thread(THD *thd, ulong id, bool only_kill_query) ...@@ -6738,6 +6932,8 @@ void kill_one_thread(THD *thd, ulong id, bool only_kill_query)
I_List_iterator<THD> it(threads); I_List_iterator<THD> it(threads);
while ((tmp=it++)) while ((tmp=it++))
{ {
if (tmp->command == COM_DAEMON)
continue;
if (tmp->thread_id == id) if (tmp->thread_id == id)
{ {
pthread_mutex_lock(&tmp->LOCK_delete); // Lock from delete pthread_mutex_lock(&tmp->LOCK_delete); // Lock from delete
...@@ -6767,8 +6963,8 @@ void kill_one_thread(THD *thd, ulong id, bool only_kill_query) ...@@ -6767,8 +6963,8 @@ void kill_one_thread(THD *thd, ulong id, bool only_kill_query)
/* If pointer is not a null pointer, append filename to it */ /* If pointer is not a null pointer, append filename to it */
static bool append_file_to_dir(THD *thd, const char **filename_ptr, bool append_file_to_dir(THD *thd, const char **filename_ptr,
const char *table_name) const char *table_name)
{ {
char buff[FN_REFLEN],*ptr, *end; char buff[FN_REFLEN],*ptr, *end;
if (!*filename_ptr) if (!*filename_ptr)
...@@ -6908,7 +7104,7 @@ bool mysql_create_index(THD *thd, TABLE_LIST *table_list, List<Key> &keys) ...@@ -6908,7 +7104,7 @@ bool mysql_create_index(THD *thd, TABLE_LIST *table_list, List<Key> &keys)
HA_CREATE_INFO create_info; HA_CREATE_INFO create_info;
DBUG_ENTER("mysql_create_index"); DBUG_ENTER("mysql_create_index");
bzero((char*) &create_info,sizeof(create_info)); bzero((char*) &create_info,sizeof(create_info));
create_info.db_type=DB_TYPE_DEFAULT; create_info.db_type= (handlerton*) &default_hton;
create_info.default_table_charset= thd->variables.collation_database; create_info.default_table_charset= thd->variables.collation_database;
DBUG_RETURN(mysql_alter_table(thd,table_list->db,table_list->table_name, DBUG_RETURN(mysql_alter_table(thd,table_list->db,table_list->table_name,
&create_info, table_list, &create_info, table_list,
...@@ -6924,7 +7120,7 @@ bool mysql_drop_index(THD *thd, TABLE_LIST *table_list, ALTER_INFO *alter_info) ...@@ -6924,7 +7120,7 @@ bool mysql_drop_index(THD *thd, TABLE_LIST *table_list, ALTER_INFO *alter_info)
HA_CREATE_INFO create_info; HA_CREATE_INFO create_info;
DBUG_ENTER("mysql_drop_index"); DBUG_ENTER("mysql_drop_index");
bzero((char*) &create_info,sizeof(create_info)); bzero((char*) &create_info,sizeof(create_info));
create_info.db_type=DB_TYPE_DEFAULT; create_info.db_type= (handlerton*) &default_hton;
create_info.default_table_charset= thd->variables.collation_database; create_info.default_table_charset= thd->variables.collation_database;
alter_info->clear(); alter_info->clear();
alter_info->flags= ALTER_DROP_INDEX; alter_info->flags= ALTER_DROP_INDEX;
......
...@@ -1213,7 +1213,7 @@ static void test_tran_bdb() ...@@ -1213,7 +1213,7 @@ static void test_tran_bdb()
/* create the table 'mytran_demo' of type BDB' or 'InnoDB' */ /* create the table 'mytran_demo' of type BDB' or 'InnoDB' */
rc= mysql_query(mysql, "CREATE TABLE my_demo_transaction( " rc= mysql_query(mysql, "CREATE TABLE my_demo_transaction( "
"col1 int , col2 varchar(30)) TYPE= BDB"); "col1 int , col2 varchar(30)) ENGINE= BDB");
myquery(rc); myquery(rc);
/* insert a row and commit the transaction */ /* insert a row and commit the transaction */
...@@ -1286,7 +1286,7 @@ static void test_tran_innodb() ...@@ -1286,7 +1286,7 @@ static void test_tran_innodb()
/* create the table 'mytran_demo' of type BDB' or 'InnoDB' */ /* create the table 'mytran_demo' of type BDB' or 'InnoDB' */
rc= mysql_query(mysql, "CREATE TABLE my_demo_transaction(col1 int, " rc= mysql_query(mysql, "CREATE TABLE my_demo_transaction(col1 int, "
"col2 varchar(30)) TYPE= InnoDB"); "col2 varchar(30)) ENGINE= InnoDB");
myquery(rc); myquery(rc);
/* insert a row and commit the transaction */ /* insert a row and commit the transaction */
...@@ -9810,7 +9810,7 @@ static void test_derived() ...@@ -9810,7 +9810,7 @@ static void test_derived()
myquery(rc); myquery(rc);
rc= mysql_query(mysql, "create table t1 (id int(8), primary key (id)) \ rc= mysql_query(mysql, "create table t1 (id int(8), primary key (id)) \
TYPE=InnoDB DEFAULT CHARSET=utf8"); ENGINE=InnoDB DEFAULT CHARSET=utf8");
myquery(rc); myquery(rc);
rc= mysql_query(mysql, "insert into t1 values (1)"); rc= mysql_query(mysql, "insert into t1 values (1)");
...@@ -9858,16 +9858,16 @@ static void test_xjoin() ...@@ -9858,16 +9858,16 @@ static void test_xjoin()
rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1, t2, t3, t4"); rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1, t2, t3, t4");
myquery(rc); myquery(rc);
rc= mysql_query(mysql, "create table t3 (id int(8), param1_id int(8), param2_id int(8)) TYPE=InnoDB DEFAULT CHARSET=utf8"); rc= mysql_query(mysql, "create table t3 (id int(8), param1_id int(8), param2_id int(8)) ENGINE=InnoDB DEFAULT CHARSET=utf8");
myquery(rc); myquery(rc);
rc= mysql_query(mysql, "create table t1 ( id int(8), name_id int(8), value varchar(10)) TYPE=InnoDB DEFAULT CHARSET=utf8"); rc= mysql_query(mysql, "create table t1 ( id int(8), name_id int(8), value varchar(10)) ENGINE=InnoDB DEFAULT CHARSET=utf8");
myquery(rc); myquery(rc);
rc= mysql_query(mysql, "create table t2 (id int(8), name_id int(8), value varchar(10)) TYPE=InnoDB DEFAULT CHARSET=utf8;"); rc= mysql_query(mysql, "create table t2 (id int(8), name_id int(8), value varchar(10)) ENGINE=InnoDB DEFAULT CHARSET=utf8;");
myquery(rc); myquery(rc);
rc= mysql_query(mysql, "create table t4(id int(8), value varchar(10)) TYPE=InnoDB DEFAULT CHARSET=utf8"); rc= mysql_query(mysql, "create table t4(id int(8), value varchar(10)) ENGINE=InnoDB DEFAULT CHARSET=utf8");
myquery(rc); myquery(rc);
rc= mysql_query(mysql, "insert into t3 values (1, 1, 1), (2, 2, null)"); rc= mysql_query(mysql, "insert into t3 values (1, 1, 1), (2, 2, null)");
...@@ -14401,7 +14401,7 @@ static void test_bug14210() ...@@ -14401,7 +14401,7 @@ static void test_bug14210()
itself is not InnoDB related. In case the table is MyISAM this test itself is not InnoDB related. In case the table is MyISAM this test
is harmless. is harmless.
*/ */
mysql_query(mysql, "create table t1 (a varchar(255)) type=InnoDB"); mysql_query(mysql, "create table t1 (a varchar(255)) engine=InnoDB");
rc= mysql_query(mysql, "insert into t1 (a) values (repeat('a', 256))"); rc= mysql_query(mysql, "insert into t1 (a) values (repeat('a', 256))");
myquery(rc); myquery(rc);
rc= mysql_query(mysql, "set @@session.max_heap_table_size=16384"); rc= mysql_query(mysql, "set @@session.max_heap_table_size=16384");
...@@ -14758,6 +14758,24 @@ static void test_bug16143() ...@@ -14758,6 +14758,24 @@ static void test_bug16143()
} }
/* Bug #16144: mysql_stmt_attr_get type error */
static void test_bug16144()
{
const my_bool flag_orig= (my_bool) 0xde;
my_bool flag= flag_orig;
MYSQL_STMT *stmt;
myheader("test_bug16144");
/* Check that attr_get returns correct data on little and big endian CPUs */
stmt= mysql_stmt_init(mysql);
mysql_stmt_attr_set(stmt, STMT_ATTR_UPDATE_MAX_LENGTH, (const void*) &flag);
mysql_stmt_attr_get(stmt, STMT_ATTR_UPDATE_MAX_LENGTH, (void*) &flag);
DIE_UNLESS(flag == flag_orig);
mysql_stmt_close(stmt);
}
/* /*
Bug #15613: "libmysqlclient API function mysql_stmt_prepare returns wrong Bug #15613: "libmysqlclient API function mysql_stmt_prepare returns wrong
field length" field length"
...@@ -15180,10 +15198,11 @@ static struct my_tests_st my_tests[]= { ...@@ -15180,10 +15198,11 @@ static struct my_tests_st my_tests[]= {
{ "test_bug13488", test_bug13488 }, { "test_bug13488", test_bug13488 },
{ "test_bug13524", test_bug13524 }, { "test_bug13524", test_bug13524 },
{ "test_bug14845", test_bug14845 }, { "test_bug14845", test_bug14845 },
{ "test_bug15510", test_bug15510 },
{ "test_opt_reconnect", test_opt_reconnect }, { "test_opt_reconnect", test_opt_reconnect },
{ "test_bug15510", test_bug15510},
{ "test_bug12744", test_bug12744 }, { "test_bug12744", test_bug12744 },
{ "test_bug16143", test_bug16143 }, { "test_bug16143", test_bug16143 },
{ "test_bug16144", test_bug16144 },
{ "test_bug15613", test_bug15613 }, { "test_bug15613", test_bug15613 },
{ "test_bug14169", test_bug14169 }, { "test_bug14169", test_bug14169 },
{ "test_bug17667", test_bug17667 }, { "test_bug17667", test_bug17667 },
...@@ -15300,7 +15319,6 @@ int main(int argc, char **argv) ...@@ -15300,7 +15319,6 @@ int main(int argc, char **argv)
{ {
struct my_tests_st *fptr; struct my_tests_st *fptr;
DEBUGGER_OFF;
MY_INIT(argv[0]); MY_INIT(argv[0]);
load_defaults("my", client_test_load_default_groups, &argc, &argv); load_defaults("my", client_test_load_default_groups, &argc, &argv);
......
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