Skip to content

Commit 96820e0

Browse files
Merge branch 'mysql-5.6' into mysql-5.7
2 parents dbfd8b6 + a153699 commit 96820e0

File tree

5 files changed

+128
-2
lines changed

5 files changed

+128
-2
lines changed

mysql-test/r/alter_table.result

+53
Original file line numberDiff line numberDiff line change
@@ -3786,3 +3786,56 @@ ERROR HY000: Incorrect prefix key; the used key part isn't a string, the used le
37863786
DROP TABLE t1, t2;
37873787
SET sql_mode= @orig_sql_mode;
37883788
SET GLOBAL innodb_large_prefix= @orig_innodb_large_prefix;
3789+
#
3790+
# BUG#27788685: NO WARNING WHEN TRUNCATING A STRING WITH DATA LOSS
3791+
#
3792+
SET GLOBAL max_allowed_packet=17825792;
3793+
CREATE TABLE t1 (t1_fld1 TEXT) ENGINE=InnoDB;
3794+
CREATE TABLE t2 (t2_fld1 MEDIUMTEXT) ENGINE=InnoDB;
3795+
CREATE TABLE t3 (t3_fld1 LONGTEXT) ENGINE=InnoDB;
3796+
INSERT INTO t1 VALUES (REPEAT('a',300));
3797+
INSERT INTO t2 VALUES (REPEAT('b',65680));
3798+
INSERT INTO t3 VALUES (REPEAT('c',16777300));
3799+
SELECT LENGTH(t1_fld1) FROM t1;
3800+
LENGTH(t1_fld1)
3801+
300
3802+
SELECT LENGTH(t2_fld1) FROM t2;
3803+
LENGTH(t2_fld1)
3804+
65680
3805+
SELECT LENGTH(t3_fld1) FROM t3;
3806+
LENGTH(t3_fld1)
3807+
16777300
3808+
# With strict mode
3809+
SET SQL_MODE='STRICT_ALL_TABLES';
3810+
Warnings:
3811+
Warning 3135 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
3812+
Warning 3090 Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release.
3813+
ALTER TABLE t1 CHANGE `t1_fld1` `my_t1_fld1` TINYTEXT;
3814+
ERROR 22001: Data too long for column 'my_t1_fld1' at row 1
3815+
ALTER TABLE t2 CHANGE `t2_fld1` `my_t2_fld1` TEXT;
3816+
ERROR 22001: Data too long for column 'my_t2_fld1' at row 1
3817+
ALTER TABLE t3 CHANGE `t3_fld1` `my_t3_fld1` MEDIUMTEXT;
3818+
ERROR 22001: Data too long for column 'my_t3_fld1' at row 1
3819+
# With non-strict mode
3820+
SET SQL_MODE='';
3821+
ALTER TABLE t1 CHANGE `t1_fld1` `my_t1_fld1` TINYTEXT;
3822+
Warnings:
3823+
Warning 1265 Data truncated for column 'my_t1_fld1' at row 1
3824+
ALTER TABLE t2 CHANGE `t2_fld1` `my_t2_fld1` TEXT;
3825+
Warnings:
3826+
Warning 1265 Data truncated for column 'my_t2_fld1' at row 1
3827+
ALTER TABLE t3 CHANGE `t3_fld1` `my_t3_fld1` MEDIUMTEXT;
3828+
Warnings:
3829+
Warning 1265 Data truncated for column 'my_t3_fld1' at row 1
3830+
SELECT LENGTH(my_t1_fld1) FROM t1;
3831+
LENGTH(my_t1_fld1)
3832+
44
3833+
SELECT LENGTH(my_t2_fld1) FROM t2;
3834+
LENGTH(my_t2_fld1)
3835+
144
3836+
SELECT LENGTH(my_t3_fld1) FROM t3;
3837+
LENGTH(my_t3_fld1)
3838+
84
3839+
DROP TABLE t1, t2, t3;
3840+
SET SQL_MODE=default;
3841+
SET GLOBAL max_allowed_packet=default;

mysql-test/r/myisam-blob.result

+6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
SET SQL_MODE='';
2+
Warnings:
3+
Warning 3090 Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release.
14
drop table if exists t1;
25
CREATE TABLE t1 (data LONGBLOB) ENGINE=myisam;
36
INSERT INTO t1 (data) VALUES (NULL);
@@ -29,6 +32,8 @@ select length(data) from t1;
2932
length(data)
3033
18874368
3134
alter table t1 modify data blob;
35+
Warnings:
36+
Warning 1265 Data truncated for column 'data' at row 1
3237
select length(data) from t1;
3338
length(data)
3439
0
@@ -42,3 +47,4 @@ select length(data) from t1;
4247
length(data)
4348
65535
4449
drop table t1;
50+
SET SQL_MODE=default;

mysql-test/t/alter_table.test

