Pantek Library
Hosting Provided By
CybrHost
High Speed Hosting

bk commit into 4.1 tree (gshchepa:1.2670) BUG#29251

From: <gshchepa(at)mysql.com>
Date: Tue Jun 26 2007 - 17:45:58 EDT


Below is the list of changes that have just been committed into a local 4.1 repository of uchum. When uchum does a push these changes will be propagated to the main repository and, within 24 hours after the push, to the public repository.
For information on how to access the public repository see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@1.2670, 2007-06-27 02:45:56+05:00, gshchepa@gleb.loc +3 -0   Fixed bug #29251.
  Sometimes special 0 ENUM values was ALTERed to normal   empty string ENUM values.   

  Special 0 ENUM value has the same string representation   as normal ENUM value defined as '' (empty string).   The do_field_string function was used to conver   ENUM data during the ALTER TABLE request, but that   function doesn't care about numerical "indices" of   ENUM values, i.e. do_field_string doesn't distinguish   special 0 value from normal empty string value.   

  New copy function (do_field_enum) has been added to   copy special 0 ENUM values without conversion to string.

  mysql-test/r/type_enum.result@1.28, 2007-06-27 02:27:02+05:00, gshchepa@gleb.loc +23 -0     Updated test case for bug #29251.

  mysql-test/t/type_enum.test@1.18, 2007-06-27 02:26:53+05:00, gshchepa@gleb.loc +17 -0     Updated test case for bug #29251.

  sql/field_conv.cc@1.40, 2007-06-27 02:26:40+05:00, gshchepa@gleb.loc +16 -1     Fixed bug #29251.
    The Copy_field::get_copy_func method has been modified to     return a pointer to the do_field_enum function if a conversion     between two columns of incompatible enum types is required.     The do_field_enum function has been added for the correct     conversion of special 0 enum values.

diff -Nrup a/mysql-test/r/type_enum.result b/mysql-test/r/type_enum.result

--- a/mysql-test/r/type_enum.result	2007-02-12 17:31:43 +04:00

+++ b/mysql-test/r/type_enum.result 2007-06-27 02:27:02 +05:00
@@ -1778,4 +1778,27 @@ drop table t1;
 create table t1(exhausting_charset enum('ABCDEFGHIJKLMNOPQRSTUVWXYZ','    !"','#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~','xx\','yy\€','zz‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'));  ERROR 42000: Field separator argument is not what is expected; check the manual
+CREATE TABLE t1 (
+id INT AUTO_INCREMENT PRIMARY KEY,
+c1 ENUM('a', '', 'b')
+);
+INSERT INTO t1 (c1) VALUES (0), ('a'), (''), ('b');
+Warnings:
+Warning 1265 Data truncated for column 'c1' at row 1
+SELECT id, c1 + 0, c1 FROM t1;
+id c1 + 0 c1
+1 0
+2 1 a
+3 2
+4 3 b
+ALTER TABLE t1 CHANGE c1 c1 ENUM('a', '') NOT NULL;
+Warnings:
+Warning 1265 Data truncated for column 'c1' at row 4
+SELECT id, c1 + 0, c1 FROM t1;
+id c1 + 0 c1
+1 0
+2 1 a
+3 2
+4 0
+DROP TABLE t1;

 End of 4.1 tests
diff -Nrup a/mysql-test/t/type_enum.test b/mysql-test/t/type_enum.test
--- a/mysql-test/t/type_enum.test	2007-02-12 17:31:43 +04:00

+++ b/mysql-test/t/type_enum.test 2007-06-27 02:26:53 +05:00
@@ -156,4 +156,21 @@ drop table t1;
 create table t1(exhausting_charset enum('ABCDEFGHIJKLMNOPQRSTUVWXYZ','    !"','#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~','xx\','yy\€','zz‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'));  
Do you need help?X

+#
+# Bug #29251: MySQL coerces special 0 enum values to normal '' value
+# when ALTERing the column
+#
+
+CREATE TABLE t1 (
+ id INT AUTO_INCREMENT PRIMARY KEY,
+ c1 ENUM('a', '', 'b')
+);
+INSERT INTO t1 (c1) VALUES (0), ('a'), (''), ('b');
+SELECT id, c1 + 0, c1 FROM t1;
+
+ALTER TABLE t1 CHANGE c1 c1 ENUM('a', '') NOT NULL;
+SELECT id, c1 + 0, c1 FROM t1;
+
+DROP TABLE t1;
+

 --echo End of 4.1 tests
diff -Nrup a/sql/field_conv.cc b/sql/field_conv.cc

--- a/sql/field_conv.cc	2007-02-01 18:00:23 +04:00

+++ b/sql/field_conv.cc 2007-06-27 02:26:40 +05:00
@@ -311,6 +311,15 @@ static void do_field_string(Copy_field *  }    

+static void do_field_enum(Copy_field *copy)
+{
+ if (copy->from_field->val_int() == 0)
+ ((Field_enum *) copy->to_field)->store_type((ulonglong) 0);
+ else
+ do_field_string(copy);
+}
+
+

 static void do_field_int(Copy_field *copy)  {
   longlong value=copy->from_field->val_int(); @@ -538,7 +547,13 @@ void (*Copy_field::get_copy_func(Field *

 	  to->real_type() == FIELD_TYPE_SET)
       {
 	if (!to->eq_def(from))
-	  return do_field_string;

+ {
+ if (from->real_type() == MYSQL_TYPE_ENUM &&
+ to->real_type() == MYSQL_TYPE_ENUM)
+ return do_field_enum;
+ else
+ return do_field_string;
+ }
} else if (to->charset() != from->charset()) return do_field_string;
-- 
MySQL Code Commits Mailing List
For list archives: 
http://lists.mysql.com/commits
To unsubscribe:    
http://lists.mysql.com/commits?unsub=lists@pantek.com
Received on Tue Jun 26 21:38:22 2007

This archive was generated by hypermail 2.1.8 : Tue Jun 26 2007 - 21:40:03 EDT


Contact Us  Legal Notices  Order Services Online 
Pantek Home  Privacy Policy  IT news  Site Map  Pantek Library