summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <bar@bar.mysql.r18.ru>2002-10-25 15:08:47 +0500
committerunknown <bar@bar.mysql.r18.ru>2002-10-25 15:08:47 +0500
commit235068a164404ee055999ef7d5819226d2f20d34 (patch)
treea2644a7fe740f7ff311a1c4c5d3e4bf13cc45070 /sql
parent0525cf47cb23a02cf6f29bceed0b3e3444a34055 (diff)
downloadmariadb-git-235068a164404ee055999ef7d5819226d2f20d34.tar.gz
ENUM/SET fields now have charset too
Diffstat (limited to 'sql')
-rw-r--r--sql/field.cc26
-rw-r--r--sql/field.h10
-rw-r--r--sql/sql_table.cc4
-rw-r--r--sql/sql_yacc.yy4
4 files changed, 33 insertions, 11 deletions
diff --git a/sql/field.cc b/sql/field.cc
index eca3ea05d45..8f61e053d27 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -4906,7 +4906,7 @@ String *Field_enum::val_str(String *val_buffer __attribute__((unused)),
else
val_ptr->set((const char*) typelib->type_names[tmp-1],
(uint) strlen(typelib->type_names[tmp-1]),
- default_charset_info);
+ field_charset);
return val_ptr;
}
@@ -4947,6 +4947,15 @@ void Field_enum::sql_type(String &res) const
flag=1;
}
res.append(')');
+ if (binary())
+ {
+ res.append(" binary");
+ }
+ else
+ {
+ res.append(" character set ");
+ res.append(field_charset->name);
+ }
}
@@ -5050,7 +5059,7 @@ String *Field_set::val_str(String *val_buffer,
val_buffer->append(field_separator);
String str(typelib->type_names[bitnr],
(uint) strlen(typelib->type_names[bitnr]),
- default_charset_info);
+ field_charset);
val_buffer->append(str);
}
tmp>>=1;
@@ -5074,6 +5083,15 @@ void Field_set::sql_type(String &res) const
flag=1;
}
res.append(')');
+ if (binary())
+ {
+ res.append(" binary");
+ }
+ else
+ {
+ res.append(" character set ");
+ res.append(field_charset->name);
+ }
}
/* returns 1 if the fields are equally defined */
@@ -5207,11 +5225,11 @@ Field *make_field(char *ptr, uint32 field_length,
if (f_is_enum(pack_flag))
return new Field_enum(ptr,field_length,null_pos,null_bit,
unireg_check, field_name, table,
- pack_length, interval);
+ pack_length, interval, field_charset);
else
return new Field_set(ptr,field_length,null_pos,null_bit,
unireg_check, field_name, table,
- pack_length, interval);
+ pack_length, interval, field_charset);
}
}
diff --git a/sql/field.h b/sql/field.h
index 0c0b833f970..e4c1bd046ab 100644
--- a/sql/field.h
+++ b/sql/field.h
@@ -936,9 +936,10 @@ public:
uchar null_bit_arg,
enum utype unireg_check_arg, const char *field_name_arg,
struct st_table *table_arg,uint packlength_arg,
- TYPELIB *typelib_arg)
+ TYPELIB *typelib_arg,
+ CHARSET_INFO *charset_arg)
:Field_str(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
- unireg_check_arg, field_name_arg, table_arg, default_charset_info),
+ unireg_check_arg, field_name_arg, table_arg, charset_arg),
packlength(packlength_arg),typelib(typelib_arg)
{
flags|=ENUM_FLAG;
@@ -962,7 +963,6 @@ public:
enum_field_types real_type() const { return FIELD_TYPE_ENUM; }
virtual bool zero_pack() const { return 0; }
bool optimize_range(uint idx) { return 0; }
- bool binary() const { return 0; }
bool eq_def(Field *field);
};
@@ -973,11 +973,11 @@ public:
uchar null_bit_arg,
enum utype unireg_check_arg, const char *field_name_arg,
struct st_table *table_arg,uint32 packlength_arg,
- TYPELIB *typelib_arg)
+ TYPELIB *typelib_arg, CHARSET_INFO *charset_arg)
:Field_enum(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
unireg_check_arg, field_name_arg,
table_arg, packlength_arg,
- typelib_arg)
+ typelib_arg,charset_arg)
{
flags=(flags & ~ENUM_FLAG) | SET_FLAG;
}
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 75d43e8c419..8b8da327b81 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -412,11 +412,15 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name,
case FIELD_TYPE_ENUM:
sql_field->pack_flag=pack_length_to_packflag(sql_field->pack_length) |
FIELDFLAG_INTERVAL;
+ if (sql_field->charset->state & MY_CS_BINSORT)
+ sql_field->pack_flag|=FIELDFLAG_BINARY;
sql_field->unireg_check=Field::INTERVAL_FIELD;
break;
case FIELD_TYPE_SET:
sql_field->pack_flag=pack_length_to_packflag(sql_field->pack_length) |
FIELDFLAG_BITFIELD;
+ if (sql_field->charset->state & MY_CS_BINSORT)
+ sql_field->pack_flag|=FIELDFLAG_BINARY;
sql_field->unireg_check=Field::BIT_FIELD;
break;
case FIELD_TYPE_DATE: // Rest of string types
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index e2f97f5a080..83de03026f1 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -1064,13 +1064,13 @@ type:
{ $$=FIELD_TYPE_DECIMAL;}
| NUMERIC_SYM float_options field_options
{ $$=FIELD_TYPE_DECIMAL;}
- | ENUM {Lex->interval_list.empty();} '(' string_list ')'
+ | ENUM {Lex->interval_list.empty();} '(' string_list ')' opt_binary
{
LEX *lex=Lex;
lex->interval=typelib(lex->interval_list);
$$=FIELD_TYPE_ENUM;
}
- | SET { Lex->interval_list.empty();} '(' string_list ')'
+ | SET { Lex->interval_list.empty();} '(' string_list ')' opt_binary
{
LEX *lex=Lex;
lex->interval=typelib(lex->interval_list);