Skip to content

Commit b9b1bda

Browse files
Merge branch 'mysql-5.5' into mysql-5.6
2 parents 3cab0d6 + 9f7288e commit b9b1bda

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
@@ -1413,8 +1413,8 @@ READ_INFO::READ_INFO(File file_par, uint tot_length, const CHARSET_INFO *cs,
14131413
set_if_bigger(length,line_start.length());
14141414
stack=stack_pos=(int*) sql_alloc(sizeof(int)*length);
14151415

1416-
if (!(buffer=(uchar*) my_malloc(buff_length+1,MYF(0))))
1417-
error=1; /* purecov: inspected */
1416+
if (!(buffer=(uchar*) my_malloc(buff_length+1,MYF(MY_WME))))
1417+
error= true; /* purecov: inspected */
14181418
else
14191419
{
14201420
end_of_buff=buffer+buff_length;
@@ -1607,37 +1607,50 @@ int READ_INFO::read_field()
16071607
}
16081608
}
16091609
#ifdef USE_MB
1610-
if (my_mbcharlen(read_charset, chr) > 1 &&
1611-
to + my_mbcharlen(read_charset, chr) <= end_of_buff)
1612-
{
1613-
uchar* p= to;
1614-
int ml, i;
1615-
*to++ = chr;
1616-
1617-
ml= my_mbcharlen(read_charset, chr);
1610+
uint ml= my_mbcharlen(read_charset, chr);
1611+
if (ml == 0)
1612+
{
1613+
*to= '\0';
1614+
my_error(ER_INVALID_CHARACTER_STRING, MYF(0),
1615+
read_charset->csname, buffer);
1616+
error= true;
1617+
return 1;
1618+
}
16181619

1619-
for (i= 1; i < ml; i++)
1620+
if (ml > 1 &&
1621+
to + ml <= end_of_buff)
16201622
{
1621-
chr= GET;
1622-
if (chr == my_b_EOF)
1623+
uchar* p= to;
1624+
*to++ = chr;
1625+
1626+
for (uint i= 1; i < ml; i++)
16231627
{
1624-
/*
1625-
Need to back up the bytes already ready from illformed
1626-
multi-byte char
1627-
*/
1628-
to-= i;
1629-
goto found_eof;
1628+
chr= GET;
1629+
if (chr == my_b_EOF)
1630+
{
1631+
/*
1632+
Need to back up the bytes already ready from illformed
1633+
multi-byte char
1634+
*/
1635+
to-= i;
1636+
goto found_eof;
1637+
}
1638+
*to++ = chr;
16301639
}
1631-
*to++ = chr;
1632-
}
1633-
if (my_ismbchar(read_charset,
1640+
if (my_ismbchar(read_charset,
16341641
(const char *)p,
16351642
(const char *)to))
1636-
continue;
1637-
for (i= 0; i < ml; i++)
1638-
PUSH(*--to);
1639-
chr= GET;
1640-
}
1643+
continue;
1644+
for (uint i= 0; i < ml; i++)
1645+
PUSH(*--to);
1646+
chr= GET;
1647+
}
1648+
else if (ml > 1)
1649+
{
1650+
// Buffer is too small, exit while loop, and reallocate.
1651+
PUSH(chr);
1652+
break;
1653+
}
16411654
#endif
16421655
*to++ = (uchar) chr;
16431656
}
@@ -1886,7 +1899,15 @@ int READ_INFO::read_value(int delim, String *val)
18861899
for (chr= GET; my_tospace(chr) != delim && chr != my_b_EOF;)
18871900
{
18881901
#ifdef USE_MB
1889-
if (my_mbcharlen(read_charset, chr) > 1)
1902+
uint ml= my_mbcharlen(read_charset, chr);
1903+
if (ml == 0)
1904+
{
1905+
chr= my_b_EOF;
1906+
val->length(0);
1907+
return chr;
1908+
}
1909+
1910+
if (ml > 1)
18901911
{
18911912
DBUG_PRINT("read_xml",("multi byte"));
18921913
int i, ml= my_mbcharlen(read_charset, chr);

0 commit comments

Comments
 (0)