mirror of
https://github.com/MariaDB/server.git
synced 2025-08-09 22:24:09 +03:00
auto-merge
This commit is contained in:
@@ -29,5 +29,5 @@ typedef struct st_line_buffer
|
|||||||
|
|
||||||
extern LINE_BUFFER *batch_readline_init(ulong max_size,FILE *file);
|
extern LINE_BUFFER *batch_readline_init(ulong max_size,FILE *file);
|
||||||
extern LINE_BUFFER *batch_readline_command(LINE_BUFFER *buffer, char * str);
|
extern LINE_BUFFER *batch_readline_command(LINE_BUFFER *buffer, char * str);
|
||||||
extern char *batch_readline(LINE_BUFFER *buffer);
|
extern char *batch_readline(LINE_BUFFER *buffer, bool *truncated);
|
||||||
extern void batch_readline_end(LINE_BUFFER *buffer);
|
extern void batch_readline_end(LINE_BUFFER *buffer);
|
||||||
|
@@ -115,6 +115,8 @@ extern "C" {
|
|||||||
#define PROMPT_CHAR '\\'
|
#define PROMPT_CHAR '\\'
|
||||||
#define DEFAULT_DELIMITER ";"
|
#define DEFAULT_DELIMITER ";"
|
||||||
|
|
||||||
|
#define MAX_BATCH_BUFFER_SIZE (1024L * 1024L)
|
||||||
|
|
||||||
typedef struct st_status
|
typedef struct st_status
|
||||||
{
|
{
|
||||||
int exit_status;
|
int exit_status;
|
||||||
@@ -1045,7 +1047,7 @@ static void fix_history(String *final_command);
|
|||||||
|
|
||||||
static COMMANDS *find_command(char *name,char cmd_name);
|
static COMMANDS *find_command(char *name,char cmd_name);
|
||||||
static bool add_line(String &buffer,char *line,char *in_string,
|
static bool add_line(String &buffer,char *line,char *in_string,
|
||||||
bool *ml_comment);
|
bool *ml_comment, bool truncated);
|
||||||
static void remove_cntrl(String &buffer);
|
static void remove_cntrl(String &buffer);
|
||||||
static void print_table_data(MYSQL_RES *result);
|
static void print_table_data(MYSQL_RES *result);
|
||||||
static void print_table_data_html(MYSQL_RES *result);
|
static void print_table_data_html(MYSQL_RES *result);
|
||||||
@@ -1117,7 +1119,7 @@ int main(int argc,char *argv[])
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
if (status.batch && !status.line_buff &&
|
if (status.batch && !status.line_buff &&
|
||||||
!(status.line_buff=batch_readline_init(opt_max_allowed_packet+512,stdin)))
|
!(status.line_buff= batch_readline_init(MAX_BATCH_BUFFER_SIZE, stdin)))
|
||||||
{
|
{
|
||||||
free_defaults(defaults_argv);
|
free_defaults(defaults_argv);
|
||||||
my_end(0);
|
my_end(0);
|
||||||
@@ -1198,7 +1200,7 @@ int main(int argc,char *argv[])
|
|||||||
#endif
|
#endif
|
||||||
sprintf(buff, "%s",
|
sprintf(buff, "%s",
|
||||||
#ifndef NOT_YET
|
#ifndef NOT_YET
|
||||||
"Type 'help;' or '\\h' for help. Type '\\c' to clear the buffer.\n");
|
"Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.\n");
|
||||||
#else
|
#else
|
||||||
"Type 'help [[%]function name[%]]' to get help on usage of function.\n");
|
"Type 'help [[%]function name[%]]' to get help on usage of function.\n");
|
||||||
#endif
|
#endif
|
||||||
@@ -1810,13 +1812,14 @@ static int read_and_execute(bool interactive)
|
|||||||
ulong line_number=0;
|
ulong line_number=0;
|
||||||
bool ml_comment= 0;
|
bool ml_comment= 0;
|
||||||
COMMANDS *com;
|
COMMANDS *com;
|
||||||
|
bool truncated= 0;
|
||||||
status.exit_status=1;
|
status.exit_status=1;
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
if (!interactive)
|
if (!interactive)
|
||||||
{
|
{
|
||||||
line=batch_readline(status.line_buff);
|
line=batch_readline(status.line_buff, &truncated);
|
||||||
/*
|
/*
|
||||||
Skip UTF8 Byte Order Marker (BOM) 0xEFBBBF.
|
Skip UTF8 Byte Order Marker (BOM) 0xEFBBBF.
|
||||||
Editors like "notepad" put this marker in
|
Editors like "notepad" put this marker in
|
||||||
@@ -1913,7 +1916,7 @@ static int read_and_execute(bool interactive)
|
|||||||
#endif
|
#endif
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (add_line(glob_buffer,line,&in_string,&ml_comment))
|
if (add_line(glob_buffer,line,&in_string,&ml_comment, truncated))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* if in batch mode, send last query even if it doesn't end with \g or go */
|
/* if in batch mode, send last query even if it doesn't end with \g or go */
|
||||||
@@ -1999,7 +2002,7 @@ static COMMANDS *find_command(char *name,char cmd_char)
|
|||||||
|
|
||||||
|
|
||||||
static bool add_line(String &buffer,char *line,char *in_string,
|
static bool add_line(String &buffer,char *line,char *in_string,
|
||||||
bool *ml_comment)
|
bool *ml_comment, bool truncated)
|
||||||
{
|
{
|
||||||
uchar inchar;
|
uchar inchar;
|
||||||
char buff[80], *pos, *out;
|
char buff[80], *pos, *out;
|
||||||
@@ -2247,9 +2250,10 @@ static bool add_line(String &buffer,char *line,char *in_string,
|
|||||||
{
|
{
|
||||||
uint length=(uint) (out-line);
|
uint length=(uint) (out-line);
|
||||||
|
|
||||||
if (length < 9 ||
|
if (!truncated &&
|
||||||
|
(length < 9 ||
|
||||||
my_strnncoll (charset_info,
|
my_strnncoll (charset_info,
|
||||||
(uchar *)line, 9, (const uchar *) "delimiter", 9))
|
(uchar *)line, 9, (const uchar *) "delimiter", 9)))
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
Don't add a new line in case there's a DELIMITER command to be
|
Don't add a new line in case there's a DELIMITER command to be
|
||||||
@@ -3921,7 +3925,7 @@ static int com_source(String *buffer, char *line)
|
|||||||
return put_info(buff, INFO_ERROR, 0);
|
return put_info(buff, INFO_ERROR, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(line_buff=batch_readline_init(opt_max_allowed_packet+512,sql_file)))
|
if (!(line_buff= batch_readline_init(MAX_BATCH_BUFFER_SIZE, sql_file)))
|
||||||
{
|
{
|
||||||
my_fclose(sql_file,MYF(0));
|
my_fclose(sql_file,MYF(0));
|
||||||
return put_info("Can't initialize batch_readline", INFO_ERROR, 0);
|
return put_info("Can't initialize batch_readline", INFO_ERROR, 0);
|
||||||
|
@@ -4588,7 +4588,8 @@ char check_if_ignore_table(const char *table_name, char *table_type)
|
|||||||
*/
|
*/
|
||||||
if (!opt_no_data &&
|
if (!opt_no_data &&
|
||||||
(!my_strcasecmp(&my_charset_latin1, table_type, "MRG_MyISAM") ||
|
(!my_strcasecmp(&my_charset_latin1, table_type, "MRG_MyISAM") ||
|
||||||
!strcmp(table_type,"MRG_ISAM")))
|
!strcmp(table_type,"MRG_ISAM") ||
|
||||||
|
!strcmp(table_type,"FEDERATED")))
|
||||||
result= IGNORE_DATA;
|
result= IGNORE_DATA;
|
||||||
}
|
}
|
||||||
mysql_free_result(res);
|
mysql_free_result(res);
|
||||||
|
@@ -24,7 +24,7 @@ static bool init_line_buffer(LINE_BUFFER *buffer,File file,ulong size,
|
|||||||
ulong max_size);
|
ulong max_size);
|
||||||
static bool init_line_buffer_from_string(LINE_BUFFER *buffer,char * str);
|
static bool init_line_buffer_from_string(LINE_BUFFER *buffer,char * str);
|
||||||
static size_t fill_buffer(LINE_BUFFER *buffer);
|
static size_t fill_buffer(LINE_BUFFER *buffer);
|
||||||
static char *intern_read_line(LINE_BUFFER *buffer,ulong *out_length);
|
static char *intern_read_line(LINE_BUFFER *buffer, ulong *out_length, bool *truncated);
|
||||||
|
|
||||||
|
|
||||||
LINE_BUFFER *batch_readline_init(ulong max_size,FILE *file)
|
LINE_BUFFER *batch_readline_init(ulong max_size,FILE *file)
|
||||||
@@ -42,12 +42,13 @@ LINE_BUFFER *batch_readline_init(ulong max_size,FILE *file)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
char *batch_readline(LINE_BUFFER *line_buff)
|
char *batch_readline(LINE_BUFFER *line_buff, bool *truncated)
|
||||||
{
|
{
|
||||||
char *pos;
|
char *pos;
|
||||||
ulong out_length;
|
ulong out_length;
|
||||||
|
DBUG_ASSERT(truncated != NULL);
|
||||||
|
|
||||||
if (!(pos=intern_read_line(line_buff,&out_length)))
|
if (!(pos=intern_read_line(line_buff,&out_length, truncated)))
|
||||||
return 0;
|
return 0;
|
||||||
if (out_length && pos[out_length-1] == '\n')
|
if (out_length && pos[out_length-1] == '\n')
|
||||||
if (--out_length && pos[out_length-1] == '\r') /* Remove '\n' */
|
if (--out_length && pos[out_length-1] == '\r') /* Remove '\n' */
|
||||||
@@ -149,6 +150,14 @@ static size_t fill_buffer(LINE_BUFFER *buffer)
|
|||||||
read_count=(buffer->bufread - bufbytes)/IO_SIZE;
|
read_count=(buffer->bufread - bufbytes)/IO_SIZE;
|
||||||
if ((read_count*=IO_SIZE))
|
if ((read_count*=IO_SIZE))
|
||||||
break;
|
break;
|
||||||
|
if (buffer->bufread * 2 > buffer->max_size)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
So we must grow the buffer but we cannot due to the max_size limit.
|
||||||
|
Return 0 w/o setting buffer->eof to signal this condition.
|
||||||
|
*/
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
buffer->bufread *= 2;
|
buffer->bufread *= 2;
|
||||||
if (!(buffer->buffer = (char*) my_realloc(buffer->buffer,
|
if (!(buffer->buffer = (char*) my_realloc(buffer->buffer,
|
||||||
buffer->bufread+1,
|
buffer->bufread+1,
|
||||||
@@ -172,12 +181,16 @@ static size_t fill_buffer(LINE_BUFFER *buffer)
|
|||||||
|
|
||||||
DBUG_PRINT("fill_buff", ("Got %lu bytes", (ulong) read_count));
|
DBUG_PRINT("fill_buff", ("Got %lu bytes", (ulong) read_count));
|
||||||
|
|
||||||
/* Kludge to pretend every nonempty file ends with a newline. */
|
if (!read_count)
|
||||||
if (!read_count && bufbytes && buffer->end[-1] != '\n')
|
|
||||||
{
|
{
|
||||||
buffer->eof = read_count = 1;
|
buffer->eof = 1;
|
||||||
|
/* Kludge to pretend every nonempty file ends with a newline. */
|
||||||
|
if (bufbytes && buffer->end[-1] != '\n')
|
||||||
|
{
|
||||||
|
read_count = 1;
|
||||||
*buffer->end = '\n';
|
*buffer->end = '\n';
|
||||||
}
|
}
|
||||||
|
}
|
||||||
buffer->end_of_line=(buffer->start_of_line=buffer->buffer)+bufbytes;
|
buffer->end_of_line=(buffer->start_of_line=buffer->buffer)+bufbytes;
|
||||||
buffer->end+=read_count;
|
buffer->end+=read_count;
|
||||||
*buffer->end=0; /* Sentinel */
|
*buffer->end=0; /* Sentinel */
|
||||||
@@ -186,7 +199,7 @@ static size_t fill_buffer(LINE_BUFFER *buffer)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
char *intern_read_line(LINE_BUFFER *buffer,ulong *out_length)
|
char *intern_read_line(LINE_BUFFER *buffer, ulong *out_length, bool *truncated)
|
||||||
{
|
{
|
||||||
char *pos;
|
char *pos;
|
||||||
size_t length;
|
size_t length;
|
||||||
@@ -200,14 +213,23 @@ char *intern_read_line(LINE_BUFFER *buffer,ulong *out_length)
|
|||||||
pos++;
|
pos++;
|
||||||
if (pos == buffer->end)
|
if (pos == buffer->end)
|
||||||
{
|
{
|
||||||
if ((uint) (pos - buffer->start_of_line) < buffer->max_size)
|
/*
|
||||||
|
fill_buffer() can return 0 either on EOF in which case we abort
|
||||||
|
or when the internal buffer has hit the size limit. In the latter case
|
||||||
|
return what we have read so far and signal string truncation.
|
||||||
|
*/
|
||||||
|
if (!(length=fill_buffer(buffer)) || length == (uint) -1)
|
||||||
{
|
{
|
||||||
if (!(length=fill_buffer(buffer)) || length == (size_t) -1)
|
if (buffer->eof)
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
|
}
|
||||||
|
else
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
pos--; /* break line here */
|
pos--; /* break line here */
|
||||||
|
*truncated= 1;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
*truncated= 0;
|
||||||
buffer->end_of_line=pos+1;
|
buffer->end_of_line=pos+1;
|
||||||
*out_length=(ulong) (pos + 1 - buffer->eof - buffer->start_of_line);
|
*out_length=(ulong) (pos + 1 - buffer->eof - buffer->start_of_line);
|
||||||
DBUG_RETURN(buffer->start_of_line);
|
DBUG_RETURN(buffer->start_of_line);
|
||||||
|
@@ -10,7 +10,7 @@ AC_CANONICAL_SYSTEM
|
|||||||
#
|
#
|
||||||
# When changing major version number please also check switch statement
|
# When changing major version number please also check switch statement
|
||||||
# in mysqlbinlog::check_master_version().
|
# in mysqlbinlog::check_master_version().
|
||||||
AM_INIT_AUTOMAKE(mysql, 5.1.33)
|
AM_INIT_AUTOMAKE(mysql, 5.1.34)
|
||||||
AM_CONFIG_HEADER([include/config.h:config.h.in])
|
AM_CONFIG_HEADER([include/config.h:config.h.in])
|
||||||
|
|
||||||
PROTOCOL_VERSION=10
|
PROTOCOL_VERSION=10
|
||||||
|
@@ -201,6 +201,6 @@ ADD_LIBRARY(mysqlserver STATIC ${LIBMYSQLD_SOURCES})
|
|||||||
ADD_DEPENDENCIES(mysqlserver GenServerSource GenError)
|
ADD_DEPENDENCIES(mysqlserver GenServerSource GenError)
|
||||||
TARGET_LINK_LIBRARIES(mysqlserver)
|
TARGET_LINK_LIBRARIES(mysqlserver)
|
||||||
|
|
||||||
ADD_LIBRARY(libmysqld MODULE cmake_dummy.c libmysqld.def)
|
ADD_LIBRARY(libmysqld SHARED cmake_dummy.c libmysqld.def)
|
||||||
ADD_DEPENDENCIES(libmysqld mysqlserver)
|
ADD_DEPENDENCIES(libmysqld mysqlserver)
|
||||||
TARGET_LINK_LIBRARIES(libmysqld mysqlserver wsock32)
|
TARGET_LINK_LIBRARIES(libmysqld mysqlserver wsock32)
|
||||||
|
@@ -30,12 +30,12 @@ ADD_EXECUTABLE(mysql_embedded ../../client/completion_hash.cc
|
|||||||
../../client/mysql.cc ../../client/readline.cc
|
../../client/mysql.cc ../../client/readline.cc
|
||||||
../../client/sql_string.cc)
|
../../client/sql_string.cc)
|
||||||
TARGET_LINK_LIBRARIES(mysql_embedded debug dbug strings mysys vio yassl taocrypt regex ws2_32)
|
TARGET_LINK_LIBRARIES(mysql_embedded debug dbug strings mysys vio yassl taocrypt regex ws2_32)
|
||||||
ADD_DEPENDENCIES(mysql_embedded libmysqld)
|
TARGET_LINK_LIBRARIES(mysql_embedded libmysqld)
|
||||||
|
|
||||||
ADD_EXECUTABLE(mysqltest_embedded ../../client/mysqltest.cc)
|
ADD_EXECUTABLE(mysqltest_embedded ../../client/mysqltest.cc)
|
||||||
TARGET_LINK_LIBRARIES(mysqltest_embedded debug dbug strings mysys vio yassl taocrypt regex ws2_32)
|
TARGET_LINK_LIBRARIES(mysqltest_embedded debug dbug strings mysys vio yassl taocrypt regex ws2_32)
|
||||||
ADD_DEPENDENCIES(mysqltest_embedded libmysqld)
|
TARGET_LINK_LIBRARIES(mysqltest_embedded libmysqld)
|
||||||
|
|
||||||
ADD_EXECUTABLE(mysql_client_test_embedded ../../tests/mysql_client_test.c)
|
ADD_EXECUTABLE(mysql_client_test_embedded ../../tests/mysql_client_test.c)
|
||||||
TARGET_LINK_LIBRARIES(mysql_client_test_embedded debug dbug strings mysys vio yassl taocrypt regex ws2_32)
|
TARGET_LINK_LIBRARIES(mysql_client_test_embedded debug dbug strings mysys vio yassl taocrypt regex ws2_32)
|
||||||
ADD_DEPENDENCIES(mysql_client_test_embedded libmysqld)
|
TARGET_LINK_LIBRARIES(mysql_client_test_embedded libmysqld)
|
||||||
|
@@ -25,6 +25,8 @@
|
|||||||
# new wrapper t/concurrent_innodb_safelog.test
|
# new wrapper t/concurrent_innodb_safelog.test
|
||||||
#
|
#
|
||||||
|
|
||||||
|
--source include/not_embedded.inc
|
||||||
|
|
||||||
connection default;
|
connection default;
|
||||||
#
|
#
|
||||||
# Show prerequisites for this test.
|
# Show prerequisites for this test.
|
||||||
|
@@ -12695,3 +12695,22 @@ a b
|
|||||||
1 NULL
|
1 NULL
|
||||||
2 NULL
|
2 NULL
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
|
# BUG#32880 - Repairing Archive table fails with internal error 144
|
||||||
|
#
|
||||||
|
|
||||||
|
# Test with an existing table which is corrupted
|
||||||
|
# Copy t1 from std_data
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` int(11) DEFAULT NULL,
|
||||||
|
`b` blob
|
||||||
|
) ENGINE=ARCHIVE DEFAULT CHARSET=latin1
|
||||||
|
CHECK TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 check error Corrupt
|
||||||
|
REPAIR TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 repair error Corrupt
|
||||||
|
DROP TABLE t1;
|
||||||
|
@@ -611,3 +611,22 @@ check table t1 extended;
|
|||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.t1 check status OK
|
test.t1 check status OK
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
select least(_latin1'a',_latin2'b',_latin5'c' collate latin5_turkish_ci);
|
||||||
|
least(_latin1'a',_latin2'b',_latin5'c' collate latin5_turkish_ci)
|
||||||
|
a
|
||||||
|
create table t1
|
||||||
|
select least(_latin1'a',_latin2'b',_latin5'c' collate latin5_turkish_ci) as f1;
|
||||||
|
show create table t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`f1` varchar(1) CHARACTER SET latin5 NOT NULL DEFAULT ''
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
drop table t1;
|
||||||
|
select case _latin1'a' when _latin2'b' then 1 when _latin5'c' collate
|
||||||
|
latin5_turkish_ci then 2 else 3 end;
|
||||||
|
case _latin1'a' when _latin2'b' then 1 when _latin5'c' collate
|
||||||
|
latin5_turkish_ci then 2 else 3 end
|
||||||
|
3
|
||||||
|
select concat(_latin1'a',_latin2'b',_latin5'c' collate latin5_turkish_ci);
|
||||||
|
concat(_latin1'a',_latin2'b',_latin5'c' collate latin5_turkish_ci)
|
||||||
|
abc
|
||||||
|
@@ -192,6 +192,15 @@ delimiter
|
|||||||
1
|
1
|
||||||
1
|
1
|
||||||
1
|
1
|
||||||
|
set @old_max_allowed_packet = @@global.max_allowed_packet;
|
||||||
|
set @@global.max_allowed_packet = 2 * 1024 * 1024 + 1024;
|
||||||
|
CREATE TABLE t1(data LONGBLOB);
|
||||||
|
INSERT INTO t1 SELECT REPEAT('1', 2*1024*1024);
|
||||||
|
SELECT LENGTH(data) FROM t1;
|
||||||
|
LENGTH(data)
|
||||||
|
2097152
|
||||||
|
DROP TABLE t1;
|
||||||
|
set @@global.max_allowed_packet = @old_max_allowed_packet;
|
||||||
End of 5.0 tests
|
End of 5.0 tests
|
||||||
WARNING: --server-arg option not supported in this configuration.
|
WARNING: --server-arg option not supported in this configuration.
|
||||||
Warning (Code 1286): Unknown table engine 'nonexistent'
|
Warning (Code 1286): Unknown table engine 'nonexistent'
|
||||||
|
@@ -160,12 +160,12 @@ SELECT a FROM t1
|
|||||||
UNION
|
UNION
|
||||||
SELECT a FROM t1
|
SELECT a FROM t1
|
||||||
) alias;
|
) alias;
|
||||||
SELECT a INTO OUTFILE 'union.out.file' FROM (
|
SELECT a INTO OUTFILE '<MYSQLTEST_VARDIR>/tmp/union.out.file' FROM (
|
||||||
SELECT a FROM t1
|
SELECT a FROM t1
|
||||||
UNION
|
UNION
|
||||||
SELECT a FROM t1 WHERE 0
|
SELECT a FROM t1 WHERE 0
|
||||||
) alias;
|
) alias;
|
||||||
SELECT a INTO DUMPFILE 'union.out.file2' FROM (
|
SELECT a INTO DUMPFILE '<MYSQLTEST_VARDIR>/tmp/union.out.file' FROM (
|
||||||
SELECT a FROM t1
|
SELECT a FROM t1
|
||||||
UNION
|
UNION
|
||||||
SELECT a FROM t1 WHERE 0
|
SELECT a FROM t1 WHERE 0
|
||||||
@@ -178,21 +178,21 @@ SELECT a INTO @v FROM t1
|
|||||||
SELECT a FROM (
|
SELECT a FROM (
|
||||||
SELECT a FROM t1
|
SELECT a FROM t1
|
||||||
UNION
|
UNION
|
||||||
SELECT a INTO OUTFILE 'union.out.file3' FROM t1
|
SELECT a INTO OUTFILE '<MYSQLTEST_VARDIR>/tmp/union.out.file' FROM t1
|
||||||
) alias;
|
) alias;
|
||||||
SELECT a FROM (
|
SELECT a FROM (
|
||||||
SELECT a FROM t1
|
SELECT a FROM t1
|
||||||
UNION
|
UNION
|
||||||
SELECT a INTO DUMPFILE 'union.out.file4' FROM t1
|
SELECT a INTO DUMPFILE '<MYSQLTEST_VARDIR>/tmp/union.out.file' FROM t1
|
||||||
) alias;
|
) alias;
|
||||||
SELECT a FROM t1 UNION SELECT a INTO @v FROM t1;
|
SELECT a FROM t1 UNION SELECT a INTO @v FROM t1;
|
||||||
SELECT a FROM t1 UNION SELECT a INTO OUTFILE 'union.out.file5' FROM t1;
|
SELECT a FROM t1 UNION SELECT a INTO OUTFILE '<MYSQLTEST_VARDIR>/tmp/union.out.file' FROM t1;
|
||||||
SELECT a FROM t1 UNION SELECT a INTO OUTFILE 'union.out.file6' FROM t1;
|
SELECT a FROM t1 UNION SELECT a INTO DUMPFILE '<MYSQLTEST_VARDIR>/tmp/union.out.file' FROM t1;
|
||||||
SELECT a INTO @v FROM t1 UNION SELECT a FROM t1;
|
SELECT a INTO @v FROM t1 UNION SELECT a FROM t1;
|
||||||
ERROR HY000: Incorrect usage of UNION and INTO
|
ERROR HY000: Incorrect usage of UNION and INTO
|
||||||
SELECT a INTO OUTFILE 'union.out.file7' FROM t1 UNION SELECT a FROM t1;
|
SELECT a INTO OUTFILE '<MYSQLTEST_VARDIR>/tmp/union.out.file' FROM t1 UNION SELECT a FROM t1;
|
||||||
ERROR HY000: Incorrect usage of UNION and INTO
|
ERROR HY000: Incorrect usage of UNION and INTO
|
||||||
SELECT a INTO DUMPFILE 'union.out.file8' FROM t1 UNION SELECT a FROM t1;
|
SELECT a INTO DUMPFILE '<MYSQLTEST_VARDIR>/tmp/union.out.file' FROM t1 UNION SELECT a FROM t1;
|
||||||
ERROR HY000: Incorrect usage of UNION and INTO
|
ERROR HY000: Incorrect usage of UNION and INTO
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
CREATE TABLE t1 (
|
CREATE TABLE t1 (
|
||||||
|
BIN
mysql-test/std_data/bug32880.ARN
Normal file
BIN
mysql-test/std_data/bug32880.ARN
Normal file
Binary file not shown.
BIN
mysql-test/std_data/bug32880.ARZ
Normal file
BIN
mysql-test/std_data/bug32880.ARZ
Normal file
Binary file not shown.
BIN
mysql-test/std_data/bug32880.frm
Normal file
BIN
mysql-test/std_data/bug32880.frm
Normal file
Binary file not shown.
@@ -2130,6 +2130,26 @@ SELECT t1.a FROM t1, t1 as t2 WHERE t2.b NOT LIKE t1.b;
|
|||||||
a
|
a
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
|
# BUG#21360 - mysqldump error on federated tables
|
||||||
|
#
|
||||||
|
#Switch to Connection Slave
|
||||||
|
CREATE TABLE t1(id VARCHAR(20) NOT NULL, PRIMARY KEY(id));
|
||||||
|
INSERT INTO t1 VALUES ('text1'),('text2'),('text3'),('text4');
|
||||||
|
#Switch to Connection Master
|
||||||
|
CREATE TABLE t1(id VARCHAR(20) NOT NULL, PRIMARY KEY(id)) ENGINE=FEDERATED
|
||||||
|
CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/test/t1';
|
||||||
|
# Dump table t1 using mysqldump tool
|
||||||
|
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||||
|
/*!40101 SET character_set_client = utf8 */;
|
||||||
|
CREATE TABLE `t1` (
|
||||||
|
`id` varchar(20) NOT NULL,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=FEDERATED DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/test/t1';
|
||||||
|
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||||
|
DROP TABLE t1;
|
||||||
|
#Switch to Connection Slave
|
||||||
|
DROP TABLE t1;
|
||||||
End of 5.0 tests
|
End of 5.0 tests
|
||||||
create server 's1' foreign data wrapper 'mysql' options (port 3306);
|
create server 's1' foreign data wrapper 'mysql' options (port 3306);
|
||||||
drop server 's1';
|
drop server 's1';
|
||||||
|
@@ -1942,6 +1942,28 @@ DROP TABLE t1;
|
|||||||
connection master;
|
connection master;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # BUG#21360 - mysqldump error on federated tables
|
||||||
|
--echo #
|
||||||
|
connection slave;
|
||||||
|
--echo #Switch to Connection Slave
|
||||||
|
CREATE TABLE t1(id VARCHAR(20) NOT NULL, PRIMARY KEY(id));
|
||||||
|
INSERT INTO t1 VALUES ('text1'),('text2'),('text3'),('text4');
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
--echo #Switch to Connection Master
|
||||||
|
--replace_result $SLAVE_MYPORT SLAVE_PORT
|
||||||
|
eval CREATE TABLE t1(id VARCHAR(20) NOT NULL, PRIMARY KEY(id)) ENGINE=FEDERATED
|
||||||
|
CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/test/t1';
|
||||||
|
--echo # Dump table t1 using mysqldump tool
|
||||||
|
--replace_result $SLAVE_MYPORT SLAVE_PORT
|
||||||
|
--exec $MYSQL_DUMP --compact test t1
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
connection slave;
|
||||||
|
--echo #Switch to Connection Slave
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
connection default;
|
connection default;
|
||||||
|
|
||||||
--echo End of 5.0 tests
|
--echo End of 5.0 tests
|
||||||
|
@@ -166,7 +166,7 @@ NULL information_schema PROCESSLIST HOST 3 NO varchar 64 192 NULL NULL utf8 utf
|
|||||||
NULL information_schema PROCESSLIST ID 1 0 NO bigint NULL NULL 19 0 NULL NULL bigint(4) select
|
NULL information_schema PROCESSLIST ID 1 0 NO bigint NULL NULL 19 0 NULL NULL bigint(4) select
|
||||||
NULL information_schema PROCESSLIST INFO 8 NULL YES longtext 4294967295 4294967295 NULL NULL utf8 utf8_general_ci longtext select
|
NULL information_schema PROCESSLIST INFO 8 NULL YES longtext 4294967295 4294967295 NULL NULL utf8 utf8_general_ci longtext select
|
||||||
NULL information_schema PROCESSLIST STATE 7 NULL YES varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select
|
NULL information_schema PROCESSLIST STATE 7 NULL YES varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select
|
||||||
NULL information_schema PROCESSLIST TIME 6 0 NO bigint NULL NULL 19 0 NULL NULL bigint(7) select
|
NULL information_schema PROCESSLIST TIME 6 0 NO int NULL NULL 10 0 NULL NULL int(7) select
|
||||||
NULL information_schema PROCESSLIST USER 2 NO varchar 16 48 NULL NULL utf8 utf8_general_ci varchar(16) select
|
NULL information_schema PROCESSLIST USER 2 NO varchar 16 48 NULL NULL utf8 utf8_general_ci varchar(16) select
|
||||||
NULL information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_CATALOG 1 NULL YES varchar 512 1536 NULL NULL utf8 utf8_general_ci varchar(512) select
|
NULL information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_CATALOG 1 NULL YES varchar 512 1536 NULL NULL utf8 utf8_general_ci varchar(512) select
|
||||||
NULL information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_NAME 3 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select
|
NULL information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_NAME 3 NO varchar 64 192 NULL NULL utf8 utf8_general_ci varchar(64) select
|
||||||
@@ -340,6 +340,7 @@ ORDER BY CHARACTER_SET_NAME, COLLATION_NAME, COL_CML;
|
|||||||
COL_CML DATA_TYPE CHARACTER_SET_NAME COLLATION_NAME
|
COL_CML DATA_TYPE CHARACTER_SET_NAME COLLATION_NAME
|
||||||
NULL bigint NULL NULL
|
NULL bigint NULL NULL
|
||||||
NULL datetime NULL NULL
|
NULL datetime NULL NULL
|
||||||
|
NULL int NULL NULL
|
||||||
--> CHAR(0) is allowed (see manual), and here both CHARACHTER_* values
|
--> CHAR(0) is allowed (see manual), and here both CHARACHTER_* values
|
||||||
--> are 0, which is intended behavior, and the result of 0 / 0 IS NULL
|
--> are 0, which is intended behavior, and the result of 0 / 0 IS NULL
|
||||||
SELECT CHARACTER_OCTET_LENGTH / CHARACTER_MAXIMUM_LENGTH AS COL_CML,
|
SELECT CHARACTER_OCTET_LENGTH / CHARACTER_MAXIMUM_LENGTH AS COL_CML,
|
||||||
@@ -519,7 +520,7 @@ NULL information_schema PROCESSLIST ID bigint NULL NULL NULL NULL bigint(4)
|
|||||||
3.0000 information_schema PROCESSLIST HOST varchar 64 192 utf8 utf8_general_ci varchar(64)
|
3.0000 information_schema PROCESSLIST HOST varchar 64 192 utf8 utf8_general_ci varchar(64)
|
||||||
3.0000 information_schema PROCESSLIST DB varchar 64 192 utf8 utf8_general_ci varchar(64)
|
3.0000 information_schema PROCESSLIST DB varchar 64 192 utf8 utf8_general_ci varchar(64)
|
||||||
3.0000 information_schema PROCESSLIST COMMAND varchar 16 48 utf8 utf8_general_ci varchar(16)
|
3.0000 information_schema PROCESSLIST COMMAND varchar 16 48 utf8 utf8_general_ci varchar(16)
|
||||||
NULL information_schema PROCESSLIST TIME bigint NULL NULL NULL NULL bigint(7)
|
NULL information_schema PROCESSLIST TIME int NULL NULL NULL NULL int(7)
|
||||||
3.0000 information_schema PROCESSLIST STATE varchar 64 192 utf8 utf8_general_ci varchar(64)
|
3.0000 information_schema PROCESSLIST STATE varchar 64 192 utf8 utf8_general_ci varchar(64)
|
||||||
1.0000 information_schema PROCESSLIST INFO longtext 4294967295 4294967295 utf8 utf8_general_ci longtext
|
1.0000 information_schema PROCESSLIST INFO longtext 4294967295 4294967295 utf8 utf8_general_ci longtext
|
||||||
3.0000 information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_CATALOG varchar 512 1536 utf8 utf8_general_ci varchar(512)
|
3.0000 information_schema REFERENTIAL_CONSTRAINTS CONSTRAINT_CATALOG varchar 512 1536 utf8 utf8_general_ci varchar(512)
|
||||||
|
@@ -27,7 +27,7 @@ PROCESSLIST CREATE TEMPORARY TABLE `PROCESSLIST` (
|
|||||||
`HOST` varchar(64) NOT NULL DEFAULT '',
|
`HOST` varchar(64) NOT NULL DEFAULT '',
|
||||||
`DB` varchar(64) DEFAULT NULL,
|
`DB` varchar(64) DEFAULT NULL,
|
||||||
`COMMAND` varchar(16) NOT NULL DEFAULT '',
|
`COMMAND` varchar(16) NOT NULL DEFAULT '',
|
||||||
`TIME` bigint(7) NOT NULL DEFAULT '0',
|
`TIME` int(7) NOT NULL DEFAULT '0',
|
||||||
`STATE` varchar(64) DEFAULT NULL,
|
`STATE` varchar(64) DEFAULT NULL,
|
||||||
`INFO` longtext
|
`INFO` longtext
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8
|
||||||
@@ -97,7 +97,7 @@ PROCESSLIST CREATE TEMPORARY TABLE `PROCESSLIST` (
|
|||||||
`HOST` varchar(64) NOT NULL DEFAULT '',
|
`HOST` varchar(64) NOT NULL DEFAULT '',
|
||||||
`DB` varchar(64) DEFAULT NULL,
|
`DB` varchar(64) DEFAULT NULL,
|
||||||
`COMMAND` varchar(16) NOT NULL DEFAULT '',
|
`COMMAND` varchar(16) NOT NULL DEFAULT '',
|
||||||
`TIME` bigint(7) NOT NULL DEFAULT '0',
|
`TIME` int(7) NOT NULL DEFAULT '0',
|
||||||
`STATE` varchar(64) DEFAULT NULL,
|
`STATE` varchar(64) DEFAULT NULL,
|
||||||
`INFO` longtext
|
`INFO` longtext
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8
|
||||||
|
@@ -17,7 +17,7 @@ PROCESSLIST CREATE TEMPORARY TABLE `PROCESSLIST` (
|
|||||||
`HOST` varchar(64) NOT NULL DEFAULT '',
|
`HOST` varchar(64) NOT NULL DEFAULT '',
|
||||||
`DB` varchar(64) DEFAULT NULL,
|
`DB` varchar(64) DEFAULT NULL,
|
||||||
`COMMAND` varchar(16) NOT NULL DEFAULT '',
|
`COMMAND` varchar(16) NOT NULL DEFAULT '',
|
||||||
`TIME` bigint(7) NOT NULL DEFAULT '0',
|
`TIME` int(7) NOT NULL DEFAULT '0',
|
||||||
`STATE` varchar(64) DEFAULT NULL,
|
`STATE` varchar(64) DEFAULT NULL,
|
||||||
`INFO` longtext
|
`INFO` longtext
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8
|
||||||
|
@@ -89,3 +89,81 @@ show grants for rpl_do_grant2@localhost;
|
|||||||
ERROR 42000: There is no such grant defined for user 'rpl_do_grant2' on host 'localhost'
|
ERROR 42000: There is no such grant defined for user 'rpl_do_grant2' on host 'localhost'
|
||||||
show grants for rpl_do_grant2@localhost;
|
show grants for rpl_do_grant2@localhost;
|
||||||
ERROR 42000: There is no such grant defined for user 'rpl_do_grant2' on host 'localhost'
|
ERROR 42000: There is no such grant defined for user 'rpl_do_grant2' on host 'localhost'
|
||||||
|
DROP DATABASE IF EXISTS bug42217_db;
|
||||||
|
CREATE DATABASE bug42217_db;
|
||||||
|
GRANT CREATE ROUTINE ON bug42217_db.* TO 'create_rout_db'@'localhost'
|
||||||
|
IDENTIFIED BY 'create_rout_db' WITH GRANT OPTION;
|
||||||
|
USE bug42217_db;
|
||||||
|
CREATE FUNCTION upgrade_del_func() RETURNS CHAR(30)
|
||||||
|
BEGIN
|
||||||
|
RETURN "INSIDE upgrade_del_func()";
|
||||||
|
END//
|
||||||
|
USE bug42217_db;
|
||||||
|
SELECT * FROM mysql.procs_priv;
|
||||||
|
Host Db User Routine_name Routine_type Grantor Proc_priv Timestamp
|
||||||
|
localhost bug42217_db create_rout_db upgrade_del_func FUNCTION create_rout_db@localhost Execute,Alter Routine #
|
||||||
|
SELECT upgrade_del_func();
|
||||||
|
upgrade_del_func()
|
||||||
|
INSIDE upgrade_del_func()
|
||||||
|
SELECT * FROM mysql.procs_priv;
|
||||||
|
Host Db User Routine_name Routine_type Grantor Proc_priv Timestamp
|
||||||
|
localhost bug42217_db create_rout_db upgrade_del_func FUNCTION create_rout_db@localhost Execute,Alter Routine #
|
||||||
|
SHOW GRANTS FOR 'create_rout_db'@'localhost';
|
||||||
|
Grants for create_rout_db@localhost
|
||||||
|
GRANT USAGE ON *.* TO 'create_rout_db'@'localhost' IDENTIFIED BY PASSWORD '*08792480350CBA057BDE781B9DF183B263934601'
|
||||||
|
GRANT CREATE ROUTINE ON `bug42217_db`.* TO 'create_rout_db'@'localhost' WITH GRANT OPTION
|
||||||
|
GRANT EXECUTE, ALTER ROUTINE ON FUNCTION `bug42217_db`.`upgrade_del_func` TO 'create_rout_db'@'localhost'
|
||||||
|
USE bug42217_db;
|
||||||
|
SHOW CREATE FUNCTION upgrade_del_func;
|
||||||
|
Function sql_mode Create Function character_set_client collation_connection Database Collation
|
||||||
|
upgrade_del_func CREATE DEFINER=`create_rout_db`@`localhost` FUNCTION `upgrade_del_func`() RETURNS char(30) CHARSET latin1
|
||||||
|
BEGIN
|
||||||
|
RETURN "INSIDE upgrade_del_func()";
|
||||||
|
END latin1 latin1_swedish_ci latin1_swedish_ci
|
||||||
|
SELECT upgrade_del_func();
|
||||||
|
upgrade_del_func()
|
||||||
|
INSIDE upgrade_del_func()
|
||||||
|
"Check whether the definer user will be able to execute the replicated routine on slave"
|
||||||
|
USE bug42217_db;
|
||||||
|
SHOW CREATE FUNCTION upgrade_del_func;
|
||||||
|
Function sql_mode Create Function character_set_client collation_connection Database Collation
|
||||||
|
upgrade_del_func CREATE DEFINER=`create_rout_db`@`localhost` FUNCTION `upgrade_del_func`() RETURNS char(30) CHARSET latin1
|
||||||
|
BEGIN
|
||||||
|
RETURN "INSIDE upgrade_del_func()";
|
||||||
|
END latin1 latin1_swedish_ci latin1_swedish_ci
|
||||||
|
SELECT upgrade_del_func();
|
||||||
|
upgrade_del_func()
|
||||||
|
INSIDE upgrade_del_func()
|
||||||
|
DELETE FROM mysql.procs_priv;
|
||||||
|
FLUSH PRIVILEGES;
|
||||||
|
USE bug42217_db;
|
||||||
|
"Can't execute the replicated routine on slave like before after procs privilege is deleted "
|
||||||
|
SELECT upgrade_del_func();
|
||||||
|
ERROR 42000: execute command denied to user 'create_rout_db'@'localhost' for routine 'bug42217_db.upgrade_del_func'
|
||||||
|
"Test the user who creates a function on master doesn't exist on slave."
|
||||||
|
"Hence SQL thread ACL_GLOBAL privilege jumps in and no mysql.procs_priv is inserted"
|
||||||
|
DROP USER 'create_rout_db'@'localhost';
|
||||||
|
CREATE FUNCTION upgrade_alter_func() RETURNS CHAR(30)
|
||||||
|
BEGIN
|
||||||
|
RETURN "INSIDE upgrade_alter_func()";
|
||||||
|
END//
|
||||||
|
SELECT upgrade_alter_func();
|
||||||
|
upgrade_alter_func()
|
||||||
|
INSIDE upgrade_alter_func()
|
||||||
|
SHOW CREATE FUNCTION upgrade_alter_func;
|
||||||
|
Function sql_mode Create Function character_set_client collation_connection Database Collation
|
||||||
|
upgrade_alter_func CREATE DEFINER=`create_rout_db`@`localhost` FUNCTION `upgrade_alter_func`() RETURNS char(30) CHARSET latin1
|
||||||
|
BEGIN
|
||||||
|
RETURN "INSIDE upgrade_alter_func()";
|
||||||
|
END latin1 latin1_swedish_ci latin1_swedish_ci
|
||||||
|
"Should no privilege record for upgrade_alter_func in mysql.procs_priv"
|
||||||
|
SELECT * FROM mysql.procs_priv;
|
||||||
|
Host Db User Routine_name Routine_type Grantor Proc_priv Timestamp
|
||||||
|
SELECT upgrade_alter_func();
|
||||||
|
ERROR HY000: The user specified as a definer ('create_rout_db'@'localhost') does not exist
|
||||||
|
USE bug42217_db;
|
||||||
|
DROP FUNCTION upgrade_del_func;
|
||||||
|
DROP FUNCTION upgrade_alter_func;
|
||||||
|
DROP DATABASE bug42217_db;
|
||||||
|
DROP USER 'create_rout_db'@'localhost';
|
||||||
|
"End of test"
|
||||||
|
@@ -29,3 +29,28 @@ a
|
|||||||
2
|
2
|
||||||
3
|
3
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
==== Bug22504 Initialize ====
|
||||||
|
[on master]
|
||||||
|
SET sql_mode='ignore_space';
|
||||||
|
CREATE TABLE t1(a int);
|
||||||
|
insert into t1 values (1), (2), (3), (4);
|
||||||
|
select * into outfile 'MYSQLD_DATADIR/rpl_loaddatalocal.select_outfile' from t1;
|
||||||
|
truncate table t1;
|
||||||
|
load data local infile 'MYSQLD_DATADIR/rpl_loaddatalocal.select_outfile' into table t1;
|
||||||
|
SELECT * FROM t1 ORDER BY a;
|
||||||
|
a
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
[on slave]
|
||||||
|
SELECT * FROM t1 ORDER BY a;
|
||||||
|
a
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
==== Clean up ====
|
||||||
|
[on master]
|
||||||
|
DROP TABLE t1;
|
||||||
|
[on slave]
|
||||||
|
@@ -87,9 +87,7 @@ show binary logs;
|
|||||||
Log_name File_size
|
Log_name File_size
|
||||||
master-bin.000002 #
|
master-bin.000002 #
|
||||||
master-bin.000003 #
|
master-bin.000003 #
|
||||||
select @time_for_purge:=DATE_ADD(UPDATE_TIME, INTERVAL 1 SECOND)
|
SELECT @time_for_purge:=DATE_ADD('tmpval', INTERVAL 1 SECOND);
|
||||||
from information_schema.tables
|
|
||||||
where TABLE_SCHEMA="test" and TABLE_NAME="t2";
|
|
||||||
purge master logs before (@time_for_purge);
|
purge master logs before (@time_for_purge);
|
||||||
show binary logs;
|
show binary logs;
|
||||||
Log_name File_size
|
Log_name File_size
|
||||||
|
@@ -112,3 +112,100 @@ show grants for rpl_do_grant2@localhost;
|
|||||||
sync_slave_with_master;
|
sync_slave_with_master;
|
||||||
--error 1141
|
--error 1141
|
||||||
show grants for rpl_do_grant2@localhost;
|
show grants for rpl_do_grant2@localhost;
|
||||||
|
|
||||||
|
#####################################################
|
||||||
|
# Purpose
|
||||||
|
# Test whether mysql.procs_priv get replicated
|
||||||
|
# Related bugs:
|
||||||
|
# BUG42217 mysql.procs_priv does not get replicated
|
||||||
|
#####################################################
|
||||||
|
connection master;
|
||||||
|
|
||||||
|
--disable_warnings
|
||||||
|
DROP DATABASE IF EXISTS bug42217_db;
|
||||||
|
--enable_warnings
|
||||||
|
CREATE DATABASE bug42217_db;
|
||||||
|
|
||||||
|
GRANT CREATE ROUTINE ON bug42217_db.* TO 'create_rout_db'@'localhost'
|
||||||
|
IDENTIFIED BY 'create_rout_db' WITH GRANT OPTION;
|
||||||
|
|
||||||
|
connect (create_rout_db_master, localhost, create_rout_db, create_rout_db, bug42217_db,$MASTER_MYPORT,);
|
||||||
|
connect (create_rout_db_slave, localhost, create_rout_db, create_rout_db, bug42217_db, $SLAVE_MYPORT,);
|
||||||
|
|
||||||
|
connection create_rout_db_master;
|
||||||
|
|
||||||
|
|
||||||
|
USE bug42217_db;
|
||||||
|
|
||||||
|
DELIMITER //;
|
||||||
|
CREATE FUNCTION upgrade_del_func() RETURNS CHAR(30)
|
||||||
|
BEGIN
|
||||||
|
RETURN "INSIDE upgrade_del_func()";
|
||||||
|
END//
|
||||||
|
|
||||||
|
DELIMITER ;//
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
|
||||||
|
USE bug42217_db;
|
||||||
|
--replace_column 8 #
|
||||||
|
SELECT * FROM mysql.procs_priv;
|
||||||
|
SELECT upgrade_del_func();
|
||||||
|
|
||||||
|
sync_slave_with_master;
|
||||||
|
--replace_column 8 #
|
||||||
|
SELECT * FROM mysql.procs_priv;
|
||||||
|
SHOW GRANTS FOR 'create_rout_db'@'localhost';
|
||||||
|
|
||||||
|
USE bug42217_db;
|
||||||
|
SHOW CREATE FUNCTION upgrade_del_func;
|
||||||
|
SELECT upgrade_del_func();
|
||||||
|
|
||||||
|
--echo "Check whether the definer user will be able to execute the replicated routine on slave"
|
||||||
|
connection create_rout_db_slave;
|
||||||
|
USE bug42217_db;
|
||||||
|
SHOW CREATE FUNCTION upgrade_del_func;
|
||||||
|
SELECT upgrade_del_func();
|
||||||
|
|
||||||
|
connection slave;
|
||||||
|
DELETE FROM mysql.procs_priv;
|
||||||
|
FLUSH PRIVILEGES;
|
||||||
|
USE bug42217_db;
|
||||||
|
--echo "Can't execute the replicated routine on slave like before after procs privilege is deleted "
|
||||||
|
--error 1370
|
||||||
|
SELECT upgrade_del_func();
|
||||||
|
|
||||||
|
--echo "Test the user who creates a function on master doesn't exist on slave."
|
||||||
|
--echo "Hence SQL thread ACL_GLOBAL privilege jumps in and no mysql.procs_priv is inserted"
|
||||||
|
DROP USER 'create_rout_db'@'localhost';
|
||||||
|
|
||||||
|
connection create_rout_db_master;
|
||||||
|
DELIMITER //;
|
||||||
|
CREATE FUNCTION upgrade_alter_func() RETURNS CHAR(30)
|
||||||
|
BEGIN
|
||||||
|
RETURN "INSIDE upgrade_alter_func()";
|
||||||
|
END//
|
||||||
|
DELIMITER ;//
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
SELECT upgrade_alter_func();
|
||||||
|
|
||||||
|
sync_slave_with_master;
|
||||||
|
SHOW CREATE FUNCTION upgrade_alter_func;
|
||||||
|
--echo "Should no privilege record for upgrade_alter_func in mysql.procs_priv"
|
||||||
|
--replace_column 8 #
|
||||||
|
SELECT * FROM mysql.procs_priv;
|
||||||
|
--error 1449
|
||||||
|
SELECT upgrade_alter_func();
|
||||||
|
|
||||||
|
###### CLEAN UP SECTION ##############
|
||||||
|
disconnect create_rout_db_master;
|
||||||
|
disconnect create_rout_db_slave;
|
||||||
|
connection master;
|
||||||
|
USE bug42217_db;
|
||||||
|
DROP FUNCTION upgrade_del_func;
|
||||||
|
DROP FUNCTION upgrade_alter_func;
|
||||||
|
DROP DATABASE bug42217_db;
|
||||||
|
DROP USER 'create_rout_db'@'localhost';
|
||||||
|
|
||||||
|
--echo "End of test"
|
||||||
|
@@ -64,3 +64,37 @@ drop table t1;
|
|||||||
save_master_pos;
|
save_master_pos;
|
||||||
connection slave;
|
connection slave;
|
||||||
sync_with_master;
|
sync_with_master;
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug22504 load data infile sql statement in replication architecture get error
|
||||||
|
#
|
||||||
|
--echo ==== Bug22504 Initialize ====
|
||||||
|
|
||||||
|
--echo [on master]
|
||||||
|
--connection master
|
||||||
|
|
||||||
|
SET sql_mode='ignore_space';
|
||||||
|
CREATE TABLE t1(a int);
|
||||||
|
insert into t1 values (1), (2), (3), (4);
|
||||||
|
--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
|
||||||
|
eval select * into outfile '$MYSQLD_DATADIR/rpl_loaddatalocal.select_outfile' from t1;
|
||||||
|
truncate table t1;
|
||||||
|
--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
|
||||||
|
eval load data local infile '$MYSQLD_DATADIR/rpl_loaddatalocal.select_outfile' into table t1;
|
||||||
|
--remove_file $MYSQLD_DATADIR/rpl_loaddatalocal.select_outfile
|
||||||
|
SELECT * FROM t1 ORDER BY a;
|
||||||
|
|
||||||
|
--echo [on slave]
|
||||||
|
sync_slave_with_master;
|
||||||
|
SELECT * FROM t1 ORDER BY a;
|
||||||
|
|
||||||
|
--echo ==== Clean up ====
|
||||||
|
|
||||||
|
--echo [on master]
|
||||||
|
connection master;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo [on slave]
|
||||||
|
sync_slave_with_master;
|
||||||
|
|
||||||
|
@@ -112,14 +112,24 @@ source include/show_master_logs.inc;
|
|||||||
purge binary logs to 'master-bin.000002';
|
purge binary logs to 'master-bin.000002';
|
||||||
source include/show_binary_logs.inc;
|
source include/show_binary_logs.inc;
|
||||||
|
|
||||||
# Calculate time to use in "purge master logs before" by taking
|
# Set the purge time 1 second after the last modify time of master-bin.000002.
|
||||||
# last modification time of t2 and adding 1 second
|
perl;
|
||||||
# This is donw in order to handle the case where file system
|
open F, ">>".$ENV{'MYSQLTEST_VARDIR'}.'/tmp/rpl_rotate_logs.tmp' or die "Tmp file rpl_rotate_logs.tmp not found";
|
||||||
# time differs from mysqld's time
|
my $binlogpath = $ENV{'MYSQLTEST_VARDIR'}.'/mysqld.1/data/master-bin.000002';
|
||||||
|
my @array = stat($binlogpath);
|
||||||
|
my $filemodifytime = $array[9];
|
||||||
|
my @t = localtime $filemodifytime;
|
||||||
|
my $modifytime = sprintf "%04u-%02u-%02u %02u:%02u:%02u",$t[5]+1900,$t[4]+1,$t[3],$t[2],$t[1],$t[0];
|
||||||
|
printf F ("let \$tmpval = %s;",$modifytime);
|
||||||
|
close F;
|
||||||
|
EOF
|
||||||
|
|
||||||
|
--source $MYSQLTEST_VARDIR/tmp/rpl_rotate_logs.tmp
|
||||||
|
remove_file $MYSQLTEST_VARDIR/tmp/rpl_rotate_logs.tmp;
|
||||||
|
|
||||||
--disable_result_log
|
--disable_result_log
|
||||||
select @time_for_purge:=DATE_ADD(UPDATE_TIME, INTERVAL 1 SECOND)
|
--replace_result $tmpval tmpval
|
||||||
from information_schema.tables
|
--eval SELECT @time_for_purge:=DATE_ADD('$tmpval', INTERVAL 1 SECOND)
|
||||||
where TABLE_SCHEMA="test" and TABLE_NAME="t2";
|
|
||||||
--enable_result_log
|
--enable_result_log
|
||||||
|
|
||||||
purge master logs before (@time_for_purge);
|
purge master logs before (@time_for_purge);
|
||||||
|
@@ -11,6 +11,11 @@
|
|||||||
# Creation Date: 2008-03-07 #
|
# Creation Date: 2008-03-07 #
|
||||||
# Author: Salman Rawala #
|
# Author: Salman Rawala #
|
||||||
# #
|
# #
|
||||||
|
# Modified: HHunger 2009-02-23 Inserted a wait condition right after the #
|
||||||
|
# "INSERT ..record_6" to wait for the end of #
|
||||||
|
# the insert. #
|
||||||
|
# mleich This test needs some inporovements #
|
||||||
|
# #
|
||||||
# Description: Test Cases of Dynamic System Variable "concurrent_insert" #
|
# Description: Test Cases of Dynamic System Variable "concurrent_insert" #
|
||||||
# that checks functionality of this variable #
|
# that checks functionality of this variable #
|
||||||
# #
|
# #
|
||||||
@@ -62,7 +67,6 @@ connection test_con1;
|
|||||||
INSERT INTO t1(name) VALUES('Record_4');
|
INSERT INTO t1(name) VALUES('Record_4');
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
|
|
||||||
|
|
||||||
--echo ## unlocking tables ##
|
--echo ## unlocking tables ##
|
||||||
--echo connection default;
|
--echo connection default;
|
||||||
connection default;
|
connection default;
|
||||||
@@ -106,6 +110,8 @@ UNLOCK TABLES;
|
|||||||
--echo ## table contens after UNLOCK ##
|
--echo ## table contens after UNLOCK ##
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
INSERT INTO t1(name) VALUES('Record_6');
|
INSERT INTO t1(name) VALUES('Record_6');
|
||||||
|
let $wait_condition= SELECT COUNT(*) = 5 FROM t1;
|
||||||
|
--source include/wait_condition.inc
|
||||||
|
|
||||||
--echo connection test_con1;
|
--echo connection test_con1;
|
||||||
connection test_con1;
|
connection test_con1;
|
||||||
|
@@ -1599,3 +1599,18 @@ INSERT INTO t1 VALUES (NULL, NULL),(NULL, NULL);
|
|||||||
FLUSH TABLE t1;
|
FLUSH TABLE t1;
|
||||||
SELECT * FROM t1 ORDER BY a;
|
SELECT * FROM t1 ORDER BY a;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # BUG#32880 - Repairing Archive table fails with internal error 144
|
||||||
|
--echo #
|
||||||
|
--echo
|
||||||
|
--echo # Test with an existing table which is corrupted
|
||||||
|
--echo # Copy t1 from std_data
|
||||||
|
let $MYSQLD_DATADIR= `select @@datadir`;
|
||||||
|
copy_file std_data/bug32880.frm $MYSQLD_DATADIR/test/t1.frm;
|
||||||
|
copy_file std_data/bug32880.ARZ $MYSQLD_DATADIR/test/t1.ARZ;
|
||||||
|
copy_file std_data/bug32880.ARN $MYSQLD_DATADIR/test/t1.ARN;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
CHECK TABLE t1;
|
||||||
|
REPAIR TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
@@ -229,3 +229,17 @@ insert into t1 set a=0x6c;
|
|||||||
insert into t1 set a=0x4c98;
|
insert into t1 set a=0x4c98;
|
||||||
check table t1 extended;
|
check table t1 extended;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#41627 Illegal mix of collations in LEAST / GREATEST / CASE
|
||||||
|
#
|
||||||
|
select least(_latin1'a',_latin2'b',_latin5'c' collate latin5_turkish_ci);
|
||||||
|
create table t1
|
||||||
|
select least(_latin1'a',_latin2'b',_latin5'c' collate latin5_turkish_ci) as f1;
|
||||||
|
show create table t1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
select case _latin1'a' when _latin2'b' then 1 when _latin5'c' collate
|
||||||
|
latin5_turkish_ci then 2 else 3 end;
|
||||||
|
|
||||||
|
select concat(_latin1'a',_latin2'b',_latin5'c' collate latin5_turkish_ci);
|
||||||
|
@@ -11,3 +11,5 @@
|
|||||||
##############################################################################
|
##############################################################################
|
||||||
kill : Bug#37780 2008-12-03 HHunger need some changes to be robust enough for pushbuild.
|
kill : Bug#37780 2008-12-03 HHunger need some changes to be robust enough for pushbuild.
|
||||||
innodb_bug39438 : BUG#42383 2009-01-28 lsoares "This fails in embedded and on windows. Note that this test is not run on windows and on embedded in PB for main trees currently"
|
innodb_bug39438 : BUG#42383 2009-01-28 lsoares "This fails in embedded and on windows. Note that this test is not run on windows and on embedded in PB for main trees currently"
|
||||||
|
#concurrent_innodb_safelog: disabled for embedded server due to bug#43733 Select on processlist let the embedded server crash (concurrent_innodb_safelog).
|
||||||
|
#concurrent_innodb_unsafelog: disabled for embedded server due to bug#43733.
|
||||||
|
@@ -342,6 +342,39 @@ EOF
|
|||||||
|
|
||||||
remove_file $MYSQLTEST_VARDIR/tmp/bug31060.sql;
|
remove_file $MYSQLTEST_VARDIR/tmp/bug31060.sql;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #41486: extra character appears in BLOB for every ~40Mb after
|
||||||
|
# mysqldump/import
|
||||||
|
#
|
||||||
|
|
||||||
|
# Have to change the global variable as the session variable is
|
||||||
|
# read-only.
|
||||||
|
set @old_max_allowed_packet = @@global.max_allowed_packet;
|
||||||
|
# 2 MB blob length + some space for the rest of INSERT query
|
||||||
|
set @@global.max_allowed_packet = 2 * 1024 * 1024 + 1024;
|
||||||
|
|
||||||
|
# Create a new connection since the global max_allowed_packet
|
||||||
|
# has no effect for the current connection
|
||||||
|
connect (con1, localhost, root,,);
|
||||||
|
connection con1;
|
||||||
|
|
||||||
|
CREATE TABLE t1(data LONGBLOB);
|
||||||
|
INSERT INTO t1 SELECT REPEAT('1', 2*1024*1024);
|
||||||
|
|
||||||
|
--exec $MYSQL_DUMP test t1 >$MYSQLTEST_VARDIR/tmp/bug41486.sql
|
||||||
|
# Check that the mysql client does not insert extra newlines when loading
|
||||||
|
# strings longer than client's max_allowed_packet
|
||||||
|
--exec $MYSQL --max_allowed_packet=1M test < $MYSQLTEST_VARDIR/tmp/bug41486.sql 2>&1
|
||||||
|
SELECT LENGTH(data) FROM t1;
|
||||||
|
|
||||||
|
remove_file $MYSQLTEST_VARDIR/tmp/bug41486.sql;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
connection default;
|
||||||
|
disconnect con1;
|
||||||
|
|
||||||
|
set @@global.max_allowed_packet = @old_max_allowed_packet;
|
||||||
|
|
||||||
--echo End of 5.0 tests
|
--echo End of 5.0 tests
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@@ -105,17 +105,25 @@ SELECT a INTO @v FROM (
|
|||||||
SELECT a FROM t1
|
SELECT a FROM t1
|
||||||
) alias;
|
) alias;
|
||||||
|
|
||||||
SELECT a INTO OUTFILE 'union.out.file' FROM (
|
--let $outfile = $MYSQLTEST_VARDIR/tmp/union.out.file
|
||||||
SELECT a FROM t1
|
--error 0,1
|
||||||
UNION
|
--remove_file $outfile
|
||||||
SELECT a FROM t1 WHERE 0
|
|
||||||
) alias;
|
|
||||||
|
|
||||||
SELECT a INTO DUMPFILE 'union.out.file2' FROM (
|
--replace_result $MYSQLTEST_VARDIR <MYSQLTEST_VARDIR>
|
||||||
|
eval SELECT a INTO OUTFILE '$outfile' FROM (
|
||||||
SELECT a FROM t1
|
SELECT a FROM t1
|
||||||
UNION
|
UNION
|
||||||
SELECT a FROM t1 WHERE 0
|
SELECT a FROM t1 WHERE 0
|
||||||
) alias;
|
) alias;
|
||||||
|
--remove_file $outfile
|
||||||
|
|
||||||
|
--replace_result $MYSQLTEST_VARDIR <MYSQLTEST_VARDIR>
|
||||||
|
eval SELECT a INTO DUMPFILE '$outfile' FROM (
|
||||||
|
SELECT a FROM t1
|
||||||
|
UNION
|
||||||
|
SELECT a FROM t1 WHERE 0
|
||||||
|
) alias;
|
||||||
|
--remove_file $outfile
|
||||||
|
|
||||||
#
|
#
|
||||||
# INTO will not be allowed in subqueries in version 5.1 and above.
|
# INTO will not be allowed in subqueries in version 5.1 and above.
|
||||||
@@ -126,27 +134,42 @@ SELECT a FROM (
|
|||||||
SELECT a INTO @v FROM t1
|
SELECT a INTO @v FROM t1
|
||||||
) alias;
|
) alias;
|
||||||
|
|
||||||
SELECT a FROM (
|
--replace_result $MYSQLTEST_VARDIR <MYSQLTEST_VARDIR>
|
||||||
|
eval SELECT a FROM (
|
||||||
SELECT a FROM t1
|
SELECT a FROM t1
|
||||||
UNION
|
UNION
|
||||||
SELECT a INTO OUTFILE 'union.out.file3' FROM t1
|
SELECT a INTO OUTFILE '$outfile' FROM t1
|
||||||
) alias;
|
) alias;
|
||||||
|
--remove_file $outfile
|
||||||
|
|
||||||
SELECT a FROM (
|
--replace_result $MYSQLTEST_VARDIR <MYSQLTEST_VARDIR>
|
||||||
|
eval SELECT a FROM (
|
||||||
SELECT a FROM t1
|
SELECT a FROM t1
|
||||||
UNION
|
UNION
|
||||||
SELECT a INTO DUMPFILE 'union.out.file4' FROM t1
|
SELECT a INTO DUMPFILE '$outfile' FROM t1
|
||||||
) alias;
|
) alias;
|
||||||
|
--remove_file $outfile
|
||||||
|
|
||||||
SELECT a FROM t1 UNION SELECT a INTO @v FROM t1;
|
SELECT a FROM t1 UNION SELECT a INTO @v FROM t1;
|
||||||
SELECT a FROM t1 UNION SELECT a INTO OUTFILE 'union.out.file5' FROM t1;
|
|
||||||
SELECT a FROM t1 UNION SELECT a INTO OUTFILE 'union.out.file6' FROM t1;
|
--replace_result $MYSQLTEST_VARDIR <MYSQLTEST_VARDIR>
|
||||||
|
eval SELECT a FROM t1 UNION SELECT a INTO OUTFILE '$outfile' FROM t1;
|
||||||
|
--remove_file $outfile
|
||||||
|
|
||||||
|
--replace_result $MYSQLTEST_VARDIR <MYSQLTEST_VARDIR>
|
||||||
|
eval SELECT a FROM t1 UNION SELECT a INTO DUMPFILE '$outfile' FROM t1;
|
||||||
|
--remove_file $outfile
|
||||||
|
|
||||||
--error ER_WRONG_USAGE
|
--error ER_WRONG_USAGE
|
||||||
SELECT a INTO @v FROM t1 UNION SELECT a FROM t1;
|
SELECT a INTO @v FROM t1 UNION SELECT a FROM t1;
|
||||||
|
|
||||||
|
--replace_result $MYSQLTEST_VARDIR <MYSQLTEST_VARDIR>
|
||||||
--error ER_WRONG_USAGE
|
--error ER_WRONG_USAGE
|
||||||
SELECT a INTO OUTFILE 'union.out.file7' FROM t1 UNION SELECT a FROM t1;
|
eval SELECT a INTO OUTFILE '$outfile' FROM t1 UNION SELECT a FROM t1;
|
||||||
|
|
||||||
|
--replace_result $MYSQLTEST_VARDIR <MYSQLTEST_VARDIR>
|
||||||
--error ER_WRONG_USAGE
|
--error ER_WRONG_USAGE
|
||||||
SELECT a INTO DUMPFILE 'union.out.file8' FROM t1 UNION SELECT a FROM t1;
|
eval SELECT a INTO DUMPFILE '$outfile' FROM t1 UNION SELECT a FROM t1;
|
||||||
|
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
@@ -252,11 +252,16 @@ const char **my_error_unregister(int first, int last)
|
|||||||
|
|
||||||
void my_error_unregister_all(void)
|
void my_error_unregister_all(void)
|
||||||
{
|
{
|
||||||
struct my_err_head *list, *next;
|
struct my_err_head *cursor, *saved_next;
|
||||||
for (list= my_errmsgs_globerrs.meh_next; list; list= next)
|
|
||||||
|
for (cursor= my_errmsgs_globerrs.meh_next; cursor != NULL; cursor= saved_next)
|
||||||
{
|
{
|
||||||
next= list->meh_next;
|
/* We need this ptr, but we're about to free its container, so save it. */
|
||||||
my_free((uchar*) list, MYF(0));
|
saved_next= cursor->meh_next;
|
||||||
|
|
||||||
|
my_free((uchar*) cursor, MYF(0));
|
||||||
}
|
}
|
||||||
|
my_errmsgs_globerrs.meh_next= NULL; /* Freed in first iteration above. */
|
||||||
|
|
||||||
my_errmsgs_list= &my_errmsgs_globerrs;
|
my_errmsgs_list= &my_errmsgs_globerrs;
|
||||||
}
|
}
|
||||||
|
@@ -18,7 +18,7 @@ niceness=0
|
|||||||
logging=init
|
logging=init
|
||||||
want_syslog=0
|
want_syslog=0
|
||||||
syslog_tag=
|
syslog_tag=
|
||||||
user=@MYSQLD_USER@
|
user='@MYSQLD_USER@'
|
||||||
pid_file=
|
pid_file=
|
||||||
err_log=
|
err_log=
|
||||||
|
|
||||||
@@ -64,9 +64,10 @@ my_which ()
|
|||||||
{
|
{
|
||||||
save_ifs="${IFS-UNSET}"
|
save_ifs="${IFS-UNSET}"
|
||||||
IFS=:
|
IFS=:
|
||||||
|
ret=0
|
||||||
for file
|
for file
|
||||||
do
|
do
|
||||||
for dir in $PATH
|
for dir in "$PATH"
|
||||||
do
|
do
|
||||||
if [ -f "$dir/$file" ]
|
if [ -f "$dir/$file" ]
|
||||||
then
|
then
|
||||||
@@ -74,15 +75,18 @@ my_which ()
|
|||||||
continue 2
|
continue 2
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
return 1 # Failure, didn't find file in path
|
|
||||||
|
ret=1 #signal an error
|
||||||
|
break
|
||||||
done
|
done
|
||||||
|
|
||||||
if [ "$save_ifs" = UNSET ]
|
if [ "$save_ifs" = UNSET ]
|
||||||
then
|
then
|
||||||
unset IFS
|
unset IFS
|
||||||
else
|
else
|
||||||
IFS="$save_ifs"
|
IFS="$save_ifs"
|
||||||
fi
|
fi
|
||||||
return 0 # Success
|
return $ret # Success
|
||||||
}
|
}
|
||||||
|
|
||||||
log_generic () {
|
log_generic () {
|
||||||
@@ -212,19 +216,30 @@ fi
|
|||||||
|
|
||||||
MY_PWD=`pwd`
|
MY_PWD=`pwd`
|
||||||
# Check for the directories we would expect from a binary release install
|
# Check for the directories we would expect from a binary release install
|
||||||
if test -f "$relpkgdata"/english/errmsg.sys -a -x ./bin/mysqld
|
if test -n "$MY_BASEDIR_VERSION" -a -d "$MY_BASEDIR_VERSION"
|
||||||
then
|
then
|
||||||
MY_BASEDIR_VERSION=$MY_PWD # Where bin, share and data are
|
# BASEDIR is already overridden on command line. Do not re-set.
|
||||||
ledir=$MY_BASEDIR_VERSION/bin # Where mysqld is
|
|
||||||
|
# Use BASEDIR to discover le.
|
||||||
|
if test -x "$MY_BASEDIR_VERSION/libexec/mysqld"
|
||||||
|
then
|
||||||
|
ledir="$MY_BASEDIR_VERSION/libexec"
|
||||||
|
else
|
||||||
|
ledir="$MY_BASEDIR_VERSION/bin"
|
||||||
|
fi
|
||||||
|
elif test -f "$relpkgdata"/english/errmsg.sys -a -x "$MY_PWD/bin/mysqld"
|
||||||
|
then
|
||||||
|
MY_BASEDIR_VERSION="$MY_PWD" # Where bin, share and data are
|
||||||
|
ledir="$MY_PWD/bin" # Where mysqld is
|
||||||
# Check for the directories we would expect from a source install
|
# Check for the directories we would expect from a source install
|
||||||
elif test -f "$relpkgdata"/english/errmsg.sys -a -x ./libexec/mysqld
|
elif test -f "$relpkgdata"/english/errmsg.sys -a -x "$MY_PWD/libexec/mysqld"
|
||||||
then
|
then
|
||||||
MY_BASEDIR_VERSION=$MY_PWD # Where libexec, share and var are
|
MY_BASEDIR_VERSION="$MY_PWD" # Where libexec, share and var are
|
||||||
ledir=$MY_BASEDIR_VERSION/libexec # Where mysqld is
|
ledir="$MY_PWD/libexec" # Where mysqld is
|
||||||
# Since we didn't find anything, used the compiled-in defaults
|
# Since we didn't find anything, used the compiled-in defaults
|
||||||
else
|
else
|
||||||
MY_BASEDIR_VERSION=@prefix@
|
MY_BASEDIR_VERSION='@prefix@'
|
||||||
ledir=@libexecdir@
|
ledir='@libexecdir@'
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
@@ -274,7 +289,10 @@ export MYSQL_HOME
|
|||||||
|
|
||||||
# Get first arguments from the my.cnf file, groups [mysqld] and [mysqld_safe]
|
# Get first arguments from the my.cnf file, groups [mysqld] and [mysqld_safe]
|
||||||
# and then merge with the command line arguments
|
# and then merge with the command line arguments
|
||||||
if test -x ./bin/my_print_defaults
|
if test -x "$MY_BASEDIR_VERSION/bin/my_print_defaults"
|
||||||
|
then
|
||||||
|
print_defaults="$MY_BASEDIR_VERSION/bin/my_print_defaults"
|
||||||
|
elif test -x ./bin/my_print_defaults
|
||||||
then
|
then
|
||||||
print_defaults="./bin/my_print_defaults"
|
print_defaults="./bin/my_print_defaults"
|
||||||
elif test -x @bindir@/my_print_defaults
|
elif test -x @bindir@/my_print_defaults
|
||||||
@@ -399,7 +417,7 @@ then
|
|||||||
MYSQLD=mysqld
|
MYSQLD=mysqld
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test ! -x $ledir/$MYSQLD
|
if test ! -x "$ledir/$MYSQLD"
|
||||||
then
|
then
|
||||||
log_error "The file $ledir/$MYSQLD
|
log_error "The file $ledir/$MYSQLD
|
||||||
does not exist or is not executable. Please cd to the mysql installation
|
does not exist or is not executable. Please cd to the mysql installation
|
||||||
@@ -411,7 +429,7 @@ fi
|
|||||||
|
|
||||||
if test -z "$pid_file"
|
if test -z "$pid_file"
|
||||||
then
|
then
|
||||||
pid_file=$DATADIR/`@HOSTNAME@`.pid
|
pid_file="$DATADIR/`@HOSTNAME@`.pid"
|
||||||
else
|
else
|
||||||
case "$pid_file" in
|
case "$pid_file" in
|
||||||
/* ) ;;
|
/* ) ;;
|
||||||
|
19
sql/item.cc
19
sql/item.cc
@@ -1531,7 +1531,8 @@ bool DTCollation::aggregate(DTCollation &dt, uint flags)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Cannot apply conversion
|
// Cannot apply conversion
|
||||||
set(0, DERIVATION_NONE, 0);
|
set(&my_charset_bin, DERIVATION_NONE,
|
||||||
|
(dt.repertoire|repertoire));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1614,15 +1615,31 @@ bool agg_item_collations(DTCollation &c, const char *fname,
|
|||||||
{
|
{
|
||||||
uint i;
|
uint i;
|
||||||
Item **arg;
|
Item **arg;
|
||||||
|
bool unknown_cs= 0;
|
||||||
|
|
||||||
c.set(av[0]->collation);
|
c.set(av[0]->collation);
|
||||||
for (i= 1, arg= &av[item_sep]; i < count; i++, arg++)
|
for (i= 1, arg= &av[item_sep]; i < count; i++, arg++)
|
||||||
{
|
{
|
||||||
if (c.aggregate((*arg)->collation, flags))
|
if (c.aggregate((*arg)->collation, flags))
|
||||||
{
|
{
|
||||||
|
if (c.derivation == DERIVATION_NONE &&
|
||||||
|
c.collation == &my_charset_bin)
|
||||||
|
{
|
||||||
|
unknown_cs= 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
my_coll_agg_error(av, count, fname, item_sep);
|
my_coll_agg_error(av, count, fname, item_sep);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (unknown_cs &&
|
||||||
|
c.derivation != DERIVATION_EXPLICIT)
|
||||||
|
{
|
||||||
|
my_coll_agg_error(av, count, fname, item_sep);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
if ((flags & MY_COLL_DISALLOW_NONE) &&
|
if ((flags & MY_COLL_DISALLOW_NONE) &&
|
||||||
c.derivation == DERIVATION_NONE)
|
c.derivation == DERIVATION_NONE)
|
||||||
{
|
{
|
||||||
|
@@ -4129,9 +4129,32 @@ end_with_restore_list:
|
|||||||
|
|
||||||
res= (sp_result= lex->sphead->create(thd));
|
res= (sp_result= lex->sphead->create(thd));
|
||||||
switch (sp_result) {
|
switch (sp_result) {
|
||||||
case SP_OK:
|
case SP_OK: {
|
||||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||||
/* only add privileges if really neccessary */
|
/* only add privileges if really neccessary */
|
||||||
|
|
||||||
|
Security_context security_context;
|
||||||
|
bool restore_backup_context= false;
|
||||||
|
Security_context *backup= NULL;
|
||||||
|
LEX_USER *definer= thd->lex->definer;
|
||||||
|
/*
|
||||||
|
Check if the definer exists on slave,
|
||||||
|
then use definer privilege to insert routine privileges to mysql.procs_priv.
|
||||||
|
|
||||||
|
For current user of SQL thread has GLOBAL_ACL privilege,
|
||||||
|
which doesn't any check routine privileges,
|
||||||
|
so no routine privilege record will insert into mysql.procs_priv.
|
||||||
|
*/
|
||||||
|
if (thd->slave_thread && is_acl_user(definer->host.str, definer->user.str))
|
||||||
|
{
|
||||||
|
security_context.change_security_context(thd,
|
||||||
|
&thd->lex->definer->user,
|
||||||
|
&thd->lex->definer->host,
|
||||||
|
&thd->lex->sphead->m_db,
|
||||||
|
&backup);
|
||||||
|
restore_backup_context= true;
|
||||||
|
}
|
||||||
|
|
||||||
if (sp_automatic_privileges && !opt_noacl &&
|
if (sp_automatic_privileges && !opt_noacl &&
|
||||||
check_routine_access(thd, DEFAULT_CREATE_PROC_ACLS,
|
check_routine_access(thd, DEFAULT_CREATE_PROC_ACLS,
|
||||||
lex->sphead->m_db.str, name,
|
lex->sphead->m_db.str, name,
|
||||||
@@ -4143,8 +4166,19 @@ end_with_restore_list:
|
|||||||
ER_PROC_AUTO_GRANT_FAIL,
|
ER_PROC_AUTO_GRANT_FAIL,
|
||||||
ER(ER_PROC_AUTO_GRANT_FAIL));
|
ER(ER_PROC_AUTO_GRANT_FAIL));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Restore current user with GLOBAL_ACL privilege of SQL thread
|
||||||
|
*/
|
||||||
|
if (restore_backup_context)
|
||||||
|
{
|
||||||
|
DBUG_ASSERT(thd->slave_thread == 1);
|
||||||
|
thd->security_ctx->restore_security_context(thd, backup);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case SP_WRITE_ROW_FAILED:
|
case SP_WRITE_ROW_FAILED:
|
||||||
my_error(ER_SP_ALREADY_EXISTS, MYF(0), SP_TYPE_STRING(lex), name);
|
my_error(ER_SP_ALREADY_EXISTS, MYF(0), SP_TYPE_STRING(lex), name);
|
||||||
break;
|
break;
|
||||||
|
@@ -9797,6 +9797,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
|
|||||||
table->in_use= thd;
|
table->in_use= thd;
|
||||||
table->quick_keys.init();
|
table->quick_keys.init();
|
||||||
table->covering_keys.init();
|
table->covering_keys.init();
|
||||||
|
table->merge_keys.init();
|
||||||
table->keys_in_use_for_query.init();
|
table->keys_in_use_for_query.init();
|
||||||
|
|
||||||
table->s= share;
|
table->s= share;
|
||||||
|
@@ -1652,6 +1652,7 @@ int open_table_from_share(THD *thd, TABLE_SHARE *share, const char *alias,
|
|||||||
goto err;
|
goto err;
|
||||||
outparam->quick_keys.init();
|
outparam->quick_keys.init();
|
||||||
outparam->covering_keys.init();
|
outparam->covering_keys.init();
|
||||||
|
outparam->merge_keys.init();
|
||||||
outparam->keys_in_use_for_query.init();
|
outparam->keys_in_use_for_query.init();
|
||||||
|
|
||||||
/* Allocate handler */
|
/* Allocate handler */
|
||||||
|
@@ -1825,6 +1825,13 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
|
|||||||
#ifdef ABBR_ARE_USED
|
#ifdef ABBR_ARE_USED
|
||||||
char chars[max(TZ_MAX_CHARS + 1, (2 * (MY_TZNAME_MAX + 1)))];
|
char chars[max(TZ_MAX_CHARS + 1, (2 * (MY_TZNAME_MAX + 1)))];
|
||||||
#endif
|
#endif
|
||||||
|
/*
|
||||||
|
Used as a temporary tz_info until we decide that we actually want to
|
||||||
|
allocate and keep the tz info and tz name in tz_storage.
|
||||||
|
*/
|
||||||
|
TIME_ZONE_INFO tmp_tz_info;
|
||||||
|
memset(&tmp_tz_info, 0, sizeof(TIME_ZONE_INFO));
|
||||||
|
|
||||||
DBUG_ENTER("tz_load_from_open_tables");
|
DBUG_ENTER("tz_load_from_open_tables");
|
||||||
|
|
||||||
/* Prepare tz_info for loading also let us make copy of time zone name */
|
/* Prepare tz_info for loading also let us make copy of time zone name */
|
||||||
@@ -1866,7 +1873,8 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
|
|||||||
Most probably user has mistyped time zone name, so no need to bark here
|
Most probably user has mistyped time zone name, so no need to bark here
|
||||||
unless we need it for debugging.
|
unless we need it for debugging.
|
||||||
*/
|
*/
|
||||||
sql_print_error("Can't find description of time zone '%s'", tz_name_buff);
|
sql_print_error("Can't find description of time zone '%.*s'",
|
||||||
|
tz_name->length(), tz_name->ptr());
|
||||||
#endif
|
#endif
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
@@ -1895,8 +1903,8 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
|
|||||||
/* If Uses_leap_seconds == 'Y' */
|
/* If Uses_leap_seconds == 'Y' */
|
||||||
if (table->field[1]->val_int() == 1)
|
if (table->field[1]->val_int() == 1)
|
||||||
{
|
{
|
||||||
tz_info->leapcnt= tz_leapcnt;
|
tmp_tz_info.leapcnt= tz_leapcnt;
|
||||||
tz_info->lsis= tz_lsis;
|
tmp_tz_info.lsis= tz_lsis;
|
||||||
}
|
}
|
||||||
|
|
||||||
(void)table->file->ha_index_end();
|
(void)table->file->ha_index_end();
|
||||||
@@ -1932,18 +1940,18 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
|
|||||||
#ifdef ABBR_ARE_USED
|
#ifdef ABBR_ARE_USED
|
||||||
// FIXME should we do something with duplicates here ?
|
// FIXME should we do something with duplicates here ?
|
||||||
table->field[4]->val_str(&abbr, &abbr);
|
table->field[4]->val_str(&abbr, &abbr);
|
||||||
if (tz_info->charcnt + abbr.length() + 1 > sizeof(chars))
|
if (tmp_tz_info.charcnt + abbr.length() + 1 > sizeof(chars))
|
||||||
{
|
{
|
||||||
sql_print_error("Error while loading time zone description from "
|
sql_print_error("Error while loading time zone description from "
|
||||||
"mysql.time_zone_transition_type table: not enough "
|
"mysql.time_zone_transition_type table: not enough "
|
||||||
"room for abbreviations");
|
"room for abbreviations");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
ttis[ttid].tt_abbrind= tz_info->charcnt;
|
ttis[ttid].tt_abbrind= tmp_tz_info.charcnt;
|
||||||
memcpy(chars + tz_info->charcnt, abbr.ptr(), abbr.length());
|
memcpy(chars + tmp_tz_info.charcnt, abbr.ptr(), abbr.length());
|
||||||
tz_info->charcnt+= abbr.length();
|
tmp_tz_info.charcnt+= abbr.length();
|
||||||
chars[tz_info->charcnt]= 0;
|
chars[tmp_tz_info.charcnt]= 0;
|
||||||
tz_info->charcnt++;
|
tmp_tz_info.charcnt++;
|
||||||
|
|
||||||
DBUG_PRINT("info",
|
DBUG_PRINT("info",
|
||||||
("time_zone_transition_type table: tz_id=%u tt_id=%u tt_gmtoff=%ld "
|
("time_zone_transition_type table: tz_id=%u tt_id=%u tt_gmtoff=%ld "
|
||||||
@@ -1956,9 +1964,9 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* ttid is increasing because we are reading using index */
|
/* ttid is increasing because we are reading using index */
|
||||||
DBUG_ASSERT(ttid >= tz_info->typecnt);
|
DBUG_ASSERT(ttid >= tmp_tz_info.typecnt);
|
||||||
|
|
||||||
tz_info->typecnt= ttid + 1;
|
tmp_tz_info.typecnt= ttid + 1;
|
||||||
|
|
||||||
res= table->file->index_next_same(table->record[0],
|
res= table->file->index_next_same(table->record[0],
|
||||||
table->field[0]->ptr, 4);
|
table->field[0]->ptr, 4);
|
||||||
@@ -1990,14 +1998,14 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
|
|||||||
ttime= (my_time_t)table->field[1]->val_int();
|
ttime= (my_time_t)table->field[1]->val_int();
|
||||||
ttid= (uint)table->field[2]->val_int();
|
ttid= (uint)table->field[2]->val_int();
|
||||||
|
|
||||||
if (tz_info->timecnt + 1 > TZ_MAX_TIMES)
|
if (tmp_tz_info.timecnt + 1 > TZ_MAX_TIMES)
|
||||||
{
|
{
|
||||||
sql_print_error("Error while loading time zone description from "
|
sql_print_error("Error while loading time zone description from "
|
||||||
"mysql.time_zone_transition table: "
|
"mysql.time_zone_transition table: "
|
||||||
"too much transitions");
|
"too much transitions");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
if (ttid + 1 > tz_info->typecnt)
|
if (ttid + 1 > tmp_tz_info.typecnt)
|
||||||
{
|
{
|
||||||
sql_print_error("Error while loading time zone description from "
|
sql_print_error("Error while loading time zone description from "
|
||||||
"mysql.time_zone_transition table: "
|
"mysql.time_zone_transition table: "
|
||||||
@@ -2005,9 +2013,9 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
ats[tz_info->timecnt]= ttime;
|
ats[tmp_tz_info.timecnt]= ttime;
|
||||||
types[tz_info->timecnt]= ttid;
|
types[tmp_tz_info.timecnt]= ttid;
|
||||||
tz_info->timecnt++;
|
tmp_tz_info.timecnt++;
|
||||||
|
|
||||||
DBUG_PRINT("info",
|
DBUG_PRINT("info",
|
||||||
("time_zone_transition table: tz_id: %u tt_time: %lu tt_id: %u",
|
("time_zone_transition table: tz_id: %u tt_time: %lu tt_id: %u",
|
||||||
@@ -2031,6 +2039,34 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
|
|||||||
(void)table->file->ha_index_end();
|
(void)table->file->ha_index_end();
|
||||||
table= 0;
|
table= 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Let us check how correct our time zone description is. We don't check for
|
||||||
|
tz->timecnt < 1 since it is ok for GMT.
|
||||||
|
*/
|
||||||
|
if (tmp_tz_info.typecnt < 1)
|
||||||
|
{
|
||||||
|
sql_print_error("loading time zone without transition types");
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allocate memory for the timezone info and timezone name in tz_storage. */
|
||||||
|
if (!(alloc_buff= (char*) alloc_root(&tz_storage, sizeof(TIME_ZONE_INFO) +
|
||||||
|
tz_name->length() + 1)))
|
||||||
|
{
|
||||||
|
sql_print_error("Out of memory while loading time zone description");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Move the temporary tz_info into the allocated area */
|
||||||
|
tz_info= (TIME_ZONE_INFO *)alloc_buff;
|
||||||
|
memcpy(tz_info, &tmp_tz_info, sizeof(TIME_ZONE_INFO));
|
||||||
|
tz_name_buff= alloc_buff + sizeof(TIME_ZONE_INFO);
|
||||||
|
/*
|
||||||
|
By writing zero to the end we guarantee that we can call ptr()
|
||||||
|
instead of c_ptr() for time zone name.
|
||||||
|
*/
|
||||||
|
strmake(tz_name_buff, tz_name->ptr(), tz_name->length());
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Now we will allocate memory and init TIME_ZONE_INFO structure.
|
Now we will allocate memory and init TIME_ZONE_INFO structure.
|
||||||
*/
|
*/
|
||||||
@@ -2062,15 +2098,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
|
|||||||
tz_info->ttis= (TRAN_TYPE_INFO *)alloc_buff;
|
tz_info->ttis= (TRAN_TYPE_INFO *)alloc_buff;
|
||||||
memcpy(tz_info->ttis, ttis, tz_info->typecnt * sizeof(TRAN_TYPE_INFO));
|
memcpy(tz_info->ttis, ttis, tz_info->typecnt * sizeof(TRAN_TYPE_INFO));
|
||||||
|
|
||||||
/*
|
/* Build reversed map. */
|
||||||
Let us check how correct our time zone description and build
|
|
||||||
reversed map. We don't check for tz->timecnt < 1 since it ok for GMT.
|
|
||||||
*/
|
|
||||||
if (tz_info->typecnt < 1)
|
|
||||||
{
|
|
||||||
sql_print_error("loading time zone without transition types");
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
if (prepare_tz_info(tz_info, &tz_storage))
|
if (prepare_tz_info(tz_info, &tz_storage))
|
||||||
{
|
{
|
||||||
sql_print_error("Unable to build mktime map for time zone");
|
sql_print_error("Unable to build mktime map for time zone");
|
||||||
|
@@ -1076,11 +1076,9 @@ int ha_archive::unpack_row(azio_stream *file_to_read, uchar *record)
|
|||||||
|
|
||||||
read= azread(file_to_read, record_buffer->buffer, row_len, &error);
|
read= azread(file_to_read, record_buffer->buffer, row_len, &error);
|
||||||
|
|
||||||
DBUG_ASSERT(row_len == read);
|
|
||||||
|
|
||||||
if (read != row_len || error)
|
if (read != row_len || error)
|
||||||
{
|
{
|
||||||
DBUG_RETURN(-1);
|
DBUG_RETURN(HA_ERR_CRASHED_ON_USAGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copy null bits */
|
/* Copy null bits */
|
||||||
@@ -1257,7 +1255,7 @@ int ha_archive::repair(THD* thd, HA_CHECK_OPT* check_opt)
|
|||||||
int rc= optimize(thd, check_opt);
|
int rc= optimize(thd, check_opt);
|
||||||
|
|
||||||
if (rc)
|
if (rc)
|
||||||
DBUG_RETURN(HA_ERR_CRASHED_ON_REPAIR);
|
DBUG_RETURN(HA_ADMIN_CORRUPT);
|
||||||
|
|
||||||
share->crashed= FALSE;
|
share->crashed= FALSE;
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
|
Reference in New Issue
Block a user