+51
Original file line numberDiff line numberDiff line change
@@ -3167,3 +3167,54 @@ ALTER TABLE t2 ADD INDEX idx1(fld1(769));
31673167
DROP TABLE t1, t2;
31683168
SET sql_mode= @orig_sql_mode;
31693169
SET GLOBAL innodb_large_prefix= @orig_innodb_large_prefix;
3170+
3171+
--echo #
3172+
--echo # BUG#27788685: NO WARNING WHEN TRUNCATING A STRING WITH DATA LOSS
3173+
--echo #
3174+
3175+
--enable_warnings
3176+
SET GLOBAL max_allowed_packet=17825792;
3177+
3178+
--connect(con1, localhost, root,,)
3179+
CREATE TABLE t1 (t1_fld1 TEXT) ENGINE=InnoDB;
3180+
CREATE TABLE t2 (t2_fld1 MEDIUMTEXT) ENGINE=InnoDB;
3181+
CREATE TABLE t3 (t3_fld1 LONGTEXT) ENGINE=InnoDB;
3182+
3183+
INSERT INTO t1 VALUES (REPEAT('a',300));
3184+
INSERT INTO t2 VALUES (REPEAT('b',65680));
3185+
INSERT INTO t3 VALUES (REPEAT('c',16777300));
3186+
3187+
SELECT LENGTH(t1_fld1) FROM t1;
3188+
SELECT LENGTH(t2_fld1) FROM t2;
3189+
SELECT LENGTH(t3_fld1) FROM t3;
3190+
3191+
--echo # With strict mode
3192+
SET SQL_MODE='STRICT_ALL_TABLES';
3193+
3194+
--error ER_DATA_TOO_LONG
3195+
ALTER TABLE t1 CHANGE `t1_fld1` `my_t1_fld1` TINYTEXT;
3196+
--error ER_DATA_TOO_LONG
3197+
ALTER TABLE t2 CHANGE `t2_fld1` `my_t2_fld1` TEXT;
3198+
--error ER_DATA_TOO_LONG
3199+
ALTER TABLE t3 CHANGE `t3_fld1` `my_t3_fld1` MEDIUMTEXT;
3200+
3201+
--echo # With non-strict mode
3202+
SET SQL_MODE='';
3203+
3204+
ALTER TABLE t1 CHANGE `t1_fld1` `my_t1_fld1` TINYTEXT;
3205+
ALTER TABLE t2 CHANGE `t2_fld1` `my_t2_fld1` TEXT;
3206+
ALTER TABLE t3 CHANGE `t3_fld1` `my_t3_fld1` MEDIUMTEXT;
3207+
3208+
SELECT LENGTH(my_t1_fld1) FROM t1;
3209+
SELECT LENGTH(my_t2_fld1) FROM t2;
3210+
SELECT LENGTH(my_t3_fld1) FROM t3;
3211+
3212+
# Cleanup
3213+
--disconnect con1
3214+
--source include/wait_until_disconnected.inc
3215+
3216+
--connection default
3217+
DROP TABLE t1, t2, t3;
3218+
3219+
SET SQL_MODE=default;
3220+
SET GLOBAL max_allowed_packet=default;

mysql-test/t/myisam-blob.test

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
--source include/force_myisam_default.inc
77
--source include/have_myisam.inc
88

9+
SET SQL_MODE='';
910
#
1011
# Test bugs in the MyISAM code with blobs
1112
#
@@ -48,4 +49,5 @@ UPDATE IGNORE t1 set data=repeat('a',18*1024*1024);
4849
select length(data) from t1;
4950
drop table t1;
5051

52+
SET SQL_MODE=default;
5153
# End of 4.1 tests

sql/field_conv.cc

+16-2
Original file line numberDiff line numberDiff line change
@@ -325,9 +325,23 @@ static void do_copy_next_number(Copy_field *copy)
325325

326326
static void do_copy_blob(Copy_field *copy)
327327
{
328-
ulong length=((Field_blob*) copy->from_field())->get_length();
329-
((Field_blob*) copy->to_field())->store_length(length);
328+
ulong from_length=((Field_blob*) copy->from_field())->get_length();
329+
((Field_blob*) copy->to_field())->store_length(from_length);
330330
memcpy(copy->to_ptr, copy->from_ptr, sizeof(char*));
331+
ulong to_length=((Field_blob*) copy->to_field())->get_length();
332+
if (to_length < from_length)
333+
{
334+
if (copy->to_field()->table->in_use->is_strict_mode())
335+
{
336+
copy->to_field()->set_warning(Sql_condition::SL_WARNING,
337+
ER_DATA_TOO_LONG, 1);
338+
}
339+
else
340+
{
341+
copy->to_field()->set_warning(Sql_condition::SL_WARNING,
342+
WARN_DATA_TRUNCATED, 1);
343+
}
344+
}
331345
}
332346

333347
static void do_conv_blob(Copy_field *copy)

0 commit comments

Comments
 (0)