MySQL Lists are EOL. Please join:

List:Commits« Previous MessageNext Message »
From:igor Date:August 5 2007 9:16pm
Subject:bk commit into 5.0 tree (igor:1.2501) BUG#30219
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of igor. When igor 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@stripped, 2007-08-05 14:16:49-07:00, igor@stripped +3 -0
  Fix bug #30219.
  This bug manifested itself for queries with grouping by columns of
  the BIT type. It led to wrong comparisons of bit-field values and
  wrong result sets.
  Bit-field values never cannot be compared as binary values. Yet
  the class Field_bit had an implementation of the cmp method that
  compared bit-fields values as binary values. 
  Also the get_image and set_image methods of the base class Field 
  cannot be used for objects of the Field_bit class. 
  Now these methods are declared as virtual and specific implementations
  of the methods are provided for the class Field_bit.

  mysql-test/r/type_bit.result@stripped, 2007-08-05 14:16:44-07:00, igor@stripped +32 -0
    Added a test case for bug #30219.

  mysql-test/t/type_bit.test@stripped, 2007-08-05 14:16:44-07:00, igor@stripped +24 -0
    Added a test case for bug #30219.

  sql/field.h@stripped, 2007-08-05 14:16:44-07:00, igor@stripped +10 -3
    Fix bug #30219.
    This bug manifested itself for queries with grouping by columns of
    the BIT type. It led to wrong comparisons of bit-field values and
    wrong result sets.
    Bit-field values never cannot be compared as binary values. Yet
    the class Field_bit had an implementation of the cmp method that
    compared bit-fields values as binary values.
    Also the get_image and set_image methods of the base class Field
    cannot be used for objects of the Field_bit class. 
    Now these methods are declared as virtual and specific implementations
    of these methods are provided for the class Field_bit.

diff -Nrup a/mysql-test/r/type_bit.result b/mysql-test/r/type_bit.result
--- a/mysql-test/r/type_bit.result	2007-01-18 05:09:48 -08:00
+++ b/mysql-test/r/type_bit.result	2007-08-05 14:16:44 -07:00
@@ -618,4 +618,36 @@ bit_field	int_field
 	2
 handler t1 close;
 drop table t1;
+CREATE TABLE t1 (b BIT(2));
+INSERT INTO t1 (b) VALUES (1), (3), (0), (3);
+SELECT b+0, COUNT(DISTINCT b) FROM t1 GROUP BY b;
+b+0	COUNT(DISTINCT b)
+0	1
+1	1
+3	1
+DROP TABLE t1;
+CREATE TABLE t1 (b BIT(2), a VARCHAR(5));
+INSERT INTO t1 (b, a) VALUES (1, "x"), (3, "zz"), (0, "y"), (3, "z");
+SELECT b+0, COUNT(DISTINCT a) FROM t1 GROUP BY b;
+b+0	COUNT(DISTINCT a)
+0	1
+1	1
+3	2
+DROP TABLE t1;
+CREATE TABLE t1 (a CHAR(5), b BIT(2));
+INSERT INTO t1 (b, a) VALUES (1, "x"), (3, "zz"), (0, "y"), (3, "z");
+SELECT b+0, COUNT(DISTINCT a) FROM t1 GROUP BY b;
+b+0	COUNT(DISTINCT a)
+0	1
+1	1
+3	2
+DROP TABLE t1;
+CREATE TABLE t1 (a INT, b BIT(2));
+INSERT INTO t1 (b, a) VALUES (1, 1), (3, 2), (0, 3), (3, 4);
+SELECT b+0, COUNT(DISTINCT a) FROM t1 GROUP BY b;
+b+0	COUNT(DISTINCT a)
+0	1
+1	1
+3	2
+DROP TABLE t1;
 End of 5.0 tests
diff -Nrup a/mysql-test/t/type_bit.test b/mysql-test/t/type_bit.test
--- a/mysql-test/t/type_bit.test	2006-11-27 14:47:19 -08:00
+++ b/mysql-test/t/type_bit.test	2007-08-05 14:16:44 -07:00
@@ -272,4 +272,28 @@ handler t1 read a=(1);
 handler t1 close;
 drop table t1;
 
+#
+# Bug #30219: GROUP BY a column of the BIT type
+#
+
+CREATE TABLE t1 (b BIT(2));
+INSERT INTO t1 (b) VALUES (1), (3), (0), (3);
+SELECT b+0, COUNT(DISTINCT b) FROM t1 GROUP BY b;
+DROP TABLE t1;
+
+CREATE TABLE t1 (b BIT(2), a VARCHAR(5));
+INSERT INTO t1 (b, a) VALUES (1, "x"), (3, "zz"), (0, "y"), (3, "z");
+SELECT b+0, COUNT(DISTINCT a) FROM t1 GROUP BY b;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a CHAR(5), b BIT(2));
+INSERT INTO t1 (b, a) VALUES (1, "x"), (3, "zz"), (0, "y"), (3, "z");
+SELECT b+0, COUNT(DISTINCT a) FROM t1 GROUP BY b;
+DROP TABLE t1;
+
+CREATE TABLE t1 (a INT, b BIT(2));
+INSERT INTO t1 (b, a) VALUES (1, 1), (3, 2), (0, 3), (3, 4);
+SELECT b+0, COUNT(DISTINCT a) FROM t1 GROUP BY b;
+DROP TABLE t1;
+
 --echo End of 5.0 tests
diff -Nrup a/sql/field.h b/sql/field.h
--- a/sql/field.h	2007-07-19 14:30:22 -07:00
+++ b/sql/field.h	2007-08-05 14:16:44 -07:00
@@ -231,9 +231,9 @@ public:
     if (null_ptr)
       null_ptr=ADD_TO_PTR(null_ptr,ptr_diff,uchar*);
   }
-  inline void get_image(char *buff,uint length, CHARSET_INFO *cs)
+  virtual void get_image(char *buff, uint length, CHARSET_INFO *cs)
     { memcpy(buff,ptr,length); }
-  inline void set_image(char *buff,uint length, CHARSET_INFO *cs)
+  virtual void set_image(char *buff,uint length, CHARSET_INFO *cs)
     { memcpy(ptr,buff,length); }
 
 
@@ -1430,13 +1430,20 @@ public:
   String *val_str(String*, String *);
   my_decimal *val_decimal(my_decimal *);
   int cmp(const char *a, const char *b)
-  { return cmp_binary(a, b); }
+  { 
+    DBUG_ASSERT(ptr == a);
+    return Field_bit::key_cmp(b, bytes_in_rec+test(bit_len));
+  }
   int key_cmp(const byte *a, const byte *b)
   { return cmp_binary((char *) a, (char *) b); }
   int key_cmp(const byte *str, uint length);
   int cmp_offset(uint row_offset);
   int cmp_binary_offset(uint row_offset)
   { return cmp_offset(row_offset); }
+  void get_image(char *buff, uint length, CHARSET_INFO *cs)
+  { get_key_image(buff, length, itRAW); }   
+  void set_image(char *buff,uint length, CHARSET_INFO *cs)
+  { Field_bit::store(buff, length, cs); }
   uint get_key_image(char *buff, uint length, imagetype type);
   void set_key_image(char *buff, uint length)
   { Field_bit::store(buff, length, &my_charset_bin); }
Thread
bk commit into 5.0 tree (igor:1.2501) BUG#30219igor5 Aug