List:Commits« Previous MessageNext Message »
From:Sergey Glukhov Date:April 12 2011 10:01am
Subject:bzr commit into mysql-5.1 branch (sergey.glukhov:3655) Bug#11766270
View as plain text  
#At file:///home/gluh/MySQL/mysql-5.1/ based on revid:sergey.glukhov@stripped

 3655 Sergey Glukhov	2011-04-12
      Bug#11766270 59343: YEAR(4): INCORRECT RESULT AND VALGRIND WARNINGS WITH MIN/MAX, UNION
      When we create temporary result table for UNION
      incorrect max_length for YEAR field is used and
      it leads to incorrect field value and incorrect
      result string length as YEAR field value calculation
      depends on field length.
      The fix is to use underlying item max_length for
      Item_sum_hybrid::max_length intialization.
     @ mysql-test/r/func_group.result
        test case
     @ mysql-test/t/func_group.test
        test case
     @ sql/field.cc
        added assert
     @ sql/item_sum.cc
        init Item_sum_hybrid::max_length with 
        use underlying item max_length for
        INT result type.

    modified:
      mysql-test/r/func_group.result
      mysql-test/t/func_group.test
      sql/field.cc
      sql/item_sum.cc
=== modified file 'mysql-test/r/func_group.result'
--- a/mysql-test/r/func_group.result	2011-03-31 18:59:11 +0000
+++ b/mysql-test/r/func_group.result	2011-04-12 10:01:33 +0000
@@ -1746,4 +1746,15 @@ MAX(LENGTH(a))	LENGTH(MAX(a))	MIN(a)	MAX
 20	20	18446668621106209655	18446668621106209655	18446668621106209655	18446668621106209655
 DROP TABLE t1;
 #
+# Bug #11766270  59343: YEAR(4): INCORRECT RESULT AND VALGRIND WARNINGS WITH MIN/MAX, UNION
+#
+CREATE TABLE t1(f1 YEAR(4));
+INSERT INTO t1 VALUES (0000),(2001);
+(SELECT MAX(f1) FROM t1) UNION (SELECT MAX(f1) FROM t1);
+Catalog	Database	Table	Table_alias	Column	Column_alias	Type	Length	Max length	Is_null	Flags	Decimals	Charsetnr
+def				MAX(f1)	MAX(f1)	13	4	4	Y	32864	0	63
+MAX(f1)
+2001
+DROP TABLE t1;
+#
 End of 5.1 tests

=== modified file 'mysql-test/t/func_group.test'
--- a/mysql-test/t/func_group.test	2011-03-31 18:59:11 +0000
+++ b/mysql-test/t/func_group.test	2011-04-12 10:01:33 +0000
@@ -1128,5 +1128,17 @@ SELECT MAX(LENGTH(a)), LENGTH(MAX(a)), M
 DROP TABLE t1;
 
 --echo #
+--echo # Bug #11766270  59343: YEAR(4): INCORRECT RESULT AND VALGRIND WARNINGS WITH MIN/MAX, UNION
+--echo #
+
+CREATE TABLE t1(f1 YEAR(4));
+INSERT INTO t1 VALUES (0000),(2001);
+--enable_metadata
+(SELECT MAX(f1) FROM t1) UNION (SELECT MAX(f1) FROM t1);
+--disable_metadata
+DROP TABLE t1;
+
+
+--echo #
 --echo End of 5.1 tests
 

=== modified file 'sql/field.cc'
--- a/sql/field.cc	2011-02-08 11:52:33 +0000
+++ b/sql/field.cc	2011-04-12 10:01:33 +0000
@@ -5467,6 +5467,7 @@ double Field_year::val_real(void)
 longlong Field_year::val_int(void)
 {
   ASSERT_COLUMN_MARKED_FOR_READ;
+  DBUG_ASSERT(field_length == 2 || field_length == 4);
   int tmp= (int) ptr[0];
   if (field_length != 4)
     tmp%=100;					// Return last 2 char
@@ -5479,6 +5480,7 @@ longlong Field_year::val_int(void)
 String *Field_year::val_str(String *val_buffer,
 			    String *val_ptr __attribute__((unused)))
 {
+  DBUG_ASSERT(field_length < 5);
   val_buffer->alloc(5);
   val_buffer->length(field_length);
   char *to=(char*) val_buffer->ptr();

=== modified file 'sql/item_sum.cc'
--- a/sql/item_sum.cc	2011-02-22 21:03:32 +0000
+++ b/sql/item_sum.cc	2011-04-12 10:01:33 +0000
@@ -612,17 +612,13 @@ Item_sum_hybrid::fix_fields(THD *thd, It
 
   switch (hybrid_type= item->result_type()) {
   case INT_RESULT:
-    max_length= 20;
-    break;
   case DECIMAL_RESULT:
+  case STRING_RESULT:
     max_length= item->max_length;
     break;
   case REAL_RESULT:
     max_length= float_length(decimals);
     break;
-  case STRING_RESULT:
-    max_length= item->max_length;
-    break;
   case ROW_RESULT:
   default:
     DBUG_ASSERT(0);


Attachment: [text/bzr-bundle] bzr/sergey.glukhov@oracle.com-20110412100133-qhsvx5oeo3ji23hb.bundle
Thread
bzr commit into mysql-5.1 branch (sergey.glukhov:3655) Bug#11766270Sergey Glukhov12 Apr