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#8291 | bar | 4 Mar |