mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 13:02:28 +01:00
merge
This commit is contained in:
commit
ad07ffbf6d
153 changed files with 3394 additions and 2163 deletions
16
.bzrignore
16
.bzrignore
|
@ -23,6 +23,7 @@
|
|||
.vimrc
|
||||
50
|
||||
=6
|
||||
BUILD/compile-pentium-maintainer
|
||||
BitKeeper/etc/config
|
||||
BitKeeper/etc/csets
|
||||
BitKeeper/etc/csets-in
|
||||
|
@ -30,6 +31,8 @@ BitKeeper/etc/csets-out
|
|||
BitKeeper/etc/gone
|
||||
BitKeeper/etc/level
|
||||
BitKeeper/etc/pushed
|
||||
BitKeeper/post-commit
|
||||
BitKeeper/post-commit-manual
|
||||
BitKeeper/tmp/*
|
||||
BitKeeper/tmp/bkr3sAHD
|
||||
BitKeeper/tmp/gone
|
||||
|
@ -223,6 +226,7 @@ bkpull.log.5
|
|||
bkpull.log.6
|
||||
bkpush.log
|
||||
build.log
|
||||
build_tags.sh
|
||||
client/insert_test
|
||||
client/log_event.cc
|
||||
client/log_event.h
|
||||
|
@ -311,6 +315,8 @@ libmysql_r/conf_to_src
|
|||
libmysql_r/my_static.h
|
||||
libmysql_r/mysys_priv.h
|
||||
libmysqld/backup_dir
|
||||
libmysqld/client.c
|
||||
libmysqld/client_settings.h
|
||||
libmysqld/convert.cc
|
||||
libmysqld/derror.cc
|
||||
libmysqld/errmsg.c
|
||||
|
@ -355,6 +361,7 @@ libmysqld/item_sum.cc
|
|||
libmysqld/item_timefunc.cc
|
||||
libmysqld/item_uniq.cc
|
||||
libmysqld/key.cc
|
||||
libmysqld/libmysql.c
|
||||
libmysqld/lock.cc
|
||||
libmysqld/log.cc
|
||||
libmysqld/log_event.cc
|
||||
|
@ -366,6 +373,7 @@ libmysqld/net_serv.cc
|
|||
libmysqld/opt_ft.cc
|
||||
libmysqld/opt_range.cc
|
||||
libmysqld/opt_sum.cc
|
||||
libmysqld/pack.c
|
||||
libmysqld/password.c
|
||||
libmysqld/procedure.cc
|
||||
libmysqld/protocol.cc
|
||||
|
@ -473,6 +481,7 @@ mysql-test/r/rpl_log.eval
|
|||
mysql-test/r/slave-running.eval
|
||||
mysql-test/r/slave-stopped.eval
|
||||
mysql-test/share/mysql
|
||||
mysql-test/std_data/*.pem
|
||||
mysql-test/var/*
|
||||
mysql.kdevprj
|
||||
mysql.proj
|
||||
|
@ -482,6 +491,7 @@ mysys/#mf_iocache.c#
|
|||
mysys/charset2html
|
||||
mysys/getopt.c
|
||||
mysys/getopt1.c
|
||||
mysys/main.cc
|
||||
mysys/ste5KbMa
|
||||
mysys/test_charset
|
||||
mysys/test_dir
|
||||
|
@ -585,6 +595,7 @@ stamp-h1
|
|||
stamp-h2
|
||||
stamp-h3
|
||||
stamp-h4
|
||||
start_mysqld.sh
|
||||
strings/conf_to_src
|
||||
strings/ctype_autoconf.c
|
||||
strings/ctype_extra_sources.c
|
||||
|
@ -611,6 +622,7 @@ support-files/mysql.spec
|
|||
tags
|
||||
test_xml
|
||||
tests/client_test
|
||||
tests/connect_test
|
||||
thread_test
|
||||
tmp/*
|
||||
tools/my_vsnprintf.c
|
||||
|
@ -622,7 +634,3 @@ vio/test-ssl
|
|||
vio/test-sslclient
|
||||
vio/test-sslserver
|
||||
vio/viotest-ssl
|
||||
libmysqld/client.c
|
||||
libmysqld/client_settings.h
|
||||
libmysqld/libmysql.c
|
||||
libmysqld/pack.c
|
||||
|
|
|
@ -23,12 +23,16 @@ autoconf || (echo \"Can't execute autoconf\" && exit 1)
|
|||
if [ -d gemini ]
|
||||
then
|
||||
(cd gemini && aclocal && autoheader && aclocal && automake && autoconf)
|
||||
fi
|
||||
fi"
|
||||
|
||||
if [ -z "$just_clean" ]
|
||||
then
|
||||
commands="$commands
|
||||
CFLAGS=\"$cflags\" CXX=\"$CXX\" CXXFLAGS=\"$cxxflags\" CXXLDFLAGS=\"$CXXLDFLAGS\" \
|
||||
$configure"
|
||||
fi
|
||||
|
||||
if [ -z "$just_configure" ]
|
||||
if [ -z "$just_configure" -a -z "$just_clean" ]
|
||||
then
|
||||
commands="$commands
|
||||
|
||||
|
|
8
BUILD/cleanup
Executable file
8
BUILD/cleanup
Executable file
|
@ -0,0 +1,8 @@
|
|||
#! /bin/sh
|
||||
|
||||
path=`dirname $0`
|
||||
. "$path/SETUP.sh"
|
||||
|
||||
just_clean=1;
|
||||
|
||||
. "$path/FINISH.sh"
|
0
INSTALL-WIN-SOURCE
Executable file → Normal file
0
INSTALL-WIN-SOURCE
Executable file → Normal file
|
@ -769,9 +769,12 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
|
|||
return 1;
|
||||
}
|
||||
if (argv[1][0])
|
||||
make_scrambled_password(crypted_pw,argv[1],
|
||||
(find_type(argv[0], &command_typelib, 2) ==
|
||||
ADMIN_OLD_PASSWORD), &rand_st);
|
||||
{
|
||||
if (find_type(argv[0], &command_typelib, 2) == ADMIN_OLD_PASSWORD)
|
||||
make_scrambled_password_323(crypted_pw, argv[1]);
|
||||
else
|
||||
make_scrambled_password(crypted_pw, argv[1]);
|
||||
}
|
||||
else
|
||||
crypted_pw[0]=0; /* No password */
|
||||
sprintf(buff,"set password='%s',sql_log_off=0",crypted_pw);
|
||||
|
|
|
@ -1137,7 +1137,7 @@ static void dumpTable(uint numFields, char *table)
|
|||
safe_exit(EX_CONSCHECK);
|
||||
return;
|
||||
}
|
||||
if (extended_insert)
|
||||
if (extended_insert && !opt_xml)
|
||||
{
|
||||
ulong length = lengths[i];
|
||||
if (i == 0)
|
||||
|
@ -1222,7 +1222,7 @@ static void dumpTable(uint numFields, char *table)
|
|||
if (opt_xml)
|
||||
fprintf(md_result_file, "\t</row>\n");
|
||||
|
||||
if (extended_insert)
|
||||
if (extended_insert && !opt_xml)
|
||||
{
|
||||
ulong row_length;
|
||||
dynstr_append(&extended_row,")");
|
||||
|
@ -1404,7 +1404,7 @@ static int init_dumping(char *database)
|
|||
(opt_quoted ? "`" : ""));
|
||||
}
|
||||
}
|
||||
if (extended_insert)
|
||||
if (extended_insert && !opt_xml)
|
||||
if (init_dynamic_string(&extended_row, "", 1024, 1024))
|
||||
exit(EX_EOM);
|
||||
return 0;
|
||||
|
@ -1676,7 +1676,7 @@ int main(int argc, char **argv)
|
|||
if (md_result_file != stdout)
|
||||
my_fclose(md_result_file, MYF(0));
|
||||
my_free(opt_password, MYF(MY_ALLOW_ZERO_PTR));
|
||||
if (extended_insert)
|
||||
if (extended_insert & !opt_xml)
|
||||
dynstr_free(&extended_row);
|
||||
my_end(0);
|
||||
return(first_error);
|
||||
|
|
|
@ -86,3 +86,4 @@ extern const char *client_errors[]; /* Error messages */
|
|||
#define CR_SHARED_MEMORY_CONNECT_SET_ERROR 2045
|
||||
#define CR_CONN_UNKNOW_PROTOCOL 2046
|
||||
#define CR_INVALID_CONN_HANDLE 2047
|
||||
#define CR_MYSQL_SERVER_INIT_MISSED 2048
|
||||
|
|
|
@ -111,7 +111,6 @@ void pthread_exit(void *a); /* was #define pthread_exit(A) ExitThread(A)*/
|
|||
#endif
|
||||
#define pthread_self() win_pthread_self
|
||||
#define HAVE_LOCALTIME_R 1
|
||||
#define HAVE_GMTIME_R 1
|
||||
#define _REENTRANT 1
|
||||
#define HAVE_PTHREAD_ATTR_SETSTACKSIZE 1
|
||||
|
||||
|
|
|
@ -213,7 +213,7 @@ extern uint get_charset_number(const char *cs_name);
|
|||
extern const char *get_charset_name(uint cs_number);
|
||||
extern CHARSET_INFO *get_charset(uint cs_number, myf flags);
|
||||
extern CHARSET_INFO *get_charset_by_name(const char *cs_name, myf flags);
|
||||
extern CHARSET_INFO *get_charset_by_csname(const char *cs_name,
|
||||
extern CHARSET_INFO *get_charset_by_csname(const char *cs_name,
|
||||
uint cs_flags, myf my_flags);
|
||||
extern void free_charsets(void);
|
||||
extern char *get_charsets_dir(char *buf);
|
||||
|
@ -507,6 +507,8 @@ typedef struct st_keycache
|
|||
ulonglong size;
|
||||
} KEY_CACHE;
|
||||
|
||||
typedef uint32 ha_checksum;
|
||||
|
||||
#include <my_alloc.h>
|
||||
|
||||
/* Prototypes for mysys and my_func functions */
|
||||
|
@ -749,10 +751,11 @@ extern void print_defaults(const char *conf_file, const char **groups);
|
|||
extern my_bool my_compress(byte *, ulong *, ulong *);
|
||||
extern my_bool my_uncompress(byte *, ulong *, ulong *);
|
||||
extern byte *my_compress_alloc(const byte *packet, ulong *len, ulong *complen);
|
||||
extern ulong checksum(const byte *mem, uint count);
|
||||
extern ha_checksum my_checksum(ha_checksum crc, const byte *mem, uint count);
|
||||
extern uint my_bit_log2(ulong value);
|
||||
uint my_count_bits(ulonglong v);
|
||||
extern uint my_count_bits(ulonglong v);
|
||||
extern void my_sleep(ulong m_seconds);
|
||||
extern ulong crc32(ulong crc, const uchar *buf, uint len);
|
||||
|
||||
#ifdef __WIN__
|
||||
extern my_bool have_tcpip; /* Is set if tcpip is used */
|
||||
|
|
|
@ -53,8 +53,6 @@ extern "C" {
|
|||
|
||||
#define mi_portable_sizeof_char_ptr 8
|
||||
|
||||
typedef uint32 ha_checksum;
|
||||
|
||||
/* Param to/from mi_info */
|
||||
|
||||
typedef struct st_mi_isaminfo /* Struct from h_info */
|
||||
|
|
|
@ -229,7 +229,9 @@ typedef struct st_mysql
|
|||
enum mysql_status status;
|
||||
my_bool free_me; /* If free in mysql_close */
|
||||
my_bool reconnect; /* set to 1 if automatic reconnect */
|
||||
char scramble_buff[21]; /* New protocol requires longer scramble*/
|
||||
|
||||
/* session-wide random string */
|
||||
char scramble[SCRAMBLE_LENGTH+1];
|
||||
|
||||
/*
|
||||
Set if this is the original connection, not a master or a slave we have
|
||||
|
@ -541,16 +543,16 @@ typedef struct st_mysql_stmt
|
|||
|
||||
typedef struct st_mysql_methods
|
||||
{
|
||||
my_bool STDCALL (*read_query_result)(MYSQL *mysql);
|
||||
my_bool STDCALL (*advanced_command)(MYSQL *mysql,
|
||||
my_bool (STDCALL *read_query_result)(MYSQL *mysql);
|
||||
my_bool (STDCALL *advanced_command)(MYSQL *mysql,
|
||||
enum enum_server_command command,
|
||||
const char *header,
|
||||
unsigned long header_length,
|
||||
const char *arg,
|
||||
unsigned long arg_length, my_bool skip_check);
|
||||
MYSQL_RES * STDCALL (*store_result)(MYSQL *mysql);
|
||||
MYSQL_RES * STDCALL (*use_result)(MYSQL *mysql);
|
||||
void STDCALL (*fetch_lengths)(unsigned long *to, MYSQL_ROW column, uint field_count);
|
||||
MYSQL_RES * (STDCALL *store_result)(MYSQL *mysql);
|
||||
MYSQL_RES * (STDCALL *use_result)(MYSQL *mysql);
|
||||
void (STDCALL *fetch_lengths)(unsigned long *to, MYSQL_ROW column, uint field_count);
|
||||
} MYSQL_METHODS;
|
||||
|
||||
MYSQL_STMT * STDCALL mysql_prepare(MYSQL * mysql, const char *query,
|
||||
|
|
|
@ -49,8 +49,15 @@ enum enum_server_command
|
|||
};
|
||||
|
||||
|
||||
#define SCRAMBLE_LENGTH 8
|
||||
#define SCRAMBLE41_LENGTH 20
|
||||
/*
|
||||
Length of random string sent by server on handshake; this is also length of
|
||||
obfuscated password, recieved from client
|
||||
*/
|
||||
#define SCRAMBLE_LENGTH 20
|
||||
#define SCRAMBLE_LENGTH_323 8
|
||||
/* length of password stored in the db: new passwords are preceeded with '*' */
|
||||
#define SCRAMBLED_PASSWORD_CHAR_LENGTH (SCRAMBLE_LENGTH*2+1)
|
||||
#define SCRAMBLED_PASSWORD_CHAR_LENGTH_323 (SCRAMBLE_LENGTH_323*2)
|
||||
|
||||
|
||||
#define NOT_NULL_FLAG 1 /* Field can't be NULL */
|
||||
|
@ -302,31 +309,34 @@ extern "C" {
|
|||
extern unsigned long max_allowed_packet;
|
||||
extern unsigned long net_buffer_length;
|
||||
|
||||
void randominit(struct rand_struct *,unsigned long seed1,
|
||||
unsigned long seed2);
|
||||
/*
|
||||
These functions are used for authentication by client and server and
|
||||
implemented in sql/password.c
|
||||
*/
|
||||
|
||||
void randominit(struct rand_struct *, unsigned long seed1,
|
||||
unsigned long seed2);
|
||||
double my_rnd(struct rand_struct *);
|
||||
void make_scrambled_password(char *to,const char *password,
|
||||
my_bool force_old_scramble,struct rand_struct *rand_st);
|
||||
int get_password_length(my_bool force_old_scramble);
|
||||
char get_password_version(const char* password);
|
||||
void create_random_string(int length,struct rand_struct *rand_st,char* target);
|
||||
my_bool validate_password(const char* password, const char* message,
|
||||
unsigned long* salt);
|
||||
void password_hash_stage1(char *to, const char *password);
|
||||
void password_hash_stage2(char *to,const char *salt);
|
||||
void password_crypt(const char* from,char* to, const char* password,int length);
|
||||
void get_hash_and_password(unsigned long* salt, unsigned char pversion,char* hash,
|
||||
unsigned char* bin_password);
|
||||
void get_salt_from_password(unsigned long *res,const char *password);
|
||||
void create_key_from_old_password(const char* password,char* key);
|
||||
void make_password_from_salt(char *to, unsigned long *hash_res,
|
||||
unsigned char password_version);
|
||||
char *scramble(char *to,const char *message,const char *password,
|
||||
my_bool old_ver);
|
||||
my_bool check_scramble(const char *, const char *message,
|
||||
unsigned long *salt,my_bool old_ver);
|
||||
void create_random_string(char *to, uint length, struct rand_struct *rand_st);
|
||||
|
||||
void hash_password(unsigned long *to, const char *password, uint password_len);
|
||||
void make_scrambled_password_323(char *to, const char *password);
|
||||
void scramble_323(char *to, const char *message, const char *password);
|
||||
my_bool check_scramble_323(const char *, const char *message,
|
||||
unsigned long *salt);
|
||||
void get_salt_from_password_323(unsigned long *res, const char *password);
|
||||
void make_password_from_salt_323(char *to, const unsigned long *salt);
|
||||
|
||||
void make_scrambled_password(char *to, const char *password);
|
||||
void scramble(char *to, const char *message, const char *password);
|
||||
my_bool check_scramble(const char *reply, const char *message,
|
||||
const unsigned char *hash_stage2);
|
||||
void get_salt_from_password(unsigned char *res, const char *password);
|
||||
void make_password_from_salt(char *to, const unsigned char *hash_stage2);
|
||||
|
||||
/* end of password.c */
|
||||
|
||||
char *get_tty_password(char *opt_message);
|
||||
void hash_password(unsigned long *result, const char *password);
|
||||
const char *mysql_errno_to_sqlstate(unsigned int mysql_errno);
|
||||
|
||||
/* Some other useful functions */
|
||||
|
|
|
@ -289,5 +289,7 @@
|
|||
#define ER_CANT_AGGREGATE_NCOLLATIONS 1270
|
||||
#define ER_VARIABLE_IS_NOT_STRUCT 1271
|
||||
#define ER_UNKNOWN_COLLATION 1272
|
||||
#define ER_WARN_FIELD_RESOLVED 1273
|
||||
#define ER_ERROR_MESSAGES 274
|
||||
#define ER_SLAVE_IGNORED_SSL_PARAMS 1273
|
||||
#define ER_SERVER_IS_IN_SECURE_AUTH_MODE 1274
|
||||
#define ER_WARN_FIELD_RESOLVED 1275
|
||||
#define ER_ERROR_MESSAGES 276
|
||||
|
|
|
@ -100,7 +100,7 @@ typedef struct st_alarm {
|
|||
#define thr_alarm_init(A) (*(A))=0
|
||||
#define thr_alarm_in_use(A) (*(A)!= 0)
|
||||
void init_thr_alarm(uint max_alarm);
|
||||
bool thr_alarm(thr_alarm_t *alarmed, uint sec, ALARM *buff);
|
||||
my_bool thr_alarm(thr_alarm_t *alarmed, uint sec, ALARM *buff);
|
||||
void thr_alarm_kill(pthread_t thread_id);
|
||||
void thr_end_alarm(thr_alarm_t *alarmed);
|
||||
void end_thr_alarm(my_bool free_structures);
|
||||
|
|
|
@ -2170,7 +2170,7 @@ row_sel_store_mysql_rec(
|
|||
ulint len;
|
||||
byte* blob_buf;
|
||||
ulint i;
|
||||
|
||||
|
||||
ut_ad(prebuilt->mysql_template);
|
||||
|
||||
if (prebuilt->blob_heap != NULL) {
|
||||
|
@ -2178,9 +2178,9 @@ row_sel_store_mysql_rec(
|
|||
prebuilt->blob_heap = NULL;
|
||||
}
|
||||
|
||||
/* Mark all columns as not SQL NULL */
|
||||
/* Mark all columns as SQL NULL */
|
||||
|
||||
memset(mysql_rec, '\0', prebuilt->null_bitmap_len);
|
||||
memset(mysql_rec, 255, prebuilt->null_bitmap_len);
|
||||
|
||||
for (i = 0; i < prebuilt->n_template; i++) {
|
||||
|
||||
|
@ -2235,16 +2235,21 @@ row_sel_store_mysql_rec(
|
|||
|
||||
data = blob_buf;
|
||||
}
|
||||
|
||||
|
||||
row_sel_field_store_in_mysql_format(
|
||||
mysql_rec + templ->mysql_col_offset,
|
||||
templ->mysql_col_len, data, len,
|
||||
templ->type, templ->is_unsigned);
|
||||
|
||||
if (extern_field_heap) {
|
||||
mem_heap_free(extern_field_heap);
|
||||
mem_heap_free(extern_field_heap);
|
||||
extern_field_heap = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (templ->mysql_null_bit_mask) {
|
||||
mysql_rec[templ->mysql_null_byte_offset] &=
|
||||
~(byte) (templ->mysql_null_bit_mask);
|
||||
}
|
||||
} else {
|
||||
/* MySQL seems to assume the field for an SQL NULL
|
||||
value is set to zero. Not taking this into account
|
||||
|
@ -2252,19 +2257,13 @@ row_sel_store_mysql_rec(
|
|||
bug number 154 in the MySQL bug database: GROUP BY
|
||||
and DISTINCT could treat NULL values inequal. */
|
||||
|
||||
memset(mysql_rec + templ->mysql_col_offset, '\0',
|
||||
memset(mysql_rec + templ->mysql_col_offset,
|
||||
((templ->type == DATA_VARCHAR ||
|
||||
templ->type == DATA_VARMYSQL ||
|
||||
templ->type == DATA_BINARY) ? ' ' : '\0'),
|
||||
templ->mysql_col_len);
|
||||
|
||||
if (!templ->mysql_null_bit_mask) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Error: trying to return an SQL NULL field in a non-null\n"
|
||||
"innoDB: column! Table name %s\n", prebuilt->table->name);
|
||||
} else {
|
||||
mysql_rec[templ->mysql_null_byte_offset] |=
|
||||
(byte) (templ->mysql_null_bit_mask);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
|
|
@ -1328,7 +1328,7 @@ int extend;
|
|||
print_error("Found wrong record at %lu",(ulong) start_recpos);
|
||||
got_error=1;
|
||||
}
|
||||
crc^=checksum(record,info->s->base.reclength);
|
||||
crc^=_nisam_checksum(record,info->s->base.reclength);
|
||||
link_used+=info->s->pack.ref_length;
|
||||
used+=block_info.rec_len+info->s->pack.ref_length;
|
||||
}
|
||||
|
|
|
@ -358,6 +358,7 @@ extern int _nisam_read_pack_record(N_INFO *info,ulong filepos,byte *buf);
|
|||
extern int _nisam_read_rnd_pack_record(N_INFO*, byte *,ulong, int);
|
||||
extern int _nisam_pack_rec_unpack(N_INFO *info,byte *to,byte *from,
|
||||
uint reclength);
|
||||
extern ulong _nisam_checksum(const byte *mem, uint count);
|
||||
|
||||
typedef struct st_sortinfo {
|
||||
uint key_length;
|
||||
|
|
19
isam/open.c
19
isam/open.c
|
@ -453,3 +453,22 @@ static void setup_key_functions(register N_KEYDEF *keyinfo)
|
|||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
Calculate a long checksum for a memoryblock. Used to verify pack_isam
|
||||
|
||||
SYNOPSIS
|
||||
checksum()
|
||||
mem Pointer to memory block
|
||||
count Count of bytes
|
||||
*/
|
||||
|
||||
ulong _nisam_checksum(const byte *mem, uint count)
|
||||
{
|
||||
ulong crc;
|
||||
for (crc= 0; count-- ; mem++)
|
||||
crc= ((crc << 1) + *((uchar*) mem)) +
|
||||
test(crc & ((ulong) 1L << (8*sizeof(ulong)-1)));
|
||||
return crc;
|
||||
}
|
||||
|
||||
|
|
|
@ -738,7 +738,7 @@ static int get_statistic(MRG_INFO *mrg,HUFF_COUNTS *huff_counts)
|
|||
{
|
||||
if (! error)
|
||||
{
|
||||
crc^=checksum(record,reclength);
|
||||
crc^=_nisam_checksum(record,reclength);
|
||||
for (pos=record,count=huff_counts ;
|
||||
count < end_count ;
|
||||
count++,
|
||||
|
|
|
@ -71,7 +71,8 @@ const char *client_errors[]=
|
|||
"Can't open shared memory. Server abandoded and don't sent the answer event (%lu)",
|
||||
"Can't open shared memory. Can't send the request event to server (%lu)",
|
||||
"Wrong or unknown protocol",
|
||||
"Invalid connection handle"
|
||||
"Invalid connection handle",
|
||||
"mysql_server_init wasn't called"
|
||||
};
|
||||
|
||||
/* Start of code added by Roberto M. Serqueira - martinsc@uol.com.br - 05.24.2001 */
|
||||
|
@ -126,7 +127,8 @@ const char *client_errors[]=
|
|||
"Can't open shared memory. Server abandoded and don't sent the answer event (%lu)",
|
||||
"Can't open shared memory. Can't send the request event to server (%lu)",
|
||||
"Wrong or unknown protocol",
|
||||
"Invalid connection handle"
|
||||
"Invalid connection handle",
|
||||
"mysql_server_init wasn't called"
|
||||
};
|
||||
|
||||
#else /* ENGLISH */
|
||||
|
@ -179,7 +181,8 @@ const char *client_errors[]=
|
|||
"Can't open shared memory. Server abandoded and don't sent the answer event (%lu)",
|
||||
"Can't open shared memory. Can't send the request event to server (%lu)",
|
||||
"Wrong or unknown protocol",
|
||||
"Invalid connection handle"
|
||||
"Invalid connection handle",
|
||||
"mysql_server_init wasn't called"
|
||||
};
|
||||
#endif
|
||||
|
||||
|
|
|
@ -594,6 +594,8 @@ my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user,
|
|||
const char *passwd, const char *db)
|
||||
{
|
||||
char buff[512],*end=buff;
|
||||
NET *net= &mysql->net;
|
||||
ulong pkt_length;
|
||||
DBUG_ENTER("mysql_change_user");
|
||||
|
||||
if (!user)
|
||||
|
@ -604,41 +606,54 @@ my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user,
|
|||
/* Store user into the buffer */
|
||||
end=strmov(end,user)+1;
|
||||
|
||||
/*
|
||||
We always start with old type handshake the only difference is message sent
|
||||
If server handles secure connection type we'll not send the real scramble
|
||||
*/
|
||||
if (mysql->server_capabilities & CLIENT_SECURE_CONNECTION)
|
||||
/* write scrambled password according to server capabilities */
|
||||
if (passwd[0])
|
||||
{
|
||||
if (passwd[0])
|
||||
if (mysql->server_capabilities & CLIENT_SECURE_CONNECTION)
|
||||
{
|
||||
/* Prepare false scramble */
|
||||
bfill(end, SCRAMBLE_LENGTH, 'x');
|
||||
end+=SCRAMBLE_LENGTH;
|
||||
*end=0;
|
||||
|
||||
*end++= SCRAMBLE_LENGTH;
|
||||
scramble(end, mysql->scramble, passwd);
|
||||
end+= SCRAMBLE_LENGTH;
|
||||
}
|
||||
else
|
||||
{
|
||||
scramble_323(end, mysql->scramble, passwd);
|
||||
end+= SCRAMBLE_LENGTH_323 + 1;
|
||||
}
|
||||
else /* For empty password */
|
||||
*end=0; /* zero length scramble */
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
Real scramble is only sent to old servers. This can be blocked
|
||||
by calling mysql_options(MYSQL *, MYSQL_SECURE_CONNECT, (char*) &1);
|
||||
*/
|
||||
end=scramble(end, mysql->scramble_buff, passwd,
|
||||
(my_bool) (mysql->protocol_version == 9));
|
||||
}
|
||||
*end++= '\0'; // empty password
|
||||
/* Add database if needed */
|
||||
end=strmov(end+1,db ? db : "");
|
||||
end= strmov(end, db ? db : "") + 1;
|
||||
|
||||
/* Write authentication package */
|
||||
simple_command(mysql,COM_CHANGE_USER, buff,(ulong) (end-buff),1);
|
||||
|
||||
if (mysql_autenticate(mysql, passwd))
|
||||
pkt_length= net_safe_read(mysql);
|
||||
|
||||
if (pkt_length == packet_error)
|
||||
goto error;
|
||||
|
||||
if (pkt_length == 1 && net->read_pos[0] == 254 &&
|
||||
mysql->server_capabilities & CLIENT_SECURE_CONNECTION)
|
||||
{
|
||||
/*
|
||||
By sending this very specific reply server asks us to send scrambled
|
||||
password in old format. The reply contains scramble_323.
|
||||
*/
|
||||
scramble_323(buff, mysql->scramble, passwd);
|
||||
if (my_net_write(net, buff, SCRAMBLE_LENGTH_323 + 1) || net_flush(net))
|
||||
{
|
||||
net->last_errno= CR_SERVER_LOST;
|
||||
strmov(net->sqlstate, unknown_sqlstate);
|
||||
strmov(net->last_error,ER(net->last_errno));
|
||||
goto error;
|
||||
}
|
||||
/* Read what server thinks about out new auth message report */
|
||||
if (net_safe_read(mysql) == packet_error)
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Free old connect information */
|
||||
my_free(mysql->user,MYF(MY_ALLOW_ZERO_PTR));
|
||||
my_free(mysql->passwd,MYF(MY_ALLOW_ZERO_PTR));
|
||||
|
|
|
@ -26,7 +26,8 @@
|
|||
static int fake_argc= 1;
|
||||
static char *fake_argv[]= {(char *)"", 0};
|
||||
static const char *fake_groups[] = { "server", "embedded", 0 };
|
||||
static char inited, org_my_init_done;
|
||||
static char org_my_init_done;
|
||||
char server_inited;
|
||||
|
||||
#if defined (__WIN__)
|
||||
#include "../sql/mysqld.cpp"
|
||||
|
@ -34,9 +35,9 @@ static char inited, org_my_init_done;
|
|||
#include "../sql/mysqld.cc"
|
||||
#endif
|
||||
|
||||
#define SCRAMBLE_LENGTH 8
|
||||
C_MODE_START
|
||||
#include <mysql.h>
|
||||
#undef ER
|
||||
#include "errmsg.h"
|
||||
#include <sql_common.h>
|
||||
|
||||
|
@ -48,19 +49,20 @@ static bool check_user(THD *thd, enum_server_command command,
|
|||
char * get_mysql_home(){ return mysql_home;};
|
||||
char * get_mysql_real_data_home(){ return mysql_real_data_home;};
|
||||
|
||||
my_bool
|
||||
my_bool STDCALL
|
||||
emb_advanced_command(MYSQL *mysql, enum enum_server_command command,
|
||||
const char *header, ulong header_length,
|
||||
const char *arg, ulong arg_length, my_bool skip_check)
|
||||
{
|
||||
my_bool result= 1;
|
||||
THD *thd=(THD *) mysql->thd;
|
||||
NET *net= &mysql->net;
|
||||
|
||||
/* Check that we are calling the client functions in right order */
|
||||
if (mysql->status != MYSQL_STATUS_READY)
|
||||
{
|
||||
strmov(thd->net.last_error,
|
||||
ER(thd->net.last_errno=CR_COMMANDS_OUT_OF_SYNC));
|
||||
strmov(net->last_error,
|
||||
ER(net->last_errno=CR_COMMANDS_OUT_OF_SYNC));
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -76,12 +78,12 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command,
|
|||
if (!skip_check)
|
||||
result= thd->net.last_errno ? -1 : 0;
|
||||
|
||||
if ((mysql->net.last_errno= thd->net.last_errno))
|
||||
if ((net->last_errno= thd->net.last_errno))
|
||||
{
|
||||
memcpy(mysql->net.last_error, thd->net.last_error,
|
||||
sizeof(mysql->net.last_error));
|
||||
memcpy(mysql->net.sqlstate, thd->net.sqlstate,
|
||||
sizeof(mysql->net.sqlstate));
|
||||
memcpy(net->last_error, net->last_error,
|
||||
sizeof(net->last_error));
|
||||
memcpy(net->sqlstate, thd->net.sqlstate,
|
||||
sizeof(net->sqlstate));
|
||||
}
|
||||
mysql->warning_count= ((THD*)mysql->thd)->total_warn_count;
|
||||
return result;
|
||||
|
@ -182,9 +184,9 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups)
|
|||
|
||||
|
||||
/* Only call MY_INIT() if it hasn't been called before */
|
||||
if (!inited)
|
||||
if (!server_inited)
|
||||
{
|
||||
inited=1;
|
||||
server_inited=1;
|
||||
org_my_init_done=my_init_done;
|
||||
}
|
||||
if (!org_my_init_done)
|
||||
|
|
|
@ -59,7 +59,7 @@
|
|||
#endif
|
||||
|
||||
void free_old_query(MYSQL *mysql);
|
||||
my_bool
|
||||
my_bool STDCALL
|
||||
emb_advanced_command(MYSQL *mysql, enum enum_server_command command,
|
||||
const char *header, ulong header_length,
|
||||
const char *arg, ulong arg_length, my_bool skip_check);
|
||||
|
@ -79,6 +79,8 @@ struct passwd *getpwuid(uid_t);
|
|||
char* getlogin(void);
|
||||
#endif
|
||||
|
||||
extern char server_inited;
|
||||
|
||||
#ifdef __WIN__
|
||||
static my_bool is_NT(void)
|
||||
{
|
||||
|
@ -169,7 +171,7 @@ static inline int mysql_init_charset(MYSQL *mysql)
|
|||
else the lengths are calculated from the offset between pointers.
|
||||
**************************************************************************/
|
||||
|
||||
static void emb_fetch_lengths(ulong *to, MYSQL_ROW column, uint field_count)
|
||||
static void STDCALL emb_fetch_lengths(ulong *to, MYSQL_ROW column, uint field_count)
|
||||
{
|
||||
MYSQL_ROW end;
|
||||
|
||||
|
@ -210,6 +212,20 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
|
|||
db ? db : "(Null)",
|
||||
user ? user : "(Null)"));
|
||||
|
||||
#ifdef EMBEDDED_LIBRARY
|
||||
/*
|
||||
Here we check that mysql_server_init was called before.
|
||||
Actually we can perform the test for client (not embedded) library as well.
|
||||
But i'm afraid some old applications will be broken then.
|
||||
*/
|
||||
if (!server_inited)
|
||||
{
|
||||
mysql->net.last_errno=CR_MYSQL_SERVER_INIT_MISSED;
|
||||
strmov(mysql->net.last_error,ER(mysql->net.last_errno));
|
||||
goto error;
|
||||
}
|
||||
#endif /*EMBEDDED_LIBRARY*/
|
||||
|
||||
if (mysql->options.methods_to_use == MYSQL_OPT_USE_REMOTE_CONNECTION)
|
||||
cli_mysql_real_connect(mysql, host, user,
|
||||
passwd, db, port, unix_socket, client_flag);
|
||||
|
|
|
@ -28,30 +28,29 @@ ha_checksum mi_checksum(MI_INFO *info, const byte *buf)
|
|||
{
|
||||
const byte *pos;
|
||||
const byte *end;
|
||||
ulong length;
|
||||
switch (rec->type) {
|
||||
case FIELD_BLOB:
|
||||
{
|
||||
ulong length=_mi_calc_blob_length(rec->length-
|
||||
length=_mi_calc_blob_length(rec->length-
|
||||
mi_portable_sizeof_char_ptr,
|
||||
buf);
|
||||
memcpy((char*) &pos, buf+rec->length- mi_portable_sizeof_char_ptr,
|
||||
sizeof(char*));
|
||||
end=pos+length;
|
||||
break;
|
||||
}
|
||||
case FIELD_VARCHAR:
|
||||
{
|
||||
uint length;
|
||||
length=uint2korr(buf);
|
||||
pos=buf+2; end=pos+length;
|
||||
pos=buf+2;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
pos=buf; end=buf+rec->length;
|
||||
length=rec->length;
|
||||
pos=buf;
|
||||
break;
|
||||
}
|
||||
for ( ; pos != end ; pos++)
|
||||
crc=((crc << 8) + *((uchar*) pos)) + (crc >> (8*sizeof(ha_checksum)-8));
|
||||
crc=my_checksum(crc, pos ? pos : "", length);
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
@ -59,9 +58,5 @@ ha_checksum mi_checksum(MI_INFO *info, const byte *buf)
|
|||
|
||||
ha_checksum mi_static_checksum(MI_INFO *info, const byte *pos)
|
||||
{
|
||||
ha_checksum crc;
|
||||
const byte *end=pos+info->s->base.reclength;
|
||||
for (crc=0; pos != end; pos++)
|
||||
crc=((crc << 8) + *((uchar*) pos)) + (crc >> (8*sizeof(ha_checksum)-8));
|
||||
return crc;
|
||||
return my_checksum(0, pos, info->s->base.reclength);
|
||||
}
|
||||
|
|
|
@ -21,8 +21,9 @@ benchdir_root= $(prefix)
|
|||
testdir = $(benchdir_root)/mysql-test
|
||||
EXTRA_SCRIPTS = mysql-test-run.sh install_test_db.sh
|
||||
EXTRA_DIST = $(EXTRA_SCRIPTS)
|
||||
test_SCRIPTS = mysql-test-run install_test_db
|
||||
CLEANFILES = $(test_SCRIPTS)
|
||||
test_SCRIPTS = mysql-test-run install_test_db
|
||||
test_DATA = std_data/client-key.pem std_data/client-cert.pem std_data/cacert.pem
|
||||
CLEANFILES = $(test_SCRIPTS) $(test_DATA)
|
||||
|
||||
dist-hook:
|
||||
mkdir -p $(distdir)/t $(distdir)/r $(distdir)/include \
|
||||
|
@ -32,6 +33,8 @@ dist-hook:
|
|||
$(INSTALL_DATA) $(srcdir)/r/*.result $(srcdir)/r/*.require $(distdir)/r
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/*.dat $(srcdir)/std_data/*.000001 $(distdir)/std_data
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/des_key_file $(distdir)/std_data
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/*.pem $(distdir)/std_data
|
||||
|
||||
|
||||
install-data-local:
|
||||
$(mkinstalldirs) \
|
||||
|
@ -49,6 +52,11 @@ install-data-local:
|
|||
$(INSTALL_DATA) $(srcdir)/include/*.inc $(DESTDIR)$(testdir)/include
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/*.dat $(DESTDIR)$(testdir)/std_data
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/des_key_file $(DESTDIR)$(testdir)/std_data
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/*.pem $(DESTDIR)$(testdir)/std_data
|
||||
|
||||
std_data/%.pem:
|
||||
@CP@ $(top_srcdir)/SSL/$(@F) $(srcdir)/std_data
|
||||
|
||||
|
||||
SUFFIXES = .sh
|
||||
|
||||
|
|
|
@ -30,6 +30,7 @@ show tables;
|
|||
Tables_in_test
|
||||
update mysql.user set password=old_password("gambling2") where user="test";
|
||||
flush privileges;
|
||||
set password=old_password('gambling3');
|
||||
show tables;
|
||||
Tables_in_mysql
|
||||
columns_priv
|
||||
|
|
|
@ -312,3 +312,52 @@ SET SESSION table_type=default;
|
|||
drop table t1;
|
||||
create table t1 select x'4132';
|
||||
drop table t1;
|
||||
create table t1(a int,b int,c int unsigned,d date,e char,f datetime,g time,h blob);
|
||||
insert into t1(a)values(1);
|
||||
insert into t1(a,b,c,d,e,f,g,h)
|
||||
values(2,-2,2,'1825-12-14','a','2003-1-1 3:2:1','4:3:2','binary data');
|
||||
select * from t1;
|
||||
a b c d e f g h
|
||||
1 NULL NULL NULL NULL NULL NULL NULL
|
||||
2 -2 2 1825-12-14 a 2003-01-01 03:02:01 04:03:02 binary data
|
||||
select a,
|
||||
ifnull(b,cast(-7 as signed)) as b,
|
||||
ifnull(c,cast(7 as unsigned)) as c,
|
||||
ifnull(d,cast('2000-01-01' as date)) as d,
|
||||
ifnull(e,cast('b' as char)) as e,
|
||||
ifnull(f,cast('2000-01-01' as datetime)) as f,
|
||||
ifnull(g,cast('5:4:3' as time)) as g,
|
||||
ifnull(h,cast('yet another binary data' as binary)) as h,
|
||||
addtime(cast('1:0:0' as time),cast('1:0:0' as time)) as dd
|
||||
from t1;
|
||||
a b c d e f g h dd
|
||||
1 -7 7 2000-01-01 b 2000-01-01 00:00:00 05:04:03 yet another binary data 02:00:00
|
||||
2 -2 2 1825-12-14 a 2003-01-01 03:02:01 04:03:02 binary data 02:00:00
|
||||
create table t2
|
||||
select
|
||||
a,
|
||||
ifnull(b,cast(-7 as signed)) as b,
|
||||
ifnull(c,cast(7 as unsigned)) as c,
|
||||
ifnull(d,cast('2000-01-01' as date)) as d,
|
||||
ifnull(e,cast('b' as char)) as e,
|
||||
ifnull(f,cast('2000-01-01' as datetime)) as f,
|
||||
ifnull(g,cast('5:4:3' as time)) as g,
|
||||
ifnull(h,cast('yet another binary data' as binary)) as h,
|
||||
addtime(cast('1:0:0' as time),cast('1:0:0' as time)) as dd
|
||||
from t1;
|
||||
explain t2;
|
||||
Field Type Null Key Default Extra
|
||||
a int(11) YES NULL
|
||||
b bigint(11) 0
|
||||
c bigint(10) 0
|
||||
d date 0000-00-00
|
||||
e char(1)
|
||||
f datetime 0000-00-00 00:00:00
|
||||
g time 00:00:00
|
||||
h mediumblob
|
||||
dd time 00:00:00
|
||||
select * from t2;
|
||||
a b c d e f g h dd
|
||||
1 -7 7 2000-01-01 b 2000-01-01 00:00:00 05:04:03 yet another binary data 02:00:00
|
||||
2 -2 2 1825-12-14 a 2003-01-01 03:02:01 04:03:02 binary data 02:00:00
|
||||
drop table t1, t2;
|
||||
|
|
|
@ -196,3 +196,11 @@ drop table t1,t2;
|
|||
SELECT a.x FROM (SELECT 1 AS x) AS a HAVING a.x = 1;
|
||||
x
|
||||
1
|
||||
create table a1 select 1 as a;
|
||||
select 2 as a from (select * from a1) b;
|
||||
ERROR 3D000: No Database Selected
|
||||
use test;
|
||||
select 2 as a from (select * from a1) b;
|
||||
a
|
||||
2
|
||||
drop table a1;
|
||||
|
|
|
@ -44,3 +44,13 @@ mysql
|
|||
test
|
||||
drop database mysqltest;
|
||||
ERROR HY000: Can't drop database 'mysqltest'; database doesn't exist
|
||||
drop table t1;
|
||||
flush tables with read lock;
|
||||
create table t1(n int);
|
||||
ERROR HY000: Can't execute the query because you have a conflicting read lock
|
||||
unlock tables;
|
||||
create table t1(n int);
|
||||
show tables;
|
||||
Tables_in_test
|
||||
t1
|
||||
drop table t1;
|
||||
|
|
|
@ -1,15 +1,79 @@
|
|||
select length(encrypt('foo', 'ff')) <> 0;
|
||||
length(encrypt('foo', 'ff')) <> 0
|
||||
1
|
||||
select password("a",""), password("a",NULL), password("","a"), password(NULL,"a");
|
||||
password("a","") password("a",NULL) password("","a") password(NULL,"a")
|
||||
*2517f7235d68d4ba2e5019c93420523101157a792c01 NULL NULL
|
||||
select password("aaaaaaaaaaaaaaaa","a"), password("a","aaaaaaaaaaaaaaaa");
|
||||
password("aaaaaaaaaaaaaaaa","a") password("a","aaaaaaaaaaaaaaaa")
|
||||
*2cd3b9a44e9a9994789a30f935c92f45a96c5472f381 *37c7c5c794ff144819f2531bf03c57772cd84e40db09
|
||||
select old_password('test'), length(password("1")), length(encrypt('test')), encrypt('test','aa');
|
||||
old_password('test') length(password("1")) length(encrypt('test')) encrypt('test','aa')
|
||||
378b243e220ca493 45 13 aaqPiZY5xR5l.
|
||||
select old_password(""), old_password(NULL), password(""), password(NULL);
|
||||
old_password("") old_password(NULL) password("") password(NULL)
|
||||
NULL NULL
|
||||
select password('abc');
|
||||
password('abc')
|
||||
*0D3CED9BEC10A777AEC23CCC353A8C08A633045E
|
||||
select password('');
|
||||
password('')
|
||||
|
||||
select old_password('abc');
|
||||
old_password('abc')
|
||||
7cd2b5942be28759
|
||||
select old_password('');
|
||||
old_password('')
|
||||
|
||||
select password('gabbagabbahey');
|
||||
password('gabbagabbahey')
|
||||
*B0F99D2963660DD7E16B751EC9EE2F17B6A68FA6
|
||||
select old_password('idkfa');
|
||||
old_password('idkfa')
|
||||
5c078dc54ca0fcca
|
||||
select length(password('1'));
|
||||
length(password('1'))
|
||||
41
|
||||
select length(encrypt('test'));
|
||||
length(encrypt('test'))
|
||||
13
|
||||
select encrypt('test','aa');
|
||||
encrypt('test','aa')
|
||||
aaqPiZY5xR5l.
|
||||
select old_password(NULL);
|
||||
old_password(NULL)
|
||||
NULL
|
||||
select password(NULL);
|
||||
password(NULL)
|
||||
NULL
|
||||
set global old_passwords=on;
|
||||
select password('');
|
||||
password('')
|
||||
|
||||
select old_password('');
|
||||
old_password('')
|
||||
|
||||
select password('idkfa');
|
||||
password('idkfa')
|
||||
*B669C9DAC3AA6F2254B03CDEF8DFDD6B2D1054BA
|
||||
select old_password('idkfa');
|
||||
old_password('idkfa')
|
||||
5c078dc54ca0fcca
|
||||
set old_passwords=on;
|
||||
select password('idkfa');
|
||||
password('idkfa')
|
||||
5c078dc54ca0fcca
|
||||
select old_password('idkfa');
|
||||
old_password('idkfa')
|
||||
5c078dc54ca0fcca
|
||||
set global old_passwords=off;
|
||||
select password('idkfa');
|
||||
password('idkfa')
|
||||
5c078dc54ca0fcca
|
||||
select old_password('idkfa');
|
||||
old_password('idkfa')
|
||||
5c078dc54ca0fcca
|
||||
set old_passwords=off;
|
||||
select password('idkfa ');
|
||||
password('idkfa ')
|
||||
*2DC31D90647B4C1ABC9231563D2236E96C9A2DB2
|
||||
select password('idkfa');
|
||||
password('idkfa')
|
||||
*B669C9DAC3AA6F2254B03CDEF8DFDD6B2D1054BA
|
||||
select password(' idkfa');
|
||||
password(' idkfa')
|
||||
*12B099E56BB7FE8D43C78FD834A9D1D11178D045
|
||||
select old_password('idkfa');
|
||||
old_password('idkfa')
|
||||
5c078dc54ca0fcca
|
||||
select old_password(' i d k f a ');
|
||||
old_password(' i d k f a ')
|
||||
5c078dc54ca0fcca
|
||||
|
|
|
@ -167,6 +167,11 @@ t2.URL_ID = t1.URL_ID group by REQ_ID;
|
|||
REQ_ID URL
|
||||
1 X
|
||||
5 X,X,X
|
||||
select REQ_ID, Group_Concat(URL) as URL, Min(t1.URL_ID) urll,
|
||||
Max(t1.URL_ID)
urlg from t1, t2 where t2.URL_ID = t1.URL_ID group by REQ_ID;
|
||||
REQ_ID URL urll urlg
|
||||
1 X 4 4
|
||||
5 X,X,X 4 5
|
||||
drop table t1;
|
||||
drop table t2;
|
||||
create table t1 (id int, name varchar(16));
|
||||
|
@ -178,3 +183,16 @@ select distinct ifnull(group_concat(concat(t1.id, ':', t1.name)), 'shortname') a
|
|||
with distinct: cutoff at length of shortname
|
||||
1:longername,1:evenlongername
|
||||
drop table t1;
|
||||
create table t1(id int);
|
||||
create table t2(id int);
|
||||
insert into t1 values(0),(1);
|
||||
select group_concat(t1.id) FROM t1,t2;
|
||||
group_concat(t1.id)
|
||||
NULL
|
||||
drop table t1;
|
||||
drop table t2;
|
||||
create table t1 (bar varchar(32));
|
||||
insert into t1 values('test'),('test2');
|
||||
select * from t1 having group_concat(bar)='';
|
||||
bar
|
||||
drop table t1;
|
||||
|
|
|
@ -251,6 +251,18 @@ n
|
|||
6
|
||||
rollback;
|
||||
drop table t1;
|
||||
create table t1 (n int not null primary key) type=innodb;
|
||||
start transaction;
|
||||
insert into t1 values (4);
|
||||
flush tables with read lock;
|
||||
commit;
|
||||
ERROR HY000: Can't execute the query because you have a conflicting read lock
|
||||
unlock tables;
|
||||
commit;
|
||||
select * from t1;
|
||||
n
|
||||
4
|
||||
drop table t1;
|
||||
create table t1 ( id int NOT NULL PRIMARY KEY, nom varchar(64)) type=innodb;
|
||||
begin;
|
||||
insert into t1 values(1,'hamdouni');
|
||||
|
@ -1342,3 +1354,40 @@ id label
|
|||
3524 Societe Test
|
||||
3525 Fournisseur Test
|
||||
drop table t1,t2;
|
||||
create table t1 (c1 char(5) unique not null, c2 int, stamp timestamp) type=innodb;
|
||||
select * from t1;
|
||||
c1 c2 stamp
|
||||
replace delayed into t1 (c1, c2) values ( "text1","11"),( "text2","12");
|
||||
ERROR HY000: Table storage engine for 't1' doesn't have this option
|
||||
select * from t1;
|
||||
c1 c2 stamp
|
||||
replace delayed into t1 (c1, c2) values ( "text1","12"),( "text2","13"),( "text3","14", "a" ),( "text4","15", "b" );
|
||||
ERROR HY000: Table storage engine for 't1' doesn't have this option
|
||||
select * from t1;
|
||||
c1 c2 stamp
|
||||
drop table t1;
|
||||
create table t1 (a int, b varchar(200), c text not null) checksum=1 type=myisam;
|
||||
create table t2 (a int, b varchar(200), c text not null) checksum=0 type=innodb;
|
||||
create table t3 (a int, b varchar(200), c text not null) checksum=1 type=innodb;
|
||||
insert t1 values (1, "aaa", "bbb"), (NULL, "", "ccccc"), (0, NULL, "");
|
||||
insert t2 select * from t1;
|
||||
insert t3 select * from t1;
|
||||
checksum table t1, t2, t3, t4 quick;
|
||||
Table Checksum
|
||||
test.t1 968604391
|
||||
test.t2 NULL
|
||||
test.t3 NULL
|
||||
test.t4 NULL
|
||||
checksum table t1, t2, t3, t4;
|
||||
Table Checksum
|
||||
test.t1 968604391
|
||||
test.t2 968604391
|
||||
test.t3 968604391
|
||||
test.t4 NULL
|
||||
checksum table t1, t2, t3, t4 extended;
|
||||
Table Checksum
|
||||
test.t1 968604391
|
||||
test.t2 968604391
|
||||
test.t3 968604391
|
||||
test.t4 NULL
|
||||
drop table t1,t2,t3;
|
||||
|
|
|
@ -1,13 +1,5 @@
|
|||
drop table if exists t1,t2;
|
||||
create table t1 (a tinyint not null auto_increment, b blob not null, primary key (a)) type=isam;
|
||||
Warnings:
|
||||
Warning 1263 Data truncated for column 'b' at row 1
|
||||
Warnings:
|
||||
Warning 1263 Data truncated for column 'b' at row 1
|
||||
Warnings:
|
||||
Warning 1263 Data truncated for column 'b' at row 1
|
||||
Warnings:
|
||||
Warning 1263 Data truncated for column 'b' at row 1
|
||||
delete from t1 where (a & 1);
|
||||
select sum(length(b)) from t1;
|
||||
sum(length(b))
|
||||
|
|
|
@ -367,6 +367,23 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
drop table t1,t2;
|
||||
CREATE TABLE t1 (`a` int(11) NOT NULL default '0', `b` int(11) NOT NULL default '0', UNIQUE KEY `a` USING RTREE (`a`,`b`)) TYPE=MyISAM;
|
||||
ERROR 42000: This version of MySQL doesn't yet support 'RTREE INDEX'
|
||||
DROP TABLE IF EXISTS t1;
|
||||
Warnings:
|
||||
Note 1051 Unknown table 't1'
|
||||
create table t1 (a int, b varchar(200), c text not null) checksum=1;
|
||||
create table t2 (a int, b varchar(200), c text not null) checksum=0;
|
||||
insert t1 values (1, "aaa", "bbb"), (NULL, "", "ccccc"), (0, NULL, "");
|
||||
insert t2 select * from t1;
|
||||
checksum table t1, t2, t3 quick;
|
||||
Table Checksum
|
||||
test.t1 968604391
|
||||
test.t2 NULL
|
||||
test.t3 NULL
|
||||
checksum table t1, t2, t3;
|
||||
Table Checksum
|
||||
test.t1 968604391
|
||||
test.t2 968604391
|
||||
test.t3 NULL
|
||||
checksum table t1, t2, t3 extended;
|
||||
Table Checksum
|
||||
test.t1 968604391
|
||||
test.t2 968604391
|
||||
test.t3 NULL
|
||||
drop table t1,t2;
|
||||
|
|
|
@ -254,3 +254,18 @@ ERROR 42000: This version of MySQL doesn't yet support 'CUBE'
|
|||
select product, country_id , year, sum(profit) from t1 group by product, country_id, year with cube union all select product, country_id , year, sum(profit) from t1 group by product, country_id, year with rollup;
|
||||
ERROR 42000: This version of MySQL doesn't yet support 'CUBE'
|
||||
drop table t1,t2;
|
||||
CREATE TABLE t1 (i int);
|
||||
INSERT INTO t1 VALUES(100);
|
||||
CREATE TABLE t2 (i int);
|
||||
INSERT INTO t2 VALUES (100),(200);
|
||||
SELECT i, COUNT(*) FROM t1 GROUP BY i WITH ROLLUP;
|
||||
i COUNT(*)
|
||||
100 1
|
||||
NULL 1
|
||||
SELECT t1.i, t2.i, COUNT(*) FROM t1,t2 GROUP BY t1.i,t2.i WITH ROLLUP;
|
||||
i i COUNT(*)
|
||||
100 100 1
|
||||
100 200 1
|
||||
100 NULL 2
|
||||
NULL NULL 2
|
||||
drop table t1,t2;
|
||||
|
|
|
@ -4,20 +4,20 @@ File Position Binlog_do_db Binlog_ignore_db
|
|||
master-bin.000001 79
|
||||
reset slave;
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
change master to master_host='127.0.0.1';
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 test MASTER_PORT 7 4 slave-relay-bin.000001 4 No No 0 0 0 4
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 test MASTER_PORT 7 4 slave-relay-bin.000001 4 No No 0 0 0 4 No
|
||||
change master to master_host='127.0.0.1',master_user='root',
|
||||
master_password='',master_port=MASTER_PORT;
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 root MASTER_PORT 7 4 slave-relay-bin.000001 4 No No 0 0 0 4
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 root MASTER_PORT 7 4 slave-relay-bin.000001 4 No No 0 0 0 4 No
|
||||
start slave;
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 root MASTER_PORT 7 master-bin.000001 79 slave-relay-bin.000001 123 master-bin.000001 Yes Yes 0 0 79 123
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 root MASTER_PORT 7 master-bin.000001 79 slave-relay-bin.000001 123 master-bin.000001 Yes Yes 0 0 79 123 No
|
||||
drop table if exists t1;
|
||||
create table t1 (n int);
|
||||
insert into t1 values (10),(45),(90);
|
||||
|
|
|
@ -5,7 +5,7 @@ reset slave;
|
|||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
load table t1 from master;
|
||||
ERROR 08S01: Error connecting to master: Master is not configured
|
||||
load table t1 from master;
|
||||
|
|
|
@ -8,8 +8,8 @@ create table t1 (a int primary key);
|
|||
insert into t1 values (1),(1);
|
||||
ERROR 23000: Duplicate entry '1' for key 1
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 213 slave-relay-bin.000002 257 master-bin.000001 Yes Yes test.t1 0 0 213 257
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 213 slave-relay-bin.000002 257 master-bin.000001 Yes Yes test.t1 0 0 213 257 No
|
||||
show tables like 't1';
|
||||
Tables_in_test (t1)
|
||||
drop table t1;
|
||||
|
|
|
@ -13,5 +13,5 @@ master_password='',master_port=SLAVE_PORT;
|
|||
start slave;
|
||||
flush logs;
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 root SLAVE_PORT 60 slave-bin.000001 79 relay-log.000002 4 slave-bin.000001 Yes Yes 0 0 79 4
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 root SLAVE_PORT 60 slave-bin.000001 79 relay-log.000002 4 slave-bin.000001 Yes Yes 0 0 79 4 No
|
||||
|
|
|
@ -28,8 +28,8 @@ load data infile '../../std_data/rpl_loaddata.dat' into table t1;
|
|||
set global sql_slave_skip_counter=1;
|
||||
start slave;
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 1311 slave-relay-bin.000002 1355 master-bin.000001 Yes Yes 0 0 1311 1355
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 1311 slave-relay-bin.000002 1355 master-bin.000001 Yes Yes 0 0 1311 1355 No
|
||||
set sql_log_bin=0;
|
||||
delete from t1;
|
||||
set sql_log_bin=1;
|
||||
|
@ -38,8 +38,8 @@ stop slave;
|
|||
change master to master_user='test';
|
||||
change master to master_user='root';
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 1442 slave-relay-bin.000001 4 master-bin.000001 No No 0 0 1442 4
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 1442 slave-relay-bin.000001 4 master-bin.000001 No No 0 0 1442 4 No
|
||||
set global sql_slave_skip_counter=1;
|
||||
start slave;
|
||||
set sql_log_bin=0;
|
||||
|
@ -49,5 +49,5 @@ load data infile '../../std_data/rpl_loaddata.dat' into table t1;
|
|||
stop slave;
|
||||
reset slave;
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 root MASTER_PORT 1 4 slave-relay-bin.000001 4 No No 0 0 0 4
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 root MASTER_PORT 1 4 slave-relay-bin.000001 4 No No 0 0 0 4 No
|
||||
|
|
|
@ -92,7 +92,7 @@ slave-bin.000002 4 Query 1 110 use `test`; create table t1 (n int)
|
|||
slave-bin.000002 62 Query 1 168 use `test`; insert into t1 values (1)
|
||||
slave-bin.000002 122 Query 1 228 use `test`; drop table t1
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000002 276 slave-relay-bin.000003 214 master-bin.000002 Yes Yes 0 0 276 214
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000002 276 slave-relay-bin.000003 214 master-bin.000002 Yes Yes 0 0 276 214 No
|
||||
show binlog events in 'slave-bin.000005' from 4;
|
||||
ERROR HY000: Error when executing command SHOW BINLOG EVENTS: Could not find target log
|
||||
|
|
|
@ -8,26 +8,26 @@ show master status;
|
|||
File Position Binlog_do_db Binlog_ignore_db
|
||||
master-bin.000001 79
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 79 slave-relay-bin.000002 123 master-bin.000001 Yes Yes 0 0 79 123
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 79 slave-relay-bin.000002 123 master-bin.000001 Yes Yes 0 0 79 123 No
|
||||
stop slave;
|
||||
change master to master_log_pos=73;
|
||||
start slave;
|
||||
stop slave;
|
||||
change master to master_log_pos=73;
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 73 slave-relay-bin.000001 4 master-bin.000001 No No 0 0 73 4
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 73 slave-relay-bin.000001 4 master-bin.000001 No No 0 0 73 4 No
|
||||
start slave;
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 73 slave-relay-bin.000001 48 master-bin.000001 No Yes 0 0 73 48
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 73 slave-relay-bin.000001 48 master-bin.000001 No Yes 0 0 73 48 No
|
||||
stop slave;
|
||||
change master to master_log_pos=173;
|
||||
start slave;
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 173 slave-relay-bin.000001 4 master-bin.000001 No Yes 0 0 173 4
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 173 slave-relay-bin.000001 4 master-bin.000001 No Yes 0 0 173 4 No
|
||||
show master status;
|
||||
File Position Binlog_do_db Binlog_ignore_db
|
||||
master-bin.000001 79
|
||||
|
|
|
@ -15,8 +15,8 @@ select @@global.max_relay_log_size;
|
|||
4096
|
||||
start slave;
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 50477 slave-relay-bin.000014 1221 master-bin.000001 Yes Yes 0 0 50477 1221
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 50477 slave-relay-bin.000014 1221 master-bin.000001 Yes Yes 0 0 50477 1221 No
|
||||
stop slave;
|
||||
reset slave;
|
||||
set global max_relay_log_size=(5*4096);
|
||||
|
@ -25,8 +25,8 @@ select @@global.max_relay_log_size;
|
|||
20480
|
||||
start slave;
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 50477 slave-relay-bin.000004 9457 master-bin.000001 Yes Yes 0 0 50477 9457
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 50477 slave-relay-bin.000004 9457 master-bin.000001 Yes Yes 0 0 50477 9457 No
|
||||
stop slave;
|
||||
reset slave;
|
||||
set global max_relay_log_size=0;
|
||||
|
@ -35,26 +35,26 @@ select @@global.max_relay_log_size;
|
|||
0
|
||||
start slave;
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 50477 slave-relay-bin.000008 1283 master-bin.000001 Yes Yes 0 0 50477 1283
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 50477 slave-relay-bin.000008 1283 master-bin.000001 Yes Yes 0 0 50477 1283 No
|
||||
stop slave;
|
||||
reset slave;
|
||||
flush logs;
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 root MASTER_PORT 1 4 slave-relay-bin.000001 4 No No 0 0 0 4
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 root MASTER_PORT 1 4 slave-relay-bin.000001 4 No No 0 0 0 4 No
|
||||
reset slave;
|
||||
start slave;
|
||||
flush logs;
|
||||
create table t1 (a int);
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 50535 slave-relay-bin.000009 62 master-bin.000001 Yes Yes 0 0 50535 62
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 50535 slave-relay-bin.000009 62 master-bin.000001 Yes Yes 0 0 50535 62 No
|
||||
flush logs;
|
||||
drop table t1;
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 50583 slave-relay-bin.000010 52 master-bin.000001 Yes Yes 0 0 50583 52
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 50583 slave-relay-bin.000010 52 master-bin.000001 Yes Yes 0 0 50583 52 No
|
||||
flush logs;
|
||||
show master status;
|
||||
File Position Binlog_do_db Binlog_ignore_db
|
||||
|
|
30
mysql-test/r/rpl_openssl.result
Normal file
30
mysql-test/r/rpl_openssl.result
Normal file
|
@ -0,0 +1,30 @@
|
|||
stop slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
reset master;
|
||||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
grant replication slave on *.* to replssl@'%' require ssl;
|
||||
create table t1 (t int);
|
||||
stop slave;
|
||||
change master to master_user='replssl',master_password='';
|
||||
start slave;
|
||||
insert into t1 values (1);
|
||||
select * from t1;
|
||||
t
|
||||
stop slave;
|
||||
change master to master_ssl=1 , master_ssl_ca ='MYSQL_TEST_DIR/std_data/cacert.pem', master_ssl_cert='MYSQL_TEST_DIR/std_data/client-cert.pem', master_ssl_key='MYSQL_TEST_DIR/std_data/client-key.pem';
|
||||
start slave;
|
||||
select * from t1;
|
||||
t
|
||||
1
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 replssl MASTER_MYPORT 1 master-bin.000001 289 slave-relay-bin.000001 108 master-bin.000001 Yes Yes 0 0 289 108 Yes MYSQL_TEST_DIR/std_data/cacert.pem MYSQL_TEST_DIR/std_data/client-cert.pem MYSQL_TEST_DIR/std_data/client-key.pem
|
||||
stop slave;
|
||||
change master to master_user='root',master_password='', master_ssl=0;
|
||||
start slave;
|
||||
drop table t1;
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 337 slave-relay-bin.000001 96 master-bin.000001 Yes Yes 0 0 337 96 No MYSQL_TEST_DIR/std_data/cacert.pem MYSQL_TEST_DIR/std_data/client-cert.pem MYSQL_TEST_DIR/std_data/client-key.pem
|
|
@ -5,7 +5,7 @@ reset slave;
|
|||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
SHOW SLAVE STATUS;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
SHOW SLAVE HOSTS;
|
||||
Server_id Host Port Rpl_recovery_rank Master_id
|
||||
2 127.0.0.1 SLAVE_PORT 2 1
|
||||
|
|
|
@ -27,5 +27,5 @@ select * from t11;
|
|||
ERROR 42S02: Table 'test.t11' doesn't exist
|
||||
drop table if exists t1,t2,t11;
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 1281 slave-relay-bin.000002 1325 master-bin.000001 Yes Yes test.t1 0 0 1281 1325
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 1281 slave-relay-bin.000002 1325 master-bin.000001 Yes Yes test.t1 0 0 1281 1325 No
|
||||
|
|
|
@ -5,18 +5,18 @@ reset slave;
|
|||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 79 slave-relay-bin.000002 123 master-bin.000001 Yes Yes 0 0 79 123
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 79 slave-relay-bin.000002 123 master-bin.000001 Yes Yes 0 0 79 123 No
|
||||
stop slave;
|
||||
change master to master_user='test';
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 test MASTER_PORT 1 master-bin.000001 79 slave-relay-bin.000001 4 master-bin.000001 No No 0 0 79 4
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 test MASTER_PORT 1 master-bin.000001 79 slave-relay-bin.000001 4 master-bin.000001 No No 0 0 79 4 No
|
||||
reset slave;
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 root MASTER_PORT 1 4 slave-relay-bin.000001 4 No No 0 0 0 4
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 root MASTER_PORT 1 4 slave-relay-bin.000001 4 No No 0 0 0 4 No
|
||||
start slave;
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 79 slave-relay-bin.000002 123 master-bin.000001 Yes Yes 0 0 79 123
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 root MASTER_PORT 1 master-bin.000001 79 slave-relay-bin.000002 123 master-bin.000001 Yes Yes 0 0 79 123 No
|
||||
|
|
|
@ -15,8 +15,8 @@ insert into temp_table values ("testing temporary tables");
|
|||
create table t1 (s text);
|
||||
insert into t1 values('Could not break slave'),('Tried hard');
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 root MASTER_PORT 60 master-bin.000001 417 slave-relay-bin.000001 461 master-bin.000001 Yes Yes 0 0 417 461
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 root MASTER_PORT 60 master-bin.000001 417 slave-relay-bin.000001 461 master-bin.000001 Yes Yes 0 0 417 461 No
|
||||
select * from t1;
|
||||
s
|
||||
Could not break slave
|
||||
|
@ -56,8 +56,8 @@ Log_name
|
|||
master-bin.000003
|
||||
insert into t2 values (65);
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 root MASTER_PORT 60 master-bin.000003 290 slave-relay-bin.000001 1088 master-bin.000003 Yes Yes 0 0 290 1088
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 root MASTER_PORT 60 master-bin.000003 290 slave-relay-bin.000001 1088 master-bin.000003 Yes Yes 0 0 290 1088 No
|
||||
select * from t2;
|
||||
m
|
||||
34
|
||||
|
@ -80,8 +80,8 @@ select * from t4;
|
|||
a
|
||||
testing temporary tables part 2
|
||||
show slave status;
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
|
||||
127.0.0.1 root MASTER_PORT 60 master-bin.000004 2886 slave-relay-bin.000001 7891 master-bin.000004 Yes Yes 0 0 2886 7891
|
||||
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
|
||||
127.0.0.1 root MASTER_PORT 60 master-bin.000004 2886 slave-relay-bin.000001 7891 master-bin.000004 Yes Yes 0 0 2886 7891 No
|
||||
lock tables t3 read;
|
||||
select count(*) from t3 where n >= 4;
|
||||
count(*)
|
||||
|
|
|
@ -43,7 +43,7 @@ wait_timeout 28800
|
|||
show variables like "this_doesn't_exists%";
|
||||
Variable_name Value
|
||||
show table status from test like "this_doesn't_exists%";
|
||||
Name Type Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Charset Create_options Comment
|
||||
Name Type Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Charset Checksum Create_options Comment
|
||||
show databases;
|
||||
Database
|
||||
mysql
|
||||
|
|
|
@ -1355,3 +1355,34 @@ a
|
|||
2
|
||||
10
|
||||
drop table t1,t2;
|
||||
CREATE TABLE t1 (s1 CHAR(5) COLLATE latin1_german1_ci,
|
||||
s2 CHAR(5) COLLATE latin1_swedish_ci);
|
||||
INSERT INTO t1 VALUES ('z','?');
|
||||
select * from t1 where s1 > (select max(s2) from t1);
|
||||
ERROR HY000: Illegal mix of collations (latin1_german1_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation '>'
|
||||
select * from t1 where s1 > any (select max(s2) from t1);
|
||||
ERROR HY000: Illegal mix of collations (latin1_german1_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation '>'
|
||||
drop table t1;
|
||||
create table t1(toid int,rd int);
|
||||
create table t2(userid int,pmnew int,pmtotal int);
|
||||
insert into t2 values(1,0,0),(2,0,0);
|
||||
insert into t1 values(1,0),(1,0),(1,0),(1,12),(1,15),(1,123),(1,12312),(1,12312),(1,123),(2,0),(2,0),(2,1),(2,2);
|
||||
select userid,pmtotal,pmnew, (select count(rd) from t1 where toid=t2.userid) calc_total, (select count(rd) from t1 where rd=0 and toid=t2.userid) calc_new from t2 where userid in (select distinct toid from t1);
|
||||
userid pmtotal pmnew calc_total calc_new
|
||||
1 0 0 9 3
|
||||
2 0 0 4 2
|
||||
drop table t1, t2;
|
||||
create table t1 (s1 char(5));
|
||||
select (select 'a','b' from t1 union select 'a','b' from t1) from t1;
|
||||
ERROR 21000: Cardinality error (more/less than 1 columns)
|
||||
insert into t1 values ('tttt');
|
||||
select * from t1 where ('a','b')=(select 'a','b' from t1 union select 'a','b' from t1);
|
||||
s1
|
||||
tttt
|
||||
explain (select * from t1);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 system NULL NULL NULL NULL 1
|
||||
(select * from t1);
|
||||
s1
|
||||
tttt
|
||||
drop table t1;
|
||||
|
|
|
@ -46,8 +46,6 @@ alter table t8 rename t7;
|
|||
rename table t7 to t9;
|
||||
drop table t1;
|
||||
Got one of the listed errors
|
||||
Warnings:
|
||||
Note 1008 Can't drop database 'test_mysqltest'; database doesn't exist
|
||||
Got one of the listed errors
|
||||
Got one of the listed errors
|
||||
Got one of the listed errors
|
||||
|
|
|
@ -103,7 +103,7 @@ a b
|
|||
2 b
|
||||
select found_rows();
|
||||
found_rows()
|
||||
6
|
||||
8
|
||||
explain select a,b from t1 union all select a,b from t2;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 4
|
||||
|
|
|
@ -48,8 +48,9 @@ flush privileges;
|
|||
#connect (con1,localhost,test,gambling2,"");
|
||||
#show tables;
|
||||
connect (con1,localhost,test,gambling2,mysql);
|
||||
set password=old_password('gambling3');
|
||||
show tables;
|
||||
connect (con1,localhost,test,gambling2,test);
|
||||
connect (con1,localhost,test,gambling3,test);
|
||||
show tables;
|
||||
|
||||
# Re enable this one day if error handling on connect will take place
|
||||
|
@ -63,7 +64,9 @@ show tables;
|
|||
#connect (con1,localhost,test,zorro,);
|
||||
#--error 1045
|
||||
|
||||
|
||||
# remove user 'test' so that other tests which may use 'test'
|
||||
# do not depend on this test.
|
||||
|
||||
delete from mysql.user where user="test";
|
||||
flush privileges;
|
||||
|
|
|
@ -219,6 +219,44 @@ drop table t1;
|
|||
#
|
||||
# Bug # 801
|
||||
#
|
||||
|
||||
create table t1 select x'4132';
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Test types of data for create select with functions
|
||||
#
|
||||
|
||||
create table t1(a int,b int,c int unsigned,d date,e char,f datetime,g time,h blob);
|
||||
insert into t1(a)values(1);
|
||||
insert into t1(a,b,c,d,e,f,g,h)
|
||||
values(2,-2,2,'1825-12-14','a','2003-1-1 3:2:1','4:3:2','binary data');
|
||||
select * from t1;
|
||||
select a,
|
||||
ifnull(b,cast(-7 as signed)) as b,
|
||||
ifnull(c,cast(7 as unsigned)) as c,
|
||||
ifnull(d,cast('2000-01-01' as date)) as d,
|
||||
ifnull(e,cast('b' as char)) as e,
|
||||
ifnull(f,cast('2000-01-01' as datetime)) as f,
|
||||
ifnull(g,cast('5:4:3' as time)) as g,
|
||||
ifnull(h,cast('yet another binary data' as binary)) as h,
|
||||
addtime(cast('1:0:0' as time),cast('1:0:0' as time)) as dd
|
||||
from t1;
|
||||
|
||||
create table t2
|
||||
select
|
||||
a,
|
||||
ifnull(b,cast(-7 as signed)) as b,
|
||||
ifnull(c,cast(7 as unsigned)) as c,
|
||||
ifnull(d,cast('2000-01-01' as date)) as d,
|
||||
ifnull(e,cast('b' as char)) as e,
|
||||
ifnull(f,cast('2000-01-01' as datetime)) as f,
|
||||
ifnull(g,cast('5:4:3' as time)) as g,
|
||||
ifnull(h,cast('yet another binary data' as binary)) as h,
|
||||
addtime(cast('1:0:0' as time),cast('1:0:0' as time)) as dd
|
||||
from t1;
|
||||
explain t2;
|
||||
|
||||
select * from t2;
|
||||
|
||||
drop table t1, t2;
|
||||
|
||||
|
|
|
@ -94,3 +94,16 @@ drop table t1,t2;
|
|||
# derived table reference
|
||||
#
|
||||
SELECT a.x FROM (SELECT 1 AS x) AS a HAVING a.x = 1;
|
||||
|
||||
#
|
||||
# Test for select if database is not selected.
|
||||
#
|
||||
# Connect without a database
|
||||
create table a1 select 1 as a;
|
||||
connect (con1,localhost,mysqltest_1,,*NO-ONE*,$MASTER_MYPORT,master.sock);
|
||||
connection con1;
|
||||
--error 1046
|
||||
select 2 as a from (select * from a1) b;
|
||||
use test;
|
||||
select 2 as a from (select * from a1) b;
|
||||
drop table a1;
|
||||
|
|
|
@ -43,3 +43,13 @@ drop database mysqltest;
|
|||
show databases;
|
||||
--error 1008
|
||||
drop database mysqltest;
|
||||
|
||||
# test create table and FLUSH TABLES WITH READ LOCK
|
||||
drop table t1;
|
||||
flush tables with read lock;
|
||||
--error 1223;
|
||||
create table t1(n int);
|
||||
unlock tables;
|
||||
create table t1(n int);
|
||||
show tables;
|
||||
drop table t1;
|
||||
|
|
|
@ -4,7 +4,33 @@ select length(encrypt('foo', 'ff')) <> 0;
|
|||
--replace_result $1$aa$4OSUA5cjdx0RUQ08opV27/ aaqPiZY5xR5l.
|
||||
|
||||
# Test new and old password handling functions
|
||||
select password("a",""), password("a",NULL), password("","a"), password(NULL,"a");
|
||||
select password("aaaaaaaaaaaaaaaa","a"), password("a","aaaaaaaaaaaaaaaa");
|
||||
select old_password('test'), length(password("1")), length(encrypt('test')), encrypt('test','aa');
|
||||
select old_password(""), old_password(NULL), password(""), password(NULL);
|
||||
select password('abc');
|
||||
select password('');
|
||||
select old_password('abc');
|
||||
select old_password('');
|
||||
select password('gabbagabbahey');
|
||||
select old_password('idkfa');
|
||||
select length(password('1'));
|
||||
select length(encrypt('test'));
|
||||
select encrypt('test','aa');
|
||||
select old_password(NULL);
|
||||
select password(NULL);
|
||||
set global old_passwords=on;
|
||||
select password('');
|
||||
select old_password('');
|
||||
select password('idkfa');
|
||||
select old_password('idkfa');
|
||||
set old_passwords=on;
|
||||
select password('idkfa');
|
||||
select old_password('idkfa');
|
||||
set global old_passwords=off;
|
||||
select password('idkfa');
|
||||
select old_password('idkfa');
|
||||
|
||||
# this test shows that new scrambles honor spaces in passwords:
|
||||
set old_passwords=off;
|
||||
select password('idkfa ');
|
||||
select password('idkfa');
|
||||
select password(' idkfa');
|
||||
select old_password('idkfa');
|
||||
select old_password(' i d k f a ');
|
||||
|
|
|
@ -91,6 +91,11 @@ insert into t2 values (1,4), (5,4), (5,5);
|
|||
--replace_result www.help.com X www.host.com X www.google.com X
|
||||
select REQ_ID, Group_Concat(URL) as URL from t1, t2 where
|
||||
t2.URL_ID = t1.URL_ID group by REQ_ID;
|
||||
# check min/max function
|
||||
--replace_result www.help.com X www.host.com X www.google.com X
|
||||
select REQ_ID, Group_Concat(URL) as URL, Min(t1.URL_ID) urll,
|
||||
Max(t1.URL_ID)
urlg from t1, t2 where t2.URL_ID = t1.URL_ID group by REQ_ID;
|
||||
|
||||
drop table t1;
|
||||
drop table t2;
|
||||
|
||||
|
@ -99,3 +104,19 @@ insert into t1 values (1,'longername'),(1,'evenlongername');
|
|||
select ifnull(group_concat(concat(t1.id, ':', t1.name)), 'shortname') as 'without distinct: how it should be' from t1;
|
||||
select distinct ifnull(group_concat(concat(t1.id, ':', t1.name)), 'shortname') as 'with distinct: cutoff at length of shortname' from t1;
|
||||
drop table t1;
|
||||
|
||||
# check zero rows
|
||||
create table t1(id int);
|
||||
create table t2(id int);
|
||||
insert into t1 values(0),(1);
|
||||
select group_concat(t1.id) FROM t1,t2;
|
||||
drop table t1;
|
||||
drop table t2;
|
||||
|
||||
# check having
|
||||
create table t1 (bar varchar(32));
|
||||
insert into t1 values('test'),('test2');
|
||||
select * from t1 having group_concat(bar)='';
|
||||
drop table t1;
|
||||
|
||||
|
||||
|
|
|
@ -133,6 +133,21 @@ select n from t1;
|
|||
rollback;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Test for commit and FLUSH TABLES WITH READ LOCK
|
||||
#
|
||||
|
||||
create table t1 (n int not null primary key) type=innodb;
|
||||
start transaction;
|
||||
insert into t1 values (4);
|
||||
flush tables with read lock;
|
||||
--error 1223;
|
||||
commit;
|
||||
unlock tables;
|
||||
commit;
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Testing transactions
|
||||
#
|
||||
|
@ -925,3 +940,29 @@ SELECT t2.id, t1.label FROM t2 INNER JOIN
|
|||
(SELECT t1.id_object as id_object FROM t1 WHERE t1.label LIKE '%test%') AS lbl
|
||||
ON (t2.id = lbl.id_object) INNER JOIN t1 ON (t2.id = t1.id_object);
|
||||
drop table t1,t2;
|
||||
|
||||
#
|
||||
# Bug #1078
|
||||
#
|
||||
create table t1 (c1 char(5) unique not null, c2 int, stamp timestamp) type=innodb;
|
||||
select * from t1;
|
||||
--error 1031
|
||||
replace delayed into t1 (c1, c2) values ( "text1","11"),( "text2","12");
|
||||
select * from t1;
|
||||
--error 1031
|
||||
replace delayed into t1 (c1, c2) values ( "text1","12"),( "text2","13"),( "text3","14", "a" ),( "text4","15", "b" );
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
|
||||
create table t1 (a int, b varchar(200), c text not null) checksum=1 type=myisam;
|
||||
create table t2 (a int, b varchar(200), c text not null) checksum=0 type=innodb;
|
||||
create table t3 (a int, b varchar(200), c text not null) checksum=1 type=innodb;
|
||||
insert t1 values (1, "aaa", "bbb"), (NULL, "", "ccccc"), (0, NULL, "");
|
||||
insert t2 select * from t1;
|
||||
insert t3 select * from t1;
|
||||
checksum table t1, t2, t3, t4 quick;
|
||||
checksum table t1, t2, t3, t4;
|
||||
checksum table t1, t2, t3, t4 extended;
|
||||
#show table status;
|
||||
drop table t1,t2,t3;
|
||||
|
||||
|
|
|
@ -15,7 +15,3 @@ truncate table t1;
|
|||
load data infile '../../std_data/loaddata1.dat' into table t1 fields terminated by ',' LINES STARTING BY ',' (b,c,d);
|
||||
SELECT * from t1;
|
||||
drop table t1;
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -363,4 +363,15 @@ drop table t1,t2;
|
|||
CREATE TABLE t1 (`a` int(11) NOT NULL default '0', `b` int(11) NOT NULL default '0', UNIQUE KEY `a` USING RTREE (`a`,`b`)) TYPE=MyISAM;
|
||||
# INSERT INTO t1 VALUES (1,1),(1,1);
|
||||
# DELETE FROM rt WHERE a<1;
|
||||
DROP TABLE IF EXISTS t1;
|
||||
# DROP TABLE IF EXISTS t1;
|
||||
|
||||
create table t1 (a int, b varchar(200), c text not null) checksum=1;
|
||||
create table t2 (a int, b varchar(200), c text not null) checksum=0;
|
||||
insert t1 values (1, "aaa", "bbb"), (NULL, "", "ccccc"), (0, NULL, "");
|
||||
insert t2 select * from t1;
|
||||
checksum table t1, t2, t3 quick;
|
||||
checksum table t1, t2, t3;
|
||||
checksum table t1, t2, t3 extended;
|
||||
#show table status;
|
||||
drop table t1,t2;
|
||||
|
||||
|
|
|
@ -77,3 +77,14 @@ select product, country_id , year, sum(profit) from t1 group by product, country
|
|||
|
||||
drop table t1,t2;
|
||||
|
||||
#
|
||||
# Test bug with const tables
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (i int);
|
||||
INSERT INTO t1 VALUES(100);
|
||||
CREATE TABLE t2 (i int);
|
||||
INSERT INTO t2 VALUES (100),(200);
|
||||
SELECT i, COUNT(*) FROM t1 GROUP BY i WITH ROLLUP;
|
||||
SELECT t1.i, t2.i, COUNT(*) FROM t1,t2 GROUP BY t1.i,t2.i WITH ROLLUP;
|
||||
drop table t1,t2;
|
||||
|
|
60
mysql-test/t/rpl_openssl.test
Normal file
60
mysql-test/t/rpl_openssl.test
Normal file
|
@ -0,0 +1,60 @@
|
|||
source include/have_openssl_1.inc;
|
||||
source include/master-slave.inc;
|
||||
|
||||
# We don't test all types of ssl auth params here since it's a bit hard
|
||||
# until problems with OpenSSL 0.9.7 are unresolved
|
||||
|
||||
# creating replication user for whom ssl auth is required
|
||||
# preparing playground
|
||||
connection master;
|
||||
grant replication slave on *.* to replssl@'%' require ssl;
|
||||
create table t1 (t int);
|
||||
save_master_pos;
|
||||
|
||||
#syncing with master
|
||||
connection slave;
|
||||
sync_with_master;
|
||||
|
||||
#trying to use this user without ssl
|
||||
stop slave;
|
||||
change master to master_user='replssl',master_password='';
|
||||
start slave;
|
||||
|
||||
#showing that replication don't work
|
||||
connection master;
|
||||
insert into t1 values (1);
|
||||
#reasonable timeout for changes to propagate to slave
|
||||
sleep 3;
|
||||
connection slave;
|
||||
select * from t1;
|
||||
|
||||
#showing that replication could work with ssl params
|
||||
stop slave;
|
||||
--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR
|
||||
eval change master to master_ssl=1 , master_ssl_ca ='$MYSQL_TEST_DIR/std_data/cacert.pem', master_ssl_cert='$MYSQL_TEST_DIR/std_data/client-cert.pem', master_ssl_key='$MYSQL_TEST_DIR/std_data/client-key.pem';
|
||||
start slave;
|
||||
|
||||
#avoiding unneeded sleeps
|
||||
connection master;
|
||||
save_master_pos;
|
||||
connection slave;
|
||||
sync_with_master;
|
||||
|
||||
#checking that replication is ok
|
||||
select * from t1;
|
||||
|
||||
#checking show slave status
|
||||
--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR $MASTER_MYPORT MASTER_MYPORT
|
||||
show slave status;
|
||||
|
||||
#checking if replication works without ssl also performing clean up
|
||||
stop slave;
|
||||
change master to master_user='root',master_password='', master_ssl=0;
|
||||
start slave;
|
||||
connection master;
|
||||
drop table t1;
|
||||
save_master_pos;
|
||||
connection slave;
|
||||
sync_with_master;
|
||||
--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR $MASTER_MYPORT MASTER_MYPORT
|
||||
show slave status;
|
|
@ -901,3 +901,36 @@ insert into t3 values (1),(2),(10),(50);
|
|||
select a from t3 where t3.a in (select a from t1 where a <= 3 union select * from t2 where a <= 30);
|
||||
drop table t1,t2;
|
||||
|
||||
#
|
||||
# collation test
|
||||
#
|
||||
CREATE TABLE t1 (s1 CHAR(5) COLLATE latin1_german1_ci,
|
||||
s2 CHAR(5) COLLATE latin1_swedish_ci);
|
||||
INSERT INTO t1 VALUES ('z','?');
|
||||
-- error 1266
|
||||
select * from t1 where s1 > (select max(s2) from t1);
|
||||
-- error 1266
|
||||
select * from t1 where s1 > any (select max(s2) from t1);
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# aggregate functions reinitialization
|
||||
#
|
||||
create table t1(toid int,rd int);
|
||||
create table t2(userid int,pmnew int,pmtotal int);
|
||||
insert into t2 values(1,0,0),(2,0,0);
|
||||
insert into t1 values(1,0),(1,0),(1,0),(1,12),(1,15),(1,123),(1,12312),(1,12312),(1,123),(2,0),(2,0),(2,1),(2,2);
|
||||
select userid,pmtotal,pmnew, (select count(rd) from t1 where toid=t2.userid) calc_total, (select count(rd) from t1 where rd=0 and toid=t2.userid) calc_new from t2 where userid in (select distinct toid from t1);
|
||||
drop table t1, t2;
|
||||
|
||||
#
|
||||
# row union
|
||||
#
|
||||
create table t1 (s1 char(5));
|
||||
-- error 1240
|
||||
select (select 'a','b' from t1 union select 'a','b' from t1) from t1;
|
||||
insert into t1 values ('tttt');
|
||||
select * from t1 where ('a','b')=(select 'a','b' from t1 union select 'a','b' from t1);
|
||||
explain (select * from t1);
|
||||
(select * from t1);
|
||||
drop table t1;
|
||||
|
|
|
@ -29,7 +29,7 @@ libmysys_a_SOURCES = my_init.c my_getwd.c mf_getdate.c\
|
|||
mf_path.c mf_loadpath.c\
|
||||
my_open.c my_create.c my_dup.c my_seek.c my_read.c \
|
||||
my_pread.c my_write.c \
|
||||
mf_keycache.c \
|
||||
mf_keycache.c my_crc32.c \
|
||||
mf_iocache.c mf_iocache2.c mf_cache.c mf_tempfile.c \
|
||||
mf_tempdir.c my_lock.c mf_brkhant.c my_alarm.c \
|
||||
my_malloc.c my_realloc.c my_once.c mulalloc.c \
|
||||
|
|
|
@ -19,19 +19,22 @@
|
|||
#include "my_sys.h"
|
||||
|
||||
/*
|
||||
Calculate a long checksum for a memoryblock. Used to verify pack_isam
|
||||
|
||||
Calculate a long checksum for a memoryblock.
|
||||
|
||||
SYNOPSIS
|
||||
checksum()
|
||||
mem Pointer to memory block
|
||||
count Count of bytes
|
||||
my_checksum()
|
||||
crc start value for crc
|
||||
pos pointer to memory block
|
||||
length length of the block
|
||||
*/
|
||||
|
||||
ulong checksum(const byte *mem, uint count)
|
||||
ha_checksum my_checksum(ha_checksum crc, const byte *pos, uint length)
|
||||
{
|
||||
ulong crc;
|
||||
for (crc= 0; count-- ; mem++)
|
||||
crc= ((crc << 1) + *((uchar*) mem)) +
|
||||
test(crc & ((ulong) 1L << (8*sizeof(ulong)-1)));
|
||||
/* const byte *end=pos+length;
|
||||
for ( ; pos != end ; pos++)
|
||||
crc=((crc << 8) + *((uchar*) pos)) + (crc >> (8*sizeof(ha_checksum)-8));
|
||||
return crc;
|
||||
*/
|
||||
return (ha_checksum)crc32((uint)crc, (const uchar *)pos, length);
|
||||
}
|
||||
|
||||
|
|
36
mysys/my_crc32.c
Normal file
36
mysys/my_crc32.c
Normal file
|
@ -0,0 +1,36 @@
|
|||
/* Copyright (C) 2003 MySQL AB
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
#include "mysys_priv.h"
|
||||
|
||||
#ifndef HAVE_COMPRESS
|
||||
|
||||
/* minimal set of defines for using crc32() from zlib codebase */
|
||||
#define _ZLIB_H
|
||||
#define ZEXPORT
|
||||
#define Z_NULL 0
|
||||
#define OF(args) args
|
||||
#undef DYNAMIC_CRC_TABLE
|
||||
typedef uchar Byte;
|
||||
typedef uchar Bytef;
|
||||
typedef uint uInt;
|
||||
typedef ulong uLong;
|
||||
typedef ulong uLongf;
|
||||
|
||||
#include "../zlib/crc32.c"
|
||||
|
||||
#endif
|
||||
|
|
@ -24,26 +24,26 @@
|
|||
|
||||
/* My memory allocator */
|
||||
|
||||
gptr my_malloc(unsigned int Size, myf MyFlags)
|
||||
gptr my_malloc(unsigned int size, myf my_flags)
|
||||
{
|
||||
gptr point;
|
||||
DBUG_ENTER("my_malloc");
|
||||
DBUG_PRINT("my",("Size: %u MyFlags: %d",Size, MyFlags));
|
||||
DBUG_PRINT("my",("size: %u my_flags: %d",size, my_flags));
|
||||
|
||||
if (!Size)
|
||||
Size=1; /* Safety */
|
||||
if ((point = (char*)malloc(Size)) == NULL)
|
||||
if (!size)
|
||||
size=1; /* Safety */
|
||||
if ((point = (char*)malloc(size)) == NULL)
|
||||
{
|
||||
my_errno=errno;
|
||||
if (MyFlags & MY_FAE)
|
||||
if (my_flags & MY_FAE)
|
||||
error_handler_hook=fatal_error_handler_hook;
|
||||
if (MyFlags & (MY_FAE+MY_WME))
|
||||
my_error(EE_OUTOFMEMORY, MYF(ME_BELL+ME_WAITTANG),Size);
|
||||
if (MyFlags & MY_FAE)
|
||||
if (my_flags & (MY_FAE+MY_WME))
|
||||
my_error(EE_OUTOFMEMORY, MYF(ME_BELL+ME_WAITTANG),size);
|
||||
if (my_flags & MY_FAE)
|
||||
exit(1);
|
||||
}
|
||||
else if (MyFlags & MY_ZEROFILL)
|
||||
bzero(point,Size);
|
||||
else if (my_flags & MY_ZEROFILL)
|
||||
bzero(point,size);
|
||||
DBUG_PRINT("exit",("ptr: %lx",point));
|
||||
DBUG_RETURN(point);
|
||||
} /* my_malloc */
|
||||
|
@ -64,29 +64,29 @@ void my_no_flags_free(gptr ptr)
|
|||
|
||||
/* malloc and copy */
|
||||
|
||||
gptr my_memdup(const byte *from, uint length, myf MyFlags)
|
||||
gptr my_memdup(const byte *from, uint length, myf my_flags)
|
||||
{
|
||||
gptr ptr;
|
||||
if ((ptr=my_malloc(length,MyFlags)) != 0)
|
||||
if ((ptr=my_malloc(length,my_flags)) != 0)
|
||||
memcpy((byte*) ptr, (byte*) from,(size_t) length);
|
||||
return(ptr);
|
||||
}
|
||||
|
||||
|
||||
char *my_strdup(const char *from, myf MyFlags)
|
||||
char *my_strdup(const char *from, myf my_flags)
|
||||
{
|
||||
gptr ptr;
|
||||
uint length=(uint) strlen(from)+1;
|
||||
if ((ptr=my_malloc(length,MyFlags)) != 0)
|
||||
if ((ptr=my_malloc(length,my_flags)) != 0)
|
||||
memcpy((byte*) ptr, (byte*) from,(size_t) length);
|
||||
return((my_string) ptr);
|
||||
}
|
||||
|
||||
|
||||
char *my_strdup_with_length(const byte *from, uint length, myf MyFlags)
|
||||
char *my_strdup_with_length(const byte *from, uint length, myf my_flags)
|
||||
{
|
||||
gptr ptr;
|
||||
if ((ptr=my_malloc(length+1,MyFlags)) != 0)
|
||||
if ((ptr=my_malloc(length+1,my_flags)) != 0)
|
||||
{
|
||||
memcpy((byte*) ptr, (byte*) from,(size_t) length);
|
||||
((char*) ptr)[length]=0;
|
||||
|
|
|
@ -23,40 +23,41 @@
|
|||
|
||||
/* My memory re allocator */
|
||||
|
||||
gptr my_realloc(gptr oldpoint, uint Size, myf MyFlags)
|
||||
gptr my_realloc(gptr oldpoint, uint size, myf my_flags)
|
||||
{
|
||||
gptr point;
|
||||
DBUG_ENTER("my_realloc");
|
||||
DBUG_PRINT("my",("ptr: %lx Size: %u MyFlags: %d",oldpoint, Size, MyFlags));
|
||||
DBUG_PRINT("my",("ptr: %lx size: %u my_flags: %d",oldpoint, size,
|
||||
my_flags));
|
||||
|
||||
if (!oldpoint && (MyFlags & MY_ALLOW_ZERO_PTR))
|
||||
DBUG_RETURN(my_malloc(Size,MyFlags));
|
||||
if (!oldpoint && (my_flags & MY_ALLOW_ZERO_PTR))
|
||||
DBUG_RETURN(my_malloc(size,my_flags));
|
||||
#ifdef USE_HALLOC
|
||||
if (!(point = malloc(Size)))
|
||||
if (!(point = malloc(size)))
|
||||
{
|
||||
if (MyFlags & MY_FREE_ON_ERROR)
|
||||
my_free(oldpoint,MyFlags);
|
||||
if (MyFlags & MY_HOLD_ON_ERROR)
|
||||
if (my_flags & MY_FREE_ON_ERROR)
|
||||
my_free(oldpoint,my_flags);
|
||||
if (my_flags & MY_HOLD_ON_ERROR)
|
||||
DBUG_RETURN(oldpoint);
|
||||
my_errno=errno;
|
||||
if (MyFlags & MY_FAE+MY_WME)
|
||||
my_error(EE_OUTOFMEMORY, MYF(ME_BELL+ME_WAITTANG),Size);
|
||||
if (my_flags & MY_FAE+MY_WME)
|
||||
my_error(EE_OUTOFMEMORY, MYF(ME_BELL+ME_WAITTANG),size);
|
||||
}
|
||||
else
|
||||
{
|
||||
memcpy(point,oldpoint,Size);
|
||||
memcpy(point,oldpoint,size);
|
||||
free(oldpoint);
|
||||
}
|
||||
#else
|
||||
if ((point = (char*)realloc(oldpoint,Size)) == NULL)
|
||||
if ((point = (char*)realloc(oldpoint,size)) == NULL)
|
||||
{
|
||||
if (MyFlags & MY_FREE_ON_ERROR)
|
||||
if (my_flags & MY_FREE_ON_ERROR)
|
||||
my_free(oldpoint,MyFLAGS);
|
||||
if (MyFlags & MY_HOLD_ON_ERROR)
|
||||
if (my_flags & MY_HOLD_ON_ERROR)
|
||||
DBUG_RETURN(oldpoint);
|
||||
my_errno=errno;
|
||||
if (MyFlags & (MY_FAE+MY_WME))
|
||||
my_error(EE_OUTOFMEMORY, MYF(ME_BELL+ME_WAITTANG), Size);
|
||||
if (my_flags & (MY_FAE+MY_WME))
|
||||
my_error(EE_OUTOFMEMORY, MYF(ME_BELL+ME_WAITTANG), size);
|
||||
}
|
||||
#endif
|
||||
DBUG_PRINT("exit",("ptr: %lx",point));
|
||||
|
|
|
@ -86,6 +86,8 @@ client_libs='@CLIENT_LIBS@'
|
|||
|
||||
libs="$ldflags -L'$pkglibdir' -lmysqlclient $client_libs"
|
||||
libs=`echo $libs | sed -e 's; +;;'`
|
||||
libs_r="$ldflags -L'$pkglibdir' -lmysqlclient_r $client_libs"
|
||||
libs_r=`echo $libs_r | sed -e 's; +;;'`
|
||||
cflags="-I'$pkgincludedir'"
|
||||
embedded_libs="$ldflags -L'$pkglibdir' -lmysqld @LIBS@ @innodb_system_libs@"
|
||||
|
||||
|
@ -95,6 +97,7 @@ Usage: $0 [OPTIONS]
|
|||
Options:
|
||||
--cflags [$cflags]
|
||||
--libs [$libs]
|
||||
--libs_r [$libs_r]
|
||||
--socket [$socket]
|
||||
--port [$port]
|
||||
--version [$version]
|
||||
|
@ -109,6 +112,7 @@ while test $# -gt 0; do
|
|||
case $1 in
|
||||
--cflags) echo "$cflags" ;;
|
||||
--libs) echo "$libs" ;;
|
||||
--libs_r) echo "$libs_r" ;;
|
||||
--socket) echo "$socket" ;;
|
||||
--port) echo "$port" ;;
|
||||
--version) echo "$version" ;;
|
||||
|
|
|
@ -108,7 +108,7 @@ then
|
|||
c_u="$c_u CREATE TABLE user ("
|
||||
c_u="$c_u Host char(60) binary DEFAULT '' NOT NULL,"
|
||||
c_u="$c_u User char(16) binary DEFAULT '' NOT NULL,"
|
||||
c_u="$c_u Password char(45) binary DEFAULT '' NOT NULL,"
|
||||
c_u="$c_u Password char(41) binary DEFAULT '' NOT NULL,"
|
||||
c_u="$c_u Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
|
||||
c_u="$c_u Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
|
||||
c_u="$c_u Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
|
||||
|
|
|
@ -1,10 +1,22 @@
|
|||
-- This script converts any old privilege tables to privilege tables suitable
|
||||
-- for MySQL 4.0.
|
||||
|
||||
-- You can safely ignore all 'Duplicate column' and 'Unknown column' errors"
|
||||
-- as this just means that your tables where already up to date.
|
||||
-- This script is safe to run even if your tables are already up to date!
|
||||
|
||||
-- On unix, you should use the mysql_fix_privilege_tables script to execute
|
||||
-- this sql script.
|
||||
-- On windows you should do 'mysql --force < mysql_fix_privilege_tables.sql'
|
||||
|
||||
USE mysql;
|
||||
ALTER TABLE user type=MyISAM;
|
||||
ALTER TABLE db type=MyISAM;
|
||||
ALTER TABLE host type=MyISAM;
|
||||
ALTER TABLE func type=MyISAM;
|
||||
ALTER TABLE columns_priv type=MyISAM;
|
||||
ALTER TABLE tables_priv type=MyISAM;
|
||||
ALTER TABLE user change Password Password char(45) not null;
|
||||
ALTER TABLE user change Password Password char(41) not null;
|
||||
ALTER TABLE user add File_priv enum('N','Y') NOT NULL;
|
||||
CREATE TABLE IF NOT EXISTS func (
|
||||
name char(64) DEFAULT '' NOT NULL,
|
||||
|
|
|
@ -587,7 +587,7 @@ net_safe_read(MYSQL *mysql)
|
|||
DBUG_PRINT("error",("Wrong connection or packet. fd: %s len: %d",
|
||||
vio_description(net->vio),len));
|
||||
#ifdef MYSQL_SERVER
|
||||
if (socket_errno == SOCKET_EINTR)
|
||||
if (vio_errno(net->vio) == SOCKET_EINTR)
|
||||
return (packet_error);
|
||||
#endif /*MYSQL_SERVER*/
|
||||
end_server(mysql);
|
||||
|
@ -636,7 +636,7 @@ void free_rows(MYSQL_DATA *cur)
|
|||
}
|
||||
}
|
||||
|
||||
static my_bool
|
||||
static my_bool STDCALL
|
||||
cli_advanced_command(MYSQL *mysql, enum enum_server_command command,
|
||||
const char *header, ulong header_length,
|
||||
const char *arg, ulong arg_length, my_bool skip_check)
|
||||
|
@ -1008,7 +1008,7 @@ void mysql_read_default_options(struct st_mysql_options *options,
|
|||
else the lengths are calculated from the offset between pointers.
|
||||
**************************************************************************/
|
||||
|
||||
static void cli_fetch_lengths(ulong *to, MYSQL_ROW column, uint field_count)
|
||||
static void STDCALL cli_fetch_lengths(ulong *to, MYSQL_ROW column, uint field_count)
|
||||
{
|
||||
ulong *prev_length;
|
||||
byte *start=0;
|
||||
|
@ -1391,76 +1391,6 @@ mysql_ssl_free(MYSQL *mysql __attribute__((unused)))
|
|||
#endif /* HAVE_OPENSSL */
|
||||
|
||||
|
||||
/*
|
||||
Handle password authentication
|
||||
*/
|
||||
|
||||
my_bool mysql_autenticate(MYSQL *mysql, const char *passwd)
|
||||
{
|
||||
ulong pkt_length;
|
||||
NET *net= &mysql->net;
|
||||
char buff[SCRAMBLE41_LENGTH];
|
||||
char password_hash[SCRAMBLE41_LENGTH]; /* Used for storage of stage1 hash */
|
||||
|
||||
/* We shall only query server if it expect us to do so */
|
||||
if ((pkt_length=net_safe_read(mysql)) == packet_error)
|
||||
goto error;
|
||||
|
||||
if (mysql->server_capabilities & CLIENT_SECURE_CONNECTION)
|
||||
{
|
||||
/*
|
||||
This should always happen with new server unless empty password
|
||||
OK/Error packets have zero as the first char
|
||||
*/
|
||||
if (pkt_length == 24 && net->read_pos[0])
|
||||
{
|
||||
/* Old passwords will have '*' at the first byte of hash */
|
||||
if (net->read_pos[0] != '*')
|
||||
{
|
||||
/* Build full password hash as it is required to decode scramble */
|
||||
password_hash_stage1(buff, passwd);
|
||||
/* Store copy as we'll need it later */
|
||||
memcpy(password_hash,buff,SCRAMBLE41_LENGTH);
|
||||
/* Finally hash complete password using hash we got from server */
|
||||
password_hash_stage2(password_hash,(const char*) net->read_pos);
|
||||
/* Decypt and store scramble 4 = hash for stage2 */
|
||||
password_crypt((const char*) net->read_pos+4,mysql->scramble_buff,
|
||||
password_hash, SCRAMBLE41_LENGTH);
|
||||
mysql->scramble_buff[SCRAMBLE41_LENGTH]=0;
|
||||
/* Encode scramble with password. Recycle buffer */
|
||||
password_crypt(mysql->scramble_buff,buff,buff,SCRAMBLE41_LENGTH);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Create password to decode scramble */
|
||||
create_key_from_old_password(passwd,password_hash);
|
||||
/* Decypt and store scramble 4 = hash for stage2 */
|
||||
password_crypt((const char*) net->read_pos+4,mysql->scramble_buff,
|
||||
password_hash, SCRAMBLE41_LENGTH);
|
||||
mysql->scramble_buff[SCRAMBLE41_LENGTH]=0;
|
||||
/* Finally scramble decoded scramble with password */
|
||||
scramble(buff, mysql->scramble_buff, passwd,0);
|
||||
}
|
||||
/* Write second package of authentication */
|
||||
if (my_net_write(net,buff,SCRAMBLE41_LENGTH) || net_flush(net))
|
||||
{
|
||||
net->last_errno= CR_SERVER_LOST;
|
||||
strmov(net->sqlstate, unknown_sqlstate);
|
||||
strmov(net->last_error,ER(net->last_errno));
|
||||
goto error;
|
||||
}
|
||||
/* Read what server thinks about out new auth message report */
|
||||
if (net_safe_read(mysql) == packet_error)
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
error:
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Note that the mysql argument must be initialized with mysql_init()
|
||||
before calling mysql_real_connect !
|
||||
|
@ -1553,7 +1483,7 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
|
|||
mysql->server_status=SERVER_STATUS_AUTOCOMMIT;
|
||||
|
||||
/*
|
||||
Grab a socket and connect it to the server
|
||||
Part 0: Grab a socket and connect it to the server
|
||||
*/
|
||||
#if defined(HAVE_SMEM)
|
||||
if ((!mysql->options.protocol ||
|
||||
|
@ -1754,6 +1684,11 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
|
|||
strmov(net->last_error,ER(net->last_errno));
|
||||
goto error;
|
||||
}
|
||||
|
||||
/*
|
||||
Part 1: Connection established, read and parse first packet
|
||||
*/
|
||||
|
||||
if ((pkt_length=net_safe_read(mysql)) == packet_error)
|
||||
goto error;
|
||||
|
||||
|
@ -1774,8 +1709,13 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
|
|||
end=strend((char*) net->read_pos+1);
|
||||
mysql->thread_id=uint4korr(end+1);
|
||||
end+=5;
|
||||
strmake(mysql->scramble_buff,end,8);
|
||||
end+=9;
|
||||
/*
|
||||
Scramble is split into two parts because old clients does not understand
|
||||
long scrambles; here goes the first part.
|
||||
*/
|
||||
strmake(mysql->scramble, end, SCRAMBLE_LENGTH_323);
|
||||
end+= SCRAMBLE_LENGTH_323+1;
|
||||
|
||||
if (pkt_length >= (uint) (end+1 - (char*) net->read_pos))
|
||||
mysql->server_capabilities=uint2korr(end);
|
||||
if (pkt_length >= (uint) (end+18 - (char*) net->read_pos))
|
||||
|
@ -1784,6 +1724,14 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
|
|||
mysql->server_language=end[2];
|
||||
mysql->server_status=uint2korr(end+3);
|
||||
}
|
||||
end+= 18;
|
||||
if (pkt_length >= (uint) (end + SCRAMBLE_LENGTH - SCRAMBLE_LENGTH_323 + 1 -
|
||||
(char *) net->read_pos))
|
||||
strmake(mysql->scramble+SCRAMBLE_LENGTH_323, end,
|
||||
SCRAMBLE_LENGTH-SCRAMBLE_LENGTH_323);
|
||||
else
|
||||
mysql->server_capabilities&= ~CLIENT_SECURE_CONNECTION;
|
||||
|
||||
charset_number= mysql->server_language;
|
||||
|
||||
/* Set character set */
|
||||
|
@ -1860,9 +1808,12 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
|
|||
mysql->unix_socket=0;
|
||||
strmov(mysql->server_version,(char*) net->read_pos+1);
|
||||
mysql->port=port;
|
||||
client_flag|=mysql->options.client_flag;
|
||||
|
||||
/* Send client information for access check */
|
||||
/*
|
||||
Part 2: format and send client info to the server for access check
|
||||
*/
|
||||
|
||||
client_flag|=mysql->options.client_flag;
|
||||
client_flag|=CLIENT_CAPABILITIES;
|
||||
if (client_flag & CLIENT_MULTI_QUERIES)
|
||||
client_flag|= CLIENT_MULTI_RESULTS;
|
||||
|
@ -1949,7 +1900,7 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
|
|||
mysql->server_status, client_flag));
|
||||
/* This needs to be changed as it's not useful with big packets */
|
||||
if (user && user[0])
|
||||
strmake(end,user,32); /* Max user name */
|
||||
strmake(end,user,USERNAME_LENGTH); /* Max user name */
|
||||
else
|
||||
read_user_name((char*) end);
|
||||
|
||||
|
@ -1958,41 +1909,30 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
|
|||
#include "_cust_libmysql.h"
|
||||
#endif
|
||||
DBUG_PRINT("info",("user: %s",end));
|
||||
/*
|
||||
We always start with old type handshake the only difference is message sent
|
||||
If server handles secure connection type we'll not send the real scramble
|
||||
*/
|
||||
if (mysql->server_capabilities & CLIENT_SECURE_CONNECTION)
|
||||
end= strend(end) + 1;
|
||||
if (passwd[0])
|
||||
{
|
||||
if (passwd[0])
|
||||
if (mysql->server_capabilities & CLIENT_SECURE_CONNECTION)
|
||||
{
|
||||
/* Prepare false scramble */
|
||||
end=strend(end)+1;
|
||||
bfill(end, SCRAMBLE_LENGTH, 'x');
|
||||
end+=SCRAMBLE_LENGTH;
|
||||
*end=0;
|
||||
*end++= SCRAMBLE_LENGTH;
|
||||
scramble(end, mysql->scramble, passwd);
|
||||
end+= SCRAMBLE_LENGTH;
|
||||
}
|
||||
else /* For empty password*/
|
||||
else
|
||||
{
|
||||
end=strend(end)+1;
|
||||
*end=0; /* Store zero length scramble */
|
||||
scramble_323(end, mysql->scramble, passwd);
|
||||
end+= SCRAMBLE_LENGTH_323 + 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
Real scramble is only sent to old servers. This can be blocked
|
||||
by calling mysql_options(MYSQL *, MYSQL_SECURE_CONNECT, (char*) &1);
|
||||
*/
|
||||
end=scramble(strend(end)+1, mysql->scramble_buff, passwd,
|
||||
(my_bool) (mysql->protocol_version == 9));
|
||||
}
|
||||
*end++= '\0'; /* empty password */
|
||||
|
||||
/* Add database if needed */
|
||||
if (db && (mysql->server_capabilities & CLIENT_CONNECT_WITH_DB))
|
||||
{
|
||||
end=strmake(end+1,db,NAME_LEN);
|
||||
mysql->db=my_strdup(db,MYF(MY_WME));
|
||||
db=0;
|
||||
end= strmake(end, db, NAME_LEN) + 1;
|
||||
mysql->db= my_strdup(db,MYF(MY_WME));
|
||||
db= 0;
|
||||
}
|
||||
/* Write authentication package */
|
||||
if (my_net_write(net,buff,(ulong) (end-buff)) || net_flush(net))
|
||||
|
@ -2002,10 +1942,36 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
|
|||
strmov(net->last_error,ER(net->last_errno));
|
||||
goto error;
|
||||
}
|
||||
|
||||
/*
|
||||
Part 3: Authorization data's been sent. Now server can reply with
|
||||
OK-packet, or re-request scrambled password.
|
||||
*/
|
||||
|
||||
if (mysql_autenticate(mysql, passwd))
|
||||
if ((pkt_length=net_safe_read(mysql)) == packet_error)
|
||||
goto error;
|
||||
|
||||
if (pkt_length == 1 && net->read_pos[0] == 254 &&
|
||||
mysql->server_capabilities & CLIENT_SECURE_CONNECTION)
|
||||
{
|
||||
/*
|
||||
By sending this very specific reply server asks us to send scrambled
|
||||
password in old format.
|
||||
*/
|
||||
scramble_323(buff, mysql->scramble, passwd);
|
||||
if (my_net_write(net, buff, SCRAMBLE_LENGTH_323 + 1) || net_flush(net))
|
||||
{
|
||||
net->last_errno= CR_SERVER_LOST;
|
||||
strmov(net->sqlstate, unknown_sqlstate);
|
||||
strmov(net->last_error,ER(net->last_errno));
|
||||
goto error;
|
||||
}
|
||||
/* Read what server thinks about out new auth message report */
|
||||
if (net_safe_read(mysql) == packet_error)
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
||||
if (client_flag & CLIENT_COMPRESS) /* We will use compression */
|
||||
net->compress=1;
|
||||
|
||||
|
|
29
sql/field.h
29
sql/field.h
|
@ -305,6 +305,11 @@ public:
|
|||
unireg_check_arg, field_name_arg, table_arg,
|
||||
dec_arg, zero_arg,unsigned_arg)
|
||||
{}
|
||||
Field_decimal(uint32 len_arg,bool maybe_null_arg, const char *field_name_arg,
|
||||
struct st_table *table_arg,bool unsigned_arg)
|
||||
:Field_num((char*) 0, len_arg, maybe_null_arg ? (uchar*) "": 0,0,
|
||||
NONE, field_name_arg, table_arg,0,0,unsigned_arg)
|
||||
{}
|
||||
enum_field_types type() const { return FIELD_TYPE_DECIMAL;}
|
||||
enum ha_base_keytype key_type() const
|
||||
{ return zerofill ? HA_KEYTYPE_BINARY : HA_KEYTYPE_NUM; }
|
||||
|
@ -334,6 +339,11 @@ public:
|
|||
unireg_check_arg, field_name_arg, table_arg,
|
||||
0, zero_arg,unsigned_arg)
|
||||
{}
|
||||
Field_tiny(uint32 len_arg,bool maybe_null_arg, const char *field_name_arg,
|
||||
struct st_table *table_arg,bool unsigned_arg)
|
||||
:Field_num((char*) 0, len_arg, maybe_null_arg ? (uchar*) "": 0,0,
|
||||
NONE, field_name_arg, table_arg,0,0,unsigned_arg)
|
||||
{}
|
||||
enum Item_result result_type () const { return INT_RESULT; }
|
||||
enum_field_types type() const { return FIELD_TYPE_TINY;}
|
||||
enum ha_base_keytype key_type() const
|
||||
|
@ -364,6 +374,11 @@ public:
|
|||
unireg_check_arg, field_name_arg, table_arg,
|
||||
0, zero_arg,unsigned_arg)
|
||||
{}
|
||||
Field_short(uint32 len_arg,bool maybe_null_arg, const char *field_name_arg,
|
||||
struct st_table *table_arg,bool unsigned_arg)
|
||||
:Field_num((char*) 0, len_arg, maybe_null_arg ? (uchar*) "": 0,0,
|
||||
NONE, field_name_arg, table_arg,0,0,unsigned_arg)
|
||||
{}
|
||||
enum Item_result result_type () const { return INT_RESULT; }
|
||||
enum_field_types type() const { return FIELD_TYPE_SHORT;}
|
||||
enum ha_base_keytype key_type() const
|
||||
|
@ -497,6 +512,11 @@ public:
|
|||
unireg_check_arg, field_name_arg, table_arg,
|
||||
dec_arg, zero_arg,unsigned_arg)
|
||||
{}
|
||||
Field_float(uint32 len_arg, bool maybe_null_arg, const char *field_name_arg,
|
||||
struct st_table *table_arg, uint8 dec_arg)
|
||||
:Field_num((char*) 0, len_arg, maybe_null_arg ? (uchar*) "": 0, (uint) 0,
|
||||
NONE, field_name_arg, table_arg,dec_arg,0,0)
|
||||
{}
|
||||
enum_field_types type() const { return FIELD_TYPE_FLOAT;}
|
||||
enum ha_base_keytype key_type() const { return HA_KEYTYPE_FLOAT; }
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
|
@ -558,6 +578,11 @@ public:
|
|||
:Field_str(ptr_arg, len_arg, null, 1,
|
||||
unireg_check_arg, field_name_arg, table_arg, cs)
|
||||
{}
|
||||
Field_null(uint32 len_arg, const char *field_name_arg,
|
||||
struct st_table *table_arg, CHARSET_INFO *cs)
|
||||
:Field_str((char*) 0, len_arg, null, 1,
|
||||
NONE, field_name_arg, table_arg, cs)
|
||||
{}
|
||||
enum_field_types type() const { return FIELD_TYPE_NULL;}
|
||||
int store(const char *to, uint length, CHARSET_INFO *cs) { null[0]=1; return 0; }
|
||||
int store(double nr) { null[0]=1; return 0; }
|
||||
|
@ -627,6 +652,10 @@ public:
|
|||
:Field_tiny(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
|
||||
unireg_check_arg, field_name_arg, table_arg, 1, 1)
|
||||
{}
|
||||
Field_year(uint32 len_arg,bool maybe_null_arg, const char *field_name_arg,
|
||||
struct st_table *table_arg)
|
||||
:Field_tiny(len_arg,maybe_null_arg,field_name_arg,table_arg,1)
|
||||
{}
|
||||
enum_field_types type() const { return FIELD_TYPE_YEAR;}
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
|
|
|
@ -236,6 +236,8 @@ int ha_myisam::open(const char *name, int mode, uint test_if_locked)
|
|||
VOID(mi_extra(file, HA_EXTRA_WAIT_LOCK, 0));
|
||||
if (!table->db_record_offset)
|
||||
int_table_flags|=HA_REC_NOT_IN_SEQ;
|
||||
if (file->s->options & (HA_OPTION_CHECKSUM | HA_OPTION_COMPRESS_RECORD))
|
||||
int_table_flags|=HA_HAS_CHECKSUM;
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
@ -1414,3 +1416,9 @@ int ha_myisam::ft_read(byte * buf)
|
|||
table->status=error ? STATUS_NOT_FOUND: 0;
|
||||
return error;
|
||||
}
|
||||
|
||||
uint ha_myisam::checksum() const
|
||||
{
|
||||
return (uint)file->s->state.checksum;
|
||||
}
|
||||
|
||||
|
|
|
@ -64,6 +64,7 @@ class ha_myisam: public handler
|
|||
uint max_keys() const { return MI_MAX_KEY; }
|
||||
uint max_key_parts() const { return MAX_REF_PARTS; }
|
||||
uint max_key_length() const { return MI_MAX_KEY_LENGTH; }
|
||||
uint checksum() const;
|
||||
|
||||
int open(const char *name, int mode, uint test_if_locked);
|
||||
int close(void);
|
||||
|
|
|
@ -359,7 +359,10 @@ int ha_commit_trans(THD *thd, THD_TRANS* trans)
|
|||
if (trans == &thd->transaction.all && mysql_bin_log.is_open() &&
|
||||
my_b_tell(&thd->transaction.trans_log))
|
||||
{
|
||||
if (wait_if_global_read_lock(thd, 0))
|
||||
DBUG_RETURN(1);
|
||||
mysql_bin_log.write(thd, &thd->transaction.trans_log);
|
||||
start_waiting_global_read_lock(thd);
|
||||
reinit_io_cache(&thd->transaction.trans_log,
|
||||
WRITE_CACHE, (my_off_t) 0, 0, 1);
|
||||
thd->transaction.trans_log.end_of_file= max_binlog_cache_size;
|
||||
|
|
|
@ -42,38 +42,39 @@
|
|||
#define HA_ADMIN_INVALID -5
|
||||
|
||||
/* Bits in table_flags() to show what database can do */
|
||||
#define HA_READ_RND_SAME 1 /* Read RND-record to KEY-record
|
||||
(To update with RND-read) */
|
||||
#define HA_KEYPOS_TO_RNDPOS 2 /* ha_info gives pos to record */
|
||||
#define HA_TABLE_SCAN_ON_INDEX 4 /* No separate data/index file */
|
||||
#define HA_REC_NOT_IN_SEQ 8 /* ha_info don't return recnumber;
|
||||
It returns a position to ha_r_rnd */
|
||||
#define HA_HAS_GEOMETRY 16
|
||||
#define HA_NO_INDEX 32 /* No index needed for next/prev */
|
||||
#define HA_KEY_READ_WRONG_STR 64 /* keyread returns converted strings */
|
||||
#define HA_NULL_KEY 128 /* One can have keys with NULL */
|
||||
#define HA_DUPP_POS 256 /* ha_position() gives dupp row */
|
||||
#define HA_NO_BLOBS 512 /* Doesn't support blobs */
|
||||
#define HA_BLOB_KEY (HA_NO_BLOBS*2) /* key on blob */
|
||||
#define HA_AUTO_PART_KEY (HA_BLOB_KEY*2)
|
||||
#define HA_REQUIRE_PRIMARY_KEY (HA_AUTO_PART_KEY*2)
|
||||
#define HA_NOT_EXACT_COUNT (HA_REQUIRE_PRIMARY_KEY*2)
|
||||
#define HA_NO_WRITE_DELAYED (HA_NOT_EXACT_COUNT*2)
|
||||
#define HA_PRIMARY_KEY_IN_READ_INDEX (HA_NO_WRITE_DELAYED*2)
|
||||
#define HA_DROP_BEFORE_CREATE (HA_PRIMARY_KEY_IN_READ_INDEX*2)
|
||||
#define HA_NOT_READ_AFTER_KEY (HA_DROP_BEFORE_CREATE*2)
|
||||
#define HA_NOT_DELETE_WITH_CACHE (HA_NOT_READ_AFTER_KEY*2)
|
||||
#define HA_NO_TEMP_TABLES (HA_NOT_DELETE_WITH_CACHE*2)
|
||||
#define HA_NO_PREFIX_CHAR_KEYS (HA_NO_TEMP_TABLES*2)
|
||||
#define HA_CAN_FULLTEXT (HA_NO_PREFIX_CHAR_KEYS*2)
|
||||
#define HA_CAN_SQL_HANDLER (HA_CAN_FULLTEXT*2)
|
||||
#define HA_NO_AUTO_INCREMENT (HA_CAN_SQL_HANDLER*2)
|
||||
#define HA_READ_RND_SAME 1 /* Read RND-record to KEY-record
|
||||
(To update with RND-read) */
|
||||
#define HA_KEYPOS_TO_RNDPOS 2 /* ha_info gives pos to record */
|
||||
#define HA_TABLE_SCAN_ON_INDEX 4 /* No separate data/index file */
|
||||
#define HA_REC_NOT_IN_SEQ 8 /* ha_info don't return recnumber;
|
||||
It returns a position to ha_r_rnd */
|
||||
#define HA_HAS_GEOMETRY (1 << 4)
|
||||
#define HA_NO_INDEX (1 << 5) /* No index needed for next/prev */
|
||||
#define HA_KEY_READ_WRONG_STR (1 << 6) /* keyread returns converted strings */
|
||||
#define HA_NULL_KEY (1 << 7) /* One can have keys with NULL */
|
||||
#define HA_DUPP_POS (1 << 8) /* ha_position() gives dupp row */
|
||||
#define HA_NO_BLOBS (1 << 9) /* Doesn't support blobs */
|
||||
#define HA_BLOB_KEY (1 << 10) /* key on blob */
|
||||
#define HA_AUTO_PART_KEY (1 << 11)
|
||||
#define HA_REQUIRE_PRIMARY_KEY (1 << 12)
|
||||
#define HA_NOT_EXACT_COUNT (1 << 13)
|
||||
#define HA_NO_WRITE_DELAYED (1 << 14)
|
||||
#define HA_PRIMARY_KEY_IN_READ_INDEX (1 << 15)
|
||||
#define HA_DROP_BEFORE_CREATE (1 << 16)
|
||||
#define HA_NOT_READ_AFTER_KEY (1 << 17)
|
||||
#define HA_NOT_DELETE_WITH_CACHE (1 << 18)
|
||||
#define HA_NO_TEMP_TABLES (1 << 19)
|
||||
#define HA_NO_PREFIX_CHAR_KEYS (1 << 20)
|
||||
#define HA_CAN_FULLTEXT (1 << 21)
|
||||
#define HA_CAN_SQL_HANDLER (1 << 22)
|
||||
#define HA_NO_AUTO_INCREMENT (1 << 23)
|
||||
#define HA_HAS_CHECKSUM (1 << 24)
|
||||
|
||||
/*
|
||||
Next record gives next record according last record read (even
|
||||
if database is updated after read). Not used at this point.
|
||||
*/
|
||||
#define HA_LASTKEY_ORDER (HA_NO_AUTO_INCREMENT*2)
|
||||
#define HA_LASTKEY_ORDER (1 << 25)
|
||||
|
||||
|
||||
/* bits in index_flags(index_number) for what you can do with index */
|
||||
|
@ -306,8 +307,8 @@ public:
|
|||
virtual bool check_and_repair(THD *thd) {return 1;}
|
||||
virtual int optimize(THD* thd,HA_CHECK_OPT* check_opt);
|
||||
virtual int analyze(THD* thd, HA_CHECK_OPT* check_opt);
|
||||
virtual int backup(THD* thd, HA_CHECK_OPT* check_opt);
|
||||
virtual int preload_keys(THD* thd, HA_CHECK_OPT* check_opt);
|
||||
virtual int backup(THD* thd, HA_CHECK_OPT* check_opt);
|
||||
/*
|
||||
restore assumes .frm file must exist, and that generate_table() has been
|
||||
called; It will just copy the data file and run repair.
|
||||
|
@ -325,8 +326,8 @@ public:
|
|||
virtual char* get_foreign_key_create_info()
|
||||
{ return(NULL);} /* gets foreign key create string from InnoDB */
|
||||
virtual void init_table_handle_for_HANDLER()
|
||||
{ return; } /* prepare InnoDB for HANDLER */
|
||||
virtual void free_foreign_key_create_info(char* str) {}
|
||||
{ return; } /* prepare InnoDB for HANDLER */
|
||||
virtual void free_foreign_key_create_info(char* str) {}
|
||||
/* The following can be called without an open handler */
|
||||
virtual const char *table_type() const =0;
|
||||
virtual const char **bas_ext() const =0;
|
||||
|
@ -342,6 +343,7 @@ public:
|
|||
virtual uint max_key_part_length() { return 255; }
|
||||
virtual uint min_record_length(uint options) const { return 1; }
|
||||
virtual bool low_byte_first() const { return 1; }
|
||||
virtual uint checksum() const { return 0; }
|
||||
virtual bool is_crashed() const { return 0; }
|
||||
virtual bool auto_repair() const { return 0; }
|
||||
|
||||
|
@ -355,13 +357,12 @@ public:
|
|||
|
||||
/* Type of table for caching query */
|
||||
virtual uint8 table_cache_type() { return HA_CACHE_TBL_NONTRANSACT; }
|
||||
/*
|
||||
Is query with this cable cachable (have sense only for ASKTRANSACT
|
||||
/*
|
||||
Is query with this table cachable (have sense only for ASKTRANSACT
|
||||
tables)
|
||||
*/
|
||||
static bool caching_allowed(THD* thd, char* table_key,
|
||||
static bool caching_allowed(THD* thd, char* table_key,
|
||||
uint key_length, uint8 cahe_type);
|
||||
|
||||
};
|
||||
|
||||
/* Some extern variables used with handlers */
|
||||
|
@ -390,7 +391,7 @@ int ha_delete_table(enum db_type db_type, const char *path);
|
|||
void ha_drop_database(char* path);
|
||||
void ha_key_cache(void);
|
||||
void ha_resize_key_cache(void);
|
||||
int ha_start_stmt(THD *thd);
|
||||
int ha_start_stmt(THD *thd);
|
||||
int ha_report_binlog_offset_and_commit(THD *thd, char *log_file_name,
|
||||
my_off_t end_offset);
|
||||
int ha_commit_complete(THD *thd);
|
||||
|
|
98
sql/item.cc
98
sql/item.cc
|
@ -490,27 +490,38 @@ String *Item_null::val_str(String *str)
|
|||
|
||||
/* Item_param related */
|
||||
void Item_param::set_null()
|
||||
{
|
||||
maybe_null=null_value=1;
|
||||
{
|
||||
DBUG_ENTER("Item_param::set_null");
|
||||
maybe_null= null_value= 1;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
void Item_param::set_int(longlong i)
|
||||
{
|
||||
int_value=(longlong)i;
|
||||
item_type = INT_ITEM;
|
||||
{
|
||||
DBUG_ENTER("Item_param::set_int");
|
||||
int_value= (longlong)i;
|
||||
item_type= INT_ITEM;
|
||||
DBUG_PRINT("info", ("integer: %lld", int_value));
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
void Item_param::set_double(double value)
|
||||
{
|
||||
{
|
||||
DBUG_ENTER("Item_param::set_double");
|
||||
real_value=value;
|
||||
item_type = REAL_ITEM;
|
||||
item_type= REAL_ITEM;
|
||||
DBUG_PRINT("info", ("double: %lg", real_value));
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
void Item_param::set_value(const char *str, uint length)
|
||||
{
|
||||
str_value.set(str,length,default_charset());
|
||||
item_type = STRING_ITEM;
|
||||
{
|
||||
DBUG_ENTER("Item_param::set_value");
|
||||
str_value.copy(str,length,default_charset());
|
||||
item_type= STRING_ITEM;
|
||||
DBUG_PRINT("info", ("string: %s", str_value.ptr()));
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
|
@ -923,6 +934,73 @@ enum_field_types Item::field_type() const
|
|||
FIELD_TYPE_DOUBLE);
|
||||
}
|
||||
|
||||
Field *Item::tmp_table_field_from_field_type(TABLE *table)
|
||||
{
|
||||
switch (field_type())
|
||||
{
|
||||
case MYSQL_TYPE_DECIMAL:
|
||||
return new Field_decimal(max_length, maybe_null, name, table,
|
||||
unsigned_flag);
|
||||
case MYSQL_TYPE_TINY:
|
||||
return new Field_tiny(max_length, maybe_null, name, table,
|
||||
unsigned_flag);
|
||||
case MYSQL_TYPE_SHORT:
|
||||
return new Field_short(max_length, maybe_null, name, table,
|
||||
unsigned_flag);
|
||||
case MYSQL_TYPE_LONG:
|
||||
return new Field_long(max_length, maybe_null, name, table,
|
||||
unsigned_flag);
|
||||
case MYSQL_TYPE_FLOAT:
|
||||
return new Field_float(max_length, maybe_null, name, table, decimals);
|
||||
case MYSQL_TYPE_DOUBLE:
|
||||
return new Field_double(max_length, maybe_null, name, table, decimals);
|
||||
case MYSQL_TYPE_NULL:
|
||||
return new Field_null(max_length, name, table, &my_charset_bin);
|
||||
#ifdef HAVE_LONG_LONG
|
||||
case MYSQL_TYPE_LONGLONG:
|
||||
return new Field_longlong(max_length, maybe_null, name, table,
|
||||
unsigned_flag);
|
||||
#endif
|
||||
case MYSQL_TYPE_NEWDATE:
|
||||
case MYSQL_TYPE_INT24:
|
||||
return new Field_long(max_length, maybe_null, name, table,
|
||||
unsigned_flag);
|
||||
case MYSQL_TYPE_DATE:
|
||||
return new Field_date(maybe_null, name, table, &my_charset_bin);
|
||||
case MYSQL_TYPE_TIME:
|
||||
return new Field_time(maybe_null, name, table, &my_charset_bin);
|
||||
case MYSQL_TYPE_TIMESTAMP:
|
||||
case MYSQL_TYPE_DATETIME:
|
||||
return new Field_datetime(maybe_null, name, table, &my_charset_bin);
|
||||
case MYSQL_TYPE_YEAR:
|
||||
return new Field_year(max_length, maybe_null, name, table);
|
||||
case MYSQL_TYPE_ENUM:
|
||||
case MYSQL_TYPE_SET:
|
||||
return new Field_long(max_length, maybe_null, name, table,
|
||||
unsigned_flag);
|
||||
case MYSQL_TYPE_TINY_BLOB:
|
||||
case MYSQL_TYPE_MEDIUM_BLOB:
|
||||
case MYSQL_TYPE_LONG_BLOB:
|
||||
case MYSQL_TYPE_BLOB:
|
||||
case MYSQL_TYPE_GEOMETRY:
|
||||
return new Field_blob(max_length, maybe_null, name, table, collation.collation);
|
||||
case MYSQL_TYPE_VAR_STRING:
|
||||
if (max_length > 255)
|
||||
return new Field_blob(max_length, maybe_null, name, table, collation.collation);
|
||||
else
|
||||
return new Field_varstring(max_length, maybe_null, name, table, collation.collation);
|
||||
case MYSQL_TYPE_STRING:
|
||||
if (max_length > 255)
|
||||
return new Field_blob(max_length, maybe_null, name, table, collation.collation);
|
||||
else
|
||||
return new Field_string(max_length, maybe_null, name, table, collation.collation);
|
||||
default:
|
||||
// This case should never be choosen
|
||||
DBUG_ASSERT(0);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* ARGSUSED */
|
||||
void Item_field::make_field(Send_field *tmp_field)
|
||||
{
|
||||
|
|
16
sql/item.h
16
sql/item.h
|
@ -120,6 +120,9 @@ public:
|
|||
Constructor used by Item_field, Item_ref & agregate (sum) functions.
|
||||
Used for duplicating lists in processing queries with temporary
|
||||
tables
|
||||
Also it used for Item_cond_and/Item_cond_or for creating
|
||||
top AND/OR ctructure of WHERE clause to protect it of
|
||||
optimisation changes in prepared statements
|
||||
*/
|
||||
Item(THD *thd, Item &item);
|
||||
virtual ~Item() { name=0; } /*lint -e1509 */
|
||||
|
@ -140,7 +143,7 @@ public:
|
|||
virtual double val()=0;
|
||||
virtual longlong val_int()=0;
|
||||
virtual String *val_str(String*)=0;
|
||||
virtual Field *tmp_table_field() { return 0; }
|
||||
virtual Field *get_tmp_table_field() { return 0; }
|
||||
virtual Field *tmp_table_field(TABLE *t_arg) { return 0; }
|
||||
virtual const char *full_name() const { return name ? name : "???"; }
|
||||
virtual double val_result() { return val(); }
|
||||
|
@ -184,6 +187,7 @@ public:
|
|||
virtual void save_in_result_field(bool no_conversions) {}
|
||||
virtual void no_rows_in_result() {}
|
||||
virtual Item *copy_or_same(THD *thd) { return this; }
|
||||
virtual Item *copy_andor_structure(THD *thd) { return this; }
|
||||
virtual Item *real_item() { return this; }
|
||||
virtual Item *get_tmp_table_item(THD *thd) { return copy_or_same(thd); }
|
||||
|
||||
|
@ -205,6 +209,8 @@ public:
|
|||
virtual bool null_inside() { return 0; }
|
||||
// used in row subselects to get value of elements
|
||||
virtual void bring_value() {}
|
||||
|
||||
Field *tmp_table_field_from_field_type(TABLE *table);
|
||||
};
|
||||
|
||||
|
||||
|
@ -265,7 +271,7 @@ public:
|
|||
{
|
||||
return field->type();
|
||||
}
|
||||
Field *tmp_table_field() { return result_field; }
|
||||
Field *get_tmp_table_field() { return result_field; }
|
||||
Field *tmp_table_field(TABLE *t_arg) { return result_field; }
|
||||
bool get_date(TIME *ltime,bool fuzzydate);
|
||||
bool get_date_result(TIME *ltime,bool fuzzydate);
|
||||
|
@ -539,12 +545,12 @@ class Item_result_field :public Item /* Item with result field */
|
|||
public:
|
||||
Field *result_field; /* Save result here */
|
||||
Item_result_field() :result_field(0) {}
|
||||
// Constructor used for Item_sum (see Item comment)
|
||||
// Constructor used for Item_sum/Item_cond_and/or (see Item comment)
|
||||
Item_result_field(THD *thd, Item_result_field &item):
|
||||
Item(thd, item), result_field(item.result_field)
|
||||
{}
|
||||
~Item_result_field() {} /* Required with gcc 2.95 */
|
||||
Field *tmp_table_field() { return result_field; }
|
||||
Field *get_tmp_table_field() { return result_field; }
|
||||
Field *tmp_table_field(TABLE *t_arg) { return result_field; }
|
||||
table_map used_tables() const { return 1; }
|
||||
virtual void fix_length_and_dec()=0;
|
||||
|
@ -862,6 +868,7 @@ public:
|
|||
{
|
||||
value= item->val_int_result();
|
||||
null_value= item->null_value;
|
||||
collation.set(item->collation);
|
||||
}
|
||||
double val() { return (double) value; }
|
||||
longlong val_int() { return value; }
|
||||
|
@ -879,6 +886,7 @@ public:
|
|||
{
|
||||
value= item->val_result();
|
||||
null_value= item->null_value;
|
||||
collation.set(item->collation);
|
||||
}
|
||||
double val() { return value; }
|
||||
longlong val_int() { return (longlong) (value+(value > 0 ? 0.5 : -0.5)); }
|
||||
|
|
|
@ -698,8 +698,21 @@ Item_func_ifnull::fix_length_and_dec()
|
|||
agg_arg_collations(collation, args, arg_count);
|
||||
else if (cached_result_type != REAL_RESULT)
|
||||
decimals= 0;
|
||||
|
||||
cached_field_type= args[0]->field_type();
|
||||
if (cached_field_type != args[1]->field_type())
|
||||
cached_field_type= Item_func::field_type();
|
||||
}
|
||||
|
||||
enum_field_types Item_func_ifnull::field_type() const
|
||||
{
|
||||
return cached_field_type;
|
||||
}
|
||||
|
||||
Field *Item_func_ifnull::tmp_table_field(TABLE *table)
|
||||
{
|
||||
return tmp_table_field_from_field_type(table);
|
||||
}
|
||||
|
||||
double
|
||||
Item_func_ifnull::val()
|
||||
|
@ -1536,6 +1549,31 @@ longlong Item_func_bit_and::val_int()
|
|||
return (longlong) (arg1 & arg2);
|
||||
}
|
||||
|
||||
Item_cond::Item_cond(THD *thd, Item_cond &item)
|
||||
:Item_bool_func(thd, item),
|
||||
abort_on_null(item.abort_on_null),
|
||||
and_tables_cache(item.and_tables_cache)
|
||||
{
|
||||
/*
|
||||
here should be following text:
|
||||
|
||||
List_iterator_fast<Item*> li(item.list);
|
||||
while(Item *it= li++)
|
||||
list.push_back(it);
|
||||
|
||||
but it do not need,
|
||||
because this constructor used only for AND/OR and
|
||||
argument list will be copied by copy_andor_arguments call
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
void Item_cond::copy_andor_arguments(THD *thd, Item_cond *item)
|
||||
{
|
||||
List_iterator_fast<Item> li(item->list);
|
||||
while(Item *it= li++)
|
||||
list.push_back(it->copy_andor_structure(thd));
|
||||
}
|
||||
|
||||
bool
|
||||
Item_cond::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
|
||||
|
|
|
@ -82,6 +82,7 @@ public:
|
|||
Item_bool_func() :Item_int_func() {}
|
||||
Item_bool_func(Item *a) :Item_int_func(a) {}
|
||||
Item_bool_func(Item *a,Item *b) :Item_int_func(a,b) {}
|
||||
Item_bool_func(THD *thd, Item_bool_func &item) :Item_int_func(thd, item) {}
|
||||
void fix_length_and_dec() { decimals=0; max_length=1; }
|
||||
};
|
||||
|
||||
|
@ -115,8 +116,8 @@ protected:
|
|||
String tmp_value1,tmp_value2;
|
||||
|
||||
public:
|
||||
Item_bool_func2(Item *a,Item *b):
|
||||
Item_int_func(a,b), cmp(tmp_arg, tmp_arg+1) {}
|
||||
Item_bool_func2(Item *a,Item *b)
|
||||
:Item_int_func(a,b), cmp(tmp_arg, tmp_arg+1) {}
|
||||
void fix_length_and_dec();
|
||||
void set_cmp_func()
|
||||
{
|
||||
|
@ -158,7 +159,7 @@ public:
|
|||
class Item_func_eq :public Item_bool_rowready_func2
|
||||
{
|
||||
public:
|
||||
Item_func_eq(Item *a,Item *b) :Item_bool_rowready_func2(a,b) {};
|
||||
Item_func_eq(Item *a,Item *b) :Item_bool_rowready_func2(a,b) {}
|
||||
longlong val_int();
|
||||
enum Functype functype() const { return EQ_FUNC; }
|
||||
enum Functype rev_functype() const { return EQ_FUNC; }
|
||||
|
@ -280,6 +281,8 @@ public:
|
|||
class Item_func_ifnull :public Item_func
|
||||
{
|
||||
enum Item_result cached_result_type;
|
||||
enum_field_types cached_field_type;
|
||||
bool field_type_defined;
|
||||
public:
|
||||
Item_func_ifnull(Item *a,Item *b)
|
||||
:Item_func(a,b), cached_result_type(INT_RESULT)
|
||||
|
@ -288,8 +291,10 @@ public:
|
|||
longlong val_int();
|
||||
String *val_str(String *str);
|
||||
enum Item_result result_type () const { return cached_result_type; }
|
||||
enum_field_types field_type() const;
|
||||
void fix_length_and_dec();
|
||||
const char *func_name() const { return "ifnull"; }
|
||||
Field *tmp_table_field(TABLE *table);
|
||||
table_map not_null_tables() const { return 0; }
|
||||
};
|
||||
|
||||
|
@ -787,8 +792,13 @@ protected:
|
|||
public:
|
||||
/* Item_cond() is only used to create top level items */
|
||||
Item_cond() : Item_bool_func(), abort_on_null(1) { const_item_cache=0; }
|
||||
Item_cond(Item *i1,Item *i2) :Item_bool_func(), abort_on_null(0)
|
||||
{ list.push_back(i1); list.push_back(i2); }
|
||||
Item_cond(Item *i1,Item *i2)
|
||||
:Item_bool_func(), abort_on_null(0)
|
||||
{
|
||||
list.push_back(i1);
|
||||
list.push_back(i2);
|
||||
}
|
||||
Item_cond(THD *thd, Item_cond &item);
|
||||
~Item_cond() { list.delete_elements(); }
|
||||
bool add(Item *item) { return list.push_back(item); }
|
||||
bool fix_fields(THD *, struct st_table_list *, Item **ref);
|
||||
|
@ -801,6 +811,7 @@ public:
|
|||
void split_sum_func(Item **ref_pointer_array, List<Item> &fields);
|
||||
friend int setup_conds(THD *thd,TABLE_LIST *tables,COND **conds);
|
||||
void top_level_item() { abort_on_null=1; }
|
||||
void copy_andor_arguments(THD *thd, Item_cond *item);
|
||||
|
||||
bool walk(Item_processor processor, byte *arg);
|
||||
};
|
||||
|
@ -811,9 +822,17 @@ class Item_cond_and :public Item_cond
|
|||
public:
|
||||
Item_cond_and() :Item_cond() {}
|
||||
Item_cond_and(Item *i1,Item *i2) :Item_cond(i1,i2) {}
|
||||
Item_cond_and(THD *thd, Item_cond_and &item) :Item_cond(thd, item) {}
|
||||
enum Functype functype() const { return COND_AND_FUNC; }
|
||||
longlong val_int();
|
||||
const char *func_name() const { return "and"; }
|
||||
Item* copy_andor_structure(THD *thd)
|
||||
{
|
||||
Item_cond_and *item;
|
||||
if((item= new Item_cond_and(thd, *this)))
|
||||
item->copy_andor_arguments(thd, this);
|
||||
return item;
|
||||
}
|
||||
};
|
||||
|
||||
class Item_cond_or :public Item_cond
|
||||
|
@ -821,10 +840,18 @@ class Item_cond_or :public Item_cond
|
|||
public:
|
||||
Item_cond_or() :Item_cond() {}
|
||||
Item_cond_or(Item *i1,Item *i2) :Item_cond(i1,i2) {}
|
||||
Item_cond_or(THD *thd, Item_cond_or &item) :Item_cond(thd, item) {}
|
||||
enum Functype functype() const { return COND_OR_FUNC; }
|
||||
longlong val_int();
|
||||
const char *func_name() const { return "or"; }
|
||||
table_map not_null_tables() const { return and_tables_cache; }
|
||||
Item* copy_andor_structure(THD *thd)
|
||||
{
|
||||
Item_cond_or *item;
|
||||
if((item= new Item_cond_or(thd, *this)))
|
||||
item->copy_andor_arguments(thd, this);
|
||||
return item;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -52,13 +52,6 @@ Item *create_func_ord(Item* a)
|
|||
return new Item_func_ord(a);
|
||||
}
|
||||
|
||||
Item *create_func_old_password(Item* a)
|
||||
{
|
||||
return new Item_func_old_password(a);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Item *create_func_asin(Item* a)
|
||||
{
|
||||
return new Item_func_asin(a);
|
||||
|
@ -107,14 +100,6 @@ Item *create_func_cot(Item* a)
|
|||
new Item_func_tan(a));
|
||||
}
|
||||
|
||||
|
||||
#ifdef HAVE_COMPRESS
|
||||
Item *create_func_crc32(Item* a)
|
||||
{
|
||||
return new Item_func_crc32(a);
|
||||
}
|
||||
#endif
|
||||
|
||||
Item *create_func_date_format(Item* a,Item *b)
|
||||
{
|
||||
return new Item_func_date_format(a,b,0);
|
||||
|
@ -332,11 +317,6 @@ Item *create_func_quarter(Item* a)
|
|||
return new Item_func_quarter(a);
|
||||
}
|
||||
|
||||
Item *create_func_password(Item* a)
|
||||
{
|
||||
return new Item_func_password(a);
|
||||
}
|
||||
|
||||
Item *create_func_radians(Item *a)
|
||||
{
|
||||
return new Item_func_units((char*) "radians",a,M_PI/180,0.0);
|
||||
|
@ -666,13 +646,10 @@ Item *create_func_point(Item *a, Item *b)
|
|||
return new Item_func_point(a, b);
|
||||
}
|
||||
|
||||
#if !defined(HAVE_COMPRESS)
|
||||
|
||||
Item *create_func_compress (Item*a __attribute__((unused))){return 0;}
|
||||
Item *create_func_uncompress (Item*a __attribute__((unused))){return 0;}
|
||||
Item *create_func_uncompressed_length(Item*a __attribute__((unused))){return 0;}
|
||||
|
||||
#else
|
||||
Item *create_func_crc32(Item* a)
|
||||
{
|
||||
return new Item_func_crc32(a);
|
||||
}
|
||||
|
||||
Item *create_func_compress(Item* a)
|
||||
{
|
||||
|
@ -689,8 +666,6 @@ Item *create_func_uncompressed_length(Item* a)
|
|||
return new Item_func_uncompressed_length(a);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
Item *create_func_datediff(Item *a, Item *b)
|
||||
{
|
||||
return new Item_func_minus(new Item_func_to_days(a),
|
||||
|
|
|
@ -33,9 +33,7 @@ Item *create_func_connection_id(void);
|
|||
Item *create_func_conv(Item* a, Item *b, Item *c);
|
||||
Item *create_func_cos(Item* a);
|
||||
Item *create_func_cot(Item* a);
|
||||
#ifdef HAVE_COMPRESS
|
||||
Item *create_func_crc32(Item* a);
|
||||
#endif
|
||||
Item *create_func_date_format(Item* a,Item *b);
|
||||
Item *create_func_dayname(Item* a);
|
||||
Item *create_func_dayofmonth(Item* a);
|
||||
|
@ -69,14 +67,12 @@ Item *create_func_monthname(Item* a);
|
|||
Item *create_func_nullif(Item* a, Item *b);
|
||||
Item *create_func_oct(Item *);
|
||||
Item *create_func_ord(Item* a);
|
||||
Item *create_func_old_password(Item* a);
|
||||
Item *create_func_period_add(Item* a, Item *b);
|
||||
Item *create_func_period_diff(Item* a, Item *b);
|
||||
Item *create_func_pi(void);
|
||||
Item *create_func_pow(Item* a, Item *b);
|
||||
Item *create_func_current_user(void);
|
||||
Item *create_func_quarter(Item* a);
|
||||
Item *create_func_password(Item* a);
|
||||
Item *create_func_radians(Item *a);
|
||||
Item *create_func_release_lock(Item* a);
|
||||
Item *create_func_repeat(Item* a, Item *b);
|
||||
|
|
|
@ -27,22 +27,18 @@
|
|||
#include <hash.h>
|
||||
#include <time.h>
|
||||
#include <ft_global.h>
|
||||
#ifdef HAVE_COMPRESS
|
||||
#include <zlib.h>
|
||||
#endif
|
||||
|
||||
|
||||
static void my_coll_agg_error(DTCollation &c1, DTCollation &c2,
|
||||
const char *fname)
|
||||
{
|
||||
my_error(ER_CANT_AGGREGATE_2COLLATIONS,MYF(0),
|
||||
c1.collation->name,c1.derivation_name(),
|
||||
c1.collation->name,c1.derivation_name(),
|
||||
c2.collation->name,c2.derivation_name(),
|
||||
fname);
|
||||
}
|
||||
|
||||
|
||||
static void my_coll_agg_error(DTCollation &c1,
|
||||
static void my_coll_agg_error(DTCollation &c1,
|
||||
DTCollation &c2,
|
||||
DTCollation &c3,
|
||||
const char *fname)
|
||||
|
@ -134,6 +130,27 @@ Item_func::Item_func(List<Item> &list)
|
|||
set_arguments(list);
|
||||
}
|
||||
|
||||
Item_func::Item_func(THD *thd, Item_func &item)
|
||||
:Item_result_field(thd, item),
|
||||
allowed_arg_cols(item.allowed_arg_cols),
|
||||
arg_count(item.arg_count),
|
||||
used_tables_cache(item.used_tables_cache),
|
||||
not_null_tables_cache(item.not_null_tables_cache),
|
||||
const_item_cache(item.const_item_cache)
|
||||
{
|
||||
if (arg_count)
|
||||
{
|
||||
if (arg_count <=2)
|
||||
args= tmp_arg;
|
||||
else
|
||||
{
|
||||
if (!(args=(Item**) thd->alloc(sizeof(Item*)*arg_count)))
|
||||
return;
|
||||
}
|
||||
memcpy((char*) args, (char*) item.args, sizeof(Item*)*arg_count);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Resolve references to table column for a function and it's argument
|
||||
|
@ -1085,36 +1102,6 @@ longlong Item_func_min_max::val_int()
|
|||
return value;
|
||||
}
|
||||
|
||||
|
||||
#ifdef HAVE_COMPRESS
|
||||
longlong Item_func_crc32::val_int()
|
||||
{
|
||||
String *res=args[0]->val_str(&value);
|
||||
if (!res)
|
||||
{
|
||||
null_value=1;
|
||||
return 0; /* purecov: inspected */
|
||||
}
|
||||
null_value=0;
|
||||
return (longlong) crc32(0L, (Bytef*)res->ptr(), res->length());
|
||||
}
|
||||
|
||||
|
||||
longlong Item_func_uncompressed_length::val_int()
|
||||
{
|
||||
String *res= args[0]->val_str(&value);
|
||||
if (!res)
|
||||
{
|
||||
null_value=1;
|
||||
return 0; /* purecov: inspected */
|
||||
}
|
||||
null_value=0;
|
||||
if (res->is_empty()) return 0;
|
||||
return uint4korr(res->c_ptr()) & 0x3FFFFFFF;
|
||||
}
|
||||
#endif /* HAVE_COMPRESS */
|
||||
|
||||
|
||||
longlong Item_func_length::val_int()
|
||||
{
|
||||
String *res=args[0]->val_str(&value);
|
||||
|
|
|
@ -104,6 +104,8 @@ public:
|
|||
}
|
||||
}
|
||||
Item_func(List<Item> &list);
|
||||
// Constructor used for Item_cond_and/or (see Item comment)
|
||||
Item_func(THD *thd, Item_func &item);
|
||||
~Item_func() {} /* Nothing to do; Items are freed automaticly */
|
||||
bool fix_fields(THD *,struct st_table_list *, Item **ref);
|
||||
table_map used_tables() const;
|
||||
|
@ -196,6 +198,7 @@ public:
|
|||
Item_int_func(Item *a,Item *b) :Item_func(a,b) { max_length=21; }
|
||||
Item_int_func(Item *a,Item *b,Item *c) :Item_func(a,b,c) { max_length=21; }
|
||||
Item_int_func(List<Item> &list) :Item_func(list) { max_length=21; }
|
||||
Item_int_func(THD *thd, Item_int_func &item) :Item_func(thd, item) {}
|
||||
double val() { return (double) val_int(); }
|
||||
String *val_str(String*str);
|
||||
enum Item_result result_type () const { return INT_RESULT; }
|
||||
|
@ -555,27 +558,6 @@ public:
|
|||
};
|
||||
|
||||
|
||||
#ifdef HAVE_COMPRESS
|
||||
class Item_func_crc32 :public Item_int_func
|
||||
{
|
||||
String value;
|
||||
public:
|
||||
Item_func_crc32(Item *a) :Item_int_func(a) {}
|
||||
longlong val_int();
|
||||
const char *func_name() const { return "crc32"; }
|
||||
void fix_length_and_dec() { max_length=10; }
|
||||
};
|
||||
class Item_func_uncompressed_length : public Item_int_func
|
||||
{
|
||||
String value;
|
||||
public:
|
||||
Item_func_uncompressed_length(Item *a):Item_int_func(a){}
|
||||
longlong val_int();
|
||||
const char *func_name() const{return "uncompressed_length";}
|
||||
void fix_length_and_dec() { max_length=10; }
|
||||
};
|
||||
#endif
|
||||
|
||||
class Item_func_length :public Item_int_func
|
||||
{
|
||||
String value;
|
||||
|
|
|
@ -167,30 +167,6 @@ public:
|
|||
const char *func_name() const { return "multipoint"; }
|
||||
};
|
||||
|
||||
#ifdef HAVE_COMPRESS
|
||||
|
||||
class Item_func_compress: public Item_str_func
|
||||
{
|
||||
String buffer;
|
||||
public:
|
||||
Item_func_compress(Item *a):Item_str_func(a){}
|
||||
String *val_str(String *);
|
||||
void fix_length_and_dec(){max_length= (args[0]->max_length*120)/100+12;}
|
||||
const char *func_name() const{return "compress";}
|
||||
};
|
||||
|
||||
class Item_func_uncompress: public Item_str_func
|
||||
{
|
||||
String buffer;
|
||||
public:
|
||||
Item_func_uncompress(Item *a): Item_str_func(a){}
|
||||
String *val_str(String *);
|
||||
void fix_length_and_dec(){max_length= MAX_BLOB_WIDTH;}
|
||||
const char *func_name() const{return "uncompress";}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
Spatial relations
|
||||
*/
|
||||
|
|
|
@ -1327,95 +1327,49 @@ void Item_func_trim::fix_length_and_dec()
|
|||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void Item_func_password::fix_length_and_dec()
|
||||
{
|
||||
/*
|
||||
If PASSWORD() was called with only one argument, it depends on a random
|
||||
number so we need to save this random number into the binary log.
|
||||
If called with two arguments, it is repeatable.
|
||||
*/
|
||||
if (arg_count == 1)
|
||||
{
|
||||
THD *thd= current_thd;
|
||||
thd->rand_used= 1;
|
||||
thd->rand_saved_seed1= thd->rand.seed1;
|
||||
thd->rand_saved_seed2= thd->rand.seed2;
|
||||
}
|
||||
max_length= get_password_length(use_old_passwords);
|
||||
}
|
||||
|
||||
/*
|
||||
Password() function has 2 arguments. Second argument can be used
|
||||
to make results repeatable
|
||||
*/
|
||||
/* Item_func_password */
|
||||
|
||||
String *Item_func_password::val_str(String *str)
|
||||
{
|
||||
struct rand_struct rand_st; // local structure for 2 param version
|
||||
ulong seed=0; // seed to initialise random generator to
|
||||
|
||||
String *res =args[0]->val_str(str);
|
||||
if ((null_value=args[0]->null_value))
|
||||
return 0;
|
||||
|
||||
if (arg_count == 1)
|
||||
{
|
||||
if (res->length() == 0)
|
||||
return &empty_string;
|
||||
make_scrambled_password(tmp_value,res->c_ptr(),use_old_passwords,
|
||||
¤t_thd->rand);
|
||||
str->set(tmp_value,get_password_length(use_old_passwords),res->charset());
|
||||
return str;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* We'll need the buffer to get second parameter */
|
||||
char key_buff[80];
|
||||
String tmp_key_value(key_buff, sizeof(key_buff), system_charset_info);
|
||||
String *key =args[1]->val_str(&tmp_key_value);
|
||||
|
||||
/* Check second argument for NULL value. First one is already checked */
|
||||
if ((null_value=args[1]->null_value))
|
||||
return 0;
|
||||
|
||||
/* This shall be done after checking for null for proper results */
|
||||
if (res->length() == 0)
|
||||
return &empty_string;
|
||||
|
||||
/* Generate the seed first this allows to avoid double allocation */
|
||||
char* seed_ptr=key->c_ptr();
|
||||
while (*seed_ptr)
|
||||
{
|
||||
seed=(seed*211+*seed_ptr) & 0xffffffffL; /* Use simple hashing */
|
||||
seed_ptr++;
|
||||
}
|
||||
|
||||
/* Use constants which allow nice random values even with small seed */
|
||||
randominit(&rand_st,
|
||||
(ulong) ((ulonglong) seed*111111+33333333L) & (ulong) 0xffffffff,
|
||||
(ulong) ((ulonglong) seed*1111+55555555L) & (ulong) 0xffffffff);
|
||||
|
||||
make_scrambled_password(tmp_value,res->c_ptr(),use_old_passwords,
|
||||
&rand_st);
|
||||
str->set(tmp_value,get_password_length(use_old_passwords),res->charset());
|
||||
return str;
|
||||
}
|
||||
}
|
||||
|
||||
String *Item_func_old_password::val_str(String *str)
|
||||
{
|
||||
String *res =args[0]->val_str(str);
|
||||
String *res= args[0]->val_str(str);
|
||||
if ((null_value=args[0]->null_value))
|
||||
return 0;
|
||||
if (res->length() == 0)
|
||||
return &empty_string;
|
||||
make_scrambled_password(tmp_value,res->c_ptr(),1,¤t_thd->rand);
|
||||
str->set(tmp_value,16,res->charset());
|
||||
make_scrambled_password(tmp_value, res->c_ptr());
|
||||
str->set(tmp_value, SCRAMBLED_PASSWORD_CHAR_LENGTH, res->charset());
|
||||
return str;
|
||||
}
|
||||
|
||||
char *Item_func_password::alloc(THD *thd, const char *password)
|
||||
{
|
||||
char *buff= (char *) thd->alloc(SCRAMBLED_PASSWORD_CHAR_LENGTH+1);
|
||||
if (buff)
|
||||
make_scrambled_password(buff, password);
|
||||
return buff;
|
||||
}
|
||||
|
||||
/* Item_func_old_password */
|
||||
|
||||
String *Item_func_old_password::val_str(String *str)
|
||||
{
|
||||
String *res= args[0]->val_str(str);
|
||||
if ((null_value=args[0]->null_value))
|
||||
return 0;
|
||||
if (res->length() == 0)
|
||||
return &empty_string;
|
||||
make_scrambled_password_323(tmp_value, res->c_ptr());
|
||||
str->set(tmp_value, SCRAMBLED_PASSWORD_CHAR_LENGTH_323, res->charset());
|
||||
return str;
|
||||
}
|
||||
|
||||
char *Item_func_old_password::alloc(THD *thd, const char *password)
|
||||
{
|
||||
char *buff= (char *) thd->alloc(SCRAMBLED_PASSWORD_CHAR_LENGTH_323+1);
|
||||
if (buff)
|
||||
make_scrambled_password_323(buff, password);
|
||||
return buff;
|
||||
}
|
||||
|
||||
|
||||
#define bin_to_ascii(c) ((c)>=38?((c)-38+'a'):(c)>=12?((c)-12+'A'):(c)+'.')
|
||||
|
@ -2554,6 +2508,31 @@ null:
|
|||
return 0;
|
||||
}
|
||||
|
||||
longlong Item_func_uncompressed_length::val_int()
|
||||
{
|
||||
String *res= args[0]->val_str(&value);
|
||||
if (!res)
|
||||
{
|
||||
null_value=1;
|
||||
return 0; /* purecov: inspected */
|
||||
}
|
||||
null_value=0;
|
||||
if (res->is_empty()) return 0;
|
||||
return uint4korr(res->c_ptr()) & 0x3FFFFFFF;
|
||||
}
|
||||
|
||||
longlong Item_func_crc32::val_int()
|
||||
{
|
||||
String *res=args[0]->val_str(&value);
|
||||
if (!res)
|
||||
{
|
||||
null_value=1;
|
||||
return 0; /* purecov: inspected */
|
||||
}
|
||||
null_value=0;
|
||||
return (longlong) crc32(0L, (uchar*)res->ptr(), res->length());
|
||||
}
|
||||
|
||||
#ifdef HAVE_COMPRESS
|
||||
#include "zlib.h"
|
||||
|
||||
|
@ -2581,7 +2560,7 @@ String *Item_func_compress::val_str(String *str)
|
|||
|
||||
buffer.realloc((uint32)new_size + 4 + 1);
|
||||
Byte *body= ((Byte*)buffer.c_ptr()) + 4;
|
||||
|
||||
|
||||
if ((err= compress(body, &new_size,
|
||||
(const Bytef*)res->c_ptr(), res->length())) != Z_OK)
|
||||
{
|
||||
|
@ -2603,7 +2582,7 @@ String *Item_func_compress::val_str(String *str)
|
|||
}
|
||||
|
||||
buffer.length((uint32)new_size + 4);
|
||||
|
||||
|
||||
return &buffer;
|
||||
}
|
||||
|
||||
|
@ -2615,7 +2594,7 @@ String *Item_func_uncompress::val_str(String *str)
|
|||
ulong new_size= uint4korr(res->c_ptr()) & 0x3FFFFFFF;
|
||||
int err= Z_OK;
|
||||
uint code;
|
||||
|
||||
|
||||
if (new_size > MAX_BLOB_WIDTH)
|
||||
{
|
||||
push_warning_printf(current_thd,MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||
|
@ -2624,21 +2603,20 @@ String *Item_func_uncompress::val_str(String *str)
|
|||
null_value= 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
buffer.realloc((uint32)new_size);
|
||||
|
||||
if ((err= uncompress((Byte*)buffer.c_ptr(), &new_size,
|
||||
|
||||
if ((err= uncompress((Byte*)buffer.c_ptr(), &new_size,
|
||||
((const Bytef*)res->c_ptr())+4,res->length())) == Z_OK)
|
||||
{
|
||||
buffer.length((uint32)new_size);
|
||||
return &buffer;
|
||||
}
|
||||
|
||||
code= err==Z_BUF_ERROR ? ER_ZLIB_Z_BUF_ERROR :
|
||||
|
||||
code= err==Z_BUF_ERROR ? ER_ZLIB_Z_BUF_ERROR :
|
||||
err==Z_MEM_ERROR ? ER_ZLIB_Z_MEM_ERROR : ER_ZLIB_Z_DATA_ERROR;
|
||||
push_warning(current_thd,MYSQL_ERROR::WARN_LEVEL_ERROR,code,ER(code));
|
||||
null_value= 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -254,30 +254,45 @@ public:
|
|||
};
|
||||
|
||||
|
||||
/*
|
||||
Item_func_password -- new (4.1.1) PASSWORD() function implementation.
|
||||
Returns strcat('*', octet2hex(sha1(sha1(password)))). '*' stands for new
|
||||
password format, sha1(sha1(password) is so-called hash_stage2 value.
|
||||
Length of returned string is always 41 byte. To find out how entire
|
||||
authentification procedure works, see comments in password.c.
|
||||
*/
|
||||
|
||||
class Item_func_password :public Item_str_func
|
||||
{
|
||||
char tmp_value[64]; /* This should be enough for new password format */
|
||||
char tmp_value[SCRAMBLED_PASSWORD_CHAR_LENGTH+1];
|
||||
public:
|
||||
Item_func_password(Item *a) :Item_str_func(a) {}
|
||||
Item_func_password(Item *a, Item *b) :Item_str_func(a,b) {}
|
||||
String *val_str(String *);
|
||||
void fix_length_and_dec();
|
||||
String *val_str(String *str);
|
||||
void fix_length_and_dec() { max_length= SCRAMBLED_PASSWORD_CHAR_LENGTH; }
|
||||
const char *func_name() const { return "password"; }
|
||||
static char *alloc(THD *thd, const char *password);
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
Item_func_old_password -- PASSWORD() implementation used in MySQL 3.21 - 4.0
|
||||
compatibility mode. This item is created in sql_yacc.yy when
|
||||
'old_passwords' session variable is set, and to handle OLD_PASSWORD()
|
||||
function.
|
||||
*/
|
||||
|
||||
class Item_func_old_password :public Item_str_func
|
||||
{
|
||||
char tmp_value[17]; /* old password length +1 */
|
||||
char tmp_value[SCRAMBLED_PASSWORD_CHAR_LENGTH_323+1];
|
||||
public:
|
||||
Item_func_old_password(Item *a) :Item_str_func(a) {}
|
||||
String *val_str(String *);
|
||||
void fix_length_and_dec() { max_length = get_password_length(1); }
|
||||
String *val_str(String *str);
|
||||
void fix_length_and_dec() { max_length= SCRAMBLED_PASSWORD_CHAR_LENGTH_323; }
|
||||
const char *func_name() const { return "old_password"; }
|
||||
static char *alloc(THD *thd, const char *password);
|
||||
};
|
||||
|
||||
|
||||
|
||||
class Item_func_des_encrypt :public Item_str_func
|
||||
{
|
||||
String tmp_value;
|
||||
|
@ -624,9 +639,56 @@ public:
|
|||
Item_func_collation(Item *a) :Item_str_func(a) {}
|
||||
String *val_str(String *);
|
||||
const char *func_name() const { return "collation"; }
|
||||
void fix_length_and_dec()
|
||||
void fix_length_and_dec()
|
||||
{
|
||||
max_length=40; // should be enough
|
||||
collation.set(system_charset_info);
|
||||
};
|
||||
};
|
||||
|
||||
class Item_func_crc32 :public Item_int_func
|
||||
{
|
||||
String value;
|
||||
public:
|
||||
Item_func_crc32(Item *a) :Item_int_func(a) {}
|
||||
const char *func_name() const { return "crc32"; }
|
||||
void fix_length_and_dec() { max_length=10; }
|
||||
longlong val_int();
|
||||
};
|
||||
|
||||
class Item_func_uncompressed_length : public Item_int_func
|
||||
{
|
||||
String value;
|
||||
public:
|
||||
Item_func_uncompressed_length(Item *a):Item_int_func(a){}
|
||||
const char *func_name() const{return "uncompressed_length";}
|
||||
void fix_length_and_dec() { max_length=10; }
|
||||
longlong val_int();
|
||||
};
|
||||
|
||||
#ifdef HAVE_COMPRESS
|
||||
#define ZLIB_DEPENDED_FUNCTION ;
|
||||
#else
|
||||
#define ZLIB_DEPENDED_FUNCTION { null_value=1; return 0; }
|
||||
#endif
|
||||
|
||||
class Item_func_compress: public Item_str_func
|
||||
{
|
||||
String buffer;
|
||||
public:
|
||||
Item_func_compress(Item *a):Item_str_func(a){}
|
||||
void fix_length_and_dec(){max_length= (args[0]->max_length*120)/100+12;}
|
||||
const char *func_name() const{return "compress";}
|
||||
String *val_str(String *) ZLIB_DEPENDED_FUNCTION
|
||||
};
|
||||
|
||||
class Item_func_uncompress: public Item_str_func
|
||||
{
|
||||
String buffer;
|
||||
public:
|
||||
Item_func_uncompress(Item *a): Item_str_func(a){}
|
||||
void fix_length_and_dec(){max_length= MAX_BLOB_WIDTH;}
|
||||
const char *func_name() const{return "uncompress";}
|
||||
String *val_str(String *) ZLIB_DEPENDED_FUNCTION
|
||||
};
|
||||
|
||||
|
|
|
@ -72,7 +72,7 @@ Item_subselect::trans_res
|
|||
Item_subselect::select_transformer(JOIN *join)
|
||||
{
|
||||
DBUG_ENTER("Item_subselect::select_transformer");
|
||||
DBUG_RETURN(OK);
|
||||
DBUG_RETURN(RES_OK);
|
||||
}
|
||||
|
||||
|
||||
|
@ -214,14 +214,14 @@ Item_singlerow_subselect::select_transformer(JOIN *join)
|
|||
cond= join->having;
|
||||
else
|
||||
if (!(cond= new Item_cond_and(join->conds, join->having)))
|
||||
return ERROR;
|
||||
return RES_ERROR;
|
||||
if (!(substitution= new Item_func_if(cond, substitution,
|
||||
new Item_null())))
|
||||
return ERROR;
|
||||
return RES_ERROR;
|
||||
}
|
||||
return REDUCE;
|
||||
return RES_REDUCE;
|
||||
}
|
||||
return OK;
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
void Item_singlerow_subselect::store(uint i, Item *item)
|
||||
|
@ -508,7 +508,7 @@ Item_in_subselect::single_value_transformer(JOIN *join,
|
|||
if (!optimizer || optimizer->fix_left(thd, up->get_table_list(), 0))
|
||||
{
|
||||
thd->lex.current_select= current;
|
||||
DBUG_RETURN(ERROR);
|
||||
DBUG_RETURN(RES_ERROR);
|
||||
}
|
||||
thd->lex.current_select= current;
|
||||
|
||||
|
@ -528,7 +528,7 @@ Item_in_subselect::single_value_transformer(JOIN *join,
|
|||
if (select_lex->item_list.elements > 1)
|
||||
{
|
||||
my_error(ER_CARDINALITY_COL, MYF(0), 1);
|
||||
DBUG_RETURN(ERROR);
|
||||
DBUG_RETURN(RES_ERROR);
|
||||
}
|
||||
|
||||
item= (Item*) select_lex->item_list.head();
|
||||
|
@ -546,7 +546,7 @@ Item_in_subselect::single_value_transformer(JOIN *join,
|
|||
if (join->having->fix_fields(thd, join->tables_list, &join->having))
|
||||
{
|
||||
select_lex->having_fix_field= 0;
|
||||
DBUG_RETURN(ERROR);
|
||||
DBUG_RETURN(RES_ERROR);
|
||||
}
|
||||
select_lex->having_fix_field= 0;
|
||||
}
|
||||
|
@ -570,7 +570,7 @@ Item_in_subselect::single_value_transformer(JOIN *join,
|
|||
if (join->having->fix_fields(thd, join->tables_list, &join->having))
|
||||
{
|
||||
select_lex->having_fix_field= 0;
|
||||
DBUG_RETURN(ERROR);
|
||||
DBUG_RETURN(RES_ERROR);
|
||||
}
|
||||
select_lex->having_fix_field= 0;
|
||||
item= new Item_cond_or(item,
|
||||
|
@ -578,7 +578,7 @@ Item_in_subselect::single_value_transformer(JOIN *join,
|
|||
}
|
||||
join->conds= and_items(join->conds, item);
|
||||
if (join->conds->fix_fields(thd, join->tables_list, &join->conds))
|
||||
DBUG_RETURN(ERROR);
|
||||
DBUG_RETURN(RES_ERROR);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -592,7 +592,7 @@ Item_in_subselect::single_value_transformer(JOIN *join,
|
|||
if (join->having->fix_fields(thd, join->tables_list, &join->having))
|
||||
{
|
||||
select_lex->having_fix_field= 0;
|
||||
DBUG_RETURN(ERROR);
|
||||
DBUG_RETURN(RES_ERROR);
|
||||
}
|
||||
select_lex->having_fix_field= 0;
|
||||
}
|
||||
|
@ -610,11 +610,11 @@ Item_in_subselect::single_value_transformer(JOIN *join,
|
|||
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
|
||||
ER_SELECT_REDUCED, warn_buff);
|
||||
}
|
||||
DBUG_RETURN(REDUCE);
|
||||
DBUG_RETURN(RES_REDUCE);
|
||||
}
|
||||
}
|
||||
}
|
||||
DBUG_RETURN(OK);
|
||||
DBUG_RETURN(RES_OK);
|
||||
}
|
||||
|
||||
Item_subselect::trans_res
|
||||
|
@ -640,7 +640,7 @@ Item_in_subselect::row_value_transformer(JOIN *join,
|
|||
if (!optimizer || optimizer->fix_left(thd, up->get_table_list(), 0))
|
||||
{
|
||||
thd->lex.current_select= current;
|
||||
DBUG_RETURN(ERROR);
|
||||
DBUG_RETURN(RES_ERROR);
|
||||
}
|
||||
thd->lex.current_select= current;
|
||||
|
||||
|
@ -679,7 +679,7 @@ Item_in_subselect::row_value_transformer(JOIN *join,
|
|||
if (join->having->fix_fields(thd, join->tables_list, &join->having))
|
||||
{
|
||||
select_lex->having_fix_field= 0;
|
||||
DBUG_RETURN(ERROR);
|
||||
DBUG_RETURN(RES_ERROR);
|
||||
}
|
||||
select_lex->having_fix_field= 0;
|
||||
}
|
||||
|
@ -687,9 +687,9 @@ Item_in_subselect::row_value_transformer(JOIN *join,
|
|||
{
|
||||
join->conds= and_items(join->conds, item);
|
||||
if (join->conds->fix_fields(thd, join->tables_list, &join->having))
|
||||
DBUG_RETURN(ERROR);
|
||||
DBUG_RETURN(RES_ERROR);
|
||||
}
|
||||
DBUG_RETURN(OK);
|
||||
DBUG_RETURN(RES_OK);
|
||||
}
|
||||
|
||||
Item_subselect::trans_res
|
||||
|
@ -846,7 +846,7 @@ void subselect_union_engine::fix_length_and_dec(Item_cache **row)
|
|||
SELECT_LEX *sl= unit->first_select();
|
||||
bool fake= 0;
|
||||
res_type= set_row(sl, item, row, &fake);
|
||||
for (sl= sl->next_select(); sl; sl->next_select())
|
||||
for (sl= sl->next_select(); sl; sl= sl->next_select())
|
||||
{
|
||||
List_iterator_fast<Item> li(sl->item_list);
|
||||
Item *sel_item;
|
||||
|
|
|
@ -51,7 +51,7 @@ public:
|
|||
/* changed engine indicator */
|
||||
bool engine_changed;
|
||||
|
||||
enum trans_res {OK, REDUCE, ERROR};
|
||||
enum trans_res {RES_OK, RES_REDUCE, RES_ERROR};
|
||||
enum subs_type {UNKNOWN_SUBS, SINGLEROW_SUBS,
|
||||
EXISTS_SUBS, IN_SUBS, ALLANY_SUBS};
|
||||
|
||||
|
|
|
@ -223,10 +223,9 @@ Item *Item_sum_sum::copy_or_same(THD* thd)
|
|||
}
|
||||
|
||||
|
||||
bool Item_sum_sum::reset()
|
||||
void Item_sum_sum::clear()
|
||||
{
|
||||
null_value=1; sum=0.0;
|
||||
return Item_sum_sum::add();
|
||||
}
|
||||
|
||||
|
||||
|
@ -251,10 +250,9 @@ Item *Item_sum_count::copy_or_same(THD* thd)
|
|||
}
|
||||
|
||||
|
||||
bool Item_sum_count::reset()
|
||||
void Item_sum_count::clear()
|
||||
{
|
||||
count=0;
|
||||
return add();
|
||||
count= 0;
|
||||
}
|
||||
|
||||
|
||||
|
@ -286,10 +284,9 @@ Item *Item_sum_avg::copy_or_same(THD* thd)
|
|||
}
|
||||
|
||||
|
||||
bool Item_sum_avg::reset()
|
||||
void Item_sum_avg::clear()
|
||||
{
|
||||
sum=0.0; count=0;
|
||||
return Item_sum_avg::add();
|
||||
}
|
||||
|
||||
|
||||
|
@ -342,11 +339,10 @@ Item *Item_sum_variance::copy_or_same(THD* thd)
|
|||
}
|
||||
|
||||
|
||||
bool Item_sum_variance::reset()
|
||||
void Item_sum_variance::clear()
|
||||
{
|
||||
sum=sum_sqr=0.0;
|
||||
count=0;
|
||||
return Item_sum_variance::add();
|
||||
}
|
||||
|
||||
bool Item_sum_variance::add()
|
||||
|
@ -592,10 +588,9 @@ longlong Item_sum_bit::val_int()
|
|||
}
|
||||
|
||||
|
||||
bool Item_sum_bit::reset()
|
||||
void Item_sum_bit::clear()
|
||||
{
|
||||
bits=reset_bits;
|
||||
return add();
|
||||
bits= reset_bits;
|
||||
}
|
||||
|
||||
Item *Item_sum_or::copy_or_same(THD* thd)
|
||||
|
@ -1280,7 +1275,7 @@ Item *Item_sum_count_distinct::copy_or_same(THD* thd)
|
|||
}
|
||||
|
||||
|
||||
bool Item_sum_count_distinct::reset()
|
||||
void Item_sum_count_distinct::clear()
|
||||
{
|
||||
if (use_tree)
|
||||
reset_tree(tree);
|
||||
|
@ -1290,7 +1285,6 @@ bool Item_sum_count_distinct::reset()
|
|||
table->file->delete_all_rows();
|
||||
table->file->extra(HA_EXTRA_WRITE_CACHE);
|
||||
}
|
||||
return add();
|
||||
}
|
||||
|
||||
bool Item_sum_count_distinct::add()
|
||||
|
@ -1353,11 +1347,11 @@ longlong Item_sum_count_distinct::val_int()
|
|||
|
||||
#ifdef HAVE_DLOPEN
|
||||
|
||||
bool Item_udf_sum::reset()
|
||||
void Item_udf_sum::clear()
|
||||
{
|
||||
DBUG_ENTER("Item_udf_sum::reset");
|
||||
udf.reset(&null_value);
|
||||
DBUG_RETURN(0);
|
||||
DBUG_ENTER("Item_udf_sum::clear");
|
||||
udf.clear();
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
bool Item_udf_sum::add()
|
||||
|
@ -1466,7 +1460,7 @@ int group_concat_key_cmp_with_distinct(void* arg, byte* key1,
|
|||
for (uint i= 0; i < item->arg_count_field; i++)
|
||||
{
|
||||
Item *field_item= item->args[i];
|
||||
Field *field= field_item->tmp_table_field();
|
||||
Field *field= field_item->real_item()->get_tmp_table_field();
|
||||
if (field)
|
||||
{
|
||||
uint offset= field->abs_offset;
|
||||
|
@ -1497,7 +1491,7 @@ int group_concat_key_cmp_with_order(void* arg, byte* key1, byte* key2)
|
|||
{
|
||||
ORDER *order_item= item->order[i];
|
||||
Item *item= *order_item->item;
|
||||
Field *field= item->tmp_table_field();
|
||||
Field *field= item->real_item()->get_tmp_table_field();
|
||||
if (field)
|
||||
{
|
||||
uint offset= field->abs_offset;
|
||||
|
@ -1548,7 +1542,7 @@ int dump_leaf_key(byte* key, uint32 count __attribute__((unused)),
|
|||
Item *show_item= group_concat_item->args[i];
|
||||
if (!show_item->const_item())
|
||||
{
|
||||
Field *f= show_item->tmp_table_field();
|
||||
Field *f= show_item->real_item()->get_tmp_table_field();
|
||||
char *sv= f->ptr;
|
||||
f->ptr= (char *)key + f->abs_offset;
|
||||
String *res= f->val_str(&tmp,&tmp2);
|
||||
|
@ -1685,7 +1679,7 @@ Item *Item_func_group_concat::copy_or_same(THD* thd)
|
|||
}
|
||||
|
||||
|
||||
bool Item_func_group_concat::reset()
|
||||
void Item_func_group_concat::clear()
|
||||
{
|
||||
result.length(0);
|
||||
result.copy();
|
||||
|
@ -1699,7 +1693,6 @@ bool Item_func_group_concat::reset()
|
|||
}
|
||||
if (tree_mode)
|
||||
reset_tree(tree);
|
||||
return add();
|
||||
}
|
||||
|
||||
|
||||
|
@ -1716,7 +1709,7 @@ bool Item_func_group_concat::add()
|
|||
Item *show_item= args[i];
|
||||
if (!show_item->const_item())
|
||||
{
|
||||
Field *f= show_item->tmp_table_field();
|
||||
Field *f= show_item->real_item()->get_tmp_table_field();
|
||||
if (!f->is_null())
|
||||
{
|
||||
record_is_null= FALSE;
|
||||
|
|
|
@ -62,7 +62,8 @@ public:
|
|||
|
||||
enum Type type() const { return SUM_FUNC_ITEM; }
|
||||
virtual enum Sumfunctype sum_func () const=0;
|
||||
virtual bool reset()=0;
|
||||
inline bool reset() { clear(); return add(); };
|
||||
virtual void clear()= 0;
|
||||
virtual bool add()=0;
|
||||
virtual void reset_field()=0;
|
||||
virtual void update_field(int offset)=0;
|
||||
|
@ -124,7 +125,7 @@ class Item_sum_sum :public Item_sum_num
|
|||
Item_sum_sum(THD *thd, Item_sum_sum &item)
|
||||
:Item_sum_num(thd, item), sum(item.sum) {}
|
||||
enum Sumfunctype sum_func () const {return SUM_FUNC;}
|
||||
bool reset();
|
||||
void clear();
|
||||
bool add();
|
||||
double val();
|
||||
void reset_field();
|
||||
|
@ -151,7 +152,7 @@ class Item_sum_count :public Item_sum_int
|
|||
table_map used_tables() const { return used_table_cache; }
|
||||
bool const_item() const { return !used_table_cache; }
|
||||
enum Sumfunctype sum_func () const { return COUNT_FUNC; }
|
||||
bool reset();
|
||||
void clear();
|
||||
void no_rows_in_result() { count=0; }
|
||||
bool add();
|
||||
void make_const(longlong count_arg) { count=count_arg; used_table_cache=0; }
|
||||
|
@ -225,7 +226,7 @@ class Item_sum_count_distinct :public Item_sum_int
|
|||
|
||||
table_map used_tables() const { return used_table_cache; }
|
||||
enum Sumfunctype sum_func () const { return COUNT_DISTINCT_FUNC; }
|
||||
bool reset();
|
||||
void clear();
|
||||
bool add();
|
||||
longlong val_int();
|
||||
void reset_field() { return ;} // Never called
|
||||
|
@ -269,7 +270,7 @@ class Item_sum_avg :public Item_sum_num
|
|||
Item_sum_avg(THD *thd, Item_sum_avg &item)
|
||||
:Item_sum_num(thd, item), sum(item.sum), count(item.count) {}
|
||||
enum Sumfunctype sum_func () const {return AVG_FUNC;}
|
||||
bool reset();
|
||||
void clear();
|
||||
bool add();
|
||||
double val();
|
||||
void reset_field();
|
||||
|
@ -322,7 +323,7 @@ class Item_sum_variance : public Item_sum_num
|
|||
Item_sum_num(thd, item), sum(item.sum), sum_sqr(item.sum_sqr),
|
||||
count(item.count) {}
|
||||
enum Sumfunctype sum_func () const { return VARIANCE_FUNC; }
|
||||
bool reset();
|
||||
void clear();
|
||||
bool add();
|
||||
double val();
|
||||
void reset_field();
|
||||
|
@ -385,19 +386,18 @@ class Item_sum_hybrid :public Item_sum
|
|||
Item_sum_hybrid(THD *thd, Item_sum_hybrid &item):
|
||||
Item_sum(thd, item), value(item.value), tmp_value(item.tmp_value),
|
||||
sum(item.sum), sum_int(item.sum_int), hybrid_type(item.hybrid_type),
|
||||
cmp_sign(item.cmp_sign), used_table_cache(used_table_cache),
|
||||
cmp_charset(item.cmp_charset) {}
|
||||
hybrid_field_type(item.hybrid_field_type),cmp_sign(item.cmp_sign),
|
||||
used_table_cache(used_table_cache), cmp_charset(item.cmp_charset) {}
|
||||
bool fix_fields(THD *, TABLE_LIST *, Item **);
|
||||
table_map used_tables() const { return used_table_cache; }
|
||||
bool const_item() const { return !used_table_cache; }
|
||||
|
||||
bool reset()
|
||||
void clear()
|
||||
{
|
||||
sum=0.0;
|
||||
sum_int=0;
|
||||
value.length(0);
|
||||
null_value=1;
|
||||
return add();
|
||||
}
|
||||
double val();
|
||||
longlong val_int();
|
||||
|
@ -451,7 +451,7 @@ class Item_sum_bit :public Item_sum_int
|
|||
Item_sum_bit(THD *thd, Item_sum_bit &item):
|
||||
Item_sum_int(thd, item), reset_bits(item.reset_bits), bits(item.bits) {}
|
||||
enum Sumfunctype sum_func () const {return SUM_BIT_FUNC;}
|
||||
bool reset();
|
||||
void clear();
|
||||
longlong val_int();
|
||||
void reset_field();
|
||||
void fix_length_and_dec()
|
||||
|
@ -509,7 +509,7 @@ public:
|
|||
enum Sumfunctype sum_func () const { return UDF_SUM_FUNC; }
|
||||
virtual bool have_field_update(void) const { return 0; }
|
||||
|
||||
bool reset();
|
||||
void clear();
|
||||
bool add();
|
||||
void reset_field() {};
|
||||
void update_field(int offset_arg) {};
|
||||
|
@ -591,7 +591,7 @@ class Item_sum_udf_float :public Item_sum_num
|
|||
~Item_sum_udf_float() {}
|
||||
enum Sumfunctype sum_func () const { return UDF_SUM_FUNC; }
|
||||
double val() { return 0.0; }
|
||||
bool reset() { return 0; }
|
||||
void clear() {}
|
||||
bool add() { return 0; }
|
||||
void update_field(int offset) {}
|
||||
};
|
||||
|
@ -608,7 +608,7 @@ public:
|
|||
enum Sumfunctype sum_func () const { return UDF_SUM_FUNC; }
|
||||
longlong val_int() { return 0; }
|
||||
double val() { return 0; }
|
||||
bool reset() { return 0; }
|
||||
void clear() {}
|
||||
bool add() { return 0; }
|
||||
void update_field(int offset) {}
|
||||
};
|
||||
|
@ -628,7 +628,7 @@ public:
|
|||
enum Item_result result_type () const { return STRING_RESULT; }
|
||||
void fix_length_and_dec() { maybe_null=1; max_length=0; }
|
||||
enum Sumfunctype sum_func () const { return UDF_SUM_FUNC; }
|
||||
bool reset() { return 0; }
|
||||
void clear() {}
|
||||
bool add() { return 0; }
|
||||
void update_field(int offset) {}
|
||||
};
|
||||
|
@ -714,7 +714,7 @@ class Item_func_group_concat : public Item_sum
|
|||
const char *func_name() const { return "group_concat"; }
|
||||
enum Type type() const { return SUM_FUNC_ITEM; }
|
||||
virtual Item_result result_type () const { return STRING_RESULT; }
|
||||
bool reset();
|
||||
void clear();
|
||||
bool add();
|
||||
void reset_field();
|
||||
bool fix_fields(THD *, TABLE_LIST *, Item **);
|
||||
|
@ -733,4 +733,5 @@ class Item_func_group_concat : public Item_sum
|
|||
}
|
||||
String* val_str(String* str);
|
||||
Item *copy_or_same(THD* thd);
|
||||
void no_rows_in_result() {}
|
||||
};
|
||||
|
|
|
@ -327,7 +327,6 @@ public:
|
|||
max_length=10*default_charset()->mbmaxlen;
|
||||
}
|
||||
int save_in_field(Field *to, bool no_conversions);
|
||||
Field *tmp_table_field() { return result_field; }
|
||||
Field *tmp_table_field(TABLE *t_arg)
|
||||
{
|
||||
return (new Field_date(maybe_null, name, t_arg, default_charset()));
|
||||
|
@ -342,7 +341,6 @@ public:
|
|||
Item_date_func(Item *a) :Item_str_func(a) {}
|
||||
Item_date_func(Item *a,Item *b) :Item_str_func(a,b) {}
|
||||
enum_field_types field_type() const { return MYSQL_TYPE_DATETIME; }
|
||||
Field *tmp_table_field() { return result_field; }
|
||||
Field *tmp_table_field(TABLE *t_arg)
|
||||
{
|
||||
return (new Field_datetime(maybe_null, name, t_arg, default_charset()));
|
||||
|
@ -366,7 +364,6 @@ public:
|
|||
longlong val_int() { return value; }
|
||||
String *val_str(String *str);
|
||||
void fix_length_and_dec();
|
||||
Field *tmp_table_field() { return result_field; }
|
||||
Field *tmp_table_field(TABLE *t_arg)
|
||||
{
|
||||
return (new Field_time(maybe_null, name, t_arg, default_charset()));
|
||||
|
@ -533,7 +530,6 @@ public:
|
|||
}
|
||||
enum_field_types field_type() const { return MYSQL_TYPE_TIME; }
|
||||
const char *func_name() const { return "sec_to_time"; }
|
||||
Field *tmp_table_field() { return result_field; }
|
||||
Field *tmp_table_field(TABLE *t_arg)
|
||||
{
|
||||
return (new Field_time(maybe_null, name, t_arg, default_charset()));
|
||||
|
@ -634,7 +630,6 @@ public:
|
|||
bool get_date(TIME *ltime, bool fuzzy_date);
|
||||
const char *func_name() const { return "date"; }
|
||||
enum_field_types field_type() const { return MYSQL_TYPE_DATE; }
|
||||
Field *tmp_table_field() { return result_field; }
|
||||
Field *tmp_table_field(TABLE *t_arg)
|
||||
{
|
||||
return (new Field_date(maybe_null, name, t_arg, default_charset()));
|
||||
|
@ -650,7 +645,6 @@ public:
|
|||
bool get_time(TIME *ltime);
|
||||
const char *func_name() const { return "time"; }
|
||||
enum_field_types field_type() const { return MYSQL_TYPE_TIME; }
|
||||
Field *tmp_table_field() { return result_field; }
|
||||
Field *tmp_table_field(TABLE *t_arg)
|
||||
{
|
||||
return (new Field_time(maybe_null, name, t_arg, default_charset()));
|
||||
|
@ -665,7 +659,6 @@ public:
|
|||
String *val_str(String *str);
|
||||
const char *func_name() const { return "datetime"; }
|
||||
enum_field_types field_type() const { return MYSQL_TYPE_DATETIME; }
|
||||
Field *tmp_table_field() { return result_field; }
|
||||
Field *tmp_table_field(TABLE *t_arg)
|
||||
{
|
||||
return (new Field_datetime(maybe_null, name, t_arg, default_charset()));
|
||||
|
@ -684,7 +677,6 @@ public:
|
|||
decimals=0;
|
||||
max_length=8*MY_CHARSET_BIN_MB_MAXLEN;
|
||||
}
|
||||
Field *tmp_table_field() { return result_field; }
|
||||
Field *tmp_table_field(TABLE *t_arg)
|
||||
{
|
||||
return (new Field_date(maybe_null, name, t_arg, &my_charset_bin));
|
||||
|
@ -711,7 +703,6 @@ public:
|
|||
Change this when we support
|
||||
microseconds in TIME/DATETIME
|
||||
*/
|
||||
Field *tmp_table_field() { return result_field; }
|
||||
Field *tmp_table_field(TABLE *t_arg)
|
||||
{
|
||||
if (cached_field_type == MYSQL_TYPE_TIME)
|
||||
|
@ -735,7 +726,6 @@ public:
|
|||
decimals=0;
|
||||
max_length=17*MY_CHARSET_BIN_MB_MAXLEN;
|
||||
}
|
||||
Field *tmp_table_field() { return result_field; }
|
||||
Field *tmp_table_field(TABLE *t_arg)
|
||||
{
|
||||
return (new Field_time(maybe_null, name, t_arg, &my_charset_bin));
|
||||
|
@ -755,7 +745,6 @@ public:
|
|||
decimals=0;
|
||||
max_length=8*MY_CHARSET_BIN_MB_MAXLEN;
|
||||
}
|
||||
Field *tmp_table_field() { return result_field; }
|
||||
Field *tmp_table_field(TABLE *t_arg)
|
||||
{
|
||||
return (new Field_time(maybe_null, name, t_arg, &my_charset_bin));
|
||||
|
|
|
@ -41,7 +41,7 @@ public:
|
|||
:Item_sum_num(thd, item) {}
|
||||
double val() { return 0.0; }
|
||||
enum Sumfunctype sum_func () const {return UNIQUE_USERS_FUNC;}
|
||||
bool reset() { return 0;}
|
||||
void clear() {}
|
||||
bool add() { return 0; }
|
||||
void reset_field() {}
|
||||
void update_field(int offset) {}
|
||||
|
|
10
sql/lex.h
10
sql/lex.h
|
@ -249,6 +249,12 @@ static SYMBOL symbols[] = {
|
|||
{ "MASTER_PASSWORD", SYM(MASTER_PASSWORD_SYM),0,0},
|
||||
{ "MASTER_PORT", SYM(MASTER_PORT_SYM),0,0},
|
||||
{ "MASTER_SERVER_ID", SYM(MASTER_SERVER_ID_SYM),0,0},
|
||||
{ "MASTER_SSL", SYM(MASTER_SSL_SYM),0,0},
|
||||
{ "MASTER_SSL_CA", SYM(MASTER_SSL_CA_SYM),0,0},
|
||||
{ "MASTER_SSL_CAPATH",SYM(MASTER_SSL_CAPATH_SYM),0,0},
|
||||
{ "MASTER_SSL_CERT", SYM(MASTER_SSL_CERT_SYM),0,0},
|
||||
{ "MASTER_SSL_CIPHER",SYM(MASTER_SSL_CIPHER_SYM),0,0},
|
||||
{ "MASTER_SSL_KEY", SYM(MASTER_SSL_KEY_SYM),0,0},
|
||||
{ "MASTER_USER", SYM(MASTER_USER_SYM),0,0},
|
||||
{ "MAX_ROWS", SYM(MAX_ROWS),0,0},
|
||||
{ "MAX_QUERIES_PER_HOUR", SYM(MAX_QUERIES_PER_HOUR), 0,0},
|
||||
|
@ -288,6 +294,7 @@ static SYMBOL symbols[] = {
|
|||
{ "NULL", SYM(NULL_SYM),0,0},
|
||||
{ "NUMERIC", SYM(NUMERIC_SYM),0,0},
|
||||
{ "OFFSET", SYM(OFFSET_SYM),0,0},
|
||||
{ "OLD_PASSWORD", SYM(OLD_PASSWORD),0,0},
|
||||
{ "ON", SYM(ON),0,0},
|
||||
{ "OPEN", SYM(OPEN_SYM),0,0},
|
||||
{ "OPTIMIZE", SYM(OPTIMIZE),0,0},
|
||||
|
@ -473,9 +480,7 @@ static SYMBOL sql_functions[] = {
|
|||
{ "COUNT", SYM(COUNT_SYM),0,0},
|
||||
{ "COS", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_cos)},
|
||||
{ "COT", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_cot)},
|
||||
#ifdef HAVE_COMPRESS
|
||||
{ "CRC32", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_crc32)},
|
||||
#endif
|
||||
{ "CROSSES", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_crosses)},
|
||||
{ "CURDATE", SYM(CURDATE),0,0},
|
||||
{ "CURTIME", SYM(CURTIME),0,0},
|
||||
|
@ -590,7 +595,6 @@ static SYMBOL sql_functions[] = {
|
|||
{ "NUMPOINTS", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_numpoints)},
|
||||
{ "OCTET_LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_length)},
|
||||
{ "OCT", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_oct)},
|
||||
{ "OLD_PASSWORD", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_old_password)},
|
||||
{ "ORD", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ord)},
|
||||
{ "OVERLAPS", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_overlaps)},
|
||||
{ "PERIOD_ADD", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_period_add)},
|
||||
|
|
|
@ -74,9 +74,6 @@ extern CHARSET_INFO *national_charset_info, *table_alias_charset;
|
|||
****************************************************************************/
|
||||
|
||||
#define ACL_CACHE_SIZE 256
|
||||
/* Password lengh for 4.1 version previous versions had 16 bytes password hash */
|
||||
#define HASH_PASSWORD_LENGTH 45
|
||||
#define HASH_OLD_PASSWORD_LENGTH 16
|
||||
#define MAX_PASSWORD_LENGTH 32
|
||||
#define HOST_CACHE_SIZE 128
|
||||
#define MAX_ACCEPT_RETRY 10 // Test accept this many times
|
||||
|
@ -411,6 +408,8 @@ bool check_global_access(THD *thd, ulong want_access);
|
|||
int mysql_backup_table(THD* thd, TABLE_LIST* table_list);
|
||||
int mysql_restore_table(THD* thd, TABLE_LIST* table_list);
|
||||
|
||||
int mysql_checksum_table(THD* thd, TABLE_LIST* table_list,
|
||||
HA_CHECK_OPT* check_opt);
|
||||
int mysql_check_table(THD* thd, TABLE_LIST* table_list,
|
||||
HA_CHECK_OPT* check_opt);
|
||||
int mysql_repair_table(THD* thd, TABLE_LIST* table_list,
|
||||
|
@ -771,7 +770,7 @@ extern my_bool opt_safe_show_db, opt_local_infile, lower_case_table_names;
|
|||
extern my_bool opt_slave_compressed_protocol, use_temp_pool;
|
||||
extern my_bool opt_readonly;
|
||||
extern my_bool opt_enable_named_pipe;
|
||||
extern my_bool opt_old_passwords, use_old_passwords;
|
||||
extern my_bool opt_secure_auth;
|
||||
extern char *shared_memory_base_name, *mysqld_unix_port;
|
||||
extern bool opt_enable_shared_memory;
|
||||
|
||||
|
|
|
@ -257,9 +257,10 @@ my_bool opt_local_infile, opt_external_locking, opt_slave_compressed_protocol;
|
|||
my_bool opt_safe_user_create = 0, opt_no_mix_types = 0;
|
||||
my_bool lower_case_table_names, opt_old_rpl_compat;
|
||||
my_bool opt_show_slave_auth_info, opt_sql_bin_update = 0;
|
||||
my_bool opt_log_slave_updates= 0, opt_old_passwords=0, use_old_passwords=0;
|
||||
my_bool opt_log_slave_updates= 0;
|
||||
my_bool opt_console= 0, opt_bdb, opt_innodb, opt_isam;
|
||||
my_bool opt_readonly, use_temp_pool, relay_log_purge;
|
||||
my_bool opt_secure_auth= 0;
|
||||
volatile bool mqh_used = 0;
|
||||
|
||||
uint mysqld_port, test_flags, select_errors, dropping_tables, ha_open_options;
|
||||
|
@ -362,15 +363,15 @@ pthread_t signal_thread;
|
|||
pthread_attr_t connection_attrib;
|
||||
|
||||
/* replication parameters, if master_host is not NULL, we are a slave */
|
||||
my_bool master_ssl;
|
||||
uint master_port= MYSQL_PORT, master_connect_retry = 60;
|
||||
uint report_port= MYSQL_PORT;
|
||||
ulong master_retry_count=0;
|
||||
char *master_user, *master_password, *master_host, *master_info_file;
|
||||
char *relay_log_info_file, *master_ssl_key, *master_ssl_cert;
|
||||
char *master_ssl_capath, *master_ssl_cipher, *report_user;
|
||||
char *report_password, *report_host;
|
||||
char *relay_log_info_file, *report_user, *report_password, *report_host;
|
||||
char *opt_relay_logname = 0, *opt_relaylog_index_name=0;
|
||||
my_bool master_ssl;
|
||||
char *master_ssl_key, *master_ssl_cert;
|
||||
char *master_ssl_ca, *master_ssl_capath, *master_ssl_cipher;
|
||||
|
||||
/* Static variables */
|
||||
|
||||
|
@ -2819,12 +2820,6 @@ static void create_new_thread(THD *thd)
|
|||
if (thread_count-delayed_insert_threads > max_used_connections)
|
||||
max_used_connections=thread_count-delayed_insert_threads;
|
||||
thd->thread_id=thread_id++;
|
||||
for (uint i=0; i < 8 ; i++) // Generate password teststring
|
||||
thd->scramble[i]= (char) (my_rnd(&sql_rand)*94+33);
|
||||
thd->scramble[8]=0;
|
||||
// Back it up as old clients may need it
|
||||
memcpy(thd->old_scramble,thd->scramble,9);
|
||||
|
||||
|
||||
thd->real_id=pthread_self(); // Keep purify happy
|
||||
|
||||
|
@ -3445,7 +3440,7 @@ enum options
|
|||
OPT_MASTER_RETRY_COUNT,
|
||||
OPT_MASTER_SSL, OPT_MASTER_SSL_KEY,
|
||||
OPT_MASTER_SSL_CERT, OPT_MASTER_SSL_CAPATH,
|
||||
OPT_MASTER_SSL_CIPHER,
|
||||
OPT_MASTER_SSL_CIPHER, OPT_MASTER_SSL_CA,
|
||||
OPT_SQL_BIN_UPDATE_SAME, OPT_REPLICATE_DO_DB,
|
||||
OPT_REPLICATE_IGNORE_DB, OPT_LOG_SLAVE_UPDATES,
|
||||
OPT_BINLOG_DO_DB, OPT_BINLOG_IGNORE_DB,
|
||||
|
@ -3535,7 +3530,8 @@ enum options
|
|||
OPT_EXPIRE_LOGS_DAYS,
|
||||
OPT_DEFAULT_WEEK_FORMAT,
|
||||
OPT_GROUP_CONCAT_MAX_LEN,
|
||||
OPT_DEFAULT_COLLATION
|
||||
OPT_DEFAULT_COLLATION,
|
||||
OPT_SECURE_AUTH
|
||||
};
|
||||
|
||||
|
||||
|
@ -3783,27 +3779,28 @@ thread is in the master's binlogs.",
|
|||
(gptr*) &master_info_file, (gptr*) &master_info_file, 0, GET_STR,
|
||||
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"master-ssl", OPT_MASTER_SSL,
|
||||
"Planned to enable the slave to connect to the master using SSL. Does nothing yet.",
|
||||
"Enable the slave to connect to the master using SSL.",
|
||||
(gptr*) &master_ssl, (gptr*) &master_ssl, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
|
||||
0, 0},
|
||||
{"master-ssl-key", OPT_MASTER_SSL_KEY,
|
||||
"Master SSL keyfile name. Only applies if you have enabled master-ssl. Does \
|
||||
nothing yet.",
|
||||
"Master SSL keyfile name. Only applies if you have enabled master-ssl.",
|
||||
(gptr*) &master_ssl_key, (gptr*) &master_ssl_key, 0, GET_STR, OPT_ARG,
|
||||
0, 0, 0, 0, 0, 0},
|
||||
{"master-ssl-cert", OPT_MASTER_SSL_CERT,
|
||||
"Master SSL certificate file name. Only applies if you have enabled \
|
||||
master-ssl. Does nothing yet.",
|
||||
master-ssl",
|
||||
(gptr*) &master_ssl_cert, (gptr*) &master_ssl_cert, 0, GET_STR, OPT_ARG,
|
||||
0, 0, 0, 0, 0, 0},
|
||||
{"master-ssl-ca", OPT_MASTER_SSL_CA,
|
||||
"Master SSL CA file. Only applies if you have enabled master-ssl.",
|
||||
(gptr*) &master_ssl_ca, (gptr*) &master_ssl_ca, 0, GET_STR, OPT_ARG,
|
||||
0, 0, 0, 0, 0, 0},
|
||||
{"master-ssl-capath", OPT_MASTER_SSL_CAPATH,
|
||||
"Master SSL CA path. Only applies if you have enabled master-ssl. \
|
||||
Does nothing yet.",
|
||||
"Master SSL CA path. Only applies if you have enabled master-ssl.",
|
||||
(gptr*) &master_ssl_capath, (gptr*) &master_ssl_capath, 0, GET_STR, OPT_ARG,
|
||||
0, 0, 0, 0, 0, 0},
|
||||
{"master-ssl-cipher", OPT_MASTER_SSL_CIPHER,
|
||||
"Master SSL cipher. Only applies if you have enabled master-ssl. \
|
||||
Does nothing yet.",
|
||||
"Master SSL cipher. Only applies if you have enabled master-ssl.",
|
||||
(gptr*) &master_ssl_cipher, (gptr*) &master_ssl_capath, 0, GET_STR, OPT_ARG,
|
||||
0, 0, 0, 0, 0, 0},
|
||||
{"myisam-recover", OPT_MYISAM_RECOVER,
|
||||
|
@ -3844,9 +3841,10 @@ Does nothing yet.",
|
|||
(gptr*) &opt_no_mix_types, (gptr*) &opt_no_mix_types, 0, GET_BOOL, NO_ARG,
|
||||
0, 0, 0, 0, 0, 0},
|
||||
#endif
|
||||
{"old-protocol", 'o', "Use the old (3.20) protocol client/server protocol.",
|
||||
(gptr*) &protocol_version, (gptr*) &protocol_version, 0, GET_UINT, NO_ARG,
|
||||
PROTOCOL_VERSION, 0, 0, 0, 0, 0},
|
||||
{"old-passwords", OPT_OLD_PASSWORDS, "Use old password encryption method (needed for 4.0 and older clients).",
|
||||
(gptr*) &global_system_variables.old_passwords,
|
||||
(gptr*) &max_system_variables.old_passwords, 0, GET_BOOL, NO_ARG,
|
||||
0, 0, 0, 0, 0, 0},
|
||||
{"old-rpl-compat", OPT_OLD_RPL_COMPAT,
|
||||
"Use old LOAD DATA format in the binary log (don't save data in file).",
|
||||
(gptr*) &opt_old_rpl_compat, (gptr*) &opt_old_rpl_compat, 0, GET_BOOL,
|
||||
|
@ -3913,8 +3911,6 @@ relay logs.",
|
|||
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"safe-mode", OPT_SAFE, "Skip some optimize stages (for testing).",
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"old-passwords", OPT_OLD_PASSWORDS, "Use old password encryption method (needed for 4.0 and older clients).",
|
||||
(gptr*) &opt_old_passwords, (gptr*) &opt_old_passwords, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#ifndef TO_BE_DELETED
|
||||
{"safe-show-database", OPT_SAFE_SHOW_DB,
|
||||
"Deprecated option; One should use GRANT SHOW DATABASES instead...",
|
||||
|
@ -3924,6 +3920,9 @@ relay logs.",
|
|||
"Don't allow new user creation by the user who has no write privileges to the mysql.user table.",
|
||||
(gptr*) &opt_safe_user_create, (gptr*) &opt_safe_user_create, 0, GET_BOOL,
|
||||
NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"secure-auth", OPT_SECURE_AUTH, "Disallow authentication for accounts that have old (pre-4.1) passwords.",
|
||||
(gptr*) &opt_secure_auth, (gptr*) &opt_secure_auth, 0, GET_BOOL, NO_ARG,
|
||||
my_bool(0), 0, 0, 0, 0, 0},
|
||||
{"server-id", OPT_SERVER_ID,
|
||||
"Uniquely identifies the server instance in the community of replication partners.",
|
||||
(gptr*) &server_id, (gptr*) &server_id, 0, GET_ULONG, REQUIRED_ARG, 0, 0, 0,
|
||||
|
@ -4452,14 +4451,15 @@ struct show_var_st status_vars[]= {
|
|||
{"Bytes_received", (char*) &bytes_received, SHOW_LONG},
|
||||
{"Bytes_sent", (char*) &bytes_sent, SHOW_LONG},
|
||||
{"Com_admin_commands", (char*) &com_other, SHOW_LONG},
|
||||
{"Com_alter_table", (char*) (com_stat+(uint) SQLCOM_ALTER_TABLE),SHOW_LONG},
|
||||
{"Com_alter_db", (char*) (com_stat+(uint) SQLCOM_ALTER_DB),SHOW_LONG},
|
||||
{"Com_alter_table", (char*) (com_stat+(uint) SQLCOM_ALTER_TABLE),SHOW_LONG},
|
||||
{"Com_analyze", (char*) (com_stat+(uint) SQLCOM_ANALYZE),SHOW_LONG},
|
||||
{"Com_backup_table", (char*) (com_stat+(uint) SQLCOM_BACKUP_TABLE),SHOW_LONG},
|
||||
{"Com_begin", (char*) (com_stat+(uint) SQLCOM_BEGIN),SHOW_LONG},
|
||||
{"Com_change_db", (char*) (com_stat+(uint) SQLCOM_CHANGE_DB),SHOW_LONG},
|
||||
{"Com_change_master", (char*) (com_stat+(uint) SQLCOM_CHANGE_MASTER),SHOW_LONG},
|
||||
{"Com_check", (char*) (com_stat+(uint) SQLCOM_CHECK),SHOW_LONG},
|
||||
{"Com_checksum", (char*) (com_stat+(uint) SQLCOM_CHECKSUM),SHOW_LONG},
|
||||
{"Com_commit", (char*) (com_stat+(uint) SQLCOM_COMMIT),SHOW_LONG},
|
||||
{"Com_create_db", (char*) (com_stat+(uint) SQLCOM_CREATE_DB),SHOW_LONG},
|
||||
{"Com_create_function", (char*) (com_stat+(uint) SQLCOM_CREATE_FUNCTION),SHOW_LONG},
|
||||
|
@ -4472,6 +4472,7 @@ struct show_var_st status_vars[]= {
|
|||
{"Com_drop_function", (char*) (com_stat+(uint) SQLCOM_DROP_FUNCTION),SHOW_LONG},
|
||||
{"Com_drop_index", (char*) (com_stat+(uint) SQLCOM_DROP_INDEX),SHOW_LONG},
|
||||
{"Com_drop_table", (char*) (com_stat+(uint) SQLCOM_DROP_TABLE),SHOW_LONG},
|
||||
{"Com_drop_user", (char*) (com_stat+(uint) SQLCOM_DROP_USER),SHOW_LONG},
|
||||
{"Com_flush", (char*) (com_stat+(uint) SQLCOM_FLUSH),SHOW_LONG},
|
||||
{"Com_grant", (char*) (com_stat+(uint) SQLCOM_GRANT),SHOW_LONG},
|
||||
{"Com_ha_close", (char*) (com_stat+(uint) SQLCOM_HA_CLOSE),SHOW_LONG},
|
||||
|
@ -4486,6 +4487,7 @@ struct show_var_st status_vars[]= {
|
|||
{"Com_load_master_table", (char*) (com_stat+(uint) SQLCOM_LOAD_MASTER_TABLE),SHOW_LONG},
|
||||
{"Com_lock_tables", (char*) (com_stat+(uint) SQLCOM_LOCK_TABLES),SHOW_LONG},
|
||||
{"Com_optimize", (char*) (com_stat+(uint) SQLCOM_OPTIMIZE),SHOW_LONG},
|
||||
{"Com_preload_keys", (char*) (com_stat+(uint) SQLCOM_PRELOAD_KEYS),SHOW_LONG},
|
||||
{"Com_purge", (char*) (com_stat+(uint) SQLCOM_PURGE),SHOW_LONG},
|
||||
{"Com_purge_before_date", (char*) (com_stat+(uint) SQLCOM_PURGE_BEFORE),SHOW_LONG},
|
||||
{"Com_rename_table", (char*) (com_stat+(uint) SQLCOM_RENAME_TABLE),SHOW_LONG},
|
||||
|
@ -4495,13 +4497,15 @@ struct show_var_st status_vars[]= {
|
|||
{"Com_reset", (char*) (com_stat+(uint) SQLCOM_RESET),SHOW_LONG},
|
||||
{"Com_restore_table", (char*) (com_stat+(uint) SQLCOM_RESTORE_TABLE),SHOW_LONG},
|
||||
{"Com_revoke", (char*) (com_stat+(uint) SQLCOM_REVOKE),SHOW_LONG},
|
||||
{"Com_revoke_all", (char*) (com_stat+(uint) SQLCOM_REVOKE_ALL),SHOW_LONG},
|
||||
{"Com_rollback", (char*) (com_stat+(uint) SQLCOM_ROLLBACK),SHOW_LONG},
|
||||
{"Com_savepoint", (char*) (com_stat+(uint) SQLCOM_SAVEPOINT),SHOW_LONG},
|
||||
{"Com_select", (char*) (com_stat+(uint) SQLCOM_SELECT),SHOW_LONG},
|
||||
{"Com_set_option", (char*) (com_stat+(uint) SQLCOM_SET_OPTION),SHOW_LONG},
|
||||
{"Com_show_binlog_events", (char*) (com_stat+(uint) SQLCOM_SHOW_BINLOG_EVENTS),SHOW_LONG},
|
||||
{"Com_show_binlogs", (char*) (com_stat+(uint) SQLCOM_SHOW_BINLOGS),SHOW_LONG},
|
||||
{"Com_show_binlog_events", (char*) (com_stat+(uint) SQLCOM_SHOW_BINLOG_EVENTS),SHOW_LONG},
|
||||
{"Com_show_charsets", (char*) (com_stat+(uint) SQLCOM_SHOW_CHARSETS),SHOW_LONG},
|
||||
{"Com_show_collations", (char*) (com_stat+(uint) SQLCOM_SHOW_COLLATIONS),SHOW_LONG},
|
||||
{"Com_show_column_types", (char*) (com_stat+(uint) SQLCOM_SHOW_COLUMN_TYPES),SHOW_LONG},
|
||||
{"Com_show_create_table", (char*) (com_stat+(uint) SQLCOM_SHOW_CREATE),SHOW_LONG},
|
||||
{"Com_show_create_db", (char*) (com_stat+(uint) SQLCOM_SHOW_CREATE_DB),SHOW_LONG},
|
||||
|
@ -4509,6 +4513,7 @@ struct show_var_st status_vars[]= {
|
|||
{"Com_show_errors", (char*) (com_stat+(uint) SQLCOM_SHOW_ERRORS),SHOW_LONG},
|
||||
{"Com_show_fields", (char*) (com_stat+(uint) SQLCOM_SHOW_FIELDS),SHOW_LONG},
|
||||
{"Com_show_grants", (char*) (com_stat+(uint) SQLCOM_SHOW_GRANTS),SHOW_LONG},
|
||||
{"Com_show_innodb_status", (char*) (com_stat+(uint) SQLCOM_SHOW_INNODB_STATUS),SHOW_LONG},
|
||||
{"Com_show_keys", (char*) (com_stat+(uint) SQLCOM_SHOW_KEYS),SHOW_LONG},
|
||||
{"Com_show_logs", (char*) (com_stat+(uint) SQLCOM_SHOW_LOGS),SHOW_LONG},
|
||||
{"Com_show_master_status", (char*) (com_stat+(uint) SQLCOM_SHOW_MASTER_STAT),SHOW_LONG},
|
||||
|
@ -4519,7 +4524,6 @@ struct show_var_st status_vars[]= {
|
|||
{"Com_show_slave_hosts", (char*) (com_stat+(uint) SQLCOM_SHOW_SLAVE_HOSTS),SHOW_LONG},
|
||||
{"Com_show_slave_status", (char*) (com_stat+(uint) SQLCOM_SHOW_SLAVE_STAT),SHOW_LONG},
|
||||
{"Com_show_status", (char*) (com_stat+(uint) SQLCOM_SHOW_STATUS),SHOW_LONG},
|
||||
{"Com_show_innodb_status", (char*) (com_stat+(uint) SQLCOM_SHOW_INNODB_STATUS),SHOW_LONG},
|
||||
{"Com_show_tables", (char*) (com_stat+(uint) SQLCOM_SHOW_TABLES),SHOW_LONG},
|
||||
{"Com_show_table_types", (char*) (com_stat+(uint) SQLCOM_SHOW_TABLE_TYPES),SHOW_LONG},
|
||||
{"Com_show_variables", (char*) (com_stat+(uint) SQLCOM_SHOW_VARIABLES),SHOW_LONG},
|
||||
|
@ -4708,7 +4712,8 @@ static void mysql_init_variables(void)
|
|||
opt_log= opt_update_log= opt_bin_log= opt_slow_log= 0;
|
||||
opt_disable_networking= opt_skip_show_db=0;
|
||||
opt_logname= opt_update_logname= opt_binlog_index_name= opt_slow_logname=0;
|
||||
opt_bootstrap= opt_myisam_log= use_old_passwords= 0;
|
||||
opt_secure_auth= 0;
|
||||
opt_bootstrap= opt_myisam_log= 0;
|
||||
mqh_used= 0;
|
||||
segfaulted= kill_in_progress= 0;
|
||||
cleanup_done= 0;
|
||||
|
@ -4787,8 +4792,9 @@ static void mysql_init_variables(void)
|
|||
master_user= (char*) "test";
|
||||
master_password= master_host= 0;
|
||||
master_info_file= (char*) "master.info",
|
||||
relay_log_info_file= (char*) "relay-log.info",
|
||||
master_ssl_key= master_ssl_cert= master_ssl_capath= master_ssl_cipher= 0;
|
||||
relay_log_info_file= (char*) "relay-log.info";
|
||||
master_ssl_key= master_ssl_cert= master_ssl_ca=
|
||||
master_ssl_capath= master_ssl_cipher= 0;
|
||||
report_user= report_password = report_host= 0; /* TO BE DELETED */
|
||||
opt_relay_logname= opt_relaylog_index_name= 0;
|
||||
|
||||
|
@ -4811,6 +4817,7 @@ static void mysql_init_variables(void)
|
|||
max_system_variables.select_limit= (ulonglong) HA_POS_ERROR;
|
||||
global_system_variables.max_join_size= (ulonglong) HA_POS_ERROR;
|
||||
max_system_variables.max_join_size= (ulonglong) HA_POS_ERROR;
|
||||
global_system_variables.old_passwords= 0;
|
||||
|
||||
/* Variables that depends on compile options */
|
||||
#ifndef DBUG_OFF
|
||||
|
@ -4932,9 +4939,6 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
|||
case 'L':
|
||||
strmake(language, argument, sizeof(language)-1);
|
||||
break;
|
||||
case 'o':
|
||||
protocol_version=PROTOCOL_VERSION-1;
|
||||
break;
|
||||
#ifdef HAVE_REPLICATION
|
||||
case OPT_SLAVE_SKIP_ERRORS:
|
||||
init_slave_skip_errors(argument);
|
||||
|
|
936
sql/password.c
936
sql/password.c
File diff suppressed because it is too large
Load diff
|
@ -349,10 +349,35 @@ send_eof(THD *thd, bool no_flush)
|
|||
}
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
/*
|
||||
Please client to send scrambled_password in old format.
|
||||
SYNOPSYS
|
||||
send_old_password_request()
|
||||
thd thread handle
|
||||
|
||||
RETURN VALUE
|
||||
0 ok
|
||||
!0 error
|
||||
*/
|
||||
|
||||
bool send_old_password_request(THD *thd)
|
||||
{
|
||||
static char buff[1]= { (char) 254 };
|
||||
NET *net= &thd->net;
|
||||
return my_net_write(net, buff, 1) || net_flush(net);
|
||||
}
|
||||
|
||||
#endif /* EMBEDDED_LIBRARY */
|
||||
|
||||
/*
|
||||
Faster net_store_length when we know length is a 32 bit integer
|
||||
Faster net_store_length when we know that length is less than 65536.
|
||||
We keep a separate version for that range because it's widely used in
|
||||
libmysql.
|
||||
uint is used as agrument type because of MySQL type conventions:
|
||||
uint for 0..65536
|
||||
ulong for 0..4294967296
|
||||
ulonglong for bigger numbers.
|
||||
*/
|
||||
|
||||
char *net_store_length(char *pkg, uint length)
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue