Merging 5.1 into 5.1-rpl-merge
This commit is contained in:
commit
84b81e6c95
@ -389,6 +389,9 @@ client/readline.cpp
|
|||||||
client/rpl_constants.h
|
client/rpl_constants.h
|
||||||
client/rpl_record_old.cc
|
client/rpl_record_old.cc
|
||||||
client/rpl_record_old.h
|
client/rpl_record_old.h
|
||||||
|
client/rpl_tblmap.h
|
||||||
|
client/rpl_tblmap.cc
|
||||||
|
client/rpl_utility.h
|
||||||
client/select_test
|
client/select_test
|
||||||
client/sql_string.cpp
|
client/sql_string.cpp
|
||||||
client/ssl_test
|
client/ssl_test
|
||||||
|
@ -104,6 +104,7 @@ DEFS = -DUNDEF_THREADS_HACK \
|
|||||||
-DDATADIR="\"$(localstatedir)\""
|
-DDATADIR="\"$(localstatedir)\""
|
||||||
|
|
||||||
sql_src=log_event.h mysql_priv.h rpl_constants.h \
|
sql_src=log_event.h mysql_priv.h rpl_constants.h \
|
||||||
|
rpl_utility.h rpl_tblmap.h rpl_tblmap.cc \
|
||||||
log_event.cc my_decimal.h my_decimal.cc \
|
log_event.cc my_decimal.h my_decimal.cc \
|
||||||
log_event_old.h log_event_old.cc \
|
log_event_old.h log_event_old.cc \
|
||||||
rpl_record_old.h rpl_record_old.cc
|
rpl_record_old.h rpl_record_old.cc
|
||||||
|
@ -64,7 +64,8 @@ static void warning(const char *format, ...) ATTRIBUTE_FORMAT(printf, 1, 2);
|
|||||||
|
|
||||||
static bool one_database=0, to_last_remote_log= 0, disable_log_bin= 0;
|
static bool one_database=0, to_last_remote_log= 0, disable_log_bin= 0;
|
||||||
static bool opt_hexdump= 0;
|
static bool opt_hexdump= 0;
|
||||||
const char *base64_output_mode_names[]= {"NEVER", "AUTO", "ALWAYS", NullS};
|
const char *base64_output_mode_names[]=
|
||||||
|
{"NEVER", "AUTO", "ALWAYS", "UNSPEC", "DECODE-ROWS", NullS};
|
||||||
TYPELIB base64_output_mode_typelib=
|
TYPELIB base64_output_mode_typelib=
|
||||||
{ array_elements(base64_output_mode_names) - 1, "",
|
{ array_elements(base64_output_mode_names) - 1, "",
|
||||||
base64_output_mode_names, NULL };
|
base64_output_mode_names, NULL };
|
||||||
@ -83,6 +84,8 @@ static const char* user = 0;
|
|||||||
static char* pass = 0;
|
static char* pass = 0;
|
||||||
static char *charset= 0;
|
static char *charset= 0;
|
||||||
|
|
||||||
|
static uint verbose= 0;
|
||||||
|
|
||||||
static ulonglong start_position, stop_position;
|
static ulonglong start_position, stop_position;
|
||||||
#define start_position_mot ((my_off_t)start_position)
|
#define start_position_mot ((my_off_t)start_position)
|
||||||
#define stop_position_mot ((my_off_t)stop_position)
|
#define stop_position_mot ((my_off_t)stop_position)
|
||||||
@ -1063,6 +1066,9 @@ that may lead to an endless loop.",
|
|||||||
{"user", 'u', "Connect to the remote server as username.",
|
{"user", 'u', "Connect to the remote server as username.",
|
||||||
(uchar**) &user, (uchar**) &user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0,
|
(uchar**) &user, (uchar**) &user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0,
|
||||||
0, 0},
|
0, 0},
|
||||||
|
{"verbose", 'v', "Reconstruct SQL statements out of row events. "
|
||||||
|
"-v -v adds comments on column data types",
|
||||||
|
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
{"version", 'V', "Print version and exit.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0,
|
{"version", 'V', "Print version and exit.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0,
|
||||||
0, 0, 0, 0, 0},
|
0, 0, 0, 0, 0},
|
||||||
{"open_files_limit", OPT_OPEN_FILES_LIMIT,
|
{"open_files_limit", OPT_OPEN_FILES_LIMIT,
|
||||||
@ -1258,6 +1264,12 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
|||||||
(find_type_or_exit(argument, &base64_output_mode_typelib, opt->name)-1);
|
(find_type_or_exit(argument, &base64_output_mode_typelib, opt->name)-1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 'v':
|
||||||
|
if (argument == disabled_my_option)
|
||||||
|
verbose= 0;
|
||||||
|
else
|
||||||
|
verbose++;
|
||||||
|
break;
|
||||||
case 'V':
|
case 'V':
|
||||||
print_version();
|
print_version();
|
||||||
exit(0);
|
exit(0);
|
||||||
@ -1344,6 +1356,8 @@ static Exit_status dump_log_entries(const char* logname)
|
|||||||
fprintf(result_file, "DELIMITER /*!*/;\n");
|
fprintf(result_file, "DELIMITER /*!*/;\n");
|
||||||
strmov(print_event_info.delimiter, "/*!*/;");
|
strmov(print_event_info.delimiter, "/*!*/;");
|
||||||
|
|
||||||
|
print_event_info.verbose= short_form ? 0 : verbose;
|
||||||
|
|
||||||
rc= (remote_opt ? dump_remote_log_entries(&print_event_info, logname) :
|
rc= (remote_opt ? dump_remote_log_entries(&print_event_info, logname) :
|
||||||
dump_local_log_entries(&print_event_info, logname));
|
dump_local_log_entries(&print_event_info, logname));
|
||||||
|
|
||||||
|
@ -577,6 +577,7 @@ extern int my_close(File Filedes,myf MyFlags);
|
|||||||
extern File my_dup(File file, myf MyFlags);
|
extern File my_dup(File file, myf MyFlags);
|
||||||
extern int my_mkdir(const char *dir, int Flags, myf MyFlags);
|
extern int my_mkdir(const char *dir, int Flags, myf MyFlags);
|
||||||
extern int my_readlink(char *to, const char *filename, myf MyFlags);
|
extern int my_readlink(char *to, const char *filename, myf MyFlags);
|
||||||
|
extern int my_is_symlink(const char *filename);
|
||||||
extern int my_realpath(char *to, const char *filename, myf MyFlags);
|
extern int my_realpath(char *to, const char *filename, myf MyFlags);
|
||||||
extern File my_create_with_symlink(const char *linkname, const char *filename,
|
extern File my_create_with_symlink(const char *linkname, const char *filename,
|
||||||
int createflags, int access_flags,
|
int createflags, int access_flags,
|
||||||
|
@ -256,6 +256,10 @@ extern my_bool myisam_flush,myisam_delay_key_write,myisam_single_user;
|
|||||||
extern my_off_t myisam_max_temp_length;
|
extern my_off_t myisam_max_temp_length;
|
||||||
extern ulong myisam_bulk_insert_tree_size, myisam_data_pointer_size;
|
extern ulong myisam_bulk_insert_tree_size, myisam_data_pointer_size;
|
||||||
|
|
||||||
|
/* usually used to check if a symlink points into the mysql data home */
|
||||||
|
/* which is normally forbidden */
|
||||||
|
extern int (*myisam_test_invalid_symlink)(const char *filename);
|
||||||
|
|
||||||
/* Prototypes for myisam-functions */
|
/* Prototypes for myisam-functions */
|
||||||
|
|
||||||
extern int mi_close(struct st_myisam_info *file);
|
extern int mi_close(struct st_myisam_info *file);
|
||||||
|
1922
mysql-test/include/mysqlbinlog_row_engine.inc
Normal file
1922
mysql-test/include/mysqlbinlog_row_engine.inc
Normal file
File diff suppressed because it is too large
Load Diff
@ -1831,6 +1831,28 @@ id ref
|
|||||||
3 2
|
3 2
|
||||||
4 5
|
4 5
|
||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
|
CREATE TABLE t1 (a INT) ENGINE=MyISAM CHECKSUM=1 ROW_FORMAT=DYNAMIC;
|
||||||
|
INSERT INTO t1 VALUES (0);
|
||||||
|
UPDATE t1 SET a=1;
|
||||||
|
SELECT a FROM t1;
|
||||||
|
a
|
||||||
|
1
|
||||||
|
CHECK TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 check status OK
|
||||||
|
INSERT INTO t1 VALUES (0), (5), (4), (2);
|
||||||
|
UPDATE t1 SET a=2;
|
||||||
|
SELECT a FROM t1;
|
||||||
|
a
|
||||||
|
2
|
||||||
|
2
|
||||||
|
2
|
||||||
|
2
|
||||||
|
2
|
||||||
|
CHECK TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 check status OK
|
||||||
|
DROP TABLE t1;
|
||||||
End of 5.0 tests
|
End of 5.0 tests
|
||||||
create table t1 (a int not null, key `a` (a) key_block_size=1024);
|
create table t1 (a int not null, key `a` (a) key_block_size=1024);
|
||||||
show create table t1;
|
show create table t1;
|
||||||
|
4137
mysql-test/r/mysqlbinlog_row.result
Normal file
4137
mysql-test/r/mysqlbinlog_row.result
Normal file
File diff suppressed because it is too large
Load Diff
74
mysql-test/r/mysqlbinlog_row_big.result
Normal file
74
mysql-test/r/mysqlbinlog_row_big.result
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
#
|
||||||
|
# Preparatory cleanup.
|
||||||
|
#
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
#
|
||||||
|
# We need a fixed timestamp to avoid varying results.
|
||||||
|
#
|
||||||
|
SET timestamp=1000000000;
|
||||||
|
#
|
||||||
|
# We need big packets.
|
||||||
|
#
|
||||||
|
SET @@session.max_allowed_packet= 1024*1024*1024;
|
||||||
|
#
|
||||||
|
# Delete all existing binary logs.
|
||||||
|
#
|
||||||
|
RESET MASTER;
|
||||||
|
#
|
||||||
|
# Create a test table.
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
c1 LONGTEXT
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET latin1;
|
||||||
|
#
|
||||||
|
# Show how much rows are affected by each statement.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Insert a big row.
|
||||||
|
#
|
||||||
|
INSERT INTO t1 VALUES (REPEAT('ManyMegaByteBlck', 2097152));
|
||||||
|
affected rows: 1
|
||||||
|
#
|
||||||
|
# Show what we have in the table.
|
||||||
|
# Do not display the column value itself, just its length.
|
||||||
|
#
|
||||||
|
SELECT LENGTH(c1) FROM t1;
|
||||||
|
LENGTH(c1) 33554432
|
||||||
|
affected rows: 1
|
||||||
|
#
|
||||||
|
# Grow the row by updating.
|
||||||
|
#
|
||||||
|
UPDATE t1 SET c1 = CONCAT(c1, c1);
|
||||||
|
affected rows: 1
|
||||||
|
info: Rows matched: 1 Changed: 1 Warnings: 0
|
||||||
|
#
|
||||||
|
# Show what we have in the table.
|
||||||
|
# Do not display the column value itself, just its length.
|
||||||
|
#
|
||||||
|
SELECT LENGTH(c1) FROM t1;
|
||||||
|
LENGTH(c1) 67108864
|
||||||
|
affected rows: 1
|
||||||
|
#
|
||||||
|
# Delete the row.
|
||||||
|
#
|
||||||
|
DELETE FROM t1 WHERE c1 >= 'ManyMegaByteBlck';
|
||||||
|
affected rows: 1
|
||||||
|
#
|
||||||
|
# Hide how much rows are affected by each statement.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Flush all log buffers to the log file.
|
||||||
|
#
|
||||||
|
FLUSH LOGS;
|
||||||
|
#
|
||||||
|
# Call mysqlbinlog to display the log file contents.
|
||||||
|
# NOTE: The output of mysqlbinlog is redirected to
|
||||||
|
# $MYSQLTEST_VARDIR/tmp/mysqlbinlog_big_1.out
|
||||||
|
# If you want to examine it, disable remove_file
|
||||||
|
# at the bottom of the test script.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Cleanup.
|
||||||
|
#
|
||||||
|
DROP TABLE t1;
|
||||||
|
remove_file $MYSQLTEST_VARDIR/tmp/mysqlbinlog_big_1.out
|
4859
mysql-test/r/mysqlbinlog_row_innodb.result
Normal file
4859
mysql-test/r/mysqlbinlog_row_innodb.result
Normal file
File diff suppressed because it is too large
Load Diff
4899
mysql-test/r/mysqlbinlog_row_myisam.result
Normal file
4899
mysql-test/r/mysqlbinlog_row_myisam.result
Normal file
File diff suppressed because it is too large
Load Diff
500
mysql-test/r/mysqlbinlog_row_trans.result
Normal file
500
mysql-test/r/mysqlbinlog_row_trans.result
Normal file
@ -0,0 +1,500 @@
|
|||||||
|
#
|
||||||
|
# Preparatory cleanup.
|
||||||
|
#
|
||||||
|
DROP TABLE IF EXISTS t1, t2;
|
||||||
|
#
|
||||||
|
# We need a fixed timestamp to avoid varying results.
|
||||||
|
#
|
||||||
|
SET timestamp=1000000000;
|
||||||
|
#
|
||||||
|
# Delete all existing binary logs.
|
||||||
|
#
|
||||||
|
RESET MASTER;
|
||||||
|
#
|
||||||
|
# Create test tables.
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
c1 INT,
|
||||||
|
c2 VARCHAR(20)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET latin1;
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
c1 INT,
|
||||||
|
c2 VARCHAR(20)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET latin1;
|
||||||
|
#
|
||||||
|
# Start transaction #1, transactional table only, commit.
|
||||||
|
#
|
||||||
|
START TRANSACTION;
|
||||||
|
#
|
||||||
|
# Do some statements.
|
||||||
|
#
|
||||||
|
INSERT INTO t1 VALUES (1,'varchar-1'), (2,'varchar-2'), (3,'varchar-3');
|
||||||
|
UPDATE t1 SET c1 = c1 + 10;
|
||||||
|
DELETE FROM t1 WHERE c1 = 12;
|
||||||
|
#
|
||||||
|
# Commit transaction.
|
||||||
|
#
|
||||||
|
COMMIT;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
c1 c2
|
||||||
|
11 varchar-1
|
||||||
|
13 varchar-3
|
||||||
|
TRUNCATE TABLE t1;
|
||||||
|
#
|
||||||
|
# Start transaction #2, transactional table only, rollback.
|
||||||
|
#
|
||||||
|
START TRANSACTION;
|
||||||
|
#
|
||||||
|
# Do some statements.
|
||||||
|
#
|
||||||
|
INSERT INTO t1 VALUES (1,'varchar-1'), (2,'varchar-2'), (3,'varchar-3');
|
||||||
|
UPDATE t1 SET c1 = c1 + 10;
|
||||||
|
DELETE FROM t1 WHERE c1 = 12;
|
||||||
|
#
|
||||||
|
# Rollback transaction.
|
||||||
|
#
|
||||||
|
ROLLBACK;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
c1 c2
|
||||||
|
TRUNCATE TABLE t1;
|
||||||
|
#
|
||||||
|
# Start transaction #3, both tables, commit.
|
||||||
|
#
|
||||||
|
START TRANSACTION;
|
||||||
|
#
|
||||||
|
# Do some statements on the transactional table.
|
||||||
|
#
|
||||||
|
INSERT INTO t1 VALUES (1,'varchar-1'), (2,'varchar-2'), (3,'varchar-3');
|
||||||
|
UPDATE t1 SET c1 = c1 + 10;
|
||||||
|
DELETE FROM t1 WHERE c1 = 12;
|
||||||
|
#
|
||||||
|
# Do some statements on the non-transactional table.
|
||||||
|
#
|
||||||
|
INSERT INTO t2 VALUES (1,'varchar-1'), (2,'varchar-2'), (3,'varchar-3');
|
||||||
|
UPDATE t2 SET c1 = c1 + 10;
|
||||||
|
DELETE FROM t2 WHERE c1 = 12;
|
||||||
|
#
|
||||||
|
# Commit transaction.
|
||||||
|
#
|
||||||
|
COMMIT;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
c1 c2
|
||||||
|
11 varchar-1
|
||||||
|
13 varchar-3
|
||||||
|
SELECT * FROM t2;
|
||||||
|
c1 c2
|
||||||
|
11 varchar-1
|
||||||
|
13 varchar-3
|
||||||
|
TRUNCATE TABLE t1;
|
||||||
|
TRUNCATE TABLE t2;
|
||||||
|
#
|
||||||
|
# Start transaction #4, both tables, rollback.
|
||||||
|
#
|
||||||
|
START TRANSACTION;
|
||||||
|
#
|
||||||
|
# Do some statements on the transactional table.
|
||||||
|
#
|
||||||
|
INSERT INTO t1 VALUES (1,'varchar-1'), (2,'varchar-2'), (3,'varchar-3');
|
||||||
|
UPDATE t1 SET c1 = c1 + 10;
|
||||||
|
DELETE FROM t1 WHERE c1 = 12;
|
||||||
|
#
|
||||||
|
# Do some statements on the non-transactional table.
|
||||||
|
#
|
||||||
|
INSERT INTO t2 VALUES (1,'varchar-1'), (2,'varchar-2'), (3,'varchar-3');
|
||||||
|
UPDATE t2 SET c1 = c1 + 10;
|
||||||
|
DELETE FROM t2 WHERE c1 = 12;
|
||||||
|
#
|
||||||
|
# Rollback transaction.
|
||||||
|
#
|
||||||
|
ROLLBACK;
|
||||||
|
Warnings:
|
||||||
|
Warning 1196 Some non-transactional changed tables couldn't be rolled back
|
||||||
|
SELECT * FROM t1;
|
||||||
|
c1 c2
|
||||||
|
SELECT * FROM t2;
|
||||||
|
c1 c2
|
||||||
|
11 varchar-1
|
||||||
|
13 varchar-3
|
||||||
|
TRUNCATE TABLE t1;
|
||||||
|
TRUNCATE TABLE t2;
|
||||||
|
#
|
||||||
|
# Flush all log buffers to the log file.
|
||||||
|
#
|
||||||
|
FLUSH LOGS;
|
||||||
|
#
|
||||||
|
# Call mysqlbinlog to display the log file contents.
|
||||||
|
#
|
||||||
|
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
|
||||||
|
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||||
|
DELIMITER /*!*/;
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Start: binlog v 4, server v #.##.## created 010909 4:46:40 at startup
|
||||||
|
ROLLBACK/*!*/;
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0
|
||||||
|
use test/*!*/;
|
||||||
|
SET TIMESTAMP=1000000000/*!*/;
|
||||||
|
SET @@session.pseudo_thread_id=#/*!*/;
|
||||||
|
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1/*!*/;
|
||||||
|
SET @@session.sql_mode=0/*!*/;
|
||||||
|
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
|
||||||
|
/*!\C latin1 *//*!*/;
|
||||||
|
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/;
|
||||||
|
SET @@session.lc_time_names=0/*!*/;
|
||||||
|
SET @@session.collation_database=DEFAULT/*!*/;
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
c1 INT,
|
||||||
|
c2 VARCHAR(20)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET latin1
|
||||||
|
/*!*/;
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0
|
||||||
|
SET TIMESTAMP=1000000000/*!*/;
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
c1 INT,
|
||||||
|
c2 VARCHAR(20)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET latin1
|
||||||
|
/*!*/;
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0
|
||||||
|
SET TIMESTAMP=1000000000/*!*/;
|
||||||
|
BEGIN
|
||||||
|
/*!*/;
|
||||||
|
# at #
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Table_map: `test`.`t1` mapped to number #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Write_rows: table id # flags: STMT_END_F
|
||||||
|
### INSERT INTO test.t1
|
||||||
|
### SET
|
||||||
|
### @1=1 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-1' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### INSERT INTO test.t1
|
||||||
|
### SET
|
||||||
|
### @1=2 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-2' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### INSERT INTO test.t1
|
||||||
|
### SET
|
||||||
|
### @1=3 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-3' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
# at #
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Table_map: `test`.`t1` mapped to number #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Update_rows: table id # flags: STMT_END_F
|
||||||
|
### UPDATE test.t1
|
||||||
|
### WHERE
|
||||||
|
### @1=1 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-1' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### SET
|
||||||
|
### @1=11 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-1' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### UPDATE test.t1
|
||||||
|
### WHERE
|
||||||
|
### @1=2 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-2' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### SET
|
||||||
|
### @1=12 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-2' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### UPDATE test.t1
|
||||||
|
### WHERE
|
||||||
|
### @1=3 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-3' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### SET
|
||||||
|
### @1=13 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-3' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
# at #
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Table_map: `test`.`t1` mapped to number #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Delete_rows: table id # flags: STMT_END_F
|
||||||
|
### DELETE FROM test.t1
|
||||||
|
### WHERE
|
||||||
|
### @1=12 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-2' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Xid = #
|
||||||
|
COMMIT/*!*/;
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0
|
||||||
|
SET TIMESTAMP=1000000000/*!*/;
|
||||||
|
BEGIN
|
||||||
|
/*!*/;
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0
|
||||||
|
SET TIMESTAMP=1000000000/*!*/;
|
||||||
|
TRUNCATE TABLE t1
|
||||||
|
/*!*/;
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Xid = #
|
||||||
|
COMMIT/*!*/;
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0
|
||||||
|
SET TIMESTAMP=1000000000/*!*/;
|
||||||
|
BEGIN
|
||||||
|
/*!*/;
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0
|
||||||
|
SET TIMESTAMP=1000000000/*!*/;
|
||||||
|
TRUNCATE TABLE t1
|
||||||
|
/*!*/;
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Xid = #
|
||||||
|
COMMIT/*!*/;
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0
|
||||||
|
SET TIMESTAMP=1000000000/*!*/;
|
||||||
|
BEGIN
|
||||||
|
/*!*/;
|
||||||
|
# at #
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Table_map: `test`.`t1` mapped to number #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Write_rows: table id # flags: STMT_END_F
|
||||||
|
### INSERT INTO test.t1
|
||||||
|
### SET
|
||||||
|
### @1=1 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-1' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### INSERT INTO test.t1
|
||||||
|
### SET
|
||||||
|
### @1=2 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-2' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### INSERT INTO test.t1
|
||||||
|
### SET
|
||||||
|
### @1=3 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-3' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
# at #
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Table_map: `test`.`t1` mapped to number #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Update_rows: table id # flags: STMT_END_F
|
||||||
|
### UPDATE test.t1
|
||||||
|
### WHERE
|
||||||
|
### @1=1 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-1' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### SET
|
||||||
|
### @1=11 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-1' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### UPDATE test.t1
|
||||||
|
### WHERE
|
||||||
|
### @1=2 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-2' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### SET
|
||||||
|
### @1=12 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-2' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### UPDATE test.t1
|
||||||
|
### WHERE
|
||||||
|
### @1=3 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-3' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### SET
|
||||||
|
### @1=13 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-3' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
# at #
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Table_map: `test`.`t1` mapped to number #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Delete_rows: table id # flags: STMT_END_F
|
||||||
|
### DELETE FROM test.t1
|
||||||
|
### WHERE
|
||||||
|
### @1=12 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-2' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
# at #
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Table_map: `test`.`t2` mapped to number #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Write_rows: table id # flags: STMT_END_F
|
||||||
|
### INSERT INTO test.t2
|
||||||
|
### SET
|
||||||
|
### @1=1 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-1' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### INSERT INTO test.t2
|
||||||
|
### SET
|
||||||
|
### @1=2 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-2' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### INSERT INTO test.t2
|
||||||
|
### SET
|
||||||
|
### @1=3 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-3' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
# at #
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Table_map: `test`.`t2` mapped to number #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Update_rows: table id # flags: STMT_END_F
|
||||||
|
### UPDATE test.t2
|
||||||
|
### WHERE
|
||||||
|
### @1=1 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-1' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### SET
|
||||||
|
### @1=11 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-1' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### UPDATE test.t2
|
||||||
|
### WHERE
|
||||||
|
### @1=2 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-2' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### SET
|
||||||
|
### @1=12 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-2' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### UPDATE test.t2
|
||||||
|
### WHERE
|
||||||
|
### @1=3 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-3' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### SET
|
||||||
|
### @1=13 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-3' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
# at #
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Table_map: `test`.`t2` mapped to number #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Delete_rows: table id # flags: STMT_END_F
|
||||||
|
### DELETE FROM test.t2
|
||||||
|
### WHERE
|
||||||
|
### @1=12 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-2' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Xid = #
|
||||||
|
COMMIT/*!*/;
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0
|
||||||
|
SET TIMESTAMP=1000000000/*!*/;
|
||||||
|
BEGIN
|
||||||
|
/*!*/;
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0
|
||||||
|
SET TIMESTAMP=1000000000/*!*/;
|
||||||
|
TRUNCATE TABLE t1
|
||||||
|
/*!*/;
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Xid = #
|
||||||
|
COMMIT/*!*/;
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0
|
||||||
|
SET TIMESTAMP=1000000000/*!*/;
|
||||||
|
TRUNCATE TABLE t2
|
||||||
|
/*!*/;
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0
|
||||||
|
SET TIMESTAMP=1000000000/*!*/;
|
||||||
|
BEGIN
|
||||||
|
/*!*/;
|
||||||
|
# at #
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Table_map: `test`.`t1` mapped to number #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Write_rows: table id # flags: STMT_END_F
|
||||||
|
### INSERT INTO test.t1
|
||||||
|
### SET
|
||||||
|
### @1=1 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-1' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### INSERT INTO test.t1
|
||||||
|
### SET
|
||||||
|
### @1=2 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-2' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### INSERT INTO test.t1
|
||||||
|
### SET
|
||||||
|
### @1=3 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-3' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
# at #
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Table_map: `test`.`t1` mapped to number #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Update_rows: table id # flags: STMT_END_F
|
||||||
|
### UPDATE test.t1
|
||||||
|
### WHERE
|
||||||
|
### @1=1 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-1' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### SET
|
||||||
|
### @1=11 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-1' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### UPDATE test.t1
|
||||||
|
### WHERE
|
||||||
|
### @1=2 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-2' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### SET
|
||||||
|
### @1=12 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-2' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### UPDATE test.t1
|
||||||
|
### WHERE
|
||||||
|
### @1=3 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-3' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### SET
|
||||||
|
### @1=13 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-3' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
# at #
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Table_map: `test`.`t1` mapped to number #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Delete_rows: table id # flags: STMT_END_F
|
||||||
|
### DELETE FROM test.t1
|
||||||
|
### WHERE
|
||||||
|
### @1=12 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-2' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
# at #
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Table_map: `test`.`t2` mapped to number #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Write_rows: table id # flags: STMT_END_F
|
||||||
|
### INSERT INTO test.t2
|
||||||
|
### SET
|
||||||
|
### @1=1 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-1' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### INSERT INTO test.t2
|
||||||
|
### SET
|
||||||
|
### @1=2 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-2' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### INSERT INTO test.t2
|
||||||
|
### SET
|
||||||
|
### @1=3 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-3' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
# at #
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Table_map: `test`.`t2` mapped to number #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Update_rows: table id # flags: STMT_END_F
|
||||||
|
### UPDATE test.t2
|
||||||
|
### WHERE
|
||||||
|
### @1=1 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-1' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### SET
|
||||||
|
### @1=11 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-1' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### UPDATE test.t2
|
||||||
|
### WHERE
|
||||||
|
### @1=2 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-2' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### SET
|
||||||
|
### @1=12 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-2' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### UPDATE test.t2
|
||||||
|
### WHERE
|
||||||
|
### @1=3 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-3' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
### SET
|
||||||
|
### @1=13 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-3' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
# at #
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Table_map: `test`.`t2` mapped to number #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Delete_rows: table id # flags: STMT_END_F
|
||||||
|
### DELETE FROM test.t2
|
||||||
|
### WHERE
|
||||||
|
### @1=12 /* INT meta=0 nullable=1 is_null=0 */
|
||||||
|
### @2='varchar-2' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0
|
||||||
|
SET TIMESTAMP=1000000000/*!*/;
|
||||||
|
ROLLBACK
|
||||||
|
/*!*/;
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0
|
||||||
|
SET TIMESTAMP=1000000000/*!*/;
|
||||||
|
BEGIN
|
||||||
|
/*!*/;
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0
|
||||||
|
SET TIMESTAMP=1000000000/*!*/;
|
||||||
|
TRUNCATE TABLE t1
|
||||||
|
/*!*/;
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Xid = #
|
||||||
|
COMMIT/*!*/;
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0
|
||||||
|
SET TIMESTAMP=1000000000/*!*/;
|
||||||
|
TRUNCATE TABLE t2
|
||||||
|
/*!*/;
|
||||||
|
# at #
|
||||||
|
#010909 4:46:40 server id 1 end_log_pos # Rotate to master-bin.000002 pos: 4
|
||||||
|
DELIMITER ;
|
||||||
|
# End of log file
|
||||||
|
ROLLBACK /* added by mysqlbinlog */;
|
||||||
|
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
|
||||||
|
#
|
||||||
|
# Cleanup.
|
||||||
|
#
|
||||||
|
DROP TABLE t1, t2;
|
@ -113,9 +113,9 @@ set @@sql_mode=@org_mode;
|
|||||||
create table t1 (a int)
|
create table t1 (a int)
|
||||||
partition by key (a)
|
partition by key (a)
|
||||||
(partition p0 DATA DIRECTORY 'part-data' INDEX DIRECTORY 'part-data');
|
(partition p0 DATA DIRECTORY 'part-data' INDEX DIRECTORY 'part-data');
|
||||||
ERROR 42000: Incorrect table name 'part-data'
|
Got one of the listed errors
|
||||||
create table t1 (a int)
|
create table t1 (a int)
|
||||||
partition by key (a)
|
partition by key (a)
|
||||||
(partition p0,
|
(partition p0,
|
||||||
partition p1 DATA DIRECTORY 'part-data' INDEX DIRECTORY 'part-data');
|
partition p1 DATA DIRECTORY 'part-data' INDEX DIRECTORY 'part-data');
|
||||||
ERROR 42000: Incorrect table name 'part-data'
|
Got one of the listed errors
|
||||||
|
@ -55,13 +55,9 @@ t9 CREATE TABLE `t9` (
|
|||||||
`d` int(11) NOT NULL,
|
`d` int(11) NOT NULL,
|
||||||
PRIMARY KEY (`a`)
|
PRIMARY KEY (`a`)
|
||||||
) ENGINE=MyISAM AUTO_INCREMENT=16725 DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQLTEST_VARDIR/tmp/' INDEX DIRECTORY='MYSQLTEST_VARDIR/run/'
|
) ENGINE=MyISAM AUTO_INCREMENT=16725 DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQLTEST_VARDIR/tmp/' INDEX DIRECTORY='MYSQLTEST_VARDIR/run/'
|
||||||
create table t1 (a int not null auto_increment, b char(16) not null, primary key (a)) engine=myisam data directory="tmp";
|
|
||||||
Got one of the listed errors
|
|
||||||
create database mysqltest;
|
create database mysqltest;
|
||||||
create table mysqltest.t9 (a int not null auto_increment, b char(16) not null, primary key (a)) engine=myisam index directory="/this-dir-does-not-exist";
|
create table mysqltest.t9 (a int not null auto_increment, b char(16) not null, primary key (a)) engine=myisam index directory="/this-dir-does-not-exist";
|
||||||
Got one of the listed errors
|
Got one of the listed errors
|
||||||
create table mysqltest.t9 (a int not null auto_increment, b char(16) not null, primary key (a)) engine=myisam index directory="not-hard-path";
|
|
||||||
Got one of the listed errors
|
|
||||||
create table mysqltest.t9 (a int not null auto_increment, b char(16) not null, primary key (a)) engine=myisam index directory="MYSQLTEST_VARDIR/run";
|
create table mysqltest.t9 (a int not null auto_increment, b char(16) not null, primary key (a)) engine=myisam index directory="MYSQLTEST_VARDIR/run";
|
||||||
Got one of the listed errors
|
Got one of the listed errors
|
||||||
create table mysqltest.t9 (a int not null auto_increment, b char(16) not null, primary key (a)) engine=myisam data directory="MYSQLTEST_VARDIR/tmp";
|
create table mysqltest.t9 (a int not null auto_increment, b char(16) not null, primary key (a)) engine=myisam data directory="MYSQLTEST_VARDIR/tmp";
|
||||||
|
@ -1,2 +1 @@
|
|||||||
ソ十表予構噂蚕申貼能暴禄曾箪兔喀媾彌拿杤
|
ソ十表予構噂蚕申貼能暴禄曾箪兔喀媾彌拿杤
|
||||||
|
|
||||||
|
@ -9,5 +9,3 @@
|
|||||||
# Do not use any TAB characters for whitespace.
|
# Do not use any TAB characters for whitespace.
|
||||||
#
|
#
|
||||||
##############################################################################
|
##############################################################################
|
||||||
jp_convert_sjis : Bug#36597 Testsuite "jp": Suspicious results for some tests
|
|
||||||
jp_select_sjis : Bug#36597 Testsuite "jp": Suspicious results for some tests
|
|
||||||
|
@ -1169,6 +1169,21 @@ SELECT * FROM t1;
|
|||||||
|
|
||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#37310: 'on update CURRENT_TIMESTAMP' option crashes the table
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a INT) ENGINE=MyISAM CHECKSUM=1 ROW_FORMAT=DYNAMIC;
|
||||||
|
INSERT INTO t1 VALUES (0);
|
||||||
|
UPDATE t1 SET a=1;
|
||||||
|
SELECT a FROM t1;
|
||||||
|
CHECK TABLE t1;
|
||||||
|
INSERT INTO t1 VALUES (0), (5), (4), (2);
|
||||||
|
UPDATE t1 SET a=2;
|
||||||
|
SELECT a FROM t1;
|
||||||
|
CHECK TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
--echo End of 5.0 tests
|
--echo End of 5.0 tests
|
||||||
|
|
||||||
|
|
||||||
|
446
mysql-test/t/mysqlbinlog_row.test
Normal file
446
mysql-test/t/mysqlbinlog_row.test
Normal file
@ -0,0 +1,446 @@
|
|||||||
|
--source include/have_log_bin.inc
|
||||||
|
--source include/have_binlog_format_row.inc
|
||||||
|
--source include/have_ucs2.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Preparatory cleanup.
|
||||||
|
--echo #
|
||||||
|
--disable_warnings
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # We need a fixed timestamp to avoid varying results.
|
||||||
|
--echo #
|
||||||
|
SET timestamp=1000000000;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete all existing binary logs.
|
||||||
|
--echo #
|
||||||
|
RESET MASTER;
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c01 BIT);
|
||||||
|
INSERT INTO t1 VALUES (0);
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c01 BIT(7));
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
INSERT INTO t1 VALUES (2);
|
||||||
|
INSERT INTO t1 VALUES (4);
|
||||||
|
INSERT INTO t1 VALUES (8);
|
||||||
|
INSERT INTO t1 VALUES (16);
|
||||||
|
INSERT INTO t1 VALUES (32);
|
||||||
|
INSERT INTO t1 VALUES (64);
|
||||||
|
INSERT INTO t1 VALUES (127);
|
||||||
|
DELETE FROM t1 WHERE c01=127;
|
||||||
|
UPDATE t1 SET c01=15 WHERE c01=16;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a BIT(20), b CHAR(2));
|
||||||
|
INSERT INTO t1 VALUES (b'00010010010010001001', 'ab');
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c02 BIT(64));
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
INSERT INTO t1 VALUES (2);
|
||||||
|
INSERT INTO t1 VALUES (128);
|
||||||
|
INSERT INTO t1 VALUES (b'1111111111111111111111111111111111111111111111111111111111111111');
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c03 TINYINT);
|
||||||
|
INSERT INTO t1 VALUES (1),(2),(3);
|
||||||
|
INSERT INTO t1 VALUES (-128);
|
||||||
|
UPDATE t1 SET c03=2 WHERE c03=1;
|
||||||
|
DELETE FROM t1 WHERE c03=-128;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c04 TINYINT UNSIGNED);
|
||||||
|
INSERT INTO t1 VALUES (128), (255);
|
||||||
|
UPDATE t1 SET c04=2 WHERE c04=1;
|
||||||
|
DELETE FROM t1 WHERE c04=255;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c06 BOOL);
|
||||||
|
INSERT INTO t1 VALUES (TRUE);
|
||||||
|
DELETE FROM t1 WHERE c06=TRUE;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c07 SMALLINT);
|
||||||
|
INSERT INTO t1 VALUES (1234);
|
||||||
|
DELETE FROM t1 WHERE c07=1234;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c08 SMALLINT UNSIGNED);
|
||||||
|
INSERT INTO t1 VALUES (32768), (65535);
|
||||||
|
UPDATE t1 SET c08=2 WHERE c08=32768;
|
||||||
|
DELETE FROM t1 WHERE c08=65535;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c10 MEDIUMINT);
|
||||||
|
INSERT INTO t1 VALUES (12345);
|
||||||
|
DELETE FROM t1 WHERE c10=12345;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c11 MEDIUMINT UNSIGNED);
|
||||||
|
INSERT INTO t1 VALUES (8388608), (16777215);
|
||||||
|
UPDATE t1 SET c11=2 WHERE c11=8388608;
|
||||||
|
DELETE FROM t1 WHERE c11=16777215;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c13 INT);
|
||||||
|
INSERT INTO t1 VALUES (123456);
|
||||||
|
DELETE FROM t1 WHERE c13=123456;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c14 INT UNSIGNED);
|
||||||
|
INSERT INTO t1 VALUES (2147483648), (4294967295);
|
||||||
|
UPDATE t1 SET c14=2 WHERE c14=2147483648;
|
||||||
|
DELETE FROM t1 WHERE c14=4294967295;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c16 BIGINT);
|
||||||
|
INSERT INTO t1 VALUES (1234567890);
|
||||||
|
DELETE FROM t1 WHERE c16=1234567890;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c17 BIGINT UNSIGNED);
|
||||||
|
INSERT INTO t1 VALUES (9223372036854775808), (18446744073709551615);
|
||||||
|
UPDATE t1 SET c17=2 WHERE c17=9223372036854775808;
|
||||||
|
DELETE FROM t1 WHERE c17=18446744073709551615;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c19 FLOAT);
|
||||||
|
INSERT INTO t1 VALUES (123.2234);
|
||||||
|
DELETE FROM t1 WHERE c19>123;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c22 DOUBLE);
|
||||||
|
INSERT INTO t1 VALUES (123434.22344545);
|
||||||
|
DELETE FROM t1 WHERE c22>123434;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c25 DECIMAL(10,5));
|
||||||
|
INSERT INTO t1 VALUES (124.45);
|
||||||
|
INSERT INTO t1 VALUES (-543.21);
|
||||||
|
DELETE FROM t1 WHERE c25=124.45;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c28 DATE);
|
||||||
|
INSERT INTO t1 VALUES ('2001-02-03');
|
||||||
|
DELETE FROM t1 WHERE c28='2001-02-03';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c29 DATETIME);
|
||||||
|
INSERT INTO t1 VALUES ('2001-02-03 10:20:30');
|
||||||
|
DELETE FROM t1 WHERE c29='2001-02-03 10:20:30';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c30 TIMESTAMP);
|
||||||
|
INSERT INTO t1 VALUES ('2001-02-03 10:20:30');
|
||||||
|
DELETE FROM t1 WHERE c30='2001-02-03 10:20:30';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c31 TIME);
|
||||||
|
INSERT INTO t1 VALUES ('11:22:33');
|
||||||
|
DELETE FROM t1 WHERE c31='11:22:33';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c32 YEAR);
|
||||||
|
INSERT INTO t1 VALUES ('2001');
|
||||||
|
DELETE FROM t1 WHERE c32=2001;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c33 CHAR);
|
||||||
|
INSERT INTO t1 VALUES ('a');
|
||||||
|
DELETE FROM t1 WHERE c33='a';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c34 CHAR(0));
|
||||||
|
INSERT INTO t1 VALUES ('');
|
||||||
|
DELETE FROM t1 WHERE c34='';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c35 CHAR(1));
|
||||||
|
INSERT INTO t1 VALUES ('b');
|
||||||
|
DELETE FROM t1 WHERE c35='b';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c36 CHAR(255));
|
||||||
|
INSERT INTO t1 VALUES (repeat('c',255));
|
||||||
|
DELETE FROM t1 WHERE c36>'c';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c37 NATIONAL CHAR);
|
||||||
|
INSERT INTO t1 VALUES ('a');
|
||||||
|
DELETE FROM t1 WHERE c37='a';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c38 NATIONAL CHAR(0));
|
||||||
|
INSERT INTO t1 VALUES ('');
|
||||||
|
DELETE FROM t1 WHERE c38='';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c39 NATIONAL CHAR(1));
|
||||||
|
INSERT INTO t1 VALUES ('a');
|
||||||
|
DELETE FROM t1 WHERE c39='a';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c40 NATIONAL CHAR(255));
|
||||||
|
INSERT INTO t1 VALUES (repeat('a', 255));
|
||||||
|
INSERT INTO t1 VALUES (repeat(_latin1 0xDF, 255));
|
||||||
|
DELETE FROM t1 WHERE c40>'a';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c41 CHAR CHARACTER SET UCS2);
|
||||||
|
INSERT INTO t1 VALUES ('a');
|
||||||
|
DELETE FROM t1 WHERE c41='a';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c42 CHAR(0) CHARACTER SET UCS2);
|
||||||
|
INSERT INTO t1 VALUES ('');
|
||||||
|
DELETE FROM t1 WHERE c42='';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c43 CHAR(1) CHARACTER SET UCS2);
|
||||||
|
INSERT INTO t1 VALUES ('a');
|
||||||
|
DELETE FROM t1 WHERE c43='a';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c44 CHAR(255) CHARACTER SET UCS2);
|
||||||
|
INSERT INTO t1 VALUES (repeat('a', 255));
|
||||||
|
INSERT INTO t1 VALUES (repeat(_latin1 0xDF, 255));
|
||||||
|
DELETE FROM t1 WHERE c44>'a';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c45 VARCHAR(0));
|
||||||
|
INSERT INTO t1 VALUES ('');
|
||||||
|
DELETE FROM t1 WHERE c45='';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c46 VARCHAR(1));
|
||||||
|
INSERT INTO t1 VALUES ('a');
|
||||||
|
DELETE FROM t1 WHERE c46='a';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c47 VARCHAR(255));
|
||||||
|
INSERT INTO t1 VALUES (repeat('a',255));
|
||||||
|
DELETE FROM t1 WHERE c47>'a';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c48 VARCHAR(261));
|
||||||
|
INSERT INTO t1 VALUES (repeat('a',261));
|
||||||
|
DELETE FROM t1 WHERE c48>'a';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c49 NATIONAL VARCHAR(0));
|
||||||
|
INSERT INTO t1 VALUES ('');
|
||||||
|
DELETE FROM t1 WHERE c49='';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c50 NATIONAL VARCHAR(1));
|
||||||
|
INSERT INTO t1 VALUES ('a');
|
||||||
|
DELETE FROM t1 WHERE c50='a';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c51 NATIONAL VARCHAR(255));
|
||||||
|
INSERT INTO t1 VALUES (repeat('a',255));
|
||||||
|
INSERT INTO t1 VALUES (repeat(_latin1 0xDF, 255));
|
||||||
|
DELETE FROM t1 WHERE c51>'a';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c52 NATIONAL VARCHAR(261));
|
||||||
|
INSERT INTO t1 VALUES (repeat('a',261));
|
||||||
|
INSERT INTO t1 VALUES (repeat(_latin1 0xDF, 261));
|
||||||
|
DELETE FROM t1 WHERE c52>'a';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c53 VARCHAR(0) CHARACTER SET ucs2);
|
||||||
|
INSERT INTO t1 VALUES ('');
|
||||||
|
DELETE FROM t1 WHERE c53='';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c54 VARCHAR(1) CHARACTER SET ucs2);
|
||||||
|
INSERT INTO t1 VALUES ('a');
|
||||||
|
DELETE FROM t1 WHERE c54='a';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c55 VARCHAR(255) CHARACTER SET ucs2);
|
||||||
|
INSERT INTO t1 VALUES (repeat('ab', 127));
|
||||||
|
DELETE FROM t1 WHERE c55>'a';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c56 VARCHAR(261) CHARACTER SET ucs2);
|
||||||
|
INSERT INTO t1 VALUES (repeat('ab', 130));
|
||||||
|
DELETE FROM t1 WHERE c56>'a';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c57 BINARY);
|
||||||
|
INSERT INTO t1 VALUES (0x00);
|
||||||
|
INSERT INTO t1 VALUES (0x02);
|
||||||
|
INSERT INTO t1 VALUES ('a');
|
||||||
|
DELETE FROM t1 WHERE c57='a';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c58 BINARY(0));
|
||||||
|
INSERT INTO t1 VALUES ('');
|
||||||
|
DELETE FROM t1 WHERE c58='';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c59 BINARY(1));
|
||||||
|
INSERT INTO t1 VALUES (0x00);
|
||||||
|
INSERT INTO t1 VALUES (0x02);
|
||||||
|
INSERT INTO t1 VALUES ('a');
|
||||||
|
DELETE FROM t1 WHERE c59='a';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c60 BINARY(255));
|
||||||
|
INSERT INTO t1 VALUES (0x00);
|
||||||
|
INSERT INTO t1 VALUES (0x02);
|
||||||
|
INSERT INTO t1 VALUES (repeat('a\0',120));
|
||||||
|
DELETE FROM t1 WHERE c60<0x02;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c61 VARBINARY(0));
|
||||||
|
INSERT INTO t1 VALUES ('');
|
||||||
|
DELETE FROM t1 WHERE c61='';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c62 VARBINARY(1));
|
||||||
|
INSERT INTO t1 VALUES (0x00);
|
||||||
|
INSERT INTO t1 VALUES (0x02);
|
||||||
|
INSERT INTO t1 VALUES ('a');
|
||||||
|
DELETE FROM t1 WHERE c62=0x02;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c63 VARBINARY(255));
|
||||||
|
INSERT INTO t1 VALUES (0x00);
|
||||||
|
INSERT INTO t1 VALUES (0x02);
|
||||||
|
INSERT INTO t1 VALUES (repeat('a\0',120));
|
||||||
|
DELETE FROM t1 WHERE c63=0x02;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c65 TINYBLOB);
|
||||||
|
INSERT INTO t1 VALUES ('tinyblob1');
|
||||||
|
DELETE FROM t1 WHERE c65='tinyblob1';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c68 BLOB);
|
||||||
|
INSERT INTO t1 VALUES ('blob1');
|
||||||
|
DELETE FROM t1 WHERE c68='blob1';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c71 MEDIUMBLOB);
|
||||||
|
INSERT INTO t1 VALUES ('mediumblob1');
|
||||||
|
DELETE FROM t1 WHERE c71='mediumblob1';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c74 LONGBLOB);
|
||||||
|
INSERT INTO t1 VALUES ('longblob1');
|
||||||
|
DELETE FROM t1 WHERE c74='longblob1';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c66 TINYTEXT);
|
||||||
|
INSERT INTO t1 VALUES ('tinytext1');
|
||||||
|
DELETE FROM t1 WHERE c66='tinytext1';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c69 TEXT);
|
||||||
|
INSERT INTO t1 VALUES ('text1');
|
||||||
|
DELETE FROM t1 WHERE c69='text1';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c72 MEDIUMTEXT);
|
||||||
|
INSERT INTO t1 VALUES ('mediumtext1');
|
||||||
|
DELETE FROM t1 WHERE c72='mediumtext1';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c75 LONGTEXT);
|
||||||
|
INSERT INTO t1 VALUES ('longtext1');
|
||||||
|
DELETE FROM t1 WHERE c75='longtext1';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c67 TINYTEXT CHARACTER SET UCS2);
|
||||||
|
INSERT INTO t1 VALUES ('tinytext1');
|
||||||
|
DELETE FROM t1 WHERE c67='tinytext1';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c70 TEXT CHARACTER SET UCS2);
|
||||||
|
INSERT INTO t1 VALUES ('text1');
|
||||||
|
DELETE FROM t1 WHERE c70='text1';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c73 MEDIUMTEXT CHARACTER SET UCS2);
|
||||||
|
INSERT INTO t1 VALUES ('mediumtext1');
|
||||||
|
DELETE FROM t1 WHERE c73='mediumtext1';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c76 LONGTEXT CHARACTER SET UCS2);
|
||||||
|
INSERT INTO t1 VALUES ('longtext1');
|
||||||
|
DELETE FROM t1 WHERE c76='longtext1';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c77 ENUM('a','b','c'));
|
||||||
|
INSERT INTO t1 VALUES ('b');
|
||||||
|
DELETE FROM t1 WHERE c77='b';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c78 SET('a','b','c','d','e','f'));
|
||||||
|
INSERT INTO t1 VALUES ('a,b');
|
||||||
|
INSERT INTO t1 VALUES ('a,c');
|
||||||
|
INSERT INTO t1 VALUES ('b,c');
|
||||||
|
INSERT INTO t1 VALUES ('a,b,c');
|
||||||
|
INSERT INTO t1 VALUES ('a,b,c,d');
|
||||||
|
INSERT INTO t1 VALUES ('a,b,c,d,e');
|
||||||
|
INSERT INTO t1 VALUES ('a,b,c,d,e,f');
|
||||||
|
DELETE FROM t1 WHERE c78='a,b';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Check multi-table update
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a int NOT NULL DEFAULT 0, b int NOT NULL DEFAULT 0);
|
||||||
|
CREATE TABLE t2 (a int NOT NULL DEFAULT 0, b int NOT NULL DEFAULT 0);
|
||||||
|
INSERT INTO t1 SET a=1;
|
||||||
|
INSERT INTO t1 SET b=1;
|
||||||
|
INSERT INTO t2 SET a=1;
|
||||||
|
INSERT INTO t2 SET b=1;
|
||||||
|
UPDATE t1, t2 SET t1.a=10, t2.a=20;
|
||||||
|
DROP TABLE t1,t2;
|
||||||
|
|
||||||
|
flush logs;
|
||||||
|
|
||||||
|
let $MYSQLD_DATADIR= `select @@datadir`;
|
||||||
|
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||||
|
--replace_regex /SQL_LOAD_MB-[0-9]-[0-9]/SQL_LOAD_MB-#-#/ /exec_time=[0-9]*/exec_time=#/ /end_log_pos [0-9]*/end_log_pos #/ /# at [0-9]*/# at #/ /thread_id=[0-9]*/thread_id=#/ /table id [0-9]*/table id #/ /mapped to number [0-9]*/mapped to number #/ /server v [^ ]*/server v #.##.##/ /(@[0-9]*=[0-9]*[.][0-9]{1,3})[0-9e+-]*[^ ]*(.*(FLOAT|DOUBLE).*[*].)/\1...\2/
|
||||||
|
--exec $MYSQL_BINLOG --base64-output=decode-rows -v -v $MYSQLTEST_VARDIR/log/master-bin.000001
|
130
mysql-test/t/mysqlbinlog_row_big.test
Normal file
130
mysql-test/t/mysqlbinlog_row_big.test
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
# mysqlbinlog_big.test
|
||||||
|
#
|
||||||
|
# Show that mysqlbinlog can handle big rows.
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# The *huge* output of mysqlbinlog will be redirected to
|
||||||
|
# $MYSQLTEST_VARDIR/$mysqlbinlog_output
|
||||||
|
#
|
||||||
|
--let $mysqlbinlog_output= tmp/mysqlbinlog_big_1.out
|
||||||
|
|
||||||
|
#--source include/have_myisam.inc
|
||||||
|
--let $engine_type= MyISAM
|
||||||
|
|
||||||
|
#
|
||||||
|
# This test case is insensitive to the binlog format
|
||||||
|
# because we don't display the output of mysqlbinlog.
|
||||||
|
#
|
||||||
|
#--source include/have_binlog_format_row.inc
|
||||||
|
|
||||||
|
--source include/have_log_bin.inc
|
||||||
|
|
||||||
|
# This is a big test.
|
||||||
|
--source include/big_test.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Preparatory cleanup.
|
||||||
|
--echo #
|
||||||
|
--disable_warnings
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # We need a fixed timestamp to avoid varying results.
|
||||||
|
--echo #
|
||||||
|
SET timestamp=1000000000;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # We need big packets.
|
||||||
|
--echo #
|
||||||
|
SET @@session.max_allowed_packet= 1024*1024*1024;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete all existing binary logs.
|
||||||
|
--echo #
|
||||||
|
RESET MASTER;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Create a test table.
|
||||||
|
--echo #
|
||||||
|
eval CREATE TABLE t1 (
|
||||||
|
c1 LONGTEXT
|
||||||
|
) ENGINE=$engine_type DEFAULT CHARSET latin1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Show how much rows are affected by each statement.
|
||||||
|
--echo #
|
||||||
|
--enable_info
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Insert a big row.
|
||||||
|
--echo #
|
||||||
|
#
|
||||||
|
# 256MB
|
||||||
|
#INSERT INTO t1 VALUES (REPEAT('ManyMegaByteBlck', 16777216));
|
||||||
|
#
|
||||||
|
# 32MB
|
||||||
|
INSERT INTO t1 VALUES (REPEAT('ManyMegaByteBlck', 2097152));
|
||||||
|
#
|
||||||
|
# 4MB
|
||||||
|
#INSERT INTO t1 VALUES (REPEAT('ManyMegaByteBlck', 262144));
|
||||||
|
#
|
||||||
|
# 512KB
|
||||||
|
#INSERT INTO t1 VALUES (REPEAT('ManyMegaByteBlck', 32768));
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Show what we have in the table.
|
||||||
|
--echo # Do not display the column value itself, just its length.
|
||||||
|
--echo #
|
||||||
|
query_vertical SELECT LENGTH(c1) FROM t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Grow the row by updating.
|
||||||
|
--echo #
|
||||||
|
UPDATE t1 SET c1 = CONCAT(c1, c1);
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Show what we have in the table.
|
||||||
|
--echo # Do not display the column value itself, just its length.
|
||||||
|
--echo #
|
||||||
|
query_vertical SELECT LENGTH(c1) FROM t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete the row.
|
||||||
|
--echo #
|
||||||
|
DELETE FROM t1 WHERE c1 >= 'ManyMegaByteBlck';
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Hide how much rows are affected by each statement.
|
||||||
|
--echo #
|
||||||
|
--disable_info
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Flush all log buffers to the log file.
|
||||||
|
--echo #
|
||||||
|
FLUSH LOGS;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Call mysqlbinlog to display the log file contents.
|
||||||
|
--echo # NOTE: The output of mysqlbinlog is redirected to
|
||||||
|
--echo # \$MYSQLTEST_VARDIR/$mysqlbinlog_output
|
||||||
|
--echo # If you want to examine it, disable remove_file
|
||||||
|
--echo # at the bottom of the test script.
|
||||||
|
--echo #
|
||||||
|
let $MYSQLD_DATADIR= `select @@datadir`;
|
||||||
|
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||||
|
--replace_regex /SQL_LOAD_MB-[0-9]-[0-9]/SQL_LOAD_MB-#-#/ /exec_time=[0-9]*/exec_time=#/ /end_log_pos [0-9]*/end_log_pos #/ /# at [0-9]*/# at #/ /Xid = [0-9]*/Xid = #/
|
||||||
|
--exec $MYSQL_BINLOG -v -v $MYSQLTEST_VARDIR/log/master-bin.000001 > $MYSQLTEST_VARDIR/$mysqlbinlog_output
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Cleanup.
|
||||||
|
--echo #
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo remove_file \$MYSQLTEST_VARDIR/$mysqlbinlog_output
|
||||||
|
#
|
||||||
|
# NOTE: If you want to see the *huge* mysqlbinlog output, disable next line:
|
||||||
|
#
|
||||||
|
--remove_file $MYSQLTEST_VARDIR/$mysqlbinlog_output
|
||||||
|
|
24
mysql-test/t/mysqlbinlog_row_innodb.test
Normal file
24
mysql-test/t/mysqlbinlog_row_innodb.test
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# mysqlbinlog_row_innodb.test
|
||||||
|
#
|
||||||
|
# Show that mysqlbinlog displays human readable comments to
|
||||||
|
# row-based log events.
|
||||||
|
#
|
||||||
|
# Main module for the InnoDB storage engine.
|
||||||
|
#
|
||||||
|
# Calls include/mysqlbinlog_row.inc
|
||||||
|
# See there for more informaton.
|
||||||
|
#
|
||||||
|
|
||||||
|
--source include/have_innodb.inc
|
||||||
|
let $engine_type=InnoDB;
|
||||||
|
|
||||||
|
#
|
||||||
|
# The test case would also work with statement based or mixed mode logging.
|
||||||
|
# But this would require different result files. To handle this with the
|
||||||
|
# current test suite, new main test cases are required.
|
||||||
|
#
|
||||||
|
--source include/have_binlog_format_row.inc
|
||||||
|
--source include/have_ucs2.inc
|
||||||
|
|
||||||
|
--source include/mysqlbinlog_row_engine.inc
|
||||||
|
|
23
mysql-test/t/mysqlbinlog_row_myisam.test
Normal file
23
mysql-test/t/mysqlbinlog_row_myisam.test
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# mysqlbinlog_row.test
|
||||||
|
#
|
||||||
|
# Show that mysqlbinlog displays human readable comments to
|
||||||
|
# row-based log events.
|
||||||
|
#
|
||||||
|
# Main module for the MyISAM storage engine.
|
||||||
|
#
|
||||||
|
# Calls include/mysqlbinlog_row.inc
|
||||||
|
# See there for more informaton.
|
||||||
|
#
|
||||||
|
|
||||||
|
#--source include/have_myisam.inc
|
||||||
|
let $engine_type=MyISAM;
|
||||||
|
|
||||||
|
#
|
||||||
|
# The test case would also work with statement based or mixed mode logging.
|
||||||
|
# But this would require different result files. To handle this with the
|
||||||
|
# current test suite, new main test cases are required.
|
||||||
|
#
|
||||||
|
--source include/have_binlog_format_row.inc
|
||||||
|
--source include/have_ucs2.inc
|
||||||
|
|
||||||
|
--source include/mysqlbinlog_row_engine.inc
|
161
mysql-test/t/mysqlbinlog_row_trans.test
Normal file
161
mysql-test/t/mysqlbinlog_row_trans.test
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
# mysqlbinlog_trans.test
|
||||||
|
#
|
||||||
|
# Show that mysqlbinlog work correctly with transactions.
|
||||||
|
#
|
||||||
|
|
||||||
|
#--source include/have_myisam.inc
|
||||||
|
--let $engine_type_nontrans= MyISAM
|
||||||
|
--source include/have_innodb.inc
|
||||||
|
--let $engine_type= InnoDB
|
||||||
|
|
||||||
|
#
|
||||||
|
# The test case would also work with statement based or mixed mode logging.
|
||||||
|
# But this would require different result files. To handle this with the
|
||||||
|
# current test suite, new main test cases are required.
|
||||||
|
#
|
||||||
|
--source include/have_binlog_format_row.inc
|
||||||
|
|
||||||
|
--source include/have_log_bin.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Preparatory cleanup.
|
||||||
|
--echo #
|
||||||
|
--disable_warnings
|
||||||
|
DROP TABLE IF EXISTS t1, t2;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # We need a fixed timestamp to avoid varying results.
|
||||||
|
--echo #
|
||||||
|
SET timestamp=1000000000;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Delete all existing binary logs.
|
||||||
|
--echo #
|
||||||
|
RESET MASTER;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Create test tables.
|
||||||
|
--echo #
|
||||||
|
eval CREATE TABLE t1 (
|
||||||
|
c1 INT,
|
||||||
|
c2 VARCHAR(20)
|
||||||
|
) ENGINE=$engine_type DEFAULT CHARSET latin1;
|
||||||
|
eval CREATE TABLE t2 (
|
||||||
|
c1 INT,
|
||||||
|
c2 VARCHAR(20)
|
||||||
|
) ENGINE=$engine_type_nontrans DEFAULT CHARSET latin1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Start transaction #1, transactional table only, commit.
|
||||||
|
--echo #
|
||||||
|
START TRANSACTION;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Do some statements.
|
||||||
|
--echo #
|
||||||
|
INSERT INTO t1 VALUES (1,'varchar-1'), (2,'varchar-2'), (3,'varchar-3');
|
||||||
|
UPDATE t1 SET c1 = c1 + 10;
|
||||||
|
DELETE FROM t1 WHERE c1 = 12;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Commit transaction.
|
||||||
|
--echo #
|
||||||
|
COMMIT;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
TRUNCATE TABLE t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Start transaction #2, transactional table only, rollback.
|
||||||
|
--echo #
|
||||||
|
START TRANSACTION;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Do some statements.
|
||||||
|
--echo #
|
||||||
|
INSERT INTO t1 VALUES (1,'varchar-1'), (2,'varchar-2'), (3,'varchar-3');
|
||||||
|
UPDATE t1 SET c1 = c1 + 10;
|
||||||
|
DELETE FROM t1 WHERE c1 = 12;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Rollback transaction.
|
||||||
|
--echo #
|
||||||
|
ROLLBACK;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
TRUNCATE TABLE t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Start transaction #3, both tables, commit.
|
||||||
|
--echo #
|
||||||
|
START TRANSACTION;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Do some statements on the transactional table.
|
||||||
|
--echo #
|
||||||
|
INSERT INTO t1 VALUES (1,'varchar-1'), (2,'varchar-2'), (3,'varchar-3');
|
||||||
|
UPDATE t1 SET c1 = c1 + 10;
|
||||||
|
DELETE FROM t1 WHERE c1 = 12;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Do some statements on the non-transactional table.
|
||||||
|
--echo #
|
||||||
|
INSERT INTO t2 VALUES (1,'varchar-1'), (2,'varchar-2'), (3,'varchar-3');
|
||||||
|
UPDATE t2 SET c1 = c1 + 10;
|
||||||
|
DELETE FROM t2 WHERE c1 = 12;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Commit transaction.
|
||||||
|
--echo #
|
||||||
|
COMMIT;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
SELECT * FROM t2;
|
||||||
|
TRUNCATE TABLE t1;
|
||||||
|
TRUNCATE TABLE t2;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Start transaction #4, both tables, rollback.
|
||||||
|
--echo #
|
||||||
|
START TRANSACTION;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Do some statements on the transactional table.
|
||||||
|
--echo #
|
||||||
|
INSERT INTO t1 VALUES (1,'varchar-1'), (2,'varchar-2'), (3,'varchar-3');
|
||||||
|
UPDATE t1 SET c1 = c1 + 10;
|
||||||
|
DELETE FROM t1 WHERE c1 = 12;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Do some statements on the non-transactional table.
|
||||||
|
--echo #
|
||||||
|
INSERT INTO t2 VALUES (1,'varchar-1'), (2,'varchar-2'), (3,'varchar-3');
|
||||||
|
UPDATE t2 SET c1 = c1 + 10;
|
||||||
|
DELETE FROM t2 WHERE c1 = 12;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Rollback transaction.
|
||||||
|
--echo #
|
||||||
|
ROLLBACK;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
SELECT * FROM t2;
|
||||||
|
TRUNCATE TABLE t1;
|
||||||
|
TRUNCATE TABLE t2;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Flush all log buffers to the log file.
|
||||||
|
--echo #
|
||||||
|
FLUSH LOGS;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Call mysqlbinlog to display the log file contents.
|
||||||
|
--echo #
|
||||||
|
let $MYSQLD_DATADIR= `select @@datadir`;
|
||||||
|
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||||
|
--replace_regex /SQL_LOAD_MB-[0-9]-[0-9]/SQL_LOAD_MB-#-#/ /exec_time=[0-9]*/exec_time=#/ /end_log_pos [0-9]*/end_log_pos #/ /# at [0-9]*/# at #/ /Xid = [0-9]*/Xid = #/ /thread_id=[0-9]*/thread_id=#/ /table id [0-9]*/table id #/ /mapped to number [0-9]*/mapped to number #/ /server v [^ ]*/server v #.##.##/
|
||||||
|
--exec $MYSQL_BINLOG --base64-output=decode-rows -v -v $MYSQLTEST_VARDIR/log/master-bin.000001
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Cleanup.
|
||||||
|
--echo #
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
|
||||||
|
|
@ -154,7 +154,8 @@ set @@sql_mode=@org_mode;
|
|||||||
#
|
#
|
||||||
# Bug 21350: Data Directory problems
|
# Bug 21350: Data Directory problems
|
||||||
#
|
#
|
||||||
-- error ER_WRONG_TABLE_NAME
|
# Added ER_WRONG_TABLE_NAME and reported bug#39045
|
||||||
|
-- error ER_WRONG_ARGUMENTS, ER_WRONG_TABLE_NAME
|
||||||
create table t1 (a int)
|
create table t1 (a int)
|
||||||
partition by key (a)
|
partition by key (a)
|
||||||
(partition p0 DATA DIRECTORY 'part-data' INDEX DIRECTORY 'part-data');
|
(partition p0 DATA DIRECTORY 'part-data' INDEX DIRECTORY 'part-data');
|
||||||
@ -163,7 +164,8 @@ partition by key (a)
|
|||||||
# Insert a test that manages to create the first partition and fails with
|
# Insert a test that manages to create the first partition and fails with
|
||||||
# the second, ensure that we clean up afterwards in a proper manner.
|
# the second, ensure that we clean up afterwards in a proper manner.
|
||||||
#
|
#
|
||||||
--error ER_WRONG_TABLE_NAME
|
# Added ER_WRONG_TABLE_NAME and reported bug#39045
|
||||||
|
--error ER_WRONG_ARGUMENTS, ER_WRONG_TABLE_NAME
|
||||||
create table t1 (a int)
|
create table t1 (a int)
|
||||||
partition by key (a)
|
partition by key (a)
|
||||||
(partition p0,
|
(partition p0,
|
||||||
|
@ -65,8 +65,6 @@ drop table t1;
|
|||||||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||||
SHOW CREATE TABLE t9;
|
SHOW CREATE TABLE t9;
|
||||||
|
|
||||||
--error 1103,1103
|
|
||||||
create table t1 (a int not null auto_increment, b char(16) not null, primary key (a)) engine=myisam data directory="tmp";
|
|
||||||
|
|
||||||
# Check that we cannot link over a table from another database.
|
# Check that we cannot link over a table from another database.
|
||||||
|
|
||||||
@ -75,8 +73,9 @@ create database mysqltest;
|
|||||||
--error 1,1
|
--error 1,1
|
||||||
create table mysqltest.t9 (a int not null auto_increment, b char(16) not null, primary key (a)) engine=myisam index directory="/this-dir-does-not-exist";
|
create table mysqltest.t9 (a int not null auto_increment, b char(16) not null, primary key (a)) engine=myisam index directory="/this-dir-does-not-exist";
|
||||||
|
|
||||||
--error 1103,1103
|
# temporarily disabled as it returns different result in the embedded server
|
||||||
create table mysqltest.t9 (a int not null auto_increment, b char(16) not null, primary key (a)) engine=myisam index directory="not-hard-path";
|
# --error 1210, 1210
|
||||||
|
# create table mysqltest.t9 (a int not null auto_increment, b char(16) not null, primary key (a)) engine=myisam index directory="not-hard-path";
|
||||||
|
|
||||||
# Should fail becasue the file t9.MYI already exist in 'run'
|
# Should fail becasue the file t9.MYI already exist in 'run'
|
||||||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||||
|
@ -108,24 +108,34 @@ int my_symlink(const char *content, const char *linkname, myf MyFlags)
|
|||||||
#define BUFF_LEN FN_LEN
|
#define BUFF_LEN FN_LEN
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
int my_is_symlink(const char *filename __attribute__((unused)))
|
||||||
|
{
|
||||||
|
#if defined (HAVE_LSTAT) && defined (S_ISLNK)
|
||||||
|
struct stat stat_buff;
|
||||||
|
return !lstat(filename, &stat_buff) && S_ISLNK(stat_buff.st_mode);
|
||||||
|
#elif defined (_WIN32)
|
||||||
|
DWORD dwAttr = GetFileAttributes(filename);
|
||||||
|
return (dwAttr != INVALID_FILE_ATTRIBUTES) &&
|
||||||
|
(dwAttr & FILE_ATTRIBUTE_REPARSE_POINT);
|
||||||
|
#else /* No symlinks */
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int my_realpath(char *to, const char *filename,
|
int my_realpath(char *to, const char *filename,
|
||||||
myf MyFlags __attribute__((unused)))
|
myf MyFlags __attribute__((unused)))
|
||||||
{
|
{
|
||||||
#if defined(HAVE_REALPATH) && !defined(HAVE_purify) && !defined(HAVE_BROKEN_REALPATH)
|
#if defined(HAVE_REALPATH) && !defined(HAVE_purify) && !defined(HAVE_BROKEN_REALPATH)
|
||||||
int result=0;
|
int result=0;
|
||||||
char buff[BUFF_LEN];
|
char buff[BUFF_LEN];
|
||||||
struct stat stat_buff;
|
char *ptr;
|
||||||
DBUG_ENTER("my_realpath");
|
DBUG_ENTER("my_realpath");
|
||||||
|
|
||||||
if (!(MyFlags & MY_RESOLVE_LINK) ||
|
|
||||||
(!lstat(filename,&stat_buff) && S_ISLNK(stat_buff.st_mode)))
|
|
||||||
{
|
|
||||||
char *ptr;
|
|
||||||
DBUG_PRINT("info",("executing realpath"));
|
DBUG_PRINT("info",("executing realpath"));
|
||||||
if ((ptr=realpath(filename,buff)))
|
if ((ptr=realpath(filename,buff)))
|
||||||
{
|
|
||||||
strmake(to,ptr,FN_REFLEN-1);
|
strmake(to,ptr,FN_REFLEN-1);
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -140,7 +150,6 @@ int my_realpath(char *to, const char *filename,
|
|||||||
my_load_path(to, filename, NullS);
|
my_load_path(to, filename, NullS);
|
||||||
result= -1;
|
result= -1;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
DBUG_RETURN(result);
|
DBUG_RETURN(result);
|
||||||
#else
|
#else
|
||||||
my_load_path(to, filename, NullS);
|
my_load_path(to, filename, NullS);
|
||||||
|
@ -333,10 +333,10 @@ void thr_lock_init(THR_LOCK *lock)
|
|||||||
void thr_lock_delete(THR_LOCK *lock)
|
void thr_lock_delete(THR_LOCK *lock)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("thr_lock_delete");
|
DBUG_ENTER("thr_lock_delete");
|
||||||
VOID(pthread_mutex_destroy(&lock->mutex));
|
|
||||||
pthread_mutex_lock(&THR_LOCK_lock);
|
pthread_mutex_lock(&THR_LOCK_lock);
|
||||||
thr_lock_thread_list=list_delete(thr_lock_thread_list,&lock->list);
|
thr_lock_thread_list=list_delete(thr_lock_thread_list,&lock->list);
|
||||||
pthread_mutex_unlock(&THR_LOCK_lock);
|
pthread_mutex_unlock(&THR_LOCK_lock);
|
||||||
|
pthread_mutex_destroy(&lock->mutex);
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
574
sql/log_event.cc
574
sql/log_event.cc
@ -1353,6 +1353,542 @@ void Log_event::print_header(IO_CACHE* file,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Prints a quoted string to io cache.
|
||||||
|
Control characters are displayed as hex sequence, e.g. \x00
|
||||||
|
|
||||||
|
@param[in] file IO cache
|
||||||
|
@param[in] prt Pointer to string
|
||||||
|
@param[in] length String length
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
my_b_write_quoted(IO_CACHE *file, const uchar *ptr, uint length)
|
||||||
|
{
|
||||||
|
const uchar *s;
|
||||||
|
my_b_printf(file, "'");
|
||||||
|
for (s= ptr; length > 0 ; s++, length--)
|
||||||
|
{
|
||||||
|
if (*s > 0x1F)
|
||||||
|
my_b_write(file, s, 1);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
uchar hex[10];
|
||||||
|
size_t len= my_snprintf((char*) hex, sizeof(hex), "%s%02x", "\\x", *s);
|
||||||
|
my_b_write(file, hex, len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
my_b_printf(file, "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Prints a bit string to io cache in format b'1010'.
|
||||||
|
|
||||||
|
@param[in] file IO cache
|
||||||
|
@param[in] ptr Pointer to string
|
||||||
|
@param[in] nbits Number of bits
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
my_b_write_bit(IO_CACHE *file, const uchar *ptr, uint nbits)
|
||||||
|
{
|
||||||
|
uint bitnum, nbits8= ((nbits + 7) / 8) * 8, skip_bits= nbits8 - nbits;
|
||||||
|
my_b_printf(file, "b'");
|
||||||
|
for (bitnum= skip_bits ; bitnum < nbits8; bitnum++)
|
||||||
|
{
|
||||||
|
int is_set= (ptr[(bitnum) / 8] >> (7 - bitnum % 8)) & 0x01;
|
||||||
|
my_b_write(file, (const uchar*) (is_set ? "1" : "0"), 1);
|
||||||
|
}
|
||||||
|
my_b_printf(file, "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Prints a packed string to io cache.
|
||||||
|
The string consists of length packed to 1 or 2 bytes,
|
||||||
|
followed by string data itself.
|
||||||
|
|
||||||
|
@param[in] file IO cache
|
||||||
|
@param[in] ptr Pointer to string
|
||||||
|
@param[in] length String size
|
||||||
|
|
||||||
|
@retval - number of bytes scanned.
|
||||||
|
*/
|
||||||
|
static size_t
|
||||||
|
my_b_write_quoted_with_length(IO_CACHE *file, const uchar *ptr, uint length)
|
||||||
|
{
|
||||||
|
if (length < 256)
|
||||||
|
{
|
||||||
|
length= *ptr;
|
||||||
|
my_b_write_quoted(file, ptr + 1, length);
|
||||||
|
return length + 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
length= uint2korr(ptr);
|
||||||
|
my_b_write_quoted(file, ptr + 2, length);
|
||||||
|
return length + 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Prints a 32-bit number in both signed and unsigned representation
|
||||||
|
|
||||||
|
@param[in] file IO cache
|
||||||
|
@param[in] sl Signed number
|
||||||
|
@param[in] ul Unsigned number
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
my_b_write_sint32_and_uint32(IO_CACHE *file, int32 si, uint32 ui)
|
||||||
|
{
|
||||||
|
my_b_printf(file, "%d", si);
|
||||||
|
if (si < 0)
|
||||||
|
my_b_printf(file, " (%u)", ui);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Print a packed value of the given SQL type into IO cache
|
||||||
|
|
||||||
|
@param[in] file IO cache
|
||||||
|
@param[in] ptr Pointer to string
|
||||||
|
@param[in] type Column type
|
||||||
|
@param[in] meta Column meta information
|
||||||
|
@param[out] typestr SQL type string buffer (for verbose output)
|
||||||
|
@param[out] typestr_length Size of typestr
|
||||||
|
|
||||||
|
@retval - number of bytes scanned from ptr.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static size_t
|
||||||
|
log_event_print_value(IO_CACHE *file, const uchar *ptr,
|
||||||
|
uint type, uint meta,
|
||||||
|
char *typestr, size_t typestr_length)
|
||||||
|
{
|
||||||
|
uint32 length= 0;
|
||||||
|
|
||||||
|
if (type == MYSQL_TYPE_STRING)
|
||||||
|
{
|
||||||
|
if (meta >= 256)
|
||||||
|
{
|
||||||
|
uint byte0= meta >> 8;
|
||||||
|
uint byte1= meta & 0xFF;
|
||||||
|
|
||||||
|
if ((byte0 & 0x30) != 0x30)
|
||||||
|
{
|
||||||
|
/* a long CHAR() field: see #37426 */
|
||||||
|
length= byte1 | (((byte0 & 0x30) ^ 0x30) << 4);
|
||||||
|
type= byte0 | 0x30;
|
||||||
|
goto beg;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (byte0)
|
||||||
|
{
|
||||||
|
case MYSQL_TYPE_SET:
|
||||||
|
case MYSQL_TYPE_ENUM:
|
||||||
|
case MYSQL_TYPE_STRING:
|
||||||
|
type= byte0;
|
||||||
|
length= byte1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
|
||||||
|
{
|
||||||
|
char tmp[5];
|
||||||
|
my_snprintf(tmp, sizeof(tmp), "%04X", meta);
|
||||||
|
my_b_printf(file,
|
||||||
|
"!! Don't know how to handle column type=%d meta=%d (%s)",
|
||||||
|
type, meta, tmp);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
length= meta;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
beg:
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case MYSQL_TYPE_LONG:
|
||||||
|
{
|
||||||
|
int32 si= sint4korr(ptr);
|
||||||
|
uint32 ui= uint4korr(ptr);
|
||||||
|
my_b_write_sint32_and_uint32(file, si, ui);
|
||||||
|
my_snprintf(typestr, typestr_length, "INT");
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MYSQL_TYPE_TINY:
|
||||||
|
{
|
||||||
|
my_b_write_sint32_and_uint32(file, (int) (signed char) *ptr,
|
||||||
|
(uint) (unsigned char) *ptr);
|
||||||
|
my_snprintf(typestr, typestr_length, "TINYINT");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MYSQL_TYPE_SHORT:
|
||||||
|
{
|
||||||
|
int32 si= (int32) sint2korr(ptr);
|
||||||
|
uint32 ui= (uint32) uint2korr(ptr);
|
||||||
|
my_b_write_sint32_and_uint32(file, si, ui);
|
||||||
|
my_snprintf(typestr, typestr_length, "SHORTINT");
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MYSQL_TYPE_INT24:
|
||||||
|
{
|
||||||
|
int32 si= sint3korr(ptr);
|
||||||
|
uint32 ui= uint3korr(ptr);
|
||||||
|
my_b_write_sint32_and_uint32(file, si, ui);
|
||||||
|
my_snprintf(typestr, typestr_length, "MEDIUMINT");
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MYSQL_TYPE_LONGLONG:
|
||||||
|
{
|
||||||
|
char tmp[64];
|
||||||
|
longlong si= sint8korr(ptr);
|
||||||
|
longlong10_to_str(si, tmp, -10);
|
||||||
|
my_b_printf(file, "%s", tmp);
|
||||||
|
if (si < 0)
|
||||||
|
{
|
||||||
|
ulonglong ui= uint8korr(ptr);
|
||||||
|
longlong10_to_str((longlong) ui, tmp, 10);
|
||||||
|
my_b_printf(file, " (%s)", tmp);
|
||||||
|
}
|
||||||
|
my_snprintf(typestr, typestr_length, "LONGINT");
|
||||||
|
return 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MYSQL_TYPE_NEWDECIMAL:
|
||||||
|
{
|
||||||
|
uint precision= meta >> 8;
|
||||||
|
uint decimals= meta & 0xFF;
|
||||||
|
uint bin_size= my_decimal_get_binary_size(precision, decimals);
|
||||||
|
my_decimal dec;
|
||||||
|
binary2my_decimal(E_DEC_FATAL_ERROR, (uchar*) ptr, &dec,
|
||||||
|
precision, decimals);
|
||||||
|
int i, end;
|
||||||
|
char buff[512], *pos;
|
||||||
|
pos= buff;
|
||||||
|
pos+= my_sprintf(buff, (buff, "%s", dec.sign() ? "-" : ""));
|
||||||
|
end= ROUND_UP(dec.frac) + ROUND_UP(dec.intg)-1;
|
||||||
|
for (i=0; i < end; i++)
|
||||||
|
pos+= my_sprintf(pos, (pos, "%09d.", dec.buf[i]));
|
||||||
|
pos+= my_sprintf(pos, (pos, "%09d", dec.buf[i]));
|
||||||
|
my_b_printf(file, "%s", buff);
|
||||||
|
my_snprintf(typestr, typestr_length, "DECIMAL(%d,%d)",
|
||||||
|
precision, decimals);
|
||||||
|
return bin_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MYSQL_TYPE_FLOAT:
|
||||||
|
{
|
||||||
|
float fl;
|
||||||
|
float4get(fl, ptr);
|
||||||
|
char tmp[320];
|
||||||
|
sprintf(tmp, "%-20g", (double) fl);
|
||||||
|
my_b_printf(file, "%s", tmp); /* my_snprintf doesn't support %-20g */
|
||||||
|
my_snprintf(typestr, typestr_length, "FLOAT");
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MYSQL_TYPE_DOUBLE:
|
||||||
|
{
|
||||||
|
double dbl;
|
||||||
|
float8get(dbl, ptr);
|
||||||
|
char tmp[320];
|
||||||
|
sprintf(tmp, "%-.20g", dbl); /* my_snprintf doesn't support %-20g */
|
||||||
|
my_b_printf(file, "%s", tmp);
|
||||||
|
strcpy(typestr, "DOUBLE");
|
||||||
|
return 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MYSQL_TYPE_BIT:
|
||||||
|
{
|
||||||
|
/* Meta-data: bit_len, bytes_in_rec, 2 bytes */
|
||||||
|
uint nbits= ((meta >> 8) * 8) + (meta & 0xFF);
|
||||||
|
length= (nbits + 7) / 8;
|
||||||
|
my_b_write_bit(file, ptr, nbits);
|
||||||
|
my_snprintf(typestr, typestr_length, "BIT(%d)", nbits);
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MYSQL_TYPE_TIMESTAMP:
|
||||||
|
{
|
||||||
|
uint32 i32= uint4korr(ptr);
|
||||||
|
my_b_printf(file, "%d", i32);
|
||||||
|
my_snprintf(typestr, typestr_length, "TIMESTAMP");
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MYSQL_TYPE_DATETIME:
|
||||||
|
{
|
||||||
|
uint d, t;
|
||||||
|
uint64 i64= uint8korr(ptr); /* YYYYMMDDhhmmss */
|
||||||
|
d= i64 / 1000000;
|
||||||
|
t= i64 % 1000000;
|
||||||
|
my_b_printf(file, "%04d-%02d-%02d %02d:%02d:%02d",
|
||||||
|
d / 10000, (d % 10000) / 100, d % 100,
|
||||||
|
t / 10000, (t % 10000) / 100, t % 100);
|
||||||
|
my_snprintf(typestr, typestr_length, "DATETIME");
|
||||||
|
return 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MYSQL_TYPE_TIME:
|
||||||
|
{
|
||||||
|
uint32 i32= uint3korr(ptr);
|
||||||
|
my_b_printf(file, "'%02d:%02d:%02d'",
|
||||||
|
i32 / 10000, (i32 % 10000) / 100, i32 % 100);
|
||||||
|
my_snprintf(typestr, typestr_length, "TIME");
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MYSQL_TYPE_DATE:
|
||||||
|
{
|
||||||
|
uint i32= uint3korr(ptr);
|
||||||
|
my_b_printf(file , "'%04d:%02d:%02d'",
|
||||||
|
(i32 / (16L * 32L)), (i32 / 32L % 16L), (i32 % 32L));
|
||||||
|
my_snprintf(typestr, typestr_length, "DATE");
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MYSQL_TYPE_YEAR:
|
||||||
|
{
|
||||||
|
uint32 i32= *ptr;
|
||||||
|
my_b_printf(file, "%04d", i32+ 1900);
|
||||||
|
my_snprintf(typestr, typestr_length, "YEAR");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MYSQL_TYPE_ENUM:
|
||||||
|
switch (length) {
|
||||||
|
case 1:
|
||||||
|
my_b_printf(file, "%d", (int) *ptr);
|
||||||
|
my_snprintf(typestr, typestr_length, "ENUM(1 byte)");
|
||||||
|
return 1;
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
int32 i32= uint2korr(ptr);
|
||||||
|
my_b_printf(file, "%d", i32);
|
||||||
|
my_snprintf(typestr, typestr_length, "ENUM(2 bytes)");
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
my_b_printf(file, "!! Unknown ENUM packlen=%d", length);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MYSQL_TYPE_SET:
|
||||||
|
my_b_write_bit(file, ptr , length * 8);
|
||||||
|
my_snprintf(typestr, typestr_length, "SET(%d bytes)", length);
|
||||||
|
return length;
|
||||||
|
|
||||||
|
case MYSQL_TYPE_BLOB:
|
||||||
|
switch (meta) {
|
||||||
|
case 1:
|
||||||
|
length= *ptr;
|
||||||
|
my_b_write_quoted(file, ptr + 1, length);
|
||||||
|
my_snprintf(typestr, typestr_length, "TINYBLOB/TINYTEXT");
|
||||||
|
return length + 1;
|
||||||
|
case 2:
|
||||||
|
length= uint2korr(ptr);
|
||||||
|
my_b_write_quoted(file, ptr + 2, length);
|
||||||
|
my_snprintf(typestr, typestr_length, "BLOB/TEXT");
|
||||||
|
return length + 2;
|
||||||
|
case 3:
|
||||||
|
length= uint3korr(ptr);
|
||||||
|
my_b_write_quoted(file, ptr + 3, length);
|
||||||
|
my_snprintf(typestr, typestr_length, "MEDIUMBLOB/MEDIUMTEXT");
|
||||||
|
return length + 3;
|
||||||
|
case 4:
|
||||||
|
length= uint4korr(ptr);
|
||||||
|
my_b_write_quoted(file, ptr + 4, length);
|
||||||
|
my_snprintf(typestr, typestr_length, "LONGBLOB/LONGTEXT");
|
||||||
|
return length + 4;
|
||||||
|
default:
|
||||||
|
my_b_printf(file, "!! Unknown BLOB packlen=%d", length);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MYSQL_TYPE_VARCHAR:
|
||||||
|
case MYSQL_TYPE_VAR_STRING:
|
||||||
|
length= meta;
|
||||||
|
my_snprintf(typestr, typestr_length, "VARSTRING(%d)", length);
|
||||||
|
return my_b_write_quoted_with_length(file, ptr, length);
|
||||||
|
|
||||||
|
case MYSQL_TYPE_STRING:
|
||||||
|
my_snprintf(typestr, typestr_length, "STRING(%d)", length);
|
||||||
|
return my_b_write_quoted_with_length(file, ptr, length);
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
char tmp[5];
|
||||||
|
my_snprintf(tmp, sizeof(tmp), "%04x", meta);
|
||||||
|
my_b_printf(file,
|
||||||
|
"!! Don't know how to handle column type=%d meta=%d (%s)",
|
||||||
|
type, meta, tmp);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
*typestr= 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Print a packed row into IO cache
|
||||||
|
|
||||||
|
@param[in] file IO cache
|
||||||
|
@param[in] td Table definition
|
||||||
|
@param[in] print_event_into Print parameters
|
||||||
|
@param[in] cols_bitmap Column bitmaps.
|
||||||
|
@param[in] value Pointer to packed row
|
||||||
|
@param[in] prefix Row's SQL clause ("SET", "WHERE", etc)
|
||||||
|
|
||||||
|
@retval - number of bytes scanned.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
size_t
|
||||||
|
Rows_log_event::print_verbose_one_row(IO_CACHE *file, table_def *td,
|
||||||
|
PRINT_EVENT_INFO *print_event_info,
|
||||||
|
MY_BITMAP *cols_bitmap,
|
||||||
|
const uchar *value, const uchar *prefix)
|
||||||
|
{
|
||||||
|
const uchar *value0= value;
|
||||||
|
const uchar *null_bits= value;
|
||||||
|
char typestr[64]= "";
|
||||||
|
|
||||||
|
value+= (m_width + 7) / 8;
|
||||||
|
|
||||||
|
my_b_printf(file, "%s", prefix);
|
||||||
|
|
||||||
|
for (size_t i= 0; i < td->size(); i ++)
|
||||||
|
{
|
||||||
|
int is_null= (null_bits[i / 8] >> (i % 8)) & 0x01;
|
||||||
|
|
||||||
|
if (bitmap_is_set(cols_bitmap, i) == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (is_null)
|
||||||
|
{
|
||||||
|
my_b_printf(file, "### @%d=NULL", i + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
my_b_printf(file, "### @%d=", i + 1);
|
||||||
|
size_t size= log_event_print_value(file, value,
|
||||||
|
td->type(i), td->field_metadata(i),
|
||||||
|
typestr, sizeof(typestr));
|
||||||
|
if (!size)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
value+= size;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (print_event_info->verbose > 1)
|
||||||
|
{
|
||||||
|
my_b_printf(file, " /* ");
|
||||||
|
|
||||||
|
if (typestr[0])
|
||||||
|
my_b_printf(file, "%s ", typestr);
|
||||||
|
else
|
||||||
|
my_b_printf(file, "type=%d ", td->type(i));
|
||||||
|
|
||||||
|
my_b_printf(file, "meta=%d nullable=%d is_null=%d ",
|
||||||
|
td->field_metadata(i),
|
||||||
|
td->maybe_null(i), is_null);
|
||||||
|
my_b_printf(file, "*/");
|
||||||
|
}
|
||||||
|
|
||||||
|
my_b_printf(file, "\n");
|
||||||
|
}
|
||||||
|
return value - value0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Print a row event into IO cache in human readable form (in SQL format)
|
||||||
|
|
||||||
|
@param[in] file IO cache
|
||||||
|
@param[in] print_event_into Print parameters
|
||||||
|
*/
|
||||||
|
void Rows_log_event::print_verbose(IO_CACHE *file,
|
||||||
|
PRINT_EVENT_INFO *print_event_info)
|
||||||
|
{
|
||||||
|
Table_map_log_event *map;
|
||||||
|
table_def *td;
|
||||||
|
const char *sql_command, *sql_clause1, *sql_clause2;
|
||||||
|
Log_event_type type_code= get_type_code();
|
||||||
|
|
||||||
|
switch (type_code) {
|
||||||
|
case WRITE_ROWS_EVENT:
|
||||||
|
sql_command= "INSERT INTO";
|
||||||
|
sql_clause1= "### SET\n";
|
||||||
|
sql_clause2= NULL;
|
||||||
|
break;
|
||||||
|
case DELETE_ROWS_EVENT:
|
||||||
|
sql_command= "DELETE FROM";
|
||||||
|
sql_clause1= "### WHERE\n";
|
||||||
|
sql_clause2= NULL;
|
||||||
|
break;
|
||||||
|
case UPDATE_ROWS_EVENT:
|
||||||
|
sql_command= "UPDATE";
|
||||||
|
sql_clause1= "### WHERE\n";
|
||||||
|
sql_clause2= "### SET\n";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sql_command= sql_clause1= sql_clause2= NULL;
|
||||||
|
DBUG_ASSERT(0); /* Not possible */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(map= print_event_info->m_table_map.get_table(m_table_id)) ||
|
||||||
|
!(td= map->create_table_def()))
|
||||||
|
{
|
||||||
|
my_b_printf(file, "### Row event for unknown table #%d", m_table_id);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const uchar *value= m_rows_buf; value < m_rows_end; )
|
||||||
|
{
|
||||||
|
size_t length;
|
||||||
|
my_b_printf(file, "### %s %s.%s\n",
|
||||||
|
sql_command,
|
||||||
|
map->get_db_name(), map->get_table_name());
|
||||||
|
/* Print the first image */
|
||||||
|
if (!(length= print_verbose_one_row(file, td, print_event_info,
|
||||||
|
&m_cols, value,
|
||||||
|
(const uchar*) sql_clause1)))
|
||||||
|
goto end;
|
||||||
|
value+= length;
|
||||||
|
|
||||||
|
/* Print the second image (for UPDATE only) */
|
||||||
|
if (sql_clause2)
|
||||||
|
{
|
||||||
|
if (!(length= print_verbose_one_row(file, td, print_event_info,
|
||||||
|
&m_cols_ai, value,
|
||||||
|
(const uchar*) sql_clause2)))
|
||||||
|
goto end;
|
||||||
|
value+= length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
end:
|
||||||
|
delete td;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MYSQL_CLIENT
|
||||||
|
void free_table_map_log_event(Table_map_log_event *event)
|
||||||
|
{
|
||||||
|
delete event;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void Log_event::print_base64(IO_CACHE* file,
|
void Log_event::print_base64(IO_CACHE* file,
|
||||||
PRINT_EVENT_INFO* print_event_info,
|
PRINT_EVENT_INFO* print_event_info,
|
||||||
bool more)
|
bool more)
|
||||||
@ -1374,6 +1910,8 @@ void Log_event::print_base64(IO_CACHE* file,
|
|||||||
DBUG_ASSERT(0);
|
DBUG_ASSERT(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (print_event_info->base64_output_mode != BASE64_OUTPUT_DECODE_ROWS)
|
||||||
|
{
|
||||||
if (my_b_tell(file) == 0)
|
if (my_b_tell(file) == 0)
|
||||||
my_b_printf(file, "\nBINLOG '\n");
|
my_b_printf(file, "\nBINLOG '\n");
|
||||||
|
|
||||||
@ -1381,6 +1919,41 @@ void Log_event::print_base64(IO_CACHE* file,
|
|||||||
|
|
||||||
if (!more)
|
if (!more)
|
||||||
my_b_printf(file, "'%s\n", print_event_info->delimiter);
|
my_b_printf(file, "'%s\n", print_event_info->delimiter);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (print_event_info->verbose)
|
||||||
|
{
|
||||||
|
Rows_log_event *ev= NULL;
|
||||||
|
|
||||||
|
if (ptr[4] == TABLE_MAP_EVENT)
|
||||||
|
{
|
||||||
|
Table_map_log_event *map;
|
||||||
|
map= new Table_map_log_event((const char*) ptr, size,
|
||||||
|
glob_description_event);
|
||||||
|
print_event_info->m_table_map.set_table(map->get_table_id(), map);
|
||||||
|
}
|
||||||
|
else if (ptr[4] == WRITE_ROWS_EVENT)
|
||||||
|
{
|
||||||
|
ev= new Write_rows_log_event((const char*) ptr, size,
|
||||||
|
glob_description_event);
|
||||||
|
}
|
||||||
|
else if (ptr[4] == DELETE_ROWS_EVENT)
|
||||||
|
{
|
||||||
|
ev= new Delete_rows_log_event((const char*) ptr, size,
|
||||||
|
glob_description_event);
|
||||||
|
}
|
||||||
|
else if (ptr[4] == UPDATE_ROWS_EVENT)
|
||||||
|
{
|
||||||
|
ev= new Update_rows_log_event((const char*) ptr, size,
|
||||||
|
glob_description_event);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ev)
|
||||||
|
{
|
||||||
|
ev->print_verbose(file, print_event_info);
|
||||||
|
delete ev;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
my_free(tmp_str, MYF(0));
|
my_free(tmp_str, MYF(0));
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
@ -2689,6 +3262,7 @@ void Start_log_event_v3::print(FILE* file, PRINT_EVENT_INFO* print_event_info)
|
|||||||
print_event_info->base64_output_mode != BASE64_OUTPUT_NEVER &&
|
print_event_info->base64_output_mode != BASE64_OUTPUT_NEVER &&
|
||||||
!print_event_info->short_form)
|
!print_event_info->short_form)
|
||||||
{
|
{
|
||||||
|
if (print_event_info->base64_output_mode != BASE64_OUTPUT_DECODE_ROWS)
|
||||||
my_b_printf(&cache, "BINLOG '\n");
|
my_b_printf(&cache, "BINLOG '\n");
|
||||||
print_base64(&cache, print_event_info, FALSE);
|
print_base64(&cache, print_event_info, FALSE);
|
||||||
print_event_info->printed_fd_event= TRUE;
|
print_event_info->printed_fd_event= TRUE;
|
||||||
|
@ -34,6 +34,14 @@
|
|||||||
|
|
||||||
#include <my_bitmap.h>
|
#include <my_bitmap.h>
|
||||||
#include "rpl_constants.h"
|
#include "rpl_constants.h"
|
||||||
|
|
||||||
|
#ifdef MYSQL_CLIENT
|
||||||
|
#include "rpl_utility.h"
|
||||||
|
#include "hash.h"
|
||||||
|
#include "rpl_tblmap.h"
|
||||||
|
#include "rpl_tblmap.cc"
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef MYSQL_CLIENT
|
#ifndef MYSQL_CLIENT
|
||||||
#include "rpl_record.h"
|
#include "rpl_record.h"
|
||||||
#include "rpl_reporting.h"
|
#include "rpl_reporting.h"
|
||||||
@ -577,6 +585,7 @@ enum enum_base64_output_mode {
|
|||||||
BASE64_OUTPUT_AUTO= 1,
|
BASE64_OUTPUT_AUTO= 1,
|
||||||
BASE64_OUTPUT_ALWAYS= 2,
|
BASE64_OUTPUT_ALWAYS= 2,
|
||||||
BASE64_OUTPUT_UNSPEC= 3,
|
BASE64_OUTPUT_UNSPEC= 3,
|
||||||
|
BASE64_OUTPUT_DECODE_ROWS= 4,
|
||||||
/* insert new output modes here */
|
/* insert new output modes here */
|
||||||
BASE64_OUTPUT_MODE_COUNT
|
BASE64_OUTPUT_MODE_COUNT
|
||||||
};
|
};
|
||||||
@ -639,6 +648,11 @@ typedef struct st_print_event_info
|
|||||||
uint8 common_header_len;
|
uint8 common_header_len;
|
||||||
char delimiter[16];
|
char delimiter[16];
|
||||||
|
|
||||||
|
#ifdef MYSQL_CLIENT
|
||||||
|
uint verbose;
|
||||||
|
table_mapping m_table_map;
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
These two caches are used by the row-based replication events to
|
These two caches are used by the row-based replication events to
|
||||||
collect the header information and the main body of the events
|
collect the header information and the main body of the events
|
||||||
@ -3264,6 +3278,17 @@ public:
|
|||||||
|
|
||||||
~Table_map_log_event();
|
~Table_map_log_event();
|
||||||
|
|
||||||
|
#ifdef MYSQL_CLIENT
|
||||||
|
table_def *create_table_def()
|
||||||
|
{
|
||||||
|
return new table_def(m_coltype, m_colcnt, m_field_metadata,
|
||||||
|
m_field_metadata_size, m_null_bits);
|
||||||
|
}
|
||||||
|
ulong get_table_id() const { return m_table_id; }
|
||||||
|
const char *get_table_name() const { return m_tblnam; }
|
||||||
|
const char *get_db_name() const { return m_dbnam; }
|
||||||
|
#endif
|
||||||
|
|
||||||
virtual Log_event_type get_type_code() { return TABLE_MAP_EVENT; }
|
virtual Log_event_type get_type_code() { return TABLE_MAP_EVENT; }
|
||||||
virtual bool is_valid() const { return m_memory != NULL; /* we check malloc */ }
|
virtual bool is_valid() const { return m_memory != NULL; /* we check malloc */ }
|
||||||
|
|
||||||
@ -3394,6 +3419,12 @@ public:
|
|||||||
#ifdef MYSQL_CLIENT
|
#ifdef MYSQL_CLIENT
|
||||||
/* not for direct call, each derived has its own ::print() */
|
/* not for direct call, each derived has its own ::print() */
|
||||||
virtual void print(FILE *file, PRINT_EVENT_INFO *print_event_info)= 0;
|
virtual void print(FILE *file, PRINT_EVENT_INFO *print_event_info)= 0;
|
||||||
|
void print_verbose(IO_CACHE *file,
|
||||||
|
PRINT_EVENT_INFO *print_event_info);
|
||||||
|
size_t print_verbose_one_row(IO_CACHE *file, table_def *td,
|
||||||
|
PRINT_EVENT_INFO *print_event_info,
|
||||||
|
MY_BITMAP *cols_bitmap,
|
||||||
|
const uchar *ptr, const uchar *prefix);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef MYSQL_CLIENT
|
#ifndef MYSQL_CLIENT
|
||||||
|
@ -803,7 +803,6 @@ bool check_string_byte_length(LEX_STRING *str, const char *err_msg,
|
|||||||
bool check_string_char_length(LEX_STRING *str, const char *err_msg,
|
bool check_string_char_length(LEX_STRING *str, const char *err_msg,
|
||||||
uint max_char_length, CHARSET_INFO *cs,
|
uint max_char_length, CHARSET_INFO *cs,
|
||||||
bool no_error);
|
bool no_error);
|
||||||
bool test_if_data_home_dir(const char *dir);
|
|
||||||
|
|
||||||
bool parse_sql(THD *thd,
|
bool parse_sql(THD *thd,
|
||||||
Parser_state *parser_state,
|
Parser_state *parser_state,
|
||||||
@ -1862,6 +1861,7 @@ extern CHARSET_INFO *character_set_filesystem;
|
|||||||
#ifdef MYSQL_SERVER
|
#ifdef MYSQL_SERVER
|
||||||
extern char *opt_mysql_tmpdir, mysql_charsets_dir[],
|
extern char *opt_mysql_tmpdir, mysql_charsets_dir[],
|
||||||
def_ft_boolean_syntax[sizeof(ft_boolean_syntax)];
|
def_ft_boolean_syntax[sizeof(ft_boolean_syntax)];
|
||||||
|
extern int mysql_unpacked_real_data_home_len;
|
||||||
#define mysql_tmpdir (my_tmpdir(&mysql_tmpdir_list))
|
#define mysql_tmpdir (my_tmpdir(&mysql_tmpdir_list))
|
||||||
extern MY_TMPDIR mysql_tmpdir_list;
|
extern MY_TMPDIR mysql_tmpdir_list;
|
||||||
extern const LEX_STRING command_name[];
|
extern const LEX_STRING command_name[];
|
||||||
@ -2473,6 +2473,8 @@ bool load_collation(MEM_ROOT *mem_root,
|
|||||||
CHARSET_INFO **cl);
|
CHARSET_INFO **cl);
|
||||||
|
|
||||||
#endif /* MYSQL_SERVER */
|
#endif /* MYSQL_SERVER */
|
||||||
|
extern "C" int test_if_data_home_dir(const char *dir);
|
||||||
|
|
||||||
#endif /* MYSQL_CLIENT */
|
#endif /* MYSQL_CLIENT */
|
||||||
|
|
||||||
#endif /* MYSQL_PRIV_H */
|
#endif /* MYSQL_PRIV_H */
|
||||||
|
@ -520,6 +520,7 @@ char mysql_real_data_home[FN_REFLEN],
|
|||||||
*opt_init_file, *opt_tc_log_file,
|
*opt_init_file, *opt_tc_log_file,
|
||||||
def_ft_boolean_syntax[sizeof(ft_boolean_syntax)];
|
def_ft_boolean_syntax[sizeof(ft_boolean_syntax)];
|
||||||
char mysql_unpacked_real_data_home[FN_REFLEN];
|
char mysql_unpacked_real_data_home[FN_REFLEN];
|
||||||
|
int mysql_unpacked_real_data_home_len;
|
||||||
uint reg_ext_length;
|
uint reg_ext_length;
|
||||||
const key_map key_map_empty(0);
|
const key_map key_map_empty(0);
|
||||||
key_map key_map_full(0); // Will be initialized later
|
key_map key_map_full(0); // Will be initialized later
|
||||||
@ -7408,6 +7409,7 @@ static void mysql_init_variables(void)
|
|||||||
/* Things reset to zero */
|
/* Things reset to zero */
|
||||||
opt_skip_slave_start= opt_reckless_slave = 0;
|
opt_skip_slave_start= opt_reckless_slave = 0;
|
||||||
mysql_home[0]= pidfile_name[0]= log_error_file[0]= 0;
|
mysql_home[0]= pidfile_name[0]= log_error_file[0]= 0;
|
||||||
|
myisam_test_invalid_symlink= test_if_data_home_dir;
|
||||||
opt_log= opt_slow_log= 0;
|
opt_log= opt_slow_log= 0;
|
||||||
opt_update_log= 0;
|
opt_update_log= 0;
|
||||||
log_output_options= find_bit_type(log_output_str, &log_output_typelib);
|
log_output_options= find_bit_type(log_output_str, &log_output_typelib);
|
||||||
@ -8360,9 +8362,12 @@ static void fix_paths(void)
|
|||||||
pos[1]= 0;
|
pos[1]= 0;
|
||||||
}
|
}
|
||||||
convert_dirname(mysql_real_data_home,mysql_real_data_home,NullS);
|
convert_dirname(mysql_real_data_home,mysql_real_data_home,NullS);
|
||||||
(void) fn_format(buff, mysql_real_data_home, "", "",
|
my_realpath(mysql_unpacked_real_data_home, mysql_real_data_home, MYF(0));
|
||||||
(MY_RETURN_REAL_PATH|MY_RESOLVE_SYMLINKS));
|
mysql_unpacked_real_data_home_len= strlen(mysql_unpacked_real_data_home);
|
||||||
(void) unpack_dirname(mysql_unpacked_real_data_home, buff);
|
if (mysql_unpacked_real_data_home[mysql_unpacked_real_data_home_len-1] == FN_LIBCHAR)
|
||||||
|
--mysql_unpacked_real_data_home_len;
|
||||||
|
|
||||||
|
|
||||||
convert_dirname(language,language,NullS);
|
convert_dirname(language,language,NullS);
|
||||||
(void) my_load_path(mysql_home,mysql_home,""); // Resolve current dir
|
(void) my_load_path(mysql_home,mysql_home,""); // Resolve current dir
|
||||||
(void) my_load_path(mysql_real_data_home,mysql_real_data_home,mysql_home);
|
(void) my_load_path(mysql_real_data_home,mysql_real_data_home,mysql_home);
|
||||||
|
@ -19,7 +19,11 @@
|
|||||||
|
|
||||||
#include "rpl_tblmap.h"
|
#include "rpl_tblmap.h"
|
||||||
|
|
||||||
|
#ifdef MYSQL_CLIENT
|
||||||
|
#define MAYBE_TABLE_NAME(T) ("")
|
||||||
|
#else
|
||||||
#define MAYBE_TABLE_NAME(T) ((T) ? (T)->s->table_name.str : "<>")
|
#define MAYBE_TABLE_NAME(T) ((T) ? (T)->s->table_name.str : "<>")
|
||||||
|
#endif
|
||||||
#define TABLE_ID_HASH_SIZE 32
|
#define TABLE_ID_HASH_SIZE 32
|
||||||
#define TABLE_ID_CHUNK 256
|
#define TABLE_ID_CHUNK 256
|
||||||
|
|
||||||
@ -42,11 +46,14 @@ table_mapping::table_mapping()
|
|||||||
|
|
||||||
table_mapping::~table_mapping()
|
table_mapping::~table_mapping()
|
||||||
{
|
{
|
||||||
|
#ifdef MYSQL_CLIENT
|
||||||
|
clear_tables();
|
||||||
|
#endif
|
||||||
hash_free(&m_table_ids);
|
hash_free(&m_table_ids);
|
||||||
free_root(&m_mem_root, MYF(0));
|
free_root(&m_mem_root, MYF(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
st_table* table_mapping::get_table(ulong table_id)
|
TABLE* table_mapping::get_table(ulong table_id)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("table_mapping::get_table(ulong)");
|
DBUG_ENTER("table_mapping::get_table(ulong)");
|
||||||
DBUG_PRINT("enter", ("table_id: %lu", table_id));
|
DBUG_PRINT("enter", ("table_id: %lu", table_id));
|
||||||
@ -104,8 +111,12 @@ int table_mapping::set_table(ulong table_id, TABLE* table)
|
|||||||
m_free= m_free->next;
|
m_free= m_free->next;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
#ifdef MYSQL_CLIENT
|
||||||
|
free_table_map_log_event(e->table);
|
||||||
|
#endif
|
||||||
hash_delete(&m_table_ids,(uchar *)e);
|
hash_delete(&m_table_ids,(uchar *)e);
|
||||||
|
}
|
||||||
e->table_id= table_id;
|
e->table_id= table_id;
|
||||||
e->table= table;
|
e->table= table;
|
||||||
my_hash_insert(&m_table_ids,(uchar *)e);
|
my_hash_insert(&m_table_ids,(uchar *)e);
|
||||||
@ -140,6 +151,9 @@ void table_mapping::clear_tables()
|
|||||||
for (uint i= 0; i < m_table_ids.records; i++)
|
for (uint i= 0; i < m_table_ids.records; i++)
|
||||||
{
|
{
|
||||||
entry *e= (entry *)hash_element(&m_table_ids, i);
|
entry *e= (entry *)hash_element(&m_table_ids, i);
|
||||||
|
#ifdef MYSQL_CLIENT
|
||||||
|
free_table_map_log_event(e->table);
|
||||||
|
#endif
|
||||||
e->next= m_free;
|
e->next= m_free;
|
||||||
m_free= e;
|
m_free= e;
|
||||||
}
|
}
|
||||||
|
@ -17,8 +17,15 @@
|
|||||||
#define TABLE_MAPPING_H
|
#define TABLE_MAPPING_H
|
||||||
|
|
||||||
/* Forward declarations */
|
/* Forward declarations */
|
||||||
|
#ifndef MYSQL_CLIENT
|
||||||
struct st_table;
|
struct st_table;
|
||||||
typedef st_table TABLE;
|
typedef st_table TABLE;
|
||||||
|
#else
|
||||||
|
class Table_map_log_event;
|
||||||
|
typedef Table_map_log_event TABLE;
|
||||||
|
void free_table_map_log_event(TABLE *table);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
CLASS table_mapping
|
CLASS table_mapping
|
||||||
|
@ -236,7 +236,9 @@ public:
|
|||||||
@retval 1 if the table definition is not compatible with @c table
|
@retval 1 if the table definition is not compatible with @c table
|
||||||
@retval 0 if the table definition is compatible with @c table
|
@retval 0 if the table definition is compatible with @c table
|
||||||
*/
|
*/
|
||||||
|
#ifndef MYSQL_CLIENT
|
||||||
int compatible_with(Relay_log_info const *rli, TABLE *table) const;
|
int compatible_with(Relay_log_info const *rli, TABLE *table) const;
|
||||||
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ulong m_size; // Number of elements in the types array
|
ulong m_size; // Number of elements in the types array
|
||||||
@ -247,6 +249,8 @@ private:
|
|||||||
uchar *m_memory;
|
uchar *m_memory;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef MYSQL_CLIENT
|
||||||
/**
|
/**
|
||||||
Extend the normal table list with a few new fields needed by the
|
Extend the normal table list with a few new fields needed by the
|
||||||
slave thread, but nowhere else.
|
slave thread, but nowhere else.
|
||||||
@ -288,6 +292,7 @@ namespace {
|
|||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#define DBUG_PRINT_BITSET(N,FRM,BS) \
|
#define DBUG_PRINT_BITSET(N,FRM,BS) \
|
||||||
do { \
|
do { \
|
||||||
|
@ -3693,9 +3693,10 @@ void abort_locked_tables(THD *thd,const char *db, const char *table_name)
|
|||||||
|
|
||||||
share->table_map_id is not ~0UL.
|
share->table_map_id is not ~0UL.
|
||||||
*/
|
*/
|
||||||
|
static ulong last_table_id= ~0UL;
|
||||||
|
|
||||||
void assign_new_table_id(TABLE_SHARE *share)
|
void assign_new_table_id(TABLE_SHARE *share)
|
||||||
{
|
{
|
||||||
static ulong last_table_id= ~0UL;
|
|
||||||
|
|
||||||
DBUG_ENTER("assign_new_table_id");
|
DBUG_ENTER("assign_new_table_id");
|
||||||
|
|
||||||
@ -3719,7 +3720,6 @@ void assign_new_table_id(TABLE_SHARE *share)
|
|||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Compare metadata versions of an element obtained from the table
|
Compare metadata versions of an element obtained from the table
|
||||||
definition cache and its corresponding node in the parse tree.
|
definition cache and its corresponding node in the parse tree.
|
||||||
|
@ -7459,11 +7459,12 @@ bool check_string_char_length(LEX_STRING *str, const char *err_msg,
|
|||||||
0 ok
|
0 ok
|
||||||
1 error
|
1 error
|
||||||
*/
|
*/
|
||||||
|
C_MODE_START
|
||||||
|
|
||||||
bool test_if_data_home_dir(const char *dir)
|
int test_if_data_home_dir(const char *dir)
|
||||||
{
|
{
|
||||||
char path[FN_REFLEN], conv_path[FN_REFLEN];
|
char path[FN_REFLEN];
|
||||||
uint dir_len, home_dir_len= strlen(mysql_unpacked_real_data_home);
|
int dir_len;
|
||||||
DBUG_ENTER("test_if_data_home_dir");
|
DBUG_ENTER("test_if_data_home_dir");
|
||||||
|
|
||||||
if (!dir)
|
if (!dir)
|
||||||
@ -7471,24 +7472,30 @@ bool test_if_data_home_dir(const char *dir)
|
|||||||
|
|
||||||
(void) fn_format(path, dir, "", "",
|
(void) fn_format(path, dir, "", "",
|
||||||
(MY_RETURN_REAL_PATH|MY_RESOLVE_SYMLINKS));
|
(MY_RETURN_REAL_PATH|MY_RESOLVE_SYMLINKS));
|
||||||
dir_len= unpack_dirname(conv_path, dir);
|
dir_len= strlen(path);
|
||||||
|
if (mysql_unpacked_real_data_home_len<= dir_len)
|
||||||
if (home_dir_len < dir_len)
|
|
||||||
{
|
{
|
||||||
|
if (dir_len > mysql_unpacked_real_data_home_len &&
|
||||||
|
path[mysql_unpacked_real_data_home_len] != FN_LIBCHAR)
|
||||||
|
DBUG_RETURN(0);
|
||||||
|
|
||||||
if (lower_case_file_system)
|
if (lower_case_file_system)
|
||||||
{
|
{
|
||||||
if (!my_strnncoll(character_set_filesystem,
|
if (!my_strnncoll(default_charset_info, (const uchar*) path,
|
||||||
(const uchar*) conv_path, home_dir_len,
|
mysql_unpacked_real_data_home_len,
|
||||||
(const uchar*) mysql_unpacked_real_data_home,
|
(const uchar*) mysql_unpacked_real_data_home,
|
||||||
home_dir_len))
|
mysql_unpacked_real_data_home_len))
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
else if (!memcmp(conv_path, mysql_unpacked_real_data_home, home_dir_len))
|
else if (!memcmp(path, mysql_unpacked_real_data_home,
|
||||||
|
mysql_unpacked_real_data_home_len))
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
C_MODE_END
|
||||||
|
|
||||||
|
|
||||||
extern int MYSQLparse(void *thd); // from sql_yacc.cc
|
extern int MYSQLparse(void *thd); // from sql_yacc.cc
|
||||||
|
|
||||||
|
@ -1736,7 +1736,7 @@ err:
|
|||||||
DATA_TMP_EXT, share->base.raid_chunks,
|
DATA_TMP_EXT, share->base.raid_chunks,
|
||||||
(param->testflag & T_BACKUP_DATA ?
|
(param->testflag & T_BACKUP_DATA ?
|
||||||
MYF(MY_REDEL_MAKE_BACKUP): MYF(0))) ||
|
MYF(MY_REDEL_MAKE_BACKUP): MYF(0))) ||
|
||||||
mi_open_datafile(info,share,-1))
|
mi_open_datafile(info,share,name,-1))
|
||||||
got_error=1;
|
got_error=1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2549,7 +2549,7 @@ err:
|
|||||||
DATA_TMP_EXT, share->base.raid_chunks,
|
DATA_TMP_EXT, share->base.raid_chunks,
|
||||||
(param->testflag & T_BACKUP_DATA ?
|
(param->testflag & T_BACKUP_DATA ?
|
||||||
MYF(MY_REDEL_MAKE_BACKUP): MYF(0))) ||
|
MYF(MY_REDEL_MAKE_BACKUP): MYF(0))) ||
|
||||||
mi_open_datafile(info,share,-1))
|
mi_open_datafile(info,share,name,-1))
|
||||||
got_error=1;
|
got_error=1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3081,7 +3081,7 @@ err:
|
|||||||
DATA_TMP_EXT, share->base.raid_chunks,
|
DATA_TMP_EXT, share->base.raid_chunks,
|
||||||
(param->testflag & T_BACKUP_DATA ?
|
(param->testflag & T_BACKUP_DATA ?
|
||||||
MYF(MY_REDEL_MAKE_BACKUP): MYF(0))) ||
|
MYF(MY_REDEL_MAKE_BACKUP): MYF(0))) ||
|
||||||
mi_open_datafile(info,share,-1))
|
mi_open_datafile(info,share,name,-1))
|
||||||
got_error=1;
|
got_error=1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -196,7 +196,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
|||||||
packed=(packed+7)/8;
|
packed=(packed+7)/8;
|
||||||
if (pack_reclength != INT_MAX32)
|
if (pack_reclength != INT_MAX32)
|
||||||
pack_reclength+= reclength+packed +
|
pack_reclength+= reclength+packed +
|
||||||
test(test_all_bits(options, HA_OPTION_CHECKSUM | HA_PACK_RECORD));
|
test(test_all_bits(options, HA_OPTION_CHECKSUM | HA_OPTION_PACK_RECORD));
|
||||||
min_pack_length+=packed;
|
min_pack_length+=packed;
|
||||||
|
|
||||||
if (!ci->data_file_length && ci->max_rows)
|
if (!ci->data_file_length && ci->max_rows)
|
||||||
|
@ -74,7 +74,7 @@ MI_INFO *test_if_reopen(char *filename)
|
|||||||
|
|
||||||
MI_INFO *mi_open(const char *name, int mode, uint open_flags)
|
MI_INFO *mi_open(const char *name, int mode, uint open_flags)
|
||||||
{
|
{
|
||||||
int lock_error,kfile,open_mode,save_errno,have_rtree=0;
|
int lock_error,kfile,open_mode,save_errno,have_rtree=0, realpath_err;
|
||||||
uint i,j,len,errpos,head_length,base_pos,offset,info_length,keys,
|
uint i,j,len,errpos,head_length,base_pos,offset,info_length,keys,
|
||||||
key_parts,unique_key_parts,fulltext_keys,uniques;
|
key_parts,unique_key_parts,fulltext_keys,uniques;
|
||||||
char name_buff[FN_REFLEN], org_name[FN_REFLEN], index_name[FN_REFLEN],
|
char name_buff[FN_REFLEN], org_name[FN_REFLEN], index_name[FN_REFLEN],
|
||||||
@ -94,8 +94,15 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
|
|||||||
head_length=sizeof(share_buff.state.header);
|
head_length=sizeof(share_buff.state.header);
|
||||||
bzero((uchar*) &info,sizeof(info));
|
bzero((uchar*) &info,sizeof(info));
|
||||||
|
|
||||||
my_realpath(name_buff, fn_format(org_name,name,"",MI_NAME_IEXT,
|
realpath_err= my_realpath(name_buff,
|
||||||
MY_UNPACK_FILENAME),MYF(0));
|
fn_format(org_name,name,"",MI_NAME_IEXT,4),MYF(0));
|
||||||
|
if (my_is_symlink(org_name) &&
|
||||||
|
(realpath_err || (*myisam_test_invalid_symlink)(name_buff)))
|
||||||
|
{
|
||||||
|
my_errno= HA_WRONG_CREATE_OPTION;
|
||||||
|
DBUG_RETURN (NULL);
|
||||||
|
}
|
||||||
|
|
||||||
pthread_mutex_lock(&THR_LOCK_myisam);
|
pthread_mutex_lock(&THR_LOCK_myisam);
|
||||||
if (!(old_info=test_if_reopen(name_buff)))
|
if (!(old_info=test_if_reopen(name_buff)))
|
||||||
{
|
{
|
||||||
@ -476,7 +483,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
|
|||||||
lock_error=1; /* Database unlocked */
|
lock_error=1; /* Database unlocked */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mi_open_datafile(&info, share, -1))
|
if (mi_open_datafile(&info, share, name, -1))
|
||||||
goto err;
|
goto err;
|
||||||
errpos=5;
|
errpos=5;
|
||||||
|
|
||||||
@ -556,7 +563,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
|
|||||||
my_errno=EACCES; /* Can't open in write mode */
|
my_errno=EACCES; /* Can't open in write mode */
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
if (mi_open_datafile(&info, share, old_info->dfile))
|
if (mi_open_datafile(&info, share, name, old_info->dfile))
|
||||||
goto err;
|
goto err;
|
||||||
errpos=5;
|
errpos=5;
|
||||||
have_rtree= old_info->rtree_recursion_state != NULL;
|
have_rtree= old_info->rtree_recursion_state != NULL;
|
||||||
@ -1217,13 +1224,30 @@ The argument file_to_dup is here for the future if there would on some OS
|
|||||||
exist a dup()-like call that would give us two different file descriptors.
|
exist a dup()-like call that would give us two different file descriptors.
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
|
|
||||||
int mi_open_datafile(MI_INFO *info, MYISAM_SHARE *share,
|
int mi_open_datafile(MI_INFO *info, MYISAM_SHARE *share, const char *org_name,
|
||||||
File file_to_dup __attribute__((unused)))
|
File file_to_dup __attribute__((unused)))
|
||||||
{
|
{
|
||||||
|
char *data_name= share->data_file_name;
|
||||||
|
char real_data_name[FN_REFLEN];
|
||||||
|
|
||||||
|
if (org_name)
|
||||||
|
{
|
||||||
|
fn_format(real_data_name,org_name,"",MI_NAME_DEXT,4);
|
||||||
|
if (my_is_symlink(real_data_name))
|
||||||
|
{
|
||||||
|
if (my_realpath(real_data_name, real_data_name, MYF(0)) ||
|
||||||
|
(*myisam_test_invalid_symlink)(real_data_name))
|
||||||
|
{
|
||||||
|
my_errno= HA_WRONG_CREATE_OPTION;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
data_name= real_data_name;
|
||||||
|
}
|
||||||
|
}
|
||||||
#ifdef USE_RAID
|
#ifdef USE_RAID
|
||||||
if (share->base.raid_type)
|
if (share->base.raid_type)
|
||||||
{
|
{
|
||||||
info->dfile=my_raid_open(share->data_file_name,
|
info->dfile=my_raid_open(data_name,
|
||||||
share->mode | O_SHARE,
|
share->mode | O_SHARE,
|
||||||
share->base.raid_type,
|
share->base.raid_type,
|
||||||
share->base.raid_chunks,
|
share->base.raid_chunks,
|
||||||
@ -1232,8 +1256,7 @@ int mi_open_datafile(MI_INFO *info, MYISAM_SHARE *share,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
info->dfile=my_open(share->data_file_name, share->mode | O_SHARE,
|
info->dfile=my_open(data_name, share->mode | O_SHARE, MYF(MY_WME));
|
||||||
MYF(MY_WME));
|
|
||||||
return info->dfile >= 0 ? 0 : 1;
|
return info->dfile >= 0 ? 0 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,6 +41,15 @@ my_off_t myisam_max_temp_length= MAX_FILE_SIZE;
|
|||||||
ulong myisam_bulk_insert_tree_size=8192*1024;
|
ulong myisam_bulk_insert_tree_size=8192*1024;
|
||||||
ulong myisam_data_pointer_size=4;
|
ulong myisam_data_pointer_size=4;
|
||||||
|
|
||||||
|
|
||||||
|
static int always_valid(const char *filename __attribute__((unused)))
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int (*myisam_test_invalid_symlink)(const char *filename)= always_valid;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
read_vec[] is used for converting between P_READ_KEY.. and SEARCH_
|
read_vec[] is used for converting between P_READ_KEY.. and SEARCH_
|
||||||
Position is , == , >= , <= , > , <
|
Position is , == , >= , <= , > , <
|
||||||
|
@ -1033,7 +1033,7 @@ static int myisamchk(MI_CHECK *param, char * filename)
|
|||||||
error|=change_to_newfile(filename,MI_NAME_DEXT,DATA_TMP_EXT,
|
error|=change_to_newfile(filename,MI_NAME_DEXT,DATA_TMP_EXT,
|
||||||
raid_chunks,
|
raid_chunks,
|
||||||
MYF(0));
|
MYF(0));
|
||||||
if (mi_open_datafile(info,info->s, -1))
|
if (mi_open_datafile(info,info->s, NULL, -1))
|
||||||
error=1;
|
error=1;
|
||||||
param->out_flag&= ~O_NEW_DATA; /* We are using new datafile */
|
param->out_flag&= ~O_NEW_DATA; /* We are using new datafile */
|
||||||
param->read_cache.file=info->dfile;
|
param->read_cache.file=info->dfile;
|
||||||
|
@ -756,7 +756,9 @@ void mi_disable_non_unique_index(MI_INFO *info, ha_rows rows);
|
|||||||
|
|
||||||
extern MI_INFO *test_if_reopen(char *filename);
|
extern MI_INFO *test_if_reopen(char *filename);
|
||||||
my_bool check_table_is_closed(const char *name, const char *where);
|
my_bool check_table_is_closed(const char *name, const char *where);
|
||||||
int mi_open_datafile(MI_INFO *info, MYISAM_SHARE *share, File file_to_dup);
|
int mi_open_datafile(MI_INFO *info, MYISAM_SHARE *share, const char *orn_name,
|
||||||
|
File file_to_dup);
|
||||||
|
|
||||||
int mi_open_keyfile(MYISAM_SHARE *share);
|
int mi_open_keyfile(MYISAM_SHARE *share);
|
||||||
void mi_setup_functions(register MYISAM_SHARE *share);
|
void mi_setup_functions(register MYISAM_SHARE *share);
|
||||||
my_bool mi_dynmap_file(MI_INFO *info, my_off_t size);
|
my_bool mi_dynmap_file(MI_INFO *info, my_off_t size);
|
||||||
|
@ -389,7 +389,7 @@ int rtree_get_first(MI_INFO *info, uint keynr, uint key_length)
|
|||||||
info->rtree_recursion_depth = -1;
|
info->rtree_recursion_depth = -1;
|
||||||
info->buff_used = 1;
|
info->buff_used = 1;
|
||||||
|
|
||||||
return rtree_get_req(info, &keyinfo[keynr], key_length, root, 0);
|
return rtree_get_req(info, keyinfo, key_length, root, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -436,7 +436,7 @@ int rtree_get_next(MI_INFO *info, uint keynr, uint key_length)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return rtree_get_req(info, &keyinfo[keynr], key_length, root, 0);
|
return rtree_get_req(info, keyinfo, key_length, root, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user