List:Internals« Previous MessageNext Message »
From:bar Date:March 4 2005 10:20am
Subject:bk commit into 4.1 tree (bar:1.2078) BUG#8291
View as plain text  
Below is the list of changes that have just been committed into a local
4.1 repository of bar. When bar 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.2078 05/03/04 14:20:49 bar@stripped +11 -0
  type_blob.result, func_system.result, func_str.result, ctype_collate.result:
    fixing test results accordingly.
  func_system.test:
    New test that illegal mix of collations does not happen anymore.
  item_strfunc.h:
      safe_charset_converter() was added for system constants.
  item_strfunc.cc:
    safe_charset_converter() was added for system constants.
  item_func.cc, item.h, item.cc:
    Bug#8291: Illegal collation mix with USER() function.
    After discussion with PeterG and Serge, a new coercibility
    level for "system constants" was introduced, between
    COERRIBLE and IMPLICIT. Thus:
    SELECT col1 = USER() FROM t1; - is done according to col1 collation.
    SELECT 'string' = USER(); - is done according to USER() collation.
    At the same time, "nagg" and "strong" members were removed as unused.
  item_create.cc:
    Version is a system constant too.

  mysql-test/r/type_blob.result
    1.42 05/03/04 14:20:16 bar@stripped +1 -1
    fixing test results accordingly.

  mysql-test/r/func_system.result
    1.19 05/03/04 14:20:09 bar@stripped +8 -0
    fixing test results accordingly.

  mysql-test/r/func_str.result
    1.86 05/03/04 14:19:59 bar@stripped +31 -31
    fixing test results accordingly.

  mysql-test/r/ctype_collate.result
    1.28 05/03/04 14:19:46 bar@stripped +2 -2
    fixing test results accordingly.

  mysql-test/t/func_system.test
    1.11 05/03/04 14:19:11 bar@stripped +9 -0
    New test that illegal mix of collations does not happen anymore.

  sql/item_strfunc.h
    1.91 05/03/04 14:18:04 bar@stripped +12 -4
      safe_charset_converter() was added for system constants.

  sql/item_strfunc.cc
    1.217 05/03/04 14:17:10 bar@stripped +17 -0
    safe_charset_converter() was added for system constants.

  sql/item_func.cc
    1.236 05/03/04 14:16:47 bar@stripped +0 -2
    Bug#8291: Illegal collation mix with USER() function.
    After discussion with PeterG and Serge, a new coercibility
    level for "system constants" was introduced, between
    COERRIBLE and IMPLICIT. Thus:
    SELECT col1 = USER() FROM t1; - is done according to col1 collation.
    SELECT 'string' = USER(); - is done according to USER() collation.
    At the same time, "nagg" and "strong" members were removed as unused.

  sql/item_create.cc
    1.70 05/03/04 14:16:28 bar@stripped +1 -1
    Version is a system constant too.

  sql/item.h
    1.172 05/03/04 14:16:24 bar@stripped +4 -8
    Bug#8291: Illegal collation mix with USER() function.
    After discussion with PeterG and Serge, a new coercibility
    level for "system constants" was introduced, between
    COERRIBLE and IMPLICIT. Thus:
    SELECT col1 = USER() FROM t1; - is done according to col1 collation.
    SELECT 'string' = USER(); - is done according to USER() collation.
    At the same time, "nagg" and "strong" members were removed as unused.

  sql/item.cc
    1.192 05/03/04 14:15:39 bar@stripped +2 -8
    Bug#8291: Illegal collation mix with USER() function.
    After discussion with PeterG and Serge, a new coercibility
    level for "system constants" was introduced, between
    COERRIBLE and IMPLICIT. Thus:
    SELECT col1 = USER() FROM t1; - is done according to col1 collation.
    SELECT 'string' = USER(); - is done according to USER() collation.
    At the same time, "nagg" and "strong" members were removed as unused.

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	bar
# Host:	bar.intranet.mysql.r18.ru
# Root:	/usr/home/bar/mysql-4.1

--- 1.191/sql/item.cc	2005-02-22 14:51:19 +04:00
+++ 1.192/sql/item.cc	2005-03-04 14:15:39 +04:00
@@ -384,7 +384,6 @@
 */
 bool DTCollation::aggregate(DTCollation &dt, uint flags)
 {
-  nagg++;
   if (!my_charset_same(collation, dt.collation))
   {
     /* 
@@ -400,7 +399,6 @@
       else
       {
 	set(dt); 
-        strong= nagg;
       }
     }
     else if (dt.collation == &my_charset_bin)
@@ -408,7 +406,6 @@
       if (dt.derivation <= derivation)
       {
         set(dt);
-        strong= nagg;
       }
       else
        ; // Do nothing
@@ -424,20 +421,18 @@
              dt.collation->state & MY_CS_UNICODE)
     {
       set(dt);
-      strong= nagg;
     }
     else if ((flags & MY_COLL_ALLOW_COERCIBLE_CONV) &&
              derivation < dt.derivation &&
-             dt.derivation >= DERIVATION_COERCIBLE)
+             dt.derivation >= DERIVATION_SYSCONST)
     {
       // Do nothing;
     }
     else if ((flags & MY_COLL_ALLOW_COERCIBLE_CONV) &&
              dt.derivation < derivation &&
-             derivation >= DERIVATION_COERCIBLE)
+             derivation >= DERIVATION_SYSCONST)
     {
       set(dt);
-      strong= nagg;
     }
     else
     {
@@ -453,7 +448,6 @@
   else if (dt.derivation < derivation)
   {
     set(dt);
-    strong= nagg;
   }
   else
   { 

--- 1.171/sql/item.h	2005-03-03 06:03:18 +04:00
+++ 1.172/sql/item.h	2005-03-04 14:16:24 +04:00
@@ -31,8 +31,9 @@
 
 enum Derivation
 {
-  DERIVATION_IGNORABLE= 4,
-  DERIVATION_COERCIBLE= 3,
+  DERIVATION_IGNORABLE= 5,
+  DERIVATION_COERCIBLE= 4,
+  DERIVATION_SYSCONST= 3,
   DERIVATION_IMPLICIT= 2,
   DERIVATION_NONE= 1,
   DERIVATION_EXPLICIT= 0
@@ -61,22 +62,16 @@
 public:
   CHARSET_INFO     *collation;
   enum Derivation derivation;
-  uint nagg;    // Total number of aggregated collations.
-  uint strong;  // Number of the strongest collation.
   
   DTCollation()
   {
     collation= &my_charset_bin;
     derivation= DERIVATION_NONE;
-    nagg= 0;
-    strong= 0;
   }
   DTCollation(CHARSET_INFO *collation_arg, Derivation derivation_arg)
   {
     collation= collation_arg;
     derivation= derivation_arg;
-    nagg= 0;
-    strong= 0;
   }
   void set(DTCollation &dt)
   { 
@@ -102,6 +97,7 @@
       case DERIVATION_IGNORABLE: return "IGNORABLE";
       case DERIVATION_COERCIBLE: return "COERCIBLE";
       case DERIVATION_IMPLICIT:  return "IMPLICIT";
+      case DERIVATION_SYSCONST:  return "SYSCONST";
       case DERIVATION_EXPLICIT:  return "EXPLICIT";
       case DERIVATION_NONE:      return "NONE";
       default: return "UNKNOWN";

--- 1.69/sql/item_create.cc	2005-01-26 11:57:36 +04:00
+++ 1.70/sql/item_create.cc	2005-03-04 14:16:28 +04:00
@@ -441,7 +441,7 @@
 {
   return new Item_string(NullS,server_version, 
 			 (uint) strlen(server_version),
-			 system_charset_info, DERIVATION_IMPLICIT);
+			 system_charset_info, DERIVATION_SYSCONST);
 }
 
 Item *create_func_weekday(Item* a)

--- 1.235/sql/item_func.cc	2005-02-22 15:55:33 +04:00
+++ 1.236/sql/item_func.cc	2005-03-04 14:16:47 +04:00
@@ -79,8 +79,6 @@
                                    uint flags)
 {
   uint i;
-  c.nagg= 0;
-  c.strong= 0;
   c.set(av[0]->collation);
   for (i= 1; i < count; i++)
   {

--- 1.216/sql/item_strfunc.cc	2005-02-23 19:14:45 +04:00
+++ 1.217/sql/item_strfunc.cc	2005-03-04 14:17:10 +04:00
@@ -1509,6 +1509,23 @@
 }
 
 
+Item *Item_func_sysconst::safe_charset_converter(CHARSET_INFO *tocs)
+{
+  Item_string *conv;
+  uint conv_errors;
+  String tmp, cstr, *ostr= val_str(&tmp);
+  cstr.copy(ostr->ptr(), ostr->length(), ostr->charset(), tocs, &conv_errors);
+  if (conv_errors || !(conv= new Item_string(cstr.ptr(), cstr.length(),
+                                             cstr.charset(),
+                                             collation.derivation)))
+  {
+    return NULL;
+  }
+  conv->str_value.copy();
+  return conv;
+}
+
+
 String *Item_func_database::val_str(String *str)
 {
   DBUG_ASSERT(fixed == 1);

--- 1.90/sql/item_strfunc.h	2005-02-02 20:21:09 +04:00
+++ 1.91/sql/item_strfunc.h	2005-03-04 14:18:04 +04:00
@@ -337,10 +337,18 @@
 };
 
 
-class Item_func_database :public Item_str_func
+class Item_func_sysconst :public Item_str_func
 {
 public:
-  Item_func_database() { collation.set(system_charset_info,DERIVATION_IMPLICIT); }
+  Item_func_sysconst()
+  { collation.set(system_charset_info,DERIVATION_SYSCONST); }
+  Item *safe_charset_converter(CHARSET_INFO *tocs);
+};
+
+class Item_func_database :public Item_func_sysconst
+{
+public:
+  Item_func_database() :Item_func_sysconst() {}
   String *val_str(String *);
   void fix_length_and_dec()
   {
@@ -350,10 +358,10 @@
   const char *func_name() const { return "database"; }
 };
 
-class Item_func_user :public Item_str_func
+class Item_func_user :public Item_func_sysconst
 {
 public:
-  Item_func_user() { collation.set(system_charset_info, DERIVATION_IMPLICIT); }
+  Item_func_user() :Item_func_sysconst() {}
   String *val_str(String *);
   void fix_length_and_dec() 
   { 

--- 1.27/mysql-test/r/ctype_collate.result	2004-05-14 01:46:57 +05:00
+++ 1.28/mysql-test/r/ctype_collate.result	2005-03-04 14:19:46 +04:00
@@ -514,7 +514,7 @@
 character_set_client	latin1
 SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
 charset('a')	collation('a')	coercibility('a')	'a'='A'
-latin1	latin1_swedish_ci	3	1
+latin1	latin1_swedish_ci	4	1
 explain extended SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
 id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 1	SIMPLE	NULL	NULL	NULL	NULL	NULL	NULL	NULL	No tables used
@@ -525,7 +525,7 @@
 Variable_name	Value
 SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
 charset('a')	collation('a')	coercibility('a')	'a'='A'
-latin1	latin1_swedish_ci	3	1
+latin1	latin1_swedish_ci	4	1
 SET CHARACTER SET 'DEFAULT';
 ERROR 42000: Unknown character set: 'DEFAULT'
 DROP TABLE t1;

--- 1.18/mysql-test/r/func_system.result	2004-07-17 04:09:21 +05:00
+++ 1.19/mysql-test/r/func_system.result	2005-03-04 14:20:09 +04:00
@@ -68,3 +68,11 @@
 select TRUE,FALSE,NULL;
 TRUE	FALSE	NULL
 1	0	NULL
+create table t1 (a char(10)) character set latin1;
+select * from t1 where a=version();
+a
+select * from t1 where a=database();
+a
+select * from t1 where a=user();
+a
+drop table t1;

--- 1.41/mysql-test/r/type_blob.result	2004-11-22 22:06:52 +04:00
+++ 1.42/mysql-test/r/type_blob.result	2005-03-04 14:20:16 +04:00
@@ -499,7 +499,7 @@
 collation(load_file('../../std_data/words.dat')),
 coercibility(load_file('../../std_data/words.dat'));
 charset(load_file('../../std_data/words.dat'))	collation(load_file('../../std_data/words.dat'))	coercibility(load_file('../../std_data/words.dat'))
-binary	binary	3
+binary	binary	4
 explain extended select 
 charset(load_file('../../std_data/words.dat')),
 collation(load_file('../../std_data/words.dat')),

--- 1.10/mysql-test/t/func_system.test	2004-02-11 16:53:35 +04:00
+++ 1.11/mysql-test/t/func_system.test	2005-03-04 14:19:11 +04:00
@@ -30,3 +30,12 @@
 drop table t1;
 
 select TRUE,FALSE,NULL;
+
+#
+# Bug#8291 Illegal collation mix with USER() function
+#
+create table t1 (a char(10)) character set latin1;
+select * from t1 where a=version();
+select * from t1 where a=database();
+select * from t1 where a=user();
+drop table t1;

--- 1.85/mysql-test/r/func_str.result	2005-02-23 19:14:45 +04:00
+++ 1.86/mysql-test/r/func_str.result	2005-03-04 14:19:59 +04:00
@@ -464,97 +464,97 @@
 ERROR HY000: Illegal mix of collations (latin1_general_ci,EXPLICIT), (latin1_swedish_ci,COERCIBLE), (latin1_bin,EXPLICIT) for operation ' IN '
 select collation(bin(130)), coercibility(bin(130));
 collation(bin(130))	coercibility(bin(130))
-latin1_swedish_ci	3
+latin1_swedish_ci	4
 select collation(oct(130)), coercibility(oct(130));
 collation(oct(130))	coercibility(oct(130))
-latin1_swedish_ci	3
+latin1_swedish_ci	4
 select collation(conv(130,16,10)), coercibility(conv(130,16,10));
 collation(conv(130,16,10))	coercibility(conv(130,16,10))
-latin1_swedish_ci	3
+latin1_swedish_ci	4
 select collation(hex(130)), coercibility(hex(130));
 collation(hex(130))	coercibility(hex(130))
-latin1_swedish_ci	3
+latin1_swedish_ci	4
 select collation(char(130)), coercibility(hex(130));
 collation(char(130))	coercibility(hex(130))
-latin1_swedish_ci	3
+latin1_swedish_ci	4
 select collation(format(130,10)), coercibility(format(130,10));
 collation(format(130,10))	coercibility(format(130,10))
-latin1_swedish_ci	3
+latin1_swedish_ci	4
 select collation(lcase(_latin2'a')), coercibility(lcase(_latin2'a'));
 collation(lcase(_latin2'a'))	coercibility(lcase(_latin2'a'))
-latin2_general_ci	3
+latin2_general_ci	4
 select collation(ucase(_latin2'a')), coercibility(ucase(_latin2'a'));
 collation(ucase(_latin2'a'))	coercibility(ucase(_latin2'a'))
-latin2_general_ci	3
+latin2_general_ci	4
 select collation(left(_latin2'a',1)), coercibility(left(_latin2'a',1));
 collation(left(_latin2'a',1))	coercibility(left(_latin2'a',1))
-latin2_general_ci	3
+latin2_general_ci	4
 select collation(right(_latin2'a',1)), coercibility(right(_latin2'a',1));
 collation(right(_latin2'a',1))	coercibility(right(_latin2'a',1))
-latin2_general_ci	3
+latin2_general_ci	4
 select collation(substring(_latin2'a',1,1)), coercibility(substring(_latin2'a',1,1));
 collation(substring(_latin2'a',1,1))	coercibility(substring(_latin2'a',1,1))
-latin2_general_ci	3
+latin2_general_ci	4
 select collation(concat(_latin2'a',_latin2'b')), coercibility(concat(_latin2'a',_latin2'b'));
 collation(concat(_latin2'a',_latin2'b'))	coercibility(concat(_latin2'a',_latin2'b'))
-latin2_general_ci	3
+latin2_general_ci	4
 select collation(lpad(_latin2'a',4,_latin2'b')), coercibility(lpad(_latin2'a',4,_latin2'b'));
 collation(lpad(_latin2'a',4,_latin2'b'))	coercibility(lpad(_latin2'a',4,_latin2'b'))
-latin2_general_ci	3
+latin2_general_ci	4
 select collation(rpad(_latin2'a',4,_latin2'b')), coercibility(rpad(_latin2'a',4,_latin2'b'));
 collation(rpad(_latin2'a',4,_latin2'b'))	coercibility(rpad(_latin2'a',4,_latin2'b'))
-latin2_general_ci	3
+latin2_general_ci	4
 select collation(concat_ws(_latin2'a',_latin2'b')), coercibility(concat_ws(_latin2'a',_latin2'b'));
 collation(concat_ws(_latin2'a',_latin2'b'))	coercibility(concat_ws(_latin2'a',_latin2'b'))
-latin2_general_ci	3
+latin2_general_ci	4
 select collation(make_set(255,_latin2'a',_latin2'b',_latin2'c')), coercibility(make_set(255,_latin2'a',_latin2'b',_latin2'c'));
 collation(make_set(255,_latin2'a',_latin2'b',_latin2'c'))	coercibility(make_set(255,_latin2'a',_latin2'b',_latin2'c'))
-latin2_general_ci	3
+latin2_general_ci	4
 select collation(export_set(255,_latin2'y',_latin2'n',_latin2' ')), coercibility(export_set(255,_latin2'y',_latin2'n',_latin2' '));
 collation(export_set(255,_latin2'y',_latin2'n',_latin2' '))	coercibility(export_set(255,_latin2'y',_latin2'n',_latin2' '))
-binary	3
+binary	4
 select collation(trim(_latin2' a ')), coercibility(trim(_latin2' a '));
 collation(trim(_latin2' a '))	coercibility(trim(_latin2' a '))
-latin2_general_ci	3
+latin2_general_ci	4
 select collation(ltrim(_latin2' a ')), coercibility(ltrim(_latin2' a '));
 collation(ltrim(_latin2' a '))	coercibility(ltrim(_latin2' a '))
-latin2_general_ci	3
+latin2_general_ci	4
 select collation(rtrim(_latin2' a ')), coercibility(rtrim(_latin2' a '));
 collation(rtrim(_latin2' a '))	coercibility(rtrim(_latin2' a '))
-latin2_general_ci	3
+latin2_general_ci	4
 select collation(trim(LEADING _latin2' ' FROM _latin2'a')), coercibility(trim(LEADING _latin2'a' FROM _latin2'a'));
 collation(trim(LEADING _latin2' ' FROM _latin2'a'))	coercibility(trim(LEADING _latin2'a' FROM _latin2'a'))
-latin2_general_ci	3
+latin2_general_ci	4
 select collation(trim(TRAILING _latin2' ' FROM _latin2'a')), coercibility(trim(TRAILING _latin2'a' FROM _latin2'a'));
 collation(trim(TRAILING _latin2' ' FROM _latin2'a'))	coercibility(trim(TRAILING _latin2'a' FROM _latin2'a'))
-latin2_general_ci	3
+latin2_general_ci	4
 select collation(trim(BOTH _latin2' ' FROM _latin2'a')), coercibility(trim(BOTH _latin2'a' FROM _latin2'a'));
 collation(trim(BOTH _latin2' ' FROM _latin2'a'))	coercibility(trim(BOTH _latin2'a' FROM _latin2'a'))
-latin2_general_ci	3
+latin2_general_ci	4
 select collation(repeat(_latin2'a',10)), coercibility(repeat(_latin2'a',10));
 collation(repeat(_latin2'a',10))	coercibility(repeat(_latin2'a',10))
-latin2_general_ci	3
+latin2_general_ci	4
 select collation(reverse(_latin2'ab')), coercibility(reverse(_latin2'ab'));
 collation(reverse(_latin2'ab'))	coercibility(reverse(_latin2'ab'))
-latin2_general_ci	3
+latin2_general_ci	4
 select collation(quote(_latin2'ab')), coercibility(quote(_latin2'ab'));
 collation(quote(_latin2'ab'))	coercibility(quote(_latin2'ab'))
-latin2_general_ci	3
+latin2_general_ci	4
 select collation(soundex(_latin2'ab')), coercibility(soundex(_latin2'ab'));
 collation(soundex(_latin2'ab'))	coercibility(soundex(_latin2'ab'))
-latin2_general_ci	3
+latin2_general_ci	4
 select collation(substring(_latin2'ab',1)), coercibility(substring(_latin2'ab',1));
 collation(substring(_latin2'ab',1))	coercibility(substring(_latin2'ab',1))
-latin2_general_ci	3
+latin2_general_ci	4
 select collation(insert(_latin2'abcd',2,3,_latin2'ef')), coercibility(insert(_latin2'abcd',2,3,_latin2'ef'));
 collation(insert(_latin2'abcd',2,3,_latin2'ef'))	coercibility(insert(_latin2'abcd',2,3,_latin2'ef'))
-latin2_general_ci	3
+latin2_general_ci	4
 select collation(replace(_latin2'abcd',_latin2'b',_latin2'B')), coercibility(replace(_latin2'abcd',_latin2'b',_latin2'B'));
 collation(replace(_latin2'abcd',_latin2'b',_latin2'B'))	coercibility(replace(_latin2'abcd',_latin2'b',_latin2'B'))
-latin2_general_ci	3
+latin2_general_ci	4
 select collation(encode('abcd','ab')), coercibility(encode('abcd','ab'));
 collation(encode('abcd','ab'))	coercibility(encode('abcd','ab'))
-binary	3
+binary	4
 create table t1 
 select
 bin(130),
Thread
bk commit into 4.1 tree (bar:1.2078) BUG#8291bar4 Mar