mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
merge of Bug#33204 (backport)
This commit is contained in:
@ -1,4 +1,4 @@
|
||||
[MYSQL]
|
||||
post_commit_to = "commits@lists.mysql.com"
|
||||
post_push_to = "commits@lists.mysql.com"
|
||||
tree_name = "mysql-5.5-next-mr-bugfixing"
|
||||
tree_name = "mysql-5.6-next-mr-bugfixing"
|
||||
|
@ -3066,4 +3066,7 @@ sql/share/swedish
|
||||
sql/share/ukrainian
|
||||
libmysqld/examples/mysqltest.cc
|
||||
libmysqld/sql_signal.cc
|
||||
libmysqld/rpl_handler.cc
|
||||
libmysqld/debug_sync.cc
|
||||
libmysqld/rpl_handler.cc
|
||||
dbug/tests
|
||||
|
@ -1274,7 +1274,7 @@ set_bsd_configs()
|
||||
if test "x$fast_flag" != "xno" ; then
|
||||
compiler_flags="$compiler_flags -O3"
|
||||
else
|
||||
compiler_flags="$compiler_flags -O"
|
||||
compiler_flags="$compiler_flags -O0"
|
||||
fi
|
||||
set_cc_and_cxx_for_gcc
|
||||
}
|
||||
@ -1305,7 +1305,7 @@ set_linux_configs()
|
||||
if test "x$fast_flag" != "xno" ; then
|
||||
compiler_flags="$compiler_flags -O2"
|
||||
else
|
||||
compiler_flags="$compiler_flags -O"
|
||||
compiler_flags="$compiler_flags -O0"
|
||||
fi
|
||||
# configure will set proper compiler flags for gcc on Linux
|
||||
elif test "x$compiler" = "xicc" ; then
|
||||
@ -1375,8 +1375,8 @@ set_solaris_configs()
|
||||
LDFLAGS="$LDFLAGS -O2"
|
||||
compiler_flags="$compiler_flags -O2"
|
||||
else
|
||||
LDFLAGS="$LDFLAGS -O"
|
||||
compiler_flags="$compiler_flags -O"
|
||||
LDFLAGS="$LDFLAGS -O0"
|
||||
compiler_flags="$compiler_flags -O0"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
@ -1407,7 +1407,7 @@ set_solaris_configs()
|
||||
elif test "x$fast_flag" = "xgeneric" ; then
|
||||
compiler_flags="$compiler_flags -xO2"
|
||||
else
|
||||
compiler_flags="$compiler_flags -xO"
|
||||
compiler_flags="$compiler_flags -xO0"
|
||||
fi
|
||||
else
|
||||
#Using SPARC cpu with SunStudio (Forte) compiler
|
||||
@ -1421,7 +1421,7 @@ set_solaris_configs()
|
||||
elif test "x$fast_flag" = "xgeneric" ; then
|
||||
compiler_flags="$compiler_flags -xO2"
|
||||
else
|
||||
compiler_flags="$compiler_flags -xO"
|
||||
compiler_flags="$compiler_flags -xO0"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
@ -1452,7 +1452,7 @@ set_macosx_configs()
|
||||
if test "x$fast_flag" != "xno" ; then
|
||||
compiler_flags="$compiler_flags -Os"
|
||||
else
|
||||
compiler_flags="$compiler_flags -O"
|
||||
compiler_flags="$compiler_flags -O0"
|
||||
fi
|
||||
set_cc_and_cxx_for_gcc
|
||||
}
|
||||
|
@ -311,6 +311,7 @@ ADD_SUBDIRECTORY(extra)
|
||||
ADD_SUBDIRECTORY(client)
|
||||
ADD_SUBDIRECTORY(sql)
|
||||
ADD_SUBDIRECTORY(libmysql)
|
||||
ADD_SUBDIRECTORY(libservices)
|
||||
ADD_SUBDIRECTORY(tests)
|
||||
IF(WITH_EMBEDDED_SERVER)
|
||||
ADD_SUBDIRECTORY(libmysqld)
|
||||
|
13
Makefile.am
13
Makefile.am
@ -23,7 +23,7 @@ EXTRA_DIST = INSTALL-SOURCE INSTALL-WIN-SOURCE \
|
||||
|
||||
SUBDIRS = . include @docs_dirs@ @zlib_dir@ \
|
||||
@readline_topdir@ sql-common scripts \
|
||||
@pstack_dir@ \
|
||||
@pstack_dir@ libservices \
|
||||
@sql_union_dirs@ unittest \
|
||||
@sql_server@ @man_dirs@ tests \
|
||||
netware @libmysqld_dirs@ \
|
||||
@ -32,7 +32,7 @@ SUBDIRS = . include @docs_dirs@ @zlib_dir@ \
|
||||
|
||||
DIST_SUBDIRS = . include Docs zlib \
|
||||
cmd-line-utils sql-common scripts \
|
||||
pstack \
|
||||
pstack libservices \
|
||||
strings mysys dbug extra regex libmysql libmysql_r client unittest storage plugin \
|
||||
vio sql man tests \
|
||||
netware libmysqld \
|
||||
@ -98,7 +98,8 @@ test-pr:
|
||||
|
||||
test-ns:
|
||||
cd mysql-test ; \
|
||||
@PERL@ ./mysql-test-run.pl $(force) $(mem) --mysqld=--binlog-format=mixed
|
||||
@PERL@ ./mysql-test-run.pl $(force) $(mem) --mysqld=--binlog-format=mixed ; \
|
||||
@PERL@ ./mysql-test-run.pl $(force) $(mem) --suite=funcs_1
|
||||
|
||||
test-binlog-statement:
|
||||
cd mysql-test ; \
|
||||
@ -198,6 +199,10 @@ test-bt-fast:
|
||||
-cd mysql-test ; MTR_BUILD_THREAD=auto \
|
||||
@PERL@ ./mysql-test-run.pl --force --comment=stress --suite=stress $(EXP)
|
||||
|
||||
test-bt-fast:
|
||||
-cd mysql-test ; MTR_BUILD_THREAD=auto \
|
||||
@PERL@ ./mysql-test-run.pl --force --comment=ps --ps-protocol --report-features
|
||||
|
||||
test-bt-debug:
|
||||
-cd mysql-test ; MTR_BUILD_THREAD=auto \
|
||||
@PERL@ ./mysql-test-run.pl --comment=debug --force --timer \
|
||||
@ -205,6 +210,8 @@ test-bt-debug:
|
||||
|
||||
test-bt-debug-fast:
|
||||
|
||||
test-bt-debug-fast:
|
||||
|
||||
# Keep these for a while
|
||||
test-pl: test
|
||||
test-full-pl: test-full
|
||||
|
@ -1114,7 +1114,11 @@ int main(int argc,char *argv[])
|
||||
close(stdout_fileno_copy); /* Clean up dup(). */
|
||||
}
|
||||
|
||||
load_defaults("my",load_default_groups,&argc,&argv);
|
||||
if (load_defaults("my",load_default_groups,&argc,&argv))
|
||||
{
|
||||
my_end(0);
|
||||
exit(1);
|
||||
}
|
||||
defaults_argv=argv;
|
||||
if (get_options(argc, (char **) argv))
|
||||
{
|
||||
@ -1281,21 +1285,35 @@ sig_handler handle_sigint(int sig)
|
||||
MYSQL *kill_mysql= NULL;
|
||||
|
||||
/* terminate if no query being executed, or we already tried interrupting */
|
||||
if (!executing_query || interrupted_query)
|
||||
/* terminate if no query being executed, or we already tried interrupting */
|
||||
if (!executing_query || (interrupted_query == 2))
|
||||
{
|
||||
tee_fprintf(stdout, "Ctrl-C -- exit!\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
kill_mysql= mysql_init(kill_mysql);
|
||||
if (!mysql_real_connect(kill_mysql,current_host, current_user, opt_password,
|
||||
"", opt_mysql_port, opt_mysql_unix_port,0))
|
||||
{
|
||||
tee_fprintf(stdout, "Ctrl-C -- sorry, cannot connect to server to kill query, giving up ...\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
interrupted_query++;
|
||||
|
||||
/* mysqld < 5 does not understand KILL QUERY, skip to KILL CONNECTION */
|
||||
if ((interrupted_query == 1) && (mysql_get_server_version(&mysql) < 50000))
|
||||
interrupted_query= 2;
|
||||
|
||||
/* kill_buffer is always big enough because max length of %lu is 15 */
|
||||
sprintf(kill_buffer, "KILL /*!50000 QUERY */ %lu", mysql_thread_id(&mysql));
|
||||
mysql_real_query(kill_mysql, kill_buffer, strlen(kill_buffer));
|
||||
sprintf(kill_buffer, "KILL %s%lu",
|
||||
(interrupted_query == 1) ? "QUERY " : "",
|
||||
mysql_thread_id(&mysql));
|
||||
tee_fprintf(stdout, "Ctrl-C -- sending \"%s\" to server ...\n", kill_buffer);
|
||||
mysql_real_query(kill_mysql, kill_buffer, (uint) strlen(kill_buffer));
|
||||
mysql_close(kill_mysql);
|
||||
tee_fprintf(stdout, "Query aborted by Ctrl+C\n");
|
||||
|
||||
interrupted_query= 1;
|
||||
tee_fprintf(stdout, "Ctrl-C -- query aborted.\n");
|
||||
|
||||
return;
|
||||
|
||||
|
@ -819,7 +819,8 @@ int main(int argc, char **argv)
|
||||
init_dynamic_string(&conn_args, "", 512, 256))
|
||||
die("Out of memory");
|
||||
|
||||
load_defaults("my", load_default_groups, &argc, &argv);
|
||||
if (load_defaults("my", load_default_groups, &argc, &argv))
|
||||
die(NULL);
|
||||
defaults_argv= argv; /* Must be freed by 'free_defaults' */
|
||||
|
||||
if (handle_options(&argc, &argv, my_long_options, get_one_option))
|
||||
|
@ -304,7 +304,8 @@ int main(int argc,char *argv[])
|
||||
|
||||
MY_INIT(argv[0]);
|
||||
mysql_init(&mysql);
|
||||
load_defaults("my",load_default_groups,&argc,&argv);
|
||||
if (load_defaults("my",load_default_groups,&argc,&argv))
|
||||
exit(1);
|
||||
save_argv = argv; /* Save for free_defaults */
|
||||
if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
|
||||
{
|
||||
|
@ -995,13 +995,13 @@ static struct my_option my_long_options[] =
|
||||
/* 'unspec' is not mentioned because it is just a placeholder. */
|
||||
"Determine when the output statements should be base64-encoded BINLOG "
|
||||
"statements: 'never' disables it and works only for binlogs without "
|
||||
"row-based events; 'auto' is the default and prints base64 only when "
|
||||
"necessary (i.e., for row-based events and format description events); "
|
||||
"'decode-rows' suppresses BINLOG statements for row events, but does "
|
||||
"not exit as an error if a row event is found, unlike 'never'; "
|
||||
"'always' prints base64 whenever possible. 'always' is for debugging "
|
||||
"only and should not be used in a production system. The default is "
|
||||
"'auto'. --base64-output is a short form for --base64-output=always."
|
||||
"row-based events; 'decode-rows' decodes row events into commented SQL "
|
||||
"statements if the --verbose option is also given; 'auto' prints base64 "
|
||||
"only when necessary (i.e., for row-based events and format description "
|
||||
"events); 'always' prints base64 whenever possible. 'always' is for "
|
||||
"debugging only and should not be used in a production system. If this "
|
||||
"argument is not given, the default is 'auto'; if it is given with no "
|
||||
"argument, 'always' is used."
|
||||
,(uchar**) &opt_base64_output_mode_str,
|
||||
(uchar**) &opt_base64_output_mode_str,
|
||||
0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||
@ -2014,7 +2014,8 @@ int main(int argc, char** argv)
|
||||
|
||||
my_init_time(); // for time functions
|
||||
|
||||
load_defaults("my", load_default_groups, &argc, &argv);
|
||||
if (load_defaults("my", load_default_groups, &argc, &argv))
|
||||
exit(1);
|
||||
defaults_argv= argv;
|
||||
parse_args(&argc, (char***)&argv);
|
||||
|
||||
|
@ -344,9 +344,8 @@ static int get_options(int *argc, char ***argv)
|
||||
exit(0);
|
||||
}
|
||||
|
||||
load_defaults("my", load_default_groups, argc, argv);
|
||||
|
||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option)))
|
||||
if ((ho_error= load_defaults("my", load_default_groups, argc, argv)) ||
|
||||
(ho_error=handle_options(argc, argv, my_long_options, get_one_option)))
|
||||
exit(ho_error);
|
||||
|
||||
if (!what_to_do)
|
||||
|
@ -858,12 +858,13 @@ static int get_options(int *argc, char ***argv)
|
||||
opt_net_buffer_length= *mysql_params->p_net_buffer_length;
|
||||
|
||||
md_result_file= stdout;
|
||||
load_defaults("my",load_default_groups,argc,argv);
|
||||
if (load_defaults("my",load_default_groups,argc,argv))
|
||||
return 1;
|
||||
defaults_argv= *argv;
|
||||
|
||||
if (hash_init(&ignore_table, charset_info, 16, 0, 0,
|
||||
(hash_get_key) get_table_key,
|
||||
(hash_free_key) free_table_ent, 0))
|
||||
if (my_hash_init(&ignore_table, charset_info, 16, 0, 0,
|
||||
(my_hash_get_key) get_table_key,
|
||||
(my_hash_free_key) free_table_ent, 0))
|
||||
return(EX_EOM);
|
||||
/* Don't copy internal log tables */
|
||||
if (my_hash_insert(&ignore_table,
|
||||
@ -1367,8 +1368,8 @@ static void free_resources()
|
||||
if (md_result_file && md_result_file != stdout)
|
||||
my_fclose(md_result_file, MYF(0));
|
||||
my_free(opt_password, MYF(MY_ALLOW_ZERO_PTR));
|
||||
if (hash_inited(&ignore_table))
|
||||
hash_free(&ignore_table);
|
||||
if (my_hash_inited(&ignore_table))
|
||||
my_hash_free(&ignore_table);
|
||||
if (extended_insert)
|
||||
dynstr_free(&extended_row);
|
||||
if (insert_pat_inited)
|
||||
@ -3958,7 +3959,7 @@ static int init_dumping(char *database, int init_func(char*))
|
||||
|
||||
my_bool include_table(const uchar *hash_key, size_t len)
|
||||
{
|
||||
return !hash_search(&ignore_table, hash_key, len);
|
||||
return ! my_hash_search(&ignore_table, hash_key, len);
|
||||
}
|
||||
|
||||
|
||||
|
@ -592,7 +592,8 @@ int main(int argc, char **argv)
|
||||
char **argv_to_free;
|
||||
MY_INIT(argv[0]);
|
||||
|
||||
load_defaults("my",load_default_groups,&argc,&argv);
|
||||
if (load_defaults("my",load_default_groups,&argc,&argv))
|
||||
return 1;
|
||||
/* argv is changed in the program */
|
||||
argv_to_free= argv;
|
||||
if (get_options(&argc, &argv))
|
||||
|
@ -63,7 +63,9 @@ int main(int argc, char **argv)
|
||||
char *wild;
|
||||
MYSQL mysql;
|
||||
MY_INIT(argv[0]);
|
||||
load_defaults("my",load_default_groups,&argc,&argv);
|
||||
if (load_defaults("my",load_default_groups,&argc,&argv))
|
||||
exit(1);
|
||||
|
||||
get_options(&argc,&argv);
|
||||
|
||||
wild=0;
|
||||
|
@ -299,7 +299,11 @@ int main(int argc, char **argv)
|
||||
|
||||
MY_INIT(argv[0]);
|
||||
|
||||
load_defaults("my",load_default_groups,&argc,&argv);
|
||||
if (load_defaults("my",load_default_groups,&argc,&argv))
|
||||
{
|
||||
my_end(0);
|
||||
exit(1);
|
||||
}
|
||||
defaults_argv=argv;
|
||||
if (get_options(&argc,&argv))
|
||||
{
|
||||
|
@ -115,6 +115,8 @@ static uint my_end_arg= 0;
|
||||
/* Number of lines of the result to include in failure report */
|
||||
static uint opt_tail_lines= 0;
|
||||
|
||||
static uint opt_connect_timeout= 0;
|
||||
|
||||
static char delimiter[MAX_DELIMITER_LENGTH]= ";";
|
||||
static uint delimiter_length= 1;
|
||||
|
||||
@ -260,8 +262,7 @@ enum enum_commands {
|
||||
Q_SEND, Q_REAP,
|
||||
Q_DIRTY_CLOSE, Q_REPLACE, Q_REPLACE_COLUMN,
|
||||
Q_PING, Q_EVAL,
|
||||
Q_RPL_PROBE, Q_ENABLE_RPL_PARSE,
|
||||
Q_DISABLE_RPL_PARSE, Q_EVAL_RESULT,
|
||||
Q_EVAL_RESULT,
|
||||
Q_ENABLE_QUERY_LOG, Q_DISABLE_QUERY_LOG,
|
||||
Q_ENABLE_RESULT_LOG, Q_DISABLE_RESULT_LOG,
|
||||
Q_WAIT_FOR_SLAVE_TO_STOP,
|
||||
@ -283,7 +284,7 @@ enum enum_commands {
|
||||
Q_SEND_QUIT, Q_CHANGE_USER, Q_MKDIR, Q_RMDIR,
|
||||
Q_LIST_FILES, Q_LIST_FILES_WRITE_FILE, Q_LIST_FILES_APPEND_FILE,
|
||||
Q_SEND_SHUTDOWN, Q_SHUTDOWN_SERVER,
|
||||
Q_MOVE_FILE,
|
||||
Q_MOVE_FILE, Q_SEND_EVAL,
|
||||
|
||||
Q_UNKNOWN, /* Unknown command. */
|
||||
Q_COMMENT, /* Comments, ignored. */
|
||||
@ -320,9 +321,6 @@ const char *command_names[]=
|
||||
"replace_column",
|
||||
"ping",
|
||||
"eval",
|
||||
"rpl_probe",
|
||||
"enable_rpl_parse",
|
||||
"disable_rpl_parse",
|
||||
"eval_result",
|
||||
/* Enable/disable that the _query_ is logged to result file */
|
||||
"enable_query_log",
|
||||
@ -381,6 +379,7 @@ const char *command_names[]=
|
||||
"send_shutdown",
|
||||
"shutdown_server",
|
||||
"move_file",
|
||||
"send_eval",
|
||||
|
||||
0
|
||||
};
|
||||
@ -662,14 +661,6 @@ public:
|
||||
LogFile log_file;
|
||||
LogFile progress_file;
|
||||
|
||||
|
||||
/* Disable functions that only exist in MySQL 4.0 */
|
||||
#if MYSQL_VERSION_ID < 40000
|
||||
void mysql_enable_rpl_parse(MYSQL* mysql __attribute__((unused))) {}
|
||||
void mysql_disable_rpl_parse(MYSQL* mysql __attribute__((unused))) {}
|
||||
int mysql_rpl_parse_enabled(MYSQL* mysql __attribute__((unused))) { return 1; }
|
||||
my_bool mysql_rpl_probe(MYSQL *mysql __attribute__((unused))) { return 1; }
|
||||
#endif
|
||||
void replace_dynstr_append_mem(DYNAMIC_STRING *ds, const char *val,
|
||||
int len);
|
||||
void replace_dynstr_append(DYNAMIC_STRING *ds, const char *val);
|
||||
@ -1138,7 +1129,7 @@ void free_used_memory()
|
||||
|
||||
close_connections();
|
||||
close_files();
|
||||
hash_free(&var_hash);
|
||||
my_hash_free(&var_hash);
|
||||
|
||||
for (i= 0 ; i < q_lines.elements ; i++)
|
||||
{
|
||||
@ -1171,7 +1162,6 @@ void free_used_memory()
|
||||
mysql_server_end();
|
||||
|
||||
/* Don't use DBUG after mysql_server_end() */
|
||||
DBUG_VIOLATION_HELPER_LEAVE;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2001,8 +1991,8 @@ VAR* var_get(const char *var_name, const char **var_name_end, my_bool raw,
|
||||
if (length >= MAX_VAR_NAME_LENGTH)
|
||||
die("Too long variable name: %s", save_var_name);
|
||||
|
||||
if (!(v = (VAR*) hash_search(&var_hash, (const uchar*) save_var_name,
|
||||
length)))
|
||||
if (!(v = (VAR*) my_hash_search(&var_hash, (const uchar*) save_var_name,
|
||||
length)))
|
||||
{
|
||||
char buff[MAX_VAR_NAME_LENGTH+1];
|
||||
strmake(buff, save_var_name, length);
|
||||
@ -2033,7 +2023,7 @@ err:
|
||||
VAR *var_obtain(const char *name, int len)
|
||||
{
|
||||
VAR* v;
|
||||
if ((v = (VAR*)hash_search(&var_hash, (const uchar *) name, len)))
|
||||
if ((v = (VAR*)my_hash_search(&var_hash, (const uchar *) name, len)))
|
||||
return v;
|
||||
v = var_init(0, name, len, "", 0);
|
||||
my_hash_insert(&var_hash, (uchar*)v);
|
||||
@ -3851,12 +3841,8 @@ int do_save_master_pos()
|
||||
MYSQL_ROW row;
|
||||
MYSQL *mysql = &cur_con->mysql;
|
||||
const char *query;
|
||||
int rpl_parse;
|
||||
DBUG_ENTER("do_save_master_pos");
|
||||
|
||||
rpl_parse = mysql_rpl_parse_enabled(mysql);
|
||||
mysql_disable_rpl_parse(mysql);
|
||||
|
||||
#ifdef HAVE_NDB_BINLOG
|
||||
/*
|
||||
Wait for ndb binlog to be up-to-date with all changes
|
||||
@ -4006,10 +3992,6 @@ int do_save_master_pos()
|
||||
strnmov(master_pos.file, row[0], sizeof(master_pos.file)-1);
|
||||
master_pos.pos = strtoul(row[1], (char**) 0, 10);
|
||||
mysql_free_result(res);
|
||||
|
||||
if (rpl_parse)
|
||||
mysql_enable_rpl_parse(mysql);
|
||||
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
@ -4072,29 +4054,6 @@ void do_let(struct st_command *command)
|
||||
}
|
||||
|
||||
|
||||
int do_rpl_probe(struct st_command *command __attribute__((unused)))
|
||||
{
|
||||
DBUG_ENTER("do_rpl_probe");
|
||||
if (mysql_rpl_probe(&cur_con->mysql))
|
||||
die("Failed in mysql_rpl_probe(): '%s'", mysql_error(&cur_con->mysql));
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
||||
int do_enable_rpl_parse(struct st_command *command __attribute__((unused)))
|
||||
{
|
||||
mysql_enable_rpl_parse(&cur_con->mysql);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int do_disable_rpl_parse(struct st_command *command __attribute__((unused)))
|
||||
{
|
||||
mysql_disable_rpl_parse(&cur_con->mysql);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Sleep the number of specified seconds
|
||||
|
||||
@ -5025,6 +4984,11 @@ void do_connect(struct st_command *command)
|
||||
#endif
|
||||
if (!mysql_init(&con_slot->mysql))
|
||||
die("Failed on mysql_init()");
|
||||
|
||||
if (opt_connect_timeout)
|
||||
mysql_options(&con_slot->mysql, MYSQL_OPT_CONNECT_TIMEOUT,
|
||||
(void *) &opt_connect_timeout);
|
||||
|
||||
if (opt_compress || con_compress)
|
||||
mysql_options(&con_slot->mysql, MYSQL_OPT_COMPRESS, NullS);
|
||||
mysql_options(&con_slot->mysql, MYSQL_OPT_LOCAL_INFILE, 0);
|
||||
@ -5814,6 +5778,11 @@ static struct my_option my_long_options[] =
|
||||
{"view-protocol", OPT_VIEW_PROTOCOL, "Use views for select",
|
||||
(uchar**) &view_protocol, (uchar**) &view_protocol, 0,
|
||||
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"connect_timeout", OPT_CONNECT_TIMEOUT,
|
||||
"Number of seconds before connection timeout.",
|
||||
(uchar**) &opt_connect_timeout,
|
||||
(uchar**) &opt_connect_timeout, 0, GET_UINT, REQUIRED_ARG,
|
||||
120, 0, 3600 * 12, 0, 0, 0},
|
||||
{ 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
|
||||
};
|
||||
|
||||
@ -5987,7 +5956,9 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
||||
|
||||
int parse_args(int argc, char **argv)
|
||||
{
|
||||
load_defaults("my",load_default_groups,&argc,&argv);
|
||||
if (load_defaults("my",load_default_groups,&argc,&argv))
|
||||
exit(1);
|
||||
|
||||
default_argv= argv;
|
||||
|
||||
if ((handle_options(&argc, &argv, my_long_options, get_one_option)))
|
||||
@ -6552,8 +6523,6 @@ void run_query_normal(struct st_connection *cn, struct st_command *command,
|
||||
|
||||
if (!disable_result_log)
|
||||
{
|
||||
ulonglong UNINIT_VAR(affected_rows); /* Ok to be undef if 'disable_info' is set */
|
||||
|
||||
if (res)
|
||||
{
|
||||
MYSQL_FIELD *fields= mysql_fetch_fields(res);
|
||||
@ -6570,10 +6539,10 @@ void run_query_normal(struct st_connection *cn, struct st_command *command,
|
||||
|
||||
/*
|
||||
Need to call mysql_affected_rows() before the "new"
|
||||
query to find the warnings
|
||||
query to find the warnings.
|
||||
*/
|
||||
if (!disable_info)
|
||||
affected_rows= mysql_affected_rows(mysql);
|
||||
append_info(ds, mysql_affected_rows(mysql), mysql_info(mysql));
|
||||
|
||||
/*
|
||||
Add all warnings to the result. We can't do this if we are in
|
||||
@ -6588,9 +6557,6 @@ void run_query_normal(struct st_connection *cn, struct st_command *command,
|
||||
dynstr_append_mem(ds, ds_warnings->str, ds_warnings->length);
|
||||
}
|
||||
}
|
||||
|
||||
if (!disable_info)
|
||||
append_info(ds, affected_rows, mysql_info(mysql));
|
||||
}
|
||||
|
||||
if (res)
|
||||
@ -6831,10 +6797,8 @@ void run_query_stmt(MYSQL *mysql, struct st_command *command,
|
||||
MYSQL_STMT *stmt;
|
||||
DYNAMIC_STRING ds_prepare_warnings;
|
||||
DYNAMIC_STRING ds_execute_warnings;
|
||||
ulonglong affected_rows;
|
||||
DBUG_ENTER("run_query_stmt");
|
||||
DBUG_PRINT("query", ("'%-.60s'", query));
|
||||
LINT_INIT(affected_rows);
|
||||
|
||||
/*
|
||||
Init a new stmt if it's not already one created for this connection
|
||||
@ -6966,11 +6930,12 @@ void run_query_stmt(MYSQL *mysql, struct st_command *command,
|
||||
}
|
||||
|
||||
/*
|
||||
Need to grab affected rows information before getting
|
||||
warnings here
|
||||
Fetch info before fetching warnings, since it will be reset
|
||||
otherwise.
|
||||
*/
|
||||
|
||||
if (!disable_info)
|
||||
affected_rows= mysql_affected_rows(mysql);
|
||||
append_info(ds, mysql_stmt_affected_rows(stmt), mysql_info(mysql));
|
||||
|
||||
if (!disable_warnings)
|
||||
{
|
||||
@ -6983,21 +6948,17 @@ void run_query_stmt(MYSQL *mysql, struct st_command *command,
|
||||
ds_warnings->length)
|
||||
{
|
||||
dynstr_append_mem(ds, "Warnings:\n", 10);
|
||||
if (ds_warnings->length)
|
||||
dynstr_append_mem(ds, ds_warnings->str,
|
||||
ds_warnings->length);
|
||||
if (ds_prepare_warnings.length)
|
||||
dynstr_append_mem(ds, ds_prepare_warnings.str,
|
||||
ds_prepare_warnings.length);
|
||||
if (ds_execute_warnings.length)
|
||||
dynstr_append_mem(ds, ds_execute_warnings.str,
|
||||
ds_execute_warnings.length);
|
||||
if (ds_warnings->length)
|
||||
dynstr_append_mem(ds, ds_warnings->str,
|
||||
ds_warnings->length);
|
||||
if (ds_prepare_warnings.length)
|
||||
dynstr_append_mem(ds, ds_prepare_warnings.str,
|
||||
ds_prepare_warnings.length);
|
||||
if (ds_execute_warnings.length)
|
||||
dynstr_append_mem(ds, ds_execute_warnings.str,
|
||||
ds_execute_warnings.length);
|
||||
}
|
||||
}
|
||||
|
||||
if (!disable_info)
|
||||
append_info(ds, affected_rows, mysql_info(mysql));
|
||||
|
||||
}
|
||||
|
||||
end:
|
||||
@ -7046,6 +7007,10 @@ int util_query(MYSQL* org_mysql, const char* query){
|
||||
if (!(mysql= mysql_init(mysql)))
|
||||
die("Failed in mysql_init()");
|
||||
|
||||
if (opt_connect_timeout)
|
||||
mysql_options(mysql, MYSQL_OPT_CONNECT_TIMEOUT,
|
||||
(void *) &opt_connect_timeout);
|
||||
|
||||
/* enable local infile, in non-binary builds often disabled by default */
|
||||
mysql_options(mysql, MYSQL_OPT_LOCAL_INFILE, 0);
|
||||
safe_connect(mysql, "util", org_mysql->host, org_mysql->user,
|
||||
@ -7094,7 +7059,7 @@ void run_query(struct st_connection *cn, struct st_command *command, int flags)
|
||||
/*
|
||||
Evaluate query if this is an eval command
|
||||
*/
|
||||
if (command->type == Q_EVAL)
|
||||
if (command->type == Q_EVAL || command->type == Q_SEND_EVAL)
|
||||
{
|
||||
init_dynamic_string(&eval_query, "", command->query_len+256, 1024);
|
||||
do_eval(&eval_query, command->query, command->end, FALSE);
|
||||
@ -7641,8 +7606,8 @@ int main(int argc, char **argv)
|
||||
|
||||
my_init_dynamic_array(&q_lines, sizeof(struct st_command*), 1024, 1024);
|
||||
|
||||
if (hash_init(&var_hash, charset_info,
|
||||
1024, 0, 0, get_var_key, var_free, MYF(0)))
|
||||
if (my_hash_init(&var_hash, charset_info,
|
||||
1024, 0, 0, get_var_key, var_free, MYF(0)))
|
||||
die("Variable hash initialization failed");
|
||||
|
||||
var_set_string("$MYSQL_SERVER_VERSION", MYSQL_SERVER_VERSION);
|
||||
@ -7705,6 +7670,9 @@ int main(int argc, char **argv)
|
||||
st_connection *con= connections;
|
||||
if (!( mysql_init(&con->mysql)))
|
||||
die("Failed in mysql_init()");
|
||||
if (opt_connect_timeout)
|
||||
mysql_options(&con->mysql, MYSQL_OPT_CONNECT_TIMEOUT,
|
||||
(void *) &opt_connect_timeout);
|
||||
if (opt_compress)
|
||||
mysql_options(&con->mysql,MYSQL_OPT_COMPRESS,NullS);
|
||||
mysql_options(&con->mysql, MYSQL_OPT_LOCAL_INFILE, 0);
|
||||
@ -7809,9 +7777,6 @@ int main(int argc, char **argv)
|
||||
case Q_DISCONNECT:
|
||||
case Q_DIRTY_CLOSE:
|
||||
do_close_connection(command); break;
|
||||
case Q_RPL_PROBE: do_rpl_probe(command); break;
|
||||
case Q_ENABLE_RPL_PARSE: do_enable_rpl_parse(command); break;
|
||||
case Q_DISABLE_RPL_PARSE: do_disable_rpl_parse(command); break;
|
||||
case Q_ENABLE_QUERY_LOG: disable_query_log=0; break;
|
||||
case Q_DISABLE_QUERY_LOG: disable_query_log=1; break;
|
||||
case Q_ENABLE_ABORT_ON_ERROR: abort_on_error=1; break;
|
||||
@ -7918,6 +7883,7 @@ int main(int argc, char **argv)
|
||||
break;
|
||||
}
|
||||
case Q_SEND:
|
||||
case Q_SEND_EVAL:
|
||||
if (!*command->first_argument)
|
||||
{
|
||||
/*
|
||||
|
37
configure.in
37
configure.in
@ -10,7 +10,7 @@ AC_CANONICAL_SYSTEM
|
||||
#
|
||||
# When changing major version number please also check switch statement
|
||||
# in client/mysqlbinlog.cc:check_master_version().
|
||||
AM_INIT_AUTOMAKE(mysql, 5.5.0-beta)
|
||||
AM_INIT_AUTOMAKE(mysql, 5.6.0-beta)
|
||||
AM_CONFIG_HEADER([include/config.h:config.h.in])
|
||||
|
||||
PROTOCOL_VERSION=10
|
||||
@ -617,24 +617,6 @@ then
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_MSG_CHECKING(whether features provided by the user community should be included.)
|
||||
AC_ARG_ENABLE(community-features,
|
||||
AC_HELP_STRING(
|
||||
[--disable-community-features],
|
||||
[Disable additional features provided by the user community.]),
|
||||
[ ENABLE_COMMUNITY_FEATURES=$enableval ],
|
||||
[ ENABLE_COMMUNITY_FEATURES=yes ]
|
||||
)
|
||||
|
||||
if test "$ENABLE_COMMUNITY_FEATURES" = "yes"
|
||||
then
|
||||
AC_DEFINE([COMMUNITY_SERVER], [1],
|
||||
[Whether features provided by the user community should be included])
|
||||
AC_MSG_RESULT([yes])
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
|
||||
AC_ARG_WITH(server-suffix,
|
||||
[ --with-server-suffix Append value to the version string.],
|
||||
[ MYSQL_SERVER_SUFFIX=`echo "$withval" | sed -e 's/^\(...................................\)..*$/\1/'` ],
|
||||
@ -700,21 +682,14 @@ fi
|
||||
# Add query profiler
|
||||
AC_MSG_CHECKING(if SHOW PROFILE should be enabled.)
|
||||
AC_ARG_ENABLE(profiling,
|
||||
AS_HELP_STRING([--enable-profiling], [Build a version with query profiling code (req. community-features)]),
|
||||
AS_HELP_STRING([--enable-profiling], [Enable profiling of query lifetime.]),
|
||||
[ ENABLED_PROFILING=$enableval ],
|
||||
[ ENABLED_PROFILING=$ENABLE_COMMUNITY_FEATURES ])
|
||||
[ ENABLED_PROFILING=no ])
|
||||
|
||||
AC_DEFINE([ENABLED_PROFILING], [1], [If SHOW PROFILE should be enabled])
|
||||
if test "$ENABLED_PROFILING" = "yes"
|
||||
then
|
||||
if test "$ENABLE_COMMUNITY_FEATURES" = "yes";
|
||||
then
|
||||
AC_DEFINE([ENABLED_PROFILING], [1],
|
||||
[If SHOW PROFILE should be enabled])
|
||||
AC_MSG_RESULT([yes])
|
||||
else
|
||||
ENABLED_PROFILING="no"
|
||||
AC_MSG_RESULT([no, overridden by community-features disabled])
|
||||
fi
|
||||
AC_MSG_RESULT([yes])
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
@ -2946,7 +2921,7 @@ AC_CONFIG_FILES(Makefile extra/Makefile mysys/Makefile dnl
|
||||
man/Makefile BUILD/Makefile vio/Makefile dnl
|
||||
libmysql/Makefile libmysql_r/Makefile client/Makefile dnl
|
||||
sql/Makefile sql/share/Makefile dnl
|
||||
sql/sql_builtin.cc sql-common/Makefile dnl
|
||||
sql/sql_builtin.cc sql-common/Makefile libservices/Makefile dnl
|
||||
dbug/Makefile scripts/Makefile include/Makefile dnl
|
||||
tests/Makefile Docs/Makefile support-files/Makefile dnl
|
||||
support-files/MacOSX/Makefile support-files/RHEL4-SElinux/Makefile dnl
|
||||
|
@ -1,3 +0,0 @@
|
||||
.deps
|
||||
Makefile
|
||||
Makefile.in
|
@ -23,19 +23,20 @@ libdbug_a_SOURCES = dbug.c sanity.c
|
||||
EXTRA_DIST = CMakeLists.txt example1.c example2.c example3.c \
|
||||
user.r monty.doc dbug_add_tags.pl \
|
||||
my_main.c main.c factorial.c dbug_analyze.c \
|
||||
CMakeLists.txt
|
||||
CMakeLists.txt tests.c tests-t.pl
|
||||
NROFF_INC = example1.r example2.r example3.r main.r \
|
||||
factorial.r output1.r output2.r output3.r \
|
||||
output4.r output5.r
|
||||
CLEANFILES = $(NROFF_INC) user.t user.ps
|
||||
CLEANFILES = $(NROFF_INC) user.t user.ps tests-t
|
||||
|
||||
|
||||
# Must be linked with libs that are not compiled yet
|
||||
noinst_PROGRAMS = factorial dbug_analyze
|
||||
noinst_PROGRAMS = factorial dbug_analyze tests
|
||||
factorial_SOURCES = my_main.c factorial.c
|
||||
tests_SOURCES = tests.c
|
||||
dbug_analyze_SOURCES = dbug_analyze.c
|
||||
|
||||
all: user.t user.ps
|
||||
all: user.t user.ps tests-t
|
||||
|
||||
user.t: user.r $(NROFF_INC)
|
||||
-nroff -mm user.r > $@
|
||||
@ -61,5 +62,7 @@ output5.r: factorial
|
||||
@RM@ -f $@
|
||||
@SED@ -e 's!\\!\\\\!g' $< > $@
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
||||
# a hack to have executable in builddir, not in srcdir
|
||||
tests-t: tests-t.pl
|
||||
cp -f $(srcdir)/tests-t.pl ./tests-t
|
||||
|
||||
|
886
dbug/dbug.c
886
dbug/dbug.c
File diff suppressed because it is too large
Load Diff
@ -7,7 +7,7 @@ $ctags="exctags -x -f - --c-types=f -u";
|
||||
sub get_tag {
|
||||
local $.; local $_=<TAGS>;
|
||||
($symbol, $line)= /^(.*\S)\s+function\s+(\d+)/;
|
||||
$symbol=$1 if /\s(\S+)\s*\(/;
|
||||
$symbol=$1 if /[\s*]([^\s*]+)\s*\(/;
|
||||
$line=1e50 unless $line;
|
||||
}
|
||||
|
||||
@ -51,7 +51,7 @@ while($src=shift)
|
||||
$skip=!$semicolon;
|
||||
$semicolon= /;\s*$/;
|
||||
print && next if $skip ||
|
||||
(/^\s+\w+((::\w+)?|<\w+>)\s+\**\w+/ && !/^\s*return/);
|
||||
(/^\s+\w+((::\w+)?|<\w+>)\s+\**\w+/ && !/^\s*return\b/);
|
||||
last if /DBUG_ENTER/;
|
||||
print "$tab DBUG_ENTER(\"$symbol\");\n";
|
||||
print "\n" unless $_ eq "\n";
|
||||
|
@ -1,15 +0,0 @@
|
||||
|
||||
# Warning - first line left blank for sh/csh/ksh compatibility. Do not
|
||||
# remove it. fnf@Unisoft
|
||||
|
||||
# doinstall.sh --- figure out environment and do recursive make with
|
||||
# appropriate pathnames. Works under SV or BSD.
|
||||
|
||||
if [ -r /usr/include/search.h ]
|
||||
then
|
||||
# System V
|
||||
$* LLIB=/usr/lib
|
||||
else
|
||||
# 4.2 BSD
|
||||
$* LLIB=/usr/lib/lint
|
||||
fi
|
@ -1,64 +0,0 @@
|
||||
|
||||
# WARNING -- first line intentionally left blank for sh/csh/ksh
|
||||
# compatibility. Do not remove it! FNF, UniSoft Systems.
|
||||
#
|
||||
# Usage is:
|
||||
# install <from> <to>
|
||||
#
|
||||
# The file <to> is replaced with the file <from>, after first
|
||||
# moving <to> to a backup file. The backup file name is created
|
||||
# by prepending the filename (after removing any leading pathname
|
||||
# components) with "OLD".
|
||||
#
|
||||
# This script is currently not real robust in the face of signals
|
||||
# or permission problems. It also does not do (by intention) all
|
||||
# the things that the System V or BSD install scripts try to do
|
||||
#
|
||||
|
||||
if [ $# -ne 2 ]
|
||||
then
|
||||
echo "usage: $0 <from> <to>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Now extract the dirname and basename components. Unfortunately, BSD does
|
||||
# not have dirname, so we do it the hard way.
|
||||
|
||||
fd=`expr $1'/' : '\(/\)[^/]*/$' \| $1'/' : '\(.*[^/]\)//*[^/][^/]*//*$' \| .`
|
||||
ff=`basename $1`
|
||||
td=`expr $2'/' : '\(/\)[^/]*/$' \| $2'/' : '\(.*[^/]\)//*[^/][^/]*//*$' \| .`
|
||||
tf=`basename $2`
|
||||
|
||||
# Now test to make sure that they are not the same files.
|
||||
|
||||
if [ $fd/$ff = $td/$tf ]
|
||||
then
|
||||
echo "install: input and output are same files"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
# Save a copy of the "to" file as a backup.
|
||||
|
||||
if test -f $td/$tf
|
||||
then
|
||||
if test -f $td/OLD$tf
|
||||
then
|
||||
rm -f $td/OLD$tf
|
||||
fi
|
||||
mv $td/$tf $td/OLD$tf
|
||||
if [ $? != 0 ]
|
||||
then
|
||||
exit 3
|
||||
fi
|
||||
fi
|
||||
|
||||
# Now do the copy and return appropriate status
|
||||
|
||||
cp $fd/$ff $td/$tf
|
||||
if [ $? != 0 ]
|
||||
then
|
||||
exit 4
|
||||
else
|
||||
exit 0
|
||||
fi
|
||||
|
@ -1,30 +0,0 @@
|
||||
|
||||
# Warning - first line left blank for sh/csh/ksh compatibility. Do not
|
||||
# remove it. fnf@Unisoft
|
||||
|
||||
# mklintlib --- make a lint library, under either System V or 4.2 BSD
|
||||
#
|
||||
# usage: mklintlib <infile> <outfile>
|
||||
#
|
||||
|
||||
if test $# -ne 2
|
||||
then
|
||||
echo "usage: mklintlib <infile> <outfile>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if grep SIGTSTP /usr/include/signal.h >/dev/null
|
||||
then # BSD
|
||||
if test -r /usr/include/whoami.h # 4.1
|
||||
then
|
||||
/lib/cpp -C -Dlint $1 >hlint
|
||||
(/usr/lib/lint/lint1 <hlint >$2) 2>&1 | grep -v warning
|
||||
else # 4.2
|
||||
lint -Cxxxx $1
|
||||
mv llib-lxxxx.ln $2
|
||||
fi
|
||||
else # USG
|
||||
cc -E -C -Dlint $1 | /usr/lib/lint1 -vx -Hhlint >$2
|
||||
rm -f hlint
|
||||
fi
|
||||
exit 0 # don't kill make
|
@ -1,4 +0,0 @@
|
||||
CL -I\my\include -AL -Gsm2 -FPi -DDBUG_OFF *.c
|
||||
rm \my\lib\dbug.lib
|
||||
lib.exe \my\lib\dbug dbug.obj sanity.obj;
|
||||
link /NOD /STACK:8000 main factoria,factoria,,DBUG+STRINGS+LLIBCEP+DOSCALLS;
|
26
dbug/remove_function_from_trace.pl
Executable file
26
dbug/remove_function_from_trace.pl
Executable file
@ -0,0 +1,26 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
|
||||
die <<EEE unless @ARGV;
|
||||
Usage: $0 func1 [func2 [ ...] ]
|
||||
|
||||
This filter (stdin->stdout) removes lines from dbug trace that were generated
|
||||
by specified functions and all functions down the call stack. Produces the
|
||||
same effect as if the original source had DBUG_PUSH(""); right after
|
||||
DBUG_ENTER() and DBUG_POP(); right before DBUG_RETURN in every such a function.
|
||||
EEE
|
||||
|
||||
$re=join('|', @ARGV);
|
||||
$skip='';
|
||||
|
||||
while(<STDIN>) {
|
||||
print unless $skip;
|
||||
next unless /^(?:.*: )*((?:\| )*)([<>])($re)\n/o;
|
||||
if ($2 eq '>') {
|
||||
$skip=$1.$3 unless $skip;
|
||||
next;
|
||||
}
|
||||
next if $skip ne $1.$3;
|
||||
$skip='';
|
||||
print;
|
||||
}
|
496
dbug/tests-t.pl
Executable file
496
dbug/tests-t.pl
Executable file
@ -0,0 +1,496 @@
|
||||
#!/usr/bin/env perl
|
||||
|
||||
#
|
||||
# A driver program to test DBUG features - runs tests (shell commands)
|
||||
# from the end of file to invoke tests.c, which does the real dbug work.
|
||||
#
|
||||
|
||||
use Test::More;
|
||||
|
||||
$exe=$0;
|
||||
|
||||
die unless $exe =~ s/(tests)-t(\.exe)?$/$1$2 /;
|
||||
|
||||
# load tests
|
||||
@tests=();
|
||||
while (<DATA>) {
|
||||
if (/^% \.\/tests /) {
|
||||
push @tests, [ $' ]
|
||||
} elsif (/^#/) {
|
||||
next;
|
||||
} else {
|
||||
push @{$tests[$#tests]}, $_
|
||||
}
|
||||
}
|
||||
|
||||
plan skip_all => "because dbug is disabled" if system $exe;
|
||||
|
||||
plan tests => scalar(@tests);
|
||||
|
||||
for (@tests) {
|
||||
$t=$exe . shift @$_;
|
||||
chomp($t);
|
||||
open F, '-|', $t or die "open($t|): $!";
|
||||
local $";
|
||||
$out=join($", <F>); close(F);
|
||||
# special cases are handled here:
|
||||
$out =~ s/Memory: 0x[0-9A-Fa-f]+/Memory: 0x####/g if $t =~ /dump/;
|
||||
# compare ("\n" at the beginning makes better output in case of errors)
|
||||
is("\n$out","\n@$_", $t);
|
||||
}
|
||||
|
||||
__DATA__
|
||||
% ./tests -#d
|
||||
func2: info: s=ok
|
||||
=> execute
|
||||
=> evaluate: ON
|
||||
=> evaluate_if: OFF
|
||||
main: explain: dbug explained: d
|
||||
func2: info: s=ok
|
||||
% ./tests d,ret3
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
#
|
||||
## Testing negative lists
|
||||
#
|
||||
% ./tests d:-d,ret3
|
||||
func2: info: s=ko
|
||||
=> execute
|
||||
=> evaluate: ON
|
||||
=> evaluate_if: OFF
|
||||
main: explain: dbug explained: d:-d,ret3
|
||||
func2: info: s=ko
|
||||
% ./tests t:-d,ret3
|
||||
>main
|
||||
| >func1
|
||||
| | >func2
|
||||
| | | >func3
|
||||
| | | <func3
|
||||
| | <func2
|
||||
| <func1
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
| >func2
|
||||
| | >func3
|
||||
| | <func3
|
||||
| <func2
|
||||
<main
|
||||
% ./tests t:d,info:-d,ret3
|
||||
>main
|
||||
| >func1
|
||||
| | >func2
|
||||
| | | >func3
|
||||
| | | <func3
|
||||
| | | info: s=ko
|
||||
| | <func2
|
||||
| <func1
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
| >func2
|
||||
| | >func3
|
||||
| | <func3
|
||||
| | info: s=ko
|
||||
| <func2
|
||||
<main
|
||||
% ./tests t:d,info:-d,ret3:-f,func2
|
||||
>main
|
||||
| >func1
|
||||
| | | >func3
|
||||
| | | <func3
|
||||
| <func1
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
| | >func3
|
||||
| | <func3
|
||||
<main
|
||||
% ./tests t:d,info:-d,ret3:-f,func2 d,evaluate
|
||||
=> evaluate: ON
|
||||
=> evaluate_if: OFF
|
||||
% ./tests t:d,info:-d,ret3:-f,func2 d,evaluate_if
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: ON
|
||||
% ./tests t:d:-d,ret3:-f,func2 d,evaluate_if
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: ON
|
||||
% ./tests t:d:-d,ret3:-f,func2
|
||||
>main
|
||||
| >func1
|
||||
| | | >func3
|
||||
| | | <func3
|
||||
| <func1
|
||||
=> execute
|
||||
=> evaluate: ON
|
||||
=> evaluate_if: OFF
|
||||
| explain: dbug explained: d:-d,ret3:f:-f,func2:t
|
||||
| | >func3
|
||||
| | <func3
|
||||
<main
|
||||
#
|
||||
## Adding incremental settings to the brew
|
||||
#
|
||||
% ./tests t:d:-d,ret3:-f,func2 +d,evaluate_if
|
||||
>main
|
||||
| >func1
|
||||
| | | >func3
|
||||
| | | <func3
|
||||
| <func1
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: ON
|
||||
| | >func3
|
||||
| | <func3
|
||||
<main
|
||||
#
|
||||
## DBUG_DUMP
|
||||
#
|
||||
% ./tests t:d:-d,ret3:f:-f,func2 +d,dump
|
||||
>main
|
||||
| >func1
|
||||
| | | >func3
|
||||
| | | <func3
|
||||
| <func1
|
||||
| dump: Memory: 0x#### Bytes: (27)
|
||||
64 2C 64 75 6D 70 3A 2D 64 2C 72 65 74 33 3A 66 3A 2D 66 2C 66 75 6E 63 32 3A
|
||||
74
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
| | >func3
|
||||
| | <func3
|
||||
<main
|
||||
% ./tests t:d:-d,ret3:f:-f,func2 +d,dump
|
||||
>main
|
||||
| >func1
|
||||
| | | >func3
|
||||
| | | <func3
|
||||
| <func1
|
||||
| dump: Memory: 0x#### Bytes: (27)
|
||||
64 2C 64 75 6D 70 3A 2D 64 2C 72 65 74 33 3A 66 3A 2D 66 2C 66 75 6E 63 32 3A
|
||||
74
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
| | >func3
|
||||
| | <func3
|
||||
<main
|
||||
% ./tests t:d:-d,ret3:f:-f,func2:+d,dump
|
||||
>main
|
||||
| >func1
|
||||
| | | >func3
|
||||
| | | <func3
|
||||
| <func1
|
||||
| dump: Memory: 0x#### Bytes: (27)
|
||||
64 2C 64 75 6D 70 3A 2D 64 2C 72 65 74 33 3A 66 3A 2D 66 2C 66 75 6E 63 32 3A
|
||||
74
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
| | >func3
|
||||
| | <func3
|
||||
<main
|
||||
% ./tests t:d:-d,ret3:f:-f,func2 +d,dump,explain
|
||||
>main
|
||||
| >func1
|
||||
| | | >func3
|
||||
| | | <func3
|
||||
| <func1
|
||||
| dump: Memory: 0x#### Bytes: (35)
|
||||
64 2C 64 75 6D 70 2C 65 78 70 6C 61 69 6E 3A 2D 64 2C 72 65 74 33 3A 66 3A 2D
|
||||
66 2C 66 75 6E 63 32 3A 74
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
| explain: dbug explained: d,dump,explain:-d,ret3:f:-f,func2:t
|
||||
| | >func3
|
||||
| | <func3
|
||||
<main
|
||||
% ./tests t:d:-d,ret3:f:-f,func2 +d,dump,explain:P
|
||||
dbug: >main
|
||||
dbug-tests: | >func1
|
||||
dbug-tests: | | | >func3
|
||||
dbug-tests: | | | <func3
|
||||
dbug-tests: | <func1
|
||||
dbug-tests: | dump: Memory: 0x#### Bytes: (37)
|
||||
64 2C 64 75 6D 70 2C 65 78 70 6C 61 69 6E 3A 2D 64 2C 72 65 74 33 3A 66 3A 2D
|
||||
66 2C 66 75 6E 63 32 3A 50 3A 74
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
dbug-tests: | explain: dbug explained: d,dump,explain:-d,ret3:f:-f,func2:P:t
|
||||
dbug-tests: | | >func3
|
||||
dbug-tests: | | <func3
|
||||
dbug-tests: <main
|
||||
% ./tests t:d:-d,ret3:f:-f,func2 +d,dump,explain:P:F
|
||||
dbug: tests.c: >main
|
||||
dbug-tests: tests.c: | >func1
|
||||
dbug-tests: tests.c: | | | >func3
|
||||
dbug-tests: tests.c: | | | <func3
|
||||
dbug-tests: tests.c: | <func1
|
||||
dbug-tests: tests.c: | dump: Memory: 0x#### Bytes: (39)
|
||||
64 2C 64 75 6D 70 2C 65 78 70 6C 61 69 6E 3A 2D 64 2C 72 65 74 33 3A 66 3A 2D
|
||||
66 2C 66 75 6E 63 32 3A 46 3A 50 3A 74
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
dbug-tests: tests.c: | explain: dbug explained: d,dump,explain:-d,ret3:f:-f,func2:F:P:t
|
||||
dbug-tests: tests.c: | | >func3
|
||||
dbug-tests: tests.c: | | <func3
|
||||
dbug-tests: tests.c: <main
|
||||
#
|
||||
## DBUG_EXPLAIN, DBUG_PUSH, DBUG_POP, DBUG_SET
|
||||
#
|
||||
% ./tests t:d:-d,ret3:f:-f,func2
|
||||
>main
|
||||
| >func1
|
||||
| | | >func3
|
||||
| | | <func3
|
||||
| <func1
|
||||
=> execute
|
||||
=> evaluate: ON
|
||||
=> evaluate_if: OFF
|
||||
| explain: dbug explained: d:-d,ret3:f:-f,func2:t
|
||||
| | >func3
|
||||
| | <func3
|
||||
<main
|
||||
% ./tests t:d:-d,ret3
|
||||
>main
|
||||
| >func1
|
||||
| | >func2
|
||||
| | | >func3
|
||||
| | | <func3
|
||||
| | | info: s=ko
|
||||
| | <func2
|
||||
| <func1
|
||||
=> execute
|
||||
=> evaluate: ON
|
||||
=> evaluate_if: OFF
|
||||
| explain: dbug explained: d:-d,ret3:t
|
||||
| >func2
|
||||
| | >func3
|
||||
| | <func3
|
||||
| | info: s=ko
|
||||
| <func2
|
||||
<main
|
||||
% ./tests d,info:-d,ret3:d,push
|
||||
func2: info: s=ko
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
| >func2
|
||||
| | >func3
|
||||
| | <func3
|
||||
| | info: s=ko
|
||||
| <func2
|
||||
<main
|
||||
% ./tests d,info:-d,ret3:d,push,explain
|
||||
func2: info: s=ko
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
| explain: dbug explained: d,info,push,explain:-d,ret3:t
|
||||
| >func2
|
||||
| | >func3
|
||||
| | <func3
|
||||
| | info: s=ko
|
||||
| <func2
|
||||
<main
|
||||
% ./tests d,info:-d,ret3:d,explain
|
||||
func2: info: s=ko
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
main: explain: dbug explained: d,info,explain:-d,ret3
|
||||
func2: info: s=ko
|
||||
% ./tests d,info:-d,ret3:d,explain,pop
|
||||
func2: info: s=ko
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
% ./tests d,info:-d,ret3:d,explain t:d,pop
|
||||
>main
|
||||
| >func1
|
||||
| | >func2
|
||||
| | | >func3
|
||||
| | | <func3
|
||||
| | <func2
|
||||
| <func1
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
main: explain: dbug explained: d,info,explain:-d,ret3
|
||||
func2: info: s=ko
|
||||
% ./tests d,info:-d,ret3:d,explain,pop +t
|
||||
>main
|
||||
| >func1
|
||||
| | >func2
|
||||
| | | >func3
|
||||
| | | <func3
|
||||
| | | info: s=ko
|
||||
| | <func2
|
||||
| <func1
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
main: explain: dbug explained: d,info,explain,pop:-d,ret3
|
||||
func2: info: s=ko
|
||||
% ./tests d,info:-d,ret3:d,explain,set
|
||||
func2: info: s=ko
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
tests.c: main: explain: dbug explained: d,info,explain,set:-d,ret3:F
|
||||
tests.c: func2: info: s=ko
|
||||
% ./tests d,info:-d,ret3:d,explain,set:t
|
||||
>main
|
||||
| >func1
|
||||
| | >func2
|
||||
| | | >func3
|
||||
| | | <func3
|
||||
| | | info: s=ko
|
||||
| | <func2
|
||||
| <func1
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
tests.c: | explain: dbug explained: d,info,explain,set:-d,ret3:F:t
|
||||
tests.c: | >func2
|
||||
tests.c: | | >func3
|
||||
tests.c: | | <func3
|
||||
tests.c: | | info: s=ko
|
||||
tests.c: | <func2
|
||||
tests.c: <main
|
||||
% ./tests t d,info:-d,ret3:d,explain,set:t
|
||||
>main
|
||||
| >func1
|
||||
| | >func2
|
||||
| | | >func3
|
||||
| | | <func3
|
||||
| | | info: s=ko
|
||||
| | <func2
|
||||
| <func1
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
tests.c: | explain: dbug explained: d,info,explain,set:-d,ret3:F:t
|
||||
tests.c: | >func2
|
||||
tests.c: | | >func3
|
||||
tests.c: | | <func3
|
||||
tests.c: | | info: s=ko
|
||||
tests.c: | <func2
|
||||
tests.c: <main
|
||||
% ./tests t d,info:-d,ret3:d,explain,set,pop
|
||||
func2: info: s=ko
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
| >func2
|
||||
| | >func3
|
||||
| | <func3
|
||||
| <func2
|
||||
<main
|
||||
% ./tests t:f,func2
|
||||
| | >func2
|
||||
| | <func2
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
| >func2
|
||||
| <func2
|
||||
#
|
||||
## Testing SUBDIR rules
|
||||
#
|
||||
% ./tests t:-f,func2/:d
|
||||
>main
|
||||
| >func1
|
||||
| <func1
|
||||
=> execute
|
||||
=> evaluate: ON
|
||||
=> evaluate_if: OFF
|
||||
| explain: dbug explained: d:f:-f,func2/:t
|
||||
<main
|
||||
% ./tests t:f,func1/:d
|
||||
| >func1
|
||||
| | >func2
|
||||
| | | >func3
|
||||
| | | <func3
|
||||
| | | info: s=ok
|
||||
| | <func2
|
||||
| <func1
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
% ./tests t:f,main/:d,pop
|
||||
>main
|
||||
| >func1
|
||||
| | >func2
|
||||
| | | >func3
|
||||
| | | <func3
|
||||
| | <func2
|
||||
| <func1
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
% ./tests f,main/:d,push
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
| >func2
|
||||
| | >func3
|
||||
| | <func3
|
||||
| <func2
|
||||
<main
|
||||
#
|
||||
## Testing FixTraceFlags() - when we need to traverse the call stack
|
||||
# (these tests fail with FixTraceFlags() disabled)
|
||||
#
|
||||
# delete the INCLUDE rule up the stack
|
||||
% ./tests t:f,func1/ --push1=t:f,func3/
|
||||
| >func1
|
||||
| | >func2
|
||||
| | | >func3
|
||||
| | | <func3
|
||||
| | <func2
|
||||
=> push1
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
| | >func3
|
||||
| | <func3
|
||||
# delete the EXCLUDE rule up the stack
|
||||
% ./tests t:-f,func1/ --push1=t
|
||||
>main
|
||||
=> push1
|
||||
| <func1
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
| >func2
|
||||
| | >func3
|
||||
| | <func3
|
||||
| <func2
|
||||
<main
|
||||
# add the INCLUDE rule up the stack
|
||||
% ./tests t:f,func3 --push1=t:f,main/
|
||||
| | | >func3
|
||||
| | | <func3
|
||||
=> push1
|
||||
| <func1
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
| >func2
|
||||
| | >func3
|
||||
| | <func3
|
||||
| <func2
|
||||
<main
|
||||
# add the EXCLUDE rule up the stack
|
||||
% ./tests t --push1=t:-f,main/
|
||||
>main
|
||||
| >func1
|
||||
| | >func2
|
||||
| | | >func3
|
||||
| | | <func3
|
||||
| | <func2
|
||||
=> push1
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
# change the defaults
|
||||
% ./tests t:f,func3 --push1=t
|
||||
| | | >func3
|
||||
| | | <func3
|
||||
=> push1
|
||||
| <func1
|
||||
=> evaluate: OFF
|
||||
=> evaluate_if: OFF
|
||||
| >func2
|
||||
| | >func3
|
||||
| | <func3
|
||||
| <func2
|
||||
<main
|
||||
# repeated keyword
|
||||
% ./tests d:-d,info,info
|
||||
=> execute
|
||||
=> evaluate: ON
|
||||
=> evaluate_if: OFF
|
||||
main: explain: dbug explained: d:-d,info
|
||||
% ./tests d:-d,info/,info
|
||||
=> execute
|
||||
=> evaluate: ON
|
||||
=> evaluate_if: OFF
|
||||
main: explain: dbug explained: d:-d,info/
|
87
dbug/tests.c
Normal file
87
dbug/tests.c
Normal file
@ -0,0 +1,87 @@
|
||||
/*
|
||||
A program to test DBUG features. Used by tests-t.pl
|
||||
*/
|
||||
|
||||
char *push1=0;
|
||||
|
||||
#include <my_global.h> /* This includes dbug.h */
|
||||
#include <my_pthread.h>
|
||||
#include <string.h>
|
||||
|
||||
const char *func3()
|
||||
{
|
||||
DBUG_ENTER("func3");
|
||||
DBUG_RETURN(DBUG_EVALUATE("ret3", "ok", "ko"));
|
||||
}
|
||||
|
||||
void func2()
|
||||
{
|
||||
const char *s;
|
||||
DBUG_ENTER("func2");
|
||||
s=func3();
|
||||
DBUG_PRINT("info", ("s=%s", s));
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
int func1()
|
||||
{
|
||||
DBUG_ENTER("func1");
|
||||
func2();
|
||||
if (push1)
|
||||
{
|
||||
DBUG_PUSH(push1);
|
||||
fprintf(DBUG_FILE, "=> push1\n");
|
||||
}
|
||||
DBUG_RETURN(10);
|
||||
}
|
||||
|
||||
int main (int argc, char *argv[])
|
||||
{
|
||||
int i;
|
||||
#ifdef DBUG_OFF
|
||||
return 1;
|
||||
#endif
|
||||
if (argc == 1)
|
||||
return 0;
|
||||
|
||||
#if defined(HAVE_PTHREAD_INIT) && defined(THREAD)
|
||||
pthread_init(); /* Must be called before DBUG_ENTER */
|
||||
#endif
|
||||
#ifdef THREAD
|
||||
my_thread_global_init();
|
||||
#endif
|
||||
dup2(1, 2);
|
||||
for (i = 1; i < argc; i++)
|
||||
{
|
||||
if (strncmp(argv[i], "--push1=", 8) == 0)
|
||||
push1=argv[i]+8;
|
||||
else
|
||||
DBUG_PUSH (argv[i]);
|
||||
}
|
||||
{
|
||||
DBUG_ENTER ("main");
|
||||
DBUG_PROCESS ("dbug-tests");
|
||||
func1();
|
||||
DBUG_EXECUTE_IF("dump",
|
||||
{
|
||||
char s[1000];
|
||||
DBUG_EXPLAIN(s, sizeof(s)-1);
|
||||
DBUG_DUMP("dump", (uchar*)s, strlen(s));
|
||||
});
|
||||
DBUG_EXECUTE_IF("push", DBUG_PUSH("+t"); );
|
||||
DBUG_EXECUTE("execute", fprintf(DBUG_FILE, "=> execute\n"); );
|
||||
DBUG_EXECUTE_IF("set", DBUG_SET("+F"); );
|
||||
fprintf(DBUG_FILE, "=> evaluate: %s\n",
|
||||
DBUG_EVALUATE("evaluate", "ON", "OFF"));
|
||||
fprintf(DBUG_FILE, "=> evaluate_if: %s\n",
|
||||
DBUG_EVALUATE_IF("evaluate_if", "ON", "OFF"));
|
||||
DBUG_EXECUTE_IF("pop", DBUG_POP(); );
|
||||
{
|
||||
char s[1000] __attribute__((unused));
|
||||
DBUG_EXPLAIN(s, sizeof(s)-1);
|
||||
DBUG_PRINT("explain", ("dbug explained: %s", s));
|
||||
}
|
||||
func2();
|
||||
DBUG_RETURN (0);
|
||||
}
|
||||
}
|
54
dbug/user.r
54
dbug/user.r
@ -512,7 +512,7 @@ possible since all code preceding the first call to
|
||||
.B DBUG_PUSH
|
||||
is
|
||||
essentially invisible to
|
||||
.B dbug
|
||||
.I dbug
|
||||
(this can be worked around by
|
||||
inserting a temporary
|
||||
.B DBUG_PUSH(argv[1])
|
||||
@ -708,7 +708,7 @@ EX:\ \fCDBUG_PROCESS\ (argv[0]);\fR
|
||||
.SP 1
|
||||
.LI DBUG_PUSH\
|
||||
Sets a new debugger state by pushing the current
|
||||
.B dbug
|
||||
.I dbug
|
||||
state onto an internal stack and setting up the new state using the
|
||||
debug control string passed as the macro argument. The most common
|
||||
usage is to set the state specified by a debug control string
|
||||
@ -769,14 +769,14 @@ the 'd' flag. Used to conditionally execute "dangerous" actions, e.g
|
||||
to crash the program testing how recovery works, or to introduce an
|
||||
artificial delay checking for race conditions.
|
||||
.SP 1
|
||||
EX:\ \fCDBUG_EXECUTE_IF\ ("crashme",\ abort\ ());\fR
|
||||
EX:\ \fCDBUG_EXECUTE_IF\ ("crashme",\ DBUG_ABORT()\ ());\fR
|
||||
.SP 1
|
||||
.LI DBUG_EVALUATE\
|
||||
The DBUG_EVALUATE macro is similar to DBUG_EXECUTE, but it can be used in
|
||||
the expression context. The first argument is the debug keyword that is used to
|
||||
choose whether the second (keyword is enabled) or the third (keyword is not
|
||||
enabled) argument is evaluated. When
|
||||
.B dbug
|
||||
.I dbug
|
||||
is compiled off, the third argument is evaluated.
|
||||
.SP 1
|
||||
EX:\fC
|
||||
@ -796,7 +796,7 @@ EX:\fC
|
||||
.br
|
||||
if (prepare_transaction () ||
|
||||
.br
|
||||
DBUG_EVALUATE ("crashme", (abort (), 0), 0) ||
|
||||
DBUG_EVALUATE ("crashme", (DBUG_ABORT(), 0), 0) ||
|
||||
.br
|
||||
commit_transaction () )\fR
|
||||
.SP 1
|
||||
@ -875,6 +875,12 @@ library. So there will be no need to disable asserts separately with NDEBUG.
|
||||
.SP 1
|
||||
EX:\ \fCDBUG_ASSERT(\ a\ >\ 0\ );\fR
|
||||
.SP 1
|
||||
.LI DBUG_ABORT\
|
||||
This macro could be used instead of abort(). It flushes DBUG_FILE stream
|
||||
to ensure that no
|
||||
.I dbug
|
||||
output is lost and then calls abort().
|
||||
.SP 1
|
||||
.LI DBUG_EXPLAIN\
|
||||
Generates control string corresponding to the current debug state.
|
||||
The macro takes two arguments - a buffer to store the result string
|
||||
@ -910,17 +916,17 @@ via the
|
||||
.B DBUG_PUSH
|
||||
or
|
||||
.B DBUG_SET
|
||||
macros. Control string consists of colon separate flags. Colons
|
||||
macros. Control string consists of colon separated flags. Colons
|
||||
that are part of ':\\', ':/', or '::' are not considered flag
|
||||
separators. A flag may take an argument or a list of arguments.
|
||||
If a control string starts from a '+' sign it works
|
||||
.I incrementally,
|
||||
that is, it can modify existing state without overriding it. In such a
|
||||
string every flag may be preceded by a '+' or '-' to enable or disable
|
||||
a corresponding option in the debugger state. This section summarizes
|
||||
the currently available debugger options and the flag characters which
|
||||
enable or disable them. Argument lists enclosed in '[' and ']' are
|
||||
optional.
|
||||
that is, it can modify existing state without overriding it. Every
|
||||
flag may be preceded by a '+' or '-' to enable or disable a
|
||||
corresponding option in the debugger state or to add or remove
|
||||
arguments to the list. This section summarizes the currently available
|
||||
debugger options and the flag characters which enable or disable them.
|
||||
Argument lists enclosed in '[' and ']' are optional.
|
||||
.SP 2
|
||||
.BL 22
|
||||
.LI a[,file]
|
||||
@ -936,6 +942,9 @@ a complete log file in case of crashes. This mode is implicit in
|
||||
multi-threaded environment.
|
||||
.LI d[,keywords]
|
||||
Enable output from macros with specified keywords.
|
||||
Every keyword can be a
|
||||
.I glob(7)
|
||||
pattern.
|
||||
An empty list of keywords implies that all keywords are selected.
|
||||
.LI D[,time]
|
||||
Delay for specified time after each output line, to let output drain.
|
||||
@ -943,7 +952,19 @@ Time is given in tenths of a second (value of 10 is one second).
|
||||
Default is zero.
|
||||
.LI f[,functions]
|
||||
Limit debugger actions to the specified list of functions.
|
||||
Every function can be a
|
||||
.I glob(7)
|
||||
pattern.
|
||||
An empty list of functions implies that all functions are selected.
|
||||
Every function in the list may optionally be followed by a '/' -
|
||||
this will implicitly select all the functions down the call stack.
|
||||
.SP 1
|
||||
EX: \fCf,func1,func2/:-f,func3,func4/\fR
|
||||
.SP 1
|
||||
This would enable debugger in functions 'func1()', 'func2()' and all
|
||||
functions called from it (directly or indirectly). But not in
|
||||
functions 'func3()' or 'func4()' and all functions called from
|
||||
it.
|
||||
.LI F
|
||||
Mark each debugger output line with the name of the source file
|
||||
containing the macro causing the output.
|
||||
@ -952,6 +973,9 @@ Mark each debugger output line with the PID (or thread ID) of the
|
||||
current process.
|
||||
.LI g,[functions]
|
||||
Enable profiling for the specified list of functions.
|
||||
Every function can be a
|
||||
.I glob(7)
|
||||
pattern.
|
||||
An empty list of functions enables profiling for all functions.
|
||||
See
|
||||
.B PROFILING\ WITH\ DBUG
|
||||
@ -970,7 +994,11 @@ Like 'a[,file]' but overwrite old file, do not append.
|
||||
.LI O[,file]
|
||||
Like 'A[,file]' but overwrite old file, do not append.
|
||||
.LI p[,processes]
|
||||
Limit debugger actions to the specified processes. An empty list
|
||||
Limit debugger actions to the specified processes.
|
||||
Every name can be a
|
||||
.I glob(7)
|
||||
pattern.
|
||||
An empty list
|
||||
implies all processes. This is useful for processes which run child
|
||||
processes. Note that each debugger output line can be marked with the
|
||||
name of the current process via the 'P' flag. The process name must
|
||||
|
139
dbug/vargs.h
139
dbug/vargs.h
@ -1,139 +0,0 @@
|
||||
/******************************************************************************
|
||||
* *
|
||||
* N O T I C E *
|
||||
* *
|
||||
* Copyright Abandoned, 1987, Fred Fish *
|
||||
* *
|
||||
* *
|
||||
* This previously copyrighted work has been placed into the public *
|
||||
* domain by the author and may be freely used for any purpose, *
|
||||
* private or commercial. *
|
||||
* *
|
||||
* Because of the number of inquiries I was receiving about the use *
|
||||
* of this product in commercially developed works I have decided to *
|
||||
* simply make it public domain to further its unrestricted use. I *
|
||||
* specifically would be most happy to see this material become a *
|
||||
* part of the standard Unix distributions by AT&T and the Berkeley *
|
||||
* Computer Science Research Group, and a standard part of the GNU *
|
||||
* system from the Free Software Foundation. *
|
||||
* *
|
||||
* I would appreciate it, as a courtesy, if this notice is left in *
|
||||
* all copies and derivative works. Thank you. *
|
||||
* *
|
||||
* The author makes no warranty of any kind with respect to this *
|
||||
* product and explicitly disclaims any implied warranties of mer- *
|
||||
* chantability or fitness for any particular purpose. *
|
||||
* *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* FILE
|
||||
*
|
||||
* vargs.h include file for environments without varargs.h
|
||||
*
|
||||
* SCCS
|
||||
*
|
||||
* @(#)vargs.h 1.2 5/8/88
|
||||
*
|
||||
* SYNOPSIS
|
||||
*
|
||||
* #include "vargs.h"
|
||||
*
|
||||
* DESCRIPTION
|
||||
*
|
||||
* This file implements a varargs macro set for use in those
|
||||
* environments where there is no system supplied varargs. This
|
||||
* generally works because systems which don't supply a varargs
|
||||
* package are precisely those which don't strictly need a varargs
|
||||
* package. Using this one then allows us to minimize source
|
||||
* code changes. So in some sense, this is a "portable" varargs
|
||||
* since it is only used for convenience, when it is not strictly
|
||||
* needed.
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* These macros allow us to rebuild an argument list on the stack
|
||||
* given only a va_list. We can use these to fake a function like
|
||||
* vfprintf, which gets a fixed number of arguments, the last of
|
||||
* which is a va_list, by rebuilding a stack and calling the variable
|
||||
* argument form fprintf. Of course this only works when vfprintf
|
||||
* is not available in the host environment, and thus is not available
|
||||
* for fprintf to call (which would give us an infinite loop).
|
||||
*
|
||||
* Note that ARGS_TYPE is a long, which lets us get several bytes
|
||||
* at a time while also preventing lots of "possible pointer alignment
|
||||
* problem" messages from lint. The messages are valid, because this
|
||||
* IS nonportable, but then we should only be using it in very
|
||||
* nonrestrictive environments, and using the real varargs where it
|
||||
* really counts.
|
||||
*
|
||||
*/
|
||||
|
||||
#define ARG0 a0
|
||||
#define ARG1 a1
|
||||
#define ARG2 a2
|
||||
#define ARG3 a3
|
||||
#define ARG4 a4
|
||||
#define ARG5 a5
|
||||
#define ARG6 a6
|
||||
#define ARG7 a7
|
||||
#define ARG8 a8
|
||||
#define ARG9 a9
|
||||
|
||||
#define ARGS_TYPE long
|
||||
#define ARGS_LIST ARG0,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8,ARG9
|
||||
#define ARGS_DCL auto ARGS_TYPE ARGS_LIST
|
||||
|
||||
/*
|
||||
* A pointer of type "va_list" points to a section of memory
|
||||
* containing an array of variable sized arguments of unknown
|
||||
* number. This pointer is initialized by the va_start
|
||||
* macro to point to the first byte of the first argument.
|
||||
* We can then use it to walk through the argument list by
|
||||
* incrementing it by the size of the argument being referenced.
|
||||
*/
|
||||
|
||||
typedef char *va_list;
|
||||
|
||||
/*
|
||||
* The first variable argument overlays va_alist, which is
|
||||
* nothing more than a "handle" which allows us to get the
|
||||
* address of the first argument on the stack. Note that
|
||||
* by definition, the va_dcl macro includes the terminating
|
||||
* semicolon, which makes use of va_dcl in the source code
|
||||
* appear to be missing a semicolon.
|
||||
*/
|
||||
|
||||
#define va_dcl ARGS_TYPE va_alist;
|
||||
|
||||
/*
|
||||
* The va_start macro takes a variable of type "va_list" and
|
||||
* initializes it. In our case, it initializes a local variable
|
||||
* of type "pointer to char" to point to the first argument on
|
||||
* the stack.
|
||||
*/
|
||||
|
||||
#define va_start(list) list = (char *) &va_alist
|
||||
|
||||
/*
|
||||
* The va_end macro is a null operation for our use.
|
||||
*/
|
||||
|
||||
#define va_end(list)
|
||||
|
||||
/*
|
||||
* The va_arg macro is the tricky one. This one takes
|
||||
* a va_list as the first argument, and a type as the second
|
||||
* argument, and returns a value of the appropriate type
|
||||
* while advancing the va_list to the following argument.
|
||||
* For our case, we first increment the va_list arg by the
|
||||
* size of the type being recovered, cast the result to
|
||||
* a pointer of the appropriate type, and then dereference
|
||||
* that pointer as an array to get the previous arg (which
|
||||
* is the one we wanted.
|
||||
*/
|
||||
|
||||
#define va_arg(list,type) ((type *) (list += sizeof (type)))[-1]
|
@ -189,6 +189,7 @@ int main(int argc, char **argv)
|
||||
config_file);
|
||||
}
|
||||
error= 2;
|
||||
exit(error);
|
||||
}
|
||||
|
||||
for (argument= arguments+1 ; *argument ; argument++)
|
||||
@ -197,5 +198,5 @@ int main(int argc, char **argv)
|
||||
my_free((char*) load_default_groups,MYF(0));
|
||||
free_defaults(arguments);
|
||||
|
||||
exit(error);
|
||||
exit(0);
|
||||
}
|
||||
|
@ -27,7 +27,6 @@
|
||||
#include <time.h>
|
||||
|
||||
#if defined(_WIN32)
|
||||
#define _WIN32_WINNT 0x0400
|
||||
#include <windows.h>
|
||||
#include <wincrypt.h>
|
||||
#else
|
||||
|
@ -21,7 +21,8 @@ HEADERS_GEN_MAKE = my_config.h
|
||||
HEADERS_ABI = mysql.h mysql_com.h mysql_time.h \
|
||||
my_list.h my_alloc.h typelib.h mysql/plugin.h
|
||||
pkginclude_HEADERS = $(HEADERS_ABI) my_dbug.h m_string.h my_sys.h \
|
||||
my_xml.h mysql_embed.h \
|
||||
my_xml.h mysql_embed.h mysql/services.h \
|
||||
mysql/service_my_snprintf.h mysql/service_thd_alloc.h \
|
||||
my_pthread.h my_no_pthread.h \
|
||||
decimal.h errmsg.h my_global.h my_net.h \
|
||||
my_getopt.h sslopt-longopts.h my_dir.h \
|
||||
@ -36,7 +37,7 @@ noinst_HEADERS = config-win.h config-netware.h my_bit.h \
|
||||
my_nosys.h my_alarm.h queues.h rijndael.h sha1.h \
|
||||
my_aes.h my_tree.h my_trie.h hash.h thr_alarm.h \
|
||||
thr_lock.h t_ctype.h violite.h my_md5.h base64.h \
|
||||
my_handler.h my_time.h \
|
||||
my_handler.h my_time.h service_versions.h \
|
||||
my_vle.h my_user.h my_atomic.h atomic/nolock.h \
|
||||
atomic/rwlock.h atomic/x86-gcc.h atomic/x86-msvc.h \
|
||||
atomic/solaris.h \
|
||||
|
@ -356,7 +356,6 @@ inline ulonglong double2ulonglong(double d)
|
||||
#define HAVE_OPENSSL 1
|
||||
#define HAVE_YASSL 1
|
||||
|
||||
#define COMMUNITY_SERVER 1
|
||||
#define ENABLED_PROFILING 1
|
||||
|
||||
/*
|
||||
|
@ -100,7 +100,8 @@ extern const char *client_errors[]; /* Error messages */
|
||||
#define CR_SERVER_LOST_EXTENDED 2055
|
||||
#define CR_STMT_CLOSED 2056
|
||||
#define CR_NEW_STMT_METADATA 2057
|
||||
#define CR_ERROR_LAST /*Copy last error nr:*/ 2057
|
||||
#define CR_ALREADY_CONNECTED 2058
|
||||
#define CR_ERROR_LAST /*Copy last error nr:*/ 2058
|
||||
/* Add error numbers before CR_ERROR_LAST and change it accordingly. */
|
||||
|
||||
#endif /* ERRMSG_INCLUDED */
|
||||
|
@ -21,40 +21,6 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
There was a problem on MacOSX with a shared object ha_example.so.
|
||||
It used hash_search(). During build of ha_example.so no libmysys
|
||||
was specified. Since MacOSX had a hash_search() in the system
|
||||
library, it built the shared object so that the dynamic linker
|
||||
linked hash_search() to the system library, which caused a crash
|
||||
when called. To come around this, we renamed hash_search() to
|
||||
my_hash_search(), as we did long ago with hash_insert() and
|
||||
hash_reset(). However, this time we made the move complete with
|
||||
all names. To keep compatibility, we redefine the old names.
|
||||
Since every C and C++ file, that uses HASH, needs to include
|
||||
this file, the change is complete. Both names could be used
|
||||
in the code, but the my_* versions are recommended now.
|
||||
*/
|
||||
#define hash_get_key my_hash_get_key
|
||||
#define hash_free_key my_hash_free_key
|
||||
#define hash_init my_hash_init
|
||||
#define hash_init2 my_hash_init2
|
||||
#define _hash_init _my_hash_init
|
||||
#define hash_free my_hash_free
|
||||
#define hash_reset my_hash_reset
|
||||
#define hash_element my_hash_element
|
||||
#define hash_search my_hash_search
|
||||
#define hash_first my_hash_first
|
||||
#define hash_next my_hash_next
|
||||
#define hash_insert my_hash_insert
|
||||
#define hash_delete my_hash_delete
|
||||
#define hash_update my_hash_update
|
||||
#define hash_replace my_hash_replace
|
||||
#define hash_check my_hash_check
|
||||
#define hash_clear my_hash_clear
|
||||
#define hash_inited my_hash_inited
|
||||
#define hash_init_opt my_hash_init_opt
|
||||
|
||||
/*
|
||||
Overhead to store an element in hash
|
||||
Can be used to approximate memory consumption for a hash
|
||||
|
@ -250,16 +250,10 @@ extern size_t my_snprintf(char *to, size_t n, const char *fmt, ...)
|
||||
|
||||
/*
|
||||
LEX_STRING -- a pair of a C-string and its length.
|
||||
(it's part of the plugin API as a MYSQL_LEX_STRING)
|
||||
*/
|
||||
|
||||
#ifndef _my_plugin_h
|
||||
/* This definition must match the one given in mysql/plugin.h */
|
||||
struct st_mysql_lex_string
|
||||
{
|
||||
char *str;
|
||||
size_t length;
|
||||
};
|
||||
#endif
|
||||
#include <mysql/plugin.h>
|
||||
typedef struct st_mysql_lex_string LEX_STRING;
|
||||
|
||||
#define STRING_WITH_LEN(X) (X), ((size_t) (sizeof(X) - 1))
|
||||
|
@ -255,7 +255,17 @@ enum ha_base_keytype {
|
||||
HA_BINARY_PACK_KEY | HA_FULLTEXT | HA_UNIQUE_CHECK | \
|
||||
HA_SPATIAL | HA_NULL_ARE_EQUAL | HA_GENERATED_KEY)
|
||||
|
||||
#define HA_KEY_HAS_PART_KEY_SEG 65536 /* Key contains partial segments */
|
||||
/*
|
||||
Key contains partial segments.
|
||||
|
||||
This flag is internal to the MySQL server by design. It is not supposed
|
||||
neither to be saved in FRM-files, nor to be passed to storage engines.
|
||||
It is intended to pass information into internal static sort_keys(KEY *,
|
||||
KEY *) function.
|
||||
|
||||
This flag can be calculated -- it's based on key lengths comparison.
|
||||
*/
|
||||
#define HA_KEY_HAS_PART_KEY_SEG 65536
|
||||
|
||||
/* Automatic bits in key-flag */
|
||||
|
||||
|
@ -16,103 +16,64 @@
|
||||
#ifndef _dbug_h
|
||||
#define _dbug_h
|
||||
|
||||
#if defined(__cplusplus) && !defined(DBUG_OFF)
|
||||
class Dbug_violation_helper
|
||||
{
|
||||
public:
|
||||
inline Dbug_violation_helper() :
|
||||
_entered(TRUE)
|
||||
{ }
|
||||
|
||||
inline ~Dbug_violation_helper()
|
||||
{
|
||||
assert(!_entered);
|
||||
}
|
||||
|
||||
inline void leave()
|
||||
{
|
||||
_entered= FALSE;
|
||||
}
|
||||
|
||||
private:
|
||||
bool _entered;
|
||||
};
|
||||
#endif /* C++ */
|
||||
|
||||
#ifdef __cplusplus
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#if !defined(DBUG_OFF) && !defined(_lint)
|
||||
struct _db_code_state_;
|
||||
extern int _db_keyword_(struct _db_code_state_ *cs, const char *keyword);
|
||||
extern int _db_keywords_(const char *, const char *);
|
||||
extern int _db_strict_keyword_(const char *keyword);
|
||||
|
||||
struct _db_stack_frame_ {
|
||||
const char *func; /* function name of the previous stack frame */
|
||||
const char *file; /* filename of the function of previous frame */
|
||||
uint level; /* this nesting level, highest bit enables tracing */
|
||||
struct _db_stack_frame_ *prev; /* pointer to the previous frame */
|
||||
};
|
||||
|
||||
struct _db_code_state_;
|
||||
extern my_bool _dbug_on_;
|
||||
extern my_bool _db_keyword_(struct _db_code_state_ *, const char *, int);
|
||||
extern int _db_explain_(struct _db_code_state_ *cs, char *buf, size_t len);
|
||||
extern int _db_explain_init_(char *buf, size_t len);
|
||||
extern void _db_setjmp_(void);
|
||||
extern void _db_longjmp_(void);
|
||||
extern int _db_is_pushed_(void);
|
||||
extern void _db_setjmp_(void);
|
||||
extern void _db_longjmp_(void);
|
||||
extern void _db_process_(const char *name);
|
||||
extern void _db_push_(const char *control);
|
||||
extern void _db_pop_(void);
|
||||
extern void _db_set_(struct _db_code_state_ *cs, const char *control);
|
||||
extern void _db_push_(const char *control);
|
||||
extern void _db_pop_(void);
|
||||
extern void _db_set_(const char *control);
|
||||
extern void _db_set_init_(const char *control);
|
||||
extern void _db_enter_(const char *_func_,const char *_file_,uint _line_,
|
||||
const char **_sfunc_,const char **_sfile_,
|
||||
uint *_slevel_, char ***);
|
||||
extern void _db_return_(uint _line_,const char **_sfunc_,const char **_sfile_,
|
||||
uint *_slevel_);
|
||||
extern void _db_pargs_(uint _line_,const char *keyword);
|
||||
extern void _db_doprnt_ _VARARGS((const char *format,...))
|
||||
extern void _db_enter_(const char *_func_, const char *_file_, uint _line_,
|
||||
struct _db_stack_frame_ *_stack_frame_);
|
||||
extern void _db_return_(uint _line_, struct _db_stack_frame_ *_stack_frame_);
|
||||
extern void _db_pargs_(uint _line_,const char *keyword);
|
||||
extern void _db_doprnt_ _VARARGS((const char *format,...))
|
||||
ATTRIBUTE_FORMAT(printf, 1, 2);
|
||||
extern void _db_dump_(uint _line_,const char *keyword,
|
||||
extern void _db_dump_(uint _line_,const char *keyword,
|
||||
const unsigned char *memory, size_t length);
|
||||
extern void _db_end_(void);
|
||||
extern void _db_lock_file_(void);
|
||||
extern void _db_unlock_file_(void);
|
||||
extern FILE *_db_fp_(void);
|
||||
extern void _db_end_(void);
|
||||
extern void _db_lock_file_(void);
|
||||
extern void _db_unlock_file_(void);
|
||||
extern FILE *_db_fp_(void);
|
||||
extern void _db_flush_();
|
||||
extern const char* _db_get_func_(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
#define DBUG_ENTER(a) \
|
||||
const char *_db_func_, *_db_file_; \
|
||||
uint _db_level_; \
|
||||
char **_db_framep_; \
|
||||
Dbug_violation_helper dbug_violation_helper; \
|
||||
_db_enter_ (a, __FILE__, __LINE__, &_db_func_, &_db_file_, \
|
||||
&_db_level_, &_db_framep_)
|
||||
#define DBUG_VIOLATION_HELPER_LEAVE dbug_violation_helper.leave()
|
||||
|
||||
#else /* C */
|
||||
|
||||
#define DBUG_ENTER(a) \
|
||||
const char *_db_func_, *_db_file_; \
|
||||
uint _db_level_; \
|
||||
char **_db_framep_; \
|
||||
_db_enter_ (a, __FILE__, __LINE__, &_db_func_, &_db_file_, \
|
||||
&_db_level_, &_db_framep_)
|
||||
#define DBUG_VIOLATION_HELPER_LEAVE do { } while(0)
|
||||
|
||||
#endif /* C++ */
|
||||
|
||||
#define DBUG_LEAVE \
|
||||
DBUG_VIOLATION_HELPER_LEAVE; \
|
||||
_db_return_ (__LINE__, &_db_func_, &_db_file_, &_db_level_)
|
||||
#define DBUG_ENTER(a) struct _db_stack_frame_ _db_stack_frame_; \
|
||||
_db_enter_ (a,__FILE__,__LINE__,&_db_stack_frame_)
|
||||
#define DBUG_LEAVE _db_return_ (__LINE__, &_db_stack_frame_)
|
||||
#define DBUG_RETURN(a1) do {DBUG_LEAVE; return(a1);} while(0)
|
||||
#define DBUG_VOID_RETURN do {DBUG_LEAVE; return;} while(0)
|
||||
#define DBUG_EXECUTE(keyword,a1) \
|
||||
do {if (_db_keyword_(0, (keyword))) { a1 }} while(0)
|
||||
do {if (_db_keyword_(0, (keyword), 0)) { a1 }} while(0)
|
||||
#define DBUG_EXECUTE_IF(keyword,a1) \
|
||||
do {if (_db_strict_keyword_ (keyword)) { a1 } } while(0)
|
||||
do {if (_db_keyword_(0, (keyword), 1)) { a1 }} while(0)
|
||||
#define DBUG_EVALUATE(keyword,a1,a2) \
|
||||
(_db_keyword_(0,(keyword)) ? (a1) : (a2))
|
||||
(_db_keyword_(0,(keyword), 0) ? (a1) : (a2))
|
||||
#define DBUG_EVALUATE_IF(keyword,a1,a2) \
|
||||
(_db_strict_keyword_((keyword)) ? (a1) : (a2))
|
||||
(_db_keyword_(0,(keyword), 1) ? (a1) : (a2))
|
||||
#define DBUG_PRINT(keyword,arglist) \
|
||||
do {_db_pargs_(__LINE__,keyword); _db_doprnt_ arglist;} while(0)
|
||||
#define DBUG_PUSH(a1) _db_push_ (a1)
|
||||
#define DBUG_POP() _db_pop_ ()
|
||||
#define DBUG_SET(a1) _db_set_ (0, (a1))
|
||||
#define DBUG_SET(a1) _db_set_ (a1)
|
||||
#define DBUG_SET_INITIAL(a1) _db_set_init_ (a1)
|
||||
#define DBUG_PROCESS(a1) _db_process_(a1)
|
||||
#define DBUG_FILE _db_fp_()
|
||||
@ -125,54 +86,66 @@ extern const char* _db_get_func_(void);
|
||||
#define DBUG_ASSERT(A) assert(A)
|
||||
#define DBUG_EXPLAIN(buf,len) _db_explain_(0, (buf),(len))
|
||||
#define DBUG_EXPLAIN_INITIAL(buf,len) _db_explain_init_((buf),(len))
|
||||
#define IF_DBUG(A) A
|
||||
#define _DBUG_MAX_FUNC_NAME_ 255
|
||||
#define DEBUGGER_OFF do { _dbug_on_= 0; } while(0)
|
||||
#define DEBUGGER_ON do { _dbug_on_= 1; } while(0)
|
||||
#ifndef __WIN__
|
||||
#define DBUG_ABORT() (_db_flush_(), abort())
|
||||
#else
|
||||
/*
|
||||
Avoid popup with abort/retry/ignore buttons. When BUG#31745 is fixed we can
|
||||
call abort() instead of _exit(3) (now it would cause a "test signal" popup).
|
||||
*/
|
||||
#include <crtdbg.h>
|
||||
#define DBUG_ABORT() (_db_flush_(),\
|
||||
(void)_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE),\
|
||||
(void)_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR),\
|
||||
_exit(3))
|
||||
#endif
|
||||
#define DBUG_CHECK_CRASH(func, op) \
|
||||
do { \
|
||||
if (_db_keywords_((func), (op))) \
|
||||
{ abort(); } \
|
||||
} while (0)
|
||||
do { char _dbuf_[255]; strxnmov(_dbuf_, sizeof(_dbuf_)-1, (func), (op)); \
|
||||
DBUG_EXECUTE_IF(_dbuf_, DBUG_ABORT()); } while(0)
|
||||
#define DBUG_CRASH_ENTER(func) \
|
||||
DBUG_ENTER(func); DBUG_CHECK_CRASH(func, "_crash_enter")
|
||||
#define DBUG_CRASH_RETURN(val) \
|
||||
do {DBUG_CHECK_CRASH(_db_get_func_(), "_crash_return"); \
|
||||
DBUG_RETURN(val);} while(0)
|
||||
DBUG_CHECK_CRASH(_db_get_func_(), "_crash_return")
|
||||
#define DBUG_CRASH_VOID_RETURN \
|
||||
do {DBUG_CHECK_CRASH (_db_get_func_(), "_crash_return"); \
|
||||
DBUG_VOID_RETURN;} while(0)
|
||||
#else /* No debugger */
|
||||
DBUG_CHECK_CRASH (_db_get_func_(), "_crash_return")
|
||||
|
||||
#else /* No debugger */
|
||||
|
||||
#define DBUG_ENTER(a1)
|
||||
#define DBUG_LEAVE
|
||||
#define DBUG_VIOLATION_HELPER_LEAVE
|
||||
#define DBUG_RETURN(a1) do { return(a1); } while(0)
|
||||
#define DBUG_VOID_RETURN do { return; } while(0)
|
||||
#define DBUG_EXECUTE(keyword,a1) do { } while(0)
|
||||
#define DBUG_EXECUTE_IF(keyword,a1) do { } while(0)
|
||||
#define DBUG_RETURN(a1) do { return(a1); } while(0)
|
||||
#define DBUG_VOID_RETURN do { return; } while(0)
|
||||
#define DBUG_EXECUTE(keyword,a1) do { } while(0)
|
||||
#define DBUG_EXECUTE_IF(keyword,a1) do { } while(0)
|
||||
#define DBUG_EVALUATE(keyword,a1,a2) (a2)
|
||||
#define DBUG_EVALUATE_IF(keyword,a1,a2) (a2)
|
||||
#define DBUG_PRINT(keyword,arglist) do { } while(0)
|
||||
#define DBUG_PUSH(a1)
|
||||
#define DBUG_SET(a1) do { } while(0)
|
||||
#define DBUG_SET_INITIAL(a1) do { } while(0)
|
||||
#define DBUG_POP()
|
||||
#define DBUG_PROCESS(a1)
|
||||
#define DBUG_PRINT(keyword,arglist) do { } while(0)
|
||||
#define DBUG_PUSH(a1) do { } while(0)
|
||||
#define DBUG_SET(a1) do { } while(0)
|
||||
#define DBUG_SET_INITIAL(a1) do { } while(0)
|
||||
#define DBUG_POP() do { } while(0)
|
||||
#define DBUG_PROCESS(a1) do { } while(0)
|
||||
#define DBUG_SETJMP(a1) setjmp(a1)
|
||||
#define DBUG_LONGJMP(a1) longjmp(a1)
|
||||
#define DBUG_DUMP(keyword,a1,a2) do { } while(0)
|
||||
#define DBUG_END()
|
||||
#define DBUG_ASSERT(A) do { } while(0)
|
||||
#define DBUG_LOCK_FILE
|
||||
#define DBUG_DUMP(keyword,a1,a2) do { } while(0)
|
||||
#define DBUG_END() do { } while(0)
|
||||
#define DBUG_ASSERT(A) do { } while(0)
|
||||
#define DBUG_LOCK_FILE do { } while(0)
|
||||
#define DBUG_FILE (stderr)
|
||||
#define DBUG_UNLOCK_FILE
|
||||
#define DBUG_UNLOCK_FILE do { } while(0)
|
||||
#define DBUG_EXPLAIN(buf,len)
|
||||
#define DBUG_EXPLAIN_INITIAL(buf,len)
|
||||
#define IF_DBUG(A)
|
||||
#define DEBUGGER_OFF do { } while(0)
|
||||
#define DEBUGGER_ON do { } while(0)
|
||||
#define DBUG_ABORT() abort()
|
||||
#define DBUG_CRASH_ENTER(func)
|
||||
#define DBUG_CRASH_RETURN(val) do { return(val); } while(0)
|
||||
#define DBUG_CRASH_VOID_RETURN do { return; } while(0)
|
||||
#define DBUG_CRASH_RETURN(val) do { return(val); } while(0)
|
||||
#define DBUG_CRASH_VOID_RETURN do { return; } while(0)
|
||||
|
||||
#endif
|
||||
#ifdef __cplusplus
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
@ -649,8 +649,6 @@ C_MODE_END
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#include <my_dbug.h>
|
||||
|
||||
#define MIN_ARRAY_SIZE 0 /* Zero or One. Gcc allows zero*/
|
||||
#define ASCII_BITS_USED 8 /* Bit char used */
|
||||
#define NEAR_F /* No near function handling */
|
||||
@ -1177,6 +1175,8 @@ typedef char bool; /* Ordinary boolean values 0 1 */
|
||||
#define reg16 register
|
||||
#endif
|
||||
|
||||
#include <my_dbug.h>
|
||||
|
||||
/*
|
||||
Sometimes we want to make sure that the variable is not put into
|
||||
a register in debugging mode so we can see its value in the core
|
||||
|
@ -670,6 +670,7 @@ struct st_my_thread_var
|
||||
};
|
||||
|
||||
extern struct st_my_thread_var *_my_thread_var(void) __attribute__ ((const));
|
||||
extern void **my_thread_var_dbug();
|
||||
extern uint my_thread_end_wait_time;
|
||||
#define my_thread_var (_my_thread_var())
|
||||
#define my_errno my_thread_var->thr_errno
|
||||
|
@ -60,7 +60,7 @@ extern int NEAR my_errno; /* Last error in mysys */
|
||||
#define MY_WME 16 /* Write message on error */
|
||||
#define MY_WAIT_IF_FULL 32 /* Wait and try again if disk full error */
|
||||
#define MY_IGNORE_BADFD 32 /* my_sync: ignore 'bad descriptor' errors */
|
||||
#define MY_SYNC_DIR 1024 /* my_create/delete/rename: sync directory */
|
||||
#define MY_SYNC_DIR 8192 /* my_create/delete/rename: sync directory */
|
||||
#define MY_RAID 64 /* Support for RAID */
|
||||
#define MY_FULL_IO 512 /* For my_read - loop intil I/O is complete */
|
||||
#define MY_DONT_CHECK_FILESIZE 128 /* Option to init_io_cache() */
|
||||
@ -683,6 +683,8 @@ extern void my_error _VARARGS((int nr,myf MyFlags, ...));
|
||||
extern void my_printf_error _VARARGS((uint my_err, const char *format,
|
||||
myf MyFlags, ...))
|
||||
ATTRIBUTE_FORMAT(printf, 2, 4);
|
||||
extern void my_printv_error(uint error, const char *format, myf MyFlags,
|
||||
va_list ap);
|
||||
extern int my_error_register(const char** (*get_errmsgs) (),
|
||||
int first, int last);
|
||||
extern const char **my_error_unregister(int first, int last);
|
||||
|
@ -432,6 +432,10 @@ typedef struct st_mi_check_param
|
||||
const char *db_name, *table_name;
|
||||
const char *op_name;
|
||||
enum_mi_stats_method stats_method;
|
||||
#ifdef THREAD
|
||||
pthread_mutex_t print_msg_mutex;
|
||||
my_bool need_print_msg_lock;
|
||||
#endif
|
||||
} MI_CHECK;
|
||||
|
||||
typedef struct st_sort_ft_buf
|
||||
|
138
include/mysql.h
138
include/mysql.h
@ -188,24 +188,10 @@ struct st_mysql_options {
|
||||
unsigned long max_allowed_packet;
|
||||
my_bool use_ssl; /* if to use SSL or not */
|
||||
my_bool compress,named_pipe;
|
||||
/*
|
||||
On connect, find out the replication role of the server, and
|
||||
establish connections to all the peers
|
||||
*/
|
||||
my_bool rpl_probe;
|
||||
/*
|
||||
Each call to mysql_real_query() will parse it to tell if it is a read
|
||||
or a write, and direct it to the slave or the master
|
||||
*/
|
||||
my_bool rpl_parse;
|
||||
/*
|
||||
If set, never read from a master, only from slave, when doing
|
||||
a read that is replication-aware
|
||||
*/
|
||||
my_bool no_master_reads;
|
||||
#if !defined(CHECK_EMBEDDED_DIFFERENCES) || defined(EMBEDDED_LIBRARY)
|
||||
my_bool separate_thread;
|
||||
#endif
|
||||
my_bool unused1;
|
||||
my_bool unused2;
|
||||
my_bool unused3;
|
||||
my_bool unused4;
|
||||
enum mysql_option methods_to_use;
|
||||
char *client_ip;
|
||||
/* Refuse client connecting to server if it uses old (pre-4.1.1) protocol */
|
||||
@ -232,15 +218,6 @@ enum mysql_protocol_type
|
||||
MYSQL_PROTOCOL_DEFAULT, MYSQL_PROTOCOL_TCP, MYSQL_PROTOCOL_SOCKET,
|
||||
MYSQL_PROTOCOL_PIPE, MYSQL_PROTOCOL_MEMORY
|
||||
};
|
||||
/*
|
||||
There are three types of queries - the ones that have to go to
|
||||
the master, the ones that go to a slave, and the adminstrative
|
||||
type which must happen on the pivot connectioin
|
||||
*/
|
||||
enum mysql_rpl_type
|
||||
{
|
||||
MYSQL_RPL_MASTER, MYSQL_RPL_SLAVE, MYSQL_RPL_ADMIN
|
||||
};
|
||||
|
||||
typedef struct character_set
|
||||
{
|
||||
@ -285,21 +262,8 @@ typedef struct st_mysql
|
||||
|
||||
/* session-wide random string */
|
||||
char scramble[SCRAMBLE_LENGTH+1];
|
||||
|
||||
/*
|
||||
Set if this is the original connection, not a master or a slave we have
|
||||
added though mysql_rpl_probe() or mysql_set_master()/ mysql_add_slave()
|
||||
*/
|
||||
my_bool rpl_pivot;
|
||||
/*
|
||||
Pointers to the master, and the next slave connections, points to
|
||||
itself if lone connection.
|
||||
*/
|
||||
struct st_mysql* master, *next_slave;
|
||||
|
||||
struct st_mysql* last_used_slave; /* needed for round-robin slave pick */
|
||||
/* needed for send/read/store/use result to work correctly with replication */
|
||||
struct st_mysql* last_used_con;
|
||||
my_bool unused1;
|
||||
void *unused2, *unused3, *unused4, *unused5;
|
||||
|
||||
LIST *stmts; /* list of all statements */
|
||||
const struct st_mysql_methods *methods;
|
||||
@ -333,35 +297,12 @@ typedef struct st_mysql_res {
|
||||
void *extension;
|
||||
} MYSQL_RES;
|
||||
|
||||
#define MAX_MYSQL_MANAGER_ERR 256
|
||||
#define MAX_MYSQL_MANAGER_MSG 256
|
||||
|
||||
#define MANAGER_OK 200
|
||||
#define MANAGER_INFO 250
|
||||
#define MANAGER_ACCESS 401
|
||||
#define MANAGER_CLIENT_ERR 450
|
||||
#define MANAGER_INTERNAL_ERR 500
|
||||
|
||||
#if !defined(MYSQL_SERVER) && !defined(MYSQL_CLIENT)
|
||||
#define MYSQL_CLIENT
|
||||
#endif
|
||||
|
||||
|
||||
typedef struct st_mysql_manager
|
||||
{
|
||||
NET net;
|
||||
char *host, *user, *passwd;
|
||||
char *net_buf, *net_buf_pos, *net_data_end;
|
||||
unsigned int port;
|
||||
int cmd_status;
|
||||
int last_errno;
|
||||
int net_buf_size;
|
||||
my_bool free_me;
|
||||
my_bool eof;
|
||||
char last_error[MAX_MYSQL_MANAGER_ERR];
|
||||
void *extension;
|
||||
} MYSQL_MANAGER;
|
||||
|
||||
typedef struct st_mysql_parameters
|
||||
{
|
||||
unsigned long *p_max_allowed_packet;
|
||||
@ -454,16 +395,6 @@ int STDCALL mysql_real_query(MYSQL *mysql, const char *q,
|
||||
MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql);
|
||||
MYSQL_RES * STDCALL mysql_use_result(MYSQL *mysql);
|
||||
|
||||
/* perform query on master */
|
||||
my_bool STDCALL mysql_master_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length);
|
||||
my_bool STDCALL mysql_master_send_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length);
|
||||
/* perform query on slave */
|
||||
my_bool STDCALL mysql_slave_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length);
|
||||
my_bool STDCALL mysql_slave_send_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length);
|
||||
void STDCALL mysql_get_character_set_info(MYSQL *mysql,
|
||||
MY_CHARSET_INFO *charset);
|
||||
|
||||
@ -485,37 +416,6 @@ mysql_set_local_infile_handler(MYSQL *mysql,
|
||||
void
|
||||
mysql_set_local_infile_default(MYSQL *mysql);
|
||||
|
||||
|
||||
/*
|
||||
enable/disable parsing of all queries to decide if they go on master or
|
||||
slave
|
||||
*/
|
||||
void STDCALL mysql_enable_rpl_parse(MYSQL* mysql);
|
||||
void STDCALL mysql_disable_rpl_parse(MYSQL* mysql);
|
||||
/* get the value of the parse flag */
|
||||
int STDCALL mysql_rpl_parse_enabled(MYSQL* mysql);
|
||||
|
||||
/* enable/disable reads from master */
|
||||
void STDCALL mysql_enable_reads_from_master(MYSQL* mysql);
|
||||
void STDCALL mysql_disable_reads_from_master(MYSQL* mysql);
|
||||
/* get the value of the master read flag */
|
||||
my_bool STDCALL mysql_reads_from_master_enabled(MYSQL* mysql);
|
||||
|
||||
enum mysql_rpl_type STDCALL mysql_rpl_query_type(const char* q, int len);
|
||||
|
||||
/* discover the master and its slaves */
|
||||
my_bool STDCALL mysql_rpl_probe(MYSQL* mysql);
|
||||
|
||||
/* set the master, close/free the old one, if it is not a pivot */
|
||||
int STDCALL mysql_set_master(MYSQL* mysql, const char* host,
|
||||
unsigned int port,
|
||||
const char* user,
|
||||
const char* passwd);
|
||||
int STDCALL mysql_add_slave(MYSQL* mysql, const char* host,
|
||||
unsigned int port,
|
||||
const char* user,
|
||||
const char* passwd);
|
||||
|
||||
int STDCALL mysql_shutdown(MYSQL *mysql,
|
||||
enum mysql_enum_shutdown_level
|
||||
shutdown_level);
|
||||
@ -559,21 +459,19 @@ unsigned long STDCALL mysql_real_escape_string(MYSQL *mysql,
|
||||
char *to,const char *from,
|
||||
unsigned long length);
|
||||
void STDCALL mysql_debug(const char *debug);
|
||||
char * STDCALL mysql_odbc_escape_string(MYSQL *mysql,
|
||||
char *to,
|
||||
unsigned long to_length,
|
||||
const char *from,
|
||||
unsigned long from_length,
|
||||
void *param,
|
||||
char *
|
||||
(*extend_buffer)
|
||||
(void *, char *to,
|
||||
unsigned long *length));
|
||||
void STDCALL myodbc_remove_escape(MYSQL *mysql,char *name);
|
||||
unsigned int STDCALL mysql_thread_safe(void);
|
||||
my_bool STDCALL mysql_embedded(void);
|
||||
MYSQL_MANAGER* STDCALL mysql_manager_init(MYSQL_MANAGER* con);
|
||||
MYSQL_MANAGER* STDCALL mysql_manager_connect(MYSQL_MANAGER* con,
|
||||
const char* host,
|
||||
const char* user,
|
||||
const char* passwd,
|
||||
unsigned int port);
|
||||
void STDCALL mysql_manager_close(MYSQL_MANAGER* con);
|
||||
int STDCALL mysql_manager_command(MYSQL_MANAGER* con,
|
||||
const char* cmd, int cmd_len);
|
||||
int STDCALL mysql_manager_fetch_line(MYSQL_MANAGER* con,
|
||||
char* res_buf,
|
||||
int res_buf_size);
|
||||
my_bool STDCALL mysql_read_query_result(MYSQL *mysql);
|
||||
|
||||
|
||||
@ -768,7 +666,7 @@ typedef struct st_mysql_methods
|
||||
MYSQL_RES * (*use_result)(MYSQL *mysql);
|
||||
void (*fetch_lengths)(unsigned long *to,
|
||||
MYSQL_ROW column, unsigned int field_count);
|
||||
void (*flush_use_result)(MYSQL *mysql);
|
||||
void (*flush_use_result)(MYSQL *mysql, my_bool flush_all_results);
|
||||
#if !defined(MYSQL_SERVER) || defined(EMBEDDED_LIBRARY)
|
||||
MYSQL_FIELD * (*list_fields)(MYSQL *mysql);
|
||||
my_bool (*read_prepare_result)(MYSQL *mysql, MYSQL_STMT *stmt);
|
||||
@ -828,6 +726,7 @@ my_bool STDCALL mysql_rollback(MYSQL * mysql);
|
||||
my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode);
|
||||
my_bool STDCALL mysql_more_results(MYSQL *mysql);
|
||||
int STDCALL mysql_next_result(MYSQL *mysql);
|
||||
int STDCALL mysql_stmt_next_result(MYSQL_STMT *stmt);
|
||||
void STDCALL mysql_close(MYSQL *sock);
|
||||
|
||||
|
||||
@ -842,7 +741,6 @@ MYSQL * STDCALL mysql_connect(MYSQL *mysql, const char *host,
|
||||
const char *user, const char *passwd);
|
||||
int STDCALL mysql_create_db(MYSQL *mysql, const char *DB);
|
||||
int STDCALL mysql_drop_db(MYSQL *mysql, const char *DB);
|
||||
#define mysql_reload(mysql) mysql_refresh((mysql),REFRESH_GRANT)
|
||||
#endif
|
||||
#define HAVE_MYSQL_REAL_CONNECT
|
||||
|
||||
|
@ -28,15 +28,15 @@ typedef struct st_net {
|
||||
unsigned int *return_status;
|
||||
unsigned char reading_or_writing;
|
||||
char save_char;
|
||||
my_bool unused0;
|
||||
my_bool unused;
|
||||
my_bool compress;
|
||||
my_bool unused1;
|
||||
unsigned char *query_cache_query;
|
||||
my_bool unused2;
|
||||
my_bool compress;
|
||||
my_bool unused3;
|
||||
unsigned char *unused;
|
||||
unsigned int last_errno;
|
||||
unsigned char error;
|
||||
my_bool unused2;
|
||||
my_bool return_errno;
|
||||
my_bool unused4;
|
||||
my_bool unused5;
|
||||
char last_error[512];
|
||||
char sqlstate[5 +1];
|
||||
void *extension;
|
||||
@ -277,10 +277,10 @@ struct st_mysql_options {
|
||||
unsigned long max_allowed_packet;
|
||||
my_bool use_ssl;
|
||||
my_bool compress,named_pipe;
|
||||
my_bool rpl_probe;
|
||||
my_bool rpl_parse;
|
||||
my_bool no_master_reads;
|
||||
my_bool separate_thread;
|
||||
my_bool unused1;
|
||||
my_bool unused2;
|
||||
my_bool unused3;
|
||||
my_bool unused4;
|
||||
enum mysql_option methods_to_use;
|
||||
char *client_ip;
|
||||
my_bool secure_auth;
|
||||
@ -301,10 +301,6 @@ enum mysql_protocol_type
|
||||
MYSQL_PROTOCOL_DEFAULT, MYSQL_PROTOCOL_TCP, MYSQL_PROTOCOL_SOCKET,
|
||||
MYSQL_PROTOCOL_PIPE, MYSQL_PROTOCOL_MEMORY
|
||||
};
|
||||
enum mysql_rpl_type
|
||||
{
|
||||
MYSQL_RPL_MASTER, MYSQL_RPL_SLAVE, MYSQL_RPL_ADMIN
|
||||
};
|
||||
typedef struct character_set
|
||||
{
|
||||
unsigned int number;
|
||||
@ -344,10 +340,8 @@ typedef struct st_mysql
|
||||
my_bool free_me;
|
||||
my_bool reconnect;
|
||||
char scramble[20 +1];
|
||||
my_bool rpl_pivot;
|
||||
struct st_mysql* master, *next_slave;
|
||||
struct st_mysql* last_used_slave;
|
||||
struct st_mysql* last_used_con;
|
||||
my_bool unused1;
|
||||
void *unused2, *unused3, *unused4, *unused5;
|
||||
LIST *stmts;
|
||||
const struct st_mysql_methods *methods;
|
||||
void *thd;
|
||||
@ -371,20 +365,6 @@ typedef struct st_mysql_res {
|
||||
my_bool unbuffered_fetch_cancelled;
|
||||
void *extension;
|
||||
} MYSQL_RES;
|
||||
typedef struct st_mysql_manager
|
||||
{
|
||||
NET net;
|
||||
char *host, *user, *passwd;
|
||||
char *net_buf, *net_buf_pos, *net_data_end;
|
||||
unsigned int port;
|
||||
int cmd_status;
|
||||
int last_errno;
|
||||
int net_buf_size;
|
||||
my_bool free_me;
|
||||
my_bool eof;
|
||||
char last_error[256];
|
||||
void *extension;
|
||||
} MYSQL_MANAGER;
|
||||
typedef struct st_mysql_parameters
|
||||
{
|
||||
unsigned long *p_max_allowed_packet;
|
||||
@ -437,14 +417,6 @@ int mysql_real_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length);
|
||||
MYSQL_RES * mysql_store_result(MYSQL *mysql);
|
||||
MYSQL_RES * mysql_use_result(MYSQL *mysql);
|
||||
my_bool mysql_master_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length);
|
||||
my_bool mysql_master_send_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length);
|
||||
my_bool mysql_slave_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length);
|
||||
my_bool mysql_slave_send_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length);
|
||||
void mysql_get_character_set_info(MYSQL *mysql,
|
||||
MY_CHARSET_INFO *charset);
|
||||
void
|
||||
@ -459,22 +431,6 @@ mysql_set_local_infile_handler(MYSQL *mysql,
|
||||
void *);
|
||||
void
|
||||
mysql_set_local_infile_default(MYSQL *mysql);
|
||||
void mysql_enable_rpl_parse(MYSQL* mysql);
|
||||
void mysql_disable_rpl_parse(MYSQL* mysql);
|
||||
int mysql_rpl_parse_enabled(MYSQL* mysql);
|
||||
void mysql_enable_reads_from_master(MYSQL* mysql);
|
||||
void mysql_disable_reads_from_master(MYSQL* mysql);
|
||||
my_bool mysql_reads_from_master_enabled(MYSQL* mysql);
|
||||
enum mysql_rpl_type mysql_rpl_query_type(const char* q, int len);
|
||||
my_bool mysql_rpl_probe(MYSQL* mysql);
|
||||
int mysql_set_master(MYSQL* mysql, const char* host,
|
||||
unsigned int port,
|
||||
const char* user,
|
||||
const char* passwd);
|
||||
int mysql_add_slave(MYSQL* mysql, const char* host,
|
||||
unsigned int port,
|
||||
const char* user,
|
||||
const char* passwd);
|
||||
int mysql_shutdown(MYSQL *mysql,
|
||||
enum mysql_enum_shutdown_level
|
||||
shutdown_level);
|
||||
@ -518,21 +474,19 @@ unsigned long mysql_real_escape_string(MYSQL *mysql,
|
||||
char *to,const char *from,
|
||||
unsigned long length);
|
||||
void mysql_debug(const char *debug);
|
||||
char * mysql_odbc_escape_string(MYSQL *mysql,
|
||||
char *to,
|
||||
unsigned long to_length,
|
||||
const char *from,
|
||||
unsigned long from_length,
|
||||
void *param,
|
||||
char *
|
||||
(*extend_buffer)
|
||||
(void *, char *to,
|
||||
unsigned long *length));
|
||||
void myodbc_remove_escape(MYSQL *mysql,char *name);
|
||||
unsigned int mysql_thread_safe(void);
|
||||
my_bool mysql_embedded(void);
|
||||
MYSQL_MANAGER* mysql_manager_init(MYSQL_MANAGER* con);
|
||||
MYSQL_MANAGER* mysql_manager_connect(MYSQL_MANAGER* con,
|
||||
const char* host,
|
||||
const char* user,
|
||||
const char* passwd,
|
||||
unsigned int port);
|
||||
void mysql_manager_close(MYSQL_MANAGER* con);
|
||||
int mysql_manager_command(MYSQL_MANAGER* con,
|
||||
const char* cmd, int cmd_len);
|
||||
int mysql_manager_fetch_line(MYSQL_MANAGER* con,
|
||||
char* res_buf,
|
||||
int res_buf_size);
|
||||
my_bool mysql_read_query_result(MYSQL *mysql);
|
||||
enum enum_mysql_stmt_state
|
||||
{
|
||||
@ -616,7 +570,7 @@ typedef struct st_mysql_methods
|
||||
MYSQL_RES * (*use_result)(MYSQL *mysql);
|
||||
void (*fetch_lengths)(unsigned long *to,
|
||||
MYSQL_ROW column, unsigned int field_count);
|
||||
void (*flush_use_result)(MYSQL *mysql);
|
||||
void (*flush_use_result)(MYSQL *mysql, my_bool flush_all_results);
|
||||
MYSQL_FIELD * (*list_fields)(MYSQL *mysql);
|
||||
my_bool (*read_prepare_result)(MYSQL *mysql, MYSQL_STMT *stmt);
|
||||
int (*stmt_execute)(MYSQL_STMT *stmt);
|
||||
@ -671,4 +625,5 @@ my_bool mysql_rollback(MYSQL * mysql);
|
||||
my_bool mysql_autocommit(MYSQL * mysql, my_bool auto_mode);
|
||||
my_bool mysql_more_results(MYSQL *mysql);
|
||||
int mysql_next_result(MYSQL *mysql);
|
||||
int mysql_stmt_next_result(MYSQL_STMT *stmt);
|
||||
void mysql_close(MYSQL *sock);
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2005 MySQL AB
|
||||
/* Copyright (C) 2005 MySQL AB, 2009 Sun Microsystems, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -16,12 +16,6 @@
|
||||
#ifndef _my_plugin_h
|
||||
#define _my_plugin_h
|
||||
|
||||
/* size_t */
|
||||
#include <stdlib.h>
|
||||
|
||||
typedef struct st_mysql MYSQL;
|
||||
|
||||
|
||||
/*
|
||||
On Windows, exports from DLL need to be declared
|
||||
*/
|
||||
@ -39,15 +33,7 @@ class Item;
|
||||
#define MYSQL_THD void*
|
||||
#endif
|
||||
|
||||
#ifndef _m_string_h
|
||||
/* This definition must match the one given in m_string.h */
|
||||
struct st_mysql_lex_string
|
||||
{
|
||||
char *str;
|
||||
unsigned int length;
|
||||
};
|
||||
#endif /* _m_string_h */
|
||||
typedef struct st_mysql_lex_string MYSQL_LEX_STRING;
|
||||
#include <mysql/services.h>
|
||||
|
||||
#define MYSQL_XIDDATASIZE 128
|
||||
/**
|
||||
@ -70,7 +56,7 @@ typedef struct st_mysql_xid MYSQL_XID;
|
||||
Plugin API. Common for all plugin types.
|
||||
*/
|
||||
|
||||
#define MYSQL_PLUGIN_INTERFACE_VERSION 0x0100
|
||||
#define MYSQL_PLUGIN_INTERFACE_VERSION 0x0101
|
||||
|
||||
/*
|
||||
The allowable types of plugins
|
||||
@ -126,7 +112,8 @@ enum enum_mysql_show_type
|
||||
{
|
||||
SHOW_UNDEF, SHOW_BOOL, SHOW_INT, SHOW_LONG,
|
||||
SHOW_LONGLONG, SHOW_CHAR, SHOW_CHAR_PTR,
|
||||
SHOW_ARRAY, SHOW_FUNC, SHOW_DOUBLE
|
||||
SHOW_ARRAY, SHOW_FUNC, SHOW_DOUBLE,
|
||||
SHOW_always_last
|
||||
};
|
||||
|
||||
struct st_mysql_show_var {
|
||||
@ -750,54 +737,6 @@ int thd_killed(const MYSQL_THD thd);
|
||||
*/
|
||||
unsigned long thd_get_thread_id(const MYSQL_THD thd);
|
||||
|
||||
|
||||
/**
|
||||
Allocate memory in the connection's local memory pool
|
||||
|
||||
@details
|
||||
When properly used in place of @c my_malloc(), this can significantly
|
||||
improve concurrency. Don't use this or related functions to allocate
|
||||
large chunks of memory. Use for temporary storage only. The memory
|
||||
will be freed automatically at the end of the statement; no explicit
|
||||
code is required to prevent memory leaks.
|
||||
|
||||
@see alloc_root()
|
||||
*/
|
||||
void *thd_alloc(MYSQL_THD thd, unsigned int size);
|
||||
/**
|
||||
@see thd_alloc()
|
||||
*/
|
||||
void *thd_calloc(MYSQL_THD thd, unsigned int size);
|
||||
/**
|
||||
@see thd_alloc()
|
||||
*/
|
||||
char *thd_strdup(MYSQL_THD thd, const char *str);
|
||||
/**
|
||||
@see thd_alloc()
|
||||
*/
|
||||
char *thd_strmake(MYSQL_THD thd, const char *str, unsigned int size);
|
||||
/**
|
||||
@see thd_alloc()
|
||||
*/
|
||||
void *thd_memdup(MYSQL_THD thd, const void* str, unsigned int size);
|
||||
|
||||
/**
|
||||
Create a LEX_STRING in this connection's local memory pool
|
||||
|
||||
@param thd user thread connection handle
|
||||
@param lex_str pointer to LEX_STRING object to be initialized
|
||||
@param str initializer to be copied into lex_str
|
||||
@param size length of str, in bytes
|
||||
@param allocate_lex_string flag: if TRUE, allocate new LEX_STRING object,
|
||||
instead of using lex_str value
|
||||
@return NULL on failure, or pointer to the LEX_STRING object
|
||||
|
||||
@see thd_alloc()
|
||||
*/
|
||||
MYSQL_LEX_STRING *thd_make_lex_string(MYSQL_THD thd, MYSQL_LEX_STRING *lex_str,
|
||||
const char *str, unsigned int size,
|
||||
int allocate_lex_string);
|
||||
|
||||
/**
|
||||
Get the XID for this connection's transaction
|
||||
|
||||
@ -818,64 +757,6 @@ void mysql_query_cache_invalidate4(MYSQL_THD thd,
|
||||
const char *key, unsigned int key_length,
|
||||
int using_trx);
|
||||
|
||||
/**
|
||||
Get the value of user variable as an integer.
|
||||
|
||||
This function will return the value of variable @a name as an
|
||||
integer. If the original value of the variable is not an integer,
|
||||
the value will be converted into an integer.
|
||||
|
||||
@param name user variable name
|
||||
@param value pointer to return the value
|
||||
@param null_value if not NULL, the function will set it to true if
|
||||
the value of variable is null, set to false if not
|
||||
|
||||
@retval 0 Success
|
||||
@retval 1 Variable not found
|
||||
*/
|
||||
int get_user_var_int(const char *name,
|
||||
long long int *value, int *null_value);
|
||||
|
||||
/**
|
||||
Get the value of user variable as a double precision float number.
|
||||
|
||||
This function will return the value of variable @a name as real
|
||||
number. If the original value of the variable is not a real number,
|
||||
the value will be converted into a real number.
|
||||
|
||||
@param name user variable name
|
||||
@param value pointer to return the value
|
||||
@param null_value if not NULL, the function will set it to true if
|
||||
the value of variable is null, set to false if not
|
||||
|
||||
@retval 0 Success
|
||||
@retval 1 Variable not found
|
||||
*/
|
||||
int get_user_var_real(const char *name,
|
||||
double *value, int *null_value);
|
||||
|
||||
/**
|
||||
Get the value of user variable as a string.
|
||||
|
||||
This function will return the value of variable @a name as
|
||||
string. If the original value of the variable is not a string,
|
||||
the value will be converted into a string.
|
||||
|
||||
@param name user variable name
|
||||
@param value pointer to the value buffer
|
||||
@param len length of the value buffer
|
||||
@param precision precision of the value if it is a float number
|
||||
@param null_value if not NULL, the function will set it to true if
|
||||
the value of variable is null, set to false if not
|
||||
|
||||
@retval 0 Success
|
||||
@retval 1 Variable not found
|
||||
*/
|
||||
int get_user_var_str(const char *name,
|
||||
char *value, unsigned long len,
|
||||
unsigned int precision, int *null_value);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@ -1,11 +1,38 @@
|
||||
#include <mysql/services.h>
|
||||
#include <mysql/service_my_snprintf.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
extern struct my_snprintf_service_st {
|
||||
size_t (*my_snprintf_type)(char*, size_t, const char*, ...);
|
||||
size_t (*my_vsnprintf_type)(char *, size_t, const char*, va_list);
|
||||
} *my_snprintf_service;
|
||||
size_t my_snprintf(char* to, size_t n, const char* fmt, ...);
|
||||
size_t my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap);
|
||||
#include <mysql/service_thd_alloc.h>
|
||||
#include <stdlib.h>
|
||||
typedef struct st_mysql MYSQL;
|
||||
struct st_mysql_lex_string
|
||||
{
|
||||
char *str;
|
||||
unsigned int length;
|
||||
size_t length;
|
||||
};
|
||||
typedef struct st_mysql_lex_string MYSQL_LEX_STRING;
|
||||
extern struct thd_alloc_service_st {
|
||||
void *(*thd_alloc_func)(void*, unsigned int);
|
||||
void *(*thd_calloc_func)(void*, unsigned int);
|
||||
char *(*thd_strdup_func)(void*, const char *);
|
||||
char *(*thd_strmake_func)(void*, const char *, unsigned int);
|
||||
void *(*thd_memdup_func)(void*, const void*, unsigned int);
|
||||
MYSQL_LEX_STRING *(*thd_make_lex_string_func)(void*, MYSQL_LEX_STRING *,
|
||||
const char *, unsigned int, int);
|
||||
} *thd_alloc_service;
|
||||
void *thd_alloc(void* thd, unsigned int size);
|
||||
void *thd_calloc(void* thd, unsigned int size);
|
||||
char *thd_strdup(void* thd, const char *str);
|
||||
char *thd_strmake(void* thd, const char *str, unsigned int size);
|
||||
void *thd_memdup(void* thd, const void* str, unsigned int size);
|
||||
MYSQL_LEX_STRING *thd_make_lex_string(void* thd, MYSQL_LEX_STRING *lex_str,
|
||||
const char *str, unsigned int size,
|
||||
int allocate_lex_string);
|
||||
struct st_mysql_xid {
|
||||
long formatID;
|
||||
long gtrid_length;
|
||||
@ -17,7 +44,8 @@ enum enum_mysql_show_type
|
||||
{
|
||||
SHOW_UNDEF, SHOW_BOOL, SHOW_INT, SHOW_LONG,
|
||||
SHOW_LONGLONG, SHOW_CHAR, SHOW_CHAR_PTR,
|
||||
SHOW_ARRAY, SHOW_FUNC, SHOW_DOUBLE
|
||||
SHOW_ARRAY, SHOW_FUNC, SHOW_DOUBLE,
|
||||
SHOW_always_last
|
||||
};
|
||||
struct st_mysql_show_var {
|
||||
const char *name;
|
||||
@ -107,9 +135,9 @@ struct st_mysql_information_schema
|
||||
{
|
||||
int interface_version;
|
||||
};
|
||||
struct Mysql_replication {
|
||||
int interface_version;
|
||||
};
|
||||
struct Mysql_replication {
|
||||
int interface_version;
|
||||
};
|
||||
struct st_mysql_value
|
||||
{
|
||||
int (*value_type)(struct st_mysql_value *);
|
||||
@ -130,22 +158,7 @@ void thd_inc_row_count(void* thd);
|
||||
int mysql_tmpfile(const char *prefix);
|
||||
int thd_killed(const void* thd);
|
||||
unsigned long thd_get_thread_id(const void* thd);
|
||||
void *thd_alloc(void* thd, unsigned int size);
|
||||
void *thd_calloc(void* thd, unsigned int size);
|
||||
char *thd_strdup(void* thd, const char *str);
|
||||
char *thd_strmake(void* thd, const char *str, unsigned int size);
|
||||
void *thd_memdup(void* thd, const void* str, unsigned int size);
|
||||
MYSQL_LEX_STRING *thd_make_lex_string(void* thd, MYSQL_LEX_STRING *lex_str,
|
||||
const char *str, unsigned int size,
|
||||
int allocate_lex_string);
|
||||
void thd_get_xid(const void* thd, MYSQL_XID *xid);
|
||||
void mysql_query_cache_invalidate4(void* thd,
|
||||
const char *key, unsigned int key_length,
|
||||
int using_trx);
|
||||
int get_user_var_int(const char *name,
|
||||
long long int *value, int *null_value);
|
||||
int get_user_var_real(const char *name,
|
||||
double *value, int *null_value);
|
||||
int get_user_var_str(const char *name,
|
||||
char *value, unsigned long len,
|
||||
unsigned int precision, int *null_value);
|
||||
|
98
include/mysql/service_my_snprintf.h
Normal file
98
include/mysql/service_my_snprintf.h
Normal file
@ -0,0 +1,98 @@
|
||||
#ifndef MYSQL_SERVICE_MY_SNPRINTF_INCLUDED
|
||||
/* Copyright (C) 2009 Sun Microsystems, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
/**
|
||||
@file
|
||||
my_snprintf service
|
||||
|
||||
Portable and limited vsnprintf() implementation.
|
||||
|
||||
This is a portable, limited vsnprintf() implementation, with some
|
||||
extra features. "Portable" means that it'll produce identical result
|
||||
on all platforms (for example, on Windows and Linux system printf %e
|
||||
formats the exponent differently, on different systems %p either
|
||||
prints leading 0x or not, %s may accept null pointer or crash on
|
||||
it). "Limited" means that it does not support all the C89 features.
|
||||
But it supports few extensions, not in any standard.
|
||||
|
||||
my_vsnprintf(to, n, fmt, ap)
|
||||
|
||||
@param[out] to A buffer to store the result in
|
||||
@param[in] n Store up to n-1 characters, followed by an end 0
|
||||
@param[in] fmt printf-like format string
|
||||
@param[in] ap Arguments
|
||||
|
||||
@return a number of bytes written to a buffer *excluding* terminating '\0'
|
||||
|
||||
@post
|
||||
The syntax of a format string is generally the same:
|
||||
% <flag> <width> <precision> <length modifier> <format>
|
||||
where everithing but the format is optional.
|
||||
|
||||
Three one-character flags are recognized:
|
||||
'0' has the standard zero-padding semantics;
|
||||
'-' is parsed, but silently ignored;
|
||||
'`' (backtick) is only supported for strings (%s) and means that the
|
||||
string will be quoted according to MySQL identifier quoting rules.
|
||||
|
||||
Both <width> and <precision> can be specified as numbers or '*'.
|
||||
|
||||
<length modifier> can be 'l', 'll', or 'z'.
|
||||
|
||||
Supported formats are 's' (null pointer is accepted, printed as
|
||||
"(null)"), 'b' (extension, see below), 'c', 'd', 'u', 'x',
|
||||
'X', 'p' (works as 0x%x).
|
||||
|
||||
Standard syntax for positional arguments $n is supported.
|
||||
|
||||
Extensions:
|
||||
|
||||
Flag '`' (backtick): see above.
|
||||
|
||||
Format 'b': binary buffer, prints exactly <precision> bytes from the
|
||||
argument, without stopping at '\0'.
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
extern struct my_snprintf_service_st {
|
||||
size_t (*my_snprintf_type)(char*, size_t, const char*, ...);
|
||||
size_t (*my_vsnprintf_type)(char *, size_t, const char*, va_list);
|
||||
} *my_snprintf_service;
|
||||
|
||||
#ifdef MYSQL_DYNAMIC_PLUGIN
|
||||
|
||||
#define my_vsnprintf my_snprintf_service->my_vsnprintf_type
|
||||
#define my_snprintf my_snprintf_service->my_snprintf_type
|
||||
|
||||
#else
|
||||
|
||||
size_t my_snprintf(char* to, size_t n, const char* fmt, ...);
|
||||
size_t my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap);
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#define MYSQL_SERVICE_MY_SNPRINTF_INCLUDED
|
||||
#endif
|
||||
|
128
include/mysql/service_thd_alloc.h
Normal file
128
include/mysql/service_thd_alloc.h
Normal file
@ -0,0 +1,128 @@
|
||||
#ifndef MYSQL_SERVICE_THD_ALLOC_INCLUDED
|
||||
/* Copyright (C) 2009 Sun Microsystems, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
/**
|
||||
@file
|
||||
This service provdes functions to allocate memory in a connection local
|
||||
memory pool. The memory allocated there will be automatically freed at the
|
||||
end of the statement, don't use it for allocations that should live longer
|
||||
than that. For short living allocations this is more efficient than
|
||||
using my_malloc and friends, and automatic "garbage collection" allows not
|
||||
to think about memory leaks.
|
||||
|
||||
The pool is best for small to medium objects, don't use it for large
|
||||
allocations - they are better served with my_malloc.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct st_mysql_lex_string
|
||||
{
|
||||
char *str;
|
||||
size_t length;
|
||||
};
|
||||
typedef struct st_mysql_lex_string MYSQL_LEX_STRING;
|
||||
|
||||
extern struct thd_alloc_service_st {
|
||||
void *(*thd_alloc_func)(MYSQL_THD, unsigned int);
|
||||
void *(*thd_calloc_func)(MYSQL_THD, unsigned int);
|
||||
char *(*thd_strdup_func)(MYSQL_THD, const char *);
|
||||
char *(*thd_strmake_func)(MYSQL_THD, const char *, unsigned int);
|
||||
void *(*thd_memdup_func)(MYSQL_THD, const void*, unsigned int);
|
||||
MYSQL_LEX_STRING *(*thd_make_lex_string_func)(MYSQL_THD, MYSQL_LEX_STRING *,
|
||||
const char *, unsigned int, int);
|
||||
} *thd_alloc_service;
|
||||
|
||||
#ifdef MYSQL_DYNAMIC_PLUGIN
|
||||
|
||||
#define thd_alloc(thd,size) (thd_alloc_service->thd_alloc_func((thd), (size)))
|
||||
|
||||
#define thd_calloc(thd,size) (thd_alloc_service->thd_calloc_func((thd), (size)))
|
||||
|
||||
#define thd_strdup(thd,str) (thd_alloc_service->thd_strdup_func((thd), (str)))
|
||||
|
||||
#define thd_strmake(thd,str,size) \
|
||||
(thd_alloc_service->thd_strmake_func((thd), (str), (size)))
|
||||
|
||||
#define thd_memdup(thd,str,size) \
|
||||
(thd_alloc_service->thd_memdup_func((thd), (str), (size)))
|
||||
|
||||
#define thd_make_lex_string(thd, lex_str, str, size, allocate_lex_string) \
|
||||
(thd_alloc_service->thd_make_lex_string_func((thd), (lex_str), (str), \
|
||||
(size), (allocate_lex_string)))
|
||||
|
||||
#else
|
||||
|
||||
/**
|
||||
Allocate memory in the connection's local memory pool
|
||||
|
||||
@details
|
||||
When properly used in place of @c my_malloc(), this can significantly
|
||||
improve concurrency. Don't use this or related functions to allocate
|
||||
large chunks of memory. Use for temporary storage only. The memory
|
||||
will be freed automatically at the end of the statement; no explicit
|
||||
code is required to prevent memory leaks.
|
||||
|
||||
@see alloc_root()
|
||||
*/
|
||||
void *thd_alloc(MYSQL_THD thd, unsigned int size);
|
||||
/**
|
||||
@see thd_alloc()
|
||||
*/
|
||||
void *thd_calloc(MYSQL_THD thd, unsigned int size);
|
||||
/**
|
||||
@see thd_alloc()
|
||||
*/
|
||||
char *thd_strdup(MYSQL_THD thd, const char *str);
|
||||
/**
|
||||
@see thd_alloc()
|
||||
*/
|
||||
char *thd_strmake(MYSQL_THD thd, const char *str, unsigned int size);
|
||||
/**
|
||||
@see thd_alloc()
|
||||
*/
|
||||
void *thd_memdup(MYSQL_THD thd, const void* str, unsigned int size);
|
||||
|
||||
/**
|
||||
Create a LEX_STRING in this connection's local memory pool
|
||||
|
||||
@param thd user thread connection handle
|
||||
@param lex_str pointer to LEX_STRING object to be initialized
|
||||
@param str initializer to be copied into lex_str
|
||||
@param size length of str, in bytes
|
||||
@param allocate_lex_string flag: if TRUE, allocate new LEX_STRING object,
|
||||
instead of using lex_str value
|
||||
@return NULL on failure, or pointer to the LEX_STRING object
|
||||
|
||||
@see thd_alloc()
|
||||
*/
|
||||
MYSQL_LEX_STRING *thd_make_lex_string(MYSQL_THD thd, MYSQL_LEX_STRING *lex_str,
|
||||
const char *str, unsigned int size,
|
||||
int allocate_lex_string);
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#define MYSQL_SERVICE_THD_ALLOC_INCLUDED
|
||||
#endif
|
||||
|
30
include/mysql/services.h
Normal file
30
include/mysql/services.h
Normal file
@ -0,0 +1,30 @@
|
||||
#ifndef MYSQL_SERVICES_INCLUDED
|
||||
/* Copyright (C) 2009 Sun Microsystems, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <mysql/service_my_snprintf.h>
|
||||
#include <mysql/service_thd_alloc.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#define MYSQL_SERVICES_INCLUDED
|
||||
#endif
|
||||
|
@ -146,6 +146,7 @@ enum enum_server_command
|
||||
#define CLIENT_SECURE_CONNECTION 32768 /* New 4.1 authentication */
|
||||
#define CLIENT_MULTI_STATEMENTS (1UL << 16) /* Enable/disable multi-stmt support */
|
||||
#define CLIENT_MULTI_RESULTS (1UL << 17) /* Enable/disable multi-results */
|
||||
#define CLIENT_PS_MULTI_RESULTS (1UL << 18) /* Multi-results in PS-protocol */
|
||||
|
||||
#define CLIENT_SSL_VERIFY_SERVER_CERT (1UL << 30)
|
||||
#define CLIENT_REMEMBER_OPTIONS (1UL << 31)
|
||||
@ -169,6 +170,7 @@ enum enum_server_command
|
||||
CLIENT_SECURE_CONNECTION | \
|
||||
CLIENT_MULTI_STATEMENTS | \
|
||||
CLIENT_MULTI_RESULTS | \
|
||||
CLIENT_PS_MULTI_RESULTS | \
|
||||
CLIENT_SSL_VERIFY_SERVER_CERT | \
|
||||
CLIENT_REMEMBER_OPTIONS)
|
||||
|
||||
@ -207,6 +209,11 @@ enum enum_server_command
|
||||
#define SERVER_STATUS_METADATA_CHANGED 1024
|
||||
#define SERVER_QUERY_WAS_SLOW 2048
|
||||
|
||||
/**
|
||||
To mark ResultSet containing output parameter values.
|
||||
*/
|
||||
#define SERVER_PS_OUT_PARAMS 4096
|
||||
|
||||
/**
|
||||
Server status flags that must be cleared when starting
|
||||
execution of a new SQL statement.
|
||||
@ -257,24 +264,23 @@ typedef struct st_net {
|
||||
unsigned int *return_status;
|
||||
unsigned char reading_or_writing;
|
||||
char save_char;
|
||||
my_bool unused0; /* Please remove with the next incompatible ABI change. */
|
||||
my_bool unused; /* Please remove with the next incompatible ABI change */
|
||||
my_bool compress;
|
||||
my_bool unused1; /* Please remove with the next incompatible ABI change. */
|
||||
my_bool unused2; /* Please remove with the next incompatible ABI change */
|
||||
my_bool compress;
|
||||
my_bool unused3; /* Please remove with the next incompatible ABI change. */
|
||||
/*
|
||||
Pointer to query object in query cache, do not equal NULL (0) for
|
||||
queries in cache that have not stored its results yet
|
||||
*/
|
||||
#endif
|
||||
/*
|
||||
'query_cache_query' should be accessed only via query cache
|
||||
functions and methods to maintain proper locking.
|
||||
Unused, please remove with the next incompatible ABI change.
|
||||
*/
|
||||
unsigned char *query_cache_query;
|
||||
unsigned char *unused;
|
||||
unsigned int last_errno;
|
||||
unsigned char error;
|
||||
my_bool unused2; /* Please remove with the next incompatible ABI change. */
|
||||
my_bool return_errno;
|
||||
my_bool unused4; /* Please remove with the next incompatible ABI change. */
|
||||
my_bool unused5; /* Please remove with the next incompatible ABI change. */
|
||||
/** Client library error message buffer. Actually belongs to struct MYSQL. */
|
||||
char last_error[MYSQL_ERRMSG_SIZE];
|
||||
/** Client library sqlstate buffer. Set along with the error message. */
|
||||
@ -412,10 +418,6 @@ void my_net_set_write_timeout(NET *net, uint timeout);
|
||||
void my_net_set_read_timeout(NET *net, uint timeout);
|
||||
#endif
|
||||
|
||||
/*
|
||||
The following function is not meant for normal usage
|
||||
Currently it's used internally by manager.c
|
||||
*/
|
||||
struct sockaddr;
|
||||
int my_connect(my_socket s, const struct sockaddr *name, unsigned int namelen,
|
||||
unsigned int timeout);
|
||||
|
24
include/service_versions.h
Normal file
24
include/service_versions.h
Normal file
@ -0,0 +1,24 @@
|
||||
/* Copyright (C) 2009 Sun Microsystems, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
#ifdef _WIN32
|
||||
#define SERVICE_VERSION __declspec(dllexport) void *
|
||||
#else
|
||||
#define SERVICE_VERSION void *
|
||||
#endif
|
||||
|
||||
#define VERSION_my_snprintf 0x0100
|
||||
#define VERSION_thd_alloc 0x0100
|
||||
|
@ -73,7 +73,7 @@ SET(CLIENT_SOURCES ../mysys/array.c ../strings/bchange.c ../strings/bmove.c
|
||||
../mysys/hash.c ../mysys/my_sleep.c ../mysys/default_modify.c
|
||||
get_password.c ../strings/int2str.c ../strings/is_prefix.c
|
||||
libmysql.c ../mysys/list.c ../strings/llstr.c
|
||||
../strings/longlong2str.c manager.c ../mysys/mf_arr_appstr.c ../mysys/mf_cache.c
|
||||
../strings/longlong2str.c ../mysys/mf_arr_appstr.c ../mysys/mf_cache.c
|
||||
../mysys/mf_dirname.c ../mysys/mf_fn_ext.c ../mysys/mf_format.c
|
||||
../mysys/mf_iocache.c ../mysys/mf_iocache2.c ../mysys/mf_loadpath.c
|
||||
../mysys/mf_pack.c ../mysys/mf_path.c ../mysys/mf_tempfile.c ../mysys/mf_unixpath.c
|
||||
|
@ -31,7 +31,7 @@ pkglib_LTLIBRARIES = $(target)
|
||||
noinst_PROGRAMS = conf_to_src
|
||||
|
||||
|
||||
target_sources = libmysql.c password.c manager.c \
|
||||
target_sources = libmysql.c password.c \
|
||||
get_password.c errmsg.c
|
||||
|
||||
mystringsobjects = strmov.lo strxmov.lo strxnmov.lo strnmov.lo \
|
||||
|
@ -22,9 +22,13 @@
|
||||
extern uint mysql_port;
|
||||
extern char * mysql_unix_port;
|
||||
|
||||
#define CLIENT_CAPABILITIES (CLIENT_LONG_PASSWORD | CLIENT_LONG_FLAG | \
|
||||
CLIENT_TRANSACTIONS | \
|
||||
CLIENT_PROTOCOL_41 | CLIENT_SECURE_CONNECTION)
|
||||
#define CLIENT_CAPABILITIES (CLIENT_LONG_PASSWORD | \
|
||||
CLIENT_LONG_FLAG | \
|
||||
CLIENT_TRANSACTIONS | \
|
||||
CLIENT_PROTOCOL_41 | \
|
||||
CLIENT_SECURE_CONNECTION | \
|
||||
CLIENT_MULTI_RESULTS | \
|
||||
CLIENT_PS_MULTI_RESULTS)
|
||||
|
||||
sig_handler my_pipe_sig_handler(int sig);
|
||||
void read_user_name(char *name);
|
||||
|
@ -85,6 +85,7 @@ const char *client_errors[]=
|
||||
"Lost connection to MySQL server at '%s', system error: %d",
|
||||
"Statement closed indirectly because of a preceeding %s() call",
|
||||
"The number of columns in the result set differs from the number of bound buffers. You must reset the statement, rebind the result set columns, and execute the statement again",
|
||||
"This handle is already connected. Use a separate handle for each connection."
|
||||
""
|
||||
};
|
||||
|
||||
@ -151,6 +152,7 @@ const char *client_errors[]=
|
||||
"Lost connection to MySQL server at '%s', system error: %d",
|
||||
"Statement closed indirectly because of a preceeding %s() call",
|
||||
"The number of columns in the result set differs from the number of bound buffers. You must reset the statement, rebind the result set columns, and execute the statement again",
|
||||
"This handle is already connected. Use a separate handle for each connection."
|
||||
""
|
||||
};
|
||||
|
||||
@ -215,6 +217,7 @@ const char *client_errors[]=
|
||||
"Lost connection to MySQL server at '%s', system error: %d",
|
||||
"Statement closed indirectly because of a preceeding %s() call",
|
||||
"The number of columns in the result set differs from the number of bound buffers. You must reset the statement, rebind the result set columns, and execute the statement again",
|
||||
"This handle is already connected. Use a separate handle for each connection."
|
||||
""
|
||||
};
|
||||
#endif
|
||||
|
@ -131,7 +131,7 @@ int STDCALL mysql_server_init(int argc __attribute__((unused)),
|
||||
mysql_port = MYSQL_PORT;
|
||||
#ifndef MSDOS
|
||||
{
|
||||
struct servent *serv_ptr;
|
||||
struct servent *serv_ptr __attribute__((unused));
|
||||
char *env;
|
||||
|
||||
/*
|
||||
@ -249,16 +249,6 @@ void STDCALL mysql_thread_end()
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
Let the user specify that we don't want SIGPIPE; This doesn't however work
|
||||
with threaded applications as we can have multiple read in progress.
|
||||
*/
|
||||
static MYSQL* spawn_init(MYSQL* parent, const char* host,
|
||||
unsigned int port,
|
||||
const char* user,
|
||||
const char* passwd);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
Expand wildcard to a sql string
|
||||
@ -320,7 +310,7 @@ mysql_debug(const char *debug __attribute__((unused)))
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
Close the server connection if we get a SIGPIPE
|
||||
Ignore SIGPIPE handler
|
||||
ARGSUSED
|
||||
**************************************************************************/
|
||||
|
||||
@ -333,305 +323,6 @@ my_pipe_sig_handler(int sig __attribute__((unused)))
|
||||
#endif
|
||||
}
|
||||
|
||||
/* perform query on master */
|
||||
my_bool STDCALL mysql_master_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length)
|
||||
{
|
||||
DBUG_ENTER("mysql_master_query");
|
||||
if (mysql_master_send_query(mysql, q, length))
|
||||
DBUG_RETURN(1);
|
||||
DBUG_RETURN((*mysql->methods->read_query_result)(mysql));
|
||||
}
|
||||
|
||||
my_bool STDCALL mysql_master_send_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length)
|
||||
{
|
||||
MYSQL *master = mysql->master;
|
||||
DBUG_ENTER("mysql_master_send_query");
|
||||
if (!master->net.vio && !mysql_real_connect(master,0,0,0,0,0,0,0))
|
||||
DBUG_RETURN(1);
|
||||
master->reconnect= 1;
|
||||
mysql->last_used_con = master;
|
||||
DBUG_RETURN(simple_command(master, COM_QUERY, (const uchar*) q, length, 1));
|
||||
}
|
||||
|
||||
|
||||
/* perform query on slave */
|
||||
my_bool STDCALL mysql_slave_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length)
|
||||
{
|
||||
DBUG_ENTER("mysql_slave_query");
|
||||
if (mysql_slave_send_query(mysql, q, length))
|
||||
DBUG_RETURN(1);
|
||||
DBUG_RETURN((*mysql->methods->read_query_result)(mysql));
|
||||
}
|
||||
|
||||
|
||||
my_bool STDCALL mysql_slave_send_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length)
|
||||
{
|
||||
MYSQL* last_used_slave, *slave_to_use = 0;
|
||||
DBUG_ENTER("mysql_slave_send_query");
|
||||
|
||||
if ((last_used_slave = mysql->last_used_slave))
|
||||
slave_to_use = last_used_slave->next_slave;
|
||||
else
|
||||
slave_to_use = mysql->next_slave;
|
||||
/*
|
||||
Next_slave is always safe to use - we have a circular list of slaves
|
||||
if there are no slaves, mysql->next_slave == mysql
|
||||
*/
|
||||
mysql->last_used_con = mysql->last_used_slave = slave_to_use;
|
||||
if (!slave_to_use->net.vio && !mysql_real_connect(slave_to_use, 0,0,0,
|
||||
0,0,0,0))
|
||||
DBUG_RETURN(1);
|
||||
slave_to_use->reconnect= 1;
|
||||
DBUG_RETURN(simple_command(slave_to_use, COM_QUERY, (const uchar*) q,
|
||||
length, 1));
|
||||
}
|
||||
|
||||
|
||||
/* enable/disable parsing of all queries to decide
|
||||
if they go on master or slave */
|
||||
void STDCALL mysql_enable_rpl_parse(MYSQL* mysql)
|
||||
{
|
||||
mysql->options.rpl_parse = 1;
|
||||
}
|
||||
|
||||
void STDCALL mysql_disable_rpl_parse(MYSQL* mysql)
|
||||
{
|
||||
mysql->options.rpl_parse = 0;
|
||||
}
|
||||
|
||||
/* get the value of the parse flag */
|
||||
int STDCALL mysql_rpl_parse_enabled(MYSQL* mysql)
|
||||
{
|
||||
return mysql->options.rpl_parse;
|
||||
}
|
||||
|
||||
/* enable/disable reads from master */
|
||||
void STDCALL mysql_enable_reads_from_master(MYSQL* mysql)
|
||||
{
|
||||
mysql->options.no_master_reads = 0;
|
||||
}
|
||||
|
||||
void STDCALL mysql_disable_reads_from_master(MYSQL* mysql)
|
||||
{
|
||||
mysql->options.no_master_reads = 1;
|
||||
}
|
||||
|
||||
/* get the value of the master read flag */
|
||||
my_bool STDCALL mysql_reads_from_master_enabled(MYSQL* mysql)
|
||||
{
|
||||
return !(mysql->options.no_master_reads);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
We may get an error while doing replication internals.
|
||||
In this case, we add a special explanation to the original
|
||||
error
|
||||
*/
|
||||
|
||||
static void expand_error(MYSQL* mysql, int error)
|
||||
{
|
||||
char tmp[MYSQL_ERRMSG_SIZE];
|
||||
char *p;
|
||||
uint err_length;
|
||||
strmake(tmp, mysql->net.last_error, MYSQL_ERRMSG_SIZE-1);
|
||||
p = strmake(mysql->net.last_error, ER(error), MYSQL_ERRMSG_SIZE-1);
|
||||
err_length= (uint) (p - mysql->net.last_error);
|
||||
strmake(p, tmp, MYSQL_ERRMSG_SIZE-1 - err_length);
|
||||
mysql->net.last_errno = error;
|
||||
}
|
||||
|
||||
/*
|
||||
This function assumes we have just called SHOW SLAVE STATUS and have
|
||||
read the given result and row
|
||||
*/
|
||||
|
||||
static my_bool get_master(MYSQL* mysql, MYSQL_RES* res, MYSQL_ROW row)
|
||||
{
|
||||
MYSQL* master;
|
||||
DBUG_ENTER("get_master");
|
||||
if (mysql_num_fields(res) < 3)
|
||||
DBUG_RETURN(1); /* safety */
|
||||
|
||||
/* use the same username and password as the original connection */
|
||||
if (!(master = spawn_init(mysql, row[0], atoi(row[2]), 0, 0)))
|
||||
DBUG_RETURN(1);
|
||||
mysql->master = master;
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Assuming we already know that mysql points to a master connection,
|
||||
retrieve all the slaves
|
||||
*/
|
||||
|
||||
static my_bool get_slaves_from_master(MYSQL* mysql)
|
||||
{
|
||||
MYSQL_RES* res = 0;
|
||||
MYSQL_ROW row;
|
||||
my_bool error = 1;
|
||||
int has_auth_info;
|
||||
int port_ind;
|
||||
DBUG_ENTER("get_slaves_from_master");
|
||||
|
||||
if (!mysql->net.vio && !mysql_real_connect(mysql,0,0,0,0,0,0,0))
|
||||
{
|
||||
expand_error(mysql, CR_PROBE_MASTER_CONNECT);
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
mysql->reconnect= 1;
|
||||
|
||||
if (mysql_query(mysql, "SHOW SLAVE HOSTS") ||
|
||||
!(res = mysql_store_result(mysql)))
|
||||
{
|
||||
expand_error(mysql, CR_PROBE_SLAVE_HOSTS);
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
switch (mysql_num_fields(res)) {
|
||||
case 5:
|
||||
has_auth_info = 0;
|
||||
port_ind=2;
|
||||
break;
|
||||
case 7:
|
||||
has_auth_info = 1;
|
||||
port_ind=4;
|
||||
break;
|
||||
default:
|
||||
goto err;
|
||||
}
|
||||
|
||||
while ((row = mysql_fetch_row(res)))
|
||||
{
|
||||
MYSQL* slave;
|
||||
const char* tmp_user, *tmp_pass;
|
||||
|
||||
if (has_auth_info)
|
||||
{
|
||||
tmp_user = row[2];
|
||||
tmp_pass = row[3];
|
||||
}
|
||||
else
|
||||
{
|
||||
tmp_user = mysql->user;
|
||||
tmp_pass = mysql->passwd;
|
||||
}
|
||||
|
||||
if (!(slave = spawn_init(mysql, row[1], atoi(row[port_ind]),
|
||||
tmp_user, tmp_pass)))
|
||||
goto err;
|
||||
|
||||
/* Now add slave into the circular linked list */
|
||||
slave->next_slave = mysql->next_slave;
|
||||
mysql->next_slave = slave;
|
||||
}
|
||||
error = 0;
|
||||
err:
|
||||
if (res)
|
||||
mysql_free_result(res);
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
|
||||
|
||||
my_bool STDCALL mysql_rpl_probe(MYSQL* mysql)
|
||||
{
|
||||
MYSQL_RES *res= 0;
|
||||
MYSQL_ROW row;
|
||||
my_bool error= 1;
|
||||
DBUG_ENTER("mysql_rpl_probe");
|
||||
|
||||
/*
|
||||
First determine the replication role of the server we connected to
|
||||
the most reliable way to do this is to run SHOW SLAVE STATUS and see
|
||||
if we have a non-empty master host. This is still not fool-proof -
|
||||
it is not a sin to have a master that has a dormant slave thread with
|
||||
a non-empty master host. However, it is more reliable to check
|
||||
for empty master than whether the slave thread is actually running
|
||||
*/
|
||||
if (mysql_query(mysql, "SHOW SLAVE STATUS") ||
|
||||
!(res = mysql_store_result(mysql)))
|
||||
{
|
||||
expand_error(mysql, CR_PROBE_SLAVE_STATUS);
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
row= mysql_fetch_row(res);
|
||||
/*
|
||||
Check master host for emptiness/NULL
|
||||
For MySQL 4.0 it's enough to check for row[0]
|
||||
*/
|
||||
if (row && row[0] && *(row[0]))
|
||||
{
|
||||
/* this is a slave, ask it for the master */
|
||||
if (get_master(mysql, res, row) || get_slaves_from_master(mysql))
|
||||
goto err;
|
||||
}
|
||||
else
|
||||
{
|
||||
mysql->master = mysql;
|
||||
if (get_slaves_from_master(mysql))
|
||||
goto err;
|
||||
}
|
||||
|
||||
error = 0;
|
||||
err:
|
||||
if (res)
|
||||
mysql_free_result(res);
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Make a not so fool-proof decision on where the query should go, to
|
||||
the master or the slave. Ideally the user should always make this
|
||||
decision himself with mysql_master_query() or mysql_slave_query().
|
||||
However, to be able to more easily port the old code, we support the
|
||||
option of an educated guess - this should work for most applications,
|
||||
however, it may make the wrong decision in some particular cases. If
|
||||
that happens, the user would have to change the code to call
|
||||
mysql_master_query() or mysql_slave_query() explicitly in the place
|
||||
where we have made the wrong decision
|
||||
*/
|
||||
|
||||
enum mysql_rpl_type
|
||||
STDCALL mysql_rpl_query_type(const char* q, int len)
|
||||
{
|
||||
const char *q_end= q + len;
|
||||
for (; q < q_end; ++q)
|
||||
{
|
||||
char c;
|
||||
if (my_isalpha(&my_charset_latin1, (c= *q)))
|
||||
{
|
||||
switch (my_tolower(&my_charset_latin1,c)) {
|
||||
case 'i': /* insert */
|
||||
case 'u': /* update or unlock tables */
|
||||
case 'l': /* lock tables or load data infile */
|
||||
case 'd': /* drop or delete */
|
||||
case 'a': /* alter */
|
||||
return MYSQL_RPL_MASTER;
|
||||
case 'c': /* create or check */
|
||||
return my_tolower(&my_charset_latin1,q[1]) == 'h' ? MYSQL_RPL_ADMIN :
|
||||
MYSQL_RPL_MASTER;
|
||||
case 's': /* select or show */
|
||||
return my_tolower(&my_charset_latin1,q[1]) == 'h' ? MYSQL_RPL_ADMIN :
|
||||
MYSQL_RPL_SLAVE;
|
||||
case 'f': /* flush */
|
||||
case 'r': /* repair */
|
||||
case 'g': /* grant */
|
||||
return MYSQL_RPL_ADMIN;
|
||||
default:
|
||||
return MYSQL_RPL_SLAVE;
|
||||
}
|
||||
}
|
||||
}
|
||||
return MYSQL_RPL_MASTER; /* By default, send to master */
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
Connect to sql server
|
||||
@ -1093,68 +784,6 @@ mysql_query(MYSQL *mysql, const char *query)
|
||||
}
|
||||
|
||||
|
||||
static MYSQL* spawn_init(MYSQL* parent, const char* host,
|
||||
unsigned int port, const char* user,
|
||||
const char* passwd)
|
||||
{
|
||||
MYSQL* child;
|
||||
DBUG_ENTER("spawn_init");
|
||||
if (!(child= mysql_init(0)))
|
||||
DBUG_RETURN(0);
|
||||
|
||||
child->options.user= my_strdup((user) ? user :
|
||||
(parent->user ? parent->user :
|
||||
parent->options.user), MYF(0));
|
||||
child->options.password= my_strdup((passwd) ? passwd :
|
||||
(parent->passwd ?
|
||||
parent->passwd :
|
||||
parent->options.password), MYF(0));
|
||||
child->options.port= port;
|
||||
child->options.host= my_strdup((host) ? host :
|
||||
(parent->host ?
|
||||
parent->host :
|
||||
parent->options.host), MYF(0));
|
||||
if (parent->db)
|
||||
child->options.db= my_strdup(parent->db, MYF(0));
|
||||
else if (parent->options.db)
|
||||
child->options.db= my_strdup(parent->options.db, MYF(0));
|
||||
|
||||
/*
|
||||
rpl_pivot is set to 1 in mysql_init(); Reset it as we are not doing
|
||||
replication here
|
||||
*/
|
||||
child->rpl_pivot= 0;
|
||||
DBUG_RETURN(child);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
STDCALL mysql_set_master(MYSQL* mysql, const char* host,
|
||||
unsigned int port, const char* user,
|
||||
const char* passwd)
|
||||
{
|
||||
if (mysql->master != mysql && !mysql->master->rpl_pivot)
|
||||
mysql_close(mysql->master);
|
||||
if (!(mysql->master = spawn_init(mysql, host, port, user, passwd)))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
STDCALL mysql_add_slave(MYSQL* mysql, const char* host,
|
||||
unsigned int port,
|
||||
const char* user,
|
||||
const char* passwd)
|
||||
{
|
||||
MYSQL* slave;
|
||||
if (!(slave = spawn_init(mysql, host, port, user, passwd)))
|
||||
return 1;
|
||||
slave->next_slave = mysql->next_slave;
|
||||
mysql->next_slave = slave;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
Return next field of the query results
|
||||
**************************************************************************/
|
||||
@ -1483,17 +1112,17 @@ MYSQL_FIELD_OFFSET STDCALL mysql_field_tell(MYSQL_RES *res)
|
||||
|
||||
unsigned int STDCALL mysql_field_count(MYSQL *mysql)
|
||||
{
|
||||
return mysql->last_used_con->field_count;
|
||||
return mysql->field_count;
|
||||
}
|
||||
|
||||
my_ulonglong STDCALL mysql_affected_rows(MYSQL *mysql)
|
||||
{
|
||||
return mysql->last_used_con->affected_rows;
|
||||
return mysql->affected_rows;
|
||||
}
|
||||
|
||||
my_ulonglong STDCALL mysql_insert_id(MYSQL *mysql)
|
||||
{
|
||||
return mysql->last_used_con->insert_id;
|
||||
return mysql->insert_id;
|
||||
}
|
||||
|
||||
const char *STDCALL mysql_sqlstate(MYSQL *mysql)
|
||||
@ -1629,6 +1258,20 @@ mysql_real_escape_string(MYSQL *mysql, char *to,const char *from,
|
||||
return (uint) escape_string_for_mysql(mysql->charset, to, 0, from, length);
|
||||
}
|
||||
|
||||
|
||||
char * STDCALL
|
||||
mysql_odbc_escape_string(MYSQL *mysql __attribute__((unused)),
|
||||
char *to __attribute__((unused)),
|
||||
ulong to_length __attribute__((unused)),
|
||||
const char *from __attribute__((unused)),
|
||||
ulong from_length __attribute__((unused)),
|
||||
void *param __attribute__((unused)),
|
||||
char * (*extend_buffer)(void *, char *, ulong *)
|
||||
__attribute__((unused)))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void STDCALL
|
||||
myodbc_remove_escape(MYSQL *mysql,char *name)
|
||||
{
|
||||
@ -1858,7 +1501,6 @@ my_bool cli_read_prepare_result(MYSQL *mysql, MYSQL_STMT *stmt)
|
||||
MYSQL_DATA *fields_data;
|
||||
DBUG_ENTER("cli_read_prepare_result");
|
||||
|
||||
mysql= mysql->last_used_con;
|
||||
if ((packet_length= cli_safe_read(mysql)) == packet_error)
|
||||
DBUG_RETURN(1);
|
||||
mysql->warning_count= 0;
|
||||
@ -2092,7 +1734,9 @@ static void alloc_stmt_fields(MYSQL_STMT *stmt)
|
||||
{
|
||||
MYSQL_FIELD *fields, *field, *end;
|
||||
MEM_ROOT *alloc= &stmt->mem_root;
|
||||
MYSQL *mysql= stmt->mysql->last_used_con;
|
||||
MYSQL *mysql= stmt->mysql;
|
||||
|
||||
DBUG_ASSERT(mysql->field_count);
|
||||
|
||||
stmt->field_count= mysql->field_count;
|
||||
|
||||
@ -2115,18 +1759,21 @@ static void alloc_stmt_fields(MYSQL_STMT *stmt)
|
||||
field= stmt->fields;
|
||||
field && fields < end; fields++, field++)
|
||||
{
|
||||
field->db = strdup_root(alloc,fields->db);
|
||||
field->table = strdup_root(alloc,fields->table);
|
||||
field->org_table= strdup_root(alloc,fields->org_table);
|
||||
field->name = strdup_root(alloc,fields->name);
|
||||
field->org_name = strdup_root(alloc,fields->org_name);
|
||||
field->charsetnr= fields->charsetnr;
|
||||
field->length = fields->length;
|
||||
field->type = fields->type;
|
||||
field->flags = fields->flags;
|
||||
field->decimals = fields->decimals;
|
||||
field->def = fields->def ? strdup_root(alloc,fields->def): 0;
|
||||
field->max_length= 0;
|
||||
*field= *fields; /* To copy all numeric parts. */
|
||||
field->catalog= strmake_root(alloc, fields->catalog,
|
||||
fields->catalog_length);
|
||||
field->db= strmake_root(alloc, fields->db, fields->db_length);
|
||||
field->table= strmake_root(alloc, fields->table, fields->table_length);
|
||||
field->org_table= strmake_root(alloc, fields->org_table,
|
||||
fields->org_table_length);
|
||||
field->name= strmake_root(alloc, fields->name, fields->name_length);
|
||||
field->org_name= strmake_root(alloc, fields->org_name,
|
||||
fields->org_name_length);
|
||||
field->def= fields->def ? strmake_root(alloc, fields->def,
|
||||
fields->def_length) : 0;
|
||||
field->def_length= field->def ? fields->def_length : 0;
|
||||
field->extension= 0; /* Avoid dangling links. */
|
||||
field->max_length= 0; /* max_length is set in mysql_stmt_store_result() */
|
||||
}
|
||||
}
|
||||
|
||||
@ -2479,7 +2126,6 @@ static my_bool execute(MYSQL_STMT *stmt, char *packet, ulong length)
|
||||
DBUG_ENTER("execute");
|
||||
DBUG_DUMP("packet", (uchar *) packet, length);
|
||||
|
||||
mysql->last_used_con= mysql;
|
||||
int4store(buff, stmt->stmt_id); /* Send stmt id to server */
|
||||
buff[4]= (char) stmt->flags;
|
||||
int4store(buff+5, 1); /* iteration count */
|
||||
@ -2854,6 +2500,33 @@ static void reinit_result_set_metadata(MYSQL_STMT *stmt)
|
||||
}
|
||||
|
||||
|
||||
static void prepare_to_fetch_result(MYSQL_STMT *stmt)
|
||||
{
|
||||
if (stmt->server_status & SERVER_STATUS_CURSOR_EXISTS)
|
||||
{
|
||||
stmt->mysql->status= MYSQL_STATUS_READY;
|
||||
stmt->read_row_func= stmt_read_row_from_cursor;
|
||||
}
|
||||
else if (stmt->flags & CURSOR_TYPE_READ_ONLY)
|
||||
{
|
||||
/*
|
||||
This is a single-row result set, a result set with no rows, EXPLAIN,
|
||||
SHOW VARIABLES, or some other command which either a) bypasses the
|
||||
cursors framework in the server and writes rows directly to the
|
||||
network or b) is more efficient if all (few) result set rows are
|
||||
precached on client and server's resources are freed.
|
||||
*/
|
||||
mysql_stmt_store_result(stmt);
|
||||
}
|
||||
else
|
||||
{
|
||||
stmt->mysql->unbuffered_fetch_owner= &stmt->unbuffered_fetch_cancelled;
|
||||
stmt->unbuffered_fetch_cancelled= FALSE;
|
||||
stmt->read_row_func= stmt_read_row_unbuffered;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Send placeholders data to server (if there are placeholders)
|
||||
and execute prepared statement.
|
||||
@ -2921,28 +2594,7 @@ int STDCALL mysql_stmt_execute(MYSQL_STMT *stmt)
|
||||
if (mysql->field_count)
|
||||
{
|
||||
reinit_result_set_metadata(stmt);
|
||||
if (stmt->server_status & SERVER_STATUS_CURSOR_EXISTS)
|
||||
{
|
||||
mysql->status= MYSQL_STATUS_READY;
|
||||
stmt->read_row_func= stmt_read_row_from_cursor;
|
||||
}
|
||||
else if (stmt->flags & CURSOR_TYPE_READ_ONLY)
|
||||
{
|
||||
/*
|
||||
This is a single-row result set, a result set with no rows, EXPLAIN,
|
||||
SHOW VARIABLES, or some other command which either a) bypasses the
|
||||
cursors framework in the server and writes rows directly to the
|
||||
network or b) is more efficient if all (few) result set rows are
|
||||
precached on client and server's resources are freed.
|
||||
*/
|
||||
mysql_stmt_store_result(stmt);
|
||||
}
|
||||
else
|
||||
{
|
||||
stmt->mysql->unbuffered_fetch_owner= &stmt->unbuffered_fetch_cancelled;
|
||||
stmt->unbuffered_fetch_cancelled= FALSE;
|
||||
stmt->read_row_func= stmt_read_row_unbuffered;
|
||||
}
|
||||
prepare_to_fetch_result(stmt);
|
||||
}
|
||||
DBUG_RETURN(test(stmt->last_errno));
|
||||
}
|
||||
@ -4407,7 +4059,6 @@ static my_bool setup_one_fetch_function(MYSQL_BIND *param, MYSQL_FIELD *field)
|
||||
field->max_length= 10; /* 2003-11-11 */
|
||||
param->skip_result= skip_result_with_length;
|
||||
break;
|
||||
break;
|
||||
case MYSQL_TYPE_DATETIME:
|
||||
case MYSQL_TYPE_TIMESTAMP:
|
||||
param->skip_result= skip_result_with_length;
|
||||
@ -4689,7 +4340,6 @@ int cli_read_binary_rows(MYSQL_STMT *stmt)
|
||||
}
|
||||
|
||||
net = &mysql->net;
|
||||
mysql= mysql->last_used_con;
|
||||
|
||||
while ((pkt_len= cli_safe_read(mysql)) != packet_error)
|
||||
{
|
||||
@ -4787,8 +4437,6 @@ int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt)
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
mysql= mysql->last_used_con;
|
||||
|
||||
if (!stmt->field_count)
|
||||
DBUG_RETURN(0);
|
||||
|
||||
@ -4990,7 +4638,7 @@ static my_bool reset_stmt_handle(MYSQL_STMT *stmt, uint flags)
|
||||
if (stmt->field_count && mysql->status != MYSQL_STATUS_READY)
|
||||
{
|
||||
/* There is a result set and it belongs to this statement */
|
||||
(*mysql->methods->flush_use_result)(mysql);
|
||||
(*mysql->methods->flush_use_result)(mysql, FALSE);
|
||||
if (mysql->unbuffered_fetch_owner)
|
||||
*mysql->unbuffered_fetch_owner= TRUE;
|
||||
mysql->status= MYSQL_STATUS_READY;
|
||||
@ -5074,7 +4722,7 @@ my_bool STDCALL mysql_stmt_close(MYSQL_STMT *stmt)
|
||||
Flush result set of the connection. If it does not belong
|
||||
to this statement, set a warning.
|
||||
*/
|
||||
(*mysql->methods->flush_use_result)(mysql);
|
||||
(*mysql->methods->flush_use_result)(mysql, TRUE);
|
||||
if (mysql->unbuffered_fetch_owner)
|
||||
*mysql->unbuffered_fetch_owner= TRUE;
|
||||
mysql->status= MYSQL_STATUS_READY;
|
||||
@ -5193,8 +4841,7 @@ my_bool STDCALL mysql_more_results(MYSQL *mysql)
|
||||
my_bool res;
|
||||
DBUG_ENTER("mysql_more_results");
|
||||
|
||||
res= ((mysql->last_used_con->server_status & SERVER_MORE_RESULTS_EXISTS) ?
|
||||
1: 0);
|
||||
res= ((mysql->server_status & SERVER_MORE_RESULTS_EXISTS) ? 1: 0);
|
||||
DBUG_PRINT("exit",("More results exists ? %d", res));
|
||||
DBUG_RETURN(res);
|
||||
}
|
||||
@ -5216,13 +4863,56 @@ int STDCALL mysql_next_result(MYSQL *mysql)
|
||||
net_clear_error(&mysql->net);
|
||||
mysql->affected_rows= ~(my_ulonglong) 0;
|
||||
|
||||
if (mysql->last_used_con->server_status & SERVER_MORE_RESULTS_EXISTS)
|
||||
if (mysql->server_status & SERVER_MORE_RESULTS_EXISTS)
|
||||
DBUG_RETURN((*mysql->methods->next_result)(mysql));
|
||||
|
||||
DBUG_RETURN(-1); /* No more results */
|
||||
}
|
||||
|
||||
|
||||
int STDCALL mysql_stmt_next_result(MYSQL_STMT *stmt)
|
||||
{
|
||||
MYSQL *mysql= stmt->mysql;
|
||||
int rc;
|
||||
DBUG_ENTER("mysql_stmt_next_result");
|
||||
|
||||
if (!mysql)
|
||||
DBUG_RETURN(1);
|
||||
|
||||
if (stmt->last_errno)
|
||||
DBUG_RETURN(stmt->last_errno);
|
||||
|
||||
if (mysql->server_status & SERVER_MORE_RESULTS_EXISTS)
|
||||
{
|
||||
if (reset_stmt_handle(stmt, RESET_STORE_RESULT))
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
rc= mysql_next_result(mysql);
|
||||
|
||||
if (rc)
|
||||
{
|
||||
set_stmt_errmsg(stmt, &mysql->net);
|
||||
DBUG_RETURN(rc);
|
||||
}
|
||||
|
||||
stmt->state= MYSQL_STMT_EXECUTE_DONE;
|
||||
stmt->bind_result_done= FALSE;
|
||||
|
||||
if (mysql->field_count)
|
||||
{
|
||||
alloc_stmt_fields(stmt);
|
||||
prepare_to_fetch_result(stmt);
|
||||
}
|
||||
else
|
||||
{
|
||||
stmt->field_count= mysql->field_count;
|
||||
}
|
||||
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
||||
MYSQL_RES * STDCALL mysql_use_result(MYSQL *mysql)
|
||||
{
|
||||
return (*mysql->methods->use_result)(mysql);
|
||||
|
@ -78,6 +78,7 @@ EXPORTS
|
||||
mysql_next_result
|
||||
mysql_num_fields
|
||||
mysql_num_rows
|
||||
mysql_odbc_escape_string
|
||||
mysql_options
|
||||
mysql_stmt_param_count
|
||||
mysql_stmt_param_metadata
|
||||
@ -135,15 +136,6 @@ EXPORTS
|
||||
client_errors
|
||||
mysql_set_local_infile_default
|
||||
mysql_set_local_infile_handler
|
||||
mysql_disable_reads_from_master
|
||||
mysql_disable_rpl_parse
|
||||
mysql_enable_reads_from_master
|
||||
mysql_enable_rpl_parse
|
||||
mysql_master_query
|
||||
mysql_rpl_parse_enabled
|
||||
mysql_rpl_probe
|
||||
mysql_rpl_query_type
|
||||
mysql_slave_query
|
||||
mysql_embedded
|
||||
mysql_server_init
|
||||
mysql_server_end
|
||||
|
@ -1,269 +0,0 @@
|
||||
/* Copyright (C) 2000-2004 MySQL AB
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation.
|
||||
|
||||
There are special exceptions to the terms and conditions of the GPL as it
|
||||
is applied to this software. View the full text of the exception in file
|
||||
EXCEPTIONS-CLIENT in the directory of this software distribution.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
#include <my_global.h>
|
||||
#if defined(THREAD)
|
||||
#include <my_pthread.h> /* because of signal() */
|
||||
#endif
|
||||
#include "mysql.h"
|
||||
#include "mysql_version.h"
|
||||
#include "mysqld_error.h"
|
||||
#include <my_sys.h>
|
||||
#include <mysys_err.h>
|
||||
#include <m_string.h>
|
||||
#include <m_ctype.h>
|
||||
#include <my_net.h>
|
||||
#include <errmsg.h>
|
||||
#include <violite.h>
|
||||
#include <sys/stat.h>
|
||||
#include <signal.h>
|
||||
#include <errno.h>
|
||||
|
||||
#if defined(__NETWARE__)
|
||||
#include <netdb.h>
|
||||
#include <sys/select.h>
|
||||
#include <sys/utsname.h>
|
||||
#elif !defined( __WIN__)
|
||||
#include <sys/resource.h>
|
||||
#ifdef HAVE_SYS_UN_H
|
||||
# include <sys/un.h>
|
||||
#endif
|
||||
#include <netdb.h>
|
||||
#ifdef HAVE_SELECT_H
|
||||
# include <select.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SELECT_H
|
||||
#include <sys/select.h>
|
||||
#endif
|
||||
#include <sys/utsname.h>
|
||||
#endif /* __WIN__ */
|
||||
|
||||
#ifndef INADDR_NONE
|
||||
#define INADDR_NONE -1
|
||||
#endif
|
||||
|
||||
#define RES_BUF_SHIFT 5
|
||||
#define NET_BUF_SIZE 2048
|
||||
|
||||
MYSQL_MANAGER* STDCALL mysql_manager_init(MYSQL_MANAGER* con)
|
||||
{
|
||||
int net_buf_size=NET_BUF_SIZE;
|
||||
if (!con)
|
||||
{
|
||||
if (!(con=(MYSQL_MANAGER*)my_malloc(sizeof(*con)+net_buf_size,
|
||||
MYF(MY_WME|MY_ZEROFILL))))
|
||||
return 0;
|
||||
con->free_me=1;
|
||||
con->net_buf=(char*)con+sizeof(*con);
|
||||
}
|
||||
else
|
||||
{
|
||||
bzero((char*)con,sizeof(*con));
|
||||
if (!(con->net_buf=my_malloc(net_buf_size,MYF(0))))
|
||||
return 0;
|
||||
}
|
||||
con->net_buf_pos=con->net_data_end=con->net_buf;
|
||||
con->net_buf_size=net_buf_size;
|
||||
return con;
|
||||
}
|
||||
|
||||
MYSQL_MANAGER* STDCALL mysql_manager_connect(MYSQL_MANAGER* con,
|
||||
const char* host,
|
||||
const char* user,
|
||||
const char* passwd,
|
||||
unsigned int port)
|
||||
{
|
||||
my_socket sock;
|
||||
struct sockaddr_in sock_addr;
|
||||
in_addr_t ip_addr;
|
||||
char msg_buf[MAX_MYSQL_MANAGER_MSG];
|
||||
int msg_len;
|
||||
Vio* vio;
|
||||
my_bool not_used;
|
||||
|
||||
if (!host)
|
||||
host="localhost";
|
||||
if (!user)
|
||||
user="root";
|
||||
if (!passwd)
|
||||
passwd="";
|
||||
|
||||
if ((sock=(my_socket)socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET)
|
||||
{
|
||||
con->last_errno=errno;
|
||||
strmov(con->last_error,"Cannot create socket");
|
||||
goto err;
|
||||
}
|
||||
if (!(vio=vio_new(sock,VIO_TYPE_TCPIP,FALSE)))
|
||||
{
|
||||
con->last_errno=ENOMEM;
|
||||
strmov(con->last_error,"Cannot create network I/O object");
|
||||
goto err;
|
||||
}
|
||||
vio_blocking(vio, TRUE, ¬_used);
|
||||
my_net_init(&con->net,vio);
|
||||
bzero((char*) &sock_addr,sizeof(sock_addr));
|
||||
sock_addr.sin_family = AF_INET;
|
||||
if ((int) (ip_addr = inet_addr(host)) != (int) INADDR_NONE)
|
||||
{
|
||||
memcpy_fixed(&sock_addr.sin_addr,&ip_addr,sizeof(ip_addr));
|
||||
}
|
||||
else
|
||||
{
|
||||
int tmp_errno;
|
||||
struct hostent tmp_hostent,*hp;
|
||||
char buff2[GETHOSTBYNAME_BUFF_SIZE];
|
||||
hp = my_gethostbyname_r(host,&tmp_hostent,buff2,sizeof(buff2),
|
||||
&tmp_errno);
|
||||
if (!hp)
|
||||
{
|
||||
con->last_errno=tmp_errno;
|
||||
sprintf(con->last_error,"Could not resolve host '%-.64s'",host);
|
||||
my_gethostbyname_r_free();
|
||||
goto err;
|
||||
}
|
||||
memcpy(&sock_addr.sin_addr,hp->h_addr, (size_t) hp->h_length);
|
||||
my_gethostbyname_r_free();
|
||||
}
|
||||
sock_addr.sin_port = (ushort) htons((ushort) port);
|
||||
if (my_connect(sock,(struct sockaddr *) &sock_addr, sizeof(sock_addr),
|
||||
0))
|
||||
{
|
||||
con->last_errno=errno;
|
||||
sprintf(con->last_error ,"Could not connect to %-.64s", host);
|
||||
goto err;
|
||||
}
|
||||
/* read the greating */
|
||||
if (my_net_read(&con->net) == packet_error)
|
||||
{
|
||||
con->last_errno=errno;
|
||||
strmov(con->last_error,"Read error on socket");
|
||||
goto err;
|
||||
}
|
||||
sprintf(msg_buf,"%-.16s %-.16s\n",user,passwd);
|
||||
msg_len=strlen(msg_buf);
|
||||
if (my_net_write(&con->net,(uchar*) msg_buf,msg_len) || net_flush(&con->net))
|
||||
{
|
||||
con->last_errno=con->net.last_errno;
|
||||
strmov(con->last_error,"Write error on socket");
|
||||
goto err;
|
||||
}
|
||||
if (my_net_read(&con->net) == packet_error)
|
||||
{
|
||||
con->last_errno=errno;
|
||||
strmov(con->last_error,"Read error on socket");
|
||||
goto err;
|
||||
}
|
||||
if ((con->cmd_status=atoi((char*) con->net.read_pos)) != MANAGER_OK)
|
||||
{
|
||||
strmov(con->last_error,"Access denied");
|
||||
goto err;
|
||||
}
|
||||
if (!my_multi_malloc(MYF(0), &con->host, (uint)strlen(host)+1,
|
||||
&con->user, (uint)strlen(user)+1,
|
||||
&con->passwd, (uint)strlen(passwd)+1,
|
||||
NullS))
|
||||
{
|
||||
con->last_errno=ENOMEM;
|
||||
strmov(con->last_error,"Out of memory");
|
||||
goto err;
|
||||
}
|
||||
strmov(con->host,host);
|
||||
strmov(con->user,user);
|
||||
strmov(con->passwd,passwd);
|
||||
return con;
|
||||
|
||||
err:
|
||||
{
|
||||
my_bool free_me=con->free_me;
|
||||
con->free_me=0;
|
||||
mysql_manager_close(con);
|
||||
con->free_me=free_me;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void STDCALL mysql_manager_close(MYSQL_MANAGER* con)
|
||||
{
|
||||
/*
|
||||
No need to free con->user and con->passwd, because they were
|
||||
allocated in my_multimalloc() along with con->host, freeing
|
||||
con->hosts frees the whole block
|
||||
*/
|
||||
my_free((uchar*)con->host,MYF(MY_ALLOW_ZERO_PTR));
|
||||
net_end(&con->net);
|
||||
if (con->free_me)
|
||||
my_free((uchar*)con,MYF(0));
|
||||
}
|
||||
|
||||
|
||||
int STDCALL mysql_manager_command(MYSQL_MANAGER* con,const char* cmd,
|
||||
int cmd_len)
|
||||
{
|
||||
if (!cmd_len)
|
||||
cmd_len=strlen(cmd);
|
||||
if (my_net_write(&con->net,(const uchar*)cmd,cmd_len) || net_flush(&con->net))
|
||||
{
|
||||
con->last_errno=errno;
|
||||
strmov(con->last_error,"Write error on socket");
|
||||
return 1;
|
||||
}
|
||||
con->eof=0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int STDCALL mysql_manager_fetch_line(MYSQL_MANAGER* con, char* res_buf,
|
||||
int res_buf_size)
|
||||
{
|
||||
char* res_buf_end=res_buf+res_buf_size;
|
||||
char* net_buf=(char*) con->net.read_pos, *net_buf_end;
|
||||
int res_buf_shift=RES_BUF_SHIFT;
|
||||
ulong num_bytes;
|
||||
|
||||
if (res_buf_size<RES_BUF_SHIFT)
|
||||
{
|
||||
con->last_errno=ENOMEM;
|
||||
strmov(con->last_error,"Result buffer too small");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ((num_bytes=my_net_read(&con->net)) == packet_error)
|
||||
{
|
||||
con->last_errno=errno;
|
||||
strmov(con->last_error,"socket read failed");
|
||||
return 1;
|
||||
}
|
||||
|
||||
net_buf_end=net_buf+num_bytes;
|
||||
|
||||
if ((con->eof=(net_buf[3]==' ')))
|
||||
res_buf_shift--;
|
||||
net_buf+=res_buf_shift;
|
||||
res_buf_end[-1]=0;
|
||||
for (;net_buf<net_buf_end && res_buf < res_buf_end;res_buf++,net_buf++)
|
||||
{
|
||||
if ((*res_buf=*net_buf) == '\r')
|
||||
{
|
||||
*res_buf=0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
@ -98,7 +98,7 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command,
|
||||
thd= (THD *) mysql->thd;
|
||||
}
|
||||
|
||||
#if defined(ENABLED_PROFILING) && defined(COMMUNITY_SERVER)
|
||||
#if defined(ENABLED_PROFILING)
|
||||
thd->profiling.start_new_query();
|
||||
#endif
|
||||
|
||||
@ -119,7 +119,6 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command,
|
||||
thd->current_stmt= stmt;
|
||||
|
||||
thd->store_globals(); // Fix if more than one connect
|
||||
lex_start(thd);
|
||||
/*
|
||||
We have to call free_old_query before we start to fill mysql->fields
|
||||
for new query. In the case of embedded server we collect field data
|
||||
@ -144,13 +143,13 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command,
|
||||
|
||||
thd->mysys_var= 0;
|
||||
|
||||
#if defined(ENABLED_PROFILING) && defined(COMMUNITY_SERVER)
|
||||
#if defined(ENABLED_PROFILING)
|
||||
thd->profiling.finish_current_query();
|
||||
#endif
|
||||
return result;
|
||||
}
|
||||
|
||||
static void emb_flush_use_result(MYSQL *mysql)
|
||||
static void emb_flush_use_result(MYSQL *mysql, my_bool)
|
||||
{
|
||||
THD *thd= (THD*) mysql->thd;
|
||||
if (thd->cur_data)
|
||||
@ -656,7 +655,7 @@ int check_embedded_connection(MYSQL *mysql, const char *db)
|
||||
strmake(sctx->priv_host, (char*) my_localhost, MAX_HOSTNAME-1);
|
||||
sctx->priv_user= sctx->user= my_strdup(mysql->user, MYF(0));
|
||||
result= check_user(thd, COM_CONNECT, NULL, 0, db, true);
|
||||
net_end_statement(thd);
|
||||
thd->protocol->end_statement();
|
||||
emb_read_query_result(mysql);
|
||||
return result;
|
||||
}
|
||||
@ -882,7 +881,7 @@ void Protocol_text::remove_last_row()
|
||||
}
|
||||
|
||||
|
||||
bool Protocol::send_fields(List<Item> *list, uint flags)
|
||||
bool Protocol::send_result_set_metadata(List<Item> *list, uint flags)
|
||||
{
|
||||
List_iterator_fast<Item> it(*list);
|
||||
Item *item;
|
||||
@ -891,7 +890,7 @@ bool Protocol::send_fields(List<Item> *list, uint flags)
|
||||
CHARSET_INFO *thd_cs= thd->variables.character_set_results;
|
||||
CHARSET_INFO *cs= system_charset_info;
|
||||
MYSQL_DATA *data;
|
||||
DBUG_ENTER("send_fields");
|
||||
DBUG_ENTER("send_result_set_metadata");
|
||||
|
||||
if (!thd->mysql) // bootstrap file handling
|
||||
DBUG_RETURN(0);
|
||||
@ -985,7 +984,7 @@ bool Protocol::send_fields(List<Item> *list, uint flags)
|
||||
write_eof_packet(thd, thd->server_status,
|
||||
thd->warning_info->statement_warn_count());
|
||||
|
||||
DBUG_RETURN(prepare_for_send(list));
|
||||
DBUG_RETURN(prepare_for_send(list->elements));
|
||||
err:
|
||||
my_error(ER_OUT_OF_RESOURCES, MYF(0)); /* purecov: inspected */
|
||||
DBUG_RETURN(1); /* purecov: inspected */
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include <sys/stat.h>
|
||||
#include <signal.h>
|
||||
#include <time.h>
|
||||
#include <sql_common.h>
|
||||
#include "client_settings.h"
|
||||
#ifdef HAVE_PWD_H
|
||||
#include <pwd.h>
|
||||
@ -77,17 +78,6 @@ static my_bool is_NT(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
/**************************************************************************
|
||||
** Shut down connection
|
||||
**************************************************************************/
|
||||
|
||||
static void end_server(MYSQL *mysql)
|
||||
{
|
||||
DBUG_ENTER("end_server");
|
||||
free_old_query(mysql);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
int mysql_init_character_set(MYSQL *mysql);
|
||||
|
||||
@ -104,6 +94,13 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
|
||||
db ? db : "(Null)",
|
||||
user ? user : "(Null)"));
|
||||
|
||||
/* Test whether we're already connected */
|
||||
if (mysql->server_version)
|
||||
{
|
||||
set_mysql_error(mysql, CR_ALREADY_CONNECTED, unknown_sqlstate);
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
if (!host || !host[0])
|
||||
host= mysql->options.host;
|
||||
|
||||
@ -216,7 +213,7 @@ error:
|
||||
{
|
||||
/* Free alloced memory */
|
||||
my_bool free_me=mysql->free_me;
|
||||
end_server(mysql);
|
||||
free_old_query(mysql);
|
||||
mysql->free_me=0;
|
||||
mysql_close(mysql);
|
||||
mysql->free_me=free_me;
|
||||
|
@ -13,9 +13,7 @@ EXPORTS
|
||||
mysql_commit
|
||||
mysql_data_seek
|
||||
mysql_debug
|
||||
mysql_disable_rpl_parse
|
||||
mysql_dump_debug_info
|
||||
mysql_enable_rpl_parse
|
||||
mysql_eof
|
||||
mysql_errno
|
||||
mysql_error
|
||||
@ -50,6 +48,7 @@ EXPORTS
|
||||
mysql_next_result
|
||||
mysql_num_fields
|
||||
mysql_num_rows
|
||||
mysql_odbc_escape_string
|
||||
mysql_options
|
||||
mysql_ping
|
||||
mysql_query
|
||||
@ -61,8 +60,6 @@ EXPORTS
|
||||
mysql_rollback
|
||||
mysql_row_seek
|
||||
mysql_row_tell
|
||||
mysql_rpl_parse_enabled
|
||||
mysql_rpl_probe
|
||||
mysql_select_db
|
||||
mysql_send_query
|
||||
mysql_shutdown
|
||||
|
20
libservices/CMakeLists.txt
Normal file
20
libservices/CMakeLists.txt
Normal file
@ -0,0 +1,20 @@
|
||||
# Copyright (C) 2006 MySQL AB
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; version 2 of the License.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include)
|
||||
|
||||
SET(MYSQLSERVICES_SOURCES my_snprintf_service.c thd_alloc_service.c)
|
||||
|
||||
ADD_LIBRARY(mysqlservices ${MYSQLSERVICES_SOURCES})
|
100
libservices/HOWTO
Normal file
100
libservices/HOWTO
Normal file
@ -0,0 +1,100 @@
|
||||
How to create a new service
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
A "service" is a set of C functions in a structure that a
|
||||
service dynamic linker uses when a dynamic plugin is loaded.
|
||||
|
||||
If you want to export C++ class you need to provide an
|
||||
extern "C" function that will create a new instance of your class,
|
||||
and put it in a service.
|
||||
|
||||
Data structures are not part of the service structure, but they are part
|
||||
of the API you create and usually need to be declared in the same
|
||||
service_*.h file.
|
||||
|
||||
To turn a set of functions (foo_func1, foo_func2)
|
||||
into a service "foo" you need to
|
||||
|
||||
1. create a new file include/mysql/service_foo.h
|
||||
|
||||
2. the template is
|
||||
==================================================================
|
||||
#ifndef MYSQL_SERVICE_FOO_INCLUDED
|
||||
/* standard GPL header */
|
||||
|
||||
/**
|
||||
@file
|
||||
*exhaustive* description of the interface you provide.
|
||||
This file is the main user documentation of the new service
|
||||
*/
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern struct foo_service_st {
|
||||
int (*foo_func1_type)(...); /* fix the prototype as appropriate */
|
||||
void (*foo_func2_type)(...); /* fix the prototype as appropriate */
|
||||
} *foo_service;
|
||||
|
||||
#ifdef MYSQL_DYNAMIC_PLUGIN
|
||||
|
||||
#define foo_func1(...) foo_service->foo_func1_type(...)
|
||||
#define foo_func2(...) foo_service->foo_func2_type(...)
|
||||
|
||||
#else
|
||||
|
||||
int foo_func1_type(...); /* fix the prototype as appropriate */
|
||||
void foo_func2_type(...); /* fix the prototype as appropriate */
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#define MYSQL_SERVICE_FOO_INCLUDED
|
||||
#endif
|
||||
==================================================================
|
||||
|
||||
the service_foo.h file should be self-contained, if it needs system headers -
|
||||
include them in it, e.g. if you use size_t - #include <stdlib.h>
|
||||
|
||||
it should also declare all the accompanying data structures, as necessary
|
||||
(e.g. thd_alloc_service declares MYSQL_LEX_STRING).
|
||||
|
||||
3. add the new file to include/Makefile.am (pkginclude_HEADERS)
|
||||
4. add the new file to include/mysql/services.h
|
||||
5. increase the minor plugin ABI version in include/mysql/plugin.h
|
||||
(MYSQL_PLUGIN_INTERFACE_VERSION = MYSQL_PLUGIN_INTERFACE_VERSION+1)
|
||||
6. add the version of your service to include/service_versions.h:
|
||||
==================================================================
|
||||
#define VERSION_foo 0x0100
|
||||
==================================================================
|
||||
|
||||
7. create a new file libservices/foo_service.h using the following template:
|
||||
==================================================================
|
||||
/* GPL header */
|
||||
#include <service_versions.h>
|
||||
SERVICE_VERSION *foo_service= (void*)VERSION_foo;
|
||||
==================================================================
|
||||
|
||||
8. add the new file to libservices/CMakeLists.txt (MYSQLSERVICES_SOURCES)
|
||||
9. add the new file to libservices/Makefile.am (libmysqlservices_a_SOURCES)
|
||||
10. and finally, register your service for dynamic linking in
|
||||
sql/sql_plugin_services.h
|
||||
10.1 fill in the service structure:
|
||||
==================================================================
|
||||
static struct foo_service_st foo_handler = {
|
||||
foo_func1,
|
||||
foo_func2
|
||||
}
|
||||
==================================================================
|
||||
|
||||
10.2 and add it to the list of services
|
||||
|
||||
==================================================================
|
||||
{ "foo_service", VERSION_foo, &foo_handler }
|
||||
==================================================================
|
||||
|
||||
that's all.
|
||||
|
19
libservices/Makefile.am
Normal file
19
libservices/Makefile.am
Normal file
@ -0,0 +1,19 @@
|
||||
# Copyright 2009 Sun Microsystems, Inc.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; version 2 of the License.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
AM_CPPFLAGS = -I$(top_srcdir)/include
|
||||
pkglib_LIBRARIES = libmysqlservices.a
|
||||
libmysqlservices_a_SOURCES = my_snprintf_service.c thd_alloc_service.c
|
||||
EXTRA_DIST = CMakeLists.txt
|
17
libservices/my_snprintf_service.c
Normal file
17
libservices/my_snprintf_service.c
Normal file
@ -0,0 +1,17 @@
|
||||
/* Copyright (C) 2009 Sun Microsystems, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
#include <service_versions.h>
|
||||
SERVICE_VERSION my_snprintf_service= (void*)VERSION_my_snprintf;
|
17
libservices/thd_alloc_service.c
Normal file
17
libservices/thd_alloc_service.c
Normal file
@ -0,0 +1,17 @@
|
||||
/* Copyright (C) 2009 Sun Microsystems, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
#include <service_versions.h>
|
||||
SERVICE_VERSION *thd_alloc_service= (void*)VERSION_thd_alloc;
|
@ -6,8 +6,6 @@ binlog.binlog_multi_engine # joro : NDB tests marked as experiment
|
||||
|
||||
funcs_1.charset_collation_1 # depends on compile-time decisions
|
||||
|
||||
innodb.innodb_information_schema # Bug#47449 2009-09-19 alik main.information_schema and innodb.innodb_information_schema fail sporadically
|
||||
|
||||
main.ctype_gbk_binlog @solaris # Bug#46010: main.ctype_gbk_binlog fails sporadically : Table 't2' already exists
|
||||
main.information_schema # Bug#47449 2009-09-19 alik main.information_schema and innodb.innodb_information_schema fail sporadically
|
||||
main.innodb-autoinc* # Bug#47809 2009-10-04 joro innodb-autoinc.test fails with valgrind errors with the innodb plugin
|
||||
@ -17,11 +15,12 @@ main.log_tables # Bug#47924 2009-10-08 alik main.log_ta
|
||||
main.plugin # Bug#47146 Linking problem with example plugin when dtrace enabled
|
||||
main.plugin_load # Bug#47146
|
||||
|
||||
rpl.rpl_cross_version* # Bug #43913 2009-10-26 joro rpl_cross_version can't pass on conflicts complainig clash with --slave-load-tm
|
||||
rpl.rpl_innodb_bug28430* # Bug#46029
|
||||
rpl.rpl_innodb_bug30888* @solaris # Bug#47646 2009-09-25 alik rpl.rpl_innodb_bug30888 fails sporadically on Solaris
|
||||
rpl.rpl_log_pos* # Bug#47743 2009-10-02 alik rpl.rpl_log_pos fails sporadically
|
||||
rpl.rpl_plugin_load* @solaris # Bug#47146
|
||||
rpl.rpl_row_create_table* # Bug#45576: rpl_row_create_table fails on PB2
|
||||
rpl.rpl_log_pos* # Bug#47743 2009-10-02 alik rpl.rpl_log_pos fails sporadically
|
||||
rpl.rpl_timezone* # Bug#47017 2009-10-27 alik rpl_timezone fails on PB-2 with mismatch error
|
||||
rpl.rpl_trigger* # Bug#46656 2009-09-25 alik InnoDB plugin: memory leaks (Valgrind)
|
||||
rpl.rpl_heartbeat_basic # BUG#43828 2009-10-22 luis fails sporadically
|
||||
|
@ -48,6 +48,16 @@ DROP TABLE IF EXISTS tmp2, t;
|
||||
--enable_warnings
|
||||
|
||||
SELECT GET_LOCK("a",10);
|
||||
|
||||
#
|
||||
# BUG48216 Replication fails on all slaves after upgrade to 5.0.86 on master
|
||||
#
|
||||
# When the session is closed, any temporary tables of the session are dropped
|
||||
# and are binlogged. But it will be binlogged with a wrong database name when
|
||||
# the length of the database name('drop-temp-table-test') is greater than the
|
||||
# current database name('test').
|
||||
#
|
||||
USE test;
|
||||
disconnect con1;
|
||||
|
||||
connection con2;
|
||||
|
@ -158,4 +158,65 @@ LOAD DATA INFILE "../../std_data/words.dat" INTO TABLE t1;
|
||||
|
||||
DROP TABLE IF EXISTS t1;
|
||||
|
||||
# BUG#48297: Schema name is ignored when LOAD DATA is written into binlog,
|
||||
# replication aborts
|
||||
-- source include/master-slave-reset.inc
|
||||
|
||||
-- let $db1= b48297_db1
|
||||
-- let $db2= b42897_db2
|
||||
|
||||
-- connection master
|
||||
|
||||
-- disable_warnings
|
||||
-- eval drop database if exists $db1
|
||||
-- eval drop database if exists $db2
|
||||
-- enable_warnings
|
||||
|
||||
-- eval create database $db1
|
||||
-- eval create database $db2
|
||||
|
||||
-- eval use $db1
|
||||
-- eval CREATE TABLE t1 (c1 VARCHAR(256)) engine=$engine_type;
|
||||
|
||||
-- eval use $db2
|
||||
|
||||
-- echo ### assertion: works with cross-referenced database
|
||||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
-- eval LOAD DATA LOCAL INFILE '$MYSQLTEST_VARDIR/std_data/loaddata5.dat' INTO TABLE $db1.t1
|
||||
|
||||
-- eval use $db1
|
||||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
-- echo ### assertion: works with fully qualified name on current database
|
||||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
-- eval LOAD DATA LOCAL INFILE '$MYSQLTEST_VARDIR/std_data/loaddata5.dat' INTO TABLE $db1.t1
|
||||
|
||||
-- echo ### assertion: works without fully qualified name on current database
|
||||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
-- eval LOAD DATA LOCAL INFILE '$MYSQLTEST_VARDIR/std_data/loaddata5.dat' INTO TABLE t1
|
||||
|
||||
-- echo ### create connection without default database
|
||||
-- echo ### connect (conn2,localhost,root,,*NO-ONE*);
|
||||
connect (conn2,localhost,root,,*NO-ONE*);
|
||||
-- connection conn2
|
||||
-- echo ### assertion: works without stating the default database
|
||||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
-- eval LOAD DATA LOCAL INFILE '$MYSQLTEST_VARDIR/std_data/loaddata5.dat' INTO TABLE $db1.t1
|
||||
-- echo ### disconnect and switch back to master connection
|
||||
-- disconnect conn2
|
||||
-- connection master
|
||||
|
||||
-- sync_slave_with_master
|
||||
-- eval use $db1
|
||||
|
||||
let $diff_table_1=master:$db1.t1;
|
||||
let $diff_table_2=slave:$db1.t1;
|
||||
source include/diff_tables.inc;
|
||||
|
||||
-- connection master
|
||||
|
||||
-- eval DROP DATABASE $db1
|
||||
-- eval DROP DATABASE $db2
|
||||
|
||||
-- sync_slave_with_master
|
||||
|
||||
# End of 4.1 tests
|
||||
|
@ -93,7 +93,7 @@ kill @id;
|
||||
# We don't drop t3 as this is a temporary table
|
||||
drop table t2;
|
||||
connection master;
|
||||
--error 1053,2013
|
||||
--error 1317,2013
|
||||
reap;
|
||||
connection slave;
|
||||
# The SQL slave thread should now have stopped because the query was killed on
|
||||
|
21
mysql-test/include/bug38347.inc
Normal file
21
mysql-test/include/bug38347.inc
Normal file
@ -0,0 +1,21 @@
|
||||
|
||||
--echo
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
|
||||
--echo
|
||||
--echo # connection: con1 (mysqltest_u1@mysqltest_db1)
|
||||
--connect (con1,localhost,mysqltest_u1,,mysqltest_db1)
|
||||
--connection con1
|
||||
|
||||
--echo
|
||||
SHOW CREATE TABLE t1;
|
||||
|
||||
--echo
|
||||
--echo # connection: default
|
||||
--connection default
|
||||
|
||||
--disconnect con1
|
||||
|
||||
--echo
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost;
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
4
mysql-test/include/have_case_insensitive_fs.inc
Normal file
4
mysql-test/include/have_case_insensitive_fs.inc
Normal file
@ -0,0 +1,4 @@
|
||||
--require r/case_insensitive_fs.require
|
||||
--disable_query_log
|
||||
show variables like 'lower_case_file_system';
|
||||
--enable_query_log
|
@ -1,4 +0,0 @@
|
||||
--require r/have_community_features.require
|
||||
--disable_query_log
|
||||
show variables like 'have_community_features';
|
||||
--enable_query_log
|
4
mysql-test/include/have_profiling.inc
Normal file
4
mysql-test/include/have_profiling.inc
Normal file
@ -0,0 +1,4 @@
|
||||
--require r/have_profiling.require
|
||||
--disable_query_log
|
||||
show variables like 'have_profiling';
|
||||
--enable_query_log
|
@ -1,11 +1,13 @@
|
||||
############### include/query_cache_sql_prepare.inc ################
|
||||
#
|
||||
# This is to see how statements prepared via the PREPARE SQL command
|
||||
# go into the query cache: if using parameters they cannot; if not
|
||||
# using parameters they can.
|
||||
# go into the query cache.
|
||||
# Query cache is abbreviated as "QC"
|
||||
#
|
||||
# Last update:
|
||||
# 2008-05-26 Kostja
|
||||
# - Add test coverage for automatic statement reprepare
|
||||
#
|
||||
# 2007-05-03 ML - Move t/query_cache_sql_prepare.test
|
||||
# to include/query_cache_sql_prepare.inc
|
||||
# - Create two toplevel tests sourcing this routine
|
||||
@ -490,6 +492,37 @@ use test;
|
||||
|
||||
--echo
|
||||
--echo ########################################################################
|
||||
--echo #
|
||||
--echo # Bug#27430 Crash in subquery code when in PS and table DDL changed
|
||||
--echo # after PREPARE
|
||||
--echo # Check the effect of automatic reprepare on query cache
|
||||
--echo #
|
||||
--echo ########################################################################
|
||||
--disable_warnings
|
||||
drop table if exists t1;
|
||||
--enable_warnings
|
||||
create table t1 (a varchar(255));
|
||||
insert into t1 (a) values ("Pack my box with five dozen liquor jugs.");
|
||||
flush status;
|
||||
prepare stmt from "select a from t1";
|
||||
execute stmt;
|
||||
set @@global.query_cache_size=0;
|
||||
alter table t1 add column b int;
|
||||
execute stmt;
|
||||
set @@global.query_cache_size=100000;
|
||||
execute stmt;
|
||||
execute stmt;
|
||||
--echo #
|
||||
--echo # Sic: ALTER TABLE caused an automatic reprepare
|
||||
--echo # of the prepared statement. Since the query cache was disabled
|
||||
--echo # at the time of reprepare, the new prepared statement doesn't
|
||||
--echo # work with it.
|
||||
--echo #
|
||||
show status like 'Qcache_hits';
|
||||
show status like 'Qcache_queries_in_cache';
|
||||
--echo # Cleanup
|
||||
deallocate prepare stmt;
|
||||
drop table t1;
|
||||
|
||||
###############################################################################
|
||||
|
||||
|
@ -50,9 +50,6 @@
|
||||
is killed.
|
||||
*/
|
||||
|
||||
/* Requires Windows 2000 or higher */
|
||||
#define _WIN32_WINNT 0x0500
|
||||
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include <tlhelp32.h>
|
||||
|
@ -1330,4 +1330,20 @@ ALTER TABLE t1 MODIFY COLUMN a SET('a1','a2','a0','xx','a5','a6','a7','a8','a9',
|
||||
affected rows: 2
|
||||
info: Records: 2 Duplicates: 0 Warnings: 0
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (f1 TIMESTAMP NULL DEFAULT NULL,
|
||||
f2 INT(11) DEFAULT NULL) ENGINE=MYISAM DEFAULT CHARSET=utf8;
|
||||
INSERT INTO t1 VALUES (NULL, NULL), ("2009-10-09 11:46:19", 2);
|
||||
this should affect no rows as there is no real change
|
||||
ALTER TABLE t1 CHANGE COLUMN f1 f1_no_real_change TIMESTAMP NULL DEFAULT NULL;
|
||||
affected rows: 0
|
||||
info: Records: 0 Duplicates: 0 Warnings: 0
|
||||
DROP TABLE t1;
|
||||
End of 5.1 tests
|
||||
CREATE TABLE t1(c CHAR(10),
|
||||
i INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY);
|
||||
INSERT INTO t1 VALUES('a',2),('b',4),('c',6);
|
||||
ALTER TABLE t1
|
||||
DROP i,
|
||||
ADD i INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
AUTO_INCREMENT = 1;
|
||||
DROP TABLE t1;
|
||||
|
@ -19,81 +19,10 @@ test.t1.empty_string 0 0 4 0 0.0000 NULL CHAR(0) NOT NULL
|
||||
test.t1.bool N Y 1 1 0 0 1.0000 NULL ENUM('N','Y') NOT NULL
|
||||
test.t1.d 2002-03-03 2002-03-05 10 10 0 0 10.0000 NULL ENUM('2002-03-03','2002-03-04','2002-03-05') NOT NULL
|
||||
create table t2 select * from t1 procedure analyse();
|
||||
select * from t2;
|
||||
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
|
||||
test.t1.i 1 7 1 1 0 0 4.0000 2.2361 ENUM('1','3','5','7') NOT NULL
|
||||
test.t1.j 2 8 1 1 0 0 5.0000 2.2361 ENUM('2','4','6','8') NOT NULL
|
||||
test.t1.empty_string 0 0 4 0 0.0000 NULL CHAR(0) NOT NULL
|
||||
test.t1.bool N Y 1 1 0 0 1.0000 NULL ENUM('N','Y') NOT NULL
|
||||
test.t1.d 2002-03-03 2002-03-05 10 10 0 0 10.0000 NULL ENUM('2002-03-03','2002-03-04','2002-03-05') NOT NULL
|
||||
drop table t1,t2;
|
||||
ERROR HY000: Incorrect usage of PROCEDURE and non-SELECT
|
||||
drop table t1;
|
||||
EXPLAIN SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE();
|
||||
ERROR HY000: Incorrect usage of PROCEDURE and subquery
|
||||
create table t1 (a int not null);
|
||||
create table t2 select * from t1 where 0=1 procedure analyse();
|
||||
show create table t2;
|
||||
Table Create Table
|
||||
t2 CREATE TABLE `t2` (
|
||||
`Field_name` varbinary(255) NOT NULL DEFAULT '',
|
||||
`Min_value` varbinary(255) DEFAULT NULL,
|
||||
`Max_value` varbinary(255) DEFAULT NULL,
|
||||
`Min_length` bigint(11) NOT NULL DEFAULT '0',
|
||||
`Max_length` bigint(11) NOT NULL DEFAULT '0',
|
||||
`Empties_or_zeros` bigint(11) NOT NULL DEFAULT '0',
|
||||
`Nulls` bigint(11) NOT NULL DEFAULT '0',
|
||||
`Avg_value_or_avg_length` varbinary(255) NOT NULL DEFAULT '',
|
||||
`Std` varbinary(255) DEFAULT NULL,
|
||||
`Optimal_fieldtype` varbinary(64) NOT NULL DEFAULT ''
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
select * from t1 where 0=1 procedure analyse();
|
||||
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
|
||||
insert into t1 values(1);
|
||||
drop table t2;
|
||||
create table t2 select * from t1 where 0=1 procedure analyse();
|
||||
show create table t2;
|
||||
Table Create Table
|
||||
t2 CREATE TABLE `t2` (
|
||||
`Field_name` varbinary(255) NOT NULL DEFAULT '',
|
||||
`Min_value` varbinary(255) DEFAULT NULL,
|
||||
`Max_value` varbinary(255) DEFAULT NULL,
|
||||
`Min_length` bigint(11) NOT NULL DEFAULT '0',
|
||||
`Max_length` bigint(11) NOT NULL DEFAULT '0',
|
||||
`Empties_or_zeros` bigint(11) NOT NULL DEFAULT '0',
|
||||
`Nulls` bigint(11) NOT NULL DEFAULT '0',
|
||||
`Avg_value_or_avg_length` varbinary(255) NOT NULL DEFAULT '',
|
||||
`Std` varbinary(255) DEFAULT NULL,
|
||||
`Optimal_fieldtype` varbinary(64) NOT NULL DEFAULT ''
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
select * from t2;
|
||||
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
|
||||
insert into t2 select * from t1 procedure analyse();
|
||||
select * from t2;
|
||||
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
|
||||
test.t1.a 1 1 1 1 0 0 1.0000 0.0000 ENUM('1') NOT NULL
|
||||
insert into t1 values(2);
|
||||
drop table t2;
|
||||
create table t2 select * from t1 where 0=1 procedure analyse();
|
||||
show create table t2;
|
||||
Table Create Table
|
||||
t2 CREATE TABLE `t2` (
|
||||
`Field_name` varbinary(255) NOT NULL DEFAULT '',
|
||||
`Min_value` varbinary(255) DEFAULT NULL,
|
||||
`Max_value` varbinary(255) DEFAULT NULL,
|
||||
`Min_length` bigint(11) NOT NULL DEFAULT '0',
|
||||
`Max_length` bigint(11) NOT NULL DEFAULT '0',
|
||||
`Empties_or_zeros` bigint(11) NOT NULL DEFAULT '0',
|
||||
`Nulls` bigint(11) NOT NULL DEFAULT '0',
|
||||
`Avg_value_or_avg_length` varbinary(255) NOT NULL DEFAULT '',
|
||||
`Std` varbinary(255) DEFAULT NULL,
|
||||
`Optimal_fieldtype` varbinary(64) NOT NULL DEFAULT ''
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
select * from t2;
|
||||
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
|
||||
insert into t2 select * from t1 procedure analyse();
|
||||
select * from t2;
|
||||
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
|
||||
test.t1.a 1 2 1 1 0 0 1.5000 0.5000 ENUM('1','2') NOT NULL
|
||||
drop table t1,t2;
|
||||
create table t1 (v varchar(128));
|
||||
insert into t1 values ('abc'),('abc\'def\\hij\"klm\0opq'),('\''),('\"'),('\\'),('a\0'),('b\''),('c\"'),('d\\'),('\'b'),('\"c'),('\\d'),('a\0\0\0b'),('a\'\'\'\'b'),('a\"\"\"\"b'),('a\\\\\\\\b'),('\'\0\\\"'),('\'\''),('\"\"'),('\\\\'),('The\ZEnd');
|
||||
select * from t1 procedure analyse();
|
||||
@ -157,3 +86,40 @@ SELECT * FROM (SELECT * FROM t1) d PROCEDURE ANALYSE();
|
||||
ERROR HY000: Incorrect usage of PROCEDURE and subquery
|
||||
DROP TABLE t1;
|
||||
End of 4.1 tests
|
||||
#
|
||||
# Bug #48293: crash with procedure analyse, view with > 10 columns,
|
||||
# having clause...
|
||||
#
|
||||
CREATE TABLE t1(a INT, b INT, c INT, d INT, e INT,
|
||||
f INT, g INT, h INT, i INT, j INT,k INT);
|
||||
INSERT INTO t1 VALUES (),();
|
||||
CREATE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
|
||||
#should have a derived table
|
||||
EXPLAIN SELECT * FROM v1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 2
|
||||
2 DERIVED t1 ALL NULL NULL NULL NULL 2
|
||||
#should not crash
|
||||
SELECT * FROM v1 PROCEDURE analyse();
|
||||
ERROR HY000: Incorrect usage of PROCEDURE and view
|
||||
#should not crash
|
||||
SELECT * FROM t1 a, v1, t1 b PROCEDURE analyse();
|
||||
ERROR HY000: Incorrect usage of PROCEDURE and view
|
||||
#should not crash
|
||||
SELECT * FROM (SELECT * FROM t1 having a > 1) x PROCEDURE analyse();
|
||||
ERROR HY000: Incorrect usage of PROCEDURE and subquery
|
||||
#should not crash
|
||||
SELECT * FROM t1 a, (SELECT * FROM t1 having a > 1) x, t1 b PROCEDURE analyse();
|
||||
ERROR HY000: Incorrect usage of PROCEDURE and subquery
|
||||
#should not crash
|
||||
SELECT 1 FROM t1 group by a having a > 1 order by 1 PROCEDURE analyse();
|
||||
ERROR HY000: Can't use ORDER clause with this procedure
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1(a INT);
|
||||
INSERT INTO t1 VALUES (1),(2);
|
||||
# should not crash
|
||||
CREATE TABLE t2 SELECT 1 FROM t1, t1 t3 GROUP BY t3.a PROCEDURE ANALYSE();
|
||||
ERROR HY000: Incorrect usage of PROCEDURE and non-SELECT
|
||||
DROP TABLE t1;
|
||||
End of 5.0 tests
|
||||
|
@ -1,29 +0,0 @@
|
||||
#
|
||||
# Bug #40113: Embedded SELECT inside UPDATE or DELETE can timeout
|
||||
# without error
|
||||
#
|
||||
CREATE TABLE t1 (a int, b int, PRIMARY KEY (a,b)) ENGINE=InnoDB;
|
||||
INSERT INTO t1 (a,b) VALUES (1070109,99);
|
||||
CREATE TABLE t2 (b int, a int, PRIMARY KEY (b)) ENGINE=InnoDB;
|
||||
INSERT INTO t2 (b,a) VALUES (7,1070109);
|
||||
SELECT * FROM t1;
|
||||
a b
|
||||
1070109 99
|
||||
BEGIN;
|
||||
SELECT b FROM t2 WHERE b=7 FOR UPDATE;
|
||||
b
|
||||
7
|
||||
BEGIN;
|
||||
SELECT b FROM t2 WHERE b=7 FOR UPDATE;
|
||||
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
||||
INSERT INTO t1 (a) VALUES ((SELECT a FROM t2 WHERE b=7));
|
||||
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
||||
UPDATE t1 SET a='7000000' WHERE a=(SELECT a FROM t2 WHERE b=7);
|
||||
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
||||
DELETE FROM t1 WHERE a=(SELECT a FROM t2 WHERE b=7);
|
||||
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
||||
SELECT * FROM t1;
|
||||
a b
|
||||
1070109 99
|
||||
DROP TABLE t2, t1;
|
||||
End of 5.0 tests
|
2
mysql-test/r/case_insensitive_fs.require
Normal file
2
mysql-test/r/case_insensitive_fs.require
Normal file
@ -0,0 +1,2 @@
|
||||
Variable_name Value
|
||||
lower_case_file_system ON
|
@ -1922,3 +1922,37 @@ ERROR 42000: You have an error in your SQL syntax; check the manual that corresp
|
||||
# -- End of Bug#45829
|
||||
|
||||
End of 5.1 tests
|
||||
|
||||
# --
|
||||
# -- Bug #43054 Assertion `!table->auto_increment_field_not_null'
|
||||
# -- failed when redefining trigger
|
||||
|
||||
CREATE TABLE B (
|
||||
pk INTEGER AUTO_INCREMENT,
|
||||
int_key INTEGER NOT NULL,
|
||||
PRIMARY KEY (pk),
|
||||
KEY (int_key)
|
||||
);
|
||||
INSERT IGNORE INTO B VALUES ('9', '9');
|
||||
CREATE TABLE IF NOT EXISTS t1 (
|
||||
`pk` INTEGER NOT NULL AUTO_INCREMENT ,
|
||||
`int` INTEGER ,
|
||||
PRIMARY KEY ( `pk` )
|
||||
) SELECT `pk` , `int_key` FROM B ;
|
||||
CREATE TRIGGER f BEFORE INSERT ON t1 FOR EACH ROW
|
||||
BEGIN
|
||||
INSERT INTO t1 ( `int` ) VALUES (4 ),( 8 ),( 2 ) ;
|
||||
END ; |
|
||||
CREATE TABLE IF NOT EXISTS t1 (
|
||||
`pk` INTEGER NOT NULL AUTO_INCREMENT ,
|
||||
`int` INTEGER ,
|
||||
PRIMARY KEY ( `pk` )
|
||||
) SELECT `pk` , `int_key` FROM B ;
|
||||
ERROR HY000: Can't update table 't1' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
|
||||
CREATE TRIGGER f BEFORE INSERT ON t1 FOR EACH ROW
|
||||
BEGIN
|
||||
UPDATE A SET `pk`=1 WHERE `pk`=0 ;
|
||||
END ;|
|
||||
ERROR 42000: This version of MySQL doesn't yet support 'multiple triggers with the same action time and event for one table'
|
||||
DROP TABLE t1;
|
||||
DROP TABLE B;
|
||||
|
@ -548,6 +548,36 @@ SELECT * FROM t1 WHERE s2 = s3;
|
||||
s1 s2 s3
|
||||
a A A
|
||||
DROP TABLE t1;
|
||||
create table t1 (a varchar(1) character set latin1 collate latin1_general_ci);
|
||||
insert into t1 values ('A'),('a'),('B'),('b'),('C'),('c');
|
||||
select * from t1 where a > 'B' collate latin1_bin;
|
||||
a
|
||||
a
|
||||
b
|
||||
C
|
||||
c
|
||||
select * from t1 where a <> 'B' collate latin1_bin;
|
||||
a
|
||||
A
|
||||
a
|
||||
b
|
||||
C
|
||||
c
|
||||
create index i on t1 (a);
|
||||
select * from t1 where a > 'B' collate latin1_bin;
|
||||
a
|
||||
a
|
||||
b
|
||||
C
|
||||
c
|
||||
select * from t1 where a <> 'B' collate latin1_bin;
|
||||
a
|
||||
A
|
||||
a
|
||||
b
|
||||
C
|
||||
c
|
||||
drop table t1;
|
||||
SET NAMES latin1;
|
||||
CREATE TABLE t1
|
||||
(s1 char(10) COLLATE latin1_german1_ci,
|
||||
|
@ -73,6 +73,14 @@ efgh efgh
|
||||
ijkl ijkl
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug#45645 Mysql server close all connection and restart using lower function
|
||||
#
|
||||
CREATE TABLE t1 (a VARCHAR(10)) CHARACTER SET utf8 COLLATE utf8_test_ci;
|
||||
INSERT INTO t1 (a) VALUES ('hello!');
|
||||
SELECT * FROM t1 WHERE LOWER(a)=LOWER('N');
|
||||
a
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug#43827 Server closes connections and restarts
|
||||
#
|
||||
CREATE TABLE t1 (c1 VARCHAR(10) CHARACTER SET utf8 COLLATE utf8_test_ci);
|
||||
|
@ -311,3 +311,25 @@ a b
|
||||
drop table t1;
|
||||
set global low_priority_updates = @old_delayed_updates;
|
||||
End of 5.1 tests
|
||||
#
|
||||
# Bug #47274 assert in open_table on CREATE TABLE <already existing>
|
||||
#
|
||||
DROP TABLE IF EXISTS t1;
|
||||
DROP TABLE IF EXISTS t2;
|
||||
CREATE TABLE t1 ( f1 INTEGER AUTO_INCREMENT, PRIMARY KEY (f1));
|
||||
# The following CREATE TABLEs before gave an assert.
|
||||
INSERT DELAYED t1 VALUES (4);
|
||||
CREATE TABLE t1 AS SELECT 1 AS f1;
|
||||
ERROR 42S01: Table 't1' already exists
|
||||
REPLACE DELAYED t1 VALUES (5);
|
||||
CREATE TABLE t1 AS SELECT 1 AS f1;
|
||||
ERROR 42S01: Table 't1' already exists
|
||||
INSERT DELAYED t1 VALUES (6);
|
||||
CREATE TABLE t1 (f1 INTEGER);
|
||||
ERROR 42S01: Table 't1' already exists
|
||||
CREATE TABLE t2 (f1 INTEGER);
|
||||
INSERT DELAYED t1 VALUES (7);
|
||||
CREATE TABLE t1 LIKE t2;
|
||||
ERROR 42S01: Table 't1' already exists
|
||||
DROP TABLE t2;
|
||||
DROP TABLE t1;
|
||||
|
@ -121,3 +121,17 @@ ERROR 42000: Incorrect table name '#mysql50#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
use test;
|
||||
drop database mysqltestbug26703;
|
||||
End of 5.1 tests
|
||||
|
||||
# --
|
||||
# -- Bug#37431 (DROP TABLE does not report errors correctly).
|
||||
# --
|
||||
DROP TABLE IF EXISTS t1;
|
||||
DROP TABLE t1;
|
||||
ERROR 42S02: Unknown table 't1'
|
||||
SHOW WARNINGS;
|
||||
Level Code Message
|
||||
Error 1051 Unknown table 't1'
|
||||
|
||||
# --
|
||||
# -- End of Bug#37431.
|
||||
# --
|
||||
|
21
mysql-test/r/drop_debug.result
Normal file
21
mysql-test/r/drop_debug.result
Normal file
@ -0,0 +1,21 @@
|
||||
|
||||
# --
|
||||
# -- Bug#43138: DROP DATABASE failure does not clean up message list.
|
||||
# --
|
||||
|
||||
DROP DATABASE IF EXISTS mysql_test;
|
||||
|
||||
CREATE DATABASE mysql_test;
|
||||
CREATE TABLE mysql_test.t1(a INT);
|
||||
|
||||
SET SESSION DEBUG = "+d,bug43138";
|
||||
|
||||
DROP DATABASE mysql_test;
|
||||
Warnings:
|
||||
Error 1051 Unknown table 't1'
|
||||
|
||||
SET SESSION DEBUG = "-d,bug43138";
|
||||
|
||||
# --
|
||||
# -- End of Bug#43138.
|
||||
# --
|
@ -77,7 +77,7 @@ set sql_mode='traditional';
|
||||
alter event e_16407 do select 1;
|
||||
select event_schema, event_name, sql_mode from information_schema.events order by event_schema, event_name;
|
||||
event_schema event_name sql_mode
|
||||
events_test e_16407 STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER
|
||||
events_test e_16407 STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
|
||||
drop event e_16407;
|
||||
set sql_mode="ansi";
|
||||
select get_lock('ee_16407_2', 60);
|
||||
@ -114,8 +114,8 @@ insert into events_test.events_smode_test values ('ee_16407_4','10-11-1956');
|
||||
end|
|
||||
select event_schema, event_name, sql_mode from information_schema.events order by event_schema, event_name;
|
||||
event_schema event_name sql_mode
|
||||
events_test ee_16407_2 STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER
|
||||
events_test ee_16407_3 STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER
|
||||
events_test ee_16407_2 STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
|
||||
events_test ee_16407_3 STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
|
||||
events_test ee_16407_4
|
||||
select /*2*/ user, host, db, info from information_schema.processlist
|
||||
where state = 'User lock' and info = 'select get_lock(\'ee_16407_2\', 60)';
|
||||
@ -138,8 +138,8 @@ ee_16407_4 0000-00-00
|
||||
"OK, last check before we drop them"
|
||||
select event_schema, event_name, sql_mode from information_schema.events order by event_schema, event_name;
|
||||
event_schema event_name sql_mode
|
||||
events_test ee_16407_2 STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER
|
||||
events_test ee_16407_3 STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER
|
||||
events_test ee_16407_2 STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
|
||||
events_test ee_16407_3 STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
|
||||
events_test ee_16407_4
|
||||
drop event ee_16407_2;
|
||||
drop event ee_16407_3;
|
||||
@ -185,8 +185,8 @@ ee_16407_6 2004-02-29
|
||||
"And here we check one more time before we drop the events"
|
||||
select event_schema, event_name, sql_mode from information_schema.events order by event_schema, event_name;
|
||||
event_schema event_name sql_mode
|
||||
events_test ee_16407_5 STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER
|
||||
events_test ee_16407_6 STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER
|
||||
events_test ee_16407_5 STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
|
||||
events_test ee_16407_6 STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
|
||||
drop event ee_16407_5;
|
||||
drop event ee_16407_6;
|
||||
drop procedure ee_16407_5_pendant;
|
||||
|
@ -195,6 +195,22 @@ dt
|
||||
2001-01-01 01:01:01
|
||||
drop tables t1, t2;
|
||||
#
|
||||
# Bug#48295:
|
||||
# explain extended crash with subquery and ONLY_FULL_GROUP_BY sql_mode
|
||||
#
|
||||
CREATE TABLE t1 (f1 INT);
|
||||
SELECT @@session.sql_mode INTO @old_sql_mode;
|
||||
SET SESSION sql_mode='ONLY_FULL_GROUP_BY';
|
||||
EXPLAIN EXTENDED SELECT 1 FROM t1
|
||||
WHERE f1 > ALL( SELECT t.f1 FROM t1,t1 AS t );
|
||||
ERROR 42000: Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
|
||||
SHOW WARNINGS;
|
||||
Level Code Message
|
||||
Error 1140 Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
|
||||
Note 1003 select 1 AS `1` from `test`.`t1` where <not>(<exists>(...))
|
||||
SET SESSION sql_mode=@old_sql_mode;
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug#30302: Tables that were optimized away are printed in the
|
||||
# EXPLAIN EXTENDED warning.
|
||||
#
|
||||
|
@ -382,6 +382,9 @@ y
|
||||
SELECT b DIV 900 y FROM t1 GROUP BY y;
|
||||
y
|
||||
0
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect INTEGER value: 'str1'
|
||||
Warning 1292 Truncated incorrect INTEGER value: 'str2'
|
||||
SELECT c DIV 900 y FROM t1 GROUP BY y;
|
||||
y
|
||||
0
|
||||
|
@ -1151,6 +1151,9 @@ INSERT INTO t2 VALUES (0), (1);
|
||||
SELECT * FROM t1, t2 WHERE num=str;
|
||||
str num
|
||||
notnumber 0
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect DOUBLE value: 'notnumber'
|
||||
Warning 1292 Truncated incorrect DOUBLE value: 'notnumber'
|
||||
SELECT * FROM t1, t2 WHERE num=substring(str from 1 for 6);
|
||||
str num
|
||||
notnumber 0
|
||||
|
@ -1487,4 +1487,43 @@ MBRINTERSECTS(b, GEOMFROMTEXT('LINESTRING(1 1,1102219 2)') );
|
||||
COUNT(*)
|
||||
2
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug #48258: Assertion failed when using a spatial index
|
||||
#
|
||||
CREATE TABLE t1(a LINESTRING NOT NULL, SPATIAL KEY(a));
|
||||
INSERT INTO t1 VALUES
|
||||
(GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)')),
|
||||
(GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)'));
|
||||
EXPLAIN SELECT 1 FROM t1 WHERE a = GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL a NULL NULL NULL 2 Using where
|
||||
SELECT 1 FROM t1 WHERE a = GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
1
|
||||
1
|
||||
1
|
||||
EXPLAIN SELECT 1 FROM t1 WHERE a < GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL a NULL NULL NULL 2 Using where
|
||||
SELECT 1 FROM t1 WHERE a < GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
1
|
||||
EXPLAIN SELECT 1 FROM t1 WHERE a <= GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL a NULL NULL NULL 2 Using where
|
||||
SELECT 1 FROM t1 WHERE a <= GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
1
|
||||
1
|
||||
1
|
||||
EXPLAIN SELECT 1 FROM t1 WHERE a > GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL a NULL NULL NULL 2 Using where
|
||||
SELECT 1 FROM t1 WHERE a > GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
1
|
||||
EXPLAIN SELECT 1 FROM t1 WHERE a >= GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL a NULL NULL NULL 2 Using where
|
||||
SELECT 1 FROM t1 WHERE a >= GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
1
|
||||
1
|
||||
1
|
||||
DROP TABLE t1;
|
||||
End of 5.0 tests.
|
||||
|
@ -972,6 +972,18 @@ select min(`col002`) from t1 union select `col002` from t1;
|
||||
min(`col002`)
|
||||
NULL
|
||||
drop table t1;
|
||||
#
|
||||
# Bug #47780: crash when comparing GIS items from subquery
|
||||
#
|
||||
CREATE TABLE t1(a INT, b MULTIPOLYGON);
|
||||
INSERT INTO t1 VALUES
|
||||
(0,
|
||||
GEOMFROMTEXT(
|
||||
'multipolygon(((1 2,3 4,5 6,7 8,9 8),(7 6,5 4,3 2,1 2,3 4)))'));
|
||||
# must not crash
|
||||
SELECT 1 FROM t1 WHERE a <> (SELECT GEOMETRYCOLLECTIONFROMWKB(b) FROM t1);
|
||||
1
|
||||
DROP TABLE t1;
|
||||
End of 5.0 tests
|
||||
create table t1 (f1 tinyint(1), f2 char(1), f3 varchar(1), f4 geometry, f5 datetime);
|
||||
create view v1 as select * from t1;
|
||||
|
@ -13,8 +13,8 @@ GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost' REQUIRE CIPHER 'EDH-RSA-DES-CBC3
|
||||
GRANT SELECT ON `mysqltest`.* TO 'mysqltest_1'@'localhost'
|
||||
grant delete on mysqltest.* to mysqltest_1@localhost;
|
||||
select * from mysql.user where user="mysqltest_1";
|
||||
Host User Password Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Reload_priv Shutdown_priv Process_priv File_priv Grant_priv References_priv Index_priv Alter_priv Show_db_priv Super_priv Create_tmp_table_priv Lock_tables_priv Execute_priv Repl_slave_priv Repl_client_priv Create_view_priv Show_view_priv Create_routine_priv Alter_routine_priv Create_user_priv Event_priv Trigger_priv ssl_type ssl_cipher x509_issuer x509_subject max_questions max_updates max_connections max_user_connections
|
||||
localhost mysqltest_1 N N N N N N N N N N N N N N N N N N N N N N N N N N N N SPECIFIED EDH-RSA-DES-CBC3-SHA 0 0 0 0
|
||||
Host User Password Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Reload_priv Shutdown_priv Process_priv File_priv Grant_priv References_priv Index_priv Alter_priv Show_db_priv Super_priv Create_tmp_table_priv Lock_tables_priv Execute_priv Repl_slave_priv Repl_client_priv Create_view_priv Show_view_priv Create_routine_priv Alter_routine_priv Create_user_priv Event_priv Trigger_priv Create_tablespace_priv ssl_type ssl_cipher x509_issuer x509_subject max_questions max_updates max_connections max_user_connections
|
||||
localhost mysqltest_1 N N N N N N N N N N N N N N N N N N N N N N N N N N N N N SPECIFIED EDH-RSA-DES-CBC3-SHA 0 0 0 0
|
||||
show grants for mysqltest_1@localhost;
|
||||
Grants for mysqltest_1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost' REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA'
|
||||
@ -44,15 +44,15 @@ delete from mysql.user where user='mysqltest_1';
|
||||
flush privileges;
|
||||
grant usage on *.* to mysqltest_1@localhost with max_queries_per_hour 10;
|
||||
select * from mysql.user where user="mysqltest_1";
|
||||
Host User Password Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Reload_priv Shutdown_priv Process_priv File_priv Grant_priv References_priv Index_priv Alter_priv Show_db_priv Super_priv Create_tmp_table_priv Lock_tables_priv Execute_priv Repl_slave_priv Repl_client_priv Create_view_priv Show_view_priv Create_routine_priv Alter_routine_priv Create_user_priv Event_priv Trigger_priv ssl_type ssl_cipher x509_issuer x509_subject max_questions max_updates max_connections max_user_connections
|
||||
localhost mysqltest_1 N N N N N N N N N N N N N N N N N N N N N N N N N N N N 10 0 0 0
|
||||
Host User Password Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Reload_priv Shutdown_priv Process_priv File_priv Grant_priv References_priv Index_priv Alter_priv Show_db_priv Super_priv Create_tmp_table_priv Lock_tables_priv Execute_priv Repl_slave_priv Repl_client_priv Create_view_priv Show_view_priv Create_routine_priv Alter_routine_priv Create_user_priv Event_priv Trigger_priv Create_tablespace_priv ssl_type ssl_cipher x509_issuer x509_subject max_questions max_updates max_connections max_user_connections
|
||||
localhost mysqltest_1 N N N N N N N N N N N N N N N N N N N N N N N N N N N N N 10 0 0 0
|
||||
show grants for mysqltest_1@localhost;
|
||||
Grants for mysqltest_1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost' WITH MAX_QUERIES_PER_HOUR 10
|
||||
grant usage on *.* to mysqltest_1@localhost with max_updates_per_hour 20 max_connections_per_hour 30;
|
||||
select * from mysql.user where user="mysqltest_1";
|
||||
Host User Password Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Reload_priv Shutdown_priv Process_priv File_priv Grant_priv References_priv Index_priv Alter_priv Show_db_priv Super_priv Create_tmp_table_priv Lock_tables_priv Execute_priv Repl_slave_priv Repl_client_priv Create_view_priv Show_view_priv Create_routine_priv Alter_routine_priv Create_user_priv Event_priv Trigger_priv ssl_type ssl_cipher x509_issuer x509_subject max_questions max_updates max_connections max_user_connections
|
||||
localhost mysqltest_1 N N N N N N N N N N N N N N N N N N N N N N N N N N N N 10 20 30 0
|
||||
Host User Password Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Reload_priv Shutdown_priv Process_priv File_priv Grant_priv References_priv Index_priv Alter_priv Show_db_priv Super_priv Create_tmp_table_priv Lock_tables_priv Execute_priv Repl_slave_priv Repl_client_priv Create_view_priv Show_view_priv Create_routine_priv Alter_routine_priv Create_user_priv Event_priv Trigger_priv Create_tablespace_priv ssl_type ssl_cipher x509_issuer x509_subject max_questions max_updates max_connections max_user_connections
|
||||
localhost mysqltest_1 N N N N N N N N N N N N N N N N N N N N N N N N N N N N N 10 20 30 0
|
||||
show grants for mysqltest_1@localhost;
|
||||
Grants for mysqltest_1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost' WITH MAX_QUERIES_PER_HOUR 10 MAX_UPDATES_PER_HOUR 20 MAX_CONNECTIONS_PER_HOUR 30
|
||||
@ -483,6 +483,7 @@ Show view Tables To see views with SHOW CREATE VIEW
|
||||
Shutdown Server Admin To shut down the server
|
||||
Super Server Admin To use KILL thread, SET GLOBAL, CHANGE MASTER, etc.
|
||||
Trigger Tables To use triggers
|
||||
Create tablespace Server Admin To create/alter/drop tablespaces
|
||||
Update Tables To update existing rows
|
||||
Usage Server Admin No privileges - allow connect only
|
||||
create database mysqltest;
|
||||
@ -914,13 +915,13 @@ SHOW CREATE VIEW mysqltest2.v_ny;
|
||||
View Create View character_set_client collation_connection
|
||||
v_ny CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `mysqltest2`.`v_ny` AS select `mysqltest2`.`t_nn`.`c1` AS `c1` from `mysqltest2`.`t_nn` latin1 latin1_swedish_ci
|
||||
SHOW CREATE TABLE mysqltest3.t_nn;
|
||||
ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for table 't_nn'
|
||||
ERROR 42000: SHOW command denied to user 'mysqltest_1'@'localhost' for table 't_nn'
|
||||
SHOW CREATE VIEW mysqltest3.t_nn;
|
||||
ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for table 't_nn'
|
||||
SHOW CREATE VIEW mysqltest3.v_nn;
|
||||
ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for table 'v_nn'
|
||||
SHOW CREATE TABLE mysqltest3.v_nn;
|
||||
ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for table 'v_nn'
|
||||
ERROR 42000: SHOW command denied to user 'mysqltest_1'@'localhost' for table 'v_nn'
|
||||
SHOW CREATE TABLE mysqltest2.t_nn;
|
||||
Table Create Table
|
||||
t_nn CREATE TABLE `t_nn` (
|
||||
@ -1007,8 +1008,8 @@ DROP TABLE mysqltest1.t2;
|
||||
SHOW GRANTS;
|
||||
Grants for mysqltest_1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost'
|
||||
GRANT SELECT, INSERT, CREATE, DROP, ALTER ON `mysqltest1`.`t2` TO 'mysqltest_1'@'localhost'
|
||||
GRANT SELECT, INSERT, CREATE, DROP, ALTER ON `mysqltest1`.`t1` TO 'mysqltest_1'@'localhost'
|
||||
GRANT SELECT, INSERT, CREATE, DROP, ALTER ON `mysqltest1`.`t2` TO 'mysqltest_1'@'localhost'
|
||||
RENAME TABLE t1 TO t2;
|
||||
RENAME TABLE t2 TO t1;
|
||||
ALTER TABLE t1 RENAME TO t2;
|
||||
@ -1018,8 +1019,8 @@ REVOKE DROP, INSERT ON mysqltest1.t2 FROM mysqltest_1@localhost;
|
||||
SHOW GRANTS;
|
||||
Grants for mysqltest_1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost'
|
||||
GRANT SELECT, CREATE, ALTER ON `mysqltest1`.`t2` TO 'mysqltest_1'@'localhost'
|
||||
GRANT SELECT, CREATE, ALTER ON `mysqltest1`.`t1` TO 'mysqltest_1'@'localhost'
|
||||
GRANT SELECT, CREATE, ALTER ON `mysqltest1`.`t2` TO 'mysqltest_1'@'localhost'
|
||||
RENAME TABLE t1 TO t2;
|
||||
ERROR 42000: DROP command denied to user 'mysqltest_1'@'localhost' for table 't1'
|
||||
ALTER TABLE t1 RENAME TO t2;
|
||||
@ -1413,3 +1414,713 @@ DROP USER 'user1';
|
||||
DROP USER 'user1'@'localhost';
|
||||
DROP USER 'user2';
|
||||
DROP DATABASE db1;
|
||||
#
|
||||
# Bug #25863 No database selected error, but documentation
|
||||
# says * for global allowed
|
||||
#
|
||||
GRANT ALL ON * TO mysqltest_1;
|
||||
ERROR 3D000: No database selected
|
||||
GRANT ALL ON *.* TO mysqltest_1;
|
||||
SHOW GRANTS FOR mysqltest_1;
|
||||
Grants for mysqltest_1@%
|
||||
GRANT ALL PRIVILEGES ON *.* TO 'mysqltest_1'@'%'
|
||||
DROP USER mysqltest_1;
|
||||
USE test;
|
||||
GRANT ALL ON * TO mysqltest_1;
|
||||
SHOW GRANTS FOR mysqltest_1;
|
||||
Grants for mysqltest_1@%
|
||||
GRANT USAGE ON *.* TO 'mysqltest_1'@'%'
|
||||
GRANT ALL PRIVILEGES ON `test`.* TO 'mysqltest_1'@'%'
|
||||
DROP USER mysqltest_1;
|
||||
GRANT ALL ON *.* TO mysqltest_1;
|
||||
SHOW GRANTS FOR mysqltest_1;
|
||||
Grants for mysqltest_1@%
|
||||
GRANT ALL PRIVILEGES ON *.* TO 'mysqltest_1'@'%'
|
||||
DROP USER mysqltest_1;
|
||||
#########################################################################
|
||||
#
|
||||
# Bug#38347: ALTER ROUTINE privilege allows SHOW CREATE TABLE.
|
||||
#
|
||||
#########################################################################
|
||||
|
||||
# --
|
||||
# -- Prepare the environment.
|
||||
# --
|
||||
DELETE FROM mysql.user WHERE User LIKE 'mysqltest_%';
|
||||
DELETE FROM mysql.db WHERE User LIKE 'mysqltest_%';
|
||||
DELETE FROM mysql.tables_priv WHERE User LIKE 'mysqltest_%';
|
||||
DELETE FROM mysql.columns_priv WHERE User LIKE 'mysqltest_%';
|
||||
FLUSH PRIVILEGES;
|
||||
DROP DATABASE IF EXISTS mysqltest_db1;
|
||||
CREATE DATABASE mysqltest_db1;
|
||||
CREATE TABLE mysqltest_db1.t1(a INT);
|
||||
|
||||
# --
|
||||
# -- Check that global privileges don't allow SHOW CREATE TABLE.
|
||||
# --
|
||||
GRANT EVENT ON mysqltest_db1.* TO mysqltest_u1@localhost;
|
||||
GRANT CREATE TEMPORARY TABLES ON mysqltest_db1.* TO mysqltest_u1@localhost;
|
||||
GRANT LOCK TABLES ON mysqltest_db1.* TO mysqltest_u1@localhost;
|
||||
GRANT ALTER ROUTINE ON mysqltest_db1.* TO mysqltest_u1@localhost;
|
||||
GRANT CREATE ROUTINE ON mysqltest_db1.* TO mysqltest_u1@localhost;
|
||||
GRANT EXECUTE ON mysqltest_db1.* TO mysqltest_u1@localhost;
|
||||
GRANT FILE ON *.* TO mysqltest_u1@localhost;
|
||||
GRANT CREATE USER ON *.* TO mysqltest_u1@localhost;
|
||||
GRANT PROCESS ON *.* TO mysqltest_u1@localhost;
|
||||
GRANT RELOAD ON *.* TO mysqltest_u1@localhost;
|
||||
GRANT REPLICATION CLIENT ON *.* TO mysqltest_u1@localhost;
|
||||
GRANT REPLICATION SLAVE ON *.* TO mysqltest_u1@localhost;
|
||||
GRANT SHOW DATABASES ON *.* TO mysqltest_u1@localhost;
|
||||
GRANT SHUTDOWN ON *.* TO mysqltest_u1@localhost;
|
||||
GRANT USAGE ON *.* TO mysqltest_u1@localhost;
|
||||
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT RELOAD, SHUTDOWN, PROCESS, FILE, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT, CREATE USER ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
GRANT CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE ROUTINE, ALTER ROUTINE, EVENT ON `mysqltest_db1`.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# connection: con1 (mysqltest_u1@mysqltest_db1)
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
ERROR 42000: SHOW command denied to user 'mysqltest_u1'@'localhost' for table 't1'
|
||||
|
||||
# connection: default
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost;
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# --
|
||||
# -- Check that global SELECT allows SHOW CREATE TABLE.
|
||||
# --
|
||||
|
||||
GRANT SELECT ON mysqltest_db1.* TO mysqltest_u1@localhost;
|
||||
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
GRANT SELECT ON `mysqltest_db1`.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# connection: con1 (mysqltest_u1@mysqltest_db1)
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
|
||||
# connection: default
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost;
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# --
|
||||
# -- Check that global INSERT allows SHOW CREATE TABLE.
|
||||
# --
|
||||
|
||||
GRANT INSERT ON mysqltest_db1.* TO mysqltest_u1@localhost;
|
||||
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
GRANT INSERT ON `mysqltest_db1`.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# connection: con1 (mysqltest_u1@mysqltest_db1)
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
|
||||
# connection: default
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost;
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# --
|
||||
# -- Check that global UPDATE allows SHOW CREATE TABLE.
|
||||
# --
|
||||
|
||||
GRANT UPDATE ON mysqltest_db1.* TO mysqltest_u1@localhost;
|
||||
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
GRANT UPDATE ON `mysqltest_db1`.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# connection: con1 (mysqltest_u1@mysqltest_db1)
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
|
||||
# connection: default
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost;
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# --
|
||||
# -- Check that global DELETE allows SHOW CREATE TABLE.
|
||||
# --
|
||||
|
||||
GRANT DELETE ON mysqltest_db1.* TO mysqltest_u1@localhost;
|
||||
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
GRANT DELETE ON `mysqltest_db1`.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# connection: con1 (mysqltest_u1@mysqltest_db1)
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
|
||||
# connection: default
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost;
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# --
|
||||
# -- Check that global CREATE allows SHOW CREATE TABLE.
|
||||
# --
|
||||
|
||||
GRANT CREATE ON mysqltest_db1.* TO mysqltest_u1@localhost;
|
||||
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
GRANT CREATE ON `mysqltest_db1`.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# connection: con1 (mysqltest_u1@mysqltest_db1)
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
|
||||
# connection: default
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost;
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# --
|
||||
# -- Check that global DROP allows SHOW CREATE TABLE.
|
||||
# --
|
||||
|
||||
GRANT DROP ON mysqltest_db1.* TO mysqltest_u1@localhost;
|
||||
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
GRANT DROP ON `mysqltest_db1`.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# connection: con1 (mysqltest_u1@mysqltest_db1)
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
|
||||
# connection: default
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost;
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# --
|
||||
# -- Check that global ALTER allows SHOW CREATE TABLE.
|
||||
# --
|
||||
|
||||
GRANT ALTER ON mysqltest_db1.* TO mysqltest_u1@localhost;
|
||||
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
GRANT ALTER ON `mysqltest_db1`.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# connection: con1 (mysqltest_u1@mysqltest_db1)
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
|
||||
# connection: default
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost;
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# --
|
||||
# -- Check that global INDEX allows SHOW CREATE TABLE.
|
||||
# --
|
||||
|
||||
GRANT INDEX ON mysqltest_db1.* TO mysqltest_u1@localhost;
|
||||
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
GRANT INDEX ON `mysqltest_db1`.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# connection: con1 (mysqltest_u1@mysqltest_db1)
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
|
||||
# connection: default
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost;
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# --
|
||||
# -- Check that global REFERENCES allows SHOW CREATE TABLE.
|
||||
# --
|
||||
|
||||
GRANT REFERENCES ON mysqltest_db1.* TO mysqltest_u1@localhost;
|
||||
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
GRANT REFERENCES ON `mysqltest_db1`.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# connection: con1 (mysqltest_u1@mysqltest_db1)
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
|
||||
# connection: default
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost;
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# --
|
||||
# -- Check that global GRANT OPTION allows SHOW CREATE TABLE.
|
||||
# --
|
||||
|
||||
GRANT GRANT OPTION ON mysqltest_db1.* TO mysqltest_u1@localhost;
|
||||
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
GRANT USAGE ON `mysqltest_db1`.* TO 'mysqltest_u1'@'localhost' WITH GRANT OPTION
|
||||
|
||||
# connection: con1 (mysqltest_u1@mysqltest_db1)
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
|
||||
# connection: default
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost;
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# --
|
||||
# -- Check that global CREATE VIEW allows SHOW CREATE TABLE.
|
||||
# --
|
||||
|
||||
GRANT CREATE VIEW ON mysqltest_db1.* TO mysqltest_u1@localhost;
|
||||
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
GRANT CREATE VIEW ON `mysqltest_db1`.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# connection: con1 (mysqltest_u1@mysqltest_db1)
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
|
||||
# connection: default
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost;
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# --
|
||||
# -- Check that global SHOW VIEW allows SHOW CREATE TABLE.
|
||||
# --
|
||||
|
||||
GRANT SHOW VIEW ON mysqltest_db1.* TO mysqltest_u1@localhost;
|
||||
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
GRANT SHOW VIEW ON `mysqltest_db1`.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# connection: con1 (mysqltest_u1@mysqltest_db1)
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
|
||||
# connection: default
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost;
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# --
|
||||
# -- Check that table-level SELECT allows SHOW CREATE TABLE.
|
||||
# --
|
||||
|
||||
GRANT SELECT ON mysqltest_db1.t1 TO mysqltest_u1@localhost;
|
||||
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
GRANT SELECT ON `mysqltest_db1`.`t1` TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# connection: con1 (mysqltest_u1@mysqltest_db1)
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
|
||||
# connection: default
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost;
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# --
|
||||
# -- Check that table-level INSERT allows SHOW CREATE TABLE.
|
||||
# --
|
||||
|
||||
GRANT INSERT ON mysqltest_db1.t1 TO mysqltest_u1@localhost;
|
||||
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
GRANT INSERT ON `mysqltest_db1`.`t1` TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# connection: con1 (mysqltest_u1@mysqltest_db1)
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
|
||||
# connection: default
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost;
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# --
|
||||
# -- Check that table-level UPDATE allows SHOW CREATE TABLE.
|
||||
# --
|
||||
|
||||
GRANT UPDATE ON mysqltest_db1.t1 TO mysqltest_u1@localhost;
|
||||
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
GRANT UPDATE ON `mysqltest_db1`.`t1` TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# connection: con1 (mysqltest_u1@mysqltest_db1)
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
|
||||
# connection: default
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost;
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# --
|
||||
# -- Check that table-level DELETE allows SHOW CREATE TABLE.
|
||||
# --
|
||||
|
||||
GRANT DELETE ON mysqltest_db1.t1 TO mysqltest_u1@localhost;
|
||||
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
GRANT DELETE ON `mysqltest_db1`.`t1` TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# connection: con1 (mysqltest_u1@mysqltest_db1)
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
|
||||
# connection: default
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost;
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# --
|
||||
# -- Check that table-level CREATE allows SHOW CREATE TABLE.
|
||||
# --
|
||||
|
||||
GRANT CREATE ON mysqltest_db1.t1 TO mysqltest_u1@localhost;
|
||||
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
GRANT CREATE ON `mysqltest_db1`.`t1` TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# connection: con1 (mysqltest_u1@mysqltest_db1)
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
|
||||
# connection: default
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost;
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# --
|
||||
# -- Check that table-level DROP allows SHOW CREATE TABLE.
|
||||
# --
|
||||
|
||||
GRANT DROP ON mysqltest_db1.t1 TO mysqltest_u1@localhost;
|
||||
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
GRANT DROP ON `mysqltest_db1`.`t1` TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# connection: con1 (mysqltest_u1@mysqltest_db1)
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
|
||||
# connection: default
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost;
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# --
|
||||
# -- Check that table-level ALTER allows SHOW CREATE TABLE.
|
||||
# --
|
||||
|
||||
GRANT ALTER ON mysqltest_db1.t1 TO mysqltest_u1@localhost;
|
||||
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
GRANT ALTER ON `mysqltest_db1`.`t1` TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# connection: con1 (mysqltest_u1@mysqltest_db1)
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
|
||||
# connection: default
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost;
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# --
|
||||
# -- Check that table-level INDEX allows SHOW CREATE TABLE.
|
||||
# --
|
||||
|
||||
GRANT INDEX ON mysqltest_db1.t1 TO mysqltest_u1@localhost;
|
||||
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
GRANT INDEX ON `mysqltest_db1`.`t1` TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# connection: con1 (mysqltest_u1@mysqltest_db1)
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
|
||||
# connection: default
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost;
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# --
|
||||
# -- Check that table-level REFERENCES allows SHOW CREATE TABLE.
|
||||
# --
|
||||
|
||||
GRANT REFERENCES ON mysqltest_db1.t1 TO mysqltest_u1@localhost;
|
||||
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
GRANT REFERENCES ON `mysqltest_db1`.`t1` TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# connection: con1 (mysqltest_u1@mysqltest_db1)
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
|
||||
# connection: default
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost;
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# --
|
||||
# -- Check that table-level GRANT OPTION allows SHOW CREATE TABLE.
|
||||
# --
|
||||
|
||||
GRANT GRANT OPTION ON mysqltest_db1.t1 TO mysqltest_u1@localhost;
|
||||
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
GRANT USAGE ON `mysqltest_db1`.`t1` TO 'mysqltest_u1'@'localhost' WITH GRANT OPTION
|
||||
|
||||
# connection: con1 (mysqltest_u1@mysqltest_db1)
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
|
||||
# connection: default
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost;
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# --
|
||||
# -- Check that table-level CREATE VIEW allows SHOW CREATE TABLE.
|
||||
# --
|
||||
|
||||
GRANT CREATE VIEW ON mysqltest_db1.t1 TO mysqltest_u1@localhost;
|
||||
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
GRANT CREATE VIEW ON `mysqltest_db1`.`t1` TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# connection: con1 (mysqltest_u1@mysqltest_db1)
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
|
||||
# connection: default
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost;
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# --
|
||||
# -- Check that table-level SHOW VIEW allows SHOW CREATE TABLE.
|
||||
# --
|
||||
|
||||
GRANT SHOW VIEW ON mysqltest_db1.t1 TO mysqltest_u1@localhost;
|
||||
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
GRANT SHOW VIEW ON `mysqltest_db1`.`t1` TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# connection: con1 (mysqltest_u1@mysqltest_db1)
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
|
||||
# connection: default
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_u1@localhost;
|
||||
SHOW GRANTS FOR mysqltest_u1@localhost;
|
||||
Grants for mysqltest_u1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_u1'@'localhost'
|
||||
|
||||
# --
|
||||
# -- Cleanup.
|
||||
# --
|
||||
|
||||
DROP DATABASE mysqltest_db1;
|
||||
DROP USER mysqltest_u1@localhost;
|
||||
|
||||
# End of Bug#38347.
|
||||
|
||||
|
@ -391,7 +391,7 @@ grant all on mysqltest_1.* to mysqltest_u1@localhost;
|
||||
use mysqltest_2;
|
||||
create table t1 (i int);
|
||||
show create table mysqltest_2.t1;
|
||||
ERROR 42000: SELECT command denied to user 'mysqltest_u1'@'localhost' for table 't1'
|
||||
ERROR 42000: SHOW command denied to user 'mysqltest_u1'@'localhost' for table 't1'
|
||||
create table t1 like mysqltest_2.t1;
|
||||
ERROR 42000: SELECT command denied to user 'mysqltest_u1'@'localhost' for table 't1'
|
||||
grant select on mysqltest_2.t1 to mysqltest_u1@localhost;
|
||||
|
@ -154,4 +154,42 @@ SELECT * FROM mysqltest_1.t1;
|
||||
a
|
||||
DROP USER 'mysqltest1'@'%';
|
||||
DROP DATABASE mysqltest_1;
|
||||
#
|
||||
# Bug#41597 - After rename of user, there are additional grants
|
||||
# when grants are reapplied.
|
||||
#
|
||||
CREATE DATABASE temp;
|
||||
CREATE TABLE temp.t1(a INT, b VARCHAR(10));
|
||||
INSERT INTO temp.t1 VALUES(1, 'name1');
|
||||
INSERT INTO temp.t1 VALUES(2, 'name2');
|
||||
INSERT INTO temp.t1 VALUES(3, 'name3');
|
||||
CREATE USER 'user1'@'%';
|
||||
RENAME USER 'user1'@'%' TO 'user2'@'%';
|
||||
# Show privileges after rename and BEFORE grant
|
||||
SHOW GRANTS FOR 'user2'@'%';
|
||||
Grants for user2@%
|
||||
GRANT USAGE ON *.* TO 'user2'@'%'
|
||||
GRANT SELECT (a), INSERT (b) ON `temp`.`t1` TO 'user2'@'%';
|
||||
# Show privileges after rename and grant
|
||||
SHOW GRANTS FOR 'user2'@'%';
|
||||
Grants for user2@%
|
||||
GRANT USAGE ON *.* TO 'user2'@'%'
|
||||
GRANT SELECT (a), INSERT (b) ON `temp`.`t1` TO 'user2'@'%'
|
||||
# Connect as the renamed user
|
||||
SHOW GRANTS;
|
||||
Grants for user2@%
|
||||
GRANT USAGE ON *.* TO 'user2'@'%'
|
||||
GRANT SELECT (a), INSERT (b) ON `temp`.`t1` TO 'user2'@'%'
|
||||
SELECT a FROM temp.t1;
|
||||
a
|
||||
1
|
||||
2
|
||||
3
|
||||
# Check for additional privileges by accessing a
|
||||
# non privileged column. We shouldn't be able to
|
||||
# access this column.
|
||||
SELECT b FROM temp.t1;
|
||||
ERROR 42000: SELECT command denied to user 'user2'@'localhost' for column 'b' in table 't1'
|
||||
DROP USER 'user2'@'%';
|
||||
DROP DATABASE temp;
|
||||
End of 5.0 tests
|
||||
|
123
mysql-test/r/grant4.result
Normal file
123
mysql-test/r/grant4.result
Normal file
@ -0,0 +1,123 @@
|
||||
drop database if exists mysqltest_db1;
|
||||
create database mysqltest_db1;
|
||||
use mysqltest_db1;
|
||||
create table t_column_priv_only (a int, b int);
|
||||
create table t_select_priv like t_column_priv_only;
|
||||
create table t_no_priv like t_column_priv_only;
|
||||
grant all privileges on test.* to mysqltest_u1@localhost;
|
||||
grant insert (a) on mysqltest_db1.t_column_priv_only to mysqltest_u1@localhost;
|
||||
grant select on mysqltest_db1.t_select_priv to mysqltest_u1@localhost;
|
||||
** Connect as restricted user mysqltest_u1.
|
||||
|
||||
** Test column level privileges only. No SELECT privileges on the table.
|
||||
** INSERT INTO ... VALUES ...
|
||||
** Attempting to insert values to a table with only column privileges
|
||||
** should work.
|
||||
insert into mysqltest_db1.t_column_priv_only (a) VALUES (1);
|
||||
|
||||
** SHOW COLUMNS
|
||||
** Should succeed because we have privileges (any) on at least one of the columns.
|
||||
select column_name as 'Field',column_type as 'Type',is_nullable as 'Null',column_key as 'Key',column_default as 'Default',extra as 'Extra' from information_schema.columns where table_schema='mysqltest_db1' and table_name='t_column_priv_only';
|
||||
Field Type Null Key Default Extra
|
||||
a int(11) YES NULL
|
||||
show columns from mysqltest_db1.t_column_priv_only;
|
||||
Field Type Null Key Default Extra
|
||||
a int(11) YES NULL
|
||||
** SHOW COLUMNS
|
||||
** Should fail because there are no privileges on any column combination.
|
||||
show columns from mysqltest_db1.t_no_priv;
|
||||
ERROR 42000: SELECT command denied to user 'mysqltest_u1'@'localhost' for table 't_no_priv'
|
||||
** However, select from I_S.COLUMNS will succeed but not show anything:
|
||||
select column_name as 'Field',column_type as 'Type',is_nullable as 'Null',column_key as 'Key',column_default as 'Default',extra as 'Extra' from information_schema.columns where table_schema='mysqltest_db1' and table_name='t_no_priv';
|
||||
Field Type Null Key Default Extra
|
||||
|
||||
** CREATE TABLE ... LIKE ... require SELECT privleges and will fail.
|
||||
create table test.t_no_priv like mysqltest_db1.column_priv_only;
|
||||
ERROR 42000: SELECT command denied to user 'mysqltest_u1'@'localhost' for table 'column_priv_only'
|
||||
|
||||
** Just to be sure... SELECT also fails.
|
||||
select * from mysqltest_db1.t_column_priv_only;
|
||||
ERROR 42000: SELECT command denied to user 'mysqltest_u1'@'localhost' for table 't_column_priv_only'
|
||||
|
||||
** SHOW CREATE TABLE ... require any privileges on all columns (the entire table).
|
||||
** First we try and fail on a table with only one column privilege.
|
||||
show create table mysqltest_db1.t_column_priv_only;
|
||||
ERROR 42000: SHOW command denied to user 'mysqltest_u1'@'localhost' for table 't_column_priv_only'
|
||||
|
||||
** Now we do the same on a table with SELECT privileges.
|
||||
|
||||
** SHOW COLUMNS
|
||||
** Success because we got some privileges on the table (SELECT_ACL)
|
||||
show columns from mysqltest_db1.t_select_priv;
|
||||
Field Type Null Key Default Extra
|
||||
a int(11) YES NULL
|
||||
b int(11) YES NULL
|
||||
|
||||
** CREATE TABLE ... LIKE ... require SELECT privleges and will SUCCEED.
|
||||
drop table if exists test.t_duplicated;
|
||||
create table test.t_duplicated like mysqltest_db1.t_select_priv;
|
||||
drop table test.t_duplicated;
|
||||
|
||||
** SHOW CREATE TABLE will succeed because we have a privilege on all columns in the table (table-level privilege).
|
||||
show create table mysqltest_db1.t_select_priv;
|
||||
Table Create Table
|
||||
t_select_priv CREATE TABLE `t_select_priv` (
|
||||
`a` int(11) DEFAULT NULL,
|
||||
`b` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
|
||||
** SHOW CREATE TABLE will fail if there is no grants at all:
|
||||
show create table mysqltest_db1.t_no_priv;
|
||||
ERROR 42000: SHOW command denied to user 'mysqltest_u1'@'localhost' for table 't_no_priv'
|
||||
|
||||
use mysqltest_db1;
|
||||
CREATE TABLE t5 (s1 INT);
|
||||
CREATE INDEX i ON t5 (s1);
|
||||
CREATE TABLE t6 (s1 INT, s2 INT);
|
||||
CREATE VIEW v5 AS SELECT * FROM t5;
|
||||
CREATE VIEW v6 AS SELECT * FROM t6;
|
||||
CREATE VIEW v2 AS SELECT * FROM t_select_priv;
|
||||
CREATE VIEW v3 AS SELECT * FROM t_select_priv;
|
||||
CREATE INDEX i ON t6 (s1);
|
||||
GRANT UPDATE (s2) ON t6 to mysqltest_u1@localhost;
|
||||
GRANT UPDATE (s2) ON v6 to mysqltest_u1@localhost;
|
||||
GRANT SHOW VIEW ON v2 to mysqltest_u1@localhost;
|
||||
GRANT SHOW VIEW, SELECT ON v3 to mysqltest_u1@localhost;
|
||||
use mysqltest_db1;
|
||||
** Connect as restricted user mysqltest_u1.
|
||||
** SELECT FROM INFORMATION_SCHEMA.STATISTICS will succeed because any privileges will do (authentication is enough).
|
||||
SELECT * FROM INFORMATION_SCHEMA.STATISTICS WHERE table_name='t5';
|
||||
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME NON_UNIQUE INDEX_SCHEMA INDEX_NAME SEQ_IN_INDEX COLUMN_NAME COLLATION CARDINALITY SUB_PART PACKED NULLABLE INDEX_TYPE COMMENT
|
||||
def mysqltest_db1 t5 1 mysqltest_db1 i 1 s1 A NULL NULL NULL YES BTREE
|
||||
** SHOW INDEX FROM t5 will fail because we don't have any privileges on any column combination.
|
||||
SHOW INDEX FROM t5;
|
||||
ERROR 42000: SELECT command denied to user 'mysqltest_u1'@'localhost' for table 't5'
|
||||
** SHOW INDEX FROM t6 will succeed because there exist a privilege on a column combination on t6.
|
||||
SHOW INDEX FROM t6;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t6 1 i 1 s1 A NULL NULL NULL YES BTREE
|
||||
** CHECK TABLE requires any privilege on any column combination and should succeed for t6:
|
||||
CHECK TABLE t6;
|
||||
Table Op Msg_type Msg_text
|
||||
mysqltest_db1.t6 check status OK
|
||||
** With no privileges access is naturally denied:
|
||||
CHECK TABLE t5;
|
||||
ERROR 42000: SELECT command denied to user 'mysqltest_u1'@'localhost' for table 't5'
|
||||
** CHECKSUM TABLE requires SELECT privileges on the table. The following should fail:
|
||||
CHECKSUM TABLE t6;
|
||||
ERROR 42000: SELECT command denied to user 'mysqltest_u1'@'localhost' for table 't6'
|
||||
** And this should work:
|
||||
CHECKSUM TABLE t_select_priv;
|
||||
Table Checksum
|
||||
mysqltest_db1.t_select_priv 0
|
||||
SHOW CREATE VIEW v5;
|
||||
ERROR 42000: SELECT command denied to user 'mysqltest_u1'@'localhost' for table 'v5'
|
||||
SHOW CREATE VIEW v6;
|
||||
ERROR 42000: SELECT command denied to user 'mysqltest_u1'@'localhost' for table 'v6'
|
||||
SHOW CREATE VIEW v2;
|
||||
ERROR 42000: SELECT command denied to user 'mysqltest_u1'@'localhost' for table 'v2'
|
||||
SHOW CREATE VIEW v3;
|
||||
View Create View character_set_client collation_connection
|
||||
v3 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v3` AS select `t_select_priv`.`a` AS `a`,`t_select_priv`.`b` AS `b` from `t_select_priv` latin1 latin1_swedish_ci
|
||||
drop database mysqltest_db1;
|
||||
drop user mysqltest_u1@localhost;
|
16
mysql-test/r/grant_lowercase_fs.result
Normal file
16
mysql-test/r/grant_lowercase_fs.result
Normal file
@ -0,0 +1,16 @@
|
||||
create database db1;
|
||||
GRANT CREATE ON db1.* to user_1@localhost;
|
||||
GRANT SELECT ON db1.* to USER_1@localhost;
|
||||
CREATE TABLE t1(f1 int);
|
||||
SELECT * FROM t1;
|
||||
ERROR 42000: SELECT command denied to user 'user_1'@'localhost' for table 't1'
|
||||
SELECT * FROM t1;
|
||||
f1
|
||||
CREATE TABLE t2(f1 int);
|
||||
ERROR 42000: CREATE command denied to user 'USER_1'@'localhost' for table 't2'
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user_1@localhost;
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM USER_1@localhost;
|
||||
DROP USER user_1@localhost;
|
||||
DROP USER USER_1@localhost;
|
||||
DROP DATABASE db1;
|
||||
use test;
|
@ -1,2 +0,0 @@
|
||||
Variable_name Value
|
||||
have_community_features YES
|
2
mysql-test/r/have_profiling.require
Normal file
2
mysql-test/r/have_profiling.require
Normal file
@ -0,0 +1,2 @@
|
||||
Variable_name Value
|
||||
have_profiling YES
|
@ -592,7 +592,7 @@ proc definer char(77)
|
||||
proc created timestamp
|
||||
proc modified timestamp
|
||||
proc sql_mode set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','NOT_USED','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH')
|
||||
proc comment char(64)
|
||||
proc comment text
|
||||
proc character_set_client char(32)
|
||||
proc collation_connection char(32)
|
||||
proc db_collation char(32)
|
||||
@ -771,6 +771,7 @@ information_schema PARTITIONS PARTITION_DESCRIPTION
|
||||
information_schema PLUGINS PLUGIN_DESCRIPTION
|
||||
information_schema PROCESSLIST INFO
|
||||
information_schema ROUTINES ROUTINE_DEFINITION
|
||||
information_schema ROUTINES ROUTINE_COMMENT
|
||||
information_schema TRIGGERS ACTION_CONDITION
|
||||
information_schema TRIGGERS ACTION_STATEMENT
|
||||
information_schema VIEWS VIEW_DEFINITION
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user