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

 3644 Sergey Glukhov	2011-04-01
      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	2010-12-21 12:30:07 +0000
+++ b/mysql-test/r/func_group.result	2011-04-01 07:54:43 +0000
@@ -1737,4 +1737,15 @@ SELECT MIN(GET_LOCK('aaaaaaaaaaaaaaaaa',
 SELECT MIN(GET_LOCK('aaaaaaaaaaaaaaaaa',0) / '0b1111111111111111111111111111111111111111111111111111111111111111111111111' ^ (RAND()));
 SELECT RELEASE_LOCK('aaaaaaaaaaaaaaaaa');
 #
+# 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	2010-12-21 12:30:07 +0000
+++ b/mysql-test/t/func_group.test	2011-04-01 07:54:43 +0000
@@ -1118,5 +1118,17 @@ SELECT RELEASE_LOCK('aaaaaaaaaaaaaaaaa')
 --enable_result_log
 
 --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-01 07:54:43 +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-01 07:54:43 +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-20110401075443-vzlybvxxh4xjeqb6.bundle
Thread
bzr commit into mysql-5.1 branch (sergey.glukhov:3644) Bug#11766270Sergey Glukhov1 Apr