diff options
-rw-r--r-- | sql/item.cc | 4 | ||||
-rw-r--r-- | sql/item.h | 18 | ||||
-rw-r--r-- | sql/sql_select.cc | 4 |
3 files changed, 15 insertions, 11 deletions
diff --git a/sql/item.cc b/sql/item.cc index 868cf4466a6..d74b9d7454f 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -39,7 +39,8 @@ Item::Item(): { marker= 0; maybe_null=null_value=with_sum_func=unsigned_flag=0; - coercibility=COER_COERCIBLE; + collation= &my_charset_bin; + coercibility= COER_COERCIBLE; name= 0; decimals= 0; max_length= 0; THD *thd= current_thd; @@ -67,6 +68,7 @@ Item::Item(THD *thd, Item &item): unsigned_flag(item.unsigned_flag), with_sum_func(item.with_sum_func), fixed(item.fixed), + collation(item.collation), coercibility(item.coercibility) { next=thd->free_list; // Put in free list diff --git a/sql/item.h b/sql/item.h index 5cfe8eb3907..df9ada72ce5 100644 --- a/sql/item.h +++ b/sql/item.h @@ -65,6 +65,7 @@ public: my_bool unsigned_flag; my_bool with_sum_func; my_bool fixed; /* If item fixed with fix_fields */ + CHARSET_INFO *collation; /* character set && collation */ enum coercion coercibility; /* Precedence order of collation */ // alloc & destruct is done as start of select using sql_alloc @@ -123,18 +124,17 @@ public: virtual Item *real_item() { return this; } virtual Item *get_tmp_table_item(THD *thd) { return copy_or_same(thd); } - virtual bool binary() const - { return str_value.charset()->state & MY_CS_BINSORT ? 1 : 0 ; } CHARSET_INFO *default_charset() const; - CHARSET_INFO *charset() const { return str_value.charset(); }; - void set_charset(CHARSET_INFO *cs) { str_value.set_charset(cs); } + CHARSET_INFO *charset() const { return collation; }; + void set_charset(CHARSET_INFO *cs) + { collation= cs; } void set_charset(CHARSET_INFO *cs, enum coercion coer) - { - str_value.set_charset(cs); - coercibility= coer; - } + { collation= cs; coercibility= coer; } bool set_charset(CHARSET_INFO *cs1, enum coercion co1, CHARSET_INFO *cs2, enum coercion co2); + bool binary() const + { return charset()->state & MY_CS_BINSORT ? 1 : 0 ; } + virtual void set_outer_resolving() {} // Row emulation @@ -383,6 +383,7 @@ public: Item_string(const char *str,uint length, CHARSET_INFO *cs, enum coercion coer= COER_COERCIBLE) { + set_charset(cs); str_value.set(str,length,cs); coercibility= coer; max_length=length; @@ -392,6 +393,7 @@ public: Item_string(const char *name_par, const char *str, uint length, CHARSET_INFO *cs, enum coercion coer= COER_COERCIBLE) { + set_charset(cs); str_value.set(str,length,cs); coercibility= coer; max_length=length; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index a4dcc3d7092..b8eb9e19cc7 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -4142,10 +4142,10 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, case STRING_RESULT: if (item->max_length > 255) new_field= new Field_blob(item->max_length,maybe_null, - item->name,table,item->str_value.charset()); + item->name,table,item->charset()); else new_field= new Field_string(item->max_length,maybe_null, - item->name,table,item->str_value.charset()); + item->name,table,item->charset()); break; case ROW_RESULT: default: |