Now several character sets can live in the same table,
However some hacks were used while waiting for new FRM file
This commit is contained in:
parent
f3dc0a80e1
commit
7fce07d52d
@ -252,6 +252,7 @@ public:
|
|||||||
void make_field(Send_field *);
|
void make_field(Send_field *);
|
||||||
uint size_of() const { return sizeof(*this); }
|
uint size_of() const { return sizeof(*this); }
|
||||||
inline CHARSET_INFO *charset() const { return field_charset; }
|
inline CHARSET_INFO *charset() const { return field_charset; }
|
||||||
|
inline void set_charset(CHARSET_INFO *charset) { field_charset=charset; }
|
||||||
inline int cmp_image(char *buff,uint length)
|
inline int cmp_image(char *buff,uint length)
|
||||||
{
|
{
|
||||||
if (binary())
|
if (binary())
|
||||||
|
@ -77,10 +77,18 @@ ha_rows filesort(TABLE *table, SORT_FIELD *sortorder, uint s_length,
|
|||||||
SORTPARAM param;
|
SORTPARAM param;
|
||||||
DBUG_ENTER("filesort");
|
DBUG_ENTER("filesort");
|
||||||
DBUG_EXECUTE("info",TEST_filesort(sortorder,s_length,special););
|
DBUG_EXECUTE("info",TEST_filesort(sortorder,s_length,special););
|
||||||
|
CHARSET_INFO *charset=table->table_charset;
|
||||||
|
uint i;
|
||||||
#ifdef SKIP_DBUG_IN_FILESORT
|
#ifdef SKIP_DBUG_IN_FILESORT
|
||||||
DBUG_PUSH(""); /* No DBUG here */
|
DBUG_PUSH(""); /* No DBUG here */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// BAR TODO: this is not absolutely correct, but OK for now
|
||||||
|
for(i=0;i<table->fields;i++)
|
||||||
|
if (!table->field[i]->binary())
|
||||||
|
charset=((Field_str*)(table->field[i]))->charset();
|
||||||
|
// /BAR TODO
|
||||||
|
|
||||||
outfile= table->io_cache;
|
outfile= table->io_cache;
|
||||||
my_b_clear(&tempfile);
|
my_b_clear(&tempfile);
|
||||||
my_b_clear(&buffpek_pointers);
|
my_b_clear(&buffpek_pointers);
|
||||||
@ -129,7 +137,7 @@ ha_rows filesort(TABLE *table, SORT_FIELD *sortorder, uint s_length,
|
|||||||
records=param.max_rows; /* purecov: inspected */
|
records=param.max_rows; /* purecov: inspected */
|
||||||
|
|
||||||
#ifdef USE_STRCOLL
|
#ifdef USE_STRCOLL
|
||||||
if (use_strcoll(default_charset_info) &&
|
if (use_strcoll(charset) &&
|
||||||
!(param.tmp_buffer=my_malloc(param.sort_length,MYF(MY_WME))))
|
!(param.tmp_buffer=my_malloc(param.sort_length,MYF(MY_WME))))
|
||||||
goto err;
|
goto err;
|
||||||
#endif
|
#endif
|
||||||
|
@ -85,7 +85,7 @@ int ha_heap::open(const char *name, int mode, uint test_if_locked)
|
|||||||
seg->start= (uint) key_part->offset;
|
seg->start= (uint) key_part->offset;
|
||||||
seg->length= (uint) key_part->length;
|
seg->length= (uint) key_part->length;
|
||||||
seg->flag = 0;
|
seg->flag = 0;
|
||||||
seg->charset= default_charset_info;
|
seg->charset= field->binary() ? NULL : ((Field_str*)field)->charset();
|
||||||
if (field->null_ptr)
|
if (field->null_ptr)
|
||||||
{
|
{
|
||||||
seg->null_bit= field->null_bit;
|
seg->null_bit= field->null_bit;
|
||||||
|
21
sql/table.cc
21
sql/table.cc
@ -341,6 +341,15 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
|
|||||||
(hash_get_key) get_field_name,0,
|
(hash_get_key) get_field_name,0,
|
||||||
HASH_CASE_INSENSITIVE);
|
HASH_CASE_INSENSITIVE);
|
||||||
|
|
||||||
|
// BAR: dirty hack while waiting for new FRM
|
||||||
|
// BAR: take a charset information from table name
|
||||||
|
{
|
||||||
|
const char* csname=strstr(alias,"_cs_");
|
||||||
|
if(!csname ||
|
||||||
|
!(outparam->table_charset=get_charset_by_name(csname+4,MYF(MY_WME))))
|
||||||
|
outparam->table_charset=default_charset_info;
|
||||||
|
}
|
||||||
|
|
||||||
for (i=0 ; i < outparam->fields; i++, strpos+= 11, field_ptr++)
|
for (i=0 ; i < outparam->fields; i++, strpos+= 11, field_ptr++)
|
||||||
{
|
{
|
||||||
uint pack_flag= uint2korr(strpos+6);
|
uint pack_flag= uint2korr(strpos+6);
|
||||||
@ -357,6 +366,18 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
|
|||||||
(TYPELIB*) 0),
|
(TYPELIB*) 0),
|
||||||
outparam->fieldnames.type_names[i],
|
outparam->fieldnames.type_names[i],
|
||||||
outparam);
|
outparam);
|
||||||
|
if (!reg_field->binary())
|
||||||
|
{
|
||||||
|
// BAR: dirty hack while waiting for new FRM
|
||||||
|
// BAR: take a charset information from field name
|
||||||
|
|
||||||
|
Field_str* str_field=(Field_str*)reg_field;
|
||||||
|
const char* csname=strstr(str_field->field_name,"_cs_");
|
||||||
|
CHARSET_INFO *fcs;
|
||||||
|
if (!csname || (!(fcs=get_charset_by_name(csname+4,MYF(MY_WME)))))
|
||||||
|
fcs=outparam->table_charset;
|
||||||
|
str_field->set_charset(fcs);
|
||||||
|
}
|
||||||
if (!(reg_field->flags & NOT_NULL_FLAG))
|
if (!(reg_field->flags & NOT_NULL_FLAG))
|
||||||
{
|
{
|
||||||
if ((null_bit<<=1) == 256)
|
if ((null_bit<<=1) == 256)
|
||||||
|
@ -104,6 +104,7 @@ struct st_table {
|
|||||||
*rowid_field;
|
*rowid_field;
|
||||||
Field_timestamp *timestamp_field;
|
Field_timestamp *timestamp_field;
|
||||||
my_string comment; /* Comment about table */
|
my_string comment; /* Comment about table */
|
||||||
|
CHARSET_INFO *table_charset; /* Default charset of string fields */
|
||||||
REGINFO reginfo; /* field connections */
|
REGINFO reginfo; /* field connections */
|
||||||
MEM_ROOT mem_root;
|
MEM_ROOT mem_root;
|
||||||
GRANT_INFO grant;
|
GRANT_INFO grant;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user