Commit 932c2f12 authored by unknown's avatar unknown

Merge pippilotta.erinye.com:/shared/home/df/mysql/build/mysql-4.1

into  pippilotta.erinye.com:/shared/home/df/mysql/build/mysql-4.1-build
parents 01c3ccc5 4b32c7ef
...@@ -803,6 +803,14 @@ quote(name) ...@@ -803,6 +803,14 @@ quote(name)
???????? ????????
???????????????? ????????????????
drop table bug20536; drop table bug20536;
set names ucs2;
ERROR 42000: Variable 'character_set_client' can't be set to the value of 'ucs2'
set names ucs2 collate ucs2_bin;
ERROR 42000: Variable 'character_set_client' can't be set to the value of 'ucs2'
set character_set_client= ucs2;
ERROR 42000: Variable 'character_set_client' can't be set to the value of 'ucs2'
set character_set_client= concat('ucs', substr('2', 1));
ERROR 42000: Variable 'character_set_client' can't be set to the value of 'ucs2'
CREATE TABLE t1(a TEXT CHARSET ucs2 COLLATE ucs2_unicode_ci); CREATE TABLE t1(a TEXT CHARSET ucs2 COLLATE ucs2_unicode_ci);
INSERT INTO t1 VALUES('abcd'); INSERT INTO t1 VALUES('abcd');
SELECT * FROM t1 WHERE MATCH(a) AGAINST ('+abcd' IN BOOLEAN MODE); SELECT * FROM t1 WHERE MATCH(a) AGAINST ('+abcd' IN BOOLEAN MODE);
......
...@@ -1109,4 +1109,9 @@ a ...@@ -1109,4 +1109,9 @@ a
13 13
DEALLOCATE PREPARE st1; DEALLOCATE PREPARE st1;
DROP TABLE t1; DROP TABLE t1;
create table t1 (a int, b tinyint);
prepare st1 from 'update t1 set b= (str_to_date(a, a))';
execute st1;
deallocate prepare st1;
drop table t1;
End of 4.1 tests. End of 4.1 tests.
...@@ -535,6 +535,18 @@ select quote(name) from bug20536; ...@@ -535,6 +535,18 @@ select quote(name) from bug20536;
drop table bug20536; drop table bug20536;
#
# Bug #31615: crash after set names ucs2 collate xxx
#
--error 1231
set names ucs2;
--error 1231
set names ucs2 collate ucs2_bin;
--error 1231
set character_set_client= ucs2;
--error 1231
set character_set_client= concat('ucs', substr('2', 1));
# #
# BUG#31159 - fulltext search on ucs2 column crashes server # BUG#31159 - fulltext search on ucs2 column crashes server
# #
......
...@@ -1146,4 +1146,13 @@ EXECUTE st1; ...@@ -1146,4 +1146,13 @@ EXECUTE st1;
DEALLOCATE PREPARE st1; DEALLOCATE PREPARE st1;
DROP TABLE t1; DROP TABLE t1;
#
# Bug #32137: prepared statement crash with str_to_date in update clause
#
create table t1 (a int, b tinyint);
prepare st1 from 'update t1 set b= (str_to_date(a, a))';
execute st1;
deallocate prepare st1;
drop table t1;
--echo End of 4.1 tests. --echo End of 4.1 tests.
...@@ -2958,39 +2958,42 @@ Field *Item_func_str_to_date::tmp_table_field(TABLE *t_arg) ...@@ -2958,39 +2958,42 @@ Field *Item_func_str_to_date::tmp_table_field(TABLE *t_arg)
void Item_func_str_to_date::fix_length_and_dec() void Item_func_str_to_date::fix_length_and_dec()
{ {
char format_buff[64];
String format_str(format_buff, sizeof(format_buff), &my_charset_bin);
String *format;
maybe_null= 1; maybe_null= 1;
decimals=0; decimals=0;
cached_field_type= MYSQL_TYPE_STRING; cached_field_type= MYSQL_TYPE_STRING;
max_length= MAX_DATETIME_FULL_WIDTH*MY_CHARSET_BIN_MB_MAXLEN; max_length= MAX_DATETIME_FULL_WIDTH*MY_CHARSET_BIN_MB_MAXLEN;
cached_timestamp_type= MYSQL_TIMESTAMP_NONE; cached_timestamp_type= MYSQL_TIMESTAMP_NONE;
format= args[1]->val_str(&format_str); if ((const_item= args[1]->const_item()))
if (!args[1]->null_value && (const_item= args[1]->const_item()))
{ {
cached_format_type= get_date_time_result_type(format->ptr(), char format_buff[64];
format->length()); String format_str(format_buff, sizeof(format_buff), &my_charset_bin);
switch (cached_format_type) { String *format= args[1]->val_str(&format_str);
case DATE_ONLY: if (!args[1]->null_value)
cached_timestamp_type= MYSQL_TIMESTAMP_DATE; {
cached_field_type= MYSQL_TYPE_DATE; cached_format_type= get_date_time_result_type(format->ptr(),
max_length= MAX_DATE_WIDTH*MY_CHARSET_BIN_MB_MAXLEN; format->length());
break; switch (cached_format_type) {
case TIME_ONLY: case DATE_ONLY:
case TIME_MICROSECOND: cached_timestamp_type= MYSQL_TIMESTAMP_DATE;
cached_timestamp_type= MYSQL_TIMESTAMP_TIME; cached_field_type= MYSQL_TYPE_DATE;
cached_field_type= MYSQL_TYPE_TIME; max_length= MAX_DATE_WIDTH * MY_CHARSET_BIN_MB_MAXLEN;
max_length= MAX_TIME_WIDTH*MY_CHARSET_BIN_MB_MAXLEN; break;
break; case TIME_ONLY:
default: case TIME_MICROSECOND:
cached_timestamp_type= MYSQL_TIMESTAMP_DATETIME; cached_timestamp_type= MYSQL_TIMESTAMP_TIME;
cached_field_type= MYSQL_TYPE_DATETIME; cached_field_type= MYSQL_TYPE_TIME;
break; max_length= MAX_TIME_WIDTH * MY_CHARSET_BIN_MB_MAXLEN;
break;
default:
cached_timestamp_type= MYSQL_TIMESTAMP_DATETIME;
cached_field_type= MYSQL_TYPE_DATETIME;
break;
}
} }
} }
} }
bool Item_func_str_to_date::get_date(TIME *ltime, uint fuzzy_date) bool Item_func_str_to_date::get_date(TIME *ltime, uint fuzzy_date)
{ {
DATE_TIME_FORMAT date_time_format; DATE_TIME_FORMAT date_time_format;
......
...@@ -1992,6 +1992,21 @@ void sys_var_character_set_client::set_default(THD *thd, enum_var_type type) ...@@ -1992,6 +1992,21 @@ void sys_var_character_set_client::set_default(THD *thd, enum_var_type type)
} }
bool sys_var_character_set_client::check(THD *thd, set_var *var)
{
if (sys_var_character_set::check(thd, var))
return 1;
/* Currently, UCS-2 cannot be used as a client character set */
if (var->save_result.charset->mbminlen > 1)
{
my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), name,
var->save_result.charset->csname);
return 1;
}
return 0;
}
CHARSET_INFO ** CHARSET_INFO **
sys_var_character_set_results::ci_ptr(THD *thd, enum_var_type type) sys_var_character_set_results::ci_ptr(THD *thd, enum_var_type type)
{ {
...@@ -2355,6 +2370,13 @@ bool sys_var_key_cache_long::update(THD *thd, set_var *var) ...@@ -2355,6 +2370,13 @@ bool sys_var_key_cache_long::update(THD *thd, set_var *var)
int set_var_collation_client::check(THD *thd) int set_var_collation_client::check(THD *thd)
{ {
/* Currently, UCS-2 cannot be used as a client character set */
if (character_set_client->mbminlen > 1)
{
my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), "character_set_client",
character_set_client->csname);
return 1;
}
return 0; return 0;
} }
......
...@@ -578,6 +578,7 @@ class sys_var_character_set_client :public sys_var_character_set ...@@ -578,6 +578,7 @@ class sys_var_character_set_client :public sys_var_character_set
sys_var_character_set(name_arg) {} sys_var_character_set(name_arg) {}
void set_default(THD *thd, enum_var_type type); void set_default(THD *thd, enum_var_type type);
CHARSET_INFO **ci_ptr(THD *thd, enum_var_type type); CHARSET_INFO **ci_ptr(THD *thd, enum_var_type type);
bool check(THD *thd, set_var *var);
}; };
class sys_var_character_set_results :public sys_var_character_set class sys_var_character_set_results :public sys_var_character_set
......
...@@ -802,7 +802,7 @@ int my_long10_to_str_8bit(CHARSET_INFO *cs __attribute__((unused)), ...@@ -802,7 +802,7 @@ int my_long10_to_str_8bit(CHARSET_INFO *cs __attribute__((unused)),
{ {
if (val < 0) if (val < 0)
{ {
val= -(unsigned long int)val; val= ULL(0) - (unsigned long int)val;
*dst++= '-'; *dst++= '-';
len--; len--;
sign= 1; sign= 1;
...@@ -838,7 +838,7 @@ int my_longlong10_to_str_8bit(CHARSET_INFO *cs __attribute__((unused)), ...@@ -838,7 +838,7 @@ int my_longlong10_to_str_8bit(CHARSET_INFO *cs __attribute__((unused)),
{ {
if (val < 0) if (val < 0)
{ {
val = -(ulonglong)val; val = ULL(0) - (ulonglong)val;
*dst++= '-'; *dst++= '-';
len--; len--;
sign= 1; sign= 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment