mirror of
https://github.com/MariaDB/server.git
synced 2025-02-02 03:51:50 +01:00
6dff801284
LOAD_FILE LOAD_FILE is not safe to replicate in STATEMENT mode, because it depends on a file (which is loaded on master and may not exist in slave(s)). This leads to scenarios on which the slave replicates the statement with 'load_file' and it will try to load the file from local file system. Given that the file may not exist in the slave filesystem the operation will not succeed (probably returning NULL), causing master and slave(s) to diverge. However, when using MIXED mode replication, this can be made to work, if the statement including LOAD_FILE is marked as unsafe, triggering a switch to ROW mode, meaning that the contents of the file are written to binlog as row events. Consequently, the contents from the file in the master will reach the slave via the binlog. This patch addresses this bug by marking the load_file function as unsafe. When in mixed mode and when LOAD_FILE is issued, there will be a switch to row mode. Furthermore, when in statement mode, the LOAD_FILE will raise a warning that the statement is unsafe in that mode.
245 lines
2.9 KiB
Text
245 lines
2.9 KiB
Text
stop slave;
|
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
|
reset master;
|
|
reset slave;
|
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
|
start slave;
|
|
DROP PROCEDURE IF EXISTS test.p1;
|
|
DROP TABLE IF EXISTS test.t1;
|
|
CREATE TABLE test.t1 (a INT, blob_column LONGBLOB, PRIMARY KEY(a));
|
|
INSERT INTO test.t1 VALUES(1,'test');
|
|
UPDATE test.t1 SET blob_column=LOAD_FILE('../../std_data/words2.dat') WHERE a=1;
|
|
create procedure test.p1()
|
|
begin
|
|
INSERT INTO test.t1 VALUES(2,'test');
|
|
UPDATE test.t1 SET blob_column=LOAD_FILE('../../std_data/words2.dat') WHERE a=2;
|
|
end|
|
|
CALL test.p1();
|
|
SELECT * FROM test.t1 ORDER BY blob_column;
|
|
a blob_column
|
|
1 abase
|
|
abased
|
|
abasement
|
|
abasements
|
|
abases
|
|
abash
|
|
abashed
|
|
abashes
|
|
abashing
|
|
abasing
|
|
abate
|
|
abated
|
|
abatement
|
|
abatements
|
|
abater
|
|
abates
|
|
abating
|
|
Abba
|
|
abbe
|
|
abbey
|
|
abbeys
|
|
abbot
|
|
abbots
|
|
Abbott
|
|
abbreviate
|
|
abbreviated
|
|
abbreviates
|
|
abbreviating
|
|
abbreviation
|
|
abbreviations
|
|
Abby
|
|
abdomen
|
|
abdomens
|
|
abdominal
|
|
abduct
|
|
abducted
|
|
abduction
|
|
abductions
|
|
abductor
|
|
abductors
|
|
abducts
|
|
Abe
|
|
abed
|
|
Abel
|
|
Abelian
|
|
Abelson
|
|
Aberdeen
|
|
Abernathy
|
|
aberrant
|
|
aberration
|
|
|
|
2 abase
|
|
abased
|
|
abasement
|
|
abasements
|
|
abases
|
|
abash
|
|
abashed
|
|
abashes
|
|
abashing
|
|
abasing
|
|
abate
|
|
abated
|
|
abatement
|
|
abatements
|
|
abater
|
|
abates
|
|
abating
|
|
Abba
|
|
abbe
|
|
abbey
|
|
abbeys
|
|
abbot
|
|
abbots
|
|
Abbott
|
|
abbreviate
|
|
abbreviated
|
|
abbreviates
|
|
abbreviating
|
|
abbreviation
|
|
abbreviations
|
|
Abby
|
|
abdomen
|
|
abdomens
|
|
abdominal
|
|
abduct
|
|
abducted
|
|
abduction
|
|
abductions
|
|
abductor
|
|
abductors
|
|
abducts
|
|
Abe
|
|
abed
|
|
Abel
|
|
Abelian
|
|
Abelson
|
|
Aberdeen
|
|
Abernathy
|
|
aberrant
|
|
aberration
|
|
|
|
SELECT * FROM test.t1 ORDER BY blob_column;
|
|
a blob_column
|
|
1 abase
|
|
abased
|
|
abasement
|
|
abasements
|
|
abases
|
|
abash
|
|
abashed
|
|
abashes
|
|
abashing
|
|
abasing
|
|
abate
|
|
abated
|
|
abatement
|
|
abatements
|
|
abater
|
|
abates
|
|
abating
|
|
Abba
|
|
abbe
|
|
abbey
|
|
abbeys
|
|
abbot
|
|
abbots
|
|
Abbott
|
|
abbreviate
|
|
abbreviated
|
|
abbreviates
|
|
abbreviating
|
|
abbreviation
|
|
abbreviations
|
|
Abby
|
|
abdomen
|
|
abdomens
|
|
abdominal
|
|
abduct
|
|
abducted
|
|
abduction
|
|
abductions
|
|
abductor
|
|
abductors
|
|
abducts
|
|
Abe
|
|
abed
|
|
Abel
|
|
Abelian
|
|
Abelson
|
|
Aberdeen
|
|
Abernathy
|
|
aberrant
|
|
aberration
|
|
|
|
2 abase
|
|
abased
|
|
abasement
|
|
abasements
|
|
abases
|
|
abash
|
|
abashed
|
|
abashes
|
|
abashing
|
|
abasing
|
|
abate
|
|
abated
|
|
abatement
|
|
abatements
|
|
abater
|
|
abates
|
|
abating
|
|
Abba
|
|
abbe
|
|
abbey
|
|
abbeys
|
|
abbot
|
|
abbots
|
|
Abbott
|
|
abbreviate
|
|
abbreviated
|
|
abbreviates
|
|
abbreviating
|
|
abbreviation
|
|
abbreviations
|
|
Abby
|
|
abdomen
|
|
abdomens
|
|
abdominal
|
|
abduct
|
|
abducted
|
|
abduction
|
|
abductions
|
|
abductor
|
|
abductors
|
|
abducts
|
|
Abe
|
|
abed
|
|
Abel
|
|
Abelian
|
|
Abelson
|
|
Aberdeen
|
|
Abernathy
|
|
aberrant
|
|
aberration
|
|
|
|
DROP PROCEDURE IF EXISTS test.p1;
|
|
DROP TABLE test.t1;
|
|
**** Resetting master and slave ****
|
|
include/stop_slave.inc
|
|
RESET SLAVE;
|
|
RESET MASTER;
|
|
include/start_slave.inc
|
|
SELECT repeat('x',20) INTO OUTFILE 'MYSQLTEST_VARDIR/tmp/bug_39701.data';
|
|
DROP TABLE IF EXISTS t1;
|
|
CREATE TABLE t1 (t text);
|
|
CREATE PROCEDURE p(file TEXT)
|
|
BEGIN
|
|
INSERT INTO t1 VALUES (LOAD_FILE(file));
|
|
END|
|
|
include/stop_slave.inc
|
|
CALL p('MYSQLTEST_VARDIR/tmp/bug_39701.data');
|
|
include/start_slave.inc
|
|
Comparing tables master:test.t1 and slave:test.t1
|
|
DROP TABLE t1;
|
|
DROP PROCEDURE p;
|