Commit 0920c75b authored by unknown's avatar unknown

Fixed bug #29360.

The special `zero' enum value was coerced to the normal
empty string enum value during a field-to-field copy.
This bug affected CREATE ... SELECT statements and
SELECT aggregate GROUP BY enum field statements.

Also this bug made unnecessary warnings during
the execution of CREATE ... SELECT statements:
Warning       1265    Data truncated for column...


sql/field_conv.cc:
  Fixed bug #29360.
  The field_conv function has been modified to properly convert
  the special `zero' enum value between enum fields.
mysql-test/t/type_enum.test:
  Updated test case for bug #29360.
mysql-test/r/type_enum.result:
  Updated test case for bug #29360.
mysql-test/r/type_ranges.result:
  Updated test case for bug #29360.
parent 3295d449
...@@ -1809,3 +1809,23 @@ f1 ...@@ -1809,3 +1809,23 @@ f1
drop table t1; drop table t1;
CREATE TABLE t1 (c1 ENUM('a', '', 'b'));
INSERT INTO t1 (c1) VALUES ('b');
INSERT INTO t1 (c1) VALUES ('');
INSERT INTO t1 (c1) VALUES (0);
Warnings:
Warning 1265 Data truncated for column 'c1' at row 1
INSERT INTO t1 (c1) VALUES ('');
SELECT c1 + 0, COUNT(c1) FROM t1 GROUP BY c1;
c1 + 0 COUNT(c1)
0 1
2 2
3 1
CREATE TABLE t2 SELECT * FROM t1;
SELECT c1 + 0 FROM t2;
c1 + 0
3
2
0
2
DROP TABLE t1,t2;
......
...@@ -208,10 +208,6 @@ options flags ...@@ -208,10 +208,6 @@ options flags
one one one one
drop table t2; drop table t2;
create table t2 select * from t1; create table t2 select * from t1;
Warnings:
Warning 1265 Data truncated for column 'options' at row 4
Warning 1265 Data truncated for column 'options' at row 5
Warning 1265 Data truncated for column 'options' at row 6
update t2 set string="changed" where auto=16; update t2 set string="changed" where auto=16;
show full columns from t1; show full columns from t1;
Field Type Collation Null Key Default Extra Privileges Comment Field Type Collation Null Key Default Extra Privileges Comment
......
...@@ -182,3 +182,21 @@ create table t1(f1 set('a','b'), index(f1)); ...@@ -182,3 +182,21 @@ create table t1(f1 set('a','b'), index(f1));
insert into t1 values(''),(''),('a'),('b'); insert into t1 values(''),(''),('a'),('b');
select * from t1 where f1=''; select * from t1 where f1='';
drop table t1; drop table t1;
#
# Bug#29360: Confluence of the special 0 enum value with the normal empty string
# value during field to field copy.
#
CREATE TABLE t1 (c1 ENUM('a', '', 'b'));
INSERT INTO t1 (c1) VALUES ('b');
INSERT INTO t1 (c1) VALUES ('');
INSERT INTO t1 (c1) VALUES (0);
INSERT INTO t1 (c1) VALUES ('');
SELECT c1 + 0, COUNT(c1) FROM t1 GROUP BY c1;
CREATE TABLE t2 SELECT * FROM t1;
SELECT c1 + 0 FROM t2;
DROP TABLE t1,t2;
......
...@@ -790,11 +790,17 @@ int field_conv(Field *to,Field *from) ...@@ -790,11 +790,17 @@ int field_conv(Field *to,Field *from)
blob->value.copy(); blob->value.copy();
return blob->store(blob->value.ptr(),blob->value.length(),from->charset()); return blob->store(blob->value.ptr(),blob->value.length(),from->charset());
} }
if ((from->result_type() == STRING_RESULT && if (from->real_type() == FIELD_TYPE_ENUM &&
(to->result_type() == STRING_RESULT || to->real_type() == FIELD_TYPE_ENUM &&
(from->real_type() != FIELD_TYPE_ENUM && from->val_int() == 0)
from->real_type() != FIELD_TYPE_SET))) || {
to->type() == FIELD_TYPE_DECIMAL) ((Field_enum *)(to))->store_type(0);
}
else if ((from->result_type() == STRING_RESULT &&
(to->result_type() == STRING_RESULT ||
(from->real_type() != FIELD_TYPE_ENUM &&
from->real_type() != FIELD_TYPE_SET))) ||
to->type() == FIELD_TYPE_DECIMAL)
{ {
char buff[MAX_FIELD_WIDTH]; char buff[MAX_FIELD_WIDTH];
String result(buff,sizeof(buff),from->charset()); String result(buff,sizeof(buff),from->charset());
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment