mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 14:33:32 +03:00 
			
		
		
		
	Merge mysql.com:/usr/home/bar/mysql-4.1.num-conv
into mysql.com:/usr/home/bar/mysql-5.0 mysql-test/r/ctype_utf8.result: Auto merged mysql-test/t/ctype_utf8.test: Auto merged sql/item.h: Auto merged sql/sql_table.cc: Auto merged sql/item.cc: After merge fix.
This commit is contained in:
		@@ -905,6 +905,10 @@ select * from t1 where city = 'Durban ';
 | 
			
		||||
id	city
 | 
			
		||||
2	Durban
 | 
			
		||||
drop table t1;
 | 
			
		||||
create table t1 (x set('A', 'B') default 0) character set utf8;
 | 
			
		||||
ERROR 42000: Invalid default value for 'x'
 | 
			
		||||
create table t1 (x enum('A', 'B') default 0) character set utf8;
 | 
			
		||||
ERROR 42000: Invalid default value for 'x'
 | 
			
		||||
SET NAMES UTF8;
 | 
			
		||||
CREATE TABLE t1 (
 | 
			
		||||
`id` int(20) NOT NULL auto_increment,
 | 
			
		||||
 
 | 
			
		||||
@@ -747,6 +747,15 @@ select * from t1 where city = 'Durban';
 | 
			
		||||
select * from t1 where city = 'Durban ';
 | 
			
		||||
drop table t1;
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Bug #11819 CREATE TABLE with a SET DEFAULT 0 and UTF8 crashes server.
 | 
			
		||||
#
 | 
			
		||||
--error 1067
 | 
			
		||||
create table t1 (x set('A', 'B') default 0) character set utf8;
 | 
			
		||||
--error 1067
 | 
			
		||||
create table t1 (x enum('A', 'B') default 0) character set utf8;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Test for bug #11167: join for utf8 varchar value longer than 255 bytes 
 | 
			
		||||
#
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										44
									
								
								sql/item.cc
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								sql/item.cc
									
									
									
									
									
								
							@@ -601,15 +601,43 @@ bool Item::eq(const Item *item, bool binary_cmp) const
 | 
			
		||||
Item *Item::safe_charset_converter(CHARSET_INFO *tocs)
 | 
			
		||||
{
 | 
			
		||||
  /*
 | 
			
		||||
    Allow conversion from and to "binary".
 | 
			
		||||
    Don't allow automatic conversion to non-Unicode charsets,
 | 
			
		||||
    as it potentially loses data.
 | 
			
		||||
  */
 | 
			
		||||
  if (!(tocs->state & MY_CS_UNICODE))
 | 
			
		||||
  if (collation.collation != &my_charset_bin &&
 | 
			
		||||
      tocs != &my_charset_bin &&
 | 
			
		||||
      !(tocs->state & MY_CS_UNICODE))
 | 
			
		||||
    return NULL; // safe conversion is not possible
 | 
			
		||||
  return new Item_func_conv_charset(this, tocs);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Created mostly for mysql_prepare_table(). Important
 | 
			
		||||
  when a string ENUM/SET column is described with a numeric default value:
 | 
			
		||||
 | 
			
		||||
  CREATE TABLE t1(a SET('a') DEFAULT 1);
 | 
			
		||||
 | 
			
		||||
  We cannot use generic Item::safe_charset_converter(), because
 | 
			
		||||
  the latter returns a non-fixed Item, so val_str() crashes afterwards.
 | 
			
		||||
  Override Item_num method, to return a fixed item.
 | 
			
		||||
*/
 | 
			
		||||
Item *Item_num::safe_charset_converter(CHARSET_INFO *tocs)
 | 
			
		||||
{
 | 
			
		||||
  Item_string *conv;
 | 
			
		||||
  char buf[64];
 | 
			
		||||
  String *s, tmp(buf, sizeof(buf), &my_charset_bin);
 | 
			
		||||
  s= val_str(&tmp);
 | 
			
		||||
  if ((conv= new Item_string(s->ptr(), s->length(), s->charset())))
 | 
			
		||||
  {
 | 
			
		||||
    conv->str_value.copy();
 | 
			
		||||
    conv->str_value.mark_as_const();
 | 
			
		||||
  }
 | 
			
		||||
  return conv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Item *Item_string::safe_charset_converter(CHARSET_INFO *tocs)
 | 
			
		||||
{
 | 
			
		||||
  Item_string *conv;
 | 
			
		||||
@@ -3754,6 +3782,20 @@ bool Item_hex_string::eq(const Item *arg, bool binary_cmp) const
 | 
			
		||||
  return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Item *Item_varbinary::safe_charset_converter(CHARSET_INFO *tocs)
 | 
			
		||||
{
 | 
			
		||||
  Item_string *conv;
 | 
			
		||||
  String tmp, *str= val_str(&tmp);
 | 
			
		||||
 | 
			
		||||
  if (!(conv= new Item_string(str->ptr(), str->length(), tocs)))
 | 
			
		||||
    return NULL;
 | 
			
		||||
  conv->str_value.copy();
 | 
			
		||||
  conv->str_value.mark_as_const();
 | 
			
		||||
  return conv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  bin item.
 | 
			
		||||
  In string context this is a binary string.
 | 
			
		||||
 
 | 
			
		||||
@@ -771,6 +771,7 @@ class Item_num: public Item
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
  virtual Item_num *neg()= 0;
 | 
			
		||||
  Item *safe_charset_converter(CHARSET_INFO *tocs);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define NO_CACHED_FIELD_INDEX ((uint)(-1))
 | 
			
		||||
@@ -1369,6 +1370,7 @@ public:
 | 
			
		||||
  // to prevent drop fixed flag (no need parent cleanup call)
 | 
			
		||||
  void cleanup() {}
 | 
			
		||||
  bool eq(const Item *item, bool binary_cmp) const;
 | 
			
		||||
  virtual Item *safe_charset_converter(CHARSET_INFO *tocs);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -752,10 +752,15 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
 | 
			
		||||
        Convert the default value from client character
 | 
			
		||||
        set into the column character set if necessary.
 | 
			
		||||
      */
 | 
			
		||||
      if (sql_field->def)
 | 
			
		||||
      if (sql_field->def && cs != sql_field->def->collation.collation)
 | 
			
		||||
      {
 | 
			
		||||
        sql_field->def= 
 | 
			
		||||
          sql_field->def->safe_charset_converter(cs);
 | 
			
		||||
        if (!(sql_field->def= 
 | 
			
		||||
              sql_field->def->safe_charset_converter(cs)))
 | 
			
		||||
        {
 | 
			
		||||
          /* Could not convert */
 | 
			
		||||
          my_error(ER_INVALID_DEFAULT, MYF(0), sql_field->field_name);
 | 
			
		||||
          DBUG_RETURN(-1);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (sql_field->sql_type == FIELD_TYPE_SET)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user