mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Merge
This commit is contained in:
16
.bzrignore
16
.bzrignore
@ -924,3 +924,19 @@ Docs/Images/mydsn.txt
|
||||
Docs/Images/myflowchart.txt
|
||||
mysql-test/mysql_test_run_new
|
||||
ndb/tools/ndb_test_platform
|
||||
help
|
||||
ndbcluster-1186
|
||||
ndbcluster-1186/SCCS
|
||||
ndbcluster-1186/config.ini
|
||||
ndbcluster-1186/ndb_1.pid
|
||||
ndbcluster-1186/ndb_1_out.log
|
||||
ndbcluster-1186/ndb_1_signal.log
|
||||
ndbcluster-1186/ndb_2.pid
|
||||
ndbcluster-1186/ndb_2_out.log
|
||||
ndbcluster-1186/ndb_2_signal.log
|
||||
ndbcluster-1186/ndb_3.pid
|
||||
ndbcluster-1186/ndb_3_cluster.log
|
||||
ndbcluster-1186/ndb_3_out.log
|
||||
ndbcluster-1186/ndbcluster.pid
|
||||
ndb/tools/ndb_restore
|
||||
ac_available_languages_fragment
|
||||
|
@ -101,6 +101,7 @@ lenz@mysql.com
|
||||
magnus@neptunus.(none)
|
||||
magnus@shellback.(none)
|
||||
marko@hundin.mysql.fi
|
||||
mats@mysql.com
|
||||
matt@mysql.com
|
||||
matthias@three.local.lan
|
||||
miguel@hegel.(none)
|
||||
@ -139,6 +140,7 @@ msvensson@build.mysql.com
|
||||
mwagner@cash.mwagner.org
|
||||
mwagner@evoq.mwagner.org
|
||||
mwagner@here.mwagner.org
|
||||
mwagner@mysql.com
|
||||
mwagner@work.mysql.com
|
||||
mydev@mysql.com
|
||||
mysql@home.(none)
|
||||
@ -163,6 +165,7 @@ pem@mysql.com
|
||||
peter@linux.local
|
||||
peter@mysql.com
|
||||
peterg@mysql.com
|
||||
petr@mysql.com
|
||||
pgulutzan@linux.local
|
||||
ram@deer.(none)
|
||||
ram@gw.mysql.r18.ru
|
||||
@ -199,6 +202,7 @@ tim@siva.hindu.god
|
||||
tim@threads.polyesthetic.msg
|
||||
tim@white.box
|
||||
tim@work.mysql.com
|
||||
timour@mysql.com
|
||||
tom@basil-firewall.home.com
|
||||
tomas@mc05.(none)
|
||||
tomas@poseidon.(none)
|
||||
|
@ -10,7 +10,7 @@ use Sys::Hostname;
|
||||
$opt_distribution=$opt_user=$opt_config_env=$opt_config_extra_env="";
|
||||
$opt_dbd_options=$opt_perl_options=$opt_config_options=$opt_make_options=$opt_suffix="";
|
||||
$opt_tmp=$opt_version_suffix="";
|
||||
$opt_bundled_zlib=$opt_help=$opt_delete=$opt_debug=$opt_stage=$opt_no_test=$opt_no_perl=$opt_with_low_memory=$opt_fast_benchmark=$opt_static_client=$opt_static_server=$opt_static_perl=$opt_sur=$opt_with_small_disk=$opt_local_perl=$opt_tcpip=$opt_build_thread=$opt_use_old_distribution=$opt_enable_shared=$opt_no_crash_me=$opt_no_strip=$opt_with_cluster=$opt_with_debug=$opt_no_benchmark=$opt_no_mysqltest=$opt_without_embedded=$opt_readline=0;
|
||||
$opt_bundled_zlib=$opt_help=$opt_delete=$opt_debug=$opt_stage=$opt_no_test=$opt_no_perl=$opt_one_error=$opt_with_low_memory=$opt_fast_benchmark=$opt_static_client=$opt_static_server=$opt_static_perl=$opt_sur=$opt_with_small_disk=$opt_local_perl=$opt_tcpip=$opt_build_thread=$opt_use_old_distribution=$opt_enable_shared=$opt_no_crash_me=$opt_no_strip=$opt_with_cluster=$opt_with_debug=$opt_no_benchmark=$opt_no_mysqltest=$opt_without_embedded=$opt_readline=0;
|
||||
$opt_innodb=$opt_bdb=$opt_raid=$opt_libwrap=$opt_clearlogs=0;
|
||||
|
||||
GetOptions(
|
||||
@ -37,6 +37,7 @@ GetOptions(
|
||||
"no-test",
|
||||
"no-mysqltest",
|
||||
"no-benchmark",
|
||||
"one-error",
|
||||
"perl-files=s",
|
||||
"perl-options=s",
|
||||
"raid",
|
||||
@ -310,6 +311,7 @@ if ($opt_stage <= 2)
|
||||
$command=$make;
|
||||
$command.= " $opt_make_options" if (defined($opt_make_options) && $opt_make_options ne "");
|
||||
safe_system($command);
|
||||
print LOG "Do-compile: Build successful\n";
|
||||
}
|
||||
|
||||
#
|
||||
@ -372,11 +374,14 @@ $ENV{"LD_LIBRARY_PATH"}= ("$test_dir/lib" .
|
||||
if ($opt_stage <= 5 && !$opt_no_test && !$opt_no_mysqltest)
|
||||
{
|
||||
my $flags= "";
|
||||
my $force= "";
|
||||
$flags.= " --with-ndbcluster" if ($opt_with_cluster);
|
||||
$flags.= " --force" if (!$opt_one_error);
|
||||
log_timestamp();
|
||||
system("mkdir $bench_tmpdir") if (! -d $bench_tmpdir);
|
||||
safe_cd("${test_dir}/mysql-test");
|
||||
check_system("./mysql-test-run $flags --tmpdir=$bench_tmpdir --master_port=$mysql_tcp_port --slave_port=$slave_port --ndbcluster_port=$ndbcluster_port --manager-port=$manager_port --no-manager --sleep=10", "tests were successful");
|
||||
# 'mysql-test-run' writes its own final message for log evaluation.
|
||||
}
|
||||
|
||||
#
|
||||
@ -555,7 +560,10 @@ Do not run any tests.
|
||||
Do not run the benchmark test (written in perl)
|
||||
|
||||
--no-mysqltest
|
||||
Do not run the the mysql-test-run test (Same as 'make test')
|
||||
Do not run the mysql-test-run test (Same as 'make test')
|
||||
|
||||
--one-error
|
||||
Terminate the mysql-test-run test after the first difference (default: use '--force')
|
||||
|
||||
--no-perl
|
||||
Do not compile or install Perl modules, use the system installed ones
|
||||
|
@ -115,7 +115,7 @@ LINK32=xilink6.exe
|
||||
# Name "mysqladmin - Win32 classic"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\mysqladmin.c
|
||||
SOURCE=.\mysqladmin.cpp
|
||||
# End Source File
|
||||
# End Target
|
||||
# End Project
|
||||
|
@ -20,14 +20,14 @@
|
||||
INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/regex \
|
||||
$(openssl_includes)
|
||||
LIBS = @CLIENT_LIBS@
|
||||
DEPLIB= @ndb_mgmclient_libs@ \
|
||||
../libmysql/libmysqlclient.la
|
||||
DEPLIB= ../libmysql/libmysqlclient.la
|
||||
LDADD = @CLIENT_EXTRA_LDFLAGS@ $(DEPLIB)
|
||||
bin_PROGRAMS = mysql mysqladmin mysqlcheck mysqlshow \
|
||||
mysqldump mysqlimport mysqltest mysqlbinlog mysqlmanagerc mysqlmanager-pwgen
|
||||
noinst_HEADERS = sql_string.h completion_hash.h my_readline.h \
|
||||
client_priv.h
|
||||
mysql_SOURCES = mysql.cc readline.cc sql_string.cc completion_hash.cc
|
||||
mysqladmin_SOURCES = mysqladmin.cc
|
||||
mysql_LDADD = @readline_link@ @TERMCAP_LIB@ $(LDADD) $(CXXLDFLAGS)
|
||||
mysqlbinlog_LDADD = $(LDADD) $(CXXLDFLAGS)
|
||||
mysql_DEPENDENCIES= $(LIBRARIES) $(pkglib_LTLIBRARIES) $(DEPLIB)
|
||||
|
@ -1609,7 +1609,7 @@ static void print_help_item(MYSQL_ROW *cur, int num_name, int num_cat, char *las
|
||||
char ccat= (*cur)[num_cat][0];
|
||||
if (*last_char != ccat)
|
||||
{
|
||||
put_info(ccat == 'Y' ? "categories :" : "topics :", INFO_INFO);
|
||||
put_info(ccat == 'Y' ? "categories:" : "topics:", INFO_INFO);
|
||||
*last_char= ccat;
|
||||
}
|
||||
tee_fprintf(PAGER, " %s\n", (*cur)[num_name]);
|
||||
@ -1676,8 +1676,8 @@ static int com_server_help(String *buffer __attribute__((unused)),
|
||||
|
||||
if (num_fields == 2)
|
||||
{
|
||||
put_info("Many help items for your request exist", INFO_INFO);
|
||||
put_info("To make a more specific request, please type 'help <item>',\nwhere item is one of next", INFO_INFO);
|
||||
put_info("Many help items for your request exist.", INFO_INFO);
|
||||
put_info("To make a more specific request, please type 'help <item>',\nwhere item is one of the following", INFO_INFO);
|
||||
num_name= 0;
|
||||
num_cat= 1;
|
||||
last_char= '_';
|
||||
|
@ -24,7 +24,7 @@
|
||||
#include <sys/stat.h>
|
||||
#include <mysql.h>
|
||||
|
||||
#ifdef HAVE_NDBCLUSTER_DB
|
||||
#ifdef LATER_HAVE_NDBCLUSTER_DB
|
||||
#include "../ndb/src/mgmclient/ndb_mgmclient.h"
|
||||
#endif
|
||||
|
||||
@ -45,7 +45,7 @@ static uint tcp_port = 0, option_wait = 0, option_silent=0, nr_iterations,
|
||||
opt_count_iterations= 0;
|
||||
static ulong opt_connect_timeout, opt_shutdown_timeout;
|
||||
static my_string unix_port=0;
|
||||
#ifdef HAVE_NDBCLUSTER_DB
|
||||
#ifdef LATER_HAVE_NDBCLUSTER_DB
|
||||
static my_bool opt_ndbcluster=0;
|
||||
static char *opt_ndb_connectstring=0;
|
||||
#endif
|
||||
@ -101,7 +101,7 @@ enum commands {
|
||||
ADMIN_PING, ADMIN_EXTENDED_STATUS, ADMIN_FLUSH_STATUS,
|
||||
ADMIN_FLUSH_PRIVILEGES, ADMIN_START_SLAVE, ADMIN_STOP_SLAVE,
|
||||
ADMIN_FLUSH_THREADS, ADMIN_OLD_PASSWORD
|
||||
#ifdef HAVE_NDBCLUSTER_DB
|
||||
#ifdef LATER_HAVE_NDBCLUSTER_DB
|
||||
,ADMIN_NDB_MGM
|
||||
#endif
|
||||
};
|
||||
@ -114,7 +114,7 @@ static const char *command_names[]= {
|
||||
"ping", "extended-status", "flush-status",
|
||||
"flush-privileges", "start-slave", "stop-slave",
|
||||
"flush-threads","old-password",
|
||||
#ifdef HAVE_NDBCLUSTER_DB
|
||||
#ifdef LATER_HAVE_NDBCLUSTER_DB
|
||||
"ndb-mgm",
|
||||
#endif
|
||||
NullS
|
||||
@ -125,6 +125,10 @@ static TYPELIB command_typelib=
|
||||
|
||||
static struct my_option my_long_options[] =
|
||||
{
|
||||
#ifdef __NETWARE__
|
||||
{"autoclose", 'a', " Auto close the screen on exit for NetWare",
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#endif
|
||||
{"count", 'c',
|
||||
"Number of iterations to make. This works with -i (--sleep) only.",
|
||||
(gptr*) &nr_iterations, (gptr*) &nr_iterations, 0, GET_UINT,
|
||||
@ -197,7 +201,7 @@ static struct my_option my_long_options[] =
|
||||
{"shutdown_timeout", OPT_SHUTDOWN_TIMEOUT, "", (gptr*) &opt_shutdown_timeout,
|
||||
(gptr*) &opt_shutdown_timeout, 0, GET_ULONG, REQUIRED_ARG,
|
||||
SHUTDOWN_DEF_TIMEOUT, 0, 3600*12, 0, 1, 0},
|
||||
#ifdef HAVE_NDBCLUSTER_DB
|
||||
#ifdef LATER_HAVE_NDBCLUSTER_DB
|
||||
{"ndbcluster", OPT_NDBCLUSTER, ""
|
||||
"", (gptr*) &opt_ndbcluster,
|
||||
(gptr*) &opt_ndbcluster, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
@ -218,6 +222,11 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
||||
int error = 0;
|
||||
|
||||
switch(optid) {
|
||||
#ifdef __NETWARE__
|
||||
case 'a':
|
||||
setscreenmode(SCR_AUTOCLOSE_ON_EXIT); // auto close the screen /
|
||||
break;
|
||||
#endif
|
||||
case 'c':
|
||||
opt_count_iterations= 1;
|
||||
break;
|
||||
@ -608,7 +617,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
|
||||
{
|
||||
char *pos,buff[40];
|
||||
ulong sec;
|
||||
pos=strchr(status,' ');
|
||||
pos= (char*) strchr(status,' ');
|
||||
*pos++=0;
|
||||
printf("%s\t\t\t",status); /* print label */
|
||||
if ((status=str2int(pos,10,0,LONG_MAX,(long*) &sec)))
|
||||
@ -903,7 +912,7 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
|
||||
}
|
||||
mysql->reconnect=1; /* Automatic reconnect is default */
|
||||
break;
|
||||
#ifdef HAVE_NDBCLUSTER_DB
|
||||
#ifdef LATER_HAVE_NDBCLUSTER_DB
|
||||
case ADMIN_NDB_MGM:
|
||||
{
|
||||
if (argc < 2)
|
||||
@ -1287,9 +1296,6 @@ static my_bool wait_pidfile(char *pidfile, time_t last_modified,
|
||||
}
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
#ifdef HAVE_NDBCLUSTER_DB
|
||||
/* lib linked in contains c++ code */
|
||||
#ifdef __GNUC__
|
||||
FIX_GCC_LINKING_PROBLEM
|
||||
#endif
|
||||
#endif
|
@ -44,7 +44,7 @@ static const char *load_default_groups[]= { "mysqlbinlog","client",0 };
|
||||
|
||||
void sql_print_error(const char *format, ...);
|
||||
|
||||
static bool one_database=0, to_last_remote_log= 0;
|
||||
static bool one_database=0, to_last_remote_log= 0, disable_log_bin= 0;
|
||||
static const char* database= 0;
|
||||
static my_bool force_opt= 0, short_form= 0, remote_opt= 0;
|
||||
static ulonglong offset = 0;
|
||||
@ -438,6 +438,13 @@ static struct my_option my_long_options[] =
|
||||
{"database", 'd', "List entries for just this database (local log only).",
|
||||
(gptr*) &database, (gptr*) &database, 0, GET_STR_ALLOC, REQUIRED_ARG,
|
||||
0, 0, 0, 0, 0, 0},
|
||||
{"disable-log-bin", 'D', "Disable binary log. This is useful, if you "
|
||||
"enabled --to-last-log and are sending the output to the same MySQL server. "
|
||||
"This way you could avoid an endless loop. You would also like to use it "
|
||||
"when restoring after a crash to avoid duplication of the statements you "
|
||||
"already have. NOTE: you will need a SUPER privilege to use this option.",
|
||||
(gptr*) &disable_log_bin, (gptr*) &disable_log_bin, 0, GET_BOOL,
|
||||
NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"force-read", 'f', "Force reading unknown binlog events.",
|
||||
(gptr*) &force_opt, (gptr*) &force_opt, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
|
||||
0, 0},
|
||||
@ -1068,6 +1075,11 @@ int main(int argc, char** argv)
|
||||
|
||||
fprintf(result_file,
|
||||
"/*!40019 SET @@session.max_insert_delayed_threads=0*/;\n");
|
||||
|
||||
if (disable_log_bin)
|
||||
fprintf(result_file,
|
||||
"/*!32316 SET @OLD_SQL_LOG_BIN=@@SQL_LOG_BIN, SQL_LOG_BIN=0*/;\n");
|
||||
|
||||
for (save_stop_position= stop_position, stop_position= ~(my_off_t)0 ;
|
||||
(--argc >= 0) && !stop_passed ; )
|
||||
{
|
||||
@ -1082,6 +1094,9 @@ int main(int argc, char** argv)
|
||||
start_position= BIN_LOG_HEADER_SIZE;
|
||||
}
|
||||
|
||||
if (disable_log_bin)
|
||||
fprintf(result_file, "/*!32316 SET SQL_LOG_BIN=@OLD_SQL_LOG_BIN*/;\n");
|
||||
|
||||
if (tmpdir.list)
|
||||
free_tmpdir(&tmpdir);
|
||||
if (result_file != stdout)
|
||||
|
@ -1890,7 +1890,7 @@ static int init_dumping(char *database)
|
||||
MYSQL_ROW row;
|
||||
MYSQL_RES *dbinfo;
|
||||
|
||||
sprintf(qbuf,"SHOW CREATE DATABASE WITH IF NOT EXISTS %s",
|
||||
sprintf(qbuf,"SHOW CREATE DATABASE IF NOT EXISTS %s",
|
||||
qdatabase);
|
||||
|
||||
if (mysql_query_with_error_report(sock, &dbinfo, qbuf))
|
||||
|
@ -399,7 +399,6 @@ then
|
||||
then
|
||||
if $CXX -v 2>&1 | grep 'version 3' > /dev/null 2>&1
|
||||
then
|
||||
CFLAGS="$CFLAGS -DDEFINE_CXA_PURE_VIRTUAL"
|
||||
CXXFLAGS="$CXXFLAGS -DUSE_MYSYS_NEW -DDEFINE_CXA_PURE_VIRTUAL"
|
||||
fi
|
||||
fi
|
||||
@ -1932,9 +1931,11 @@ AC_CHECK_FUNCS(alarm bcmp bfill bmove bzero chsize cuserid fchmod fcntl \
|
||||
#
|
||||
#
|
||||
case "$target" in
|
||||
*-*-aix4*)
|
||||
*-*-aix4* | *-*-sco*)
|
||||
# (grr) aix 4.3 has a stub for clock_gettime, (returning ENOSYS)
|
||||
# and using AC_TRY_RUN is hard when cross-compiling
|
||||
# We also disable for SCO for the time being, the headers for the
|
||||
# thread library we use conflicts with other headers.
|
||||
;;
|
||||
*) AC_CHECK_FUNCS(clock_gettime)
|
||||
;;
|
||||
|
@ -69,7 +69,7 @@ static HA_ERRORS ha_errlist[]=
|
||||
{
|
||||
{ 120,"Didn't find key on read or update" },
|
||||
{ 121,"Duplicate key on write or update" },
|
||||
{ 123,"Someone has changed the row since it was read; Update with is recoverable" },
|
||||
{ 123,"Someone has changed the row since it was read (while the table was locked to prevent it)" },
|
||||
{ 124,"Wrong index given to function" },
|
||||
{ 126,"Index file is crashed" },
|
||||
{ 127,"Record-file is crashed" },
|
||||
|
@ -52,6 +52,7 @@ int heap_rfirst(HP_INFO *info, byte *record, int inx)
|
||||
my_errno=HA_ERR_END_OF_FILE;
|
||||
DBUG_RETURN(my_errno);
|
||||
}
|
||||
DBUG_ASSERT(0); /* TODO fix it */
|
||||
info->current_record=0;
|
||||
info->current_hash_ptr=0;
|
||||
info->update=HA_STATE_PREV_FOUND;
|
||||
|
@ -63,7 +63,7 @@ typedef struct unicase_info_st
|
||||
#define MY_CS_UNICODE 128 /* is a charset is full unicode */
|
||||
#define MY_CS_READY 256 /* if a charset is initialized */
|
||||
#define MY_CS_AVAILABLE 512 /* If either compiled-in or loaded*/
|
||||
|
||||
#define MY_CS_CSSORT 1024 /* if case sensitive sort order */
|
||||
#define MY_CHARSET_UNDEFINED 0
|
||||
|
||||
|
||||
|
@ -58,14 +58,15 @@ void init_time(void);
|
||||
my_time_t
|
||||
my_system_gmt_sec(const MYSQL_TIME *t, long *my_timezone, bool *in_dst_time_gap);
|
||||
|
||||
void set_zero_time(MYSQL_TIME *tm);
|
||||
void set_zero_time(MYSQL_TIME *tm, enum enum_mysql_timestamp_type time_type);
|
||||
|
||||
/*
|
||||
Required buffer length for my_time_to_str, my_date_to_str,
|
||||
my_datetime_to_str and TIME_to_string functions. Note, that the
|
||||
caller is still responsible to check that given TIME structure
|
||||
has values in valid ranges, otherwise size of the buffer could
|
||||
be not enough.
|
||||
be not enough. We also rely on the fact that even wrong values
|
||||
sent using binary protocol fit in this buffer.
|
||||
*/
|
||||
#define MAX_DATE_STRING_REP_LENGTH 30
|
||||
|
||||
|
@ -33,6 +33,18 @@ enum enum_mysql_timestamp_type
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
Structure which is used to represent datetime values inside MySQL.
|
||||
|
||||
We assume that values in this structure are normalized, i.e. year <= 9999,
|
||||
month <= 12, day <= 31, hour <= 23, hour <= 59, hour <= 59. Many functions
|
||||
in server such as my_system_gmt_sec() or make_time() family of functions
|
||||
rely on this (actually now usage of make_*() family relies on a bit weaker
|
||||
restriction). Also functions that produce MYSQL_TIME as result ensure this.
|
||||
There is one exception to this rule though if this structure holds time
|
||||
value (time_type == MYSQL_TIMESTAMP_TIME) days and hour member can hold
|
||||
bigger values.
|
||||
*/
|
||||
typedef struct st_mysql_time
|
||||
{
|
||||
unsigned int year, month, day, hour, minute, second;
|
||||
|
@ -547,8 +547,9 @@ buf_pool_init(
|
||||
}
|
||||
/*----------------------------------------*/
|
||||
} else {
|
||||
buf_pool->frame_mem = ut_malloc(
|
||||
UNIV_PAGE_SIZE * (n_frames + 1));
|
||||
buf_pool->frame_mem = ut_malloc_low(
|
||||
UNIV_PAGE_SIZE * (n_frames + 1),
|
||||
TRUE, FALSE);
|
||||
}
|
||||
|
||||
if (buf_pool->frame_mem == NULL) {
|
||||
|
@ -42,6 +42,10 @@ initial segment in buf_LRU_get_recent_limit */
|
||||
|
||||
#define BUF_LRU_INITIAL_RATIO 8
|
||||
|
||||
/* If we switch on the InnoDB monitor because there are too few available
|
||||
frames in the buffer pool, we set this to TRUE */
|
||||
ibool buf_lru_switched_on_innodb_mon = FALSE;
|
||||
|
||||
/**********************************************************************
|
||||
Takes a block out of the LRU list and page hash table and sets the block
|
||||
state to BUF_BLOCK_REMOVE_HASH. */
|
||||
@ -287,6 +291,32 @@ buf_LRU_try_free_flushed_blocks(void)
|
||||
mutex_exit(&(buf_pool->mutex));
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
Returns TRUE if less than 15 % of the buffer pool is available. This can be
|
||||
used in heuristics to prevent huge transactions eating up the whole buffer
|
||||
pool for their locks. */
|
||||
|
||||
ibool
|
||||
buf_LRU_buf_pool_running_out(void)
|
||||
/*==============================*/
|
||||
/* out: TRUE if less than 15 % of buffer pool
|
||||
left */
|
||||
{
|
||||
ibool ret = FALSE;
|
||||
|
||||
mutex_enter(&(buf_pool->mutex));
|
||||
|
||||
if (!recv_recovery_on && UT_LIST_GET_LEN(buf_pool->free)
|
||||
+ UT_LIST_GET_LEN(buf_pool->LRU) < buf_pool->max_size / 7) {
|
||||
|
||||
ret = TRUE;
|
||||
}
|
||||
|
||||
mutex_exit(&(buf_pool->mutex));
|
||||
|
||||
return(ret);
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
Returns a free block from buf_pool. The block is taken off the free list.
|
||||
If it is empty, blocks are moved from the end of the LRU list to the free
|
||||
@ -325,7 +355,8 @@ loop:
|
||||
|
||||
} else if (!recv_recovery_on && UT_LIST_GET_LEN(buf_pool->free)
|
||||
+ UT_LIST_GET_LEN(buf_pool->LRU) < buf_pool->max_size / 5) {
|
||||
if (!srv_print_innodb_monitor) {
|
||||
|
||||
if (!buf_lru_switched_on_innodb_mon) {
|
||||
|
||||
/* Over 80 % of the buffer pool is occupied by lock
|
||||
heaps or the adaptive hash index. This may be a memory
|
||||
@ -342,16 +373,18 @@ loop:
|
||||
"InnoDB: lock heap and hash index sizes.\n",
|
||||
(ulong) (buf_pool->curr_size / (1024 * 1024 / UNIV_PAGE_SIZE)));
|
||||
|
||||
buf_lru_switched_on_innodb_mon = TRUE;
|
||||
srv_print_innodb_monitor = TRUE;
|
||||
os_event_set(srv_lock_timeout_thread_event);
|
||||
}
|
||||
} else if (!recv_recovery_on && UT_LIST_GET_LEN(buf_pool->free)
|
||||
+ UT_LIST_GET_LEN(buf_pool->LRU) < buf_pool->max_size / 4) {
|
||||
} else if (buf_lru_switched_on_innodb_mon) {
|
||||
|
||||
/* Switch off the InnoDB Monitor; this is a simple way
|
||||
to stop the monitor if the situation becomes less urgent,
|
||||
but may also surprise users! */
|
||||
but may also surprise users if the user also switched on the
|
||||
monitor! */
|
||||
|
||||
buf_lru_switched_on_innodb_mon = FALSE;
|
||||
srv_print_innodb_monitor = FALSE;
|
||||
}
|
||||
|
||||
|
@ -110,6 +110,9 @@ esac
|
||||
case "$target" in
|
||||
i[[4567]]86-*-*)
|
||||
CFLAGS="$CFLAGS -DUNIV_INTEL_X86";;
|
||||
# The compiler on Linux/S390 does not seem to have inlining
|
||||
s390-*-*)
|
||||
CFLAGS="$CFLAGS -DUNIV_MUST_NOT_INLINE";;
|
||||
esac
|
||||
|
||||
AC_OUTPUT(Makefile os/Makefile ut/Makefile btr/Makefile dnl
|
||||
|
@ -106,7 +106,7 @@ struct fil_node_struct {
|
||||
device or a raw disk partition */
|
||||
ulint size; /* size of the file in database pages, 0 if
|
||||
not known yet; the possible last incomplete
|
||||
megabyte is ignored if space == 0 */
|
||||
megabyte may be ignored if space == 0 */
|
||||
ulint n_pending;
|
||||
/* count of pending i/o's on this file;
|
||||
closing of the file is not allowed if
|
||||
@ -160,7 +160,9 @@ struct fil_space_struct {
|
||||
UT_LIST_BASE_NODE_T(fil_node_t) chain;
|
||||
/* base node for the file chain */
|
||||
ulint size; /* space size in pages; 0 if a single-table
|
||||
tablespace whose size we do not know yet */
|
||||
tablespace whose size we do not know yet;
|
||||
last incomplete megabytes in data files may be
|
||||
ignored if space == 0 */
|
||||
ulint n_reserved_extents;
|
||||
/* number of reserved free extents for
|
||||
ongoing operations like B-tree page split */
|
||||
@ -3255,7 +3257,7 @@ fil_extend_space_to_desired_size(
|
||||
ulint* actual_size, /* out: size of the space after extension;
|
||||
if we ran out of disk space this may be lower
|
||||
than the desired size */
|
||||
ulint space_id, /* in: space id, must be != 0 */
|
||||
ulint space_id, /* in: space id */
|
||||
ulint size_after_extend)/* in: desired size in pages after the
|
||||
extension; if the current space size is bigger
|
||||
than this already, the function does nothing */
|
||||
@ -3352,6 +3354,17 @@ fil_extend_space_to_desired_size(
|
||||
fil_node_complete_io(node, system, OS_FILE_WRITE);
|
||||
|
||||
*actual_size = space->size;
|
||||
|
||||
if (space_id == 0) {
|
||||
ulint pages_per_mb = (1024 * 1024) / UNIV_PAGE_SIZE;
|
||||
|
||||
/* Keep the last data file size info up to date, rounded to
|
||||
full megabytes */
|
||||
|
||||
srv_data_file_sizes[srv_n_data_files - 1] =
|
||||
(node->size / pages_per_mb) * pages_per_mb;
|
||||
}
|
||||
|
||||
/*
|
||||
printf("Extended %s to %lu, actual size %lu pages\n", space->name,
|
||||
size_after_extend, *actual_size); */
|
||||
|
@ -25,6 +25,16 @@ wasted. */
|
||||
void
|
||||
buf_LRU_try_free_flushed_blocks(void);
|
||||
/*==================================*/
|
||||
/**********************************************************************
|
||||
Returns TRUE if less than 15 % of the buffer pool is available. This can be
|
||||
used in heuristics to prevent huge transactions eating up the whole buffer
|
||||
pool for their locks. */
|
||||
|
||||
ibool
|
||||
buf_LRU_buf_pool_running_out(void);
|
||||
/*==============================*/
|
||||
/* out: TRUE if less than 15 % of buffer pool
|
||||
left */
|
||||
|
||||
/*#######################################################################
|
||||
These are low-level functions
|
||||
|
@ -53,7 +53,11 @@ Created 5/24/1996 Heikki Tuuri
|
||||
name already exists */
|
||||
#define DB_TABLESPACE_DELETED 44 /* tablespace does not exist or is
|
||||
being dropped right now */
|
||||
|
||||
#define DB_LOCK_TABLE_FULL 45 /* lock structs have exhausted the
|
||||
buffer pool (for big transactions,
|
||||
InnoDB stores the lock structs in the
|
||||
buffer pool) */
|
||||
|
||||
/* The following are partial failure codes */
|
||||
#define DB_FAIL 1000
|
||||
#define DB_OVERFLOW 1001
|
||||
|
@ -478,7 +478,7 @@ fil_extend_space_to_desired_size(
|
||||
ulint* actual_size, /* out: size of the space after extension;
|
||||
if we ran out of disk space this may be lower
|
||||
than the desired size */
|
||||
ulint space_id, /* in: space id, must be != 0 */
|
||||
ulint space_id, /* in: space id */
|
||||
ulint size_after_extend);/* in: desired size in pages after the
|
||||
extension; if the current space size is bigger
|
||||
than this already, the function does nothing */
|
||||
|
@ -463,13 +463,32 @@ lock_rec_hash(
|
||||
ulint space, /* in: space */
|
||||
ulint page_no);/* in: page number */
|
||||
/*************************************************************************
|
||||
Gets the table covered by an IX table lock. */
|
||||
Gets the source table of an ALTER TABLE transaction. The table must be
|
||||
covered by an IX or IS table lock. */
|
||||
|
||||
dict_table_t*
|
||||
lock_get_ix_table(
|
||||
/*==============*/
|
||||
/* out: the table covered by the lock */
|
||||
lock_t* lock); /* in: table lock */
|
||||
lock_get_src_table(
|
||||
/*===============*/
|
||||
/* out: the source table of transaction,
|
||||
if it is covered by an IX or IS table lock;
|
||||
dest if there is no source table, and
|
||||
NULL if the transaction is locking more than
|
||||
two tables or an inconsistency is found */
|
||||
trx_t* trx, /* in: transaction */
|
||||
dict_table_t* dest, /* in: destination of ALTER TABLE */
|
||||
ulint* mode); /* out: lock mode of the source table */
|
||||
/*************************************************************************
|
||||
Determine if the given table is exclusively "owned" by the given
|
||||
transaction, i.e., transaction holds LOCK_IX and possibly LOCK_AUTO_INC
|
||||
on the table. */
|
||||
|
||||
ibool
|
||||
lock_is_table_exclusive(
|
||||
/*====================*/
|
||||
/* out: TRUE if table is only locked by trx,
|
||||
with LOCK_IX, and possibly LOCK_AUTO_INC */
|
||||
dict_table_t* table, /* in: table */
|
||||
trx_t* trx); /* in: transaction */
|
||||
/*************************************************************************
|
||||
Checks that a transaction id is sensible, i.e., not in the future. */
|
||||
|
||||
|
@ -177,10 +177,12 @@ row_lock_table_for_mysql(
|
||||
/* out: error code or DB_SUCCESS */
|
||||
row_prebuilt_t* prebuilt, /* in: prebuilt struct in the MySQL
|
||||
table handle */
|
||||
dict_table_t* table); /* in: table to LOCK_IX, or NULL
|
||||
dict_table_t* table, /* in: table to lock, or NULL
|
||||
if prebuilt->table should be
|
||||
locked as LOCK_TABLE_EXP |
|
||||
prebuilt->select_lock_type */
|
||||
ulint mode); /* in: lock mode of table */
|
||||
|
||||
/*************************************************************************
|
||||
Does an insert for MySQL. */
|
||||
|
||||
|
@ -120,6 +120,7 @@ row_search_for_mysql(
|
||||
/* out: DB_SUCCESS,
|
||||
DB_RECORD_NOT_FOUND,
|
||||
DB_END_OF_INDEX, DB_DEADLOCK,
|
||||
DB_LOCK_TABLE_FULL,
|
||||
or DB_TOO_BIG_RECORD */
|
||||
byte* buf, /* in/out: buffer for the fetched
|
||||
row in the MySQL format */
|
||||
|
@ -38,8 +38,10 @@ ut_malloc_low(
|
||||
/*==========*/
|
||||
/* out, own: allocated memory */
|
||||
ulint n, /* in: number of bytes to allocate */
|
||||
ibool set_to_zero); /* in: TRUE if allocated memory should be set
|
||||
ibool set_to_zero, /* in: TRUE if allocated memory should be set
|
||||
to zero if UNIV_SET_MEM_TO_ZERO is defined */
|
||||
ibool assert_on_error); /* in: if TRUE, we crash mysqld if the memory
|
||||
cannot be allocated */
|
||||
/**************************************************************************
|
||||
Allocates memory. Sets it also to zero if UNIV_SET_MEM_TO_ZERO is
|
||||
defined. */
|
||||
|
@ -365,6 +365,21 @@ lock_deadlock_recursive(
|
||||
ulint* cost); /* in/out: number of calculation steps thus
|
||||
far: if this exceeds LOCK_MAX_N_STEPS_...
|
||||
we return TRUE */
|
||||
|
||||
/*************************************************************************
|
||||
Gets the type of a lock. */
|
||||
UNIV_INLINE
|
||||
ulint
|
||||
lock_get_type(
|
||||
/*==========*/
|
||||
/* out: LOCK_TABLE or LOCK_REC */
|
||||
lock_t* lock) /* in: lock */
|
||||
{
|
||||
ut_ad(lock);
|
||||
|
||||
return(lock->type_mode & LOCK_TYPE_MASK);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
Gets the nth bit of a record lock. */
|
||||
UNIV_INLINE
|
||||
@ -395,19 +410,6 @@ lock_rec_get_nth_bit(
|
||||
return(ut_bit_get_nth(b, bit_index));
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
Gets the table covered by an IX table lock. */
|
||||
|
||||
dict_table_t*
|
||||
lock_get_ix_table(
|
||||
/*==============*/
|
||||
/* out: the table covered by the lock */
|
||||
lock_t* lock) /* in: table lock */
|
||||
{
|
||||
ut_a(lock->type_mode == (LOCK_TABLE | LOCK_IX));
|
||||
return(lock->un_member.tab_lock.table);
|
||||
}
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
#define lock_mutex_enter_kernel() mutex_enter(&kernel_mutex)
|
||||
@ -581,20 +583,6 @@ lock_get_mode(
|
||||
return(lock->type_mode & LOCK_MODE_MASK);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
Gets the type of a lock. */
|
||||
UNIV_INLINE
|
||||
ulint
|
||||
lock_get_type(
|
||||
/*==========*/
|
||||
/* out: LOCK_TABLE or LOCK_REC */
|
||||
lock_t* lock) /* in: lock */
|
||||
{
|
||||
ut_ad(lock);
|
||||
|
||||
return(lock->type_mode & LOCK_TYPE_MASK);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
Gets the wait flag of a lock. */
|
||||
UNIV_INLINE
|
||||
@ -614,6 +602,128 @@ lock_get_wait(
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
Gets the source table of an ALTER TABLE transaction. The table must be
|
||||
covered by an IX or IS table lock. */
|
||||
|
||||
dict_table_t*
|
||||
lock_get_src_table(
|
||||
/*===============*/
|
||||
/* out: the source table of transaction,
|
||||
if it is covered by an IX or IS table lock;
|
||||
dest if there is no source table, and
|
||||
NULL if the transaction is locking more than
|
||||
two tables or an inconsistency is found */
|
||||
trx_t* trx, /* in: transaction */
|
||||
dict_table_t* dest, /* in: destination of ALTER TABLE */
|
||||
ulint* mode) /* out: lock mode of the source table */
|
||||
{
|
||||
dict_table_t* src;
|
||||
lock_t* lock;
|
||||
|
||||
src = NULL;
|
||||
*mode = LOCK_NONE;
|
||||
|
||||
for (lock = UT_LIST_GET_FIRST(trx->trx_locks);
|
||||
lock;
|
||||
lock = UT_LIST_GET_NEXT(trx_locks, lock)) {
|
||||
lock_table_t* tab_lock;
|
||||
ulint lock_mode;
|
||||
if (!(lock_get_type(lock) & LOCK_TABLE)) {
|
||||
/* We are only interested in table locks. */
|
||||
continue;
|
||||
}
|
||||
tab_lock = &lock->un_member.tab_lock;
|
||||
if (dest == tab_lock->table) {
|
||||
/* We are not interested in the destination table. */
|
||||
continue;
|
||||
} else if (!src) {
|
||||
/* This presumably is the source table. */
|
||||
src = tab_lock->table;
|
||||
if (UT_LIST_GET_LEN(src->locks) != 1 ||
|
||||
UT_LIST_GET_FIRST(src->locks) != lock) {
|
||||
/* We only support the case when
|
||||
there is only one lock on this table. */
|
||||
return(NULL);
|
||||
}
|
||||
} else if (src != tab_lock->table) {
|
||||
/* The transaction is locking more than
|
||||
two tables (src and dest): abort */
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
/* Check that the source table is locked by
|
||||
LOCK_IX or LOCK_IS. */
|
||||
lock_mode = lock_get_mode(lock);
|
||||
switch (lock_mode) {
|
||||
case LOCK_IX:
|
||||
case LOCK_IS:
|
||||
if (*mode != LOCK_NONE && *mode != lock_mode) {
|
||||
/* There are multiple locks on src. */
|
||||
return(NULL);
|
||||
}
|
||||
*mode = lock_mode;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!src) {
|
||||
/* No source table lock found: flag the situation to caller */
|
||||
src = dest;
|
||||
}
|
||||
|
||||
return(src);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
Determine if the given table is exclusively "owned" by the given
|
||||
transaction, i.e., transaction holds LOCK_IX and possibly LOCK_AUTO_INC
|
||||
on the table. */
|
||||
|
||||
ibool
|
||||
lock_is_table_exclusive(
|
||||
/*====================*/
|
||||
/* out: TRUE if table is only locked by trx,
|
||||
with LOCK_IX, and possibly LOCK_AUTO_INC */
|
||||
dict_table_t* table, /* in: table */
|
||||
trx_t* trx) /* in: transaction */
|
||||
{
|
||||
lock_t* lock;
|
||||
bool ok = FALSE;
|
||||
|
||||
ut_ad(table && trx);
|
||||
|
||||
for (lock = UT_LIST_GET_FIRST(table->locks);
|
||||
lock;
|
||||
lock = UT_LIST_GET_NEXT(locks, &lock->un_member.tab_lock)) {
|
||||
if (lock->trx != trx) {
|
||||
/* A lock on the table is held
|
||||
by some other transaction. */
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
if (!(lock_get_type(lock) & LOCK_TABLE)) {
|
||||
/* We are interested in table locks only. */
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (lock_get_mode(lock)) {
|
||||
case LOCK_IX:
|
||||
ok = TRUE;
|
||||
break;
|
||||
case LOCK_AUTO_INC:
|
||||
/* It is allowed for trx to hold an
|
||||
auto_increment lock. */
|
||||
break;
|
||||
default:
|
||||
/* Other table locks than LOCK_IX are not allowed. */
|
||||
return(FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
return(ok);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
Sets the wait flag of a lock and the back pointer in trx to lock. */
|
||||
UNIV_INLINE
|
||||
@ -4063,6 +4173,9 @@ lock_print_info(
|
||||
(ulong) ut_dulint_get_high(purge_sys->purge_undo_no),
|
||||
(ulong) ut_dulint_get_low(purge_sys->purge_undo_no));
|
||||
|
||||
fprintf(file,
|
||||
"History list length %lu\n", (ulong) trx_sys->rseg_history_len);
|
||||
|
||||
fprintf(file,
|
||||
"Total number of lock structs in row lock hash table %lu\n",
|
||||
(ulong) lock_get_n_rec_locks());
|
||||
|
@ -199,7 +199,7 @@ mem_pool_create(
|
||||
but only when allocated at a higher level in mem0mem.c.
|
||||
This is to avoid masking useful Purify warnings. */
|
||||
|
||||
pool->buf = ut_malloc_low(size, FALSE);
|
||||
pool->buf = ut_malloc_low(size, FALSE, TRUE);
|
||||
pool->size = size;
|
||||
|
||||
mutex_create(&(pool->mutex));
|
||||
|
@ -1509,7 +1509,6 @@ row_ins_scan_sec_index_for_duplicate(
|
||||
ibool moved;
|
||||
mtr_t mtr;
|
||||
trx_t* trx;
|
||||
const char* ptr;
|
||||
|
||||
n_unique = dict_index_get_n_unique(index);
|
||||
|
||||
@ -1630,7 +1629,6 @@ row_ins_duplicate_error_in_clust(
|
||||
page_t* page;
|
||||
ulint n_unique;
|
||||
trx_t* trx = thr_get_trx(thr);
|
||||
const char* ptr;
|
||||
|
||||
UT_NOT_USED(mtr);
|
||||
|
||||
|
@ -308,7 +308,8 @@ handle_new_error:
|
||||
|
||||
return(TRUE);
|
||||
|
||||
} else if (err == DB_DEADLOCK || err == DB_LOCK_WAIT_TIMEOUT) {
|
||||
} else if (err == DB_DEADLOCK || err == DB_LOCK_WAIT_TIMEOUT
|
||||
|| err == DB_LOCK_TABLE_FULL) {
|
||||
/* Roll back the whole transaction; this resolution was added
|
||||
to version 3.23.43 */
|
||||
|
||||
@ -781,10 +782,11 @@ row_lock_table_for_mysql(
|
||||
/* out: error code or DB_SUCCESS */
|
||||
row_prebuilt_t* prebuilt, /* in: prebuilt struct in the MySQL
|
||||
table handle */
|
||||
dict_table_t* table) /* in: table to LOCK_IX, or NULL
|
||||
dict_table_t* table, /* in: table to lock, or NULL
|
||||
if prebuilt->table should be
|
||||
locked as LOCK_TABLE_EXP |
|
||||
prebuilt->select_lock_type */
|
||||
ulint mode) /* in: lock mode of table */
|
||||
{
|
||||
trx_t* trx = prebuilt->trx;
|
||||
que_thr_t* thr;
|
||||
@ -818,7 +820,7 @@ run_again:
|
||||
trx_start_if_not_started(trx);
|
||||
|
||||
if (table) {
|
||||
err = lock_table(0, table, LOCK_IX, thr);
|
||||
err = lock_table(0, table, mode, thr);
|
||||
} else {
|
||||
err = lock_table(LOCK_TABLE_EXP, prebuilt->table,
|
||||
prebuilt->select_lock_type, thr);
|
||||
|
@ -31,6 +31,7 @@ Created 12/19/1997 Heikki Tuuri
|
||||
#include "pars0pars.h"
|
||||
#include "row0mysql.h"
|
||||
#include "read0read.h"
|
||||
#include "buf0lru.h"
|
||||
|
||||
/* Maximum number of rows to prefetch; MySQL interface has another parameter */
|
||||
#define SEL_MAX_N_PREFETCH 16
|
||||
@ -638,23 +639,24 @@ row_sel_get_clust_rec(
|
||||
if (!node->read_view) {
|
||||
/* Try to place a lock on the index record */
|
||||
|
||||
/* If innodb_locks_unsafe_for_binlog option is used,
|
||||
we lock only the record, i.e. next-key locking is
|
||||
not used.
|
||||
*/
|
||||
if ( srv_locks_unsafe_for_binlog )
|
||||
{
|
||||
err = lock_clust_rec_read_check_and_lock(0, clust_rec,
|
||||
index,node->row_lock_mode, LOCK_REC_NOT_GAP, thr);
|
||||
}
|
||||
else
|
||||
{
|
||||
err = lock_clust_rec_read_check_and_lock(0, clust_rec, index,
|
||||
node->row_lock_mode, LOCK_ORDINARY, thr);
|
||||
/* If innodb_locks_unsafe_for_binlog option is used,
|
||||
we lock only the record, i.e. next-key locking is
|
||||
not used.
|
||||
*/
|
||||
|
||||
}
|
||||
if (srv_locks_unsafe_for_binlog) {
|
||||
err = lock_clust_rec_read_check_and_lock(0,
|
||||
clust_rec,
|
||||
index, node->row_lock_mode,
|
||||
LOCK_REC_NOT_GAP, thr);
|
||||
} else {
|
||||
err = lock_clust_rec_read_check_and_lock(0,
|
||||
clust_rec,
|
||||
index, node->row_lock_mode,
|
||||
LOCK_ORDINARY, thr);
|
||||
}
|
||||
|
||||
if (err != DB_SUCCESS) {
|
||||
if (err != DB_SUCCESS) {
|
||||
|
||||
return(err);
|
||||
}
|
||||
@ -729,8 +731,18 @@ sel_set_rec_lock(
|
||||
ulint type, /* in: LOCK_ORDINARY, LOCK_GAP, or LOC_REC_NOT_GAP */
|
||||
que_thr_t* thr) /* in: query thread */
|
||||
{
|
||||
trx_t* trx;
|
||||
ulint err;
|
||||
|
||||
trx = thr_get_trx(thr);
|
||||
|
||||
if (UT_LIST_GET_LEN(trx->trx_locks) > 10000) {
|
||||
if (buf_LRU_buf_pool_running_out()) {
|
||||
|
||||
return(DB_LOCK_TABLE_FULL);
|
||||
}
|
||||
}
|
||||
|
||||
if (index->type & DICT_CLUSTERED) {
|
||||
err = lock_clust_rec_read_check_and_lock(0, rec, index, mode,
|
||||
type, thr);
|
||||
@ -1205,22 +1217,24 @@ rec_loop:
|
||||
|
||||
if (!consistent_read) {
|
||||
|
||||
/* If innodb_locks_unsafe_for_binlog option is used,
|
||||
we lock only the record, i.e. next-key locking is
|
||||
not used.
|
||||
*/
|
||||
/* If innodb_locks_unsafe_for_binlog option is used,
|
||||
we lock only the record, i.e. next-key locking is
|
||||
not used.
|
||||
*/
|
||||
|
||||
if ( srv_locks_unsafe_for_binlog )
|
||||
{
|
||||
err = sel_set_rec_lock(page_rec_get_next(rec), index,
|
||||
node->row_lock_mode, LOCK_REC_NOT_GAP, thr);
|
||||
}
|
||||
else
|
||||
{
|
||||
err = sel_set_rec_lock(page_rec_get_next(rec), index,
|
||||
node->row_lock_mode, LOCK_ORDINARY, thr);
|
||||
}
|
||||
if (err != DB_SUCCESS) {
|
||||
if (srv_locks_unsafe_for_binlog) {
|
||||
err = sel_set_rec_lock(page_rec_get_next(rec),
|
||||
index,
|
||||
node->row_lock_mode,
|
||||
LOCK_REC_NOT_GAP, thr);
|
||||
} else {
|
||||
err = sel_set_rec_lock(page_rec_get_next(rec),
|
||||
index,
|
||||
node->row_lock_mode,
|
||||
LOCK_ORDINARY, thr);
|
||||
}
|
||||
|
||||
if (err != DB_SUCCESS) {
|
||||
/* Note that in this case we will store in pcur
|
||||
the PREDECESSOR of the record we are waiting
|
||||
the lock for */
|
||||
@ -1245,21 +1259,18 @@ rec_loop:
|
||||
if (!consistent_read) {
|
||||
/* Try to place a lock on the index record */
|
||||
|
||||
/* If innodb_locks_unsafe_for_binlog option is used,
|
||||
we lock only the record, i.e. next-key locking is
|
||||
not used.
|
||||
*/
|
||||
/* If innodb_locks_unsafe_for_binlog option is used,
|
||||
we lock only the record, i.e. next-key locking is
|
||||
not used.
|
||||
*/
|
||||
|
||||
if ( srv_locks_unsafe_for_binlog )
|
||||
{
|
||||
err = sel_set_rec_lock(rec, index, node->row_lock_mode,
|
||||
if (srv_locks_unsafe_for_binlog) {
|
||||
err = sel_set_rec_lock(rec, index, node->row_lock_mode,
|
||||
LOCK_REC_NOT_GAP, thr);
|
||||
}
|
||||
else
|
||||
{
|
||||
err = sel_set_rec_lock(rec, index, node->row_lock_mode,
|
||||
} else {
|
||||
err = sel_set_rec_lock(rec, index, node->row_lock_mode,
|
||||
LOCK_ORDINARY, thr);
|
||||
}
|
||||
}
|
||||
|
||||
if (err != DB_SUCCESS) {
|
||||
|
||||
@ -2765,6 +2776,7 @@ row_search_for_mysql(
|
||||
/* out: DB_SUCCESS,
|
||||
DB_RECORD_NOT_FOUND,
|
||||
DB_END_OF_INDEX, DB_DEADLOCK,
|
||||
DB_LOCK_TABLE_FULL,
|
||||
or DB_TOO_BIG_RECORD */
|
||||
byte* buf, /* in/out: buffer for the fetched
|
||||
row in the MySQL format */
|
||||
@ -3209,8 +3221,7 @@ rec_loop:
|
||||
we do not lock gaps. Supremum record is really
|
||||
a gap and therefore we do not set locks there. */
|
||||
|
||||
if ( srv_locks_unsafe_for_binlog == FALSE )
|
||||
{
|
||||
if (srv_locks_unsafe_for_binlog == FALSE) {
|
||||
err = sel_set_rec_lock(rec, index,
|
||||
prebuilt->select_lock_type,
|
||||
LOCK_ORDINARY, thr);
|
||||
@ -3312,11 +3323,18 @@ rec_loop:
|
||||
|
||||
if (prebuilt->select_lock_type != LOCK_NONE
|
||||
&& set_also_gap_locks) {
|
||||
/* Try to place a lock on the index record */
|
||||
|
||||
err = sel_set_rec_lock(rec, index,
|
||||
/* Try to place a gap lock on the index
|
||||
record only if innodb_locks_unsafe_for_binlog
|
||||
option is not set */
|
||||
|
||||
if (srv_locks_unsafe_for_binlog == FALSE) {
|
||||
|
||||
err = sel_set_rec_lock(rec, index,
|
||||
prebuilt->select_lock_type,
|
||||
LOCK_GAP, thr);
|
||||
}
|
||||
|
||||
if (err != DB_SUCCESS) {
|
||||
|
||||
goto lock_wait_or_error;
|
||||
@ -3338,11 +3356,18 @@ rec_loop:
|
||||
|
||||
if (prebuilt->select_lock_type != LOCK_NONE
|
||||
&& set_also_gap_locks) {
|
||||
/* Try to place a lock on the index record */
|
||||
|
||||
err = sel_set_rec_lock(rec, index,
|
||||
/* Try to place a gap lock on the index
|
||||
record only if innodb_locks_unsafe_for_binlog
|
||||
option is not set */
|
||||
|
||||
if (srv_locks_unsafe_for_binlog == FALSE) {
|
||||
|
||||
err = sel_set_rec_lock(rec, index,
|
||||
prebuilt->select_lock_type,
|
||||
LOCK_GAP, thr);
|
||||
}
|
||||
|
||||
if (err != DB_SUCCESS) {
|
||||
|
||||
goto lock_wait_or_error;
|
||||
@ -3376,19 +3401,16 @@ rec_loop:
|
||||
prebuilt->select_lock_type,
|
||||
LOCK_REC_NOT_GAP, thr);
|
||||
} else {
|
||||
/* If innodb_locks_unsafe_for_binlog option is used,
|
||||
we lock only the record, i.e. next-key locking is
|
||||
not used.
|
||||
*/
|
||||
if ( srv_locks_unsafe_for_binlog )
|
||||
{
|
||||
err = sel_set_rec_lock(rec, index,
|
||||
/* If innodb_locks_unsafe_for_binlog option is used,
|
||||
we lock only the record, i.e. next-key locking is
|
||||
not used. */
|
||||
|
||||
if (srv_locks_unsafe_for_binlog) {
|
||||
err = sel_set_rec_lock(rec, index,
|
||||
prebuilt->select_lock_type,
|
||||
LOCK_REC_NOT_GAP, thr);
|
||||
}
|
||||
else
|
||||
{
|
||||
err = sel_set_rec_lock(rec, index,
|
||||
} else {
|
||||
err = sel_set_rec_lock(rec, index,
|
||||
prebuilt->select_lock_type,
|
||||
LOCK_ORDINARY, thr);
|
||||
}
|
||||
|
@ -1677,11 +1677,13 @@ loop:
|
||||
srv_printf_innodb_monitor(stderr);
|
||||
}
|
||||
|
||||
mutex_enter(&srv_monitor_file_mutex);
|
||||
rewind(srv_monitor_file);
|
||||
srv_printf_innodb_monitor(srv_monitor_file);
|
||||
os_file_set_eof(srv_monitor_file);
|
||||
mutex_exit(&srv_monitor_file_mutex);
|
||||
if (srv_innodb_status) {
|
||||
mutex_enter(&srv_monitor_file_mutex);
|
||||
rewind(srv_monitor_file);
|
||||
srv_printf_innodb_monitor(srv_monitor_file);
|
||||
os_file_set_eof(srv_monitor_file);
|
||||
mutex_exit(&srv_monitor_file_mutex);
|
||||
}
|
||||
|
||||
if (srv_print_innodb_tablespace_monitor
|
||||
&& difftime(current_time, last_table_monitor_time) > 60) {
|
||||
|
@ -1172,6 +1172,9 @@ NetWare. */
|
||||
}
|
||||
|
||||
if (ret == NULL) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Fatal error: cannot allocate the memory for the buffer pool\n");
|
||||
|
||||
return(DB_ERROR);
|
||||
}
|
||||
|
||||
|
@ -289,7 +289,7 @@ trx_purge_add_update_undo_to_history(
|
||||
flst_get_len(seg_header + TRX_UNDO_PAGE_LIST, mtr));
|
||||
|
||||
mlog_write_ulint(rseg_header + TRX_RSEG_HISTORY_SIZE,
|
||||
hist_size + undo->size, MLOG_4BYTES, mtr);
|
||||
hist_size + undo->size, MLOG_4BYTES, mtr);
|
||||
}
|
||||
|
||||
/* Add the log as the first in the history list */
|
||||
@ -646,6 +646,27 @@ trx_purge_rseg_get_next_history_log(
|
||||
mutex_exit(&(rseg->mutex));
|
||||
mtr_commit(&mtr);
|
||||
|
||||
mutex_enter(&kernel_mutex);
|
||||
|
||||
/* Add debug code to track history list corruption reported
|
||||
on the MySQL mailing list on Nov 9, 2004. The fut0lst.c
|
||||
file-based list was corrupt. The prev node pointer was
|
||||
FIL_NULL, even though the list length was over 8 million nodes!
|
||||
We assume that purge truncates the history list in moderate
|
||||
size pieces, and if we here reach the head of the list, the
|
||||
list cannot be longer than 20 000 undo logs now. */
|
||||
|
||||
if (trx_sys->rseg_history_len > 20000) {
|
||||
ut_print_timestamp(stderr);
|
||||
fprintf(stderr,
|
||||
" InnoDB: Warning: purge reached the head of the history list,\n"
|
||||
"InnoDB: but its length is still reported as %lu! Make a detailed bug\n"
|
||||
"InnoDB: report, and post it to bugs.mysql.com\n",
|
||||
(ulong)trx_sys->rseg_history_len);
|
||||
}
|
||||
|
||||
mutex_exit(&kernel_mutex);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1241,7 +1241,7 @@ trx_undo_lists_init(
|
||||
|
||||
if (page_no != FIL_NULL
|
||||
&& srv_force_recovery < SRV_FORCE_NO_UNDO_LOG_SCAN) {
|
||||
|
||||
|
||||
undo = trx_undo_mem_create_at_db_start(rseg, i,
|
||||
page_no, &mtr);
|
||||
size += undo->size;
|
||||
|
@ -61,8 +61,10 @@ ut_malloc_low(
|
||||
/*==========*/
|
||||
/* out, own: allocated memory */
|
||||
ulint n, /* in: number of bytes to allocate */
|
||||
ibool set_to_zero) /* in: TRUE if allocated memory should be set
|
||||
ibool set_to_zero, /* in: TRUE if allocated memory should be set
|
||||
to zero if UNIV_SET_MEM_TO_ZERO is defined */
|
||||
ibool assert_on_error) /* in: if TRUE, we crash mysqld if the memory
|
||||
cannot be allocated */
|
||||
{
|
||||
void* ret;
|
||||
|
||||
@ -86,9 +88,7 @@ ut_malloc_low(
|
||||
"InnoDB: Check if you should increase the swap file or\n"
|
||||
"InnoDB: ulimits of your operating system.\n"
|
||||
"InnoDB: On FreeBSD check you have compiled the OS with\n"
|
||||
"InnoDB: a big enough maximum process size.\n"
|
||||
"InnoDB: We now intentionally generate a seg fault so that\n"
|
||||
"InnoDB: on Linux we get a stack trace.\n",
|
||||
"InnoDB: a big enough maximum process size.\n",
|
||||
(ulong) n, (ulong) ut_total_allocated_memory,
|
||||
#ifdef __WIN__
|
||||
(ulong) GetLastError()
|
||||
@ -110,7 +110,15 @@ ut_malloc_low(
|
||||
/* Intentional segfault on NetWare causes an abend. Avoid this
|
||||
by graceful exit handling in ut_a(). */
|
||||
#if (!defined __NETWARE__)
|
||||
if (*ut_mem_null_ptr) ut_mem_null_ptr = 0;
|
||||
if (assert_on_error) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: We now intentionally generate a seg fault so that\n"
|
||||
"InnoDB: on Linux we get a stack trace.\n");
|
||||
|
||||
if (*ut_mem_null_ptr) ut_mem_null_ptr = 0;
|
||||
} else {
|
||||
return(NULL);
|
||||
}
|
||||
#else
|
||||
ut_a(0);
|
||||
#endif
|
||||
@ -144,7 +152,7 @@ ut_malloc(
|
||||
/* out, own: allocated memory */
|
||||
ulint n) /* in: number of bytes to allocate */
|
||||
{
|
||||
return(ut_malloc_low(n, TRUE));
|
||||
return(ut_malloc_low(n, TRUE, TRUE));
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
|
@ -3257,11 +3257,12 @@ static void read_binary_time(MYSQL_TIME *tm, uchar **pos)
|
||||
tm->hour+= tm->day*24;
|
||||
tm->day= 0;
|
||||
}
|
||||
tm->time_type= MYSQL_TIMESTAMP_TIME;
|
||||
|
||||
*pos+= length;
|
||||
}
|
||||
else
|
||||
set_zero_time(tm);
|
||||
tm->time_type= MYSQL_TIMESTAMP_TIME;
|
||||
set_zero_time(tm, MYSQL_TIMESTAMP_TIME);
|
||||
}
|
||||
|
||||
static void read_binary_datetime(MYSQL_TIME *tm, uchar **pos)
|
||||
@ -3286,12 +3287,12 @@ static void read_binary_datetime(MYSQL_TIME *tm, uchar **pos)
|
||||
else
|
||||
tm->hour= tm->minute= tm->second= 0;
|
||||
tm->second_part= (length > 7) ? (ulong) sint4korr(to+7) : 0;
|
||||
tm->time_type= MYSQL_TIMESTAMP_DATETIME;
|
||||
|
||||
*pos+= length;
|
||||
}
|
||||
else
|
||||
set_zero_time(tm);
|
||||
tm->time_type= MYSQL_TIMESTAMP_DATETIME;
|
||||
set_zero_time(tm, MYSQL_TIMESTAMP_DATETIME);
|
||||
}
|
||||
|
||||
static void read_binary_date(MYSQL_TIME *tm, uchar **pos)
|
||||
@ -3308,12 +3309,12 @@ static void read_binary_date(MYSQL_TIME *tm, uchar **pos)
|
||||
tm->hour= tm->minute= tm->second= 0;
|
||||
tm->second_part= 0;
|
||||
tm->neg= 0;
|
||||
tm->time_type= MYSQL_TIMESTAMP_DATE;
|
||||
|
||||
*pos+= length;
|
||||
}
|
||||
else
|
||||
set_zero_time(tm);
|
||||
tm->time_type= MYSQL_TIMESTAMP_DATE;
|
||||
set_zero_time(tm, MYSQL_TIMESTAMP_DATE);
|
||||
}
|
||||
|
||||
|
||||
|
@ -164,9 +164,9 @@ static void _ftb_parse_query(FTB *ftb, byte **start, byte *end,
|
||||
if (param.trunc) ftbw->flags|=FTB_FLAG_TRUNC;
|
||||
ftbw->weight=weight;
|
||||
ftbw->up=up;
|
||||
ftbw->docid[0]=ftbw->docid[1]=HA_POS_ERROR;
|
||||
ftbw->docid[0]=ftbw->docid[1]=HA_OFFSET_ERROR;
|
||||
ftbw->ndepth= (param.yesno<0) + depth;
|
||||
ftbw->key_root=HA_POS_ERROR;
|
||||
ftbw->key_root=HA_OFFSET_ERROR;
|
||||
memcpy(ftbw->word+1, w.pos, w.len);
|
||||
ftbw->word[0]=w.len;
|
||||
if (param.yesno > 0) up->ythresh++;
|
||||
@ -181,7 +181,7 @@ static void _ftb_parse_query(FTB *ftb, byte **start, byte *end,
|
||||
ftbe->weight=weight;
|
||||
ftbe->up=up;
|
||||
ftbe->ythresh=ftbe->yweaks=0;
|
||||
ftbe->docid[0]=ftbe->docid[1]=HA_POS_ERROR;
|
||||
ftbe->docid[0]=ftbe->docid[1]=HA_OFFSET_ERROR;
|
||||
if ((ftbe->quot=param.quot)) ftb->with_scan|=2;
|
||||
if (param.yesno > 0) up->ythresh++;
|
||||
_ftb_parse_query(ftb, start, end, ftbe, depth+1);
|
||||
@ -259,7 +259,7 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search)
|
||||
{
|
||||
if (!ftbw->off || !(ftbw->flags & FTB_FLAG_TRUNC))
|
||||
{
|
||||
ftbw->docid[0]=HA_POS_ERROR;
|
||||
ftbw->docid[0]=HA_OFFSET_ERROR;
|
||||
if ((ftbw->flags & FTB_FLAG_YES) && ftbw->up->up==0)
|
||||
{
|
||||
/*
|
||||
@ -346,9 +346,9 @@ static void _ftb_init_index_search(FT_INFO *ftb)
|
||||
ftbe->up->ythresh - ftbe->up->yweaks >1) /* 1 */
|
||||
{
|
||||
FTB_EXPR *top_ftbe=ftbe->up->up;
|
||||
ftbw->docid[0]=HA_POS_ERROR;
|
||||
ftbw->docid[0]=HA_OFFSET_ERROR;
|
||||
for (ftbe=ftbw->up; ftbe != top_ftbe; ftbe=ftbe->up)
|
||||
if (ftbe->flags & FTB_FLAG_YES)
|
||||
if (!(ftbe->flags & FTB_FLAG_NO))
|
||||
ftbe->yweaks++;
|
||||
ftbe=0;
|
||||
break;
|
||||
@ -356,7 +356,7 @@ static void _ftb_init_index_search(FT_INFO *ftb)
|
||||
}
|
||||
if (!ftbe)
|
||||
continue;
|
||||
/* 3 */
|
||||
/* 4 */
|
||||
if (!is_tree_inited(& ftb->no_dupes))
|
||||
init_tree(& ftb->no_dupes,0,0,sizeof(my_off_t),
|
||||
_ftb_no_dupes_cmp,0,0,0);
|
||||
@ -387,7 +387,7 @@ FT_INFO * ft_init_boolean_search(MI_INFO *info, uint keynr, byte *query,
|
||||
ftb->charset= ((keynr==NO_SUCH_KEY) ?
|
||||
default_charset_info : info->s->keyinfo[keynr].seg->charset);
|
||||
ftb->with_scan=0;
|
||||
ftb->lastpos=HA_POS_ERROR;
|
||||
ftb->lastpos=HA_OFFSET_ERROR;
|
||||
bzero(& ftb->no_dupes, sizeof(TREE));
|
||||
|
||||
init_alloc_root(&ftb->mem_root, 1024, 1024);
|
||||
@ -410,7 +410,7 @@ FT_INFO * ft_init_boolean_search(MI_INFO *info, uint keynr, byte *query,
|
||||
ftbe->quot=0;
|
||||
ftbe->up=0;
|
||||
ftbe->ythresh=ftbe->yweaks=0;
|
||||
ftbe->docid[0]=ftbe->docid[1]=HA_POS_ERROR;
|
||||
ftbe->docid[0]=ftbe->docid[1]=HA_OFFSET_ERROR;
|
||||
ftb->root=ftbe;
|
||||
_ftb_parse_query(ftb, &query, query+query_len, ftbe, 0);
|
||||
ftb->list=(FTB_WORD **)alloc_root(&ftb->mem_root,
|
||||
@ -561,7 +561,7 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record)
|
||||
|
||||
while (ftb->state == INDEX_SEARCH &&
|
||||
(curdoc=((FTB_WORD *)queue_top(& ftb->queue))->docid[0]) !=
|
||||
HA_POS_ERROR)
|
||||
HA_OFFSET_ERROR)
|
||||
{
|
||||
while (curdoc == (ftbw=(FTB_WORD *)queue_top(& ftb->queue))->docid[0])
|
||||
{
|
||||
@ -615,7 +615,7 @@ float ft_boolean_find_relevance(FT_INFO *ftb, byte *record, uint length)
|
||||
const byte *end;
|
||||
my_off_t docid=ftb->info->lastpos;
|
||||
|
||||
if (docid == HA_POS_ERROR)
|
||||
if (docid == HA_OFFSET_ERROR)
|
||||
return -2.0;
|
||||
if (!ftb->queue.elements)
|
||||
return 0;
|
||||
@ -627,9 +627,9 @@ float ft_boolean_find_relevance(FT_INFO *ftb, byte *record, uint length)
|
||||
|
||||
for (i=0; i < ftb->queue.elements; i++)
|
||||
{
|
||||
ftb->list[i]->docid[1]=HA_POS_ERROR;
|
||||
ftb->list[i]->docid[1]=HA_OFFSET_ERROR;
|
||||
for (x=ftb->list[i]->up; x; x=x->up)
|
||||
x->docid[1]=HA_POS_ERROR;
|
||||
x->docid[1]=HA_OFFSET_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -16,7 +16,7 @@
|
||||
|
||||
/* Create a MyISAM table */
|
||||
|
||||
#include "fulltext.h"
|
||||
#include "ftdefs.h"
|
||||
#include "sp_defs.h"
|
||||
|
||||
#if defined(MSDOS) || defined(__WIN__)
|
||||
@ -41,7 +41,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
||||
File dfile,file;
|
||||
int errpos,save_errno;
|
||||
myf create_flag;
|
||||
uint fields,length,max_key_length,packed,pointer,
|
||||
uint fields,length,max_key_length,packed,pointer,real_length_diff,
|
||||
key_length,info_length,key_segs,options,min_key_length_skip,
|
||||
base_pos,varchar_count,long_varchar_count,varchar_length,
|
||||
max_key_block_length,unique_key_parts,fulltext_keys,offset;
|
||||
@ -238,7 +238,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
||||
{
|
||||
|
||||
share.state.key_root[i]= HA_OFFSET_ERROR;
|
||||
min_key_length_skip=length=0;
|
||||
min_key_length_skip=length=real_length_diff=0;
|
||||
key_length=pointer;
|
||||
if (keydef->flag & HA_SPATIAL)
|
||||
{
|
||||
@ -297,6 +297,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
||||
key_length+= HA_FT_MAXBYTELEN+HA_FT_WLEN;
|
||||
length++; /* At least one length byte */
|
||||
min_key_length_skip+=HA_FT_MAXBYTELEN;
|
||||
real_length_diff=HA_FT_MAXBYTELEN-FT_MAX_WORD_LEN_FOR_SORT;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -397,7 +398,8 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
||||
key_segs)
|
||||
share.state.rec_per_key_part[key_segs-1]=1L;
|
||||
length+=key_length;
|
||||
keydef->block_length= MI_BLOCK_SIZE(length,pointer,MI_MAX_KEYPTR_SIZE);
|
||||
keydef->block_length= MI_BLOCK_SIZE(length-real_length_diff,
|
||||
pointer,MI_MAX_KEYPTR_SIZE);
|
||||
if (keydef->block_length > MI_MAX_KEY_BLOCK_LENGTH ||
|
||||
length >= MI_MAX_KEY_BUFF)
|
||||
{
|
||||
|
@ -40,7 +40,7 @@
|
||||
#endif
|
||||
|
||||
|
||||
const char *filename= "test3.MSI";
|
||||
const char *filename= "test3";
|
||||
uint tests=10,forks=10,key_cacheing=0,use_log=0;
|
||||
|
||||
static void get_options(int argc, char *argv[]);
|
||||
@ -363,7 +363,7 @@ int test_write(MI_INFO *file,int id,int lock_type)
|
||||
}
|
||||
|
||||
sprintf(record.id,"%7d",getpid());
|
||||
strmov(record.text,"Testing...");
|
||||
strnmov(record.text,"Testing...", sizeof(record.text));
|
||||
|
||||
tries=(uint) rnd(100)+10;
|
||||
for (i=count=0 ; i < tries ; i++)
|
||||
|
@ -165,12 +165,7 @@ err:
|
||||
{
|
||||
uint j;
|
||||
for (j=0 ; j < share->base.keys ; j++)
|
||||
{
|
||||
if (is_tree_inited(&info->bulk_insert[j]))
|
||||
{
|
||||
reset_tree(&info->bulk_insert[j]);
|
||||
}
|
||||
}
|
||||
mi_flush_bulk_insert(info, j);
|
||||
}
|
||||
info->errkey= (int) i;
|
||||
while ( i-- > 0)
|
||||
@ -329,7 +324,7 @@ static int w_search(register MI_INFO *info, register MI_KEYDEF *keyinfo,
|
||||
uchar *temp_buff,*keypos;
|
||||
uchar keybuff[MI_MAX_KEY_BUFF];
|
||||
my_bool was_last_key;
|
||||
my_off_t next_page;
|
||||
my_off_t next_page, dupp_key_pos;
|
||||
DBUG_ENTER("w_search");
|
||||
DBUG_PRINT("enter",("page: %ld",page));
|
||||
|
||||
@ -349,9 +344,9 @@ static int w_search(register MI_INFO *info, register MI_KEYDEF *keyinfo,
|
||||
/* get position to record with duplicated key */
|
||||
tmp_key_length=(*keyinfo->get_key)(keyinfo,nod_flag,&keypos,keybuff);
|
||||
if (tmp_key_length)
|
||||
info->dupp_key_pos=_mi_dpos(info,0,keybuff+tmp_key_length);
|
||||
dupp_key_pos=_mi_dpos(info,0,keybuff+tmp_key_length);
|
||||
else
|
||||
info->dupp_key_pos= HA_OFFSET_ERROR;
|
||||
dupp_key_pos= HA_OFFSET_ERROR;
|
||||
if (keyinfo->flag & HA_FULLTEXT)
|
||||
{
|
||||
uint off;
|
||||
@ -370,7 +365,7 @@ static int w_search(register MI_INFO *info, register MI_KEYDEF *keyinfo,
|
||||
else
|
||||
{
|
||||
/* popular word. two-level tree. going down */
|
||||
my_off_t root=info->dupp_key_pos;
|
||||
my_off_t root=dupp_key_pos;
|
||||
keyinfo=&info->s->ft2_keyinfo;
|
||||
get_key_full_length_rdonly(off, key);
|
||||
key+=off;
|
||||
@ -389,6 +384,7 @@ static int w_search(register MI_INFO *info, register MI_KEYDEF *keyinfo,
|
||||
}
|
||||
else /* not HA_FULLTEXT, normal HA_NOSAME key */
|
||||
{
|
||||
info->dupp_key_pos= dupp_key_pos;
|
||||
my_afree((byte*) temp_buff);
|
||||
my_errno=HA_ERR_FOUND_DUPP_KEY;
|
||||
DBUG_RETURN(-1);
|
||||
|
56
mysql-test/include/ctype_common.inc
Normal file
56
mysql-test/include/ctype_common.inc
Normal file
@ -0,0 +1,56 @@
|
||||
#
|
||||
# Common tests for all character sets and collations.
|
||||
# Include this file from a test with @test_characrer_set
|
||||
# and @test_collation set to desired values.
|
||||
#
|
||||
# Please don't use SHOW CREATE TABLE in this file,
|
||||
# we want it to be HANDLER independent. You can
|
||||
# use SHOW FULL COLUMNS instead.
|
||||
#
|
||||
# Please surround all CREATE TABLE with --disable_warnings
|
||||
# and --enable_warnings to be able to set storage_engine
|
||||
# without having to check if the hanlder exists.
|
||||
|
||||
SET @safe_character_set_server= @@character_set_server;
|
||||
SET @safe_collation_server= @@collation_server;
|
||||
SET character_set_server= @test_character_set;
|
||||
SET collation_server= @test_collation;
|
||||
CREATE DATABASE d1;
|
||||
USE d1;
|
||||
|
||||
#
|
||||
# Bug 1883: LIKE did not work in some cases with a key.
|
||||
#
|
||||
--disable_warnings
|
||||
CREATE TABLE t1 (c CHAR(10), KEY(c));
|
||||
--enable_warnings
|
||||
# check the column was created with the expected charset/collation
|
||||
SHOW FULL COLUMNS FROM t1;
|
||||
INSERT INTO t1 VALUES ('aaa'),('aaaa'),('aaaaa');
|
||||
SELECT c as want3results FROM t1 WHERE c LIKE 'aaa%';
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug 6643 incorrect response with partial utf8 index
|
||||
#
|
||||
--disable_warnings
|
||||
CREATE TABLE t1 (c1 varchar(15), KEY c1 (c1(2)));
|
||||
--enable_warnings
|
||||
# check the column was created with the expected charset/collation
|
||||
SHOW FULL COLUMNS FROM t1;
|
||||
INSERT INTO t1 VALUES ('location'),('loberge'),('lotre'),('boabab');
|
||||
SELECT c1 as want3results from t1 where c1 like 'l%';
|
||||
SELECT c1 as want3results from t1 where c1 like 'lo%';
|
||||
SELECT c1 as want1result from t1 where c1 like 'loc%';
|
||||
SELECT c1 as want1result from t1 where c1 like 'loca%';
|
||||
SELECT c1 as want1result from t1 where c1 like 'locat%';
|
||||
SELECT c1 as want1result from t1 where c1 like 'locati%';
|
||||
SELECT c1 as want1result from t1 where c1 like 'locatio%';
|
||||
SELECT c1 as want1result from t1 where c1 like 'location%';
|
||||
DROP TABLE t1;
|
||||
|
||||
DROP DATABASE d1;
|
||||
# Restore settings
|
||||
USE test;
|
||||
SET character_set_server= @safe_character_set_server;
|
||||
SET collation_server= @safe_collation_server;
|
File diff suppressed because it is too large
Load Diff
@ -1,10 +1,58 @@
|
||||
drop table if exists t1;
|
||||
SET NAMES big5;
|
||||
CREATE TABLE t1 (c CHAR(10) CHARACTER SET big5, KEY(c));
|
||||
SET @test_character_set= 'big5';
|
||||
SET @test_collation= 'big5_chinese_ci';
|
||||
SET @safe_character_set_server= @@character_set_server;
|
||||
SET @safe_collation_server= @@collation_server;
|
||||
SET character_set_server= @test_character_set;
|
||||
SET collation_server= @test_collation;
|
||||
CREATE DATABASE d1;
|
||||
USE d1;
|
||||
CREATE TABLE t1 (c CHAR(10), KEY(c));
|
||||
SHOW FULL COLUMNS FROM t1;
|
||||
Field Type Collation Null Key Default Extra Privileges Comment
|
||||
c char(10) big5_chinese_ci YES MUL NULL select,insert,update,references
|
||||
INSERT INTO t1 VALUES ('aaa'),('aaaa'),('aaaaa');
|
||||
SELECT * FROM t1 WHERE c LIKE 'aaa%';
|
||||
c
|
||||
SELECT c as want3results FROM t1 WHERE c LIKE 'aaa%';
|
||||
want3results
|
||||
aaa
|
||||
aaaa
|
||||
aaaaa
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (c1 varchar(15), KEY c1 (c1(2)));
|
||||
SHOW FULL COLUMNS FROM t1;
|
||||
Field Type Collation Null Key Default Extra Privileges Comment
|
||||
c1 varchar(15) big5_chinese_ci YES MUL NULL select,insert,update,references
|
||||
INSERT INTO t1 VALUES ('location'),('loberge'),('lotre'),('boabab');
|
||||
SELECT c1 as want3results from t1 where c1 like 'l%';
|
||||
want3results
|
||||
location
|
||||
loberge
|
||||
lotre
|
||||
SELECT c1 as want3results from t1 where c1 like 'lo%';
|
||||
want3results
|
||||
location
|
||||
loberge
|
||||
lotre
|
||||
SELECT c1 as want1result from t1 where c1 like 'loc%';
|
||||
want1result
|
||||
location
|
||||
SELECT c1 as want1result from t1 where c1 like 'loca%';
|
||||
want1result
|
||||
location
|
||||
SELECT c1 as want1result from t1 where c1 like 'locat%';
|
||||
want1result
|
||||
location
|
||||
SELECT c1 as want1result from t1 where c1 like 'locati%';
|
||||
want1result
|
||||
location
|
||||
SELECT c1 as want1result from t1 where c1 like 'locatio%';
|
||||
want1result
|
||||
location
|
||||
SELECT c1 as want1result from t1 where c1 like 'location%';
|
||||
want1result
|
||||
location
|
||||
DROP TABLE t1;
|
||||
DROP DATABASE d1;
|
||||
USE test;
|
||||
SET character_set_server= @safe_character_set_server;
|
||||
SET collation_server= @safe_collation_server;
|
||||
|
@ -296,3 +296,12 @@ FD C3BD FD 1
|
||||
FE C3BE FE 1
|
||||
FF C3BF FF 1
|
||||
DROP TABLE t1;
|
||||
select 'a' regexp 'A' collate latin1_general_ci;
|
||||
'a' regexp 'A' collate latin1_general_ci
|
||||
1
|
||||
select 'a' regexp 'A' collate latin1_general_cs;
|
||||
'a' regexp 'A' collate latin1_general_cs
|
||||
0
|
||||
select 'a' regexp 'A' collate latin1_bin;
|
||||
'a' regexp 'A' collate latin1_bin
|
||||
0
|
||||
|
@ -19,6 +19,9 @@ select 'a ' = 'a\t', 'a ' < 'a\t', 'a ' > 'a\t';
|
||||
select 'a a' > 'a', 'a \t' < 'a';
|
||||
'a a' > 'a' 'a \t' < 'a'
|
||||
1 1
|
||||
select 'c' like '\_' as want0;
|
||||
want0
|
||||
0
|
||||
CREATE TABLE t (
|
||||
c char(20) NOT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
||||
@ -2315,3 +2318,60 @@ HEX(CONVERT(col1 USING ucs2))
|
||||
064A06A9062F064A06AF0631
|
||||
064A06A9064A
|
||||
DROP TABLE t1;
|
||||
SET @test_character_set= 'utf8';
|
||||
SET @test_collation= 'utf8_swedish_ci';
|
||||
SET @safe_character_set_server= @@character_set_server;
|
||||
SET @safe_collation_server= @@collation_server;
|
||||
SET character_set_server= @test_character_set;
|
||||
SET collation_server= @test_collation;
|
||||
CREATE DATABASE d1;
|
||||
USE d1;
|
||||
CREATE TABLE t1 (c CHAR(10), KEY(c));
|
||||
SHOW FULL COLUMNS FROM t1;
|
||||
Field Type Collation Null Key Default Extra Privileges Comment
|
||||
c char(10) utf8_swedish_ci YES MUL NULL select,insert,update,references
|
||||
INSERT INTO t1 VALUES ('aaa'),('aaaa'),('aaaaa');
|
||||
SELECT c as want3results FROM t1 WHERE c LIKE 'aaa%';
|
||||
want3results
|
||||
aaa
|
||||
aaaa
|
||||
aaaaa
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (c1 varchar(15), KEY c1 (c1(2)));
|
||||
SHOW FULL COLUMNS FROM t1;
|
||||
Field Type Collation Null Key Default Extra Privileges Comment
|
||||
c1 varchar(15) utf8_swedish_ci YES MUL NULL select,insert,update,references
|
||||
INSERT INTO t1 VALUES ('location'),('loberge'),('lotre'),('boabab');
|
||||
SELECT c1 as want3results from t1 where c1 like 'l%';
|
||||
want3results
|
||||
location
|
||||
loberge
|
||||
lotre
|
||||
SELECT c1 as want3results from t1 where c1 like 'lo%';
|
||||
want3results
|
||||
location
|
||||
loberge
|
||||
lotre
|
||||
SELECT c1 as want1result from t1 where c1 like 'loc%';
|
||||
want1result
|
||||
location
|
||||
SELECT c1 as want1result from t1 where c1 like 'loca%';
|
||||
want1result
|
||||
location
|
||||
SELECT c1 as want1result from t1 where c1 like 'locat%';
|
||||
want1result
|
||||
location
|
||||
SELECT c1 as want1result from t1 where c1 like 'locati%';
|
||||
want1result
|
||||
location
|
||||
SELECT c1 as want1result from t1 where c1 like 'locatio%';
|
||||
want1result
|
||||
location
|
||||
SELECT c1 as want1result from t1 where c1 like 'location%';
|
||||
want1result
|
||||
location
|
||||
DROP TABLE t1;
|
||||
DROP DATABASE d1;
|
||||
USE test;
|
||||
SET character_set_server= @safe_character_set_server;
|
||||
SET collation_server= @safe_collation_server;
|
||||
|
@ -487,3 +487,18 @@ prepare stmt1 from @str2;
|
||||
execute stmt1 using @ivar;
|
||||
?
|
||||
1234
|
||||
SET TIMESTAMP=10000;
|
||||
create table t2 (c char(30)) charset=ucs2;
|
||||
set @v=convert('abc' using ucs2);
|
||||
reset master;
|
||||
insert into t2 values (@v);
|
||||
show binlog events from 79;
|
||||
Log_name Pos Event_type Server_id Orig_log_pos Info
|
||||
master-bin.000001 79 User var 1 79 @`v`=_ucs2 0x006100620063 COLLATE ucs2_general_ci
|
||||
master-bin.000001 119 Query 1 119 use `test`; insert into t2 values (@v)
|
||||
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
|
||||
SET @`v`:=_ucs2 0x006100620063 COLLATE ucs2_general_ci;
|
||||
use test;
|
||||
SET TIMESTAMP=10000;
|
||||
insert into t2 values (@v);
|
||||
drop table t2;
|
||||
|
@ -814,3 +814,6 @@ t2 CREATE TABLE `t2` (
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
drop table t2;
|
||||
drop table t1;
|
||||
select 'c' like '\_' as want0;
|
||||
want0
|
||||
0
|
||||
|
@ -16,12 +16,34 @@ SET AUTOCOMMIT=0;
|
||||
DELETE from t1;
|
||||
SET AUTOCOMMIT=1;
|
||||
drop table t1;
|
||||
create table t1 (a bigint not null, primary key (a,a,a,a,a,a,a,a,a,a));
|
||||
insert into t1 values (2),(4),(6),(8),(10),(12),(14),(16),(18),(20),(22),(24),(26),(23);
|
||||
create table t1 (
|
||||
a bigint not null,
|
||||
b bigint not null default 0,
|
||||
c bigint not null default 0,
|
||||
d bigint not null default 0,
|
||||
e bigint not null default 0,
|
||||
f bigint not null default 0,
|
||||
g bigint not null default 0,
|
||||
h bigint not null default 0,
|
||||
i bigint not null default 0,
|
||||
j bigint not null default 0,
|
||||
primary key (a,b,c,d,e,f,g,h,i,j));
|
||||
insert into t1 (a) values (2),(4),(6),(8),(10),(12),(14),(16),(18),(20),(22),(24),(26),(23);
|
||||
delete from t1 where a=26;
|
||||
drop table t1;
|
||||
create table t1 (a bigint not null, primary key (a,a,a,a,a,a,a,a,a,a));
|
||||
insert into t1 values (2),(4),(6),(8),(10),(12),(14),(16),(18),(20),(22),(24),(26),(23),(27);
|
||||
create table t1 (
|
||||
a bigint not null,
|
||||
b bigint not null default 0,
|
||||
c bigint not null default 0,
|
||||
d bigint not null default 0,
|
||||
e bigint not null default 0,
|
||||
f bigint not null default 0,
|
||||
g bigint not null default 0,
|
||||
h bigint not null default 0,
|
||||
i bigint not null default 0,
|
||||
j bigint not null default 0,
|
||||
primary key (a,b,c,d,e,f,g,h,i,j));
|
||||
insert into t1 (a) values (2),(4),(6),(8),(10),(12),(14),(16),(18),(20),(22),(24),(26),(23),(27);
|
||||
delete from t1 where a=27;
|
||||
drop table t1;
|
||||
CREATE TABLE `t1` (
|
||||
|
@ -20,4 +20,12 @@ commit;
|
||||
a
|
||||
1
|
||||
unlock tables;
|
||||
commit;
|
||||
begin;
|
||||
insert into t1 values(10);
|
||||
flush tables with read lock;
|
||||
commit;
|
||||
unlock tables;
|
||||
flush tables with read lock;
|
||||
unlock tables;
|
||||
drop table t1;
|
||||
|
@ -190,6 +190,14 @@ a
|
||||
select * from t1 where match a against ("+aaa10 +(bbb*)" in boolean mode);
|
||||
a
|
||||
aaa10 bbb20
|
||||
select * from t1 where match a against ("+(+aaa* +bbb1*)" in boolean mode);
|
||||
a
|
||||
aaa20 bbb15
|
||||
aaa30 bbb10
|
||||
select * from t1 where match a against ("(+aaa* +bbb1*)" in boolean mode);
|
||||
a
|
||||
aaa20 bbb15
|
||||
aaa30 bbb10
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (
|
||||
id int(11),
|
||||
@ -382,3 +390,18 @@ s
|
||||
p<EFBFBD>ra para para
|
||||
para para para
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (h text, FULLTEXT (h));
|
||||
INSERT INTO t1 VALUES ('Jesses Hasse Ling and his syncopators of Swing');
|
||||
REPAIR TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 repair status OK
|
||||
select count(*) from t1;
|
||||
count(*)
|
||||
1
|
||||
drop table t1;
|
||||
create table t1 (a int primary key, b text, fulltext(b));
|
||||
create table t2 (a int, b text);
|
||||
insert t1 values (1, "aaaa"), (2, "bbbb");
|
||||
insert t2 values (10, "aaaa"), (2, "cccc");
|
||||
replace t1 select * from t2;
|
||||
drop table t1, t2;
|
||||
|
@ -69,6 +69,6 @@ Error 1259 ZLIB: Input data corrupted
|
||||
Error 1256 Uncompressed data size too large; the maximum size is 1048576 (probably, length of uncompressed data was corrupted)
|
||||
drop table t1;
|
||||
set @@max_allowed_packet=1048576*100;
|
||||
select compress(repeat('aaaaaaaaaa', 10000000)) is null;
|
||||
compress(repeat('aaaaaaaaaa', 10000000)) is null
|
||||
select compress(repeat('aaaaaaaaaa', IF(XXX, 10, 10000000))) is null;
|
||||
compress(repeat('aaaaaaaaaa', IF(XXX, 10, 10000000))) is null
|
||||
0
|
||||
|
@ -637,8 +637,22 @@ create table t1 (a char(10));
|
||||
insert into t1 values ('a'),('b'),('c');
|
||||
select coercibility(max(a)) from t1;
|
||||
coercibility(max(a))
|
||||
3
|
||||
2
|
||||
drop table t1;
|
||||
create table t1 (a char character set latin2);
|
||||
insert into t1 values ('a'),('b');
|
||||
select charset(max(a)), coercibility(max(a)),
|
||||
charset(min(a)), coercibility(min(a)) from t1;
|
||||
charset(max(a)) coercibility(max(a)) charset(min(a)) coercibility(min(a))
|
||||
latin2 2 latin2 2
|
||||
create table t2 select max(a),min(a) from t1;
|
||||
show create table t2;
|
||||
Table Create Table
|
||||
t2 CREATE TABLE `t2` (
|
||||
`max(a)` char(1) character set latin2 default NULL,
|
||||
`min(a)` char(1) character set latin2 default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
drop table t2,t1;
|
||||
create table t1 (a int);
|
||||
insert into t1 values (1);
|
||||
select max(a) as b from t1 having b=1;
|
||||
|
@ -474,6 +474,12 @@ unix_timestamp(@a)
|
||||
select unix_timestamp('1969-12-01 19:00:01');
|
||||
unix_timestamp('1969-12-01 19:00:01')
|
||||
0
|
||||
select from_unixtime(0);
|
||||
from_unixtime(0)
|
||||
NULL
|
||||
select from_unixtime(2145916800);
|
||||
from_unixtime(2145916800)
|
||||
NULL
|
||||
CREATE TABLE t1 (datetime datetime, timestamp timestamp, date date, time time);
|
||||
INSERT INTO t1 values ("2001-01-02 03:04:05", "2002-01-02 03:04:05", "2003-01-02", "06:07:08");
|
||||
SELECT * from t1;
|
||||
|
@ -1,2 +1,2 @@
|
||||
Variable_name Value
|
||||
Ssl_cipher EDH-RSA-DES-CBC3-SHA
|
||||
Ssl_cipher DHE-RSA-AES256-SHA
|
||||
|
@ -233,3 +233,10 @@ SELECT * FROM t1 WHERE B is not null;
|
||||
a B
|
||||
1 1
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (pseudo char(35) PRIMARY KEY, date int(10) unsigned NOT NULL) ENGINE=HEAP;
|
||||
INSERT INTO t1 VALUES ('massecot',1101106491),('altec',1101106492),('stitch+',1101106304),('Seb Corgan',1101106305),('beerfilou',1101106263),('flaker',1101106529),('joce8',5),('M4vrick',1101106418),('gabay008',1101106525),('Vamp irX',1101106291),('ZoomZip',1101106546),('rip666',1101106502),('CBP ',1101106397),('guezpard',1101106496);
|
||||
DELETE FROM t1 WHERE date<1101106546;
|
||||
SELECT * FROM t1;
|
||||
pseudo date
|
||||
ZoomZip 1101106546
|
||||
DROP TABLE t1;
|
||||
|
@ -1630,3 +1630,21 @@ show status like "binlog_cache_disk_use";
|
||||
Variable_name Value
|
||||
Binlog_cache_disk_use 1
|
||||
drop table t1;
|
||||
create table t1 (c char(10), index (c,c)) engine=innodb;
|
||||
ERROR 42S21: Duplicate column name 'c'
|
||||
create table t1 (c1 char(10), c2 char(10), index (c1,c2,c1)) engine=innodb;
|
||||
ERROR 42S21: Duplicate column name 'c1'
|
||||
create table t1 (c1 char(10), c2 char(10), index (c1,c1,c2)) engine=innodb;
|
||||
ERROR 42S21: Duplicate column name 'c1'
|
||||
create table t1 (c1 char(10), c2 char(10), index (c2,c1,c1)) engine=innodb;
|
||||
ERROR 42S21: Duplicate column name 'c1'
|
||||
create table t1 (c1 char(10), c2 char(10)) engine=innodb;
|
||||
alter table t1 add key (c1,c1);
|
||||
ERROR 42S21: Duplicate column name 'c1'
|
||||
alter table t1 add key (c2,c1,c1);
|
||||
ERROR 42S21: Duplicate column name 'c1'
|
||||
alter table t1 add key (c1,c2,c1);
|
||||
ERROR 42S21: Duplicate column name 'c1'
|
||||
alter table t1 add key (c1,c1,c2);
|
||||
ERROR 42S21: Duplicate column name 'c1'
|
||||
drop table t1;
|
||||
|
@ -307,3 +307,21 @@ test.t1 check status OK
|
||||
drop table t1;
|
||||
create table t1 (c char(10), index (c(0)));
|
||||
ERROR HY000: Key part 'c' length cannot be 0
|
||||
create table t1 (c char(10), index (c,c));
|
||||
ERROR 42S21: Duplicate column name 'c'
|
||||
create table t1 (c1 char(10), c2 char(10), index (c1,c2,c1));
|
||||
ERROR 42S21: Duplicate column name 'c1'
|
||||
create table t1 (c1 char(10), c2 char(10), index (c1,c1,c2));
|
||||
ERROR 42S21: Duplicate column name 'c1'
|
||||
create table t1 (c1 char(10), c2 char(10), index (c2,c1,c1));
|
||||
ERROR 42S21: Duplicate column name 'c1'
|
||||
create table t1 (c1 char(10), c2 char(10));
|
||||
alter table t1 add key (c1,c1);
|
||||
ERROR 42S21: Duplicate column name 'c1'
|
||||
alter table t1 add key (c2,c1,c1);
|
||||
ERROR 42S21: Duplicate column name 'c1'
|
||||
alter table t1 add key (c1,c2,c1);
|
||||
ERROR 42S21: Duplicate column name 'c1'
|
||||
alter table t1 add key (c1,c1,c2);
|
||||
ERROR 42S21: Duplicate column name 'c1'
|
||||
drop table t1;
|
||||
|
@ -529,6 +529,7 @@ show keys from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 1 a 1 a A NULL NULL NULL YES BTREE disabled
|
||||
create table t2 (a int);
|
||||
set @@rand_seed1=31415926,@@rand_seed2=2718281828;
|
||||
insert t1 select * from t2;
|
||||
show keys from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
|
@ -332,3 +332,45 @@ CREATE TABLE `t1` (
|
||||
2
|
||||
3
|
||||
drop table t1;
|
||||
|
||||
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
||||
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
||||
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
||||
/*!40101 SET NAMES utf8 */;
|
||||
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
||||
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE="NO_AUTO_VALUE_ON_ZERO" */;
|
||||
|
||||
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET latin1 */;
|
||||
|
||||
USE `test`;
|
||||
|
||||
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
||||
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
||||
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
|
||||
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
||||
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
||||
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
||||
|
||||
create database mysqldump_test_db character set latin2 collate latin2_bin;
|
||||
|
||||
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
||||
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
||||
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
||||
/*!40101 SET NAMES utf8 */;
|
||||
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
||||
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE="NO_AUTO_VALUE_ON_ZERO" */;
|
||||
|
||||
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqldump_test_db` /*!40100 DEFAULT CHARACTER SET latin2 COLLATE latin2_bin */;
|
||||
|
||||
USE `mysqldump_test_db`;
|
||||
|
||||
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
||||
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
||||
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
|
||||
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
||||
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
||||
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
||||
|
||||
drop database mysqldump_test_db;
|
||||
|
@ -78,9 +78,9 @@ unique key(a)
|
||||
) engine=ndb;
|
||||
insert into t1 values(1, 'aAa');
|
||||
insert into t1 values(2, 'aaa');
|
||||
ERROR 23000: Can't write, because of unique constraint, to table 't1'
|
||||
ERROR 23000: Duplicate entry '2' for key 1
|
||||
insert into t1 values(3, 'AAA');
|
||||
ERROR 23000: Can't write, because of unique constraint, to table 't1'
|
||||
ERROR 23000: Duplicate entry '3' for key 1
|
||||
select * from t1 order by p;
|
||||
p a
|
||||
1 aAa
|
||||
|
416
mysql-test/r/ndb_grant.result
Normal file
416
mysql-test/r/ndb_grant.result
Normal file
@ -0,0 +1,416 @@
|
||||
drop table if exists t1;
|
||||
SET NAMES binary;
|
||||
use mysql;
|
||||
alter table columns_priv engine=ndb;
|
||||
alter table db engine=ndb;
|
||||
alter table func engine=ndb;
|
||||
alter table help_category engine=ndb;
|
||||
alter table help_keyword engine=ndb;
|
||||
alter table help_relation engine=ndb;
|
||||
alter table help_topic engine=ndb;
|
||||
alter table host engine=ndb;
|
||||
alter table tables_priv engine=ndb;
|
||||
alter table time_zone engine=ndb;
|
||||
alter table time_zone_leap_second engine=ndb;
|
||||
alter table time_zone_name engine=ndb;
|
||||
alter table time_zone_transition engine=ndb;
|
||||
alter table time_zone_transition_type engine=ndb;
|
||||
alter table user engine=ndb;
|
||||
use test;
|
||||
delete from mysql.user where user='mysqltest_1';
|
||||
delete from mysql.db where user='mysqltest_1';
|
||||
flush privileges;
|
||||
begin;
|
||||
grant select on mysqltest.* to mysqltest_1@localhost require cipher "EDH-RSA-DES-CBC3-SHA";
|
||||
commit;
|
||||
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'
|
||||
GRANT SELECT ON `mysqltest`.* TO 'mysqltest_1'@'localhost'
|
||||
begin;
|
||||
grant delete on mysqltest.* to mysqltest_1@localhost;
|
||||
commit;
|
||||
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 ssl_type ssl_cipher x509_issuer x509_subject max_questions max_updates max_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 SPECIFIED EDH-RSA-DES-CBC3-SHA 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'
|
||||
GRANT SELECT, DELETE ON `mysqltest`.* TO 'mysqltest_1'@'localhost'
|
||||
begin;
|
||||
revoke delete on mysqltest.* from mysqltest_1@localhost;
|
||||
commit;
|
||||
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'
|
||||
GRANT SELECT ON `mysqltest`.* TO 'mysqltest_1'@'localhost'
|
||||
begin;
|
||||
grant select on mysqltest.* to mysqltest_1@localhost require NONE;
|
||||
commit;
|
||||
show grants for mysqltest_1@localhost;
|
||||
Grants for mysqltest_1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost'
|
||||
GRANT SELECT ON `mysqltest`.* TO 'mysqltest_1'@'localhost'
|
||||
begin;
|
||||
grant USAGE on mysqltest.* to mysqltest_1@localhost require cipher "EDH-RSA-DES-CBC3-SHA" AND SUBJECT "testsubject" ISSUER "MySQL AB";
|
||||
commit;
|
||||
show grants for mysqltest_1@localhost;
|
||||
Grants for mysqltest_1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost' REQUIRE ISSUER 'MySQL AB' SUBJECT 'testsubject' CIPHER 'EDH-RSA-DES-CBC3-SHA'
|
||||
GRANT SELECT ON `mysqltest`.* TO 'mysqltest_1'@'localhost'
|
||||
begin;
|
||||
revoke all privileges on mysqltest.* from mysqltest_1@localhost;
|
||||
commit;
|
||||
show grants for mysqltest_1@localhost;
|
||||
Grants for mysqltest_1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost' REQUIRE ISSUER 'MySQL AB' SUBJECT 'testsubject' CIPHER 'EDH-RSA-DES-CBC3-SHA'
|
||||
delete from mysql.user where user='mysqltest_1';
|
||||
flush privileges;
|
||||
begin;
|
||||
grant CREATE TEMPORARY TABLES, LOCK TABLES on mysqltest.* to mysqltest_1@localhost;
|
||||
commit;
|
||||
show grants for mysqltest_1@localhost;
|
||||
Grants for mysqltest_1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost'
|
||||
GRANT CREATE TEMPORARY TABLES, LOCK TABLES ON `mysqltest`.* TO 'mysqltest_1'@'localhost'
|
||||
flush privileges;
|
||||
show grants for mysqltest_1@localhost;
|
||||
Grants for mysqltest_1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost'
|
||||
GRANT CREATE TEMPORARY TABLES, LOCK TABLES ON `mysqltest`.* TO 'mysqltest_1'@'localhost'
|
||||
begin;
|
||||
revoke CREATE TEMPORARY TABLES on mysqltest.* from mysqltest_1@localhost;
|
||||
commit;
|
||||
show grants for mysqltest_1@localhost;
|
||||
Grants for mysqltest_1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost'
|
||||
GRANT LOCK TABLES ON `mysqltest`.* TO 'mysqltest_1'@'localhost'
|
||||
begin;
|
||||
grant ALL PRIVILEGES on mysqltest.* to mysqltest_1@localhost with GRANT OPTION;
|
||||
commit;
|
||||
flush privileges;
|
||||
show grants for mysqltest_1@localhost;
|
||||
Grants for mysqltest_1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost'
|
||||
GRANT ALL PRIVILEGES ON `mysqltest`.* TO 'mysqltest_1'@'localhost' WITH GRANT OPTION
|
||||
begin;
|
||||
revoke LOCK TABLES, ALTER on mysqltest.* from mysqltest_1@localhost;
|
||||
commit;
|
||||
show grants for mysqltest_1@localhost;
|
||||
Grants for mysqltest_1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost'
|
||||
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, CREATE TEMPORARY TABLES ON `mysqltest`.* TO 'mysqltest_1'@'localhost' WITH GRANT OPTION
|
||||
begin;
|
||||
revoke all privileges on mysqltest.* from mysqltest_1@localhost;
|
||||
commit;
|
||||
delete from mysql.user where user='mysqltest_1';
|
||||
flush privileges;
|
||||
begin;
|
||||
grant usage on test.* to mysqltest_1@localhost with grant option;
|
||||
commit;
|
||||
show grants for mysqltest_1@localhost;
|
||||
Grants for mysqltest_1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost'
|
||||
GRANT USAGE ON `mysqltest`.* TO 'mysqltest_1'@'localhost' WITH GRANT OPTION
|
||||
GRANT USAGE ON `test`.* TO 'mysqltest_1'@'localhost' WITH GRANT OPTION
|
||||
delete from mysql.user where user='mysqltest_1';
|
||||
delete from mysql.db where user='mysqltest_1';
|
||||
delete from mysql.tables_priv where user='mysqltest_1';
|
||||
delete from mysql.columns_priv where user='mysqltest_1';
|
||||
flush privileges;
|
||||
show grants for mysqltest_1@localhost;
|
||||
ERROR 42000: There is no such grant defined for user 'mysqltest_1' on host 'localhost'
|
||||
create table t1 (a int);
|
||||
begin;
|
||||
GRANT select,update,insert on t1 to mysqltest_1@localhost;
|
||||
GRANT select (a), update (a),insert(a), references(a) on t1 to mysqltest_1@localhost;
|
||||
commit;
|
||||
show grants for mysqltest_1@localhost;
|
||||
Grants for mysqltest_1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost'
|
||||
GRANT SELECT, SELECT (a), INSERT, INSERT (a), UPDATE, UPDATE (a), REFERENCES (a) ON `test`.`t1` TO 'mysqltest_1'@'localhost'
|
||||
select table_priv,column_priv from mysql.tables_priv where user="mysqltest_1";
|
||||
table_priv column_priv
|
||||
Select,Insert,Update Select,Insert,Update,References
|
||||
begin;
|
||||
REVOKE select (a), update on t1 from mysqltest_1@localhost;
|
||||
commit;
|
||||
show grants for mysqltest_1@localhost;
|
||||
Grants for mysqltest_1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost'
|
||||
GRANT SELECT, INSERT, INSERT (a), REFERENCES (a) ON `test`.`t1` TO 'mysqltest_1'@'localhost'
|
||||
begin;
|
||||
REVOKE select,update,insert,insert (a) on t1 from mysqltest_1@localhost;
|
||||
commit;
|
||||
show grants for mysqltest_1@localhost;
|
||||
Grants for mysqltest_1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost'
|
||||
GRANT REFERENCES (a) ON `test`.`t1` TO 'mysqltest_1'@'localhost'
|
||||
begin;
|
||||
GRANT select,references on t1 to mysqltest_1@localhost;
|
||||
commit;
|
||||
select table_priv,column_priv from mysql.tables_priv where user="mysqltest_1";
|
||||
table_priv column_priv
|
||||
Select,References References
|
||||
begin;
|
||||
grant all on test.* to mysqltest_3@localhost with grant option;
|
||||
revoke all on test.* from mysqltest_3@localhost;
|
||||
commit;
|
||||
show grants for mysqltest_3@localhost;
|
||||
Grants for mysqltest_3@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_3'@'localhost'
|
||||
GRANT USAGE ON `test`.* TO 'mysqltest_3'@'localhost' WITH GRANT OPTION
|
||||
begin;
|
||||
revoke grant option on test.* from mysqltest_3@localhost;
|
||||
commit;
|
||||
show grants for mysqltest_3@localhost;
|
||||
Grants for mysqltest_3@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_3'@'localhost'
|
||||
begin;
|
||||
grant all on test.t1 to mysqltest_2@localhost with grant option;
|
||||
revoke all on test.t1 from mysqltest_2@localhost;
|
||||
commit;
|
||||
show grants for mysqltest_2@localhost;
|
||||
Grants for mysqltest_2@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_2'@'localhost'
|
||||
GRANT USAGE ON `test`.`t1` TO 'mysqltest_2'@'localhost' WITH GRANT OPTION
|
||||
begin;
|
||||
revoke grant option on test.t1 from mysqltest_2@localhost;
|
||||
commit;
|
||||
show grants for mysqltest_2@localhost;
|
||||
Grants for mysqltest_2@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_2'@'localhost'
|
||||
delete from mysql.user where user='mysqltest_1' or user="mysqltest_2" or user="mysqltest_3";
|
||||
delete from mysql.db where user='mysqltest_1' or user="mysqltest_2" or user="mysqltest_3";
|
||||
delete from mysql.tables_priv where user='mysqltest_1' or user="mysqltest_2" or user="mysqltest_3";
|
||||
delete from mysql.columns_priv where user='mysqltest_1' or user="mysqltest_2" or user="mysqltest_3";
|
||||
flush privileges;
|
||||
drop table t1;
|
||||
begin;
|
||||
GRANT FILE on mysqltest.* to mysqltest_1@localhost;
|
||||
ERROR HY000: Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
|
||||
commit;
|
||||
select 1;
|
||||
1
|
||||
1
|
||||
create database mysqltest1;
|
||||
begin;
|
||||
grant usage on mysqltest1.* to test6123 identified by 'magic123';
|
||||
commit;
|
||||
select host,db,user,select_priv,insert_priv from mysql.db where db="mysqltest1";
|
||||
host db user select_priv insert_priv
|
||||
delete from mysql.user where user='test6123';
|
||||
drop database mysqltest1;
|
||||
create table t1 (a int);
|
||||
begin;
|
||||
grant ALL PRIVILEGES on *.* to drop_user2@localhost with GRANT OPTION;
|
||||
commit;
|
||||
show grants for drop_user2@localhost;
|
||||
Grants for drop_user2@localhost
|
||||
GRANT ALL PRIVILEGES ON *.* TO 'drop_user2'@'localhost' WITH GRANT OPTION
|
||||
begin;
|
||||
revoke all privileges, grant option from drop_user2@localhost;
|
||||
commit;
|
||||
drop user drop_user2@localhost;
|
||||
begin;
|
||||
grant ALL PRIVILEGES on *.* to drop_user@localhost with GRANT OPTION;
|
||||
grant ALL PRIVILEGES on test.* to drop_user@localhost with GRANT OPTION;
|
||||
grant select(a) on test.t1 to drop_user@localhost;
|
||||
commit;
|
||||
show grants for drop_user@localhost;
|
||||
Grants for drop_user@localhost
|
||||
GRANT ALL PRIVILEGES ON *.* TO 'drop_user'@'localhost' WITH GRANT OPTION
|
||||
GRANT ALL PRIVILEGES ON `test`.* TO 'drop_user'@'localhost' WITH GRANT OPTION
|
||||
GRANT SELECT (a) ON `test`.`t1` TO 'drop_user'@'localhost'
|
||||
set sql_mode=ansi_quotes;
|
||||
show grants for drop_user@localhost;
|
||||
Grants for drop_user@localhost
|
||||
GRANT ALL PRIVILEGES ON *.* TO 'drop_user'@'localhost' WITH GRANT OPTION
|
||||
GRANT ALL PRIVILEGES ON "test".* TO 'drop_user'@'localhost' WITH GRANT OPTION
|
||||
GRANT SELECT (a) ON "test"."t1" TO 'drop_user'@'localhost'
|
||||
set sql_mode=default;
|
||||
set sql_quote_show_create=0;
|
||||
show grants for drop_user@localhost;
|
||||
Grants for drop_user@localhost
|
||||
GRANT ALL PRIVILEGES ON *.* TO 'drop_user'@'localhost' WITH GRANT OPTION
|
||||
GRANT ALL PRIVILEGES ON test.* TO 'drop_user'@'localhost' WITH GRANT OPTION
|
||||
GRANT SELECT (a) ON test.t1 TO 'drop_user'@'localhost'
|
||||
set sql_mode="ansi_quotes";
|
||||
show grants for drop_user@localhost;
|
||||
Grants for drop_user@localhost
|
||||
GRANT ALL PRIVILEGES ON *.* TO 'drop_user'@'localhost' WITH GRANT OPTION
|
||||
GRANT ALL PRIVILEGES ON test.* TO 'drop_user'@'localhost' WITH GRANT OPTION
|
||||
GRANT SELECT (a) ON test.t1 TO 'drop_user'@'localhost'
|
||||
set sql_quote_show_create=1;
|
||||
show grants for drop_user@localhost;
|
||||
Grants for drop_user@localhost
|
||||
GRANT ALL PRIVILEGES ON *.* TO 'drop_user'@'localhost' WITH GRANT OPTION
|
||||
GRANT ALL PRIVILEGES ON "test".* TO 'drop_user'@'localhost' WITH GRANT OPTION
|
||||
GRANT SELECT (a) ON "test"."t1" TO 'drop_user'@'localhost'
|
||||
set sql_mode="";
|
||||
show grants for drop_user@localhost;
|
||||
Grants for drop_user@localhost
|
||||
GRANT ALL PRIVILEGES ON *.* TO 'drop_user'@'localhost' WITH GRANT OPTION
|
||||
GRANT ALL PRIVILEGES ON `test`.* TO 'drop_user'@'localhost' WITH GRANT OPTION
|
||||
GRANT SELECT (a) ON `test`.`t1` TO 'drop_user'@'localhost'
|
||||
revoke all privileges, grant option from drop_user@localhost;
|
||||
show grants for drop_user@localhost;
|
||||
Grants for drop_user@localhost
|
||||
GRANT USAGE ON *.* TO 'drop_user'@'localhost'
|
||||
drop user drop_user@localhost;
|
||||
begin;
|
||||
revoke all privileges, grant option from drop_user@localhost;
|
||||
ERROR HY000: Can't revoke all privileges, grant for one or more of the requested users
|
||||
commit;
|
||||
begin;
|
||||
grant select(a) on test.t1 to drop_user1@localhost;
|
||||
commit;
|
||||
flush privileges;
|
||||
begin;
|
||||
grant select on test.t1 to drop_user2@localhost;
|
||||
grant select on test.* to drop_user3@localhost;
|
||||
grant select on *.* to drop_user4@localhost;
|
||||
commit;
|
||||
drop user drop_user1@localhost, drop_user2@localhost, drop_user3@localhost,
|
||||
drop_user4@localhost;
|
||||
ERROR HY000: Can't drop one or more of the requested users
|
||||
begin;
|
||||
revoke all privileges, grant option from drop_user1@localhost, drop_user2@localhost,
|
||||
drop_user3@localhost, drop_user4@localhost;
|
||||
commit;
|
||||
drop user drop_user1@localhost, drop_user2@localhost, drop_user3@localhost,
|
||||
drop_user4@localhost;
|
||||
drop table t1;
|
||||
begin;
|
||||
grant usage on *.* to mysqltest_1@localhost identified by "password";
|
||||
grant select, update, insert on test.* to mysqltest@localhost;
|
||||
commit;
|
||||
show grants for mysqltest_1@localhost;
|
||||
Grants for mysqltest_1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost' IDENTIFIED BY PASSWORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19'
|
||||
drop user mysqltest_1@localhost;
|
||||
SET NAMES koi8r;
|
||||
CREATE DATABASE <20><>;
|
||||
USE <20><>;
|
||||
CREATE TABLE <20><><EFBFBD> (<28><><EFBFBD> int);
|
||||
begin;
|
||||
GRANT SELECT ON <20><>.* TO <20><><EFBFBD><EFBFBD>@localhost;
|
||||
commit;
|
||||
SHOW GRANTS FOR <20><><EFBFBD><EFBFBD>@localhost;
|
||||
Grants for <20><><EFBFBD><EFBFBD>@localhost
|
||||
GRANT USAGE ON *.* TO '<27><><EFBFBD><EFBFBD>'@'localhost'
|
||||
GRANT SELECT ON `<60><>`.* TO '<27><><EFBFBD><EFBFBD>'@'localhost'
|
||||
begin;
|
||||
REVOKE SELECT ON <20><>.* FROM <20><><EFBFBD><EFBFBD>@localhost;
|
||||
commit;
|
||||
begin;
|
||||
GRANT SELECT ON <20><>.<2E><><EFBFBD> TO <20><><EFBFBD><EFBFBD>@localhost;
|
||||
commit;
|
||||
SHOW GRANTS FOR <20><><EFBFBD><EFBFBD>@localhost;
|
||||
Grants for <20><><EFBFBD><EFBFBD>@localhost
|
||||
GRANT USAGE ON *.* TO '<27><><EFBFBD><EFBFBD>'@'localhost'
|
||||
GRANT SELECT ON `<60><>`.`<60><><EFBFBD>` TO '<27><><EFBFBD><EFBFBD>'@'localhost'
|
||||
begin;
|
||||
REVOKE SELECT ON <20><>.<2E><><EFBFBD> FROM <20><><EFBFBD><EFBFBD>@localhost;
|
||||
commit;
|
||||
begin;
|
||||
GRANT SELECT (<28><><EFBFBD>) ON <20><>.<2E><><EFBFBD> TO <20><><EFBFBD><EFBFBD>@localhost;
|
||||
commit;
|
||||
SHOW GRANTS FOR <20><><EFBFBD><EFBFBD>@localhost;
|
||||
Grants for <20><><EFBFBD><EFBFBD>@localhost
|
||||
GRANT USAGE ON *.* TO '<27><><EFBFBD><EFBFBD>'@'localhost'
|
||||
GRANT SELECT (<28><><EFBFBD>) ON `<60><>`.`<60><><EFBFBD>` TO '<27><><EFBFBD><EFBFBD>'@'localhost'
|
||||
begin;
|
||||
REVOKE SELECT (<28><><EFBFBD>) ON <20><>.<2E><><EFBFBD> FROM <20><><EFBFBD><EFBFBD>@localhost;
|
||||
commit;
|
||||
DROP DATABASE <20><>;
|
||||
SET NAMES latin1;
|
||||
USE test;
|
||||
CREATE TABLE t1 (a int );
|
||||
CREATE TABLE t2 LIKE t1;
|
||||
CREATE TABLE t3 LIKE t1;
|
||||
CREATE TABLE t4 LIKE t1;
|
||||
CREATE TABLE t5 LIKE t1;
|
||||
CREATE TABLE t6 LIKE t1;
|
||||
CREATE TABLE t7 LIKE t1;
|
||||
CREATE TABLE t8 LIKE t1;
|
||||
CREATE TABLE t9 LIKE t1;
|
||||
CREATE TABLE t10 LIKE t1;
|
||||
CREATE DATABASE testdb1;
|
||||
CREATE DATABASE testdb2;
|
||||
CREATE DATABASE testdb3;
|
||||
CREATE DATABASE testdb4;
|
||||
CREATE DATABASE testdb5;
|
||||
CREATE DATABASE testdb6;
|
||||
CREATE DATABASE testdb7;
|
||||
CREATE DATABASE testdb8;
|
||||
CREATE DATABASE testdb9;
|
||||
CREATE DATABASE testdb10;
|
||||
begin;
|
||||
GRANT ALL ON testdb1.* TO testuser@localhost;
|
||||
GRANT ALL ON testdb2.* TO testuser@localhost;
|
||||
GRANT ALL ON testdb3.* TO testuser@localhost;
|
||||
GRANT ALL ON testdb4.* TO testuser@localhost;
|
||||
GRANT ALL ON testdb5.* TO testuser@localhost;
|
||||
GRANT ALL ON testdb6.* TO testuser@localhost;
|
||||
GRANT ALL ON testdb7.* TO testuser@localhost;
|
||||
GRANT ALL ON testdb8.* TO testuser@localhost;
|
||||
GRANT ALL ON testdb9.* TO testuser@localhost;
|
||||
GRANT ALL ON testdb10.* TO testuser@localhost;
|
||||
GRANT SELECT ON test.t1 TO testuser@localhost;
|
||||
GRANT SELECT ON test.t2 TO testuser@localhost;
|
||||
GRANT SELECT ON test.t3 TO testuser@localhost;
|
||||
GRANT SELECT ON test.t4 TO testuser@localhost;
|
||||
GRANT SELECT ON test.t5 TO testuser@localhost;
|
||||
GRANT SELECT ON test.t6 TO testuser@localhost;
|
||||
GRANT SELECT ON test.t7 TO testuser@localhost;
|
||||
GRANT SELECT ON test.t8 TO testuser@localhost;
|
||||
GRANT SELECT ON test.t9 TO testuser@localhost;
|
||||
GRANT SELECT ON test.t10 TO testuser@localhost;
|
||||
GRANT SELECT (a) ON test.t1 TO testuser@localhost;
|
||||
GRANT SELECT (a) ON test.t2 TO testuser@localhost;
|
||||
GRANT SELECT (a) ON test.t3 TO testuser@localhost;
|
||||
GRANT SELECT (a) ON test.t4 TO testuser@localhost;
|
||||
GRANT SELECT (a) ON test.t5 TO testuser@localhost;
|
||||
GRANT SELECT (a) ON test.t6 TO testuser@localhost;
|
||||
GRANT SELECT (a) ON test.t7 TO testuser@localhost;
|
||||
GRANT SELECT (a) ON test.t8 TO testuser@localhost;
|
||||
GRANT SELECT (a) ON test.t9 TO testuser@localhost;
|
||||
GRANT SELECT (a) ON test.t10 TO testuser@localhost;
|
||||
commit;
|
||||
begin;
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM testuser@localhost;
|
||||
commit;
|
||||
SHOW GRANTS FOR testuser@localhost;
|
||||
Grants for testuser@localhost
|
||||
GRANT USAGE ON *.* TO 'testuser'@'localhost'
|
||||
DROP USER testuser@localhost;
|
||||
DROP TABLE t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;
|
||||
DROP DATABASE testdb1;
|
||||
DROP DATABASE testdb2;
|
||||
DROP DATABASE testdb3;
|
||||
DROP DATABASE testdb4;
|
||||
DROP DATABASE testdb5;
|
||||
DROP DATABASE testdb6;
|
||||
DROP DATABASE testdb7;
|
||||
DROP DATABASE testdb8;
|
||||
DROP DATABASE testdb9;
|
||||
DROP DATABASE testdb10;
|
||||
use mysql;
|
||||
alter table columns_priv engine=myisam;
|
||||
alter table db engine=myisam;
|
||||
alter table func engine=myisam;
|
||||
alter table help_category engine=myisam;
|
||||
alter table help_keyword engine=myisam;
|
||||
alter table help_relation engine=myisam;
|
||||
alter table help_topic engine=myisam;
|
||||
alter table host engine=myisam;
|
||||
alter table tables_priv engine=myisam;
|
||||
alter table time_zone engine=myisam;
|
||||
alter table time_zone_leap_second engine=myisam;
|
||||
alter table time_zone_name engine=myisam;
|
||||
alter table time_zone_transition engine=myisam;
|
||||
alter table time_zone_transition_type engine=myisam;
|
||||
alter table user engine=myisam;
|
||||
use test;
|
||||
flush privileges;
|
@ -22,7 +22,7 @@ select * from t1 where b = 4 order by a;
|
||||
a b c
|
||||
3 4 6
|
||||
insert into t1 values(8, 2, 3);
|
||||
ERROR 23000: Can't write, because of unique constraint, to table 't1'
|
||||
ERROR 23000: Duplicate entry '8' for key 1
|
||||
select * from t1 order by a;
|
||||
a b c
|
||||
1 2 3
|
||||
@ -44,6 +44,53 @@ a b c
|
||||
7 8 3
|
||||
8 2 3
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (
|
||||
a int unsigned NOT NULL PRIMARY KEY,
|
||||
b int unsigned,
|
||||
c int unsigned,
|
||||
UNIQUE bc(b,c)
|
||||
) engine = ndb;
|
||||
insert into t1 values(1,1,1),(2,NULL,2),(3,NULL,NULL),(4,4,NULL);
|
||||
select * from t1 use index (bc) where b IS NULL order by a;
|
||||
a b c
|
||||
2 NULL 2
|
||||
3 NULL NULL
|
||||
select * from t1 use index (bc)order by a;
|
||||
a b c
|
||||
1 1 1
|
||||
2 NULL 2
|
||||
3 NULL NULL
|
||||
4 4 NULL
|
||||
select * from t1 use index (bc) order by a;
|
||||
a b c
|
||||
1 1 1
|
||||
2 NULL 2
|
||||
3 NULL NULL
|
||||
4 4 NULL
|
||||
select * from t1 use index (PRIMARY) where b IS NULL order by a;
|
||||
a b c
|
||||
2 NULL 2
|
||||
3 NULL NULL
|
||||
select * from t1 use index (bc) where b IS NULL order by a;
|
||||
a b c
|
||||
2 NULL 2
|
||||
3 NULL NULL
|
||||
select * from t1 use index (bc) where b IS NULL and c IS NULL order by a;
|
||||
a b c
|
||||
3 NULL NULL
|
||||
select * from t1 use index (bc) where b IS NULL and c = 2 order by a;
|
||||
a b c
|
||||
2 NULL 2
|
||||
select * from t1 use index (bc) where b < 4 order by a;
|
||||
a b c
|
||||
1 1 1
|
||||
select * from t1 use index (bc) where b IS NOT NULL order by a;
|
||||
a b c
|
||||
1 1 1
|
||||
4 4 NULL
|
||||
insert into t1 values(5,1,1);
|
||||
ERROR 23000: Duplicate entry '5' for key 1
|
||||
drop table t1;
|
||||
CREATE TABLE t2 (
|
||||
a int unsigned NOT NULL PRIMARY KEY,
|
||||
b int unsigned not null,
|
||||
@ -65,7 +112,7 @@ select * from t2 where b = 4 order by a;
|
||||
a b c
|
||||
3 4 6
|
||||
insert into t2 values(8, 2, 3);
|
||||
ERROR 23000: Can't write, because of unique constraint, to table 't2'
|
||||
ERROR 23000: Duplicate entry '8' for key 1
|
||||
select * from t2 order by a;
|
||||
a b c
|
||||
1 2 3
|
||||
@ -87,6 +134,13 @@ a b c
|
||||
7 8 3
|
||||
8 2 3
|
||||
drop table t2;
|
||||
CREATE TABLE t2 (
|
||||
a int unsigned NOT NULL PRIMARY KEY,
|
||||
b int unsigned not null,
|
||||
c int unsigned,
|
||||
UNIQUE USING HASH (b, c)
|
||||
) engine=ndbcluster;
|
||||
ERROR 42000: Column 'c' is used with UNIQUE or INDEX but is not defined as NOT NULL
|
||||
CREATE TABLE t3 (
|
||||
a int unsigned NOT NULL,
|
||||
b int unsigned not null,
|
||||
@ -123,7 +177,7 @@ pk a
|
||||
3 NULL
|
||||
4 4
|
||||
insert into t1 values (5,0);
|
||||
ERROR 23000: Can't write, because of unique constraint, to table 't1'
|
||||
ERROR 23000: Duplicate entry '5' for key 1
|
||||
select * from t1 order by pk;
|
||||
pk a
|
||||
-1 NULL
|
||||
@ -156,7 +210,7 @@ pk a b c
|
||||
0 NULL 18 NULL
|
||||
1 3 19 abc
|
||||
insert into t2 values(2,3,19,'abc');
|
||||
ERROR 23000: Can't write, because of unique constraint, to table 't2'
|
||||
ERROR 23000: Duplicate entry '2' for key 1
|
||||
select * from t2 order by pk;
|
||||
pk a b c
|
||||
-1 1 17 NULL
|
||||
@ -522,3 +576,39 @@ uid gid rid cid
|
||||
1 1 2 3
|
||||
1 1 2 4
|
||||
drop table t1,t2,t3,t4,t5,t6,t7;
|
||||
CREATE TABLE t1 (
|
||||
a int unsigned NOT NULL PRIMARY KEY,
|
||||
b int unsigned,
|
||||
c int unsigned,
|
||||
UNIQUE bc(b,c) ) engine = ndb;
|
||||
insert into t1 values(1,1,1),(2,NULL,2),(3,NULL,NULL),(4,4,NULL);
|
||||
select * from t1 where b=1 and c=1;
|
||||
a b c
|
||||
1 1 1
|
||||
select * from t1 where b is null and c is null;
|
||||
a b c
|
||||
3 NULL NULL
|
||||
select * from t1 where b is null and c = 2;
|
||||
a b c
|
||||
2 NULL 2
|
||||
select * from t1 where b = 4 and c is null;
|
||||
a b c
|
||||
4 4 NULL
|
||||
create table t8 as
|
||||
select * from t1 where (b = 1 and c = 1)
|
||||
or (b is null and c is null)
|
||||
or (b is null and c = 2)
|
||||
or (b = 4 and c is null);
|
||||
select * from t8 order by a;
|
||||
a b c
|
||||
1 1 1
|
||||
2 NULL 2
|
||||
3 NULL NULL
|
||||
4 4 NULL
|
||||
select * from t1 order by a;
|
||||
a b c
|
||||
1 1 1
|
||||
2 NULL 2
|
||||
3 NULL NULL
|
||||
4 4 NULL
|
||||
drop table t1, t8;
|
||||
|
@ -535,27 +535,46 @@ count(*)
|
||||
2000
|
||||
insert into t1 select * from t1 where b < 10 order by pk1;
|
||||
ERROR 23000: Duplicate entry '9' for key 1
|
||||
DELETE FROM t1 WHERE pk1=2;
|
||||
begin;
|
||||
INSERT IGNORE INTO t1 VALUES(1,2,3);
|
||||
ERROR HY000: Table storage engine for 't1' doesn't have this option
|
||||
commit;
|
||||
select * from t1 where pk1=1;
|
||||
INSERT IGNORE INTO t1 VALUES(1,2,3),(2,3,4);
|
||||
select * from t1 where pk1 < 3 order by pk1;
|
||||
pk1 b c
|
||||
0 0 0
|
||||
1 1 1
|
||||
INSERT IGNORE INTO t1 VALUES(1,2,3);
|
||||
ERROR HY000: Table storage engine for 't1' doesn't have this option
|
||||
select * from t1 where pk1=1;
|
||||
2 3 4
|
||||
rollback;
|
||||
INSERT IGNORE INTO t1 VALUES(1,2,3),(2,3,4);
|
||||
select * from t1 where pk1 < 3 order by pk1;
|
||||
pk1 b c
|
||||
0 0 0
|
||||
1 1 1
|
||||
REPLACE INTO t1 values(1, 2, 3);
|
||||
2 3 4
|
||||
REPLACE INTO t1 values(1, 78, 3);
|
||||
select * from t1 where pk1=1;
|
||||
pk1 b c
|
||||
1 2 3
|
||||
INSERT INTO t1 VALUES(1,1,1) ON DUPLICATE KEY UPDATE b=79;
|
||||
ERROR HY000: Table storage engine for 't1' doesn't have this option
|
||||
select * from t1 where pk1=1;
|
||||
1 78 3
|
||||
INSERT INTO t1 VALUES(1,1,1),(3,4,5) ON DUPLICATE KEY UPDATE b=79;
|
||||
select * from t1 where pk1 < 4 order by pk1;
|
||||
pk1 b c
|
||||
1 2 3
|
||||
0 0 0
|
||||
1 79 3
|
||||
2 3 4
|
||||
3 79 3
|
||||
INSERT INTO t1 VALUES(1,1,1),(3,4,5) ON DUPLICATE KEY UPDATE b=pk1+c;
|
||||
select * from t1 where pk1 < 4 order by pk1;
|
||||
pk1 b c
|
||||
0 0 0
|
||||
1 4 3
|
||||
2 3 4
|
||||
3 6 3
|
||||
DELETE FROM t1 WHERE pk1 = 2 OR pk1 = 4 OR pk1 = 6;
|
||||
INSERT INTO t1 VALUES(1,1,1),(2,2,17),(3,4,5) ON DUPLICATE KEY UPDATE pk1=b;
|
||||
select * from t1 where pk1 = b and b != c order by pk1;
|
||||
pk1 b c
|
||||
2 2 17
|
||||
4 4 3
|
||||
6 6 3
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1(a INT) ENGINE=ndb;
|
||||
INSERT IGNORE INTO t1 VALUES (1);
|
||||
|
@ -2,9 +2,9 @@ drop table if exists t1;
|
||||
create table t1(f1 int);
|
||||
insert into t1 values (5);
|
||||
grant select on test.* to ssl_user1@localhost require SSL;
|
||||
grant select on test.* to ssl_user2@localhost require cipher "EDH-RSA-DES-CBC3-SHA";
|
||||
grant select on test.* to ssl_user3@localhost require cipher "EDH-RSA-DES-CBC3-SHA" AND SUBJECT "/C=SE/L=Uppsala/O=MySQL AB/CN=MySQL Client/Email=abstract.mysql.developer@mysql.com";
|
||||
grant select on test.* to ssl_user4@localhost require cipher "EDH-RSA-DES-CBC3-SHA" AND SUBJECT "/C=SE/L=Uppsala/O=MySQL AB/CN=MySQL Client/Email=abstract.mysql.developer@mysql.com" ISSUER "/C=SE/L=Uppsala/O=MySQL AB/CN=Abstract MySQL Developer/Email=abstract.mysql.developer@mysql.com";
|
||||
grant select on test.* to ssl_user2@localhost require cipher "DHE-RSA-AES256-SHA";
|
||||
grant select on test.* to ssl_user3@localhost require cipher "DHE-RSA-AES256-SHA" AND SUBJECT "/C=SE/L=Uppsala/O=MySQL AB/CN=MySQL Client/Email=abstract.mysql.developer@mysql.com";
|
||||
grant select on test.* to ssl_user4@localhost require cipher "DHE-RSA-AES256-SHA" AND SUBJECT "/C=SE/L=Uppsala/O=MySQL AB/CN=MySQL Client/Email=abstract.mysql.developer@mysql.com" ISSUER "/C=SE/L=Uppsala/O=MySQL AB/CN=Abstract MySQL Developer/Email=abstract.mysql.developer@mysql.com";
|
||||
flush privileges;
|
||||
select * from t1;
|
||||
f1
|
||||
|
@ -450,3 +450,24 @@ PREPARE stmt FROM 'UPDATE t1 AS P1 INNER JOIN (SELECT N FROM t1 GROUP BY N HAVIN
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
DROP TABLE t1;
|
||||
prepare stmt from "select ? is null, ? is not null, ?";
|
||||
select @no_such_var is null, @no_such_var is not null, @no_such_var;
|
||||
@no_such_var is null @no_such_var is not null @no_such_var
|
||||
1 0 NULL
|
||||
execute stmt using @no_such_var, @no_such_var, @no_such_var;
|
||||
? is null ? is not null ?
|
||||
1 0 NULL
|
||||
set @var='abc';
|
||||
select @var is null, @var is not null, @var;
|
||||
@var is null @var is not null @var
|
||||
0 1 abc
|
||||
execute stmt using @var, @var, @var;
|
||||
? is null ? is not null ?
|
||||
0 1 abc
|
||||
set @var=null;
|
||||
select @var is null, @var is not null, @var;
|
||||
@var is null @var is not null @var
|
||||
1 0 NULL
|
||||
execute stmt using @var, @var, @var;
|
||||
? is null ? is not null ?
|
||||
1 0 NULL
|
||||
|
@ -2,20 +2,19 @@ use test;
|
||||
drop table if exists t1, t9 ;
|
||||
create table t1
|
||||
(
|
||||
a int not null, b varchar(30),
|
||||
a int, b varchar(30),
|
||||
primary key(a)
|
||||
) engine = 'NDB' ;
|
||||
drop table if exists t9;
|
||||
create table t9
|
||||
(
|
||||
c1 tinyint not null, c2 smallint, c3 mediumint, c4 int,
|
||||
c1 tinyint, c2 smallint, c3 mediumint, c4 int,
|
||||
c5 integer, c6 bigint, c7 float, c8 double,
|
||||
c9 double precision, c10 real, c11 decimal(7, 4), c12 numeric(8, 4),
|
||||
c13 date, c14 datetime, c15 timestamp(14), c16 time,
|
||||
c17 year, c18 bit, c19 bool, c20 char,
|
||||
c21 char(10), c22 varchar(30), c23 char(100), c24 char(100),
|
||||
c25 char(100), c26 char(100), c27 char(100), c28 char(100),
|
||||
c29 char(100), c30 char(100), c31 enum('one', 'two', 'three'),
|
||||
c21 char(10), c22 varchar(30), c23 tinyblob, c24 tinytext,
|
||||
c25 blob, c26 text, c27 mediumblob, c28 mediumtext,
|
||||
c29 longblob, c30 longtext, c31 enum('one', 'two', 'three'),
|
||||
c32 set('monday', 'tuesday', 'wednesday'),
|
||||
primary key(c1)
|
||||
) engine = 'NDB' ;
|
||||
@ -72,14 +71,14 @@ def test t9 t9 c19 c19 1 1 1 Y 32768 0 63
|
||||
def test t9 t9 c20 c20 254 1 1 Y 0 0 8
|
||||
def test t9 t9 c21 c21 253 10 10 Y 0 0 8
|
||||
def test t9 t9 c22 c22 253 30 30 Y 0 0 8
|
||||
def test t9 t9 c23 c23 253 100 8 Y 0 0 8
|
||||
def test t9 t9 c24 c24 253 100 8 Y 0 0 8
|
||||
def test t9 t9 c25 c25 253 100 4 Y 0 0 8
|
||||
def test t9 t9 c26 c26 253 100 4 Y 0 0 8
|
||||
def test t9 t9 c27 c27 253 100 10 Y 0 0 8
|
||||
def test t9 t9 c28 c28 253 100 10 Y 0 0 8
|
||||
def test t9 t9 c29 c29 253 100 8 Y 0 0 8
|
||||
def test t9 t9 c30 c30 253 100 8 Y 0 0 8
|
||||
def test t9 t9 c23 c23 252 255 8 Y 144 0 63
|
||||
def test t9 t9 c24 c24 252 255 8 Y 16 0 8
|
||||
def test t9 t9 c25 c25 252 65535 4 Y 144 0 63
|
||||
def test t9 t9 c26 c26 252 65535 4 Y 16 0 8
|
||||
def test t9 t9 c27 c27 252 16777215 10 Y 144 0 63
|
||||
def test t9 t9 c28 c28 252 16777215 10 Y 16 0 8
|
||||
def test t9 t9 c29 c29 252 16777215 8 Y 144 0 63
|
||||
def test t9 t9 c30 c30 252 16777215 8 Y 16 0 8
|
||||
def test t9 t9 c31 c31 254 5 3 Y 256 0 8
|
||||
def test t9 t9 c32 c32 254 24 7 Y 2048 0 8
|
||||
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 c16 c17 c18 c19 c20 c21 c22 c23 c24 c25 c26 c27 c28 c29 c30 c31 c32
|
||||
@ -1188,7 +1187,7 @@ c29= 'longblob', c30= 'longtext', c31='two', c32= 'tuesday';
|
||||
commit ;
|
||||
prepare stmt1 from 'delete from t1 where a=2' ;
|
||||
execute stmt1;
|
||||
select a,b from t1 where a=2 order by b;
|
||||
select a,b from t1 where a=2;
|
||||
a b
|
||||
execute stmt1;
|
||||
insert into t1 values(0,NULL);
|
||||
@ -1270,18 +1269,23 @@ execute stmt1 using @arg00, @arg00;
|
||||
select a,b from t1 where a=@arg00;
|
||||
a b
|
||||
2 two
|
||||
execute stmt1 using @arg01, @arg00;
|
||||
select a,b from t1 where a=@arg01;
|
||||
a b
|
||||
22 two
|
||||
execute stmt1 using @arg00, @arg01;
|
||||
select a,b from t1 where a=@arg00;
|
||||
a b
|
||||
2 two
|
||||
set @arg00=NULL;
|
||||
set @arg01=2;
|
||||
execute stmt1 using @arg00, @arg01;
|
||||
Warnings:
|
||||
Warning 1263 Data truncated; NULL supplied to NOT NULL column 'a' at row 1
|
||||
select a,b from t1 order by a;
|
||||
a b
|
||||
0 two
|
||||
1 one
|
||||
2 two
|
||||
3 three
|
||||
4 four
|
||||
set @arg00=0;
|
||||
@ -1302,15 +1306,19 @@ create table t2 as select a,b from t1 ;
|
||||
prepare stmt1 from 'update t1 set a=? where b=?
|
||||
and a in (select ? from t2
|
||||
where b = ? or a = ?)';
|
||||
execute stmt1 using @arg00, @arg01, @arg02, @arg03, @arg04 ;
|
||||
affected rows: 1
|
||||
info: Rows matched: 1 Changed: 1 Warnings: 0
|
||||
select a,b from t1 where a = @arg00 ;
|
||||
a b
|
||||
23 two
|
||||
prepare stmt1 from 'update t1 set a=? where b=?
|
||||
and a not in (select ? from t2
|
||||
where b = ? or a = ?)';
|
||||
execute stmt1 using @arg04, @arg01, @arg02, @arg03, @arg00 ;
|
||||
affected rows: 0
|
||||
info: Rows matched: 0 Changed: 0 Warnings: 0
|
||||
select a,b from t1 order by a;
|
||||
affected rows: 1
|
||||
info: Rows matched: 1 Changed: 1 Warnings: 0
|
||||
select a,b from t1 order by a ;
|
||||
a b
|
||||
1 one
|
||||
2 two
|
||||
@ -1319,21 +1327,25 @@ a b
|
||||
drop table t2 ;
|
||||
create table t2
|
||||
(
|
||||
a int not null, b varchar(30),
|
||||
a int, b varchar(30),
|
||||
primary key(a)
|
||||
) engine = 'NDB' ;
|
||||
insert into t2(a,b) select a, b from t1 ;
|
||||
prepare stmt1 from 'update t1 set a=? where b=?
|
||||
and a in (select ? from t2
|
||||
where b = ? or a = ?)';
|
||||
execute stmt1 using @arg00, @arg01, @arg02, @arg03, @arg04 ;
|
||||
affected rows: 1
|
||||
info: Rows matched: 1 Changed: 1 Warnings: 0
|
||||
select a,b from t1 where a = @arg00 ;
|
||||
a b
|
||||
23 two
|
||||
prepare stmt1 from 'update t1 set a=? where b=?
|
||||
and a not in (select ? from t2
|
||||
where b = ? or a = ?)';
|
||||
execute stmt1 using @arg04, @arg01, @arg02, @arg03, @arg00 ;
|
||||
affected rows: 0
|
||||
info: Rows matched: 0 Changed: 0 Warnings: 0
|
||||
affected rows: 1
|
||||
info: Rows matched: 1 Changed: 1 Warnings: 0
|
||||
select a,b from t1 order by a ;
|
||||
a b
|
||||
1 one
|
||||
@ -1474,7 +1486,7 @@ set @arg02=82 ;
|
||||
set @arg03='8-2' ;
|
||||
prepare stmt1 from 'insert into t1 values(?,?),(?,?)';
|
||||
execute stmt1 using @arg00, @arg01, @arg02, @arg03 ;
|
||||
select a,b from t1 where a in (@arg00,@arg02) order by a ;
|
||||
select a,b from t1 where a in (@arg00,@arg02) ;
|
||||
a b
|
||||
81 8-1
|
||||
82 8-2
|
||||
@ -1489,6 +1501,7 @@ set @arg00=6 ;
|
||||
set @arg01=1 ;
|
||||
prepare stmt1 from 'insert into t1 set a=?, b=''sechs''
|
||||
on duplicate key update a=a + ?, b=concat(b,''modified'') ';
|
||||
execute stmt1 using @arg00, @arg01;
|
||||
select * from t1 order by a;
|
||||
a b
|
||||
0 NULL
|
||||
@ -1497,13 +1510,15 @@ a b
|
||||
3 three
|
||||
4 four
|
||||
5 five
|
||||
6 six
|
||||
7 sixmodified
|
||||
8 eight
|
||||
9 nine
|
||||
81 8-1
|
||||
82 8-2
|
||||
set @arg00=81 ;
|
||||
set @arg01=1 ;
|
||||
execute stmt1 using @arg00, @arg01;
|
||||
ERROR 23000: Duplicate entry '82' for key 1
|
||||
drop table if exists t2 ;
|
||||
create table t2 (id int auto_increment primary key)
|
||||
ENGINE= 'NDB' ;
|
||||
@ -1526,23 +1541,32 @@ set @x1100="x1100" ;
|
||||
set @100=100 ;
|
||||
set @updated="updated" ;
|
||||
insert into t1 values(1000,'x1000_1') ;
|
||||
insert into t1 values(@1000,@x1000_2),(@1000,@x1000_3)
|
||||
on duplicate key update a = a + @100, b = concat(b,@updated) ;
|
||||
select a,b from t1 where a >= 1000 order by a ;
|
||||
a b
|
||||
1000 x1000_1
|
||||
1000 x1000_3
|
||||
1100 x1000_1updated
|
||||
delete from t1 where a >= 1000 ;
|
||||
insert into t1 values(1000,'x1000_1') ;
|
||||
prepare stmt1 from ' insert into t1 values(?,?),(?,?)
|
||||
on duplicate key update a = a + ?, b = concat(b,?) ';
|
||||
execute stmt1 using @1000, @x1000_2, @1000, @x1000_3, @100, @updated ;
|
||||
select a,b from t1 where a >= 1000 order by a ;
|
||||
a b
|
||||
1000 x1000_1
|
||||
1000 x1000_3
|
||||
1100 x1000_1updated
|
||||
delete from t1 where a >= 1000 ;
|
||||
insert into t1 values(1000,'x1000_1') ;
|
||||
execute stmt1 using @1000, @x1000_2, @1100, @x1000_3, @100, @updated ;
|
||||
select a,b from t1 where a >= 1000 order by a ;
|
||||
a b
|
||||
1000 x1000_1
|
||||
1200 x1000_1updatedupdated
|
||||
delete from t1 where a >= 1000 ;
|
||||
prepare stmt1 from ' replace into t1 (a,b) select 100, ''hundred'' ';
|
||||
execute stmt1;
|
||||
execute stmt1;
|
||||
execute stmt1;
|
||||
test_sequence
|
||||
------ multi table tests ------
|
||||
delete from t1 ;
|
||||
@ -1891,13 +1915,13 @@ def @arg19 254 20 1 Y 128 31 63
|
||||
def @arg20 254 8192 1 Y 0 31 8
|
||||
def @arg21 254 8192 10 Y 0 31 8
|
||||
def @arg22 254 8192 30 Y 0 31 8
|
||||
def @arg23 254 8192 8 Y 0 31 8
|
||||
def @arg23 254 8192 8 Y 128 31 63
|
||||
def @arg24 254 8192 8 Y 0 31 8
|
||||
def @arg25 254 8192 4 Y 0 31 8
|
||||
def @arg25 254 8192 4 Y 128 31 63
|
||||
def @arg26 254 8192 4 Y 0 31 8
|
||||
def @arg27 254 8192 10 Y 0 31 8
|
||||
def @arg27 254 8192 10 Y 128 31 63
|
||||
def @arg28 254 8192 10 Y 0 31 8
|
||||
def @arg29 254 8192 8 Y 0 31 8
|
||||
def @arg29 254 8192 8 Y 128 31 63
|
||||
def @arg30 254 8192 8 Y 0 31 8
|
||||
def @arg31 254 8192 3 Y 0 31 8
|
||||
def @arg32 254 8192 6 Y 128 31 63
|
||||
@ -1938,13 +1962,13 @@ def @arg19 254 20 0 Y 128 31 63
|
||||
def @arg20 254 8192 0 Y 0 31 8
|
||||
def @arg21 254 8192 0 Y 0 31 8
|
||||
def @arg22 254 8192 0 Y 0 31 8
|
||||
def @arg23 254 8192 0 Y 0 31 8
|
||||
def @arg23 254 8192 0 Y 128 31 63
|
||||
def @arg24 254 8192 0 Y 0 31 8
|
||||
def @arg25 254 8192 0 Y 0 31 8
|
||||
def @arg25 254 8192 0 Y 128 31 63
|
||||
def @arg26 254 8192 0 Y 0 31 8
|
||||
def @arg27 254 8192 0 Y 0 31 8
|
||||
def @arg27 254 8192 0 Y 128 31 63
|
||||
def @arg28 254 8192 0 Y 0 31 8
|
||||
def @arg29 254 8192 0 Y 0 31 8
|
||||
def @arg29 254 8192 0 Y 128 31 63
|
||||
def @arg30 254 8192 0 Y 0 31 8
|
||||
def @arg31 254 8192 0 Y 0 31 8
|
||||
def @arg32 254 8192 0 Y 0 31 8
|
||||
@ -1988,13 +2012,13 @@ def @arg19 254 20 1 Y 128 31 63
|
||||
def @arg20 254 8192 1 Y 0 31 8
|
||||
def @arg21 254 8192 10 Y 0 31 8
|
||||
def @arg22 254 8192 30 Y 0 31 8
|
||||
def @arg23 254 8192 8 Y 0 31 8
|
||||
def @arg23 254 8192 8 Y 128 31 63
|
||||
def @arg24 254 8192 8 Y 0 31 8
|
||||
def @arg25 254 8192 4 Y 0 31 8
|
||||
def @arg25 254 8192 4 Y 128 31 63
|
||||
def @arg26 254 8192 4 Y 0 31 8
|
||||
def @arg27 254 8192 10 Y 0 31 8
|
||||
def @arg27 254 8192 10 Y 128 31 63
|
||||
def @arg28 254 8192 10 Y 0 31 8
|
||||
def @arg29 254 8192 8 Y 0 31 8
|
||||
def @arg29 254 8192 8 Y 128 31 63
|
||||
def @arg30 254 8192 8 Y 0 31 8
|
||||
def @arg31 254 8192 3 Y 0 31 8
|
||||
def @arg32 254 8192 6 Y 128 31 63
|
||||
@ -2028,13 +2052,13 @@ def @arg19 254 20 0 Y 128 31 63
|
||||
def @arg20 254 8192 0 Y 0 31 8
|
||||
def @arg21 254 8192 0 Y 0 31 8
|
||||
def @arg22 254 8192 0 Y 0 31 8
|
||||
def @arg23 254 8192 0 Y 0 31 8
|
||||
def @arg23 254 8192 0 Y 128 31 63
|
||||
def @arg24 254 8192 0 Y 0 31 8
|
||||
def @arg25 254 8192 0 Y 0 31 8
|
||||
def @arg25 254 8192 0 Y 128 31 63
|
||||
def @arg26 254 8192 0 Y 0 31 8
|
||||
def @arg27 254 8192 0 Y 0 31 8
|
||||
def @arg27 254 8192 0 Y 128 31 63
|
||||
def @arg28 254 8192 0 Y 0 31 8
|
||||
def @arg29 254 8192 0 Y 0 31 8
|
||||
def @arg29 254 8192 0 Y 128 31 63
|
||||
def @arg30 254 8192 0 Y 0 31 8
|
||||
def @arg31 254 8192 0 Y 0 31 8
|
||||
def @arg32 254 8192 0 Y 0 31 8
|
||||
@ -2076,13 +2100,13 @@ def @arg19 254 20 1 Y 128 31 63
|
||||
def @arg20 254 8192 1 Y 0 31 8
|
||||
def @arg21 254 8192 10 Y 0 31 8
|
||||
def @arg22 254 8192 30 Y 0 31 8
|
||||
def @arg23 254 8192 8 Y 0 31 8
|
||||
def @arg23 254 8192 8 Y 128 31 63
|
||||
def @arg24 254 8192 8 Y 0 31 8
|
||||
def @arg25 254 8192 4 Y 0 31 8
|
||||
def @arg25 254 8192 4 Y 128 31 63
|
||||
def @arg26 254 8192 4 Y 0 31 8
|
||||
def @arg27 254 8192 10 Y 0 31 8
|
||||
def @arg27 254 8192 10 Y 128 31 63
|
||||
def @arg28 254 8192 10 Y 0 31 8
|
||||
def @arg29 254 8192 8 Y 0 31 8
|
||||
def @arg29 254 8192 8 Y 128 31 63
|
||||
def @arg30 254 8192 8 Y 0 31 8
|
||||
def @arg31 254 8192 3 Y 0 31 8
|
||||
def @arg32 254 8192 6 Y 128 31 63
|
||||
@ -2120,13 +2144,13 @@ def @arg19 254 20 0 Y 128 31 63
|
||||
def @arg20 254 8192 0 Y 0 31 8
|
||||
def @arg21 254 8192 0 Y 0 31 8
|
||||
def @arg22 254 8192 0 Y 0 31 8
|
||||
def @arg23 254 8192 0 Y 0 31 8
|
||||
def @arg23 254 8192 0 Y 128 31 63
|
||||
def @arg24 254 8192 0 Y 0 31 8
|
||||
def @arg25 254 8192 0 Y 0 31 8
|
||||
def @arg25 254 8192 0 Y 128 31 63
|
||||
def @arg26 254 8192 0 Y 0 31 8
|
||||
def @arg27 254 8192 0 Y 0 31 8
|
||||
def @arg27 254 8192 0 Y 128 31 63
|
||||
def @arg28 254 8192 0 Y 0 31 8
|
||||
def @arg29 254 8192 0 Y 0 31 8
|
||||
def @arg29 254 8192 0 Y 128 31 63
|
||||
def @arg30 254 8192 0 Y 0 31 8
|
||||
def @arg31 254 8192 0 Y 0 31 8
|
||||
def @arg32 254 8192 0 Y 0 31 8
|
||||
@ -2166,13 +2190,13 @@ def @arg19 254 20 1 Y 128 31 63
|
||||
def @arg20 254 8192 1 Y 0 31 8
|
||||
def @arg21 254 8192 10 Y 0 31 8
|
||||
def @arg22 254 8192 30 Y 0 31 8
|
||||
def @arg23 254 8192 8 Y 0 31 8
|
||||
def @arg23 254 8192 8 Y 128 31 63
|
||||
def @arg24 254 8192 8 Y 0 31 8
|
||||
def @arg25 254 8192 4 Y 0 31 8
|
||||
def @arg25 254 8192 4 Y 128 31 63
|
||||
def @arg26 254 8192 4 Y 0 31 8
|
||||
def @arg27 254 8192 10 Y 0 31 8
|
||||
def @arg27 254 8192 10 Y 128 31 63
|
||||
def @arg28 254 8192 10 Y 0 31 8
|
||||
def @arg29 254 8192 8 Y 0 31 8
|
||||
def @arg29 254 8192 8 Y 128 31 63
|
||||
def @arg30 254 8192 8 Y 0 31 8
|
||||
def @arg31 254 8192 3 Y 0 31 8
|
||||
def @arg32 254 8192 6 Y 128 31 63
|
||||
@ -2204,13 +2228,13 @@ def @arg19 254 20 0 Y 128 31 63
|
||||
def @arg20 254 8192 0 Y 0 31 8
|
||||
def @arg21 254 8192 0 Y 0 31 8
|
||||
def @arg22 254 8192 0 Y 0 31 8
|
||||
def @arg23 254 8192 0 Y 0 31 8
|
||||
def @arg23 254 8192 0 Y 128 31 63
|
||||
def @arg24 254 8192 0 Y 0 31 8
|
||||
def @arg25 254 8192 0 Y 0 31 8
|
||||
def @arg25 254 8192 0 Y 128 31 63
|
||||
def @arg26 254 8192 0 Y 0 31 8
|
||||
def @arg27 254 8192 0 Y 0 31 8
|
||||
def @arg27 254 8192 0 Y 128 31 63
|
||||
def @arg28 254 8192 0 Y 0 31 8
|
||||
def @arg29 254 8192 0 Y 0 31 8
|
||||
def @arg29 254 8192 0 Y 128 31 63
|
||||
def @arg30 254 8192 0 Y 0 31 8
|
||||
def @arg31 254 8192 0 Y 0 31 8
|
||||
def @arg32 254 8192 0 Y 0 31 8
|
||||
@ -2770,14 +2794,14 @@ c1 c20 c21 c22 c23 c24 c25 c26 c27 c28 c29 c30
|
||||
41 4 41 41 41 41 41 41 41 41 41 41
|
||||
42 4 42 42 42 42 42 42 42 42 42 42
|
||||
43 4 43 43 43 43 43 43 43 43 43 43
|
||||
50 5 50 50 50 50 50 50 50 50 50 50
|
||||
50 5 50 50 50.00 50.00 50.00 50.00 50.00 50.00 50.00 50.00
|
||||
51 5 51 51 51 51 51 51 51 51 51 51
|
||||
52 5 52 52 52 52 52 52 52 52 52 52
|
||||
53 5 53 53 53 53 53 53 53 53 53 53
|
||||
54 5 54 54 54 54 54 54 54 54 54 54
|
||||
52 5 52 52 52.00 52.00 52.00 52.00 52.00 52.00 52.00 52.00
|
||||
53 5 53 53 53.00 53.00 53.00 53.00 53.00 53.00 53.00 53.00
|
||||
54 5 54 54 54.00 54.00 54.00 54.00 54.00 54.00 54.00 54.00
|
||||
55 5 55 55 55 55 55 55 55 55 55 55
|
||||
56 6 56 56 56 56 56 56 56 56 56 56
|
||||
57 6 57 57 57 57 57 57 57 57 57 57
|
||||
56 6 56 56 56.00 56.00 56.00 56.00 56.00 56.00 56.00 56.00
|
||||
57 6 57 57 57.00 57.00 57.00 57.00 57.00 57.00 57.00 57.00
|
||||
60 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
|
||||
61 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
|
||||
62 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
|
||||
|
@ -221,7 +221,7 @@ update t1 set y=x;
|
||||
explain select * from t1, t1 t2 where t1.y = 2 and t2.x between 7 and t1.y+0;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref y y 5 const 1 Using where
|
||||
1 SIMPLE t2 range x x 5 NULL 4 Using where
|
||||
1 SIMPLE t2 range x x 5 NULL 4 Range checked for each record (index map: 0x1)
|
||||
explain select * from t1, t1 t2 where t1.y = 2 and t2.x >= 7 and t2.x <= t1.y+0;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref y y 5 const 1 Using where
|
||||
@ -237,7 +237,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||
explain select * from t1, t1 t2 where t1.y = 2 and t2.x between 0 and t1.y;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref y y 5 const 1 Using where
|
||||
1 SIMPLE t2 ALL x NULL NULL NULL 9 Using where
|
||||
1 SIMPLE t2 ALL x NULL NULL NULL 9 Range checked for each record (index map: 0x1)
|
||||
explain select * from t1, t1 t2 where t1.y = 2 and t2.x >= 0 and t2.x <= t1.y;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref y y 5 const 1 Using where
|
||||
|
12
mysql-test/r/rpl_start_stop_slave.result
Normal file
12
mysql-test/r/rpl_start_stop_slave.result
Normal file
@ -0,0 +1,12 @@
|
||||
stop slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
reset master;
|
||||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
stop slave;
|
||||
create table t1(n int);
|
||||
start slave;
|
||||
stop slave io_thread;
|
||||
start slave io_thread;
|
||||
drop table t1;
|
@ -2353,6 +2353,27 @@ select * from t2,t3 where t2.s = t3.s;
|
||||
s s
|
||||
two two
|
||||
drop table t1, t2, t3;
|
||||
create table t1 (a integer, b integer, index(a), index(b));
|
||||
create table t2 (c integer, d integer, index(c), index(d));
|
||||
insert into t1 values (1,2), (2,2), (3,2), (4,2);
|
||||
insert into t2 values (1,3), (2,3), (3,4), (4,4);
|
||||
explain select * from t1 left join t2 on a=c where d in (4);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t2 ref c,d d 5 const 2 Using where
|
||||
1 SIMPLE t1 ALL a NULL NULL NULL 3 Using where
|
||||
select * from t1 left join t2 on a=c where d in (4);
|
||||
a b c d
|
||||
3 2 3 4
|
||||
4 2 4 4
|
||||
explain select * from t1 left join t2 on a=c where d = 4;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t2 ref c,d d 5 const 2 Using where
|
||||
1 SIMPLE t1 ALL a NULL NULL NULL 3 Using where
|
||||
select * from t1 left join t2 on a=c where d = 4;
|
||||
a b c d
|
||||
3 2 3 4
|
||||
4 2 4 4
|
||||
drop table t1, t2;
|
||||
CREATE TABLE t1 (
|
||||
i int(11) NOT NULL default '0',
|
||||
c char(10) NOT NULL default '',
|
||||
@ -2365,7 +2386,4 @@ INSERT INTO t1 VALUES (3,'c');
|
||||
EXPLAIN SELECT i FROM t1 WHERE i=1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1 Using index
|
||||
EXPLAIN SELECT i FROM t1 WHERE i=1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1 Using index
|
||||
DROP TABLE t1;
|
||||
|
@ -1990,6 +1990,21 @@ ac
|
||||
700
|
||||
NULL
|
||||
drop tables t1,t2;
|
||||
create table t1 (a int not null, b int not null, c int, primary key (a,b));
|
||||
insert into t1 values (1,1,1), (2,2,2), (3,3,3);
|
||||
set @b:= 0;
|
||||
explain select sum(a) from t1 where b > @b;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 index NULL PRIMARY 8 NULL 3 Using where; Using index
|
||||
set @a:= (select sum(a) from t1 where b > @b);
|
||||
explain select a from t1 where c=2;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 3 Using where
|
||||
do @a:= (select sum(a) from t1 where b > @b);
|
||||
explain select a from t1 where c=2;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 3 Using where
|
||||
drop table t1;
|
||||
set @got_val= (SELECT 1 FROM (SELECT 'A' as my_col) as T1 ) ;
|
||||
create table t1 (a int, b int);
|
||||
create table t2 (a int, b int);
|
||||
|
@ -682,8 +682,8 @@ id txt
|
||||
3 NULL
|
||||
1 Chevy
|
||||
drop table t1;
|
||||
CREATE TABLE t1 ( i int(11) NOT NULL default '0', c text NOT NULL, PRIMARY KEY (i), KEY (c(1),c(1)));
|
||||
INSERT t1 VALUES (1,''),(2,''),(3,'asdfh'),(4,'');
|
||||
CREATE TABLE t1 ( i int(11) NOT NULL default '0', c text NOT NULL, d varchar(1) NOT NULL DEFAULT ' ', PRIMARY KEY (i), KEY (c(1),d));
|
||||
INSERT t1 (i, c) VALUES (1,''),(2,''),(3,'asdfh'),(4,'');
|
||||
select max(i) from t1 where c = '';
|
||||
max(i)
|
||||
4
|
||||
|
@ -97,13 +97,15 @@ select * from t1 where a is null or b is null;
|
||||
a b
|
||||
drop table t1;
|
||||
create table t1 (t datetime);
|
||||
insert into t1 values (20030102030460),(20030102036301),(20030102240401),(20030132030401),(20031302030460);
|
||||
insert into t1 values (20030102030460),(20030102036301),(20030102240401),
|
||||
(20030132030401),(20031302030401),(100001202030401);
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 't' at row 1
|
||||
Warning 1265 Data truncated for column 't' at row 2
|
||||
Warning 1265 Data truncated for column 't' at row 3
|
||||
Warning 1265 Data truncated for column 't' at row 4
|
||||
Warning 1265 Data truncated for column 't' at row 5
|
||||
Warning 1265 Data truncated for column 't' at row 6
|
||||
select * from t1;
|
||||
t
|
||||
0000-00-00 00:00:00
|
||||
@ -111,14 +113,18 @@ t
|
||||
0000-00-00 00:00:00
|
||||
0000-00-00 00:00:00
|
||||
0000-00-00 00:00:00
|
||||
0000-00-00 00:00:00
|
||||
delete from t1;
|
||||
insert into t1 values ("20030102030460"),("20030102036301"),("20030102240401"),("20030132030401"),("20031302030460");
|
||||
insert into t1 values
|
||||
("2003-01-02 03:04:60"),("2003-01-02 03:63:01"),("2003-01-02 24:04:01"),
|
||||
("2003-01-32 03:04:01"),("2003-13-02 03:04:01"), ("10000-12-02 03:04:00");
|
||||
Warnings:
|
||||
Warning 1264 Data truncated; out of range for column 't' at row 1
|
||||
Warning 1264 Data truncated; out of range for column 't' at row 2
|
||||
Warning 1264 Data truncated; out of range for column 't' at row 3
|
||||
Warning 1264 Data truncated; out of range for column 't' at row 4
|
||||
Warning 1264 Data truncated; out of range for column 't' at row 5
|
||||
Warning 1264 Data truncated; out of range for column 't' at row 6
|
||||
select * from t1;
|
||||
t
|
||||
0000-00-00 00:00:00
|
||||
@ -126,6 +132,7 @@ t
|
||||
0000-00-00 00:00:00
|
||||
0000-00-00 00:00:00
|
||||
0000-00-00 00:00:00
|
||||
0000-00-00 00:00:00
|
||||
delete from t1;
|
||||
insert into t1 values ("0000-00-00 00:00:00 some trailer"),("2003-01-01 00:00:00 some trailer");
|
||||
Warnings:
|
||||
|
@ -1110,4 +1110,14 @@ t1 CREATE TABLE `t1` (
|
||||
`a` char(1) character set latin1 collate latin1_german1_ci default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
drop table t1;
|
||||
create table t1 as
|
||||
(select a from t2) union
|
||||
(select b from t2) union
|
||||
(select 'c' collate latin1_german1_ci from t2);
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` char(1) character set latin1 collate latin1_german1_ci default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
drop table t1;
|
||||
drop table t2;
|
||||
|
@ -169,18 +169,12 @@ SET @`a b`='hello';
|
||||
INSERT INTO t1 VALUES(@`a b`);
|
||||
set @var1= "';aaa";
|
||||
insert into t1 values (@var1);
|
||||
create table t2 (c char(30)) charset=ucs2;
|
||||
set @v=convert('abc' using ucs2);
|
||||
insert into t2 values (@v);
|
||||
show binlog events from 79;
|
||||
Log_name Pos Event_type Server_id Orig_log_pos Info
|
||||
master-bin.000001 79 User var 1 79 @`a b`=_latin1 0x68656C6C6F COLLATE latin1_swedish_ci
|
||||
master-bin.000001 120 Query 1 120 use `test`; INSERT INTO t1 VALUES(@`a b`)
|
||||
master-bin.000001 184 User var 1 184 @`var1`=_latin1 0x273B616161 COLLATE latin1_swedish_ci
|
||||
master-bin.000001 226 Query 1 226 use `test`; insert into t1 values (@var1)
|
||||
master-bin.000001 290 Query 1 290 use `test`; create table t2 (c char(30)) charset=ucs2
|
||||
master-bin.000001 366 User var 1 366 @`v`=_ucs2 0x006100620063 COLLATE ucs2_general_ci
|
||||
master-bin.000001 406 Query 1 406 use `test`; insert into t2 values (@v)
|
||||
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
|
||||
SET @`a b`:=_latin1 0x68656C6C6F COLLATE latin1_swedish_ci;
|
||||
use test;
|
||||
@ -189,12 +183,7 @@ INSERT INTO t1 VALUES(@`a b`);
|
||||
SET @`var1`:=_latin1 0x273B616161 COLLATE latin1_swedish_ci;
|
||||
SET TIMESTAMP=10000;
|
||||
insert into t1 values (@var1);
|
||||
SET TIMESTAMP=10000;
|
||||
create table t2 (c char(30)) charset=ucs2;
|
||||
SET @`v`:=_ucs2 0x006100620063 COLLATE ucs2_general_ci;
|
||||
SET TIMESTAMP=10000;
|
||||
insert into t2 values (@v);
|
||||
drop table t1, t2;
|
||||
drop table t1;
|
||||
set @var= NULL ;
|
||||
select FIELD( @var,'1it','Hit') as my_column;
|
||||
my_column
|
||||
|
@ -7,12 +7,6 @@
|
||||
drop table if exists t1;
|
||||
--enable_warnings
|
||||
|
||||
SET NAMES big5;
|
||||
|
||||
#
|
||||
# Bug 1883: LIKE did not work in some cases with a key.
|
||||
#
|
||||
CREATE TABLE t1 (c CHAR(10) CHARACTER SET big5, KEY(c));
|
||||
INSERT INTO t1 VALUES ('aaa'),('aaaa'),('aaaaa');
|
||||
SELECT * FROM t1 WHERE c LIKE 'aaa%';
|
||||
DROP TABLE t1;
|
||||
SET @test_character_set= 'big5';
|
||||
SET @test_collation= 'big5_chinese_ci';
|
||||
-- source include/ctype_common.inc
|
||||
|
@ -53,3 +53,10 @@ SELECT
|
||||
hex(@l:=convert(@u using latin1)),
|
||||
a=@l FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug #6737: REGEXP gives wrong result with case sensitive collation
|
||||
#
|
||||
select 'a' regexp 'A' collate latin1_general_ci;
|
||||
select 'a' regexp 'A' collate latin1_general_cs;
|
||||
select 'a' regexp 'A' collate latin1_bin;
|
||||
|
@ -24,6 +24,11 @@ select 'a ' = 'a\t', 'a ' < 'a\t', 'a ' > 'a\t';
|
||||
|
||||
select 'a a' > 'a', 'a \t' < 'a';
|
||||
|
||||
#
|
||||
# Bug #6787 LIKE not working properly with _ and utf8 data
|
||||
#
|
||||
select 'c' like '\_' as want0;
|
||||
|
||||
#
|
||||
# Bug #5679 utf8_unicode_ci LIKE--trailing % doesn't equal zero characters
|
||||
#
|
||||
@ -435,3 +440,7 @@ INSERT INTO t1 VALUES (CONVERT(_ucs2 0x06280648062F0646062F USING utf8));
|
||||
INSERT INTO t1 VALUES (CONVERT(_ucs2 0x06450647064506270646 USING utf8));
|
||||
SELECT HEX(CONVERT(col1 USING ucs2)) FROM t1 ORDER BY col1 COLLATE utf8_persian_ci, col1 COLLATE utf8_bin;
|
||||
DROP TABLE t1;
|
||||
|
||||
SET @test_character_set= 'utf8';
|
||||
SET @test_collation= 'utf8_swedish_ci';
|
||||
-- source include/ctype_common.inc
|
||||
|
@ -323,3 +323,19 @@ set @str1 = 'select ?';
|
||||
set @str2 = convert(@str1 using ucs2);
|
||||
prepare stmt1 from @str2;
|
||||
execute stmt1 using @ivar;
|
||||
|
||||
#
|
||||
# Check correct binlogging of UCS2 user variables (BUG#3875)
|
||||
#
|
||||
SET TIMESTAMP=10000;
|
||||
create table t2 (c char(30)) charset=ucs2;
|
||||
set @v=convert('abc' using ucs2);
|
||||
reset master;
|
||||
insert into t2 values (@v);
|
||||
show binlog events from 79;
|
||||
# more important than SHOW BINLOG EVENTS, mysqlbinlog (where we
|
||||
# absolutely need variables names to be quoted and strings to be
|
||||
# escaped).
|
||||
--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR
|
||||
--exec $MYSQL_BINLOG --short-form $MYSQL_TEST_DIR/var/log/master-bin.000001
|
||||
drop table t2;
|
||||
|
@ -660,3 +660,9 @@ create table t2 select concat(a,_utf8'') as a, concat(b,_utf8'')as b from t1;
|
||||
show create table t2;
|
||||
drop table t2;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug #6787 LIKE not working properly with _ and utf8 data
|
||||
#
|
||||
select 'c' like '\_' as want0;
|
||||
|
||||
|
@ -29,12 +29,34 @@ drop table t1;
|
||||
# (This assumes a block size of 1024)
|
||||
#
|
||||
|
||||
create table t1 (a bigint not null, primary key (a,a,a,a,a,a,a,a,a,a));
|
||||
insert into t1 values (2),(4),(6),(8),(10),(12),(14),(16),(18),(20),(22),(24),(26),(23);
|
||||
create table t1 (
|
||||
a bigint not null,
|
||||
b bigint not null default 0,
|
||||
c bigint not null default 0,
|
||||
d bigint not null default 0,
|
||||
e bigint not null default 0,
|
||||
f bigint not null default 0,
|
||||
g bigint not null default 0,
|
||||
h bigint not null default 0,
|
||||
i bigint not null default 0,
|
||||
j bigint not null default 0,
|
||||
primary key (a,b,c,d,e,f,g,h,i,j));
|
||||
insert into t1 (a) values (2),(4),(6),(8),(10),(12),(14),(16),(18),(20),(22),(24),(26),(23);
|
||||
delete from t1 where a=26;
|
||||
drop table t1;
|
||||
create table t1 (a bigint not null, primary key (a,a,a,a,a,a,a,a,a,a));
|
||||
insert into t1 values (2),(4),(6),(8),(10),(12),(14),(16),(18),(20),(22),(24),(26),(23),(27);
|
||||
create table t1 (
|
||||
a bigint not null,
|
||||
b bigint not null default 0,
|
||||
c bigint not null default 0,
|
||||
d bigint not null default 0,
|
||||
e bigint not null default 0,
|
||||
f bigint not null default 0,
|
||||
g bigint not null default 0,
|
||||
h bigint not null default 0,
|
||||
i bigint not null default 0,
|
||||
j bigint not null default 0,
|
||||
primary key (a,b,c,d,e,f,g,h,i,j));
|
||||
insert into t1 (a) values (2),(4),(6),(8),(10),(12),(14),(16),(18),(20),(22),(24),(26),(23),(27);
|
||||
delete from t1 where a=27;
|
||||
drop table t1;
|
||||
|
||||
|
@ -48,5 +48,19 @@ reap;
|
||||
connection con3;
|
||||
reap;
|
||||
unlock tables;
|
||||
|
||||
# BUG#6732 FLUSH TABLES WITH READ LOCK + COMMIT hangs later FLUSH TABLES
|
||||
# WITH READ LOCK
|
||||
|
||||
connection con2;
|
||||
commit; # unlock InnoDB row locks to allow insertions
|
||||
connection con1;
|
||||
begin;
|
||||
insert into t1 values(10);
|
||||
flush tables with read lock;
|
||||
commit;
|
||||
unlock tables;
|
||||
connection con2;
|
||||
flush tables with read lock; # bug caused hang here
|
||||
unlock tables;
|
||||
drop table t1;
|
||||
|
@ -98,6 +98,8 @@ select * from t1 where match a against ("+aaa* +bbb*" in boolean mode);
|
||||
select * from t1 where match a against ("+aaa* +bbb1*" in boolean mode);
|
||||
select * from t1 where match a against ("+aaa* +ccc*" in boolean mode);
|
||||
select * from t1 where match a against ("+aaa10 +(bbb*)" in boolean mode);
|
||||
select * from t1 where match a against ("+(+aaa* +bbb1*)" in boolean mode);
|
||||
select * from t1 where match a against ("(+aaa* +bbb1*)" in boolean mode);
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
@ -295,3 +297,27 @@ insert into t1 (s) values ('p
|
||||
select * from t1 where match(s) against('para' in boolean mode);
|
||||
select * from t1 where match(s) against('par*' in boolean mode);
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# icc -ip bug (ip = interprocedural optimization)
|
||||
# bug#5528
|
||||
#
|
||||
CREATE TABLE t1 (h text, FULLTEXT (h));
|
||||
INSERT INTO t1 VALUES ('Jesses Hasse Ling and his syncopators of Swing');
|
||||
REPAIR TABLE t1;
|
||||
select count(*) from t1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# bug#6784
|
||||
# mi_flush_bulk_insert (on dup key error in mi_write)
|
||||
# was mangling info->dupp_key_pos
|
||||
#
|
||||
|
||||
create table t1 (a int primary key, b text, fulltext(b));
|
||||
create table t2 (a int, b text);
|
||||
insert t1 values (1, "aaaa"), (2, "bbbb");
|
||||
insert t2 values (10, "aaaa"), (2, "cccc");
|
||||
replace t1 select * from t2;
|
||||
drop table t1, t2;
|
||||
|
||||
|
@ -38,7 +38,10 @@ drop table t1;
|
||||
|
||||
#
|
||||
# Bug #5497: a problem with large strings
|
||||
# note that when LOW_MEMORY is set the "test" below is meaningless
|
||||
#
|
||||
|
||||
set @@max_allowed_packet=1048576*100;
|
||||
select compress(repeat('aaaaaaaaaa', 10000000)) is null;
|
||||
--replace_result "''" XXX "'1'" XXX
|
||||
eval select compress(repeat('aaaaaaaaaa', IF('$LOW_MEMORY', 10, 10000000))) is null;
|
||||
|
||||
|
@ -383,6 +383,17 @@ insert into t1 values ('a'),('b'),('c');
|
||||
select coercibility(max(a)) from t1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug #6658 MAX(column) returns incorrect coercibility
|
||||
#
|
||||
create table t1 (a char character set latin2);
|
||||
insert into t1 values ('a'),('b');
|
||||
select charset(max(a)), coercibility(max(a)),
|
||||
charset(min(a)), coercibility(min(a)) from t1;
|
||||
create table t2 select max(a),min(a) from t1;
|
||||
show create table t2;
|
||||
drop table t2,t1;
|
||||
|
||||
#
|
||||
# aggregate functions on static tables
|
||||
#
|
||||
|
@ -229,6 +229,13 @@ select @a:=FROM_UNIXTIME(1);
|
||||
select unix_timestamp(@a);
|
||||
select unix_timestamp('1969-12-01 19:00:01');
|
||||
|
||||
#
|
||||
# Test for bug #6439 "unix_timestamp() function returns wrong datetime
|
||||
# values for too big argument". It should return error instead.
|
||||
#
|
||||
select from_unixtime(0);
|
||||
select from_unixtime(2145916800);
|
||||
|
||||
#
|
||||
# Test types from + INTERVAL
|
||||
#
|
||||
|
@ -174,3 +174,14 @@ CREATE TABLE t1 (a INT NOT NULL, B INT, KEY(B)) ENGINE=HEAP;
|
||||
INSERT INTO t1 VALUES(1,1), (1,NULL);
|
||||
SELECT * FROM t1 WHERE B is not null;
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug #6748
|
||||
# heap_rfirst() doesn't work (and never did!)
|
||||
#
|
||||
CREATE TABLE t1 (pseudo char(35) PRIMARY KEY, date int(10) unsigned NOT NULL) ENGINE=HEAP;
|
||||
INSERT INTO t1 VALUES ('massecot',1101106491),('altec',1101106492),('stitch+',1101106304),('Seb Corgan',1101106305),('beerfilou',1101106263),('flaker',1101106529),('joce8',5),('M4vrick',1101106418),('gabay008',1101106525),('Vamp irX',1101106291),('ZoomZip',1101106546),('rip666',1101106502),('CBP ',1101106397),('guezpard',1101106496);
|
||||
DELETE FROM t1 WHERE date<1101106546;
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
@ -1158,3 +1158,25 @@ show status like "binlog_cache_use";
|
||||
show status like "binlog_cache_disk_use";
|
||||
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug #6126: Duplicate columns in keys gives misleading error message
|
||||
#
|
||||
--error 1060
|
||||
create table t1 (c char(10), index (c,c)) engine=innodb;
|
||||
--error 1060
|
||||
create table t1 (c1 char(10), c2 char(10), index (c1,c2,c1)) engine=innodb;
|
||||
--error 1060
|
||||
create table t1 (c1 char(10), c2 char(10), index (c1,c1,c2)) engine=innodb;
|
||||
--error 1060
|
||||
create table t1 (c1 char(10), c2 char(10), index (c2,c1,c1)) engine=innodb;
|
||||
create table t1 (c1 char(10), c2 char(10)) engine=innodb;
|
||||
--error 1060
|
||||
alter table t1 add key (c1,c1);
|
||||
--error 1060
|
||||
alter table t1 add key (c2,c1,c1);
|
||||
--error 1060
|
||||
alter table t1 add key (c1,c2,c1);
|
||||
--error 1060
|
||||
alter table t1 add key (c1,c1,c2);
|
||||
drop table t1;
|
||||
|
@ -297,3 +297,26 @@ drop table t1;
|
||||
|
||||
--error 1105
|
||||
create table t1 (c char(10), index (c(0)));
|
||||
|
||||
#
|
||||
# Bug #6126: Duplicate columns in keys should fail
|
||||
# Bug #6252: (dup)
|
||||
#
|
||||
--error 1060
|
||||
create table t1 (c char(10), index (c,c));
|
||||
--error 1060
|
||||
create table t1 (c1 char(10), c2 char(10), index (c1,c2,c1));
|
||||
--error 1060
|
||||
create table t1 (c1 char(10), c2 char(10), index (c1,c1,c2));
|
||||
--error 1060
|
||||
create table t1 (c1 char(10), c2 char(10), index (c2,c1,c1));
|
||||
create table t1 (c1 char(10), c2 char(10));
|
||||
--error 1060
|
||||
alter table t1 add key (c1,c1);
|
||||
--error 1060
|
||||
alter table t1 add key (c2,c1,c1);
|
||||
--error 1060
|
||||
alter table t1 add key (c1,c2,c1);
|
||||
--error 1060
|
||||
alter table t1 add key (c1,c1,c2);
|
||||
drop table t1;
|
||||
|
@ -498,11 +498,12 @@ alter table t1 disable keys;
|
||||
show keys from t1;
|
||||
create table t2 (a int);
|
||||
let $i=1000;
|
||||
set @@rand_seed1=31415926,@@rand_seed2=2718281828;
|
||||
--disable_query_log
|
||||
while ($i)
|
||||
{
|
||||
dec $i;
|
||||
eval insert t2 values (rand()*100000);
|
||||
insert t2 values (rand()*100000);
|
||||
}
|
||||
--enable_query_log
|
||||
insert t1 select * from t2;
|
||||
|
@ -127,3 +127,13 @@ insert into t1 values (1),(2),(3);
|
||||
--exec rm $MYSQL_TEST_DIR/var/tmp/t1.sql
|
||||
--exec rm $MYSQL_TEST_DIR/var/tmp/t1.txt
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug #6101: create database problem
|
||||
#
|
||||
|
||||
--exec $MYSQL_DUMP --skip-comments --databases test
|
||||
|
||||
create database mysqldump_test_db character set latin2 collate latin2_bin;
|
||||
--exec $MYSQL_DUMP --skip-comments --databases mysqldump_test_db;
|
||||
drop database mysqldump_test_db;
|
||||
|
@ -199,7 +199,7 @@ insert into t4 values (1, "Automatic");
|
||||
select * from t4;
|
||||
|
||||
# Remove the table from NDB
|
||||
system exec $NDB_TOOLS_DIR/ndb_drop_table -d test t4 > /dev/null ;
|
||||
system exec $NDB_TOOLS_DIR/ndb_drop_table --no-defaults -d test t4 > /dev/null ;
|
||||
|
||||
#
|
||||
# Test that correct error is returned
|
||||
@ -230,7 +230,7 @@ select * from t4;
|
||||
flush tables;
|
||||
|
||||
# Remove the table from NDB
|
||||
system exec $NDB_TOOLS_DIR/ndb_drop_table -d test t4 > /dev/null ;
|
||||
system exec $NDB_TOOLS_DIR/ndb_drop_table --no-defaults -d test t4 > /dev/null ;
|
||||
|
||||
SHOW TABLES;
|
||||
|
||||
@ -264,8 +264,8 @@ insert into t8 values (8, "myisam table 8");
|
||||
insert into t9 values (9);
|
||||
|
||||
# Remove t3, t5 from NDB
|
||||
system exec $NDB_TOOLS_DIR/ndb_drop_table -d test t3 > /dev/null ;
|
||||
system exec $NDB_TOOLS_DIR/ndb_drop_table -d test t5 > /dev/null ;
|
||||
system exec $NDB_TOOLS_DIR/ndb_drop_table --no-defaults -d test t3 > /dev/null ;
|
||||
system exec $NDB_TOOLS_DIR/ndb_drop_table --no-defaults -d test t5 > /dev/null ;
|
||||
# Remove t6, t7 from disk
|
||||
system rm var/master-data/test/t6.frm > /dev/null ;
|
||||
system rm var/master-data/test/t7.frm > /dev/null ;
|
||||
@ -306,8 +306,8 @@ insert into t8 values (8, "myisam table 8");
|
||||
insert into t9 values (9);
|
||||
|
||||
# Remove t3, t5 from NDB
|
||||
system exec $NDB_TOOLS_DIR/ndb_drop_table -d test t3 > /dev/null ;
|
||||
system exec $NDB_TOOLS_DIR/ndb_drop_table -d test t5 > /dev/null ;
|
||||
system exec $NDB_TOOLS_DIR/ndb_drop_table --no-defaults -d test t3 > /dev/null ;
|
||||
system exec $NDB_TOOLS_DIR/ndb_drop_table --no-defaults -d test t5 > /dev/null ;
|
||||
# Remove t6, t7 from disk
|
||||
system rm var/master-data/test/t6.frm > /dev/null ;
|
||||
system rm var/master-data/test/t7.frm > /dev/null ;
|
||||
@ -479,4 +479,4 @@ create table t10 (
|
||||
|
||||
insert into t10 values (1, 'kalle');
|
||||
|
||||
--exec $NDB_TOOLS_DIR/ndb_drop_table -d test `$NDB_TOOLS_DIR/ndb_show_tables | grep BLOB` > /dev/null 2>&1 || true
|
||||
--exec $NDB_TOOLS_DIR/ndb_drop_table --no-defaults -d test `$NDB_TOOLS_DIR/ndb_show_tables --no-defaults | grep BLOB` > /dev/null 2>&1 || true
|
||||
|
@ -86,9 +86,9 @@ create table t1 (
|
||||
# ok
|
||||
insert into t1 values(1, 'aAa');
|
||||
# fail
|
||||
--error 1169
|
||||
--error 1062
|
||||
insert into t1 values(2, 'aaa');
|
||||
--error 1169
|
||||
--error 1062
|
||||
insert into t1 values(3, 'AAA');
|
||||
# 1
|
||||
select * from t1 order by p;
|
||||
|
374
mysql-test/t/ndb_grant.later
Normal file
374
mysql-test/t/ndb_grant.later
Normal file
@ -0,0 +1,374 @@
|
||||
-- source include/have_ndb.inc
|
||||
# Test of GRANT commands
|
||||
|
||||
# Cleanup
|
||||
--disable_warnings
|
||||
drop table if exists t1;
|
||||
--enable_warnings
|
||||
|
||||
SET NAMES binary;
|
||||
|
||||
#
|
||||
# Alter mysql system tables to ndb
|
||||
# make sure you alter all back in the end
|
||||
#
|
||||
use mysql;
|
||||
alter table columns_priv engine=ndb;
|
||||
alter table db engine=ndb;
|
||||
alter table func engine=ndb;
|
||||
alter table help_category engine=ndb;
|
||||
alter table help_keyword engine=ndb;
|
||||
alter table help_relation engine=ndb;
|
||||
alter table help_topic engine=ndb;
|
||||
alter table host engine=ndb;
|
||||
alter table tables_priv engine=ndb;
|
||||
alter table time_zone engine=ndb;
|
||||
alter table time_zone_leap_second engine=ndb;
|
||||
alter table time_zone_name engine=ndb;
|
||||
alter table time_zone_transition engine=ndb;
|
||||
alter table time_zone_transition_type engine=ndb;
|
||||
alter table user engine=ndb;
|
||||
use test;
|
||||
|
||||
#
|
||||
# Test that SSL options works properly
|
||||
#
|
||||
delete from mysql.user where user='mysqltest_1';
|
||||
delete from mysql.db where user='mysqltest_1';
|
||||
flush privileges;
|
||||
begin;
|
||||
grant select on mysqltest.* to mysqltest_1@localhost require cipher "EDH-RSA-DES-CBC3-SHA";
|
||||
commit;
|
||||
show grants for mysqltest_1@localhost;
|
||||
begin;
|
||||
grant delete on mysqltest.* to mysqltest_1@localhost;
|
||||
commit;
|
||||
select * from mysql.user where user="mysqltest_1";
|
||||
show grants for mysqltest_1@localhost;
|
||||
begin;
|
||||
revoke delete on mysqltest.* from mysqltest_1@localhost;
|
||||
commit;
|
||||
show grants for mysqltest_1@localhost;
|
||||
begin;
|
||||
grant select on mysqltest.* to mysqltest_1@localhost require NONE;
|
||||
commit;
|
||||
show grants for mysqltest_1@localhost;
|
||||
begin;
|
||||
grant USAGE on mysqltest.* to mysqltest_1@localhost require cipher "EDH-RSA-DES-CBC3-SHA" AND SUBJECT "testsubject" ISSUER "MySQL AB";
|
||||
commit;
|
||||
show grants for mysqltest_1@localhost;
|
||||
begin;
|
||||
revoke all privileges on mysqltest.* from mysqltest_1@localhost;
|
||||
commit;
|
||||
show grants for mysqltest_1@localhost;
|
||||
delete from mysql.user where user='mysqltest_1';
|
||||
flush privileges;
|
||||
|
||||
#
|
||||
# Test that the new db privileges are stored/retrieved correctly
|
||||
#
|
||||
|
||||
begin;
|
||||
grant CREATE TEMPORARY TABLES, LOCK TABLES on mysqltest.* to mysqltest_1@localhost;
|
||||
commit;
|
||||
show grants for mysqltest_1@localhost;
|
||||
flush privileges;
|
||||
show grants for mysqltest_1@localhost;
|
||||
begin;
|
||||
revoke CREATE TEMPORARY TABLES on mysqltest.* from mysqltest_1@localhost;
|
||||
commit;
|
||||
show grants for mysqltest_1@localhost;
|
||||
begin;
|
||||
grant ALL PRIVILEGES on mysqltest.* to mysqltest_1@localhost with GRANT OPTION;
|
||||
commit;
|
||||
flush privileges;
|
||||
show grants for mysqltest_1@localhost;
|
||||
begin;
|
||||
revoke LOCK TABLES, ALTER on mysqltest.* from mysqltest_1@localhost;
|
||||
commit;
|
||||
show grants for mysqltest_1@localhost;
|
||||
begin;
|
||||
revoke all privileges on mysqltest.* from mysqltest_1@localhost;
|
||||
commit;
|
||||
delete from mysql.user where user='mysqltest_1';
|
||||
flush privileges;
|
||||
begin;
|
||||
grant usage on test.* to mysqltest_1@localhost with grant option;
|
||||
commit;
|
||||
show grants for mysqltest_1@localhost;
|
||||
delete from mysql.user where user='mysqltest_1';
|
||||
delete from mysql.db where user='mysqltest_1';
|
||||
delete from mysql.tables_priv where user='mysqltest_1';
|
||||
delete from mysql.columns_priv where user='mysqltest_1';
|
||||
flush privileges;
|
||||
--error 1141
|
||||
show grants for mysqltest_1@localhost;
|
||||
|
||||
#
|
||||
# Test what happens when you have same table and colum level grants
|
||||
#
|
||||
|
||||
create table t1 (a int);
|
||||
begin;
|
||||
GRANT select,update,insert on t1 to mysqltest_1@localhost;
|
||||
GRANT select (a), update (a),insert(a), references(a) on t1 to mysqltest_1@localhost;
|
||||
commit;
|
||||
show grants for mysqltest_1@localhost;
|
||||
select table_priv,column_priv from mysql.tables_priv where user="mysqltest_1";
|
||||
begin;
|
||||
REVOKE select (a), update on t1 from mysqltest_1@localhost;
|
||||
commit;
|
||||
show grants for mysqltest_1@localhost;
|
||||
begin;
|
||||
REVOKE select,update,insert,insert (a) on t1 from mysqltest_1@localhost;
|
||||
commit;
|
||||
show grants for mysqltest_1@localhost;
|
||||
begin;
|
||||
GRANT select,references on t1 to mysqltest_1@localhost;
|
||||
commit;
|
||||
select table_priv,column_priv from mysql.tables_priv where user="mysqltest_1";
|
||||
begin;
|
||||
grant all on test.* to mysqltest_3@localhost with grant option;
|
||||
revoke all on test.* from mysqltest_3@localhost;
|
||||
commit;
|
||||
show grants for mysqltest_3@localhost;
|
||||
begin;
|
||||
revoke grant option on test.* from mysqltest_3@localhost;
|
||||
commit;
|
||||
show grants for mysqltest_3@localhost;
|
||||
begin;
|
||||
grant all on test.t1 to mysqltest_2@localhost with grant option;
|
||||
revoke all on test.t1 from mysqltest_2@localhost;
|
||||
commit;
|
||||
show grants for mysqltest_2@localhost;
|
||||
begin;
|
||||
revoke grant option on test.t1 from mysqltest_2@localhost;
|
||||
commit;
|
||||
show grants for mysqltest_2@localhost;
|
||||
delete from mysql.user where user='mysqltest_1' or user="mysqltest_2" or user="mysqltest_3";
|
||||
delete from mysql.db where user='mysqltest_1' or user="mysqltest_2" or user="mysqltest_3";
|
||||
delete from mysql.tables_priv where user='mysqltest_1' or user="mysqltest_2" or user="mysqltest_3";
|
||||
delete from mysql.columns_priv where user='mysqltest_1' or user="mysqltest_2" or user="mysqltest_3";
|
||||
flush privileges;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Test some error conditions
|
||||
#
|
||||
begin;
|
||||
--error 1221
|
||||
GRANT FILE on mysqltest.* to mysqltest_1@localhost;
|
||||
commit;
|
||||
select 1; -- To test that the previous command didn't cause problems
|
||||
|
||||
#
|
||||
# Bug#6123: GRANT USAGE inserts useless Db row
|
||||
#
|
||||
create database mysqltest1;
|
||||
begin;
|
||||
grant usage on mysqltest1.* to test6123 identified by 'magic123';
|
||||
commit;
|
||||
select host,db,user,select_priv,insert_priv from mysql.db where db="mysqltest1";
|
||||
delete from mysql.user where user='test6123';
|
||||
drop database mysqltest1;
|
||||
|
||||
#
|
||||
# Test for 'drop user', 'revoke privileges, grant'
|
||||
#
|
||||
|
||||
create table t1 (a int);
|
||||
begin;
|
||||
grant ALL PRIVILEGES on *.* to drop_user2@localhost with GRANT OPTION;
|
||||
commit;
|
||||
show grants for drop_user2@localhost;
|
||||
begin;
|
||||
revoke all privileges, grant option from drop_user2@localhost;
|
||||
commit;
|
||||
drop user drop_user2@localhost;
|
||||
|
||||
begin;
|
||||
grant ALL PRIVILEGES on *.* to drop_user@localhost with GRANT OPTION;
|
||||
grant ALL PRIVILEGES on test.* to drop_user@localhost with GRANT OPTION;
|
||||
grant select(a) on test.t1 to drop_user@localhost;
|
||||
commit;
|
||||
show grants for drop_user@localhost;
|
||||
|
||||
#
|
||||
# Bug3086
|
||||
#
|
||||
set sql_mode=ansi_quotes;
|
||||
show grants for drop_user@localhost;
|
||||
set sql_mode=default;
|
||||
|
||||
set sql_quote_show_create=0;
|
||||
show grants for drop_user@localhost;
|
||||
set sql_mode="ansi_quotes";
|
||||
show grants for drop_user@localhost;
|
||||
set sql_quote_show_create=1;
|
||||
show grants for drop_user@localhost;
|
||||
set sql_mode="";
|
||||
show grants for drop_user@localhost;
|
||||
|
||||
revoke all privileges, grant option from drop_user@localhost;
|
||||
show grants for drop_user@localhost;
|
||||
drop user drop_user@localhost;
|
||||
begin;
|
||||
--error 1269
|
||||
revoke all privileges, grant option from drop_user@localhost;
|
||||
commit;
|
||||
|
||||
begin;
|
||||
grant select(a) on test.t1 to drop_user1@localhost;
|
||||
commit;
|
||||
flush privileges;
|
||||
begin;
|
||||
grant select on test.t1 to drop_user2@localhost;
|
||||
grant select on test.* to drop_user3@localhost;
|
||||
grant select on *.* to drop_user4@localhost;
|
||||
commit;
|
||||
--error 1268
|
||||
drop user drop_user1@localhost, drop_user2@localhost, drop_user3@localhost,
|
||||
drop_user4@localhost;
|
||||
begin;
|
||||
revoke all privileges, grant option from drop_user1@localhost, drop_user2@localhost,
|
||||
drop_user3@localhost, drop_user4@localhost;
|
||||
commit;
|
||||
drop user drop_user1@localhost, drop_user2@localhost, drop_user3@localhost,
|
||||
drop_user4@localhost;
|
||||
drop table t1;
|
||||
begin;
|
||||
grant usage on *.* to mysqltest_1@localhost identified by "password";
|
||||
grant select, update, insert on test.* to mysqltest@localhost;
|
||||
commit;
|
||||
show grants for mysqltest_1@localhost;
|
||||
drop user mysqltest_1@localhost;
|
||||
|
||||
#
|
||||
# Bug #3403 Wrong encodin in SHOW GRANTS output
|
||||
#
|
||||
SET NAMES koi8r;
|
||||
CREATE DATABASE <20><>;
|
||||
USE <20><>;
|
||||
CREATE TABLE <20><><EFBFBD> (<28><><EFBFBD> int);
|
||||
|
||||
begin;
|
||||
GRANT SELECT ON <20><>.* TO <20><><EFBFBD><EFBFBD>@localhost;
|
||||
commit;
|
||||
SHOW GRANTS FOR <20><><EFBFBD><EFBFBD>@localhost;
|
||||
begin;
|
||||
REVOKE SELECT ON <20><>.* FROM <20><><EFBFBD><EFBFBD>@localhost;
|
||||
commit;
|
||||
|
||||
begin;
|
||||
GRANT SELECT ON <20><>.<2E><><EFBFBD> TO <20><><EFBFBD><EFBFBD>@localhost;
|
||||
commit;
|
||||
SHOW GRANTS FOR <20><><EFBFBD><EFBFBD>@localhost;
|
||||
begin;
|
||||
REVOKE SELECT ON <20><>.<2E><><EFBFBD> FROM <20><><EFBFBD><EFBFBD>@localhost;
|
||||
commit;
|
||||
|
||||
begin;
|
||||
GRANT SELECT (<28><><EFBFBD>) ON <20><>.<2E><><EFBFBD> TO <20><><EFBFBD><EFBFBD>@localhost;
|
||||
commit;
|
||||
SHOW GRANTS FOR <20><><EFBFBD><EFBFBD>@localhost;
|
||||
begin;
|
||||
REVOKE SELECT (<28><><EFBFBD>) ON <20><>.<2E><><EFBFBD> FROM <20><><EFBFBD><EFBFBD>@localhost;
|
||||
commit;
|
||||
|
||||
DROP DATABASE <20><>;
|
||||
SET NAMES latin1;
|
||||
|
||||
#
|
||||
# Bug #5831: REVOKE ALL PRIVILEGES, GRANT OPTION does not revoke everything
|
||||
#
|
||||
USE test;
|
||||
CREATE TABLE t1 (a int );
|
||||
CREATE TABLE t2 LIKE t1;
|
||||
CREATE TABLE t3 LIKE t1;
|
||||
CREATE TABLE t4 LIKE t1;
|
||||
CREATE TABLE t5 LIKE t1;
|
||||
CREATE TABLE t6 LIKE t1;
|
||||
CREATE TABLE t7 LIKE t1;
|
||||
CREATE TABLE t8 LIKE t1;
|
||||
CREATE TABLE t9 LIKE t1;
|
||||
CREATE TABLE t10 LIKE t1;
|
||||
CREATE DATABASE testdb1;
|
||||
CREATE DATABASE testdb2;
|
||||
CREATE DATABASE testdb3;
|
||||
CREATE DATABASE testdb4;
|
||||
CREATE DATABASE testdb5;
|
||||
CREATE DATABASE testdb6;
|
||||
CREATE DATABASE testdb7;
|
||||
CREATE DATABASE testdb8;
|
||||
CREATE DATABASE testdb9;
|
||||
CREATE DATABASE testdb10;
|
||||
begin;
|
||||
GRANT ALL ON testdb1.* TO testuser@localhost;
|
||||
GRANT ALL ON testdb2.* TO testuser@localhost;
|
||||
GRANT ALL ON testdb3.* TO testuser@localhost;
|
||||
GRANT ALL ON testdb4.* TO testuser@localhost;
|
||||
GRANT ALL ON testdb5.* TO testuser@localhost;
|
||||
GRANT ALL ON testdb6.* TO testuser@localhost;
|
||||
GRANT ALL ON testdb7.* TO testuser@localhost;
|
||||
GRANT ALL ON testdb8.* TO testuser@localhost;
|
||||
GRANT ALL ON testdb9.* TO testuser@localhost;
|
||||
GRANT ALL ON testdb10.* TO testuser@localhost;
|
||||
GRANT SELECT ON test.t1 TO testuser@localhost;
|
||||
GRANT SELECT ON test.t2 TO testuser@localhost;
|
||||
GRANT SELECT ON test.t3 TO testuser@localhost;
|
||||
GRANT SELECT ON test.t4 TO testuser@localhost;
|
||||
GRANT SELECT ON test.t5 TO testuser@localhost;
|
||||
GRANT SELECT ON test.t6 TO testuser@localhost;
|
||||
GRANT SELECT ON test.t7 TO testuser@localhost;
|
||||
GRANT SELECT ON test.t8 TO testuser@localhost;
|
||||
GRANT SELECT ON test.t9 TO testuser@localhost;
|
||||
GRANT SELECT ON test.t10 TO testuser@localhost;
|
||||
GRANT SELECT (a) ON test.t1 TO testuser@localhost;
|
||||
GRANT SELECT (a) ON test.t2 TO testuser@localhost;
|
||||
GRANT SELECT (a) ON test.t3 TO testuser@localhost;
|
||||
GRANT SELECT (a) ON test.t4 TO testuser@localhost;
|
||||
GRANT SELECT (a) ON test.t5 TO testuser@localhost;
|
||||
GRANT SELECT (a) ON test.t6 TO testuser@localhost;
|
||||
GRANT SELECT (a) ON test.t7 TO testuser@localhost;
|
||||
GRANT SELECT (a) ON test.t8 TO testuser@localhost;
|
||||
GRANT SELECT (a) ON test.t9 TO testuser@localhost;
|
||||
GRANT SELECT (a) ON test.t10 TO testuser@localhost;
|
||||
commit;
|
||||
begin;
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM testuser@localhost;
|
||||
commit;
|
||||
SHOW GRANTS FOR testuser@localhost;
|
||||
DROP USER testuser@localhost;
|
||||
DROP TABLE t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;
|
||||
DROP DATABASE testdb1;
|
||||
DROP DATABASE testdb2;
|
||||
DROP DATABASE testdb3;
|
||||
DROP DATABASE testdb4;
|
||||
DROP DATABASE testdb5;
|
||||
DROP DATABASE testdb6;
|
||||
DROP DATABASE testdb7;
|
||||
DROP DATABASE testdb8;
|
||||
DROP DATABASE testdb9;
|
||||
DROP DATABASE testdb10;
|
||||
|
||||
#
|
||||
# Alter mysql system tables back to myisam
|
||||
#
|
||||
use mysql;
|
||||
alter table columns_priv engine=myisam;
|
||||
alter table db engine=myisam;
|
||||
alter table func engine=myisam;
|
||||
alter table help_category engine=myisam;
|
||||
alter table help_keyword engine=myisam;
|
||||
alter table help_relation engine=myisam;
|
||||
alter table help_topic engine=myisam;
|
||||
alter table host engine=myisam;
|
||||
alter table tables_priv engine=myisam;
|
||||
alter table time_zone engine=myisam;
|
||||
alter table time_zone_leap_second engine=myisam;
|
||||
alter table time_zone_name engine=myisam;
|
||||
alter table time_zone_transition engine=myisam;
|
||||
alter table time_zone_transition_type engine=myisam;
|
||||
alter table user engine=myisam;
|
||||
use test;
|
||||
flush privileges;
|
@ -21,7 +21,7 @@ select * from t1 where b = 4 order by b;
|
||||
insert into t1 values(7,8,3);
|
||||
select * from t1 where b = 4 order by a;
|
||||
|
||||
-- error 1169
|
||||
-- error 1062
|
||||
insert into t1 values(8, 2, 3);
|
||||
select * from t1 order by a;
|
||||
delete from t1 where a = 1;
|
||||
@ -30,6 +30,32 @@ select * from t1 order by a;
|
||||
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Indexing NULL values
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (
|
||||
a int unsigned NOT NULL PRIMARY KEY,
|
||||
b int unsigned,
|
||||
c int unsigned,
|
||||
UNIQUE bc(b,c)
|
||||
) engine = ndb;
|
||||
|
||||
insert into t1 values(1,1,1),(2,NULL,2),(3,NULL,NULL),(4,4,NULL);
|
||||
select * from t1 use index (bc) where b IS NULL order by a;
|
||||
|
||||
select * from t1 use index (bc)order by a;
|
||||
select * from t1 use index (bc) order by a;
|
||||
select * from t1 use index (PRIMARY) where b IS NULL order by a;
|
||||
select * from t1 use index (bc) where b IS NULL order by a;
|
||||
select * from t1 use index (bc) where b IS NULL and c IS NULL order by a;
|
||||
select * from t1 use index (bc) where b IS NULL and c = 2 order by a;
|
||||
select * from t1 use index (bc) where b < 4 order by a;
|
||||
select * from t1 use index (bc) where b IS NOT NULL order by a;
|
||||
-- error 1062
|
||||
insert into t1 values(5,1,1);
|
||||
drop table t1;
|
||||
|
||||
|
||||
#
|
||||
# Show use of UNIQUE USING HASH indexes
|
||||
@ -49,7 +75,7 @@ select * from t2 where c = 6;
|
||||
insert into t2 values(7,8,3);
|
||||
select * from t2 where b = 4 order by a;
|
||||
|
||||
-- error 1169
|
||||
-- error 1062
|
||||
insert into t2 values(8, 2, 3);
|
||||
select * from t2 order by a;
|
||||
delete from t2 where a = 1;
|
||||
@ -58,6 +84,14 @@ select * from t2 order by a;
|
||||
|
||||
drop table t2;
|
||||
|
||||
-- error 1121
|
||||
CREATE TABLE t2 (
|
||||
a int unsigned NOT NULL PRIMARY KEY,
|
||||
b int unsigned not null,
|
||||
c int unsigned,
|
||||
UNIQUE USING HASH (b, c)
|
||||
) engine=ndbcluster;
|
||||
|
||||
#
|
||||
# Show use of PRIMARY KEY USING HASH indexes
|
||||
#
|
||||
@ -92,7 +126,7 @@ insert into t1 values (-1,NULL), (0,0), (1,NULL),(2,2),(3,NULL),(4,4);
|
||||
|
||||
select * from t1 order by pk;
|
||||
|
||||
--error 1169
|
||||
--error 1062
|
||||
insert into t1 values (5,0);
|
||||
select * from t1 order by pk;
|
||||
delete from t1 where a = 0;
|
||||
@ -111,7 +145,7 @@ insert into t2 values (-1,1,17,NULL),(0,NULL,18,NULL),(1,3,19,'abc');
|
||||
|
||||
select * from t2 order by pk;
|
||||
|
||||
--error 1169
|
||||
--error 1062
|
||||
insert into t2 values(2,3,19,'abc');
|
||||
select * from t2 order by pk;
|
||||
delete from t2 where c IS NOT NULL;
|
||||
@ -231,4 +265,24 @@ select * from t4 where rid = 2 order by cid;
|
||||
|
||||
drop table t1,t2,t3,t4,t5,t6,t7;
|
||||
|
||||
# test null in indexes
|
||||
CREATE TABLE t1 (
|
||||
a int unsigned NOT NULL PRIMARY KEY,
|
||||
b int unsigned,
|
||||
c int unsigned,
|
||||
UNIQUE bc(b,c) ) engine = ndb;
|
||||
|
||||
insert into t1 values(1,1,1),(2,NULL,2),(3,NULL,NULL),(4,4,NULL);
|
||||
select * from t1 where b=1 and c=1;
|
||||
select * from t1 where b is null and c is null;
|
||||
select * from t1 where b is null and c = 2;
|
||||
select * from t1 where b = 4 and c is null;
|
||||
create table t8 as
|
||||
select * from t1 where (b = 1 and c = 1)
|
||||
or (b is null and c is null)
|
||||
or (b is null and c = 2)
|
||||
or (b = 4 and c is null);
|
||||
select * from t8 order by a;
|
||||
select * from t1 order by a;
|
||||
drop table t1, t8;
|
||||
|
||||
|
@ -564,23 +564,37 @@ select count(*) from t1;
|
||||
--error 1062
|
||||
insert into t1 select * from t1 where b < 10 order by pk1;
|
||||
|
||||
DELETE FROM t1 WHERE pk1=2;
|
||||
|
||||
begin;
|
||||
--error 1031
|
||||
INSERT IGNORE INTO t1 VALUES(1,2,3);
|
||||
commit;
|
||||
INSERT IGNORE INTO t1 VALUES(1,2,3),(2,3,4);
|
||||
select * from t1 where pk1 < 3 order by pk1;
|
||||
rollback;
|
||||
|
||||
INSERT IGNORE INTO t1 VALUES(1,2,3),(2,3,4);
|
||||
select * from t1 where pk1 < 3 order by pk1;
|
||||
|
||||
REPLACE INTO t1 values(1, 78, 3);
|
||||
select * from t1 where pk1=1;
|
||||
|
||||
--error 1031
|
||||
INSERT IGNORE INTO t1 VALUES(1,2,3);
|
||||
select * from t1 where pk1=1;
|
||||
INSERT INTO t1 VALUES(1,1,1),(3,4,5) ON DUPLICATE KEY UPDATE b=79;
|
||||
select * from t1 where pk1 < 4 order by pk1;
|
||||
|
||||
REPLACE INTO t1 values(1, 2, 3);
|
||||
select * from t1 where pk1=1;
|
||||
INSERT INTO t1 VALUES(1,1,1),(3,4,5) ON DUPLICATE KEY UPDATE b=pk1+c;
|
||||
select * from t1 where pk1 < 4 order by pk1;
|
||||
|
||||
--error 1031
|
||||
INSERT INTO t1 VALUES(1,1,1) ON DUPLICATE KEY UPDATE b=79;
|
||||
select * from t1 where pk1=1;
|
||||
DELETE FROM t1 WHERE pk1 = 2 OR pk1 = 4 OR pk1 = 6;
|
||||
INSERT INTO t1 VALUES(1,1,1),(2,2,17),(3,4,5) ON DUPLICATE KEY UPDATE pk1=b;
|
||||
select * from t1 where pk1 = b and b != c order by pk1;
|
||||
|
||||
# The following test case currently does not work
|
||||
#DELETE FROM t1;
|
||||
#CREATE UNIQUE INDEX bi ON t1(b);
|
||||
#INSERT INTO t1 VALUES
|
||||
#(1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5),
|
||||
#(6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10);
|
||||
#INSERT INTO t1 VALUES(0,1,0),(21,21,21) ON DUPLICATE KEY UPDATE pk1=b+10,c=b+10;
|
||||
#select * from t1 order by pk1;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
|
@ -9,9 +9,9 @@ create table t1(f1 int);
|
||||
insert into t1 values (5);
|
||||
|
||||
grant select on test.* to ssl_user1@localhost require SSL;
|
||||
grant select on test.* to ssl_user2@localhost require cipher "EDH-RSA-DES-CBC3-SHA";
|
||||
grant select on test.* to ssl_user3@localhost require cipher "EDH-RSA-DES-CBC3-SHA" AND SUBJECT "/C=SE/L=Uppsala/O=MySQL AB/CN=MySQL Client/Email=abstract.mysql.developer@mysql.com";
|
||||
grant select on test.* to ssl_user4@localhost require cipher "EDH-RSA-DES-CBC3-SHA" AND SUBJECT "/C=SE/L=Uppsala/O=MySQL AB/CN=MySQL Client/Email=abstract.mysql.developer@mysql.com" ISSUER "/C=SE/L=Uppsala/O=MySQL AB/CN=Abstract MySQL Developer/Email=abstract.mysql.developer@mysql.com";
|
||||
grant select on test.* to ssl_user2@localhost require cipher "DHE-RSA-AES256-SHA";
|
||||
grant select on test.* to ssl_user3@localhost require cipher "DHE-RSA-AES256-SHA" AND SUBJECT "/C=SE/L=Uppsala/O=MySQL AB/CN=MySQL Client/Email=abstract.mysql.developer@mysql.com";
|
||||
grant select on test.* to ssl_user4@localhost require cipher "DHE-RSA-AES256-SHA" AND SUBJECT "/C=SE/L=Uppsala/O=MySQL AB/CN=MySQL Client/Email=abstract.mysql.developer@mysql.com" ISSUER "/C=SE/L=Uppsala/O=MySQL AB/CN=Abstract MySQL Developer/Email=abstract.mysql.developer@mysql.com";
|
||||
flush privileges;
|
||||
connect (con1,localhost,ssl_user1,,);
|
||||
connect (con2,localhost,ssl_user2,,);
|
||||
|
@ -458,3 +458,17 @@ EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug#6297 "prepared statement, wrong handling of <parameter> IS NULL"
|
||||
# Test that placeholders work with IS NULL/IS NOT NULL clauses.
|
||||
#
|
||||
prepare stmt from "select ? is null, ? is not null, ?";
|
||||
select @no_such_var is null, @no_such_var is not null, @no_such_var;
|
||||
execute stmt using @no_such_var, @no_such_var, @no_such_var;
|
||||
set @var='abc';
|
||||
select @var is null, @var is not null, @var;
|
||||
execute stmt using @var, @var, @var;
|
||||
set @var=null;
|
||||
select @var is null, @var is not null, @var;
|
||||
execute stmt using @var, @var, @var;
|
||||
|
||||
|
@ -12,365 +12,11 @@ use test;
|
||||
|
||||
-- source include/have_ndb.inc
|
||||
let $type= 'NDB' ;
|
||||
--disable_warnings
|
||||
drop table if exists t1, t9 ;
|
||||
--enable_warnings
|
||||
eval create table t1
|
||||
(
|
||||
a int not null, b varchar(30),
|
||||
primary key(a)
|
||||
) engine = $type ;
|
||||
|
||||
--disable_warnings
|
||||
drop table if exists t9;
|
||||
--enable_warnings
|
||||
# The used table type doesn't support BLOB/TEXT columns.
|
||||
# (The server would send error 1163 .)
|
||||
# So we use char(100) instead.
|
||||
eval create table t9
|
||||
(
|
||||
c1 tinyint not null, c2 smallint, c3 mediumint, c4 int,
|
||||
c5 integer, c6 bigint, c7 float, c8 double,
|
||||
c9 double precision, c10 real, c11 decimal(7, 4), c12 numeric(8, 4),
|
||||
c13 date, c14 datetime, c15 timestamp(14), c16 time,
|
||||
c17 year, c18 bit, c19 bool, c20 char,
|
||||
c21 char(10), c22 varchar(30), c23 char(100), c24 char(100),
|
||||
c25 char(100), c26 char(100), c27 char(100), c28 char(100),
|
||||
c29 char(100), c30 char(100), c31 enum('one', 'two', 'three'),
|
||||
c32 set('monday', 'tuesday', 'wednesday'),
|
||||
primary key(c1)
|
||||
) engine = $type ;
|
||||
-- source include/ps_create.inc
|
||||
-- source include/ps_renew.inc
|
||||
|
||||
-- source include/ps_query.inc
|
||||
# The following line is deactivated, because the ndb storage engine is not able
|
||||
# to do primary key column updates .
|
||||
#-- source include/ps_modify.inc
|
||||
# let's include all statements which will work
|
||||
--disable_query_log
|
||||
select '------ delete tests ------' as test_sequence ;
|
||||
--enable_query_log
|
||||
--source include/ps_renew.inc
|
||||
|
||||
## delete without parameter
|
||||
prepare stmt1 from 'delete from t1 where a=2' ;
|
||||
execute stmt1;
|
||||
select a,b from t1 where a=2 order by b;
|
||||
# delete with row not found
|
||||
execute stmt1;
|
||||
|
||||
## delete with one parameter in the where clause
|
||||
insert into t1 values(0,NULL);
|
||||
set @arg00=NULL;
|
||||
prepare stmt1 from 'delete from t1 where b=?' ;
|
||||
execute stmt1 using @arg00;
|
||||
select a,b from t1 where b is NULL ;
|
||||
set @arg00='one';
|
||||
execute stmt1 using @arg00;
|
||||
select a,b from t1 where b=@arg00;
|
||||
|
||||
## truncate a table
|
||||
--error 1295
|
||||
prepare stmt1 from 'truncate table t1' ;
|
||||
|
||||
|
||||
--disable_query_log
|
||||
select '------ update tests ------' as test_sequence ;
|
||||
--enable_query_log
|
||||
--source include/ps_renew.inc
|
||||
|
||||
## update without parameter
|
||||
prepare stmt1 from 'update t1 set b=''a=two'' where a=2' ;
|
||||
execute stmt1;
|
||||
select a,b from t1 where a=2;
|
||||
# dummy update
|
||||
execute stmt1;
|
||||
select a,b from t1 where a=2;
|
||||
|
||||
## update with one parameter in the set clause
|
||||
set @arg00=NULL;
|
||||
prepare stmt1 from 'update t1 set b=? where a=2' ;
|
||||
execute stmt1 using @arg00;
|
||||
select a,b from t1 where a=2;
|
||||
set @arg00='two';
|
||||
execute stmt1 using @arg00;
|
||||
select a,b from t1 where a=2;
|
||||
|
||||
## update with one parameter in the where cause
|
||||
set @arg00=2;
|
||||
prepare stmt1 from 'update t1 set b=NULL where a=?' ;
|
||||
execute stmt1 using @arg00;
|
||||
select a,b from t1 where a=@arg00;
|
||||
update t1 set b='two' where a=@arg00;
|
||||
# row not found in update
|
||||
set @arg00=2000;
|
||||
execute stmt1 using @arg00;
|
||||
select a,b from t1 where a=@arg00;
|
||||
|
||||
## update on primary key column (two parameters)
|
||||
set @arg00=2;
|
||||
set @arg01=22;
|
||||
prepare stmt1 from 'update t1 set a=? where a=?' ;
|
||||
# dummy update
|
||||
execute stmt1 using @arg00, @arg00;
|
||||
select a,b from t1 where a=@arg00;
|
||||
# deactivated primary key column update
|
||||
# execute stmt1 using @arg01, @arg00;
|
||||
select a,b from t1 where a=@arg01;
|
||||
execute stmt1 using @arg00, @arg01;
|
||||
select a,b from t1 where a=@arg00;
|
||||
set @arg00=NULL;
|
||||
set @arg01=2;
|
||||
# deactivated primary key column update
|
||||
# execute stmt1 using @arg00, @arg01;
|
||||
select a,b from t1 order by a;
|
||||
set @arg00=0;
|
||||
execute stmt1 using @arg01, @arg00;
|
||||
select a,b from t1 order by a;
|
||||
|
||||
## update with subquery and several parameters
|
||||
set @arg00=23;
|
||||
set @arg01='two';
|
||||
set @arg02=2;
|
||||
set @arg03='two';
|
||||
set @arg04=2;
|
||||
--disable_warnings
|
||||
drop table if exists t2;
|
||||
--enable_warnings
|
||||
# t2 will be of table type 'MYISAM'
|
||||
create table t2 as select a,b from t1 ;
|
||||
prepare stmt1 from 'update t1 set a=? where b=?
|
||||
and a in (select ? from t2
|
||||
where b = ? or a = ?)';
|
||||
--enable_info
|
||||
# deactivated primary key column update
|
||||
# execute stmt1 using @arg00, @arg01, @arg02, @arg03, @arg04 ;
|
||||
--disable_info
|
||||
select a,b from t1 where a = @arg00 ;
|
||||
prepare stmt1 from 'update t1 set a=? where b=?
|
||||
and a not in (select ? from t2
|
||||
where b = ? or a = ?)';
|
||||
--enable_info
|
||||
execute stmt1 using @arg04, @arg01, @arg02, @arg03, @arg00 ;
|
||||
--disable_info
|
||||
select a,b from t1 order by a;
|
||||
drop table t2 ;
|
||||
# t2 is now of table type '$type'
|
||||
# The test battery for table type 'MERGE' gets here only a 'MYISAM' table
|
||||
eval create table t2
|
||||
(
|
||||
a int not null, b varchar(30),
|
||||
primary key(a)
|
||||
) engine = $type ;
|
||||
insert into t2(a,b) select a, b from t1 ;
|
||||
prepare stmt1 from 'update t1 set a=? where b=?
|
||||
and a in (select ? from t2
|
||||
where b = ? or a = ?)';
|
||||
--enable_info
|
||||
# deactivated primary key column update
|
||||
# execute stmt1 using @arg00, @arg01, @arg02, @arg03, @arg04 ;
|
||||
--disable_info
|
||||
select a,b from t1 where a = @arg00 ;
|
||||
prepare stmt1 from 'update t1 set a=? where b=?
|
||||
and a not in (select ? from t2
|
||||
where b = ? or a = ?)';
|
||||
--enable_info
|
||||
execute stmt1 using @arg04, @arg01, @arg02, @arg03, @arg00 ;
|
||||
--disable_info
|
||||
select a,b from t1 order by a ;
|
||||
drop table t2 ;
|
||||
|
||||
## update with parameters in limit
|
||||
set @arg00=1;
|
||||
prepare stmt1 from 'update t1 set b=''bla''
|
||||
where a=2
|
||||
limit 1';
|
||||
execute stmt1 ;
|
||||
select a,b from t1 where b = 'bla' ;
|
||||
# currently (May 2004, Version 4.1) it is impossible
|
||||
-- error 1064
|
||||
prepare stmt1 from 'update t1 set b=''bla''
|
||||
where a=2
|
||||
limit ?';
|
||||
|
||||
--disable_query_log
|
||||
select '------ insert tests ------' as test_sequence ;
|
||||
--enable_query_log
|
||||
--source include/ps_renew.inc
|
||||
|
||||
## insert without parameter
|
||||
prepare stmt1 from 'insert into t1 values(5, ''five'' )';
|
||||
execute stmt1;
|
||||
select a,b from t1 where a = 5;
|
||||
|
||||
## insert with one parameter in values part
|
||||
set @arg00='six' ;
|
||||
prepare stmt1 from 'insert into t1 values(6, ? )';
|
||||
execute stmt1 using @arg00;
|
||||
select a,b from t1 where b = @arg00;
|
||||
# the second insert fails, because the first column is primary key
|
||||
--error 1062
|
||||
execute stmt1 using @arg00;
|
||||
set @arg00=NULL ;
|
||||
prepare stmt1 from 'insert into t1 values(0, ? )';
|
||||
execute stmt1 using @arg00;
|
||||
select a,b from t1 where b is NULL;
|
||||
|
||||
## insert with two parameter in values part
|
||||
set @arg00=8 ;
|
||||
set @arg01='eight' ;
|
||||
prepare stmt1 from 'insert into t1 values(?, ? )';
|
||||
execute stmt1 using @arg00, @arg01 ;
|
||||
select a,b from t1 where b = @arg01;
|
||||
# cases derived from client_test.c: test_null()
|
||||
set @NULL= null ;
|
||||
set @arg00= 'abc' ;
|
||||
# execute must fail, because first column is primary key (-> not null)
|
||||
--error 1048
|
||||
execute stmt1 using @NULL, @NULL ;
|
||||
--error 1048
|
||||
execute stmt1 using @NULL, @NULL ;
|
||||
--error 1048
|
||||
execute stmt1 using @NULL, @arg00 ;
|
||||
--error 1048
|
||||
execute stmt1 using @NULL, @arg00 ;
|
||||
let $1 = 2;
|
||||
while ($1)
|
||||
{
|
||||
eval set @arg01= 10000 + $1 ;
|
||||
execute stmt1 using @arg01, @arg00 ;
|
||||
dec $1;
|
||||
}
|
||||
select * from t1 where a > 10000 order by a ;
|
||||
delete from t1 where a > 10000 ;
|
||||
let $1 = 2;
|
||||
while ($1)
|
||||
{
|
||||
eval set @arg01= 10000 + $1 ;
|
||||
execute stmt1 using @arg01, @NULL ;
|
||||
dec $1;
|
||||
}
|
||||
select * from t1 where a > 10000 order by a ;
|
||||
delete from t1 where a > 10000 ;
|
||||
let $1 = 10;
|
||||
while ($1)
|
||||
{
|
||||
eval set @arg01= 10000 + $1 ;
|
||||
execute stmt1 using @arg01, @arg01 ;
|
||||
dec $1;
|
||||
}
|
||||
select * from t1 where a > 10000 order by a ;
|
||||
delete from t1 where a > 10000 ;
|
||||
|
||||
|
||||
## insert with two rows in values part
|
||||
set @arg00=81 ;
|
||||
set @arg01='8-1' ;
|
||||
set @arg02=82 ;
|
||||
set @arg03='8-2' ;
|
||||
prepare stmt1 from 'insert into t1 values(?,?),(?,?)';
|
||||
execute stmt1 using @arg00, @arg01, @arg02, @arg03 ;
|
||||
select a,b from t1 where a in (@arg00,@arg02) order by a ;
|
||||
|
||||
## insert with two parameter in the set part
|
||||
set @arg00=9 ;
|
||||
set @arg01='nine' ;
|
||||
prepare stmt1 from 'insert into t1 set a=?, b=? ';
|
||||
execute stmt1 using @arg00, @arg01 ;
|
||||
select a,b from t1 where a = @arg00 ;
|
||||
|
||||
## insert with parameters in the ON DUPLICATE KEY part
|
||||
set @arg00=6 ;
|
||||
set @arg01=1 ;
|
||||
prepare stmt1 from 'insert into t1 set a=?, b=''sechs''
|
||||
on duplicate key update a=a + ?, b=concat(b,''modified'') ';
|
||||
# There is no primary key collision, so there will be no key column update
|
||||
# If a key column update would be necessary occurs BUG#4312
|
||||
# deactivated, activate when BUG#4312: is solved
|
||||
# execute stmt1 using @arg00, @arg01;
|
||||
select * from t1 order by a;
|
||||
set @arg00=81 ;
|
||||
set @arg01=1 ;
|
||||
# deactivated, activate when BUG#4312: is solved
|
||||
# execute stmt1 using @arg00, @arg01;
|
||||
|
||||
## insert, autoincrement column and ' SELECT LAST_INSERT_ID() '
|
||||
# cases derived from client_test.c: test_bug3117()
|
||||
--disable_warnings
|
||||
drop table if exists t2 ;
|
||||
--enable_warnings
|
||||
# The test battery for table type 'MERGE' gets here only a 'MYISAM' table
|
||||
eval create table t2 (id int auto_increment primary key)
|
||||
ENGINE= $type ;
|
||||
prepare stmt1 from ' select last_insert_id() ' ;
|
||||
insert into t2 values (NULL) ;
|
||||
execute stmt1 ;
|
||||
insert into t2 values (NULL) ;
|
||||
execute stmt1 ;
|
||||
drop table t2 ;
|
||||
|
||||
## many parameters
|
||||
set @1000=1000 ;
|
||||
set @x1000_2="x1000_2" ;
|
||||
set @x1000_3="x1000_3" ;
|
||||
|
||||
set @x1000="x1000" ;
|
||||
set @1100=1100 ;
|
||||
set @x1100="x1100" ;
|
||||
set @100=100 ;
|
||||
set @updated="updated" ;
|
||||
insert into t1 values(1000,'x1000_1') ;
|
||||
# deactivated, activate when BUG#4312: is solved
|
||||
# insert into t1 values(@1000,@x1000_2),(@1000,@x1000_3)
|
||||
# on duplicate key update a = a + @100, b = concat(b,@updated) ;
|
||||
select a,b from t1 where a >= 1000 order by a ;
|
||||
delete from t1 where a >= 1000 ;
|
||||
insert into t1 values(1000,'x1000_1') ;
|
||||
prepare stmt1 from ' insert into t1 values(?,?),(?,?)
|
||||
on duplicate key update a = a + ?, b = concat(b,?) ';
|
||||
# deactivated, activate when BUG#4312: is solved
|
||||
# execute stmt1 using @1000, @x1000_2, @1000, @x1000_3, @100, @updated ;
|
||||
select a,b from t1 where a >= 1000 order by a ;
|
||||
delete from t1 where a >= 1000 ;
|
||||
insert into t1 values(1000,'x1000_1') ;
|
||||
# deactivated, activate when BUG#4312: is solved
|
||||
# execute stmt1 using @1000, @x1000_2, @1100, @x1000_3, @100, @updated ;
|
||||
select a,b from t1 where a >= 1000 order by a ;
|
||||
delete from t1 where a >= 1000 ;
|
||||
|
||||
## replace
|
||||
prepare stmt1 from ' replace into t1 (a,b) select 100, ''hundred'' ';
|
||||
--error 1031
|
||||
|
||||
## multi table statements
|
||||
--disable_query_log
|
||||
select '------ multi table tests ------' as test_sequence ;
|
||||
--enable_query_log
|
||||
# cases derived from client_test.c: test_multi
|
||||
delete from t1 ;
|
||||
delete from t9 ;
|
||||
insert into t1(a,b) values (1, 'one'), (2, 'two'), (3, 'three') ;
|
||||
insert into t9 (c1,c21)
|
||||
values (1, 'one'), (2, 'two'), (3, 'three') ;
|
||||
prepare stmt_delete from " delete t1, t9
|
||||
from t1, t9 where t1.a=t9.c1 and t1.b='updated' ";
|
||||
prepare stmt_update from " update t1, t9
|
||||
set t1.b='updated', t9.c21='updated'
|
||||
where t1.a=t9.c1 and t1.a=? ";
|
||||
prepare stmt_select1 from " select a, b from t1 order by a" ;
|
||||
prepare stmt_select2 from " select c1, c21 from t9 order by c1" ;
|
||||
set @arg00= 1 ;
|
||||
let $1= 3 ;
|
||||
while ($1)
|
||||
{
|
||||
execute stmt_update using @arg00 ;
|
||||
execute stmt_delete ;
|
||||
execute stmt_select1 ;
|
||||
execute stmt_select2 ;
|
||||
set @arg00= @arg00 + 1 ;
|
||||
dec $1 ;
|
||||
}
|
||||
|
||||
-- source include/ps_modify.inc
|
||||
-- source include/ps_modify1.inc
|
||||
-- source include/ps_conv.inc
|
||||
|
||||
|
@ -98,7 +98,7 @@ wait_for_slave_to_stop;
|
||||
|
||||
# The following test can't be done because the result of Pos will differ
|
||||
# on different computers
|
||||
# --replace_result 9306 9999 3334 9999 3335 9999
|
||||
# --replace_result $MASTER_MYPORT MASTER_PORT
|
||||
# show slave status;
|
||||
|
||||
set global sql_slave_skip_counter=1;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user