Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
73ca08a4
Commit
73ca08a4
authored
May 31, 2007
by
lars/lthalmann@dl145j.mysql.com
Browse files
Options
Browse Files
Download
Plain Diff
Merge lthalmann@bk-internal.mysql.com:/home/bk/mysql-5.1-runtime
into mysql.com:/nfsdisk1/lars/bk/mysql-5.1-new-rpl
parents
b2d39478
4835204d
Changes
31
Hide whitespace changes
Inline
Side-by-side
Showing
31 changed files
with
1091 additions
and
153 deletions
+1091
-153
client/mysqlbinlog.cc
client/mysqlbinlog.cc
+15
-0
configure.in
configure.in
+1
-1
include/config-win.h
include/config-win.h
+3
-0
mysql-test/extra/rpl_tests/rpl_loaddata.test
mysql-test/extra/rpl_tests/rpl_loaddata.test
+12
-0
mysql-test/mysql-test-run.pl
mysql-test/mysql-test-run.pl
+21
-7
mysql-test/r/binlog_killed.result
mysql-test/r/binlog_killed.result
+12
-0
mysql-test/r/rpl_incident.result
mysql-test/r/rpl_incident.result
+2
-3
mysql-test/r/rpl_loaddata.result
mysql-test/r/rpl_loaddata.result
+4
-0
mysql-test/r/rpl_ndb_basic.result
mysql-test/r/rpl_ndb_basic.result
+2
-2
mysql-test/r/rpl_row_mysqlbinlog.result
mysql-test/r/rpl_row_mysqlbinlog.result
+76
-0
mysql-test/r/rpl_row_until.result
mysql-test/r/rpl_row_until.result
+140
-12
mysql-test/r/xml.result
mysql-test/r/xml.result
+128
-0
mysql-test/t/binlog_killed.test
mysql-test/t/binlog_killed.test
+248
-0
mysql-test/t/disabled.def
mysql-test/t/disabled.def
+1
-2
mysql-test/t/rpl_incident.test
mysql-test/t/rpl_incident.test
+3
-4
mysql-test/t/rpl_ndb_basic.test
mysql-test/t/rpl_ndb_basic.test
+1
-1
mysql-test/t/rpl_ndb_ddl.test
mysql-test/t/rpl_ndb_ddl.test
+1
-0
mysql-test/t/rpl_row_mysqlbinlog.test
mysql-test/t/rpl_row_mysqlbinlog.test
+67
-40
mysql-test/t/rpl_row_until.test
mysql-test/t/rpl_row_until.test
+4
-4
mysql-test/t/xml.test
mysql-test/t/xml.test
+89
-0
sql/item_xmlfunc.cc
sql/item_xmlfunc.cc
+81
-16
sql/log_event.cc
sql/log_event.cc
+55
-12
sql/log_event.h
sql/log_event.h
+2
-1
sql/sql_class.cc
sql/sql_class.cc
+5
-4
sql/sql_class.h
sql/sql_class.h
+37
-28
sql/sql_insert.cc
sql/sql_insert.cc
+28
-2
sql/sql_load.cc
sql/sql_load.cc
+3
-3
sql/sql_update.cc
sql/sql_update.cc
+31
-0
storage/heap/hp_hash.c
storage/heap/hp_hash.c
+17
-8
strings/CMakeLists.txt
strings/CMakeLists.txt
+1
-1
strings/my_vsnprintf.c
strings/my_vsnprintf.c
+1
-2
No files found.
client/mysqlbinlog.cc
View file @
73ca08a4
...
...
@@ -635,6 +635,7 @@ Create_file event for file_id: %u\n",exv->file_id);
print_event_info
->
common_header_len
=
glob_description_event
->
common_header_len
;
ev
->
print
(
result_file
,
print_event_info
);
ev
->
temp_buf
=
0
;
// as the event ref is zeroed
/*
We don't want this event to be deleted now, so let's hide it (I
(Guilhem) should later see if this triggers a non-serious Valgrind
...
...
@@ -682,8 +683,16 @@ Begin_load_query event for file_id: %u\n", exlq->file_id);
end:
rec_count
++
;
/*
Destroy the log_event object. If reading from a remote host,
set the temp_buf to NULL so that memory isn't freed twice.
*/
if
(
ev
)
{
if
(
remote_opt
)
ev
->
temp_buf
=
0
;
delete
ev
;
}
DBUG_RETURN
(
0
);
}
...
...
@@ -1172,6 +1181,12 @@ could be out of memory");
error
=
1
;
goto
err
;
}
/*
If reading from a remote host, ensure the temp_buf for the
Log_event class is pointing to the incoming stream.
*/
if
(
remote_opt
)
ev
->
register_temp_buf
((
char
*
)
net
->
read_pos
+
1
);
Log_event_type
type
=
ev
->
get_type_code
();
if
(
glob_description_event
->
binlog_version
>=
3
||
...
...
configure.in
View file @
73ca08a4
...
...
@@ -10,7 +10,7 @@ AC_CANONICAL_SYSTEM
#
# When changing major version number please also check switch statement
# in mysqlbinlog::check_master_version().
AM_INIT_AUTOMAKE
(
mysql, 5.1.
19
-beta
)
AM_INIT_AUTOMAKE
(
mysql, 5.1.
20
-beta
)
AM_CONFIG_HEADER
(
config.h
)
PROTOCOL_VERSION
=
10
...
...
include/config-win.h
View file @
73ca08a4
...
...
@@ -350,7 +350,10 @@ inline double ulonglong2double(ulonglong value)
#define SPRINTF_RETURNS_INT
#define HAVE_SETFILEPOINTER
#define HAVE_VIO_READ_BUFF
#if defined(_MSC_VER) && _MSC_VER >= 1400
/* strnlen() appeared in Studio 2005 */
#define HAVE_STRNLEN
#endif
#define HAVE_WINSOCK2
#define strcasecmp stricmp
...
...
mysql-test/extra/rpl_tests/rpl_loaddata.test
View file @
73ca08a4
...
...
@@ -15,6 +15,7 @@
# Last_slave_errno in SHOW SLAVE STATUS (1st and 3rd commands did not: bug 986)
--
source
include
/
master
-
slave
.
inc
source
include
/
have_innodb
.
inc
;
connection
slave
;
reset
master
;
...
...
@@ -156,4 +157,15 @@ drop table t2;
connection
master
;
drop
table
t2
;
drop
table
t1
;
# BUG#17233 LOAD DATA INFILE: failure causes mysqld dbug_assert, binlog not flushed
CREATE
TABLE
t1
(
word
CHAR
(
20
)
NOT
NULL
PRIMARY
KEY
)
ENGINE
=
INNODB
;
--
error
ER_DUP_ENTRY_WITH_KEY_NAME
LOAD
DATA
INFILE
"../std_data_ln/words.dat"
INTO
TABLE
t1
;
--
disable
warnings
DROP
TABLE
IF
EXISTS
t1
;
--
enable
warnings
# End of 4.1 tests
mysql-test/mysql-test-run.pl
View file @
73ca08a4
...
...
@@ -1804,6 +1804,18 @@ sub environment_setup () {
$ENV
{'
CHARSETSDIR
'}
=
$path_charsetsdir
;
$ENV
{'
UMASK
'}
=
"
0660
";
# The octal *string*
$ENV
{'
UMASK_DIR
'}
=
"
0770
";
# The octal *string*
#
# MySQL tests can produce output in various character sets
# (especially, ctype_xxx.test). To avoid confusing Perl
# with output which is incompatible with the current locale
# settings, we reset the current values of LC_ALL and LC_CTYPE to "C".
# For details, please see
# Bug#27636 tests fails if LC_* variables set to *_*.UTF-8
#
$ENV
{'
LC_ALL
'}
=
"
C
";
$ENV
{'
LC_CTYPE
'}
=
"
C
";
$ENV
{'
LC_COLLATE
'}
=
"
C
";
$ENV
{'
USE_RUNNING_SERVER
'}
=
$opt_extern
;
$ENV
{'
MYSQL_TEST_DIR
'}
=
$glob_mysql_test_dir
;
...
...
@@ -3851,13 +3863,15 @@ sub mysqld_arguments ($$$$) {
}
else
{
mtr_add_arg
(
$args
,
"
%s--master-user=root
",
$prefix
);
mtr_add_arg
(
$args
,
"
%s--master-connect-retry=1
",
$prefix
);
mtr_add_arg
(
$args
,
"
%s--master-host=127.0.0.1
",
$prefix
);
mtr_add_arg
(
$args
,
"
%s--master-password=
",
$prefix
);
mtr_add_arg
(
$args
,
"
%s--master-port=%d
",
$prefix
,
$master
->
[
0
]
->
{'
port
'});
# First master
if
(
$mysql_version_id
<
50200
)
{
mtr_add_arg
(
$args
,
"
%s--master-user=root
",
$prefix
);
mtr_add_arg
(
$args
,
"
%s--master-connect-retry=1
",
$prefix
);
mtr_add_arg
(
$args
,
"
%s--master-host=127.0.0.1
",
$prefix
);
mtr_add_arg
(
$args
,
"
%s--master-password=
",
$prefix
);
mtr_add_arg
(
$args
,
"
%s--master-port=%d
",
$prefix
,
$master
->
[
0
]
->
{'
port
'});
# First master
}
my
$slave_server_id
=
2
+
$idx
;
my
$slave_rpl_rank
=
$slave_server_id
;
mtr_add_arg
(
$args
,
"
%s--server-id=%d
",
$prefix
,
$slave_server_id
);
...
...
mysql-test/r/binlog_killed.result
0 → 100644
View file @
73ca08a4
create table t1 (a int auto_increment, b int, PRIMARY KEY (a)) ENGINE=InnoDB;
create table t2 (a int auto_increment, b int, PRIMARY KEY (a)) ENGINE=MyISAM;
create table t3 (a int auto_increment, b int, PRIMARY KEY (a)) ENGINE=InnoDB;
select get_lock("a", 20);
get_lock("a", 20)
1
reset master;
insert into t2 values (null, null), (null, get_lock("a", 10));
select @result /* must be zero either way */;
@result
0
drop table t1,t2,t3;
mysql-test/r/rpl_incident.result
View file @
73ca08a4
...
...
@@ -31,7 +31,7 @@ Master_Host 127.0.0.1
Master_User root
Master_Port MASTER_PORT
Connect_Retry 1
Master_Log_File
master-bin.000002
Master_Log_File
#
Read_Master_Log_Pos #
Relay_Log_File #
Relay_Log_Pos #
...
...
@@ -74,7 +74,7 @@ Master_Host 127.0.0.1
Master_User root
Master_Port MASTER_PORT
Connect_Retry 1
Master_Log_File
master-bin.000002
Master_Log_File
#
Read_Master_Log_Pos #
Relay_Log_File #
Relay_Log_Pos #
...
...
@@ -104,4 +104,3 @@ Master_SSL_Key
Seconds_Behind_Master #
Master_SSL_Verify_Server_Cert No
DROP TABLE t1;
DROP TABLE t1;
mysql-test/r/rpl_loaddata.result
View file @
73ca08a4
...
...
@@ -86,3 +86,7 @@ ERROR 23000: Duplicate entry '2003-03-22' for key 'day'
drop table t2;
drop table t2;
drop table t1;
CREATE TABLE t1 (word CHAR(20) NOT NULL PRIMARY KEY) ENGINE=INNODB;
LOAD DATA INFILE "../std_data_ln/words.dat" INTO TABLE t1;
ERROR 23000: Duplicate entry 'Aarhus' for key 'PRIMARY'
DROP TABLE IF EXISTS t1;
mysql-test/r/rpl_ndb_basic.result
View file @
73ca08a4
...
...
@@ -159,8 +159,8 @@ Replicate_Do_Table
Replicate_Ignore_Table <Replicate_Ignore_Table>
Replicate_Wild_Do_Table
Replicate_Wild_Ignore_Table
Last_Errno
1105
Last_Error
Unknown error
Last_Errno
<Last_Errno>
Last_Error
<Last_Error>
Skip_Counter 0
Exec_Master_Log_Pos <Exec_Master_Log_Pos>
Relay_Log_Space <Relay_Log_Space>
...
...
mysql-test/r/rpl_row_mysqlbinlog.result
View file @
73ca08a4
...
...
@@ -190,6 +190,75 @@ DELIMITER ;
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
--- Test 4 Second Remote test --
DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t3;
stop slave;
reset master;
reset slave;
start slave;
SELECT COUNT(*) from t1;
COUNT(*)
352
SELECT COUNT(*) from t2;
COUNT(*)
500
SELECT COUNT(*) from t3;
COUNT(*)
500
SELECT * FROM t1 ORDER BY word LIMIT 5;
word
Aarhus
Aarhus
Aarhus
Aarhus
Aarhus
SELECT * FROM t2 ORDER BY id LIMIT 5;
id
1
2
3
4
5
SELECT c1, c3, c4, c5 FROM t3 ORDER BY c1 LIMIT 5;
c1 c3 c4 c5
1 2006-02-22 00:00:00 Tested in Texas 2.2
2 2006-02-22 00:00:00 Tested in Texas 4.4
3 2006-02-22 00:00:00 Tested in Texas 6.6
4 2006-02-22 00:00:00 Tested in Texas 8.8
5 2006-02-22 00:00:00 Tested in Texas 11
SELECT COUNT(*) from t1;
COUNT(*)
352
SELECT COUNT(*) from t2;
COUNT(*)
500
SELECT COUNT(*) from t3;
COUNT(*)
500
SELECT * FROM t1 ORDER BY word LIMIT 5;
word
Aarhus
Aarhus
Aarhus
Aarhus
Aarhus
SELECT * FROM t2 ORDER BY id LIMIT 5;
id
1
2
3
4
5
SELECT c1, c3, c4, c5 FROM t3 ORDER BY c1 LIMIT 5;
c1 c3 c4 c5
1 2006-02-22 00:00:00 Tested in Texas 2.2
2 2006-02-22 00:00:00 Tested in Texas 4.4
3 2006-02-22 00:00:00 Tested in Texas 6.6
4 2006-02-22 00:00:00 Tested in Texas 8.8
5 2006-02-22 00:00:00 Tested in Texas 11
--- Test 5 LOAD DATA --
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
...
...
@@ -273,4 +342,11 @@ HEX(f)
835C
--- Test cleanup --
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (a INT NOT NULL KEY, b INT);
INSERT INTO t1 VALUES(1,1);
SELECT * FROM t1;
a b
1 1
FLUSH LOGS;
DROP TABLE IF EXISTS t1, t2, t3, t04, t05, t4, t5;
mysql-test/r/rpl_row_until.result
View file @
73ca08a4
...
...
@@ -19,9 +19,41 @@ n
2
3
4
show slave status;
Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert
# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 744 slave-relay-bin.000004 # master-bin.000001 # No 0 0 315 # Master master-bin.000001 311 No # No
SHOW SLAVE STATUS;;
Slave_IO_State #
Master_Host 127.0.0.1
Master_User root
Master_Port MASTER_MYPORT
Connect_Retry 1
Master_Log_File master-bin.000001
Read_Master_Log_Pos 744
Relay_Log_File slave-relay-bin.000004
Relay_Log_Pos #
Relay_Master_Log_File master-bin.000001
Slave_IO_Running #
Slave_SQL_Running No
Replicate_Do_DB
Replicate_Ignore_DB
Replicate_Do_Table
Replicate_Ignore_Table
Replicate_Wild_Do_Table
Replicate_Wild_Ignore_Table
Last_Errno 0
Last_Error
Skip_Counter 0
Exec_Master_Log_Pos 315
Relay_Log_Space #
Until_Condition Master
Until_Log_File master-bin.000001
Until_Log_Pos 311
Master_SSL_Allowed No
Master_SSL_CA_File
Master_SSL_CA_Path
Master_SSL_Cert
Master_SSL_Cipher
Master_SSL_Key
Seconds_Behind_Master #
Master_SSL_Verify_Server_Cert No
start slave until master_log_file='master-no-such-bin.000001', master_log_pos=291;
select * from t1;
n
...
...
@@ -29,23 +61,119 @@ n
2
3
4
show slave status;
Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert
# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 744 slave-relay-bin.000004 # master-bin.000001 # No 0 0 315 # Master master-no-such-bin.000001 291 No # No
SHOW SLAVE STATUS;;
Slave_IO_State #
Master_Host 127.0.0.1
Master_User root
Master_Port MASTER_MYPORT
Connect_Retry 1
Master_Log_File master-bin.000001
Read_Master_Log_Pos 744
Relay_Log_File slave-relay-bin.000004
Relay_Log_Pos #
Relay_Master_Log_File master-bin.000001
Slave_IO_Running #
Slave_SQL_Running No
Replicate_Do_DB
Replicate_Ignore_DB
Replicate_Do_Table
Replicate_Ignore_Table
Replicate_Wild_Do_Table
Replicate_Wild_Ignore_Table
Last_Errno 0
Last_Error
Skip_Counter 0
Exec_Master_Log_Pos 315
Relay_Log_Space #
Until_Condition Master
Until_Log_File master-no-such-bin.000001
Until_Log_Pos 291
Master_SSL_Allowed No
Master_SSL_CA_File
Master_SSL_CA_Path
Master_SSL_Cert
Master_SSL_Cipher
Master_SSL_Key
Seconds_Behind_Master #
Master_SSL_Verify_Server_Cert No
start slave until relay_log_file='slave-relay-bin.000004', relay_log_pos=728;
select * from t2;
n
1
2
show slave status;
Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert
# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 744 slave-relay-bin.000004 # master-bin.000001 # No 0 0 590 # Relay slave-relay-bin.000004 728 No # No
SHOW SLAVE STATUS;;
Slave_IO_State #
Master_Host 127.0.0.1
Master_User root
Master_Port MASTER_MYPORT
Connect_Retry 1
Master_Log_File master-bin.000001
Read_Master_Log_Pos 744
Relay_Log_File slave-relay-bin.000004
Relay_Log_Pos #
Relay_Master_Log_File master-bin.000001
Slave_IO_Running #
Slave_SQL_Running No
Replicate_Do_DB
Replicate_Ignore_DB
Replicate_Do_Table
Replicate_Ignore_Table
Replicate_Wild_Do_Table
Replicate_Wild_Ignore_Table
Last_Errno 0
Last_Error
Skip_Counter 0
Exec_Master_Log_Pos 590
Relay_Log_Space #
Until_Condition Relay
Until_Log_File slave-relay-bin.000004
Until_Log_Pos 728
Master_SSL_Allowed No
Master_SSL_CA_File
Master_SSL_CA_Path
Master_SSL_Cert
Master_SSL_Cipher
Master_SSL_Key
Seconds_Behind_Master #
Master_SSL_Verify_Server_Cert No
start slave;
stop slave;
start slave until master_log_file='master-bin.000001', master_log_pos=740;
show slave status;
Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert
# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 744 slave-relay-bin.000004 # master-bin.000001 Yes No 0 0 744 # Master master-bin.000001 740 No # No
SHOW SLAVE STATUS;;
Slave_IO_State #
Master_Host 127.0.0.1
Master_User root
Master_Port MASTER_MYPORT
Connect_Retry 1
Master_Log_File master-bin.000001
Read_Master_Log_Pos 744
Relay_Log_File slave-relay-bin.000004
Relay_Log_Pos #
Relay_Master_Log_File master-bin.000001
Slave_IO_Running Yes
Slave_SQL_Running No
Replicate_Do_DB
Replicate_Ignore_DB
Replicate_Do_Table
Replicate_Ignore_Table
Replicate_Wild_Do_Table
Replicate_Wild_Ignore_Table
Last_Errno 0
Last_Error
Skip_Counter 0
Exec_Master_Log_Pos 744
Relay_Log_Space #
Until_Condition Master
Until_Log_File master-bin.000001
Until_Log_Pos 740
Master_SSL_Allowed No
Master_SSL_CA_File
Master_SSL_CA_Path
Master_SSL_Cert
Master_SSL_Cipher
Master_SSL_Key
Seconds_Behind_Master #
Master_SSL_Verify_Server_Cert No
start slave until master_log_file='master-bin', master_log_pos=561;
ERROR HY000: Incorrect parameter or combination of parameters for START SLAVE UNTIL
start slave until master_log_file='master-bin.000001', master_log_pos=561, relay_log_pos=12;
...
...
mysql-test/r/xml.result
View file @
73ca08a4
...
...
@@ -547,6 +547,13 @@ UpdateXML(@xml, '/a/b/@bb2', '')
select UpdateXML(@xml, '/a/b/@bb2', 'bb3="bb3"');
UpdateXML(@xml, '/a/b/@bb2', 'bb3="bb3"')
<a aa1="aa1" aa2="aa2"><b bb1="bb1" bb3="bb3">bb</b></a>
select updatexml('<div><div><span>1</span><span>2</span></div></div>',
'/','<tr><td>1</td><td>2</td></tr>') as upd1;
upd1
<tr><td>1</td><td>2</td></tr>
select updatexml('', '/', '') as upd2;
upd2
SET @xml= '<order><clerk>lesser wombat</clerk></order>';
select extractvalue(@xml,'order/clerk');
extractvalue(@xml,'order/clerk')
...
...
@@ -884,3 +891,124 @@ test
select ExtractValue('<a><self>test</self></a>', '/a/self');
ExtractValue('<a><self>test</self></a>', '/a/self')
test
set @i=1;
select ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]')
b1
set @i=2;
select ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]')
b2
set @i=NULL;
select ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]')
CREATE PROCEDURE spxml(xml VARCHAR(128))
BEGIN
DECLARE c INT;
DECLARE i INT DEFAULT 1;
SET c= ExtractValue(xml,'count(/a/b)');
SET @i= c;
WHILE i <= c DO
BEGIN
SELECT i, @i, ExtractValue(xml,'/a/b[$i]'), ExtractValue(xml,'/a/b[$@i]');
SET i= i + 1;
SET @i= @i - 1;
END;
END WHILE;
END|
call spxml('<a><b>b1</b><b>b2</b><b>b3</b></a>');
i @i ExtractValue(xml,'/a/b[$i]') ExtractValue(xml,'/a/b[$@i]')
1 3 b1 b3
i @i ExtractValue(xml,'/a/b[$i]') ExtractValue(xml,'/a/b[$@i]')
2 2 b2 b2
i @i ExtractValue(xml,'/a/b[$i]') ExtractValue(xml,'/a/b[$@i]')
3 1 b3 b1
drop procedure spxml;
Multiple matches, but no index specification
SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b');
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b')
b1 b2
No matches
SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/c');
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/c')
Index out of range
SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[-1]');
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[-1]')
SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[10]');
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[10]')
With string-to-number conversion
SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["1"]');
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["1"]')
b1
SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["1 and string"]');
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["1 and string"]')
b1
Warnings:
Warning 1292 Truncated incorrect INTEGER value: '1 and string"]'
Warning 1292 Truncated incorrect INTEGER value: '1 and string"]'
SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["string and 1"]');
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["string and 1"]')
Warnings:
Warning 1292 Truncated incorrect INTEGER value: 'string and 1"]'
Warning 1292 Truncated incorrect INTEGER value: 'string and 1"]'
SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["string"]');
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b["string"]')
Warnings:
Warning 1292 Truncated incorrect INTEGER value: 'string"]'
Warning 1292 Truncated incorrect INTEGER value: 'string"]'
String-to-number conversion from a user variable
SET @i='1';
SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]')
b1
SET @i='1 and string';
SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]')
b1
SET @i='string and 1';
SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]')
SET @i='string';
SELECT ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]');
ExtractValue('<a><b>b1</b><b>b2</b></a>','/a/b[$@i]')
String-to-number conversion with a CHAR SP variable
CREATE PROCEDURE spxml(xml VARCHAR(128), i CHAR(16))
BEGIN
SELECT ExtractValue(xml,'/a/b[$i]');
END|
CALL spxml('<a><b>b1</b><b>b2</b></a>', '1');
ExtractValue(xml,'/a/b[$i]')
b1
CALL spxml('<a><b>b1</b><b>b2</b></a>', '1 and string');
ExtractValue(xml,'/a/b[$i]')
b1
Warnings:
Warning 1292 Truncated incorrect INTEGER value: '1 and string '
Warning 1292 Truncated incorrect INTEGER value: '1 and string '
CALL spxml('<a><b>b1</b><b>b2</b></a>', 'string and 1');
ExtractValue(xml,'/a/b[$i]')
Warnings:
Warning 1292 Truncated incorrect INTEGER value: 'string and 1 '
Warning 1292 Truncated incorrect INTEGER value: 'string and 1 '
CALL spxml('<a><b>b1</b><b>b2</b></a>', 'string');
ExtractValue(xml,'/a/b[$i]')
Warnings:
Warning 1292 Truncated incorrect INTEGER value: 'string '
Warning 1292 Truncated incorrect INTEGER value: 'string '
DROP PROCEDURE spxml;
select UpdateXML('<a>a</a>',repeat('a b ',1000),'');
ERROR HY000: XPATH syntax error: 'b a b a b a b a b a b a b a b a '
select ExtractValue('<a>a</a>', '/a[@x=@y0123456789_0123456789_0123456789_0123456789]');
ERROR HY000: XPATH error: comparison of two nodesets is not supported: '=@y0123456789_0123456789_0123456'
select ExtractValue('<a>a</a>', '/a[@x=$y0123456789_0123456789_0123456789_0123456789]');
ERROR HY000: Unknown XPATH variable at: '$y0123456789_0123456789_01234567'
mysql-test/t/binlog_killed.test
0 → 100644
View file @
73ca08a4
--
source
include
/
have_innodb
.
inc
--
source
include
/
have_binlog_format_mixed_or_statement
.
inc
--
source
include
/
not_embedded
.
inc
###
### bug#22725 : incorrect killed error in binlogged query
###
connect
(
con1
,
localhost
,
root
,,);
connect
(
con2
,
localhost
,
root
,,);
create
table
t1
(
a
int
auto_increment
,
b
int
,
PRIMARY
KEY
(
a
))
ENGINE
=
InnoDB
;
create
table
t2
(
a
int
auto_increment
,
b
int
,
PRIMARY
KEY
(
a
))
ENGINE
=
MyISAM
;
create
table
t3
(
a
int
auto_increment
,
b
int
,
PRIMARY
KEY
(
a
))
ENGINE
=
InnoDB
;
#
# effective test for bug#22725
#
connection
con1
;
select
get_lock
(
"a"
,
20
);
connection
con2
;
let
$ID
=
`select connection_id()`
;
reset
master
;
send
insert
into
t2
values
(
null
,
null
),
(
null
,
get_lock
(
"a"
,
10
));
connection
con1
;
disable_abort_on_error
;
disable_query_log
;
disable_result_log
;
eval
kill
query
$ID
;
connection
con2
;
--
error
0
,
ER_QUERY_INTERRUPTED
reap
;
let
$rows
=
`select count(*) from t2 /* must be 2 or 0 */`
;
--
exec
$MYSQL_BINLOG
--
start
-
position
=
134
$MYSQLTEST_VARDIR
/
log
/
master
-
bin
.
000001
>
$MYSQLTEST_VARDIR
/
tmp
/
kill_query_calling_sp
.
binlog
--
replace_result
$MYSQLTEST_VARDIR
MYSQLTEST_VARDIR
eval
select
(
@
a
:=
load_file
(
"
$MYSQLTEST_VARDIR
/tmp/kill_query_calling_sp.binlog"
))
is
not
null
;
--
replace_result
$MYSQL_TEST_DIR
MYSQL_TEST_DIR
let
$error_code
=
`select @a like "%#%error_code=0%" /* must return 1 or 0*/`
;
let
$insert_binlogged
=
`select @a like "%insert into%" /* must return 1 or 0 */`
;
eval
set
@
result
=
$rows
-
$error_code
-
$insert_binlogged
;
enable_abort_on_error
;
enable_query_log
;
enable_result_log
;
select
@
result
/* must be zero either way */
;
# the functions are either *insensitive* to killing or killing can cause
# strange problmes with the error propagation out of SF's stack
# Bug#27563, Bug#27565, BUG#24971
#
# TODO: use if's block as regression test for the bugs or remove
#
if
(
0
)
{
delimiter
|
;
create
function
bug27563
()
RETURNS
int
(
11
)
DETERMINISTIC
begin
select
get_lock
(
"a"
,
10
)
into
@
a
;
return
1
;
end
|
delimiter
;
|
# the function is sensitive to killing requiring innodb though with wrong client error
# TO FIX in BUG#27565; TODO: remove --error 1105 afterwards
delimiter
|
;
create
function
bug27565
()
RETURNS
int
(
11
)
DETERMINISTIC
begin
select
a
from
t1
where
a
=
1
into
@
a
for
update
;
return
1
;
end
|
delimiter
;
|
reset
master
;
### ta table case: killing causes rollback
# A. autocommit ON
connection
con1
;
select
get_lock
(
"a"
,
20
);
connection
con2
;
let
$ID
=
`select connection_id()`
;
send
insert
into
t1
values
(
bug27563
(),
1
);
connection
con1
;
eval
kill
query
$ID
;
connection
con2
;
# todo (re-record test): after bugs 27563,27565 got fixed affected rows will report zero
--
enable_info
# todo: remove 0 return after fixing Bug#27563
--
error
0
,
ER_QUERY_INTERRUPTED
reap
;
### pb: wrong error
--
disable_info
###--replace_column 2 # 5 #
### show binlog events from 98 /* nothing in binlog unless Bug#27563 */;
show
master
status
/* must be only FD event unless Bug#27563 */
;
select
count
(
*
)
from
t1
/* must be zero unless Bug#27563 */
;
# M. multi-statement-ta
connection
con2
;
let
$ID
=
`select connection_id()`
;
begin
;
send
insert
into
t1
values
(
bug27563
(),
1
);
connection
con1
;
eval
kill
query
$ID
;
connection
con2
;
# todo (re-record test): after bugs 27563,27565 got fixed affected rows will report zero
--
enable_info
# todo: remove 0 return after fixing Bug#27563
--
error
0
,
ER_QUERY_INTERRUPTED
reap
;
--
disable_info
select
count
(
*
)
from
t1
/* must be zero unless Bug#27563 */
;
commit
;
### non-ta table case: killing must be recorded in binlog
reset
master
;
connection
con2
;
let
$ID
=
`select connection_id()`
;
send
insert
into
t2
values
(
bug27563
(),
1
);
connection
con1
;
eval
kill
query
$ID
;
connection
con2
;
# todo: remove 0 return after fixing Bug#27563
--
error
0
,
ER_QUERY_INTERRUPTED
reap
;
select
count
(
*
)
from
t2
/* must be one */
;
#show binlog events from 98 /* must have the insert on non-ta table */;
show
master
status
/* must have the insert event more to FD */
;
# the value of the error flag of KILLED_QUERY is tested further
connection
con1
;
select
RELEASE_LOCK
(
"a"
);
### test with effective killing of SF()
delete
from
t1
;
delete
from
t2
;
insert
into
t1
values
(
1
,
1
);
insert
into
t2
values
(
1
,
1
);
#
# Bug#27565
# test where KILL is propagated as error to the top level
# still another bug with the error message to the user
# todo: fix reexecute the result file after fixing
#
begin
;
update
t1
set
b
=
0
where
a
=
1
;
connection
con2
;
let
$ID
=
`select connection_id()`
;
send
update
t2
set
b
=
bug27565
()
-
1
where
a
=
1
;
connection
con1
;
eval
kill
query
$ID
;
commit
;
connection
con2
;
# todo: fix Bug #27565 killed query of SF() is not reported correctly and
# remove 1105 (wrong)
#--error ER_QUERY_INTERRUPTED
--
error
1105
,
ER_QUERY_INTERRUPTED
reap
;
### pb: wrong error
select
*
from
t1
/* must be: (1,0) */
;
select
*
from
t2
/* must be as before: (1,1) */
;
## bug#22725 with effective and propagating killing
#
# top-level ta-table
connection
con1
;
delete
from
t3
;
reset
master
;
begin
;
update
t1
set
b
=
0
where
a
=
1
;
connection
con2
;
let
$ID
=
`select connection_id()`
;
# the query won't perform completely since the function gets interrupted
send
insert
into
t3
values
(
0
,
0
),(
1
,
bug27565
());
connection
con1
;
eval
kill
query
$ID
;
rollback
;
connection
con2
;
# todo: fix Bug #27565 killed query of SF() is not reported correctly and
# remove 1105 (wrong)
#--error ER_QUERY_INTERRUPTED
--
error
1105
,
ER_QUERY_INTERRUPTED
reap
;
### pb: wrong error
select
count
(
*
)
from
t3
/* must be zero */
;
show
master
status
/* nothing in binlog */
;
# top-level non-ta-table
connection
con1
;
delete
from
t2
;
reset
master
;
begin
;
update
t1
set
b
=
0
where
a
=
1
;
connection
con2
;
let
$ID
=
`select connection_id()`
;
# the query won't perform completely since the function gets intrurrupted
send
insert
into
t2
values
(
0
,
0
),(
1
,
bug27565
())
/* non-ta t2 */
;
connection
con1
;
eval
kill
query
$ID
;
rollback
;
connection
con2
;
# todo: fix Bug #27565 killed query of SF() is not reported correctly and
# remove 1105 (wrong)
#--error ER_QUERY_INTERRUPTED
--
error
1105
,
ER_QUERY_INTERRUPTED
reap
;
### pb: wrong error
select
count
(
*
)
from
t2
/* count must be one */
;
show
master
status
/* insert into non-ta must be in binlog */
;
drop
function
bug27563
;
drop
function
bug27565
;
}
system
rm
$MYSQLTEST_VARDIR
/
tmp
/
kill_query_calling_sp
.
binlog
;
drop
table
t1
,
t2
,
t3
;
mysql-test/t/disabled.def
View file @
73ca08a4
...
...
@@ -27,11 +27,10 @@ rpl_ndb_circular_simplex : BUG#27972 2007-04-20 mats Slave cannot start where it
rpl_ndb_2innodb : BUG#19227 2006-04-20 pekka pk delete apparently not replicated
rpl_ndb_2myisam : BUG#19227 Seems to pass currently
rpl_ndb_dd_partitions : BUG#19259 2006-04-21 rpl_ndb_dd_partitions fails on s/AMD
rpl_ndb_ddl : BUG#18946 result file needs update + test needs to checked
rpl_ddl : BUG#26418 2007-03-01 mleich Slave out of sync after CREATE/DROP TEMPORARY TABLE + ROLLBACK on master
rpl_ndb_innodb2ndb : Bug #19710 Cluster replication to partition table fails on DELETE FROM statement
rpl_ndb_myisam2ndb : Bug #19710 Cluster replication to partition table fails on DELETE FROM statement
rpl_row_blob_innodb : BUG#18980 2006-04-10 kent Test fails randomly
#
rpl_row_blob_innodb : BUG#18980 2006-04-10 kent Test fails randomly
# the below testcase have been reworked to avoid the bug, test contains comment, keep bug open
#ndb_binlog_ddl_multi : BUG#18976 2006-04-10 kent CRBR: multiple binlog, second binlog may miss schema log events
...
...
mysql-test/t/rpl_incident.test
View file @
73ca08a4
...
...
@@ -22,7 +22,7 @@ connection slave;
SELECT
*
FROM
t1
;
--
replace_result
$MASTER_MYPORT
MASTER_PORT
--
replace_column
1
# 7 # 8 # 9 # 22 # 23 # 33 #
--
replace_column
1
#
6 #
7 # 8 # 9 # 22 # 23 # 33 #
--
query_vertical
SHOW
SLAVE
STATUS
SET
GLOBAL
SQL_SLAVE_SKIP_COUNTER
=
1
;
...
...
@@ -34,10 +34,9 @@ START SLAVE;
SELECT
*
FROM
t1
;
--
replace_result
$MASTER_MYPORT
MASTER_PORT
--
replace_column
1
# 7 # 8 # 9 # 22 # 23 # 33 #
--
replace_column
1
#
6 #
7 # 8 # 9 # 22 # 23 # 33 #
--
query_vertical
SHOW
SLAVE
STATUS
DROP
TABLE
t1
;
connection
master
;
DROP
TABLE
t1
;
--
sync_slave_with_master
mysql-test/t/rpl_ndb_basic.test
View file @
73ca08a4
...
...
@@ -197,7 +197,7 @@ UPDATE t1 SET `nom`="DEAD" WHERE `nid`=1;
--
connection
slave
--
echo
****
On
Slave
****
--
replace_result
$MASTER_MYPORT
MASTER_PORT
--
replace_column
1
<
Slave_IO_State
>
7
<
Read_Master_Log_Pos
>
8
<
Relay_Log_File
>
9
<
Relay_Log_Pos
>
16
<
Replicate_Ignore_Table
>
22
<
Exec_Master_Log_Pos
>
23
<
Relay_Log_Space
>
33
<
Seconds_Behind_Master
>
--
replace_column
1
<
Slave_IO_State
>
7
<
Read_Master_Log_Pos
>
8
<
Relay_Log_File
>
9
<
Relay_Log_Pos
>
16
<
Replicate_Ignore_Table
>
19
<
Last_Errno
>
20
<
Last_Error
>
22
<
Exec_Master_Log_Pos
>
23
<
Relay_Log_Space
>
33
<
Seconds_Behind_Master
>
--
query_vertical
SHOW
SLAVE
STATUS
;
# now set max retries high enough to succeed, and start slave again
...
...
mysql-test/t/rpl_ndb_ddl.test
View file @
73ca08a4
...
...
@@ -24,6 +24,7 @@
#
--
source
include
/
master
-
slave
.
inc
--
source
include
/
have_binlog_format_row
.
inc
--
source
include
/
have_ndb
.
inc
let
$engine_type
=
NDB
;
let
$temp_engine_type
=
MEMORY
;
...
...
mysql-test/t/rpl_row_mysqlbinlog.test
View file @
73ca08a4
...
...
@@ -183,67 +183,67 @@ select "--- Test 3 First Remote test --" as "";
--
exec
$MYSQL_BINLOG
--
short
-
form
--
local
-
load
=
$MYSQLTEST_VARDIR
/
tmp
/
--
read
-
from
-
remote
-
server
--
user
=
root
--
host
=
127.0
.
0.1
--
port
=
$MASTER_MYPORT
master
-
bin
.
000001
# This part is disabled due to bug #17654
################### Start Bug 17654 ######################
#--disable_query_log
#select "--- Test 4 Second Remote test --" as "";
#--enable_query_log
#--exec $MYSQL_BINLOG --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000001 > $MYSQLTEST_VARDIR/tmp/remote.sql
#--exec $MYSQL_BINLOG --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000002 >> $MYSQLTEST_VARDIR/tmp/remote.sql
--
disable_query_log
select
"--- Test 4 Second Remote test --"
as
""
;
--
enable_query_log
--
exec
$MYSQL_BINLOG
--
read
-
from
-
remote
-
server
--
user
=
root
--
host
=
127.0
.
0.1
--
port
=
$MASTER_MYPORT
master
-
bin
.
000001
>
$MYSQLTEST_VARDIR
/
tmp
/
remote
.
sql
--
exec
$MYSQL_BINLOG
--
read
-
from
-
remote
-
server
--
user
=
root
--
host
=
127.0
.
0.1
--
port
=
$MASTER_MYPORT
master
-
bin
.
000002
>>
$MYSQLTEST_VARDIR
/
tmp
/
remote
.
sql
# Now that we have our file, lets get rid of the current database.
# Cleanup the master and the slave and try to recreate.
#
DROP TABLE t1;
#
DROP TABLE t2;
#
DROP TABLE t3;
DROP
TABLE
t1
;
DROP
TABLE
t2
;
DROP
TABLE
t3
;
#
sync_slave_with_master;
sync_slave_with_master
;
#we expect STOP SLAVE to produce a warning as the slave is stopped
#(the server was started with skip-slave-start)
#
--disable_warnings
#
stop slave;
#
--enable_warnings
#
--require r/slave-stopped.result
#
show status like 'Slave_running';
#
connection master;
#
reset master;
#
connection slave;
#
reset slave;
#
start slave;
#
--require r/slave-running.result
#
show status like 'Slave_running';
#
connection master;
--
disable_warnings
stop
slave
;
--
enable_warnings
--
require
r
/
slave
-
stopped
.
result
show
status
like
'Slave_running'
;
connection
master
;
reset
master
;
connection
slave
;
reset
slave
;
start
slave
;
--
require
r
/
slave
-
running
.
result
show
status
like
'Slave_running'
;
connection
master
;
# We should be clean at this point, now we will run in the file from above.
#
--exec $MYSQL -e "source $MYSQLTEST_VARDIR/tmp/remote.sql"
--
exec
$MYSQL
-
e
"source
$MYSQLTEST_VARDIR
/tmp/remote.sql"
# Lets Check the tables on the Master
#
SELECT COUNT(*) from t1;
#
SELECT COUNT(*) from t2;
#
SELECT COUNT(*) from t3;
#
SELECT * FROM t1 ORDER BY word LIMIT 5;
#
SELECT * FROM t2 ORDER BY id LIMIT 5;
#
SELECT c1, c3, c4, c5 FROM t3 ORDER BY c1 LIMIT 5;
SELECT
COUNT
(
*
)
from
t1
;
SELECT
COUNT
(
*
)
from
t2
;
SELECT
COUNT
(
*
)
from
t3
;
SELECT
*
FROM
t1
ORDER
BY
word
LIMIT
5
;
SELECT
*
FROM
t2
ORDER
BY
id
LIMIT
5
;
SELECT
c1
,
c3
,
c4
,
c5
FROM
t3
ORDER
BY
c1
LIMIT
5
;
# Should have the same on the slave;
#
sync_slave_with_master;
#
SELECT COUNT(*) from t1;
#
SELECT COUNT(*) from t2;
#
SELECT COUNT(*) from t3;
#
SELECT * FROM t1 ORDER BY word LIMIT 5;
#
SELECT * FROM t2 ORDER BY id LIMIT 5;
#
SELECT c1, c3, c4, c5 FROM t3 ORDER BY c1 LIMIT 5;
#
connection master;
sync_slave_with_master
;
SELECT
COUNT
(
*
)
from
t1
;
SELECT
COUNT
(
*
)
from
t2
;
SELECT
COUNT
(
*
)
from
t3
;
SELECT
*
FROM
t1
ORDER
BY
word
LIMIT
5
;
SELECT
*
FROM
t2
ORDER
BY
id
LIMIT
5
;
SELECT
c1
,
c3
,
c4
,
c5
FROM
t3
ORDER
BY
c1
LIMIT
5
;
connection
master
;
# We should be gold by the time, so I will get rid of our file.
#
--exec rm $MYSQLTEST_VARDIR/tmp/remote.sql
--
exec
rm
$MYSQLTEST_VARDIR
/
tmp
/
remote
.
sql
################### End Bug 17654 ######################
# LOAD DATA
...
...
@@ -315,7 +315,34 @@ select "--- Test cleanup --" as "";
--
enable_query_log
# clean up
connection
master
;
DROP
TABLE
IF
EXISTS
t1
,
t2
,
t3
,
t04
,
t05
,
t4
,
t5
;
sync_slave_with_master
;
connection
master
;
# BUG#17654 also test mysqlbinlog to ensure it can read the binlog from a remote server
# and ensure that the results are the same as if read from a file (the same file).
--
disable_warnings
DROP
TABLE
IF
EXISTS
t1
;
--
enable_warnings
CREATE
TABLE
t1
(
a
INT
NOT
NULL
KEY
,
b
INT
);
INSERT
INTO
t1
VALUES
(
1
,
1
);
SELECT
*
FROM
t1
;
FLUSH
LOGS
;
--
exec
$MYSQL_BINLOG
--
read
-
from
-
remote
-
server
--
user
=
root
--
host
=
127.0
.
0.1
--
port
=
$MASTER_MYPORT
master
-
bin
.
000001
>
$MYSQLTEST_VARDIR
/
tmp
/
remote
.
sql
--
exec
$MYSQL_BINLOG
$MYSQLTEST_VARDIR
/
log
/
master
-
bin
.
000001
>
$MYSQLTEST_VARDIR
/
tmp
/
local
.
sql
--
diff_files
$MYSQLTEST_VARDIR
/
tmp
/
local
.
sql
$MYSQLTEST_VARDIR
/
tmp
/
remote
.
sql
--
exec
rm
$MYSQLTEST_VARDIR
/
tmp
/
remote
.
sql
--
exec
rm
$MYSQLTEST_VARDIR
/
tmp
/
local
.
sql
DROP
TABLE
IF
EXISTS
t1
,
t2
,
t3
,
t04
,
t05
,
t4
,
t5
;
# End of 4.1 tests
mysql-test/t/rpl_row_until.test
View file @
73ca08a4
...
...
@@ -33,7 +33,7 @@ wait_for_slave_to_stop;
select
*
from
t1
;
--
replace_result
$MASTER_MYPORT
MASTER_MYPORT
--
replace_column
1
# 9 # 11 # 23 # 33 #
show
slave
status
;
--
query_vertical
SHOW
SLAVE
STATUS
;
# this should fail right after start
start
slave
until
master_log_file
=
'master-no-such-bin.000001'
,
master_log_pos
=
291
;
...
...
@@ -43,7 +43,7 @@ sleep 2;
wait_for_slave_to_stop
;
--
replace_result
$MASTER_MYPORT
MASTER_MYPORT
--
replace_column
1
# 9 # 11 # 23 # 33 #
show
slave
status
;
--
query_vertical
SHOW
SLAVE
STATUS
;
# try replicate all up to and not including the second insert to t2;
start
slave
until
relay_log_file
=
'slave-relay-bin.000004'
,
relay_log_pos
=
728
;
...
...
@@ -52,7 +52,7 @@ wait_for_slave_to_stop;
select
*
from
t2
;
--
replace_result
$MASTER_MYPORT
MASTER_MYPORT
--
replace_column
1
# 9 # 11 # 23 # 33 #
show
slave
status
;
--
query_vertical
SHOW
SLAVE
STATUS
;
# clean up
start
slave
;
...
...
@@ -69,7 +69,7 @@ wait_for_slave_to_stop;
# here the sql slave thread should be stopped
--
replace_result
$MASTER_MYPORT
MASTER_MYPORT
bin
.
000005
bin
.
000004
bin
.
000006
bin
.
000004
bin
.
000007
bin
.
000004
--
replace_column
1
# 9 # 23 # 33 #
show
slave
status
;
--
query_vertical
SHOW
SLAVE
STATUS
;
#testing various error conditions
--
error
1277
...
...
mysql-test/t/xml.test
View file @
73ca08a4
...
...
@@ -231,6 +231,13 @@ select UpdateXML(@xml, '/a/b/@bb1', 'bb3="bb3"');
select
UpdateXML
(
@
xml
,
'/a/b/@bb2'
,
''
);
select
UpdateXML
(
@
xml
,
'/a/b/@bb2'
,
'bb3="bb3"'
);
#
# Bug#27898 UPDATEXML Crashes the Server!
#
select
updatexml
(
'<div><div><span>1</span><span>2</span></div></div>'
,
'/'
,
'<tr><td>1</td><td>2</td></tr>'
)
as
upd1
;
select
updatexml
(
''
,
'/'
,
''
)
as
upd2
;
#
# Bug#16234 XML: Crash if ExtractValue()
#
...
...
@@ -444,3 +451,85 @@ select ExtractValue('<a><parent>test</parent></a>', '/a/parent');
select
ExtractValue
(
'<a><preceding>test</preceding></a>'
,
'/a/preceding'
);
select
ExtractValue
(
'<a><preceding-sibling>test</preceding-sibling></a>'
,
'/a/preceding-sibling'
);
select
ExtractValue
(
'<a><self>test</self></a>'
,
'/a/self'
);
#
# Bug#26518 XPath and variables problem
# Check with user defined variables
#
set
@
i
=
1
;
select
ExtractValue
(
'<a><b>b1</b><b>b2</b></a>'
,
'/a/b[$@i]'
);
set
@
i
=
2
;
select
ExtractValue
(
'<a><b>b1</b><b>b2</b></a>'
,
'/a/b[$@i]'
);
set
@
i
=
NULL
;
select
ExtractValue
(
'<a><b>b1</b><b>b2</b></a>'
,
'/a/b[$@i]'
);
#
# Check variables in a stored procedure - both local and user variables
# Make sure that SP and local variables with the same name work together.
#
DELIMITER
|
;
CREATE
PROCEDURE
spxml
(
xml
VARCHAR
(
128
))
BEGIN
DECLARE
c
INT
;
DECLARE
i
INT
DEFAULT
1
;
SET
c
=
ExtractValue
(
xml
,
'count(/a/b)'
);
SET
@
i
=
c
;
WHILE
i
<=
c
DO
BEGIN
SELECT
i
,
@
i
,
ExtractValue
(
xml
,
'/a/b[$i]'
),
ExtractValue
(
xml
,
'/a/b[$@i]'
);
SET
i
=
i
+
1
;
SET
@
i
=
@
i
-
1
;
END
;
END
WHILE
;
END
|
DELIMITER
;
|
call
spxml
(
'<a><b>b1</b><b>b2</b><b>b3</b></a>'
);
drop
procedure
spxml
;
#
# Additional tests for bug#26518
--
echo
Multiple
matches
,
but
no
index
specification
SELECT
ExtractValue
(
'<a><b>b1</b><b>b2</b></a>'
,
'/a/b'
);
--
echo
No
matches
SELECT
ExtractValue
(
'<a><b>b1</b><b>b2</b></a>'
,
'/a/c'
);
--
echo
Index
out
of
range
SELECT
ExtractValue
(
'<a><b>b1</b><b>b2</b></a>'
,
'/a/b[-1]'
);
SELECT
ExtractValue
(
'<a><b>b1</b><b>b2</b></a>'
,
'/a/b[10]'
);
--
echo
With
string
-
to
-
number
conversion
SELECT
ExtractValue
(
'<a><b>b1</b><b>b2</b></a>'
,
'/a/b["1"]'
);
SELECT
ExtractValue
(
'<a><b>b1</b><b>b2</b></a>'
,
'/a/b["1 and string"]'
);
SELECT
ExtractValue
(
'<a><b>b1</b><b>b2</b></a>'
,
'/a/b["string and 1"]'
);
SELECT
ExtractValue
(
'<a><b>b1</b><b>b2</b></a>'
,
'/a/b["string"]'
);
--
echo
String
-
to
-
number
conversion
from
a
user
variable
SET
@
i
=
'1'
;
SELECT
ExtractValue
(
'<a><b>b1</b><b>b2</b></a>'
,
'/a/b[$@i]'
);
SET
@
i
=
'1 and string'
;
SELECT
ExtractValue
(
'<a><b>b1</b><b>b2</b></a>'
,
'/a/b[$@i]'
);
SET
@
i
=
'string and 1'
;
SELECT
ExtractValue
(
'<a><b>b1</b><b>b2</b></a>'
,
'/a/b[$@i]'
);
SET
@
i
=
'string'
;
SELECT
ExtractValue
(
'<a><b>b1</b><b>b2</b></a>'
,
'/a/b[$@i]'
);
--
echo
String
-
to
-
number
conversion
with
a
CHAR
SP
variable
DELIMITER
|
;
CREATE
PROCEDURE
spxml
(
xml
VARCHAR
(
128
),
i
CHAR
(
16
))
BEGIN
SELECT
ExtractValue
(
xml
,
'/a/b[$i]'
);
END
|
DELIMITER
;
|
CALL
spxml
(
'<a><b>b1</b><b>b2</b></a>'
,
'1'
);
CALL
spxml
(
'<a><b>b1</b><b>b2</b></a>'
,
'1 and string'
);
CALL
spxml
(
'<a><b>b1</b><b>b2</b></a>'
,
'string and 1'
);
CALL
spxml
(
'<a><b>b1</b><b>b2</b></a>'
,
'string'
);
DROP
PROCEDURE
spxml
;
#
# Bug#28558 UpdateXML called with garbage crashes server
#
--
error
1105
select
UpdateXML
(
'<a>a</a>'
,
repeat
(
'a b '
,
1000
),
''
);
--
error
1105
select
ExtractValue
(
'<a>a</a>'
,
'/a[@x=@y0123456789_0123456789_0123456789_0123456789]'
);
--
error
1105
select
ExtractValue
(
'<a>a</a>'
,
'/a[@x=$y0123456789_0123456789_0123456789_0123456789]'
);
sql/item_xmlfunc.cc
View file @
73ca08a4
...
...
@@ -19,7 +19,7 @@
#include "mysql_priv.h"
#include "my_xml.h"
#include "sp_pcontext.h"
/*
TODO: future development directions:
...
...
@@ -923,8 +923,8 @@ static Item *create_comparator(MY_XPATH *xpath,
else
if
(
a
->
type
()
==
Item
::
XPATH_NODESET
&&
b
->
type
()
==
Item
::
XPATH_NODESET
)
{
uint
len
=
context
->
end
-
context
->
beg
;
set_if_
bigg
er
(
len
,
32
);
uint
len
=
xpath
->
query
.
end
-
context
->
beg
;
set_if_
small
er
(
len
,
32
);
my_printf_error
(
ER_UNKNOWN_ERROR
,
"XPATH error: "
"comparison of two nodesets is not supported: '%.*s'"
,
...
...
@@ -2412,21 +2412,78 @@ my_xpath_parse_QName(MY_XPATH *xpath)
}
/*
/*
*
Scan Variable reference
SYNOPSYS
@details Implements parsing of two syntax structures:
[36] VariableReference ::= '$' QName
RETURN
1 - success
0 - failure
1. Standard XPath syntax [36], for SP variables:
VariableReference ::= '$' QName
Finds a SP variable with the given name.
If outside of a SP context, or variable with
the given name doesn't exists, then error is returned.
2. Non-standard syntax - MySQL extension for user variables:
VariableReference ::= '$' '@' QName
Item, corresponding to the variable, is returned
in xpath->item in both cases.
@param xpath pointer to XPath structure
@return Operation status
@retval 1 Success
@retval 0 Failure
*/
static
int
my_xpath_parse_VariableReference
(
MY_XPATH
*
xpath
)
{
return
my_xpath_parse_term
(
xpath
,
MY_XPATH_LEX_DOLLAR
)
&&
my_xpath_parse_term
(
xpath
,
MY_XPATH_LEX_IDENT
);
LEX_STRING
name
;
int
user_var
;
const
char
*
dollar_pos
;
if
(
!
my_xpath_parse_term
(
xpath
,
MY_XPATH_LEX_DOLLAR
)
||
(
!
(
dollar_pos
=
xpath
->
prevtok
.
beg
))
||
(
!
((
user_var
=
my_xpath_parse_term
(
xpath
,
MY_XPATH_LEX_AT
)
&&
my_xpath_parse_term
(
xpath
,
MY_XPATH_LEX_IDENT
)))
&&
!
my_xpath_parse_term
(
xpath
,
MY_XPATH_LEX_IDENT
)))
return
0
;
name
.
length
=
xpath
->
prevtok
.
end
-
xpath
->
prevtok
.
beg
;
name
.
str
=
(
char
*
)
xpath
->
prevtok
.
beg
;
if
(
user_var
)
xpath
->
item
=
new
Item_func_get_user_var
(
name
);
else
{
sp_variable_t
*
spv
;
sp_pcontext
*
spc
;
LEX
*
lex
;
if
((
lex
=
current_thd
->
lex
)
&&
(
spc
=
lex
->
spcont
)
&&
(
spv
=
spc
->
find_variable
(
&
name
)))
{
Item_splocal
*
splocal
=
new
Item_splocal
(
name
,
spv
->
offset
,
spv
->
type
,
0
);
#ifndef DBUG_OFF
if
(
splocal
)
splocal
->
m_sp
=
lex
->
sphead
;
#endif
xpath
->
item
=
(
Item
*
)
splocal
;
}
else
{
xpath
->
item
=
NULL
;
DBUG_ASSERT
(
xpath
->
query
.
end
>
dollar_pos
);
uint
len
=
xpath
->
query
.
end
-
dollar_pos
;
set_if_smaller
(
len
,
32
);
my_printf_error
(
ER_UNKNOWN_ERROR
,
"Unknown XPATH variable at: '%.*s'"
,
MYF
(
0
),
len
,
dollar_pos
);
}
}
return
xpath
->
item
?
1
:
0
;
}
...
...
@@ -2534,12 +2591,10 @@ void Item_xml_str_func::fix_length_and_dec()
if
(
!
rc
)
{
char
context
[
32
];
uint
clen
=
xpath
.
query
.
end
-
xpath
.
lasttok
.
beg
;
set_if_bigger
(
clen
,
sizeof
(
context
)
-
1
);
strmake
(
context
,
xpath
.
lasttok
.
beg
,
clen
);
my_printf_error
(
ER_UNKNOWN_ERROR
,
"XPATH syntax error: '%s'"
,
MYF
(
0
),
context
);
set_if_smaller
(
clen
,
32
);
my_printf_error
(
ER_UNKNOWN_ERROR
,
"XPATH syntax error: '%.*s'"
,
MYF
(
0
),
clen
,
xpath
.
lasttok
.
beg
);
return
;
}
...
...
@@ -2768,6 +2823,16 @@ String *Item_func_xml_update::val_str(String *str)
nodebeg
+=
fltbeg
->
num
;
if
(
!
nodebeg
->
level
)
{
/*
Root element, without NameTest:
UpdateXML(xml, '/', 'replacement');
Just return the replacement string.
*/
return
rep
;
}
tmp_value
.
length
(
0
);
tmp_value
.
set_charset
(
collation
.
collation
);
uint
offs
=
nodebeg
->
type
==
MY_XML_NODE_TAG
?
1
:
0
;
...
...
sql/log_event.cc
View file @
73ca08a4
...
...
@@ -1462,20 +1462,31 @@ Query_log_event::Query_log_event()
/*
Query_log_event::Query_log_event()
SYNOPSIS
Query_log_event::Query_log_event()
thd - thread handle
query_arg - array of char representing the query
query_length - size of the `query_arg' array
using_trans - there is a modified transactional table
suppress_use - suppress the generation of 'USE' statements
killed_status_arg - an optional with default to THD::KILLED_NO_VALUE
if the value is different from the default, the arg
is set to the current thd->killed value.
A caller might need to masquerade thd->killed with
THD::NOT_KILLED.
DESCRIPTION
Creates an event for binlogging
The value for local `killed_status' can be supplied by caller.
*/
Query_log_event
::
Query_log_event
(
THD
*
thd_arg
,
const
char
*
query_arg
,
ulong
query_length
,
bool
using_trans
,
bool
suppress_use
)
bool
suppress_use
,
THD
::
killed_state
killed_status_arg
)
:
Log_event
(
thd_arg
,
((
thd_arg
->
tmp_table_used
?
LOG_EVENT_THREAD_SPECIFIC_F
:
0
)
|
(
suppress_use
?
LOG_EVENT_SUPPRESS_USE_F
:
0
)),
using_trans
),
data_buf
(
0
),
query
(
query_arg
),
catalog
(
thd_arg
->
catalog
),
db
(
thd_arg
->
db
),
q_len
((
uint32
)
query_length
),
error_code
((
thd_arg
->
killed
!=
THD
::
NOT_KILLED
)
?
((
thd_arg
->
system_thread
&
SYSTEM_THREAD_DELAYED_INSERT
)
?
0
:
thd
->
killed_errno
())
:
thd_arg
->
net
.
last_errno
),
thread_id
(
thd_arg
->
thread_id
),
/* save the original thread id; we already know the server id */
slave_proxy_id
(
thd_arg
->
variables
.
pseudo_thread_id
),
...
...
@@ -1487,6 +1498,14 @@ Query_log_event::Query_log_event(THD* thd_arg, const char* query_arg,
charset_database_number
(
0
)
{
time_t
end_time
;
if
(
killed_status_arg
==
THD
::
KILLED_NO_VALUE
)
killed_status_arg
=
thd_arg
->
killed
;
error_code
=
(
killed_status_arg
==
THD
::
NOT_KILLED
)
?
thd_arg
->
net
.
last_errno
:
((
thd_arg
->
system_thread
&
SYSTEM_THREAD_DELAYED_INSERT
)
?
0
:
thd
->
killed_errno
());
time
(
&
end_time
);
exec_time
=
(
ulong
)
(
end_time
-
thd
->
start_time
);
catalog_len
=
(
catalog
)
?
(
uint32
)
strlen
(
catalog
)
:
0
;
...
...
@@ -6737,10 +6756,23 @@ int Write_rows_log_event::do_before_row_operations(TABLE *table)
lex->duplicates flag.
*/
thd
->
lex
->
sql_command
=
SQLCOM_REPLACE
;
table
->
file
->
extra
(
HA_EXTRA_IGNORE_DUP_KEY
);
// Needed for ndbcluster
table
->
file
->
extra
(
HA_EXTRA_WRITE_CAN_REPLACE
);
// Needed for ndbcluster
table
->
file
->
extra
(
HA_EXTRA_IGNORE_NO_KEY
);
// Needed for ndbcluster
/*
Do not raise the error flag in case of hitting to an unique attribute
*/
table
->
file
->
extra
(
HA_EXTRA_IGNORE_DUP_KEY
);
/*
NDB specific: update from ndb master wrapped as Write_rows
*/
/*
so that the event should be applied to replace slave's row
*/
table
->
file
->
extra
(
HA_EXTRA_WRITE_CAN_REPLACE
);
/*
NDB specific: if update from ndb master wrapped as Write_rows
does not find the row it's assumed idempotent binlog applying
is taking place; don't raise the error.
*/
table
->
file
->
extra
(
HA_EXTRA_IGNORE_NO_KEY
);
/*
TODO: the cluster team (Tomas?) says that it's better if the engine knows
how many rows are going to be inserted, then it can allocate needed memory
...
...
@@ -6768,9 +6800,20 @@ int Write_rows_log_event::do_before_row_operations(TABLE *table)
int
Write_rows_log_event
::
do_after_row_operations
(
TABLE
*
table
,
int
error
)
{
if
(
error
==
0
)
error
=
table
->
file
->
ha_end_bulk_insert
();
return
error
;
int
local_error
=
0
;
table
->
file
->
extra
(
HA_EXTRA_NO_IGNORE_DUP_KEY
);
table
->
file
->
extra
(
HA_EXTRA_WRITE_CANNOT_REPLACE
);
/*
reseting the extra with
table->file->extra(HA_EXTRA_NO_IGNORE_NO_KEY);
fires bug#27077
todo: explain or fix
*/
if
((
local_error
=
table
->
file
->
ha_end_bulk_insert
()))
{
table
->
file
->
print_error
(
local_error
,
MYF
(
0
));
}
return
error
?
error
:
local_error
;
}
int
Write_rows_log_event
::
do_prepare_row
(
THD
*
thd
,
RELAY_LOG_INFO
const
*
rli
,
...
...
sql/log_event.h
View file @
73ca08a4
...
...
@@ -1023,7 +1023,8 @@ class Query_log_event: public Log_event
#ifndef MYSQL_CLIENT
Query_log_event
(
THD
*
thd_arg
,
const
char
*
query_arg
,
ulong
query_length
,
bool
using_trans
,
bool
suppress_use
);
bool
using_trans
,
bool
suppress_use
,
THD
::
killed_state
killed_err_arg
=
THD
::
KILLED_NO_VALUE
);
const
char
*
get_db
()
{
return
db
;
}
#ifdef HAVE_REPLICATION
void
pack_info
(
Protocol
*
protocol
);
...
...
sql/sql_class.cc
View file @
73ca08a4
...
...
@@ -3082,9 +3082,9 @@ void THD::binlog_delete_pending_rows_event()
RETURN VALUE
Error code, or 0 if no error.
*/
int
THD
::
binlog_query
(
THD
::
enum_binlog_query_type
qtype
,
char
const
*
query
,
ulong
query_len
,
bool
is_trans
,
bool
suppress_use
)
int
THD
::
binlog_query
(
THD
::
enum_binlog_query_type
qtype
,
char
const
*
query
,
ulong
query_len
,
bool
is_trans
,
bool
suppress_use
,
THD
::
killed_state
killed_status_arg
)
{
DBUG_ENTER
(
"THD::binlog_query"
);
DBUG_PRINT
(
"enter"
,
(
"qtype=%d, query='%s'"
,
qtype
,
query
));
...
...
@@ -3123,7 +3123,8 @@ int THD::binlog_query(THD::enum_binlog_query_type qtype,
flush the pending rows event if necessary.
*/
{
Query_log_event
qinfo
(
this
,
query
,
query_len
,
is_trans
,
suppress_use
);
Query_log_event
qinfo
(
this
,
query
,
query_len
,
is_trans
,
suppress_use
,
killed_status_arg
);
qinfo
.
flags
|=
LOG_EVENT_UPDATE_TABLE_MAP_VERSION_F
;
/*
Binlog table maps will be irrelevant after a Query_log_event
...
...
sql/sql_class.h
View file @
73ca08a4
...
...
@@ -1116,32 +1116,6 @@ class THD :public Statement,
}
#endif
/* MYSQL_CLIENT */
#ifndef MYSQL_CLIENT
public:
enum
enum_binlog_query_type
{
/*
The query can be logged row-based or statement-based
*/
ROW_QUERY_TYPE
,
/*
The query has to be logged statement-based
*/
STMT_QUERY_TYPE
,
/*
The query represents a change to a table in the "mysql"
database and is currently mapped to ROW_QUERY_TYPE.
*/
MYSQL_QUERY_TYPE
,
QUERY_TYPE_COUNT
};
int
binlog_query
(
enum_binlog_query_type
qtype
,
char
const
*
query
,
ulong
query_len
,
bool
is_trans
,
bool
suppress_use
);
#endif
public:
struct
st_transactions
{
...
...
@@ -1396,7 +1370,14 @@ class THD :public Statement,
DYNAMIC_ARRAY
user_var_events
;
/* For user variables replication */
MEM_ROOT
*
user_var_events_alloc
;
/* Allocate above array elements here */
enum
killed_state
{
NOT_KILLED
=
0
,
KILL_BAD_DATA
=
1
,
KILL_CONNECTION
=
ER_SERVER_SHUTDOWN
,
KILL_QUERY
=
ER_QUERY_INTERRUPTED
};
enum
killed_state
{
NOT_KILLED
=
0
,
KILL_BAD_DATA
=
1
,
KILL_CONNECTION
=
ER_SERVER_SHUTDOWN
,
KILL_QUERY
=
ER_QUERY_INTERRUPTED
,
KILLED_NO_VALUE
/* means neither of the states */
};
killed_state
volatile
killed
;
/* scramble - random string sent to client on handshake */
...
...
@@ -1521,6 +1502,33 @@ class THD :public Statement,
void
close_active_vio
();
#endif
void
awake
(
THD
::
killed_state
state_to_set
);
#ifndef MYSQL_CLIENT
enum
enum_binlog_query_type
{
/*
The query can be logged row-based or statement-based
*/
ROW_QUERY_TYPE
,
/*
The query has to be logged statement-based
*/
STMT_QUERY_TYPE
,
/*
The query represents a change to a table in the "mysql"
database and is currently mapped to ROW_QUERY_TYPE.
*/
MYSQL_QUERY_TYPE
,
QUERY_TYPE_COUNT
};
int
binlog_query
(
enum_binlog_query_type
qtype
,
char
const
*
query
,
ulong
query_len
,
bool
is_trans
,
bool
suppress_use
,
THD
::
killed_state
killed_err_arg
=
THD
::
KILLED_NO_VALUE
);
#endif
/*
For enter_cond() / exit_cond() to work the mutex must be got before
enter_cond(); this mutex is then released by exit_cond().
...
...
@@ -1647,7 +1655,8 @@ class THD :public Statement,
void
end_statement
();
inline
int
killed_errno
()
const
{
return
killed
!=
KILL_BAD_DATA
?
killed
:
0
;
killed_state
killed_val
;
/* to cache the volatile 'killed' */
return
(
killed_val
=
killed
)
!=
KILL_BAD_DATA
?
killed_val
:
0
;
}
inline
void
send_kill_message
()
const
{
...
...
sql/sql_insert.cc
View file @
73ca08a4
...
...
@@ -843,10 +843,36 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
if
(
mysql_bin_log
.
is_open
())
{
if
(
error
<=
0
)
{
/*
[Guilhem wrote] Temporary errors may have filled
thd->net.last_error/errno. For example if there has
been a disk full error when writing the row, and it was
MyISAM, then thd->net.last_error/errno will be set to
"disk full"... and the my_pwrite() will wait until free
space appears, and so when it finishes then the
write_row() was entirely successful
*/
/* todo: consider removing */
thd
->
clear_error
();
}
/* bug#22725:
A query which per-row-loop can not be interrupted with
KILLED, like INSERT, and that does not invoke stored
routines can be binlogged with neglecting the KILLED error.
If there was no error (error == zero) until after the end of
inserting loop the KILLED flag that appeared later can be
disregarded since previously possible invocation of stored
routines did not result in any error due to the KILLED. In
such case the flag is ignored for constructing binlog event.
*/
DBUG_ASSERT
(
thd
->
killed
!=
THD
::
KILL_BAD_DATA
||
error
>
0
);
if
(
thd
->
binlog_query
(
THD
::
ROW_QUERY_TYPE
,
thd
->
query
,
thd
->
query_length
,
transactional_table
,
FALSE
)
&&
transactional_table
,
FALSE
,
(
error
>
0
)
?
thd
->
killed
:
THD
::
NOT_KILLED
)
&&
transactional_table
)
{
error
=
1
;
...
...
@@ -858,7 +884,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
}
if
(
transactional_table
)
error
=
ha_autocommit_or_rollback
(
thd
,
error
);
if
(
thd
->
lock
)
{
mysql_unlock_tables
(
thd
,
thd
->
lock
);
...
...
sql/sql_load.cc
View file @
73ca08a4
...
...
@@ -413,9 +413,6 @@ bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
if
(
error
)
{
if
(
transactional_table
)
ha_autocommit_or_rollback
(
thd
,
error
);
if
(
read_file_from_client
)
while
(
!
read_info
.
next_line
())
;
...
...
@@ -463,6 +460,9 @@ bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
}
}
#endif
/*!EMBEDDED_LIBRARY*/
if
(
transactional_table
)
ha_autocommit_or_rollback
(
thd
,
error
);
error
=
-
1
;
// Error on read
goto
err
;
}
...
...
sql/sql_update.cc
View file @
73ca08a4
...
...
@@ -621,6 +621,37 @@ int mysql_update(THD *thd,
thd
->
row_count
++
;
}
dup_key_found
=
0
;
/*
todo bug#27571: to avoid asynchronization of `error' and
`error_code' of binlog event constructor
The concept, which is a bit different for insert(!), is to
replace `error' assignment with the following lines
killed_status= thd->killed; // get the status of the volatile
Notice: thd->killed is type of "state" whereas the lhs has
"status" the suffix which translates according to WordNet: a state
at a particular time - at the time of the end of per-row loop in
our case. Binlogging ops are conducted with the status.
error= (killed_status == THD::NOT_KILLED)? error : 1;
which applies to most mysql_$query functions.
Event's constructor will accept `killed_status' as an argument:
Query_log_event qinfo(..., killed_status);
thd->killed might be changed after killed_status had got cached and this
won't affect binlogging event but other effects remain.
Open issue: In a case the error happened not because of KILLED -
and then KILLED was caught later still within the loop - we shall
do something to avoid binlogging of incorrect ER_SERVER_SHUTDOWN
error_code.
*/
if
(
thd
->
killed
&&
!
error
)
error
=
1
;
// Aborted
else
if
(
will_batch
&&
...
...
storage/heap/hp_hash.c
View file @
73ca08a4
...
...
@@ -379,7 +379,13 @@ ulong hp_rec_hashnr(register HP_KEYDEF *keydef, register const byte *rec)
ulong
hp_hashnr
(
register
HP_KEYDEF
*
keydef
,
register
const
byte
*
key
)
{
register
ulong
nr
=
0
;
/*
Note, if a key consists of a combination of numeric and
a text columns, it most likely won't work well.
Making text columns work with NEW_HASH_FUNCTION
needs also changes in strings/ctype-xxx.c.
*/
ulong
nr
=
1
,
nr2
=
4
;
HA_KEYSEG
*
seg
,
*
endseg
;
for
(
seg
=
keydef
->
seg
,
endseg
=
seg
+
keydef
->
keysegs
;
seg
<
endseg
;
seg
++
)
...
...
@@ -401,14 +407,15 @@ ulong hp_hashnr(register HP_KEYDEF *keydef, register const byte *key)
}
if
(
seg
->
type
==
HA_KEYTYPE_TEXT
)
{
seg
->
charset
->
hash_sort
(
seg
->
charset
,
pos
,((
uchar
*
)
key
)
-
pos
,
&
nr
,
NULL
);
seg
->
charset
->
coll
->
hash_sort
(
seg
->
charset
,
pos
,
((
uchar
*
)
key
)
-
pos
,
&
nr
,
&
nr2
);
}
else
if
(
seg
->
type
==
HA_KEYTYPE_VARTEXT1
)
/* Any VARCHAR segments */
{
uint
pack_length
=
2
;
/* Key packing is constant */
uint
length
=
uint2korr
(
pos
);
seg
->
charset
->
hash_sort
(
seg
->
charset
,
pos
+
pack_length
,
length
,
&
nr
,
NULL
);
seg
->
charset
->
coll
->
hash_sort
(
seg
->
charset
,
pos
+
pack_length
,
length
,
&
nr
,
&
nr2
);
key
+=
pack_length
;
}
else
...
...
@@ -428,7 +435,7 @@ ulong hp_hashnr(register HP_KEYDEF *keydef, register const byte *key)
ulong
hp_rec_hashnr
(
register
HP_KEYDEF
*
keydef
,
register
const
byte
*
rec
)
{
register
ulong
nr
=
0
;
ulong
nr
=
1
,
nr2
=
4
;
HA_KEYSEG
*
seg
,
*
endseg
;
for
(
seg
=
keydef
->
seg
,
endseg
=
seg
+
keydef
->
keysegs
;
seg
<
endseg
;
seg
++
)
...
...
@@ -444,14 +451,16 @@ ulong hp_rec_hashnr(register HP_KEYDEF *keydef, register const byte *rec)
}
if
(
seg
->
type
==
HA_KEYTYPE_TEXT
)
{
seg
->
charset
->
hash_sort
(
seg
->
charset
,
pos
,((
uchar
*
)
key
)
-
pos
,
&
nr
,
NULL
);
uint
char_length
=
seg
->
length
;
/* TODO: fix to use my_charpos() */
seg
->
charset
->
coll
->
hash_sort
(
seg
->
charset
,
pos
,
char_length
,
&
nr
,
&
nr2
);
}
else
if
(
seg
->
type
==
HA_KEYTYPE_VARTEXT1
)
/* Any VARCHAR segments */
{
uint
pack_length
=
seg
->
bit_start
;
uint
length
=
(
pack_length
==
1
?
(
uint
)
*
(
uchar
*
)
pos
:
uint2korr
(
pos
));
seg
->
charset
->
hash_sort
(
seg
->
charset
,
pos
+
pack_length
,
length
,
&
nr
,
NULL
);
seg
->
charset
->
coll
->
hash_sort
(
seg
->
charset
,
pos
+
pack_length
,
length
,
&
nr
,
&
nr2
);
}
else
{
...
...
strings/CMakeLists.txt
View file @
73ca08a4
...
...
@@ -24,4 +24,4 @@ ADD_LIBRARY(strings bchange.c bcmp.c bfill.c bmove512.c bmove_upp.c ctype-big5.c
is_prefix.c llstr.c longlong2str.c my_strtoll10.c my_vsnprintf.c r_strinstr.c
str2int.c str_alloc.c strcend.c strend.c strfill.c strmake.c strmov.c strnmov.c
strtod.c strtol.c strtoll.c strtoul.c strtoull.c strxmov.c strxnmov.c xml.c
my_strchr.c strcont.c strinstr.c
)
my_strchr.c strcont.c strinstr.c
strnlen.c
)
strings/my_vsnprintf.c
View file @
73ca08a4
...
...
@@ -95,8 +95,7 @@ int my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap)
reg2
char
*
par
=
va_arg
(
ap
,
char
*
);
uint
plen
,
left_len
=
(
uint
)(
end
-
to
)
+
1
;
if
(
!
par
)
par
=
(
char
*
)
"(null)"
;
plen
=
(
uint
)
strlen
(
par
);
set_if_smaller
(
plen
,
width
);
plen
=
(
uint
)
strnlen
(
par
,
width
);
if
(
left_len
<=
plen
)
plen
=
left_len
-
1
;
to
=
strnmov
(
to
,
par
,
plen
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment