Skip to content

Commit 9f7288e

Browse files
BUG#23080148 - BACKPORT BUG 14653594 AND BUG 20683959 TO
MYSQL-5.5 The bug asks for a backport of bug#1463594 and bug#20682959. This is required because of the fact that if replication is enabled, master transaction can commit whereas slave can't commit due to not exact 'enviroment'. This manifestation is seen in bug#22024200.
1 parent 4a3f1c1 commit 9f7288e

4 files changed

Lines changed: 99 additions & 30 deletions

File tree

mysql-test/r/loaddata.result

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,7 @@ DROP TABLE t1;
507507
# Bug#11765139 58069: LOAD DATA INFILE: VALGRIND REPORTS INVALID MEMORY READS AND WRITES WITH U
508508
#
509509
CREATE TABLE t1(f1 INT);
510-
SELECT 0xE1BB30 INTO OUTFILE 't1.dat';
510+
SELECT 0xE1C330 INTO OUTFILE 't1.dat';
511511
LOAD DATA INFILE 't1.dat' IGNORE INTO TABLE t1 CHARACTER SET utf8;
512512
DROP TABLE t1;
513513
#
@@ -532,3 +532,27 @@ FIELDS TERMINATED BY 't' LINES TERMINATED BY '';
532532
Got one of the listed errors
533533
SET @@sql_mode= @old_mode;
534534
DROP TABLE t1;
535+
536+
#
537+
# Bug#23080148 - Backport of Bug#20683959.
538+
# Bug#20683959 LOAD DATA INFILE IGNORES A SPECIFIC ROW SILENTLY
539+
# UNDER DB CHARSET IS UTF8.
540+
#
541+
CREATE DATABASE d1 CHARSET latin1;
542+
USE d1;
543+
CREATE TABLE t1 (val TEXT);
544+
LOAD DATA INFILE '../../std_data/bug20683959loaddata.txt' INTO TABLE t1;
545+
SELECT COUNT(*) FROM t1;
546+
COUNT(*)
547+
1
548+
SELECT HEX(val) FROM t1;
549+
HEX(val)
550+
C38322525420406E696F757A656368756E3A20E98198E2889AF58081AEE7B99DE4B88AE383A3E7B99DE69690F58087B3E7B9A7EFBDA8E7B99DEFBDB3E7B99DE78999E880B3E7B8BAEFBDAAE7B9A7E89699E296A1E7B8BAE4BBA3EFBD8CE7B8BAEFBDA9E7B8B2E2889AE38184E7B99DEFBDB3E7B99DE4B88AE383A3E7B99DE69690F58087B3E7B9A7EFBDA8E7B99DEFBDB3E7B99DE5B3A8EFBD84E8ABA0EFBDA8E89C89F580948EE599AAE7B8BAEFBDAAE7B8BAE9A198EFBDA9EFBDB1E7B9A7E581B5E289A0E7B8BAEFBDBEE7B9A7E9A194EFBDA9E882B4EFBDA5EFBDB5E980A7F5808B96E28693E99EABE38287E58F99E7B8BAE58AB1E28691E7B8BAF5808B9AE7828AE98095EFBDB1E7B8BAEFBDAFE7B8B2E288ABE6A89FE89EB3E6BA98F58081ADE88EA0EFBDBAE98095E6BA98F58081AEE89D93EFBDBAE8AD9BEFBDACE980A7F5808B96E28693E7B8BAF580918EE288AAE7B8BAE4B88AEFBC9EE7B8BAE4B99DE28691E7B8BAF5808B96EFBCA0E88DB3E6A68AEFBDB9EFBDB3E981B2E5B3A8E296A1E7B8BAE7A4BCE7828AE88DB3E6A68AEFBDB0EFBDBDE7B8BAA0E7B8BAE88B93EFBDBEE5B899EFBC9E
551+
CREATE DATABASE d2 CHARSET utf8;
552+
USE d2;
553+
CREATE TABLE t1 (val TEXT);
554+
LOAD DATA INFILE '../../std_data/bug20683959loaddata.txt' INTO TABLE t1;
555+
ERROR HY000: Invalid utf8 character string: '�"RT @niouzechun: \9058\221A'
556+
DROP TABLE d1.t1, d2.t1;
557+
DROP DATABASE d1;
558+
DROP DATABASE d2;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Ã"RT @niouzechun: 遘√����繝上ャ繝斐����繧ィ繝ウ繝牙耳縺ェ繧薙□縺代l縺ゥ縲√い繝ウ繝上ャ繝斐����繧ィ繝ウ繝峨d諠ィ蜉����噪縺ェ縺願ゥア繧偵≠縺セ繧顔ゥ肴・オ逧����↓鞫ょ叙縺励↑縺����炊逕ア縺ッ縲∫樟螳溘����莠コ逕溘����蝓コ譛ャ逧����↓縺����∪縺上>縺九↑縺����@荳榊ケウ遲峨□縺礼炊荳榊ース縺�縺苓セ帙>

mysql-test/t/loaddata.test

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -610,7 +610,7 @@ disconnect con1;
610610
--echo #
611611

612612
CREATE TABLE t1(f1 INT);
613-
EVAL SELECT 0xE1BB30 INTO OUTFILE 't1.dat';
613+
EVAL SELECT 0xE1C330 INTO OUTFILE 't1.dat';
614614
--disable_warnings
615615
LOAD DATA INFILE 't1.dat' IGNORE INTO TABLE t1 CHARACTER SET utf8;
616616
--enable_warnings
@@ -656,3 +656,26 @@ SET @@sql_mode= @old_mode;
656656
--remove_file $MYSQLTEST_VARDIR/mysql
657657
DROP TABLE t1;
658658

659+
--echo
660+
--echo #
661+
--echo # Bug#23080148 - Backport of Bug#20683959.
662+
--echo # Bug#20683959 LOAD DATA INFILE IGNORES A SPECIFIC ROW SILENTLY
663+
--echo # UNDER DB CHARSET IS UTF8.
664+
--echo #
665+
666+
CREATE DATABASE d1 CHARSET latin1;
667+
USE d1;
668+
CREATE TABLE t1 (val TEXT);
669+
LOAD DATA INFILE '../../std_data/bug20683959loaddata.txt' INTO TABLE t1;
670+
SELECT COUNT(*) FROM t1;
671+
SELECT HEX(val) FROM t1;
672+
673+
CREATE DATABASE d2 CHARSET utf8;
674+
USE d2;
675+
CREATE TABLE t1 (val TEXT);
676+
--error ER_INVALID_CHARACTER_STRING
677+
LOAD DATA INFILE '../../std_data/bug20683959loaddata.txt' INTO TABLE t1;
678+
679+
DROP TABLE d1.t1, d2.t1;
680+
DROP DATABASE d1;
681+
DROP DATABASE d2;

sql/sql_load.cc

Lines changed: 49 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1363,8 +1363,8 @@ READ_INFO::READ_INFO(File file_par, uint tot_length, CHARSET_INFO *cs,
13631363
set_if_bigger(length,line_start.length());
13641364
stack=stack_pos=(int*) sql_alloc(sizeof(int)*length);
13651365

1366-
if (!(buffer=(uchar*) my_malloc(buff_length+1,MYF(0))))
1367-
error=1; /* purecov: inspected */
1366+
if (!(buffer=(uchar*) my_malloc(buff_length+1,MYF(MY_WME))))
1367+
error= true; /* purecov: inspected */
13681368
else
13691369
{
13701370
end_of_buff=buffer+buff_length;
@@ -1556,37 +1556,50 @@ int READ_INFO::read_field()
15561556
}
15571557
}
15581558
#ifdef USE_MB
1559-
if (my_mbcharlen(read_charset, chr) > 1 &&
1560-
to + my_mbcharlen(read_charset, chr) <= end_of_buff)
1561-
{
1562-
uchar* p= to;
1563-
int ml, i;
1564-
*to++ = chr;
1565-
1566-
ml= my_mbcharlen(read_charset, chr);
1559+
uint ml= my_mbcharlen(read_charset, chr);
1560+
if (ml == 0)
1561+
{
1562+
*to= '\0';
1563+
my_error(ER_INVALID_CHARACTER_STRING, MYF(0),
1564+
read_charset->csname, buffer);
1565+
error= true;
1566+
return 1;
1567+
}
15671568

1568-
for (i= 1; i < ml; i++)
1569+
if (ml > 1 &&
1570+
to + ml <= end_of_buff)
15691571
{
1570-
chr= GET;
1571-
if (chr == my_b_EOF)
1572+
uchar* p= to;
1573+
*to++ = chr;
1574+
1575+
for (uint i= 1; i < ml; i++)
15721576
{
1573-
/*
1574-
Need to back up the bytes already ready from illformed
1575-
multi-byte char
1576-
*/
1577-
to-= i;
1578-
goto found_eof;
1577+
chr= GET;
1578+
if (chr == my_b_EOF)
1579+
{
1580+
/*
1581+
Need to back up the bytes already ready from illformed
1582+
multi-byte char
1583+
*/
1584+
to-= i;
1585+
goto found_eof;
1586+
}
1587+
*to++ = chr;
15791588
}
1580-
*to++ = chr;
1581-
}
1582-
if (my_ismbchar(read_charset,
1589+
if (my_ismbchar(read_charset,
15831590
(const char *)p,
15841591
(const char *)to))
1585-
continue;
1586-
for (i= 0; i < ml; i++)
1587-
PUSH(*--to);
1588-
chr= GET;
1589-
}
1592+
continue;
1593+
for (uint i= 0; i < ml; i++)
1594+
PUSH(*--to);
1595+
chr= GET;
1596+
}
1597+
else if (ml > 1)
1598+
{
1599+
// Buffer is too small, exit while loop, and reallocate.
1600+
PUSH(chr);
1601+
break;
1602+
}
15901603
#endif
15911604
*to++ = (uchar) chr;
15921605
}
@@ -1830,7 +1843,15 @@ int READ_INFO::read_value(int delim, String *val)
18301843
for (chr= GET; my_tospace(chr) != delim && chr != my_b_EOF;)
18311844
{
18321845
#ifdef USE_MB
1833-
if (my_mbcharlen(read_charset, chr) > 1)
1846+
uint ml= my_mbcharlen(read_charset, chr);
1847+
if (ml == 0)
1848+
{
1849+
chr= my_b_EOF;
1850+
val->length(0);
1851+
return chr;
1852+
}
1853+
1854+
if (ml > 1)
18341855
{
18351856
DBUG_PRINT("read_xml",("multi byte"));
18361857
int i, ml= my_mbcharlen(read_charset, chr);

0 commit comments

Comments
 (0)