mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 05:22:25 +01:00
Merge pnousiainen@bk-internal.mysql.com:/home/bk/mysql-4.1-ndb
into mysql.com:/space/pekka/ndb/version/my41-tux
This commit is contained in:
commit
257b113469
135 changed files with 1414 additions and 1149 deletions
|
@ -46,6 +46,7 @@ $opt_test= undef;
|
|||
$opt_skip_check= undef;
|
||||
$opt_skip_manual= undef;
|
||||
$opt_win_dist= undef;
|
||||
$opt_quiet= undef;
|
||||
$version= "unknown";
|
||||
$major=$minor=$release=0;
|
||||
|
||||
|
@ -67,7 +68,8 @@ GetOptions(
|
|||
"suffix=s",
|
||||
"test|t",
|
||||
"verbose|v",
|
||||
"win-dist|w"
|
||||
"win-dist|w",
|
||||
"quiet|q",
|
||||
) || print_help("");
|
||||
|
||||
#
|
||||
|
@ -99,8 +101,6 @@ if (defined $opt_build_command)
|
|||
print_help("") if ($opt_help);
|
||||
defined($REPO=$ARGV[0]) || print_help("Please enter the BK repository to be used!");
|
||||
|
||||
$subject= "Bootstrap of $REPO failed" if $opt_mail;
|
||||
|
||||
&logger("Starting build");
|
||||
&abort("The directory \"$REPO\" could not be found!") if (!-d $REPO);
|
||||
&logger("Using $REPO as the BK parent repository");
|
||||
|
@ -306,7 +306,7 @@ if (!$opt_dry_run)
|
|||
#
|
||||
# Now build the source distribution
|
||||
#
|
||||
&logger("Compiling");
|
||||
&logger("Compiling...");
|
||||
$command= $build_command;
|
||||
&run_command($command, "Compilation failed!");
|
||||
|
||||
|
@ -403,6 +403,7 @@ Options:
|
|||
include a log file snippet, if logging is enabled)
|
||||
Note that the \@-Sign needs to be quoted!
|
||||
Example: --mail=user\\\@domain.com
|
||||
-q, --quiet Be quiet
|
||||
-p, --pull Update the source BK trees before building
|
||||
-r, --revision=<rev> Export the tree as of revision <rev>
|
||||
(default is up to the latest revision)
|
||||
|
|
|
@ -204,6 +204,17 @@ if ($opt_stage == 0)
|
|||
safe_cd($host);
|
||||
if ($opt_stage == 0 && ! $opt_use_old_distribution)
|
||||
{
|
||||
$md5_result= safe_system("./my_md5sum -c ${opt_distribution}.md5");
|
||||
|
||||
if ($md5_result != 0)
|
||||
{
|
||||
abort("MD5 failed for $opt_distribution!");
|
||||
}
|
||||
else
|
||||
{
|
||||
info("SUCCESS: MD5 checks for $opt_distribution");
|
||||
}
|
||||
|
||||
safe_system("gunzip < $opt_distribution | $tar xf -");
|
||||
|
||||
# Fix file times; This is needed because the time for files may be
|
||||
|
@ -331,6 +342,9 @@ if ($opt_stage <= 3)
|
|||
$tar_file=<$pwd/$host/mysql*.t*gz>;
|
||||
abort ("Could not find tarball!") unless ($tar_file);
|
||||
|
||||
# Generate the MD5 for the binary distribution
|
||||
safe_system("./my_md5sum $tar_file > ${tar_file}.md5}");
|
||||
|
||||
#
|
||||
# Unpack the binary distribution
|
||||
#
|
||||
|
@ -660,7 +674,10 @@ sub safe_system
|
|||
my($com,$res)=@_;
|
||||
print LOG "$com\n";
|
||||
print "$host: $com\n" if ($opt_debug);
|
||||
system("$com >> $log 2>&1") && abort("error: Couldn't execute command, error: " . ($? / 256));
|
||||
my $result= system("$com >> $log 2>&1");
|
||||
abort("error: Couldn't execute command, error: " . ($? / 256)) unless $result == 0;
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
sub check_system
|
||||
|
|
|
@ -96,7 +96,7 @@ $SI_PARAMS= <$SUPFILEDIR/StartupParameters.plist>;
|
|||
$SI_POST= <$SUPFILEDIR/StartupItem.postinstall>;
|
||||
$SI_NAME= "MySQLStartupItem";
|
||||
$SI_DIR_NAME= "MySQLCOM";
|
||||
$SI_SCRIPT= <$SUPFILEDIR/MySQL>;
|
||||
$SI_SCRIPT= <$SUPFILEDIR/MySQLCOM>;
|
||||
@RESOURCES= qw/ ReadMe.txt postinstall preinstall /;
|
||||
@LICENSES= ("$SRCBASEDIR/COPYING","$SRCBASEDIR/MySQLEULA.txt");
|
||||
|
||||
|
|
|
@ -5,7 +5,10 @@
|
|||
#
|
||||
sub logger
|
||||
{
|
||||
my $message=$_[0];
|
||||
my $message= $_[0];
|
||||
my $cmnd= $_[1];
|
||||
|
||||
print $message . "\n" if !$opt_quiet && !$opt_verbose && !$cmnd;
|
||||
print timestamp() . " " . $message . "\n" if $opt_verbose;
|
||||
if (defined $opt_log && !$opt_dry_run)
|
||||
{
|
||||
|
@ -30,9 +33,12 @@ sub run_command
|
|||
}
|
||||
else
|
||||
{
|
||||
&logger($command);
|
||||
$command.= " >> $LOGFILE 2>&1" if defined $opt_log;
|
||||
$command.= " > /dev/null" if (!$opt_verbose && !$opt_log);
|
||||
&logger($command, 1);
|
||||
|
||||
$command.= ';' unless ($command =~ m/^.*;$/);
|
||||
|
||||
$command =~ s/;/ >> $LOGFILE 2>&1;/g if defined $opt_log;
|
||||
$command =~ s/;/ > \/dev\/null;/g if (!$opt_verbose && !$opt_log);
|
||||
system($command) == 0 or &abort("$errormsg\n");
|
||||
}
|
||||
}
|
||||
|
@ -47,6 +53,7 @@ sub abort
|
|||
{
|
||||
my $message= $_[0];
|
||||
my $messagefile;
|
||||
my $subject= "Bootstrap of $REPO failed" if $opt_mail;
|
||||
$message= "ERROR: " . $message;
|
||||
&logger($message);
|
||||
|
||||
|
|
|
@ -10,10 +10,22 @@
|
|||
# Written by Matt Wagner <matt@mysql.com>
|
||||
#
|
||||
use strict;
|
||||
|
||||
#
|
||||
# Use local perl libraries first. 'unshift' adds to the front of @INC
|
||||
# The local perl library dir hidden is $HOME/.perllibs on each build host
|
||||
#
|
||||
BEGIN
|
||||
{
|
||||
my $homedir= $ENV{HOME};
|
||||
unshift (@INC, "$homedir/.perllibs");
|
||||
}
|
||||
|
||||
use Digest::MD5;
|
||||
use Getopt::Long;
|
||||
|
||||
my $VER= "1.1";
|
||||
my $VER= "1.3";
|
||||
my $EXIT= 0;
|
||||
|
||||
#
|
||||
# Strip the leading path info off the program name ($0). We want 'my_md5sum'
|
||||
|
@ -67,6 +79,9 @@ if ($opt_check)
|
|||
# Print an error message if they don't match, else print OK
|
||||
print "$checkfile: FAILED\n" if $digest ne $checksum;
|
||||
print "$checkfile: OK\n" if $digest eq $checksum;
|
||||
|
||||
# Set the exit() status to non-zero if FAILED
|
||||
$EXIT= 1 if $digest ne $checksum;
|
||||
}
|
||||
}
|
||||
# Else generate the MD5 digest to STDOUT
|
||||
|
@ -80,6 +95,8 @@ else
|
|||
}
|
||||
}
|
||||
|
||||
exit($EXIT);
|
||||
|
||||
|
||||
#
|
||||
# This routine generates the MD5 digest of a file
|
||||
|
|
|
@ -1727,7 +1727,7 @@ com_help(String *buffer __attribute__((unused)),
|
|||
commands[i].cmd_char, commands[i].doc);
|
||||
}
|
||||
if (connected && mysql_get_server_version(&mysql) >= 40100)
|
||||
put_info("\nFor server side help, type 'help all'\n", INFO_INFO);
|
||||
put_info("\nFor server side help, type 'help contents'\n", INFO_INFO);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -1851,12 +1851,6 @@ int read_query(struct st_query** q_ptr)
|
|||
q->record_file[0]= 0;
|
||||
q->require_file= 0;
|
||||
q->first_word_len= 0;
|
||||
memcpy((gptr) q->expected_errno, (gptr) global_expected_errno,
|
||||
sizeof(global_expected_errno));
|
||||
q->expected_errors= global_expected_errors;
|
||||
q->abort_on_error= global_expected_errors == 0;
|
||||
bzero((gptr) global_expected_errno, sizeof(global_expected_errno));
|
||||
global_expected_errors=0;
|
||||
|
||||
q->type = Q_UNKNOWN;
|
||||
q->query_buf= q->query= 0;
|
||||
|
@ -1869,8 +1863,16 @@ int read_query(struct st_query** q_ptr)
|
|||
if (*p == '#')
|
||||
{
|
||||
q->type = Q_COMMENT;
|
||||
/* This goto is to avoid losing the "expected error" info. */
|
||||
goto end;
|
||||
}
|
||||
else if (p[0] == '-' && p[1] == '-')
|
||||
memcpy((gptr) q->expected_errno, (gptr) global_expected_errno,
|
||||
sizeof(global_expected_errno));
|
||||
q->expected_errors= global_expected_errors;
|
||||
q->abort_on_error= global_expected_errors == 0;
|
||||
bzero((gptr) global_expected_errno, sizeof(global_expected_errno));
|
||||
global_expected_errors=0;
|
||||
if (p[0] == '-' && p[1] == '-')
|
||||
{
|
||||
q->type= Q_COMMENT_WITH_COMMAND;
|
||||
p+= 2; /* To calculate first word */
|
||||
|
@ -1905,6 +1907,8 @@ int read_query(struct st_query** q_ptr)
|
|||
*p1 = 0;
|
||||
}
|
||||
}
|
||||
|
||||
end:
|
||||
while (*p && my_isspace(charset_info, *p))
|
||||
p++;
|
||||
if (!(q->query_buf= q->query= my_strdup(p, MYF(MY_WME))))
|
||||
|
|
|
@ -16,10 +16,17 @@
|
|||
|
||||
C_MODE_START
|
||||
|
||||
enum get_opt_var_type { GET_NO_ARG, GET_BOOL, GET_INT, GET_UINT, GET_LONG,
|
||||
GET_ULONG, GET_LL, GET_ULL, GET_STR, GET_STR_ALLOC,
|
||||
GET_DISABLED
|
||||
};
|
||||
#define GET_NO_ARG 1
|
||||
#define GET_BOOL 2
|
||||
#define GET_INT 3
|
||||
#define GET_UINT 4
|
||||
#define GET_LONG 5
|
||||
#define GET_ULONG 6
|
||||
#define GET_LL 7
|
||||
#define GET_ULL 8
|
||||
#define GET_STR 9
|
||||
#define GET_STR_ALLOC 10
|
||||
#define GET_DISABLED 11
|
||||
|
||||
#define GET_ASK_ADDR 128
|
||||
#define GET_TYPE_MASK 127
|
||||
|
@ -34,7 +41,7 @@ struct my_option
|
|||
gptr *value; /* The variable value */
|
||||
gptr *u_max_value; /* The user def. max variable value */
|
||||
const char **str_values; /* Pointer to possible values */
|
||||
enum get_opt_var_type var_type;
|
||||
ulong var_type;
|
||||
enum get_opt_arg_type arg_type;
|
||||
longlong def_value; /* Default value */
|
||||
longlong min_value; /* Min allowed value */
|
||||
|
|
|
@ -120,26 +120,6 @@
|
|||
#define __STDC_EXT__ 1 /* To get large file support on hpux */
|
||||
#endif
|
||||
|
||||
#ifdef HPUX11
|
||||
/*
|
||||
Fix warnings on HPUX11
|
||||
There is something really strange with HPUX11 include files as you get
|
||||
error about wrongly declared symbols or missing defines if you don't
|
||||
do the following:
|
||||
*/
|
||||
#if !defined(_XOPEN_SOURCE_EXTENDED) && ! defined(__cplusplus)
|
||||
#define _XOPEN_SOURCE_EXTENDED 1
|
||||
#endif
|
||||
|
||||
/* Fix type of socklen as this is depending on the above define */
|
||||
#undef SOCKET_SIZE_TYPE
|
||||
#ifdef _XOPEN_SOURCE_EXTENDED
|
||||
#define SOCKET_SIZE_TYPE socklen_t
|
||||
#else
|
||||
#define SOCKET_SIZE_TYPE int
|
||||
#endif /* _XOPEN_SOURCE_EXTENDED */
|
||||
#endif /* HPUX11 */
|
||||
|
||||
#if defined(THREAD) && !defined(__WIN__) && !defined(OS2)
|
||||
#ifndef _POSIX_PTHREAD_SEMANTICS
|
||||
#define _POSIX_PTHREAD_SEMANTICS /* We want posix threads */
|
||||
|
@ -213,7 +193,11 @@ C_MODE_END
|
|||
|
||||
/* Fix problem when linking c++ programs with gcc 3.x */
|
||||
#ifdef DEFINE_CXA_PURE_VIRTUAL
|
||||
#define FIX_GCC_LINKING_PROBLEM extern "C" { int __cxa_pure_virtual() {return 0;} }
|
||||
#define FIX_GCC_LINKING_PROBLEM \
|
||||
extern "C" { int __cxa_pure_virtual() {\
|
||||
DBUG_ASSERT("Pure virtual method called." == "Aborted");\
|
||||
return 0;\
|
||||
} }
|
||||
#else
|
||||
#define FIX_GCC_LINKING_PROBLEM
|
||||
#endif
|
||||
|
|
|
@ -316,4 +316,5 @@
|
|||
#define ER_GET_TEMPORARY_ERRMSG 1297
|
||||
#define ER_UNKNOWN_TIME_ZONE 1298
|
||||
#define ER_WARN_INVALID_TIMESTAMP 1299
|
||||
#define ER_ERROR_MESSAGES 300
|
||||
#define ER_INVALID_CHARACTER_STRING 1300
|
||||
#define ER_ERROR_MESSAGES 301
|
||||
|
|
|
@ -129,6 +129,18 @@ EXPORTS
|
|||
mysql_stmt_prepare
|
||||
mysql_stmt_init
|
||||
mysql_stmt_insert_id
|
||||
mysql_stmt_attr_get
|
||||
mysql_stmt_attr_set
|
||||
mysql_stmt_attr_get
|
||||
mysql_stmt_attr_set
|
||||
mysql_stmt_field_count
|
||||
client_errors
|
||||
mysql_set_local_infile_default
|
||||
mysql_set_local_infile_handler
|
||||
mysql_disable_reads_from_master
|
||||
mysql_disable_rpl_parse
|
||||
mysql_enable_reads_from_master
|
||||
mysql_enable_rpl_parse
|
||||
mysql_master_query
|
||||
mysql_rpl_parse_enabled
|
||||
mysql_rpl_probe
|
||||
mysql_rpl_query_type
|
||||
mysql_slave_query
|
||||
|
|
|
@ -370,7 +370,7 @@ while test $# -gt 0; do
|
|||
$ECHO "You need to have the 'valgrind' program in your PATH to run mysql-test-run with option --valgrind. Valgrind's home page is http://developer.kde.org/~sewardj ."
|
||||
exit 1
|
||||
fi
|
||||
VALGRIND="$VALGRIND --alignment=8 --leak-check=yes --num-callers=16"
|
||||
VALGRIND="$VALGRIND --tool=memcheck --alignment=8 --leak-check=yes --num-callers=16"
|
||||
EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT --skip-safemalloc --skip-bdb"
|
||||
EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT --skip-safemalloc --skip-bdb"
|
||||
SLEEP_TIME_AFTER_RESTART=10
|
||||
|
|
|
@ -123,7 +123,7 @@ grant all on mysqltest.t1 to mysqltest_1@localhost;
|
|||
alter table t1 rename t2;
|
||||
ERROR 42000: insert command denied to user 'mysqltest_1'@'localhost' for table 't2'
|
||||
revoke all privileges on mysqltest.t1 from mysqltest_1@localhost;
|
||||
delete from mysql.user where user='mysqltest_1';
|
||||
delete from mysql.user where user=_binary'mysqltest_1';
|
||||
drop database mysqltest;
|
||||
create table t1 (n1 int not null, n2 int, n3 int, n4 float,
|
||||
unique(n1),
|
||||
|
|
|
@ -38,7 +38,7 @@ time_zone_transition_type
|
|||
user
|
||||
show tables;
|
||||
Tables_in_test
|
||||
update mysql.user set password=old_password("gambling2") where user="test";
|
||||
update mysql.user set password=old_password("gambling2") where user=_binary"test";
|
||||
flush privileges;
|
||||
set password=old_password('gambling3');
|
||||
show tables;
|
||||
|
@ -60,5 +60,5 @@ time_zone_transition_type
|
|||
user
|
||||
show tables;
|
||||
Tables_in_test
|
||||
delete from mysql.user where user="test";
|
||||
delete from mysql.user where user=_binary"test";
|
||||
flush privileges;
|
||||
|
|
|
@ -1,15 +1,37 @@
|
|||
SET @@character_set_server=latin5;
|
||||
CREATE DATABASE db1 DEFAULT CHARACTER SET cp1251;
|
||||
USE db1;
|
||||
CREATE DATABASE db2;
|
||||
SHOW CREATE DATABASE db1;
|
||||
CREATE DATABASE mysqltest1 DEFAULT CHARACTER SET cp1251;
|
||||
USE mysqltest1;
|
||||
CREATE DATABASE mysqltest2;
|
||||
SHOW CREATE DATABASE mysqltest1;
|
||||
Database Create Database
|
||||
db1 CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET cp1251 */
|
||||
SHOW CREATE DATABASE db2;
|
||||
mysqltest1 CREATE DATABASE `mysqltest1` /*!40100 DEFAULT CHARACTER SET cp1251 */
|
||||
SHOW CREATE DATABASE mysqltest2;
|
||||
Database Create Database
|
||||
db2 CREATE DATABASE `db2` /*!40100 DEFAULT CHARACTER SET latin5 */
|
||||
DROP DATABASE db2;
|
||||
USE db1;
|
||||
mysqltest2 CREATE DATABASE `mysqltest2` /*!40100 DEFAULT CHARACTER SET latin5 */
|
||||
CREATE TABLE mysqltest2.t1 (a char(10));
|
||||
SHOW CREATE TABLE mysqltest2.t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` char(10) default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin5
|
||||
DROP TABLE mysqltest2.t1;
|
||||
ALTER DATABASE mysqltest2 DEFAULT CHARACTER SET latin7;
|
||||
CREATE TABLE mysqltest2.t1 (a char(10));
|
||||
SHOW CREATE TABLE mysqltest2.t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` char(10) default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin7
|
||||
DROP DATABASE mysqltest2;
|
||||
CREATE DATABASE mysqltest2 CHARACTER SET latin2;
|
||||
CREATE TABLE mysqltest2.t1 (a char(10));
|
||||
SHOW CREATE TABLE mysqltest2.t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` char(10) default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin2
|
||||
DROP DATABASE mysqltest2;
|
||||
USE mysqltest1;
|
||||
CREATE TABLE t1 (a char(10));
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
|
@ -32,4 +54,4 @@ t1 CREATE TABLE `t1` (
|
|||
`a` char(10) collate latin1_german1_ci default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci
|
||||
DROP TABLE t1;
|
||||
DROP DATABASE db1;
|
||||
DROP DATABASE mysqltest1;
|
||||
|
|
|
@ -136,3 +136,9 @@ SET character_set_connection=binary;
|
|||
SELECT 'тест' as s;
|
||||
s
|
||||
тест
|
||||
SET NAMES binary;
|
||||
CREATE TABLE `goodÐÌÏÈÏ` (a int);
|
||||
ERROR HY000: Invalid utf8 character string: 'ÐÌÏÈÏ'
|
||||
SET NAMES utf8;
|
||||
CREATE TABLE `goodÐÌÏÈÏ` (a int);
|
||||
ERROR HY000: Invalid utf8 character string: 'ÐÌÏÈÏ` (a int)'
|
||||
|
|
|
@ -1655,3 +1655,110 @@ Z,z,Ź,ź,Ż,ż,Ž,ž
|
|||
ǁ
|
||||
ǂ
|
||||
ǃ
|
||||
select group_concat(c1 order by c1) from t1 group by c1 collate utf8_roman_ci;
|
||||
group_concat(c1 order by c1)
|
||||
÷
|
||||
×
|
||||
A,a,À,Á,Â,Ã,Ä,Å,à,á,â,ã,ä,å,Ā,ā,Ă,ă,Ą,ą,Ǎ,ǎ,Ǟ,ǟ,Ǡ,ǡ,Ǻ,ǻ
|
||||
AA,Aa,aA,aa
|
||||
Æ,æ,Ǣ,ǣ,Ǽ,ǽ
|
||||
B,b
|
||||
ƀ
|
||||
Ɓ
|
||||
Ƃ,ƃ
|
||||
C,c,Ç,ç,Ć,ć,Ĉ,ĉ,Ċ,ċ,Č,č
|
||||
CH,Ch,cH,ch
|
||||
Ƈ,ƈ
|
||||
D,d,Ď,ď
|
||||
DZ,Dz,dZ,dz,DŽ,Dž,dž,DZ,Dz,dz
|
||||
Đ,đ
|
||||
Ɖ
|
||||
Ɗ
|
||||
Ƌ,ƌ
|
||||
Ð,ð
|
||||
E,e,È,É,Ê,Ë,è,é,ê,ë,Ē,ē,Ĕ,ĕ,Ė,ė,Ę,ę,Ě,ě
|
||||
Ǝ,ǝ
|
||||
Ə
|
||||
Ɛ
|
||||
F,f
|
||||
Ƒ,ƒ
|
||||
G,g,Ĝ,ĝ,Ğ,ğ,Ġ,ġ,Ģ,ģ,Ǧ,ǧ,Ǵ,ǵ
|
||||
Ǥ,ǥ
|
||||
Ɠ
|
||||
Ɣ
|
||||
Ƣ,ƣ
|
||||
H,h,Ĥ,ĥ
|
||||
ƕ,Ƕ
|
||||
Ħ,ħ
|
||||
I,J,i,j,Ì,Í,Î,Ï,ì,í,î,ï,Ĩ,ĩ,Ī,ī,Ĭ,ĭ,Į,į,İ,Ǐ,ǐ
|
||||
IJ,Ij,iJ,ij
|
||||
IJ,ij
|
||||
ı
|
||||
Ɨ
|
||||
Ɩ
|
||||
Ĵ,ĵ,ǰ
|
||||
K,k,Ķ,ķ,Ǩ,ǩ
|
||||
Ƙ,ƙ
|
||||
L,l,Ĺ,ĺ,Ļ,ļ,Ľ,ľ
|
||||
Ŀ,ŀ
|
||||
LJ,Lj,lJ,lj
|
||||
LJ,Lj,lj
|
||||
LL,Ll,lL,ll
|
||||
Ł,ł
|
||||
ƚ
|
||||
ƛ
|
||||
M,m
|
||||
N,n,Ñ,ñ,Ń,ń,Ņ,ņ,Ň,ň,Ǹ,ǹ
|
||||
NJ,Nj,nJ,nj
|
||||
NJ,Nj,nj
|
||||
Ɲ
|
||||
ƞ
|
||||
Ŋ,ŋ
|
||||
O,o,Ò,Ó,Ô,Õ,Ö,ò,ó,ô,õ,ö,Ō,ō,Ŏ,ŏ,Ő,ő,Ơ,ơ,Ǒ,ǒ,Ǫ,ǫ,Ǭ,ǭ
|
||||
OE,Oe,oE,oe,Œ,œ
|
||||
Ø,ø,Ǿ,ǿ
|
||||
Ɔ
|
||||
Ɵ
|
||||
P,p
|
||||
Ƥ,ƥ
|
||||
Q,q
|
||||
ĸ
|
||||
R,r,Ŕ,ŕ,Ŗ,ŗ,Ř,ř
|
||||
RR,Rr,rR,rr
|
||||
Ʀ
|
||||
S,s,Ś,ś,Ŝ,ŝ,Ş,ş,Š,š,ſ
|
||||
SS,Ss,sS,ss,ß
|
||||
Ʃ
|
||||
ƪ
|
||||
T,t,Ţ,ţ,Ť,ť
|
||||
ƾ
|
||||
Ŧ,ŧ
|
||||
ƫ
|
||||
Ƭ,ƭ
|
||||
Ʈ
|
||||
Ù,Ú,Û,Ü,ù,ú,û,ü,Ũ,ũ,Ū,ū,Ŭ,ŭ,Ů,ů,Ű,ű,Ų,ų,Ư,ư,Ǔ,ǔ,Ǖ,ǖ,Ǘ,ǘ,Ǚ,ǚ,Ǜ,ǜ
|
||||
Ɯ
|
||||
Ʊ
|
||||
U,V,u,v
|
||||
Ʋ
|
||||
W,w,Ŵ,ŵ
|
||||
X,x
|
||||
Y,y,Ý,ý,ÿ,Ŷ,ŷ,Ÿ
|
||||
Ƴ,ƴ
|
||||
Z,z,Ź,ź,Ż,ż,Ž,ž
|
||||
ƍ
|
||||
Ƶ,ƶ
|
||||
Ʒ,Ǯ,ǯ
|
||||
Ƹ,ƹ
|
||||
ƺ
|
||||
Þ,þ
|
||||
ƿ,Ƿ
|
||||
ƻ
|
||||
Ƨ,ƨ
|
||||
Ƽ,ƽ
|
||||
Ƅ,ƅ
|
||||
ʼn
|
||||
ǀ
|
||||
ǁ
|
||||
ǂ
|
||||
ǃ
|
||||
|
|
|
@ -192,9 +192,9 @@ length(quote(concat(char(0),"test")))
|
|||
select hex(quote(concat(char(224),char(227),char(230),char(231),char(232),char(234),char(235))));
|
||||
hex(quote(concat(char(224),char(227),char(230),char(231),char(232),char(234),char(235))))
|
||||
27E0E3E6E7E8EAEB27
|
||||
select unhex(hex("foobar")), hex(unhex("1234567890ABCDEF")), unhex("345678");
|
||||
unhex(hex("foobar")) hex(unhex("1234567890ABCDEF")) unhex("345678")
|
||||
foobar 1234567890ABCDEF 4Vx
|
||||
select unhex(hex("foobar")), hex(unhex("1234567890ABCDEF")), unhex("345678"), unhex(NULL);
|
||||
unhex(hex("foobar")) hex(unhex("1234567890ABCDEF")) unhex("345678") unhex(NULL)
|
||||
foobar 1234567890ABCDEF 4Vx NULL
|
||||
select hex(unhex("1")), hex(unhex("12")), hex(unhex("123")), hex(unhex("1234")), hex(unhex("12345")), hex(unhex("123456"));
|
||||
hex(unhex("1")) hex(unhex("12")) hex(unhex("123")) hex(unhex("1234")) hex(unhex("12345")) hex(unhex("123456"))
|
||||
01 12 0123 1234 012345 123456
|
||||
|
|
|
@ -46,7 +46,7 @@ create table t1 (version char(40)) select database(), user(), version() as 'vers
|
|||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`database()` char(34) character set utf8 NOT NULL default '',
|
||||
`database()` char(34) character set utf8 default NULL,
|
||||
`user()` char(77) character set utf8 NOT NULL default '',
|
||||
`version` char(40) default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
drop table if exists t1;
|
||||
SET NAMES binary;
|
||||
delete from mysql.user where user='mysqltest_1';
|
||||
delete from mysql.db where user='mysqltest_1';
|
||||
flush privileges;
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
SET NAMES binary;
|
||||
delete from mysql.user where user like 'mysqltest\_%';
|
||||
delete from mysql.db where user like 'mysqltest\_%';
|
||||
flush privileges;
|
||||
|
|
|
@ -198,6 +198,7 @@ Qcache_hits 8
|
|||
show status like "Qcache_not_cached";
|
||||
Variable_name Value
|
||||
Qcache_not_cached 8
|
||||
set names binary;
|
||||
delete from mysql.user where user in ("mysqltest_1","mysqltest_2","mysqltest_3");
|
||||
delete from mysql.db where user in ("mysqltest_1","mysqltest_2","mysqltest_3");
|
||||
delete from mysql.tables_priv where user in ("mysqltest_1","mysqltest_2","mysqltest_3");
|
||||
|
|
|
@ -447,7 +447,7 @@ update t1, t2 set t1.b=1 where t1.a=t2.a;
|
|||
update t1, t2 set t1.b=(select t3.b from t3 where t1.a=t3.a) where t1.a=t2.a;
|
||||
revoke all privileges on mysqltest.t1 from mysqltest_1@localhost;
|
||||
revoke all privileges on mysqltest.* from mysqltest_1@localhost;
|
||||
delete from mysql.user where user='mysqltest_1';
|
||||
delete from mysql.user where user=_binary'mysqltest_1';
|
||||
drop database mysqltest;
|
||||
create table t1 (a int, primary key (a));
|
||||
create table t2 (a int, primary key (a));
|
||||
|
|
|
@ -3,35 +3,25 @@ CREATE TABLE t1 (
|
|||
pk1 INT NOT NULL PRIMARY KEY,
|
||||
attr1 INT NOT NULL
|
||||
) ENGINE=ndbcluster;
|
||||
INSERT INTO t1 VALUES (9410,9412),(9411,9413);
|
||||
INSERT INTO t1 VALUES (9410,9412);
|
||||
SELECT pk1 FROM t1;
|
||||
pk1
|
||||
9410
|
||||
9411
|
||||
SELECT * FROM t1;
|
||||
pk1 attr1
|
||||
9410 9412
|
||||
9411 9413
|
||||
SELECT t1.* FROM t1;
|
||||
pk1 attr1
|
||||
9410 9412
|
||||
9411 9413
|
||||
UPDATE t1 SET attr1=1 WHERE pk1=9410;
|
||||
SELECT * FROM t1;
|
||||
pk1 attr1
|
||||
9410 1
|
||||
9411 9413
|
||||
UPDATE t1 SET pk1=2 WHERE attr1=1;
|
||||
ERROR 42000: Table 't1' uses an extension that doesn't exist in this MySQL version
|
||||
SELECT * FROM t1;
|
||||
pk1 attr1
|
||||
2 1
|
||||
9411 9413
|
||||
UPDATE t1 SET pk1=2 WHERE attr1=9413;
|
||||
ERROR 23000: Can't write; duplicate key in table 't1'
|
||||
SELECT * FROM t1;
|
||||
pk1 attr1
|
||||
2 1
|
||||
9411 9413
|
||||
9410 1
|
||||
DELETE FROM t1;
|
||||
SELECT * FROM t1;
|
||||
pk1 attr1
|
||||
|
|
|
@ -192,26 +192,6 @@ count(*)
|
|||
select count(*) from t4;
|
||||
count(*)
|
||||
0
|
||||
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
||||
select count(*) from t2;
|
||||
count(*)
|
||||
0
|
||||
select count(*) from t3;
|
||||
count(*)
|
||||
0
|
||||
select count(*) from t4;
|
||||
count(*)
|
||||
0
|
||||
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
||||
select count(*) from t2;
|
||||
count(*)
|
||||
0
|
||||
select count(*) from t3;
|
||||
count(*)
|
||||
0
|
||||
select count(*) from t4;
|
||||
count(*)
|
||||
0
|
||||
select count(*) from t2;
|
||||
count(*)
|
||||
100
|
||||
|
|
|
@ -389,12 +389,12 @@ where @arg01 = first.b or first.a = second.a or second.b = @arg02;
|
|||
a @arg00 a
|
||||
1 ABC 1
|
||||
2 ABC 1
|
||||
3 ABC 1
|
||||
4 ABC 1
|
||||
2 ABC 2
|
||||
2 ABC 3
|
||||
2 ABC 4
|
||||
3 ABC 1
|
||||
3 ABC 3
|
||||
4 ABC 1
|
||||
2 ABC 4
|
||||
4 ABC 4
|
||||
prepare stmt1 from ' select first.a, ?, second.a FROM t1 first, t1 second
|
||||
where ? = first.b or first.a = second.a or second.b = ? ';
|
||||
|
@ -402,12 +402,12 @@ execute stmt1 using @arg00, @arg01, @arg02;
|
|||
a ? a
|
||||
1 ABC 1
|
||||
2 ABC 1
|
||||
3 ABC 1
|
||||
4 ABC 1
|
||||
2 ABC 2
|
||||
2 ABC 3
|
||||
2 ABC 4
|
||||
3 ABC 1
|
||||
3 ABC 3
|
||||
4 ABC 1
|
||||
2 ABC 4
|
||||
4 ABC 4
|
||||
test_sequence
|
||||
------ subquery tests ------
|
||||
|
|
|
@ -548,14 +548,14 @@ def in_s 8 21 1 Y 32768 0 8
|
|||
def in_row_s 8 21 1 Y 32768 0 8
|
||||
scalar_s exists_s in_s in_row_s
|
||||
2.0000 0 1 0
|
||||
2.0000 0 1 0
|
||||
18.0000 1 0 1
|
||||
2.0000 0 1 0
|
||||
18.0000 1 0 1
|
||||
execute stmt1 ;
|
||||
scalar_s exists_s in_s in_row_s
|
||||
2.0000 0 1 0
|
||||
2.0000 0 1 0
|
||||
18.0000 1 0 1
|
||||
2.0000 0 1 0
|
||||
18.0000 1 0 1
|
||||
set @stmt= concat('explain ',@stmt);
|
||||
prepare stmt1 from @stmt ;
|
||||
|
@ -572,8 +572,8 @@ def ref 253 1024 0 Y 0 31 63
|
|||
def rows 8 10 1 N 32801 0 8
|
||||
def Extra 253 255 44 N 1 31 63
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY <derived6> ALL NULL NULL NULL NULL 2
|
||||
1 PRIMARY t_many_col_types ALL NULL NULL NULL NULL 3 Using where
|
||||
1 PRIMARY t_many_col_types ALL NULL NULL NULL NULL 3
|
||||
1 PRIMARY <derived6> ALL NULL NULL NULL NULL 2 Using where
|
||||
6 DERIVED t2 ALL NULL NULL NULL NULL 2
|
||||
5 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 2 Using where
|
||||
4 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 2 Using where
|
||||
|
@ -581,8 +581,8 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
2 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 2 Using where; Using temporary; Using filesort
|
||||
execute stmt1 ;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY <derived6> ALL NULL NULL NULL NULL 2
|
||||
1 PRIMARY t_many_col_types ALL NULL NULL NULL NULL 3 Using where
|
||||
1 PRIMARY t_many_col_types ALL NULL NULL NULL NULL 3
|
||||
1 PRIMARY <derived6> ALL NULL NULL NULL NULL 2 Using where
|
||||
6 DERIVED t2 ALL NULL NULL NULL NULL 2
|
||||
5 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 2 Using where
|
||||
4 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 2 Using where
|
||||
|
@ -617,15 +617,15 @@ def in_s 8 21 1 Y 32768 0 8
|
|||
def in_row_s 8 21 1 Y 32768 0 8
|
||||
scalar_s exists_s in_s in_row_s
|
||||
2 0 1 0
|
||||
2 0 1 0
|
||||
18 1 0 1
|
||||
2 0 1 0
|
||||
18 1 0 1
|
||||
execute stmt1 using @arg00, @arg01, @arg02, @arg03, @arg04, @arg05, @arg06,
|
||||
@arg07, @arg08, @arg09 ;
|
||||
scalar_s exists_s in_s in_row_s
|
||||
2 0 1 0
|
||||
2 0 1 0
|
||||
18 1 0 1
|
||||
2 0 1 0
|
||||
18 1 0 1
|
||||
set @stmt= concat('explain ',@stmt);
|
||||
prepare stmt1 from @stmt ;
|
||||
|
@ -643,8 +643,8 @@ def ref 253 1024 0 Y 0 31 63
|
|||
def rows 8 10 1 N 32801 0 8
|
||||
def Extra 253 255 44 N 1 31 63
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY <derived6> ALL NULL NULL NULL NULL 2
|
||||
1 PRIMARY t_many_col_types ALL NULL NULL NULL NULL 3 Using where
|
||||
1 PRIMARY t_many_col_types ALL NULL NULL NULL NULL 3
|
||||
1 PRIMARY <derived6> ALL NULL NULL NULL NULL 2 Using where
|
||||
6 DERIVED t2 ALL NULL NULL NULL NULL 2
|
||||
5 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 2 Using where
|
||||
4 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 2 Using where
|
||||
|
@ -653,8 +653,8 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
execute stmt1 using @arg00, @arg01, @arg02, @arg03, @arg04, @arg05, @arg06,
|
||||
@arg07, @arg08, @arg09 ;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY <derived6> ALL NULL NULL NULL NULL 2
|
||||
1 PRIMARY t_many_col_types ALL NULL NULL NULL NULL 3 Using where
|
||||
1 PRIMARY t_many_col_types ALL NULL NULL NULL NULL 3
|
||||
1 PRIMARY <derived6> ALL NULL NULL NULL NULL 2 Using where
|
||||
6 DERIVED t2 ALL NULL NULL NULL NULL 2
|
||||
5 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 2 Using where
|
||||
4 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 2 Using where
|
||||
|
|
|
@ -432,12 +432,12 @@ where @arg01 = first.b or first.a = second.a or second.b = @arg02;
|
|||
a @arg00 a
|
||||
1 ABC 1
|
||||
2 ABC 1
|
||||
3 ABC 1
|
||||
4 ABC 1
|
||||
2 ABC 2
|
||||
2 ABC 3
|
||||
2 ABC 4
|
||||
3 ABC 1
|
||||
3 ABC 3
|
||||
4 ABC 1
|
||||
2 ABC 4
|
||||
4 ABC 4
|
||||
prepare stmt1 from ' select first.a, ?, second.a FROM t1 first, t1 second
|
||||
where ? = first.b or first.a = second.a or second.b = ? ';
|
||||
|
@ -445,12 +445,12 @@ execute stmt1 using @arg00, @arg01, @arg02;
|
|||
a ? a
|
||||
1 ABC 1
|
||||
2 ABC 1
|
||||
3 ABC 1
|
||||
4 ABC 1
|
||||
2 ABC 2
|
||||
2 ABC 3
|
||||
2 ABC 4
|
||||
3 ABC 1
|
||||
3 ABC 3
|
||||
4 ABC 1
|
||||
2 ABC 4
|
||||
4 ABC 4
|
||||
test_sequence
|
||||
------ subquery tests ------
|
||||
|
@ -1615,12 +1615,12 @@ where @arg01 = first.b or first.a = second.a or second.b = @arg02;
|
|||
a @arg00 a
|
||||
1 ABC 1
|
||||
2 ABC 1
|
||||
3 ABC 1
|
||||
4 ABC 1
|
||||
2 ABC 2
|
||||
2 ABC 3
|
||||
2 ABC 4
|
||||
3 ABC 1
|
||||
3 ABC 3
|
||||
4 ABC 1
|
||||
2 ABC 4
|
||||
4 ABC 4
|
||||
prepare stmt1 from ' select first.a, ?, second.a FROM t1 first, t1 second
|
||||
where ? = first.b or first.a = second.a or second.b = ? ';
|
||||
|
@ -1628,12 +1628,12 @@ execute stmt1 using @arg00, @arg01, @arg02;
|
|||
a ? a
|
||||
1 ABC 1
|
||||
2 ABC 1
|
||||
3 ABC 1
|
||||
4 ABC 1
|
||||
2 ABC 2
|
||||
2 ABC 3
|
||||
2 ABC 4
|
||||
3 ABC 1
|
||||
3 ABC 3
|
||||
4 ABC 1
|
||||
2 ABC 4
|
||||
4 ABC 4
|
||||
test_sequence
|
||||
------ subquery tests ------
|
||||
|
|
|
@ -389,12 +389,12 @@ where @arg01 = first.b or first.a = second.a or second.b = @arg02;
|
|||
a @arg00 a
|
||||
1 ABC 1
|
||||
2 ABC 1
|
||||
3 ABC 1
|
||||
4 ABC 1
|
||||
2 ABC 2
|
||||
2 ABC 3
|
||||
2 ABC 4
|
||||
3 ABC 1
|
||||
3 ABC 3
|
||||
4 ABC 1
|
||||
2 ABC 4
|
||||
4 ABC 4
|
||||
prepare stmt1 from ' select first.a, ?, second.a FROM t1 first, t1 second
|
||||
where ? = first.b or first.a = second.a or second.b = ? ';
|
||||
|
@ -402,12 +402,12 @@ execute stmt1 using @arg00, @arg01, @arg02;
|
|||
a ? a
|
||||
1 ABC 1
|
||||
2 ABC 1
|
||||
3 ABC 1
|
||||
4 ABC 1
|
||||
2 ABC 2
|
||||
2 ABC 3
|
||||
2 ABC 4
|
||||
3 ABC 1
|
||||
3 ABC 3
|
||||
4 ABC 1
|
||||
2 ABC 4
|
||||
4 ABC 4
|
||||
test_sequence
|
||||
------ subquery tests ------
|
||||
|
|
|
@ -76,17 +76,17 @@ create table t1 (n int);
|
|||
insert into t1 values(3456);
|
||||
insert into mysql.user (Host, User, Password)
|
||||
VALUES ("10.10.10.%", "blafasel2", password("blafasel2"));
|
||||
select select_priv,user from mysql.user where user = 'blafasel2';
|
||||
select select_priv,user from mysql.user where user = _binary'blafasel2';
|
||||
select_priv user
|
||||
N blafasel2
|
||||
update mysql.user set Select_priv = "Y" where User="blafasel2";
|
||||
select select_priv,user from mysql.user where user = 'blafasel2';
|
||||
update mysql.user set Select_priv = "Y" where User= _binary"blafasel2";
|
||||
select select_priv,user from mysql.user where user = _binary'blafasel2';
|
||||
select_priv user
|
||||
Y blafasel2
|
||||
select n from t1;
|
||||
n
|
||||
3456
|
||||
select select_priv,user from mysql.user where user = 'blafasel2';
|
||||
select select_priv,user from mysql.user where user = _binary'blafasel2';
|
||||
select_priv user
|
||||
Y blafasel2
|
||||
drop table t1;
|
||||
|
|
|
@ -4,11 +4,11 @@ reset master;
|
|||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
delete from mysql.user where user='rpl_do_grant';
|
||||
delete from mysql.db where user='rpl_do_grant';
|
||||
delete from mysql.user where user=_binary'rpl_do_grant';
|
||||
delete from mysql.db where user=_binary'rpl_do_grant';
|
||||
flush privileges;
|
||||
delete from mysql.user where user='rpl_ignore_grant';
|
||||
delete from mysql.db where user='rpl_ignore_grant';
|
||||
delete from mysql.user where user=_binary'rpl_ignore_grant';
|
||||
delete from mysql.db where user=_binary'rpl_ignore_grant';
|
||||
flush privileges;
|
||||
grant select on *.* to rpl_do_grant@localhost;
|
||||
grant drop on test.* to rpl_do_grant@localhost;
|
||||
|
@ -17,10 +17,10 @@ Grants for rpl_do_grant@localhost
|
|||
GRANT SELECT ON *.* TO 'rpl_do_grant'@'localhost'
|
||||
GRANT DROP ON `test`.* TO 'rpl_do_grant'@'localhost'
|
||||
set password for rpl_do_grant@localhost=password("does it work?");
|
||||
select password<>'' from mysql.user where user='rpl_do_grant';
|
||||
password<>''
|
||||
select password<>_binary'' from mysql.user where user=_binary'rpl_do_grant';
|
||||
password<>_binary''
|
||||
1
|
||||
delete from mysql.user where user='rpl_do_grant';
|
||||
delete from mysql.db where user='rpl_do_grant';
|
||||
delete from mysql.user where user=_binary'rpl_do_grant';
|
||||
delete from mysql.db where user=_binary'rpl_do_grant';
|
||||
flush privileges;
|
||||
flush privileges;
|
||||
|
|
|
@ -4,11 +4,11 @@ reset master;
|
|||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
delete from mysql.user where user='rpl_ignore_grant';
|
||||
delete from mysql.db where user='rpl_ignore_grant';
|
||||
delete from mysql.user where user=_binary'rpl_ignore_grant';
|
||||
delete from mysql.db where user=_binary'rpl_ignore_grant';
|
||||
flush privileges;
|
||||
delete from mysql.user where user='rpl_ignore_grant';
|
||||
delete from mysql.db where user='rpl_ignore_grant';
|
||||
delete from mysql.user where user=_binary'rpl_ignore_grant';
|
||||
delete from mysql.db where user=_binary'rpl_ignore_grant';
|
||||
flush privileges;
|
||||
grant select on *.* to rpl_ignore_grant@localhost;
|
||||
grant drop on test.* to rpl_ignore_grant@localhost;
|
||||
|
@ -18,20 +18,20 @@ GRANT SELECT ON *.* TO 'rpl_ignore_grant'@'localhost'
|
|||
GRANT DROP ON `test`.* TO 'rpl_ignore_grant'@'localhost'
|
||||
show grants for rpl_ignore_grant@localhost;
|
||||
ERROR 42000: There is no such grant defined for user 'rpl_ignore_grant' on host 'localhost'
|
||||
select count(*) from mysql.user where user='rpl_ignore_grant';
|
||||
select count(*) from mysql.user where user=_binary'rpl_ignore_grant';
|
||||
count(*)
|
||||
0
|
||||
select count(*) from mysql.db where user='rpl_ignore_grant';
|
||||
select count(*) from mysql.db where user=_binary'rpl_ignore_grant';
|
||||
count(*)
|
||||
0
|
||||
grant select on *.* to rpl_ignore_grant@localhost;
|
||||
set password for rpl_ignore_grant@localhost=password("does it work?");
|
||||
select password<>'' from mysql.user where user='rpl_ignore_grant';
|
||||
password<>''
|
||||
select password<>_binary'' from mysql.user where user=_binary'rpl_ignore_grant';
|
||||
password<>_binary''
|
||||
0
|
||||
delete from mysql.user where user='rpl_ignore_grant';
|
||||
delete from mysql.db where user='rpl_ignore_grant';
|
||||
delete from mysql.user where user=_binary'rpl_ignore_grant';
|
||||
delete from mysql.db where user=_binary'rpl_ignore_grant';
|
||||
flush privileges;
|
||||
delete from mysql.user where user='rpl_ignore_grant';
|
||||
delete from mysql.db where user='rpl_ignore_grant';
|
||||
delete from mysql.user where user=_binary'rpl_ignore_grant';
|
||||
delete from mysql.db where user=_binary'rpl_ignore_grant';
|
||||
flush privileges;
|
||||
|
|
|
@ -395,6 +395,7 @@ show create database test_$1;
|
|||
ERROR 42000: Access denied for user 'mysqltest_3'@'localhost' to database 'test_$1'
|
||||
drop table test_$1.t1;
|
||||
drop database test_$1;
|
||||
set names binary;
|
||||
delete from mysql.user
|
||||
where user='mysqltest_1' || user='mysqltest_2' || user='mysqltest_3';
|
||||
delete from mysql.db
|
||||
|
|
|
@ -1891,3 +1891,11 @@ abc b
|
|||
3 4
|
||||
deallocate prepare stmt1;
|
||||
DROP TABLE t1, t2, t3;
|
||||
CREATE TABLE `t1` ( `a` int(11) default NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||
insert into t1 values (1);
|
||||
CREATE TABLE `t2` ( `b` int(11) default NULL, `a` int(11) default NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||
insert into t2 values (1,2);
|
||||
select t000.a, count(*) `C` FROM t1 t000 GROUP BY t000.a HAVING count(*) > ALL (SELECT count(*) FROM t2 t001 WHERE t001.a=1);
|
||||
a C
|
||||
1 1
|
||||
drop table t1,t2;
|
||||
|
|
|
@ -126,3 +126,5 @@ columns_priv CREATE TABLE `columns_priv` (
|
|||
`Column_priv` set('Select','Insert','Update','References') NOT NULL default '',
|
||||
PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`,`Column_name`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Column privileges'
|
||||
show tables;
|
||||
Tables_in_test
|
||||
|
|
|
@ -18,44 +18,44 @@ create table test_columns_priv select * from mysql.columns_priv;
|
|||
delete from test_columns_priv;
|
||||
insert into test_columns_priv (Host,Db,User,Table_name,Column_name) values (@name,@name,@name,@name,@name);
|
||||
select
|
||||
if(isnull(test_db.Host),'WRONG!!!','ok') as test_db_Host,
|
||||
if(isnull(test_host.Host),'WRONG!!!','ok') as test_host_Host,
|
||||
if(isnull(test_user.Host),'WRONG!!!','ok') as test_user_Host,
|
||||
if(isnull(test_tables_priv.Host),'WRONG!!!','ok') as test_tables_priv_Host,
|
||||
if(isnull(test_columns_priv.Host),'WRONG!!!','ok') as test_columns_priv_Host
|
||||
from test_db
|
||||
left join test_host on test_db.Host=test_host.Host
|
||||
left join test_user on test_db.Host=test_user.Host
|
||||
left join test_tables_priv on test_db.Host=test_tables_priv.Host
|
||||
if(isnull(test_db.Host),'WRONG!!!','ok') as test_db_Host,
|
||||
if(isnull(test_host.Host),'WRONG!!!','ok') as test_host_Host,
|
||||
if(isnull(test_user.Host),'WRONG!!!','ok') as test_user_Host,
|
||||
if(isnull(test_tables_priv.Host),'WRONG!!!','ok') as test_tables_priv_Host,
|
||||
if(isnull(test_columns_priv.Host),'WRONG!!!','ok') as test_columns_priv_Host
|
||||
from test_db
|
||||
left join test_host on test_db.Host=test_host.Host
|
||||
left join test_user on test_db.Host=test_user.Host
|
||||
left join test_tables_priv on test_db.Host=test_tables_priv.Host
|
||||
left join test_columns_priv on test_db.Host=test_columns_priv.Host;
|
||||
test_db_Host test_host_Host test_user_Host test_tables_priv_Host test_columns_priv_Host
|
||||
ok ok ok ok ok
|
||||
select
|
||||
if(isnull(test_db.Db),'WRONG!!!','ok') as test_db_Db,
|
||||
if(isnull(test_host.Db),'WRONG!!!','ok') as test_host_Db,
|
||||
if(isnull(test_tables_priv.Db),'WRONG!!!','ok') as test_tables_priv_Db,
|
||||
if(isnull(test_columns_priv.Db),'WRONG!!!','ok') as est_columns_priv_Db
|
||||
from test_db
|
||||
left join test_host on test_db.Db=test_host.Db
|
||||
left join test_tables_priv on test_db.Db=test_tables_priv.Db
|
||||
if(isnull(test_db.Db),'WRONG!!!','ok') as test_db_Db,
|
||||
if(isnull(test_host.Db),'WRONG!!!','ok') as test_host_Db,
|
||||
if(isnull(test_tables_priv.Db),'WRONG!!!','ok') as test_tables_priv_Db,
|
||||
if(isnull(test_columns_priv.Db),'WRONG!!!','ok') as est_columns_priv_Db
|
||||
from test_db
|
||||
left join test_host on test_db.Db=test_host.Db
|
||||
left join test_tables_priv on test_db.Db=test_tables_priv.Db
|
||||
left join test_columns_priv on test_db.Db=test_columns_priv.Db;
|
||||
test_db_Db test_host_Db test_tables_priv_Db est_columns_priv_Db
|
||||
ok ok ok ok
|
||||
select
|
||||
if(isnull(test_db.User),'WRONG!!!','ok') as test_db_User,
|
||||
if(isnull(test_user.User),'WRONG!!!','ok') as test_user_User,
|
||||
if(isnull(test_tables_priv.User),'WRONG!!!','ok') as test_tables_priv_User,
|
||||
if(isnull(test_columns_priv.User),'WRONG!!!','ok') as test_columns_priv_User
|
||||
from test_db
|
||||
left join test_user on test_db.User=test_user.User
|
||||
left join test_tables_priv on test_db.User=test_tables_priv.User
|
||||
select
|
||||
if(isnull(test_db.User),'WRONG!!!','ok') as test_db_User,
|
||||
if(isnull(test_user.User),'WRONG!!!','ok') as test_user_User,
|
||||
if(isnull(test_tables_priv.User),'WRONG!!!','ok') as test_tables_priv_User,
|
||||
if(isnull(test_columns_priv.User),'WRONG!!!','ok') as test_columns_priv_User
|
||||
from test_db
|
||||
left join test_user on test_db.User=test_user.User
|
||||
left join test_tables_priv on test_db.User=test_tables_priv.User
|
||||
left join test_columns_priv on test_db.User=test_columns_priv.User;
|
||||
test_db_User test_user_User test_tables_priv_User test_columns_priv_User
|
||||
ok ok ok ok
|
||||
select
|
||||
if(isnull(test_tables_priv.User),'WRONG!!!','ok') as test_tables_priv_User,
|
||||
if(isnull(test_columns_priv.User),'WRONG!!!','ok') as test_columns_priv_User
|
||||
from test_tables_priv
|
||||
select
|
||||
if(isnull(test_tables_priv.User),'WRONG!!!','ok') as test_tables_priv_User,
|
||||
if(isnull(test_columns_priv.User),'WRONG!!!','ok') as test_columns_priv_User
|
||||
from test_tables_priv
|
||||
left join test_columns_priv on test_tables_priv.Table_name=test_columns_priv.Table_name;
|
||||
test_tables_priv_User test_columns_priv_User
|
||||
ok ok
|
||||
|
|
|
@ -123,7 +123,7 @@ connection user1;
|
|||
alter table t1 rename t2;
|
||||
connection root;
|
||||
revoke all privileges on mysqltest.t1 from mysqltest_1@localhost;
|
||||
delete from mysql.user where user='mysqltest_1';
|
||||
delete from mysql.user where user=_binary'mysqltest_1';
|
||||
drop database mysqltest;
|
||||
|
||||
#
|
||||
|
|
|
@ -42,7 +42,7 @@ show tables;
|
|||
|
||||
|
||||
# check if old password version also works
|
||||
update mysql.user set password=old_password("gambling2") where user="test";
|
||||
update mysql.user set password=old_password("gambling2") where user=_binary"test";
|
||||
flush privileges;
|
||||
|
||||
#connect (con1,localhost,test,gambling2,"");
|
||||
|
@ -68,5 +68,5 @@ show tables;
|
|||
# remove user 'test' so that other tests which may use 'test'
|
||||
# do not depend on this test.
|
||||
|
||||
delete from mysql.user where user="test";
|
||||
delete from mysql.user where user=_binary"test";
|
||||
flush privileges;
|
||||
|
|
|
@ -13,25 +13,48 @@
|
|||
|
||||
|
||||
SET @@character_set_server=latin5;
|
||||
CREATE DATABASE db1 DEFAULT CHARACTER SET cp1251;
|
||||
USE db1;
|
||||
CREATE DATABASE db2;
|
||||
CREATE DATABASE mysqltest1 DEFAULT CHARACTER SET cp1251;
|
||||
USE mysqltest1;
|
||||
CREATE DATABASE mysqltest2;
|
||||
|
||||
#
|
||||
# This should be cp1251
|
||||
#
|
||||
SHOW CREATE DATABASE db1;
|
||||
SHOW CREATE DATABASE mysqltest1;
|
||||
|
||||
#
|
||||
# This should take the default latin5 value from server level.
|
||||
# Database "mysqltest2" should take the default latin5 value from
|
||||
# the server level.
|
||||
# Afterwards, table "d2.t1" should inherit the default latin5 value from
|
||||
# the database "mysqltest2", using database option hash.
|
||||
#
|
||||
SHOW CREATE DATABASE db2;
|
||||
DROP DATABASE db2;
|
||||
SHOW CREATE DATABASE mysqltest2;
|
||||
CREATE TABLE mysqltest2.t1 (a char(10));
|
||||
SHOW CREATE TABLE mysqltest2.t1;
|
||||
DROP TABLE mysqltest2.t1;
|
||||
|
||||
#
|
||||
# Now we check if the database charset is updated in
|
||||
# the database options hash when we ALTER DATABASE.
|
||||
#
|
||||
ALTER DATABASE mysqltest2 DEFAULT CHARACTER SET latin7;
|
||||
CREATE TABLE mysqltest2.t1 (a char(10));
|
||||
SHOW CREATE TABLE mysqltest2.t1;
|
||||
DROP DATABASE mysqltest2;
|
||||
|
||||
#
|
||||
# Now we check if the database charset is removed from
|
||||
# the database option hash when we DROP DATABASE.
|
||||
#
|
||||
CREATE DATABASE mysqltest2 CHARACTER SET latin2;
|
||||
CREATE TABLE mysqltest2.t1 (a char(10));
|
||||
SHOW CREATE TABLE mysqltest2.t1;
|
||||
DROP DATABASE mysqltest2;
|
||||
|
||||
#
|
||||
# Check that table value uses database level by default
|
||||
#
|
||||
USE db1;
|
||||
USE mysqltest1;
|
||||
CREATE TABLE t1 (a char(10));
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
|
@ -50,4 +73,4 @@ DROP TABLE t1;
|
|||
#
|
||||
#
|
||||
#
|
||||
DROP DATABASE db1;
|
||||
DROP DATABASE mysqltest1;
|
||||
|
|
|
@ -97,3 +97,13 @@ SELECT 'тест' as s;
|
|||
SET NAMES utf8;
|
||||
SET character_set_connection=binary;
|
||||
SELECT 'тест' as s;
|
||||
|
||||
#
|
||||
# Test that we allow only well-formed UTF8 identitiers
|
||||
#
|
||||
SET NAMES binary;
|
||||
--error 1300
|
||||
CREATE TABLE `goodÐÌÏÈÏ` (a int);
|
||||
SET NAMES utf8;
|
||||
--error 1300
|
||||
CREATE TABLE `goodÐÌÏÈÏ` (a int);
|
||||
|
|
|
@ -178,4 +178,5 @@ select group_concat(c1 order by c1) from t1 group by c1 collate utf8_danish_ci;
|
|||
select group_concat(c1 order by c1) from t1 group by c1 collate utf8_lithuanian_ci;
|
||||
--select group_concat(c1 order by c1) from t1 group by c1 collate utf8_slovak_ci;
|
||||
select group_concat(c1 order by c1) from t1 group by c1 collate utf8_spanish2_ci;
|
||||
select group_concat(c1 order by c1) from t1 group by c1 collate utf8_roman_ci;
|
||||
|
||||
|
|
|
@ -78,7 +78,7 @@ select quote(concat('abc\'', '\\cba'));
|
|||
select quote(1/0), quote('\0\Z');
|
||||
select length(quote(concat(char(0),"test")));
|
||||
select hex(quote(concat(char(224),char(227),char(230),char(231),char(232),char(234),char(235))));
|
||||
select unhex(hex("foobar")), hex(unhex("1234567890ABCDEF")), unhex("345678");
|
||||
select unhex(hex("foobar")), hex(unhex("1234567890ABCDEF")), unhex("345678"), unhex(NULL);
|
||||
select hex(unhex("1")), hex(unhex("12")), hex(unhex("123")), hex(unhex("1234")), hex(unhex("12345")), hex(unhex("123456"));
|
||||
select length(unhex(md5("abrakadabra")));
|
||||
|
||||
|
|
|
@ -5,6 +5,8 @@
|
|||
drop table if exists t1;
|
||||
--enable_warnings
|
||||
|
||||
SET NAMES binary;
|
||||
|
||||
#
|
||||
# Test that SSL options works properly
|
||||
#
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
SET NAMES binary;
|
||||
|
||||
#
|
||||
# GRANT tests that require several connections
|
||||
# (usually it's GRANT, reconnect as another user, try something)
|
||||
|
|
|
@ -126,6 +126,15 @@ show status like "Qcache_not_cached";
|
|||
# Cleanup
|
||||
|
||||
connection root;
|
||||
#
|
||||
# A temporary 4.1 workaround to make this test pass if
|
||||
# mysql was compiled with other than latin1 --with-charset=XXX.
|
||||
# Without "set names binary" the below queries fail with
|
||||
# "Illegal mix of collations" error.
|
||||
# In 5.0 we will change grant tables to use NCHAR(N) instead
|
||||
# of "CHAR(N) BINARY", and use cast-to-nchar: N'mysqltest_1'.
|
||||
#
|
||||
set names binary;
|
||||
delete from mysql.user where user in ("mysqltest_1","mysqltest_2","mysqltest_3");
|
||||
delete from mysql.db where user in ("mysqltest_1","mysqltest_2","mysqltest_3");
|
||||
delete from mysql.tables_priv where user in ("mysqltest_1","mysqltest_2","mysqltest_3");
|
||||
|
|
|
@ -405,7 +405,7 @@ update t1, t2 set t1.b=(select t3.b from t3 where t1.a=t3.a) where t1.a=t2.a;
|
|||
connection root;
|
||||
revoke all privileges on mysqltest.t1 from mysqltest_1@localhost;
|
||||
revoke all privileges on mysqltest.* from mysqltest_1@localhost;
|
||||
delete from mysql.user where user='mysqltest_1';
|
||||
delete from mysql.user where user=_binary'mysqltest_1';
|
||||
drop database mysqltest;
|
||||
|
||||
#
|
||||
|
|
|
@ -17,7 +17,7 @@ CREATE TABLE t1 (
|
|||
attr1 INT NOT NULL
|
||||
) ENGINE=ndbcluster;
|
||||
|
||||
INSERT INTO t1 VALUES (9410,9412),(9411,9413);
|
||||
INSERT INTO t1 VALUES (9410,9412);
|
||||
|
||||
SELECT pk1 FROM t1;
|
||||
SELECT * FROM t1;
|
||||
|
@ -27,16 +27,11 @@ SELECT t1.* FROM t1;
|
|||
UPDATE t1 SET attr1=1 WHERE pk1=9410;
|
||||
SELECT * FROM t1;
|
||||
|
||||
# Update pk
|
||||
# Can't UPDATE PK! Test that correct error is returned
|
||||
-- error 1112
|
||||
UPDATE t1 SET pk1=2 WHERE attr1=1;
|
||||
SELECT * FROM t1;
|
||||
|
||||
# Try to set same pk
|
||||
# 1022: Can't write; duplicate key in table 't1'
|
||||
-- error 1022
|
||||
UPDATE t1 SET pk1=2 WHERE attr1=9413;
|
||||
SELECT * FROM t1;
|
||||
|
||||
# Delete the record
|
||||
DELETE FROM t1;
|
||||
SELECT * FROM t1;
|
||||
|
|
|
@ -180,51 +180,6 @@ select count(*) from t2;
|
|||
select count(*) from t3;
|
||||
select count(*) from t4;
|
||||
|
||||
#
|
||||
# insert records into tables and commit after timeout;
|
||||
#
|
||||
let $1=100;
|
||||
disable_query_log;
|
||||
begin;
|
||||
while ($1)
|
||||
{
|
||||
eval insert into t2 values($1, $1+9, 5);
|
||||
eval insert into t3 values($1, $1+9, 5);
|
||||
eval insert into t4 values($1, $1+9, 5, $1+26000);
|
||||
dec $1;
|
||||
}
|
||||
sleep 15;
|
||||
-- error 1205
|
||||
commit;
|
||||
enable_query_log;
|
||||
|
||||
select count(*) from t2;
|
||||
select count(*) from t3;
|
||||
select count(*) from t4;
|
||||
|
||||
#
|
||||
# insert records into tables and timeout before last operation
|
||||
#
|
||||
let $1=100;
|
||||
disable_query_log;
|
||||
begin;
|
||||
while ($1)
|
||||
{
|
||||
eval insert into t2 values($1, $1+9, 5);
|
||||
eval insert into t3 values($1, $1+9, 5);
|
||||
eval insert into t4 values($1, $1+9, 5, $1+26000);
|
||||
dec $1;
|
||||
}
|
||||
sleep 15;
|
||||
-- error 1205
|
||||
insert into t2 values(10000, 10000, 36000);
|
||||
commit;
|
||||
enable_query_log;
|
||||
|
||||
select count(*) from t2;
|
||||
select count(*) from t3;
|
||||
select count(*) from t4;
|
||||
|
||||
#
|
||||
# insert records into tables and commit;
|
||||
#
|
||||
|
|
|
@ -369,7 +369,6 @@ revoke all privileges on test.t1 from drop_user@localhost ;
|
|||
--error 1295
|
||||
prepare stmt3 from ' drop user drop_user@localhost ';
|
||||
drop user drop_user@localhost;
|
||||
--error 1141
|
||||
|
||||
#### table related commands
|
||||
## describe
|
||||
|
|
|
@ -110,14 +110,14 @@ create table t1 (n int);
|
|||
insert into t1 values(3456);
|
||||
insert into mysql.user (Host, User, Password)
|
||||
VALUES ("10.10.10.%", "blafasel2", password("blafasel2"));
|
||||
select select_priv,user from mysql.user where user = 'blafasel2';
|
||||
update mysql.user set Select_priv = "Y" where User="blafasel2";
|
||||
select select_priv,user from mysql.user where user = 'blafasel2';
|
||||
select select_priv,user from mysql.user where user = _binary'blafasel2';
|
||||
update mysql.user set Select_priv = "Y" where User= _binary"blafasel2";
|
||||
select select_priv,user from mysql.user where user = _binary'blafasel2';
|
||||
save_master_pos;
|
||||
connection slave;
|
||||
sync_with_master;
|
||||
select n from t1;
|
||||
select select_priv,user from mysql.user where user = 'blafasel2';
|
||||
select select_priv,user from mysql.user where user = _binary'blafasel2';
|
||||
connection master1;
|
||||
drop table t1;
|
||||
save_master_pos;
|
||||
|
|
|
@ -4,16 +4,16 @@ source include/master-slave.inc;
|
|||
|
||||
# do not be influenced by other tests.
|
||||
connection master;
|
||||
delete from mysql.user where user='rpl_do_grant';
|
||||
delete from mysql.db where user='rpl_do_grant';
|
||||
delete from mysql.user where user=_binary'rpl_do_grant';
|
||||
delete from mysql.db where user=_binary'rpl_do_grant';
|
||||
flush privileges;
|
||||
save_master_pos;
|
||||
connection slave;
|
||||
sync_with_master;
|
||||
# if these DELETE did nothing on the master, we need to do them manually on the
|
||||
# slave.
|
||||
delete from mysql.user where user='rpl_ignore_grant';
|
||||
delete from mysql.db where user='rpl_ignore_grant';
|
||||
delete from mysql.user where user=_binary'rpl_ignore_grant';
|
||||
delete from mysql.db where user=_binary'rpl_ignore_grant';
|
||||
flush privileges;
|
||||
|
||||
# test replication of GRANT
|
||||
|
@ -31,12 +31,12 @@ set password for rpl_do_grant@localhost=password("does it work?");
|
|||
save_master_pos;
|
||||
connection slave;
|
||||
sync_with_master;
|
||||
select password<>'' from mysql.user where user='rpl_do_grant';
|
||||
select password<>_binary'' from mysql.user where user=_binary'rpl_do_grant';
|
||||
|
||||
# clear what we have done, to not influence other tests.
|
||||
connection master;
|
||||
delete from mysql.user where user='rpl_do_grant';
|
||||
delete from mysql.db where user='rpl_do_grant';
|
||||
delete from mysql.user where user=_binary'rpl_do_grant';
|
||||
delete from mysql.db where user=_binary'rpl_do_grant';
|
||||
flush privileges;
|
||||
save_master_pos;
|
||||
connection slave;
|
||||
|
|
|
@ -6,16 +6,16 @@ source include/master-slave.inc;
|
|||
|
||||
# do not be influenced by other tests.
|
||||
connection master;
|
||||
delete from mysql.user where user='rpl_ignore_grant';
|
||||
delete from mysql.db where user='rpl_ignore_grant';
|
||||
delete from mysql.user where user=_binary'rpl_ignore_grant';
|
||||
delete from mysql.db where user=_binary'rpl_ignore_grant';
|
||||
flush privileges;
|
||||
save_master_pos;
|
||||
connection slave;
|
||||
sync_with_master;
|
||||
# as these DELETE were not replicated, we need to do them manually on the
|
||||
# slave.
|
||||
delete from mysql.user where user='rpl_ignore_grant';
|
||||
delete from mysql.db where user='rpl_ignore_grant';
|
||||
delete from mysql.user where user=_binary'rpl_ignore_grant';
|
||||
delete from mysql.db where user=_binary'rpl_ignore_grant';
|
||||
flush privileges;
|
||||
|
||||
# test non-replication of GRANT
|
||||
|
@ -29,8 +29,8 @@ sync_with_master;
|
|||
--error 1141 #("no such grant for user")
|
||||
show grants for rpl_ignore_grant@localhost;
|
||||
# check it another way
|
||||
select count(*) from mysql.user where user='rpl_ignore_grant';
|
||||
select count(*) from mysql.db where user='rpl_ignore_grant';
|
||||
select count(*) from mysql.user where user=_binary'rpl_ignore_grant';
|
||||
select count(*) from mysql.db where user=_binary'rpl_ignore_grant';
|
||||
|
||||
# test non-replication of SET PASSWORD
|
||||
# first force creation of the user on slave (because as the user does not exist
|
||||
|
@ -42,16 +42,16 @@ set password for rpl_ignore_grant@localhost=password("does it work?");
|
|||
save_master_pos;
|
||||
connection slave;
|
||||
sync_with_master;
|
||||
select password<>'' from mysql.user where user='rpl_ignore_grant';
|
||||
select password<>_binary'' from mysql.user where user=_binary'rpl_ignore_grant';
|
||||
|
||||
# clear what we have done, to not influence other tests.
|
||||
connection master;
|
||||
delete from mysql.user where user='rpl_ignore_grant';
|
||||
delete from mysql.db where user='rpl_ignore_grant';
|
||||
delete from mysql.user where user=_binary'rpl_ignore_grant';
|
||||
delete from mysql.db where user=_binary'rpl_ignore_grant';
|
||||
flush privileges;
|
||||
save_master_pos;
|
||||
connection slave;
|
||||
sync_with_master;
|
||||
delete from mysql.user where user='rpl_ignore_grant';
|
||||
delete from mysql.db where user='rpl_ignore_grant';
|
||||
delete from mysql.user where user=_binary'rpl_ignore_grant';
|
||||
delete from mysql.db where user=_binary'rpl_ignore_grant';
|
||||
flush privileges;
|
||||
|
|
|
@ -299,6 +299,7 @@ drop table test_$1.t1;
|
|||
drop database test_$1;
|
||||
|
||||
connection default;
|
||||
set names binary;
|
||||
delete from mysql.user
|
||||
where user='mysqltest_1' || user='mysqltest_2' || user='mysqltest_3';
|
||||
delete from mysql.db
|
||||
|
|
|
@ -1212,3 +1212,13 @@ execute stmt1;
|
|||
select * from t3;
|
||||
deallocate prepare stmt1;
|
||||
DROP TABLE t1, t2, t3;
|
||||
|
||||
#
|
||||
# Aggregate function comparation with ALL/ANY/SOME subselect
|
||||
#
|
||||
CREATE TABLE `t1` ( `a` int(11) default NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||
insert into t1 values (1);
|
||||
CREATE TABLE `t2` ( `b` int(11) default NULL, `a` int(11) default NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||
insert into t2 values (1,2);
|
||||
select t000.a, count(*) `C` FROM t1 t000 GROUP BY t000.a HAVING count(*) > ALL (SELECT count(*) FROM t2 t001 WHERE t001.a=1);
|
||||
drop table t1,t2;
|
||||
|
|
|
@ -1,8 +1,13 @@
|
|||
#
|
||||
# This test must examine integrity of system database "mysql"
|
||||
#
|
||||
|
||||
-- disable_query_log
|
||||
use mysql;
|
||||
-- enable_query_log
|
||||
-- source include/system_db_struct.inc
|
||||
#
|
||||
# This test must examine integrity of system database "mysql"
|
||||
#
|
||||
|
||||
-- disable_query_log
|
||||
use mysql;
|
||||
-- enable_query_log
|
||||
-- source include/system_db_struct.inc
|
||||
-- disable_query_log
|
||||
use test;
|
||||
-- enable_query_log
|
||||
# keep results same with system_mysql_db_fix
|
||||
show tables;
|
||||
|
|
|
@ -1,83 +1,76 @@
|
|||
#
|
||||
#
|
||||
# This is the test for mysql_fix_privilege_tables
|
||||
#
|
||||
#
|
||||
|
||||
-- disable_result_log
|
||||
-- disable_query_log
|
||||
|
||||
use test;
|
||||
|
||||
# create system tables as in mysql-3.20
|
||||
|
||||
CREATE TABLE db (
|
||||
Host char(60) binary DEFAULT '' NOT NULL,
|
||||
Db char(32) binary DEFAULT '' NOT NULL,
|
||||
User char(16) binary DEFAULT '' NOT NULL,
|
||||
Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
PRIMARY KEY Host (Host,Db,User),
|
||||
KEY User (User)
|
||||
)
|
||||
type=ISAM;
|
||||
-- disable_result_log
|
||||
-- disable_query_log
|
||||
|
||||
INSERT INTO db VALUES ('%','test', '','Y','Y','Y','Y','Y','Y');
|
||||
INSERT INTO db VALUES ('%','test\_%','','Y','Y','Y','Y','Y','Y');
|
||||
use test;
|
||||
|
||||
CREATE TABLE host (
|
||||
Host char(60) binary DEFAULT '' NOT NULL,
|
||||
Db char(32) binary DEFAULT '' NOT NULL,
|
||||
Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
PRIMARY KEY Host (Host,Db)
|
||||
)
|
||||
type=ISAM;
|
||||
# create system tables as in mysql-3.20
|
||||
|
||||
CREATE TABLE user (
|
||||
Host char(60) binary DEFAULT '' NOT NULL,
|
||||
User char(16) binary DEFAULT '' NOT NULL,
|
||||
Password char(16),
|
||||
Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Reload_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Shutdown_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Process_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
PRIMARY KEY Host (Host,User)
|
||||
)
|
||||
type=ISAM;
|
||||
CREATE TABLE db (
|
||||
Host char(60) binary DEFAULT '' NOT NULL,
|
||||
Db char(32) binary DEFAULT '' NOT NULL,
|
||||
User char(16) binary DEFAULT '' NOT NULL,
|
||||
Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
PRIMARY KEY Host (Host,Db,User),
|
||||
KEY User (User)
|
||||
)
|
||||
type=ISAM;
|
||||
|
||||
INSERT INTO db VALUES ('%','test', '','Y','Y','Y','Y','Y','Y');
|
||||
INSERT INTO db VALUES ('%','test\_%','','Y','Y','Y','Y','Y','Y');
|
||||
|
||||
CREATE TABLE host (
|
||||
Host char(60) binary DEFAULT '' NOT NULL,
|
||||
Db char(32) binary DEFAULT '' NOT NULL,
|
||||
Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
PRIMARY KEY Host (Host,Db)
|
||||
)
|
||||
type=ISAM;
|
||||
|
||||
CREATE TABLE user (
|
||||
Host char(60) binary DEFAULT '' NOT NULL,
|
||||
User char(16) binary DEFAULT '' NOT NULL,
|
||||
Password char(16),
|
||||
Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Reload_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Shutdown_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
Process_priv enum('N','Y') DEFAULT 'N' NOT NULL,
|
||||
PRIMARY KEY Host (Host,User)
|
||||
)
|
||||
type=ISAM;
|
||||
|
||||
INSERT INTO user VALUES ('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y');
|
||||
INSERT INTO user VALUES ('localhost','', '','N','N','N','N','N','N','N','N','N');
|
||||
|
||||
INSERT INTO user VALUES ('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y');
|
||||
INSERT INTO user VALUES ('localhost','', '','N','N','N','N','N','N','N','N','N');
|
||||
|
||||
-- exec $MYSQL_FIX_SYSTEM_TABLES --database=test
|
||||
-- enable_query_log
|
||||
-- enable_result_log
|
||||
|
||||
-- source include/system_db_struct.inc
|
||||
|
||||
-- disable_query_log
|
||||
|
||||
DROP TABLE db;
|
||||
DROP TABLE host;
|
||||
DROP TABLE user;
|
||||
DROP TABLE func;
|
||||
DROP TABLE tables_priv;
|
||||
DROP TABLE columns_priv;
|
||||
DROP TABLE help_category;
|
||||
DROP TABLE help_keyword;
|
||||
DROP TABLE help_relation;
|
||||
DROP TABLE help_topic;
|
||||
|
||||
-- enable_query_log
|
||||
-- enable_query_log
|
||||
-- enable_result_log
|
||||
|
||||
-- source include/system_db_struct.inc
|
||||
|
||||
-- disable_query_log
|
||||
|
||||
DROP TABLE db, host, user, func, tables_priv, columns_priv, help_category, help_keyword, help_relation, help_topic, time_zone, time_zone_leap_second, time_zone_name, time_zone_transition, time_zone_transition_type;
|
||||
|
||||
-- enable_query_log
|
||||
|
||||
# check that we droped all system tables
|
||||
show tables;
|
||||
|
|
|
@ -1,102 +1,101 @@
|
|||
#
|
||||
# This test must examine integrity of current system database
|
||||
#
|
||||
|
||||
set @name="This is a very long string, that mustn't find room in a system field like Table_name. Thus it should be cut by the actual size of the field. So we can use this string to find out the actual length of the field and to use it in any compare queries";
|
||||
|
||||
#
|
||||
# If this part is wrong, most likely you've done wrong modification of system database "mysql"
|
||||
#
|
||||
|
||||
create table test_db select * from mysql.db;
|
||||
delete from test_db;
|
||||
#
|
||||
# This test must examine integrity of current system database
|
||||
#
|
||||
|
||||
set @name="This is a very long string, that mustn't find room in a system field like Table_name. Thus it should be cut by the actual size of the field. So we can use this string to find out the actual length of the field and to use it in any compare queries";
|
||||
|
||||
#
|
||||
# If this part is wrong, most likely you've done wrong modification of system database "mysql"
|
||||
#
|
||||
|
||||
create table test_db select * from mysql.db;
|
||||
delete from test_db;
|
||||
--disable_warnings
|
||||
insert into test_db (Host,Db,User) values (@name,@name,@name);
|
||||
insert into test_db (Host,Db,User) values (@name,@name,@name);
|
||||
--enable_warnings
|
||||
|
||||
create table test_host select * from mysql.host;
|
||||
delete from test_host;
|
||||
|
||||
create table test_host select * from mysql.host;
|
||||
delete from test_host;
|
||||
--disable_warnings
|
||||
insert into test_host (Host,Db) values (@name,@name);
|
||||
insert into test_host (Host,Db) values (@name,@name);
|
||||
--enable_warnings
|
||||
|
||||
create table test_user select * from mysql.user;
|
||||
delete from test_user;
|
||||
|
||||
create table test_user select * from mysql.user;
|
||||
delete from test_user;
|
||||
--disable_warnings
|
||||
insert into test_user (Host,User) values (@name,@name);
|
||||
insert into test_user (Host,User) values (@name,@name);
|
||||
--enable_warnings
|
||||
|
||||
create table test_func select * from mysql.func;
|
||||
delete from test_func;
|
||||
|
||||
create table test_func select * from mysql.func;
|
||||
delete from test_func;
|
||||
--disable_warnings
|
||||
insert into test_func (name) values (@name);
|
||||
insert into test_func (name) values (@name);
|
||||
--enable_warnings
|
||||
|
||||
create table test_tables_priv select * from mysql.tables_priv;
|
||||
delete from test_tables_priv;
|
||||
|
||||
create table test_tables_priv select * from mysql.tables_priv;
|
||||
delete from test_tables_priv;
|
||||
--disable_warnings
|
||||
insert into test_tables_priv (Host,Db,User,Table_name) values (@name,@name,@name,@name);
|
||||
insert into test_tables_priv (Host,Db,User,Table_name) values (@name,@name,@name,@name);
|
||||
--enable_warnings
|
||||
|
||||
create table test_columns_priv select * from mysql.columns_priv;
|
||||
delete from test_columns_priv;
|
||||
|
||||
create table test_columns_priv select * from mysql.columns_priv;
|
||||
delete from test_columns_priv;
|
||||
--disable_warnings
|
||||
insert into test_columns_priv (Host,Db,User,Table_name,Column_name) values (@name,@name,@name,@name,@name);
|
||||
insert into test_columns_priv (Host,Db,User,Table_name,Column_name) values (@name,@name,@name,@name,@name);
|
||||
--enable_warnings
|
||||
|
||||
# 'Host' field must be the same for all the tables:
|
||||
|
||||
|
||||
# 'Host' field must be the same for all the tables:
|
||||
|
||||
select
|
||||
if(isnull(test_db.Host),'WRONG!!!','ok') as test_db_Host,
|
||||
if(isnull(test_host.Host),'WRONG!!!','ok') as test_host_Host,
|
||||
if(isnull(test_user.Host),'WRONG!!!','ok') as test_user_Host,
|
||||
if(isnull(test_tables_priv.Host),'WRONG!!!','ok') as test_tables_priv_Host,
|
||||
if(isnull(test_columns_priv.Host),'WRONG!!!','ok') as test_columns_priv_Host
|
||||
if(isnull(test_db.Host),'WRONG!!!','ok') as test_db_Host,
|
||||
if(isnull(test_host.Host),'WRONG!!!','ok') as test_host_Host,
|
||||
if(isnull(test_user.Host),'WRONG!!!','ok') as test_user_Host,
|
||||
if(isnull(test_tables_priv.Host),'WRONG!!!','ok') as test_tables_priv_Host,
|
||||
if(isnull(test_columns_priv.Host),'WRONG!!!','ok') as test_columns_priv_Host
|
||||
|
||||
from test_db
|
||||
left join test_host on test_db.Host=test_host.Host
|
||||
left join test_user on test_db.Host=test_user.Host
|
||||
left join test_tables_priv on test_db.Host=test_tables_priv.Host
|
||||
left join test_columns_priv on test_db.Host=test_columns_priv.Host;
|
||||
|
||||
# 'Db' field must be the same for all the tables:
|
||||
|
||||
from test_db
|
||||
left join test_host on test_db.Host=test_host.Host
|
||||
left join test_user on test_db.Host=test_user.Host
|
||||
left join test_tables_priv on test_db.Host=test_tables_priv.Host
|
||||
left join test_columns_priv on test_db.Host=test_columns_priv.Host;
|
||||
|
||||
# 'Db' field must be the same for all the tables:
|
||||
|
||||
select
|
||||
if(isnull(test_db.Db),'WRONG!!!','ok') as test_db_Db,
|
||||
if(isnull(test_host.Db),'WRONG!!!','ok') as test_host_Db,
|
||||
if(isnull(test_tables_priv.Db),'WRONG!!!','ok') as test_tables_priv_Db,
|
||||
if(isnull(test_columns_priv.Db),'WRONG!!!','ok') as est_columns_priv_Db
|
||||
if(isnull(test_db.Db),'WRONG!!!','ok') as test_db_Db,
|
||||
if(isnull(test_host.Db),'WRONG!!!','ok') as test_host_Db,
|
||||
if(isnull(test_tables_priv.Db),'WRONG!!!','ok') as test_tables_priv_Db,
|
||||
if(isnull(test_columns_priv.Db),'WRONG!!!','ok') as est_columns_priv_Db
|
||||
|
||||
from test_db
|
||||
left join test_host on test_db.Db=test_host.Db
|
||||
left join test_tables_priv on test_db.Db=test_tables_priv.Db
|
||||
left join test_columns_priv on test_db.Db=test_columns_priv.Db;
|
||||
|
||||
# 'User' field must be the same for all the tables:
|
||||
|
||||
select
|
||||
if(isnull(test_db.User),'WRONG!!!','ok') as test_db_User,
|
||||
if(isnull(test_user.User),'WRONG!!!','ok') as test_user_User,
|
||||
if(isnull(test_tables_priv.User),'WRONG!!!','ok') as test_tables_priv_User,
|
||||
if(isnull(test_columns_priv.User),'WRONG!!!','ok') as test_columns_priv_User
|
||||
from test_db
|
||||
left join test_host on test_db.Db=test_host.Db
|
||||
left join test_tables_priv on test_db.Db=test_tables_priv.Db
|
||||
left join test_columns_priv on test_db.Db=test_columns_priv.Db;
|
||||
|
||||
from test_db
|
||||
left join test_user on test_db.User=test_user.User
|
||||
left join test_tables_priv on test_db.User=test_tables_priv.User
|
||||
left join test_columns_priv on test_db.User=test_columns_priv.User;
|
||||
|
||||
# 'Table_name' field must be the same for all the tables:
|
||||
|
||||
select
|
||||
if(isnull(test_tables_priv.User),'WRONG!!!','ok') as test_tables_priv_User,
|
||||
if(isnull(test_columns_priv.User),'WRONG!!!','ok') as test_columns_priv_User
|
||||
from test_tables_priv
|
||||
left join test_columns_priv on test_tables_priv.Table_name=test_columns_priv.Table_name;
|
||||
|
||||
drop table test_columns_priv;
|
||||
drop table test_tables_priv;
|
||||
drop table test_func;
|
||||
drop table test_host;
|
||||
drop table test_user;
|
||||
drop table test_db;
|
||||
# 'User' field must be the same for all the tables:
|
||||
|
||||
select
|
||||
if(isnull(test_db.User),'WRONG!!!','ok') as test_db_User,
|
||||
if(isnull(test_user.User),'WRONG!!!','ok') as test_user_User,
|
||||
if(isnull(test_tables_priv.User),'WRONG!!!','ok') as test_tables_priv_User,
|
||||
if(isnull(test_columns_priv.User),'WRONG!!!','ok') as test_columns_priv_User
|
||||
|
||||
from test_db
|
||||
left join test_user on test_db.User=test_user.User
|
||||
left join test_tables_priv on test_db.User=test_tables_priv.User
|
||||
left join test_columns_priv on test_db.User=test_columns_priv.User;
|
||||
|
||||
# 'Table_name' field must be the same for all the tables:
|
||||
|
||||
select
|
||||
if(isnull(test_tables_priv.User),'WRONG!!!','ok') as test_tables_priv_User,
|
||||
if(isnull(test_columns_priv.User),'WRONG!!!','ok') as test_columns_priv_User
|
||||
from test_tables_priv
|
||||
left join test_columns_priv on test_tables_priv.Table_name=test_columns_priv.Table_name;
|
||||
|
||||
drop table test_columns_priv;
|
||||
drop table test_tables_priv;
|
||||
drop table test_func;
|
||||
drop table test_host;
|
||||
drop table test_user;
|
||||
drop table test_db;
|
||||
|
|
|
@ -38,6 +38,7 @@ extern CHARSET_INFO my_charset_ucs2_danish_uca_ci;
|
|||
extern CHARSET_INFO my_charset_ucs2_lithuanian_uca_ci;
|
||||
extern CHARSET_INFO my_charset_ucs2_slovak_uca_ci;
|
||||
extern CHARSET_INFO my_charset_ucs2_spanish2_uca_ci;
|
||||
extern CHARSET_INFO my_charset_ucs2_roman_uca_ci;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_CHARSET_utf8
|
||||
|
@ -56,6 +57,7 @@ extern CHARSET_INFO my_charset_utf8_danish_uca_ci;
|
|||
extern CHARSET_INFO my_charset_utf8_lithuanian_uca_ci;
|
||||
extern CHARSET_INFO my_charset_utf8_slovak_uca_ci;
|
||||
extern CHARSET_INFO my_charset_utf8_spanish2_uca_ci;
|
||||
extern CHARSET_INFO my_charset_utf8_roman_uca_ci;
|
||||
#endif
|
||||
|
||||
my_bool init_compiled_charsets(myf flags __attribute__((unused)))
|
||||
|
@ -124,6 +126,7 @@ my_bool init_compiled_charsets(myf flags __attribute__((unused)))
|
|||
add_compiled_collation(&my_charset_ucs2_lithuanian_uca_ci);
|
||||
add_compiled_collation(&my_charset_ucs2_slovak_uca_ci);
|
||||
add_compiled_collation(&my_charset_ucs2_spanish2_uca_ci);
|
||||
add_compiled_collation(&my_charset_ucs2_roman_uca_ci);
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_CHARSET_ujis
|
||||
|
@ -149,6 +152,7 @@ my_bool init_compiled_charsets(myf flags __attribute__((unused)))
|
|||
add_compiled_collation(&my_charset_utf8_lithuanian_uca_ci);
|
||||
add_compiled_collation(&my_charset_utf8_slovak_uca_ci);
|
||||
add_compiled_collation(&my_charset_utf8_spanish2_uca_ci);
|
||||
add_compiled_collation(&my_charset_utf8_roman_uca_ci);
|
||||
#endif
|
||||
|
||||
/* Copy compiled charsets */
|
||||
|
|
|
@ -127,6 +127,7 @@ void my_end(int infoflag)
|
|||
FILE *info_file;
|
||||
if (!(info_file=DBUG_FILE))
|
||||
info_file=stderr;
|
||||
DBUG_PRINT("info",("Shutting down"));
|
||||
if (infoflag & MY_CHECK_ERROR || info_file != stderr)
|
||||
{ /* Test if some file is left open */
|
||||
if (my_file_opened | my_stream_opened)
|
||||
|
|
|
@ -461,6 +461,17 @@ MY_DIR *my_dir(const char *path, myf MyFlags)
|
|||
else
|
||||
finfo.mystat= NULL;
|
||||
|
||||
/*
|
||||
If the directory is the root directory of the drive, Windows sometimes
|
||||
creates hidden or system files there (like RECYCLER); do not show
|
||||
them. We would need to see how this can be achieved with a Borland
|
||||
compiler.
|
||||
*/
|
||||
#ifndef __BORLANDC__
|
||||
if (attrib & (_A_HIDDEN | _A_SYSTEM))
|
||||
continue;
|
||||
#endif
|
||||
|
||||
if (push_dynamic(dir_entries_storage, (gptr)&finfo))
|
||||
goto error;
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -93,8 +93,8 @@ readln_socket(NDB_SOCKET_TYPE socket, int timeout_millis,
|
|||
|
||||
FD_ZERO(&readset);
|
||||
FD_SET(socket, &readset);
|
||||
timeout.tv_sec = 1;
|
||||
timeout.tv_usec = 0; // 1 s
|
||||
timeout.tv_sec = (timeout_millis / 1000);
|
||||
timeout.tv_usec = (timeout_millis % 1000) * 1000;
|
||||
const int selectRes = select(socket + 1, &readset, 0, 0, &timeout);
|
||||
if(selectRes != 1){
|
||||
return -1;
|
||||
|
|
|
@ -2313,6 +2313,18 @@ void Ndbcntr::execWAIT_GCP_REF(Signal* signal){
|
|||
void Ndbcntr::execWAIT_GCP_CONF(Signal* signal){
|
||||
jamEntry();
|
||||
|
||||
ndbrequire(StopReq::getSystemStop(c_stopRec.stopReq.requestInfo));
|
||||
NodeState newState(NodeState::SL_STOPPING_3, true);
|
||||
|
||||
/**
|
||||
* Inform QMGR so that arbitrator won't kill us
|
||||
*/
|
||||
NodeStateRep * rep = (NodeStateRep *)&signal->theData[0];
|
||||
rep->nodeState = newState;
|
||||
rep->nodeState.masterNodeId = cmasterNodeId;
|
||||
rep->nodeState.setNodeGroup(c_nodeGroup);
|
||||
EXECUTE_DIRECT(QMGR, GSN_NODE_STATE_REP, signal, NodeStateRep::SignalLength);
|
||||
|
||||
if(StopReq::getPerformRestart(c_stopRec.stopReq.requestInfo)){
|
||||
jam();
|
||||
StartOrd * startOrd = (StartOrd *)&signal->theData[0];
|
||||
|
|
|
@ -2311,6 +2311,15 @@ void Qmgr::execPREP_FAILCONF(Signal* signal)
|
|||
* Continues via sendCommitFailReq() if successful.
|
||||
*/
|
||||
arbitRec.failureNr = cfailureNr;
|
||||
const NodeState & s = getNodeState();
|
||||
if(s.startLevel == NodeState::SL_STOPPING_3 && s.stopping.systemShutdown){
|
||||
jam();
|
||||
/**
|
||||
* We're performing a system shutdown,
|
||||
* don't let artibtrator shut us down
|
||||
*/
|
||||
return;
|
||||
}
|
||||
handleArbitCheck(signal);
|
||||
return;
|
||||
}//Qmgr::execPREP_FAILCONF()
|
||||
|
|
|
@ -478,9 +478,9 @@ SimpleCpcClient::connect() {
|
|||
if (::connect(cpc_sock, (struct sockaddr*) &sa, sizeof(sa)) < 0)
|
||||
return -1;
|
||||
|
||||
cpc_in = new SocketInputStream(cpc_sock);
|
||||
cpc_in = new SocketInputStream(cpc_sock, 60000);
|
||||
cpc_out = new SocketOutputStream(cpc_sock);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -564,17 +564,17 @@ Ndb::handleReceivedSignal(NdbApiSignal* aSignal, LinearSectionPtr ptr[3])
|
|||
if (tFirstDataPtr == 0) goto InvalidSignal;
|
||||
|
||||
if (tWaitState != WAIT_TC_SEIZE) {
|
||||
return;
|
||||
goto InvalidSignal;
|
||||
}//if
|
||||
tCon = void2con(tFirstDataPtr);
|
||||
if (tCon->checkMagicNumber() != 0) {
|
||||
return;
|
||||
goto InvalidSignal;
|
||||
}//if
|
||||
tReturnCode = tCon->receiveTCSEIZECONF(aSignal);
|
||||
if (tReturnCode != -1) {
|
||||
theWaiter.m_state = NO_WAIT;
|
||||
} else {
|
||||
return;
|
||||
goto InvalidSignal;
|
||||
}//if
|
||||
break;
|
||||
}
|
||||
|
@ -702,7 +702,7 @@ Ndb::handleReceivedSignal(NdbApiSignal* aSignal, LinearSectionPtr ptr[3])
|
|||
tDataPtr + ScanTabConf::SignalLength,
|
||||
tLen - ScanTabConf::SignalLength);
|
||||
}
|
||||
if (tReturnCode != -1)
|
||||
if (tReturnCode != -1 && tWaitState == WAIT_SCAN)
|
||||
theWaiter.m_state = NO_WAIT;
|
||||
break;
|
||||
} else {
|
||||
|
|
|
@ -794,3 +794,39 @@ max-time: 300
|
|||
cmd: testBlobs
|
||||
args:
|
||||
|
||||
max-time: 2500
|
||||
cmd: testOIBasic
|
||||
args:
|
||||
|
||||
#
|
||||
#
|
||||
# SYSTEM RESTARTS
|
||||
#
|
||||
max-time: 1500
|
||||
cmd: testSystemRestart
|
||||
args: -n SR1 T1
|
||||
|
||||
max-time: 1500
|
||||
cmd: testSystemRestart
|
||||
args: -n SR1 T6
|
||||
|
||||
max-time: 1500
|
||||
cmd: testSystemRestart
|
||||
args: -n SR1 T7
|
||||
|
||||
max-time: 1500
|
||||
cmd: testSystemRestart
|
||||
args: -n SR1 T8
|
||||
|
||||
max-time: 1500
|
||||
cmd: testSystemRestart
|
||||
args: -n SR2 T1
|
||||
|
||||
max-time: 1500
|
||||
cmd: testSystemRestart
|
||||
args: -n SR2 T6
|
||||
|
||||
max-time: 1500
|
||||
cmd: testSystemRestart
|
||||
args: -n SR2 T7
|
||||
|
||||
|
|
|
@ -37,34 +37,6 @@ args: -n SingleUserMode T1
|
|||
#
|
||||
# SYSTEM RESTARTS
|
||||
#
|
||||
max-time: 1500
|
||||
cmd: testSystemRestart
|
||||
args: -n SR1 T1
|
||||
|
||||
max-time: 1500
|
||||
cmd: testSystemRestart
|
||||
args: -n SR1 T6
|
||||
|
||||
max-time: 1500
|
||||
cmd: testSystemRestart
|
||||
args: -n SR1 T7
|
||||
|
||||
max-time: 1500
|
||||
cmd: testSystemRestart
|
||||
args: -n SR1 T8
|
||||
|
||||
max-time: 1500
|
||||
cmd: testSystemRestart
|
||||
args: -n SR2 T1
|
||||
|
||||
max-time: 1500
|
||||
cmd: testSystemRestart
|
||||
args: -n SR2 T6
|
||||
|
||||
max-time: 1500
|
||||
cmd: testSystemRestart
|
||||
args: -n SR2 T7
|
||||
|
||||
max-time: 1500
|
||||
cmd: testSystemRestart
|
||||
args: -n SR_UNDO T1
|
||||
|
@ -230,7 +202,3 @@ max-time: 2500
|
|||
cmd: test_event
|
||||
args: -n BasicEventOperation T1 T6
|
||||
|
||||
max-time: 2500
|
||||
cmd: testOIBasic
|
||||
args:
|
||||
|
||||
|
|
|
@ -159,11 +159,11 @@ s_echo()
|
|||
fi
|
||||
}
|
||||
|
||||
s_echo "This scripts updates all the mysql privilege tables to be usable by"
|
||||
s_echo "This script updates all the mysql privilege tables to be usable by"
|
||||
s_echo "MySQL 4.0 and above."
|
||||
s_echo ""
|
||||
s_echo "This is needed if you want to use the new GRANT functions,"
|
||||
s_echo "CREATE AGGREGATE FUNCTION or want to use the more secure passwords in 4.1"
|
||||
s_echo "CREATE AGGREGATE FUNCTION, or the more secure passwords in 4.1"
|
||||
s_echo ""
|
||||
|
||||
if test $verbose = 1
|
||||
|
|
|
@ -8,6 +8,7 @@ use File::Path;
|
|||
use DBI;
|
||||
use Sys::Hostname;
|
||||
use File::Copy;
|
||||
use File::Temp;
|
||||
|
||||
=head1 NAME
|
||||
|
||||
|
@ -626,7 +627,6 @@ sub copy_files {
|
|||
sub copy_index
|
||||
{
|
||||
my ($method, $files, $source, $target) = @_;
|
||||
my $tmpfile="$opt_tmpdir/mysqlhotcopy$$";
|
||||
|
||||
print "Copying indices for ".@$files." files...\n" unless $opt{quiet};
|
||||
foreach my $file (@$files)
|
||||
|
@ -635,6 +635,7 @@ sub copy_index
|
|||
my $to="$target/$file";
|
||||
my $buff;
|
||||
open(INPUT, "<$from") || die "Can't open file $from: $!\n";
|
||||
binmode(INPUT, ":raw");
|
||||
my $length=read INPUT, $buff, 2048;
|
||||
die "Can't read index header from $from\n" if ($length < 1024);
|
||||
close INPUT;
|
||||
|
@ -652,23 +653,23 @@ sub copy_index
|
|||
}
|
||||
close OUTPUT || die "Error on close of $to: $!\n";
|
||||
}
|
||||
elsif ($opt{method} eq 'scp')
|
||||
elsif ($opt{method} =~ /^scp\b/)
|
||||
{
|
||||
my $tmp=$tmpfile;
|
||||
open(OUTPUT,">$tmp") || die "Can\'t create file $tmp: $!\n";
|
||||
if (syswrite(OUTPUT,$buff) != length($buff))
|
||||
my ($fh, $tmp)=tempfile('mysqlhotcopy-XXXXXX', DIR => $opt_tmpdir);
|
||||
die "Can\'t create/open file in $opt_tmpdir\n";
|
||||
if (syswrite($fh,$buff) != length($buff))
|
||||
{
|
||||
die "Error when writing data to $tmp: $!\n";
|
||||
}
|
||||
close OUTPUT || die "Error on close of $tmp: $!\n";
|
||||
safe_system("scp $tmp $to");
|
||||
close $fh || die "Error on close of $tmp: $!\n";
|
||||
safe_system("$opt{method} $tmp $to");
|
||||
unlink $tmp;
|
||||
}
|
||||
else
|
||||
{
|
||||
die "Can't use unsupported method '$opt{method}'\n";
|
||||
}
|
||||
}
|
||||
unlink "$tmpfile" if ($opt{method} eq 'scp');
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -188,9 +188,9 @@ static int free_share(ARCHIVE_SHARE *share)
|
|||
hash_delete(&archive_open_tables, (byte*) share);
|
||||
thr_lock_delete(&share->lock);
|
||||
pthread_mutex_destroy(&share->mutex);
|
||||
my_free((gptr) share, MYF(0));
|
||||
if (gzclose(share->archive_write) == Z_ERRNO)
|
||||
rc= -1;
|
||||
my_free((gptr) share, MYF(0));
|
||||
}
|
||||
pthread_mutex_unlock(&archive_mutex);
|
||||
|
||||
|
|
|
@ -72,7 +72,7 @@ public:
|
|||
return (HA_REC_NOT_IN_SEQ | HA_NOT_EXACT_COUNT | HA_NO_AUTO_INCREMENT |
|
||||
HA_FILE_BASED);
|
||||
}
|
||||
ulong index_flags(uint idx, uint part) const
|
||||
ulong index_flags(uint idx, uint part, bool all_parts) const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -69,12 +69,16 @@ public:
|
|||
return 0;
|
||||
}
|
||||
/*
|
||||
This is a list of flags that says how the storage engine
|
||||
This is a bitmap of flags that says how the storage engine
|
||||
implements indexes. The current index flags are documented in
|
||||
handler.h. If you do not implement indexes, just return zero
|
||||
here.
|
||||
|
||||
part is the key part to check. First key part is 0
|
||||
If all_parts it's set, MySQL want to know the flags for the combined
|
||||
index up to and including 'part'.
|
||||
*/
|
||||
ulong index_flags(uint inx, uint part) const
|
||||
ulong index_flags(uint inx, uint part, bool all_parts) const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -431,9 +431,9 @@ void Field::store_time(TIME *ltime,timestamp_type type)
|
|||
}
|
||||
|
||||
|
||||
bool Field::optimize_range(uint idx)
|
||||
bool Field::optimize_range(uint idx, uint part)
|
||||
{
|
||||
return test(table->file->index_flags(idx) & HA_READ_RANGE);
|
||||
return test(table->file->index_flags(idx, part, 1) & HA_READ_RANGE);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
|
|
@ -178,7 +178,7 @@ public:
|
|||
inline bool real_maybe_null(void) { return null_ptr != 0; }
|
||||
virtual void make_field(Send_field *)=0;
|
||||
virtual void sort_string(char *buff,uint length)=0;
|
||||
virtual bool optimize_range(uint idx);
|
||||
virtual bool optimize_range(uint idx, uint part);
|
||||
virtual bool store_for_compare() { return 0; }
|
||||
virtual void free() {}
|
||||
Field *new_field(MEM_ROOT *root, struct st_table *new_table)
|
||||
|
@ -1134,7 +1134,7 @@ public:
|
|||
uint size_of() const { return sizeof(*this); }
|
||||
enum_field_types real_type() const { return FIELD_TYPE_ENUM; }
|
||||
virtual bool zero_pack() const { return 0; }
|
||||
bool optimize_range(uint idx) { return 0; }
|
||||
bool optimize_range(uint idx, uint part) { return 0; }
|
||||
bool eq_def(Field *field);
|
||||
bool has_charset(void) const { return TRUE; }
|
||||
field_cast_enum field_cast_type() { return FIELD_CAST_ENUM; }
|
||||
|
|
|
@ -340,6 +340,35 @@ const char **ha_berkeley::bas_ext() const
|
|||
{ static const char *ext[]= { ha_berkeley_ext, NullS }; return ext; }
|
||||
|
||||
|
||||
ulong ha_berkeley::index_flags(uint idx, uint part, bool all_parts) const
|
||||
{
|
||||
ulong flags= (HA_READ_NEXT | HA_READ_PREV | HA_READ_ORDER | HA_KEYREAD_ONLY
|
||||
| HA_READ_RANGE);
|
||||
for (uint i= all_parts ? 0 : part ; i <= part ; i++)
|
||||
{
|
||||
if (table->key_info[idx].key_part[i].field->type() == FIELD_TYPE_BLOB)
|
||||
{
|
||||
/* We can't use BLOBS to shortcut sorts */
|
||||
flags&= ~(HA_READ_ORDER | HA_KEYREAD_ONLY | HA_READ_RANGE);
|
||||
break;
|
||||
}
|
||||
switch (table->key_info[idx].key_part[i].field->key_type()) {
|
||||
case HA_KEYTYPE_TEXT:
|
||||
case HA_KEYTYPE_VARTEXT:
|
||||
/*
|
||||
As BDB stores only one copy of equal strings, we can't use key read
|
||||
on these
|
||||
*/
|
||||
flags&= ~HA_KEYREAD_ONLY;
|
||||
break;
|
||||
default: // Keep compiler happy
|
||||
break;
|
||||
}
|
||||
}
|
||||
return flags;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
berkeley_cmp_hidden_key(DB* file, const DBT *new_key, const DBT *saved_key)
|
||||
{
|
||||
|
|
|
@ -94,13 +94,7 @@ class ha_berkeley: public handler
|
|||
changed_rows(0),last_dup_key((uint) -1),version(0),using_ignore(0) {}
|
||||
~ha_berkeley() {}
|
||||
const char *table_type() const { return "BerkeleyDB"; }
|
||||
ulong index_flags(uint idx, uint part) const
|
||||
{
|
||||
ulong flags=HA_READ_NEXT | HA_READ_PREV;
|
||||
if (table->key_info[idx].key_part[part].field->key_type() != HA_KEYTYPE_TEXT)
|
||||
flags|= HA_READ_ORDER | HA_KEYREAD_ONLY | HA_READ_RANGE;
|
||||
return flags;
|
||||
}
|
||||
ulong index_flags(uint idx, uint part, bool all_parts) const;
|
||||
const char *index_type(uint key_number) { return "BTREE"; }
|
||||
const char **bas_ext() const;
|
||||
ulong table_flags(void) const { return int_table_flags; }
|
||||
|
|
|
@ -44,7 +44,7 @@ class ha_heap: public handler
|
|||
HA_REC_NOT_IN_SEQ | HA_READ_RND_SAME |
|
||||
HA_CAN_INSERT_DELAYED);
|
||||
}
|
||||
ulong index_flags(uint inx, uint part) const
|
||||
ulong index_flags(uint inx, uint part, bool all_parts) const
|
||||
{
|
||||
return ((table->key_info[inx].algorithm == HA_KEY_ALG_BTREE) ?
|
||||
HA_READ_NEXT | HA_READ_PREV | HA_READ_ORDER | HA_READ_RANGE :
|
||||
|
|
|
@ -94,7 +94,7 @@ class ha_innobase: public handler
|
|||
const char *index_type(uint key_number) { return "BTREE"; }
|
||||
const char** bas_ext() const;
|
||||
ulong table_flags() const { return int_table_flags; }
|
||||
ulong index_flags(uint idx, uint part) const
|
||||
ulong index_flags(uint idx, uint part, bool all_parts) const
|
||||
{
|
||||
return (HA_READ_NEXT | HA_READ_PREV | HA_READ_ORDER | HA_READ_RANGE |
|
||||
HA_KEYREAD_ONLY);
|
||||
|
|
|
@ -36,7 +36,7 @@ class ha_isam: public handler
|
|||
HA_DUPP_POS | HA_NOT_DELETE_WITH_CACHE | HA_FILE_BASED)
|
||||
{}
|
||||
~ha_isam() {}
|
||||
ulong index_flags(uint idx, uint part) const
|
||||
ulong index_flags(uint idx, uint part, bool all_parts) const
|
||||
{ return HA_READ_NEXT; } // but no HA_READ_PREV here!!!
|
||||
const char *table_type() const { return "ISAM"; }
|
||||
const char *index_type(uint key_number) { return "BTREE"; }
|
||||
|
|
|
@ -34,7 +34,8 @@ class ha_isammrg: public handler
|
|||
const char **bas_ext() const;
|
||||
ulong table_flags() const { return (HA_READ_RND_SAME |
|
||||
HA_REC_NOT_IN_SEQ | HA_FILE_BASED); }
|
||||
ulong index_flags(uint idx, uint part) const { DBUG_ASSERT(0); return 0; }
|
||||
ulong index_flags(uint idx, uint part, bool all_parts) const
|
||||
{ DBUG_ASSERT(0); return 0; }
|
||||
|
||||
uint max_supported_keys() const { return 0; }
|
||||
bool low_byte_first() const { return 0; }
|
||||
|
|
|
@ -336,7 +336,7 @@ int ha_myisam::check(THD* thd, HA_CHECK_OPT* check_opt)
|
|||
HA_STATUS_CONST);
|
||||
}
|
||||
}
|
||||
else if (!mi_is_crashed(file))
|
||||
else if (!mi_is_crashed(file) && !thd->killed)
|
||||
{
|
||||
mi_mark_crashed(file);
|
||||
file->update |= HA_STATE_CHANGED | HA_STATE_ROW_CHANGED;
|
||||
|
@ -378,7 +378,7 @@ int ha_myisam::analyze(THD *thd, HA_CHECK_OPT* check_opt)
|
|||
error=update_state_info(¶m,file,UPDATE_STAT);
|
||||
pthread_mutex_unlock(&share->intern_lock);
|
||||
}
|
||||
else if (!mi_is_crashed(file))
|
||||
else if (!mi_is_crashed(file) && !thd->killed)
|
||||
mi_mark_crashed(file);
|
||||
return error ? HA_ADMIN_CORRUPT : HA_ADMIN_OK;
|
||||
}
|
||||
|
|
|
@ -55,11 +55,11 @@ class ha_myisam: public handler
|
|||
const char *index_type(uint key_number);
|
||||
const char **bas_ext() const;
|
||||
ulong table_flags() const { return int_table_flags; }
|
||||
ulong index_flags(uint inx, uint part) const
|
||||
ulong index_flags(uint inx, uint part, bool all_parts) const
|
||||
{
|
||||
return ((table->key_info[inx].algorithm == HA_KEY_ALG_FULLTEXT) ?
|
||||
0 : HA_READ_NEXT | HA_READ_PREV | HA_READ_RANGE |
|
||||
HA_READ_ORDER | HA_KEYREAD_ONLY);
|
||||
0 : HA_READ_NEXT | HA_READ_PREV | HA_READ_RANGE |
|
||||
HA_READ_ORDER | HA_KEYREAD_ONLY);
|
||||
}
|
||||
uint max_supported_keys() const { return MI_MAX_KEY; }
|
||||
uint max_supported_key_length() const { return MI_MAX_KEY_LENGTH; }
|
||||
|
|
|
@ -38,11 +38,11 @@ class ha_myisammrg: public handler
|
|||
HA_NULL_IN_KEY | HA_CAN_INDEX_BLOBS | HA_FILE_BASED |
|
||||
HA_CAN_INSERT_DELAYED);
|
||||
}
|
||||
ulong index_flags(uint inx, uint part) const
|
||||
ulong index_flags(uint inx, uint part, bool all_parts) const
|
||||
{
|
||||
return ((table->key_info[inx].algorithm == HA_KEY_ALG_FULLTEXT) ?
|
||||
0 : HA_READ_NEXT | HA_READ_PREV | HA_READ_RANGE |
|
||||
HA_READ_ORDER | HA_KEYREAD_ONLY);
|
||||
0 : HA_READ_NEXT | HA_READ_PREV | HA_READ_RANGE |
|
||||
HA_READ_ORDER | HA_KEYREAD_ONLY);
|
||||
}
|
||||
uint max_supported_keys() const { return MI_MAX_KEY; }
|
||||
uint max_supported_key_length() const { return MI_MAX_KEY_LENGTH; }
|
||||
|
|
|
@ -524,7 +524,8 @@ inline NDB_INDEX_TYPE ha_ndbcluster::get_index_type(uint idx_no) const
|
|||
flags depending on the type of the index.
|
||||
*/
|
||||
|
||||
inline ulong ha_ndbcluster::index_flags(uint idx_no, uint part) const
|
||||
inline ulong ha_ndbcluster::index_flags(uint idx_no, uint part,
|
||||
bool all_parts) const
|
||||
{
|
||||
DBUG_ENTER("index_flags");
|
||||
DBUG_PRINT("info", ("idx_no: %d", idx_no));
|
||||
|
@ -1174,30 +1175,8 @@ int ha_ndbcluster::update_row(const byte *old_data, byte *new_data)
|
|||
/* Check for update of primary key and return error */
|
||||
if ((table->primary_key != MAX_KEY) &&
|
||||
(key_cmp(table->primary_key, old_data, new_data)))
|
||||
{
|
||||
DBUG_PRINT("info", ("primary key update, doing insert + delete"));
|
||||
int insert_res = write_row(new_data);
|
||||
if (!insert_res)
|
||||
{
|
||||
DBUG_PRINT("info", ("insert succeded"));
|
||||
int delete_res = delete_row(old_data);
|
||||
if (!delete_res)
|
||||
{
|
||||
DBUG_PRINT("info", ("insert + delete succeeded"));
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
DBUG_PRINT("info", ("delete failed"));
|
||||
DBUG_RETURN(delete_row(new_data));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DBUG_PRINT("info", ("insert failed"));
|
||||
DBUG_RETURN(insert_res);
|
||||
}
|
||||
}
|
||||
DBUG_RETURN(HA_ERR_UNSUPPORTED);
|
||||
|
||||
if (cursor)
|
||||
{
|
||||
/*
|
||||
|
@ -1650,8 +1629,10 @@ int ha_ndbcluster::rnd_init(bool scan)
|
|||
NdbResultSet *cursor= m_active_cursor;
|
||||
DBUG_ENTER("rnd_init");
|
||||
DBUG_PRINT("enter", ("scan: %d", scan));
|
||||
// Check that cursor is not defined
|
||||
if (cursor)
|
||||
// Check if scan is to be restarted
|
||||
if (cursor && scan)
|
||||
cursor->restart();
|
||||
else
|
||||
DBUG_RETURN(1);
|
||||
index_init(table->primary_key);
|
||||
DBUG_RETURN(0);
|
||||
|
|
|
@ -95,7 +95,7 @@ class ha_ndbcluster: public handler
|
|||
const char * table_type() const { return("ndbcluster");}
|
||||
const char ** bas_ext() const;
|
||||
ulong table_flags(void) const { return m_table_flags; }
|
||||
ulong index_flags(uint idx, uint part) const;
|
||||
ulong index_flags(uint idx, uint part, bool all_parts) const;
|
||||
uint max_supported_record_length() const { return NDB_MAX_TUPLE_SIZE; };
|
||||
uint max_supported_keys() const { return MAX_KEY; }
|
||||
uint max_supported_key_parts() const
|
||||
|
|
|
@ -449,7 +449,7 @@ public:
|
|||
virtual const char *table_type() const =0;
|
||||
virtual const char **bas_ext() const =0;
|
||||
virtual ulong table_flags(void) const =0;
|
||||
virtual ulong index_flags(uint idx, uint part=0) const =0;
|
||||
virtual ulong index_flags(uint idx, uint part, bool all_parts) const =0;
|
||||
virtual ulong index_ddl_flags(KEY *wanted_index) const
|
||||
{ return (HA_DDL_SUPPORT); }
|
||||
virtual int add_index(TABLE *table_arg, KEY *key_info, uint num_of_keys)
|
||||
|
|
|
@ -483,7 +483,14 @@ bool Item_in_optimizer::fix_left(THD *thd,
|
|||
return 1;
|
||||
|
||||
cache->setup(args[0]);
|
||||
cache->store(args[0]);
|
||||
/*
|
||||
If it is preparation PS only then we do not know values of parameters =>
|
||||
cant't get there values and do not need that values.
|
||||
|
||||
TODO: during merge with 5.0 it should be changed on !thd->only_prepare()
|
||||
*/
|
||||
if (!thd->current_statement)
|
||||
cache->store(args[0]);
|
||||
if (cache->cols() == 1)
|
||||
{
|
||||
if ((used_tables_cache= args[0]->used_tables()))
|
||||
|
|
|
@ -2294,40 +2294,49 @@ inline int hexchar_to_int(char c)
|
|||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/* Convert given hex string to a binary string */
|
||||
|
||||
String *Item_func_unhex::val_str(String *str)
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
/* Convert given hex string to a binary string */
|
||||
String *res= args[0]->val_str(str);
|
||||
const char *from=res->ptr(), *end;
|
||||
const char *from, *end;
|
||||
char *to;
|
||||
int r;
|
||||
if (!res || tmp_value.alloc((1+res->length())/2))
|
||||
String *res;
|
||||
uint length;
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
|
||||
res= args[0]->val_str(str);
|
||||
if (!res || tmp_value.alloc(length= (1+res->length())/2))
|
||||
{
|
||||
null_value=1;
|
||||
return 0;
|
||||
}
|
||||
null_value=0;
|
||||
tmp_value.length((1+res->length())/2);
|
||||
|
||||
from= res->ptr();
|
||||
null_value= 0;
|
||||
tmp_value.length(length);
|
||||
to= (char*) tmp_value.ptr();
|
||||
if (res->length() % 2)
|
||||
{
|
||||
*to++= r= hexchar_to_int(*from++);
|
||||
if ((null_value= (r == -1)))
|
||||
int hex_char;
|
||||
*to++= hex_char= hexchar_to_int(*from++);
|
||||
if ((null_value= (hex_char == -1)))
|
||||
return 0;
|
||||
}
|
||||
for (end=res->ptr()+res->length(); from < end ; from+=2, to++)
|
||||
{
|
||||
*to= (r= hexchar_to_int(from[0])) << 4;
|
||||
if ((null_value= (r == -1)))
|
||||
int hex_char;
|
||||
*to= (hex_char= hexchar_to_int(from[0])) << 4;
|
||||
if ((null_value= (hex_char == -1)))
|
||||
return 0;
|
||||
*to|= r= hexchar_to_int(from[1]);
|
||||
if ((null_value= (r == -1)))
|
||||
*to|= hex_char= hexchar_to_int(from[1]);
|
||||
if ((null_value= (hex_char == -1)))
|
||||
return 0;
|
||||
}
|
||||
return &tmp_value;
|
||||
}
|
||||
|
||||
|
||||
void Item_func_binary::print(String *str)
|
||||
{
|
||||
str->append("cast(", 5);
|
||||
|
|
|
@ -359,9 +359,10 @@ class Item_func_database :public Item_str_func
|
|||
public:
|
||||
Item_func_database() { collation.set(system_charset_info,DERIVATION_IMPLICIT); }
|
||||
String *val_str(String *);
|
||||
void fix_length_and_dec()
|
||||
{
|
||||
void fix_length_and_dec()
|
||||
{
|
||||
max_length= MAX_FIELD_NAME * system_charset_info->mbmaxlen;
|
||||
maybe_null=1;
|
||||
}
|
||||
const char *func_name() const { return "database"; }
|
||||
};
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
/*
|
||||
/*
|
||||
subselect Item
|
||||
|
||||
SUBSELECT TODO:
|
||||
|
@ -41,7 +41,7 @@ Item_subselect::Item_subselect():
|
|||
{
|
||||
reset();
|
||||
/*
|
||||
item value is NULL if select_subselect not changed this value
|
||||
item value is NULL if select_subselect not changed this value
|
||||
(i.e. some rows will be found returned)
|
||||
*/
|
||||
null_value= 1;
|
||||
|
@ -114,7 +114,7 @@ Item_subselect::~Item_subselect()
|
|||
}
|
||||
|
||||
Item_subselect::trans_res
|
||||
Item_subselect::select_transformer(JOIN *join)
|
||||
Item_subselect::select_transformer(JOIN *join)
|
||||
{
|
||||
DBUG_ENTER("Item_subselect::select_transformer");
|
||||
DBUG_RETURN(RES_OK);
|
||||
|
@ -128,7 +128,12 @@ bool Item_subselect::fix_fields(THD *thd_param, TABLE_LIST *tables, Item **ref)
|
|||
stmt= thd->current_statement;
|
||||
|
||||
char const *save_where= thd->where;
|
||||
int res= engine->prepare();
|
||||
int res;
|
||||
|
||||
if (check_stack_overrun(thd, (gptr)&res))
|
||||
return 1;
|
||||
|
||||
res= engine->prepare();
|
||||
|
||||
// all transformetion is done (used by prepared statements)
|
||||
changed= 1;
|
||||
|
@ -148,11 +153,11 @@ bool Item_subselect::fix_fields(THD *thd_param, TABLE_LIST *tables, Item **ref)
|
|||
if (have_to_be_excluded)
|
||||
engine->exclude();
|
||||
substitution= 0;
|
||||
thd->where= "checking transformed subquery";
|
||||
thd->where= "checking transformed subquery";
|
||||
if (!(*ref)->fixed)
|
||||
ret= (*ref)->fix_fields(thd, tables, ref);
|
||||
// We can't substitute aggregate functions (like (SELECT (max(i)))
|
||||
if ((*ref)->with_sum_func)
|
||||
// We can't substitute aggregate functions like "SELECT (max(i))"
|
||||
if (substype() == SINGLEROW_SUBS && (*ref)->with_sum_func)
|
||||
{
|
||||
my_error(ER_INVALID_GROUP_FUNC_USE, MYF(0));
|
||||
return 1;
|
||||
|
@ -161,7 +166,7 @@ bool Item_subselect::fix_fields(THD *thd_param, TABLE_LIST *tables, Item **ref)
|
|||
}
|
||||
// Is it one field subselect?
|
||||
if (engine->cols() > max_columns)
|
||||
{
|
||||
{
|
||||
my_error(ER_OPERAND_COLUMNS, MYF(0), 1);
|
||||
return 1;
|
||||
}
|
||||
|
@ -199,7 +204,7 @@ bool Item_subselect::exec()
|
|||
return (res);
|
||||
}
|
||||
|
||||
Item::Type Item_subselect::type() const
|
||||
Item::Type Item_subselect::type() const
|
||||
{
|
||||
return SUBSELECT_ITEM;
|
||||
}
|
||||
|
@ -277,7 +282,7 @@ Item_maxmin_subselect::Item_maxmin_subselect(Item_subselect *parent,
|
|||
*/
|
||||
used_tables_cache= parent->get_used_tables_cache();
|
||||
const_item_cache= parent->get_const_item_cache();
|
||||
|
||||
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
@ -299,7 +304,7 @@ Item_singlerow_subselect::select_transformer(JOIN *join)
|
|||
{
|
||||
if (changed)
|
||||
return RES_OK;
|
||||
|
||||
|
||||
SELECT_LEX *select_lex= join->select_lex;
|
||||
Statement backup;
|
||||
|
||||
|
@ -314,10 +319,10 @@ Item_singlerow_subselect::select_transformer(JOIN *join)
|
|||
TODO: solve above problem
|
||||
*/
|
||||
!(select_lex->item_list.head()->type() == FIELD_ITEM ||
|
||||
select_lex->item_list.head()->type() == REF_ITEM)
|
||||
select_lex->item_list.head()->type() == REF_ITEM)
|
||||
)
|
||||
{
|
||||
|
||||
|
||||
have_to_be_excluded= 1;
|
||||
if (join->thd->lex->describe)
|
||||
{
|
||||
|
@ -355,7 +360,7 @@ Item_singlerow_subselect::select_transformer(JOIN *join)
|
|||
return RES_REDUCE;
|
||||
}
|
||||
return RES_OK;
|
||||
|
||||
|
||||
err:
|
||||
if (stmt)
|
||||
thd->restore_backup_item_arena(stmt, &backup);
|
||||
|
@ -418,7 +423,7 @@ void Item_singlerow_subselect::bring_value()
|
|||
exec();
|
||||
}
|
||||
|
||||
double Item_singlerow_subselect::val()
|
||||
double Item_singlerow_subselect::val()
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
if (!exec() && !value->null_value)
|
||||
|
@ -433,7 +438,7 @@ double Item_singlerow_subselect::val()
|
|||
}
|
||||
}
|
||||
|
||||
longlong Item_singlerow_subselect::val_int()
|
||||
longlong Item_singlerow_subselect::val_int()
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
if (!exec() && !value->null_value)
|
||||
|
@ -448,7 +453,7 @@ longlong Item_singlerow_subselect::val_int()
|
|||
}
|
||||
}
|
||||
|
||||
String *Item_singlerow_subselect::val_str (String *str)
|
||||
String *Item_singlerow_subselect::val_str (String *str)
|
||||
{
|
||||
if (!exec() && !value->null_value)
|
||||
{
|
||||
|
@ -553,7 +558,7 @@ double Item_exists_subselect::val()
|
|||
return (double) value;
|
||||
}
|
||||
|
||||
longlong Item_exists_subselect::val_int()
|
||||
longlong Item_exists_subselect::val_int()
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
if (exec())
|
||||
|
@ -590,7 +595,7 @@ double Item_in_subselect::val()
|
|||
return (double) value;
|
||||
}
|
||||
|
||||
longlong Item_in_subselect::val_int()
|
||||
longlong Item_in_subselect::val_int()
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
if (exec())
|
||||
|
@ -842,7 +847,7 @@ Item_in_subselect::single_value_transformer(JOIN *join,
|
|||
{
|
||||
// it is single select without tables => possible optimization
|
||||
item= func->create(left_expr, item);
|
||||
// fix_field of item will be done in time of substituting
|
||||
// fix_field of item will be done in time of substituting
|
||||
substitution= item;
|
||||
have_to_be_excluded= 1;
|
||||
if (thd->lex->describe)
|
||||
|
@ -885,7 +890,7 @@ Item_in_subselect::row_value_transformer(JOIN *join)
|
|||
|
||||
thd->where= "row IN/ALL/ANY subquery";
|
||||
if (stmt)
|
||||
thd->set_n_backup_item_arena(stmt, &backup);
|
||||
thd->set_n_backup_item_arena(stmt, &backup);
|
||||
|
||||
SELECT_LEX *select_lex= join->select_lex;
|
||||
|
||||
|
@ -926,7 +931,7 @@ Item_in_subselect::row_value_transformer(JOIN *join)
|
|||
List_iterator_fast<Item> li(select_lex->item_list);
|
||||
for (uint i= 0; i < n; i++)
|
||||
{
|
||||
Item *func= new Item_ref_null_helper(this,
|
||||
Item *func= new Item_ref_null_helper(this,
|
||||
select_lex->ref_pointer_array+i,
|
||||
(char *) "<no matter>",
|
||||
(char *) "<list ref>");
|
||||
|
@ -1108,7 +1113,7 @@ int subselect_single_select_engine::prepare()
|
|||
(ORDER*) select_lex->order_list.first,
|
||||
(ORDER*) select_lex->group_list.first,
|
||||
select_lex->having,
|
||||
(ORDER*) 0, select_lex,
|
||||
(ORDER*) 0, select_lex,
|
||||
select_lex->master_unit()))
|
||||
return 1;
|
||||
thd->lex->current_select= save_select;
|
||||
|
|
|
@ -47,7 +47,7 @@ protected:
|
|||
/* old engine if engine was changed */
|
||||
subselect_engine *old_engine;
|
||||
/* cache of used external tables */
|
||||
table_map used_tables_cache;
|
||||
table_map used_tables_cache;
|
||||
/* allowed number of columns (1 for single value subqueries) */
|
||||
uint max_columns;
|
||||
/* work with 'substitution' */
|
||||
|
@ -69,17 +69,17 @@ public:
|
|||
|
||||
virtual subs_type substype() { return UNKNOWN_SUBS; }
|
||||
|
||||
/*
|
||||
/*
|
||||
We need this method, because some compilers do not allow 'this'
|
||||
pointer in constructor initialization list, but we need pass pointer
|
||||
to subselect Item class to select_subselect classes constructor.
|
||||
*/
|
||||
virtual void init (st_select_lex *select_lex,
|
||||
virtual void init (st_select_lex *select_lex,
|
||||
select_subselect *result);
|
||||
|
||||
~Item_subselect();
|
||||
void cleanup();
|
||||
virtual void reset()
|
||||
virtual void reset()
|
||||
{
|
||||
null_value= 1;
|
||||
}
|
||||
|
@ -275,7 +275,7 @@ public:
|
|||
}
|
||||
virtual ~subselect_engine() {}; // to satisfy compiler
|
||||
virtual void cleanup()= 0;
|
||||
|
||||
|
||||
// set_thd should be called before prepare()
|
||||
void set_thd(THD *thd_arg) { thd= thd_arg; }
|
||||
THD * get_thd() { return thd; }
|
||||
|
|
|
@ -2046,10 +2046,8 @@ bool flush_error_log()
|
|||
bool MYSQL_LOG::cut_spurious_tail()
|
||||
{
|
||||
int error= 0;
|
||||
char llbuf1[22], llbuf2[22];
|
||||
ulonglong actual_size;
|
||||
|
||||
DBUG_ENTER("cut_spurious_tail");
|
||||
|
||||
#ifdef HAVE_INNOBASE_DB
|
||||
if (have_innodb != SHOW_OPTION_YES)
|
||||
DBUG_RETURN(0);
|
||||
|
@ -2059,6 +2057,9 @@ bool MYSQL_LOG::cut_spurious_tail()
|
|||
*/
|
||||
char *name= ha_innobase::get_mysql_bin_log_name();
|
||||
ulonglong pos= ha_innobase::get_mysql_bin_log_pos();
|
||||
ulonglong actual_size;
|
||||
char llbuf1[22], llbuf2[22];
|
||||
|
||||
if (name[0] == 0 || pos == ULONGLONG_MAX)
|
||||
{
|
||||
DBUG_PRINT("info", ("InnoDB has not set binlog info"));
|
||||
|
|
|
@ -1696,9 +1696,9 @@ void Load_log_event::set_fields(List<Item> &field_list)
|
|||
int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
|
||||
bool use_rli_only_for_errors)
|
||||
{
|
||||
char *load_data_query= 0;
|
||||
thd->db= (char*) rewrite_db(db);
|
||||
DBUG_ASSERT(thd->query == 0);
|
||||
thd->query= 0; // Should not be needed
|
||||
thd->query_length= 0; // Should not be needed
|
||||
thd->query_error= 0;
|
||||
clear_all_errors(thd, rli);
|
||||
|
@ -1749,6 +1749,19 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
|
|||
{
|
||||
char llbuff[22];
|
||||
enum enum_duplicates handle_dup;
|
||||
/*
|
||||
Make a simplified LOAD DATA INFILE query, for the information of the
|
||||
user in SHOW PROCESSLIST. Note that db is known in the 'db' column.
|
||||
*/
|
||||
if ((load_data_query= (char *) my_alloca(18 + strlen(fname) + 14 +
|
||||
strlen(tables.real_name) + 8)))
|
||||
{
|
||||
thd->query_length= (uint)(strxmov(load_data_query,
|
||||
"LOAD DATA INFILE '", fname,
|
||||
"' INTO TABLE `", tables.real_name,
|
||||
"` <...>", NullS) - load_data_query);
|
||||
thd->query= load_data_query;
|
||||
}
|
||||
if (sql_ex.opt_flags & REPLACE_FLAG)
|
||||
handle_dup= DUP_REPLACE;
|
||||
else if (sql_ex.opt_flags & IGNORE_FLAG)
|
||||
|
@ -1830,8 +1843,14 @@ Slave: load data infile on table '%s' at log position %s in log \
|
|||
}
|
||||
|
||||
thd->net.vio = 0;
|
||||
thd->db= 0; // prevent db from being freed
|
||||
VOID(pthread_mutex_lock(&LOCK_thread_count));
|
||||
thd->db= 0;
|
||||
thd->query= 0;
|
||||
thd->query_length= 0;
|
||||
VOID(pthread_mutex_unlock(&LOCK_thread_count));
|
||||
close_thread_tables(thd);
|
||||
if (load_data_query)
|
||||
my_afree(load_data_query);
|
||||
if (thd->query_error)
|
||||
{
|
||||
/* this err/sql_errno code is copy-paste from send_error() */
|
||||
|
@ -2378,17 +2397,18 @@ void User_var_log_event::print(FILE* file, bool short_form, char* last_db)
|
|||
> the string constant is still unescaped according to SJIS, not
|
||||
> according to UCS2.
|
||||
*/
|
||||
char *p, *q;
|
||||
if (!(p= (char *)my_alloca(2*val_len+1+2))) // 2 hex digits per byte
|
||||
char *hex_str;
|
||||
CHARSET_INFO *cs;
|
||||
|
||||
if (!(hex_str= (char *)my_alloca(2*val_len+1+2))) // 2 hex digits / byte
|
||||
break; // no error, as we are 'void'
|
||||
str_to_hex(p, val, val_len);
|
||||
str_to_hex(hex_str, val, val_len);
|
||||
/*
|
||||
For proper behaviour when mysqlbinlog|mysql, we need to explicitely
|
||||
specify the variable's collation. It will however cause problems when
|
||||
people want to mysqlbinlog|mysql into another server not supporting the
|
||||
character set. But there's not much to do about this and it's unlikely.
|
||||
*/
|
||||
CHARSET_INFO *cs;
|
||||
if (!(cs= get_charset(charset_number, MYF(0))))
|
||||
/*
|
||||
Generate an unusable command (=> syntax error) is probably the best
|
||||
|
@ -2396,8 +2416,8 @@ void User_var_log_event::print(FILE* file, bool short_form, char* last_db)
|
|||
*/
|
||||
fprintf(file, ":=???;\n");
|
||||
else
|
||||
fprintf(file, ":=_%s %s COLLATE %s;\n", cs->csname, p, cs->name);
|
||||
my_afree(p);
|
||||
fprintf(file, ":=_%s %s COLLATE %s;\n", cs->csname, hex_str, cs->name);
|
||||
my_afree(hex_str);
|
||||
}
|
||||
break;
|
||||
case ROW_RESULT:
|
||||
|
@ -2845,7 +2865,7 @@ void Create_file_log_event::pack_info(Protocol *protocol)
|
|||
#if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
|
||||
int Create_file_log_event::exec_event(struct st_relay_log_info* rli)
|
||||
{
|
||||
char fname_buf[FN_REFLEN+10];
|
||||
char proc_info[17+FN_REFLEN+10], *fname_buf= proc_info+17;
|
||||
char *p;
|
||||
int fd = -1;
|
||||
IO_CACHE file;
|
||||
|
@ -2854,6 +2874,8 @@ int Create_file_log_event::exec_event(struct st_relay_log_info* rli)
|
|||
bzero((char*)&file, sizeof(file));
|
||||
p = slave_load_file_stem(fname_buf, file_id, server_id);
|
||||
strmov(p, ".info"); // strmov takes less code than memcpy
|
||||
strnmov(proc_info, "Making temp file ", 17); // no end 0
|
||||
thd->proc_info= proc_info;
|
||||
if ((fd = my_open(fname_buf, O_WRONLY|O_CREAT|O_BINARY|O_TRUNC,
|
||||
MYF(MY_WME))) < 0 ||
|
||||
init_io_cache(&file, fd, IO_SIZE, WRITE_CACHE, (my_off_t)0, 0,
|
||||
|
@ -2897,6 +2919,7 @@ err:
|
|||
end_io_cache(&file);
|
||||
if (fd >= 0)
|
||||
my_close(fd, MYF(0));
|
||||
thd->proc_info= 0;
|
||||
return error ? 1 : Log_event::exec_event(rli);
|
||||
}
|
||||
#endif /* defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT) */
|
||||
|
@ -2994,13 +3017,15 @@ void Append_block_log_event::pack_info(Protocol *protocol)
|
|||
#if defined( HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
|
||||
int Append_block_log_event::exec_event(struct st_relay_log_info* rli)
|
||||
{
|
||||
char fname[FN_REFLEN+10];
|
||||
char proc_info[17+FN_REFLEN+10], *fname= proc_info+17;
|
||||
char *p= slave_load_file_stem(fname, file_id, server_id);
|
||||
int fd;
|
||||
int error = 1;
|
||||
DBUG_ENTER("Append_block_log_event::exec_event");
|
||||
|
||||
memcpy(p, ".data", 6);
|
||||
strnmov(proc_info, "Making temp file ", 17); // no end 0
|
||||
thd->proc_info= proc_info;
|
||||
if ((fd = my_open(fname, O_WRONLY|O_APPEND|O_BINARY, MYF(MY_WME))) < 0)
|
||||
{
|
||||
slave_print_error(rli,my_errno, "Error in Append_block event: could not open file '%s'", fname);
|
||||
|
@ -3016,6 +3041,7 @@ int Append_block_log_event::exec_event(struct st_relay_log_info* rli)
|
|||
err:
|
||||
if (fd >= 0)
|
||||
my_close(fd, MYF(0));
|
||||
thd->proc_info= 0;
|
||||
DBUG_RETURN(error ? error : Log_event::exec_event(rli));
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -635,6 +635,8 @@ int mysqld_show_variables(THD *thd,const char *wild);
|
|||
int mysqld_show(THD *thd, const char *wild, show_var_st *variables,
|
||||
enum enum_var_type value_type,
|
||||
pthread_mutex_t *mutex);
|
||||
int mysql_find_files(THD *thd,List<char> *files, const char *db,
|
||||
const char *path, const char *wild, bool dir);
|
||||
int mysqld_show_charsets(THD *thd,const char *wild);
|
||||
int mysqld_show_collations(THD *thd,const char *wild);
|
||||
int mysqld_show_storage_engines(THD *thd);
|
||||
|
@ -801,6 +803,9 @@ bool is_keyword(const char *name, uint len);
|
|||
|
||||
#define MY_DB_OPT_FILE "db.opt"
|
||||
bool load_db_opt(THD *thd, const char *path, HA_CREATE_INFO *create);
|
||||
bool my_dbopt_init(void);
|
||||
void my_dbopt_cleanup(void);
|
||||
void my_dbopt_free(void);
|
||||
|
||||
/*
|
||||
External variables
|
||||
|
|
|
@ -885,6 +885,7 @@ extern "C" void unireg_abort(int exit_code)
|
|||
}
|
||||
#endif
|
||||
|
||||
|
||||
void clean_up(bool print_message)
|
||||
{
|
||||
DBUG_PRINT("exit",("clean_up"));
|
||||
|
@ -901,6 +902,7 @@ void clean_up(bool print_message)
|
|||
bitmap_free(&slave_error_mask);
|
||||
#endif
|
||||
my_tz_free();
|
||||
my_dbopt_free();
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
acl_free(1);
|
||||
grant_free();
|
||||
|
@ -1299,6 +1301,19 @@ void yyerror(const char *s)
|
|||
|
||||
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
/*
|
||||
Close a connection
|
||||
|
||||
SYNOPSIS
|
||||
close_connection()
|
||||
thd Thread handle
|
||||
errcode Error code to print to console
|
||||
lock 1 if we have have to lock LOCK_thread_count
|
||||
|
||||
NOTES
|
||||
For the connection that is doing shutdown, this is called twice
|
||||
*/
|
||||
|
||||
void close_connection(THD *thd, uint errcode, bool lock)
|
||||
{
|
||||
st_vio *vio;
|
||||
|
@ -2274,7 +2289,6 @@ static int init_common_variables(const char *conf_file_name, int argc,
|
|||
*/
|
||||
global_system_variables.time_zone= my_tz_SYSTEM;
|
||||
|
||||
|
||||
/*
|
||||
Init mutexes for the global MYSQL_LOG objects.
|
||||
As safe_mutex depends on what MY_INIT() does, we can't init the mutexes of
|
||||
|
@ -2381,6 +2395,9 @@ static int init_common_variables(const char *conf_file_name, int argc,
|
|||
|
||||
if (use_temp_pool && bitmap_init(&temp_pool,0,1024,1))
|
||||
return 1;
|
||||
if (my_dbopt_init())
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -4673,26 +4690,26 @@ replicating a LOAD DATA INFILE command.",
|
|||
"The size of the buffer used for index blocks for MyISAM tables. Increase this to get better index handling (for all reads and multiple writes) to as much as you can afford; 64M on a 256M machine that mainly runs MySQL is quite common.",
|
||||
(gptr*) &dflt_key_cache_var.param_buff_size,
|
||||
(gptr*) 0,
|
||||
0, (enum get_opt_var_type) (GET_ULL | GET_ASK_ADDR),
|
||||
0, (GET_ULL | GET_ASK_ADDR),
|
||||
REQUIRED_ARG, KEY_CACHE_SIZE, MALLOC_OVERHEAD, (long) ~0, MALLOC_OVERHEAD,
|
||||
IO_SIZE, 0},
|
||||
{"key_cache_block_size", OPT_KEY_CACHE_BLOCK_SIZE,
|
||||
"The default size of key cache blocks",
|
||||
(gptr*) &dflt_key_cache_var.param_block_size,
|
||||
(gptr*) 0,
|
||||
0, (enum get_opt_var_type) (GET_ULONG | GET_ASK_ADDR), REQUIRED_ARG,
|
||||
0, (GET_ULONG | GET_ASK_ADDR), REQUIRED_ARG,
|
||||
KEY_CACHE_BLOCK_SIZE , 512, 1024*16, MALLOC_OVERHEAD, 512, 0},
|
||||
{"key_cache_division_limit", OPT_KEY_CACHE_DIVISION_LIMIT,
|
||||
"The minimum percentage of warm blocks in key cache",
|
||||
(gptr*) &dflt_key_cache_var.param_division_limit,
|
||||
(gptr*) 0,
|
||||
0, (enum get_opt_var_type) (GET_ULONG | GET_ASK_ADDR) , REQUIRED_ARG, 100,
|
||||
0, (GET_ULONG | GET_ASK_ADDR) , REQUIRED_ARG, 100,
|
||||
1, 100, 0, 1, 0},
|
||||
{"key_cache_age_threshold", OPT_KEY_CACHE_AGE_THRESHOLD,
|
||||
"This characterizes the number of hits a hot block has to be untouched until it is considered aged enough to be downgraded to a warm block. This specifies the percentage ratio of that number of hits to the total number of blocks in key cache",
|
||||
(gptr*) &dflt_key_cache_var.param_age_threshold,
|
||||
(gptr*) 0,
|
||||
0, (enum get_opt_var_type) (GET_ULONG | GET_ASK_ADDR), REQUIRED_ARG,
|
||||
0, (GET_ULONG | GET_ASK_ADDR), REQUIRED_ARG,
|
||||
300, 100, ~0L, 0, 100, 0},
|
||||
{"long_query_time", OPT_LONG_QUERY_TIME,
|
||||
"Log all queries that have taken more than long_query_time seconds to execute to file.",
|
||||
|
|
|
@ -727,7 +727,8 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
|
|||
found_records=check_quick_select(¶m, idx, *key);
|
||||
if (found_records != HA_POS_ERROR && found_records > 2 &&
|
||||
head->used_keys.is_set(keynr) &&
|
||||
(head->file->index_flags(keynr) & HA_KEYREAD_ONLY))
|
||||
(head->file->index_flags(keynr, param.max_key_part, 1) &
|
||||
HA_KEYREAD_ONLY))
|
||||
{
|
||||
/*
|
||||
We can resolve this by only reading through this key.
|
||||
|
@ -1028,7 +1029,8 @@ get_mm_leaf(PARAM *param, COND *conf_func, Field *field, KEY_PART *key_part,
|
|||
String tmp(buff1,sizeof(buff1),value->collation.collation),*res;
|
||||
uint length,offset,min_length,max_length;
|
||||
|
||||
if (!field->optimize_range(param->real_keynr[key_part->key]))
|
||||
if (!field->optimize_range(param->real_keynr[key_part->key],
|
||||
key_part->part))
|
||||
DBUG_RETURN(0); // Can't optimize this
|
||||
if (!(res= value->val_str(&tmp)))
|
||||
DBUG_RETURN(&null_element);
|
||||
|
@ -1093,7 +1095,8 @@ get_mm_leaf(PARAM *param, COND *conf_func, Field *field, KEY_PART *key_part,
|
|||
DBUG_RETURN(new SEL_ARG(field,min_str,max_str));
|
||||
}
|
||||
|
||||
if (!field->optimize_range(param->real_keynr[key_part->key]) &&
|
||||
if (!field->optimize_range(param->real_keynr[key_part->key],
|
||||
key_part->part) &&
|
||||
type != Item_func::EQ_FUNC &&
|
||||
type != Item_func::EQUAL_FUNC)
|
||||
DBUG_RETURN(0); // Can't optimize this
|
||||
|
|
|
@ -645,7 +645,7 @@ static bool find_key_for_maxmin(bool max_fl, TABLE_REF *ref,
|
|||
part != part_end ;
|
||||
part++, jdx++, key_part_to_use= (key_part_to_use << 1) | 1)
|
||||
{
|
||||
if (!(table->file->index_flags(idx, jdx) & HA_READ_ORDER))
|
||||
if (!(table->file->index_flags(idx, jdx, 0) & HA_READ_ORDER))
|
||||
return 0;
|
||||
|
||||
if (field->eq(part->field))
|
||||
|
|
|
@ -802,6 +802,9 @@ struct show_var_st init_vars[]= {
|
|||
{sys_sync_binlog_period.name,(char*) &sys_sync_binlog_period, SHOW_SYS},
|
||||
#endif
|
||||
{sys_sync_frm.name, (char*) &sys_sync_frm, SHOW_SYS},
|
||||
#ifdef HAVE_TZNAME
|
||||
{"system_time_zone", system_time_zone, SHOW_CHAR},
|
||||
#endif
|
||||
{"table_cache", (char*) &table_cache_size, SHOW_LONG},
|
||||
{sys_table_type.name, (char*) &sys_table_type, SHOW_SYS},
|
||||
{sys_thread_cache_size.name,(char*) &sys_thread_cache_size, SHOW_SYS},
|
||||
|
@ -810,9 +813,6 @@ struct show_var_st init_vars[]= {
|
|||
#endif
|
||||
{"thread_stack", (char*) &thread_stack, SHOW_LONG},
|
||||
{sys_time_format.name, (char*) &sys_time_format, SHOW_SYS},
|
||||
#ifdef HAVE_TZNAME
|
||||
{"system_time_zone", system_time_zone, SHOW_CHAR},
|
||||
#endif
|
||||
{"time_zone", (char*) &sys_time_zone, SHOW_SYS},
|
||||
{sys_tmp_table_size.name, (char*) &sys_tmp_table_size, SHOW_SYS},
|
||||
{"tmpdir", (char*) &opt_mysql_tmpdir, SHOW_CHAR_PTR},
|
||||
|
@ -1744,10 +1744,10 @@ bool sys_var_collation::check(THD *thd, set_var *var)
|
|||
}
|
||||
else // INT_RESULT
|
||||
{
|
||||
if (!(tmp=get_charset(var->value->val_int(),MYF(0))))
|
||||
if (!(tmp=get_charset((int) var->value->val_int(),MYF(0))))
|
||||
{
|
||||
char buf[20];
|
||||
int10_to_str(var->value->val_int(), buf, -10);
|
||||
int10_to_str((int) var->value->val_int(), buf, -10);
|
||||
my_error(ER_UNKNOWN_COLLATION, MYF(0), buf);
|
||||
return 1;
|
||||
}
|
||||
|
@ -1783,10 +1783,10 @@ bool sys_var_character_set::check(THD *thd, set_var *var)
|
|||
}
|
||||
else // INT_RESULT
|
||||
{
|
||||
if (!(tmp=get_charset(var->value->val_int(),MYF(0))))
|
||||
if (!(tmp=get_charset((int) var->value->val_int(),MYF(0))))
|
||||
{
|
||||
char buf[20];
|
||||
int10_to_str(var->value->val_int(), buf, -10);
|
||||
int10_to_str((int) var->value->val_int(), buf, -10);
|
||||
my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), buf);
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -312,3 +312,4 @@ character-set=latin2
|
|||
"Got temporary error %d '%-.100s' from %s",
|
||||
"Unknown or incorrect time zone: '%-.64s'",
|
||||
"Invalid TIMESTAMP value in column '%s' at row %ld",
|
||||
"Invalid %s character string: '%.64s'",
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue