Commit 54f3949a authored by igor@olga.mysql.com's avatar igor@olga.mysql.com
Browse files

Fixed bug #29611.

If a primary key is defined over column c of enum type then 
the EXPLAIN command for a look-up query of the form
  SELECT * FROM t WHERE c=0
said that the query was with an impossible where condition though the
query correctly returned non-empty result set when the table indeed 
contained rows with error empty strings for column c. 

This kind of misbehavior was due to a bug in the function 
Field_enum::store(longlong,bool) that erroneously returned 1 if
the the value to be stored was equal to 0. 
Note that the method 
Field_enum::store(const char *from,uint length,CHARSET_INFO *cs)
correctly returned 0 if a value of the error empty string 
was stored. 
parent 7402fd6e
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -1829,3 +1829,27 @@ c1 + 0
0
2
DROP TABLE t1,t2;
CREATE TABLE t1(a enum('a','b','c','d'));
INSERT INTO t1 VALUES (4),(1),(0),(3);
Warnings:
Warning	1265	Data truncated for column 'a' at row 3
SELECT a FROM t1;
a
d
a

c
EXPLAIN SELECT a FROM t1 WHERE a=0;
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	4	Using where
SELECT a FROM t1 WHERE a=0;
a

ALTER TABLE t1 ADD PRIMARY KEY (a);
EXPLAIN SELECT a FROM t1 WHERE a=0;
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	t1	const	PRIMARY	PRIMARY	1	const	1	Using index
SELECT a FROM t1 WHERE a=0;
a

DROP TABLE t1;
+24 −0
Original line number Diff line number Diff line
@@ -200,3 +200,27 @@ CREATE TABLE t2 SELECT * FROM t1;
SELECT c1 + 0 FROM t2;

DROP TABLE t1,t2;

#
# Bug#29661: Lookup by 0 for a primary index over a enum type  
#

CREATE TABLE t1(a enum('a','b','c','d'));
INSERT INTO t1 VALUES (4),(1),(0),(3);

SELECT a FROM t1;

EXPLAIN SELECT a FROM t1 WHERE a=0;
SELECT a FROM t1 WHERE a=0;

ALTER TABLE t1 ADD PRIMARY KEY (a);

EXPLAIN SELECT a FROM t1 WHERE a=0;
SELECT a FROM t1 WHERE a=0;

DROP TABLE t1;




+5 −2
Original line number Diff line number Diff line
@@ -7640,9 +7640,12 @@ int Field_enum::store(longlong nr, bool unsigned_val)
  if ((ulonglong) nr > typelib->count || nr == 0)
  {
    set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1);
    if (nr != 0 || table->in_use->count_cuted_fields)
    {
      nr= 0;
      error= 1;
    }
  }
  store_type((ulonglong) (uint) nr);
  return error;
}