diff options
author | unknown <bar@bar.mysql.r18.ru> | 2002-10-25 15:08:47 +0500 |
---|---|---|
committer | unknown <bar@bar.mysql.r18.ru> | 2002-10-25 15:08:47 +0500 |
commit | 235068a164404ee055999ef7d5819226d2f20d34 (patch) | |
tree | a2644a7fe740f7ff311a1c4c5d3e4bf13cc45070 /sql | |
parent | 0525cf47cb23a02cf6f29bceed0b3e3444a34055 (diff) | |
download | mariadb-git-235068a164404ee055999ef7d5819226d2f20d34.tar.gz |
ENUM/SET fields now have charset too
Diffstat (limited to 'sql')
-rw-r--r-- | sql/field.cc | 26 | ||||
-rw-r--r-- | sql/field.h | 10 | ||||
-rw-r--r-- | sql/sql_table.cc | 4 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 4 |
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); |